ath9k: fix several issues in the tx queueing rework
[openwrt.git] / package / kernel / mac80211 / patches / 566-ath9k_prepare_tid_queueing.patch
1 --- a/drivers/net/wireless/ath/ath9k/xmit.c
2 +++ b/drivers/net/wireless/ath/ath9k/xmit.c
3 @@ -672,7 +672,7 @@ static void ath_tx_process_buffer(struct
4         } else
5                 ath_tx_complete_aggr(sc, txq, bf, bf_head, ts, txok);
6  
7 -       if ((sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_HT) && !flush)
8 +       if (!flush)
9                 ath_txq_schedule(sc, txq);
10  }
11  
12 @@ -848,6 +848,7 @@ static struct ath_buf *
13  ath_tx_get_tid_subframe(struct ath_softc *sc, struct ath_txq *txq,
14                         struct ath_atx_tid *tid, struct sk_buff_head **q)
15  {
16 +       struct ieee80211_tx_info *tx_info;
17         struct ath_frame_info *fi;
18         struct sk_buff *skb;
19         struct ath_buf *bf;
20 @@ -874,6 +875,16 @@ ath_tx_get_tid_subframe(struct ath_softc
21                         continue;
22                 }
23  
24 +               bf->bf_next = NULL;
25 +               bf->bf_lastbf = bf;
26 +
27 +               tx_info = IEEE80211_SKB_CB(skb);
28 +               tx_info->flags &= ~IEEE80211_TX_CTL_CLEAR_PS_FILT;
29 +               if (!(tx_info->flags & IEEE80211_TX_CTL_AMPDU)) {
30 +                       bf->bf_state.bf_type = 0;
31 +                       return bf;
32 +               }
33 +
34                 bf->bf_state.bf_type = BUF_AMPDU | BUF_AGGR;
35                 seqno = bf->bf_state.seqno;
36  
37 @@ -893,8 +904,6 @@ ath_tx_get_tid_subframe(struct ath_softc
38                         continue;
39                 }
40  
41 -               bf->bf_next = NULL;
42 -               bf->bf_lastbf = bf;
43                 return bf;
44         }
45  
46 @@ -1328,7 +1337,7 @@ void ath_tx_aggr_stop(struct ath_softc *
47  
48         ath_txq_lock(sc, txq);
49         txtid->active = false;
50 -       txtid->paused = true;
51 +       txtid->paused = false;
52         ath_tx_flush_tid(sc, txtid);
53         ath_txq_unlock_complete(sc, txq);
54  }
55 @@ -2397,8 +2406,7 @@ static void ath_tx_processq(struct ath_s
56  
57                 if (list_empty(&txq->axq_q)) {
58                         txq->axq_link = NULL;
59 -                       if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_HT)
60 -                               ath_txq_schedule(sc, txq);
61 +                       ath_txq_schedule(sc, txq);
62                         break;
63                 }
64                 bf = list_first_entry(&txq->axq_q, struct ath_buf, list);
65 --- a/drivers/net/wireless/ath/ath9k/main.c
66 +++ b/drivers/net/wireless/ath/ath9k/main.c
67 @@ -1403,9 +1403,6 @@ static void ath9k_sta_notify(struct ieee
68         struct ath_softc *sc = hw->priv;
69         struct ath_node *an = (struct ath_node *) sta->drv_priv;
70  
71 -       if (!sta->ht_cap.ht_supported)
72 -               return;
73 -
74         switch (cmd) {
75         case STA_NOTIFY_SLEEP:
76                 an->sleeping = true;