mirror of
https://github.com/torvalds/linux.git
synced 2024-11-22 12:11:40 +00:00
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>
This commit is contained in:
commit
af4acac7ca
@ -4169,14 +4169,14 @@ F: drivers/firmware/broadcom/tee_bnxt_fw.c
|
||||
F: drivers/net/ethernet/broadcom/bnxt/
|
||||
F: include/linux/firmware/broadcom/tee_bnxt_fw.h
|
||||
|
||||
BROADCOM BRCM80211 IEEE802.11n WIRELESS DRIVER
|
||||
M: Arend van Spriel <aspriel@gmail.com>
|
||||
M: Franky Lin <franky.lin@broadcom.com>
|
||||
M: Hante Meuleman <hante.meuleman@broadcom.com>
|
||||
BROADCOM BRCM80211 IEEE802.11 WIRELESS DRIVERS
|
||||
M: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
L: linux-wireless@vger.kernel.org
|
||||
L: brcm80211@lists.linux.dev
|
||||
L: brcm80211-dev-list.pdl@broadcom.com
|
||||
S: Supported
|
||||
F: drivers/net/wireless/broadcom/brcm80211/
|
||||
F: include/linux/platform_data/brcmfmac.h
|
||||
|
||||
BROADCOM BRCMSTB GPIO DRIVER
|
||||
M: Doug Berger <opendmb@gmail.com>
|
||||
@ -11128,7 +11128,6 @@ S: Supported
|
||||
F: drivers/net/wireless/intel/iwlegacy/
|
||||
|
||||
INTEL WIRELESS WIFI LINK (iwlwifi)
|
||||
M: Gregory Greenman <gregory.greenman@intel.com>
|
||||
M: Miri Korenblit <miriam.rachel.korenblit@intel.com>
|
||||
L: linux-wireless@vger.kernel.org
|
||||
S: Supported
|
||||
|
@ -1803,5 +1803,6 @@ static struct usb_driver ar5523_driver = {
|
||||
|
||||
module_usb_driver(ar5523_driver);
|
||||
|
||||
MODULE_DESCRIPTION("Atheros AR5523 wireless driver");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
MODULE_FIRMWARE(AR5523_FIRMWARE_FILE);
|
||||
|
@ -1685,6 +1685,7 @@ static struct platform_driver wcn36xx_driver = {
|
||||
|
||||
module_platform_driver(wcn36xx_driver);
|
||||
|
||||
MODULE_DESCRIPTION("Qualcomm Atheros WCN3660/3680 wireless driver");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
MODULE_AUTHOR("Eugene Krasnikov k.eugene.e@gmail.com");
|
||||
MODULE_FIRMWARE(WLAN_NV_FILE);
|
||||
|
@ -20,6 +20,7 @@ static void __exit brcmf_bca_exit(void)
|
||||
brcmf_fwvid_unregister_vendor(BRCMF_FWVENDOR_BCA, THIS_MODULE);
|
||||
}
|
||||
|
||||
MODULE_DESCRIPTION("Broadcom FullMAC WLAN driver plugin for Broadcom AP chipsets");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
MODULE_IMPORT_NS(BRCMFMAC);
|
||||
|
||||
|
@ -3765,8 +3765,10 @@ static int brcmf_internal_escan_add_info(struct cfg80211_scan_request *req,
|
||||
if (req->channels[i] == chan)
|
||||
break;
|
||||
}
|
||||
if (i == req->n_channels)
|
||||
req->channels[req->n_channels++] = chan;
|
||||
if (i == req->n_channels) {
|
||||
req->n_channels++;
|
||||
req->channels[i] = chan;
|
||||
}
|
||||
|
||||
for (i = 0; i < req->n_ssids; i++) {
|
||||
if (req->ssids[i].ssid_len == ssid_len &&
|
||||
|
@ -20,6 +20,7 @@ static void __exit brcmf_cyw_exit(void)
|
||||
brcmf_fwvid_unregister_vendor(BRCMF_FWVENDOR_CYW, THIS_MODULE);
|
||||
}
|
||||
|
||||
MODULE_DESCRIPTION("Broadcom FullMAC WLAN driver plugin for Cypress/Infineon chipsets");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
MODULE_IMPORT_NS(BRCMFMAC);
|
||||
|
||||
|
@ -20,6 +20,7 @@ static void __exit brcmf_wcc_exit(void)
|
||||
brcmf_fwvid_unregister_vendor(BRCMF_FWVENDOR_WCC, THIS_MODULE);
|
||||
}
|
||||
|
||||
MODULE_DESCRIPTION("Broadcom FullMAC WLAN driver plugin for Broadcom mobility chipsets");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
MODULE_IMPORT_NS(BRCMFMAC);
|
||||
|
||||
|
@ -537,7 +537,7 @@ enum iwl_fw_dbg_config_cmd_type {
|
||||
}; /* LDBG_CFG_CMD_TYPE_API_E_VER_1 */
|
||||
|
||||
/* this token disables debug asserts in the firmware */
|
||||
#define IWL_FW_DBG_CONFIG_TOKEN 0x00011301
|
||||
#define IWL_FW_DBG_CONFIG_TOKEN 0x00010001
|
||||
|
||||
/**
|
||||
* struct iwl_fw_dbg_config_cmd - configure FW debug
|
||||
|
@ -1,6 +1,6 @@
|
||||
// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
|
||||
/*
|
||||
* Copyright (C) 2005-2014, 2018-2023 Intel Corporation
|
||||
* Copyright (C) 2005-2014, 2018-2024 Intel Corporation
|
||||
* Copyright (C) 2013-2015 Intel Mobile Communications GmbH
|
||||
* Copyright (C) 2015-2017 Intel Deutschland GmbH
|
||||
*/
|
||||
@ -19,7 +19,6 @@
|
||||
* @fwrt_ptr: pointer to the buffer coming from fwrt
|
||||
* @trans_ptr: pointer to struct %iwl_trans_dump_data which contains the
|
||||
* transport's data.
|
||||
* @trans_len: length of the valid data in trans_ptr
|
||||
* @fwrt_len: length of the valid data in fwrt_ptr
|
||||
*/
|
||||
struct iwl_fw_dump_ptrs {
|
||||
|
@ -128,6 +128,7 @@ static void iwl_dealloc_ucode(struct iwl_drv *drv)
|
||||
kfree(drv->fw.ucode_capa.cmd_versions);
|
||||
kfree(drv->fw.phy_integration_ver);
|
||||
kfree(drv->trans->dbg.pc_data);
|
||||
drv->trans->dbg.pc_data = NULL;
|
||||
|
||||
for (i = 0; i < IWL_UCODE_TYPE_MAX; i++)
|
||||
iwl_free_fw_img(drv, drv->fw.img + i);
|
||||
|
@ -668,7 +668,6 @@ static const struct ieee80211_sband_iftype_data iwl_he_eht_capa[] = {
|
||||
.has_eht = true,
|
||||
.eht_cap_elem = {
|
||||
.mac_cap_info[0] =
|
||||
IEEE80211_EHT_MAC_CAP0_EPCS_PRIO_ACCESS |
|
||||
IEEE80211_EHT_MAC_CAP0_OM_CONTROL |
|
||||
IEEE80211_EHT_MAC_CAP0_TRIG_TXOP_SHARING_MODE1 |
|
||||
IEEE80211_EHT_MAC_CAP0_TRIG_TXOP_SHARING_MODE2 |
|
||||
@ -796,7 +795,6 @@ static const struct ieee80211_sband_iftype_data iwl_he_eht_capa[] = {
|
||||
.has_eht = true,
|
||||
.eht_cap_elem = {
|
||||
.mac_cap_info[0] =
|
||||
IEEE80211_EHT_MAC_CAP0_EPCS_PRIO_ACCESS |
|
||||
IEEE80211_EHT_MAC_CAP0_OM_CONTROL |
|
||||
IEEE80211_EHT_MAC_CAP0_TRIG_TXOP_SHARING_MODE1 |
|
||||
IEEE80211_EHT_MAC_CAP0_TRIG_TXOP_SHARING_MODE2,
|
||||
@ -1028,8 +1026,7 @@ iwl_nvm_fixup_sband_iftd(struct iwl_trans *trans,
|
||||
if (CSR_HW_REV_TYPE(trans->hw_rev) == IWL_CFG_MAC_TYPE_GL &&
|
||||
iftype_data->eht_cap.has_eht) {
|
||||
iftype_data->eht_cap.eht_cap_elem.mac_cap_info[0] &=
|
||||
~(IEEE80211_EHT_MAC_CAP0_EPCS_PRIO_ACCESS |
|
||||
IEEE80211_EHT_MAC_CAP0_TRIG_TXOP_SHARING_MODE1 |
|
||||
~(IEEE80211_EHT_MAC_CAP0_TRIG_TXOP_SHARING_MODE1 |
|
||||
IEEE80211_EHT_MAC_CAP0_TRIG_TXOP_SHARING_MODE2);
|
||||
iftype_data->eht_cap.eht_cap_elem.phy_cap_info[3] &=
|
||||
~(IEEE80211_EHT_PHY_CAP0_PARTIAL_BW_UL_MU_MIMO |
|
||||
|
@ -1603,7 +1603,8 @@ static int iwl_mvm_mac_add_interface(struct ieee80211_hw *hw,
|
||||
*/
|
||||
if (vif->type == NL80211_IFTYPE_AP ||
|
||||
vif->type == NL80211_IFTYPE_ADHOC) {
|
||||
iwl_mvm_vif_dbgfs_add_link(mvm, vif);
|
||||
if (!test_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status))
|
||||
iwl_mvm_vif_dbgfs_add_link(mvm, vif);
|
||||
ret = 0;
|
||||
goto out;
|
||||
}
|
||||
@ -1643,7 +1644,8 @@ static int iwl_mvm_mac_add_interface(struct ieee80211_hw *hw,
|
||||
iwl_mvm_chandef_get_primary_80(&vif->bss_conf.chandef);
|
||||
}
|
||||
|
||||
iwl_mvm_vif_dbgfs_add_link(mvm, vif);
|
||||
if (!test_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status))
|
||||
iwl_mvm_vif_dbgfs_add_link(mvm, vif);
|
||||
|
||||
if (!test_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status) &&
|
||||
vif->type == NL80211_IFTYPE_STATION && !vif->p2p &&
|
||||
|
@ -81,7 +81,8 @@ static int iwl_mvm_mld_mac_add_interface(struct ieee80211_hw *hw,
|
||||
ieee80211_hw_set(mvm->hw, RX_INCLUDES_FCS);
|
||||
}
|
||||
|
||||
iwl_mvm_vif_dbgfs_add_link(mvm, vif);
|
||||
if (!test_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status))
|
||||
iwl_mvm_vif_dbgfs_add_link(mvm, vif);
|
||||
|
||||
if (!test_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status) &&
|
||||
vif->type == NL80211_IFTYPE_STATION && !vif->p2p &&
|
||||
@ -434,6 +435,9 @@ __iwl_mvm_mld_unassign_vif_chanctx(struct iwl_mvm *mvm,
|
||||
mvmvif->ap_ibss_active = false;
|
||||
}
|
||||
|
||||
iwl_mvm_link_changed(mvm, vif, link_conf,
|
||||
LINK_CONTEXT_MODIFY_ACTIVE, false);
|
||||
|
||||
if (iwl_mvm_is_esr_supported(mvm->fwrt.trans) && n_active > 1) {
|
||||
int ret = iwl_mvm_esr_mode_inactive(mvm, vif);
|
||||
|
||||
@ -445,9 +449,6 @@ __iwl_mvm_mld_unassign_vif_chanctx(struct iwl_mvm *mvm,
|
||||
if (vif->type == NL80211_IFTYPE_MONITOR)
|
||||
iwl_mvm_mld_rm_snif_sta(mvm, vif);
|
||||
|
||||
iwl_mvm_link_changed(mvm, vif, link_conf,
|
||||
LINK_CONTEXT_MODIFY_ACTIVE, false);
|
||||
|
||||
if (switching_chanctx)
|
||||
return;
|
||||
mvmvif->link[link_id]->phy_ctxt = NULL;
|
||||
|
@ -700,6 +700,7 @@ static struct spi_driver p54spi_driver = {
|
||||
|
||||
module_spi_driver(p54spi_driver);
|
||||
|
||||
MODULE_DESCRIPTION("Prism54 SPI wireless driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_AUTHOR("Christian Lamparter <chunkeey@web.de>");
|
||||
MODULE_ALIAS("spi:cx3110x");
|
||||
|
@ -728,6 +728,7 @@ const struct ieee80211_ops mt7603_ops = {
|
||||
.set_sar_specs = mt7603_set_sar_specs,
|
||||
};
|
||||
|
||||
MODULE_DESCRIPTION("MediaTek MT7603E and MT76x8 wireless driver");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
|
||||
static int __init mt7603_init(void)
|
||||
|
@ -1375,4 +1375,5 @@ const struct ieee80211_ops mt7615_ops = {
|
||||
};
|
||||
EXPORT_SYMBOL_GPL(mt7615_ops);
|
||||
|
||||
MODULE_DESCRIPTION("MediaTek MT7615E and MT7663E wireless driver");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
|
@ -270,4 +270,5 @@ static void __exit mt7615_exit(void)
|
||||
|
||||
module_init(mt7615_init);
|
||||
module_exit(mt7615_exit);
|
||||
MODULE_DESCRIPTION("MediaTek MT7615E MMIO helpers");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
|
@ -253,4 +253,5 @@ module_sdio_driver(mt7663s_driver);
|
||||
|
||||
MODULE_AUTHOR("Sean Wang <sean.wang@mediatek.com>");
|
||||
MODULE_AUTHOR("Lorenzo Bianconi <lorenzo@kernel.org>");
|
||||
MODULE_DESCRIPTION("MediaTek MT7663S (SDIO) wireless driver");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
|
@ -281,4 +281,5 @@ module_usb_driver(mt7663u_driver);
|
||||
|
||||
MODULE_AUTHOR("Sean Wang <sean.wang@mediatek.com>");
|
||||
MODULE_AUTHOR("Lorenzo Bianconi <lorenzo@kernel.org>");
|
||||
MODULE_DESCRIPTION("MediaTek MT7663U (USB) wireless driver");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
|
@ -349,4 +349,5 @@ EXPORT_SYMBOL_GPL(mt7663_usb_sdio_register_device);
|
||||
|
||||
MODULE_AUTHOR("Lorenzo Bianconi <lorenzo@kernel.org>");
|
||||
MODULE_AUTHOR("Sean Wang <sean.wang@mediatek.com>");
|
||||
MODULE_DESCRIPTION("MediaTek MT7663 SDIO/USB helpers");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
|
@ -3160,4 +3160,5 @@ exit:
|
||||
EXPORT_SYMBOL_GPL(mt76_connac2_mcu_fill_message);
|
||||
|
||||
MODULE_AUTHOR("Lorenzo Bianconi <lorenzo@kernel.org>");
|
||||
MODULE_DESCRIPTION("MediaTek MT76x connac layer helpers");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
|
@ -342,4 +342,5 @@ int mt76x0_eeprom_init(struct mt76x02_dev *dev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
MODULE_DESCRIPTION("MediaTek MT76x EEPROM helpers");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
|
@ -302,6 +302,7 @@ static const struct pci_device_id mt76x0e_device_table[] = {
|
||||
MODULE_DEVICE_TABLE(pci, mt76x0e_device_table);
|
||||
MODULE_FIRMWARE(MT7610E_FIRMWARE);
|
||||
MODULE_FIRMWARE(MT7650E_FIRMWARE);
|
||||
MODULE_DESCRIPTION("MediaTek MT76x0E (PCIe) wireless driver");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
|
||||
static struct pci_driver mt76x0e_driver = {
|
||||
|
@ -336,6 +336,7 @@ err:
|
||||
MODULE_DEVICE_TABLE(usb, mt76x0_device_table);
|
||||
MODULE_FIRMWARE(MT7610E_FIRMWARE);
|
||||
MODULE_FIRMWARE(MT7610U_FIRMWARE);
|
||||
MODULE_DESCRIPTION("MediaTek MT76x0U (USB) wireless driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
static struct usb_driver mt76x0_driver = {
|
||||
|
@ -293,4 +293,5 @@ void mt76x02u_init_mcu(struct mt76_dev *dev)
|
||||
EXPORT_SYMBOL_GPL(mt76x02u_init_mcu);
|
||||
|
||||
MODULE_AUTHOR("Lorenzo Bianconi <lorenzo.bianconi83@gmail.com>");
|
||||
MODULE_DESCRIPTION("MediaTek MT76x02 MCU helpers");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
|
@ -696,4 +696,5 @@ void mt76x02_config_mac_addr_list(struct mt76x02_dev *dev)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(mt76x02_config_mac_addr_list);
|
||||
|
||||
MODULE_DESCRIPTION("MediaTek MT76x02 helpers");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
|
@ -506,4 +506,5 @@ int mt76x2_eeprom_init(struct mt76x02_dev *dev)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(mt76x2_eeprom_init);
|
||||
|
||||
MODULE_DESCRIPTION("MediaTek MT76x2 EEPROM helpers");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
|
@ -165,6 +165,7 @@ mt76x2e_resume(struct pci_dev *pdev)
|
||||
MODULE_DEVICE_TABLE(pci, mt76x2e_device_table);
|
||||
MODULE_FIRMWARE(MT7662_FIRMWARE);
|
||||
MODULE_FIRMWARE(MT7662_ROM_PATCH);
|
||||
MODULE_DESCRIPTION("MediaTek MT76x2E (PCIe) wireless driver");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
|
||||
static struct pci_driver mt76pci_driver = {
|
||||
|
@ -147,4 +147,5 @@ static struct usb_driver mt76x2u_driver = {
|
||||
module_usb_driver(mt76x2u_driver);
|
||||
|
||||
MODULE_AUTHOR("Lorenzo Bianconi <lorenzo.bianconi83@gmail.com>");
|
||||
MODULE_DESCRIPTION("MediaTek MT76x2U (USB) wireless driver");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
|
@ -958,4 +958,5 @@ static void __exit mt7915_exit(void)
|
||||
|
||||
module_init(mt7915_init);
|
||||
module_exit(mt7915_exit);
|
||||
MODULE_DESCRIPTION("MediaTek MT7915E MMIO helpers");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
|
@ -1418,5 +1418,6 @@ const struct ieee80211_ops mt7921_ops = {
|
||||
};
|
||||
EXPORT_SYMBOL_GPL(mt7921_ops);
|
||||
|
||||
MODULE_DESCRIPTION("MediaTek MT7921 core driver");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
MODULE_AUTHOR("Sean Wang <sean.wang@mediatek.com>");
|
||||
|
@ -544,4 +544,5 @@ MODULE_FIRMWARE(MT7922_FIRMWARE_WM);
|
||||
MODULE_FIRMWARE(MT7922_ROM_PATCH);
|
||||
MODULE_AUTHOR("Sean Wang <sean.wang@mediatek.com>");
|
||||
MODULE_AUTHOR("Lorenzo Bianconi <lorenzo@kernel.org>");
|
||||
MODULE_DESCRIPTION("MediaTek MT7921E (PCIe) wireless driver");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
|
@ -323,5 +323,6 @@ static struct sdio_driver mt7921s_driver = {
|
||||
.drv.pm = pm_sleep_ptr(&mt7921s_pm_ops),
|
||||
};
|
||||
module_sdio_driver(mt7921s_driver);
|
||||
MODULE_DESCRIPTION("MediaTek MT7921S (SDIO) wireless driver");
|
||||
MODULE_AUTHOR("Sean Wang <sean.wang@mediatek.com>");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
|
@ -336,5 +336,6 @@ static struct usb_driver mt7921u_driver = {
|
||||
};
|
||||
module_usb_driver(mt7921u_driver);
|
||||
|
||||
MODULE_DESCRIPTION("MediaTek MT7921U (USB) wireless driver");
|
||||
MODULE_AUTHOR("Lorenzo Bianconi <lorenzo@kernel.org>");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
|
@ -1450,4 +1450,5 @@ const struct ieee80211_ops mt7925_ops = {
|
||||
EXPORT_SYMBOL_GPL(mt7925_ops);
|
||||
|
||||
MODULE_AUTHOR("Deren Wu <deren.wu@mediatek.com>");
|
||||
MODULE_DESCRIPTION("MediaTek MT7925 core driver");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
|
@ -583,4 +583,5 @@ MODULE_FIRMWARE(MT7925_FIRMWARE_WM);
|
||||
MODULE_FIRMWARE(MT7925_ROM_PATCH);
|
||||
MODULE_AUTHOR("Deren Wu <deren.wu@mediatek.com>");
|
||||
MODULE_AUTHOR("Lorenzo Bianconi <lorenzo@kernel.org>");
|
||||
MODULE_DESCRIPTION("MediaTek MT7925E (PCIe) wireless driver");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
|
@ -329,4 +329,5 @@ static struct usb_driver mt7925u_driver = {
|
||||
module_usb_driver(mt7925u_driver);
|
||||
|
||||
MODULE_AUTHOR("Lorenzo Bianconi <lorenzo@kernel.org>");
|
||||
MODULE_DESCRIPTION("MediaTek MT7925U (USB) wireless driver");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
|
@ -862,5 +862,6 @@ int mt792x_load_firmware(struct mt792x_dev *dev)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(mt792x_load_firmware);
|
||||
|
||||
MODULE_DESCRIPTION("MediaTek MT792x core driver");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
MODULE_AUTHOR("Lorenzo Bianconi <lorenzo@kernel.org>");
|
||||
|
@ -314,5 +314,6 @@ void mt792xu_disconnect(struct usb_interface *usb_intf)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(mt792xu_disconnect);
|
||||
|
||||
MODULE_DESCRIPTION("MediaTek MT792x USB helpers");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
MODULE_AUTHOR("Lorenzo Bianconi <lorenzo@kernel.org>");
|
||||
|
@ -4477,7 +4477,8 @@ int mt7996_mcu_set_txpower_sku(struct mt7996_phy *phy)
|
||||
|
||||
skb_put_data(skb, &req, sizeof(req));
|
||||
/* cck and ofdm */
|
||||
skb_put_data(skb, &la.cck, sizeof(la.cck) + sizeof(la.ofdm));
|
||||
skb_put_data(skb, &la.cck, sizeof(la.cck));
|
||||
skb_put_data(skb, &la.ofdm, sizeof(la.ofdm));
|
||||
/* ht20 */
|
||||
skb_put_data(skb, &la.mcs[0], 8);
|
||||
/* ht40 */
|
||||
|
@ -650,4 +650,5 @@ static void __exit mt7996_exit(void)
|
||||
|
||||
module_init(mt7996_init);
|
||||
module_exit(mt7996_exit);
|
||||
MODULE_DESCRIPTION("MediaTek MT7996 MMIO helpers");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
|
@ -672,4 +672,5 @@ EXPORT_SYMBOL_GPL(mt76s_init);
|
||||
|
||||
MODULE_AUTHOR("Sean Wang <sean.wang@mediatek.com>");
|
||||
MODULE_AUTHOR("Lorenzo Bianconi <lorenzo@kernel.org>");
|
||||
MODULE_DESCRIPTION("MediaTek MT76x SDIO helpers");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
|
@ -1128,4 +1128,5 @@ int mt76u_init(struct mt76_dev *dev, struct usb_interface *intf)
|
||||
EXPORT_SYMBOL_GPL(mt76u_init);
|
||||
|
||||
MODULE_AUTHOR("Lorenzo Bianconi <lorenzo.bianconi83@gmail.com>");
|
||||
MODULE_DESCRIPTION("MediaTek MT76x USB helpers");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
|
@ -138,4 +138,5 @@ int __mt76_worker_fn(void *ptr)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(__mt76_worker_fn);
|
||||
|
||||
MODULE_DESCRIPTION("MediaTek MT76x helpers");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
|
@ -1010,5 +1010,6 @@ error:
|
||||
return ERR_PTR(ret);
|
||||
}
|
||||
|
||||
MODULE_DESCRIPTION("Atmel WILC1000 core wireless driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_FIRMWARE(WILC1000_FW(WILC1000_API_VER));
|
||||
|
@ -984,4 +984,5 @@ static struct sdio_driver wilc_sdio_driver = {
|
||||
module_driver(wilc_sdio_driver,
|
||||
sdio_register_driver,
|
||||
sdio_unregister_driver);
|
||||
MODULE_DESCRIPTION("Atmel WILC1000 SDIO wireless driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
@ -273,6 +273,7 @@ static struct spi_driver wilc_spi_driver = {
|
||||
.remove = wilc_bus_remove,
|
||||
};
|
||||
module_spi_driver(wilc_spi_driver);
|
||||
MODULE_DESCRIPTION("Atmel WILC1000 SPI wireless driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
static int wilc_spi_tx(struct wilc *wilc, u8 *b, u32 len)
|
||||
|
@ -343,5 +343,6 @@ static void __exit wl1251_sdio_exit(void)
|
||||
module_init(wl1251_sdio_init);
|
||||
module_exit(wl1251_sdio_exit);
|
||||
|
||||
MODULE_DESCRIPTION("TI WL1251 SDIO helpers");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_AUTHOR("Kalle Valo <kvalo@adurom.com>");
|
||||
|
@ -342,6 +342,7 @@ static struct spi_driver wl1251_spi_driver = {
|
||||
|
||||
module_spi_driver(wl1251_spi_driver);
|
||||
|
||||
MODULE_DESCRIPTION("TI WL1251 SPI helpers");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_AUTHOR("Kalle Valo <kvalo@adurom.com>");
|
||||
MODULE_ALIAS("spi:wl1251");
|
||||
|
@ -1955,6 +1955,7 @@ module_param_named(tcxo, tcxo_param, charp, 0);
|
||||
MODULE_PARM_DESC(tcxo,
|
||||
"TCXO clock: 19.2, 26, 38.4, 52, 16.368, 32.736, 16.8, 33.6");
|
||||
|
||||
MODULE_DESCRIPTION("TI WL12xx wireless driver");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
MODULE_AUTHOR("Luciano Coelho <coelho@ti.com>");
|
||||
MODULE_FIRMWARE(WL127X_FW_NAME_SINGLE);
|
||||
|
@ -2086,6 +2086,7 @@ module_param_named(num_rx_desc, num_rx_desc_param, int, 0400);
|
||||
MODULE_PARM_DESC(num_rx_desc_param,
|
||||
"Number of Rx descriptors: u8 (default is 32)");
|
||||
|
||||
MODULE_DESCRIPTION("TI WiLink 8 wireless driver");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
MODULE_AUTHOR("Luciano Coelho <coelho@ti.com>");
|
||||
MODULE_FIRMWARE(WL18XX_FW_NAME);
|
||||
|
@ -6793,6 +6793,7 @@ MODULE_PARM_DESC(bug_on_recovery, "BUG() on fw recovery");
|
||||
module_param(no_recovery, int, 0600);
|
||||
MODULE_PARM_DESC(no_recovery, "Prevent HW recovery. FW will remain stuck.");
|
||||
|
||||
MODULE_DESCRIPTION("TI WLAN core driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_AUTHOR("Luciano Coelho <coelho@ti.com>");
|
||||
MODULE_AUTHOR("Juuso Oikarinen <juuso.oikarinen@nokia.com>");
|
||||
|
@ -446,6 +446,7 @@ module_sdio_driver(wl1271_sdio_driver);
|
||||
module_param(dump, bool, 0600);
|
||||
MODULE_PARM_DESC(dump, "Enable sdio read/write dumps.");
|
||||
|
||||
MODULE_DESCRIPTION("TI WLAN SDIO helpers");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_AUTHOR("Luciano Coelho <coelho@ti.com>");
|
||||
MODULE_AUTHOR("Juuso Oikarinen <juuso.oikarinen@nokia.com>");
|
||||
|
@ -562,6 +562,7 @@ static struct spi_driver wl1271_spi_driver = {
|
||||
};
|
||||
|
||||
module_spi_driver(wl1271_spi_driver);
|
||||
MODULE_DESCRIPTION("TI WLAN SPI helpers");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_AUTHOR("Luciano Coelho <coelho@ti.com>");
|
||||
MODULE_AUTHOR("Juuso Oikarinen <juuso.oikarinen@nokia.com>");
|
||||
|
@ -2902,6 +2902,8 @@ struct cfg80211_bss_ies {
|
||||
* own the beacon_ies, but they're just pointers to the ones from the
|
||||
* @hidden_beacon_bss struct)
|
||||
* @proberesp_ies: the information elements from the last Probe Response frame
|
||||
* @proberesp_ecsa_stuck: ECSA element is stuck in the Probe Response frame,
|
||||
* cannot rely on it having valid data
|
||||
* @hidden_beacon_bss: in case this BSS struct represents a probe response from
|
||||
* a BSS that hides the SSID in its beacon, this points to the BSS struct
|
||||
* that holds the beacon data. @beacon_ies is still valid, of course, and
|
||||
@ -2942,6 +2944,8 @@ struct cfg80211_bss {
|
||||
u8 chains;
|
||||
s8 chain_signal[IEEE80211_MAX_CHAINS];
|
||||
|
||||
u8 proberesp_ecsa_stuck:1;
|
||||
|
||||
u8 bssid_index;
|
||||
u8 max_bssid_indicator;
|
||||
|
||||
|
@ -5,7 +5,7 @@
|
||||
* Copyright 2006-2010 Johannes Berg <johannes@sipsolutions.net>
|
||||
* Copyright 2013-2015 Intel Mobile Communications GmbH
|
||||
* Copyright (C) 2015-2017 Intel Deutschland GmbH
|
||||
* Copyright (C) 2018-2022 Intel Corporation
|
||||
* Copyright (C) 2018-2024 Intel Corporation
|
||||
*/
|
||||
|
||||
#include <linux/ieee80211.h>
|
||||
@ -989,7 +989,8 @@ static int
|
||||
ieee80211_set_unsol_bcast_probe_resp(struct ieee80211_sub_if_data *sdata,
|
||||
struct cfg80211_unsol_bcast_probe_resp *params,
|
||||
struct ieee80211_link_data *link,
|
||||
struct ieee80211_bss_conf *link_conf)
|
||||
struct ieee80211_bss_conf *link_conf,
|
||||
u64 *changed)
|
||||
{
|
||||
struct unsol_bcast_probe_resp_data *new, *old = NULL;
|
||||
|
||||
@ -1013,7 +1014,8 @@ ieee80211_set_unsol_bcast_probe_resp(struct ieee80211_sub_if_data *sdata,
|
||||
RCU_INIT_POINTER(link->u.ap.unsol_bcast_probe_resp, NULL);
|
||||
}
|
||||
|
||||
return BSS_CHANGED_UNSOL_BCAST_PROBE_RESP;
|
||||
*changed |= BSS_CHANGED_UNSOL_BCAST_PROBE_RESP;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ieee80211_set_ftm_responder_params(
|
||||
@ -1451,10 +1453,9 @@ static int ieee80211_start_ap(struct wiphy *wiphy, struct net_device *dev,
|
||||
|
||||
err = ieee80211_set_unsol_bcast_probe_resp(sdata,
|
||||
¶ms->unsol_bcast_probe_resp,
|
||||
link, link_conf);
|
||||
link, link_conf, &changed);
|
||||
if (err < 0)
|
||||
goto error;
|
||||
changed |= err;
|
||||
|
||||
err = drv_start_ap(sdata->local, sdata, link_conf);
|
||||
if (err) {
|
||||
@ -1525,10 +1526,9 @@ static int ieee80211_change_beacon(struct wiphy *wiphy, struct net_device *dev,
|
||||
|
||||
err = ieee80211_set_unsol_bcast_probe_resp(sdata,
|
||||
¶ms->unsol_bcast_probe_resp,
|
||||
link, link_conf);
|
||||
link, link_conf, &changed);
|
||||
if (err < 0)
|
||||
return err;
|
||||
changed |= err;
|
||||
|
||||
if (beacon->he_bss_color_valid &&
|
||||
beacon->he_bss_color.enabled != link_conf->he_bss_color.enabled) {
|
||||
@ -1869,6 +1869,8 @@ static int sta_link_apply_parameters(struct ieee80211_local *local,
|
||||
sband->band);
|
||||
}
|
||||
|
||||
ieee80211_sta_set_rx_nss(link_sta);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -997,8 +997,8 @@ static void add_link_files(struct ieee80211_link_data *link,
|
||||
}
|
||||
}
|
||||
|
||||
void ieee80211_debugfs_add_netdev(struct ieee80211_sub_if_data *sdata,
|
||||
bool mld_vif)
|
||||
static void ieee80211_debugfs_add_netdev(struct ieee80211_sub_if_data *sdata,
|
||||
bool mld_vif)
|
||||
{
|
||||
char buf[10+IFNAMSIZ];
|
||||
|
||||
|
@ -11,8 +11,6 @@
|
||||
#include "ieee80211_i.h"
|
||||
|
||||
#ifdef CONFIG_MAC80211_DEBUGFS
|
||||
void ieee80211_debugfs_add_netdev(struct ieee80211_sub_if_data *sdata,
|
||||
bool mld_vif);
|
||||
void ieee80211_debugfs_remove_netdev(struct ieee80211_sub_if_data *sdata);
|
||||
void ieee80211_debugfs_rename_netdev(struct ieee80211_sub_if_data *sdata);
|
||||
void ieee80211_debugfs_recreate_netdev(struct ieee80211_sub_if_data *sdata,
|
||||
@ -24,9 +22,6 @@ void ieee80211_link_debugfs_remove(struct ieee80211_link_data *link);
|
||||
void ieee80211_link_debugfs_drv_add(struct ieee80211_link_data *link);
|
||||
void ieee80211_link_debugfs_drv_remove(struct ieee80211_link_data *link);
|
||||
#else
|
||||
static inline void ieee80211_debugfs_add_netdev(
|
||||
struct ieee80211_sub_if_data *sdata, bool mld_vif)
|
||||
{}
|
||||
static inline void ieee80211_debugfs_remove_netdev(
|
||||
struct ieee80211_sub_if_data *sdata)
|
||||
{}
|
||||
|
@ -1799,7 +1799,7 @@ static void ieee80211_setup_sdata(struct ieee80211_sub_if_data *sdata,
|
||||
/* need to do this after the switch so vif.type is correct */
|
||||
ieee80211_link_setup(&sdata->deflink);
|
||||
|
||||
ieee80211_debugfs_add_netdev(sdata, false);
|
||||
ieee80211_debugfs_recreate_netdev(sdata, false);
|
||||
}
|
||||
|
||||
static int ieee80211_runtime_change_iftype(struct ieee80211_sub_if_data *sdata,
|
||||
|
@ -8,7 +8,7 @@
|
||||
* Copyright 2007, Michael Wu <flamingice@sourmilk.net>
|
||||
* Copyright 2013-2014 Intel Mobile Communications GmbH
|
||||
* Copyright (C) 2015 - 2017 Intel Deutschland GmbH
|
||||
* Copyright (C) 2018 - 2023 Intel Corporation
|
||||
* Copyright (C) 2018 - 2024 Intel Corporation
|
||||
*/
|
||||
|
||||
#include <linux/delay.h>
|
||||
@ -2918,6 +2918,7 @@ static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata,
|
||||
|
||||
/* other links will be destroyed */
|
||||
sdata->deflink.u.mgd.bss = NULL;
|
||||
sdata->deflink.smps_mode = IEEE80211_SMPS_OFF;
|
||||
|
||||
netif_carrier_off(sdata->dev);
|
||||
|
||||
@ -5031,9 +5032,6 @@ static int ieee80211_prep_channel(struct ieee80211_sub_if_data *sdata,
|
||||
if (!link)
|
||||
return 0;
|
||||
|
||||
/* will change later if needed */
|
||||
link->smps_mode = IEEE80211_SMPS_OFF;
|
||||
|
||||
/*
|
||||
* If this fails (possibly due to channel context sharing
|
||||
* on incompatible channels, e.g. 80+80 and 160 sharing the
|
||||
@ -7498,6 +7496,7 @@ void ieee80211_mgd_setup_link(struct ieee80211_link_data *link)
|
||||
link->u.mgd.p2p_noa_index = -1;
|
||||
link->u.mgd.conn_flags = 0;
|
||||
link->conf->bssid = link->u.mgd.bssid;
|
||||
link->smps_mode = IEEE80211_SMPS_OFF;
|
||||
|
||||
wiphy_work_init(&link->u.mgd.request_smps_work,
|
||||
ieee80211_request_smps_mgd_work);
|
||||
@ -7711,6 +7710,75 @@ out_err:
|
||||
return err;
|
||||
}
|
||||
|
||||
static bool ieee80211_mgd_csa_present(struct ieee80211_sub_if_data *sdata,
|
||||
const struct cfg80211_bss_ies *ies,
|
||||
u8 cur_channel, bool ignore_ecsa)
|
||||
{
|
||||
const struct element *csa_elem, *ecsa_elem;
|
||||
struct ieee80211_channel_sw_ie *csa = NULL;
|
||||
struct ieee80211_ext_chansw_ie *ecsa = NULL;
|
||||
|
||||
if (!ies)
|
||||
return false;
|
||||
|
||||
csa_elem = cfg80211_find_elem(WLAN_EID_CHANNEL_SWITCH,
|
||||
ies->data, ies->len);
|
||||
if (csa_elem && csa_elem->datalen == sizeof(*csa))
|
||||
csa = (void *)csa_elem->data;
|
||||
|
||||
ecsa_elem = cfg80211_find_elem(WLAN_EID_EXT_CHANSWITCH_ANN,
|
||||
ies->data, ies->len);
|
||||
if (ecsa_elem && ecsa_elem->datalen == sizeof(*ecsa))
|
||||
ecsa = (void *)ecsa_elem->data;
|
||||
|
||||
if (csa && csa->count == 0)
|
||||
csa = NULL;
|
||||
if (csa && !csa->mode && csa->new_ch_num == cur_channel)
|
||||
csa = NULL;
|
||||
|
||||
if (ecsa && ecsa->count == 0)
|
||||
ecsa = NULL;
|
||||
if (ecsa && !ecsa->mode && ecsa->new_ch_num == cur_channel)
|
||||
ecsa = NULL;
|
||||
|
||||
if (ignore_ecsa && ecsa) {
|
||||
sdata_info(sdata,
|
||||
"Ignoring ECSA in probe response - was considered stuck!\n");
|
||||
return csa;
|
||||
}
|
||||
|
||||
return csa || ecsa;
|
||||
}
|
||||
|
||||
static bool ieee80211_mgd_csa_in_process(struct ieee80211_sub_if_data *sdata,
|
||||
struct cfg80211_bss *bss)
|
||||
{
|
||||
u8 cur_channel;
|
||||
bool ret;
|
||||
|
||||
cur_channel = ieee80211_frequency_to_channel(bss->channel->center_freq);
|
||||
|
||||
rcu_read_lock();
|
||||
if (ieee80211_mgd_csa_present(sdata,
|
||||
rcu_dereference(bss->beacon_ies),
|
||||
cur_channel, false)) {
|
||||
ret = true;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (ieee80211_mgd_csa_present(sdata,
|
||||
rcu_dereference(bss->proberesp_ies),
|
||||
cur_channel, bss->proberesp_ecsa_stuck)) {
|
||||
ret = true;
|
||||
goto out;
|
||||
}
|
||||
|
||||
ret = false;
|
||||
out:
|
||||
rcu_read_unlock();
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* config hooks */
|
||||
int ieee80211_mgd_auth(struct ieee80211_sub_if_data *sdata,
|
||||
struct cfg80211_auth_request *req)
|
||||
@ -7719,7 +7787,6 @@ int ieee80211_mgd_auth(struct ieee80211_sub_if_data *sdata,
|
||||
struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
|
||||
struct ieee80211_mgd_auth_data *auth_data;
|
||||
struct ieee80211_link_data *link;
|
||||
const struct element *csa_elem, *ecsa_elem;
|
||||
u16 auth_alg;
|
||||
int err;
|
||||
bool cont_auth;
|
||||
@ -7762,21 +7829,10 @@ int ieee80211_mgd_auth(struct ieee80211_sub_if_data *sdata,
|
||||
if (ifmgd->assoc_data)
|
||||
return -EBUSY;
|
||||
|
||||
rcu_read_lock();
|
||||
csa_elem = ieee80211_bss_get_elem(req->bss, WLAN_EID_CHANNEL_SWITCH);
|
||||
ecsa_elem = ieee80211_bss_get_elem(req->bss,
|
||||
WLAN_EID_EXT_CHANSWITCH_ANN);
|
||||
if ((csa_elem &&
|
||||
csa_elem->datalen == sizeof(struct ieee80211_channel_sw_ie) &&
|
||||
((struct ieee80211_channel_sw_ie *)csa_elem->data)->count != 0) ||
|
||||
(ecsa_elem &&
|
||||
ecsa_elem->datalen == sizeof(struct ieee80211_ext_chansw_ie) &&
|
||||
((struct ieee80211_ext_chansw_ie *)ecsa_elem->data)->count != 0)) {
|
||||
rcu_read_unlock();
|
||||
if (ieee80211_mgd_csa_in_process(sdata, req->bss)) {
|
||||
sdata_info(sdata, "AP is in CSA process, reject auth\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
rcu_read_unlock();
|
||||
|
||||
auth_data = kzalloc(sizeof(*auth_data) + req->auth_data_len +
|
||||
req->ie_len, GFP_KERNEL);
|
||||
@ -8086,7 +8142,7 @@ int ieee80211_mgd_assoc(struct ieee80211_sub_if_data *sdata,
|
||||
struct ieee80211_local *local = sdata->local;
|
||||
struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
|
||||
struct ieee80211_mgd_assoc_data *assoc_data;
|
||||
const struct element *ssid_elem, *csa_elem, *ecsa_elem;
|
||||
const struct element *ssid_elem;
|
||||
struct ieee80211_vif_cfg *vif_cfg = &sdata->vif.cfg;
|
||||
ieee80211_conn_flags_t conn_flags = 0;
|
||||
struct ieee80211_link_data *link;
|
||||
@ -8109,23 +8165,15 @@ int ieee80211_mgd_assoc(struct ieee80211_sub_if_data *sdata,
|
||||
|
||||
cbss = req->link_id < 0 ? req->bss : req->links[req->link_id].bss;
|
||||
|
||||
rcu_read_lock();
|
||||
ssid_elem = ieee80211_bss_get_elem(cbss, WLAN_EID_SSID);
|
||||
if (!ssid_elem || ssid_elem->datalen > sizeof(assoc_data->ssid)) {
|
||||
rcu_read_unlock();
|
||||
if (ieee80211_mgd_csa_in_process(sdata, cbss)) {
|
||||
sdata_info(sdata, "AP is in CSA process, reject assoc\n");
|
||||
kfree(assoc_data);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
csa_elem = ieee80211_bss_get_elem(cbss, WLAN_EID_CHANNEL_SWITCH);
|
||||
ecsa_elem = ieee80211_bss_get_elem(cbss, WLAN_EID_EXT_CHANSWITCH_ANN);
|
||||
if ((csa_elem &&
|
||||
csa_elem->datalen == sizeof(struct ieee80211_channel_sw_ie) &&
|
||||
((struct ieee80211_channel_sw_ie *)csa_elem->data)->count != 0) ||
|
||||
(ecsa_elem &&
|
||||
ecsa_elem->datalen == sizeof(struct ieee80211_ext_chansw_ie) &&
|
||||
((struct ieee80211_ext_chansw_ie *)ecsa_elem->data)->count != 0)) {
|
||||
sdata_info(sdata, "AP is in CSA process, reject assoc\n");
|
||||
rcu_read_lock();
|
||||
ssid_elem = ieee80211_bss_get_elem(cbss, WLAN_EID_SSID);
|
||||
if (!ssid_elem || ssid_elem->datalen > sizeof(assoc_data->ssid)) {
|
||||
rcu_read_unlock();
|
||||
kfree(assoc_data);
|
||||
return -EINVAL;
|
||||
@ -8402,8 +8450,7 @@ int ieee80211_mgd_assoc(struct ieee80211_sub_if_data *sdata,
|
||||
|
||||
rcu_read_lock();
|
||||
beacon_ies = rcu_dereference(req->bss->beacon_ies);
|
||||
|
||||
if (beacon_ies) {
|
||||
if (!beacon_ies) {
|
||||
/*
|
||||
* Wait up to one beacon interval ...
|
||||
* should this be more if we miss one?
|
||||
@ -8484,6 +8531,7 @@ int ieee80211_mgd_deauth(struct ieee80211_sub_if_data *sdata,
|
||||
ieee80211_report_disconnect(sdata, frame_buf,
|
||||
sizeof(frame_buf), true,
|
||||
req->reason_code, false);
|
||||
drv_mgd_complete_tx(sdata->local, sdata, &info);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -9,7 +9,7 @@
|
||||
* Copyright 2007, Michael Wu <flamingice@sourmilk.net>
|
||||
* Copyright 2013-2015 Intel Mobile Communications GmbH
|
||||
* Copyright 2016-2017 Intel Deutschland GmbH
|
||||
* Copyright (C) 2018-2023 Intel Corporation
|
||||
* Copyright (C) 2018-2024 Intel Corporation
|
||||
*/
|
||||
|
||||
#include <linux/if_arp.h>
|
||||
@ -237,14 +237,18 @@ ieee80211_bss_info_update(struct ieee80211_local *local,
|
||||
}
|
||||
|
||||
static bool ieee80211_scan_accept_presp(struct ieee80211_sub_if_data *sdata,
|
||||
struct ieee80211_channel *channel,
|
||||
u32 scan_flags, const u8 *da)
|
||||
{
|
||||
if (!sdata)
|
||||
return false;
|
||||
/* accept broadcast for OCE */
|
||||
if (scan_flags & NL80211_SCAN_FLAG_ACCEPT_BCAST_PROBE_RESP &&
|
||||
is_broadcast_ether_addr(da))
|
||||
|
||||
/* accept broadcast on 6 GHz and for OCE */
|
||||
if (is_broadcast_ether_addr(da) &&
|
||||
(channel->band == NL80211_BAND_6GHZ ||
|
||||
scan_flags & NL80211_SCAN_FLAG_ACCEPT_BCAST_PROBE_RESP))
|
||||
return true;
|
||||
|
||||
if (scan_flags & NL80211_SCAN_FLAG_RANDOM_ADDR)
|
||||
return true;
|
||||
return ether_addr_equal(da, sdata->vif.addr);
|
||||
@ -293,6 +297,12 @@ void ieee80211_scan_rx(struct ieee80211_local *local, struct sk_buff *skb)
|
||||
wiphy_delayed_work_queue(local->hw.wiphy, &local->scan_work, 0);
|
||||
}
|
||||
|
||||
channel = ieee80211_get_channel_khz(local->hw.wiphy,
|
||||
ieee80211_rx_status_to_khz(rx_status));
|
||||
|
||||
if (!channel || channel->flags & IEEE80211_CHAN_DISABLED)
|
||||
return;
|
||||
|
||||
if (ieee80211_is_probe_resp(mgmt->frame_control)) {
|
||||
struct cfg80211_scan_request *scan_req;
|
||||
struct cfg80211_sched_scan_request *sched_scan_req;
|
||||
@ -310,19 +320,15 @@ void ieee80211_scan_rx(struct ieee80211_local *local, struct sk_buff *skb)
|
||||
/* ignore ProbeResp to foreign address or non-bcast (OCE)
|
||||
* unless scanning with randomised address
|
||||
*/
|
||||
if (!ieee80211_scan_accept_presp(sdata1, scan_req_flags,
|
||||
if (!ieee80211_scan_accept_presp(sdata1, channel,
|
||||
scan_req_flags,
|
||||
mgmt->da) &&
|
||||
!ieee80211_scan_accept_presp(sdata2, sched_scan_req_flags,
|
||||
!ieee80211_scan_accept_presp(sdata2, channel,
|
||||
sched_scan_req_flags,
|
||||
mgmt->da))
|
||||
return;
|
||||
}
|
||||
|
||||
channel = ieee80211_get_channel_khz(local->hw.wiphy,
|
||||
ieee80211_rx_status_to_khz(rx_status));
|
||||
|
||||
if (!channel || channel->flags & IEEE80211_CHAN_DISABLED)
|
||||
return;
|
||||
|
||||
bss = ieee80211_bss_info_update(local, rx_status,
|
||||
mgmt, skb->len,
|
||||
channel);
|
||||
|
@ -3100,10 +3100,11 @@ void ieee80211_check_fast_xmit(struct sta_info *sta)
|
||||
/* DA SA BSSID */
|
||||
build.da_offs = offsetof(struct ieee80211_hdr, addr1);
|
||||
build.sa_offs = offsetof(struct ieee80211_hdr, addr2);
|
||||
rcu_read_lock();
|
||||
link = rcu_dereference(sdata->link[tdls_link_id]);
|
||||
if (WARN_ON_ONCE(!link))
|
||||
break;
|
||||
memcpy(hdr->addr3, link->u.mgd.bssid, ETH_ALEN);
|
||||
if (!WARN_ON_ONCE(!link))
|
||||
memcpy(hdr->addr3, link->u.mgd.bssid, ETH_ALEN);
|
||||
rcu_read_unlock();
|
||||
build.hdr_len = 24;
|
||||
break;
|
||||
}
|
||||
|
@ -23,8 +23,6 @@ void ieee80211_check_wbrf_support(struct ieee80211_local *local)
|
||||
return;
|
||||
|
||||
local->wbrf_supported = acpi_amd_wbrf_supported_producer(dev);
|
||||
dev_dbg(dev, "WBRF is %s supported\n",
|
||||
local->wbrf_supported ? "" : "not");
|
||||
}
|
||||
|
||||
static void get_chan_freq_boundary(u32 center_freq, u32 bandwidth, u64 *start, u64 *end)
|
||||
|
@ -5,7 +5,7 @@
|
||||
* Copyright 2006-2010 Johannes Berg <johannes@sipsolutions.net>
|
||||
* Copyright 2013-2014 Intel Mobile Communications GmbH
|
||||
* Copyright 2015-2017 Intel Deutschland GmbH
|
||||
* Copyright (C) 2018-2023 Intel Corporation
|
||||
* Copyright (C) 2018-2024 Intel Corporation
|
||||
*/
|
||||
|
||||
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||
@ -1661,6 +1661,7 @@ void wiphy_delayed_work_queue(struct wiphy *wiphy,
|
||||
unsigned long delay)
|
||||
{
|
||||
if (!delay) {
|
||||
del_timer(&dwork->timer);
|
||||
wiphy_work_queue(wiphy, &dwork->work);
|
||||
return;
|
||||
}
|
||||
|
@ -1696,6 +1696,61 @@ static void cfg80211_update_hidden_bsses(struct cfg80211_internal_bss *known,
|
||||
}
|
||||
}
|
||||
|
||||
static void cfg80211_check_stuck_ecsa(struct cfg80211_registered_device *rdev,
|
||||
struct cfg80211_internal_bss *known,
|
||||
const struct cfg80211_bss_ies *old)
|
||||
{
|
||||
const struct ieee80211_ext_chansw_ie *ecsa;
|
||||
const struct element *elem_new, *elem_old;
|
||||
const struct cfg80211_bss_ies *new, *bcn;
|
||||
|
||||
if (known->pub.proberesp_ecsa_stuck)
|
||||
return;
|
||||
|
||||
new = rcu_dereference_protected(known->pub.proberesp_ies,
|
||||
lockdep_is_held(&rdev->bss_lock));
|
||||
if (WARN_ON(!new))
|
||||
return;
|
||||
|
||||
if (new->tsf - old->tsf < USEC_PER_SEC)
|
||||
return;
|
||||
|
||||
elem_old = cfg80211_find_elem(WLAN_EID_EXT_CHANSWITCH_ANN,
|
||||
old->data, old->len);
|
||||
if (!elem_old)
|
||||
return;
|
||||
|
||||
elem_new = cfg80211_find_elem(WLAN_EID_EXT_CHANSWITCH_ANN,
|
||||
new->data, new->len);
|
||||
if (!elem_new)
|
||||
return;
|
||||
|
||||
bcn = rcu_dereference_protected(known->pub.beacon_ies,
|
||||
lockdep_is_held(&rdev->bss_lock));
|
||||
if (bcn &&
|
||||
cfg80211_find_elem(WLAN_EID_EXT_CHANSWITCH_ANN,
|
||||
bcn->data, bcn->len))
|
||||
return;
|
||||
|
||||
if (elem_new->datalen != elem_old->datalen)
|
||||
return;
|
||||
if (elem_new->datalen < sizeof(struct ieee80211_ext_chansw_ie))
|
||||
return;
|
||||
if (memcmp(elem_new->data, elem_old->data, elem_new->datalen))
|
||||
return;
|
||||
|
||||
ecsa = (void *)elem_new->data;
|
||||
|
||||
if (!ecsa->mode)
|
||||
return;
|
||||
|
||||
if (ecsa->new_ch_num !=
|
||||
ieee80211_frequency_to_channel(known->pub.channel->center_freq))
|
||||
return;
|
||||
|
||||
known->pub.proberesp_ecsa_stuck = 1;
|
||||
}
|
||||
|
||||
static bool
|
||||
cfg80211_update_known_bss(struct cfg80211_registered_device *rdev,
|
||||
struct cfg80211_internal_bss *known,
|
||||
@ -1715,8 +1770,10 @@ cfg80211_update_known_bss(struct cfg80211_registered_device *rdev,
|
||||
/* Override possible earlier Beacon frame IEs */
|
||||
rcu_assign_pointer(known->pub.ies,
|
||||
new->pub.proberesp_ies);
|
||||
if (old)
|
||||
if (old) {
|
||||
cfg80211_check_stuck_ecsa(rdev, known, old);
|
||||
kfree_rcu((struct cfg80211_bss_ies *)old, rcu_head);
|
||||
}
|
||||
}
|
||||
|
||||
if (rcu_access_pointer(new->pub.beacon_ies)) {
|
||||
|
Loading…
Reference in New Issue
Block a user