source: trunk/package/mac80211/patches/560-ath9k_rework_send_bar.patch @ 29494

Last change on this file since 29494 was 29494, checked in by nbd, 4 years ago

ath9k: improve handling of blockackreq (should improve aggregation behavior under tough wifi conditions with lots of retransmission)

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

    a b void ath_descdma_cleanup(struct ath_soft 
    159159/* return block-ack bitmap index given sequence and starting sequence */ 
    160160#define ATH_BA_INDEX(_st, _seq) (((_seq) - (_st)) & (IEEE80211_SEQ_MAX - 1)) 
    161161 
     162/* return the seqno for _start + _offset */ 
     163#define ATH_BA_INDEX2SEQ(_seq, _offset) (((_seq) + (_offset)) & (IEEE80211_SEQ_MAX - 1)) 
     164 
    162165/* returns delimiter padding required given the packet length */ 
    163166#define ATH_AGGR_GET_NDELIM(_len)                                       \ 
    164167       (((_len) >= ATH_AGGR_MINPLEN) ? 0 :                             \ 
    struct ath_atx_tid { 
    253256struct ath_node { 
    254257#ifdef CONFIG_ATH9K_DEBUGFS 
    255258        struct list_head list; /* for sc->nodes */ 
     259#endif 
    256260        struct ieee80211_sta *sta; /* station struct we're part of */ 
    257261        struct ieee80211_vif *vif; /* interface with which we're associated */ 
    258 #endif 
    259262        struct ath_atx_tid tid[WME_NUM_TID]; 
    260263        struct ath_atx_ac ac[WME_NUM_AC]; 
    261264        int ps_key; 
    struct ath_tx_control { 
    277280}; 
    278281 
    279282#define ATH_TX_ERROR        0x01 
    280 #define ATH_TX_BAR          0x02 
    281283 
    282284/** 
    283285 * @txq_map:  Index is mac80211 queue number.  This is 
  • drivers/net/wireless/ath/ath9k/main.c

    a b static void ath_node_attach(struct ath_s 
    644644        spin_lock(&sc->nodes_lock); 
    645645        list_add(&an->list, &sc->nodes); 
    646646        spin_unlock(&sc->nodes_lock); 
     647#endif 
    647648        an->sta = sta; 
    648649        an->vif = vif; 
    649 #endif 
    650650        if (sc->sc_flags & SC_OP_TXAGGR) { 
    651651                ath_tx_node_init(sc, an); 
    652652                an->maxampdu = 1 << (IEEE80211_HT_MAX_AMPDU_FACTOR + 
  • drivers/net/wireless/ath/ath9k/xmit.c

    a b static void ath_tx_complete(struct ath_s 
    5353                            int tx_flags, struct ath_txq *txq); 
    5454static void ath_tx_complete_buf(struct ath_softc *sc, struct ath_buf *bf, 
    5555                                struct ath_txq *txq, struct list_head *bf_q, 
    56                                 struct ath_tx_status *ts, int txok, int sendbar); 
     56                                struct ath_tx_status *ts, int txok); 
    5757static void ath_tx_txqaddbuf(struct ath_softc *sc, struct ath_txq *txq, 
    5858                             struct list_head *head, bool internal); 
    5959static void ath_tx_rc_status(struct ath_softc *sc, struct ath_buf *bf, 
    static struct ath_frame_info *get_frame_ 
    150150        return (struct ath_frame_info *) &tx_info->rate_driver_data[0]; 
    151151} 
    152152 
     153static void ath_send_bar(struct ath_atx_tid *tid, u16 seqno) 
     154{ 
     155        ieee80211_send_bar(tid->an->vif, tid->an->sta->addr, tid->tidno, 
     156                           seqno << IEEE80211_SEQ_SEQ_SHIFT); 
     157} 
     158 
    153159static void ath_tx_flush_tid(struct ath_softc *sc, struct ath_atx_tid *tid) 
    154160{ 
    155161        struct ath_txq *txq = tid->ac->txq; 
    static void ath_tx_flush_tid(struct ath_ 
    158164        struct list_head bf_head; 
    159165        struct ath_tx_status ts; 
    160166        struct ath_frame_info *fi; 
     167        bool sendbar = false; 
    161168 
    162169        INIT_LIST_HEAD(&bf_head); 
    163170 
    static void ath_tx_flush_tid(struct ath_ 
    172179                if (bf && fi->retries) { 
    173180                        list_add_tail(&bf->list, &bf_head); 
    174181                        ath_tx_update_baw(sc, tid, bf->bf_state.seqno); 
    175                         ath_tx_complete_buf(sc, bf, txq, &bf_head, &ts, 0, 1); 
     182                        ath_tx_complete_buf(sc, bf, txq, &bf_head, &ts, 0); 
     183                        sendbar = true; 
    176184                } else { 
    177185                        ath_tx_send_normal(sc, txq, NULL, skb); 
    178186                } 
    static void ath_tx_flush_tid(struct ath_ 
    185193        } 
    186194 
    187195        spin_unlock_bh(&txq->axq_lock); 
     196 
     197        if (sendbar) 
     198                ath_send_bar(tid, tid->seq_start); 
    188199} 
    189200 
    190201static void ath_tx_update_baw(struct ath_softc *sc, struct ath_atx_tid *tid, 
    static void ath_tid_drain(struct ath_sof 
    255266                        ath_tx_update_baw(sc, tid, bf->bf_state.seqno); 
    256267 
    257268                spin_unlock(&txq->axq_lock); 
    258                 ath_tx_complete_buf(sc, bf, txq, &bf_head, &ts, 0, 0); 
     269                ath_tx_complete_buf(sc, bf, txq, &bf_head, &ts, 0); 
    259270                spin_lock(&txq->axq_lock); 
    260271        } 
    261272 
    static void ath_tx_complete_aggr(struct  
    381392        struct ath_buf *bf_next, *bf_last = bf->bf_lastbf; 
    382393        struct list_head bf_head; 
    383394        struct sk_buff_head bf_pending; 
    384         u16 seq_st = 0, acked_cnt = 0, txfail_cnt = 0; 
     395        u16 seq_st = 0, acked_cnt = 0, txfail_cnt = 0, seq_first; 
    385396        u32 ba[WME_BA_BMP_SIZE >> 5]; 
    386397        int isaggr, txfail, txpending, sendbar = 0, needreset = 0, nbad = 0; 
    387398        bool rc_update = true; 
    static void ath_tx_complete_aggr(struct  
    391402        u8 tidno; 
    392403        bool flush = !!(ts->ts_status & ATH9K_TX_FLUSH); 
    393404        int i, retries; 
     405        int bar_index = -1; 
    394406 
    395407        skb = bf->bf_mpdu; 
    396408        hdr = (struct ieee80211_hdr *)skb->data; 
    static void ath_tx_complete_aggr(struct  
    416428                        if (!bf->bf_stale || bf_next != NULL) 
    417429                                list_move_tail(&bf->list, &bf_head); 
    418430 
    419                         ath_tx_complete_buf(sc, bf, txq, &bf_head, ts, 
    420                                 0, 0); 
     431                        ath_tx_complete_buf(sc, bf, txq, &bf_head, ts, 0); 
    421432 
    422433                        bf = bf_next; 
    423434                } 
    static void ath_tx_complete_aggr(struct  
    427438        an = (struct ath_node *)sta->drv_priv; 
    428439        tidno = ieee80211_get_qos_ctl(hdr)[0] & IEEE80211_QOS_CTL_TID_MASK; 
    429440        tid = ATH_AN_2_TID(an, tidno); 
     441        seq_first = tid->seq_start; 
    430442 
    431443        /* 
    432444         * The hardware occasionally sends a tx status for the wrong TID. 
    static void ath_tx_complete_aggr(struct  
    495507                                txpending = 1; 
    496508                        } else { 
    497509                                txfail = 1; 
    498                                 sendbar = 1; 
    499510                                txfail_cnt++; 
     511                                bar_index = max_t(int, bar_index, 
     512                                        ATH_BA_INDEX(seq_first, seqno)); 
    500513                        } 
    501514                } 
    502515 
    static void ath_tx_complete_aggr(struct  
    525538                        } 
    526539 
    527540                        ath_tx_complete_buf(sc, bf, txq, &bf_head, ts, 
    528                                 !txfail, sendbar); 
     541                                !txfail); 
    529542                } else { 
    530543                        /* retry the un-acked ones */ 
    531544                        if (!(sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_EDMA)) { 
    static void ath_tx_complete_aggr(struct  
    545558 
    546559                                                ath_tx_complete_buf(sc, bf, txq, 
    547560                                                                    &bf_head, 
    548                                                                     ts, 0, 
    549                                                                     !flush); 
     561                                                                    ts, 0); 
     562                                                bar_index = max_t(int, bar_index, 
     563                                                        ATH_BA_INDEX(seq_first, 
     564                                                                seqno)); 
    550565                                                break; 
    551566                                        } 
    552567 
    static void ath_tx_complete_aggr(struct  
    564579                bf = bf_next; 
    565580        } 
    566581 
     582        if (bar_index >= 0) 
     583                ath_send_bar(tid, ATH_BA_INDEX2SEQ(seq_first, bar_index + 1)); 
     584 
    567585        /* prepend un-acked frames to the beginning of the pending frame queue */ 
    568586        if (!skb_queue_empty(&bf_pending)) { 
    569587                if (an->sleeping) 
    static void ath_drain_txq_list(struct at 
    14521470                        ath_tx_complete_aggr(sc, txq, bf, &bf_head, &ts, 0, 
    14531471                                             retry_tx); 
    14541472                else 
    1455                         ath_tx_complete_buf(sc, bf, txq, &bf_head, &ts, 0, 0); 
     1473                        ath_tx_complete_buf(sc, bf, txq, &bf_head, &ts, 0); 
    14561474                spin_lock_bh(&txq->axq_lock); 
    14571475        } 
    14581476} 
    static void ath_tx_complete(struct ath_s 
    19671985 
    19681986        ath_dbg(common, ATH_DBG_XMIT, "TX complete: skb: %p\n", skb); 
    19691987 
    1970         if (tx_flags & ATH_TX_BAR) 
    1971                 tx_info->flags |= IEEE80211_TX_STAT_AMPDU_NO_BACK; 
    1972  
    19731988        if (!(tx_flags & ATH_TX_ERROR)) 
    19741989                /* Frame was ACKed */ 
    19751990                tx_info->flags |= IEEE80211_TX_STAT_ACK; 
    static void ath_tx_complete(struct ath_s 
    20132028 
    20142029static void ath_tx_complete_buf(struct ath_softc *sc, struct ath_buf *bf, 
    20152030                                struct ath_txq *txq, struct list_head *bf_q, 
    2016                                 struct ath_tx_status *ts, int txok, int sendbar) 
     2031                                struct ath_tx_status *ts, int txok) 
    20172032{ 
    20182033        struct sk_buff *skb = bf->bf_mpdu; 
    20192034        struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb); 
    20202035        unsigned long flags; 
    20212036        int tx_flags = 0; 
    20222037 
    2023         if (sendbar) 
    2024                 tx_flags = ATH_TX_BAR; 
    2025  
    20262038        if (!txok) 
    20272039                tx_flags |= ATH_TX_ERROR; 
    20282040 
    static void ath_tx_process_buffer(struct 
    21292141 
    21302142        if (!bf_isampdu(bf)) { 
    21312143                ath_tx_rc_status(sc, bf, ts, 1, txok ? 0 : 1, txok); 
    2132                 ath_tx_complete_buf(sc, bf, txq, bf_head, ts, txok, 0); 
     2144                ath_tx_complete_buf(sc, bf, txq, bf_head, ts, txok); 
    21332145        } else 
    21342146                ath_tx_complete_aggr(sc, txq, bf, bf_head, ts, txok, true); 
    21352147 
  • drivers/net/wireless/ath/ath9k/debug.c

    a b void ath_debug_stat_tx(struct ath_softc  
    856856        sc->debug.stats.txstats[qnum].tx_bytes_all += bf->bf_mpdu->len; 
    857857 
    858858        if (bf_isampdu(bf)) { 
    859                 if (flags & ATH_TX_BAR) 
     859                if (flags & ATH_TX_ERROR) 
    860860                        TX_STAT_INC(qnum, a_xretries); 
    861861                else 
    862862                        TX_STAT_INC(qnum, a_completed); 
Note: See TracBrowser for help on using the repository browser.