ath9k: merge a fix for PS-Poll responses + aggregation
authorFelix Fietkau <nbd@openwrt.org>
Tue, 17 Sep 2013 10:07:56 +0000 (10:07 +0000)
committerFelix Fietkau <nbd@openwrt.org>
Tue, 17 Sep 2013 10:07:56 +0000 (10:07 +0000)
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
SVN-Revision: 38017

package/kernel/mac80211/patches/300-pending_work.patch

index 5beb4405d378b25cb8a324c13e74f83948ad65b7..b397b721d6478aef91b9e8b0e751fd64671a6d37 100644 (file)
 +              return false;
 +
 +      INIT_LIST_HEAD(&bf_q);
-+
+-              ath_tx_fill_desc(sc, bf, txq, aggr_len);
+-              ath_tx_txqaddbuf(sc, txq, &bf_q, false);
+-      } while (txq->axq_ampdu_depth < ATH_AGGR_MIN_QDEPTH &&
+-               status != ATH_AGGR_BAW_CLOSED);
 +      bf = ath_tx_get_tid_subframe(sc, txq, tid, &tid_q);
 +      if (!bf)
 +              return false;
 +              *stop = true;
 +              return false;
 +      }
--              ath_tx_fill_desc(sc, bf, txq, aggr_len);
--              ath_tx_txqaddbuf(sc, txq, &bf_q, false);
--      } while (txq->axq_ampdu_depth < ATH_AGGR_MIN_QDEPTH &&
--               status != ATH_AGGR_BAW_CLOSED);
++
 +      ath_set_rates(tid->an->vif, tid->an->sta, bf);
 +      if (aggr)
 +              last = ath_tx_form_aggr(sc, txq, tid, &bf_q, bf,
        int sent = 0;
        int i;
  
-@@ -1394,15 +1548,15 @@ void ath9k_release_buffered_frames(struc
+@@ -1394,16 +1548,18 @@ void ath9k_release_buffered_frames(struc
                        continue;
  
                ath_txq_lock(sc, tid->ac->txq);
                        list_add_tail(&bf->list, &bf_q);
                        ath_set_rates(tid->an->vif, tid->an->sta, bf);
 -                      ath_tx_addto_baw(sc, tid, bf->bf_state.seqno);
-+                      ath_tx_addto_baw(sc, tid, bf);
-                       bf->bf_state.bf_type &= ~BUF_AGGR;
+-                      bf->bf_state.bf_type &= ~BUF_AGGR;
++                      if (bf_isampdu(bf)) {
++                              ath_tx_addto_baw(sc, tid, bf);
++                              bf->bf_state.bf_type &= ~BUF_AGGR;
++                      }
                        if (bf_tail)
                                bf_tail->bf_next = bf;
-@@ -1412,7 +1566,7 @@ void ath9k_release_buffered_frames(struc
+@@ -1412,7 +1568,7 @@ void ath9k_release_buffered_frames(struc
                        sent++;
                        TX_STAT_INC(txq->axq_qnum, a_queued_hw);
  
                                ieee80211_sta_set_buffered(an->sta, i, false);
                }
                ath_txq_unlock_complete(sc, tid->ac->txq);
-@@ -1571,7 +1725,7 @@ static void ath_drain_txq_list(struct at
+@@ -1571,7 +1727,7 @@ static void ath_drain_txq_list(struct at
        while (!list_empty(list)) {
                bf = list_first_entry(list, struct ath_buf, list);
  
                        list_del(&bf->list);
  
                        ath_tx_return_buffer(sc, bf);
-@@ -1665,25 +1819,27 @@ void ath_tx_cleanupq(struct ath_softc *s
+@@ -1665,25 +1821,27 @@ void ath_tx_cleanupq(struct ath_softc *s
   */
  void ath_txq_schedule(struct ath_softc *sc, struct ath_txq *txq)
  {
                        tid = list_first_entry(&ac->tid_q, struct ath_atx_tid,
                                               list);
                        list_del(&tid->list);
-@@ -1692,17 +1848,17 @@ void ath_txq_schedule(struct ath_softc *
+@@ -1692,17 +1850,17 @@ void ath_txq_schedule(struct ath_softc *
                        if (tid->paused)
                                continue;
  
                                break;
                }
  
-@@ -1711,9 +1867,17 @@ void ath_txq_schedule(struct ath_softc *
+@@ -1711,9 +1869,17 @@ void ath_txq_schedule(struct ath_softc *
                        list_add_tail(&ac->list, &txq->axq_acq);
                }
  
        }
  
        rcu_read_unlock();
-@@ -1787,62 +1951,13 @@ static void ath_tx_txqaddbuf(struct ath_
+@@ -1787,62 +1953,13 @@ static void ath_tx_txqaddbuf(struct ath_
                        if (bf_is_ampdu_not_probing(bf))
                                txq->axq_ampdu_depth++;
  
  static void ath_tx_send_normal(struct ath_softc *sc, struct ath_txq *txq,
                               struct ath_atx_tid *tid, struct sk_buff *skb)
  {
-@@ -1985,6 +2100,7 @@ static int ath_tx_prepare(struct ieee802
+@@ -1985,6 +2102,7 @@ static int ath_tx_prepare(struct ieee802
        struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
        struct ieee80211_sta *sta = txctl->sta;
        struct ieee80211_vif *vif = info->control.vif;
        struct ath_softc *sc = hw->priv;
        int frmlen = skb->len + FCS_LEN;
        int padpos, padsize;
-@@ -1992,6 +2108,10 @@ static int ath_tx_prepare(struct ieee802
+@@ -1992,6 +2110,10 @@ static int ath_tx_prepare(struct ieee802
        /* NOTE:  sta can be NULL according to net/mac80211.h */
        if (sta)
                txctl->an = (struct ath_node *)sta->drv_priv;
  
        if (info->control.hw_key)
                frmlen += info->control.hw_key->icv_len;
-@@ -2041,7 +2161,6 @@ int ath_tx_start(struct ieee80211_hw *hw
+@@ -2041,7 +2163,6 @@ int ath_tx_start(struct ieee80211_hw *hw
        struct ath_txq *txq = txctl->txq;
        struct ath_atx_tid *tid = NULL;
        struct ath_buf *bf;
        int q;
        int ret;
  
-@@ -2069,27 +2188,31 @@ int ath_tx_start(struct ieee80211_hw *hw
+@@ -2069,27 +2190,31 @@ int ath_tx_start(struct ieee80211_hw *hw
                ath_txq_unlock(sc, txq);
                txq = sc->tx.uapsdq;
                ath_txq_lock(sc, txq);
                if (txctl->paprd)
                        dev_kfree_skb_any(skb);
                else
-@@ -2142,7 +2265,7 @@ void ath_tx_cabq(struct ieee80211_hw *hw
+@@ -2142,7 +2267,7 @@ void ath_tx_cabq(struct ieee80211_hw *hw
  
                bf->bf_lastbf = bf;
                ath_set_rates(vif, NULL, bf);
                duration += info.rates[0].PktDuration;
                if (bf_tail)
                        bf_tail->bf_next = bf;
-@@ -2189,7 +2312,7 @@ static void ath_tx_complete(struct ath_s
+@@ -2189,7 +2314,7 @@ static void ath_tx_complete(struct ath_s
        struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb);
        struct ath_common *common = ath9k_hw_common(sc->sc_ah);
        struct ieee80211_hdr * hdr = (struct ieee80211_hdr *)skb->data;
        unsigned long flags;
  
        ath_dbg(common, XMIT, "TX complete: skb: %p\n", skb);
-@@ -2225,21 +2348,7 @@ static void ath_tx_complete(struct ath_s
+@@ -2225,21 +2350,7 @@ static void ath_tx_complete(struct ath_s
        spin_unlock_irqrestore(&sc->sc_pm_lock, flags);
  
        __skb_queue_tail(&txq->complete_q, skb);
  }
  
  static void ath_tx_complete_buf(struct ath_softc *sc, struct ath_buf *bf,
-@@ -2360,8 +2469,7 @@ static void ath_tx_processq(struct ath_s
+@@ -2360,8 +2471,7 @@ static void ath_tx_processq(struct ath_s
  
                if (list_empty(&txq->axq_q)) {
                        txq->axq_link = NULL;
                        break;
                }
                bf = list_first_entry(&txq->axq_q, struct ath_buf, list);
-@@ -2375,7 +2483,7 @@ static void ath_tx_processq(struct ath_s
+@@ -2375,7 +2485,7 @@ static void ath_tx_processq(struct ath_s
                 * it with the STALE flag.
                 */
                bf_held = NULL;
                        bf_held = bf;
                        if (list_is_last(&bf_held->list, &txq->axq_q))
                                break;
-@@ -2399,7 +2507,7 @@ static void ath_tx_processq(struct ath_s
+@@ -2399,7 +2509,7 @@ static void ath_tx_processq(struct ath_s
                 * however leave the last descriptor back as the holding
                 * descriptor for hw.
                 */
                INIT_LIST_HEAD(&bf_head);
                if (!list_is_singular(&lastbf->list))
                        list_cut_position(&bf_head,
-@@ -2470,7 +2578,7 @@ void ath_tx_edma_tasklet(struct ath_soft
+@@ -2470,7 +2580,7 @@ void ath_tx_edma_tasklet(struct ath_soft
                }
  
                bf = list_first_entry(fifo_list, struct ath_buf, list);
                        list_del(&bf->list);
                        ath_tx_return_buffer(sc, bf);
                        bf = list_first_entry(fifo_list, struct ath_buf, list);
-@@ -2492,7 +2600,7 @@ void ath_tx_edma_tasklet(struct ath_soft
+@@ -2492,7 +2602,7 @@ void ath_tx_edma_tasklet(struct ath_soft
                                ath_tx_txqaddbuf(sc, txq, &bf_q, true);
                        }
                } else {
                        if (bf != lastbf)
                                list_cut_position(&bf_head, fifo_list,
                                                  lastbf->list.prev);
-@@ -2583,6 +2691,7 @@ void ath_tx_node_init(struct ath_softc *
+@@ -2583,6 +2693,7 @@ void ath_tx_node_init(struct ath_softc *
                tid->paused    = false;
                tid->active        = false;
                __skb_queue_head_init(&tid->buf_q);
                acno = TID_TO_WME_AC(tidno);
                tid->ac = &an->ac[acno];
        }
-@@ -2590,6 +2699,7 @@ void ath_tx_node_init(struct ath_softc *
+@@ -2590,6 +2701,7 @@ void ath_tx_node_init(struct ath_softc *
        for (acno = 0, ac = &an->ac[acno];
             acno < IEEE80211_NUM_ACS; acno++, ac++) {
                ac->sched    = false;