diff options
Diffstat (limited to 'drivers/net/wireless/brcm80211')
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 | ||
522 | struct bcmevent_name { | ||
523 | uint event; | ||
524 | const char *name; | ||
525 | }; | ||
526 | |||
527 | struct brcmf_if_event { | 501 | struct 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 | ||
560 | static inline s32 brcmf_ndev_bssidx(struct net_device *ndev) | ||
561 | { | ||
562 | struct brcmf_if *ifp = netdev_priv(ndev); | ||
563 | return ifp->bssidx; | ||
564 | } | ||
565 | |||
566 | extern const struct bcmevent_name bcmevent_names[]; | ||
567 | 534 | ||
568 | extern int brcmf_netdev_wait_pend8021x(struct net_device *ndev); | 535 | extern 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, | |||
576 | extern int brcmf_proto_cdc_set_dcmd(struct brcmf_pub *drvr, int ifidx, uint cmd, | 543 | extern 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. */ | ||
547 | extern int brcmf_proto_hdrpull(struct brcmf_pub *drvr, u8 *ifidx, | ||
548 | struct sk_buff *rxp); | ||
549 | |||
579 | extern int brcmf_net_attach(struct brcmf_if *ifp); | 550 | extern int brcmf_net_attach(struct brcmf_if *ifp); |
580 | extern struct brcmf_if *brcmf_add_if(struct brcmf_pub *drvr, int ifidx, | 551 | extern 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. */ | ||
134 | extern int brcmf_proto_hdrpull(struct device *dev, int *ifidx, | ||
135 | struct sk_buff *rxp); | ||
136 | |||
137 | extern bool brcmf_c_prec_enq(struct device *dev, struct pktq *q, | 133 | extern 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. */ |
141 | extern void brcmf_rx_frame(struct device *dev, u8 ifidx, | 137 | extern void brcmf_rx_frames(struct device *dev, struct sk_buff_head *rxlist); |
142 | struct sk_buff_head *rxlist); | ||
143 | static 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. */ |
154 | extern int brcmf_attach(uint bus_hdrlen, struct device *dev); | 140 | extern 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 */ |
156 | extern void brcmf_detach(struct device *dev); | 142 | extern void brcmf_detach(struct device *dev); |
157 | 143 | /* Indication from bus module that dongle should be reset */ | |
144 | extern 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 */ |
159 | extern void brcmf_txflowblock(struct device *dev, bool state); | 146 | extern 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 | ||
95 | struct brcmf_proto { | 93 | struct 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 | ||
219 | done: | 199 | done: |
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 | ||
271 | done: | 247 | done: |
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 | ||
308 | int brcmf_proto_hdrpull(struct device *dev, int *ifidx, | 284 | int 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 | ||
165 | static int brcmf_netdev_start_xmit(struct sk_buff *skb, struct net_device *ndev) | 163 | static 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 | ||
234 | void brcmf_txflowblock(struct device *dev, bool state) | 238 | void 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 | ||
253 | void brcmf_rx_frame(struct device *dev, u8 ifidx, | 257 | void 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 | ||
329 | void brcmf_txcomplete(struct device *dev, struct sk_buff *txp, bool success) | 344 | void 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 | ||
858 | void 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 | |||
848 | void brcmf_detach(struct device *dev) | 869 | void 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) | |||
1558 | static uint brcmf_sdio_readframes(struct brcmf_sdio *bus, uint maxframes) | 1548 | static 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 | ||
1521 | static 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 | ||
1524 | void brcmf_usb_exit(void) | 1530 | void 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 | ||
2014 | static s32 | ||
2015 | brcmf_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 | |||
2070 | done: | ||
2071 | brcmf_dbg(TRACE, "Exit\n"); | ||
2072 | return err; | ||
2073 | } | ||
2074 | |||
2075 | static s32 brcmf_inform_single_bss(struct brcmf_cfg80211_info *cfg, | 2012 | static 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 | ||
4331 | static s32 | 4268 | static s32 |
4332 | brcmf_dongle_roam(struct net_device *ndev, u32 roamvar, u32 bcn_timeout) | 4269 | brcmf_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 | ||
4384 | static s32 | 4320 | static s32 |
4385 | brcmf_dongle_scantime(struct net_device *ndev, s32 scan_assoc_time, | 4321 | brcmf_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 | |||
4492 | default_conf_out: | ||
4493 | |||
4494 | cfg->dongle_up = true; | 4428 | cfg->dongle_up = true; |
4429 | default_conf_out: | ||
4495 | 4430 | ||
4496 | return err; | 4431 | return err; |
4497 | 4432 | ||
@@ -4500,8 +4435,6 @@ default_conf_out: | |||
4500 | static s32 __brcmf_cfg80211_up(struct brcmf_if *ifp) | 4435 | static 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 | ||
706 | static int brcms_reg_notifier(struct wiphy *wiphy, | 705 | static 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 | ||
752 | void brcms_c_regd_init(struct brcms_c_info *wlc) | 749 | void 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, | |||
2473 | static void brcms_b_mute(struct brcms_hardware *wlc_hw, bool mute_tx) | 2473 | static 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 */ |
38 | struct scb_ampdu_tid_ini { | 38 | struct 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]; |