source: trunk/package/mac80211/patches/540-ath9k_limit_qlen.patch @ 29273

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

ath9k: merge a pending aggregation fix

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

    a b struct ath_atx_tid { 
    238238        struct ath_node *an; 
    239239        struct ath_atx_ac *ac; 
    240240        unsigned long tx_buf[BITS_TO_LONGS(ATH_TID_MAX_BUFS)]; 
     241        int buf_pending; 
    241242        u16 seq_start; 
    242243        u16 seq_next; 
    243244        u16 baw_size; 
    struct ath_tx_control { 
    284285 *  (axq_qnum). 
    285286 */ 
    286287struct ath_tx { 
     288        u32 qlen_single; 
     289        u32 qlen_aggr; 
     290 
    287291        u16 seq_no; 
    288292        u32 txqsetup; 
    289293        spinlock_t txbuflock; 
  • drivers/net/wireless/ath/ath9k/debug.c

    a b int ath9k_init_debug(struct ath_hw *ah) 
    17291729                            sc, &fops_wiphy); 
    17301730        debugfs_create_file("xmit", S_IRUSR, sc->debug.debugfs_phy, sc, 
    17311731                            &fops_xmit); 
     1732        debugfs_create_u32("qlen_single", S_IRUSR | S_IWUSR, 
     1733                           sc->debug.debugfs_phy, &sc->tx.qlen_single); 
     1734        debugfs_create_u32("qlen_aggr", S_IRUSR | S_IWUSR, 
     1735                           sc->debug.debugfs_phy, &sc->tx.qlen_aggr); 
    17321736        debugfs_create_file("stations", S_IRUSR, sc->debug.debugfs_phy, sc, 
    17331737                            &fops_stations); 
    17341738        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 
    355355        } 
    356356} 
    357357 
     358static struct ath_atx_tid *ath_get_tid(struct ath_node *an, struct sk_buff *skb) 
     359{ 
     360        struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; 
     361        u8 tidno; 
     362 
     363        tidno = ieee80211_get_qos_ctl(hdr)[0] & IEEE80211_QOS_CTL_TID_MASK; 
     364        return ATH_AN_2_TID(an, tidno); 
     365} 
    358366 
    359367static void ath_tx_complete_aggr(struct ath_softc *sc, struct ath_txq *txq, 
    360368                                 struct ath_buf *bf, struct list_head *bf_q, 
    static void ath_tx_complete_aggr(struct  
    443451        __skb_queue_head_init(&bf_pending); 
    444452 
    445453        ath_tx_count_frames(sc, bf, ts, txok, &nframes, &nbad); 
     454        tid->buf_pending -= nframes; 
     455 
    446456        while (bf) { 
    447457                u16 seqno = bf->bf_state.seqno; 
    448458 
    static enum ATH_AGGR_STATUS ath_tx_form_ 
    823833                        ath_tx_addto_baw(sc, tid, seqno); 
    824834                bf->bf_state.ndelim = ndelim; 
    825835 
     836                tid->buf_pending++; 
    826837                __skb_unlink(skb, &tid->buf_q); 
    827838                list_add_tail(&bf->list, bf_q); 
    828839                if (bf_prev) 
    static void ath_tx_send_ampdu(struct ath 
    16821693        /* Add sub-frame to BAW */ 
    16831694        ath_tx_addto_baw(sc, tid, bf->bf_state.seqno); 
    16841695 
     1696        tid->buf_pending++; 
     1697 
    16851698        /* Queue to h/w without aggregation */ 
    16861699        TX_STAT_INC(txctl->txq->axq_qnum, a_queued_hw); 
    16871700        bf->bf_lastbf = bf; 
    error: 
    18101823 
    18111824/* FIXME: tx power */ 
    18121825static void ath_tx_start_dma(struct ath_softc *sc, struct sk_buff *skb, 
    1813                              struct ath_tx_control *txctl) 
     1826                             struct ath_tx_control *txctl, 
     1827                             struct ath_atx_tid *tid) 
    18141828{ 
    18151829        struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb); 
    1816         struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; 
    1817         struct ath_atx_tid *tid = NULL; 
    18181830        struct ath_buf *bf; 
    1819         u8 tidno; 
    18201831 
    18211832        spin_lock_bh(&txctl->txq->axq_lock); 
    1822         if ((sc->sc_flags & SC_OP_TXAGGR) && txctl->an && 
    1823                 ieee80211_is_data_qos(hdr->frame_control)) { 
    1824                 tidno = ieee80211_get_qos_ctl(hdr)[0] & 
    1825                         IEEE80211_QOS_CTL_TID_MASK; 
    1826                 tid = ATH_AN_2_TID(txctl->an, tidno); 
    1827  
    1828                 WARN_ON(tid->ac->txq != txctl->txq); 
    1829         } 
    18301833 
    18311834        if ((tx_info->flags & IEEE80211_TX_CTL_AMPDU) && tid) { 
    18321835                /* 
    int ath_tx_start(struct ieee80211_hw *hw 
    18611864        struct ieee80211_vif *vif = info->control.vif; 
    18621865        struct ath_softc *sc = hw->priv; 
    18631866        struct ath_txq *txq = txctl->txq; 
     1867        struct ath_atx_tid *tid = NULL; 
    18641868        int padpos, padsize; 
    18651869        int frmlen = skb->len + FCS_LEN; 
    18661870        int q; 
    int ath_tx_start(struct ieee80211_hw *hw 
    19031907 
    19041908        setup_frame_info(hw, skb, frmlen); 
    19051909 
     1910        if ((sc->sc_flags & SC_OP_TXAGGR) && txctl->an && 
     1911            ieee80211_is_data_qos(hdr->frame_control)) { 
     1912                tid = ath_get_tid(txctl->an, skb); 
     1913 
     1914                WARN_ON(tid->ac->txq != txq); 
     1915        } 
     1916 
     1917        if ((info->flags & IEEE80211_TX_CTL_AMPDU) && tid) { 
     1918                if (sc->tx.qlen_aggr > 0 && skb_queue_len(&tid->buf_q) + 
     1919                    tid->buf_pending >= sc->tx.qlen_aggr) 
     1920                        return -ENOMEM; 
     1921        } else { 
     1922                if (sc->tx.qlen_single > 0 && 
     1923                    txq->axq_depth - txq->axq_ampdu_depth >= 
     1924                      sc->tx.qlen_single) 
     1925                        return -ENOMEM; 
     1926        } 
     1927 
    19061928        /* 
    19071929         * At this point, the vif, hw_key and sta pointers in the tx control 
    19081930         * info are no longer valid (overwritten by the ath_frame_info data. 
    int ath_tx_start(struct ieee80211_hw *hw 
    19171939        } 
    19181940        spin_unlock_bh(&txq->axq_lock); 
    19191941 
    1920         ath_tx_start_dma(sc, skb, txctl); 
     1942        ath_tx_start_dma(sc, skb, txctl, tid); 
    19211943        return 0; 
    19221944} 
    19231945 
Note: See TracBrowser for help on using the repository browser.