2 * Copyright (c) 2010 Broadcom Corporation
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.
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.
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>
25 #include <brcmu_utils.h>
26 #include <brcmu_wifi.h>
31 #include "fwil_types.h"
41 #define MAX_WAIT_FOR_8021X_TX msecs_to_jiffies(950)
43 #define BRCMF_BSSIDX_INVALID -1
45 char *brcmf_ifname(struct brcmf_if
*ifp
)
51 return ifp
->ndev
->name
;
56 struct brcmf_if
*brcmf_get_ifp(struct brcmf_pub
*drvr
, int ifidx
)
61 if (ifidx
< 0 || ifidx
>= BRCMF_MAX_IFS
) {
62 brcmf_err("ifidx %d out of range\n", ifidx
);
67 bsscfgidx
= drvr
->if2bss
[ifidx
];
69 ifp
= drvr
->iflist
[bsscfgidx
];
74 static void _brcmf_set_multicast_list(struct work_struct
*work
)
77 struct net_device
*ndev
;
78 struct netdev_hw_addr
*ha
;
85 ifp
= container_of(work
, struct brcmf_if
, multicast_work
);
87 brcmf_dbg(TRACE
, "Enter, bsscfgidx=%d\n", ifp
->bsscfgidx
);
91 /* Determine initial value of allmulti flag */
92 cmd_value
= (ndev
->flags
& IFF_ALLMULTI
) ? true : false;
94 /* Send down the multicast list first. */
95 cnt
= netdev_mc_count(ndev
);
96 buflen
= sizeof(cnt
) + (cnt
* ETH_ALEN
);
97 buf
= kmalloc(buflen
, GFP_ATOMIC
);
102 cnt_le
= cpu_to_le32(cnt
);
103 memcpy(bufp
, &cnt_le
, sizeof(cnt_le
));
104 bufp
+= sizeof(cnt_le
);
106 netdev_for_each_mc_addr(ha
, ndev
) {
109 memcpy(bufp
, ha
->addr
, ETH_ALEN
);
114 err
= brcmf_fil_iovar_data_set(ifp
, "mcast_list", buf
, buflen
);
116 brcmf_err("Setting mcast_list failed, %d\n", err
);
117 cmd_value
= cnt
? true : cmd_value
;
123 * Now send the allmulti setting. This is based on the setting in the
124 * net_device flags, but might be modified above to be turned on if we
125 * were trying to set some addresses and dongle rejected it...
127 err
= brcmf_fil_iovar_int_set(ifp
, "allmulti", cmd_value
);
129 brcmf_err("Setting allmulti failed, %d\n", err
);
131 /*Finally, pick up the PROMISC flag */
132 cmd_value
= (ndev
->flags
& IFF_PROMISC
) ? true : false;
133 err
= brcmf_fil_cmd_int_set(ifp
, BRCMF_C_SET_PROMISC
, cmd_value
);
135 brcmf_err("Setting BRCMF_C_SET_PROMISC failed, %d\n",
139 #if IS_ENABLED(CONFIG_IPV6)
140 static void _brcmf_update_ndtable(struct work_struct
*work
)
142 struct brcmf_if
*ifp
;
145 ifp
= container_of(work
, struct brcmf_if
, ndoffload_work
);
147 /* clear the table in firmware */
148 ret
= brcmf_fil_iovar_data_set(ifp
, "nd_hostip_clear", NULL
, 0);
150 brcmf_dbg(TRACE
, "fail to clear nd ip table err:%d\n", ret
);
154 for (i
= 0; i
< ifp
->ipv6addr_idx
; i
++) {
155 ret
= brcmf_fil_iovar_data_set(ifp
, "nd_hostip",
156 &ifp
->ipv6_addr_tbl
[i
],
157 sizeof(struct in6_addr
));
159 brcmf_err("add nd ip err %d\n", ret
);
163 static void _brcmf_update_ndtable(struct work_struct
*work
)
168 static int brcmf_netdev_set_mac_address(struct net_device
*ndev
, void *addr
)
170 struct brcmf_if
*ifp
= netdev_priv(ndev
);
171 struct sockaddr
*sa
= (struct sockaddr
*)addr
;
174 brcmf_dbg(TRACE
, "Enter, bsscfgidx=%d\n", ifp
->bsscfgidx
);
176 err
= brcmf_fil_iovar_data_set(ifp
, "cur_etheraddr", sa
->sa_data
,
179 brcmf_err("Setting cur_etheraddr failed, %d\n", err
);
181 brcmf_dbg(TRACE
, "updated to %pM\n", sa
->sa_data
);
182 memcpy(ifp
->mac_addr
, sa
->sa_data
, ETH_ALEN
);
183 memcpy(ifp
->ndev
->dev_addr
, ifp
->mac_addr
, ETH_ALEN
);
188 static void brcmf_netdev_set_multicast_list(struct net_device
*ndev
)
190 struct brcmf_if
*ifp
= netdev_priv(ndev
);
192 schedule_work(&ifp
->multicast_work
);
195 static netdev_tx_t
brcmf_netdev_start_xmit(struct sk_buff
*skb
,
196 struct net_device
*ndev
)
199 struct brcmf_if
*ifp
= netdev_priv(ndev
);
200 struct brcmf_pub
*drvr
= ifp
->drvr
;
201 struct ethhdr
*eh
= (struct ethhdr
*)(skb
->data
);
203 brcmf_dbg(DATA
, "Enter, bsscfgidx=%d\n", ifp
->bsscfgidx
);
205 /* Can the device send data? */
206 if (drvr
->bus_if
->state
!= BRCMF_BUS_UP
) {
207 brcmf_err("xmit rejected state=%d\n", drvr
->bus_if
->state
);
208 netif_stop_queue(ndev
);
214 /* Make sure there's enough room for any header */
215 if (skb_headroom(skb
) < drvr
->hdrlen
) {
216 struct sk_buff
*skb2
;
218 brcmf_dbg(INFO
, "%s: insufficient headroom\n",
220 drvr
->bus_if
->tx_realloc
++;
221 skb2
= skb_realloc_headroom(skb
, drvr
->hdrlen
);
225 brcmf_err("%s: skb_realloc_headroom failed\n",
232 /* validate length for ether packet */
233 if (skb
->len
< sizeof(*eh
)) {
239 if (eh
->h_proto
== htons(ETH_P_PAE
))
240 atomic_inc(&ifp
->pend_8021x_cnt
);
242 /* determine the priority */
243 if ((skb
->priority
== 0) || (skb
->priority
> 7))
244 skb
->priority
= cfg80211_classify8021d(skb
, NULL
);
246 ret
= brcmf_proto_tx_queue_data(drvr
, ifp
->ifidx
, skb
);
248 brcmf_txfinalize(ifp
, skb
, false);
252 ndev
->stats
.tx_dropped
++;
254 ndev
->stats
.tx_packets
++;
255 ndev
->stats
.tx_bytes
+= skb
->len
;
258 /* Return ok: we always eat the packet */
262 void brcmf_txflowblock_if(struct brcmf_if
*ifp
,
263 enum brcmf_netif_stop_reason reason
, bool state
)
267 if (!ifp
|| !ifp
->ndev
)
270 brcmf_dbg(TRACE
, "enter: bsscfgidx=%d stop=0x%X reason=%d state=%d\n",
271 ifp
->bsscfgidx
, ifp
->netif_stop
, reason
, state
);
273 spin_lock_irqsave(&ifp
->netif_stop_lock
, flags
);
275 if (!ifp
->netif_stop
)
276 netif_stop_queue(ifp
->ndev
);
277 ifp
->netif_stop
|= reason
;
279 ifp
->netif_stop
&= ~reason
;
280 if (!ifp
->netif_stop
)
281 netif_wake_queue(ifp
->ndev
);
283 spin_unlock_irqrestore(&ifp
->netif_stop_lock
, flags
);
286 void brcmf_txflowblock(struct device
*dev
, bool state
)
288 struct brcmf_bus
*bus_if
= dev_get_drvdata(dev
);
289 struct brcmf_pub
*drvr
= bus_if
->drvr
;
291 brcmf_dbg(TRACE
, "Enter\n");
293 brcmf_fws_bus_blocked(drvr
, state
);
296 void brcmf_netif_rx(struct brcmf_if
*ifp
, struct sk_buff
*skb
)
298 if (skb
->pkt_type
== PACKET_MULTICAST
)
299 ifp
->ndev
->stats
.multicast
++;
301 if (!(ifp
->ndev
->flags
& IFF_UP
)) {
302 brcmu_pkt_buf_free_skb(skb
);
306 ifp
->ndev
->stats
.rx_bytes
+= skb
->len
;
307 ifp
->ndev
->stats
.rx_packets
++;
309 brcmf_dbg(DATA
, "rx proto=0x%X\n", ntohs(skb
->protocol
));
313 /* If the receive is not processed inside an ISR,
314 * the softirqd must be woken explicitly to service
315 * the NET_RX_SOFTIRQ. This is handled by netif_rx_ni().
320 static int brcmf_rx_hdrpull(struct brcmf_pub
*drvr
, struct sk_buff
*skb
,
321 struct brcmf_if
**ifp
)
325 /* process and remove protocol-specific header */
326 ret
= brcmf_proto_hdrpull(drvr
, true, skb
, ifp
);
328 if (ret
|| !(*ifp
) || !(*ifp
)->ndev
) {
329 if (ret
!= -ENODATA
&& *ifp
)
330 (*ifp
)->ndev
->stats
.rx_errors
++;
331 brcmu_pkt_buf_free_skb(skb
);
335 skb
->protocol
= eth_type_trans(skb
, (*ifp
)->ndev
);
339 void brcmf_rx_frame(struct device
*dev
, struct sk_buff
*skb
, bool handle_event
)
341 struct brcmf_if
*ifp
;
342 struct brcmf_bus
*bus_if
= dev_get_drvdata(dev
);
343 struct brcmf_pub
*drvr
= bus_if
->drvr
;
345 brcmf_dbg(DATA
, "Enter: %s: rxp=%p\n", dev_name(dev
), skb
);
347 if (brcmf_rx_hdrpull(drvr
, skb
, &ifp
))
350 if (brcmf_proto_is_reorder_skb(skb
)) {
351 brcmf_proto_rxreorder(ifp
, skb
);
353 /* Process special event packets */
355 brcmf_fweh_process_skb(ifp
->drvr
, skb
);
357 brcmf_netif_rx(ifp
, skb
);
361 void brcmf_rx_event(struct device
*dev
, struct sk_buff
*skb
)
363 struct brcmf_if
*ifp
;
364 struct brcmf_bus
*bus_if
= dev_get_drvdata(dev
);
365 struct brcmf_pub
*drvr
= bus_if
->drvr
;
367 brcmf_dbg(EVENT
, "Enter: %s: rxp=%p\n", dev_name(dev
), skb
);
369 if (brcmf_rx_hdrpull(drvr
, skb
, &ifp
))
372 brcmf_fweh_process_skb(ifp
->drvr
, skb
);
373 brcmu_pkt_buf_free_skb(skb
);
376 void brcmf_txfinalize(struct brcmf_if
*ifp
, struct sk_buff
*txp
, bool success
)
381 eh
= (struct ethhdr
*)(txp
->data
);
382 type
= ntohs(eh
->h_proto
);
384 if (type
== ETH_P_PAE
) {
385 atomic_dec(&ifp
->pend_8021x_cnt
);
386 if (waitqueue_active(&ifp
->pend_8021x_wait
))
387 wake_up(&ifp
->pend_8021x_wait
);
391 ifp
->ndev
->stats
.tx_errors
++;
393 brcmu_pkt_buf_free_skb(txp
);
396 void brcmf_txcomplete(struct device
*dev
, struct sk_buff
*txp
, bool success
)
398 struct brcmf_bus
*bus_if
= dev_get_drvdata(dev
);
399 struct brcmf_pub
*drvr
= bus_if
->drvr
;
400 struct brcmf_if
*ifp
;
402 /* await txstatus signal for firmware if active */
403 if (brcmf_fws_fc_active(drvr
->fws
)) {
405 brcmf_fws_bustxfail(drvr
->fws
, txp
);
407 if (brcmf_proto_hdrpull(drvr
, false, txp
, &ifp
))
408 brcmu_pkt_buf_free_skb(txp
);
410 brcmf_txfinalize(ifp
, txp
, success
);
414 static void brcmf_ethtool_get_drvinfo(struct net_device
*ndev
,
415 struct ethtool_drvinfo
*info
)
417 struct brcmf_if
*ifp
= netdev_priv(ndev
);
418 struct brcmf_pub
*drvr
= ifp
->drvr
;
419 char drev
[BRCMU_DOTREV_LEN
] = "n/a";
421 if (drvr
->revinfo
.result
== 0)
422 brcmu_dotrev_str(drvr
->revinfo
.driverrev
, drev
);
423 strlcpy(info
->driver
, KBUILD_MODNAME
, sizeof(info
->driver
));
424 strlcpy(info
->version
, drev
, sizeof(info
->version
));
425 strlcpy(info
->fw_version
, drvr
->fwver
, sizeof(info
->fw_version
));
426 strlcpy(info
->bus_info
, dev_name(drvr
->bus_if
->dev
),
427 sizeof(info
->bus_info
));
430 static const struct ethtool_ops brcmf_ethtool_ops
= {
431 .get_drvinfo
= brcmf_ethtool_get_drvinfo
,
434 static int brcmf_netdev_stop(struct net_device
*ndev
)
436 struct brcmf_if
*ifp
= netdev_priv(ndev
);
438 brcmf_dbg(TRACE
, "Enter, bsscfgidx=%d\n", ifp
->bsscfgidx
);
440 brcmf_cfg80211_down(ndev
);
442 brcmf_fil_iovar_data_set(ifp
, "arp_hostip_clear", NULL
, 0);
444 brcmf_net_setcarrier(ifp
, false);
449 static int brcmf_netdev_open(struct net_device
*ndev
)
451 struct brcmf_if
*ifp
= netdev_priv(ndev
);
452 struct brcmf_pub
*drvr
= ifp
->drvr
;
453 struct brcmf_bus
*bus_if
= drvr
->bus_if
;
456 brcmf_dbg(TRACE
, "Enter, bsscfgidx=%d\n", ifp
->bsscfgidx
);
458 /* If bus is not ready, can't continue */
459 if (bus_if
->state
!= BRCMF_BUS_UP
) {
460 brcmf_err("failed bus is not ready\n");
464 atomic_set(&ifp
->pend_8021x_cnt
, 0);
466 /* Get current TOE mode from dongle */
467 if (brcmf_fil_iovar_int_get(ifp
, "toe_ol", &toe_ol
) >= 0
468 && (toe_ol
& TOE_TX_CSUM_OL
) != 0)
469 ndev
->features
|= NETIF_F_IP_CSUM
;
471 ndev
->features
&= ~NETIF_F_IP_CSUM
;
473 if (brcmf_cfg80211_up(ndev
)) {
474 brcmf_err("failed to bring up cfg80211\n");
478 /* Clear, carrier, set when connected or AP mode. */
479 netif_carrier_off(ndev
);
483 static const struct net_device_ops brcmf_netdev_ops_pri
= {
484 .ndo_open
= brcmf_netdev_open
,
485 .ndo_stop
= brcmf_netdev_stop
,
486 .ndo_start_xmit
= brcmf_netdev_start_xmit
,
487 .ndo_set_mac_address
= brcmf_netdev_set_mac_address
,
488 .ndo_set_rx_mode
= brcmf_netdev_set_multicast_list
491 int brcmf_net_attach(struct brcmf_if
*ifp
, bool rtnl_locked
)
493 struct brcmf_pub
*drvr
= ifp
->drvr
;
494 struct net_device
*ndev
;
497 brcmf_dbg(TRACE
, "Enter, bsscfgidx=%d mac=%pM\n", ifp
->bsscfgidx
,
501 /* set appropriate operations */
502 ndev
->netdev_ops
= &brcmf_netdev_ops_pri
;
504 ndev
->needed_headroom
+= drvr
->hdrlen
;
505 ndev
->ethtool_ops
= &brcmf_ethtool_ops
;
507 /* set the mac address */
508 memcpy(ndev
->dev_addr
, ifp
->mac_addr
, ETH_ALEN
);
510 INIT_WORK(&ifp
->multicast_work
, _brcmf_set_multicast_list
);
511 INIT_WORK(&ifp
->ndoffload_work
, _brcmf_update_ndtable
);
514 err
= register_netdevice(ndev
);
516 err
= register_netdev(ndev
);
518 brcmf_err("couldn't register the net device\n");
522 brcmf_dbg(INFO
, "%s: Broadcom Dongle Host Driver\n", ndev
->name
);
526 drvr
->iflist
[ifp
->bsscfgidx
] = NULL
;
527 ndev
->netdev_ops
= NULL
;
532 static void brcmf_net_detach(struct net_device
*ndev
, bool rtnl_locked
)
534 if (ndev
->reg_state
== NETREG_REGISTERED
) {
536 unregister_netdevice(ndev
);
538 unregister_netdev(ndev
);
540 brcmf_cfg80211_free_netdev(ndev
);
544 void brcmf_net_setcarrier(struct brcmf_if
*ifp
, bool on
)
546 struct net_device
*ndev
;
548 brcmf_dbg(TRACE
, "Enter, bsscfgidx=%d carrier=%d\n", ifp
->bsscfgidx
,
552 brcmf_txflowblock_if(ifp
, BRCMF_NETIF_STOP_REASON_DISCONNECTED
, !on
);
554 if (!netif_carrier_ok(ndev
))
555 netif_carrier_on(ndev
);
558 if (netif_carrier_ok(ndev
))
559 netif_carrier_off(ndev
);
563 static int brcmf_net_p2p_open(struct net_device
*ndev
)
565 brcmf_dbg(TRACE
, "Enter\n");
567 return brcmf_cfg80211_up(ndev
);
570 static int brcmf_net_p2p_stop(struct net_device
*ndev
)
572 brcmf_dbg(TRACE
, "Enter\n");
574 return brcmf_cfg80211_down(ndev
);
577 static netdev_tx_t
brcmf_net_p2p_start_xmit(struct sk_buff
*skb
,
578 struct net_device
*ndev
)
581 dev_kfree_skb_any(skb
);
586 static const struct net_device_ops brcmf_netdev_ops_p2p
= {
587 .ndo_open
= brcmf_net_p2p_open
,
588 .ndo_stop
= brcmf_net_p2p_stop
,
589 .ndo_start_xmit
= brcmf_net_p2p_start_xmit
592 static int brcmf_net_p2p_attach(struct brcmf_if
*ifp
)
594 struct net_device
*ndev
;
596 brcmf_dbg(TRACE
, "Enter, bsscfgidx=%d mac=%pM\n", ifp
->bsscfgidx
,
600 ndev
->netdev_ops
= &brcmf_netdev_ops_p2p
;
602 /* set the mac address */
603 memcpy(ndev
->dev_addr
, ifp
->mac_addr
, ETH_ALEN
);
605 if (register_netdev(ndev
) != 0) {
606 brcmf_err("couldn't register the p2p net device\n");
610 brcmf_dbg(INFO
, "%s: Broadcom Dongle Host Driver\n", ndev
->name
);
615 ifp
->drvr
->iflist
[ifp
->bsscfgidx
] = NULL
;
616 ndev
->netdev_ops
= NULL
;
621 struct brcmf_if
*brcmf_add_if(struct brcmf_pub
*drvr
, s32 bsscfgidx
, s32 ifidx
,
622 bool is_p2pdev
, const char *name
, u8
*mac_addr
)
624 struct brcmf_if
*ifp
;
625 struct net_device
*ndev
;
627 brcmf_dbg(TRACE
, "Enter, bsscfgidx=%d, ifidx=%d\n", bsscfgidx
, ifidx
);
629 ifp
= drvr
->iflist
[bsscfgidx
];
631 * Delete the existing interface before overwriting it
632 * in case we missed the BRCMF_E_IF_DEL event.
636 brcmf_err("ERROR: netdev:%s already exists\n",
638 netif_stop_queue(ifp
->ndev
);
639 brcmf_net_detach(ifp
->ndev
, false);
640 drvr
->iflist
[bsscfgidx
] = NULL
;
642 brcmf_dbg(INFO
, "netdev:%s ignore IF event\n",
644 return ERR_PTR(-EINVAL
);
648 if (!drvr
->settings
->p2p_enable
&& is_p2pdev
) {
649 /* this is P2P_DEVICE interface */
650 brcmf_dbg(INFO
, "allocate non-netdev interface\n");
651 ifp
= kzalloc(sizeof(*ifp
), GFP_KERNEL
);
653 return ERR_PTR(-ENOMEM
);
655 brcmf_dbg(INFO
, "allocate netdev interface\n");
656 /* Allocate netdev, including space for private structure */
657 ndev
= alloc_netdev(sizeof(*ifp
), is_p2pdev
? "p2p%d" : name
,
658 NET_NAME_UNKNOWN
, ether_setup
);
660 return ERR_PTR(-ENOMEM
);
662 ndev
->destructor
= brcmf_cfg80211_free_netdev
;
663 ifp
= netdev_priv(ndev
);
665 /* store mapping ifidx to bsscfgidx */
666 if (drvr
->if2bss
[ifidx
] == BRCMF_BSSIDX_INVALID
)
667 drvr
->if2bss
[ifidx
] = bsscfgidx
;
671 drvr
->iflist
[bsscfgidx
] = ifp
;
673 ifp
->bsscfgidx
= bsscfgidx
;
675 init_waitqueue_head(&ifp
->pend_8021x_wait
);
676 spin_lock_init(&ifp
->netif_stop_lock
);
678 if (mac_addr
!= NULL
)
679 memcpy(ifp
->mac_addr
, mac_addr
, ETH_ALEN
);
681 brcmf_dbg(TRACE
, " ==== pid:%x, if:%s (%pM) created ===\n",
682 current
->pid
, name
, ifp
->mac_addr
);
687 static void brcmf_del_if(struct brcmf_pub
*drvr
, s32 bsscfgidx
,
690 struct brcmf_if
*ifp
;
692 ifp
= drvr
->iflist
[bsscfgidx
];
693 drvr
->iflist
[bsscfgidx
] = NULL
;
695 brcmf_err("Null interface, bsscfgidx=%d\n", bsscfgidx
);
698 brcmf_dbg(TRACE
, "Enter, bsscfgidx=%d, ifidx=%d\n", bsscfgidx
,
700 if (drvr
->if2bss
[ifp
->ifidx
] == bsscfgidx
)
701 drvr
->if2bss
[ifp
->ifidx
] = BRCMF_BSSIDX_INVALID
;
703 if (bsscfgidx
== 0) {
704 if (ifp
->ndev
->netdev_ops
== &brcmf_netdev_ops_pri
) {
706 brcmf_netdev_stop(ifp
->ndev
);
710 netif_stop_queue(ifp
->ndev
);
713 if (ifp
->ndev
->netdev_ops
== &brcmf_netdev_ops_pri
) {
714 cancel_work_sync(&ifp
->multicast_work
);
715 cancel_work_sync(&ifp
->ndoffload_work
);
717 brcmf_net_detach(ifp
->ndev
, rtnl_locked
);
719 /* Only p2p device interfaces which get dynamically created
720 * end up here. In this case the p2p module should be informed
721 * about the removal of the interface within the firmware. If
722 * not then p2p commands towards the firmware will cause some
723 * serious troublesome side effects. The p2p module will clean
724 * up the ifp if needed.
726 brcmf_p2p_ifp_removed(ifp
, rtnl_locked
);
731 void brcmf_remove_interface(struct brcmf_if
*ifp
, bool rtnl_locked
)
733 if (!ifp
|| WARN_ON(ifp
->drvr
->iflist
[ifp
->bsscfgidx
] != ifp
))
735 brcmf_dbg(TRACE
, "Enter, bsscfgidx=%d, ifidx=%d\n", ifp
->bsscfgidx
,
737 brcmf_fws_del_interface(ifp
);
738 brcmf_del_if(ifp
->drvr
, ifp
->bsscfgidx
, rtnl_locked
);
742 #define ARPOL_MAX_ENTRIES 8
743 static int brcmf_inetaddr_changed(struct notifier_block
*nb
,
744 unsigned long action
, void *data
)
746 struct brcmf_pub
*drvr
= container_of(nb
, struct brcmf_pub
,
748 struct in_ifaddr
*ifa
= data
;
749 struct net_device
*ndev
= ifa
->ifa_dev
->dev
;
750 struct brcmf_if
*ifp
;
753 __be32 addr_table
[ARPOL_MAX_ENTRIES
] = {0};
755 /* Find out if the notification is meant for us */
756 for (idx
= 0; idx
< BRCMF_MAX_IFS
; idx
++) {
757 ifp
= drvr
->iflist
[idx
];
758 if (ifp
&& ifp
->ndev
== ndev
)
760 if (idx
== BRCMF_MAX_IFS
- 1)
764 /* check if arp offload is supported */
765 ret
= brcmf_fil_iovar_int_get(ifp
, "arpoe", &val
);
769 /* old version only support primary index */
770 ret
= brcmf_fil_iovar_int_get(ifp
, "arp_version", &val
);
774 ifp
= drvr
->iflist
[0];
776 /* retrieve the table from firmware */
777 ret
= brcmf_fil_iovar_data_get(ifp
, "arp_hostip", addr_table
,
780 brcmf_err("fail to get arp ip table err:%d\n", ret
);
784 for (i
= 0; i
< ARPOL_MAX_ENTRIES
; i
++)
785 if (ifa
->ifa_address
== addr_table
[i
])
790 if (i
== ARPOL_MAX_ENTRIES
) {
791 brcmf_dbg(TRACE
, "add %pI4 to arp table\n",
793 /* set it directly */
794 ret
= brcmf_fil_iovar_data_set(ifp
, "arp_hostip",
795 &ifa
->ifa_address
, sizeof(ifa
->ifa_address
));
797 brcmf_err("add arp ip err %d\n", ret
);
801 if (i
< ARPOL_MAX_ENTRIES
) {
803 brcmf_dbg(TRACE
, "remove %pI4 from arp table\n",
805 /* clear the table in firmware */
806 ret
= brcmf_fil_iovar_data_set(ifp
, "arp_hostip_clear",
809 brcmf_err("fail to clear arp ip table err:%d\n",
813 for (i
= 0; i
< ARPOL_MAX_ENTRIES
; i
++) {
814 if (addr_table
[i
] == 0)
816 ret
= brcmf_fil_iovar_data_set(ifp
, "arp_hostip",
818 sizeof(addr_table
[i
]));
820 brcmf_err("add arp ip err %d\n",
833 #if IS_ENABLED(CONFIG_IPV6)
834 static int brcmf_inet6addr_changed(struct notifier_block
*nb
,
835 unsigned long action
, void *data
)
837 struct brcmf_pub
*drvr
= container_of(nb
, struct brcmf_pub
,
839 struct inet6_ifaddr
*ifa
= data
;
840 struct brcmf_if
*ifp
;
842 struct in6_addr
*table
;
844 /* Only handle primary interface */
845 ifp
= drvr
->iflist
[0];
848 if (ifp
->ndev
!= ifa
->idev
->dev
)
851 table
= ifp
->ipv6_addr_tbl
;
852 for (i
= 0; i
< NDOL_MAX_ENTRIES
; i
++)
853 if (ipv6_addr_equal(&ifa
->addr
, &table
[i
]))
858 if (i
== NDOL_MAX_ENTRIES
) {
859 if (ifp
->ipv6addr_idx
< NDOL_MAX_ENTRIES
) {
860 table
[ifp
->ipv6addr_idx
++] = ifa
->addr
;
862 for (i
= 0; i
< NDOL_MAX_ENTRIES
- 1; i
++)
863 table
[i
] = table
[i
+ 1];
864 table
[NDOL_MAX_ENTRIES
- 1] = ifa
->addr
;
869 if (i
< NDOL_MAX_ENTRIES
) {
870 for (; i
< ifp
->ipv6addr_idx
- 1; i
++)
871 table
[i
] = table
[i
+ 1];
872 memset(&table
[i
], 0, sizeof(table
[i
]));
880 schedule_work(&ifp
->ndoffload_work
);
886 int brcmf_attach(struct device
*dev
, struct brcmf_mp_device
*settings
)
888 struct brcmf_pub
*drvr
= NULL
;
892 brcmf_dbg(TRACE
, "Enter\n");
894 /* Allocate primary brcmf_info */
895 drvr
= kzalloc(sizeof(struct brcmf_pub
), GFP_ATOMIC
);
899 for (i
= 0; i
< ARRAY_SIZE(drvr
->if2bss
); i
++)
900 drvr
->if2bss
[i
] = BRCMF_BSSIDX_INVALID
;
902 mutex_init(&drvr
->proto_block
);
904 /* Link to bus module */
906 drvr
->bus_if
= dev_get_drvdata(dev
);
907 drvr
->bus_if
->drvr
= drvr
;
908 drvr
->settings
= settings
;
910 /* attach debug facilities */
911 brcmf_debug_attach(drvr
);
913 /* Attach and link in the protocol */
914 ret
= brcmf_proto_attach(drvr
);
916 brcmf_err("brcmf_prot_attach failed\n");
920 /* attach firmware event handler */
921 brcmf_fweh_attach(drvr
);
931 static int brcmf_revinfo_read(struct seq_file
*s
, void *data
)
933 struct brcmf_bus
*bus_if
= dev_get_drvdata(s
->private);
934 struct brcmf_rev_info
*ri
= &bus_if
->drvr
->revinfo
;
935 char drev
[BRCMU_DOTREV_LEN
];
936 char brev
[BRCMU_BOARDREV_LEN
];
938 seq_printf(s
, "vendorid: 0x%04x\n", ri
->vendorid
);
939 seq_printf(s
, "deviceid: 0x%04x\n", ri
->deviceid
);
940 seq_printf(s
, "radiorev: %s\n", brcmu_dotrev_str(ri
->radiorev
, drev
));
941 seq_printf(s
, "chipnum: %u (%x)\n", ri
->chipnum
, ri
->chipnum
);
942 seq_printf(s
, "chiprev: %u\n", ri
->chiprev
);
943 seq_printf(s
, "chippkg: %u\n", ri
->chippkg
);
944 seq_printf(s
, "corerev: %u\n", ri
->corerev
);
945 seq_printf(s
, "boardid: 0x%04x\n", ri
->boardid
);
946 seq_printf(s
, "boardvendor: 0x%04x\n", ri
->boardvendor
);
947 seq_printf(s
, "boardrev: %s\n", brcmu_boardrev_str(ri
->boardrev
, brev
));
948 seq_printf(s
, "driverrev: %s\n", brcmu_dotrev_str(ri
->driverrev
, drev
));
949 seq_printf(s
, "ucoderev: %u\n", ri
->ucoderev
);
950 seq_printf(s
, "bus: %u\n", ri
->bus
);
951 seq_printf(s
, "phytype: %u\n", ri
->phytype
);
952 seq_printf(s
, "phyrev: %u\n", ri
->phyrev
);
953 seq_printf(s
, "anarev: %u\n", ri
->anarev
);
954 seq_printf(s
, "nvramrev: %08x\n", ri
->nvramrev
);
959 int brcmf_bus_started(struct device
*dev
)
962 struct brcmf_bus
*bus_if
= dev_get_drvdata(dev
);
963 struct brcmf_pub
*drvr
= bus_if
->drvr
;
964 struct brcmf_if
*ifp
;
965 struct brcmf_if
*p2p_ifp
;
967 brcmf_dbg(TRACE
, "\n");
969 /* add primary networking interface */
970 ifp
= brcmf_add_if(drvr
, 0, 0, false, "wlan%d", NULL
);
976 /* signal bus ready */
977 brcmf_bus_change_state(bus_if
, BRCMF_BUS_UP
);
979 /* Bus is ready, do any initialization */
980 ret
= brcmf_c_preinit_dcmds(ifp
);
984 brcmf_debugfs_add_entry(drvr
, "revinfo", brcmf_revinfo_read
);
986 /* assure we have chipid before feature attach */
988 bus_if
->chip
= drvr
->revinfo
.chipnum
;
989 bus_if
->chiprev
= drvr
->revinfo
.chiprev
;
990 brcmf_dbg(INFO
, "firmware revinfo: chip %x (%d) rev %d\n",
991 bus_if
->chip
, bus_if
->chip
, bus_if
->chiprev
);
993 brcmf_feat_attach(drvr
);
995 ret
= brcmf_fws_init(drvr
);
999 brcmf_fws_add_interface(ifp
);
1001 drvr
->config
= brcmf_cfg80211_attach(drvr
, bus_if
->dev
,
1002 drvr
->settings
->p2p_enable
);
1003 if (drvr
->config
== NULL
) {
1008 ret
= brcmf_net_attach(ifp
, false);
1010 if ((!ret
) && (drvr
->settings
->p2p_enable
)) {
1011 p2p_ifp
= drvr
->iflist
[1];
1013 ret
= brcmf_net_p2p_attach(p2p_ifp
);
1020 drvr
->inetaddr_notifier
.notifier_call
= brcmf_inetaddr_changed
;
1021 ret
= register_inetaddr_notifier(&drvr
->inetaddr_notifier
);
1025 #if IS_ENABLED(CONFIG_IPV6)
1026 drvr
->inet6addr_notifier
.notifier_call
= brcmf_inet6addr_changed
;
1027 ret
= register_inet6addr_notifier(&drvr
->inet6addr_notifier
);
1029 unregister_inetaddr_notifier(&drvr
->inetaddr_notifier
);
1033 #endif /* CONFIG_INET */
1038 brcmf_err("failed: %d\n", ret
);
1040 brcmf_cfg80211_detach(drvr
->config
);
1041 drvr
->config
= NULL
;
1044 brcmf_fws_del_interface(ifp
);
1045 brcmf_fws_deinit(drvr
);
1047 brcmf_net_detach(ifp
->ndev
, false);
1049 brcmf_net_detach(p2p_ifp
->ndev
, false);
1050 drvr
->iflist
[0] = NULL
;
1051 drvr
->iflist
[1] = NULL
;
1052 if (drvr
->settings
->ignore_probe_fail
)
1058 void brcmf_bus_add_txhdrlen(struct device
*dev
, uint len
)
1060 struct brcmf_bus
*bus_if
= dev_get_drvdata(dev
);
1061 struct brcmf_pub
*drvr
= bus_if
->drvr
;
1064 drvr
->hdrlen
+= len
;
1068 void brcmf_dev_reset(struct device
*dev
)
1070 struct brcmf_bus
*bus_if
= dev_get_drvdata(dev
);
1071 struct brcmf_pub
*drvr
= bus_if
->drvr
;
1076 if (drvr
->iflist
[0])
1077 brcmf_fil_cmd_int_set(drvr
->iflist
[0], BRCMF_C_TERMINATED
, 1);
1080 void brcmf_detach(struct device
*dev
)
1083 struct brcmf_bus
*bus_if
= dev_get_drvdata(dev
);
1084 struct brcmf_pub
*drvr
= bus_if
->drvr
;
1086 brcmf_dbg(TRACE
, "Enter\n");
1092 unregister_inetaddr_notifier(&drvr
->inetaddr_notifier
);
1095 #if IS_ENABLED(CONFIG_IPV6)
1096 unregister_inet6addr_notifier(&drvr
->inet6addr_notifier
);
1099 /* stop firmware event handling */
1100 brcmf_fweh_detach(drvr
);
1102 brcmf_p2p_detach(&drvr
->config
->p2p
);
1104 brcmf_bus_change_state(bus_if
, BRCMF_BUS_DOWN
);
1106 /* make sure primary interface removed last */
1107 for (i
= BRCMF_MAX_IFS
-1; i
> -1; i
--)
1108 brcmf_remove_interface(drvr
->iflist
[i
], false);
1110 brcmf_cfg80211_detach(drvr
->config
);
1112 brcmf_fws_deinit(drvr
);
1114 brcmf_bus_stop(drvr
->bus_if
);
1116 brcmf_proto_detach(drvr
);
1118 brcmf_debug_detach(drvr
);
1119 bus_if
->drvr
= NULL
;
1123 s32
brcmf_iovar_data_set(struct device
*dev
, char *name
, void *data
, u32 len
)
1125 struct brcmf_bus
*bus_if
= dev_get_drvdata(dev
);
1126 struct brcmf_if
*ifp
= bus_if
->drvr
->iflist
[0];
1128 return brcmf_fil_iovar_data_set(ifp
, name
, data
, len
);
1131 static int brcmf_get_pend_8021x_cnt(struct brcmf_if
*ifp
)
1133 return atomic_read(&ifp
->pend_8021x_cnt
);
1136 int brcmf_netdev_wait_pend8021x(struct brcmf_if
*ifp
)
1140 err
= wait_event_timeout(ifp
->pend_8021x_wait
,
1141 !brcmf_get_pend_8021x_cnt(ifp
),
1142 MAX_WAIT_FOR_8021X_TX
);
1145 brcmf_err("Timed out waiting for no pending 802.1x packets\n");
1150 void brcmf_bus_change_state(struct brcmf_bus
*bus
, enum brcmf_bus_state state
)
1152 struct brcmf_pub
*drvr
= bus
->drvr
;
1153 struct net_device
*ndev
;
1156 brcmf_dbg(TRACE
, "%d -> %d\n", bus
->state
, state
);
1159 if (state
== BRCMF_BUS_UP
) {
1160 for (ifidx
= 0; ifidx
< BRCMF_MAX_IFS
; ifidx
++) {
1161 if ((drvr
->iflist
[ifidx
]) &&
1162 (drvr
->iflist
[ifidx
]->ndev
)) {
1163 ndev
= drvr
->iflist
[ifidx
]->ndev
;
1164 if (netif_queue_stopped(ndev
))
1165 netif_wake_queue(ndev
);
1171 static void brcmf_driver_register(struct work_struct
*work
)
1173 #ifdef CONFIG_BRCMFMAC_SDIO
1174 brcmf_sdio_register();
1176 #ifdef CONFIG_BRCMFMAC_USB
1177 brcmf_usb_register();
1179 #ifdef CONFIG_BRCMFMAC_PCIE
1180 brcmf_pcie_register();
1183 static DECLARE_WORK(brcmf_driver_work
, brcmf_driver_register
);
1185 int __init
brcmf_core_init(void)
1187 if (!schedule_work(&brcmf_driver_work
))
1193 void __exit
brcmf_core_exit(void)
1195 cancel_work_sync(&brcmf_driver_work
);
1197 #ifdef CONFIG_BRCMFMAC_SDIO
1200 #ifdef CONFIG_BRCMFMAC_USB
1203 #ifdef CONFIG_BRCMFMAC_PCIE