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