Root/package/mac80211/patches/566-ath9k_use_ieee80211_free_txskb.patch

1--- a/drivers/net/wireless/ath/ath9k/xmit.c
2+++ b/drivers/net/wireless/ath/ath9k/xmit.c
3@@ -66,8 +66,7 @@ static void ath_tx_update_baw(struct ath
4 static struct ath_buf *ath_tx_setup_buffer(struct ath_softc *sc,
5                        struct ath_txq *txq,
6                        struct ath_atx_tid *tid,
7- struct sk_buff *skb,
8- bool dequeue);
9+ struct sk_buff *skb);
10 
11 enum {
12     MCS_HT20,
13@@ -176,7 +175,15 @@ static void ath_tx_flush_tid(struct ath_
14         fi = get_frame_info(skb);
15         bf = fi->bf;
16 
17- if (bf && fi->retries) {
18+ if (!bf) {
19+ bf = ath_tx_setup_buffer(sc, txq, tid, skb);
20+ if (!bf) {
21+ ieee80211_free_txskb(sc->hw, skb);
22+ continue;
23+ }
24+ }
25+
26+ if (fi->retries) {
27             list_add_tail(&bf->list, &bf_head);
28             ath_tx_update_baw(sc, tid, bf->bf_state.seqno);
29             ath_tx_complete_buf(sc, bf, txq, &bf_head, &ts, 0);
30@@ -785,10 +792,13 @@ static enum ATH_AGGR_STATUS ath_tx_form_
31         fi = get_frame_info(skb);
32         bf = fi->bf;
33         if (!fi->bf)
34- bf = ath_tx_setup_buffer(sc, txq, tid, skb, true);
35+ bf = ath_tx_setup_buffer(sc, txq, tid, skb);
36 
37- if (!bf)
38+ if (!bf) {
39+ __skb_unlink(skb, &tid->buf_q);
40+ ieee80211_free_txskb(sc->hw, skb);
41             continue;
42+ }
43 
44         bf->bf_state.bf_type = BUF_AMPDU | BUF_AGGR;
45         seqno = bf->bf_state.seqno;
46@@ -1731,9 +1741,11 @@ static void ath_tx_send_ampdu(struct ath
47         return;
48     }
49 
50- bf = ath_tx_setup_buffer(sc, txctl->txq, tid, skb, false);
51- if (!bf)
52+ bf = ath_tx_setup_buffer(sc, txctl->txq, tid, skb);
53+ if (!bf) {
54+ ieee80211_free_txskb(sc->hw, skb);
55         return;
56+ }
57 
58     bf->bf_state.bf_type = BUF_AMPDU;
59     INIT_LIST_HEAD(&bf_head);
60@@ -1757,11 +1769,6 @@ static void ath_tx_send_normal(struct at
61     struct ath_buf *bf;
62 
63     bf = fi->bf;
64- if (!bf)
65- bf = ath_tx_setup_buffer(sc, txq, tid, skb, false);
66-
67- if (!bf)
68- return;
69 
70     INIT_LIST_HEAD(&bf_head);
71     list_add_tail(&bf->list, &bf_head);
72@@ -1835,8 +1842,7 @@ u8 ath_txchainmask_reduction(struct ath_
73 static struct ath_buf *ath_tx_setup_buffer(struct ath_softc *sc,
74                        struct ath_txq *txq,
75                        struct ath_atx_tid *tid,
76- struct sk_buff *skb,
77- bool dequeue)
78+ struct sk_buff *skb)
79 {
80     struct ath_common *common = ath9k_hw_common(sc->sc_ah);
81     struct ath_frame_info *fi = get_frame_info(skb);
82@@ -1848,7 +1854,7 @@ static struct ath_buf *ath_tx_setup_buff
83     bf = ath_tx_get_buffer(sc);
84     if (!bf) {
85         ath_dbg(common, XMIT, "TX buffers are full\n");
86- goto error;
87+ return NULL;
88     }
89 
90     ATH_TXBUF_RESET(bf);
91@@ -1877,18 +1883,12 @@ static struct ath_buf *ath_tx_setup_buff
92         ath_err(ath9k_hw_common(sc->sc_ah),
93             "dma_mapping_error() on TX\n");
94         ath_tx_return_buffer(sc, bf);
95- goto error;
96+ return NULL;
97     }
98 
99     fi->bf = bf;
100 
101     return bf;
102-
103-error:
104- if (dequeue)
105- __skb_unlink(skb, &tid->buf_q);
106- dev_kfree_skb_any(skb);
107- return NULL;
108 }
109 
110 /* FIXME: tx power */
111@@ -1917,9 +1917,14 @@ static void ath_tx_start_dma(struct ath_
112          */
113         ath_tx_send_ampdu(sc, tid, skb, txctl);
114     } else {
115- bf = ath_tx_setup_buffer(sc, txctl->txq, tid, skb, false);
116- if (!bf)
117+ bf = ath_tx_setup_buffer(sc, txctl->txq, tid, skb);
118+ if (!bf) {
119+ if (txctl->paprd)
120+ dev_kfree_skb_any(skb);
121+ else
122+ ieee80211_free_txskb(sc->hw, skb);
123             return;
124+ }
125 
126         bf->bf_state.bfs_paprd = txctl->paprd;
127 
128--- a/drivers/net/wireless/ath/ath9k/main.c
129+++ b/drivers/net/wireless/ath/ath9k/main.c
130@@ -775,7 +775,7 @@ static void ath9k_tx(struct ieee80211_hw
131 
132     return;
133 exit:
134- dev_kfree_skb_any(skb);
135+ ieee80211_free_txskb(hw, skb);
136 }
137 
138 static void ath9k_stop(struct ieee80211_hw *hw)
139--- a/drivers/net/wireless/ath/ath9k/beacon.c
140+++ b/drivers/net/wireless/ath/ath9k/beacon.c
141@@ -120,7 +120,7 @@ static void ath9k_tx_cabq(struct ieee802
142 
143     if (ath_tx_start(hw, skb, &txctl) != 0) {
144         ath_dbg(common, XMIT, "CABQ TX failed\n");
145- dev_kfree_skb_any(skb);
146+ ieee80211_free_txskb(hw, skb);
147     }
148 }
149 
150

Archive Download this file



interactive