brcmfmac: allow stopping netif queue for different reasons
[firefly-linux-kernel-4.4.55.git] / drivers / net / wireless / brcm80211 / brcmfmac / dhd_linux.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 <net/cfg80211.h>
21 #include <net/rtnetlink.h>
22 #include <brcmu_utils.h>
23 #include <brcmu_wifi.h>
24
25 #include "dhd.h"
26 #include "dhd_bus.h"
27 #include "dhd_proto.h"
28 #include "dhd_dbg.h"
29 #include "fwil_types.h"
30 #include "p2p.h"
31 #include "wl_cfg80211.h"
32 #include "fwil.h"
33 #include "fwsignal.h"
34
35 MODULE_AUTHOR("Broadcom Corporation");
36 MODULE_DESCRIPTION("Broadcom 802.11 wireless LAN fullmac driver.");
37 MODULE_LICENSE("Dual BSD/GPL");
38
39 #define MAX_WAIT_FOR_8021X_TX           50      /* msecs */
40
41 /* Error bits */
42 int brcmf_msg_level;
43 module_param_named(debug, brcmf_msg_level, int, S_IRUSR | S_IWUSR);
44 MODULE_PARM_DESC(debug, "level of debug output");
45
46 /* P2P0 enable */
47 static int brcmf_p2p_enable;
48 #ifdef CONFIG_BRCMDBG
49 module_param_named(p2pon, brcmf_p2p_enable, int, 0);
50 MODULE_PARM_DESC(p2pon, "enable p2p management functionality");
51 #endif
52
53 char *brcmf_ifname(struct brcmf_pub *drvr, int ifidx)
54 {
55         if (ifidx < 0 || ifidx >= BRCMF_MAX_IFS) {
56                 brcmf_err("ifidx %d out of range\n", ifidx);
57                 return "<if_bad>";
58         }
59
60         if (drvr->iflist[ifidx] == NULL) {
61                 brcmf_err("null i/f %d\n", ifidx);
62                 return "<if_null>";
63         }
64
65         if (drvr->iflist[ifidx]->ndev)
66                 return drvr->iflist[ifidx]->ndev->name;
67
68         return "<if_none>";
69 }
70
71 static void _brcmf_set_multicast_list(struct work_struct *work)
72 {
73         struct brcmf_if *ifp;
74         struct net_device *ndev;
75         struct netdev_hw_addr *ha;
76         u32 cmd_value, cnt;
77         __le32 cnt_le;
78         char *buf, *bufp;
79         u32 buflen;
80         s32 err;
81
82         ifp = container_of(work, struct brcmf_if, multicast_work);
83
84         brcmf_dbg(TRACE, "Enter, idx=%d\n", ifp->bssidx);
85
86         ndev = ifp->ndev;
87
88         /* Determine initial value of allmulti flag */
89         cmd_value = (ndev->flags & IFF_ALLMULTI) ? true : false;
90
91         /* Send down the multicast list first. */
92         cnt = netdev_mc_count(ndev);
93         buflen = sizeof(cnt) + (cnt * ETH_ALEN);
94         buf = kmalloc(buflen, GFP_ATOMIC);
95         if (!buf)
96                 return;
97         bufp = buf;
98
99         cnt_le = cpu_to_le32(cnt);
100         memcpy(bufp, &cnt_le, sizeof(cnt_le));
101         bufp += sizeof(cnt_le);
102
103         netdev_for_each_mc_addr(ha, ndev) {
104                 if (!cnt)
105                         break;
106                 memcpy(bufp, ha->addr, ETH_ALEN);
107                 bufp += ETH_ALEN;
108                 cnt--;
109         }
110
111         err = brcmf_fil_iovar_data_set(ifp, "mcast_list", buf, buflen);
112         if (err < 0) {
113                 brcmf_err("Setting mcast_list failed, %d\n", err);
114                 cmd_value = cnt ? true : cmd_value;
115         }
116
117         kfree(buf);
118
119         /*
120          * Now send the allmulti setting.  This is based on the setting in the
121          * net_device flags, but might be modified above to be turned on if we
122          * were trying to set some addresses and dongle rejected it...
123          */
124         err = brcmf_fil_iovar_int_set(ifp, "allmulti", cmd_value);
125         if (err < 0)
126                 brcmf_err("Setting allmulti failed, %d\n", err);
127
128         /*Finally, pick up the PROMISC flag */
129         cmd_value = (ndev->flags & IFF_PROMISC) ? true : false;
130         err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_PROMISC, cmd_value);
131         if (err < 0)
132                 brcmf_err("Setting BRCMF_C_SET_PROMISC failed, %d\n",
133                           err);
134 }
135
136 static void
137 _brcmf_set_mac_address(struct work_struct *work)
138 {
139         struct brcmf_if *ifp;
140         s32 err;
141
142         ifp = container_of(work, struct brcmf_if, setmacaddr_work);
143
144         brcmf_dbg(TRACE, "Enter, idx=%d\n", ifp->bssidx);
145
146         err = brcmf_fil_iovar_data_set(ifp, "cur_etheraddr", ifp->mac_addr,
147                                        ETH_ALEN);
148         if (err < 0) {
149                 brcmf_err("Setting cur_etheraddr failed, %d\n", err);
150         } else {
151                 brcmf_dbg(TRACE, "MAC address updated to %pM\n",
152                           ifp->mac_addr);
153                 memcpy(ifp->ndev->dev_addr, ifp->mac_addr, ETH_ALEN);
154         }
155 }
156
157 static int brcmf_netdev_set_mac_address(struct net_device *ndev, void *addr)
158 {
159         struct brcmf_if *ifp = netdev_priv(ndev);
160         struct sockaddr *sa = (struct sockaddr *)addr;
161
162         memcpy(&ifp->mac_addr, sa->sa_data, ETH_ALEN);
163         schedule_work(&ifp->setmacaddr_work);
164         return 0;
165 }
166
167 static void brcmf_netdev_set_multicast_list(struct net_device *ndev)
168 {
169         struct brcmf_if *ifp = netdev_priv(ndev);
170
171         schedule_work(&ifp->multicast_work);
172 }
173
174 static netdev_tx_t brcmf_netdev_start_xmit(struct sk_buff *skb,
175                                            struct net_device *ndev)
176 {
177         int ret;
178         struct brcmf_if *ifp = netdev_priv(ndev);
179         struct brcmf_pub *drvr = ifp->drvr;
180         struct ethhdr *eh;
181
182         brcmf_dbg(TRACE, "Enter, idx=%d\n", ifp->bssidx);
183
184         /* Can the device send data? */
185         if (drvr->bus_if->state != BRCMF_BUS_DATA) {
186                 brcmf_err("xmit rejected state=%d\n", drvr->bus_if->state);
187                 netif_stop_queue(ndev);
188                 dev_kfree_skb(skb);
189                 ret = -ENODEV;
190                 goto done;
191         }
192
193         if (!drvr->iflist[ifp->bssidx]) {
194                 brcmf_err("bad ifidx %d\n", ifp->bssidx);
195                 netif_stop_queue(ndev);
196                 dev_kfree_skb(skb);
197                 ret = -ENODEV;
198                 goto done;
199         }
200
201         /* Make sure there's enough room for any header */
202         if (skb_headroom(skb) < drvr->hdrlen) {
203                 struct sk_buff *skb2;
204
205                 brcmf_dbg(INFO, "%s: insufficient headroom\n",
206                           brcmf_ifname(drvr, ifp->bssidx));
207                 drvr->bus_if->tx_realloc++;
208                 skb2 = skb_realloc_headroom(skb, drvr->hdrlen);
209                 dev_kfree_skb(skb);
210                 skb = skb2;
211                 if (skb == NULL) {
212                         brcmf_err("%s: skb_realloc_headroom failed\n",
213                                   brcmf_ifname(drvr, ifp->bssidx));
214                         ret = -ENOMEM;
215                         goto done;
216                 }
217         }
218
219         /* validate length for ether packet */
220         if (skb->len < sizeof(*eh)) {
221                 ret = -EINVAL;
222                 dev_kfree_skb(skb);
223                 goto done;
224         }
225
226         /* handle ethernet header */
227         eh = (struct ethhdr *)(skb->data);
228         if (is_multicast_ether_addr(eh->h_dest))
229                 drvr->tx_multicast++;
230         if (ntohs(eh->h_proto) == ETH_P_PAE)
231                 atomic_inc(&ifp->pend_8021x_cnt);
232
233         /* If the protocol uses a data header, apply it */
234         brcmf_proto_hdrpush(drvr, ifp->ifidx, 0, skb);
235
236         /* Use bus module to send data frame */
237         ret =  brcmf_bus_txdata(drvr->bus_if, skb);
238
239 done:
240         if (ret) {
241                 ifp->stats.tx_dropped++;
242         } else {
243                 ifp->stats.tx_packets++;
244                 ifp->stats.tx_bytes += skb->len;
245         }
246
247         /* Return ok: we always eat the packet */
248         return NETDEV_TX_OK;
249 }
250
251 void brcmf_txflowblock_if(struct brcmf_if *ifp,
252                           enum brcmf_netif_stop_reason reason, bool state)
253 {
254         if (!ifp)
255                 return;
256
257         brcmf_dbg(TRACE, "enter: idx=%d stop=0x%X reason=%d state=%d\n",
258                   ifp->bssidx, ifp->netif_stop, reason, state);
259         if (state) {
260                 if (!ifp->netif_stop)
261                         netif_stop_queue(ifp->ndev);
262                 ifp->netif_stop |= reason;
263         } else {
264                 ifp->netif_stop &= ~reason;
265                 if (!ifp->netif_stop)
266                         netif_wake_queue(ifp->ndev);
267         }
268 }
269
270 void brcmf_txflowblock(struct device *dev, bool state)
271 {
272         struct brcmf_bus *bus_if = dev_get_drvdata(dev);
273         struct brcmf_pub *drvr = bus_if->drvr;
274         int i;
275
276         brcmf_dbg(TRACE, "Enter\n");
277
278         for (i = 0; i < BRCMF_MAX_IFS; i++)
279                 brcmf_txflowblock_if(drvr->iflist[i],
280                                      BRCMF_NETIF_STOP_REASON_BLOCK_BUS, state);
281 }
282
283 void brcmf_rx_frames(struct device *dev, struct sk_buff_head *skb_list)
284 {
285         unsigned char *eth;
286         uint len;
287         struct sk_buff *skb, *pnext;
288         struct brcmf_if *ifp;
289         struct brcmf_bus *bus_if = dev_get_drvdata(dev);
290         struct brcmf_pub *drvr = bus_if->drvr;
291         u8 ifidx;
292         int ret;
293
294         brcmf_dbg(TRACE, "Enter\n");
295
296         skb_queue_walk_safe(skb_list, skb, pnext) {
297                 skb_unlink(skb, skb_list);
298
299                 /* process and remove protocol-specific header */
300                 ret = brcmf_proto_hdrpull(drvr, drvr->fw_signals, &ifidx, skb);
301                 ifp = drvr->iflist[ifidx];
302
303                 if (ret || !ifp || !ifp->ndev) {
304                         if ((ret != -ENODATA) && ifp)
305                                 ifp->stats.rx_errors++;
306                         brcmu_pkt_buf_free_skb(skb);
307                         continue;
308                 }
309
310                 /* Get the protocol, maintain skb around eth_type_trans()
311                  * The main reason for this hack is for the limitation of
312                  * Linux 2.4 where 'eth_type_trans' uses the
313                  * 'net->hard_header_len'
314                  * to perform skb_pull inside vs ETH_HLEN. Since to avoid
315                  * coping of the packet coming from the network stack to add
316                  * BDC, Hardware header etc, during network interface
317                  * registration
318                  * we set the 'net->hard_header_len' to ETH_HLEN + extra space
319                  * required
320                  * for BDC, Hardware header etc. and not just the ETH_HLEN
321                  */
322                 eth = skb->data;
323                 len = skb->len;
324
325                 skb->dev = ifp->ndev;
326                 skb->protocol = eth_type_trans(skb, skb->dev);
327
328                 if (skb->pkt_type == PACKET_MULTICAST)
329                         ifp->stats.multicast++;
330
331                 skb->data = eth;
332                 skb->len = len;
333
334                 /* Strip header, count, deliver upward */
335                 skb_pull(skb, ETH_HLEN);
336
337                 /* Process special event packets and then discard them */
338                 brcmf_fweh_process_skb(drvr, skb, &ifidx);
339
340                 if (drvr->iflist[ifidx]) {
341                         ifp = drvr->iflist[ifidx];
342                         ifp->ndev->last_rx = jiffies;
343                 }
344
345                 if (!(ifp->ndev->flags & IFF_UP)) {
346                         brcmu_pkt_buf_free_skb(skb);
347                         continue;
348                 }
349
350                 ifp->stats.rx_bytes += skb->len;
351                 ifp->stats.rx_packets++;
352
353                 if (in_interrupt())
354                         netif_rx(skb);
355                 else
356                         /* If the receive is not processed inside an ISR,
357                          * the softirqd must be woken explicitly to service
358                          * the NET_RX_SOFTIRQ.  In 2.6 kernels, this is handled
359                          * by netif_rx_ni(), but in earlier kernels, we need
360                          * to do it manually.
361                          */
362                         netif_rx_ni(skb);
363         }
364 }
365
366 void brcmf_txcomplete(struct device *dev, struct sk_buff *txp, bool success)
367 {
368         u8 ifidx;
369         struct ethhdr *eh;
370         u16 type;
371         struct brcmf_bus *bus_if = dev_get_drvdata(dev);
372         struct brcmf_pub *drvr = bus_if->drvr;
373         struct brcmf_if *ifp;
374         int res;
375
376         res = brcmf_proto_hdrpull(drvr, false, &ifidx, txp);
377
378         ifp = drvr->iflist[ifidx];
379         if (!ifp)
380                 goto done;
381
382         if (res == 0) {
383                 eh = (struct ethhdr *)(txp->data);
384                 type = ntohs(eh->h_proto);
385
386                 if (type == ETH_P_PAE) {
387                         atomic_dec(&ifp->pend_8021x_cnt);
388                         if (waitqueue_active(&ifp->pend_8021x_wait))
389                                 wake_up(&ifp->pend_8021x_wait);
390                 }
391         }
392         if (!success)
393                 ifp->stats.tx_errors++;
394
395 done:
396         brcmu_pkt_buf_free_skb(txp);
397 }
398
399 static struct net_device_stats *brcmf_netdev_get_stats(struct net_device *ndev)
400 {
401         struct brcmf_if *ifp = netdev_priv(ndev);
402
403         brcmf_dbg(TRACE, "Enter, idx=%d\n", ifp->bssidx);
404
405         return &ifp->stats;
406 }
407
408 /*
409  * Set current toe component enables in toe_ol iovar,
410  * and set toe global enable iovar
411  */
412 static int brcmf_toe_set(struct brcmf_if *ifp, u32 toe_ol)
413 {
414         s32 err;
415
416         err = brcmf_fil_iovar_int_set(ifp, "toe_ol", toe_ol);
417         if (err < 0) {
418                 brcmf_err("Setting toe_ol failed, %d\n", err);
419                 return err;
420         }
421
422         err = brcmf_fil_iovar_int_set(ifp, "toe", (toe_ol != 0));
423         if (err < 0)
424                 brcmf_err("Setting toe failed, %d\n", err);
425
426         return err;
427
428 }
429
430 static void brcmf_ethtool_get_drvinfo(struct net_device *ndev,
431                                     struct ethtool_drvinfo *info)
432 {
433         struct brcmf_if *ifp = netdev_priv(ndev);
434         struct brcmf_pub *drvr = ifp->drvr;
435
436         strlcpy(info->driver, KBUILD_MODNAME, sizeof(info->driver));
437         snprintf(info->version, sizeof(info->version), "%lu",
438                  drvr->drv_version);
439         strlcpy(info->bus_info, dev_name(drvr->bus_if->dev),
440                 sizeof(info->bus_info));
441 }
442
443 static const struct ethtool_ops brcmf_ethtool_ops = {
444         .get_drvinfo = brcmf_ethtool_get_drvinfo,
445 };
446
447 static int brcmf_ethtool(struct brcmf_if *ifp, void __user *uaddr)
448 {
449         struct brcmf_pub *drvr = ifp->drvr;
450         struct ethtool_drvinfo info;
451         char drvname[sizeof(info.driver)];
452         u32 cmd;
453         struct ethtool_value edata;
454         u32 toe_cmpnt, csum_dir;
455         int ret;
456
457         brcmf_dbg(TRACE, "Enter, idx=%d\n", ifp->bssidx);
458
459         /* all ethtool calls start with a cmd word */
460         if (copy_from_user(&cmd, uaddr, sizeof(u32)))
461                 return -EFAULT;
462
463         switch (cmd) {
464         case ETHTOOL_GDRVINFO:
465                 /* Copy out any request driver name */
466                 if (copy_from_user(&info, uaddr, sizeof(info)))
467                         return -EFAULT;
468                 strncpy(drvname, info.driver, sizeof(info.driver));
469                 drvname[sizeof(info.driver) - 1] = '\0';
470
471                 /* clear struct for return */
472                 memset(&info, 0, sizeof(info));
473                 info.cmd = cmd;
474
475                 /* if requested, identify ourselves */
476                 if (strcmp(drvname, "?dhd") == 0) {
477                         sprintf(info.driver, "dhd");
478                         strcpy(info.version, BRCMF_VERSION_STR);
479                 }
480                 /* report dongle driver type */
481                 else
482                         sprintf(info.driver, "wl");
483
484                 sprintf(info.version, "%lu", drvr->drv_version);
485                 if (copy_to_user(uaddr, &info, sizeof(info)))
486                         return -EFAULT;
487                 brcmf_dbg(TRACE, "given %*s, returning %s\n",
488                           (int)sizeof(drvname), drvname, info.driver);
489                 break;
490
491                 /* Get toe offload components from dongle */
492         case ETHTOOL_GRXCSUM:
493         case ETHTOOL_GTXCSUM:
494                 ret = brcmf_fil_iovar_int_get(ifp, "toe_ol", &toe_cmpnt);
495                 if (ret < 0)
496                         return ret;
497
498                 csum_dir =
499                     (cmd == ETHTOOL_GTXCSUM) ? TOE_TX_CSUM_OL : TOE_RX_CSUM_OL;
500
501                 edata.cmd = cmd;
502                 edata.data = (toe_cmpnt & csum_dir) ? 1 : 0;
503
504                 if (copy_to_user(uaddr, &edata, sizeof(edata)))
505                         return -EFAULT;
506                 break;
507
508                 /* Set toe offload components in dongle */
509         case ETHTOOL_SRXCSUM:
510         case ETHTOOL_STXCSUM:
511                 if (copy_from_user(&edata, uaddr, sizeof(edata)))
512                         return -EFAULT;
513
514                 /* Read the current settings, update and write back */
515                 ret = brcmf_fil_iovar_int_get(ifp, "toe_ol", &toe_cmpnt);
516                 if (ret < 0)
517                         return ret;
518
519                 csum_dir =
520                     (cmd == ETHTOOL_STXCSUM) ? TOE_TX_CSUM_OL : TOE_RX_CSUM_OL;
521
522                 if (edata.data != 0)
523                         toe_cmpnt |= csum_dir;
524                 else
525                         toe_cmpnt &= ~csum_dir;
526
527                 ret = brcmf_toe_set(ifp, toe_cmpnt);
528                 if (ret < 0)
529                         return ret;
530
531                 /* If setting TX checksum mode, tell Linux the new mode */
532                 if (cmd == ETHTOOL_STXCSUM) {
533                         if (edata.data)
534                                 ifp->ndev->features |= NETIF_F_IP_CSUM;
535                         else
536                                 ifp->ndev->features &= ~NETIF_F_IP_CSUM;
537                 }
538
539                 break;
540
541         default:
542                 return -EOPNOTSUPP;
543         }
544
545         return 0;
546 }
547
548 static int brcmf_netdev_ioctl_entry(struct net_device *ndev, struct ifreq *ifr,
549                                     int cmd)
550 {
551         struct brcmf_if *ifp = netdev_priv(ndev);
552         struct brcmf_pub *drvr = ifp->drvr;
553
554         brcmf_dbg(TRACE, "Enter, idx=%d, cmd=0x%04x\n", ifp->bssidx, cmd);
555
556         if (!drvr->iflist[ifp->bssidx])
557                 return -1;
558
559         if (cmd == SIOCETHTOOL)
560                 return brcmf_ethtool(ifp, ifr->ifr_data);
561
562         return -EOPNOTSUPP;
563 }
564
565 static int brcmf_netdev_stop(struct net_device *ndev)
566 {
567         struct brcmf_if *ifp = netdev_priv(ndev);
568
569         brcmf_dbg(TRACE, "Enter, idx=%d\n", ifp->bssidx);
570
571         brcmf_cfg80211_down(ndev);
572
573         /* Set state and stop OS transmissions */
574         netif_stop_queue(ndev);
575
576         return 0;
577 }
578
579 static int brcmf_netdev_open(struct net_device *ndev)
580 {
581         struct brcmf_if *ifp = netdev_priv(ndev);
582         struct brcmf_pub *drvr = ifp->drvr;
583         struct brcmf_bus *bus_if = drvr->bus_if;
584         u32 toe_ol;
585         s32 ret = 0;
586
587         brcmf_dbg(TRACE, "Enter, idx=%d\n", ifp->bssidx);
588
589         /* If bus is not ready, can't continue */
590         if (bus_if->state != BRCMF_BUS_DATA) {
591                 brcmf_err("failed bus is not ready\n");
592                 return -EAGAIN;
593         }
594
595         atomic_set(&ifp->pend_8021x_cnt, 0);
596
597         /* Get current TOE mode from dongle */
598         if (brcmf_fil_iovar_int_get(ifp, "toe_ol", &toe_ol) >= 0
599             && (toe_ol & TOE_TX_CSUM_OL) != 0)
600                 ndev->features |= NETIF_F_IP_CSUM;
601         else
602                 ndev->features &= ~NETIF_F_IP_CSUM;
603
604         /* Allow transmit calls */
605         netif_start_queue(ndev);
606         if (brcmf_cfg80211_up(ndev)) {
607                 brcmf_err("failed to bring up cfg80211\n");
608                 return -1;
609         }
610
611         return ret;
612 }
613
614 static const struct net_device_ops brcmf_netdev_ops_pri = {
615         .ndo_open = brcmf_netdev_open,
616         .ndo_stop = brcmf_netdev_stop,
617         .ndo_get_stats = brcmf_netdev_get_stats,
618         .ndo_do_ioctl = brcmf_netdev_ioctl_entry,
619         .ndo_start_xmit = brcmf_netdev_start_xmit,
620         .ndo_set_mac_address = brcmf_netdev_set_mac_address,
621         .ndo_set_rx_mode = brcmf_netdev_set_multicast_list
622 };
623
624 int brcmf_net_attach(struct brcmf_if *ifp, bool rtnl_locked)
625 {
626         struct brcmf_pub *drvr = ifp->drvr;
627         struct net_device *ndev;
628         s32 err;
629
630         brcmf_dbg(TRACE, "Enter, idx=%d mac=%pM\n", ifp->bssidx,
631                   ifp->mac_addr);
632         ndev = ifp->ndev;
633
634         /* set appropriate operations */
635         ndev->netdev_ops = &brcmf_netdev_ops_pri;
636
637         ndev->hard_header_len = ETH_HLEN + drvr->hdrlen;
638         ndev->ethtool_ops = &brcmf_ethtool_ops;
639
640         drvr->rxsz = ndev->mtu + ndev->hard_header_len +
641                               drvr->hdrlen;
642
643         /* set the mac address */
644         memcpy(ndev->dev_addr, ifp->mac_addr, ETH_ALEN);
645
646         INIT_WORK(&ifp->setmacaddr_work, _brcmf_set_mac_address);
647         INIT_WORK(&ifp->multicast_work, _brcmf_set_multicast_list);
648
649         if (rtnl_locked)
650                 err = register_netdevice(ndev);
651         else
652                 err = register_netdev(ndev);
653         if (err != 0) {
654                 brcmf_err("couldn't register the net device\n");
655                 goto fail;
656         }
657
658         brcmf_dbg(INFO, "%s: Broadcom Dongle Host Driver\n", ndev->name);
659
660         return 0;
661
662 fail:
663         ndev->netdev_ops = NULL;
664         return -EBADE;
665 }
666
667 static int brcmf_net_p2p_open(struct net_device *ndev)
668 {
669         brcmf_dbg(TRACE, "Enter\n");
670
671         return brcmf_cfg80211_up(ndev);
672 }
673
674 static int brcmf_net_p2p_stop(struct net_device *ndev)
675 {
676         brcmf_dbg(TRACE, "Enter\n");
677
678         return brcmf_cfg80211_down(ndev);
679 }
680
681 static int brcmf_net_p2p_do_ioctl(struct net_device *ndev,
682                                   struct ifreq *ifr, int cmd)
683 {
684         brcmf_dbg(TRACE, "Enter\n");
685         return 0;
686 }
687
688 static netdev_tx_t brcmf_net_p2p_start_xmit(struct sk_buff *skb,
689                                             struct net_device *ndev)
690 {
691         if (skb)
692                 dev_kfree_skb_any(skb);
693
694         return NETDEV_TX_OK;
695 }
696
697 static const struct net_device_ops brcmf_netdev_ops_p2p = {
698         .ndo_open = brcmf_net_p2p_open,
699         .ndo_stop = brcmf_net_p2p_stop,
700         .ndo_do_ioctl = brcmf_net_p2p_do_ioctl,
701         .ndo_start_xmit = brcmf_net_p2p_start_xmit
702 };
703
704 static int brcmf_net_p2p_attach(struct brcmf_if *ifp)
705 {
706         struct net_device *ndev;
707
708         brcmf_dbg(TRACE, "Enter, idx=%d mac=%pM\n", ifp->bssidx,
709                   ifp->mac_addr);
710         ndev = ifp->ndev;
711
712         ndev->netdev_ops = &brcmf_netdev_ops_p2p;
713
714         /* set the mac address */
715         memcpy(ndev->dev_addr, ifp->mac_addr, ETH_ALEN);
716
717         if (register_netdev(ndev) != 0) {
718                 brcmf_err("couldn't register the p2p net device\n");
719                 goto fail;
720         }
721
722         brcmf_dbg(INFO, "%s: Broadcom Dongle Host Driver\n", ndev->name);
723
724         return 0;
725
726 fail:
727         return -EBADE;
728 }
729
730 struct brcmf_if *brcmf_add_if(struct brcmf_pub *drvr, s32 bssidx, s32 ifidx,
731                               char *name, u8 *mac_addr)
732 {
733         struct brcmf_if *ifp;
734         struct net_device *ndev;
735
736         brcmf_dbg(TRACE, "Enter, idx=%d, ifidx=%d\n", bssidx, ifidx);
737
738         ifp = drvr->iflist[bssidx];
739         /*
740          * Delete the existing interface before overwriting it
741          * in case we missed the BRCMF_E_IF_DEL event.
742          */
743         if (ifp) {
744                 brcmf_err("ERROR: netdev:%s already exists\n",
745                           ifp->ndev->name);
746                 if (ifidx) {
747                         netif_stop_queue(ifp->ndev);
748                         unregister_netdev(ifp->ndev);
749                         free_netdev(ifp->ndev);
750                         drvr->iflist[bssidx] = NULL;
751                 } else {
752                         brcmf_err("ignore IF event\n");
753                         return ERR_PTR(-EINVAL);
754                 }
755         }
756
757         /* Allocate netdev, including space for private structure */
758         ndev = alloc_netdev(sizeof(struct brcmf_if), name, ether_setup);
759         if (!ndev) {
760                 brcmf_err("OOM - alloc_netdev\n");
761                 return ERR_PTR(-ENOMEM);
762         }
763
764         ifp = netdev_priv(ndev);
765         ifp->ndev = ndev;
766         ifp->drvr = drvr;
767         drvr->iflist[bssidx] = ifp;
768         ifp->ifidx = ifidx;
769         ifp->bssidx = bssidx;
770
771         init_waitqueue_head(&ifp->pend_8021x_wait);
772
773         if (mac_addr != NULL)
774                 memcpy(ifp->mac_addr, mac_addr, ETH_ALEN);
775
776         brcmf_dbg(TRACE, " ==== pid:%x, if:%s (%pM) created ===\n",
777                   current->pid, ifp->ndev->name, ifp->mac_addr);
778
779         return ifp;
780 }
781
782 void brcmf_del_if(struct brcmf_pub *drvr, s32 bssidx)
783 {
784         struct brcmf_if *ifp;
785
786         ifp = drvr->iflist[bssidx];
787         if (!ifp) {
788                 brcmf_err("Null interface, idx=%d\n", bssidx);
789                 return;
790         }
791         brcmf_dbg(TRACE, "Enter, idx=%d, ifidx=%d\n", bssidx, ifp->ifidx);
792         if (ifp->ndev) {
793                 if (bssidx == 0) {
794                         if (ifp->ndev->netdev_ops == &brcmf_netdev_ops_pri) {
795                                 rtnl_lock();
796                                 brcmf_netdev_stop(ifp->ndev);
797                                 rtnl_unlock();
798                         }
799                 } else {
800                         netif_stop_queue(ifp->ndev);
801                 }
802
803                 if (ifp->ndev->netdev_ops == &brcmf_netdev_ops_pri) {
804                         cancel_work_sync(&ifp->setmacaddr_work);
805                         cancel_work_sync(&ifp->multicast_work);
806                 }
807
808                 unregister_netdev(ifp->ndev);
809                 drvr->iflist[bssidx] = NULL;
810                 if (bssidx == 0)
811                         brcmf_cfg80211_detach(drvr->config);
812                 free_netdev(ifp->ndev);
813         }
814 }
815
816 int brcmf_attach(uint bus_hdrlen, struct device *dev)
817 {
818         struct brcmf_pub *drvr = NULL;
819         int ret = 0;
820
821         brcmf_dbg(TRACE, "Enter\n");
822
823         /* Allocate primary brcmf_info */
824         drvr = kzalloc(sizeof(struct brcmf_pub), GFP_ATOMIC);
825         if (!drvr)
826                 return -ENOMEM;
827
828         mutex_init(&drvr->proto_block);
829
830         /* Link to bus module */
831         drvr->hdrlen = bus_hdrlen;
832         drvr->bus_if = dev_get_drvdata(dev);
833         drvr->bus_if->drvr = drvr;
834
835         /* create device debugfs folder */
836         brcmf_debugfs_attach(drvr);
837
838         /* Attach and link in the protocol */
839         ret = brcmf_proto_attach(drvr);
840         if (ret != 0) {
841                 brcmf_err("brcmf_prot_attach failed\n");
842                 goto fail;
843         }
844
845         /* attach firmware event handler */
846         brcmf_fweh_attach(drvr);
847
848         INIT_LIST_HEAD(&drvr->bus_if->dcmd_list);
849
850         return ret;
851
852 fail:
853         brcmf_detach(dev);
854
855         return ret;
856 }
857
858 int brcmf_bus_start(struct device *dev)
859 {
860         int ret = -1;
861         struct brcmf_bus *bus_if = dev_get_drvdata(dev);
862         struct brcmf_pub *drvr = bus_if->drvr;
863         struct brcmf_if *ifp;
864         struct brcmf_if *p2p_ifp;
865
866         brcmf_dbg(TRACE, "\n");
867
868         /* Bring up the bus */
869         ret = brcmf_bus_init(bus_if);
870         if (ret != 0) {
871                 brcmf_err("brcmf_sdbrcm_bus_init failed %d\n", ret);
872                 return ret;
873         }
874
875         /* add primary networking interface */
876         ifp = brcmf_add_if(drvr, 0, 0, "wlan%d", NULL);
877         if (IS_ERR(ifp))
878                 return PTR_ERR(ifp);
879
880         if (brcmf_p2p_enable)
881                 p2p_ifp = brcmf_add_if(drvr, 1, 0, "p2p%d", NULL);
882         else
883                 p2p_ifp = NULL;
884         if (IS_ERR(p2p_ifp))
885                 p2p_ifp = NULL;
886
887         /* signal bus ready */
888         bus_if->state = BRCMF_BUS_DATA;
889
890         /* Bus is ready, do any initialization */
891         ret = brcmf_c_preinit_dcmds(ifp);
892         if (ret < 0)
893                 goto fail;
894
895         drvr->fw_signals = true;
896         (void)brcmf_fws_init(drvr);
897         brcmf_fws_add_interface(ifp);
898
899         drvr->config = brcmf_cfg80211_attach(drvr, bus_if->dev);
900         if (drvr->config == NULL) {
901                 ret = -ENOMEM;
902                 goto fail;
903         }
904
905         ret = brcmf_fweh_activate_events(ifp);
906         if (ret < 0)
907                 goto fail;
908
909         ret = brcmf_net_attach(ifp, false);
910 fail:
911         if (ret < 0) {
912                 brcmf_err("failed: %d\n", ret);
913                 if (drvr->config)
914                         brcmf_cfg80211_detach(drvr->config);
915                 if (drvr->fws) {
916                         brcmf_fws_del_interface(ifp);
917                         brcmf_fws_deinit(drvr);
918                 }
919                 free_netdev(ifp->ndev);
920                 drvr->iflist[0] = NULL;
921                 if (p2p_ifp) {
922                         free_netdev(p2p_ifp->ndev);
923                         drvr->iflist[1] = NULL;
924                 }
925                 return ret;
926         }
927         if ((brcmf_p2p_enable) && (p2p_ifp))
928                 brcmf_net_p2p_attach(p2p_ifp);
929
930         return 0;
931 }
932
933 static void brcmf_bus_detach(struct brcmf_pub *drvr)
934 {
935         brcmf_dbg(TRACE, "Enter\n");
936
937         if (drvr) {
938                 /* Stop the protocol module */
939                 brcmf_proto_stop(drvr);
940
941                 /* Stop the bus module */
942                 brcmf_bus_stop(drvr->bus_if);
943         }
944 }
945
946 void brcmf_dev_reset(struct device *dev)
947 {
948         struct brcmf_bus *bus_if = dev_get_drvdata(dev);
949         struct brcmf_pub *drvr = bus_if->drvr;
950
951         if (drvr == NULL)
952                 return;
953
954         if (drvr->iflist[0])
955                 brcmf_fil_cmd_int_set(drvr->iflist[0], BRCMF_C_TERMINATED, 1);
956 }
957
958 void brcmf_detach(struct device *dev)
959 {
960         s32 i;
961         struct brcmf_bus *bus_if = dev_get_drvdata(dev);
962         struct brcmf_pub *drvr = bus_if->drvr;
963
964         brcmf_dbg(TRACE, "Enter\n");
965
966         if (drvr == NULL)
967                 return;
968
969         /* stop firmware event handling */
970         brcmf_fweh_detach(drvr);
971
972         /* make sure primary interface removed last */
973         for (i = BRCMF_MAX_IFS-1; i > -1; i--)
974                 if (drvr->iflist[i]) {
975                         brcmf_fws_del_interface(drvr->iflist[i]);
976                         brcmf_del_if(drvr, i);
977                 }
978
979         brcmf_bus_detach(drvr);
980
981         if (drvr->prot)
982                 brcmf_proto_detach(drvr);
983
984         if (drvr->fws)
985                 brcmf_fws_deinit(drvr);
986
987         brcmf_debugfs_detach(drvr);
988         bus_if->drvr = NULL;
989         kfree(drvr);
990 }
991
992 static int brcmf_get_pend_8021x_cnt(struct brcmf_if *ifp)
993 {
994         return atomic_read(&ifp->pend_8021x_cnt);
995 }
996
997 int brcmf_netdev_wait_pend8021x(struct net_device *ndev)
998 {
999         struct brcmf_if *ifp = netdev_priv(ndev);
1000         int err;
1001
1002         err = wait_event_timeout(ifp->pend_8021x_wait,
1003                                  !brcmf_get_pend_8021x_cnt(ifp),
1004                                  msecs_to_jiffies(MAX_WAIT_FOR_8021X_TX));
1005
1006         WARN_ON(!err);
1007
1008         return !err;
1009 }
1010
1011 /*
1012  * return chip id and rev of the device encoded in u32.
1013  */
1014 u32 brcmf_get_chip_info(struct brcmf_if *ifp)
1015 {
1016         struct brcmf_bus *bus = ifp->drvr->bus_if;
1017
1018         return bus->chip << 4 | bus->chiprev;
1019 }
1020
1021 static void brcmf_driver_init(struct work_struct *work)
1022 {
1023         brcmf_debugfs_init();
1024
1025 #ifdef CONFIG_BRCMFMAC_SDIO
1026         brcmf_sdio_init();
1027 #endif
1028 #ifdef CONFIG_BRCMFMAC_USB
1029         brcmf_usb_init();
1030 #endif
1031 }
1032 static DECLARE_WORK(brcmf_driver_work, brcmf_driver_init);
1033
1034 static int __init brcmfmac_module_init(void)
1035 {
1036         if (!schedule_work(&brcmf_driver_work))
1037                 return -EBUSY;
1038
1039         return 0;
1040 }
1041
1042 static void __exit brcmfmac_module_exit(void)
1043 {
1044         cancel_work_sync(&brcmf_driver_work);
1045
1046 #ifdef CONFIG_BRCMFMAC_SDIO
1047         brcmf_sdio_exit();
1048 #endif
1049 #ifdef CONFIG_BRCMFMAC_USB
1050         brcmf_usb_exit();
1051 #endif
1052         brcmf_debugfs_exit();
1053 }
1054
1055 module_init(brcmfmac_module_init);
1056 module_exit(brcmfmac_module_exit);