source: trunk/package/mac80211/patches/541-ath9k_aggr_queue_cleanup.patch @ 28093

Last change on this file since 28093 was 28093, checked in by nbd, 5 years ago

mac80211: update to wireless-testing 2011-08-26

File size: 8.4 KB
  • drivers/net/wireless/ath/ath9k/ath9k.h

    a b struct ath_atx_ac { 
    206206}; 
    207207 
    208208struct ath_frame_info { 
     209        struct ath_buf *bf; 
    209210        int framelen; 
    210211        enum ath9k_key_type keytype; 
    211212        u8 keyix; 
    struct ath_buf { 
    235236 
    236237struct ath_atx_tid { 
    237238        struct list_head list; 
    238         struct list_head buf_q; 
     239        struct sk_buff_head buf_q; 
    239240        struct ath_node *an; 
    240241        struct ath_atx_ac *ac; 
    241242        unsigned long tx_buf[BITS_TO_LONGS(ATH_TID_MAX_BUFS)]; 
  • drivers/net/wireless/ath/ath9k/debug.c

    a b static ssize_t read_file_stations(struct 
    711711                                        " tid: %p %s %s %i %p %p\n", 
    712712                                        tid, tid->sched ? "sched" : "idle", 
    713713                                        tid->paused ? "paused" : "running", 
    714                                         list_empty(&tid->buf_q), 
     714                                        skb_queue_empty(&tid->buf_q), 
    715715                                        tid->an, tid->ac); 
    716716                        if (len >= size) 
    717717                                goto done; 
  • drivers/net/wireless/ath/ath9k/xmit.c

    a b static void ath_tx_resume_tid(struct ath 
    129129        spin_lock_bh(&txq->axq_lock); 
    130130        tid->paused = false; 
    131131 
    132         if (list_empty(&tid->buf_q)) 
     132        if (skb_queue_empty(&tid->buf_q)) 
    133133                goto unlock; 
    134134 
    135135        ath_tx_queue_tid(txq, tid); 
    static struct ath_frame_info *get_frame_ 
    149149static void ath_tx_flush_tid(struct ath_softc *sc, struct ath_atx_tid *tid) 
    150150{ 
    151151        struct ath_txq *txq = tid->ac->txq; 
     152        struct sk_buff *skb; 
    152153        struct ath_buf *bf; 
    153154        struct list_head bf_head; 
    154155        struct ath_tx_status ts; 
    static void ath_tx_flush_tid(struct ath_ 
    159160        memset(&ts, 0, sizeof(ts)); 
    160161        spin_lock_bh(&txq->axq_lock); 
    161162 
    162         while (!list_empty(&tid->buf_q)) { 
    163                 bf = list_first_entry(&tid->buf_q, struct ath_buf, list); 
    164                 list_move_tail(&bf->list, &bf_head); 
     163        while ((skb = __skb_dequeue(&tid->buf_q))) { 
     164                fi = get_frame_info(skb); 
     165                bf = fi->bf; 
     166 
     167                list_add_tail(&bf->list, &bf_head); 
    165168 
    166169                spin_unlock_bh(&txq->axq_lock); 
    167                 fi = get_frame_info(bf->bf_mpdu); 
    168170                if (fi->retries) { 
    169171                        ath_tx_update_baw(sc, tid, fi->seqno); 
    170172                        ath_tx_complete_buf(sc, bf, txq, &bf_head, &ts, 0, 1); 
    static void ath_tid_drain(struct ath_sof 
    219221                          struct ath_atx_tid *tid) 
    220222 
    221223{ 
     224        struct sk_buff *skb; 
    222225        struct ath_buf *bf; 
    223226        struct list_head bf_head; 
    224227        struct ath_tx_status ts; 
    static void ath_tid_drain(struct ath_sof 
    227230        memset(&ts, 0, sizeof(ts)); 
    228231        INIT_LIST_HEAD(&bf_head); 
    229232 
    230         for (;;) { 
    231                 if (list_empty(&tid->buf_q)) 
    232                         break; 
     233        while ((skb = __skb_dequeue(&tid->buf_q))) { 
     234                fi = get_frame_info(skb); 
     235                bf = fi->bf; 
    233236 
    234                 bf = list_first_entry(&tid->buf_q, struct ath_buf, list); 
    235                 list_move_tail(&bf->list, &bf_head); 
     237                list_add_tail(&bf->list, &bf_head); 
    236238 
    237                 fi = get_frame_info(bf->bf_mpdu); 
    238239                if (fi->retries) 
    239240                        ath_tx_update_baw(sc, tid, fi->seqno); 
    240241 
    static void ath_tx_complete_aggr(struct  
    349350        struct ieee80211_tx_info *tx_info; 
    350351        struct ath_atx_tid *tid = NULL; 
    351352        struct ath_buf *bf_next, *bf_last = bf->bf_lastbf; 
    352         struct list_head bf_head, bf_pending; 
     353        struct list_head bf_head; 
     354        struct sk_buff_head bf_pending; 
    353355        u16 seq_st = 0, acked_cnt = 0, txfail_cnt = 0; 
    354356        u32 ba[WME_BA_BMP_SIZE >> 5]; 
    355357        int isaggr, txfail, txpending, sendbar = 0, needreset = 0, nbad = 0; 
    static void ath_tx_complete_aggr(struct  
    422424                } 
    423425        } 
    424426 
    425         INIT_LIST_HEAD(&bf_pending); 
    426         INIT_LIST_HEAD(&bf_head); 
     427        __skb_queue_head_init(&bf_pending); 
    427428 
    428429        ath_tx_count_frames(sc, bf, ts, txok, &nframes, &nbad); 
    429430        while (bf) { 
    static void ath_tx_complete_aggr(struct  
    467468                 * Make sure the last desc is reclaimed if it 
    468469                 * not a holding desc. 
    469470                 */ 
    470                 if (!bf_last->bf_stale || bf_next != NULL) 
     471                INIT_LIST_HEAD(&bf_head); 
     472                if ((sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) || 
     473                    bf_next != NULL || !bf_last->bf_stale) 
    471474                        list_move_tail(&bf->list, &bf_head); 
    472                 else 
    473                         INIT_LIST_HEAD(&bf_head); 
    474475 
    475476                if (!txpending || (tid->state & AGGR_CLEANUP)) { 
    476477                        /* 
    static void ath_tx_complete_aggr(struct  
    521522 
    522523                                        ath9k_hw_cleartxdesc(sc->sc_ah, 
    523524                                                             tbf->bf_desc); 
    524                                         list_add_tail(&tbf->list, &bf_head); 
     525                                        fi->bf = tbf; 
    525526                                } else { 
    526527                                        /* 
    527528                                         * Clear descriptor status words for 
    static void ath_tx_complete_aggr(struct  
    536537                         * Put this buffer to the temporary pending 
    537538                         * queue to retain ordering 
    538539                         */ 
    539                         list_splice_tail_init(&bf_head, &bf_pending); 
     540                        __skb_queue_tail(&bf_pending, skb); 
    540541                } 
    541542 
    542543                bf = bf_next; 
    543544        } 
    544545 
    545546        /* prepend un-acked frames to the beginning of the pending frame queue */ 
    546         if (!list_empty(&bf_pending)) { 
     547        if (!skb_queue_empty(&bf_pending)) { 
    547548                if (an->sleeping) 
    548549                        ieee80211_sta_set_tim(sta); 
    549550 
    550551                spin_lock_bh(&txq->axq_lock); 
    551552                if (clear_filter) 
    552553                        tid->ac->clear_ps_filter = true; 
    553                 list_splice(&bf_pending, &tid->buf_q); 
     554                skb_queue_splice(&bf_pending, &tid->buf_q); 
    554555                if (!an->sleeping) 
    555556                        ath_tx_queue_tid(txq, tid); 
    556557                spin_unlock_bh(&txq->axq_lock); 
    static enum ATH_AGGR_STATUS ath_tx_form_ 
    743744                                             int *aggr_len) 
    744745{ 
    745746#define PADBYTES(_len) ((4 - ((_len) % 4)) % 4) 
    746         struct ath_buf *bf, *bf_first, *bf_prev = NULL; 
     747        struct ath_buf *bf, *bf_first = NULL, *bf_prev = NULL; 
    747748        int rl = 0, nframes = 0, ndelim, prev_al = 0; 
    748749        u16 aggr_limit = 0, al = 0, bpad = 0, 
    749750                al_delta, h_baw = tid->baw_size / 2; 
    750751        enum ATH_AGGR_STATUS status = ATH_AGGR_DONE; 
    751752        struct ieee80211_tx_info *tx_info; 
    752753        struct ath_frame_info *fi; 
    753  
    754         bf_first = list_first_entry(&tid->buf_q, struct ath_buf, list); 
     754        struct sk_buff *skb; 
    755755 
    756756        do { 
    757                 bf = list_first_entry(&tid->buf_q, struct ath_buf, list); 
    758                 fi = get_frame_info(bf->bf_mpdu); 
     757                skb = skb_peek(&tid->buf_q); 
     758                fi = get_frame_info(skb); 
     759                bf = fi->bf; 
     760 
     761                if (!bf_first) 
     762                        bf_first = bf; 
    759763 
    760764                /* do not step over block-ack window */ 
    761765                if (!BAW_WITHIN(tid->seq_start, tid->baw_size, fi->seqno)) { 
    static enum ATH_AGGR_STATUS ath_tx_form_ 
    808812                if (!fi->retries) 
    809813                        ath_tx_addto_baw(sc, tid, fi->seqno); 
    810814                ath9k_hw_set11n_aggr_middle(sc->sc_ah, bf->bf_desc, ndelim); 
    811                 list_move_tail(&bf->list, bf_q); 
     815 
     816                __skb_unlink(skb, &tid->buf_q); 
     817                list_add_tail(&bf->list, bf_q); 
    812818                if (bf_prev) { 
    813819                        bf_prev->bf_next = bf; 
    814820                        ath9k_hw_set_desc_link(sc->sc_ah, bf_prev->bf_desc, 
    static enum ATH_AGGR_STATUS ath_tx_form_ 
    816822                } 
    817823                bf_prev = bf; 
    818824 
    819         } while (!list_empty(&tid->buf_q)); 
     825        } while (!skb_queue_empty(&tid->buf_q)); 
    820826 
    821827        *aggr_len = al; 
    822828 
    static void ath_tx_sched_aggr(struct ath 
    834840        int aggr_len; 
    835841 
    836842        do { 
    837                 if (list_empty(&tid->buf_q)) 
     843                if (skb_queue_empty(&tid->buf_q)) 
    838844                        return; 
    839845 
    840846                INIT_LIST_HEAD(&bf_q); 
    bool ath_tx_aggr_sleep(struct ath_softc  
    955961 
    956962                spin_lock_bh(&txq->axq_lock); 
    957963 
    958                 if (!list_empty(&tid->buf_q)) 
     964                if (!skb_queue_empty(&tid->buf_q)) 
    959965                        buffered = true; 
    960966 
    961967                tid->sched = false; 
    void ath_tx_aggr_wakeup(struct ath_softc 
    988994                spin_lock_bh(&txq->axq_lock); 
    989995                ac->clear_ps_filter = true; 
    990996 
    991                 if (!list_empty(&tid->buf_q) && !tid->paused) { 
     997                if (!skb_queue_empty(&tid->buf_q) && !tid->paused) { 
    992998                        ath_tx_queue_tid(txq, tid); 
    993999                        ath_txq_schedule(sc, txq); 
    9941000                } 
    void ath_txq_schedule(struct ath_softc * 
    13321338                         * add tid to round-robin queue if more frames 
    13331339                         * are pending for the tid 
    13341340                         */ 
    1335                         if (!list_empty(&tid->buf_q)) 
     1341                        if (!skb_queue_empty(&tid->buf_q)) 
    13361342                                ath_tx_queue_tid(txq, tid); 
    13371343 
    13381344                        if (tid == last_tid || 
    static void ath_tx_send_ampdu(struct ath 
    14381444         * - seqno is not within block-ack window 
    14391445         * - h/w queue depth exceeds low water mark 
    14401446         */ 
    1441         if (!list_empty(&tid->buf_q) || tid->paused || 
     1447        if (!skb_queue_empty(&tid->buf_q) || tid->paused || 
    14421448            !BAW_WITHIN(tid->seq_start, tid->baw_size, fi->seqno) || 
    14431449            txctl->txq->axq_ampdu_depth >= ATH_AGGR_MIN_QDEPTH) { 
    14441450                /* 
    static void ath_tx_send_ampdu(struct ath 
    14461452                 * for aggregation. 
    14471453                 */ 
    14481454                TX_STAT_INC(txctl->txq->axq_qnum, a_queued_sw); 
    1449                 list_add_tail(&bf->list, &tid->buf_q); 
     1455                __skb_queue_tail(&tid->buf_q, bf->bf_mpdu); 
    14501456                if (!txctl->an || !txctl->an->sleeping) 
    14511457                        ath_tx_queue_tid(txctl->txq, tid); 
    14521458                return; 
    static struct ath_buf *ath_tx_setup_buff 
    17771783                            bf->bf_buf_addr, 
    17781784                            txq->axq_qnum); 
    17791785 
     1786        fi->bf = bf; 
    17801787 
    17811788        return bf; 
    17821789} 
    void ath_tx_node_init(struct ath_softc * 
    23942401                tid->sched     = false; 
    23952402                tid->paused    = false; 
    23962403                tid->state &= ~AGGR_CLEANUP; 
    2397                 INIT_LIST_HEAD(&tid->buf_q); 
     2404                __skb_queue_head_init(&tid->buf_q); 
    23982405                acno = TID_TO_WME_AC(tidno); 
    23992406                tid->ac = &an->ac[acno]; 
    24002407                tid->state &= ~AGGR_ADDBA_COMPLETE; 
Note: See TracBrowser for help on using the repository browser.