aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/brcm80211
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireless/brcm80211')
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c2
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/bcmsdh_sdmmc.c2
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/dhd.h39
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/dhd_bus.h19
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/dhd_cdc.c48
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/dhd_common.c2
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/dhd_dbg.h35
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c90
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c24
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/sdio_chip.c2
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/usb.c27
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c99
-rw-r--r--drivers/net/wireless/brcm80211/brcmsmac/ampdu.c7
-rw-r--r--drivers/net/wireless/brcm80211/brcmsmac/channel.c13
-rw-r--r--drivers/net/wireless/brcm80211/brcmsmac/debug.h1
-rw-r--r--drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c19
-rw-r--r--drivers/net/wireless/brcm80211/brcmsmac/main.c9
-rw-r--r--drivers/net/wireless/brcm80211/brcmsmac/phy/phy_lcn.c4
-rw-r--r--drivers/net/wireless/brcm80211/brcmsmac/scb.h1
19 files changed, 161 insertions, 282 deletions
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c b/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c
index be35a2f99b1c..11fd1c735589 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c
@@ -15,8 +15,6 @@
15 */ 15 */
16/* ****************** SDIO CARD Interface Functions **************************/ 16/* ****************** SDIO CARD Interface Functions **************************/
17 17
18#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
19
20#include <linux/types.h> 18#include <linux/types.h>
21#include <linux/netdevice.h> 19#include <linux/netdevice.h>
22#include <linux/export.h> 20#include <linux/export.h>
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh_sdmmc.c b/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh_sdmmc.c
index d33e5598611b..d92d373733d7 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh_sdmmc.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh_sdmmc.c
@@ -14,8 +14,6 @@
14 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 14 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15 */ 15 */
16 16
17#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
18
19#include <linux/types.h> 17#include <linux/types.h>
20#include <linux/netdevice.h> 18#include <linux/netdevice.h>
21#include <linux/mmc/sdio.h> 19#include <linux/mmc/sdio.h>
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd.h b/drivers/net/wireless/brcm80211/brcmfmac/dhd.h
index fd672bf53867..a2f32fb990fa 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/dhd.h
+++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd.h
@@ -39,6 +39,7 @@
39#define BRCMF_C_GET_BSSID 23 39#define BRCMF_C_GET_BSSID 23
40#define BRCMF_C_GET_SSID 25 40#define BRCMF_C_GET_SSID 25
41#define BRCMF_C_SET_SSID 26 41#define BRCMF_C_SET_SSID 26
42#define BRCMF_C_TERMINATED 28
42#define BRCMF_C_GET_CHANNEL 29 43#define BRCMF_C_GET_CHANNEL 29
43#define BRCMF_C_SET_CHANNEL 30 44#define BRCMF_C_SET_CHANNEL 30
44#define BRCMF_C_GET_SRL 31 45#define BRCMF_C_GET_SRL 31
@@ -480,36 +481,14 @@ struct brcmf_pub {
480 unsigned long drv_version; /* Version of dongle-resident driver */ 481 unsigned long drv_version; /* Version of dongle-resident driver */
481 u8 mac[ETH_ALEN]; /* MAC address obtained from dongle */ 482 u8 mac[ETH_ALEN]; /* MAC address obtained from dongle */
482 483
483 /* Additional stats for the bus level */
484
485 /* Multicast data packets sent to dongle */ 484 /* Multicast data packets sent to dongle */
486 unsigned long tx_multicast; 485 unsigned long tx_multicast;
487 /* Packets flushed due to unscheduled sendup thread */
488 unsigned long rx_flushed;
489 /* Number of times dpc scheduled by watchdog timer */
490 unsigned long wd_dpc_sched;
491
492 /* Number of flow control pkts recvd */
493 unsigned long fc_packets;
494
495 /* Last error return */
496 int bcmerror;
497
498 /* Last error from dongle */
499 int dongle_error;
500
501 /* Suspend disable flag flag */
502 int suspend_disable_flag; /* "1" to disable all extra powersaving
503 during suspend */
504 int in_suspend; /* flag set to 1 when early suspend called */
505 int dtim_skip; /* dtim skip , default 0 means wake each dtim */
506 486
507 struct brcmf_if *iflist[BRCMF_MAX_IFS]; 487 struct brcmf_if *iflist[BRCMF_MAX_IFS];
508 488
509 struct mutex proto_block; 489 struct mutex proto_block;
510 unsigned char proto_buf[BRCMF_DCMD_MAXLEN]; 490 unsigned char proto_buf[BRCMF_DCMD_MAXLEN];
511 491
512 u8 macvalue[ETH_ALEN];
513 atomic_t pend_8021x_cnt; 492 atomic_t pend_8021x_cnt;
514 wait_queue_head_t pend_8021x_wait; 493 wait_queue_head_t pend_8021x_wait;
515 494
@@ -519,11 +498,6 @@ struct brcmf_pub {
519#endif 498#endif
520}; 499};
521 500
522struct bcmevent_name {
523 uint event;
524 const char *name;
525};
526
527struct brcmf_if_event { 501struct brcmf_if_event {
528 u8 ifidx; 502 u8 ifidx;
529 u8 action; 503 u8 action;
@@ -557,13 +531,6 @@ struct brcmf_if {
557 u8 mac_addr[ETH_ALEN]; 531 u8 mac_addr[ETH_ALEN];
558}; 532};
559 533
560static inline s32 brcmf_ndev_bssidx(struct net_device *ndev)
561{
562 struct brcmf_if *ifp = netdev_priv(ndev);
563 return ifp->bssidx;
564}
565
566extern const struct bcmevent_name bcmevent_names[];
567 534
568extern int brcmf_netdev_wait_pend8021x(struct net_device *ndev); 535extern int brcmf_netdev_wait_pend8021x(struct net_device *ndev);
569 536
@@ -576,6 +543,10 @@ extern int brcmf_proto_cdc_query_dcmd(struct brcmf_pub *drvr, int ifidx,
576extern int brcmf_proto_cdc_set_dcmd(struct brcmf_pub *drvr, int ifidx, uint cmd, 543extern int brcmf_proto_cdc_set_dcmd(struct brcmf_pub *drvr, int ifidx, uint cmd,
577 void *buf, uint len); 544 void *buf, uint len);
578 545
546/* Remove any protocol-specific data header. */
547extern int brcmf_proto_hdrpull(struct brcmf_pub *drvr, u8 *ifidx,
548 struct sk_buff *rxp);
549
579extern int brcmf_net_attach(struct brcmf_if *ifp); 550extern int brcmf_net_attach(struct brcmf_if *ifp);
580extern struct brcmf_if *brcmf_add_if(struct brcmf_pub *drvr, int ifidx, 551extern struct brcmf_if *brcmf_add_if(struct brcmf_pub *drvr, int ifidx,
581 s32 bssidx, char *name, u8 *mac_addr); 552 s32 bssidx, char *name, u8 *mac_addr);
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd_bus.h b/drivers/net/wireless/brcm80211/brcmfmac/dhd_bus.h
index dd38b78a9726..64c38f4226a3 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/dhd_bus.h
+++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd_bus.h
@@ -130,31 +130,18 @@ int brcmf_bus_rxctl(struct brcmf_bus *bus, unsigned char *msg, uint len)
130 * interface functions from common layer 130 * interface functions from common layer
131 */ 131 */
132 132
133/* Remove any protocol-specific data header. */
134extern int brcmf_proto_hdrpull(struct device *dev, int *ifidx,
135 struct sk_buff *rxp);
136
137extern bool brcmf_c_prec_enq(struct device *dev, struct pktq *q, 133extern bool brcmf_c_prec_enq(struct device *dev, struct pktq *q,
138 struct sk_buff *pkt, int prec); 134 struct sk_buff *pkt, int prec);
139 135
140/* Receive frame for delivery to OS. Callee disposes of rxp. */ 136/* Receive frame for delivery to OS. Callee disposes of rxp. */
141extern void brcmf_rx_frame(struct device *dev, u8 ifidx, 137extern void brcmf_rx_frames(struct device *dev, struct sk_buff_head *rxlist);
142 struct sk_buff_head *rxlist);
143static inline void brcmf_rx_packet(struct device *dev, int ifidx,
144 struct sk_buff *pkt)
145{
146 struct sk_buff_head q;
147
148 skb_queue_head_init(&q);
149 skb_queue_tail(&q, pkt);
150 brcmf_rx_frame(dev, ifidx, &q);
151}
152 138
153/* Indication from bus module regarding presence/insertion of dongle. */ 139/* Indication from bus module regarding presence/insertion of dongle. */
154extern int brcmf_attach(uint bus_hdrlen, struct device *dev); 140extern int brcmf_attach(uint bus_hdrlen, struct device *dev);
155/* Indication from bus module regarding removal/absence of dongle */ 141/* Indication from bus module regarding removal/absence of dongle */
156extern void brcmf_detach(struct device *dev); 142extern void brcmf_detach(struct device *dev);
157 143/* Indication from bus module that dongle should be reset */
144extern void brcmf_dev_reset(struct device *dev);
158/* Indication from bus module to change flow-control state */ 145/* Indication from bus module to change flow-control state */
159extern void brcmf_txflowblock(struct device *dev, bool state); 146extern void brcmf_txflowblock(struct device *dev, bool state);
160 147
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd_cdc.c b/drivers/net/wireless/brcm80211/brcmfmac/dhd_cdc.c
index 83923553f1ac..bb454cdab29d 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/dhd_cdc.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd_cdc.c
@@ -19,8 +19,6 @@
19 * For certain dcmd codes, the dongle interprets string data from the host. 19 * For certain dcmd codes, the dongle interprets string data from the host.
20 ******************************************************************************/ 20 ******************************************************************************/
21 21
22#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
23
24#include <linux/types.h> 22#include <linux/types.h>
25#include <linux/netdevice.h> 23#include <linux/netdevice.h>
26 24
@@ -94,8 +92,6 @@ struct brcmf_proto_bdc_header {
94 92
95struct brcmf_proto { 93struct brcmf_proto {
96 u16 reqid; 94 u16 reqid;
97 u8 pending;
98 u32 lastcmd;
99 u8 bus_header[BUS_HEADER_LEN]; 95 u8 bus_header[BUS_HEADER_LEN];
100 struct brcmf_proto_cdc_dcmd msg; 96 struct brcmf_proto_cdc_dcmd msg;
101 unsigned char buf[BRCMF_DCMD_MAXLEN + ROUND_UP_MARGIN]; 97 unsigned char buf[BRCMF_DCMD_MAXLEN + ROUND_UP_MARGIN];
@@ -107,7 +103,7 @@ static int brcmf_proto_cdc_msg(struct brcmf_pub *drvr)
107 int len = le32_to_cpu(prot->msg.len) + 103 int len = le32_to_cpu(prot->msg.len) +
108 sizeof(struct brcmf_proto_cdc_dcmd); 104 sizeof(struct brcmf_proto_cdc_dcmd);
109 105
110 brcmf_dbg(TRACE, "Enter\n"); 106 brcmf_dbg(CDC, "Enter\n");
111 107
112 /* NOTE : cdc->msg.len holds the desired length of the buffer to be 108 /* NOTE : cdc->msg.len holds the desired length of the buffer to be
113 * returned. Only up to CDC_MAX_MSG_SIZE of this buffer area 109 * returned. Only up to CDC_MAX_MSG_SIZE of this buffer area
@@ -125,7 +121,7 @@ static int brcmf_proto_cdc_cmplt(struct brcmf_pub *drvr, u32 id, u32 len)
125 int ret; 121 int ret;
126 struct brcmf_proto *prot = drvr->prot; 122 struct brcmf_proto *prot = drvr->prot;
127 123
128 brcmf_dbg(TRACE, "Enter\n"); 124 brcmf_dbg(CDC, "Enter\n");
129 len += sizeof(struct brcmf_proto_cdc_dcmd); 125 len += sizeof(struct brcmf_proto_cdc_dcmd);
130 do { 126 do {
131 ret = brcmf_bus_rxctl(drvr->bus_if, (unsigned char *)&prot->msg, 127 ret = brcmf_bus_rxctl(drvr->bus_if, (unsigned char *)&prot->msg,
@@ -147,20 +143,7 @@ brcmf_proto_cdc_query_dcmd(struct brcmf_pub *drvr, int ifidx, uint cmd,
147 int ret = 0, retries = 0; 143 int ret = 0, retries = 0;
148 u32 id, flags; 144 u32 id, flags;
149 145
150 brcmf_dbg(TRACE, "Enter\n"); 146 brcmf_dbg(CDC, "Enter, cmd %d len %d\n", cmd, len);
151 brcmf_dbg(CTL, "cmd %d len %d\n", cmd, len);
152
153 /* Respond "bcmerror" and "bcmerrorstr" with local cache */
154 if (cmd == BRCMF_C_GET_VAR && buf) {
155 if (!strcmp((char *)buf, "bcmerrorstr")) {
156 strncpy((char *)buf, "bcm_error",
157 BCME_STRLEN);
158 goto done;
159 } else if (!strcmp((char *)buf, "bcmerror")) {
160 *(int *)buf = drvr->dongle_error;
161 goto done;
162 }
163 }
164 147
165 memset(msg, 0, sizeof(struct brcmf_proto_cdc_dcmd)); 148 memset(msg, 0, sizeof(struct brcmf_proto_cdc_dcmd));
166 149
@@ -210,11 +193,8 @@ retry:
210 } 193 }
211 194
212 /* Check the ERROR flag */ 195 /* Check the ERROR flag */
213 if (flags & CDC_DCMD_ERROR) { 196 if (flags & CDC_DCMD_ERROR)
214 ret = le32_to_cpu(msg->status); 197 ret = le32_to_cpu(msg->status);
215 /* Cache error from dongle */
216 drvr->dongle_error = ret;
217 }
218 198
219done: 199done:
220 return ret; 200 return ret;
@@ -228,8 +208,7 @@ int brcmf_proto_cdc_set_dcmd(struct brcmf_pub *drvr, int ifidx, uint cmd,
228 int ret = 0; 208 int ret = 0;
229 u32 flags, id; 209 u32 flags, id;
230 210
231 brcmf_dbg(TRACE, "Enter\n"); 211 brcmf_dbg(CDC, "Enter, cmd %d len %d\n", cmd, len);
232 brcmf_dbg(CTL, "cmd %d len %d\n", cmd, len);
233 212
234 memset(msg, 0, sizeof(struct brcmf_proto_cdc_dcmd)); 213 memset(msg, 0, sizeof(struct brcmf_proto_cdc_dcmd));
235 214
@@ -262,11 +241,8 @@ int brcmf_proto_cdc_set_dcmd(struct brcmf_pub *drvr, int ifidx, uint cmd,
262 } 241 }
263 242
264 /* Check the ERROR flag */ 243 /* Check the ERROR flag */
265 if (flags & CDC_DCMD_ERROR) { 244 if (flags & CDC_DCMD_ERROR)
266 ret = le32_to_cpu(msg->status); 245 ret = le32_to_cpu(msg->status);
267 /* Cache error from dongle */
268 drvr->dongle_error = ret;
269 }
270 246
271done: 247done:
272 return ret; 248 return ret;
@@ -287,7 +263,7 @@ void brcmf_proto_hdrpush(struct brcmf_pub *drvr, int ifidx,
287{ 263{
288 struct brcmf_proto_bdc_header *h; 264 struct brcmf_proto_bdc_header *h;
289 265
290 brcmf_dbg(TRACE, "Enter\n"); 266 brcmf_dbg(CDC, "Enter\n");
291 267
292 /* Push BDC header used to convey priority for buses that don't */ 268 /* Push BDC header used to convey priority for buses that don't */
293 269
@@ -305,14 +281,12 @@ void brcmf_proto_hdrpush(struct brcmf_pub *drvr, int ifidx,
305 BDC_SET_IF_IDX(h, ifidx); 281 BDC_SET_IF_IDX(h, ifidx);
306} 282}
307 283
308int brcmf_proto_hdrpull(struct device *dev, int *ifidx, 284int brcmf_proto_hdrpull(struct brcmf_pub *drvr, u8 *ifidx,
309 struct sk_buff *pktbuf) 285 struct sk_buff *pktbuf)
310{ 286{
311 struct brcmf_proto_bdc_header *h; 287 struct brcmf_proto_bdc_header *h;
312 struct brcmf_bus *bus_if = dev_get_drvdata(dev);
313 struct brcmf_pub *drvr = bus_if->drvr;
314 288
315 brcmf_dbg(TRACE, "Enter\n"); 289 brcmf_dbg(CDC, "Enter\n");
316 290
317 /* Pop BDC header used to convey priority for buses that don't */ 291 /* Pop BDC header used to convey priority for buses that don't */
318 292
@@ -338,7 +312,7 @@ int brcmf_proto_hdrpull(struct device *dev, int *ifidx,
338 } 312 }
339 313
340 if (h->flags & BDC_FLAG_SUM_GOOD) { 314 if (h->flags & BDC_FLAG_SUM_GOOD) {
341 brcmf_dbg(INFO, "%s: BDC packet received with good rx-csum, flags 0x%x\n", 315 brcmf_dbg(CDC, "%s: BDC rcv, good checksum, flags 0x%x\n",
342 brcmf_ifname(drvr, *ifidx), h->flags); 316 brcmf_ifname(drvr, *ifidx), h->flags);
343 pkt_set_sum_good(pktbuf, true); 317 pkt_set_sum_good(pktbuf, true);
344 } 318 }
@@ -348,6 +322,8 @@ int brcmf_proto_hdrpull(struct device *dev, int *ifidx,
348 skb_pull(pktbuf, BDC_HEADER_LEN); 322 skb_pull(pktbuf, BDC_HEADER_LEN);
349 skb_pull(pktbuf, h->data_offset << 2); 323 skb_pull(pktbuf, h->data_offset << 2);
350 324
325 if (pktbuf->len == 0)
326 return -ENODATA;
351 return 0; 327 return 0;
352} 328}
353 329
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd_common.c b/drivers/net/wireless/brcm80211/brcmfmac/dhd_common.c
index f8b52e5b941a..4544342a0428 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/dhd_common.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd_common.c
@@ -14,8 +14,6 @@
14 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 14 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15 */ 15 */
16 16
17#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
18
19#include <linux/kernel.h> 17#include <linux/kernel.h>
20#include <linux/string.h> 18#include <linux/string.h>
21#include <linux/netdevice.h> 19#include <linux/netdevice.h>
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd_dbg.h b/drivers/net/wireless/brcm80211/brcmfmac/dhd_dbg.h
index f2ab01cd7966..bc013cbe06f6 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/dhd_dbg.h
+++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd_dbg.h
@@ -18,21 +18,26 @@
18#define _BRCMF_DBG_H_ 18#define _BRCMF_DBG_H_
19 19
20/* message levels */ 20/* message levels */
21#define BRCMF_TRACE_VAL 0x0002 21#define BRCMF_TRACE_VAL 0x00000002
22#define BRCMF_INFO_VAL 0x0004 22#define BRCMF_INFO_VAL 0x00000004
23#define BRCMF_DATA_VAL 0x0008 23#define BRCMF_DATA_VAL 0x00000008
24#define BRCMF_CTL_VAL 0x0010 24#define BRCMF_CTL_VAL 0x00000010
25#define BRCMF_TIMER_VAL 0x0020 25#define BRCMF_TIMER_VAL 0x00000020
26#define BRCMF_HDRS_VAL 0x0040 26#define BRCMF_HDRS_VAL 0x00000040
27#define BRCMF_BYTES_VAL 0x0080 27#define BRCMF_BYTES_VAL 0x00000080
28#define BRCMF_INTR_VAL 0x0100 28#define BRCMF_INTR_VAL 0x00000100
29#define BRCMF_GLOM_VAL 0x0200 29#define BRCMF_GLOM_VAL 0x00000200
30#define BRCMF_EVENT_VAL 0x0400 30#define BRCMF_EVENT_VAL 0x00000400
31#define BRCMF_BTA_VAL 0x0800 31#define BRCMF_BTA_VAL 0x00000800
32#define BRCMF_FIL_VAL 0x1000 32#define BRCMF_FIL_VAL 0x00001000
33#define BRCMF_USB_VAL 0x2000 33#define BRCMF_USB_VAL 0x00002000
34#define BRCMF_SCAN_VAL 0x4000 34#define BRCMF_SCAN_VAL 0x00004000
35#define BRCMF_CONN_VAL 0x8000 35#define BRCMF_CONN_VAL 0x00008000
36#define BRCMF_CDC_VAL 0x00010000
37
38/* set default print format */
39#undef pr_fmt
40#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
36 41
37/* Macro for error messages. net_ratelimit() is used when driver 42/* Macro for error messages. net_ratelimit() is used when driver
38 * debugging is not selected. When debugging the driver error 43 * debugging is not selected. When debugging the driver error
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c b/drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c
index 74a616b4de8e..e3326a58bdb1 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c
@@ -14,8 +14,6 @@
14 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 14 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15 */ 15 */
16 16
17#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
18
19#include <linux/kernel.h> 17#include <linux/kernel.h>
20#include <linux/etherdevice.h> 18#include <linux/etherdevice.h>
21#include <linux/module.h> 19#include <linux/module.h>
@@ -162,28 +160,31 @@ static void brcmf_netdev_set_multicast_list(struct net_device *ndev)
162 schedule_work(&ifp->multicast_work); 160 schedule_work(&ifp->multicast_work);
163} 161}
164 162
165static int brcmf_netdev_start_xmit(struct sk_buff *skb, struct net_device *ndev) 163static netdev_tx_t brcmf_netdev_start_xmit(struct sk_buff *skb,
164 struct net_device *ndev)
166{ 165{
167 int ret; 166 int ret;
168 struct brcmf_if *ifp = netdev_priv(ndev); 167 struct brcmf_if *ifp = netdev_priv(ndev);
169 struct brcmf_pub *drvr = ifp->drvr; 168 struct brcmf_pub *drvr = ifp->drvr;
169 struct ethhdr *eh;
170 170
171 brcmf_dbg(TRACE, "Enter\n"); 171 brcmf_dbg(TRACE, "Enter\n");
172 172
173 /* Reject if down */ 173 /* Can the device send data? */
174 if (!drvr->bus_if->drvr_up || 174 if (drvr->bus_if->state != BRCMF_BUS_DATA) {
175 (drvr->bus_if->state != BRCMF_BUS_DATA)) { 175 brcmf_err("xmit rejected state=%d\n", drvr->bus_if->state);
176 brcmf_err("xmit rejected drvup=%d state=%d\n",
177 drvr->bus_if->drvr_up,
178 drvr->bus_if->state);
179 netif_stop_queue(ndev); 176 netif_stop_queue(ndev);
180 return -ENODEV; 177 dev_kfree_skb(skb);
178 ret = -ENODEV;
179 goto done;
181 } 180 }
182 181
183 if (!drvr->iflist[ifp->idx]) { 182 if (!drvr->iflist[ifp->idx]) {
184 brcmf_err("bad ifidx %d\n", ifp->idx); 183 brcmf_err("bad ifidx %d\n", ifp->idx);
185 netif_stop_queue(ndev); 184 netif_stop_queue(ndev);
186 return -ENODEV; 185 dev_kfree_skb(skb);
186 ret = -ENODEV;
187 goto done;
187 } 188 }
188 189
189 /* Make sure there's enough room for any header */ 190 /* Make sure there's enough room for any header */
@@ -204,17 +205,20 @@ static int brcmf_netdev_start_xmit(struct sk_buff *skb, struct net_device *ndev)
204 } 205 }
205 } 206 }
206 207
207 /* Update multicast statistic */ 208 /* validate length for ether packet */
208 if (skb->len >= ETH_ALEN) { 209 if (skb->len < sizeof(*eh)) {
209 u8 *pktdata = (u8 *)(skb->data); 210 ret = -EINVAL;
210 struct ethhdr *eh = (struct ethhdr *)pktdata; 211 dev_kfree_skb(skb);
211 212 goto done;
212 if (is_multicast_ether_addr(eh->h_dest))
213 drvr->tx_multicast++;
214 if (ntohs(eh->h_proto) == ETH_P_PAE)
215 atomic_inc(&drvr->pend_8021x_cnt);
216 } 213 }
217 214
215 /* handle ethernet header */
216 eh = (struct ethhdr *)(skb->data);
217 if (is_multicast_ether_addr(eh->h_dest))
218 drvr->tx_multicast++;
219 if (ntohs(eh->h_proto) == ETH_P_PAE)
220 atomic_inc(&drvr->pend_8021x_cnt);
221
218 /* If the protocol uses a data header, apply it */ 222 /* If the protocol uses a data header, apply it */
219 brcmf_proto_hdrpush(drvr, ifp->idx, skb); 223 brcmf_proto_hdrpush(drvr, ifp->idx, skb);
220 224
@@ -228,7 +232,7 @@ done:
228 drvr->bus_if->dstats.tx_packets++; 232 drvr->bus_if->dstats.tx_packets++;
229 233
230 /* Return ok: we always eat the packet */ 234 /* Return ok: we always eat the packet */
231 return 0; 235 return NETDEV_TX_OK;
232} 236}
233 237
234void brcmf_txflowblock(struct device *dev, bool state) 238void brcmf_txflowblock(struct device *dev, bool state)
@@ -250,8 +254,7 @@ void brcmf_txflowblock(struct device *dev, bool state)
250 } 254 }
251} 255}
252 256
253void brcmf_rx_frame(struct device *dev, u8 ifidx, 257void brcmf_rx_frames(struct device *dev, struct sk_buff_head *skb_list)
254 struct sk_buff_head *skb_list)
255{ 258{
256 unsigned char *eth; 259 unsigned char *eth;
257 uint len; 260 uint len;
@@ -259,12 +262,24 @@ void brcmf_rx_frame(struct device *dev, u8 ifidx,
259 struct brcmf_if *ifp; 262 struct brcmf_if *ifp;
260 struct brcmf_bus *bus_if = dev_get_drvdata(dev); 263 struct brcmf_bus *bus_if = dev_get_drvdata(dev);
261 struct brcmf_pub *drvr = bus_if->drvr; 264 struct brcmf_pub *drvr = bus_if->drvr;
265 u8 ifidx;
266 int ret;
262 267
263 brcmf_dbg(TRACE, "Enter\n"); 268 brcmf_dbg(TRACE, "Enter\n");
264 269
265 skb_queue_walk_safe(skb_list, skb, pnext) { 270 skb_queue_walk_safe(skb_list, skb, pnext) {
266 skb_unlink(skb, skb_list); 271 skb_unlink(skb, skb_list);
267 272
273 /* process and remove protocol-specific header
274 */
275 ret = brcmf_proto_hdrpull(drvr, &ifidx, skb);
276 if (ret < 0) {
277 if (ret != -ENODATA)
278 bus_if->dstats.rx_errors++;
279 brcmu_pkt_buf_free_skb(skb);
280 continue;
281 }
282
268 /* Get the protocol, maintain skb around eth_type_trans() 283 /* Get the protocol, maintain skb around eth_type_trans()
269 * The main reason for this hack is for the limitation of 284 * The main reason for this hack is for the limitation of
270 * Linux 2.4 where 'eth_type_trans' uses the 285 * Linux 2.4 where 'eth_type_trans' uses the
@@ -328,13 +343,13 @@ void brcmf_rx_frame(struct device *dev, u8 ifidx,
328 343
329void brcmf_txcomplete(struct device *dev, struct sk_buff *txp, bool success) 344void brcmf_txcomplete(struct device *dev, struct sk_buff *txp, bool success)
330{ 345{
331 uint ifidx; 346 u8 ifidx;
332 struct ethhdr *eh; 347 struct ethhdr *eh;
333 u16 type; 348 u16 type;
334 struct brcmf_bus *bus_if = dev_get_drvdata(dev); 349 struct brcmf_bus *bus_if = dev_get_drvdata(dev);
335 struct brcmf_pub *drvr = bus_if->drvr; 350 struct brcmf_pub *drvr = bus_if->drvr;
336 351
337 brcmf_proto_hdrpull(dev, &ifidx, txp); 352 brcmf_proto_hdrpull(drvr, &ifidx, txp);
338 353
339 eh = (struct ethhdr *)(txp->data); 354 eh = (struct ethhdr *)(txp->data);
340 type = ntohs(eh->h_proto); 355 type = ntohs(eh->h_proto);
@@ -450,7 +465,7 @@ static int brcmf_ethtool(struct brcmf_if *ifp, void __user *uaddr)
450 sprintf(info.version, "%lu", drvr->drv_version); 465 sprintf(info.version, "%lu", drvr->drv_version);
451 if (copy_to_user(uaddr, &info, sizeof(info))) 466 if (copy_to_user(uaddr, &info, sizeof(info)))
452 return -EFAULT; 467 return -EFAULT;
453 brcmf_dbg(CTL, "given %*s, returning %s\n", 468 brcmf_dbg(TRACE, "given %*s, returning %s\n",
454 (int)sizeof(drvname), drvname, info.driver); 469 (int)sizeof(drvname), drvname, info.driver);
455 break; 470 break;
456 471
@@ -570,14 +585,9 @@ static int brcmf_netdev_open(struct net_device *ndev)
570 /* Get current TOE mode from dongle */ 585 /* Get current TOE mode from dongle */
571 if (brcmf_fil_iovar_int_get(ifp, "toe_ol", &toe_ol) >= 0 586 if (brcmf_fil_iovar_int_get(ifp, "toe_ol", &toe_ol) >= 0
572 && (toe_ol & TOE_TX_CSUM_OL) != 0) 587 && (toe_ol & TOE_TX_CSUM_OL) != 0)
573 drvr->iflist[ifp->idx]->ndev->features |= 588 ndev->features |= NETIF_F_IP_CSUM;
574 NETIF_F_IP_CSUM;
575 else 589 else
576 drvr->iflist[ifp->idx]->ndev->features &= 590 ndev->features &= ~NETIF_F_IP_CSUM;
577 ~NETIF_F_IP_CSUM;
578
579 /* make sure RF is ready for work */
580 brcmf_fil_cmd_int_set(ifp, BRCMF_C_UP, 0);
581 591
582 /* Allow transmit calls */ 592 /* Allow transmit calls */
583 netif_start_queue(ndev); 593 netif_start_queue(ndev);
@@ -845,6 +855,17 @@ static void brcmf_bus_detach(struct brcmf_pub *drvr)
845 } 855 }
846} 856}
847 857
858void brcmf_dev_reset(struct device *dev)
859{
860 struct brcmf_bus *bus_if = dev_get_drvdata(dev);
861 struct brcmf_pub *drvr = bus_if->drvr;
862
863 if (drvr == NULL)
864 return;
865
866 brcmf_fil_cmd_int_set(drvr->iflist[0], BRCMF_C_TERMINATED, 1);
867}
868
848void brcmf_detach(struct device *dev) 869void brcmf_detach(struct device *dev)
849{ 870{
850 int i; 871 int i;
@@ -866,9 +887,8 @@ void brcmf_detach(struct device *dev)
866 887
867 brcmf_bus_detach(drvr); 888 brcmf_bus_detach(drvr);
868 889
869 if (drvr->prot) { 890 if (drvr->prot)
870 brcmf_proto_detach(drvr); 891 brcmf_proto_detach(drvr);
871 }
872 892
873 brcmf_debugfs_detach(drvr); 893 brcmf_debugfs_detach(drvr);
874 bus_if->drvr = NULL; 894 bus_if->drvr = NULL;
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c b/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c
index cf857f1edf8c..7fef9b5ba003 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c
@@ -14,8 +14,6 @@
14 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 14 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15 */ 15 */
16 16
17#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
18
19#include <linux/types.h> 17#include <linux/types.h>
20#include <linux/kernel.h> 18#include <linux/kernel.h>
21#include <linux/kthread.h> 19#include <linux/kthread.h>
@@ -1169,7 +1167,6 @@ static u8 brcmf_sdbrcm_rxglom(struct brcmf_sdio *bus, u8 rxseq)
1169 int errcode; 1167 int errcode;
1170 u8 doff, sfdoff; 1168 u8 doff, sfdoff;
1171 1169
1172 int ifidx = 0;
1173 bool usechain = bus->use_rxchain; 1170 bool usechain = bus->use_rxchain;
1174 1171
1175 struct brcmf_sdio_read rd_new; 1172 struct brcmf_sdio_read rd_new;
@@ -1388,13 +1385,6 @@ static u8 brcmf_sdbrcm_rxglom(struct brcmf_sdio *bus, u8 rxseq)
1388 skb_unlink(pfirst, &bus->glom); 1385 skb_unlink(pfirst, &bus->glom);
1389 brcmu_pkt_buf_free_skb(pfirst); 1386 brcmu_pkt_buf_free_skb(pfirst);
1390 continue; 1387 continue;
1391 } else if (brcmf_proto_hdrpull(bus->sdiodev->dev,
1392 &ifidx, pfirst) != 0) {
1393 brcmf_err("rx protocol error\n");
1394 bus->sdiodev->bus_if->dstats.rx_errors++;
1395 skb_unlink(pfirst, &bus->glom);
1396 brcmu_pkt_buf_free_skb(pfirst);
1397 continue;
1398 } 1388 }
1399 1389
1400 brcmf_dbg_hex_dump(BRCMF_GLOM_ON(), 1390 brcmf_dbg_hex_dump(BRCMF_GLOM_ON(),
@@ -1407,7 +1397,7 @@ static u8 brcmf_sdbrcm_rxglom(struct brcmf_sdio *bus, u8 rxseq)
1407 } 1397 }
1408 /* sent any remaining packets up */ 1398 /* sent any remaining packets up */
1409 if (bus->glom.qlen) 1399 if (bus->glom.qlen)
1410 brcmf_rx_frame(bus->sdiodev->dev, ifidx, &bus->glom); 1400 brcmf_rx_frames(bus->sdiodev->dev, &bus->glom);
1411 1401
1412 bus->sdcnt.rxglomframes++; 1402 bus->sdcnt.rxglomframes++;
1413 bus->sdcnt.rxglompkts += bus->glom.qlen; 1403 bus->sdcnt.rxglompkts += bus->glom.qlen;
@@ -1558,10 +1548,10 @@ static void brcmf_pad(struct brcmf_sdio *bus, u16 *pad, u16 *rdlen)
1558static uint brcmf_sdio_readframes(struct brcmf_sdio *bus, uint maxframes) 1548static uint brcmf_sdio_readframes(struct brcmf_sdio *bus, uint maxframes)
1559{ 1549{
1560 struct sk_buff *pkt; /* Packet for event or data frames */ 1550 struct sk_buff *pkt; /* Packet for event or data frames */
1551 struct sk_buff_head pktlist; /* needed for bus interface */
1561 u16 pad; /* Number of pad bytes to read */ 1552 u16 pad; /* Number of pad bytes to read */
1562 uint rxleft = 0; /* Remaining number of frames allowed */ 1553 uint rxleft = 0; /* Remaining number of frames allowed */
1563 int sdret; /* Return code from calls */ 1554 int sdret; /* Return code from calls */
1564 int ifidx = 0;
1565 uint rxcount = 0; /* Total frames read */ 1555 uint rxcount = 0; /* Total frames read */
1566 struct brcmf_sdio_read *rd = &bus->cur_read, rd_new; 1556 struct brcmf_sdio_read *rd = &bus->cur_read, rd_new;
1567 u8 head_read = 0; 1557 u8 head_read = 0;
@@ -1760,15 +1750,11 @@ static uint brcmf_sdio_readframes(struct brcmf_sdio *bus, uint maxframes)
1760 if (pkt->len == 0) { 1750 if (pkt->len == 0) {
1761 brcmu_pkt_buf_free_skb(pkt); 1751 brcmu_pkt_buf_free_skb(pkt);
1762 continue; 1752 continue;
1763 } else if (brcmf_proto_hdrpull(bus->sdiodev->dev, &ifidx,
1764 pkt) != 0) {
1765 brcmf_err("rx protocol error\n");
1766 brcmu_pkt_buf_free_skb(pkt);
1767 bus->sdiodev->bus_if->dstats.rx_errors++;
1768 continue;
1769 } 1753 }
1770 1754
1771 brcmf_rx_packet(bus->sdiodev->dev, ifidx, pkt); 1755 skb_queue_head_init(&pktlist);
1756 skb_queue_tail(&pktlist, pkt);
1757 brcmf_rx_frames(bus->sdiodev->dev, &pktlist);
1772 } 1758 }
1773 1759
1774 rxcount = maxframes - rxleft; 1760 rxcount = maxframes - rxleft;
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/sdio_chip.c b/drivers/net/wireless/brcm80211/brcmfmac/sdio_chip.c
index b1bb46c49799..14be2d5530ce 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/sdio_chip.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/sdio_chip.c
@@ -15,8 +15,6 @@
15 */ 15 */
16/* ***** SDIO interface chip backplane handle functions ***** */ 16/* ***** SDIO interface chip backplane handle functions ***** */
17 17
18#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
19
20#include <linux/types.h> 18#include <linux/types.h>
21#include <linux/netdevice.h> 19#include <linux/netdevice.h>
22#include <linux/mmc/card.h> 20#include <linux/mmc/card.h>
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/usb.c b/drivers/net/wireless/brcm80211/brcmfmac/usb.c
index 914c56fe6c5f..e15630cc3889 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/usb.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/usb.c
@@ -443,14 +443,15 @@ static void brcmf_usb_rx_complete(struct urb *urb)
443 struct brcmf_usbreq *req = (struct brcmf_usbreq *)urb->context; 443 struct brcmf_usbreq *req = (struct brcmf_usbreq *)urb->context;
444 struct brcmf_usbdev_info *devinfo = req->devinfo; 444 struct brcmf_usbdev_info *devinfo = req->devinfo;
445 struct sk_buff *skb; 445 struct sk_buff *skb;
446 int ifidx = 0; 446 struct sk_buff_head skbq;
447 447
448 brcmf_dbg(USB, "Enter, urb->status=%d\n", urb->status); 448 brcmf_dbg(USB, "Enter, urb->status=%d\n", urb->status);
449 brcmf_usb_del_fromq(devinfo, req); 449 brcmf_usb_del_fromq(devinfo, req);
450 skb = req->skb; 450 skb = req->skb;
451 req->skb = NULL; 451 req->skb = NULL;
452 452
453 if (urb->status == 0) { 453 /* zero lenght packets indicate usb "failure". Do not refill */
454 if (urb->status == 0 && urb->actual_length) {
454 devinfo->bus_pub.bus->dstats.rx_packets++; 455 devinfo->bus_pub.bus->dstats.rx_packets++;
455 } else { 456 } else {
456 devinfo->bus_pub.bus->dstats.rx_errors++; 457 devinfo->bus_pub.bus->dstats.rx_errors++;
@@ -460,13 +461,10 @@ static void brcmf_usb_rx_complete(struct urb *urb)
460 } 461 }
461 462
462 if (devinfo->bus_pub.state == BRCMFMAC_USB_STATE_UP) { 463 if (devinfo->bus_pub.state == BRCMFMAC_USB_STATE_UP) {
464 skb_queue_head_init(&skbq);
465 skb_queue_tail(&skbq, skb);
463 skb_put(skb, urb->actual_length); 466 skb_put(skb, urb->actual_length);
464 if (brcmf_proto_hdrpull(devinfo->dev, &ifidx, skb) != 0) { 467 brcmf_rx_frames(devinfo->dev, &skbq);
465 brcmf_err("rx protocol error\n");
466 brcmu_pkt_buf_free_skb(skb);
467 devinfo->bus_pub.bus->dstats.rx_errors++;
468 } else
469 brcmf_rx_packet(devinfo->dev, ifidx, skb);
470 brcmf_usb_rx_refill(devinfo, req); 468 brcmf_usb_rx_refill(devinfo, req);
471 } else { 469 } else {
472 brcmu_pkt_buf_free_skb(skb); 470 brcmu_pkt_buf_free_skb(skb);
@@ -1520,10 +1518,23 @@ static void brcmf_release_fw(struct list_head *q)
1520 } 1518 }
1521} 1519}
1522 1520
1521static int brcmf_usb_reset_device(struct device *dev, void *notused)
1522{
1523 /* device past is the usb interface so we
1524 * need to use parent here.
1525 */
1526 brcmf_dev_reset(dev->parent);
1527 return 0;
1528}
1523 1529
1524void brcmf_usb_exit(void) 1530void brcmf_usb_exit(void)
1525{ 1531{
1532 struct device_driver *drv = &brcmf_usbdrvr.drvwrap.driver;
1533 int ret;
1534
1526 brcmf_dbg(USB, "Enter\n"); 1535 brcmf_dbg(USB, "Enter\n");
1536 ret = driver_for_each_device(drv, NULL, NULL,
1537 brcmf_usb_reset_device);
1527 usb_deregister(&brcmf_usbdrvr); 1538 usb_deregister(&brcmf_usbdrvr);
1528 brcmf_release_fw(&fw_image_list); 1539 brcmf_release_fw(&fw_image_list);
1529} 1540}
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c b/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c
index 1261a9b84e04..62a528e8b958 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c
@@ -16,8 +16,6 @@
16 16
17/* Toplevel file. Relies on dhd_linux.c to send commands to the dongle. */ 17/* Toplevel file. Relies on dhd_linux.c to send commands to the dongle. */
18 18
19#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
20
21#include <linux/kernel.h> 19#include <linux/kernel.h>
22#include <linux/etherdevice.h> 20#include <linux/etherdevice.h>
23#include <net/cfg80211.h> 21#include <net/cfg80211.h>
@@ -2011,67 +2009,6 @@ done:
2011 return err; 2009 return err;
2012} 2010}
2013 2011
2014static s32
2015brcmf_cfg80211_set_bitrate_mask(struct wiphy *wiphy, struct net_device *ndev,
2016 const u8 *addr,
2017 const struct cfg80211_bitrate_mask *mask)
2018{
2019 struct brcmf_if *ifp = netdev_priv(ndev);
2020 struct brcm_rateset_le rateset_le;
2021 s32 rate;
2022 s32 val;
2023 s32 err_bg;
2024 s32 err_a;
2025 u32 legacy;
2026 s32 err = 0;
2027
2028 brcmf_dbg(TRACE, "Enter\n");
2029 if (!check_vif_up(ifp->vif))
2030 return -EIO;
2031
2032 /* addr param is always NULL. ignore it */
2033 /* Get current rateset */
2034 err = brcmf_fil_cmd_data_get(ifp, BRCMF_C_GET_CURR_RATESET,
2035 &rateset_le, sizeof(rateset_le));
2036 if (err) {
2037 brcmf_err("could not get current rateset (%d)\n", err);
2038 goto done;
2039 }
2040
2041 legacy = ffs(mask->control[IEEE80211_BAND_2GHZ].legacy & 0xFFFF);
2042 if (!legacy)
2043 legacy = ffs(mask->control[IEEE80211_BAND_5GHZ].legacy &
2044 0xFFFF);
2045
2046 val = wl_g_rates[legacy - 1].bitrate * 100000;
2047
2048 if (val < le32_to_cpu(rateset_le.count))
2049 /* Select rate by rateset index */
2050 rate = rateset_le.rates[val] & 0x7f;
2051 else
2052 /* Specified rate in bps */
2053 rate = val / 500000;
2054
2055 brcmf_dbg(CONN, "rate %d mbps\n", rate / 2);
2056
2057 /*
2058 *
2059 * Set rate override,
2060 * Since the is a/b/g-blind, both a/bg_rate are enforced.
2061 */
2062 err_bg = brcmf_fil_iovar_int_set(ifp, "bg_rate", rate);
2063 err_a = brcmf_fil_iovar_int_set(ifp, "a_rate", rate);
2064 if (err_bg && err_a) {
2065 brcmf_err("could not set fixed rate (%d) (%d)\n", err_bg,
2066 err_a);
2067 err = err_bg | err_a;
2068 }
2069
2070done:
2071 brcmf_dbg(TRACE, "Exit\n");
2072 return err;
2073}
2074
2075static s32 brcmf_inform_single_bss(struct brcmf_cfg80211_info *cfg, 2012static s32 brcmf_inform_single_bss(struct brcmf_cfg80211_info *cfg,
2076 struct brcmf_bss_info_le *bi) 2013 struct brcmf_bss_info_le *bi)
2077{ 2014{
@@ -3091,10 +3028,11 @@ brcmf_configure_wpaie(struct net_device *ndev, struct brcmf_vs_tlv *wpa_ie,
3091 3028
3092 len = wpa_ie->len + TLV_HDR_LEN; 3029 len = wpa_ie->len + TLV_HDR_LEN;
3093 data = (u8 *)wpa_ie; 3030 data = (u8 *)wpa_ie;
3094 offset = 0; 3031 offset = TLV_HDR_LEN;
3095 if (!is_rsn_ie) 3032 if (!is_rsn_ie)
3096 offset += VS_IE_FIXED_HDR_LEN; 3033 offset += VS_IE_FIXED_HDR_LEN;
3097 offset += WPA_IE_VERSION_LEN; 3034 else
3035 offset += WPA_IE_VERSION_LEN;
3098 3036
3099 /* check for multicast cipher suite */ 3037 /* check for multicast cipher suite */
3100 if (offset + WPA_IE_MIN_OUI_LEN > len) { 3038 if (offset + WPA_IE_MIN_OUI_LEN > len) {
@@ -3703,7 +3641,6 @@ static struct cfg80211_ops wl_cfg80211_ops = {
3703 .set_default_key = brcmf_cfg80211_config_default_key, 3641 .set_default_key = brcmf_cfg80211_config_default_key,
3704 .set_default_mgmt_key = brcmf_cfg80211_config_default_mgmt_key, 3642 .set_default_mgmt_key = brcmf_cfg80211_config_default_mgmt_key,
3705 .set_power_mgmt = brcmf_cfg80211_set_power_mgmt, 3643 .set_power_mgmt = brcmf_cfg80211_set_power_mgmt,
3706 .set_bitrate_mask = brcmf_cfg80211_set_bitrate_mask,
3707 .connect = brcmf_cfg80211_connect, 3644 .connect = brcmf_cfg80211_connect,
3708 .disconnect = brcmf_cfg80211_disconnect, 3645 .disconnect = brcmf_cfg80211_disconnect,
3709 .suspend = brcmf_cfg80211_suspend, 3646 .suspend = brcmf_cfg80211_suspend,
@@ -4329,9 +4266,8 @@ void brcmf_cfg80211_detach(struct brcmf_cfg80211_info *cfg)
4329} 4266}
4330 4267
4331static s32 4268static s32
4332brcmf_dongle_roam(struct net_device *ndev, u32 roamvar, u32 bcn_timeout) 4269brcmf_dongle_roam(struct brcmf_if *ifp, u32 roamvar, u32 bcn_timeout)
4333{ 4270{
4334 struct brcmf_if *ifp = netdev_priv(ndev);
4335 s32 err = 0; 4271 s32 err = 0;
4336 __le32 roamtrigger[2]; 4272 __le32 roamtrigger[2];
4337 __le32 roam_delta[2]; 4273 __le32 roam_delta[2];
@@ -4382,10 +4318,9 @@ dongle_rom_out:
4382} 4318}
4383 4319
4384static s32 4320static s32
4385brcmf_dongle_scantime(struct net_device *ndev, s32 scan_assoc_time, 4321brcmf_dongle_scantime(struct brcmf_if *ifp, s32 scan_assoc_time,
4386 s32 scan_unassoc_time, s32 scan_passive_time) 4322 s32 scan_unassoc_time, s32 scan_passive_time)
4387{ 4323{
4388 struct brcmf_if *ifp = netdev_priv(ndev);
4389 s32 err = 0; 4324 s32 err = 0;
4390 4325
4391 err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_SCAN_CHANNEL_TIME, 4326 err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_SCAN_CHANNEL_TIME,
@@ -4455,6 +4390,7 @@ static s32 brcmf_config_dongle(struct brcmf_cfg80211_info *cfg)
4455{ 4390{
4456 struct net_device *ndev; 4391 struct net_device *ndev;
4457 struct wireless_dev *wdev; 4392 struct wireless_dev *wdev;
4393 struct brcmf_if *ifp;
4458 s32 power_mode; 4394 s32 power_mode;
4459 s32 err = 0; 4395 s32 err = 0;
4460 4396
@@ -4463,35 +4399,34 @@ static s32 brcmf_config_dongle(struct brcmf_cfg80211_info *cfg)
4463 4399
4464 ndev = cfg_to_ndev(cfg); 4400 ndev = cfg_to_ndev(cfg);
4465 wdev = ndev->ieee80211_ptr; 4401 wdev = ndev->ieee80211_ptr;
4402 ifp = netdev_priv(ndev);
4466 4403
4467 brcmf_dongle_scantime(ndev, WL_SCAN_CHANNEL_TIME, 4404 /* make sure RF is ready for work */
4468 WL_SCAN_UNASSOC_TIME, WL_SCAN_PASSIVE_TIME); 4405 brcmf_fil_cmd_int_set(ifp, BRCMF_C_UP, 0);
4406
4407 brcmf_dongle_scantime(ifp, WL_SCAN_CHANNEL_TIME,
4408 WL_SCAN_UNASSOC_TIME, WL_SCAN_PASSIVE_TIME);
4469 4409
4470 power_mode = cfg->pwr_save ? PM_FAST : PM_OFF; 4410 power_mode = cfg->pwr_save ? PM_FAST : PM_OFF;
4471 err = brcmf_fil_cmd_int_set(netdev_priv(ndev), BRCMF_C_SET_PM, 4411 err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_PM, power_mode);
4472 power_mode);
4473 if (err) 4412 if (err)
4474 goto default_conf_out; 4413 goto default_conf_out;
4475 brcmf_dbg(INFO, "power save set to %s\n", 4414 brcmf_dbg(INFO, "power save set to %s\n",
4476 (power_mode ? "enabled" : "disabled")); 4415 (power_mode ? "enabled" : "disabled"));
4477 4416
4478 err = brcmf_dongle_roam(ndev, (cfg->roam_on ? 0 : 1), 4417 err = brcmf_dongle_roam(ifp, (cfg->roam_on ? 0 : 1), WL_BEACON_TIMEOUT);
4479 WL_BEACON_TIMEOUT);
4480 if (err) 4418 if (err)
4481 goto default_conf_out; 4419 goto default_conf_out;
4482 err = brcmf_cfg80211_change_iface(wdev->wiphy, ndev, wdev->iftype, 4420 err = brcmf_cfg80211_change_iface(wdev->wiphy, ndev, wdev->iftype,
4483 NULL, NULL); 4421 NULL, NULL);
4484 if (err && err != -EINPROGRESS) 4422 if (err)
4485 goto default_conf_out; 4423 goto default_conf_out;
4486 err = brcmf_dongle_probecap(cfg); 4424 err = brcmf_dongle_probecap(cfg);
4487 if (err) 4425 if (err)
4488 goto default_conf_out; 4426 goto default_conf_out;
4489 4427
4490 /* -EINPROGRESS: Call commit handler */
4491
4492default_conf_out:
4493
4494 cfg->dongle_up = true; 4428 cfg->dongle_up = true;
4429default_conf_out:
4495 4430
4496 return err; 4431 return err;
4497 4432
@@ -4500,8 +4435,6 @@ default_conf_out:
4500static s32 __brcmf_cfg80211_up(struct brcmf_if *ifp) 4435static s32 __brcmf_cfg80211_up(struct brcmf_if *ifp)
4501{ 4436{
4502 set_bit(BRCMF_VIF_STATUS_READY, &ifp->vif->sme_state); 4437 set_bit(BRCMF_VIF_STATUS_READY, &ifp->vif->sme_state);
4503 if (ifp->idx)
4504 return 0;
4505 4438
4506 return brcmf_config_dongle(ifp->drvr->config); 4439 return brcmf_config_dongle(ifp->drvr->config);
4507} 4440}
diff --git a/drivers/net/wireless/brcm80211/brcmsmac/ampdu.c b/drivers/net/wireless/brcm80211/brcmsmac/ampdu.c
index 1de94f30564f..1585cc5bf866 100644
--- a/drivers/net/wireless/brcm80211/brcmsmac/ampdu.c
+++ b/drivers/net/wireless/brcm80211/brcmsmac/ampdu.c
@@ -961,7 +961,6 @@ brcms_c_ampdu_dotxstatus_complete(struct ampdu_info *ampdu, struct scb *scb,
961 /* if acked then clear bit and free packet */ 961 /* if acked then clear bit and free packet */
962 if ((bindex < AMPDU_TX_BA_MAX_WSIZE) 962 if ((bindex < AMPDU_TX_BA_MAX_WSIZE)
963 && isset(bitmap, bindex)) { 963 && isset(bitmap, bindex)) {
964 ini->tx_in_transit--;
965 ini->txretry[index] = 0; 964 ini->txretry[index] = 0;
966 965
967 /* 966 /*
@@ -990,7 +989,6 @@ brcms_c_ampdu_dotxstatus_complete(struct ampdu_info *ampdu, struct scb *scb,
990 if (retry && (ini->txretry[index] < (int)retry_limit)) { 989 if (retry && (ini->txretry[index] < (int)retry_limit)) {
991 int ret; 990 int ret;
992 ini->txretry[index]++; 991 ini->txretry[index]++;
993 ini->tx_in_transit--;
994 ret = brcms_c_txfifo(wlc, queue, p); 992 ret = brcms_c_txfifo(wlc, queue, p);
995 /* 993 /*
996 * We shouldn't be out of space in the DMA 994 * We shouldn't be out of space in the DMA
@@ -1000,7 +998,6 @@ brcms_c_ampdu_dotxstatus_complete(struct ampdu_info *ampdu, struct scb *scb,
1000 WARN_ONCE(ret, "queue %d out of txds\n", queue); 998 WARN_ONCE(ret, "queue %d out of txds\n", queue);
1001 } else { 999 } else {
1002 /* Retry timeout */ 1000 /* Retry timeout */
1003 ini->tx_in_transit--;
1004 ieee80211_tx_info_clear_status(tx_info); 1001 ieee80211_tx_info_clear_status(tx_info);
1005 tx_info->status.ampdu_ack_len = 0; 1002 tx_info->status.ampdu_ack_len = 0;
1006 tx_info->status.ampdu_len = 1; 1003 tx_info->status.ampdu_len = 1;
@@ -1009,8 +1006,8 @@ brcms_c_ampdu_dotxstatus_complete(struct ampdu_info *ampdu, struct scb *scb,
1009 skb_pull(p, D11_PHY_HDR_LEN); 1006 skb_pull(p, D11_PHY_HDR_LEN);
1010 skb_pull(p, D11_TXH_LEN); 1007 skb_pull(p, D11_TXH_LEN);
1011 brcms_dbg_ht(wlc->hw->d11core, 1008 brcms_dbg_ht(wlc->hw->d11core,
1012 "BA Timeout, seq %d, in_transit %d\n", 1009 "BA Timeout, seq %d\n",
1013 seq, ini->tx_in_transit); 1010 seq);
1014 ieee80211_tx_status_irqsafe(wlc->pub->ieee_hw, 1011 ieee80211_tx_status_irqsafe(wlc->pub->ieee_hw,
1015 p); 1012 p);
1016 } 1013 }
diff --git a/drivers/net/wireless/brcm80211/brcmsmac/channel.c b/drivers/net/wireless/brcm80211/brcmsmac/channel.c
index a90b72202ec5..cdb62b8ccc79 100644
--- a/drivers/net/wireless/brcm80211/brcmsmac/channel.c
+++ b/drivers/net/wireless/brcm80211/brcmsmac/channel.c
@@ -670,7 +670,7 @@ brcms_reg_apply_beaconing_flags(struct wiphy *wiphy,
670 struct ieee80211_supported_band *sband; 670 struct ieee80211_supported_band *sband;
671 struct ieee80211_channel *ch; 671 struct ieee80211_channel *ch;
672 const struct ieee80211_reg_rule *rule; 672 const struct ieee80211_reg_rule *rule;
673 int band, i, ret; 673 int band, i;
674 674
675 for (band = 0; band < IEEE80211_NUM_BANDS; band++) { 675 for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
676 sband = wiphy->bands[band]; 676 sband = wiphy->bands[band];
@@ -685,9 +685,8 @@ brcms_reg_apply_beaconing_flags(struct wiphy *wiphy,
685 continue; 685 continue;
686 686
687 if (initiator == NL80211_REGDOM_SET_BY_COUNTRY_IE) { 687 if (initiator == NL80211_REGDOM_SET_BY_COUNTRY_IE) {
688 ret = freq_reg_info(wiphy, ch->center_freq, 688 rule = freq_reg_info(wiphy, ch->center_freq);
689 0, &rule); 689 if (IS_ERR(rule))
690 if (ret)
691 continue; 690 continue;
692 691
693 if (!(rule->flags & NL80211_RRF_NO_IBSS)) 692 if (!(rule->flags & NL80211_RRF_NO_IBSS))
@@ -703,8 +702,8 @@ brcms_reg_apply_beaconing_flags(struct wiphy *wiphy,
703 } 702 }
704} 703}
705 704
706static int brcms_reg_notifier(struct wiphy *wiphy, 705static void brcms_reg_notifier(struct wiphy *wiphy,
707 struct regulatory_request *request) 706 struct regulatory_request *request)
708{ 707{
709 struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy); 708 struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
710 struct brcms_info *wl = hw->priv; 709 struct brcms_info *wl = hw->priv;
@@ -745,8 +744,6 @@ static int brcms_reg_notifier(struct wiphy *wiphy,
745 if (wlc->pub->_nbands > 1 || wlc->band->bandtype == BRCM_BAND_2G) 744 if (wlc->pub->_nbands > 1 || wlc->band->bandtype == BRCM_BAND_2G)
746 wlc_phy_chanspec_ch14_widefilter_set(wlc->band->pi, 745 wlc_phy_chanspec_ch14_widefilter_set(wlc->band->pi,
747 brcms_c_japan_ccode(request->alpha2)); 746 brcms_c_japan_ccode(request->alpha2));
748
749 return 0;
750} 747}
751 748
752void brcms_c_regd_init(struct brcms_c_info *wlc) 749void brcms_c_regd_init(struct brcms_c_info *wlc)
diff --git a/drivers/net/wireless/brcm80211/brcmsmac/debug.h b/drivers/net/wireless/brcm80211/brcmsmac/debug.h
index 796836b0f469..822781cf15d4 100644
--- a/drivers/net/wireless/brcm80211/brcmsmac/debug.h
+++ b/drivers/net/wireless/brcm80211/brcmsmac/debug.h
@@ -1,5 +1,6 @@
1/* 1/*
2 * Copyright (c) 2012 Broadcom Corporation 2 * Copyright (c) 2012 Broadcom Corporation
3 * Copyright (c) 2012 Canonical Ltd.
3 * 4 *
4 * Permission to use, copy, modify, and/or distribute this software for any 5 * Permission to use, copy, modify, and/or distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above 6 * purpose with or without fee is hereby granted, provided that the above
diff --git a/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c b/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
index 1fbd8ecbe2ea..b1dd5600fd02 100644
--- a/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
+++ b/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
@@ -362,8 +362,11 @@ brcms_ops_add_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
362 return -EOPNOTSUPP; 362 return -EOPNOTSUPP;
363 } 363 }
364 364
365 spin_lock_bh(&wl->lock);
366 memcpy(wl->pub->cur_etheraddr, vif->addr, sizeof(vif->addr));
365 wl->mute_tx = false; 367 wl->mute_tx = false;
366 brcms_c_mute(wl->wlc, false); 368 brcms_c_mute(wl->wlc, false);
369 spin_unlock_bh(&wl->lock);
367 370
368 return 0; 371 return 0;
369} 372}
@@ -539,9 +542,8 @@ brcms_ops_bss_info_changed(struct ieee80211_hw *hw,
539 542
540 if (changed & BSS_CHANGED_ARP_FILTER) { 543 if (changed & BSS_CHANGED_ARP_FILTER) {
541 /* Hardware ARP filter address list or state changed */ 544 /* Hardware ARP filter address list or state changed */
542 brcms_err(core, "%s: arp filtering: enabled %s, count %d" 545 brcms_err(core, "%s: arp filtering: %d addresses"
543 " (implement)\n", __func__, info->arp_filter_enabled ? 546 " (implement)\n", __func__, info->arp_addr_cnt);
544 "true" : "false", info->arp_addr_cnt);
545 } 547 }
546 548
547 if (changed & BSS_CHANGED_QOS) { 549 if (changed & BSS_CHANGED_QOS) {
@@ -668,7 +670,9 @@ brcms_ops_ampdu_action(struct ieee80211_hw *hw,
668 ieee80211_start_tx_ba_cb_irqsafe(vif, sta->addr, tid); 670 ieee80211_start_tx_ba_cb_irqsafe(vif, sta->addr, tid);
669 break; 671 break;
670 672
671 case IEEE80211_AMPDU_TX_STOP: 673 case IEEE80211_AMPDU_TX_STOP_CONT:
674 case IEEE80211_AMPDU_TX_STOP_FLUSH:
675 case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT:
672 spin_lock_bh(&wl->lock); 676 spin_lock_bh(&wl->lock);
673 brcms_c_ampdu_flush(wl->wlc, sta, tid); 677 brcms_c_ampdu_flush(wl->wlc, sta, tid);
674 spin_unlock_bh(&wl->lock); 678 spin_unlock_bh(&wl->lock);
@@ -1407,9 +1411,10 @@ void brcms_add_timer(struct brcms_timer *t, uint ms, int periodic)
1407#endif 1411#endif
1408 t->ms = ms; 1412 t->ms = ms;
1409 t->periodic = (bool) periodic; 1413 t->periodic = (bool) periodic;
1410 t->set = true; 1414 if (!t->set) {
1411 1415 t->set = true;
1412 atomic_inc(&t->wl->callbacks); 1416 atomic_inc(&t->wl->callbacks);
1417 }
1413 1418
1414 ieee80211_queue_delayed_work(hw, &t->dly_wrk, msecs_to_jiffies(ms)); 1419 ieee80211_queue_delayed_work(hw, &t->dly_wrk, msecs_to_jiffies(ms));
1415} 1420}
diff --git a/drivers/net/wireless/brcm80211/brcmsmac/main.c b/drivers/net/wireless/brcm80211/brcmsmac/main.c
index 17594de4199e..c26992a60e6c 100644
--- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
+++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
@@ -2473,6 +2473,7 @@ static void brcms_b_tx_fifo_resume(struct brcms_hardware *wlc_hw,
2473static void brcms_b_mute(struct brcms_hardware *wlc_hw, bool mute_tx) 2473static void brcms_b_mute(struct brcms_hardware *wlc_hw, bool mute_tx)
2474{ 2474{
2475 static const u8 null_ether_addr[ETH_ALEN] = {0, 0, 0, 0, 0, 0}; 2475 static const u8 null_ether_addr[ETH_ALEN] = {0, 0, 0, 0, 0, 0};
2476 u8 *ethaddr = wlc_hw->wlc->pub->cur_etheraddr;
2476 2477
2477 if (mute_tx) { 2478 if (mute_tx) {
2478 /* suspend tx fifos */ 2479 /* suspend tx fifos */
@@ -2482,8 +2483,7 @@ static void brcms_b_mute(struct brcms_hardware *wlc_hw, bool mute_tx)
2482 brcms_b_tx_fifo_suspend(wlc_hw, TX_AC_VI_FIFO); 2483 brcms_b_tx_fifo_suspend(wlc_hw, TX_AC_VI_FIFO);
2483 2484
2484 /* zero the address match register so we do not send ACKs */ 2485 /* zero the address match register so we do not send ACKs */
2485 brcms_b_set_addrmatch(wlc_hw, RCM_MAC_OFFSET, 2486 brcms_b_set_addrmatch(wlc_hw, RCM_MAC_OFFSET, null_ether_addr);
2486 null_ether_addr);
2487 } else { 2487 } else {
2488 /* resume tx fifos */ 2488 /* resume tx fifos */
2489 brcms_b_tx_fifo_resume(wlc_hw, TX_DATA_FIFO); 2489 brcms_b_tx_fifo_resume(wlc_hw, TX_DATA_FIFO);
@@ -2492,8 +2492,7 @@ static void brcms_b_mute(struct brcms_hardware *wlc_hw, bool mute_tx)
2492 brcms_b_tx_fifo_resume(wlc_hw, TX_AC_VI_FIFO); 2492 brcms_b_tx_fifo_resume(wlc_hw, TX_AC_VI_FIFO);
2493 2493
2494 /* Restore address */ 2494 /* Restore address */
2495 brcms_b_set_addrmatch(wlc_hw, RCM_MAC_OFFSET, 2495 brcms_b_set_addrmatch(wlc_hw, RCM_MAC_OFFSET, ethaddr);
2496 wlc_hw->etheraddr);
2497 } 2496 }
2498 2497
2499 wlc_phy_mute_upd(wlc_hw->band->pi, mute_tx, 0); 2498 wlc_phy_mute_upd(wlc_hw->band->pi, mute_tx, 0);
@@ -7633,7 +7632,7 @@ brcms_b_recv(struct brcms_hardware *wlc_hw, uint fifo, bool bound)
7633 7632
7634 uint n = 0; 7633 uint n = 0;
7635 uint bound_limit = bound ? RXBND : -1; 7634 uint bound_limit = bound ? RXBND : -1;
7636 bool morepending; 7635 bool morepending = false;
7637 7636
7638 skb_queue_head_init(&recv_frames); 7637 skb_queue_head_init(&recv_frames);
7639 7638
diff --git a/drivers/net/wireless/brcm80211/brcmsmac/phy/phy_lcn.c b/drivers/net/wireless/brcm80211/brcmsmac/phy/phy_lcn.c
index 606b534347bc..21a824232478 100644
--- a/drivers/net/wireless/brcm80211/brcmsmac/phy/phy_lcn.c
+++ b/drivers/net/wireless/brcm80211/brcmsmac/phy/phy_lcn.c
@@ -1343,13 +1343,13 @@ static bool wlc_lcnphy_rx_iq_cal_gain(struct brcms_phy *pi, u16 biq1_gain,
1343 1343
1344 wlc_lcnphy_rx_gain_override_enable(pi, true); 1344 wlc_lcnphy_rx_gain_override_enable(pi, true);
1345 wlc_lcnphy_start_tx_tone(pi, 2000, (40 >> 1), 0); 1345 wlc_lcnphy_start_tx_tone(pi, 2000, (40 >> 1), 0);
1346 usleep_range(500, 500); 1346 udelay(500);
1347 write_radio_reg(pi, RADIO_2064_REG112, 0); 1347 write_radio_reg(pi, RADIO_2064_REG112, 0);
1348 if (!wlc_lcnphy_rx_iq_est(pi, 1024, 32, &iq_est_l)) 1348 if (!wlc_lcnphy_rx_iq_est(pi, 1024, 32, &iq_est_l))
1349 return false; 1349 return false;
1350 1350
1351 wlc_lcnphy_start_tx_tone(pi, 2000, 40, 0); 1351 wlc_lcnphy_start_tx_tone(pi, 2000, 40, 0);
1352 usleep_range(500, 500); 1352 udelay(500);
1353 write_radio_reg(pi, RADIO_2064_REG112, 0); 1353 write_radio_reg(pi, RADIO_2064_REG112, 0);
1354 if (!wlc_lcnphy_rx_iq_est(pi, 1024, 32, &iq_est_h)) 1354 if (!wlc_lcnphy_rx_iq_est(pi, 1024, 32, &iq_est_h))
1355 return false; 1355 return false;
diff --git a/drivers/net/wireless/brcm80211/brcmsmac/scb.h b/drivers/net/wireless/brcm80211/brcmsmac/scb.h
index 51c79c7239b7..3a3d73699f83 100644
--- a/drivers/net/wireless/brcm80211/brcmsmac/scb.h
+++ b/drivers/net/wireless/brcm80211/brcmsmac/scb.h
@@ -36,7 +36,6 @@
36 36
37/* structure to store per-tid state for the ampdu initiator */ 37/* structure to store per-tid state for the ampdu initiator */
38struct scb_ampdu_tid_ini { 38struct scb_ampdu_tid_ini {
39 u8 tx_in_transit; /* number of pending mpdus in transit in driver */
40 u8 tid; /* initiator tid for easy lookup */ 39 u8 tid; /* initiator tid for easy lookup */
41 /* tx retry count; indexed by seq modulo */ 40 /* tx retry count; indexed by seq modulo */
42 u8 txretry[AMPDU_TX_BA_MAX_WSIZE]; 41 u8 txretry[AMPDU_TX_BA_MAX_WSIZE];