wireless fixes for v6.9-rc2
The first fixes for v6.9. Ping-Ke Shih now maintains a separate tree for Realtek drivers, document that in the MAINTAINERS. Plenty of fixes for both to stack and iwlwifi. Our kunit tests were working only on um architecture but that's fixed now. -----BEGIN PGP SIGNATURE----- iQFFBAABCgAvFiEEiBjanGPFTz4PRfLobhckVSbrbZsFAmYEbzoRHGt2YWxvQGtl cm5lbC5vcmcACgkQbhckVSbrbZsjZwgApoOcTn/mkX7DEViByMUpOrdNYqkJh+Tv RkDDqhbA97i+zlxWp1dwtdfn0CYEcCW2XBucrfDNZMcR/cfXy2Wgdr6BD/FG9S2D oQX6QQijO7g9uqNgDfIVAC0ftJEeWkM7YUhqNDVR751gjy2WOOJqPtSgNGd873By P0rbHyfykHMzyYbwlzMLosO3RigefD1p1qkkODPf2OMo5A4tL1gL9AfEk3Kef9sf 9JHHWCLR378sm2sMpGw2Lxw4ypazl08ABu1yAWJk6Xipn80D/b08YUH/1yiKuq22 JrxhllJu2nqaHxXOzje2WEapTBz9tpTAwigOUQJiVZWm6ii19giGng== =89Ft -----END PGP SIGNATURE----- Merge tag 'wireless-2024-03-27' of git://git.kernel.org/pub/scm/linux/kernel/git/wireless/wireless Kalle Valo says: ==================== wireless fixes for v6.9-rc2 The first fixes for v6.9. Ping-Ke Shih now maintains a separate tree for Realtek drivers, document that in the MAINTAINERS. Plenty of fixes for both to stack and iwlwifi. Our kunit tests were working only on um architecture but that's fixed now. * tag 'wireless-2024-03-27' of git://git.kernel.org/pub/scm/linux/kernel/git/wireless/wireless: (21 commits) MAINTAINERS: wifi: mwifiex: add Francesco as reviewer kunit: fix wireless test dependencies wifi: iwlwifi: mvm: include link ID when releasing frames wifi: iwlwifi: mvm: handle debugfs names more carefully wifi: iwlwifi: mvm: guard against invalid STA ID on removal wifi: iwlwifi: read txq->read_ptr under lock wifi: iwlwifi: fw: don't always use FW dump trig wifi: iwlwifi: mvm: rfi: fix potential response leaks wifi: mac80211: correctly set active links upon TTLM wifi: iwlwifi: mvm: Configure the link mapping for non-MLD FW wifi: iwlwifi: mvm: consider having one active link wifi: iwlwifi: mvm: pick the version of SESSION_PROTECTION_NOTIF wifi: mac80211: fix prep_connection error path wifi: cfg80211: fix rdev_dump_mpp() arguments order wifi: iwlwifi: mvm: disable MLO for the time being wifi: cfg80211: add a flag to disable wireless extensions wifi: mac80211: fix ieee80211_bss_*_flags kernel-doc wifi: mac80211: check/clear fast rx for non-4addr sta VLAN changes wifi: mac80211: fix mlme_link_id_dbg() MAINTAINERS: wifi: add git tree for Realtek WiFi drivers ... ==================== Link: https://lore.kernel.org/r/20240327191346.1A1EAC433C7@smtp.kernel.org Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
commit
56d2f48ed8
@ -13133,6 +13133,7 @@ F: drivers/net/ethernet/marvell/mvpp2/
|
|||||||
|
|
||||||
MARVELL MWIFIEX WIRELESS DRIVER
|
MARVELL MWIFIEX WIRELESS DRIVER
|
||||||
M: Brian Norris <briannorris@chromium.org>
|
M: Brian Norris <briannorris@chromium.org>
|
||||||
|
R: Francesco Dolcini <francesco@dolcini.it>
|
||||||
L: linux-wireless@vger.kernel.org
|
L: linux-wireless@vger.kernel.org
|
||||||
S: Odd Fixes
|
S: Odd Fixes
|
||||||
F: drivers/net/wireless/marvell/mwifiex/
|
F: drivers/net/wireless/marvell/mwifiex/
|
||||||
@ -18642,18 +18643,21 @@ REALTEK WIRELESS DRIVER (rtlwifi family)
|
|||||||
M: Ping-Ke Shih <pkshih@realtek.com>
|
M: Ping-Ke Shih <pkshih@realtek.com>
|
||||||
L: linux-wireless@vger.kernel.org
|
L: linux-wireless@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
T: git https://github.com/pkshih/rtw.git
|
||||||
F: drivers/net/wireless/realtek/rtlwifi/
|
F: drivers/net/wireless/realtek/rtlwifi/
|
||||||
|
|
||||||
REALTEK WIRELESS DRIVER (rtw88)
|
REALTEK WIRELESS DRIVER (rtw88)
|
||||||
M: Ping-Ke Shih <pkshih@realtek.com>
|
M: Ping-Ke Shih <pkshih@realtek.com>
|
||||||
L: linux-wireless@vger.kernel.org
|
L: linux-wireless@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
T: git https://github.com/pkshih/rtw.git
|
||||||
F: drivers/net/wireless/realtek/rtw88/
|
F: drivers/net/wireless/realtek/rtw88/
|
||||||
|
|
||||||
REALTEK WIRELESS DRIVER (rtw89)
|
REALTEK WIRELESS DRIVER (rtw89)
|
||||||
M: Ping-Ke Shih <pkshih@realtek.com>
|
M: Ping-Ke Shih <pkshih@realtek.com>
|
||||||
L: linux-wireless@vger.kernel.org
|
L: linux-wireless@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
T: git https://github.com/pkshih/rtw.git
|
||||||
F: drivers/net/wireless/realtek/rtw89/
|
F: drivers/net/wireless/realtek/rtw89/
|
||||||
|
|
||||||
REDPINE WIRELESS DRIVER
|
REDPINE WIRELESS DRIVER
|
||||||
@ -19197,12 +19201,14 @@ M: Hin-Tak Leung <hintak.leung@gmail.com>
|
|||||||
M: Larry Finger <Larry.Finger@lwfinger.net>
|
M: Larry Finger <Larry.Finger@lwfinger.net>
|
||||||
L: linux-wireless@vger.kernel.org
|
L: linux-wireless@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
T: git https://github.com/pkshih/rtw.git
|
||||||
F: drivers/net/wireless/realtek/rtl818x/rtl8187/
|
F: drivers/net/wireless/realtek/rtl818x/rtl8187/
|
||||||
|
|
||||||
RTL8XXXU WIRELESS DRIVER (rtl8xxxu)
|
RTL8XXXU WIRELESS DRIVER (rtl8xxxu)
|
||||||
M: Jes Sorensen <Jes.Sorensen@gmail.com>
|
M: Jes Sorensen <Jes.Sorensen@gmail.com>
|
||||||
L: linux-wireless@vger.kernel.org
|
L: linux-wireless@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
T: git https://github.com/pkshih/rtw.git
|
||||||
F: drivers/net/wireless/realtek/rtl8xxxu/
|
F: drivers/net/wireless/realtek/rtl8xxxu/
|
||||||
|
|
||||||
RTRS TRANSPORT DRIVERS
|
RTRS TRANSPORT DRIVERS
|
||||||
|
@ -3081,8 +3081,6 @@ static void iwl_fw_dbg_collect_sync(struct iwl_fw_runtime *fwrt, u8 wk_idx)
|
|||||||
struct iwl_fw_dbg_params params = {0};
|
struct iwl_fw_dbg_params params = {0};
|
||||||
struct iwl_fwrt_dump_data *dump_data =
|
struct iwl_fwrt_dump_data *dump_data =
|
||||||
&fwrt->dump.wks[wk_idx].dump_data;
|
&fwrt->dump.wks[wk_idx].dump_data;
|
||||||
u32 policy;
|
|
||||||
u32 time_point;
|
|
||||||
if (!test_bit(wk_idx, &fwrt->dump.active_wks))
|
if (!test_bit(wk_idx, &fwrt->dump.active_wks))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -3113,13 +3111,16 @@ static void iwl_fw_dbg_collect_sync(struct iwl_fw_runtime *fwrt, u8 wk_idx)
|
|||||||
|
|
||||||
iwl_fw_dbg_stop_restart_recording(fwrt, ¶ms, false);
|
iwl_fw_dbg_stop_restart_recording(fwrt, ¶ms, false);
|
||||||
|
|
||||||
policy = le32_to_cpu(dump_data->trig->apply_policy);
|
if (iwl_trans_dbg_ini_valid(fwrt->trans)) {
|
||||||
time_point = le32_to_cpu(dump_data->trig->time_point);
|
u32 policy = le32_to_cpu(dump_data->trig->apply_policy);
|
||||||
|
u32 time_point = le32_to_cpu(dump_data->trig->time_point);
|
||||||
|
|
||||||
if (policy & IWL_FW_INI_APPLY_POLICY_DUMP_COMPLETE_CMD) {
|
if (policy & IWL_FW_INI_APPLY_POLICY_DUMP_COMPLETE_CMD) {
|
||||||
IWL_DEBUG_FW_INFO(fwrt, "WRT: sending dump complete\n");
|
IWL_DEBUG_FW_INFO(fwrt, "WRT: sending dump complete\n");
|
||||||
iwl_send_dbg_dump_complete_cmd(fwrt, time_point, 0);
|
iwl_send_dbg_dump_complete_cmd(fwrt, time_point, 0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fwrt->trans->dbg.last_tp_resetfw == IWL_FW_INI_RESET_FW_MODE_STOP_FW_ONLY)
|
if (fwrt->trans->dbg.last_tp_resetfw == IWL_FW_INI_RESET_FW_MODE_STOP_FW_ONLY)
|
||||||
iwl_force_nmi(fwrt->trans);
|
iwl_force_nmi(fwrt->trans);
|
||||||
|
|
||||||
|
@ -1260,15 +1260,15 @@ static int __iwl_mvm_suspend(struct ieee80211_hw *hw,
|
|||||||
if (IS_ERR_OR_NULL(vif))
|
if (IS_ERR_OR_NULL(vif))
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
if (ieee80211_vif_is_mld(vif) && vif->cfg.assoc) {
|
if (hweight16(vif->active_links) > 1) {
|
||||||
/*
|
/*
|
||||||
* Select the 'best' link. May need to revisit, it seems
|
* Select the 'best' link.
|
||||||
* better to not optimize for throughput but rather range,
|
* May need to revisit, it seems better to not optimize
|
||||||
* reliability and power here - and select 2.4 GHz ...
|
* for throughput but rather range, reliability and
|
||||||
|
* power here - and select 2.4 GHz ...
|
||||||
*/
|
*/
|
||||||
primary_link =
|
primary_link = iwl_mvm_mld_get_primary_link(mvm, vif,
|
||||||
iwl_mvm_mld_get_primary_link(mvm, vif,
|
vif->active_links);
|
||||||
vif->active_links);
|
|
||||||
|
|
||||||
if (WARN_ONCE(primary_link < 0, "no primary link in 0x%x\n",
|
if (WARN_ONCE(primary_link < 0, "no primary link in 0x%x\n",
|
||||||
vif->active_links))
|
vif->active_links))
|
||||||
@ -1277,6 +1277,8 @@ static int __iwl_mvm_suspend(struct ieee80211_hw *hw,
|
|||||||
ret = ieee80211_set_active_links(vif, BIT(primary_link));
|
ret = ieee80211_set_active_links(vif, BIT(primary_link));
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
} else if (vif->active_links) {
|
||||||
|
primary_link = __ffs(vif->active_links);
|
||||||
} else {
|
} else {
|
||||||
primary_link = 0;
|
primary_link = 0;
|
||||||
}
|
}
|
||||||
|
@ -748,7 +748,9 @@ void iwl_mvm_vif_dbgfs_add_link(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
|
|||||||
{
|
{
|
||||||
struct dentry *dbgfs_dir = vif->debugfs_dir;
|
struct dentry *dbgfs_dir = vif->debugfs_dir;
|
||||||
struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
|
struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
|
||||||
char buf[100];
|
char buf[3 * 3 + 11 + (NL80211_WIPHY_NAME_MAXLEN + 1) +
|
||||||
|
(7 + IFNAMSIZ + 1) + 6 + 1];
|
||||||
|
char name[7 + IFNAMSIZ + 1];
|
||||||
|
|
||||||
/* this will happen in monitor mode */
|
/* this will happen in monitor mode */
|
||||||
if (!dbgfs_dir)
|
if (!dbgfs_dir)
|
||||||
@ -761,10 +763,11 @@ void iwl_mvm_vif_dbgfs_add_link(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
|
|||||||
* find
|
* find
|
||||||
* netdev:wlan0 -> ../../../ieee80211/phy0/netdev:wlan0/iwlmvm/
|
* netdev:wlan0 -> ../../../ieee80211/phy0/netdev:wlan0/iwlmvm/
|
||||||
*/
|
*/
|
||||||
snprintf(buf, 100, "../../../%pd3/iwlmvm", dbgfs_dir);
|
snprintf(name, sizeof(name), "%pd", dbgfs_dir);
|
||||||
|
snprintf(buf, sizeof(buf), "../../../%pd3/iwlmvm", dbgfs_dir);
|
||||||
|
|
||||||
mvmvif->dbgfs_slink = debugfs_create_symlink(dbgfs_dir->d_name.name,
|
mvmvif->dbgfs_slink =
|
||||||
mvm->debugfs_dir, buf);
|
debugfs_create_symlink(name, mvm->debugfs_dir, buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
void iwl_mvm_vif_dbgfs_rm_link(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
|
void iwl_mvm_vif_dbgfs_rm_link(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
|
||||||
|
@ -46,6 +46,27 @@ static int iwl_mvm_link_cmd_send(struct iwl_mvm *mvm,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int iwl_mvm_set_link_mapping(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
|
||||||
|
struct ieee80211_bss_conf *link_conf)
|
||||||
|
{
|
||||||
|
struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
|
||||||
|
struct iwl_mvm_vif_link_info *link_info =
|
||||||
|
mvmvif->link[link_conf->link_id];
|
||||||
|
|
||||||
|
if (link_info->fw_link_id == IWL_MVM_FW_LINK_ID_INVALID) {
|
||||||
|
link_info->fw_link_id = iwl_mvm_get_free_fw_link_id(mvm,
|
||||||
|
mvmvif);
|
||||||
|
if (link_info->fw_link_id >=
|
||||||
|
ARRAY_SIZE(mvm->link_id_to_link_conf))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
rcu_assign_pointer(mvm->link_id_to_link_conf[link_info->fw_link_id],
|
||||||
|
link_conf);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int iwl_mvm_add_link(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
|
int iwl_mvm_add_link(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
|
||||||
struct ieee80211_bss_conf *link_conf)
|
struct ieee80211_bss_conf *link_conf)
|
||||||
{
|
{
|
||||||
@ -55,19 +76,14 @@ int iwl_mvm_add_link(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
|
|||||||
struct iwl_link_config_cmd cmd = {};
|
struct iwl_link_config_cmd cmd = {};
|
||||||
unsigned int cmd_id = WIDE_ID(MAC_CONF_GROUP, LINK_CONFIG_CMD);
|
unsigned int cmd_id = WIDE_ID(MAC_CONF_GROUP, LINK_CONFIG_CMD);
|
||||||
u8 cmd_ver = iwl_fw_lookup_cmd_ver(mvm->fw, cmd_id, 1);
|
u8 cmd_ver = iwl_fw_lookup_cmd_ver(mvm->fw, cmd_id, 1);
|
||||||
|
int ret;
|
||||||
|
|
||||||
if (WARN_ON_ONCE(!link_info))
|
if (WARN_ON_ONCE(!link_info))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
if (link_info->fw_link_id == IWL_MVM_FW_LINK_ID_INVALID) {
|
ret = iwl_mvm_set_link_mapping(mvm, vif, link_conf);
|
||||||
link_info->fw_link_id = iwl_mvm_get_free_fw_link_id(mvm,
|
if (ret)
|
||||||
mvmvif);
|
return ret;
|
||||||
if (link_info->fw_link_id >= ARRAY_SIZE(mvm->link_id_to_link_conf))
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
rcu_assign_pointer(mvm->link_id_to_link_conf[link_info->fw_link_id],
|
|
||||||
link_conf);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Update SF - Disable if needed. if this fails, SF might still be on
|
/* Update SF - Disable if needed. if this fails, SF might still be on
|
||||||
* while many macs are bound, which is forbidden - so fail the binding.
|
* while many macs are bound, which is forbidden - so fail the binding.
|
||||||
@ -248,6 +264,24 @@ send_cmd:
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int iwl_mvm_unset_link_mapping(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
|
||||||
|
struct ieee80211_bss_conf *link_conf)
|
||||||
|
{
|
||||||
|
struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
|
||||||
|
struct iwl_mvm_vif_link_info *link_info =
|
||||||
|
mvmvif->link[link_conf->link_id];
|
||||||
|
|
||||||
|
/* mac80211 thought we have the link, but it was never configured */
|
||||||
|
if (WARN_ON(!link_info ||
|
||||||
|
link_info->fw_link_id >=
|
||||||
|
ARRAY_SIZE(mvm->link_id_to_link_conf)))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
RCU_INIT_POINTER(mvm->link_id_to_link_conf[link_info->fw_link_id],
|
||||||
|
NULL);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int iwl_mvm_remove_link(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
|
int iwl_mvm_remove_link(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
|
||||||
struct ieee80211_bss_conf *link_conf)
|
struct ieee80211_bss_conf *link_conf)
|
||||||
{
|
{
|
||||||
@ -257,13 +291,10 @@ int iwl_mvm_remove_link(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
|
|||||||
struct iwl_link_config_cmd cmd = {};
|
struct iwl_link_config_cmd cmd = {};
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
/* mac80211 thought we have the link, but it was never configured */
|
ret = iwl_mvm_unset_link_mapping(mvm, vif, link_conf);
|
||||||
if (WARN_ON(!link_info ||
|
if (ret)
|
||||||
link_info->fw_link_id >= ARRAY_SIZE(mvm->link_id_to_link_conf)))
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
RCU_INIT_POINTER(mvm->link_id_to_link_conf[link_info->fw_link_id],
|
|
||||||
NULL);
|
|
||||||
cmd.link_id = cpu_to_le32(link_info->fw_link_id);
|
cmd.link_id = cpu_to_le32(link_info->fw_link_id);
|
||||||
iwl_mvm_release_fw_link_id(mvm, link_info->fw_link_id);
|
iwl_mvm_release_fw_link_id(mvm, link_info->fw_link_id);
|
||||||
link_info->fw_link_id = IWL_MVM_FW_LINK_ID_INVALID;
|
link_info->fw_link_id = IWL_MVM_FW_LINK_ID_INVALID;
|
||||||
|
@ -360,7 +360,7 @@ int iwl_mvm_mac_setup_register(struct iwl_mvm *mvm)
|
|||||||
if (mvm->mld_api_is_used && mvm->nvm_data->sku_cap_11be_enable &&
|
if (mvm->mld_api_is_used && mvm->nvm_data->sku_cap_11be_enable &&
|
||||||
!iwlwifi_mod_params.disable_11ax &&
|
!iwlwifi_mod_params.disable_11ax &&
|
||||||
!iwlwifi_mod_params.disable_11be)
|
!iwlwifi_mod_params.disable_11be)
|
||||||
hw->wiphy->flags |= WIPHY_FLAG_SUPPORTS_MLO;
|
hw->wiphy->flags |= WIPHY_FLAG_DISABLE_WEXT;
|
||||||
|
|
||||||
/* With MLD FW API, it tracks timing by itself,
|
/* With MLD FW API, it tracks timing by itself,
|
||||||
* no need for any timing from the host
|
* no need for any timing from the host
|
||||||
@ -1577,8 +1577,14 @@ static int iwl_mvm_mac_add_interface(struct ieee80211_hw *hw,
|
|||||||
mvmvif->mvm = mvm;
|
mvmvif->mvm = mvm;
|
||||||
|
|
||||||
/* the first link always points to the default one */
|
/* the first link always points to the default one */
|
||||||
|
mvmvif->deflink.fw_link_id = IWL_MVM_FW_LINK_ID_INVALID;
|
||||||
|
mvmvif->deflink.active = 0;
|
||||||
mvmvif->link[0] = &mvmvif->deflink;
|
mvmvif->link[0] = &mvmvif->deflink;
|
||||||
|
|
||||||
|
ret = iwl_mvm_set_link_mapping(mvm, vif, &vif->bss_conf);
|
||||||
|
if (ret)
|
||||||
|
goto out;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Not much to do here. The stack will not allow interface
|
* Not much to do here. The stack will not allow interface
|
||||||
* types or combinations that we didn't advertise, so we
|
* types or combinations that we didn't advertise, so we
|
||||||
@ -1783,6 +1789,7 @@ static void iwl_mvm_mac_remove_interface(struct ieee80211_hw *hw,
|
|||||||
mvm->p2p_device_vif = NULL;
|
mvm->p2p_device_vif = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
iwl_mvm_unset_link_mapping(mvm, vif, &vif->bss_conf);
|
||||||
iwl_mvm_mac_ctxt_remove(mvm, vif);
|
iwl_mvm_mac_ctxt_remove(mvm, vif);
|
||||||
|
|
||||||
RCU_INIT_POINTER(mvm->vif_id_to_mac[mvmvif->id], NULL);
|
RCU_INIT_POINTER(mvm->vif_id_to_mac[mvmvif->id], NULL);
|
||||||
|
@ -855,10 +855,15 @@ int iwl_mvm_mld_rm_sta(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
|
|||||||
|
|
||||||
int iwl_mvm_mld_rm_sta_id(struct iwl_mvm *mvm, u8 sta_id)
|
int iwl_mvm_mld_rm_sta_id(struct iwl_mvm *mvm, u8 sta_id)
|
||||||
{
|
{
|
||||||
int ret = iwl_mvm_mld_rm_sta_from_fw(mvm, sta_id);
|
int ret;
|
||||||
|
|
||||||
lockdep_assert_held(&mvm->mutex);
|
lockdep_assert_held(&mvm->mutex);
|
||||||
|
|
||||||
|
if (WARN_ON(sta_id == IWL_MVM_INVALID_STA))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
ret = iwl_mvm_mld_rm_sta_from_fw(mvm, sta_id);
|
||||||
|
|
||||||
RCU_INIT_POINTER(mvm->fw_id_to_mac_id[sta_id], NULL);
|
RCU_INIT_POINTER(mvm->fw_id_to_mac_id[sta_id], NULL);
|
||||||
RCU_INIT_POINTER(mvm->fw_id_to_link_sta[sta_id], NULL);
|
RCU_INIT_POINTER(mvm->fw_id_to_link_sta[sta_id], NULL);
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -1916,11 +1916,15 @@ int iwl_mvm_binding_remove_vif(struct iwl_mvm *mvm, struct ieee80211_vif *vif);
|
|||||||
u32 iwl_mvm_get_lmac_id(struct iwl_mvm *mvm, enum nl80211_band band);
|
u32 iwl_mvm_get_lmac_id(struct iwl_mvm *mvm, enum nl80211_band band);
|
||||||
|
|
||||||
/* Links */
|
/* Links */
|
||||||
|
int iwl_mvm_set_link_mapping(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
|
||||||
|
struct ieee80211_bss_conf *link_conf);
|
||||||
int iwl_mvm_add_link(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
|
int iwl_mvm_add_link(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
|
||||||
struct ieee80211_bss_conf *link_conf);
|
struct ieee80211_bss_conf *link_conf);
|
||||||
int iwl_mvm_link_changed(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
|
int iwl_mvm_link_changed(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
|
||||||
struct ieee80211_bss_conf *link_conf,
|
struct ieee80211_bss_conf *link_conf,
|
||||||
u32 changes, bool active);
|
u32 changes, bool active);
|
||||||
|
int iwl_mvm_unset_link_mapping(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
|
||||||
|
struct ieee80211_bss_conf *link_conf);
|
||||||
int iwl_mvm_remove_link(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
|
int iwl_mvm_remove_link(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
|
||||||
struct ieee80211_bss_conf *link_conf);
|
struct ieee80211_bss_conf *link_conf);
|
||||||
int iwl_mvm_disable_link(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
|
int iwl_mvm_disable_link(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
|
||||||
|
@ -132,14 +132,18 @@ struct iwl_rfi_freq_table_resp_cmd *iwl_rfi_get_freq_table(struct iwl_mvm *mvm)
|
|||||||
if (ret)
|
if (ret)
|
||||||
return ERR_PTR(ret);
|
return ERR_PTR(ret);
|
||||||
|
|
||||||
if (WARN_ON_ONCE(iwl_rx_packet_payload_len(cmd.resp_pkt) != resp_size))
|
if (WARN_ON_ONCE(iwl_rx_packet_payload_len(cmd.resp_pkt) !=
|
||||||
|
resp_size)) {
|
||||||
|
iwl_free_resp(&cmd);
|
||||||
return ERR_PTR(-EIO);
|
return ERR_PTR(-EIO);
|
||||||
|
}
|
||||||
|
|
||||||
resp = kmemdup(cmd.resp_pkt->data, resp_size, GFP_KERNEL);
|
resp = kmemdup(cmd.resp_pkt->data, resp_size, GFP_KERNEL);
|
||||||
|
iwl_free_resp(&cmd);
|
||||||
|
|
||||||
if (!resp)
|
if (!resp)
|
||||||
return ERR_PTR(-ENOMEM);
|
return ERR_PTR(-ENOMEM);
|
||||||
|
|
||||||
iwl_free_resp(&cmd);
|
|
||||||
return resp;
|
return resp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -236,21 +236,13 @@ static void iwl_mvm_add_rtap_sniffer_config(struct iwl_mvm *mvm,
|
|||||||
static void iwl_mvm_pass_packet_to_mac80211(struct iwl_mvm *mvm,
|
static void iwl_mvm_pass_packet_to_mac80211(struct iwl_mvm *mvm,
|
||||||
struct napi_struct *napi,
|
struct napi_struct *napi,
|
||||||
struct sk_buff *skb, int queue,
|
struct sk_buff *skb, int queue,
|
||||||
struct ieee80211_sta *sta,
|
struct ieee80211_sta *sta)
|
||||||
struct ieee80211_link_sta *link_sta)
|
|
||||||
{
|
{
|
||||||
if (unlikely(iwl_mvm_check_pn(mvm, skb, queue, sta))) {
|
if (unlikely(iwl_mvm_check_pn(mvm, skb, queue, sta))) {
|
||||||
kfree_skb(skb);
|
kfree_skb(skb);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sta && sta->valid_links && link_sta) {
|
|
||||||
struct ieee80211_rx_status *rx_status = IEEE80211_SKB_RXCB(skb);
|
|
||||||
|
|
||||||
rx_status->link_valid = 1;
|
|
||||||
rx_status->link_id = link_sta->link_id;
|
|
||||||
}
|
|
||||||
|
|
||||||
ieee80211_rx_napi(mvm->hw, sta, skb, napi);
|
ieee80211_rx_napi(mvm->hw, sta, skb, napi);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -588,7 +580,7 @@ static void iwl_mvm_release_frames(struct iwl_mvm *mvm,
|
|||||||
while ((skb = __skb_dequeue(skb_list))) {
|
while ((skb = __skb_dequeue(skb_list))) {
|
||||||
iwl_mvm_pass_packet_to_mac80211(mvm, napi, skb,
|
iwl_mvm_pass_packet_to_mac80211(mvm, napi, skb,
|
||||||
reorder_buf->queue,
|
reorder_buf->queue,
|
||||||
sta, NULL /* FIXME */);
|
sta);
|
||||||
reorder_buf->num_stored--;
|
reorder_buf->num_stored--;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2213,6 +2205,11 @@ void iwl_mvm_rx_mpdu_mq(struct iwl_mvm *mvm, struct napi_struct *napi,
|
|||||||
if (IS_ERR(sta))
|
if (IS_ERR(sta))
|
||||||
sta = NULL;
|
sta = NULL;
|
||||||
link_sta = rcu_dereference(mvm->fw_id_to_link_sta[id]);
|
link_sta = rcu_dereference(mvm->fw_id_to_link_sta[id]);
|
||||||
|
|
||||||
|
if (sta && sta->valid_links && link_sta) {
|
||||||
|
rx_status->link_valid = 1;
|
||||||
|
rx_status->link_id = link_sta->link_id;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else if (!is_multicast_ether_addr(hdr->addr2)) {
|
} else if (!is_multicast_ether_addr(hdr->addr2)) {
|
||||||
/*
|
/*
|
||||||
@ -2356,8 +2353,7 @@ void iwl_mvm_rx_mpdu_mq(struct iwl_mvm *mvm, struct napi_struct *napi,
|
|||||||
!(desc->amsdu_info & IWL_RX_MPDU_AMSDU_LAST_SUBFRAME))
|
!(desc->amsdu_info & IWL_RX_MPDU_AMSDU_LAST_SUBFRAME))
|
||||||
rx_status->flag |= RX_FLAG_AMSDU_MORE;
|
rx_status->flag |= RX_FLAG_AMSDU_MORE;
|
||||||
|
|
||||||
iwl_mvm_pass_packet_to_mac80211(mvm, napi, skb, queue, sta,
|
iwl_mvm_pass_packet_to_mac80211(mvm, napi, skb, queue, sta);
|
||||||
link_sta);
|
|
||||||
}
|
}
|
||||||
out:
|
out:
|
||||||
rcu_read_unlock();
|
rcu_read_unlock();
|
||||||
|
@ -879,9 +879,8 @@ void iwl_mvm_rx_session_protect_notif(struct iwl_mvm *mvm,
|
|||||||
struct iwl_rx_packet *pkt = rxb_addr(rxb);
|
struct iwl_rx_packet *pkt = rxb_addr(rxb);
|
||||||
struct iwl_mvm_session_prot_notif *notif = (void *)pkt->data;
|
struct iwl_mvm_session_prot_notif *notif = (void *)pkt->data;
|
||||||
unsigned int ver =
|
unsigned int ver =
|
||||||
iwl_fw_lookup_cmd_ver(mvm->fw,
|
iwl_fw_lookup_notif_ver(mvm->fw, MAC_CONF_GROUP,
|
||||||
WIDE_ID(MAC_CONF_GROUP,
|
SESSION_PROTECTION_NOTIF, 2);
|
||||||
SESSION_PROTECTION_CMD), 2);
|
|
||||||
int id = le32_to_cpu(notif->mac_link_id);
|
int id = le32_to_cpu(notif->mac_link_id);
|
||||||
struct ieee80211_vif *vif;
|
struct ieee80211_vif *vif;
|
||||||
struct iwl_mvm_vif *mvmvif;
|
struct iwl_mvm_vif *mvmvif;
|
||||||
|
@ -1589,9 +1589,9 @@ void iwl_txq_reclaim(struct iwl_trans *trans, int txq_id, int ssn,
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
tfd_num = iwl_txq_get_cmd_index(txq, ssn);
|
tfd_num = iwl_txq_get_cmd_index(txq, ssn);
|
||||||
read_ptr = iwl_txq_get_cmd_index(txq, txq->read_ptr);
|
|
||||||
|
|
||||||
spin_lock_bh(&txq->lock);
|
spin_lock_bh(&txq->lock);
|
||||||
|
read_ptr = iwl_txq_get_cmd_index(txq, txq->read_ptr);
|
||||||
|
|
||||||
if (!test_bit(txq_id, trans->txqs.queue_used)) {
|
if (!test_bit(txq_id, trans->txqs.queue_used)) {
|
||||||
IWL_DEBUG_TX_QUEUES(trans, "Q %d inactive - ignoring idx %d\n",
|
IWL_DEBUG_TX_QUEUES(trans, "Q %d inactive - ignoring idx %d\n",
|
||||||
|
@ -2233,7 +2233,7 @@ static void rtw8922a_btc_init_cfg(struct rtw89_dev *rtwdev)
|
|||||||
* Shared-Ant && BTG-path:WL mask(0x55f), others:WL THRU(0x5ff)
|
* Shared-Ant && BTG-path:WL mask(0x55f), others:WL THRU(0x5ff)
|
||||||
*/
|
*/
|
||||||
if (btc->ant_type == BTC_ANT_SHARED && btc->btg_pos == path)
|
if (btc->ant_type == BTC_ANT_SHARED && btc->btg_pos == path)
|
||||||
rtw8922a_set_trx_mask(rtwdev, path, BTC_BT_TX_GROUP, 0x5ff);
|
rtw8922a_set_trx_mask(rtwdev, path, BTC_BT_TX_GROUP, 0x55f);
|
||||||
else
|
else
|
||||||
rtw8922a_set_trx_mask(rtwdev, path, BTC_BT_TX_GROUP, 0x5ff);
|
rtw8922a_set_trx_mask(rtwdev, path, BTC_BT_TX_GROUP, 0x5ff);
|
||||||
|
|
||||||
|
@ -4991,6 +4991,7 @@ struct cfg80211_ops {
|
|||||||
* set this flag to update channels on beacon hints.
|
* set this flag to update channels on beacon hints.
|
||||||
* @WIPHY_FLAG_SUPPORTS_NSTR_NONPRIMARY: support connection to non-primary link
|
* @WIPHY_FLAG_SUPPORTS_NSTR_NONPRIMARY: support connection to non-primary link
|
||||||
* of an NSTR mobile AP MLD.
|
* of an NSTR mobile AP MLD.
|
||||||
|
* @WIPHY_FLAG_DISABLE_WEXT: disable wireless extensions for this device
|
||||||
*/
|
*/
|
||||||
enum wiphy_flags {
|
enum wiphy_flags {
|
||||||
WIPHY_FLAG_SUPPORTS_EXT_KEK_KCK = BIT(0),
|
WIPHY_FLAG_SUPPORTS_EXT_KEK_KCK = BIT(0),
|
||||||
@ -5002,6 +5003,7 @@ enum wiphy_flags {
|
|||||||
WIPHY_FLAG_4ADDR_STATION = BIT(6),
|
WIPHY_FLAG_4ADDR_STATION = BIT(6),
|
||||||
WIPHY_FLAG_CONTROL_PORT_PROTOCOL = BIT(7),
|
WIPHY_FLAG_CONTROL_PORT_PROTOCOL = BIT(7),
|
||||||
WIPHY_FLAG_IBSS_RSN = BIT(8),
|
WIPHY_FLAG_IBSS_RSN = BIT(8),
|
||||||
|
WIPHY_FLAG_DISABLE_WEXT = BIT(9),
|
||||||
WIPHY_FLAG_MESH_AUTH = BIT(10),
|
WIPHY_FLAG_MESH_AUTH = BIT(10),
|
||||||
WIPHY_FLAG_SUPPORTS_EXT_KCK_32 = BIT(11),
|
WIPHY_FLAG_SUPPORTS_EXT_KCK_32 = BIT(11),
|
||||||
WIPHY_FLAG_SUPPORTS_NSTR_NONPRIMARY = BIT(12),
|
WIPHY_FLAG_SUPPORTS_NSTR_NONPRIMARY = BIT(12),
|
||||||
|
@ -2199,15 +2199,14 @@ static int ieee80211_change_station(struct wiphy *wiphy,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (sta->sdata->vif.type == NL80211_IFTYPE_AP_VLAN &&
|
if (sta->sdata->vif.type == NL80211_IFTYPE_AP_VLAN &&
|
||||||
sta->sdata->u.vlan.sta) {
|
sta->sdata->u.vlan.sta)
|
||||||
ieee80211_clear_fast_rx(sta);
|
|
||||||
RCU_INIT_POINTER(sta->sdata->u.vlan.sta, NULL);
|
RCU_INIT_POINTER(sta->sdata->u.vlan.sta, NULL);
|
||||||
}
|
|
||||||
|
|
||||||
if (test_sta_flag(sta, WLAN_STA_AUTHORIZED))
|
if (test_sta_flag(sta, WLAN_STA_AUTHORIZED))
|
||||||
ieee80211_vif_dec_num_mcast(sta->sdata);
|
ieee80211_vif_dec_num_mcast(sta->sdata);
|
||||||
|
|
||||||
sta->sdata = vlansdata;
|
sta->sdata = vlansdata;
|
||||||
|
ieee80211_check_fast_rx(sta);
|
||||||
ieee80211_check_fast_xmit(sta);
|
ieee80211_check_fast_xmit(sta);
|
||||||
|
|
||||||
if (test_sta_flag(sta, WLAN_STA_AUTHORIZED)) {
|
if (test_sta_flag(sta, WLAN_STA_AUTHORIZED)) {
|
||||||
|
@ -158,7 +158,7 @@ do { \
|
|||||||
_sdata_dbg(print, sdata, "[link %d] " fmt, \
|
_sdata_dbg(print, sdata, "[link %d] " fmt, \
|
||||||
link_id, ##__VA_ARGS__); \
|
link_id, ##__VA_ARGS__); \
|
||||||
else \
|
else \
|
||||||
_sdata_dbg(1, sdata, fmt, ##__VA_ARGS__); \
|
_sdata_dbg(print, sdata, fmt, ##__VA_ARGS__); \
|
||||||
} while (0)
|
} while (0)
|
||||||
#define link_dbg(link, fmt, ...) \
|
#define link_dbg(link, fmt, ...) \
|
||||||
_link_id_dbg(1, (link)->sdata, (link)->link_id, \
|
_link_id_dbg(1, (link)->sdata, (link)->link_id, \
|
||||||
|
@ -131,7 +131,7 @@ struct ieee80211_bss {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* enum ieee80211_corrupt_data_flags - BSS data corruption flags
|
* enum ieee80211_bss_corrupt_data_flags - BSS data corruption flags
|
||||||
* @IEEE80211_BSS_CORRUPT_BEACON: last beacon frame received was corrupted
|
* @IEEE80211_BSS_CORRUPT_BEACON: last beacon frame received was corrupted
|
||||||
* @IEEE80211_BSS_CORRUPT_PROBE_RESP: last probe response received was corrupted
|
* @IEEE80211_BSS_CORRUPT_PROBE_RESP: last probe response received was corrupted
|
||||||
*
|
*
|
||||||
@ -144,7 +144,7 @@ enum ieee80211_bss_corrupt_data_flags {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* enum ieee80211_valid_data_flags - BSS valid data flags
|
* enum ieee80211_bss_valid_data_flags - BSS valid data flags
|
||||||
* @IEEE80211_BSS_VALID_WMM: WMM/UAPSD data was gathered from non-corrupt IE
|
* @IEEE80211_BSS_VALID_WMM: WMM/UAPSD data was gathered from non-corrupt IE
|
||||||
* @IEEE80211_BSS_VALID_RATES: Supported rates were gathered from non-corrupt IE
|
* @IEEE80211_BSS_VALID_RATES: Supported rates were gathered from non-corrupt IE
|
||||||
* @IEEE80211_BSS_VALID_ERP: ERP flag was gathered from non-corrupt IE
|
* @IEEE80211_BSS_VALID_ERP: ERP flag was gathered from non-corrupt IE
|
||||||
|
@ -5874,6 +5874,15 @@ static int ieee80211_ttlm_set_links(struct ieee80211_sub_if_data *sdata,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (sdata->vif.active_links != active_links) {
|
if (sdata->vif.active_links != active_links) {
|
||||||
|
/* usable links are affected when active_links are changed,
|
||||||
|
* so notify the driver about the status change
|
||||||
|
*/
|
||||||
|
changed |= BSS_CHANGED_MLD_VALID_LINKS;
|
||||||
|
active_links &= sdata->vif.active_links;
|
||||||
|
if (!active_links)
|
||||||
|
active_links =
|
||||||
|
BIT(__ffs(sdata->vif.valid_links &
|
||||||
|
~dormant_links));
|
||||||
ret = ieee80211_set_active_links(&sdata->vif, active_links);
|
ret = ieee80211_set_active_links(&sdata->vif, active_links);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
sdata_info(sdata, "Failed to set TTLM active links\n");
|
sdata_info(sdata, "Failed to set TTLM active links\n");
|
||||||
@ -5888,7 +5897,6 @@ static int ieee80211_ttlm_set_links(struct ieee80211_sub_if_data *sdata,
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
changed |= BSS_CHANGED_MLD_VALID_LINKS;
|
|
||||||
sdata->vif.suspended_links = suspended_links;
|
sdata->vif.suspended_links = suspended_links;
|
||||||
if (sdata->vif.suspended_links)
|
if (sdata->vif.suspended_links)
|
||||||
changed |= BSS_CHANGED_MLD_TTLM;
|
changed |= BSS_CHANGED_MLD_TTLM;
|
||||||
@ -7652,7 +7660,7 @@ static int ieee80211_prep_connection(struct ieee80211_sub_if_data *sdata,
|
|||||||
sdata_info(sdata,
|
sdata_info(sdata,
|
||||||
"failed to insert STA entry for the AP (error %d)\n",
|
"failed to insert STA entry for the AP (error %d)\n",
|
||||||
err);
|
err);
|
||||||
goto out_err;
|
goto out_release_chan;
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
WARN_ON_ONCE(!ether_addr_equal(link->u.mgd.bssid, cbss->bssid));
|
WARN_ON_ONCE(!ether_addr_equal(link->u.mgd.bssid, cbss->bssid));
|
||||||
@ -7663,8 +7671,9 @@ static int ieee80211_prep_connection(struct ieee80211_sub_if_data *sdata,
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
out_release_chan:
|
||||||
|
ieee80211_link_release_channel(link);
|
||||||
out_err:
|
out_err:
|
||||||
ieee80211_link_release_channel(&sdata->deflink);
|
|
||||||
ieee80211_vif_set_links(sdata, 0, 0);
|
ieee80211_vif_set_links(sdata, 0, 0);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
@ -1024,7 +1024,7 @@ TRACE_EVENT(rdev_get_mpp,
|
|||||||
TRACE_EVENT(rdev_dump_mpp,
|
TRACE_EVENT(rdev_dump_mpp,
|
||||||
TP_PROTO(struct wiphy *wiphy, struct net_device *netdev, int _idx,
|
TP_PROTO(struct wiphy *wiphy, struct net_device *netdev, int _idx,
|
||||||
u8 *dst, u8 *mpp),
|
u8 *dst, u8 *mpp),
|
||||||
TP_ARGS(wiphy, netdev, _idx, mpp, dst),
|
TP_ARGS(wiphy, netdev, _idx, dst, mpp),
|
||||||
TP_STRUCT__entry(
|
TP_STRUCT__entry(
|
||||||
WIPHY_ENTRY
|
WIPHY_ENTRY
|
||||||
NETDEV_ENTRY
|
NETDEV_ENTRY
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
* Authors : Jean Tourrilhes - HPL - <jt@hpl.hp.com>
|
* Authors : Jean Tourrilhes - HPL - <jt@hpl.hp.com>
|
||||||
* Copyright (c) 1997-2007 Jean Tourrilhes, All Rights Reserved.
|
* Copyright (c) 1997-2007 Jean Tourrilhes, All Rights Reserved.
|
||||||
* Copyright 2009 Johannes Berg <johannes@sipsolutions.net>
|
* Copyright 2009 Johannes Berg <johannes@sipsolutions.net>
|
||||||
|
* Copyright (C) 2024 Intel Corporation
|
||||||
*
|
*
|
||||||
* (As all part of the Linux kernel, this file is GPL)
|
* (As all part of the Linux kernel, this file is GPL)
|
||||||
*/
|
*/
|
||||||
@ -662,7 +663,8 @@ struct iw_statistics *get_wireless_stats(struct net_device *dev)
|
|||||||
dev->ieee80211_ptr->wiphy->wext &&
|
dev->ieee80211_ptr->wiphy->wext &&
|
||||||
dev->ieee80211_ptr->wiphy->wext->get_wireless_stats) {
|
dev->ieee80211_ptr->wiphy->wext->get_wireless_stats) {
|
||||||
wireless_warn_cfg80211_wext();
|
wireless_warn_cfg80211_wext();
|
||||||
if (dev->ieee80211_ptr->wiphy->flags & WIPHY_FLAG_SUPPORTS_MLO)
|
if (dev->ieee80211_ptr->wiphy->flags & (WIPHY_FLAG_SUPPORTS_MLO |
|
||||||
|
WIPHY_FLAG_DISABLE_WEXT))
|
||||||
return NULL;
|
return NULL;
|
||||||
return dev->ieee80211_ptr->wiphy->wext->get_wireless_stats(dev);
|
return dev->ieee80211_ptr->wiphy->wext->get_wireless_stats(dev);
|
||||||
}
|
}
|
||||||
@ -704,7 +706,8 @@ static iw_handler get_handler(struct net_device *dev, unsigned int cmd)
|
|||||||
#ifdef CONFIG_CFG80211_WEXT
|
#ifdef CONFIG_CFG80211_WEXT
|
||||||
if (dev->ieee80211_ptr && dev->ieee80211_ptr->wiphy) {
|
if (dev->ieee80211_ptr && dev->ieee80211_ptr->wiphy) {
|
||||||
wireless_warn_cfg80211_wext();
|
wireless_warn_cfg80211_wext();
|
||||||
if (dev->ieee80211_ptr->wiphy->flags & WIPHY_FLAG_SUPPORTS_MLO)
|
if (dev->ieee80211_ptr->wiphy->flags & (WIPHY_FLAG_SUPPORTS_MLO |
|
||||||
|
WIPHY_FLAG_DISABLE_WEXT))
|
||||||
return NULL;
|
return NULL;
|
||||||
handlers = dev->ieee80211_ptr->wiphy->wext;
|
handlers = dev->ieee80211_ptr->wiphy->wext;
|
||||||
}
|
}
|
||||||
|
@ -28,6 +28,8 @@ CONFIG_MCTP_FLOWS=y
|
|||||||
CONFIG_INET=y
|
CONFIG_INET=y
|
||||||
CONFIG_MPTCP=y
|
CONFIG_MPTCP=y
|
||||||
|
|
||||||
|
CONFIG_NETDEVICES=y
|
||||||
|
CONFIG_WLAN=y
|
||||||
CONFIG_CFG80211=y
|
CONFIG_CFG80211=y
|
||||||
CONFIG_MAC80211=y
|
CONFIG_MAC80211=y
|
||||||
CONFIG_WLAN_VENDOR_INTEL=y
|
CONFIG_WLAN_VENDOR_INTEL=y
|
||||||
|
Loading…
x
Reference in New Issue
Block a user