GNU Linux-libre 4.19.263-gnu1
[releases.git] / drivers / net / wireless / broadcom / brcm80211 / brcmfmac / core.c
1 /*
2  * Copyright (c) 2010 Broadcom Corporation
3  *
4  * 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  * copyright notice and this permission notice appear in all copies.
7  *
8  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
11  * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
13  * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
14  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15  */
16
17 #include <linux/kernel.h>
18 #include <linux/etherdevice.h>
19 #include <linux/module.h>
20 #include <linux/inetdevice.h>
21 #include <net/cfg80211.h>
22 #include <net/rtnetlink.h>
23 #include <net/addrconf.h>
24 #include <net/ieee80211_radiotap.h>
25 #include <net/ipv6.h>
26 #include <brcmu_utils.h>
27 #include <brcmu_wifi.h>
28
29 #include "core.h"
30 #include "bus.h"
31 #include "debug.h"
32 #include "fwil_types.h"
33 #include "p2p.h"
34 #include "pno.h"
35 #include "cfg80211.h"
36 #include "fwil.h"
37 #include "feature.h"
38 #include "proto.h"
39 #include "pcie.h"
40 #include "common.h"
41
42 #define MAX_WAIT_FOR_8021X_TX                   msecs_to_jiffies(950)
43
44 #define BRCMF_BSSIDX_INVALID                    -1
45
46 char *brcmf_ifname(struct brcmf_if *ifp)
47 {
48         if (!ifp)
49                 return "<if_null>";
50
51         if (ifp->ndev)
52                 return ifp->ndev->name;
53
54         return "<if_none>";
55 }
56
57 struct brcmf_if *brcmf_get_ifp(struct brcmf_pub *drvr, int ifidx)
58 {
59         struct brcmf_if *ifp;
60         s32 bsscfgidx;
61
62         if (ifidx < 0 || ifidx >= BRCMF_MAX_IFS) {
63                 brcmf_err("ifidx %d out of range\n", ifidx);
64                 return NULL;
65         }
66
67         ifp = NULL;
68         bsscfgidx = drvr->if2bss[ifidx];
69         if (bsscfgidx >= 0)
70                 ifp = drvr->iflist[bsscfgidx];
71
72         return ifp;
73 }
74
75 void brcmf_configure_arp_nd_offload(struct brcmf_if *ifp, bool enable)
76 {
77         s32 err;
78         u32 mode;
79
80         if (enable)
81                 mode = BRCMF_ARP_OL_AGENT | BRCMF_ARP_OL_PEER_AUTO_REPLY;
82         else
83                 mode = 0;
84
85         /* Try to set and enable ARP offload feature, this may fail, then it  */
86         /* is simply not supported and err 0 will be returned                 */
87         err = brcmf_fil_iovar_int_set(ifp, "arp_ol", mode);
88         if (err) {
89                 brcmf_dbg(TRACE, "failed to set ARP offload mode to 0x%x, err = %d\n",
90                           mode, err);
91         } else {
92                 err = brcmf_fil_iovar_int_set(ifp, "arpoe", enable);
93                 if (err) {
94                         brcmf_dbg(TRACE, "failed to configure (%d) ARP offload err = %d\n",
95                                   enable, err);
96                 } else {
97                         brcmf_dbg(TRACE, "successfully configured (%d) ARP offload to 0x%x\n",
98                                   enable, mode);
99                 }
100         }
101
102         err = brcmf_fil_iovar_int_set(ifp, "ndoe", enable);
103         if (err) {
104                 brcmf_dbg(TRACE, "failed to configure (%d) ND offload err = %d\n",
105                           enable, err);
106         } else {
107                 brcmf_dbg(TRACE, "successfully configured (%d) ND offload to 0x%x\n",
108                           enable, mode);
109         }
110 }
111
112 static void _brcmf_set_multicast_list(struct work_struct *work)
113 {
114         struct brcmf_if *ifp;
115         struct net_device *ndev;
116         struct netdev_hw_addr *ha;
117         u32 cmd_value, cnt;
118         __le32 cnt_le;
119         char *buf, *bufp;
120         u32 buflen;
121         s32 err;
122
123         ifp = container_of(work, struct brcmf_if, multicast_work);
124
125         brcmf_dbg(TRACE, "Enter, bsscfgidx=%d\n", ifp->bsscfgidx);
126
127         ndev = ifp->ndev;
128
129         /* Determine initial value of allmulti flag */
130         cmd_value = (ndev->flags & IFF_ALLMULTI) ? true : false;
131
132         /* Send down the multicast list first. */
133         cnt = netdev_mc_count(ndev);
134         buflen = sizeof(cnt) + (cnt * ETH_ALEN);
135         buf = kmalloc(buflen, GFP_ATOMIC);
136         if (!buf)
137                 return;
138         bufp = buf;
139
140         cnt_le = cpu_to_le32(cnt);
141         memcpy(bufp, &cnt_le, sizeof(cnt_le));
142         bufp += sizeof(cnt_le);
143
144         netdev_for_each_mc_addr(ha, ndev) {
145                 if (!cnt)
146                         break;
147                 memcpy(bufp, ha->addr, ETH_ALEN);
148                 bufp += ETH_ALEN;
149                 cnt--;
150         }
151
152         err = brcmf_fil_iovar_data_set(ifp, "mcast_list", buf, buflen);
153         if (err < 0) {
154                 brcmf_err("Setting mcast_list failed, %d\n", err);
155                 cmd_value = cnt ? true : cmd_value;
156         }
157
158         kfree(buf);
159
160         /*
161          * Now send the allmulti setting.  This is based on the setting in the
162          * net_device flags, but might be modified above to be turned on if we
163          * were trying to set some addresses and dongle rejected it...
164          */
165         err = brcmf_fil_iovar_int_set(ifp, "allmulti", cmd_value);
166         if (err < 0)
167                 brcmf_err("Setting allmulti failed, %d\n", err);
168
169         /*Finally, pick up the PROMISC flag */
170         cmd_value = (ndev->flags & IFF_PROMISC) ? true : false;
171         err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_PROMISC, cmd_value);
172         if (err < 0)
173                 brcmf_err("Setting BRCMF_C_SET_PROMISC failed, %d\n",
174                           err);
175         brcmf_configure_arp_nd_offload(ifp, !cmd_value);
176 }
177
178 #if IS_ENABLED(CONFIG_IPV6)
179 static void _brcmf_update_ndtable(struct work_struct *work)
180 {
181         struct brcmf_if *ifp;
182         int i, ret;
183
184         ifp = container_of(work, struct brcmf_if, ndoffload_work);
185
186         /* clear the table in firmware */
187         ret = brcmf_fil_iovar_data_set(ifp, "nd_hostip_clear", NULL, 0);
188         if (ret) {
189                 brcmf_dbg(TRACE, "fail to clear nd ip table err:%d\n", ret);
190                 return;
191         }
192
193         for (i = 0; i < ifp->ipv6addr_idx; i++) {
194                 ret = brcmf_fil_iovar_data_set(ifp, "nd_hostip",
195                                                &ifp->ipv6_addr_tbl[i],
196                                                sizeof(struct in6_addr));
197                 if (ret)
198                         brcmf_err("add nd ip err %d\n", ret);
199         }
200 }
201 #else
202 static void _brcmf_update_ndtable(struct work_struct *work)
203 {
204 }
205 #endif
206
207 static int brcmf_netdev_set_mac_address(struct net_device *ndev, void *addr)
208 {
209         struct brcmf_if *ifp = netdev_priv(ndev);
210         struct sockaddr *sa = (struct sockaddr *)addr;
211         int err;
212
213         brcmf_dbg(TRACE, "Enter, bsscfgidx=%d\n", ifp->bsscfgidx);
214
215         err = brcmf_fil_iovar_data_set(ifp, "cur_etheraddr", sa->sa_data,
216                                        ETH_ALEN);
217         if (err < 0) {
218                 brcmf_err("Setting cur_etheraddr failed, %d\n", err);
219         } else {
220                 brcmf_dbg(TRACE, "updated to %pM\n", sa->sa_data);
221                 memcpy(ifp->mac_addr, sa->sa_data, ETH_ALEN);
222                 memcpy(ifp->ndev->dev_addr, ifp->mac_addr, ETH_ALEN);
223         }
224         return err;
225 }
226
227 static void brcmf_netdev_set_multicast_list(struct net_device *ndev)
228 {
229         struct brcmf_if *ifp = netdev_priv(ndev);
230
231         schedule_work(&ifp->multicast_work);
232 }
233
234 /**
235  * brcmf_skb_is_iapp - checks if skb is an IAPP packet
236  *
237  * @skb: skb to check
238  */
239 static bool brcmf_skb_is_iapp(struct sk_buff *skb)
240 {
241         static const u8 iapp_l2_update_packet[6] __aligned(2) = {
242                 0x00, 0x01, 0xaf, 0x81, 0x01, 0x00,
243         };
244         unsigned char *eth_data;
245 #if !defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS)
246         const u16 *a, *b;
247 #endif
248
249         if (skb->len - skb->mac_len != 6 ||
250             !is_multicast_ether_addr(eth_hdr(skb)->h_dest))
251                 return false;
252
253         eth_data = skb_mac_header(skb) + ETH_HLEN;
254 #if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS)
255         return !(((*(const u32 *)eth_data) ^ (*(const u32 *)iapp_l2_update_packet)) |
256                  ((*(const u16 *)(eth_data + 4)) ^ (*(const u16 *)(iapp_l2_update_packet + 4))));
257 #else
258         a = (const u16 *)eth_data;
259         b = (const u16 *)iapp_l2_update_packet;
260
261         return !((a[0] ^ b[0]) | (a[1] ^ b[1]) | (a[2] ^ b[2]));
262 #endif
263 }
264
265 static netdev_tx_t brcmf_netdev_start_xmit(struct sk_buff *skb,
266                                            struct net_device *ndev)
267 {
268         int ret;
269         struct brcmf_if *ifp = netdev_priv(ndev);
270         struct brcmf_pub *drvr = ifp->drvr;
271         struct ethhdr *eh;
272         int head_delta;
273         unsigned int tx_bytes = skb->len;
274
275         brcmf_dbg(DATA, "Enter, bsscfgidx=%d\n", ifp->bsscfgidx);
276
277         /* Can the device send data? */
278         if (drvr->bus_if->state != BRCMF_BUS_UP) {
279                 brcmf_err("xmit rejected state=%d\n", drvr->bus_if->state);
280                 netif_stop_queue(ndev);
281                 dev_kfree_skb(skb);
282                 ret = -ENODEV;
283                 goto done;
284         }
285
286         /* Some recent Broadcom's firmwares disassociate STA when they receive
287          * an 802.11f ADD frame. This behavior can lead to a local DoS security
288          * issue. Attacker may trigger disassociation of any STA by sending a
289          * proper Ethernet frame to the wireless interface.
290          *
291          * Moreover this feature may break AP interfaces in some specific
292          * setups. This applies e.g. to the bridge with hairpin mode enabled and
293          * IFLA_BRPORT_MCAST_TO_UCAST set. IAPP packet generated by a firmware
294          * will get passed back to the wireless interface and cause immediate
295          * disassociation of a just-connected STA.
296          */
297         if (!drvr->settings->iapp && brcmf_skb_is_iapp(skb)) {
298                 dev_kfree_skb(skb);
299                 ret = -EINVAL;
300                 goto done;
301         }
302
303         /* Make sure there's enough writeable headroom */
304         if (skb_headroom(skb) < drvr->hdrlen || skb_header_cloned(skb)) {
305                 head_delta = max_t(int, drvr->hdrlen - skb_headroom(skb), 0);
306
307                 brcmf_dbg(INFO, "%s: insufficient headroom (%d)\n",
308                           brcmf_ifname(ifp), head_delta);
309                 atomic_inc(&drvr->bus_if->stats.pktcowed);
310                 ret = pskb_expand_head(skb, ALIGN(head_delta, NET_SKB_PAD), 0,
311                                        GFP_ATOMIC);
312                 if (ret < 0) {
313                         brcmf_err("%s: failed to expand headroom\n",
314                                   brcmf_ifname(ifp));
315                         atomic_inc(&drvr->bus_if->stats.pktcow_failed);
316                         goto done;
317                 }
318         }
319
320         /* validate length for ether packet */
321         if (skb->len < sizeof(*eh)) {
322                 ret = -EINVAL;
323                 dev_kfree_skb(skb);
324                 goto done;
325         }
326
327         eh = (struct ethhdr *)(skb->data);
328
329         if (eh->h_proto == htons(ETH_P_PAE))
330                 atomic_inc(&ifp->pend_8021x_cnt);
331
332         /* determine the priority */
333         if ((skb->priority == 0) || (skb->priority > 7))
334                 skb->priority = cfg80211_classify8021d(skb, NULL);
335
336         ret = brcmf_proto_tx_queue_data(drvr, ifp->ifidx, skb);
337         if (ret < 0)
338                 brcmf_txfinalize(ifp, skb, false);
339
340 done:
341         if (ret) {
342                 ndev->stats.tx_dropped++;
343         } else {
344                 ndev->stats.tx_packets++;
345                 ndev->stats.tx_bytes += tx_bytes;
346         }
347
348         /* Return ok: we always eat the packet */
349         return NETDEV_TX_OK;
350 }
351
352 void brcmf_txflowblock_if(struct brcmf_if *ifp,
353                           enum brcmf_netif_stop_reason reason, bool state)
354 {
355         unsigned long flags;
356
357         if (!ifp || !ifp->ndev)
358                 return;
359
360         brcmf_dbg(TRACE, "enter: bsscfgidx=%d stop=0x%X reason=%d state=%d\n",
361                   ifp->bsscfgidx, ifp->netif_stop, reason, state);
362
363         spin_lock_irqsave(&ifp->netif_stop_lock, flags);
364         if (state) {
365                 if (!ifp->netif_stop)
366                         netif_stop_queue(ifp->ndev);
367                 ifp->netif_stop |= reason;
368         } else {
369                 ifp->netif_stop &= ~reason;
370                 if (!ifp->netif_stop)
371                         netif_wake_queue(ifp->ndev);
372         }
373         spin_unlock_irqrestore(&ifp->netif_stop_lock, flags);
374 }
375
376 void brcmf_netif_rx(struct brcmf_if *ifp, struct sk_buff *skb)
377 {
378         /* Most of Broadcom's firmwares send 802.11f ADD frame every time a new
379          * STA connects to the AP interface. This is an obsoleted standard most
380          * users don't use, so don't pass these frames up unless requested.
381          */
382         if (!ifp->drvr->settings->iapp && brcmf_skb_is_iapp(skb)) {
383                 brcmu_pkt_buf_free_skb(skb);
384                 return;
385         }
386
387         if (skb->pkt_type == PACKET_MULTICAST)
388                 ifp->ndev->stats.multicast++;
389
390         if (!(ifp->ndev->flags & IFF_UP)) {
391                 brcmu_pkt_buf_free_skb(skb);
392                 return;
393         }
394
395         ifp->ndev->stats.rx_bytes += skb->len;
396         ifp->ndev->stats.rx_packets++;
397
398         brcmf_dbg(DATA, "rx proto=0x%X\n", ntohs(skb->protocol));
399         if (in_interrupt())
400                 netif_rx(skb);
401         else
402                 /* If the receive is not processed inside an ISR,
403                  * the softirqd must be woken explicitly to service
404                  * the NET_RX_SOFTIRQ.  This is handled by netif_rx_ni().
405                  */
406                 netif_rx_ni(skb);
407 }
408
409 void brcmf_netif_mon_rx(struct brcmf_if *ifp, struct sk_buff *skb)
410 {
411         if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MONITOR_FMT_RADIOTAP)) {
412                 /* Do nothing */
413         } else {
414                 struct ieee80211_radiotap_header *radiotap;
415
416                 /* TODO: use RX status to fill some radiotap data */
417                 radiotap = skb_push(skb, sizeof(*radiotap));
418                 memset(radiotap, 0, sizeof(*radiotap));
419                 radiotap->it_len = cpu_to_le16(sizeof(*radiotap));
420
421                 /* TODO: 4 bytes with receive status? */
422                 skb->len -= 4;
423         }
424
425         skb->dev = ifp->ndev;
426         skb_reset_mac_header(skb);
427         skb->pkt_type = PACKET_OTHERHOST;
428         skb->protocol = htons(ETH_P_802_2);
429
430         brcmf_netif_rx(ifp, skb);
431 }
432
433 static int brcmf_rx_hdrpull(struct brcmf_pub *drvr, struct sk_buff *skb,
434                             struct brcmf_if **ifp)
435 {
436         int ret;
437
438         /* process and remove protocol-specific header */
439         ret = brcmf_proto_hdrpull(drvr, true, skb, ifp);
440
441         if (ret || !(*ifp) || !(*ifp)->ndev) {
442                 if (ret != -ENODATA && *ifp && (*ifp)->ndev)
443                         (*ifp)->ndev->stats.rx_errors++;
444                 brcmu_pkt_buf_free_skb(skb);
445                 return -ENODATA;
446         }
447
448         skb->protocol = eth_type_trans(skb, (*ifp)->ndev);
449         return 0;
450 }
451
452 void brcmf_rx_frame(struct device *dev, struct sk_buff *skb, bool handle_event)
453 {
454         struct brcmf_if *ifp;
455         struct brcmf_bus *bus_if = dev_get_drvdata(dev);
456         struct brcmf_pub *drvr = bus_if->drvr;
457
458         brcmf_dbg(DATA, "Enter: %s: rxp=%p\n", dev_name(dev), skb);
459
460         if (brcmf_rx_hdrpull(drvr, skb, &ifp))
461                 return;
462
463         if (brcmf_proto_is_reorder_skb(skb)) {
464                 brcmf_proto_rxreorder(ifp, skb);
465         } else {
466                 /* Process special event packets */
467                 if (handle_event)
468                         brcmf_fweh_process_skb(ifp->drvr, skb,
469                                                BCMILCP_SUBTYPE_VENDOR_LONG);
470
471                 brcmf_netif_rx(ifp, skb);
472         }
473 }
474
475 void brcmf_rx_event(struct device *dev, struct sk_buff *skb)
476 {
477         struct brcmf_if *ifp;
478         struct brcmf_bus *bus_if = dev_get_drvdata(dev);
479         struct brcmf_pub *drvr = bus_if->drvr;
480
481         brcmf_dbg(EVENT, "Enter: %s: rxp=%p\n", dev_name(dev), skb);
482
483         if (brcmf_rx_hdrpull(drvr, skb, &ifp))
484                 return;
485
486         brcmf_fweh_process_skb(ifp->drvr, skb, 0);
487         brcmu_pkt_buf_free_skb(skb);
488 }
489
490 void brcmf_txfinalize(struct brcmf_if *ifp, struct sk_buff *txp, bool success)
491 {
492         struct ethhdr *eh;
493         u16 type;
494
495         eh = (struct ethhdr *)(txp->data);
496         type = ntohs(eh->h_proto);
497
498         if (type == ETH_P_PAE) {
499                 atomic_dec(&ifp->pend_8021x_cnt);
500                 if (waitqueue_active(&ifp->pend_8021x_wait))
501                         wake_up(&ifp->pend_8021x_wait);
502         }
503
504         if (!success)
505                 ifp->ndev->stats.tx_errors++;
506
507         brcmu_pkt_buf_free_skb(txp);
508 }
509
510 static void brcmf_ethtool_get_drvinfo(struct net_device *ndev,
511                                     struct ethtool_drvinfo *info)
512 {
513         struct brcmf_if *ifp = netdev_priv(ndev);
514         struct brcmf_pub *drvr = ifp->drvr;
515         char drev[BRCMU_DOTREV_LEN] = "n/a";
516
517         if (drvr->revinfo.result == 0)
518                 brcmu_dotrev_str(drvr->revinfo.driverrev, drev);
519         strlcpy(info->driver, KBUILD_MODNAME, sizeof(info->driver));
520         strlcpy(info->version, drev, sizeof(info->version));
521         strlcpy(info->fw_version, drvr->fwver, sizeof(info->fw_version));
522         strlcpy(info->bus_info, dev_name(drvr->bus_if->dev),
523                 sizeof(info->bus_info));
524 }
525
526 static const struct ethtool_ops brcmf_ethtool_ops = {
527         .get_drvinfo = brcmf_ethtool_get_drvinfo,
528 };
529
530 static int brcmf_netdev_stop(struct net_device *ndev)
531 {
532         struct brcmf_if *ifp = netdev_priv(ndev);
533
534         brcmf_dbg(TRACE, "Enter, bsscfgidx=%d\n", ifp->bsscfgidx);
535
536         brcmf_cfg80211_down(ndev);
537
538         brcmf_fil_iovar_data_set(ifp, "arp_hostip_clear", NULL, 0);
539
540         brcmf_net_setcarrier(ifp, false);
541
542         return 0;
543 }
544
545 static int brcmf_netdev_open(struct net_device *ndev)
546 {
547         struct brcmf_if *ifp = netdev_priv(ndev);
548         struct brcmf_pub *drvr = ifp->drvr;
549         struct brcmf_bus *bus_if = drvr->bus_if;
550         u32 toe_ol;
551
552         brcmf_dbg(TRACE, "Enter, bsscfgidx=%d\n", ifp->bsscfgidx);
553
554         /* If bus is not ready, can't continue */
555         if (bus_if->state != BRCMF_BUS_UP) {
556                 brcmf_err("failed bus is not ready\n");
557                 return -EAGAIN;
558         }
559
560         atomic_set(&ifp->pend_8021x_cnt, 0);
561
562         /* Get current TOE mode from dongle */
563         if (brcmf_fil_iovar_int_get(ifp, "toe_ol", &toe_ol) >= 0
564             && (toe_ol & TOE_TX_CSUM_OL) != 0)
565                 ndev->features |= NETIF_F_IP_CSUM;
566         else
567                 ndev->features &= ~NETIF_F_IP_CSUM;
568
569         if (brcmf_cfg80211_up(ndev)) {
570                 brcmf_err("failed to bring up cfg80211\n");
571                 return -EIO;
572         }
573
574         /* Clear, carrier, set when connected or AP mode. */
575         netif_carrier_off(ndev);
576         return 0;
577 }
578
579 static const struct net_device_ops brcmf_netdev_ops_pri = {
580         .ndo_open = brcmf_netdev_open,
581         .ndo_stop = brcmf_netdev_stop,
582         .ndo_start_xmit = brcmf_netdev_start_xmit,
583         .ndo_set_mac_address = brcmf_netdev_set_mac_address,
584         .ndo_set_rx_mode = brcmf_netdev_set_multicast_list
585 };
586
587 int brcmf_net_attach(struct brcmf_if *ifp, bool rtnl_locked)
588 {
589         struct brcmf_pub *drvr = ifp->drvr;
590         struct net_device *ndev;
591         s32 err;
592
593         brcmf_dbg(TRACE, "Enter, bsscfgidx=%d mac=%pM\n", ifp->bsscfgidx,
594                   ifp->mac_addr);
595         ndev = ifp->ndev;
596
597         /* set appropriate operations */
598         ndev->netdev_ops = &brcmf_netdev_ops_pri;
599
600         ndev->needed_headroom += drvr->hdrlen;
601         ndev->ethtool_ops = &brcmf_ethtool_ops;
602
603         /* set the mac address & netns */
604         memcpy(ndev->dev_addr, ifp->mac_addr, ETH_ALEN);
605         dev_net_set(ndev, wiphy_net(cfg_to_wiphy(drvr->config)));
606
607         INIT_WORK(&ifp->multicast_work, _brcmf_set_multicast_list);
608         INIT_WORK(&ifp->ndoffload_work, _brcmf_update_ndtable);
609
610         if (rtnl_locked)
611                 err = register_netdevice(ndev);
612         else
613                 err = register_netdev(ndev);
614         if (err != 0) {
615                 brcmf_err("couldn't register the net device\n");
616                 goto fail;
617         }
618
619         ndev->priv_destructor = brcmf_cfg80211_free_netdev;
620         brcmf_dbg(INFO, "%s: Broadcom Dongle Host Driver\n", ndev->name);
621         return 0;
622
623 fail:
624         drvr->iflist[ifp->bsscfgidx] = NULL;
625         ndev->netdev_ops = NULL;
626         return -EBADE;
627 }
628
629 static void brcmf_net_detach(struct net_device *ndev, bool rtnl_locked)
630 {
631         if (ndev->reg_state == NETREG_REGISTERED) {
632                 if (rtnl_locked)
633                         unregister_netdevice(ndev);
634                 else
635                         unregister_netdev(ndev);
636         } else {
637                 brcmf_cfg80211_free_netdev(ndev);
638                 free_netdev(ndev);
639         }
640 }
641
642 void brcmf_net_setcarrier(struct brcmf_if *ifp, bool on)
643 {
644         struct net_device *ndev;
645
646         brcmf_dbg(TRACE, "Enter, bsscfgidx=%d carrier=%d\n", ifp->bsscfgidx,
647                   on);
648
649         ndev = ifp->ndev;
650         brcmf_txflowblock_if(ifp, BRCMF_NETIF_STOP_REASON_DISCONNECTED, !on);
651         if (on) {
652                 if (!netif_carrier_ok(ndev))
653                         netif_carrier_on(ndev);
654
655         } else {
656                 if (netif_carrier_ok(ndev))
657                         netif_carrier_off(ndev);
658         }
659 }
660
661 static int brcmf_net_p2p_open(struct net_device *ndev)
662 {
663         brcmf_dbg(TRACE, "Enter\n");
664
665         return brcmf_cfg80211_up(ndev);
666 }
667
668 static int brcmf_net_p2p_stop(struct net_device *ndev)
669 {
670         brcmf_dbg(TRACE, "Enter\n");
671
672         return brcmf_cfg80211_down(ndev);
673 }
674
675 static netdev_tx_t brcmf_net_p2p_start_xmit(struct sk_buff *skb,
676                                             struct net_device *ndev)
677 {
678         if (skb)
679                 dev_kfree_skb_any(skb);
680
681         return NETDEV_TX_OK;
682 }
683
684 static const struct net_device_ops brcmf_netdev_ops_p2p = {
685         .ndo_open = brcmf_net_p2p_open,
686         .ndo_stop = brcmf_net_p2p_stop,
687         .ndo_start_xmit = brcmf_net_p2p_start_xmit
688 };
689
690 static int brcmf_net_p2p_attach(struct brcmf_if *ifp)
691 {
692         struct net_device *ndev;
693
694         brcmf_dbg(TRACE, "Enter, bsscfgidx=%d mac=%pM\n", ifp->bsscfgidx,
695                   ifp->mac_addr);
696         ndev = ifp->ndev;
697
698         ndev->netdev_ops = &brcmf_netdev_ops_p2p;
699
700         /* set the mac address */
701         memcpy(ndev->dev_addr, ifp->mac_addr, ETH_ALEN);
702
703         if (register_netdev(ndev) != 0) {
704                 brcmf_err("couldn't register the p2p net device\n");
705                 goto fail;
706         }
707
708         brcmf_dbg(INFO, "%s: Broadcom Dongle Host Driver\n", ndev->name);
709
710         return 0;
711
712 fail:
713         ifp->drvr->iflist[ifp->bsscfgidx] = NULL;
714         ndev->netdev_ops = NULL;
715         return -EBADE;
716 }
717
718 struct brcmf_if *brcmf_add_if(struct brcmf_pub *drvr, s32 bsscfgidx, s32 ifidx,
719                               bool is_p2pdev, const char *name, u8 *mac_addr)
720 {
721         struct brcmf_if *ifp;
722         struct net_device *ndev;
723
724         brcmf_dbg(TRACE, "Enter, bsscfgidx=%d, ifidx=%d\n", bsscfgidx, ifidx);
725
726         ifp = drvr->iflist[bsscfgidx];
727         /*
728          * Delete the existing interface before overwriting it
729          * in case we missed the BRCMF_E_IF_DEL event.
730          */
731         if (ifp) {
732                 if (ifidx) {
733                         brcmf_err("ERROR: netdev:%s already exists\n",
734                                   ifp->ndev->name);
735                         netif_stop_queue(ifp->ndev);
736                         brcmf_net_detach(ifp->ndev, false);
737                         drvr->iflist[bsscfgidx] = NULL;
738                 } else {
739                         brcmf_dbg(INFO, "netdev:%s ignore IF event\n",
740                                   ifp->ndev->name);
741                         return ERR_PTR(-EINVAL);
742                 }
743         }
744
745         if (!drvr->settings->p2p_enable && is_p2pdev) {
746                 /* this is P2P_DEVICE interface */
747                 brcmf_dbg(INFO, "allocate non-netdev interface\n");
748                 ifp = kzalloc(sizeof(*ifp), GFP_KERNEL);
749                 if (!ifp)
750                         return ERR_PTR(-ENOMEM);
751         } else {
752                 brcmf_dbg(INFO, "allocate netdev interface\n");
753                 /* Allocate netdev, including space for private structure */
754                 ndev = alloc_netdev(sizeof(*ifp), is_p2pdev ? "p2p%d" : name,
755                                     NET_NAME_UNKNOWN, ether_setup);
756                 if (!ndev)
757                         return ERR_PTR(-ENOMEM);
758
759                 ndev->needs_free_netdev = true;
760                 ifp = netdev_priv(ndev);
761                 ifp->ndev = ndev;
762                 /* store mapping ifidx to bsscfgidx */
763                 if (drvr->if2bss[ifidx] == BRCMF_BSSIDX_INVALID)
764                         drvr->if2bss[ifidx] = bsscfgidx;
765         }
766
767         ifp->drvr = drvr;
768         drvr->iflist[bsscfgidx] = ifp;
769         ifp->ifidx = ifidx;
770         ifp->bsscfgidx = bsscfgidx;
771
772         init_waitqueue_head(&ifp->pend_8021x_wait);
773         spin_lock_init(&ifp->netif_stop_lock);
774
775         if (mac_addr != NULL)
776                 memcpy(ifp->mac_addr, mac_addr, ETH_ALEN);
777
778         brcmf_dbg(TRACE, " ==== pid:%x, if:%s (%pM) created ===\n",
779                   current->pid, name, ifp->mac_addr);
780
781         return ifp;
782 }
783
784 static void brcmf_del_if(struct brcmf_pub *drvr, s32 bsscfgidx,
785                          bool rtnl_locked)
786 {
787         struct brcmf_if *ifp;
788         int ifidx;
789
790         ifp = drvr->iflist[bsscfgidx];
791         if (!ifp) {
792                 brcmf_err("Null interface, bsscfgidx=%d\n", bsscfgidx);
793                 return;
794         }
795         brcmf_dbg(TRACE, "Enter, bsscfgidx=%d, ifidx=%d\n", bsscfgidx,
796                   ifp->ifidx);
797         ifidx = ifp->ifidx;
798
799         if (ifp->ndev) {
800                 if (bsscfgidx == 0) {
801                         if (ifp->ndev->netdev_ops == &brcmf_netdev_ops_pri) {
802                                 rtnl_lock();
803                                 brcmf_netdev_stop(ifp->ndev);
804                                 rtnl_unlock();
805                         }
806                 } else {
807                         netif_stop_queue(ifp->ndev);
808                 }
809
810                 if (ifp->ndev->netdev_ops == &brcmf_netdev_ops_pri) {
811                         cancel_work_sync(&ifp->multicast_work);
812                         cancel_work_sync(&ifp->ndoffload_work);
813                 }
814                 brcmf_net_detach(ifp->ndev, rtnl_locked);
815         } else {
816                 /* Only p2p device interfaces which get dynamically created
817                  * end up here. In this case the p2p module should be informed
818                  * about the removal of the interface within the firmware. If
819                  * not then p2p commands towards the firmware will cause some
820                  * serious troublesome side effects. The p2p module will clean
821                  * up the ifp if needed.
822                  */
823                 brcmf_p2p_ifp_removed(ifp, rtnl_locked);
824                 kfree(ifp);
825         }
826
827         drvr->iflist[bsscfgidx] = NULL;
828         if (drvr->if2bss[ifidx] == bsscfgidx)
829                 drvr->if2bss[ifidx] = BRCMF_BSSIDX_INVALID;
830 }
831
832 void brcmf_remove_interface(struct brcmf_if *ifp, bool rtnl_locked)
833 {
834         if (!ifp || WARN_ON(ifp->drvr->iflist[ifp->bsscfgidx] != ifp))
835                 return;
836         brcmf_dbg(TRACE, "Enter, bsscfgidx=%d, ifidx=%d\n", ifp->bsscfgidx,
837                   ifp->ifidx);
838         brcmf_proto_del_if(ifp->drvr, ifp);
839         brcmf_del_if(ifp->drvr, ifp->bsscfgidx, rtnl_locked);
840 }
841
842 static int brcmf_psm_watchdog_notify(struct brcmf_if *ifp,
843                                      const struct brcmf_event_msg *evtmsg,
844                                      void *data)
845 {
846         int err;
847
848         brcmf_dbg(TRACE, "enter: bsscfgidx=%d\n", ifp->bsscfgidx);
849
850         brcmf_err("PSM's watchdog has fired!\n");
851
852         err = brcmf_debug_create_memdump(ifp->drvr->bus_if, data,
853                                          evtmsg->datalen);
854         if (err)
855                 brcmf_err("Failed to get memory dump, %d\n", err);
856
857         return err;
858 }
859
860 #ifdef CONFIG_INET
861 #define ARPOL_MAX_ENTRIES       8
862 static int brcmf_inetaddr_changed(struct notifier_block *nb,
863                                   unsigned long action, void *data)
864 {
865         struct brcmf_pub *drvr = container_of(nb, struct brcmf_pub,
866                                               inetaddr_notifier);
867         struct in_ifaddr *ifa = data;
868         struct net_device *ndev = ifa->ifa_dev->dev;
869         struct brcmf_if *ifp;
870         int idx, i, ret;
871         u32 val;
872         __be32 addr_table[ARPOL_MAX_ENTRIES] = {0};
873
874         /* Find out if the notification is meant for us */
875         for (idx = 0; idx < BRCMF_MAX_IFS; idx++) {
876                 ifp = drvr->iflist[idx];
877                 if (ifp && ifp->ndev == ndev)
878                         break;
879                 if (idx == BRCMF_MAX_IFS - 1)
880                         return NOTIFY_DONE;
881         }
882
883         /* check if arp offload is supported */
884         ret = brcmf_fil_iovar_int_get(ifp, "arpoe", &val);
885         if (ret)
886                 return NOTIFY_OK;
887
888         /* old version only support primary index */
889         ret = brcmf_fil_iovar_int_get(ifp, "arp_version", &val);
890         if (ret)
891                 val = 1;
892         if (val == 1)
893                 ifp = drvr->iflist[0];
894
895         /* retrieve the table from firmware */
896         ret = brcmf_fil_iovar_data_get(ifp, "arp_hostip", addr_table,
897                                        sizeof(addr_table));
898         if (ret) {
899                 brcmf_err("fail to get arp ip table err:%d\n", ret);
900                 return NOTIFY_OK;
901         }
902
903         for (i = 0; i < ARPOL_MAX_ENTRIES; i++)
904                 if (ifa->ifa_address == addr_table[i])
905                         break;
906
907         switch (action) {
908         case NETDEV_UP:
909                 if (i == ARPOL_MAX_ENTRIES) {
910                         brcmf_dbg(TRACE, "add %pI4 to arp table\n",
911                                   &ifa->ifa_address);
912                         /* set it directly */
913                         ret = brcmf_fil_iovar_data_set(ifp, "arp_hostip",
914                                 &ifa->ifa_address, sizeof(ifa->ifa_address));
915                         if (ret)
916                                 brcmf_err("add arp ip err %d\n", ret);
917                 }
918                 break;
919         case NETDEV_DOWN:
920                 if (i < ARPOL_MAX_ENTRIES) {
921                         addr_table[i] = 0;
922                         brcmf_dbg(TRACE, "remove %pI4 from arp table\n",
923                                   &ifa->ifa_address);
924                         /* clear the table in firmware */
925                         ret = brcmf_fil_iovar_data_set(ifp, "arp_hostip_clear",
926                                                        NULL, 0);
927                         if (ret) {
928                                 brcmf_err("fail to clear arp ip table err:%d\n",
929                                           ret);
930                                 return NOTIFY_OK;
931                         }
932                         for (i = 0; i < ARPOL_MAX_ENTRIES; i++) {
933                                 if (addr_table[i] == 0)
934                                         continue;
935                                 ret = brcmf_fil_iovar_data_set(ifp, "arp_hostip",
936                                                                &addr_table[i],
937                                                                sizeof(addr_table[i]));
938                                 if (ret)
939                                         brcmf_err("add arp ip err %d\n",
940                                                   ret);
941                         }
942                 }
943                 break;
944         default:
945                 break;
946         }
947
948         return NOTIFY_OK;
949 }
950 #endif
951
952 #if IS_ENABLED(CONFIG_IPV6)
953 static int brcmf_inet6addr_changed(struct notifier_block *nb,
954                                    unsigned long action, void *data)
955 {
956         struct brcmf_pub *drvr = container_of(nb, struct brcmf_pub,
957                                               inet6addr_notifier);
958         struct inet6_ifaddr *ifa = data;
959         struct brcmf_if *ifp;
960         int i;
961         struct in6_addr *table;
962
963         /* Only handle primary interface */
964         ifp = drvr->iflist[0];
965         if (!ifp)
966                 return NOTIFY_DONE;
967         if (ifp->ndev != ifa->idev->dev)
968                 return NOTIFY_DONE;
969
970         table = ifp->ipv6_addr_tbl;
971         for (i = 0; i < NDOL_MAX_ENTRIES; i++)
972                 if (ipv6_addr_equal(&ifa->addr, &table[i]))
973                         break;
974
975         switch (action) {
976         case NETDEV_UP:
977                 if (i == NDOL_MAX_ENTRIES) {
978                         if (ifp->ipv6addr_idx < NDOL_MAX_ENTRIES) {
979                                 table[ifp->ipv6addr_idx++] = ifa->addr;
980                         } else {
981                                 for (i = 0; i < NDOL_MAX_ENTRIES - 1; i++)
982                                         table[i] = table[i + 1];
983                                 table[NDOL_MAX_ENTRIES - 1] = ifa->addr;
984                         }
985                 }
986                 break;
987         case NETDEV_DOWN:
988                 if (i < NDOL_MAX_ENTRIES) {
989                         for (; i < ifp->ipv6addr_idx - 1; i++)
990                                 table[i] = table[i + 1];
991                         memset(&table[i], 0, sizeof(table[i]));
992                         ifp->ipv6addr_idx--;
993                 }
994                 break;
995         default:
996                 break;
997         }
998
999         schedule_work(&ifp->ndoffload_work);
1000
1001         return NOTIFY_OK;
1002 }
1003 #endif
1004
1005 static int brcmf_revinfo_read(struct seq_file *s, void *data)
1006 {
1007         struct brcmf_bus *bus_if = dev_get_drvdata(s->private);
1008         struct brcmf_rev_info *ri = &bus_if->drvr->revinfo;
1009         char drev[BRCMU_DOTREV_LEN];
1010         char brev[BRCMU_BOARDREV_LEN];
1011
1012         seq_printf(s, "vendorid: 0x%04x\n", ri->vendorid);
1013         seq_printf(s, "deviceid: 0x%04x\n", ri->deviceid);
1014         seq_printf(s, "radiorev: %s\n", brcmu_dotrev_str(ri->radiorev, drev));
1015         seq_printf(s, "chip: %s\n", ri->chipname);
1016         seq_printf(s, "chippkg: %u\n", ri->chippkg);
1017         seq_printf(s, "corerev: %u\n", ri->corerev);
1018         seq_printf(s, "boardid: 0x%04x\n", ri->boardid);
1019         seq_printf(s, "boardvendor: 0x%04x\n", ri->boardvendor);
1020         seq_printf(s, "boardrev: %s\n", brcmu_boardrev_str(ri->boardrev, brev));
1021         seq_printf(s, "driverrev: %s\n", brcmu_dotrev_str(ri->driverrev, drev));
1022         seq_printf(s, "ucoderev: %u\n", ri->ucoderev);
1023         seq_printf(s, "bus: %u\n", ri->bus);
1024         seq_printf(s, "phytype: %u\n", ri->phytype);
1025         seq_printf(s, "phyrev: %u\n", ri->phyrev);
1026         seq_printf(s, "anarev: %u\n", ri->anarev);
1027         seq_printf(s, "nvramrev: %08x\n", ri->nvramrev);
1028
1029         seq_printf(s, "clmver: %s\n", bus_if->drvr->clmver);
1030
1031         return 0;
1032 }
1033
1034 static int brcmf_bus_started(struct brcmf_pub *drvr, struct cfg80211_ops *ops)
1035 {
1036         int ret = -1;
1037         struct brcmf_bus *bus_if = drvr->bus_if;
1038         struct brcmf_if *ifp;
1039         struct brcmf_if *p2p_ifp;
1040
1041         brcmf_dbg(TRACE, "\n");
1042
1043         /* add primary networking interface */
1044         ifp = brcmf_add_if(drvr, 0, 0, false, "wlan%d", NULL);
1045         if (IS_ERR(ifp))
1046                 return PTR_ERR(ifp);
1047
1048         p2p_ifp = NULL;
1049
1050         /* signal bus ready */
1051         brcmf_bus_change_state(bus_if, BRCMF_BUS_UP);
1052
1053         /* do bus specific preinit here */
1054         ret = brcmf_bus_preinit(bus_if);
1055         if (ret < 0)
1056                 goto fail;
1057
1058         /* Bus is ready, do any initialization */
1059         ret = brcmf_c_preinit_dcmds(ifp);
1060         if (ret < 0)
1061                 goto fail;
1062
1063         brcmf_feat_attach(drvr);
1064
1065         ret = brcmf_proto_init_done(drvr);
1066         if (ret < 0)
1067                 goto fail;
1068
1069         brcmf_proto_add_if(drvr, ifp);
1070
1071         drvr->config = brcmf_cfg80211_attach(drvr, ops,
1072                                              drvr->settings->p2p_enable);
1073         if (drvr->config == NULL) {
1074                 ret = -ENOMEM;
1075                 goto fail;
1076         }
1077
1078         ret = brcmf_net_attach(ifp, false);
1079
1080         if ((!ret) && (drvr->settings->p2p_enable)) {
1081                 p2p_ifp = drvr->iflist[1];
1082                 if (p2p_ifp)
1083                         ret = brcmf_net_p2p_attach(p2p_ifp);
1084         }
1085
1086         if (ret)
1087                 goto fail;
1088
1089 #ifdef CONFIG_INET
1090         drvr->inetaddr_notifier.notifier_call = brcmf_inetaddr_changed;
1091         ret = register_inetaddr_notifier(&drvr->inetaddr_notifier);
1092         if (ret)
1093                 goto fail;
1094
1095 #if IS_ENABLED(CONFIG_IPV6)
1096         drvr->inet6addr_notifier.notifier_call = brcmf_inet6addr_changed;
1097         ret = register_inet6addr_notifier(&drvr->inet6addr_notifier);
1098         if (ret) {
1099                 unregister_inetaddr_notifier(&drvr->inetaddr_notifier);
1100                 goto fail;
1101         }
1102 #endif
1103 #endif /* CONFIG_INET */
1104
1105         /* populate debugfs */
1106         brcmf_debugfs_add_entry(drvr, "revinfo", brcmf_revinfo_read);
1107         brcmf_feat_debugfs_create(drvr);
1108         brcmf_proto_debugfs_create(drvr);
1109         brcmf_bus_debugfs_create(bus_if);
1110
1111         return 0;
1112
1113 fail:
1114         brcmf_err("failed: %d\n", ret);
1115         if (drvr->config) {
1116                 brcmf_cfg80211_detach(drvr->config);
1117                 drvr->config = NULL;
1118         }
1119         brcmf_net_detach(ifp->ndev, false);
1120         if (p2p_ifp)
1121                 brcmf_net_detach(p2p_ifp->ndev, false);
1122         drvr->iflist[0] = NULL;
1123         drvr->iflist[1] = NULL;
1124         if (drvr->settings->ignore_probe_fail)
1125                 ret = 0;
1126
1127         return ret;
1128 }
1129
1130 int brcmf_attach(struct device *dev, struct brcmf_mp_device *settings)
1131 {
1132         struct wiphy *wiphy;
1133         struct cfg80211_ops *ops;
1134         struct brcmf_pub *drvr = NULL;
1135         int ret = 0;
1136         int i;
1137
1138         brcmf_dbg(TRACE, "Enter\n");
1139
1140         ops = brcmf_cfg80211_get_ops(settings);
1141         if (!ops)
1142                 return -ENOMEM;
1143
1144         wiphy = wiphy_new(ops, sizeof(*drvr));
1145         if (!wiphy)
1146                 return -ENOMEM;
1147
1148         set_wiphy_dev(wiphy, dev);
1149         drvr = wiphy_priv(wiphy);
1150         drvr->wiphy = wiphy;
1151
1152         for (i = 0; i < ARRAY_SIZE(drvr->if2bss); i++)
1153                 drvr->if2bss[i] = BRCMF_BSSIDX_INVALID;
1154
1155         mutex_init(&drvr->proto_block);
1156
1157         /* Link to bus module */
1158         drvr->hdrlen = 0;
1159         drvr->bus_if = dev_get_drvdata(dev);
1160         drvr->bus_if->drvr = drvr;
1161         drvr->settings = settings;
1162
1163         /* Attach and link in the protocol */
1164         ret = brcmf_proto_attach(drvr);
1165         if (ret != 0) {
1166                 brcmf_err("brcmf_prot_attach failed\n");
1167                 goto fail;
1168         }
1169
1170         /* Attach to events important for core code */
1171         brcmf_fweh_register(drvr, BRCMF_E_PSM_WATCHDOG,
1172                             brcmf_psm_watchdog_notify);
1173
1174         /* attach firmware event handler */
1175         brcmf_fweh_attach(drvr);
1176
1177         ret = brcmf_bus_started(drvr, ops);
1178         if (ret != 0) {
1179                 brcmf_err("dongle is not responding: err=%d\n", ret);
1180                 goto fail;
1181         }
1182
1183         drvr->config->ops = ops;
1184         return 0;
1185
1186 fail:
1187         brcmf_detach(dev);
1188         kfree(ops);
1189
1190         return ret;
1191 }
1192
1193 void brcmf_bus_add_txhdrlen(struct device *dev, uint len)
1194 {
1195         struct brcmf_bus *bus_if = dev_get_drvdata(dev);
1196         struct brcmf_pub *drvr = bus_if->drvr;
1197
1198         if (drvr) {
1199                 drvr->hdrlen += len;
1200         }
1201 }
1202
1203 void brcmf_dev_reset(struct device *dev)
1204 {
1205         struct brcmf_bus *bus_if = dev_get_drvdata(dev);
1206         struct brcmf_pub *drvr = bus_if->drvr;
1207
1208         if (drvr == NULL)
1209                 return;
1210
1211         if (drvr->iflist[0])
1212                 brcmf_fil_cmd_int_set(drvr->iflist[0], BRCMF_C_TERMINATED, 1);
1213 }
1214
1215 void brcmf_dev_coredump(struct device *dev)
1216 {
1217         struct brcmf_bus *bus_if = dev_get_drvdata(dev);
1218
1219         if (brcmf_debug_create_memdump(bus_if, NULL, 0) < 0)
1220                 brcmf_dbg(TRACE, "failed to create coredump\n");
1221 }
1222
1223 void brcmf_detach(struct device *dev)
1224 {
1225         s32 i;
1226         struct brcmf_bus *bus_if = dev_get_drvdata(dev);
1227         struct brcmf_pub *drvr = bus_if->drvr;
1228
1229         brcmf_dbg(TRACE, "Enter\n");
1230
1231         if (drvr == NULL)
1232                 return;
1233
1234 #ifdef CONFIG_INET
1235         unregister_inetaddr_notifier(&drvr->inetaddr_notifier);
1236 #endif
1237
1238 #if IS_ENABLED(CONFIG_IPV6)
1239         unregister_inet6addr_notifier(&drvr->inet6addr_notifier);
1240 #endif
1241
1242         /* stop firmware event handling */
1243         brcmf_fweh_detach(drvr);
1244         if (drvr->config)
1245                 brcmf_p2p_detach(&drvr->config->p2p);
1246
1247         brcmf_bus_change_state(bus_if, BRCMF_BUS_DOWN);
1248
1249         brcmf_proto_detach_pre_delif(drvr);
1250
1251         if (drvr->mon_if) {
1252                 brcmf_net_detach(drvr->mon_if->ndev, false);
1253                 drvr->mon_if = NULL;
1254         }
1255
1256         /* make sure primary interface removed last */
1257         for (i = BRCMF_MAX_IFS-1; i > -1; i--)
1258                 brcmf_remove_interface(drvr->iflist[i], false);
1259
1260         brcmf_cfg80211_detach(drvr->config);
1261         drvr->config = NULL;
1262
1263         brcmf_bus_stop(drvr->bus_if);
1264
1265         brcmf_proto_detach_post_delif(drvr);
1266
1267         bus_if->drvr = NULL;
1268         wiphy_free(drvr->wiphy);
1269 }
1270
1271 s32 brcmf_iovar_data_set(struct device *dev, char *name, void *data, u32 len)
1272 {
1273         struct brcmf_bus *bus_if = dev_get_drvdata(dev);
1274         struct brcmf_if *ifp = bus_if->drvr->iflist[0];
1275
1276         return brcmf_fil_iovar_data_set(ifp, name, data, len);
1277 }
1278
1279 static int brcmf_get_pend_8021x_cnt(struct brcmf_if *ifp)
1280 {
1281         return atomic_read(&ifp->pend_8021x_cnt);
1282 }
1283
1284 int brcmf_netdev_wait_pend8021x(struct brcmf_if *ifp)
1285 {
1286         int err;
1287
1288         err = wait_event_timeout(ifp->pend_8021x_wait,
1289                                  !brcmf_get_pend_8021x_cnt(ifp),
1290                                  MAX_WAIT_FOR_8021X_TX);
1291
1292         if (!err)
1293                 brcmf_err("Timed out waiting for no pending 802.1x packets\n");
1294
1295         return !err;
1296 }
1297
1298 void brcmf_bus_change_state(struct brcmf_bus *bus, enum brcmf_bus_state state)
1299 {
1300         struct brcmf_pub *drvr = bus->drvr;
1301         struct net_device *ndev;
1302         int ifidx;
1303
1304         brcmf_dbg(TRACE, "%d -> %d\n", bus->state, state);
1305
1306         if (!drvr) {
1307                 brcmf_dbg(INFO, "ignoring transition, bus not attached yet\n");
1308                 return;
1309         }
1310
1311         bus->state = state;
1312
1313         if (state == BRCMF_BUS_UP) {
1314                 for (ifidx = 0; ifidx < BRCMF_MAX_IFS; ifidx++) {
1315                         if ((drvr->iflist[ifidx]) &&
1316                             (drvr->iflist[ifidx]->ndev)) {
1317                                 ndev = drvr->iflist[ifidx]->ndev;
1318                                 if (netif_queue_stopped(ndev))
1319                                         netif_wake_queue(ndev);
1320                         }
1321                 }
1322         }
1323 }
1324
1325 static void brcmf_driver_register(struct work_struct *work)
1326 {
1327 #ifdef CONFIG_BRCMFMAC_SDIO
1328         brcmf_sdio_register();
1329 #endif
1330 #ifdef CONFIG_BRCMFMAC_USB
1331         brcmf_usb_register();
1332 #endif
1333 #ifdef CONFIG_BRCMFMAC_PCIE
1334         brcmf_pcie_register();
1335 #endif
1336 }
1337 static DECLARE_WORK(brcmf_driver_work, brcmf_driver_register);
1338
1339 int __init brcmf_core_init(void)
1340 {
1341         if (!schedule_work(&brcmf_driver_work))
1342                 return -EBUSY;
1343
1344         return 0;
1345 }
1346
1347 void __exit brcmf_core_exit(void)
1348 {
1349         cancel_work_sync(&brcmf_driver_work);
1350
1351 #ifdef CONFIG_BRCMFMAC_SDIO
1352         brcmf_sdio_exit();
1353 #endif
1354 #ifdef CONFIG_BRCMFMAC_USB
1355         brcmf_usb_exit();
1356 #endif
1357 #ifdef CONFIG_BRCMFMAC_PCIE
1358         brcmf_pcie_exit();
1359 #endif
1360 }
1361