.. | .. |
---|
519 | 519 | * role to station type while bringing down the interface |
---|
520 | 520 | */ |
---|
521 | 521 | if (p2p_ndev->ieee80211_ptr->iftype == NL80211_IFTYPE_STATION) { |
---|
522 | | - WL_DBG_MEM(("%s, Change to GC base role\n", __FUNCTION__)); |
---|
| 522 | + WL_DBG_MEM(("%s, Change to GC base role\n", p2p_ndev->name)); |
---|
523 | 523 | return WL_IF_TYPE_P2P_GC; |
---|
524 | 524 | } |
---|
525 | 525 | |
---|
.. | .. |
---|
888 | 888 | WL_DBG(("%s:Mac addr" MACDBG "\n", |
---|
889 | 889 | __FUNCTION__, MAC2STRDBG(mac_addr))); |
---|
890 | 890 | |
---|
| 891 | +#if defined(SPECIFIC_MAC_GEN_SCHEME) |
---|
891 | 892 | if ((wl_iftype == WL_IF_TYPE_P2P_DISC) || (wl_iftype == WL_IF_TYPE_AP) || |
---|
892 | 893 | (wl_iftype == WL_IF_TYPE_P2P_GO) || (wl_iftype == WL_IF_TYPE_P2P_GC)) { |
---|
893 | 894 | /* Avoid invoking release mac addr code for interfaces using |
---|
.. | .. |
---|
895 | 896 | */ |
---|
896 | 897 | return BCME_OK; |
---|
897 | 898 | } |
---|
| 899 | +#else |
---|
| 900 | + if (wl_iftype == WL_IF_TYPE_P2P_DISC) { |
---|
| 901 | + return BCME_OK; |
---|
| 902 | + } |
---|
| 903 | +#endif /* SPECIFIC_MAC_GEN_SCHEME */ |
---|
898 | 904 | |
---|
899 | 905 | /* Fetch last two bytes of mac address */ |
---|
900 | 906 | org_toggle_bytes = ntoh16(*((u16 *)&ndev->dev_addr[4])); |
---|
.. | .. |
---|
951 | 957 | * released. Ensure to call wl_release_vif_macaddress to free up |
---|
952 | 958 | * the mac address. |
---|
953 | 959 | */ |
---|
954 | | -#if defined (SPECIFIC_MAC_GEN_SCHEME) |
---|
| 960 | +#if defined(SPECIFIC_MAC_GEN_SCHEME) |
---|
955 | 961 | if (wl_iftype == WL_IF_TYPE_P2P_DISC || wl_iftype == WL_IF_TYPE_AP) { |
---|
956 | 962 | mac_addr[0] |= 0x02; |
---|
957 | 963 | } else if ((wl_iftype == WL_IF_TYPE_P2P_GO) || (wl_iftype == WL_IF_TYPE_P2P_GC)) { |
---|
.. | .. |
---|
962 | 968 | if (wl_iftype == WL_IF_TYPE_P2P_DISC) { |
---|
963 | 969 | mac_addr[0] |= 0x02; |
---|
964 | 970 | } |
---|
965 | | -#endif /* SEPCIFIC_MAC_GEN_SCHEME */ |
---|
| 971 | +#endif /* SPECIFIC_MAC_GEN_SCHEME */ |
---|
966 | 972 | else { |
---|
967 | 973 | /* For locally administered mac addresses, we keep the |
---|
968 | 974 | * OUI part constant and just work on the last two bytes. |
---|
.. | .. |
---|
1331 | 1337 | if (is_p2p_group_iface(ndev->ieee80211_ptr) && (type == NL80211_IFTYPE_STATION)) { |
---|
1332 | 1338 | /* For role downgrade cases, we keep interface role as GC */ |
---|
1333 | 1339 | netinfo->iftype = WL_IF_TYPE_P2P_GC; |
---|
1334 | | - WL_DBG_MEM(("[%s] Set base role to GC, current role" |
---|
| 1340 | + WL_DBG_MEM(("[%s] Set base role to GC, current role" |
---|
1335 | 1341 | "ndev->ieee80211_ptr->iftype = %d\n", |
---|
1336 | | - __FUNCTION__, ndev->ieee80211_ptr->iftype)); |
---|
| 1342 | + ndev->name, ndev->ieee80211_ptr->iftype)); |
---|
1337 | 1343 | } else { |
---|
1338 | 1344 | netinfo->iftype = wl_iftype; |
---|
1339 | 1345 | } |
---|
.. | .. |
---|
1538 | 1544 | s32 |
---|
1539 | 1545 | wl_cfg80211_set_channel(struct wiphy *wiphy, struct net_device *dev, |
---|
1540 | 1546 | struct ieee80211_channel *chan, |
---|
1541 | | - enum nl80211_channel_type channel_type) |
---|
| 1547 | +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 6, 0)) |
---|
| 1548 | + enum nl80211_channel_type channel_type |
---|
| 1549 | +#else |
---|
| 1550 | + enum nl80211_chan_width width |
---|
| 1551 | +#endif |
---|
| 1552 | +) |
---|
1542 | 1553 | { |
---|
1543 | 1554 | chanspec_t chspec = INVCHANSPEC; |
---|
1544 | 1555 | chanspec_t cur_chspec = INVCHANSPEC; |
---|
1545 | | - u32 bw = WL_CHANSPEC_BW_20; |
---|
| 1556 | + u32 band_width = WL_CHANSPEC_BW_20, bw = WL_CHANSPEC_BW_20; |
---|
1546 | 1557 | s32 err = BCME_OK; |
---|
1547 | 1558 | struct bcm_cfg80211 *cfg = wiphy_priv(wiphy); |
---|
1548 | 1559 | #if defined(CUSTOM_SET_CPUCORE) || defined(APSTA_RESTRICTED_CHANNEL) |
---|
.. | .. |
---|
1551 | 1562 | u16 center_freq = chan->center_freq; |
---|
1552 | 1563 | |
---|
1553 | 1564 | dev = ndev_to_wlc_ndev(dev, cfg); |
---|
| 1565 | + |
---|
| 1566 | +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 6, 0)) |
---|
| 1567 | + switch (channel_type) { |
---|
| 1568 | + case NL80211_CHAN_HT40MINUS: |
---|
| 1569 | + /* secondary channel is below the control channel */ |
---|
| 1570 | + band_width = WL_CHANSPEC_BW_40; |
---|
| 1571 | + break; |
---|
| 1572 | + case NL80211_CHAN_HT40PLUS: |
---|
| 1573 | + /* secondary channel is above the control channel */ |
---|
| 1574 | + band_width = WL_CHANSPEC_BW_40; |
---|
| 1575 | + break; |
---|
| 1576 | + default: |
---|
| 1577 | + band_width = WL_CHANSPEC_BW_20; |
---|
| 1578 | + } |
---|
| 1579 | +#else |
---|
| 1580 | + switch (width) |
---|
| 1581 | + { |
---|
| 1582 | + case NL80211_CHAN_WIDTH_160: |
---|
| 1583 | + band_width = WL_CHANSPEC_BW_160; |
---|
| 1584 | + break; |
---|
| 1585 | + case NL80211_CHAN_WIDTH_80P80: |
---|
| 1586 | + case NL80211_CHAN_WIDTH_80: |
---|
| 1587 | + band_width = WL_CHANSPEC_BW_80; |
---|
| 1588 | + break; |
---|
| 1589 | + case NL80211_CHAN_WIDTH_40: |
---|
| 1590 | + band_width = WL_CHANSPEC_BW_40; |
---|
| 1591 | + break; |
---|
| 1592 | + default: |
---|
| 1593 | + band_width = WL_CHANSPEC_BW_20; |
---|
| 1594 | + break; |
---|
| 1595 | + } |
---|
| 1596 | +#endif |
---|
| 1597 | + |
---|
1554 | 1598 | #ifdef WL_EXT_IAPSTA |
---|
1555 | 1599 | if (dev->ieee80211_ptr->iftype == NL80211_IFTYPE_AP || |
---|
1556 | 1600 | dev->ieee80211_ptr->iftype == NL80211_IFTYPE_P2P_GO) { |
---|
.. | .. |
---|
1571 | 1615 | #endif |
---|
1572 | 1616 | chspec = wl_freq_to_chanspec(center_freq); |
---|
1573 | 1617 | |
---|
1574 | | - WL_MSG(dev->name, "netdev_ifidx(%d) chan_type(%d) target channel(%s-%d %sMHz)\n", |
---|
1575 | | - dev->ifindex, channel_type, CHSPEC2BANDSTR(chspec), |
---|
1576 | | - CHSPEC_CHANNEL(chspec), wf_chspec_to_bw_str(chspec)); |
---|
| 1618 | + WL_MSG(dev->name, "netdev_ifidx(%d) chan_width(%d) target channel(%s-%d %sMHz)\n", |
---|
| 1619 | + dev->ifindex, width, CHSPEC2BANDSTR(chspec), |
---|
| 1620 | + CHSPEC_CHANNEL(chspec), WLCWIDTH2STR(band_width)); |
---|
1577 | 1621 | |
---|
1578 | 1622 | #ifdef WL_P2P_6G |
---|
1579 | 1623 | if (!(cfg->p2p_6g_enabled)) { |
---|
.. | .. |
---|
1585 | 1629 | #ifdef WL_P2P_6G |
---|
1586 | 1630 | } |
---|
1587 | 1631 | #endif /* WL_P2P_6G */ |
---|
1588 | | - |
---|
1589 | | -#ifdef NOT_YET |
---|
1590 | | - switch (channel_type) { |
---|
1591 | | - case NL80211_CHAN_HT40MINUS: |
---|
1592 | | - /* secondary channel is below the control channel */ |
---|
1593 | | - chspec = CH40MHZ_CHSPEC(CHSPEC_CHANNEL(chspec), WL_CHANSPEC_CTL_SB_UPPER); |
---|
1594 | | - break; |
---|
1595 | | - case NL80211_CHAN_HT40PLUS: |
---|
1596 | | - /* secondary channel is above the control channel */ |
---|
1597 | | - chspec = CH40MHZ_CHSPEC(CHSPEC_CHANNEL(chspec), WL_CHANSPEC_CTL_SB_LOWER); |
---|
1598 | | - break; |
---|
1599 | | - default: |
---|
1600 | | - chspec = CH20MHZ_CHSPEC(CHSPEC_CHANNEL(chspec)); |
---|
1601 | | - |
---|
1602 | | - } |
---|
1603 | | -#endif /* NOT_YET */ |
---|
1604 | 1632 | |
---|
1605 | 1633 | #if defined(APSTA_RESTRICTED_CHANNEL) |
---|
1606 | 1634 | /* Some customer platform used limited number of channels |
---|
.. | .. |
---|
1643 | 1671 | if (err < 0) { |
---|
1644 | 1672 | WL_ERR(("Failed to get bandwidth information, err=%d\n", err)); |
---|
1645 | 1673 | return err; |
---|
| 1674 | + } else if (bw < band_width) { |
---|
| 1675 | + WL_ERR(("capability force band_width=0x%X to be 0x%X\n", band_width, bw)); |
---|
| 1676 | + band_width = bw; |
---|
1646 | 1677 | } |
---|
| 1678 | +#ifdef HOSTAPD_BW_SUPPORT |
---|
| 1679 | + WL_MSG(dev->name, "hostapd bw(%sMHz) <= chip bw(%sMHz)\n", |
---|
| 1680 | + wf_chspec_to_bw_str(band_width), wf_chspec_to_bw_str(bw)); |
---|
| 1681 | +#else |
---|
| 1682 | + WL_MSG(dev->name, "hostapd bw(%sMHz) => chip bw(%sMHz)\n", |
---|
| 1683 | + wf_chspec_to_bw_str(band_width), wf_chspec_to_bw_str(bw)); |
---|
| 1684 | + band_width = bw; |
---|
| 1685 | +#endif |
---|
1647 | 1686 | |
---|
1648 | 1687 | /* In case of 5G downgrade BW to 80MHz as 160MHz channels falls in DFS */ |
---|
1649 | 1688 | if (CHSPEC_IS5G(chspec) && (bw == WL_CHANSPEC_BW_160)) { |
---|
.. | .. |
---|
1651 | 1690 | } |
---|
1652 | 1691 | set_channel: |
---|
1653 | 1692 | cur_chspec = wf_create_chspec_from_primary(wf_chspec_primary20_chan(chspec), |
---|
1654 | | - bw, CHSPEC_BAND(chspec)); |
---|
| 1693 | + band_width, CHSPEC_BAND(chspec)); |
---|
1655 | 1694 | #ifdef WL_6G_BAND |
---|
1656 | 1695 | if (cfg->acs_chspec && |
---|
1657 | 1696 | CHSPEC_IS6G(cfg->acs_chspec) && |
---|
.. | .. |
---|
3694 | 3733 | dev->ieee80211_ptr->u.ap.preset_chandef.chan, |
---|
3695 | 3734 | #else |
---|
3696 | 3735 | dev->ieee80211_ptr->preset_chandef.chan, |
---|
3697 | | -#endif |
---|
3698 | | - NL80211_CHAN_HT20) < 0)) { |
---|
| 3736 | +#endif /* CFG80211_BKPORT_MLO */ |
---|
| 3737 | + info->chandef.width) < 0)) { |
---|
3699 | 3738 | WL_ERR(("Set channel failed \n")); |
---|
3700 | 3739 | goto fail; |
---|
3701 | 3740 | } |
---|
.. | .. |
---|
3793 | 3832 | wl_cfg80211_stop_ap(wiphy, dev, 0); |
---|
3794 | 3833 | #else |
---|
3795 | 3834 | wl_cfg80211_stop_ap(wiphy, dev); |
---|
3796 | | -#endif |
---|
| 3835 | +#endif /* CFG80211_BKPORT_MLO */ |
---|
3797 | 3836 | if (dev_role == NL80211_IFTYPE_AP) { |
---|
3798 | 3837 | #ifdef WL_EXT_IAPSTA |
---|
3799 | 3838 | if (!wl_ext_iapsta_iftype_enabled(dev, WL_IF_TYPE_AP)) { |
---|
.. | .. |
---|
3837 | 3876 | struct net_device *dev |
---|
3838 | 3877 | #if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 19, 2) || defined(CFG80211_BKPORT_MLO) |
---|
3839 | 3878 | , unsigned int link_id |
---|
3840 | | -#endif |
---|
| 3879 | +#endif /* CFG80211_BKPORT_MLO */ |
---|
3841 | 3880 | ) |
---|
3842 | 3881 | { |
---|
3843 | 3882 | int err = 0; |
---|
.. | .. |
---|
5246 | 5285 | cfg80211_ch_switch_notify(dev, &chandef, 0); |
---|
5247 | 5286 | #else |
---|
5248 | 5287 | cfg80211_ch_switch_notify(dev, &chandef); |
---|
5249 | | -#endif |
---|
| 5288 | +#endif /* CFG80211_BKPORT_MLO */ |
---|
5250 | 5289 | #elif (LINUX_VERSION_CODE >= KERNEL_VERSION (3, 5, 0) && (LINUX_VERSION_CODE <= (3, 7, 0))) |
---|
5251 | 5290 | freq = chandef.freq; |
---|
5252 | 5291 | cfg80211_ch_switch_notify(dev, freq, chandef.chan_type); |
---|