Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge wireless into wireless-next

There are some changes coming to wireless-next that will
otherwise cause conflicts, pull wireless in first to be
able to resolve that when applying the individual changes
rather than having to do merge resolution later.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>

+247 -88
+4 -5
MAINTAINERS
··· 4169 4169 F: drivers/net/ethernet/broadcom/bnxt/ 4170 4170 F: include/linux/firmware/broadcom/tee_bnxt_fw.h 4171 4171 4172 - BROADCOM BRCM80211 IEEE802.11n WIRELESS DRIVER 4173 - M: Arend van Spriel <aspriel@gmail.com> 4174 - M: Franky Lin <franky.lin@broadcom.com> 4175 - M: Hante Meuleman <hante.meuleman@broadcom.com> 4172 + BROADCOM BRCM80211 IEEE802.11 WIRELESS DRIVERS 4173 + M: Arend van Spriel <arend.vanspriel@broadcom.com> 4176 4174 L: linux-wireless@vger.kernel.org 4175 + L: brcm80211@lists.linux.dev 4177 4176 L: brcm80211-dev-list.pdl@broadcom.com 4178 4177 S: Supported 4179 4178 F: drivers/net/wireless/broadcom/brcm80211/ 4179 + F: include/linux/platform_data/brcmfmac.h 4180 4180 4181 4181 BROADCOM BRCMSTB GPIO DRIVER 4182 4182 M: Doug Berger <opendmb@gmail.com> ··· 11128 11128 F: drivers/net/wireless/intel/iwlegacy/ 11129 11129 11130 11130 INTEL WIRELESS WIFI LINK (iwlwifi) 11131 - M: Gregory Greenman <gregory.greenman@intel.com> 11132 11131 M: Miri Korenblit <miriam.rachel.korenblit@intel.com> 11133 11132 L: linux-wireless@vger.kernel.org 11134 11133 S: Supported
+1
drivers/net/wireless/ath/ar5523/ar5523.c
··· 1803 1803 1804 1804 module_usb_driver(ar5523_driver); 1805 1805 1806 + MODULE_DESCRIPTION("Atheros AR5523 wireless driver"); 1806 1807 MODULE_LICENSE("Dual BSD/GPL"); 1807 1808 MODULE_FIRMWARE(AR5523_FIRMWARE_FILE);
+1
drivers/net/wireless/ath/wcn36xx/main.c
··· 1685 1685 1686 1686 module_platform_driver(wcn36xx_driver); 1687 1687 1688 + MODULE_DESCRIPTION("Qualcomm Atheros WCN3660/3680 wireless driver"); 1688 1689 MODULE_LICENSE("Dual BSD/GPL"); 1689 1690 MODULE_AUTHOR("Eugene Krasnikov k.eugene.e@gmail.com"); 1690 1691 MODULE_FIRMWARE(WLAN_NV_FILE);
+1
drivers/net/wireless/broadcom/brcm80211/brcmfmac/bca/module.c
··· 20 20 brcmf_fwvid_unregister_vendor(BRCMF_FWVENDOR_BCA, THIS_MODULE); 21 21 } 22 22 23 + MODULE_DESCRIPTION("Broadcom FullMAC WLAN driver plugin for Broadcom AP chipsets"); 23 24 MODULE_LICENSE("Dual BSD/GPL"); 24 25 MODULE_IMPORT_NS(BRCMFMAC); 25 26
+4 -2
drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
··· 3765 3765 if (req->channels[i] == chan) 3766 3766 break; 3767 3767 } 3768 - if (i == req->n_channels) 3769 - req->channels[req->n_channels++] = chan; 3768 + if (i == req->n_channels) { 3769 + req->n_channels++; 3770 + req->channels[i] = chan; 3771 + } 3770 3772 3771 3773 for (i = 0; i < req->n_ssids; i++) { 3772 3774 if (req->ssids[i].ssid_len == ssid_len &&
+1
drivers/net/wireless/broadcom/brcm80211/brcmfmac/cyw/module.c
··· 20 20 brcmf_fwvid_unregister_vendor(BRCMF_FWVENDOR_CYW, THIS_MODULE); 21 21 } 22 22 23 + MODULE_DESCRIPTION("Broadcom FullMAC WLAN driver plugin for Cypress/Infineon chipsets"); 23 24 MODULE_LICENSE("Dual BSD/GPL"); 24 25 MODULE_IMPORT_NS(BRCMFMAC); 25 26
+1
drivers/net/wireless/broadcom/brcm80211/brcmfmac/wcc/module.c
··· 20 20 brcmf_fwvid_unregister_vendor(BRCMF_FWVENDOR_WCC, THIS_MODULE); 21 21 } 22 22 23 + MODULE_DESCRIPTION("Broadcom FullMAC WLAN driver plugin for Broadcom mobility chipsets"); 23 24 MODULE_LICENSE("Dual BSD/GPL"); 24 25 MODULE_IMPORT_NS(BRCMFMAC); 25 26
+1 -1
drivers/net/wireless/intel/iwlwifi/fw/api/debug.h
··· 537 537 }; /* LDBG_CFG_CMD_TYPE_API_E_VER_1 */ 538 538 539 539 /* this token disables debug asserts in the firmware */ 540 - #define IWL_FW_DBG_CONFIG_TOKEN 0x00011301 540 + #define IWL_FW_DBG_CONFIG_TOKEN 0x00010001 541 541 542 542 /** 543 543 * struct iwl_fw_dbg_config_cmd - configure FW debug
+1 -2
drivers/net/wireless/intel/iwlwifi/fw/dbg.c
··· 1 1 // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause 2 2 /* 3 - * Copyright (C) 2005-2014, 2018-2023 Intel Corporation 3 + * Copyright (C) 2005-2014, 2018-2024 Intel Corporation 4 4 * Copyright (C) 2013-2015 Intel Mobile Communications GmbH 5 5 * Copyright (C) 2015-2017 Intel Deutschland GmbH 6 6 */ ··· 19 19 * @fwrt_ptr: pointer to the buffer coming from fwrt 20 20 * @trans_ptr: pointer to struct %iwl_trans_dump_data which contains the 21 21 * transport's data. 22 - * @trans_len: length of the valid data in trans_ptr 23 22 * @fwrt_len: length of the valid data in fwrt_ptr 24 23 */ 25 24 struct iwl_fw_dump_ptrs {
+1
drivers/net/wireless/intel/iwlwifi/iwl-drv.c
··· 128 128 kfree(drv->fw.ucode_capa.cmd_versions); 129 129 kfree(drv->fw.phy_integration_ver); 130 130 kfree(drv->trans->dbg.pc_data); 131 + drv->trans->dbg.pc_data = NULL; 131 132 132 133 for (i = 0; i < IWL_UCODE_TYPE_MAX; i++) 133 134 iwl_free_fw_img(drv, drv->fw.img + i);
+1 -4
drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.c
··· 668 668 .has_eht = true, 669 669 .eht_cap_elem = { 670 670 .mac_cap_info[0] = 671 - IEEE80211_EHT_MAC_CAP0_EPCS_PRIO_ACCESS | 672 671 IEEE80211_EHT_MAC_CAP0_OM_CONTROL | 673 672 IEEE80211_EHT_MAC_CAP0_TRIG_TXOP_SHARING_MODE1 | 674 673 IEEE80211_EHT_MAC_CAP0_TRIG_TXOP_SHARING_MODE2 | ··· 795 796 .has_eht = true, 796 797 .eht_cap_elem = { 797 798 .mac_cap_info[0] = 798 - IEEE80211_EHT_MAC_CAP0_EPCS_PRIO_ACCESS | 799 799 IEEE80211_EHT_MAC_CAP0_OM_CONTROL | 800 800 IEEE80211_EHT_MAC_CAP0_TRIG_TXOP_SHARING_MODE1 | 801 801 IEEE80211_EHT_MAC_CAP0_TRIG_TXOP_SHARING_MODE2, ··· 1026 1028 if (CSR_HW_REV_TYPE(trans->hw_rev) == IWL_CFG_MAC_TYPE_GL && 1027 1029 iftype_data->eht_cap.has_eht) { 1028 1030 iftype_data->eht_cap.eht_cap_elem.mac_cap_info[0] &= 1029 - ~(IEEE80211_EHT_MAC_CAP0_EPCS_PRIO_ACCESS | 1030 - IEEE80211_EHT_MAC_CAP0_TRIG_TXOP_SHARING_MODE1 | 1031 + ~(IEEE80211_EHT_MAC_CAP0_TRIG_TXOP_SHARING_MODE1 | 1031 1032 IEEE80211_EHT_MAC_CAP0_TRIG_TXOP_SHARING_MODE2); 1032 1033 iftype_data->eht_cap.eht_cap_elem.phy_cap_info[3] &= 1033 1034 ~(IEEE80211_EHT_PHY_CAP0_PARTIAL_BW_UL_MU_MIMO |
+4 -2
drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
··· 1603 1603 */ 1604 1604 if (vif->type == NL80211_IFTYPE_AP || 1605 1605 vif->type == NL80211_IFTYPE_ADHOC) { 1606 - iwl_mvm_vif_dbgfs_add_link(mvm, vif); 1606 + if (!test_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status)) 1607 + iwl_mvm_vif_dbgfs_add_link(mvm, vif); 1607 1608 ret = 0; 1608 1609 goto out; 1609 1610 } ··· 1644 1643 iwl_mvm_chandef_get_primary_80(&vif->bss_conf.chandef); 1645 1644 } 1646 1645 1647 - iwl_mvm_vif_dbgfs_add_link(mvm, vif); 1646 + if (!test_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status)) 1647 + iwl_mvm_vif_dbgfs_add_link(mvm, vif); 1648 1648 1649 1649 if (!test_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status) && 1650 1650 vif->type == NL80211_IFTYPE_STATION && !vif->p2p &&
+5 -4
drivers/net/wireless/intel/iwlwifi/mvm/mld-mac80211.c
··· 81 81 ieee80211_hw_set(mvm->hw, RX_INCLUDES_FCS); 82 82 } 83 83 84 - iwl_mvm_vif_dbgfs_add_link(mvm, vif); 84 + if (!test_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status)) 85 + iwl_mvm_vif_dbgfs_add_link(mvm, vif); 85 86 86 87 if (!test_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status) && 87 88 vif->type == NL80211_IFTYPE_STATION && !vif->p2p && ··· 435 434 mvmvif->ap_ibss_active = false; 436 435 } 437 436 437 + iwl_mvm_link_changed(mvm, vif, link_conf, 438 + LINK_CONTEXT_MODIFY_ACTIVE, false); 439 + 438 440 if (iwl_mvm_is_esr_supported(mvm->fwrt.trans) && n_active > 1) { 439 441 int ret = iwl_mvm_esr_mode_inactive(mvm, vif); 440 442 ··· 448 444 449 445 if (vif->type == NL80211_IFTYPE_MONITOR) 450 446 iwl_mvm_mld_rm_snif_sta(mvm, vif); 451 - 452 - iwl_mvm_link_changed(mvm, vif, link_conf, 453 - LINK_CONTEXT_MODIFY_ACTIVE, false); 454 447 455 448 if (switching_chanctx) 456 449 return;
+1
drivers/net/wireless/intersil/p54/p54spi.c
··· 700 700 701 701 module_spi_driver(p54spi_driver); 702 702 703 + MODULE_DESCRIPTION("Prism54 SPI wireless driver"); 703 704 MODULE_LICENSE("GPL"); 704 705 MODULE_AUTHOR("Christian Lamparter <chunkeey@web.de>"); 705 706 MODULE_ALIAS("spi:cx3110x");
+1
drivers/net/wireless/mediatek/mt76/mt7603/main.c
··· 728 728 .set_sar_specs = mt7603_set_sar_specs, 729 729 }; 730 730 731 + MODULE_DESCRIPTION("MediaTek MT7603E and MT76x8 wireless driver"); 731 732 MODULE_LICENSE("Dual BSD/GPL"); 732 733 733 734 static int __init mt7603_init(void)
+1
drivers/net/wireless/mediatek/mt76/mt7615/main.c
··· 1375 1375 }; 1376 1376 EXPORT_SYMBOL_GPL(mt7615_ops); 1377 1377 1378 + MODULE_DESCRIPTION("MediaTek MT7615E and MT7663E wireless driver"); 1378 1379 MODULE_LICENSE("Dual BSD/GPL");
+1
drivers/net/wireless/mediatek/mt76/mt7615/mmio.c
··· 270 270 271 271 module_init(mt7615_init); 272 272 module_exit(mt7615_exit); 273 + MODULE_DESCRIPTION("MediaTek MT7615E MMIO helpers"); 273 274 MODULE_LICENSE("Dual BSD/GPL");
+1
drivers/net/wireless/mediatek/mt76/mt7615/sdio.c
··· 253 253 254 254 MODULE_AUTHOR("Sean Wang <sean.wang@mediatek.com>"); 255 255 MODULE_AUTHOR("Lorenzo Bianconi <lorenzo@kernel.org>"); 256 + MODULE_DESCRIPTION("MediaTek MT7663S (SDIO) wireless driver"); 256 257 MODULE_LICENSE("Dual BSD/GPL");
+1
drivers/net/wireless/mediatek/mt76/mt7615/usb.c
··· 281 281 282 282 MODULE_AUTHOR("Sean Wang <sean.wang@mediatek.com>"); 283 283 MODULE_AUTHOR("Lorenzo Bianconi <lorenzo@kernel.org>"); 284 + MODULE_DESCRIPTION("MediaTek MT7663U (USB) wireless driver"); 284 285 MODULE_LICENSE("Dual BSD/GPL");
+1
drivers/net/wireless/mediatek/mt76/mt7615/usb_sdio.c
··· 349 349 350 350 MODULE_AUTHOR("Lorenzo Bianconi <lorenzo@kernel.org>"); 351 351 MODULE_AUTHOR("Sean Wang <sean.wang@mediatek.com>"); 352 + MODULE_DESCRIPTION("MediaTek MT7663 SDIO/USB helpers"); 352 353 MODULE_LICENSE("Dual BSD/GPL");
+1
drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c
··· 3160 3160 EXPORT_SYMBOL_GPL(mt76_connac2_mcu_fill_message); 3161 3161 3162 3162 MODULE_AUTHOR("Lorenzo Bianconi <lorenzo@kernel.org>"); 3163 + MODULE_DESCRIPTION("MediaTek MT76x connac layer helpers"); 3163 3164 MODULE_LICENSE("Dual BSD/GPL");
+1
drivers/net/wireless/mediatek/mt76/mt76x0/eeprom.c
··· 342 342 return 0; 343 343 } 344 344 345 + MODULE_DESCRIPTION("MediaTek MT76x EEPROM helpers"); 345 346 MODULE_LICENSE("Dual BSD/GPL");
+1
drivers/net/wireless/mediatek/mt76/mt76x0/pci.c
··· 302 302 MODULE_DEVICE_TABLE(pci, mt76x0e_device_table); 303 303 MODULE_FIRMWARE(MT7610E_FIRMWARE); 304 304 MODULE_FIRMWARE(MT7650E_FIRMWARE); 305 + MODULE_DESCRIPTION("MediaTek MT76x0E (PCIe) wireless driver"); 305 306 MODULE_LICENSE("Dual BSD/GPL"); 306 307 307 308 static struct pci_driver mt76x0e_driver = {
+1
drivers/net/wireless/mediatek/mt76/mt76x0/usb.c
··· 336 336 MODULE_DEVICE_TABLE(usb, mt76x0_device_table); 337 337 MODULE_FIRMWARE(MT7610E_FIRMWARE); 338 338 MODULE_FIRMWARE(MT7610U_FIRMWARE); 339 + MODULE_DESCRIPTION("MediaTek MT76x0U (USB) wireless driver"); 339 340 MODULE_LICENSE("GPL"); 340 341 341 342 static struct usb_driver mt76x0_driver = {
+1
drivers/net/wireless/mediatek/mt76/mt76x02_usb_mcu.c
··· 293 293 EXPORT_SYMBOL_GPL(mt76x02u_init_mcu); 294 294 295 295 MODULE_AUTHOR("Lorenzo Bianconi <lorenzo.bianconi83@gmail.com>"); 296 + MODULE_DESCRIPTION("MediaTek MT76x02 MCU helpers"); 296 297 MODULE_LICENSE("Dual BSD/GPL");
+1
drivers/net/wireless/mediatek/mt76/mt76x02_util.c
··· 696 696 } 697 697 EXPORT_SYMBOL_GPL(mt76x02_config_mac_addr_list); 698 698 699 + MODULE_DESCRIPTION("MediaTek MT76x02 helpers"); 699 700 MODULE_LICENSE("Dual BSD/GPL");
+1
drivers/net/wireless/mediatek/mt76/mt76x2/eeprom.c
··· 506 506 } 507 507 EXPORT_SYMBOL_GPL(mt76x2_eeprom_init); 508 508 509 + MODULE_DESCRIPTION("MediaTek MT76x2 EEPROM helpers"); 509 510 MODULE_LICENSE("Dual BSD/GPL");
+1
drivers/net/wireless/mediatek/mt76/mt76x2/pci.c
··· 165 165 MODULE_DEVICE_TABLE(pci, mt76x2e_device_table); 166 166 MODULE_FIRMWARE(MT7662_FIRMWARE); 167 167 MODULE_FIRMWARE(MT7662_ROM_PATCH); 168 + MODULE_DESCRIPTION("MediaTek MT76x2E (PCIe) wireless driver"); 168 169 MODULE_LICENSE("Dual BSD/GPL"); 169 170 170 171 static struct pci_driver mt76pci_driver = {
+1
drivers/net/wireless/mediatek/mt76/mt76x2/usb.c
··· 147 147 module_usb_driver(mt76x2u_driver); 148 148 149 149 MODULE_AUTHOR("Lorenzo Bianconi <lorenzo.bianconi83@gmail.com>"); 150 + MODULE_DESCRIPTION("MediaTek MT76x2U (USB) wireless driver"); 150 151 MODULE_LICENSE("Dual BSD/GPL");
+1
drivers/net/wireless/mediatek/mt76/mt7915/mmio.c
··· 958 958 959 959 module_init(mt7915_init); 960 960 module_exit(mt7915_exit); 961 + MODULE_DESCRIPTION("MediaTek MT7915E MMIO helpers"); 961 962 MODULE_LICENSE("Dual BSD/GPL");
+1
drivers/net/wireless/mediatek/mt76/mt7921/main.c
··· 1418 1418 }; 1419 1419 EXPORT_SYMBOL_GPL(mt7921_ops); 1420 1420 1421 + MODULE_DESCRIPTION("MediaTek MT7921 core driver"); 1421 1422 MODULE_LICENSE("Dual BSD/GPL"); 1422 1423 MODULE_AUTHOR("Sean Wang <sean.wang@mediatek.com>");
+1
drivers/net/wireless/mediatek/mt76/mt7921/pci.c
··· 544 544 MODULE_FIRMWARE(MT7922_ROM_PATCH); 545 545 MODULE_AUTHOR("Sean Wang <sean.wang@mediatek.com>"); 546 546 MODULE_AUTHOR("Lorenzo Bianconi <lorenzo@kernel.org>"); 547 + MODULE_DESCRIPTION("MediaTek MT7921E (PCIe) wireless driver"); 547 548 MODULE_LICENSE("Dual BSD/GPL");
+1
drivers/net/wireless/mediatek/mt76/mt7921/sdio.c
··· 323 323 .drv.pm = pm_sleep_ptr(&mt7921s_pm_ops), 324 324 }; 325 325 module_sdio_driver(mt7921s_driver); 326 + MODULE_DESCRIPTION("MediaTek MT7921S (SDIO) wireless driver"); 326 327 MODULE_AUTHOR("Sean Wang <sean.wang@mediatek.com>"); 327 328 MODULE_LICENSE("Dual BSD/GPL");
+1
drivers/net/wireless/mediatek/mt76/mt7921/usb.c
··· 336 336 }; 337 337 module_usb_driver(mt7921u_driver); 338 338 339 + MODULE_DESCRIPTION("MediaTek MT7921U (USB) wireless driver"); 339 340 MODULE_AUTHOR("Lorenzo Bianconi <lorenzo@kernel.org>"); 340 341 MODULE_LICENSE("Dual BSD/GPL");
+1
drivers/net/wireless/mediatek/mt76/mt7925/main.c
··· 1450 1450 EXPORT_SYMBOL_GPL(mt7925_ops); 1451 1451 1452 1452 MODULE_AUTHOR("Deren Wu <deren.wu@mediatek.com>"); 1453 + MODULE_DESCRIPTION("MediaTek MT7925 core driver"); 1453 1454 MODULE_LICENSE("Dual BSD/GPL");
+1
drivers/net/wireless/mediatek/mt76/mt7925/pci.c
··· 583 583 MODULE_FIRMWARE(MT7925_ROM_PATCH); 584 584 MODULE_AUTHOR("Deren Wu <deren.wu@mediatek.com>"); 585 585 MODULE_AUTHOR("Lorenzo Bianconi <lorenzo@kernel.org>"); 586 + MODULE_DESCRIPTION("MediaTek MT7925E (PCIe) wireless driver"); 586 587 MODULE_LICENSE("Dual BSD/GPL");
+1
drivers/net/wireless/mediatek/mt76/mt7925/usb.c
··· 329 329 module_usb_driver(mt7925u_driver); 330 330 331 331 MODULE_AUTHOR("Lorenzo Bianconi <lorenzo@kernel.org>"); 332 + MODULE_DESCRIPTION("MediaTek MT7925U (USB) wireless driver"); 332 333 MODULE_LICENSE("Dual BSD/GPL");
+1
drivers/net/wireless/mediatek/mt76/mt792x_core.c
··· 862 862 } 863 863 EXPORT_SYMBOL_GPL(mt792x_load_firmware); 864 864 865 + MODULE_DESCRIPTION("MediaTek MT792x core driver"); 865 866 MODULE_LICENSE("Dual BSD/GPL"); 866 867 MODULE_AUTHOR("Lorenzo Bianconi <lorenzo@kernel.org>");
+1
drivers/net/wireless/mediatek/mt76/mt792x_usb.c
··· 314 314 } 315 315 EXPORT_SYMBOL_GPL(mt792xu_disconnect); 316 316 317 + MODULE_DESCRIPTION("MediaTek MT792x USB helpers"); 317 318 MODULE_LICENSE("Dual BSD/GPL"); 318 319 MODULE_AUTHOR("Lorenzo Bianconi <lorenzo@kernel.org>");
+2 -1
drivers/net/wireless/mediatek/mt76/mt7996/mcu.c
··· 4477 4477 4478 4478 skb_put_data(skb, &req, sizeof(req)); 4479 4479 /* cck and ofdm */ 4480 - skb_put_data(skb, &la.cck, sizeof(la.cck) + sizeof(la.ofdm)); 4480 + skb_put_data(skb, &la.cck, sizeof(la.cck)); 4481 + skb_put_data(skb, &la.ofdm, sizeof(la.ofdm)); 4481 4482 /* ht20 */ 4482 4483 skb_put_data(skb, &la.mcs[0], 8); 4483 4484 /* ht40 */
+1
drivers/net/wireless/mediatek/mt76/mt7996/mmio.c
··· 650 650 651 651 module_init(mt7996_init); 652 652 module_exit(mt7996_exit); 653 + MODULE_DESCRIPTION("MediaTek MT7996 MMIO helpers"); 653 654 MODULE_LICENSE("Dual BSD/GPL");
+1
drivers/net/wireless/mediatek/mt76/sdio.c
··· 672 672 673 673 MODULE_AUTHOR("Sean Wang <sean.wang@mediatek.com>"); 674 674 MODULE_AUTHOR("Lorenzo Bianconi <lorenzo@kernel.org>"); 675 + MODULE_DESCRIPTION("MediaTek MT76x SDIO helpers"); 675 676 MODULE_LICENSE("Dual BSD/GPL");
+1
drivers/net/wireless/mediatek/mt76/usb.c
··· 1128 1128 EXPORT_SYMBOL_GPL(mt76u_init); 1129 1129 1130 1130 MODULE_AUTHOR("Lorenzo Bianconi <lorenzo.bianconi83@gmail.com>"); 1131 + MODULE_DESCRIPTION("MediaTek MT76x USB helpers"); 1131 1132 MODULE_LICENSE("Dual BSD/GPL");
+1
drivers/net/wireless/mediatek/mt76/util.c
··· 138 138 } 139 139 EXPORT_SYMBOL_GPL(__mt76_worker_fn); 140 140 141 + MODULE_DESCRIPTION("MediaTek MT76x helpers"); 141 142 MODULE_LICENSE("Dual BSD/GPL");
+1
drivers/net/wireless/microchip/wilc1000/netdev.c
··· 1010 1010 return ERR_PTR(ret); 1011 1011 } 1012 1012 1013 + MODULE_DESCRIPTION("Atmel WILC1000 core wireless driver"); 1013 1014 MODULE_LICENSE("GPL"); 1014 1015 MODULE_FIRMWARE(WILC1000_FW(WILC1000_API_VER));
+1
drivers/net/wireless/microchip/wilc1000/sdio.c
··· 984 984 module_driver(wilc_sdio_driver, 985 985 sdio_register_driver, 986 986 sdio_unregister_driver); 987 + MODULE_DESCRIPTION("Atmel WILC1000 SDIO wireless driver"); 987 988 MODULE_LICENSE("GPL");
+1
drivers/net/wireless/microchip/wilc1000/spi.c
··· 273 273 .remove = wilc_bus_remove, 274 274 }; 275 275 module_spi_driver(wilc_spi_driver); 276 + MODULE_DESCRIPTION("Atmel WILC1000 SPI wireless driver"); 276 277 MODULE_LICENSE("GPL"); 277 278 278 279 static int wilc_spi_tx(struct wilc *wilc, u8 *b, u32 len)
+1
drivers/net/wireless/ti/wl1251/sdio.c
··· 343 343 module_init(wl1251_sdio_init); 344 344 module_exit(wl1251_sdio_exit); 345 345 346 + MODULE_DESCRIPTION("TI WL1251 SDIO helpers"); 346 347 MODULE_LICENSE("GPL"); 347 348 MODULE_AUTHOR("Kalle Valo <kvalo@adurom.com>");
+1
drivers/net/wireless/ti/wl1251/spi.c
··· 342 342 343 343 module_spi_driver(wl1251_spi_driver); 344 344 345 + MODULE_DESCRIPTION("TI WL1251 SPI helpers"); 345 346 MODULE_LICENSE("GPL"); 346 347 MODULE_AUTHOR("Kalle Valo <kvalo@adurom.com>"); 347 348 MODULE_ALIAS("spi:wl1251");
+1
drivers/net/wireless/ti/wl12xx/main.c
··· 1955 1955 MODULE_PARM_DESC(tcxo, 1956 1956 "TCXO clock: 19.2, 26, 38.4, 52, 16.368, 32.736, 16.8, 33.6"); 1957 1957 1958 + MODULE_DESCRIPTION("TI WL12xx wireless driver"); 1958 1959 MODULE_LICENSE("GPL v2"); 1959 1960 MODULE_AUTHOR("Luciano Coelho <coelho@ti.com>"); 1960 1961 MODULE_FIRMWARE(WL127X_FW_NAME_SINGLE);
+1
drivers/net/wireless/ti/wl18xx/main.c
··· 2086 2086 MODULE_PARM_DESC(num_rx_desc_param, 2087 2087 "Number of Rx descriptors: u8 (default is 32)"); 2088 2088 2089 + MODULE_DESCRIPTION("TI WiLink 8 wireless driver"); 2089 2090 MODULE_LICENSE("GPL v2"); 2090 2091 MODULE_AUTHOR("Luciano Coelho <coelho@ti.com>"); 2091 2092 MODULE_FIRMWARE(WL18XX_FW_NAME);
+1
drivers/net/wireless/ti/wlcore/main.c
··· 6793 6793 module_param(no_recovery, int, 0600); 6794 6794 MODULE_PARM_DESC(no_recovery, "Prevent HW recovery. FW will remain stuck."); 6795 6795 6796 + MODULE_DESCRIPTION("TI WLAN core driver"); 6796 6797 MODULE_LICENSE("GPL"); 6797 6798 MODULE_AUTHOR("Luciano Coelho <coelho@ti.com>"); 6798 6799 MODULE_AUTHOR("Juuso Oikarinen <juuso.oikarinen@nokia.com>");
+1
drivers/net/wireless/ti/wlcore/sdio.c
··· 446 446 module_param(dump, bool, 0600); 447 447 MODULE_PARM_DESC(dump, "Enable sdio read/write dumps."); 448 448 449 + MODULE_DESCRIPTION("TI WLAN SDIO helpers"); 449 450 MODULE_LICENSE("GPL"); 450 451 MODULE_AUTHOR("Luciano Coelho <coelho@ti.com>"); 451 452 MODULE_AUTHOR("Juuso Oikarinen <juuso.oikarinen@nokia.com>");
+1
drivers/net/wireless/ti/wlcore/spi.c
··· 562 562 }; 563 563 564 564 module_spi_driver(wl1271_spi_driver); 565 + MODULE_DESCRIPTION("TI WLAN SPI helpers"); 565 566 MODULE_LICENSE("GPL"); 566 567 MODULE_AUTHOR("Luciano Coelho <coelho@ti.com>"); 567 568 MODULE_AUTHOR("Juuso Oikarinen <juuso.oikarinen@nokia.com>");
+4
include/net/cfg80211.h
··· 2902 2902 * own the beacon_ies, but they're just pointers to the ones from the 2903 2903 * @hidden_beacon_bss struct) 2904 2904 * @proberesp_ies: the information elements from the last Probe Response frame 2905 + * @proberesp_ecsa_stuck: ECSA element is stuck in the Probe Response frame, 2906 + * cannot rely on it having valid data 2905 2907 * @hidden_beacon_bss: in case this BSS struct represents a probe response from 2906 2908 * a BSS that hides the SSID in its beacon, this points to the BSS struct 2907 2909 * that holds the beacon data. @beacon_ies is still valid, of course, and ··· 2943 2941 u8 bssid[ETH_ALEN]; 2944 2942 u8 chains; 2945 2943 s8 chain_signal[IEEE80211_MAX_CHAINS]; 2944 + 2945 + u8 proberesp_ecsa_stuck:1; 2946 2946 2947 2947 u8 bssid_index; 2948 2948 u8 max_bssid_indicator;
+9 -7
net/mac80211/cfg.c
··· 5 5 * Copyright 2006-2010 Johannes Berg <johannes@sipsolutions.net> 6 6 * Copyright 2013-2015 Intel Mobile Communications GmbH 7 7 * Copyright (C) 2015-2017 Intel Deutschland GmbH 8 - * Copyright (C) 2018-2022 Intel Corporation 8 + * Copyright (C) 2018-2024 Intel Corporation 9 9 */ 10 10 11 11 #include <linux/ieee80211.h> ··· 989 989 ieee80211_set_unsol_bcast_probe_resp(struct ieee80211_sub_if_data *sdata, 990 990 struct cfg80211_unsol_bcast_probe_resp *params, 991 991 struct ieee80211_link_data *link, 992 - struct ieee80211_bss_conf *link_conf) 992 + struct ieee80211_bss_conf *link_conf, 993 + u64 *changed) 993 994 { 994 995 struct unsol_bcast_probe_resp_data *new, *old = NULL; 995 996 ··· 1014 1013 RCU_INIT_POINTER(link->u.ap.unsol_bcast_probe_resp, NULL); 1015 1014 } 1016 1015 1017 - return BSS_CHANGED_UNSOL_BCAST_PROBE_RESP; 1016 + *changed |= BSS_CHANGED_UNSOL_BCAST_PROBE_RESP; 1017 + return 0; 1018 1018 } 1019 1019 1020 1020 static int ieee80211_set_ftm_responder_params( ··· 1453 1451 1454 1452 err = ieee80211_set_unsol_bcast_probe_resp(sdata, 1455 1453 &params->unsol_bcast_probe_resp, 1456 - link, link_conf); 1454 + link, link_conf, &changed); 1457 1455 if (err < 0) 1458 1456 goto error; 1459 - changed |= err; 1460 1457 1461 1458 err = drv_start_ap(sdata->local, sdata, link_conf); 1462 1459 if (err) { ··· 1526 1525 1527 1526 err = ieee80211_set_unsol_bcast_probe_resp(sdata, 1528 1527 &params->unsol_bcast_probe_resp, 1529 - link, link_conf); 1528 + link, link_conf, &changed); 1530 1529 if (err < 0) 1531 1530 return err; 1532 - changed |= err; 1533 1531 1534 1532 if (beacon->he_bss_color_valid && 1535 1533 beacon->he_bss_color.enabled != link_conf->he_bss_color.enabled) { ··· 1868 1868 params->opmode_notif, 1869 1869 sband->band); 1870 1870 } 1871 + 1872 + ieee80211_sta_set_rx_nss(link_sta); 1871 1873 1872 1874 return ret; 1873 1875 }
+2 -2
net/mac80211/debugfs_netdev.c
··· 997 997 } 998 998 } 999 999 1000 - void ieee80211_debugfs_add_netdev(struct ieee80211_sub_if_data *sdata, 1001 - bool mld_vif) 1000 + static void ieee80211_debugfs_add_netdev(struct ieee80211_sub_if_data *sdata, 1001 + bool mld_vif) 1002 1002 { 1003 1003 char buf[10+IFNAMSIZ]; 1004 1004
-5
net/mac80211/debugfs_netdev.h
··· 11 11 #include "ieee80211_i.h" 12 12 13 13 #ifdef CONFIG_MAC80211_DEBUGFS 14 - void ieee80211_debugfs_add_netdev(struct ieee80211_sub_if_data *sdata, 15 - bool mld_vif); 16 14 void ieee80211_debugfs_remove_netdev(struct ieee80211_sub_if_data *sdata); 17 15 void ieee80211_debugfs_rename_netdev(struct ieee80211_sub_if_data *sdata); 18 16 void ieee80211_debugfs_recreate_netdev(struct ieee80211_sub_if_data *sdata, ··· 22 24 void ieee80211_link_debugfs_drv_add(struct ieee80211_link_data *link); 23 25 void ieee80211_link_debugfs_drv_remove(struct ieee80211_link_data *link); 24 26 #else 25 - static inline void ieee80211_debugfs_add_netdev( 26 - struct ieee80211_sub_if_data *sdata, bool mld_vif) 27 - {} 28 27 static inline void ieee80211_debugfs_remove_netdev( 29 28 struct ieee80211_sub_if_data *sdata) 30 29 {}
+1 -1
net/mac80211/iface.c
··· 1799 1799 /* need to do this after the switch so vif.type is correct */ 1800 1800 ieee80211_link_setup(&sdata->deflink); 1801 1801 1802 - ieee80211_debugfs_add_netdev(sdata, false); 1802 + ieee80211_debugfs_recreate_netdev(sdata, false); 1803 1803 } 1804 1804 1805 1805 static int ieee80211_runtime_change_iftype(struct ieee80211_sub_if_data *sdata,
+81 -33
net/mac80211/mlme.c
··· 8 8 * Copyright 2007, Michael Wu <flamingice@sourmilk.net> 9 9 * Copyright 2013-2014 Intel Mobile Communications GmbH 10 10 * Copyright (C) 2015 - 2017 Intel Deutschland GmbH 11 - * Copyright (C) 2018 - 2023 Intel Corporation 11 + * Copyright (C) 2018 - 2024 Intel Corporation 12 12 */ 13 13 14 14 #include <linux/delay.h> ··· 2918 2918 2919 2919 /* other links will be destroyed */ 2920 2920 sdata->deflink.u.mgd.bss = NULL; 2921 + sdata->deflink.smps_mode = IEEE80211_SMPS_OFF; 2921 2922 2922 2923 netif_carrier_off(sdata->dev); 2923 2924 ··· 5031 5030 5032 5031 if (!link) 5033 5032 return 0; 5034 - 5035 - /* will change later if needed */ 5036 - link->smps_mode = IEEE80211_SMPS_OFF; 5037 5033 5038 5034 /* 5039 5035 * If this fails (possibly due to channel context sharing ··· 7496 7498 link->u.mgd.p2p_noa_index = -1; 7497 7499 link->u.mgd.conn_flags = 0; 7498 7500 link->conf->bssid = link->u.mgd.bssid; 7501 + link->smps_mode = IEEE80211_SMPS_OFF; 7499 7502 7500 7503 wiphy_work_init(&link->u.mgd.request_smps_work, 7501 7504 ieee80211_request_smps_mgd_work); ··· 7710 7711 return err; 7711 7712 } 7712 7713 7714 + static bool ieee80211_mgd_csa_present(struct ieee80211_sub_if_data *sdata, 7715 + const struct cfg80211_bss_ies *ies, 7716 + u8 cur_channel, bool ignore_ecsa) 7717 + { 7718 + const struct element *csa_elem, *ecsa_elem; 7719 + struct ieee80211_channel_sw_ie *csa = NULL; 7720 + struct ieee80211_ext_chansw_ie *ecsa = NULL; 7721 + 7722 + if (!ies) 7723 + return false; 7724 + 7725 + csa_elem = cfg80211_find_elem(WLAN_EID_CHANNEL_SWITCH, 7726 + ies->data, ies->len); 7727 + if (csa_elem && csa_elem->datalen == sizeof(*csa)) 7728 + csa = (void *)csa_elem->data; 7729 + 7730 + ecsa_elem = cfg80211_find_elem(WLAN_EID_EXT_CHANSWITCH_ANN, 7731 + ies->data, ies->len); 7732 + if (ecsa_elem && ecsa_elem->datalen == sizeof(*ecsa)) 7733 + ecsa = (void *)ecsa_elem->data; 7734 + 7735 + if (csa && csa->count == 0) 7736 + csa = NULL; 7737 + if (csa && !csa->mode && csa->new_ch_num == cur_channel) 7738 + csa = NULL; 7739 + 7740 + if (ecsa && ecsa->count == 0) 7741 + ecsa = NULL; 7742 + if (ecsa && !ecsa->mode && ecsa->new_ch_num == cur_channel) 7743 + ecsa = NULL; 7744 + 7745 + if (ignore_ecsa && ecsa) { 7746 + sdata_info(sdata, 7747 + "Ignoring ECSA in probe response - was considered stuck!\n"); 7748 + return csa; 7749 + } 7750 + 7751 + return csa || ecsa; 7752 + } 7753 + 7754 + static bool ieee80211_mgd_csa_in_process(struct ieee80211_sub_if_data *sdata, 7755 + struct cfg80211_bss *bss) 7756 + { 7757 + u8 cur_channel; 7758 + bool ret; 7759 + 7760 + cur_channel = ieee80211_frequency_to_channel(bss->channel->center_freq); 7761 + 7762 + rcu_read_lock(); 7763 + if (ieee80211_mgd_csa_present(sdata, 7764 + rcu_dereference(bss->beacon_ies), 7765 + cur_channel, false)) { 7766 + ret = true; 7767 + goto out; 7768 + } 7769 + 7770 + if (ieee80211_mgd_csa_present(sdata, 7771 + rcu_dereference(bss->proberesp_ies), 7772 + cur_channel, bss->proberesp_ecsa_stuck)) { 7773 + ret = true; 7774 + goto out; 7775 + } 7776 + 7777 + ret = false; 7778 + out: 7779 + rcu_read_unlock(); 7780 + return ret; 7781 + } 7782 + 7713 7783 /* config hooks */ 7714 7784 int ieee80211_mgd_auth(struct ieee80211_sub_if_data *sdata, 7715 7785 struct cfg80211_auth_request *req) ··· 7787 7719 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; 7788 7720 struct ieee80211_mgd_auth_data *auth_data; 7789 7721 struct ieee80211_link_data *link; 7790 - const struct element *csa_elem, *ecsa_elem; 7791 7722 u16 auth_alg; 7792 7723 int err; 7793 7724 bool cont_auth; ··· 7829 7762 if (ifmgd->assoc_data) 7830 7763 return -EBUSY; 7831 7764 7832 - rcu_read_lock(); 7833 - csa_elem = ieee80211_bss_get_elem(req->bss, WLAN_EID_CHANNEL_SWITCH); 7834 - ecsa_elem = ieee80211_bss_get_elem(req->bss, 7835 - WLAN_EID_EXT_CHANSWITCH_ANN); 7836 - if ((csa_elem && 7837 - csa_elem->datalen == sizeof(struct ieee80211_channel_sw_ie) && 7838 - ((struct ieee80211_channel_sw_ie *)csa_elem->data)->count != 0) || 7839 - (ecsa_elem && 7840 - ecsa_elem->datalen == sizeof(struct ieee80211_ext_chansw_ie) && 7841 - ((struct ieee80211_ext_chansw_ie *)ecsa_elem->data)->count != 0)) { 7842 - rcu_read_unlock(); 7765 + if (ieee80211_mgd_csa_in_process(sdata, req->bss)) { 7843 7766 sdata_info(sdata, "AP is in CSA process, reject auth\n"); 7844 7767 return -EINVAL; 7845 7768 } 7846 - rcu_read_unlock(); 7847 7769 7848 7770 auth_data = kzalloc(sizeof(*auth_data) + req->auth_data_len + 7849 7771 req->ie_len, GFP_KERNEL); ··· 8142 8086 struct ieee80211_local *local = sdata->local; 8143 8087 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; 8144 8088 struct ieee80211_mgd_assoc_data *assoc_data; 8145 - const struct element *ssid_elem, *csa_elem, *ecsa_elem; 8089 + const struct element *ssid_elem; 8146 8090 struct ieee80211_vif_cfg *vif_cfg = &sdata->vif.cfg; 8147 8091 ieee80211_conn_flags_t conn_flags = 0; 8148 8092 struct ieee80211_link_data *link; ··· 8165 8109 8166 8110 cbss = req->link_id < 0 ? req->bss : req->links[req->link_id].bss; 8167 8111 8168 - rcu_read_lock(); 8169 - ssid_elem = ieee80211_bss_get_elem(cbss, WLAN_EID_SSID); 8170 - if (!ssid_elem || ssid_elem->datalen > sizeof(assoc_data->ssid)) { 8171 - rcu_read_unlock(); 8112 + if (ieee80211_mgd_csa_in_process(sdata, cbss)) { 8113 + sdata_info(sdata, "AP is in CSA process, reject assoc\n"); 8172 8114 kfree(assoc_data); 8173 8115 return -EINVAL; 8174 8116 } 8175 8117 8176 - csa_elem = ieee80211_bss_get_elem(cbss, WLAN_EID_CHANNEL_SWITCH); 8177 - ecsa_elem = ieee80211_bss_get_elem(cbss, WLAN_EID_EXT_CHANSWITCH_ANN); 8178 - if ((csa_elem && 8179 - csa_elem->datalen == sizeof(struct ieee80211_channel_sw_ie) && 8180 - ((struct ieee80211_channel_sw_ie *)csa_elem->data)->count != 0) || 8181 - (ecsa_elem && 8182 - ecsa_elem->datalen == sizeof(struct ieee80211_ext_chansw_ie) && 8183 - ((struct ieee80211_ext_chansw_ie *)ecsa_elem->data)->count != 0)) { 8184 - sdata_info(sdata, "AP is in CSA process, reject assoc\n"); 8118 + rcu_read_lock(); 8119 + ssid_elem = ieee80211_bss_get_elem(cbss, WLAN_EID_SSID); 8120 + if (!ssid_elem || ssid_elem->datalen > sizeof(assoc_data->ssid)) { 8185 8121 rcu_read_unlock(); 8186 8122 kfree(assoc_data); 8187 8123 return -EINVAL; ··· 8450 8402 8451 8403 rcu_read_lock(); 8452 8404 beacon_ies = rcu_dereference(req->bss->beacon_ies); 8453 - 8454 - if (beacon_ies) { 8405 + if (!beacon_ies) { 8455 8406 /* 8456 8407 * Wait up to one beacon interval ... 8457 8408 * should this be more if we miss one? ··· 8531 8484 ieee80211_report_disconnect(sdata, frame_buf, 8532 8485 sizeof(frame_buf), true, 8533 8486 req->reason_code, false); 8487 + drv_mgd_complete_tx(sdata->local, sdata, &info); 8534 8488 return 0; 8535 8489 } 8536 8490
+18 -12
net/mac80211/scan.c
··· 9 9 * Copyright 2007, Michael Wu <flamingice@sourmilk.net> 10 10 * Copyright 2013-2015 Intel Mobile Communications GmbH 11 11 * Copyright 2016-2017 Intel Deutschland GmbH 12 - * Copyright (C) 2018-2023 Intel Corporation 12 + * Copyright (C) 2018-2024 Intel Corporation 13 13 */ 14 14 15 15 #include <linux/if_arp.h> ··· 237 237 } 238 238 239 239 static bool ieee80211_scan_accept_presp(struct ieee80211_sub_if_data *sdata, 240 + struct ieee80211_channel *channel, 240 241 u32 scan_flags, const u8 *da) 241 242 { 242 243 if (!sdata) 243 244 return false; 244 - /* accept broadcast for OCE */ 245 - if (scan_flags & NL80211_SCAN_FLAG_ACCEPT_BCAST_PROBE_RESP && 246 - is_broadcast_ether_addr(da)) 245 + 246 + /* accept broadcast on 6 GHz and for OCE */ 247 + if (is_broadcast_ether_addr(da) && 248 + (channel->band == NL80211_BAND_6GHZ || 249 + scan_flags & NL80211_SCAN_FLAG_ACCEPT_BCAST_PROBE_RESP)) 247 250 return true; 251 + 248 252 if (scan_flags & NL80211_SCAN_FLAG_RANDOM_ADDR) 249 253 return true; 250 254 return ether_addr_equal(da, sdata->vif.addr); ··· 297 293 wiphy_delayed_work_queue(local->hw.wiphy, &local->scan_work, 0); 298 294 } 299 295 296 + channel = ieee80211_get_channel_khz(local->hw.wiphy, 297 + ieee80211_rx_status_to_khz(rx_status)); 298 + 299 + if (!channel || channel->flags & IEEE80211_CHAN_DISABLED) 300 + return; 301 + 300 302 if (ieee80211_is_probe_resp(mgmt->frame_control)) { 301 303 struct cfg80211_scan_request *scan_req; 302 304 struct cfg80211_sched_scan_request *sched_scan_req; ··· 320 310 /* ignore ProbeResp to foreign address or non-bcast (OCE) 321 311 * unless scanning with randomised address 322 312 */ 323 - if (!ieee80211_scan_accept_presp(sdata1, scan_req_flags, 313 + if (!ieee80211_scan_accept_presp(sdata1, channel, 314 + scan_req_flags, 324 315 mgmt->da) && 325 - !ieee80211_scan_accept_presp(sdata2, sched_scan_req_flags, 316 + !ieee80211_scan_accept_presp(sdata2, channel, 317 + sched_scan_req_flags, 326 318 mgmt->da)) 327 319 return; 328 320 } 329 - 330 - channel = ieee80211_get_channel_khz(local->hw.wiphy, 331 - ieee80211_rx_status_to_khz(rx_status)); 332 - 333 - if (!channel || channel->flags & IEEE80211_CHAN_DISABLED) 334 - return; 335 321 336 322 bss = ieee80211_bss_info_update(local, rx_status, 337 323 mgmt, skb->len,
+4 -3
net/mac80211/tx.c
··· 3100 3100 /* DA SA BSSID */ 3101 3101 build.da_offs = offsetof(struct ieee80211_hdr, addr1); 3102 3102 build.sa_offs = offsetof(struct ieee80211_hdr, addr2); 3103 + rcu_read_lock(); 3103 3104 link = rcu_dereference(sdata->link[tdls_link_id]); 3104 - if (WARN_ON_ONCE(!link)) 3105 - break; 3106 - memcpy(hdr->addr3, link->u.mgd.bssid, ETH_ALEN); 3105 + if (!WARN_ON_ONCE(!link)) 3106 + memcpy(hdr->addr3, link->u.mgd.bssid, ETH_ALEN); 3107 + rcu_read_unlock(); 3107 3108 build.hdr_len = 24; 3108 3109 break; 3109 3110 }
-2
net/mac80211/wbrf.c
··· 23 23 return; 24 24 25 25 local->wbrf_supported = acpi_amd_wbrf_supported_producer(dev); 26 - dev_dbg(dev, "WBRF is %s supported\n", 27 - local->wbrf_supported ? "" : "not"); 28 26 } 29 27 30 28 static void get_chan_freq_boundary(u32 center_freq, u32 bandwidth, u64 *start, u64 *end)
+2 -1
net/wireless/core.c
··· 5 5 * Copyright 2006-2010 Johannes Berg <johannes@sipsolutions.net> 6 6 * Copyright 2013-2014 Intel Mobile Communications GmbH 7 7 * Copyright 2015-2017 Intel Deutschland GmbH 8 - * Copyright (C) 2018-2023 Intel Corporation 8 + * Copyright (C) 2018-2024 Intel Corporation 9 9 */ 10 10 11 11 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt ··· 1661 1661 unsigned long delay) 1662 1662 { 1663 1663 if (!delay) { 1664 + del_timer(&dwork->timer); 1664 1665 wiphy_work_queue(wiphy, &dwork->work); 1665 1666 return; 1666 1667 }
+58 -1
net/wireless/scan.c
··· 1696 1696 } 1697 1697 } 1698 1698 1699 + static void cfg80211_check_stuck_ecsa(struct cfg80211_registered_device *rdev, 1700 + struct cfg80211_internal_bss *known, 1701 + const struct cfg80211_bss_ies *old) 1702 + { 1703 + const struct ieee80211_ext_chansw_ie *ecsa; 1704 + const struct element *elem_new, *elem_old; 1705 + const struct cfg80211_bss_ies *new, *bcn; 1706 + 1707 + if (known->pub.proberesp_ecsa_stuck) 1708 + return; 1709 + 1710 + new = rcu_dereference_protected(known->pub.proberesp_ies, 1711 + lockdep_is_held(&rdev->bss_lock)); 1712 + if (WARN_ON(!new)) 1713 + return; 1714 + 1715 + if (new->tsf - old->tsf < USEC_PER_SEC) 1716 + return; 1717 + 1718 + elem_old = cfg80211_find_elem(WLAN_EID_EXT_CHANSWITCH_ANN, 1719 + old->data, old->len); 1720 + if (!elem_old) 1721 + return; 1722 + 1723 + elem_new = cfg80211_find_elem(WLAN_EID_EXT_CHANSWITCH_ANN, 1724 + new->data, new->len); 1725 + if (!elem_new) 1726 + return; 1727 + 1728 + bcn = rcu_dereference_protected(known->pub.beacon_ies, 1729 + lockdep_is_held(&rdev->bss_lock)); 1730 + if (bcn && 1731 + cfg80211_find_elem(WLAN_EID_EXT_CHANSWITCH_ANN, 1732 + bcn->data, bcn->len)) 1733 + return; 1734 + 1735 + if (elem_new->datalen != elem_old->datalen) 1736 + return; 1737 + if (elem_new->datalen < sizeof(struct ieee80211_ext_chansw_ie)) 1738 + return; 1739 + if (memcmp(elem_new->data, elem_old->data, elem_new->datalen)) 1740 + return; 1741 + 1742 + ecsa = (void *)elem_new->data; 1743 + 1744 + if (!ecsa->mode) 1745 + return; 1746 + 1747 + if (ecsa->new_ch_num != 1748 + ieee80211_frequency_to_channel(known->pub.channel->center_freq)) 1749 + return; 1750 + 1751 + known->pub.proberesp_ecsa_stuck = 1; 1752 + } 1753 + 1699 1754 static bool 1700 1755 cfg80211_update_known_bss(struct cfg80211_registered_device *rdev, 1701 1756 struct cfg80211_internal_bss *known, ··· 1770 1715 /* Override possible earlier Beacon frame IEs */ 1771 1716 rcu_assign_pointer(known->pub.ies, 1772 1717 new->pub.proberesp_ies); 1773 - if (old) 1718 + if (old) { 1719 + cfg80211_check_stuck_ecsa(rdev, known, old); 1774 1720 kfree_rcu((struct cfg80211_bss_ies *)old, rcu_head); 1721 + } 1775 1722 } 1776 1723 1777 1724 if (rcu_access_pointer(new->pub.beacon_ies)) {