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
;
204 brcmf_dbg(DATA
, "Enter, bsscfgidx=%d\n", ifp
->bsscfgidx
);
206 /* Can the device send data? */
207 if (drvr
->bus_if
->state
!= BRCMF_BUS_UP
) {
208 brcmf_err("xmit rejected state=%d\n", drvr
->bus_if
->state
);
209 netif_stop_queue(ndev
);
215 /* Make sure there's enough writeable headroom */
216 if (skb_headroom(skb
) < drvr
->hdrlen
|| skb_header_cloned(skb
)) {
217 head_delta
= max_t(int, drvr
->hdrlen
- skb_headroom(skb
), 0);
219 brcmf_dbg(INFO
, "%s: insufficient headroom (%d)\n",
220 brcmf_ifname(ifp
), head_delta
);
221 atomic_inc(&drvr
->bus_if
->stats
.pktcowed
);
222 ret
= pskb_expand_head(skb
, ALIGN(head_delta
, NET_SKB_PAD
), 0,
225 brcmf_err("%s: failed to expand headroom\n",
227 atomic_inc(&drvr
->bus_if
->stats
.pktcow_failed
);
232 /* validate length for ether packet */
233 if (skb
->len
< sizeof(*eh
)) {
239 eh
= (struct ethhdr
*)(skb
->data
);
241 if (eh
->h_proto
== htons(ETH_P_PAE
))
242 atomic_inc(&ifp
->pend_8021x_cnt
);
244 /* determine the priority */
245 if ((skb
->priority
== 0) || (skb
->priority
> 7))
246 skb
->priority
= cfg80211_classify8021d(skb
, NULL
);
248 ret
= brcmf_proto_tx_queue_data(drvr
, ifp
->ifidx
, skb
);
250 brcmf_txfinalize(ifp
, skb
, false);
254 ndev
->stats
.tx_dropped
++;
256 ndev
->stats
.tx_packets
++;
257 ndev
->stats
.tx_bytes
+= skb
->len
;
260 /* Return ok: we always eat the packet */
264 void brcmf_txflowblock_if(struct brcmf_if
*ifp
,
265 enum brcmf_netif_stop_reason reason
, bool state
)
269 if (!ifp
|| !ifp
->ndev
)
272 brcmf_dbg(TRACE
, "enter: bsscfgidx=%d stop=0x%X reason=%d state=%d\n",
273 ifp
->bsscfgidx
, ifp
->netif_stop
, reason
, state
);
275 spin_lock_irqsave(&ifp
->netif_stop_lock
, flags
);
277 if (!ifp
->netif_stop
)
278 netif_stop_queue(ifp
->ndev
);
279 ifp
->netif_stop
|= reason
;
281 ifp
->netif_stop
&= ~reason
;
282 if (!ifp
->netif_stop
)
283 netif_wake_queue(ifp
->ndev
);
285 spin_unlock_irqrestore(&ifp
->netif_stop_lock
, flags
);
288 void brcmf_netif_rx(struct brcmf_if
*ifp
, struct sk_buff
*skb
)
290 if (skb
->pkt_type
== PACKET_MULTICAST
)
291 ifp
->ndev
->stats
.multicast
++;
293 if (!(ifp
->ndev
->flags
& IFF_UP
)) {
294 brcmu_pkt_buf_free_skb(skb
);
298 ifp
->ndev
->stats
.rx_bytes
+= skb
->len
;
299 ifp
->ndev
->stats
.rx_packets
++;
301 brcmf_dbg(DATA
, "rx proto=0x%X\n", ntohs(skb
->protocol
));
305 /* If the receive is not processed inside an ISR,
306 * the softirqd must be woken explicitly to service
307 * the NET_RX_SOFTIRQ. This is handled by netif_rx_ni().
312 static int brcmf_rx_hdrpull(struct brcmf_pub
*drvr
, struct sk_buff
*skb
,
313 struct brcmf_if
**ifp
)
317 /* process and remove protocol-specific header */
318 ret
= brcmf_proto_hdrpull(drvr
, true, skb
, ifp
);
320 if (ret
|| !(*ifp
) || !(*ifp
)->ndev
) {
321 if (ret
!= -ENODATA
&& *ifp
)
322 (*ifp
)->ndev
->stats
.rx_errors
++;
323 brcmu_pkt_buf_free_skb(skb
);
327 skb
->protocol
= eth_type_trans(skb
, (*ifp
)->ndev
);
331 void brcmf_rx_frame(struct device
*dev
, struct sk_buff
*skb
, bool handle_event
)
333 struct brcmf_if
*ifp
;
334 struct brcmf_bus
*bus_if
= dev_get_drvdata(dev
);
335 struct brcmf_pub
*drvr
= bus_if
->drvr
;
337 brcmf_dbg(DATA
, "Enter: %s: rxp=%p\n", dev_name(dev
), skb
);
339 if (brcmf_rx_hdrpull(drvr
, skb
, &ifp
))
342 if (brcmf_proto_is_reorder_skb(skb
)) {
343 brcmf_proto_rxreorder(ifp
, skb
);
345 /* Process special event packets */
347 brcmf_fweh_process_skb(ifp
->drvr
, skb
);
349 brcmf_netif_rx(ifp
, skb
);
353 void brcmf_rx_event(struct device
*dev
, struct sk_buff
*skb
)
355 struct brcmf_if
*ifp
;
356 struct brcmf_bus
*bus_if
= dev_get_drvdata(dev
);
357 struct brcmf_pub
*drvr
= bus_if
->drvr
;
359 brcmf_dbg(EVENT
, "Enter: %s: rxp=%p\n", dev_name(dev
), skb
);
361 if (brcmf_rx_hdrpull(drvr
, skb
, &ifp
))
364 brcmf_fweh_process_skb(ifp
->drvr
, skb
);
365 brcmu_pkt_buf_free_skb(skb
);
368 void brcmf_txfinalize(struct brcmf_if
*ifp
, struct sk_buff
*txp
, bool success
)
373 eh
= (struct ethhdr
*)(txp
->data
);
374 type
= ntohs(eh
->h_proto
);
376 if (type
== ETH_P_PAE
) {
377 atomic_dec(&ifp
->pend_8021x_cnt
);
378 if (waitqueue_active(&ifp
->pend_8021x_wait
))
379 wake_up(&ifp
->pend_8021x_wait
);
383 ifp
->ndev
->stats
.tx_errors
++;
385 brcmu_pkt_buf_free_skb(txp
);
388 static void brcmf_ethtool_get_drvinfo(struct net_device
*ndev
,
389 struct ethtool_drvinfo
*info
)
391 struct brcmf_if
*ifp
= netdev_priv(ndev
);
392 struct brcmf_pub
*drvr
= ifp
->drvr
;
393 char drev
[BRCMU_DOTREV_LEN
] = "n/a";
395 if (drvr
->revinfo
.result
== 0)
396 brcmu_dotrev_str(drvr
->revinfo
.driverrev
, drev
);
397 strlcpy(info
->driver
, KBUILD_MODNAME
, sizeof(info
->driver
));
398 strlcpy(info
->version
, drev
, sizeof(info
->version
));
399 strlcpy(info
->fw_version
, drvr
->fwver
, sizeof(info
->fw_version
));
400 strlcpy(info
->bus_info
, dev_name(drvr
->bus_if
->dev
),
401 sizeof(info
->bus_info
));
404 static const struct ethtool_ops brcmf_ethtool_ops
= {
405 .get_drvinfo
= brcmf_ethtool_get_drvinfo
,
408 static int brcmf_netdev_stop(struct net_device
*ndev
)
410 struct brcmf_if
*ifp
= netdev_priv(ndev
);
412 brcmf_dbg(TRACE
, "Enter, bsscfgidx=%d\n", ifp
->bsscfgidx
);
414 brcmf_cfg80211_down(ndev
);
416 brcmf_fil_iovar_data_set(ifp
, "arp_hostip_clear", NULL
, 0);
418 brcmf_net_setcarrier(ifp
, false);
423 static int brcmf_netdev_open(struct net_device
*ndev
)
425 struct brcmf_if
*ifp
= netdev_priv(ndev
);
426 struct brcmf_pub
*drvr
= ifp
->drvr
;
427 struct brcmf_bus
*bus_if
= drvr
->bus_if
;
430 brcmf_dbg(TRACE
, "Enter, bsscfgidx=%d\n", ifp
->bsscfgidx
);
432 /* If bus is not ready, can't continue */
433 if (bus_if
->state
!= BRCMF_BUS_UP
) {
434 brcmf_err("failed bus is not ready\n");
438 atomic_set(&ifp
->pend_8021x_cnt
, 0);
440 /* Get current TOE mode from dongle */
441 if (brcmf_fil_iovar_int_get(ifp
, "toe_ol", &toe_ol
) >= 0
442 && (toe_ol
& TOE_TX_CSUM_OL
) != 0)
443 ndev
->features
|= NETIF_F_IP_CSUM
;
445 ndev
->features
&= ~NETIF_F_IP_CSUM
;
447 if (brcmf_cfg80211_up(ndev
)) {
448 brcmf_err("failed to bring up cfg80211\n");
452 /* Clear, carrier, set when connected or AP mode. */
453 netif_carrier_off(ndev
);
457 static const struct net_device_ops brcmf_netdev_ops_pri
= {
458 .ndo_open
= brcmf_netdev_open
,
459 .ndo_stop
= brcmf_netdev_stop
,
460 .ndo_start_xmit
= brcmf_netdev_start_xmit
,
461 .ndo_set_mac_address
= brcmf_netdev_set_mac_address
,
462 .ndo_set_rx_mode
= brcmf_netdev_set_multicast_list
465 int brcmf_net_attach(struct brcmf_if
*ifp
, bool rtnl_locked
)
467 struct brcmf_pub
*drvr
= ifp
->drvr
;
468 struct net_device
*ndev
;
471 brcmf_dbg(TRACE
, "Enter, bsscfgidx=%d mac=%pM\n", ifp
->bsscfgidx
,
475 /* set appropriate operations */
476 ndev
->netdev_ops
= &brcmf_netdev_ops_pri
;
478 ndev
->needed_headroom
+= drvr
->hdrlen
;
479 ndev
->ethtool_ops
= &brcmf_ethtool_ops
;
481 /* set the mac address & netns */
482 memcpy(ndev
->dev_addr
, ifp
->mac_addr
, ETH_ALEN
);
483 dev_net_set(ndev
, wiphy_net(cfg_to_wiphy(drvr
->config
)));
485 INIT_WORK(&ifp
->multicast_work
, _brcmf_set_multicast_list
);
486 INIT_WORK(&ifp
->ndoffload_work
, _brcmf_update_ndtable
);
489 err
= register_netdevice(ndev
);
491 err
= register_netdev(ndev
);
493 brcmf_err("couldn't register the net device\n");
497 ndev
->priv_destructor
= brcmf_cfg80211_free_netdev
;
498 brcmf_dbg(INFO
, "%s: Broadcom Dongle Host Driver\n", ndev
->name
);
502 drvr
->iflist
[ifp
->bsscfgidx
] = NULL
;
503 ndev
->netdev_ops
= NULL
;
507 static void brcmf_net_detach(struct net_device
*ndev
, bool rtnl_locked
)
509 if (ndev
->reg_state
== NETREG_REGISTERED
) {
511 unregister_netdevice(ndev
);
513 unregister_netdev(ndev
);
515 brcmf_cfg80211_free_netdev(ndev
);
520 void brcmf_net_setcarrier(struct brcmf_if
*ifp
, bool on
)
522 struct net_device
*ndev
;
524 brcmf_dbg(TRACE
, "Enter, bsscfgidx=%d carrier=%d\n", ifp
->bsscfgidx
,
528 brcmf_txflowblock_if(ifp
, BRCMF_NETIF_STOP_REASON_DISCONNECTED
, !on
);
530 if (!netif_carrier_ok(ndev
))
531 netif_carrier_on(ndev
);
534 if (netif_carrier_ok(ndev
))
535 netif_carrier_off(ndev
);
539 static int brcmf_net_p2p_open(struct net_device
*ndev
)
541 brcmf_dbg(TRACE
, "Enter\n");
543 return brcmf_cfg80211_up(ndev
);
546 static int brcmf_net_p2p_stop(struct net_device
*ndev
)
548 brcmf_dbg(TRACE
, "Enter\n");
550 return brcmf_cfg80211_down(ndev
);
553 static netdev_tx_t
brcmf_net_p2p_start_xmit(struct sk_buff
*skb
,
554 struct net_device
*ndev
)
557 dev_kfree_skb_any(skb
);
562 static const struct net_device_ops brcmf_netdev_ops_p2p
= {
563 .ndo_open
= brcmf_net_p2p_open
,
564 .ndo_stop
= brcmf_net_p2p_stop
,
565 .ndo_start_xmit
= brcmf_net_p2p_start_xmit
568 static int brcmf_net_p2p_attach(struct brcmf_if
*ifp
)
570 struct net_device
*ndev
;
572 brcmf_dbg(TRACE
, "Enter, bsscfgidx=%d mac=%pM\n", ifp
->bsscfgidx
,
576 ndev
->netdev_ops
= &brcmf_netdev_ops_p2p
;
578 /* set the mac address */
579 memcpy(ndev
->dev_addr
, ifp
->mac_addr
, ETH_ALEN
);
581 if (register_netdev(ndev
) != 0) {
582 brcmf_err("couldn't register the p2p net device\n");
586 brcmf_dbg(INFO
, "%s: Broadcom Dongle Host Driver\n", ndev
->name
);
591 ifp
->drvr
->iflist
[ifp
->bsscfgidx
] = NULL
;
592 ndev
->netdev_ops
= NULL
;
596 struct brcmf_if
*brcmf_add_if(struct brcmf_pub
*drvr
, s32 bsscfgidx
, s32 ifidx
,
597 bool is_p2pdev
, const char *name
, u8
*mac_addr
)
599 struct brcmf_if
*ifp
;
600 struct net_device
*ndev
;
602 brcmf_dbg(TRACE
, "Enter, bsscfgidx=%d, ifidx=%d\n", bsscfgidx
, ifidx
);
604 ifp
= drvr
->iflist
[bsscfgidx
];
606 * Delete the existing interface before overwriting it
607 * in case we missed the BRCMF_E_IF_DEL event.
611 brcmf_err("ERROR: netdev:%s already exists\n",
613 netif_stop_queue(ifp
->ndev
);
614 brcmf_net_detach(ifp
->ndev
, false);
615 drvr
->iflist
[bsscfgidx
] = NULL
;
617 brcmf_dbg(INFO
, "netdev:%s ignore IF event\n",
619 return ERR_PTR(-EINVAL
);
623 if (!drvr
->settings
->p2p_enable
&& is_p2pdev
) {
624 /* this is P2P_DEVICE interface */
625 brcmf_dbg(INFO
, "allocate non-netdev interface\n");
626 ifp
= kzalloc(sizeof(*ifp
), GFP_KERNEL
);
628 return ERR_PTR(-ENOMEM
);
630 brcmf_dbg(INFO
, "allocate netdev interface\n");
631 /* Allocate netdev, including space for private structure */
632 ndev
= alloc_netdev(sizeof(*ifp
), is_p2pdev
? "p2p%d" : name
,
633 NET_NAME_UNKNOWN
, ether_setup
);
635 return ERR_PTR(-ENOMEM
);
637 ndev
->needs_free_netdev
= true;
638 ifp
= netdev_priv(ndev
);
640 /* store mapping ifidx to bsscfgidx */
641 if (drvr
->if2bss
[ifidx
] == BRCMF_BSSIDX_INVALID
)
642 drvr
->if2bss
[ifidx
] = bsscfgidx
;
646 drvr
->iflist
[bsscfgidx
] = ifp
;
648 ifp
->bsscfgidx
= bsscfgidx
;
650 init_waitqueue_head(&ifp
->pend_8021x_wait
);
651 spin_lock_init(&ifp
->netif_stop_lock
);
653 if (mac_addr
!= NULL
)
654 memcpy(ifp
->mac_addr
, mac_addr
, ETH_ALEN
);
656 brcmf_dbg(TRACE
, " ==== pid:%x, if:%s (%pM) created ===\n",
657 current
->pid
, name
, ifp
->mac_addr
);
662 static void brcmf_del_if(struct brcmf_pub
*drvr
, s32 bsscfgidx
,
665 struct brcmf_if
*ifp
;
667 ifp
= drvr
->iflist
[bsscfgidx
];
668 drvr
->iflist
[bsscfgidx
] = NULL
;
670 brcmf_err("Null interface, bsscfgidx=%d\n", bsscfgidx
);
673 brcmf_dbg(TRACE
, "Enter, bsscfgidx=%d, ifidx=%d\n", bsscfgidx
,
675 if (drvr
->if2bss
[ifp
->ifidx
] == bsscfgidx
)
676 drvr
->if2bss
[ifp
->ifidx
] = BRCMF_BSSIDX_INVALID
;
678 if (bsscfgidx
== 0) {
679 if (ifp
->ndev
->netdev_ops
== &brcmf_netdev_ops_pri
) {
681 brcmf_netdev_stop(ifp
->ndev
);
685 netif_stop_queue(ifp
->ndev
);
688 if (ifp
->ndev
->netdev_ops
== &brcmf_netdev_ops_pri
) {
689 cancel_work_sync(&ifp
->multicast_work
);
690 cancel_work_sync(&ifp
->ndoffload_work
);
692 brcmf_net_detach(ifp
->ndev
, rtnl_locked
);
694 /* Only p2p device interfaces which get dynamically created
695 * end up here. In this case the p2p module should be informed
696 * about the removal of the interface within the firmware. If
697 * not then p2p commands towards the firmware will cause some
698 * serious troublesome side effects. The p2p module will clean
699 * up the ifp if needed.
701 brcmf_p2p_ifp_removed(ifp
, rtnl_locked
);
706 void brcmf_remove_interface(struct brcmf_if
*ifp
, bool rtnl_locked
)
708 if (!ifp
|| WARN_ON(ifp
->drvr
->iflist
[ifp
->bsscfgidx
] != ifp
))
710 brcmf_dbg(TRACE
, "Enter, bsscfgidx=%d, ifidx=%d\n", ifp
->bsscfgidx
,
712 brcmf_proto_del_if(ifp
->drvr
, ifp
);
713 brcmf_del_if(ifp
->drvr
, ifp
->bsscfgidx
, rtnl_locked
);
716 static int brcmf_psm_watchdog_notify(struct brcmf_if
*ifp
,
717 const struct brcmf_event_msg
*evtmsg
,
722 brcmf_dbg(TRACE
, "enter: bsscfgidx=%d\n", ifp
->bsscfgidx
);
724 brcmf_err("PSM's watchdog has fired!\n");
726 err
= brcmf_debug_create_memdump(ifp
->drvr
->bus_if
, data
,
729 brcmf_err("Failed to get memory dump, %d\n", err
);
735 #define ARPOL_MAX_ENTRIES 8
736 static int brcmf_inetaddr_changed(struct notifier_block
*nb
,
737 unsigned long action
, void *data
)
739 struct brcmf_pub
*drvr
= container_of(nb
, struct brcmf_pub
,
741 struct in_ifaddr
*ifa
= data
;
742 struct net_device
*ndev
= ifa
->ifa_dev
->dev
;
743 struct brcmf_if
*ifp
;
746 __be32 addr_table
[ARPOL_MAX_ENTRIES
] = {0};
748 /* Find out if the notification is meant for us */
749 for (idx
= 0; idx
< BRCMF_MAX_IFS
; idx
++) {
750 ifp
= drvr
->iflist
[idx
];
751 if (ifp
&& ifp
->ndev
== ndev
)
753 if (idx
== BRCMF_MAX_IFS
- 1)
757 /* check if arp offload is supported */
758 ret
= brcmf_fil_iovar_int_get(ifp
, "arpoe", &val
);
762 /* old version only support primary index */
763 ret
= brcmf_fil_iovar_int_get(ifp
, "arp_version", &val
);
767 ifp
= drvr
->iflist
[0];
769 /* retrieve the table from firmware */
770 ret
= brcmf_fil_iovar_data_get(ifp
, "arp_hostip", addr_table
,
773 brcmf_err("fail to get arp ip table err:%d\n", ret
);
777 for (i
= 0; i
< ARPOL_MAX_ENTRIES
; i
++)
778 if (ifa
->ifa_address
== addr_table
[i
])
783 if (i
== ARPOL_MAX_ENTRIES
) {
784 brcmf_dbg(TRACE
, "add %pI4 to arp table\n",
786 /* set it directly */
787 ret
= brcmf_fil_iovar_data_set(ifp
, "arp_hostip",
788 &ifa
->ifa_address
, sizeof(ifa
->ifa_address
));
790 brcmf_err("add arp ip err %d\n", ret
);
794 if (i
< ARPOL_MAX_ENTRIES
) {
796 brcmf_dbg(TRACE
, "remove %pI4 from arp table\n",
798 /* clear the table in firmware */
799 ret
= brcmf_fil_iovar_data_set(ifp
, "arp_hostip_clear",
802 brcmf_err("fail to clear arp ip table err:%d\n",
806 for (i
= 0; i
< ARPOL_MAX_ENTRIES
; i
++) {
807 if (addr_table
[i
] == 0)
809 ret
= brcmf_fil_iovar_data_set(ifp
, "arp_hostip",
811 sizeof(addr_table
[i
]));
813 brcmf_err("add arp ip err %d\n",
826 #if IS_ENABLED(CONFIG_IPV6)
827 static int brcmf_inet6addr_changed(struct notifier_block
*nb
,
828 unsigned long action
, void *data
)
830 struct brcmf_pub
*drvr
= container_of(nb
, struct brcmf_pub
,
832 struct inet6_ifaddr
*ifa
= data
;
833 struct brcmf_if
*ifp
;
835 struct in6_addr
*table
;
837 /* Only handle primary interface */
838 ifp
= drvr
->iflist
[0];
841 if (ifp
->ndev
!= ifa
->idev
->dev
)
844 table
= ifp
->ipv6_addr_tbl
;
845 for (i
= 0; i
< NDOL_MAX_ENTRIES
; i
++)
846 if (ipv6_addr_equal(&ifa
->addr
, &table
[i
]))
851 if (i
== NDOL_MAX_ENTRIES
) {
852 if (ifp
->ipv6addr_idx
< NDOL_MAX_ENTRIES
) {
853 table
[ifp
->ipv6addr_idx
++] = ifa
->addr
;
855 for (i
= 0; i
< NDOL_MAX_ENTRIES
- 1; i
++)
856 table
[i
] = table
[i
+ 1];
857 table
[NDOL_MAX_ENTRIES
- 1] = ifa
->addr
;
862 if (i
< NDOL_MAX_ENTRIES
) {
863 for (; i
< ifp
->ipv6addr_idx
- 1; i
++)
864 table
[i
] = table
[i
+ 1];
865 memset(&table
[i
], 0, sizeof(table
[i
]));
873 schedule_work(&ifp
->ndoffload_work
);
879 int brcmf_attach(struct device
*dev
, struct brcmf_mp_device
*settings
)
881 struct brcmf_pub
*drvr
= NULL
;
885 brcmf_dbg(TRACE
, "Enter\n");
887 /* Allocate primary brcmf_info */
888 drvr
= kzalloc(sizeof(struct brcmf_pub
), GFP_ATOMIC
);
892 for (i
= 0; i
< ARRAY_SIZE(drvr
->if2bss
); i
++)
893 drvr
->if2bss
[i
] = BRCMF_BSSIDX_INVALID
;
895 mutex_init(&drvr
->proto_block
);
897 /* Link to bus module */
899 drvr
->bus_if
= dev_get_drvdata(dev
);
900 drvr
->bus_if
->drvr
= drvr
;
901 drvr
->settings
= settings
;
903 /* attach debug facilities */
904 brcmf_debug_attach(drvr
);
906 /* Attach and link in the protocol */
907 ret
= brcmf_proto_attach(drvr
);
909 brcmf_err("brcmf_prot_attach failed\n");
913 /* Attach to events important for core code */
914 brcmf_fweh_register(drvr
, BRCMF_E_PSM_WATCHDOG
,
915 brcmf_psm_watchdog_notify
);
917 /* attach firmware event handler */
918 brcmf_fweh_attach(drvr
);
928 static int brcmf_revinfo_read(struct seq_file
*s
, void *data
)
930 struct brcmf_bus
*bus_if
= dev_get_drvdata(s
->private);
931 struct brcmf_rev_info
*ri
= &bus_if
->drvr
->revinfo
;
932 char drev
[BRCMU_DOTREV_LEN
];
933 char brev
[BRCMU_BOARDREV_LEN
];
935 seq_printf(s
, "vendorid: 0x%04x\n", ri
->vendorid
);
936 seq_printf(s
, "deviceid: 0x%04x\n", ri
->deviceid
);
937 seq_printf(s
, "radiorev: %s\n", brcmu_dotrev_str(ri
->radiorev
, drev
));
938 seq_printf(s
, "chipnum: %u (%x)\n", ri
->chipnum
, ri
->chipnum
);
939 seq_printf(s
, "chiprev: %u\n", ri
->chiprev
);
940 seq_printf(s
, "chippkg: %u\n", ri
->chippkg
);
941 seq_printf(s
, "corerev: %u\n", ri
->corerev
);
942 seq_printf(s
, "boardid: 0x%04x\n", ri
->boardid
);
943 seq_printf(s
, "boardvendor: 0x%04x\n", ri
->boardvendor
);
944 seq_printf(s
, "boardrev: %s\n", brcmu_boardrev_str(ri
->boardrev
, brev
));
945 seq_printf(s
, "driverrev: %s\n", brcmu_dotrev_str(ri
->driverrev
, drev
));
946 seq_printf(s
, "ucoderev: %u\n", ri
->ucoderev
);
947 seq_printf(s
, "bus: %u\n", ri
->bus
);
948 seq_printf(s
, "phytype: %u\n", ri
->phytype
);
949 seq_printf(s
, "phyrev: %u\n", ri
->phyrev
);
950 seq_printf(s
, "anarev: %u\n", ri
->anarev
);
951 seq_printf(s
, "nvramrev: %08x\n", ri
->nvramrev
);
956 int brcmf_bus_started(struct device
*dev
)
959 struct brcmf_bus
*bus_if
= dev_get_drvdata(dev
);
960 struct brcmf_pub
*drvr
= bus_if
->drvr
;
961 struct brcmf_if
*ifp
;
962 struct brcmf_if
*p2p_ifp
;
964 brcmf_dbg(TRACE
, "\n");
966 /* add primary networking interface */
967 ifp
= brcmf_add_if(drvr
, 0, 0, false, "wlan%d", NULL
);
973 /* signal bus ready */
974 brcmf_bus_change_state(bus_if
, BRCMF_BUS_UP
);
976 /* Bus is ready, do any initialization */
977 ret
= brcmf_c_preinit_dcmds(ifp
);
981 brcmf_debugfs_add_entry(drvr
, "revinfo", brcmf_revinfo_read
);
983 /* assure we have chipid before feature attach */
985 bus_if
->chip
= drvr
->revinfo
.chipnum
;
986 bus_if
->chiprev
= drvr
->revinfo
.chiprev
;
987 brcmf_dbg(INFO
, "firmware revinfo: chip %x (%d) rev %d\n",
988 bus_if
->chip
, bus_if
->chip
, bus_if
->chiprev
);
990 brcmf_feat_attach(drvr
);
992 ret
= brcmf_proto_init_done(drvr
);
996 brcmf_proto_add_if(drvr
, ifp
);
998 drvr
->config
= brcmf_cfg80211_attach(drvr
, bus_if
->dev
,
999 drvr
->settings
->p2p_enable
);
1000 if (drvr
->config
== NULL
) {
1005 ret
= brcmf_net_attach(ifp
, false);
1007 if ((!ret
) && (drvr
->settings
->p2p_enable
)) {
1008 p2p_ifp
= drvr
->iflist
[1];
1010 ret
= brcmf_net_p2p_attach(p2p_ifp
);
1017 drvr
->inetaddr_notifier
.notifier_call
= brcmf_inetaddr_changed
;
1018 ret
= register_inetaddr_notifier(&drvr
->inetaddr_notifier
);
1022 #if IS_ENABLED(CONFIG_IPV6)
1023 drvr
->inet6addr_notifier
.notifier_call
= brcmf_inet6addr_changed
;
1024 ret
= register_inet6addr_notifier(&drvr
->inet6addr_notifier
);
1026 unregister_inetaddr_notifier(&drvr
->inetaddr_notifier
);
1030 #endif /* CONFIG_INET */
1035 brcmf_err("failed: %d\n", ret
);
1037 brcmf_cfg80211_detach(drvr
->config
);
1038 drvr
->config
= NULL
;
1040 brcmf_net_detach(ifp
->ndev
, false);
1042 brcmf_net_detach(p2p_ifp
->ndev
, false);
1043 drvr
->iflist
[0] = NULL
;
1044 drvr
->iflist
[1] = NULL
;
1045 if (drvr
->settings
->ignore_probe_fail
)
1051 void brcmf_bus_add_txhdrlen(struct device
*dev
, uint len
)
1053 struct brcmf_bus
*bus_if
= dev_get_drvdata(dev
);
1054 struct brcmf_pub
*drvr
= bus_if
->drvr
;
1057 drvr
->hdrlen
+= len
;
1061 void brcmf_dev_reset(struct device
*dev
)
1063 struct brcmf_bus
*bus_if
= dev_get_drvdata(dev
);
1064 struct brcmf_pub
*drvr
= bus_if
->drvr
;
1069 if (drvr
->iflist
[0])
1070 brcmf_fil_cmd_int_set(drvr
->iflist
[0], BRCMF_C_TERMINATED
, 1);
1073 void brcmf_detach(struct device
*dev
)
1076 struct brcmf_bus
*bus_if
= dev_get_drvdata(dev
);
1077 struct brcmf_pub
*drvr
= bus_if
->drvr
;
1079 brcmf_dbg(TRACE
, "Enter\n");
1085 unregister_inetaddr_notifier(&drvr
->inetaddr_notifier
);
1088 #if IS_ENABLED(CONFIG_IPV6)
1089 unregister_inet6addr_notifier(&drvr
->inet6addr_notifier
);
1092 /* stop firmware event handling */
1093 brcmf_fweh_detach(drvr
);
1095 brcmf_p2p_detach(&drvr
->config
->p2p
);
1097 brcmf_bus_change_state(bus_if
, BRCMF_BUS_DOWN
);
1099 /* make sure primary interface removed last */
1100 for (i
= BRCMF_MAX_IFS
-1; i
> -1; i
--)
1101 brcmf_remove_interface(drvr
->iflist
[i
], false);
1103 brcmf_cfg80211_detach(drvr
->config
);
1105 brcmf_bus_stop(drvr
->bus_if
);
1107 brcmf_proto_detach(drvr
);
1109 brcmf_debug_detach(drvr
);
1110 bus_if
->drvr
= NULL
;
1114 s32
brcmf_iovar_data_set(struct device
*dev
, char *name
, void *data
, u32 len
)
1116 struct brcmf_bus
*bus_if
= dev_get_drvdata(dev
);
1117 struct brcmf_if
*ifp
= bus_if
->drvr
->iflist
[0];
1119 return brcmf_fil_iovar_data_set(ifp
, name
, data
, len
);
1122 static int brcmf_get_pend_8021x_cnt(struct brcmf_if
*ifp
)
1124 return atomic_read(&ifp
->pend_8021x_cnt
);
1127 int brcmf_netdev_wait_pend8021x(struct brcmf_if
*ifp
)
1131 err
= wait_event_timeout(ifp
->pend_8021x_wait
,
1132 !brcmf_get_pend_8021x_cnt(ifp
),
1133 MAX_WAIT_FOR_8021X_TX
);
1136 brcmf_err("Timed out waiting for no pending 802.1x packets\n");
1141 void brcmf_bus_change_state(struct brcmf_bus
*bus
, enum brcmf_bus_state state
)
1143 struct brcmf_pub
*drvr
= bus
->drvr
;
1144 struct net_device
*ndev
;
1147 brcmf_dbg(TRACE
, "%d -> %d\n", bus
->state
, state
);
1150 if (state
== BRCMF_BUS_UP
) {
1151 for (ifidx
= 0; ifidx
< BRCMF_MAX_IFS
; ifidx
++) {
1152 if ((drvr
->iflist
[ifidx
]) &&
1153 (drvr
->iflist
[ifidx
]->ndev
)) {
1154 ndev
= drvr
->iflist
[ifidx
]->ndev
;
1155 if (netif_queue_stopped(ndev
))
1156 netif_wake_queue(ndev
);
1162 static void brcmf_driver_register(struct work_struct
*work
)
1164 #ifdef CONFIG_BRCMFMAC_SDIO
1165 brcmf_sdio_register();
1167 #ifdef CONFIG_BRCMFMAC_USB
1168 brcmf_usb_register();
1170 #ifdef CONFIG_BRCMFMAC_PCIE
1171 brcmf_pcie_register();
1174 static DECLARE_WORK(brcmf_driver_work
, brcmf_driver_register
);
1176 int __init
brcmf_core_init(void)
1178 if (!schedule_work(&brcmf_driver_work
))
1184 void __exit
brcmf_core_exit(void)
1186 cancel_work_sync(&brcmf_driver_work
);
1188 #ifdef CONFIG_BRCMFMAC_SDIO
1191 #ifdef CONFIG_BRCMFMAC_USB
1194 #ifdef CONFIG_BRCMFMAC_PCIE