source: trunk/package/mac80211/patches/574-ath9k_limit_qlen.patch @ 27890

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

ath9k: add some code to control internal driver queue length limits

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

    a b struct ath_atx_tid { 
    235235        struct ath_node *an; 
    236236        struct ath_atx_ac *ac; 
    237237        unsigned long tx_buf[BITS_TO_LONGS(ATH_TID_MAX_BUFS)]; 
     238        int buf_pending; 
    238239        u16 seq_start; 
    239240        u16 seq_next; 
    240241        u16 baw_size; 
    struct ath_tx_control { 
    283284 *  (axq_qnum). 
    284285 */ 
    285286struct ath_tx { 
     287        u32 qlen_single; 
     288        u32 qlen_aggr; 
     289 
    286290        u16 seq_no; 
    287291        u32 txqsetup; 
    288292        spinlock_t txbuflock; 
  • drivers/net/wireless/ath/ath9k/debug.c

    a b int ath9k_init_debug(struct ath_hw *ah) 
    12501250                            sc, &fops_wiphy); 
    12511251        debugfs_create_file("xmit", S_IRUSR, sc->debug.debugfs_phy, sc, 
    12521252                            &fops_xmit); 
     1253        debugfs_create_u32("qlen_single", S_IRUSR | S_IWUSR, 
     1254                           sc->debug.debugfs_phy, &sc->tx.qlen_single); 
     1255        debugfs_create_u32("qlen_aggr", S_IRUSR | S_IWUSR, 
     1256                           sc->debug.debugfs_phy, &sc->tx.qlen_aggr); 
    12531257        debugfs_create_file("stations", S_IRUSR, sc->debug.debugfs_phy, sc, 
    12541258                            &fops_stations); 
    12551259        debugfs_create_file("misc", S_IRUSR, sc->debug.debugfs_phy, sc, 
  • drivers/net/wireless/ath/ath9k/xmit.c

    a b static void ath_tx_count_frames(struct a 
    339339        } 
    340340} 
    341341 
     342static struct ath_atx_tid *ath_get_tid(struct ath_node *an, struct sk_buff *skb) 
     343{ 
     344        struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; 
     345        u8 tidno; 
     346 
     347        tidno = ieee80211_get_qos_ctl(hdr)[0] & IEEE80211_QOS_CTL_TID_MASK; 
     348        return ATH_AN_2_TID(an, tidno); 
     349} 
    342350 
    343351static void ath_tx_complete_aggr(struct ath_softc *sc, struct ath_txq *txq, 
    344352                                 struct ath_buf *bf, struct list_head *bf_q, 
    static void ath_tx_complete_aggr(struct  
    433441        __skb_queue_head_init(&bf_pending); 
    434442 
    435443        ath_tx_count_frames(sc, bf, ts, txok, &nframes, &nbad); 
     444        tid->buf_pending -= nframes; 
     445 
    436446        while (bf) { 
    437447                txfail = txpending = 0; 
    438448                bf_next = bf->bf_next; 
    static enum ATH_AGGR_STATUS ath_tx_form_ 
    790800                        ath_tx_addto_baw(sc, tid, fi->seqno); 
    791801                ath9k_hw_set11n_aggr_middle(sc->sc_ah, bf->bf_desc, ndelim); 
    792802 
     803                tid->buf_pending++; 
    793804                __skb_unlink(skb, &tid->buf_q); 
    794805                list_add_tail(&bf->list, bf_q); 
    795806                if (bf_prev) { 
    static void ath_tx_send_ampdu(struct ath 
    14411452        if (!fi->retries) 
    14421453                ath_tx_addto_baw(sc, tid, fi->seqno); 
    14431454 
     1455        tid->buf_pending++; 
     1456 
    14441457        /* Queue to h/w without aggregation */ 
    14451458        TX_STAT_INC(txctl->txq->axq_qnum, a_queued_hw); 
    14461459        bf->bf_lastbf = bf; 
    static void setup_frame_info(struct ieee 
    15051518        struct ath_atx_tid *tid; 
    15061519        enum ath9k_key_type keytype; 
    15071520        u16 seqno = 0; 
    1508         u8 tidno; 
    15091521 
    15101522        keytype = ath9k_cmn_get_hw_crypto_keytype(skb); 
    15111523 
    static void setup_frame_info(struct ieee 
    15161528        if (an && ieee80211_is_data_qos(hdr->frame_control) && 
    15171529                conf_is_ht(&hw->conf) && (sc->sc_flags & SC_OP_TXAGGR)) { 
    15181530 
    1519                 tidno = ieee80211_get_qos_ctl(hdr)[0] & IEEE80211_QOS_CTL_TID_MASK; 
    1520  
    15211531                /* 
    15221532                 * Override seqno set by upper layer with the one 
    15231533                 * in tx aggregation state. 
    15241534                 */ 
    1525                 tid = ATH_AN_2_TID(an, tidno); 
     1535                tid = ath_get_tid(an, skb); 
    15261536                seqno = tid->seq_next; 
    15271537                hdr->seq_ctrl = cpu_to_le16(seqno << IEEE80211_SEQ_SEQ_SHIFT); 
    15281538                INCR(tid->seq_next, IEEE80211_SEQ_MAX); 
    static struct ath_buf *ath_tx_setup_buff 
    17661776 
    17671777/* FIXME: tx power */ 
    17681778static void ath_tx_start_dma(struct ath_softc *sc, struct ath_buf *bf, 
    1769                              struct ath_tx_control *txctl) 
     1779                             struct ath_tx_control *txctl, 
     1780                             struct ath_atx_tid *tid) 
    17701781{ 
    17711782        struct sk_buff *skb = bf->bf_mpdu; 
    17721783        struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb); 
    1773         struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; 
    17741784        struct list_head bf_head; 
    1775         struct ath_atx_tid *tid = NULL; 
    1776         u8 tidno; 
    17771785 
    17781786        spin_lock_bh(&txctl->txq->axq_lock); 
    1779         if ((sc->sc_flags & SC_OP_TXAGGR) && txctl->an && 
    1780                 ieee80211_is_data_qos(hdr->frame_control)) { 
    1781                 tidno = ieee80211_get_qos_ctl(hdr)[0] & 
    1782                         IEEE80211_QOS_CTL_TID_MASK; 
    1783                 tid = ATH_AN_2_TID(txctl->an, tidno); 
    1784  
    1785                 WARN_ON(tid->ac->txq != txctl->txq); 
    1786         } 
    17871787 
    17881788        if ((tx_info->flags & IEEE80211_TX_CTL_AMPDU) && tid) { 
    17891789                /* 
    int ath_tx_start(struct ieee80211_hw *hw 
    18241824        struct ieee80211_vif *vif = info->control.vif; 
    18251825        struct ath_softc *sc = hw->priv; 
    18261826        struct ath_txq *txq = txctl->txq; 
     1827        struct ath_atx_tid *tid = NULL; 
    18271828        struct ath_buf *bf; 
    18281829        int padpos, padsize; 
    18291830        int frmlen = skb->len + FCS_LEN; 
    int ath_tx_start(struct ieee80211_hw *hw 
    18571858 
    18581859                skb_push(skb, padsize); 
    18591860                memmove(skb->data, skb->data + padsize, padpos); 
     1861                hdr = (struct ieee80211_hdr *) skb->data; 
    18601862        } 
    18611863 
    18621864        if ((vif && vif->type != NL80211_IFTYPE_AP && 
    int ath_tx_start(struct ieee80211_hw *hw 
    18661868 
    18671869        setup_frame_info(hw, skb, frmlen); 
    18681870 
     1871        if ((sc->sc_flags & SC_OP_TXAGGR) && txctl->an && 
     1872            ieee80211_is_data_qos(hdr->frame_control)) { 
     1873                tid = ath_get_tid(txctl->an, skb); 
     1874 
     1875                WARN_ON(tid->ac->txq != txq); 
     1876        } 
     1877 
     1878        if ((info->flags & IEEE80211_TX_CTL_AMPDU) && tid) { 
     1879                if (sc->tx.qlen_aggr > 0 && skb_queue_len(&tid->buf_q) + 
     1880                    tid->buf_pending >= sc->tx.qlen_aggr) 
     1881                        return -ENOMEM; 
     1882        } else { 
     1883                if (sc->tx.qlen_single > 0 && 
     1884                    txq->axq_depth - txq->axq_ampdu_depth >= 
     1885                      sc->tx.qlen_single) 
     1886                        return -ENOMEM; 
     1887        } 
     1888 
    18691889        /* 
    18701890         * At this point, the vif, hw_key and sta pointers in the tx control 
    18711891         * info are no longer valid (overwritten by the ath_frame_info data. 
    int ath_tx_start(struct ieee80211_hw *hw 
    18841904        } 
    18851905        spin_unlock_bh(&txq->axq_lock); 
    18861906 
    1887         ath_tx_start_dma(sc, bf, txctl); 
     1907        ath_tx_start_dma(sc, bf, txctl, tid); 
    18881908 
    18891909        return 0; 
    18901910} 
Note: See TracBrowser for help on using the repository browser.