mac80211: brcmfmac: backport BCDC layer changes from kernel 4.12
[openwrt/openwrt.git] / package / kernel / mac80211 / patches / 319-v4.12-0042-brcmfmac-remove-reference-to-fwsignal-data-from-stru.patch
1 From acf8ac41dd733508b9e77483f96e53610c87fa64 Mon Sep 17 00:00:00 2001
2 From: Arend Van Spriel <arend.vanspriel@broadcom.com>
3 Date: Thu, 6 Apr 2017 13:14:39 +0100
4 Subject: [PATCH] brcmfmac: remove reference to fwsignal data from struct
5 brcmf_pub
6
7 The fwsignal module is part of the bcdc protocol and as such does
8 its instance data is not needed in core structure. Moving it into
9 struct brcmf_bcdc instead.
10
11 Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com>
12 Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com>
13 Reviewed-by: Franky Lin <franky.lin@broadcom.com>
14 Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
15 Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
16 ---
17 .../broadcom/brcm80211/brcmfmac/bcdc.c | 35 ++++++++++---
18 .../broadcom/brcm80211/brcmfmac/bcdc.h | 1 +
19 .../broadcom/brcm80211/brcmfmac/core.h | 2 -
20 .../broadcom/brcm80211/brcmfmac/fwsignal.c | 51 +++++++++----------
21 .../broadcom/brcm80211/brcmfmac/fwsignal.h | 4 +-
22 5 files changed, 54 insertions(+), 39 deletions(-)
23
24 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.c
25 +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.c
26 @@ -103,9 +103,17 @@ struct brcmf_bcdc {
27 u8 bus_header[BUS_HEADER_LEN];
28 struct brcmf_proto_bcdc_dcmd msg;
29 unsigned char buf[BRCMF_DCMD_MAXLEN];
30 + struct brcmf_fws_info *fws;
31 };
32
33
34 +struct brcmf_fws_info *drvr_to_fws(struct brcmf_pub *drvr)
35 +{
36 + struct brcmf_bcdc *bcdc = drvr->proto->pd;
37 +
38 + return bcdc->fws;
39 +}
40 +
41 static int
42 brcmf_proto_bcdc_msg(struct brcmf_pub *drvr, int ifidx, uint cmd, void *buf,
43 uint len, bool set)
44 @@ -330,8 +338,9 @@ static int brcmf_proto_bcdc_tx_queue_dat
45 struct sk_buff *skb)
46 {
47 struct brcmf_if *ifp = brcmf_get_ifp(drvr, ifidx);
48 + struct brcmf_bcdc *bcdc = drvr->proto->pd;
49
50 - if (!brcmf_fws_queue_skbs(drvr->fws))
51 + if (!brcmf_fws_queue_skbs(bcdc->fws))
52 return brcmf_proto_txdata(drvr, ifidx, 0, skb);
53
54 return brcmf_fws_process_skb(ifp, skb);
55 @@ -360,15 +369,15 @@ brcmf_proto_bcdc_txcomplete(struct devic
56 bool success)
57 {
58 struct brcmf_bus *bus_if = dev_get_drvdata(dev);
59 - struct brcmf_pub *drvr = bus_if->drvr;
60 + struct brcmf_bcdc *bcdc = bus_if->drvr->proto->pd;
61 struct brcmf_if *ifp;
62
63 /* await txstatus signal for firmware if active */
64 - if (brcmf_fws_fc_active(drvr->fws)) {
65 + if (brcmf_fws_fc_active(bcdc->fws)) {
66 if (!success)
67 - brcmf_fws_bustxfail(drvr->fws, txp);
68 + brcmf_fws_bustxfail(bcdc->fws, txp);
69 } else {
70 - if (brcmf_proto_bcdc_hdrpull(drvr, false, txp, &ifp))
71 + if (brcmf_proto_bcdc_hdrpull(bus_if->drvr, false, txp, &ifp))
72 brcmu_pkt_buf_free_skb(txp);
73 else
74 brcmf_txfinalize(ifp, txp, success);
75 @@ -420,7 +429,15 @@ brcmf_proto_bcdc_reset_if(struct brcmf_i
76 static int
77 brcmf_proto_bcdc_init_done(struct brcmf_pub *drvr)
78 {
79 - return brcmf_fws_attach(drvr);
80 + struct brcmf_bcdc *bcdc = drvr->proto->pd;
81 + struct brcmf_fws_info *fws;
82 +
83 + fws = brcmf_fws_attach(drvr);
84 + if (IS_ERR(fws))
85 + return PTR_ERR(fws);
86 +
87 + bcdc->fws = fws;
88 + return 0;
89 }
90
91 int brcmf_proto_bcdc_attach(struct brcmf_pub *drvr)
92 @@ -464,7 +481,9 @@ fail:
93
94 void brcmf_proto_bcdc_detach(struct brcmf_pub *drvr)
95 {
96 - brcmf_fws_detach(drvr);
97 - kfree(drvr->proto->pd);
98 + struct brcmf_bcdc *bcdc = drvr->proto->pd;
99 +
100 drvr->proto->pd = NULL;
101 + brcmf_fws_detach(bcdc->fws);
102 + kfree(bcdc);
103 }
104 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.h
105 +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.h
106 @@ -22,6 +22,7 @@ void brcmf_proto_bcdc_detach(struct brcm
107 void brcmf_proto_bcdc_txflowblock(struct device *dev, bool state);
108 void brcmf_proto_bcdc_txcomplete(struct device *dev, struct sk_buff *txp,
109 bool success);
110 +struct brcmf_fws_info *drvr_to_fws(struct brcmf_pub *drvr);
111 #else
112 static inline int brcmf_proto_bcdc_attach(struct brcmf_pub *drvr) { return 0; }
113 static inline void brcmf_proto_bcdc_detach(struct brcmf_pub *drvr) {}
114 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h
115 +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h
116 @@ -127,8 +127,6 @@ struct brcmf_pub {
117
118 struct brcmf_fweh_info fweh;
119
120 - struct brcmf_fws_info *fws;
121 -
122 struct brcmf_ampdu_rx_reorder
123 *reorder_flows[BRCMF_AMPDU_RX_REORDER_MAXFLOWS];
124
125 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
126 +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
127 @@ -36,6 +36,7 @@
128 #include "p2p.h"
129 #include "cfg80211.h"
130 #include "proto.h"
131 +#include "bcdc.h"
132 #include "common.h"
133
134 /**
135 @@ -1586,7 +1587,7 @@ static int brcmf_fws_notify_credit_map(s
136 const struct brcmf_event_msg *e,
137 void *data)
138 {
139 - struct brcmf_fws_info *fws = ifp->drvr->fws;
140 + struct brcmf_fws_info *fws = drvr_to_fws(ifp->drvr);
141 int i;
142 u8 *credits = data;
143
144 @@ -1617,7 +1618,7 @@ static int brcmf_fws_notify_bcmc_credit_
145 const struct brcmf_event_msg *e,
146 void *data)
147 {
148 - struct brcmf_fws_info *fws = ifp->drvr->fws;
149 + struct brcmf_fws_info *fws = drvr_to_fws(ifp->drvr);
150
151 if (fws) {
152 brcmf_fws_lock(fws);
153 @@ -1826,7 +1827,7 @@ netif_rx:
154 void brcmf_fws_hdrpull(struct brcmf_if *ifp, s16 siglen, struct sk_buff *skb)
155 {
156 struct brcmf_skb_reorder_data *rd;
157 - struct brcmf_fws_info *fws = ifp->drvr->fws;
158 + struct brcmf_fws_info *fws = drvr_to_fws(ifp->drvr);
159 u8 *signal_data;
160 s16 data_len;
161 u8 type;
162 @@ -2091,8 +2092,7 @@ static int brcmf_fws_assign_htod(struct
163
164 int brcmf_fws_process_skb(struct brcmf_if *ifp, struct sk_buff *skb)
165 {
166 - struct brcmf_pub *drvr = ifp->drvr;
167 - struct brcmf_fws_info *fws = drvr->fws;
168 + struct brcmf_fws_info *fws = drvr_to_fws(ifp->drvr);
169 struct brcmf_skbuff_cb *skcb = brcmf_skbcb(skb);
170 struct ethhdr *eh = (struct ethhdr *)(skb->data);
171 int fifo = BRCMF_FWS_FIFO_BCMC;
172 @@ -2142,7 +2142,7 @@ void brcmf_fws_reset_interface(struct br
173
174 void brcmf_fws_add_interface(struct brcmf_if *ifp)
175 {
176 - struct brcmf_fws_info *fws = ifp->drvr->fws;
177 + struct brcmf_fws_info *fws = drvr_to_fws(ifp->drvr);
178 struct brcmf_fws_mac_descriptor *entry;
179
180 if (!ifp->ndev || fws->fcmode == BRCMF_FWS_FCMODE_NONE)
181 @@ -2160,16 +2160,17 @@ void brcmf_fws_add_interface(struct brcm
182 void brcmf_fws_del_interface(struct brcmf_if *ifp)
183 {
184 struct brcmf_fws_mac_descriptor *entry = ifp->fws_desc;
185 + struct brcmf_fws_info *fws = drvr_to_fws(ifp->drvr);
186
187 if (!entry)
188 return;
189
190 - brcmf_fws_lock(ifp->drvr->fws);
191 + brcmf_fws_lock(fws);
192 ifp->fws_desc = NULL;
193 brcmf_dbg(TRACE, "deleting %s\n", entry->name);
194 brcmf_fws_macdesc_deinit(entry);
195 - brcmf_fws_cleanup(ifp->drvr->fws, ifp->ifidx);
196 - brcmf_fws_unlock(ifp->drvr->fws);
197 + brcmf_fws_cleanup(fws, ifp->ifidx);
198 + brcmf_fws_unlock(fws);
199 }
200
201 static void brcmf_fws_dequeue_worker(struct work_struct *worker)
202 @@ -2243,7 +2244,7 @@ static void brcmf_fws_dequeue_worker(str
203 static int brcmf_debugfs_fws_stats_read(struct seq_file *seq, void *data)
204 {
205 struct brcmf_bus *bus_if = dev_get_drvdata(seq->private);
206 - struct brcmf_fws_stats *fwstats = &bus_if->drvr->fws->stats;
207 + struct brcmf_fws_stats *fwstats = &(drvr_to_fws(bus_if->drvr)->stats);
208
209 seq_printf(seq,
210 "header_pulls: %u\n"
211 @@ -2308,7 +2309,7 @@ static int brcmf_debugfs_fws_stats_read(
212 }
213 #endif
214
215 -int brcmf_fws_attach(struct brcmf_pub *drvr)
216 +struct brcmf_fws_info *brcmf_fws_attach(struct brcmf_pub *drvr)
217 {
218 struct brcmf_fws_info *fws;
219 struct brcmf_if *ifp;
220 @@ -2316,17 +2317,15 @@ int brcmf_fws_attach(struct brcmf_pub *d
221 int rc;
222 u32 mode;
223
224 - drvr->fws = kzalloc(sizeof(*(drvr->fws)), GFP_KERNEL);
225 - if (!drvr->fws) {
226 + fws = kzalloc(sizeof(*fws), GFP_KERNEL);
227 + if (!fws) {
228 rc = -ENOMEM;
229 goto fail;
230 }
231
232 - fws = drvr->fws;
233 -
234 spin_lock_init(&fws->spinlock);
235
236 - /* set linkage back */
237 + /* store drvr reference */
238 fws->drvr = drvr;
239 fws->fcmode = drvr->settings->fcmode;
240
241 @@ -2334,7 +2333,7 @@ int brcmf_fws_attach(struct brcmf_pub *d
242 (fws->fcmode == BRCMF_FWS_FCMODE_NONE)) {
243 fws->avoid_queueing = true;
244 brcmf_dbg(INFO, "FWS queueing will be avoided\n");
245 - return 0;
246 + return fws;
247 }
248
249 fws->fws_wq = create_singlethread_workqueue("brcmf_fws_wq");
250 @@ -2396,6 +2395,7 @@ int brcmf_fws_attach(struct brcmf_pub *d
251 brcmf_fws_hanger_init(&fws->hanger);
252 brcmf_fws_macdesc_init(&fws->desc.other, NULL, 0);
253 brcmf_fws_macdesc_set_name(fws, &fws->desc.other);
254 + brcmf_dbg(INFO, "added %s\n", fws->desc.other.name);
255 brcmu_pktq_init(&fws->desc.other.psq, BRCMF_FWS_PSQ_PREC_COUNT,
256 BRCMF_FWS_PSQ_LEN);
257
258 @@ -2405,27 +2405,24 @@ int brcmf_fws_attach(struct brcmf_pub *d
259
260 brcmf_dbg(INFO, "%s bdcv2 tlv signaling [%x]\n",
261 fws->fw_signals ? "enabled" : "disabled", tlv);
262 - return 0;
263 + return fws;
264
265 fail:
266 - brcmf_fws_detach(drvr);
267 - return rc;
268 + brcmf_fws_detach(fws);
269 + return ERR_PTR(rc);
270 }
271
272 -void brcmf_fws_detach(struct brcmf_pub *drvr)
273 +void brcmf_fws_detach(struct brcmf_fws_info *fws)
274 {
275 - struct brcmf_fws_info *fws = drvr->fws;
276 -
277 if (!fws)
278 return;
279
280 - if (drvr->fws->fws_wq)
281 - destroy_workqueue(drvr->fws->fws_wq);
282 + if (fws->fws_wq)
283 + destroy_workqueue(fws->fws_wq);
284
285 /* cleanup */
286 brcmf_fws_lock(fws);
287 brcmf_fws_cleanup(fws, -1);
288 - drvr->fws = NULL;
289 brcmf_fws_unlock(fws);
290
291 /* free top structure */
292 @@ -2461,7 +2458,7 @@ void brcmf_fws_bustxfail(struct brcmf_fw
293
294 void brcmf_fws_bus_blocked(struct brcmf_pub *drvr, bool flow_blocked)
295 {
296 - struct brcmf_fws_info *fws = drvr->fws;
297 + struct brcmf_fws_info *fws = drvr_to_fws(drvr);
298 struct brcmf_if *ifp;
299 int i;
300
301 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.h
302 +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.h
303 @@ -18,8 +18,8 @@
304 #ifndef FWSIGNAL_H_
305 #define FWSIGNAL_H_
306
307 -int brcmf_fws_attach(struct brcmf_pub *drvr);
308 -void brcmf_fws_detach(struct brcmf_pub *drvr);
309 +struct brcmf_fws_info *brcmf_fws_attach(struct brcmf_pub *drvr);
310 +void brcmf_fws_detach(struct brcmf_fws_info *fws);
311 bool brcmf_fws_queue_skbs(struct brcmf_fws_info *fws);
312 bool brcmf_fws_fc_active(struct brcmf_fws_info *fws);
313 void brcmf_fws_hdrpull(struct brcmf_if *ifp, s16 siglen, struct sk_buff *skb);