PKG_NAME:=mac80211
-PKG_VERSION:=6.1.110-1
+PKG_VERSION:=6.1.145-1
PKG_RELEASE:=1
PKG_LICENSE:=GPL-2.0-only
PKG_LICENSE_FILES:=COPYING
-PKG_SOURCE_URL:=@KERNEL/linux/kernel/projects/backports/stable/v6.1.110/
-PKG_HASH:=2415bc529ca25be0aa597f9638d8b6fc4138080bbaea96881a38101896df6703
+PKG_SOURCE_URL:=@KERNEL/linux/kernel/projects/backports/stable/v6.1.145/
+PKG_HASH:=05f2c39f1be0aab49014a6e27a9492ce7ed0491f552db8a07f3ba0de33b9317d
PKG_SOURCE:=backports-$(PKG_VERSION).tar.xz
PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/backports-$(PKG_VERSION)
--- a/net/wireless/reg.c
+++ b/net/wireless/reg.c
-@@ -3373,6 +3373,8 @@ void regulatory_hint_country_ie(struct w
+@@ -3374,6 +3374,8 @@ void regulatory_hint_country_ie(struct w
enum environment_cap env = ENVIRON_ANY;
struct regulatory_request *request = NULL, *lr;
/* IE len must be evenly divisible by 2 */
if (country_ie_len & 0x01)
return;
-@@ -3624,6 +3626,7 @@ static bool is_wiphy_all_set_reg_flag(en
+@@ -3625,6 +3627,7 @@ static bool is_wiphy_all_set_reg_flag(en
void regulatory_hint_disconnect(void)
{
#include "../ath.h"
#include "ath5k.h"
#include "debug.h"
-@@ -71,7 +72,7 @@ static void ath5k_pci_read_cachesize(str
+@@ -73,7 +74,7 @@ static void ath5k_pci_read_cachesize(str
}
/*
*/
static bool
ath5k_pci_eeprom_read(struct ath_common *common, u32 offset, u16 *data)
-@@ -79,6 +80,19 @@ ath5k_pci_eeprom_read(struct ath_common
+@@ -81,6 +82,19 @@ ath5k_pci_eeprom_read(struct ath_common
struct ath5k_hw *ah = (struct ath5k_hw *) common->ah;
u32 status, timeout;
/*
* Initialize EEPROM access
*/
-@@ -122,6 +136,16 @@ static int ath5k_pci_eeprom_read_mac(str
+@@ -124,6 +138,16 @@ static int ath5k_pci_eeprom_read_mac(str
u16 data;
int octet;
{
--- a/drivers/net/wireless/ath/ath10k/wmi-tlv.c
+++ b/drivers/net/wireless/ath/ath10k/wmi-tlv.c
-@@ -4598,6 +4598,8 @@ static const struct wmi_ops wmi_tlv_ops
+@@ -4603,6 +4603,8 @@ static const struct wmi_ops wmi_tlv_ops
.gen_echo = ath10k_wmi_tlv_op_gen_echo,
.gen_vdev_spectral_conf = ath10k_wmi_tlv_op_gen_vdev_spectral_conf,
.gen_vdev_spectral_enable = ath10k_wmi_tlv_op_gen_vdev_spectral_enable,
static const struct wmi_peer_flags_map wmi_tlv_peer_flags_map = {
--- a/drivers/net/wireless/ath/ath10k/wmi.c
+++ b/drivers/net/wireless/ath/ath10k/wmi.c
-@@ -7492,6 +7492,49 @@ ath10k_wmi_op_gen_peer_set_param(struct
+@@ -7493,6 +7493,49 @@ ath10k_wmi_op_gen_peer_set_param(struct
return skb;
}
static struct sk_buff *
ath10k_wmi_op_gen_set_psmode(struct ath10k *ar, u32 vdev_id,
enum wmi_sta_ps_mode psmode)
-@@ -9180,6 +9223,9 @@ static const struct wmi_ops wmi_ops = {
+@@ -9181,6 +9224,9 @@ static const struct wmi_ops wmi_ops = {
.fw_stats_fill = ath10k_wmi_main_op_fw_stats_fill,
.get_vdev_subtype = ath10k_wmi_op_get_vdev_subtype,
.gen_echo = ath10k_wmi_op_gen_echo,
/* .gen_bcn_tmpl not implemented */
/* .gen_prb_tmpl not implemented */
/* .gen_p2p_go_bcn_ie not implemented */
-@@ -9250,6 +9296,8 @@ static const struct wmi_ops wmi_10_1_ops
+@@ -9251,6 +9297,8 @@ static const struct wmi_ops wmi_10_1_ops
.fw_stats_fill = ath10k_wmi_10x_op_fw_stats_fill,
.get_vdev_subtype = ath10k_wmi_op_get_vdev_subtype,
.gen_echo = ath10k_wmi_op_gen_echo,
/* .gen_bcn_tmpl not implemented */
/* .gen_prb_tmpl not implemented */
/* .gen_p2p_go_bcn_ie not implemented */
-@@ -9322,6 +9370,8 @@ static const struct wmi_ops wmi_10_2_ops
+@@ -9323,6 +9371,8 @@ static const struct wmi_ops wmi_10_2_ops
.gen_delba_send = ath10k_wmi_op_gen_delba_send,
.fw_stats_fill = ath10k_wmi_10x_op_fw_stats_fill,
.get_vdev_subtype = ath10k_wmi_op_get_vdev_subtype,
/* .gen_pdev_enable_adaptive_cca not implemented */
};
-@@ -9393,6 +9443,8 @@ static const struct wmi_ops wmi_10_2_4_o
+@@ -9394,6 +9444,8 @@ static const struct wmi_ops wmi_10_2_4_o
ath10k_wmi_op_gen_pdev_enable_adaptive_cca,
.get_vdev_subtype = ath10k_wmi_10_2_4_op_get_vdev_subtype,
.gen_bb_timing = ath10k_wmi_10_2_4_op_gen_bb_timing,
/* .gen_bcn_tmpl not implemented */
/* .gen_prb_tmpl not implemented */
/* .gen_p2p_go_bcn_ie not implemented */
-@@ -9474,6 +9526,8 @@ static const struct wmi_ops wmi_10_4_ops
+@@ -9475,6 +9527,8 @@ static const struct wmi_ops wmi_10_4_ops
.gen_pdev_bss_chan_info_req = ath10k_wmi_10_2_op_gen_pdev_bss_chan_info,
.gen_echo = ath10k_wmi_op_gen_echo,
.gen_pdev_get_tpc_config = ath10k_wmi_10_2_4_op_gen_pdev_get_tpc_config,
--- a/drivers/net/wireless/ath/ath11k/core.c
+++ b/drivers/net/wireless/ath/ath11k/core.c
-@@ -1668,7 +1668,7 @@ static void ath11k_update_11d(struct wor
+@@ -1675,7 +1675,7 @@ static void ath11k_update_11d(struct wor
}
}
{
struct ath11k *ar;
struct ath11k_pdev *pdev;
-@@ -1757,9 +1757,6 @@ static void ath11k_core_restart(struct w
+@@ -1764,9 +1764,6 @@ static void ath11k_core_restart(struct w
struct ath11k_base *ab = container_of(work, struct ath11k_base, restart_work);
int ret;
ath11k_err(ab, "failed to reconfigure driver on crash recovery\n");
--- a/drivers/net/wireless/ath/ath11k/core.h
+++ b/drivers/net/wireless/ath/ath11k/core.h
-@@ -1158,6 +1158,7 @@ int ath11k_core_check_smbios(struct ath1
+@@ -1160,6 +1160,7 @@ int ath11k_core_check_smbios(struct ath1
void ath11k_core_halt(struct ath11k *ar);
int ath11k_core_resume(struct ath11k_base *ab);
int ath11k_core_suspend(struct ath11k_base *ab);
const char *filename);
--- a/drivers/net/wireless/ath/ath11k/qmi.c
+++ b/drivers/net/wireless/ath/ath11k/qmi.c
-@@ -3169,6 +3169,9 @@ static void ath11k_qmi_driver_event_work
+@@ -3178,6 +3178,9 @@ static void ath11k_qmi_driver_event_work
case ATH11K_QMI_EVENT_SERVER_EXIT:
set_bit(ATH11K_FLAG_CRASH_FLUSH, &ab->dev_flags);
set_bit(ATH11K_FLAG_RECOVERY, &ab->dev_flags);
exit:
kfree(arg.chan_list);
-@@ -9072,6 +9094,9 @@ static int __ath11k_mac_register(struct
+@@ -9074,6 +9096,9 @@ static int __ath11k_mac_register(struct
NL80211_EXT_FEATURE_UNSOL_BCAST_PROBE_RESP);
}
--- a/drivers/net/wireless/ath/ath11k/core.c
+++ b/drivers/net/wireless/ath/ath11k/core.c
-@@ -1704,6 +1704,10 @@ void ath11k_core_pre_reconfigure_recover
+@@ -1711,6 +1711,10 @@ void ath11k_core_pre_reconfigure_recover
ath11k_mac_tx_mgmt_pending_free, ar);
idr_destroy(&ar->txmgmt_idr);
wake_up(&ar->txmgmt_empty_waitq);
.rx_mac_buf_ring = false,
--- a/drivers/net/wireless/ath/ath11k/core.h
+++ b/drivers/net/wireless/ath/ath11k/core.h
-@@ -1145,6 +1145,9 @@ extern const struct service_to_pipe ath1
+@@ -1147,6 +1147,9 @@ extern const struct service_to_pipe ath1
extern const struct ce_pipe_config ath11k_target_ce_config_wlan_qca6390[];
extern const struct service_to_pipe ath11k_target_service_to_ce_map_wlan_qca6390[];
.rx_mac_buf_ring = false,
--- a/drivers/net/wireless/ath/ath11k/core.h
+++ b/drivers/net/wireless/ath/ath11k/core.h
-@@ -851,6 +851,7 @@ struct ath11k_base {
+@@ -853,6 +853,7 @@ struct ath11k_base {
struct ath11k_dp dp;
void __iomem *mem;
if (changed & BSS_CHANGED_FILS_DISCOVERY ||
changed & BSS_CHANGED_UNSOL_BCAST_PROBE_RESP)
ath11k_mac_fils_discovery(arvif, info);
-@@ -9125,6 +9139,10 @@ static int __ath11k_mac_register(struct
+@@ -9127,6 +9141,10 @@ static int __ath11k_mac_register(struct
wiphy_ext_feature_set(ar->hw->wiphy,
NL80211_EXT_FEATURE_SET_SCAN_DWELL);
static int ath11k_hw_mac_id_to_pdev_id_ipq8074(struct ath11k_hw_params *hw,
--- a/drivers/net/wireless/ath/ath11k/mac.c
+++ b/drivers/net/wireless/ath/ath11k/mac.c
-@@ -9186,6 +9186,11 @@ static int __ath11k_mac_register(struct
+@@ -9188,6 +9188,11 @@ static int __ath11k_mac_register(struct
goto err_free_if_combs;
}
return 0;
}
-@@ -3037,39 +3014,51 @@ static int ath11k_dp_rx_reap_mon_status_
+@@ -3044,39 +3021,51 @@ static int ath11k_dp_rx_reap_mon_status_
spin_lock_bh(&rx_ring->idr_lock);
skb = idr_find(&rx_ring->bufs_idr, buf_id);
(vif->type == NL80211_IFTYPE_AP ||
vif->type == NL80211_IFTYPE_MESH_POINT)) {
arvif->ftm_responder = info->ftm_responder;
-@@ -9246,7 +9246,7 @@ static int __ath11k_mac_register(struct
+@@ -9248,7 +9248,7 @@ static int __ath11k_mac_register(struct
wiphy_ext_feature_set(ar->hw->wiphy,
NL80211_EXT_FEATURE_SET_SCAN_DWELL);
--- a/drivers/net/wireless/ath/ath11k/hal_rx.c
+++ b/drivers/net/wireless/ath/ath11k/hal_rx.c
-@@ -865,6 +865,12 @@ ath11k_hal_rx_populate_mu_user_info(void
+@@ -866,6 +866,12 @@ ath11k_hal_rx_populate_mu_user_info(void
ath11k_hal_rx_populate_byte_count(rx_tlv, ppdu_info, rx_user_status);
}
static enum hal_rx_mon_status
ath11k_hal_rx_parse_mon_status_tlv(struct ath11k_base *ab,
struct hal_rx_mon_ppdu_info *ppdu_info,
-@@ -1459,9 +1465,11 @@ ath11k_hal_rx_parse_mon_status_tlv(struc
+@@ -1460,9 +1466,11 @@ ath11k_hal_rx_parse_mon_status_tlv(struc
break;
}
case HAL_RX_MPDU_START: {
--- a/drivers/net/wireless/ath/ath11k/dp_rx.c
+++ b/drivers/net/wireless/ath/ath11k/dp_rx.c
-@@ -3114,8 +3114,11 @@ int ath11k_peer_rx_frag_setup(struct ath
+@@ -3121,8 +3121,11 @@ int ath11k_peer_rx_frag_setup(struct ath
int i;
tfm = crypto_alloc_shash("michael_mic", 0, 0);
--- a/drivers/net/wireless/ath/ath11k/dp_rx.c
+++ b/drivers/net/wireless/ath/ath11k/dp_rx.c
-@@ -3606,7 +3606,7 @@ static int ath11k_dp_rx_frag_h_mpdu(stru
+@@ -3613,7 +3613,7 @@ static int ath11k_dp_rx_frag_h_mpdu(stru
goto out_unlock;
}
--- a/drivers/net/wireless/ath/ath11k/hal_rx.c
+++ b/drivers/net/wireless/ath/ath11k/hal_rx.c
-@@ -1029,7 +1029,7 @@ ath11k_hal_rx_parse_mon_status_tlv(struc
+@@ -1030,7 +1030,7 @@ ath11k_hal_rx_parse_mon_status_tlv(struc
info1 = __le32_to_cpu(vht_sig->info1);
ppdu_info->ldpc = FIELD_GET(HAL_RX_VHT_SIG_A_INFO_INFO1_SU_MU_CODING,
ppdu_info->mcs = FIELD_GET(HAL_RX_VHT_SIG_A_INFO_INFO1_MCS,
info1);
gi_setting = FIELD_GET(HAL_RX_VHT_SIG_A_INFO_INFO1_GI_SETTING,
-@@ -1452,7 +1452,7 @@ ath11k_hal_rx_parse_mon_status_tlv(struc
+@@ -1453,7 +1453,7 @@ ath11k_hal_rx_parse_mon_status_tlv(struc
* PHYRX_OTHER_RECEIVE_INFO TLV.
*/
ppdu_info->rssi_comb =
#define ATH11K_QUEUE_LEN 4096
--- a/drivers/net/wireless/ath/ath11k/mac.c
+++ b/drivers/net/wireless/ath/ath11k/mac.c
-@@ -9013,19 +9013,23 @@ static int ath11k_mac_setup_iface_combin
+@@ -9015,19 +9015,23 @@ static int ath11k_mac_setup_iface_combin
static const u8 ath11k_if_types_ext_capa[] = {
[0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING,
};
static const struct wiphy_iftype_ext_capab ath11k_iftypes_ext_capa[] = {
-@@ -9263,6 +9267,9 @@ static int __ath11k_mac_register(struct
+@@ -9265,6 +9269,9 @@ static int __ath11k_mac_register(struct
wiphy_ext_feature_set(ar->hw->wiphy,
NL80211_EXT_FEATURE_ENABLE_FTM_RESPONDER);
+++ /dev/null
-From 86f85575a3f6a20cef1c8bb98e78585fe3a53ccc Mon Sep 17 00:00:00 2001
-From: Govindaraj Saminathan <quic_gsaminat@quicinc.com>
-Date: Fri, 26 May 2023 12:41:06 +0300
-Subject: [PATCH 82/84] wifi: ath11k: remove unused function
- ath11k_tm_event_wmi()
-
-The function ath11k_tm_event_wmi() is only defined and it is not used
-anywhere. Hence remove the unused.
-
-Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1
-
-Signed-off-by: Govindaraj Saminathan <quic_gsaminat@quicinc.com>
-Signed-off-by: Raj Kumar Bhagat <quic_rajkbhag@quicinc.com>
-Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
-Link: https://lore.kernel.org/r/20230517135934.16408-2-quic_rajkbhag@quicinc.com
----
- drivers/net/wireless/ath/ath11k/testmode.c | 64 +---------------------
- drivers/net/wireless/ath/ath11k/testmode.h | 8 +--
- 2 files changed, 2 insertions(+), 70 deletions(-)
-
---- a/drivers/net/wireless/ath/ath11k/testmode.c
-+++ b/drivers/net/wireless/ath/ath11k/testmode.c
-@@ -1,6 +1,7 @@
- // SPDX-License-Identifier: BSD-3-Clause-Clear
- /*
- * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
-+ * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
- */
-
- #include "testmode.h"
-@@ -20,69 +21,6 @@ static const struct nla_policy ath11k_tm
- [ATH11K_TM_ATTR_VERSION_MINOR] = { .type = NLA_U32 },
- };
-
--/* Returns true if callee consumes the skb and the skb should be discarded.
-- * Returns false if skb is not used. Does not sleep.
-- */
--bool ath11k_tm_event_wmi(struct ath11k *ar, u32 cmd_id, struct sk_buff *skb)
--{
-- struct sk_buff *nl_skb;
-- bool consumed;
-- int ret;
--
-- ath11k_dbg(ar->ab, ATH11K_DBG_TESTMODE,
-- "testmode event wmi cmd_id %d skb %pK skb->len %d\n",
-- cmd_id, skb, skb->len);
--
-- ath11k_dbg_dump(ar->ab, ATH11K_DBG_TESTMODE, NULL, "", skb->data, skb->len);
--
-- spin_lock_bh(&ar->data_lock);
--
-- consumed = true;
--
-- nl_skb = cfg80211_testmode_alloc_event_skb(ar->hw->wiphy,
-- 2 * sizeof(u32) + skb->len,
-- GFP_ATOMIC);
-- if (!nl_skb) {
-- ath11k_warn(ar->ab,
-- "failed to allocate skb for testmode wmi event\n");
-- goto out;
-- }
--
-- ret = nla_put_u32(nl_skb, ATH11K_TM_ATTR_CMD, ATH11K_TM_CMD_WMI);
-- if (ret) {
-- ath11k_warn(ar->ab,
-- "failed to put testmode wmi event cmd attribute: %d\n",
-- ret);
-- kfree_skb(nl_skb);
-- goto out;
-- }
--
-- ret = nla_put_u32(nl_skb, ATH11K_TM_ATTR_WMI_CMDID, cmd_id);
-- if (ret) {
-- ath11k_warn(ar->ab,
-- "failed to put testmode wmi even cmd_id: %d\n",
-- ret);
-- kfree_skb(nl_skb);
-- goto out;
-- }
--
-- ret = nla_put(nl_skb, ATH11K_TM_ATTR_DATA, skb->len, skb->data);
-- if (ret) {
-- ath11k_warn(ar->ab,
-- "failed to copy skb to testmode wmi event: %d\n",
-- ret);
-- kfree_skb(nl_skb);
-- goto out;
-- }
--
-- cfg80211_testmode_event(nl_skb, GFP_ATOMIC);
--
--out:
-- spin_unlock_bh(&ar->data_lock);
--
-- return consumed;
--}
--
- static int ath11k_tm_cmd_get_version(struct ath11k *ar, struct nlattr *tb[])
- {
- struct sk_buff *skb;
---- a/drivers/net/wireless/ath/ath11k/testmode.h
-+++ b/drivers/net/wireless/ath/ath11k/testmode.h
-@@ -1,24 +1,18 @@
- /* SPDX-License-Identifier: BSD-3-Clause-Clear */
- /*
- * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
-+ * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
- */
-
- #include "core.h"
-
- #ifdef CPTCFG_NL80211_TESTMODE
-
--bool ath11k_tm_event_wmi(struct ath11k *ar, u32 cmd_id, struct sk_buff *skb);
- int ath11k_tm_cmd(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
- void *data, int len);
-
- #else
-
--static inline bool ath11k_tm_event_wmi(struct ath11k *ar, u32 cmd_id,
-- struct sk_buff *skb)
--{
-- return false;
--}
--
- static inline int ath11k_tm_cmd(struct ieee80211_hw *hw,
- struct ieee80211_vif *vif,
- void *data, int len)
static const struct ath11k_hw_params ath11k_hw_params[] = {
{
.hw_rev = ATH11K_HW_IPQ8074,
-@@ -1381,6 +1385,11 @@ static int ath11k_core_soc_create(struct
+@@ -1382,6 +1386,11 @@ static int ath11k_core_soc_create(struct
{
int ret;
ret = ath11k_qmi_init_service(ab);
if (ret) {
ath11k_err(ab, "failed to initialize qmi :%d\n", ret);
-@@ -1607,7 +1616,7 @@ int ath11k_core_qmi_firmware_ready(struc
- {
- int ret;
+@@ -1622,7 +1631,7 @@ int ath11k_core_qmi_firmware_ready(struc
+ return -EINVAL;
+ }
- ret = ath11k_core_start_firmware(ab, ATH11K_FIRMWARE_MODE_NORMAL);
+ ret = ath11k_core_start_firmware(ab, ab->fw_mode);
if (ret) {
ath11k_err(ab, "failed to start firmware: %d\n", ret);
return ret;
-@@ -1772,7 +1781,8 @@ void ath11k_core_pre_reconfigure_recover
+@@ -1779,7 +1788,8 @@ void ath11k_core_pre_reconfigure_recover
for (i = 0; i < ab->num_radios; i++) {
pdev = &ab->pdevs[i];
ar = pdev->ar;
continue;
ieee80211_stop_queues(ar->hw);
-@@ -1841,7 +1851,12 @@ static void ath11k_core_post_reconfigure
+@@ -1848,7 +1858,12 @@ static void ath11k_core_post_reconfigure
ath11k_warn(ab,
"device is wedged, will not restart radio %d\n", i);
break;
/* Add other states as required */
};
-@@ -709,6 +712,8 @@ struct ath11k {
+@@ -711,6 +714,8 @@ struct ath11k {
u32 last_ppdu_id;
u32 cached_ppdu_id;
int monitor_vdev_id;
#ifdef CPTCFG_ATH11K_DEBUGFS
struct ath11k_debug debug;
#endif
-@@ -838,6 +843,7 @@ struct ath11k_msi_config {
+@@ -840,6 +845,7 @@ struct ath11k_msi_config {
/* Master structure to hold the hw data which may be used in core module */
struct ath11k_base {
enum ath11k_hw_rev hw_rev;
struct platform_device *pdev;
struct device *dev;
struct ath11k_qmi qmi;
-@@ -978,6 +984,14 @@ struct ath11k_base {
+@@ -980,6 +986,14 @@ struct ath11k_base {
const struct ath11k_pci_ops *ops;
} pci;
*/
#include <linux/elf.h>
-@@ -2465,6 +2465,14 @@ static int ath11k_qmi_load_bdf_qmi(struc
+@@ -2474,6 +2474,14 @@ static int ath11k_qmi_load_bdf_qmi(struc
fw_entry = ath11k_core_firmware_request(ab, ATH11K_DEFAULT_CAL_FILE);
if (IS_ERR(fw_entry)) {
.cbcal_restart_fw = true,
.fix_l1ss = true,
.supports_dynamic_smps_6ghz = false,
-@@ -749,6 +757,18 @@ void ath11k_fw_stats_free(struct ath11k_
+@@ -750,6 +758,18 @@ void ath11k_fw_stats_free(struct ath11k_
ath11k_fw_stats_bcn_free(&stats->bcn);
}
int ret;
--- a/drivers/net/wireless/ath/ath11k/core.h
+++ b/drivers/net/wireless/ath/ath11k/core.h
-@@ -1186,6 +1186,7 @@ void ath11k_core_halt(struct ath11k *ar)
+@@ -1188,6 +1188,7 @@ void ath11k_core_halt(struct ath11k *ar)
int ath11k_core_resume(struct ath11k_base *ab);
int ath11k_core_suspend(struct ath11k_base *ab);
void ath11k_core_pre_reconfigure_recovery(struct ath11k_base *ab);
u32 num_vdevs;
--- a/drivers/net/wireless/ath/ath11k/qmi.c
+++ b/drivers/net/wireless/ath/ath11k/qmi.c
-@@ -2082,7 +2082,7 @@ static int ath11k_qmi_assign_target_mem_
+@@ -2091,7 +2091,7 @@ static int ath11k_qmi_assign_target_mem_
return -EINVAL;
}
if (hremote_node) {
ab->qmi.target_mem[idx].paddr =
res.start + host_ddr_sz;
-@@ -3212,8 +3212,8 @@ static void ath11k_qmi_driver_event_work
+@@ -3221,8 +3221,8 @@ static void ath11k_qmi_driver_event_work
break;
}
#include <linux/of.h>
#include <linux/of_address.h>
#include <linux/ioport.h>
-@@ -2842,6 +2843,33 @@ int ath11k_qmi_firmware_start(struct ath
+@@ -2851,6 +2852,33 @@ int ath11k_qmi_firmware_start(struct ath
return 0;
}
--- a/drivers/net/wireless/ath/ath11k/qmi.c
+++ b/drivers/net/wireless/ath/ath11k/qmi.c
-@@ -2847,7 +2847,7 @@ int ath11k_qmi_fwreset_from_cold_boot(st
+@@ -2856,7 +2856,7 @@ int ath11k_qmi_fwreset_from_cold_boot(st
{
int timeout;
--- a/drivers/net/wireless/ath/ath11k/core.c
+++ b/drivers/net/wireless/ath/ath11k/core.c
-@@ -985,9 +985,15 @@ int ath11k_core_check_dt(struct ath11k_b
+@@ -986,9 +986,15 @@ int ath11k_core_check_dt(struct ath11k_b
return 0;
}
{
/* strlen(',variant=') + strlen(ab->qmi.target.bdf_ext) */
char variant[9 + ATH11K_QMI_BDF_EXT_STR_LENGTH] = { 0 };
-@@ -998,11 +1004,8 @@ static int __ath11k_core_create_board_na
+@@ -999,11 +1005,8 @@ static int __ath11k_core_create_board_na
switch (ab->id.bdf_search) {
case ATH11K_BDF_SEARCH_BUS_AND_BOARD:
scnprintf(name, name_len,
"bus=%s,vendor=%04x,device=%04x,subsystem-vendor=%04x,subsystem-device=%04x,qmi-chip-id=%d,qmi-board-id=%d%s",
ath11k_bus_str(ab->hif.bus),
-@@ -1012,6 +1015,19 @@ static int __ath11k_core_create_board_na
+@@ -1013,6 +1016,19 @@ static int __ath11k_core_create_board_na
ab->qmi.target.chip_id,
ab->qmi.target.board_id,
variant);
break;
default:
scnprintf(name, name_len,
-@@ -1030,19 +1046,29 @@ static int __ath11k_core_create_board_na
+@@ -1031,19 +1047,29 @@ static int __ath11k_core_create_board_na
static int ath11k_core_create_board_name(struct ath11k_base *ab, char *name,
size_t name_len)
{
}
const struct firmware *ath11k_core_firmware_request(struct ath11k_base *ab,
-@@ -1289,16 +1315,21 @@ int ath11k_core_fetch_board_data_api_1(s
+@@ -1290,16 +1316,21 @@ int ath11k_core_fetch_board_data_api_1(s
#define BOARD_NAME_SIZE 200
int ath11k_core_fetch_bdf(struct ath11k_base *ab, struct ath11k_board_data *bd)
{
}
ab->bd_api = 2;
-@@ -1307,13 +1338,19 @@ int ath11k_core_fetch_bdf(struct ath11k_
+@@ -1308,13 +1339,19 @@ int ath11k_core_fetch_bdf(struct ath11k_
ATH11K_BD_IE_BOARD_NAME,
ATH11K_BD_IE_BOARD_DATA);
if (!ret)
}
ret = ath11k_core_fetch_board_data_api_n(ab, bd, fallback_boardname,
-@@ -1321,7 +1358,28 @@ int ath11k_core_fetch_bdf(struct ath11k_
+@@ -1322,7 +1359,28 @@ int ath11k_core_fetch_bdf(struct ath11k_
ATH11K_BD_IE_BOARD_NAME,
ATH11K_BD_IE_BOARD_DATA);
if (!ret)
ab->bd_api = 1;
ret = ath11k_core_fetch_board_data_api_1(ab, bd, ATH11K_DEFAULT_BOARD_FILE);
-@@ -1334,14 +1392,22 @@ int ath11k_core_fetch_bdf(struct ath11k_
+@@ -1335,14 +1393,22 @@ int ath11k_core_fetch_bdf(struct ath11k_
ath11k_err(ab, "failed to fetch board data for %s from %s\n",
fallback_boardname, filepath);
{
.hw_rev = ATH11K_HW_IPQ8074,
.name = "ipq8074 hw2.0",
-@@ -2040,7 +2040,8 @@ static void ath11k_core_reset(struct wor
+@@ -2047,7 +2047,8 @@ static void ath11k_core_reset(struct wor
static int ath11k_init_hw_params(struct ath11k_base *ab)
{
const struct ath11k_hw_params *hw_params = NULL;
for (i = 0; i < ARRAY_SIZE(ath11k_hw_params); i++) {
hw_params = &ath11k_hw_params[i];
-@@ -2056,7 +2057,31 @@ static int ath11k_init_hw_params(struct
+@@ -2063,7 +2064,31 @@ static int ath11k_init_hw_params(struct
ab->hw_params = *hw_params;
+++ /dev/null
---- a/drivers/net/wireless/ath/ath5k/pci.c
-+++ b/drivers/net/wireless/ath/ath5k/pci.c
-@@ -47,6 +47,8 @@ static const struct pci_device_id ath5k_
- { PCI_VDEVICE(ATHEROS, 0x001b) }, /* 5413 Eagle */
- { PCI_VDEVICE(ATHEROS, 0x001c) }, /* PCI-E cards */
- { PCI_VDEVICE(ATHEROS, 0x001d) }, /* 2417 Nala */
-+ { PCI_VDEVICE(ATHEROS, 0xff16) }, /* 2413,2414 sx76x on lantiq_danube */
-+ { PCI_VDEVICE(ATHEROS, 0xff1a) }, /* 2417 arv45xx on lantiq_danube */
- { PCI_VDEVICE(ATHEROS, 0xff1b) }, /* AR5BXB63 */
- { 0 }
- };
--- a/drivers/net/wireless/ath/ath9k/init.c
+++ b/drivers/net/wireless/ath/ath9k/init.c
-@@ -882,6 +882,7 @@ static const struct ieee80211_iface_limi
+@@ -884,6 +884,7 @@ static const struct ieee80211_iface_limi
BIT(NL80211_IFTYPE_AP) },
{ .max = 1, .types = BIT(NL80211_IFTYPE_P2P_CLIENT) |
BIT(NL80211_IFTYPE_P2P_GO) },
--- a/drivers/net/wireless/ath/ath9k/init.c
+++ b/drivers/net/wireless/ath/ath9k/init.c
-@@ -963,6 +963,7 @@ static void ath9k_set_hw_capab(struct at
+@@ -965,6 +965,7 @@ static void ath9k_set_hw_capab(struct at
ieee80211_hw_set(hw, HOST_BROADCAST_PS_BUFFERING);
ieee80211_hw_set(hw, SUPPORT_FAST_XMIT);
ieee80211_hw_set(hw, SUPPORTS_CLONED_SKBS);
if (ath9k_ps_enable)
ieee80211_hw_set(hw, SUPPORTS_PS);
-@@ -975,9 +976,6 @@ static void ath9k_set_hw_capab(struct at
+@@ -977,9 +978,6 @@ static void ath9k_set_hw_capab(struct at
IEEE80211_RADIOTAP_MCS_HAVE_STBC;
}
int ath9k_init_debug(struct ath_hw *ah)
{
struct ath_common *common = ath9k_hw_common(ah);
-@@ -1432,6 +1480,8 @@ int ath9k_init_debug(struct ath_hw *ah)
+@@ -1430,6 +1478,8 @@ int ath9k_init_debug(struct ath_hw *ah)
ath9k_tx99_init_debug(sc);
ath9k_cmn_spectral_init_debug(&sc->spec_priv, sc->debug.debugfs_phy);
--- a/drivers/net/wireless/ath/ath9k/init.c
+++ b/drivers/net/wireless/ath/ath9k/init.c
-@@ -1178,25 +1178,25 @@ static int __init ath9k_init(void)
+@@ -1180,25 +1180,25 @@ static int __init ath9k_init(void)
{
int error;
int ath9k_init_debug(struct ath_hw *ah)
{
struct ath_common *common = ath9k_hw_common(ah);
-@@ -1482,6 +1528,8 @@ int ath9k_init_debug(struct ath_hw *ah)
+@@ -1480,6 +1526,8 @@ int ath9k_init_debug(struct ath_hw *ah)
debugfs_create_file("eeprom", S_IRUSR, sc->debug.debugfs_phy, sc,
&fops_eeprom);
--- a/drivers/net/wireless/ath/ath9k/init.c
+++ b/drivers/net/wireless/ath/ath9k/init.c
-@@ -1088,7 +1088,7 @@ int ath9k_init_device(u16 devid, struct
+@@ -1090,7 +1090,7 @@ int ath9k_init_device(u16 devid, struct
#ifdef CPTCFG_MAC80211_LEDS
/* must be initialized before ieee80211_register_hw */
int ath9k_init_debug(struct ath_hw *ah)
{
-@@ -1530,6 +1585,10 @@ int ath9k_init_debug(struct ath_hw *ah)
+@@ -1528,6 +1583,10 @@ int ath9k_init_debug(struct ath_hw *ah)
&fops_eeprom);
debugfs_create_file("chanbw", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy,
sc, &fops_chanbw);
int ath9k_init_debug(struct ath_hw *ah)
{
struct ath_common *common = ath9k_hw_common(ah);
-@@ -1589,6 +1633,8 @@ int ath9k_init_debug(struct ath_hw *ah)
+@@ -1587,6 +1631,8 @@ int ath9k_init_debug(struct ath_hw *ah)
debugfs_create_file("gpio_led", S_IWUSR,
sc->debug.debugfs_phy, sc, &fops_gpio_led);
#endif
ops->spectral_scan_config = ar9003_hw_spectral_scan_config;
--- a/drivers/net/wireless/ath/ath9k/init.c
+++ b/drivers/net/wireless/ath/ath9k/init.c
-@@ -870,7 +870,8 @@ static void ath9k_init_txpower_limits(st
+@@ -872,7 +872,8 @@ static void ath9k_init_txpower_limits(st
if (ah->caps.hw_caps & ATH9K_HW_CAP_5GHZ)
ath9k_init_band_txpower(sc, NL80211_BAND_5GHZ);
}
static const struct ieee80211_iface_limit if_limits[] = {
-@@ -1048,6 +1049,18 @@ static void ath9k_set_hw_capab(struct at
+@@ -1050,6 +1051,18 @@ static void ath9k_set_hw_capab(struct at
wiphy_ext_feature_set(hw->wiphy, NL80211_EXT_FEATURE_CAN_REPLACE_PTK0);
}
int ath9k_init_device(u16 devid, struct ath_softc *sc,
const struct ath_bus_ops *bus_ops)
{
-@@ -1095,6 +1108,8 @@ int ath9k_init_device(u16 devid, struct
+@@ -1097,6 +1110,8 @@ int ath9k_init_device(u16 devid, struct
wiphy_read_of_freq_limits(hw->wiphy);
--- a/drivers/net/wireless/ath/ath9k/init.c
+++ b/drivers/net/wireless/ath/ath9k/init.c
-@@ -696,6 +696,12 @@ static int ath9k_of_init(struct ath_soft
+@@ -698,6 +698,12 @@ static int ath9k_of_init(struct ath_soft
return 0;
}
static int ath9k_init_softc(u16 devid, struct ath_softc *sc,
const struct ath_bus_ops *bus_ops)
{
-@@ -803,6 +809,9 @@ static int ath9k_init_softc(u16 devid, s
+@@ -805,6 +811,9 @@ static int ath9k_init_softc(u16 devid, s
if (ret)
goto err_hw;
void brcmf_of_probe(struct device *dev, enum brcmf_bus_type bus_type,
struct brcmf_mp_device *settings)
{
-@@ -106,6 +136,8 @@ void brcmf_of_probe(struct device *dev,
- of_node_put(root);
+@@ -105,6 +135,8 @@ void brcmf_of_probe(struct device *dev,
}
+ of_node_put(root);
+ brcmf_of_probe_cc(dev, settings);
+
#include "of.h"
static int brcmf_of_get_country_codes(struct device *dev,
-@@ -168,3 +169,38 @@ void brcmf_of_probe(struct device *dev,
+@@ -167,3 +168,38 @@ void brcmf_of_probe(struct device *dev,
sdio->oob_irq_nr = irq;
sdio->oob_irq_flags = irqf;
}
depends on m
- select CFG80211_WEXT
depends on CRYPTO
+ depends on CRYPTO_LIB_AES
select BPAUTO_CRYPTO_LIB_ARC4
- help
+++ /dev/null
-From e0f83d268974dab0361d11904dfc9acec53f96a6 Mon Sep 17 00:00:00 2001
-From: Eric Dumazet <edumazet@google.com>
-Date: Fri, 11 Oct 2024 17:12:17 +0000
-Subject: [PATCH] genetlink: hold RCU in genlmsg_mcast()
-
-[ Upstream commit 56440d7ec28d60f8da3bfa09062b3368ff9b16db ]
-
-While running net selftests with CONFIG_PROVE_RCU_LIST=y I saw
-one lockdep splat [1].
-
-genlmsg_mcast() uses for_each_net_rcu(), and must therefore hold RCU.
-
-Instead of letting all callers guard genlmsg_multicast_allns()
-with a rcu_read_lock()/rcu_read_unlock() pair, do it in genlmsg_mcast().
-
-This also means the @flags parameter is useless, we need to always use
-GFP_ATOMIC.
-
-[1]
-[10882.424136] =============================
-[10882.424166] WARNING: suspicious RCU usage
-[10882.424309] 6.12.0-rc2-virtme #1156 Not tainted
-[10882.424400] -----------------------------
-[10882.424423] net/netlink/genetlink.c:1940 RCU-list traversed in non-reader section!!
-[10882.424469]
-other info that might help us debug this:
-
-[10882.424500]
-rcu_scheduler_active = 2, debug_locks = 1
-[10882.424744] 2 locks held by ip/15677:
-[10882.424791] #0: ffffffffb6b491b0 (cb_lock){++++}-{3:3}, at: genl_rcv (net/netlink/genetlink.c:1219)
-[10882.426334] #1: ffffffffb6b49248 (genl_mutex){+.+.}-{3:3}, at: genl_rcv_msg (net/netlink/genetlink.c:61 net/netlink/genetlink.c:57 net/netlink/genetlink.c:1209)
-[10882.426465]
-stack backtrace:
-[10882.426805] CPU: 14 UID: 0 PID: 15677 Comm: ip Not tainted 6.12.0-rc2-virtme #1156
-[10882.426919] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.16.3-debian-1.16.3-2 04/01/2014
-[10882.427046] Call Trace:
-[10882.427131] <TASK>
-[10882.427244] dump_stack_lvl (lib/dump_stack.c:123)
-[10882.427335] lockdep_rcu_suspicious (kernel/locking/lockdep.c:6822)
-[10882.427387] genlmsg_multicast_allns (net/netlink/genetlink.c:1940 (discriminator 7) net/netlink/genetlink.c:1977 (discriminator 7))
-[10882.427436] l2tp_tunnel_notify.constprop.0 (net/l2tp/l2tp_netlink.c:119) l2tp_netlink
-[10882.427683] l2tp_nl_cmd_tunnel_create (net/l2tp/l2tp_netlink.c:253) l2tp_netlink
-[10882.427748] genl_family_rcv_msg_doit (net/netlink/genetlink.c:1115)
-[10882.427834] genl_rcv_msg (net/netlink/genetlink.c:1195 net/netlink/genetlink.c:1210)
-[10882.427877] ? __pfx_l2tp_nl_cmd_tunnel_create (net/l2tp/l2tp_netlink.c:186) l2tp_netlink
-[10882.427927] ? __pfx_genl_rcv_msg (net/netlink/genetlink.c:1201)
-[10882.427959] netlink_rcv_skb (net/netlink/af_netlink.c:2551)
-[10882.428069] genl_rcv (net/netlink/genetlink.c:1220)
-[10882.428095] netlink_unicast (net/netlink/af_netlink.c:1332 net/netlink/af_netlink.c:1357)
-[10882.428140] netlink_sendmsg (net/netlink/af_netlink.c:1901)
-[10882.428210] ____sys_sendmsg (net/socket.c:729 (discriminator 1) net/socket.c:744 (discriminator 1) net/socket.c:2607 (discriminator 1))
-
-Fixes: 33f72e6f0c67 ("l2tp : multicast notification to the registered listeners")
-Signed-off-by: Eric Dumazet <edumazet@google.com>
-Cc: James Chapman <jchapman@katalix.com>
-Cc: Tom Parkin <tparkin@katalix.com>
-Cc: Johannes Berg <johannes.berg@intel.com>
-Link: https://patch.msgid.link/20241011171217.3166614-1-edumazet@google.com
-Signed-off-by: Jakub Kicinski <kuba@kernel.org>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/target/target_core_user.c | 2 +-
- include/net/genetlink.h | 3 +--
- net/l2tp/l2tp_netlink.c | 4 ++--
- net/netlink/genetlink.c | 28 ++++++++++++++--------------
- net/wireless/nl80211.c | 8 ++------
- 5 files changed, 20 insertions(+), 25 deletions(-)
-
---- a/backport-include/net/genetlink.h
-+++ b/backport-include/net/genetlink.h
-@@ -150,7 +150,7 @@ int genlmsg_multicast(const struct genl_
- #define genlmsg_multicast_allns LINUX_BACKPORT(genlmsg_multicast_allns)
- int backport_genlmsg_multicast_allns(const struct genl_family *family,
- struct sk_buff *skb, u32 portid,
-- unsigned int group, gfp_t flags);
-+ unsigned int group);
-
- #define genl_family_attrbuf LINUX_BACKPORT(genl_family_attrbuf)
- static inline struct nlattr **genl_family_attrbuf(struct genl_family *family)
---- a/compat/backport-genetlink.c
-+++ b/compat/backport-genetlink.c
-@@ -198,23 +198,23 @@ int genlmsg_multicast(const struct genl_
- }
- EXPORT_SYMBOL_GPL(genlmsg_multicast);
-
--static int genlmsg_mcast(struct sk_buff *skb, u32 portid, unsigned long group,
-- gfp_t flags)
-+static int genlmsg_mcast(struct sk_buff *skb, u32 portid, unsigned long group)
- {
- struct sk_buff *tmp;
- struct net *net, *prev = NULL;
- bool delivered = false;
- int err;
-
-+ rcu_read_lock();
- for_each_net_rcu(net) {
- if (prev) {
-- tmp = skb_clone(skb, flags);
-+ tmp = skb_clone(skb, GFP_ATOMIC);
- if (!tmp) {
- err = -ENOMEM;
- goto error;
- }
- err = nlmsg_multicast(prev->genl_sock, tmp,
-- portid, group, flags);
-+ portid, group, GFP_ATOMIC);
- if (!err)
- delivered = true;
- else if (err != -ESRCH)
-@@ -223,25 +223,29 @@ static int genlmsg_mcast(struct sk_buff
-
- prev = net;
- }
-+ err = nlmsg_multicast(prev->genl_sock, skb, portid, group, GFP_ATOMIC);
-+
-+ rcu_read_unlock();
-
-- err = nlmsg_multicast(prev->genl_sock, skb, portid, group, flags);
- if (!err)
- delivered = true;
- else if (err != -ESRCH)
- return err;
- return delivered ? 0 : -ESRCH;
- error:
-+ rcu_read_unlock();
-+
- kfree_skb(skb);
- return err;
- }
-
- int backport_genlmsg_multicast_allns(const struct genl_family *family,
- struct sk_buff *skb, u32 portid,
-- unsigned int group, gfp_t flags)
-+ unsigned int group)
- {
- group = __backport_genl_group(family, group);
- if (group == INVALID_GROUP)
- return -EINVAL;
-- return genlmsg_mcast(skb, portid, group, flags);
-+ return genlmsg_mcast(skb, portid, group);
- }
- EXPORT_SYMBOL_GPL(backport_genlmsg_multicast_allns);
---- a/net/wireless/nl80211.c
-+++ b/net/wireless/nl80211.c
-@@ -17627,10 +17627,8 @@ void nl80211_common_reg_change_event(enu
-
- genlmsg_end(msg, hdr);
-
-- rcu_read_lock();
- genlmsg_multicast_allns(&nl80211_fam, msg, 0,
-- NL80211_MCGRP_REGULATORY, GFP_ATOMIC);
-- rcu_read_unlock();
-+ NL80211_MCGRP_REGULATORY);
-
- return;
-
-@@ -18248,10 +18246,8 @@ void nl80211_send_beacon_hint_event(stru
-
- genlmsg_end(msg, hdr);
-
-- rcu_read_lock();
- genlmsg_multicast_allns(&nl80211_fam, msg, 0,
-- NL80211_MCGRP_REGULATORY, GFP_ATOMIC);
-- rcu_read_unlock();
-+ NL80211_MCGRP_REGULATORY);
-
- return;
-
--- a/backport-include/net/genetlink.h
+++ b/backport-include/net/genetlink.h
-@@ -172,4 +172,15 @@ static inline int genlmsg_parse(const st
- }
+@@ -192,4 +192,15 @@ int backport_genlmsg_multicast_allns(con
+ #define genlmsg_multicast_allns LINUX_BACKPORT(genlmsg_multicast_allns)
#endif /* LINUX_VERSION_IS_LESS(5,2,0) */
+#if LINUX_VERSION_IN_RANGE(5,15,0,5,15,169) || \
--- a/net/mac80211/cfg.c
+++ b/net/mac80211/cfg.c
-@@ -2734,6 +2734,8 @@ static int ieee80211_scan(struct wiphy *
+@@ -2735,6 +2735,8 @@ static int ieee80211_scan(struct wiphy *
*/
fallthrough;
case NL80211_IFTYPE_AP:
*
* Drivers can optionally delegate responsibility for scheduling queues to
* mac80211, to take advantage of airtime fairness accounting. In this case, to
-@@ -2257,8 +2258,8 @@ struct ieee80211_link_sta {
+@@ -2258,8 +2259,8 @@ struct ieee80211_link_sta {
* For non MLO STA it will point to the deflink data. For MLO STA
* ieee80211_sta_recalc_aggregates() must be called to update it.
* @support_p2p_ps: indicates whether the STA supports P2P PS mechanism or not.
* @deflink: This holds the default link STA information, for non MLO STA all link
* specific STA information is accessed through @deflink or through
* link[0] which points to address of @deflink. For MLO Link STA
-@@ -5700,7 +5701,7 @@ void ieee80211_key_replay(struct ieee802
+@@ -5714,7 +5715,7 @@ void ieee80211_key_replay(struct ieee802
* @hw: pointer as obtained from ieee80211_alloc_hw().
* @queue: queue number (counted from zero).
*
*/
void ieee80211_wake_queue(struct ieee80211_hw *hw, int queue);
-@@ -5709,7 +5710,7 @@ void ieee80211_wake_queue(struct ieee802
+@@ -5723,7 +5724,7 @@ void ieee80211_wake_queue(struct ieee802
* @hw: pointer as obtained from ieee80211_alloc_hw().
* @queue: queue number (counted from zero).
*
*/
void ieee80211_stop_queue(struct ieee80211_hw *hw, int queue);
-@@ -5718,7 +5719,7 @@ void ieee80211_stop_queue(struct ieee802
+@@ -5732,7 +5733,7 @@ void ieee80211_stop_queue(struct ieee802
* @hw: pointer as obtained from ieee80211_alloc_hw().
* @queue: queue number (counted from zero).
*
*
* Return: %true if the queue is stopped. %false otherwise.
*/
-@@ -5729,7 +5730,7 @@ int ieee80211_queue_stopped(struct ieee8
+@@ -5743,7 +5744,7 @@ int ieee80211_queue_stopped(struct ieee8
* ieee80211_stop_queues - stop all queues
* @hw: pointer as obtained from ieee80211_alloc_hw().
*
*/
void ieee80211_stop_queues(struct ieee80211_hw *hw);
-@@ -5737,7 +5738,7 @@ void ieee80211_stop_queues(struct ieee80
+@@ -5751,7 +5752,7 @@ void ieee80211_stop_queues(struct ieee80
* ieee80211_wake_queues - wake all queues
* @hw: pointer as obtained from ieee80211_alloc_hw().
*
*/
void ieee80211_wake_queues(struct ieee80211_hw *hw);
-@@ -6960,6 +6961,18 @@ static inline struct sk_buff *ieee80211_
+@@ -6974,6 +6975,18 @@ static inline struct sk_buff *ieee80211_
}
/**
.remove_interface = ar5523_remove_interface,
--- a/drivers/net/wireless/ath/ath11k/mac.c
+++ b/drivers/net/wireless/ath/ath11k/mac.c
-@@ -8599,6 +8599,7 @@ err_fallback:
+@@ -8601,6 +8601,7 @@ err_fallback:
static const struct ieee80211_ops ath11k_ops = {
.tx = ath11k_mac_op_tx,
.add_interface = p54_add_interface,
--- a/drivers/net/wireless/mac80211_hwsim.c
+++ b/drivers/net/wireless/mac80211_hwsim.c
-@@ -3109,6 +3109,7 @@ static int mac80211_hwsim_change_sta_lin
+@@ -3114,6 +3114,7 @@ static int mac80211_hwsim_change_sta_lin
#define HWSIM_COMMON_OPS \
.tx = mac80211_hwsim_tx, \
.add_interface = rtl8187_add_interface,
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
-@@ -6546,6 +6546,7 @@ static void rtl8xxxu_stop(struct ieee802
+@@ -6553,6 +6553,7 @@ static void rtl8xxxu_stop(struct ieee802
static const struct ieee80211_ops rtl8xxxu_ops = {
.tx = rtl8xxxu_tx,
.stop = rtw_ops_stop,
--- a/drivers/net/wireless/realtek/rtw89/mac80211.c
+++ b/drivers/net/wireless/realtek/rtw89/mac80211.c
-@@ -916,6 +916,7 @@ static int rtw89_ops_set_tid_config(stru
+@@ -918,6 +918,7 @@ static int rtw89_ops_set_tid_config(stru
const struct ieee80211_ops rtw89_ops = {
.tx = rtw89_ops_tx,
--- a/net/mac80211/cfg.c
+++ b/net/mac80211/cfg.c
-@@ -4359,9 +4359,6 @@ static int ieee80211_get_txq_stats(struc
+@@ -4361,9 +4361,6 @@ static int ieee80211_get_txq_stats(struc
struct ieee80211_sub_if_data *sdata;
int ret = 0;
NL80211_EXT_FEATURE_AQL))
--- a/net/mac80211/ieee80211_i.h
+++ b/net/mac80211/ieee80211_i.h
-@@ -2301,7 +2301,6 @@ void ieee80211_wake_queue_by_reason(stru
+@@ -2299,7 +2299,6 @@ void ieee80211_wake_queue_by_reason(stru
void ieee80211_stop_queue_by_reason(struct ieee80211_hw *hw, int queue,
enum queue_stop_reason reason,
bool refcounted);
void ieee80211_add_pending_skbs(struct ieee80211_local *local,
--- a/net/mac80211/iface.c
+++ b/net/mac80211/iface.c
-@@ -481,12 +481,6 @@ static void ieee80211_do_stop(struct iee
+@@ -482,12 +482,6 @@ static void ieee80211_do_stop(struct iee
if (cancel_scan)
ieee80211_scan_cancel(local);
ieee80211_roc_purge(local, sdata);
switch (sdata->vif.type) {
-@@ -834,25 +828,6 @@ static void ieee80211_uninit(struct net_
+@@ -852,25 +846,6 @@ static void ieee80211_uninit(struct net_
ieee80211_teardown_sdata(IEEE80211_DEV_TO_SUB_IF(dev));
}
static void
ieee80211_get_stats64(struct net_device *dev, struct rtnl_link_stats64 *stats)
{
-@@ -866,7 +841,6 @@ static const struct net_device_ops ieee8
+@@ -884,7 +859,6 @@ static const struct net_device_ops ieee8
.ndo_start_xmit = ieee80211_subif_start_xmit,
.ndo_set_rx_mode = ieee80211_set_multicast_list,
.ndo_set_mac_address = ieee80211_change_mac,
.ndo_get_stats64 = ieee80211_get_stats64,
};
-@@ -988,7 +962,6 @@ static const struct net_device_ops ieee8
+@@ -1006,7 +980,6 @@ static const struct net_device_ops ieee8
.ndo_start_xmit = ieee80211_subif_start_xmit_8023,
.ndo_set_rx_mode = ieee80211_set_multicast_list,
.ndo_set_mac_address = ieee80211_change_mac,
.ndo_get_stats64 = ieee80211_get_stats64,
#if LINUX_VERSION_IS_GEQ(5,13,0)
.ndo_fill_forward_path = ieee80211_netdev_fill_forward_path,
-@@ -1492,35 +1465,6 @@ int ieee80211_do_open(struct wireless_de
+@@ -1510,35 +1483,6 @@ int ieee80211_do_open(struct wireless_de
ieee80211_recalc_ps(local);
set_bit(SDATA_STATE_RUNNING, &sdata->state);
return 0;
-@@ -1550,17 +1494,12 @@ static void ieee80211_if_setup(struct ne
+@@ -1568,17 +1512,12 @@ static void ieee80211_if_setup(struct ne
{
ether_setup(dev);
dev->priv_flags &= ~IFF_TX_SKB_SHARING;
static void ieee80211_iface_process_skb(struct ieee80211_local *local,
struct ieee80211_sub_if_data *sdata,
struct sk_buff *skb)
-@@ -2145,9 +2084,7 @@ int ieee80211_if_add(struct ieee80211_lo
+@@ -2163,9 +2102,7 @@ int ieee80211_if_add(struct ieee80211_lo
struct net_device *ndev = NULL;
struct ieee80211_sub_if_data *sdata = NULL;
struct txq_info *txqi;
ASSERT_RTNL();
-@@ -2170,30 +2107,18 @@ int ieee80211_if_add(struct ieee80211_lo
+@@ -2188,30 +2125,18 @@ int ieee80211_if_add(struct ieee80211_lo
sizeof(void *));
int txq_size = 0;
ndev->tstats = netdev_alloc_pcpu_stats(struct pcpu_sw_netstats);
--- a/net/mac80211/main.c
+++ b/net/mac80211/main.c
-@@ -634,7 +634,7 @@ struct ieee80211_hw *ieee80211_alloc_hw_
+@@ -636,7 +636,7 @@ struct ieee80211_hw *ieee80211_alloc_hw_
if (WARN_ON(!ops->tx || !ops->start || !ops->stop || !ops->config ||
!ops->add_interface || !ops->remove_interface ||
return NULL;
if (WARN_ON(ops->sta_state && (ops->sta_add || ops->sta_remove)))
-@@ -723,9 +723,7 @@ struct ieee80211_hw *ieee80211_alloc_hw_
+@@ -725,9 +725,7 @@ struct ieee80211_hw *ieee80211_alloc_hw_
if (!ops->set_key)
wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_RRM);
wiphy->bss_priv_size = sizeof(struct ieee80211_bss);
-@@ -838,10 +836,7 @@ struct ieee80211_hw *ieee80211_alloc_hw_
+@@ -840,10 +838,7 @@ struct ieee80211_hw *ieee80211_alloc_hw_
atomic_set(&local->agg_queue_stop[i], 0);
}
tasklet_setup(&local->tx_pending_tasklet, ieee80211_tx_pending);
}
spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags);
-@@ -5970,10 +5951,9 @@ int ieee80211_tx_control_port(struct wip
+@@ -5972,10 +5953,9 @@ int ieee80211_tx_control_port(struct wip
}
if (!IS_ERR(sta)) {
.stop = rtw_ops_stop,
--- a/drivers/net/wireless/realtek/rtw89/mac80211.c
+++ b/drivers/net/wireless/realtek/rtw89/mac80211.c
-@@ -916,7 +916,6 @@ static int rtw89_ops_set_tid_config(stru
+@@ -918,7 +918,6 @@ static int rtw89_ops_set_tid_config(stru
const struct ieee80211_ops rtw89_ops = {
.tx = rtw89_ops_tx,
flow = fq_find_fattest_flow(fq);
--- a/include/net/mac80211.h
+++ b/include/net/mac80211.h
-@@ -1816,6 +1816,10 @@ struct ieee80211_vif_cfg {
+@@ -1817,6 +1817,10 @@ struct ieee80211_vif_cfg {
* @addr: address of this interface
* @p2p: indicates whether this AP or STA interface is a p2p
* interface, i.e. a GO or p2p-sta respectively
* @driver_flags: flags/capabilities the driver has for this interface,
* these need to be set (or cleared) when the interface is added
* or, if supported by the driver, the interface type is changed
-@@ -1855,6 +1859,7 @@ struct ieee80211_vif {
+@@ -1856,6 +1860,7 @@ struct ieee80211_vif {
struct ieee80211_txq *txq;
--- a/net/mac80211/iface.c
+++ b/net/mac80211/iface.c
-@@ -2218,6 +2218,7 @@ int ieee80211_if_add(struct ieee80211_lo
+@@ -2236,6 +2236,7 @@ int ieee80211_if_add(struct ieee80211_lo
ndev->priv_flags |= IFF_LIVE_ADDR_CHANGE;
ndev->hw_features |= ndev->features &
MAC80211_SUPPORTED_FEATURES_TX;
};
#ifdef CPTCFG_MAC80211_MESH
-@@ -2009,6 +2024,11 @@ int ieee80211_tx_control_port(struct wip
+@@ -2007,6 +2022,11 @@ int ieee80211_tx_control_port(struct wip
int link_id, u64 *cookie);
int ieee80211_probe_mesh_link(struct wiphy *wiphy, struct net_device *dev,
const u8 *buf, size_t len);
static inline
--- a/net/mac80211/mesh_hwmp.c
+++ b/net/mac80211/mesh_hwmp.c
-@@ -394,6 +394,7 @@ static u32 hwmp_route_info_get(struct ie
+@@ -400,6 +400,7 @@ static u32 hwmp_route_info_get(struct ie
u32 orig_sn, orig_metric;
unsigned long orig_lifetime, exp_time;
u32 last_hop_metric, new_metric;
bool process = true;
u8 hopcount;
-@@ -491,8 +492,10 @@ static u32 hwmp_route_info_get(struct ie
+@@ -497,8 +498,10 @@ static u32 hwmp_route_info_get(struct ie
}
if (fresh_info) {
mesh_path_assign_nexthop(mpath, sta);
mpath->flags |= MESH_PATH_SN_VALID;
mpath->metric = new_metric;
-@@ -502,6 +505,8 @@ static u32 hwmp_route_info_get(struct ie
+@@ -508,6 +511,8 @@ static u32 hwmp_route_info_get(struct ie
mpath->hop_count = hopcount;
mesh_path_activate(mpath);
spin_unlock_bh(&mpath->state_lock);
ewma_mesh_fail_avg_init(&sta->mesh->fail_avg);
/* init it at a low value - 0 start is tricky */
ewma_mesh_fail_avg_add(&sta->mesh->fail_avg, 1);
-@@ -539,8 +544,10 @@ static u32 hwmp_route_info_get(struct ie
+@@ -545,8 +550,10 @@ static u32 hwmp_route_info_get(struct ie
}
if (fresh_info) {
mesh_path_assign_nexthop(mpath, sta);
mpath->metric = last_hop_metric;
mpath->exp_time = time_after(mpath->exp_time, exp_time)
-@@ -548,6 +555,8 @@ static u32 hwmp_route_info_get(struct ie
+@@ -554,6 +561,8 @@ static u32 hwmp_route_info_get(struct ie
mpath->hop_count = 1;
mesh_path_activate(mpath);
spin_unlock_bh(&mpath->state_lock);
ewma_mesh_fail_avg_init(&sta->mesh->fail_avg);
/* init it at a low value - 0 start is tricky */
ewma_mesh_fail_avg_add(&sta->mesh->fail_avg, 1);
-@@ -1215,6 +1224,20 @@ static int mesh_nexthop_lookup_nolearn(s
+@@ -1223,6 +1232,20 @@ static int mesh_nexthop_lookup_nolearn(s
return 0;
}
/**
* mesh_nexthop_lookup - put the appropriate next hop on a mesh frame. Calling
* this function is considered "using" the associated mpath, so preempt a path
-@@ -1242,19 +1265,15 @@ int mesh_nexthop_lookup(struct ieee80211
+@@ -1250,19 +1273,15 @@ int mesh_nexthop_lookup(struct ieee80211
if (!mpath || !(mpath->flags & MESH_PATH_ACTIVE))
return -ENOENT;
rx_accept:
--- a/net/mac80211/ieee80211_i.h
+++ b/net/mac80211/ieee80211_i.h
-@@ -2029,6 +2029,8 @@ void __ieee80211_xmit_fast(struct ieee80
+@@ -2027,6 +2027,8 @@ void __ieee80211_xmit_fast(struct ieee80
struct ieee80211_fast_tx *fast_tx,
struct sk_buff *skb, bool ampdu,
const u8 *da, const u8 *sa);
--- a/include/net/mac80211.h
+++ b/include/net/mac80211.h
-@@ -5977,6 +5977,18 @@ void ieee80211_queue_delayed_work(struct
+@@ -5991,6 +5991,18 @@ void ieee80211_queue_delayed_work(struct
unsigned long delay);
/**
--- a/net/mac80211/rx.c
+++ b/net/mac80211/rx.c
-@@ -4580,6 +4580,12 @@ void ieee80211_check_fast_rx(struct sta_
+@@ -4584,6 +4584,12 @@ void ieee80211_check_fast_rx(struct sta_
}
break;
default:
goto clear;
}
-@@ -4788,6 +4794,7 @@ static bool ieee80211_invoke_fast_rx(str
+@@ -4792,6 +4798,7 @@ static bool ieee80211_invoke_fast_rx(str
struct sk_buff *skb = rx->skb;
struct ieee80211_hdr *hdr = (void *)skb->data;
struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);
int orig_len = skb->len;
int hdrlen = ieee80211_hdrlen(hdr->frame_control);
int snap_offs = hdrlen;
-@@ -4849,7 +4856,8 @@ static bool ieee80211_invoke_fast_rx(str
+@@ -4853,7 +4860,8 @@ static bool ieee80211_invoke_fast_rx(str
snap_offs += IEEE80211_CCMP_HDR_LEN;
}
if (!pskb_may_pull(skb, snap_offs + sizeof(*payload)))
return false;
-@@ -4888,13 +4896,29 @@ static bool ieee80211_invoke_fast_rx(str
+@@ -4892,13 +4900,29 @@ static bool ieee80211_invoke_fast_rx(str
/* do the header conversion - first grab the addresses */
ether_addr_copy(addrs.da, skb->data + fast_rx->da_offs);
ether_addr_copy(addrs.sa, skb->data + fast_rx->sa_offs);
--- a/include/net/mac80211.h
+++ b/include/net/mac80211.h
-@@ -4201,6 +4201,10 @@ struct ieee80211_prep_tx_info {
+@@ -4215,6 +4215,10 @@ struct ieee80211_prep_tx_info {
* Note that a sta can also be inserted or removed with valid links,
* i.e. passed to @sta_add/@sta_state with sta->valid_links not zero.
* In fact, cannot change from having valid_links and not having them.
*/
struct ieee80211_ops {
void (*tx)(struct ieee80211_hw *hw,
-@@ -4556,6 +4560,11 @@ struct ieee80211_ops {
+@@ -4570,6 +4574,11 @@ struct ieee80211_ops {
struct ieee80211_vif *vif,
struct ieee80211_sta *sta,
u16 old_links, u16 new_links);
MAC80211_SUPPORTED_FEATURES_RX)
--- a/net/mac80211/iface.c
+++ b/net/mac80211/iface.c
-@@ -834,6 +834,21 @@ ieee80211_get_stats64(struct net_device
+@@ -852,6 +852,21 @@ ieee80211_get_stats64(struct net_device
dev_fetch_sw_netstats(stats, dev->tstats);
}
static const struct net_device_ops ieee80211_dataif_ops = {
.ndo_open = ieee80211_open,
.ndo_stop = ieee80211_stop,
-@@ -842,6 +857,7 @@ static const struct net_device_ops ieee8
+@@ -860,6 +875,7 @@ static const struct net_device_ops ieee8
.ndo_set_rx_mode = ieee80211_set_multicast_list,
.ndo_set_mac_address = ieee80211_change_mac,
.ndo_get_stats64 = ieee80211_get_stats64,
};
#if LINUX_VERSION_IS_GEQ(5,2,0)
-@@ -966,6 +982,7 @@ static const struct net_device_ops ieee8
+@@ -984,6 +1000,7 @@ static const struct net_device_ops ieee8
#if LINUX_VERSION_IS_GEQ(5,13,0)
.ndo_fill_forward_path = ieee80211_netdev_fill_forward_path,
#endif
--- a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
-@@ -4844,9 +4844,6 @@ static void iwl_mvm_mac_flush(struct iee
+@@ -4848,9 +4848,6 @@ static void iwl_mvm_mac_flush(struct iee
return;
}
/* Make sure we're done with the deferred traffic before flushing */
flush_work(&mvm->add_stream_wk);
-@@ -4864,9 +4861,6 @@ static void iwl_mvm_mac_flush(struct iee
+@@ -4868,9 +4865,6 @@ static void iwl_mvm_mac_flush(struct iee
if (mvmsta->vif != vif)
continue;
--- a/include/net/mac80211.h
+++ b/include/net/mac80211.h
-@@ -3927,6 +3927,10 @@ struct ieee80211_prep_tx_info {
+@@ -3941,6 +3941,10 @@ struct ieee80211_prep_tx_info {
* Note that vif can be NULL.
* The callback can sleep.
*
* @channel_switch: Drivers that need (or want) to offload the channel
* switch operation for CSAs received from the AP may implement this
* callback. They must then call ieee80211_chswitch_done() to indicate
-@@ -4381,6 +4385,8 @@ struct ieee80211_ops {
+@@ -4395,6 +4399,8 @@ struct ieee80211_ops {
#endif
void (*flush)(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
u32 queues, bool drop);
--- a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
-@@ -4880,6 +4880,31 @@ static void iwl_mvm_mac_flush(struct iee
+@@ -4887,6 +4887,31 @@ static void iwl_mvm_mac_flush(struct iee
iwl_trans_wait_tx_queues_empty(mvm->trans, msk);
}
static int iwl_mvm_mac_get_survey(struct ieee80211_hw *hw, int idx,
struct survey_info *survey)
{
-@@ -5407,6 +5432,7 @@ const struct ieee80211_ops iwl_mvm_hw_op
+@@ -5414,6 +5439,7 @@ const struct ieee80211_ops iwl_mvm_hw_op
.mgd_complete_tx = iwl_mvm_mac_mgd_complete_tx,
.mgd_protect_tdls_discover = iwl_mvm_mac_mgd_protect_tdls_discover,
.flush = iwl_mvm_mac_flush,
--- a/include/net/mac80211.h
+++ b/include/net/mac80211.h
-@@ -5265,6 +5265,74 @@ ieee80211_beacon_get_template(struct iee
+@@ -5279,6 +5279,74 @@ ieee80211_beacon_get_template(struct iee
unsigned int link_id);
/**
}
new = kzalloc(size, GFP_KERNEL);
-@@ -3396,8 +3396,11 @@ cfg80211_beacon_dup(struct cfg80211_beac
+@@ -3398,8 +3398,11 @@ cfg80211_beacon_dup(struct cfg80211_beac
len = beacon->head_len + beacon->tail_len + beacon->beacon_ies_len +
beacon->proberesp_ies_len + beacon->assocresp_ies_len +
offs->mbssid_off = skb->len - mbssid_len;
}
-@@ -5288,12 +5298,51 @@ ieee80211_beacon_get_ap(struct ieee80211
+@@ -5290,12 +5300,51 @@ ieee80211_beacon_get_ap(struct ieee80211
return skb;
}
{
struct ieee80211_local *local = hw_to_local(hw);
struct beacon_data *beacon = NULL;
-@@ -5322,8 +5371,29 @@ __ieee80211_beacon_get(struct ieee80211_
+@@ -5324,8 +5373,29 @@ __ieee80211_beacon_get(struct ieee80211_
if (!beacon)
goto out;
} else if (sdata->vif.type == NL80211_IFTYPE_ADHOC) {
struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
struct ieee80211_hdr *hdr;
-@@ -5411,10 +5481,50 @@ ieee80211_beacon_get_template(struct iee
+@@ -5413,10 +5483,50 @@ ieee80211_beacon_get_template(struct iee
struct ieee80211_mutable_offsets *offs,
unsigned int link_id)
{
struct sk_buff *ieee80211_beacon_get_tim(struct ieee80211_hw *hw,
struct ieee80211_vif *vif,
u16 *tim_offset, u16 *tim_length,
-@@ -5422,7 +5532,9 @@ struct sk_buff *ieee80211_beacon_get_tim
+@@ -5424,7 +5534,9 @@ struct sk_buff *ieee80211_beacon_get_tim
{
struct ieee80211_mutable_offsets offs = {};
struct sk_buff *bcn = __ieee80211_beacon_get(hw, vif, &offs, false,
{
--- a/net/wireless/core.h
+++ b/net/wireless/core.h
-@@ -497,6 +497,8 @@ void cfg80211_set_dfs_state(struct wiphy
+@@ -491,6 +491,8 @@ void cfg80211_set_dfs_state(struct wiphy
enum nl80211_dfs_state dfs_state);
void cfg80211_dfs_channels_update_work(struct work_struct *work);
--- a/net/wireless/core.h
+++ b/net/wireless/core.h
-@@ -283,6 +283,8 @@ struct cfg80211_event {
+@@ -277,6 +277,8 @@ struct cfg80211_event {
} ij;
struct {
u8 bssid[ETH_ALEN];
} pa;
};
};
-@@ -427,7 +429,8 @@ int cfg80211_disconnect(struct cfg80211_
+@@ -421,7 +423,8 @@ int cfg80211_disconnect(struct cfg80211_
bool wextev);
void __cfg80211_roamed(struct wireless_dev *wdev,
struct cfg80211_roam_info *info);
void cfg80211_autodisconnect_wk(struct work_struct *work);
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
-@@ -18022,7 +18022,8 @@ void nl80211_send_roamed(struct cfg80211
+@@ -18041,7 +18041,8 @@ void nl80211_send_roamed(struct cfg80211
}
void nl80211_send_port_authorized(struct cfg80211_registered_device *rdev,
{
struct sk_buff *msg;
void *hdr;
-@@ -18042,6 +18043,11 @@ void nl80211_send_port_authorized(struct
+@@ -18061,6 +18062,11 @@ void nl80211_send_port_authorized(struct
nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, bssid))
goto nla_put_failure;
const u8 *ie, size_t ie_len, bool from_ap);
--- a/net/wireless/sme.c
+++ b/net/wireless/sme.c
-@@ -1266,7 +1266,8 @@ out:
+@@ -1267,7 +1267,8 @@ out:
}
EXPORT_SYMBOL(cfg80211_roamed);
{
ASSERT_WDEV_LOCK(wdev);
-@@ -1279,11 +1280,11 @@ void __cfg80211_port_authorized(struct w
+@@ -1280,11 +1281,11 @@ void __cfg80211_port_authorized(struct w
return;
nl80211_send_port_authorized(wiphy_to_rdev(wdev->wiphy), wdev->netdev,
{
struct wireless_dev *wdev = dev->ieee80211_ptr;
struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
-@@ -1293,12 +1294,15 @@ void cfg80211_port_authorized(struct net
+@@ -1294,12 +1295,15 @@ void cfg80211_port_authorized(struct net
if (WARN_ON(!bssid))
return;
--- a/include/net/mac80211.h
+++ b/include/net/mac80211.h
-@@ -1477,6 +1477,7 @@ enum mac80211_rx_encoding {
+@@ -1478,6 +1478,7 @@ enum mac80211_rx_encoding {
RX_ENC_HT,
RX_ENC_VHT,
RX_ENC_HE,
};
/**
-@@ -1510,7 +1511,7 @@ enum mac80211_rx_encoding {
+@@ -1511,7 +1512,7 @@ enum mac80211_rx_encoding {
* @antenna: antenna used
* @rate_idx: index of data rate into band's supported rates or MCS index if
* HT or VHT is used (%RX_FLAG_HT/%RX_FLAG_VHT)
* @flag: %RX_FLAG_\*
* @encoding: &enum mac80211_rx_encoding
* @bw: &enum rate_info_bw
-@@ -1518,6 +1519,8 @@ enum mac80211_rx_encoding {
+@@ -1519,6 +1520,8 @@ enum mac80211_rx_encoding {
* @he_ru: HE RU, from &enum nl80211_he_ru_alloc
* @he_gi: HE GI, from &enum nl80211_he_gi
* @he_dcm: HE DCM value
* @rx_flags: internal RX flags for mac80211
* @ampdu_reference: A-MPDU reference number, must be a different value for
* each A-MPDU but the same for each subframe within one A-MPDU
-@@ -1539,8 +1542,18 @@ struct ieee80211_rx_status {
+@@ -1540,8 +1543,18 @@ struct ieee80211_rx_status {
u32 flag;
u16 freq: 13, freq_offset: 1;
u8 enc_flags;
u8 rx_flags;
--- a/net/mac80211/rx.c
+++ b/net/mac80211/rx.c
-@@ -5358,6 +5358,15 @@ void ieee80211_rx_list(struct ieee80211_
+@@ -5362,6 +5362,15 @@ void ieee80211_rx_list(struct ieee80211_
status->rate_idx, status->nss))
goto drop;
break;
return STA_STATS_RATE_INVALID;
--- a/net/mac80211/util.c
+++ b/net/mac80211/util.c
-@@ -3902,6 +3902,19 @@ u64 ieee80211_calculate_rx_timestamp(str
+@@ -3905,6 +3905,19 @@ u64 ieee80211_calculate_rx_timestamp(str
/* Fill cfg80211 rate info */
switch (status->encoding) {
bool mu_mimo_owner;
--- a/net/mac80211/cfg.c
+++ b/net/mac80211/cfg.c
-@@ -4197,7 +4197,7 @@ static int ieee80211_set_ap_chanwidth(st
+@@ -4199,7 +4199,7 @@ static int ieee80211_set_ap_chanwidth(st
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
struct ieee80211_link_data *link;
int ret;
struct ieee80211_bss_conf *link_conf = link->conf;
--- a/net/mac80211/ieee80211_i.h
+++ b/net/mac80211/ieee80211_i.h
-@@ -2499,7 +2499,7 @@ int ieee80211_link_unreserve_chanctx(str
+@@ -2497,7 +2497,7 @@ int ieee80211_link_unreserve_chanctx(str
int __must_check
ieee80211_link_change_bandwidth(struct ieee80211_link_data *link,
const struct cfg80211_chan_def *chandef,
{
struct ieee80211_sub_if_data *sdata = link->sdata;
struct ieee80211_local *local = sdata->local;
-@@ -4140,6 +4275,7 @@ static bool ieee80211_assoc_config_link(
+@@ -4141,6 +4276,7 @@ static bool ieee80211_assoc_config_link(
link_sta);
bss_conf->eht_support = link_sta->pub->eht_cap.has_eht;
} else {
bss_conf->eht_support = false;
}
-@@ -5452,6 +5588,45 @@ static bool ieee80211_rx_our_beacon(cons
+@@ -5453,6 +5589,45 @@ static bool ieee80211_rx_our_beacon(cons
return ether_addr_equal(tx_bssid, bss->transmitted_bss->bssid);
}
static void ieee80211_rx_mgmt_beacon(struct ieee80211_link_data *link,
struct ieee80211_hdr *hdr, size_t len,
struct ieee80211_rx_status *rx_status)
-@@ -5468,7 +5643,7 @@ static void ieee80211_rx_mgmt_beacon(str
+@@ -5469,7 +5644,7 @@ static void ieee80211_rx_mgmt_beacon(str
struct ieee80211_channel *chan;
struct link_sta_info *link_sta;
struct sta_info *sta;
bool erp_valid;
u8 erp_value = 0;
u32 ncrc = 0;
-@@ -5761,6 +5936,21 @@ static void ieee80211_rx_mgmt_beacon(str
+@@ -5762,6 +5937,21 @@ static void ieee80211_rx_mgmt_beacon(str
elems->pwr_constr_elem,
elems->cisco_dtpc_elem);
ieee80211_link_info_change_notify(sdata, link, changed);
free:
kfree(elems);
-@@ -6862,9 +7052,12 @@ ieee80211_setup_assoc_link(struct ieee80
+@@ -6863,9 +7053,12 @@ ieee80211_setup_assoc_link(struct ieee80
ieee80211_apply_htcap_overrides(sdata, &sta_ht_cap);
}
const struct element *elem;
u8 dtim_count = 0;
-@@ -6893,6 +7086,31 @@ ieee80211_setup_assoc_link(struct ieee80
+@@ -6894,6 +7087,31 @@ ieee80211_setup_assoc_link(struct ieee80
link->conf->ema_ap = true;
else
link->conf->ema_ap = false;
break;
link->u.mgd.conn_flags |=
ieee80211_chandef_downgrade(chandef);
-@@ -5613,8 +5552,8 @@ static bool ieee80211_config_puncturing(
+@@ -5614,8 +5553,8 @@ static bool ieee80211_config_puncturing(
extracted == link->conf->eht_puncturing)
return true;
link_info(link,
"Got an invalid disable subchannel bitmap from AP %pM: bitmap = 0x%x, bw = 0x%x. disconnect\n",
link->u.mgd.bssid,
-@@ -7102,8 +7041,8 @@ ieee80211_setup_assoc_link(struct ieee80
+@@ -7103,8 +7042,8 @@ ieee80211_setup_assoc_link(struct ieee80
u16 bitmap;
bitmap = get_unaligned_le16(disable_subchannel_bitmap);
int nl80211_parse_chandef(struct cfg80211_registered_device *rdev,
struct genl_info *info,
struct cfg80211_chan_def *chandef)
-@@ -5969,6 +5985,14 @@ static int nl80211_start_ap(struct sk_bu
+@@ -5974,6 +5990,14 @@ static int nl80211_start_ap(struct sk_bu
goto out;
}
if (!cfg80211_reg_can_beacon_relax(&rdev->wiphy, ¶ms->chandef,
wdev->iftype)) {
err = -EINVAL;
-@@ -10107,6 +10131,14 @@ skip_beacons:
+@@ -10126,6 +10150,14 @@ skip_beacons:
if (info->attrs[NL80211_ATTR_CH_SWITCH_BLOCK_TX])
params.block_tx = true;
* ieee80211_operating_class_to_band - convert operating class to band
--- a/net/mac80211/cfg.c
+++ b/net/mac80211/cfg.c
-@@ -3612,7 +3612,8 @@ static int __ieee80211_csa_finalize(stru
+@@ -3614,7 +3614,8 @@ static int __ieee80211_csa_finalize(stru
if (err)
return err;
return 0;
}
-@@ -3884,7 +3885,7 @@ __ieee80211_channel_switch(struct wiphy
+@@ -3886,7 +3887,7 @@ __ieee80211_channel_switch(struct wiphy
cfg80211_ch_switch_started_notify(sdata->dev,
&sdata->deflink.csa_chandef, 0,
/* use driver's channel switch callback */
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
-@@ -19081,7 +19081,7 @@ static void nl80211_ch_switch_notify(str
+@@ -19100,7 +19100,7 @@ static void nl80211_ch_switch_notify(str
struct cfg80211_chan_def *chandef,
gfp_t gfp,
enum nl80211_commands notif,
{
struct wireless_dev *wdev = netdev->ieee80211_ptr;
struct sk_buff *msg;
-@@ -19115,6 +19115,9 @@ static void nl80211_ch_switch_notify(str
+@@ -19134,6 +19134,9 @@ static void nl80211_ch_switch_notify(str
goto nla_put_failure;
}
genlmsg_end(msg, hdr);
genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
-@@ -19127,7 +19130,7 @@ static void nl80211_ch_switch_notify(str
+@@ -19146,7 +19149,7 @@ static void nl80211_ch_switch_notify(str
void cfg80211_ch_switch_notify(struct net_device *dev,
struct cfg80211_chan_def *chandef,
{
struct wireless_dev *wdev = dev->ieee80211_ptr;
struct wiphy *wiphy = wdev->wiphy;
-@@ -19136,7 +19139,7 @@ void cfg80211_ch_switch_notify(struct ne
+@@ -19155,7 +19158,7 @@ void cfg80211_ch_switch_notify(struct ne
ASSERT_WDEV_LOCK(wdev);
WARN_INVALID_LINK_ID(wdev, link_id);
switch (wdev->iftype) {
case NL80211_IFTYPE_STATION:
-@@ -19164,14 +19167,15 @@ void cfg80211_ch_switch_notify(struct ne
+@@ -19183,14 +19186,15 @@ void cfg80211_ch_switch_notify(struct ne
cfg80211_sched_dfs_chan_update(rdev);
nl80211_ch_switch_notify(rdev, dev, link_id, chandef, GFP_KERNEL,
{
struct wireless_dev *wdev = dev->ieee80211_ptr;
struct wiphy *wiphy = wdev->wiphy;
-@@ -19180,11 +19184,13 @@ void cfg80211_ch_switch_started_notify(s
+@@ -19199,11 +19203,13 @@ void cfg80211_ch_switch_started_notify(s
ASSERT_WDEV_LOCK(wdev);
WARN_INVALID_LINK_ID(wdev, link_id);
if (sdata->vif.type == NL80211_IFTYPE_AP &&
params->mbssid_config.tx_wdev) {
err = ieee80211_set_ap_mbssid_options(sdata,
-@@ -3571,6 +3576,12 @@ static int __ieee80211_csa_finalize(stru
+@@ -3573,6 +3578,12 @@ static int __ieee80211_csa_finalize(stru
lockdep_assert_held(&local->mtx);
lockdep_assert_held(&local->chanctx_mtx);
/*
* using reservation isn't immediate as it may be deferred until later
* with multi-vif. once reservation is complete it will re-schedule the
-@@ -3613,7 +3624,7 @@ static int __ieee80211_csa_finalize(stru
+@@ -3615,7 +3626,7 @@ static int __ieee80211_csa_finalize(stru
return err;
cfg80211_ch_switch_notify(sdata->dev, &sdata->deflink.csa_chandef, 0,
return 0;
}
-@@ -3875,9 +3886,13 @@ __ieee80211_channel_switch(struct wiphy
+@@ -3877,9 +3888,13 @@ __ieee80211_channel_switch(struct wiphy
goto out;
}
if (sdata->deflink.csa_block_tx)
ieee80211_stop_vif_queues(local, sdata,
-@@ -3885,7 +3900,8 @@ __ieee80211_channel_switch(struct wiphy
+@@ -3887,7 +3902,8 @@ __ieee80211_channel_switch(struct wiphy
cfg80211_ch_switch_started_notify(sdata->dev,
&sdata->deflink.csa_chandef, 0,
--- a/net/mac80211/mlme.c
+++ b/net/mac80211/mlme.c
-@@ -3239,7 +3239,7 @@ static void ieee80211_mgd_probe_ap(struc
+@@ -3240,7 +3240,7 @@ static void ieee80211_mgd_probe_ap(struc
struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
bool already = false;
--- a/net/mac80211/util.c
+++ b/net/mac80211/util.c
-@@ -2497,21 +2497,55 @@ int ieee80211_reconfig(struct ieee80211_
+@@ -2500,21 +2500,55 @@ int ieee80211_reconfig(struct ieee80211_
/* Finally also reconfigure all the BSS information */
list_for_each_entry(sdata, &local->interfaces, list) {
}
switch (sdata->vif.type) {
-@@ -2531,42 +2565,42 @@ int ieee80211_reconfig(struct ieee80211_
+@@ -2534,42 +2568,42 @@ int ieee80211_reconfig(struct ieee80211_
&sdata->deflink.tx_conf[i]);
break;
}
break;
case NL80211_IFTYPE_OCB:
changed |= BSS_CHANGED_OCB;
-@@ -2601,6 +2635,7 @@ int ieee80211_reconfig(struct ieee80211_
+@@ -2604,6 +2638,7 @@ int ieee80211_reconfig(struct ieee80211_
case NL80211_IFTYPE_NAN:
res = ieee80211_reconfig_nan(sdata);
if (res < 0) {
ieee80211_handle_reconfig_failure(local);
return res;
}
-@@ -2618,6 +2653,10 @@ int ieee80211_reconfig(struct ieee80211_
+@@ -2621,6 +2656,10 @@ int ieee80211_reconfig(struct ieee80211_
WARN_ON(1);
break;
}
int ieee80211_reconfig(struct ieee80211_local *local)
{
struct ieee80211_hw *hw = &local->hw;
-@@ -2610,7 +2639,13 @@ int ieee80211_reconfig(struct ieee80211_
+@@ -2613,7 +2642,13 @@ int ieee80211_reconfig(struct ieee80211_
changed |= BSS_CHANGED_IBSS;
fallthrough;
case NL80211_IFTYPE_AP:
if (sdata->vif.bss_conf.ftm_responder == 1 &&
wiphy_ext_feature_isset(sdata->local->hw.wiphy,
-@@ -2620,6 +2655,13 @@ int ieee80211_reconfig(struct ieee80211_
+@@ -2623,6 +2658,13 @@ int ieee80211_reconfig(struct ieee80211_
if (sdata->vif.type == NL80211_IFTYPE_AP) {
changed |= BSS_CHANGED_AP_PROBE_RESP;
--- a/include/net/mac80211.h
+++ b/include/net/mac80211.h
-@@ -1936,6 +1936,27 @@ struct ieee80211_vif {
+@@ -1937,6 +1937,27 @@ struct ieee80211_vif {
u8 drv_priv[] __aligned(sizeof(void *));
};
chanctx_conf = rcu_dereference(sdata->vif.bss_conf.chanctx_conf);
--- a/net/mac80211/iface.c
+++ b/net/mac80211/iface.c
-@@ -542,7 +542,7 @@ static void ieee80211_do_stop(struct iee
+@@ -543,7 +543,7 @@ static void ieee80211_do_stop(struct iee
cancel_work_sync(&sdata->recalc_smps);
sdata_lock(sdata);
"destroying interface with valid links 0x%04x\n",
sdata->vif.valid_links);
-@@ -1855,7 +1855,7 @@ static int ieee80211_runtime_change_ifty
+@@ -1873,7 +1873,7 @@ static int ieee80211_runtime_change_ifty
return -EBUSY;
/* for now, don't support changing while links exist */
ieee80211_recalc_smps(sdata, &sdata->deflink);
ieee80211_recalc_ps_vif(sdata);
-@@ -2982,7 +2982,7 @@ static void ieee80211_set_disassoc(struc
+@@ -2983,7 +2983,7 @@ static void ieee80211_set_disassoc(struc
sta_info_flush(sdata);
/* finally reset all BSS / config parameters */
changed |= ieee80211_reset_erp_info(sdata);
ieee80211_led_assoc(local, 0);
-@@ -3007,7 +3007,7 @@ static void ieee80211_set_disassoc(struc
+@@ -3008,7 +3008,7 @@ static void ieee80211_set_disassoc(struc
sizeof(sdata->vif.bss_conf.mu_group.membership));
memset(sdata->vif.bss_conf.mu_group.position, 0,
sizeof(sdata->vif.bss_conf.mu_group.position));
changed |= BSS_CHANGED_MU_GROUPS;
sdata->vif.bss_conf.mu_mimo_owner = false;
-@@ -3021,7 +3021,7 @@ static void ieee80211_set_disassoc(struc
+@@ -3022,7 +3022,7 @@ static void ieee80211_set_disassoc(struc
changed |= BSS_CHANGED_ARP_FILTER;
sdata->vif.bss_conf.qos = false;
changed |= BSS_CHANGED_QOS;
/* The BSSID (not really interesting) and HT changed */
changed |= BSS_CHANGED_BSSID | BSS_CHANGED_HT;
-@@ -3191,7 +3191,7 @@ static void ieee80211_mgd_probe_ap_send(
+@@ -3192,7 +3192,7 @@ static void ieee80211_mgd_probe_ap_send(
u8 unicast_limit = max(1, max_probe_tries - 3);
struct sta_info *sta;
return;
/*
-@@ -3239,7 +3239,7 @@ static void ieee80211_mgd_probe_ap(struc
+@@ -3240,7 +3240,7 @@ static void ieee80211_mgd_probe_ap(struc
struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
bool already = false;
return;
if (!ieee80211_sdata_running(sdata))
-@@ -3314,7 +3314,7 @@ struct sk_buff *ieee80211_ap_probereq_ge
+@@ -3315,7 +3315,7 @@ struct sk_buff *ieee80211_ap_probereq_ge
int ssid_len;
if (WARN_ON(sdata->vif.type != NL80211_IFTYPE_STATION ||
return NULL;
sdata_assert_lock(sdata);
-@@ -3379,7 +3379,8 @@ static void __ieee80211_disconnect(struc
+@@ -3380,7 +3380,8 @@ static void __ieee80211_disconnect(struc
}
/* in MLO assume we have a link where we can TX the frame */
if (!ifmgd->driver_disconnect) {
unsigned int link_id;
-@@ -3578,7 +3579,7 @@ static void ieee80211_destroy_assoc_data
+@@ -3579,7 +3580,7 @@ static void ieee80211_destroy_assoc_data
for (i = 0; i < ARRAY_SIZE(data.bss); i++)
data.bss[i] = assoc_data->link[i].bss;
data.ap_mld_addr = assoc_data->ap_addr;
cfg80211_assoc_failure(sdata->dev, &data);
-@@ -4979,7 +4980,7 @@ static bool ieee80211_assoc_success(stru
+@@ -4980,7 +4981,7 @@ static bool ieee80211_assoc_success(stru
if (WARN_ON(!sta))
goto out_err;
u16 valid_links = 0;
for (link_id = 0; link_id < IEEE80211_MLD_MAX_NUM_LINKS; link_id++) {
-@@ -5008,7 +5009,7 @@ static bool ieee80211_assoc_success(stru
+@@ -5009,7 +5010,7 @@ static bool ieee80211_assoc_success(stru
if (WARN_ON(!link))
goto out_err;
link_info(link,
"local address %pM, AP link address %pM\n",
link->conf->addr,
-@@ -5240,7 +5241,7 @@ static void ieee80211_rx_mgmt_assoc_resp
+@@ -5241,7 +5242,7 @@ static void ieee80211_rx_mgmt_assoc_resp
ifmgd->broken_ap = true;
}
if (!elems->multi_link) {
sdata_info(sdata,
"MLO association with %pM but no multi-link element in response!\n",
-@@ -5304,7 +5305,7 @@ static void ieee80211_rx_mgmt_assoc_resp
+@@ -5305,7 +5306,7 @@ static void ieee80211_rx_mgmt_assoc_resp
resp.uapsd_queues |= ieee80211_ac_to_qos_mask[ac];
}
ether_addr_copy(ap_mld_addr, sdata->vif.cfg.ap_addr);
resp.ap_mld_addr = ap_mld_addr;
}
-@@ -5629,7 +5630,7 @@ static void ieee80211_rx_mgmt_beacon(str
+@@ -5630,7 +5631,7 @@ static void ieee80211_rx_mgmt_beacon(str
rcu_read_unlock();
if (ifmgd->assoc_data && ifmgd->assoc_data->need_beacon &&
ieee80211_rx_our_beacon(bssid, ifmgd->assoc_data->link[0].bss)) {
parse_params.bss = ifmgd->assoc_data->link[0].bss;
elems = ieee802_11_parse_elems_full(&parse_params);
-@@ -6319,7 +6320,7 @@ static void ieee80211_sta_bcn_mon_timer(
+@@ -6320,7 +6321,7 @@ static void ieee80211_sta_bcn_mon_timer(
struct ieee80211_sub_if_data *sdata =
from_timer(sdata, t, u.mgd.bcn_mon_timer);
return;
if (sdata->vif.bss_conf.csa_active &&
-@@ -6343,7 +6344,7 @@ static void ieee80211_sta_conn_mon_timer
+@@ -6344,7 +6345,7 @@ static void ieee80211_sta_conn_mon_timer
struct sta_info *sta;
unsigned long timeout;
return;
if (sdata->vif.bss_conf.csa_active &&
-@@ -6898,7 +6899,7 @@ int ieee80211_mgd_auth(struct ieee80211_
+@@ -6899,7 +6900,7 @@ int ieee80211_mgd_auth(struct ieee80211_
return 0;
err_clear:
chanctx_conf =
rcu_dereference(sdata->vif.bss_conf.chanctx_conf);
if (unlikely(!chanctx_conf)) {
-@@ -6008,7 +6008,7 @@ void __ieee80211_tx_skb_tid_band(struct
+@@ -6010,7 +6010,7 @@ void __ieee80211_tx_skb_tid_band(struct
BUILD_BUG_ON(!FIELD_FIT(IEEE80211_TX_CTRL_MLO_LINK,
IEEE80211_LINK_UNSPECIFIED));
link = 0;
} else if (link_id >= 0) {
link = link_id;
-@@ -6054,7 +6054,7 @@ void ieee80211_tx_skb_tid(struct ieee802
+@@ -6056,7 +6056,7 @@ void ieee80211_tx_skb_tid(struct ieee802
enum nl80211_band band;
rcu_read_lock();
struct {
u8 id;
u8 len;
-@@ -2546,7 +2546,7 @@ int ieee80211_reconfig(struct ieee80211_
+@@ -2549,7 +2549,7 @@ int ieee80211_reconfig(struct ieee80211_
continue;
sdata_lock(sdata);
struct ieee80211_bss_conf *old[IEEE80211_MLD_MAX_NUM_LINKS] = {
[0] = &sdata->vif.bss_conf,
};
-@@ -2566,7 +2566,7 @@ int ieee80211_reconfig(struct ieee80211_
+@@ -2569,7 +2569,7 @@ int ieee80211_reconfig(struct ieee80211_
for (link_id = 0;
link_id < ARRAY_SIZE(sdata->vif.link_conf);
link_id++) {
!(sdata->vif.active_links & BIT(link_id)))
continue;
-@@ -2598,12 +2598,12 @@ int ieee80211_reconfig(struct ieee80211_
+@@ -2601,12 +2601,12 @@ int ieee80211_reconfig(struct ieee80211_
if (sdata->vif.bss_conf.mu_mimo_owner)
changed |= BSS_CHANGED_MU_GROUPS;
changed |= BSS_CHANGED_ASSOC |
BSS_CHANGED_ARP_FILTER |
BSS_CHANGED_PS;
-@@ -2641,7 +2641,7 @@ int ieee80211_reconfig(struct ieee80211_
+@@ -2644,7 +2644,7 @@ int ieee80211_reconfig(struct ieee80211_
case NL80211_IFTYPE_AP:
changed |= BSS_CHANGED_P2P_PS;
ieee80211_vif_cfg_change_notify(sdata,
BSS_CHANGED_SSID);
else
-@@ -2655,7 +2655,7 @@ int ieee80211_reconfig(struct ieee80211_
+@@ -2658,7 +2658,7 @@ int ieee80211_reconfig(struct ieee80211_
if (sdata->vif.type == NL80211_IFTYPE_AP) {
changed |= BSS_CHANGED_AP_PROBE_RESP;
--- a/include/net/mac80211.h
+++ b/include/net/mac80211.h
-@@ -1714,6 +1714,7 @@ enum ieee80211_smps_mode {
+@@ -1715,6 +1715,7 @@ enum ieee80211_smps_mode {
*
* @power_level: requested transmit power (in dBm), backward compatibility
* value only that is set to the minimum of all interfaces
*
* @chandef: the channel definition to tune to
* @radar_enabled: whether radar detection is enabled
-@@ -1734,6 +1735,7 @@ enum ieee80211_smps_mode {
+@@ -1735,6 +1736,7 @@ enum ieee80211_smps_mode {
struct ieee80211_conf {
u32 flags;
int power_level, dynamic_ps_timeout;
__NL80211_ATTR_AFTER_LAST,
--- a/net/mac80211/cfg.c
+++ b/net/mac80211/cfg.c
-@@ -3079,6 +3079,19 @@ static int ieee80211_get_tx_power(struct
+@@ -3081,6 +3081,19 @@ static int ieee80211_get_tx_power(struct
return 0;
}
static void ieee80211_rfkill_poll(struct wiphy *wiphy)
{
struct ieee80211_local *local = wiphy_priv(wiphy);
-@@ -5009,6 +5022,7 @@ const struct cfg80211_ops mac80211_confi
+@@ -5011,6 +5024,7 @@ const struct cfg80211_ops mac80211_confi
.set_wiphy_params = ieee80211_set_wiphy_params,
.set_tx_power = ieee80211_set_tx_power,
.get_tx_power = ieee80211_get_tx_power,
u32 offchannel_flag;
offchannel_flag = local->hw.conf.flags & IEEE80211_CONF_OFFCHANNEL;
-@@ -157,6 +157,12 @@ static u32 ieee80211_hw_conf_chan(struct
+@@ -159,6 +159,12 @@ static u32 ieee80211_hw_conf_chan(struct
}
rcu_read_unlock();
if (local->hw.conf.power_level != power) {
changed |= IEEE80211_CONF_CHANGE_POWER;
local->hw.conf.power_level = power;
-@@ -766,6 +772,7 @@ struct ieee80211_hw *ieee80211_alloc_hw_
+@@ -768,6 +774,7 @@ struct ieee80211_hw *ieee80211_alloc_hw_
IEEE80211_RADIOTAP_MCS_HAVE_BW;
local->hw.radiotap_vht_details = IEEE80211_RADIOTAP_VHT_KNOWN_GI |
IEEE80211_RADIOTAP_VHT_KNOWN_BANDWIDTH;