PKG_NAME:=mac80211
-PKG_VERSION:=5.15.8-1
-PKG_RELEASE:=2
-PKG_SOURCE_URL:=@KERNEL/linux/kernel/projects/backports/stable/v5.15.8/
-PKG_HASH:=9f71b659c034f19d156532ec780fcb606cee3c4ccc42e2f8ef18dd3e9f1b6820
+PKG_VERSION:=5.15.33-1
+PKG_RELEASE:=1
+PKG_SOURCE_URL:=@KERNEL/linux/kernel/projects/backports/stable/v5.15.33/
+PKG_HASH:=1b6b3bded4c81814ebebe2d194c2f8966d2399005b85ebb0557285b6e73f5422
PKG_SOURCE:=backports-$(PKG_VERSION).tar.xz
PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/backports-$(PKG_VERSION)
help
--- a/local-symbols
+++ b/local-symbols
-@@ -76,6 +76,7 @@ ADM8211=
+@@ -83,6 +83,7 @@ ADM8211=
ATH_COMMON=
WLAN_VENDOR_ATH=
ATH_DEBUG=
--- a/net/wireless/reg.c
+++ b/net/wireless/reg.c
-@@ -3299,6 +3299,8 @@ void regulatory_hint_country_ie(struct w
+@@ -3304,6 +3304,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;
-@@ -3550,6 +3552,7 @@ static bool is_wiphy_all_set_reg_flag(en
+@@ -3555,6 +3557,7 @@ static bool is_wiphy_all_set_reg_flag(en
void regulatory_hint_disconnect(void)
{
void ath10k_thermal_event_temperature(struct ath10k *ar, int temperature);
--- a/local-symbols
+++ b/local-symbols
-@@ -135,6 +135,7 @@ ATH10K_SNOC=
+@@ -142,6 +142,7 @@ ATH10K_SNOC=
ATH10K_DEBUG=
ATH10K_DEBUGFS=
ATH10K_SPECTRAL=
#include <asm/byteorder.h>
#include "core.h"
-@@ -935,7 +936,8 @@ static int ath10k_core_get_board_id_from
+@@ -952,7 +953,8 @@ static int ath10k_core_get_board_id_from
}
if (ar->cal_mode == ATH10K_PRE_CAL_MODE_DT ||
bmi_board_id_param = BMI_PARAM_GET_FLASH_BOARD_ID;
else
bmi_board_id_param = BMI_PARAM_GET_EEPROM_BOARD_ID;
-@@ -1726,7 +1728,8 @@ static int ath10k_download_and_run_otp(s
+@@ -1743,7 +1745,8 @@ static int ath10k_download_and_run_otp(s
/* As of now pre-cal is valid for 10_4 variants */
if (ar->cal_mode == ATH10K_PRE_CAL_MODE_DT ||
bmi_otp_exe_param = BMI_PARAM_FLASH_SECTION_ALL;
ret = ath10k_bmi_execute(ar, address, bmi_otp_exe_param, &result);
-@@ -1853,6 +1856,39 @@ out_free:
+@@ -1870,6 +1873,39 @@ out_free:
return ret;
}
int ath10k_core_fetch_firmware_api_n(struct ath10k *ar, const char *name,
struct ath10k_fw_file *fw_file)
{
-@@ -2087,6 +2123,18 @@ static int ath10k_core_pre_cal_download(
+@@ -2104,6 +2140,18 @@ static int ath10k_core_pre_cal_download(
{
int ret;
ret = ath10k_download_cal_file(ar, ar->pre_cal_file);
if (ret == 0) {
ar->cal_mode = ATH10K_PRE_CAL_MODE_FILE;
-@@ -2153,6 +2201,18 @@ static int ath10k_download_cal_data(stru
+@@ -2170,6 +2218,18 @@ static int ath10k_download_cal_data(stru
"pre cal download procedure failed, try cal file: %d\n",
ret);
--- a/drivers/net/wireless/ath/ath10k/core.c
+++ b/drivers/net/wireless/ath/ath10k/core.c
-@@ -3412,6 +3412,16 @@ int ath10k_core_register(struct ath10k *
+@@ -3429,6 +3429,16 @@ int ath10k_core_register(struct ath10k *
queue_work(ar->workqueue, &ar->register_work);
ath10k_core-$(CONFIG_DEV_COREDUMP) += coredump.o
--- a/local-symbols
+++ b/local-symbols
-@@ -136,6 +136,7 @@ ATH10K_DEBUG=
+@@ -143,6 +143,7 @@ ATH10K_DEBUG=
ATH10K_DEBUGFS=
ATH10K_SPECTRAL=
ATH10K_THERMAL=
.patch_load_addr = QCA988X_HW_2_0_PATCH_LOAD_ADDR,
.uart_pin = 7,
.cc_wraparound_type = ATH10K_HW_CC_WRAP_SHIFTED_ALL,
-@@ -133,6 +135,7 @@ static const struct ath10k_hw_params ath
+@@ -135,6 +137,7 @@ static const struct ath10k_hw_params ath
.dev_id = QCA9887_1_0_DEVICE_ID,
.bus = ATH10K_BUS_PCI,
.name = "qca9887 hw1.0",
.patch_load_addr = QCA9887_HW_1_0_PATCH_LOAD_ADDR,
.uart_pin = 7,
.cc_wraparound_type = ATH10K_HW_CC_WRAP_SHIFTED_ALL,
-@@ -344,6 +347,7 @@ static const struct ath10k_hw_params ath
+@@ -352,6 +355,7 @@ static const struct ath10k_hw_params ath
.dev_id = QCA99X0_2_0_DEVICE_ID,
.bus = ATH10K_BUS_PCI,
.name = "qca99x0 hw2.0",
.patch_load_addr = QCA99X0_HW_2_0_PATCH_LOAD_ADDR,
.uart_pin = 7,
.otp_exe_param = 0x00000700,
-@@ -385,6 +389,7 @@ static const struct ath10k_hw_params ath
+@@ -394,6 +398,7 @@ static const struct ath10k_hw_params ath
.dev_id = QCA9984_1_0_DEVICE_ID,
.bus = ATH10K_BUS_PCI,
.name = "qca9984/qca9994 hw1.0",
.patch_load_addr = QCA9984_HW_1_0_PATCH_LOAD_ADDR,
.uart_pin = 7,
.cc_wraparound_type = ATH10K_HW_CC_WRAP_SHIFTED_EACH,
-@@ -433,6 +438,7 @@ static const struct ath10k_hw_params ath
+@@ -443,6 +448,7 @@ static const struct ath10k_hw_params ath
.dev_id = QCA9888_2_0_DEVICE_ID,
.bus = ATH10K_BUS_PCI,
.name = "qca9888 hw2.0",
.patch_load_addr = QCA9888_HW_2_0_PATCH_LOAD_ADDR,
.uart_pin = 7,
.cc_wraparound_type = ATH10K_HW_CC_WRAP_SHIFTED_EACH,
-@@ -3127,6 +3133,10 @@ int ath10k_core_start(struct ath10k *ar,
+@@ -3144,6 +3150,10 @@ int ath10k_core_start(struct ath10k *ar,
goto err_hif_stop;
}
return 0;
err_hif_stop:
-@@ -3385,9 +3395,18 @@ static void ath10k_core_register_work(st
+@@ -3402,9 +3412,18 @@ static void ath10k_core_register_work(st
goto err_spectral_destroy;
}
err_spectral_destroy:
ath10k_spectral_destroy(ar);
err_debug_destroy:
-@@ -3433,6 +3452,8 @@ void ath10k_core_unregister(struct ath10
+@@ -3450,6 +3469,8 @@ void ath10k_core_unregister(struct ath10
if (!test_bit(ATH10K_FLAG_CORE_REGISTERED, &ar->dev_flags))
return;
#include <linux/property.h>
#include <linux/dmi.h>
#include <linux/ctype.h>
-@@ -3303,6 +3304,8 @@ static int ath10k_core_probe_fw(struct a
+@@ -3320,6 +3321,8 @@ static int ath10k_core_probe_fw(struct a
device_get_mac_address(ar->dev, ar->mac_addr, sizeof(ar->mac_addr));
--- a/local-symbols
+++ b/local-symbols
-@@ -103,6 +103,7 @@ ATH9K_WOW=
+@@ -110,6 +110,7 @@ ATH9K_WOW=
ATH9K_RFKILL=
ATH9K_CHANNEL_CONTEXT=
ATH9K_PCOEM=
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
-@@ -429,6 +429,7 @@ struct brcmf_fw {
+@@ -431,6 +431,7 @@ struct brcmf_fw {
struct brcmf_fw_request *req;
u32 curpos;
void (*done)(struct device *dev, int err, struct brcmf_fw_request *req);
};
#ifdef CONFIG_EFI
-@@ -653,6 +654,8 @@ static void brcmf_fw_request_done(const
+@@ -655,6 +656,8 @@ static void brcmf_fw_request_done(const
fwctx->req = NULL;
}
fwctx->done(fwctx->dev, ret, fwctx->req);
kfree(fwctx);
}
-@@ -693,6 +696,8 @@ int brcmf_fw_get_firmwares(struct device
+@@ -695,6 +698,8 @@ int brcmf_fw_get_firmwares(struct device
{
struct brcmf_fw_item *first = &req->items[0];
struct brcmf_fw *fwctx;
+ struct completion completion;
+ unsigned long time_left;
- char *alt_path;
+ char *alt_path = NULL;
int ret;
-@@ -710,6 +715,9 @@ int brcmf_fw_get_firmwares(struct device
+@@ -712,6 +717,9 @@ int brcmf_fw_get_firmwares(struct device
fwctx->dev = dev;
fwctx->req = req;
fwctx->done = fw_cb;
+ fwctx->completion = &completion;
/* First try alternative board-specific path if any */
- alt_path = brcm_alt_fw_path(first->path, fwctx->req->board_type);
-@@ -726,6 +734,12 @@ int brcmf_fw_get_firmwares(struct device
+ if (fwctx->req->board_type)
+@@ -730,6 +738,12 @@ int brcmf_fw_get_firmwares(struct device
if (ret < 0)
brcmf_fw_request_done(NULL, fwctx);
--- a/local-symbols
+++ b/local-symbols
-@@ -421,43 +421,6 @@ USB_VL600=
+@@ -428,43 +428,6 @@ USB_VL600=
USB_NET_CH9200=
USB_NET_AQC111=
USB_RTL8153_ECM=
select BRCMUTIL
--- a/Kconfig.local
+++ b/Kconfig.local
-@@ -1267,117 +1267,6 @@ config BACKPORTED_USB_NET_AQC111
+@@ -1288,117 +1288,6 @@ config BACKPORTED_USB_NET_AQC111
config BACKPORTED_USB_RTL8153_ECM
tristate
default USB_RTL8153_ECM
default USB_ACM
--- a/Kconfig.sources
+++ b/Kconfig.sources
-@@ -7,9 +7,6 @@ source "$BACKPORT_DIR/net/mac80211/Kconf
+@@ -9,9 +9,6 @@ source "$BACKPORT_DIR/drivers/bus/mhi/Kc
source "$BACKPORT_DIR/drivers/net/wireless/Kconfig"
source "$BACKPORT_DIR/drivers/net/usb/Kconfig"
source "$BACKPORT_DIR/drivers/staging/Kconfig"
--- a/Makefile.kernel
+++ b/Makefile.kernel
-@@ -40,8 +40,6 @@ obj-y += compat/
- obj-$(CPTCFG_CFG80211) += net/wireless/
- obj-$(CPTCFG_MAC80211) += net/mac80211/
+@@ -42,8 +42,6 @@ obj-$(CPTCFG_MAC80211) += net/mac80211/
+ obj-$(CPTCFG_QRTR) += net/qrtr/
+ obj-$(CPTCFG_MHI_BUS) += drivers/bus/mhi/
obj-$(CPTCFG_WLAN) += drivers/net/wireless/
-obj-$(CPTCFG_SSB) += drivers/ssb/
-obj-$(CPTCFG_BCMA) += drivers/bcma/
+++ /dev/null
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Petr=20=C5=A0tetiar?= <ynezz@true.cz>
-Date: Fri, 11 Mar 2022 18:21:04 +0100
-Subject: [PATCH] headers: fix lockdep_assert_not_held()
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-LOCK_STATE_HELD define was omitted during backport of
-lockdep_assert_not_held() which leads to build failures of kernels with
-CONFIG_LOCKDEP=y:
-
- backports-5.15.8-1/backport-include/linux/lockdep.h:16:47: error: 'LOCK_STATE_HELD' undeclared (first use in this function)
-
-Fix it by adding missing LOCK_STATE_HELD define.
-
-References: https://github.com/openwrt/openwrt/pull/9373
-References: https://lore.kernel.org/backports/20220311194800.452-1-ynezz@true.cz/T/#u
-Fixes: af58b27b1b1a ("headers: Add lockdep_assert_not_held()")
-Reported-by: Oskari Rauta <oskari.rauta@gmail.com>
-Signed-off-by: Petr Å tetiar <ynezz@true.cz>
----
- backport-include/linux/lockdep.h | 3 +++
- 1 file changed, 3 insertions(+)
-
-diff --git a/backport-include/linux/lockdep.h b/backport-include/linux/lockdep.h
-index ed5ea67894e4..842e24b7ff8f 100644
---- a/backport-include/linux/lockdep.h
-+++ b/backport-include/linux/lockdep.h
-@@ -11,6 +11,9 @@ struct lockdep_map { };
-
- #ifndef lockdep_assert_not_held
- #ifdef CONFIG_LOCKDEP
-+#ifndef LOCK_STATE_HELD
-+#define LOCK_STATE_HELD 1
-+#endif /* LOCK_STATE_HELD */
- #define lockdep_assert_not_held(l) do { \
- WARN_ON(debug_locks && \
- lockdep_is_held(l) == LOCK_STATE_HELD); \
--- a/local-symbols
+++ b/local-symbols
-@@ -315,6 +315,7 @@ RT2X00_LIB_FIRMWARE=
+@@ -322,6 +322,7 @@ RT2X00_LIB_FIRMWARE=
RT2X00_LIB_CRYPTO=
RT2X00_LIB_LEDS=
RT2X00_LIB_DEBUGFS=
--- a/net/mac80211/cfg.c
+++ b/net/mac80211/cfg.c
-@@ -1316,7 +1316,6 @@ static int ieee80211_stop_ap(struct wiph
+@@ -1319,7 +1319,6 @@ static int ieee80211_stop_ap(struct wiph
sdata->vif.bss_conf.ftmr_params = NULL;
__sta_info_flush(sdata, true);
static int ieee80211_ifa6_changed(struct notifier_block *nb,
unsigned long data, void *arg)
{
-@@ -1324,14 +1324,14 @@ int ieee80211_register_hw(struct ieee802
+@@ -1321,14 +1321,14 @@ int ieee80211_register_hw(struct ieee802
wiphy_unlock(hw->wiphy);
rtnl_unlock();
local->ifa6_notifier.notifier_call = ieee80211_ifa6_changed;
result = register_inet6addr_notifier(&local->ifa6_notifier);
if (result)
-@@ -1340,13 +1340,13 @@ int ieee80211_register_hw(struct ieee802
+@@ -1337,13 +1337,13 @@ int ieee80211_register_hw(struct ieee802
return 0;
fail_ifa:
#endif
wiphy_unregister(local->hw.wiphy);
-@@ -1374,10 +1374,10 @@ void ieee80211_unregister_hw(struct ieee
+@@ -1371,10 +1371,10 @@ void ieee80211_unregister_hw(struct ieee
tasklet_kill(&local->tx_pending_tasklet);
tasklet_kill(&local->tasklet);
+++ /dev/null
-From: Felix Fietkau <nbd@nbd.name>
-Date: Mon, 22 Nov 2021 21:39:38 +0100
-Subject: [PATCH] mac80211: fix rate control for retransmitted frames
-
-Since retransmission clears info->control, rate control needs to be called
-again, otherwise the driver might crash due to invalid rates.
-
-Cc: stable@vger.kernel.org # 5.14+
-Reported-by: Aaro Koskinen <aaro.koskinen@iki.fi>
-Reported-by: Robert W <rwbugreport@lost-in-the-void.net>
-Fixes: 03c3911d2d67 ("mac80211: call ieee80211_tx_h_rate_ctrl() when dequeue")
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
-
---- a/net/mac80211/tx.c
-+++ b/net/mac80211/tx.c
-@@ -1821,15 +1821,15 @@ static int invoke_tx_handlers_late(struc
- struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx->skb);
- ieee80211_tx_result res = TX_CONTINUE;
-
-+ if (!ieee80211_hw_check(&tx->local->hw, HAS_RATE_CONTROL))
-+ CALL_TXH(ieee80211_tx_h_rate_ctrl);
-+
- if (unlikely(info->flags & IEEE80211_TX_INTFL_RETRANSMISSION)) {
- __skb_queue_tail(&tx->skbs, tx->skb);
- tx->skb = NULL;
- goto txh_done;
- }
-
-- if (!ieee80211_hw_check(&tx->local->hw, HAS_RATE_CONTROL))
-- CALL_TXH(ieee80211_tx_h_rate_ctrl);
--
- CALL_TXH(ieee80211_tx_h_michael_mic_add);
- CALL_TXH(ieee80211_tx_h_sequence);
- CALL_TXH(ieee80211_tx_h_fragment);
+++ /dev/null
-From: Felix Fietkau <nbd@nbd.name>
-Date: Wed, 24 Nov 2021 10:30:41 +0100
-Subject: [PATCH] mac80211: fix regression in SSN handling of addba tx
-
-Some drivers that do their own sequence number allocation (e.g. ath9k) rely
-on being able to modify params->ssn on starting tx ampdu sessions.
-This was broken by a change that modified it to use sta->tid_seq[tid] instead.
-
-Cc: stable@vger.kernel.org
-Fixes: 31d8bb4e07f8 ("mac80211: agg-tx: refactor sending addba")
-Reported-by: Eneas U de Queiroz <cotequeiroz@gmail.com>
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
-
---- a/net/mac80211/agg-tx.c
-+++ b/net/mac80211/agg-tx.c
-@@ -480,8 +480,7 @@ static void ieee80211_send_addba_with_ti
-
- /* send AddBA request */
- ieee80211_send_addba_request(sdata, sta->sta.addr, tid,
-- tid_tx->dialog_token,
-- sta->tid_seq[tid] >> 4,
-+ tid_tx->dialog_token, tid_tx->ssn,
- buf_size, tid_tx->timeout);
-
- WARN_ON(test_and_set_bit(HT_AGG_STATE_SENT_ADDBA, &tid_tx->state));
-@@ -523,6 +522,7 @@ void ieee80211_tx_ba_session_handle_star
-
- params.ssn = sta->tid_seq[tid] >> 4;
- ret = drv_ampdu_action(local, sdata, ¶ms);
-+ tid_tx->ssn = params.ssn;
- if (ret == IEEE80211_AMPDU_TX_START_DELAY_ADDBA) {
- return;
- } else if (ret == IEEE80211_AMPDU_TX_START_IMMEDIATE) {
---- a/net/mac80211/sta_info.h
-+++ b/net/mac80211/sta_info.h
-@@ -199,6 +199,7 @@ struct tid_ampdu_tx {
- u8 stop_initiator;
- bool tx_stop;
- u16 buf_size;
-+ u16 ssn;
-
- u16 failed_bar_ssn;
- bool bar_pending;
--- a/net/mac80211/rx.c
+++ b/net/mac80211/rx.c
-@@ -2948,6 +2948,7 @@ ieee80211_rx_h_mesh_fwding(struct ieee80
+@@ -2949,6 +2949,7 @@ ieee80211_rx_h_mesh_fwding(struct ieee80
if (!fwd_skb)
goto out;
+++ /dev/null
-From: Felix Fietkau <nbd@nbd.name>
-Date: Thu, 2 Dec 2021 13:30:05 +0100
-Subject: [PATCH] mac80211: send ADDBA requests using the tid/queue of the
- aggregation session
-
-Sending them out on a different queue can cause a race condition where a
-number of packets in the queue may be discarded by the receiver, because
-the ADDBA request is sent too early.
-This affects any driver with software A-MPDU setup which does not allocate
-packet seqno in hardware on tx, regardless of whether iTXQ is used or not.
-The only driver I've seen that explicitly deals with this issue internally
-is mwl8k.
-
-Cc: stable@vger.kernel.org
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
-
---- a/net/mac80211/agg-tx.c
-+++ b/net/mac80211/agg-tx.c
-@@ -106,7 +106,7 @@ static void ieee80211_send_addba_request
- mgmt->u.action.u.addba_req.start_seq_num =
- cpu_to_le16(start_seq_num << 4);
-
-- ieee80211_tx_skb(sdata, skb);
-+ ieee80211_tx_skb_tid(sdata, skb, tid);
- }
-
- void ieee80211_send_bar(struct ieee80211_vif *vif, u8 *ra, u16 tid, u16 ssn)
+++ /dev/null
-From: Johannes Berg <johannes.berg@intel.com>
-Date: Mon, 29 Nov 2021 15:32:47 +0200
-Subject: [PATCH] mac80211: agg-tx: don't schedule_and_wake_txq() under
- sta->lock
-
-When we call ieee80211_agg_start_txq(), that will in turn call
-schedule_and_wake_txq(). Called from ieee80211_stop_tx_ba_cb()
-this is done under sta->lock, which leads to certain circular
-lock dependencies, as reported by Chris Murphy:
-https://lore.kernel.org/r/CAJCQCtSXJ5qA4bqSPY=oLRMbv-irihVvP7A2uGutEbXQVkoNaw@mail.gmail.com
-
-In general, ieee80211_agg_start_txq() is usually not called
-with sta->lock held, only in this one place. But it's always
-called with sta->ampdu_mlme.mtx held, and that's therefore
-clearly sufficient.
-
-Change ieee80211_stop_tx_ba_cb() to also call it without the
-sta->lock held, by factoring it out of ieee80211_remove_tid_tx()
-(which is only called in this one place).
-
-This breaks the locking chain and makes it less likely that
-we'll have similar locking chain problems in the future.
-
-Reported-by: Chris Murphy <lists@colorremedies.com>
-Signed-off-by: Johannes Berg <johannes.berg@intel.com>
-Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
----
-
---- a/net/mac80211/agg-tx.c
-+++ b/net/mac80211/agg-tx.c
-@@ -9,7 +9,7 @@
- * Copyright 2007, Michael Wu <flamingice@sourmilk.net>
- * Copyright 2007-2010, Intel Corporation
- * Copyright(c) 2015-2017 Intel Deutschland GmbH
-- * Copyright (C) 2018 - 2020 Intel Corporation
-+ * Copyright (C) 2018 - 2021 Intel Corporation
- */
-
- #include <linux/ieee80211.h>
-@@ -213,6 +213,8 @@ ieee80211_agg_start_txq(struct sta_info
- struct ieee80211_txq *txq = sta->sta.txq[tid];
- struct txq_info *txqi;
-
-+ lockdep_assert_held(&sta->ampdu_mlme.mtx);
-+
- if (!txq)
- return;
-
-@@ -290,7 +292,6 @@ static void ieee80211_remove_tid_tx(stru
- ieee80211_assign_tid_tx(sta, tid, NULL);
-
- ieee80211_agg_splice_finish(sta->sdata, tid);
-- ieee80211_agg_start_txq(sta, tid, false);
-
- kfree_rcu(tid_tx, rcu_head);
- }
-@@ -889,6 +890,7 @@ void ieee80211_stop_tx_ba_cb(struct sta_
- {
- struct ieee80211_sub_if_data *sdata = sta->sdata;
- bool send_delba = false;
-+ bool start_txq = false;
-
- ht_dbg(sdata, "Stopping Tx BA session for %pM tid %d\n",
- sta->sta.addr, tid);
-@@ -906,10 +908,14 @@ void ieee80211_stop_tx_ba_cb(struct sta_
- send_delba = true;
-
- ieee80211_remove_tid_tx(sta, tid);
-+ start_txq = true;
-
- unlock_sta:
- spin_unlock_bh(&sta->lock);
-
-+ if (start_txq)
-+ ieee80211_agg_start_txq(sta, tid, false);
-+
- if (send_delba)
- ieee80211_send_delba(sdata, sta->sta.addr, tid,
- WLAN_BACK_INITIATOR, WLAN_REASON_QSTA_NOT_USE);
--- a/drivers/net/wireless/mac80211_hwsim.c
+++ b/drivers/net/wireless/mac80211_hwsim.c
-@@ -2992,15 +2992,19 @@ static void mac80211_hwsim_he_capab(stru
+@@ -3001,15 +3001,19 @@ static void mac80211_hwsim_he_capab(stru
{
u16 n_iftype_data;
return;
}
-@@ -3290,6 +3294,12 @@ static int mac80211_hwsim_new_radio(stru
+@@ -3299,6 +3303,12 @@ static int mac80211_hwsim_new_radio(stru
sband->vht_cap.vht_mcs.tx_mcs_map =
sband->vht_cap.vht_mcs.rx_mcs_map;
break;
case NL80211_BAND_S1GHZ:
memcpy(&sband->s1g_cap, &hwsim_s1g_cap,
sizeof(sband->s1g_cap));
-@@ -3300,6 +3310,13 @@ static int mac80211_hwsim_new_radio(stru
+@@ -3309,6 +3319,13 @@ static int mac80211_hwsim_new_radio(stru
continue;
}
sband->ht_cap.ht_supported = true;
sband->ht_cap.cap = IEEE80211_HT_CAP_SUP_WIDTH_20_40 |
IEEE80211_HT_CAP_GRN_FLD |
-@@ -3313,10 +3330,6 @@ static int mac80211_hwsim_new_radio(stru
+@@ -3322,10 +3339,6 @@ static int mac80211_hwsim_new_radio(stru
sband->ht_cap.mcs.rx_mask[0] = 0xff;
sband->ht_cap.mcs.rx_mask[1] = 0xff;
sband->ht_cap.mcs.tx_params = IEEE80211_HT_MCS_TX_DEFINED;
/**
--- a/net/mac80211/driver-ops.h
+++ b/net/mac80211/driver-ops.h
-@@ -1483,4 +1483,28 @@ static inline void drv_twt_teardown_requ
+@@ -1486,4 +1486,28 @@ static inline void drv_twt_teardown_requ
trace_drv_return_void(local);
}
-
+
+#if LINUX_VERSION_IS_GEQ(5,10,0)
+static inline int drv_net_fill_forward_path(struct ieee80211_local *local,
+ struct ieee80211_sub_if_data *sdata,
#endif /* __MAC80211_DRIVER_OPS */
--- a/net/mac80211/ieee80211_i.h
+++ b/net/mac80211/ieee80211_i.h
-@@ -1465,7 +1465,7 @@ struct ieee80211_local {
+@@ -1485,7 +1485,7 @@ struct ieee80211_local {
};
static inline struct ieee80211_sub_if_data *
static const struct net_device_ops ieee80211_dataif_8023_ops = {
#if LINUX_VERSION_IS_LESS(4,10,0)
.ndo_change_mtu = __change_mtu,
-@@ -839,7 +901,9 @@ static const struct net_device_ops ieee8
+@@ -839,7 +899,9 @@ static const struct net_device_ops ieee8
#else
.ndo_get_stats64 = bp_ieee80211_get_stats64,
#endif
@@ -2892,6 +2892,15 @@ TRACE_EVENT(drv_twt_teardown_request,
)
);
-
+
+#if LINUX_VERSION_IS_GEQ(5,10,0)
+DEFINE_EVENT(sta_event, drv_net_fill_forward_path,
+ TP_PROTO(struct ieee80211_local *local,
#endif /* __LINUX_NL80211_H */
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
-@@ -439,6 +439,16 @@ sar_policy[NL80211_SAR_ATTR_MAX + 1] = {
+@@ -442,6 +442,16 @@ sar_policy[NL80211_SAR_ATTR_MAX + 1] = {
[NL80211_SAR_ATTR_SPECS] = NLA_POLICY_NESTED_ARRAY(sar_specs_policy),
};
static const struct nla_policy nl80211_policy[NUM_NL80211_ATTR] = {
[0] = { .strict_start_type = NL80211_ATTR_HE_OBSS_PD },
[NL80211_ATTR_WIPHY] = { .type = NLA_U32 },
-@@ -780,6 +790,9 @@ static const struct nla_policy nl80211_p
+@@ -783,6 +793,9 @@ static const struct nla_policy nl80211_p
[NL80211_ATTR_COLOR_CHANGE_COUNT] = { .type = NLA_U8 },
[NL80211_ATTR_COLOR_CHANGE_COLOR] = { .type = NLA_U8 },
[NL80211_ATTR_COLOR_CHANGE_ELEMS] = NLA_POLICY_NESTED(nl80211_policy),
};
/* policy for the key attributes */
-@@ -2228,6 +2241,35 @@ fail:
+@@ -2231,6 +2244,35 @@ fail:
return -ENOBUFS;
}
struct nl80211_dump_wiphy_state {
s64 filter_wiphy;
long start;
-@@ -2813,6 +2855,9 @@ static int nl80211_send_wiphy(struct cfg
+@@ -2816,6 +2858,9 @@ static int nl80211_send_wiphy(struct cfg
if (nl80211_put_sar_specs(rdev, msg))
goto nla_put_failure;
/* done */
state->split_start = 0;
break;
-@@ -5002,6 +5047,96 @@ static int validate_beacon_tx_rate(struc
+@@ -5005,6 +5050,96 @@ static int validate_beacon_tx_rate(struc
return 0;
}
static int nl80211_parse_beacon(struct cfg80211_registered_device *rdev,
struct nlattr *attrs[],
struct cfg80211_beacon_data *bcn)
-@@ -5082,6 +5217,17 @@ static int nl80211_parse_beacon(struct c
+@@ -5085,6 +5220,17 @@ static int nl80211_parse_beacon(struct c
bcn->ftm_responder = -1;
}
return 0;
}
-@@ -5538,6 +5684,17 @@ static int nl80211_start_ap(struct sk_bu
+@@ -5541,6 +5687,17 @@ static int nl80211_start_ap(struct sk_bu
goto out;
}
nl80211_calculate_ap_params(¶ms);
if (info->attrs[NL80211_ATTR_EXTERNAL_AUTH_SUPPORT])
-@@ -5559,6 +5716,11 @@ static int nl80211_start_ap(struct sk_bu
+@@ -5562,6 +5719,11 @@ static int nl80211_start_ap(struct sk_bu
out:
kfree(params.acl);
return err;
}
-@@ -5583,12 +5745,14 @@ static int nl80211_set_beacon(struct sk_
+@@ -5586,12 +5748,14 @@ static int nl80211_set_beacon(struct sk_
err = nl80211_parse_beacon(rdev, info->attrs, ¶ms);
if (err)
return err;
}
-@@ -9265,12 +9429,14 @@ static int nl80211_channel_switch(struct
+@@ -9268,12 +9432,14 @@ static int nl80211_channel_switch(struct
err = nl80211_parse_beacon(rdev, info->attrs, ¶ms.beacon_after);
if (err)
err = nla_parse_nested_deprecated(csa_attrs, NL80211_ATTR_MAX,
info->attrs[NL80211_ATTR_CSA_IES],
-@@ -9389,6 +9555,8 @@ skip_beacons:
+@@ -9392,6 +9558,8 @@ skip_beacons:
wdev_unlock(wdev);
free:
kfree(csa_attrs);
return err;
}
-@@ -14924,6 +15092,8 @@ static int nl80211_color_change(struct s
+@@ -14939,6 +15107,8 @@ static int nl80211_color_change(struct s
wdev_unlock(wdev);
out:
NUM_NL80211_EXT_FEATURES,
--- a/net/wireless/core.c
+++ b/net/wireless/core.c
-@@ -552,6 +552,7 @@ use_default_name:
+@@ -543,6 +543,7 @@ use_default_name:
INIT_WORK(&rdev->rfkill_block, cfg80211_rfkill_block_work);
INIT_WORK(&rdev->conn_work, cfg80211_conn_work);
INIT_WORK(&rdev->event_work, cfg80211_event_work);
init_waitqueue_head(&rdev->dev_wait);
-@@ -1214,6 +1215,8 @@ void __cfg80211_leave(struct cfg80211_re
+@@ -1205,6 +1206,8 @@ void __cfg80211_leave(struct cfg80211_re
cfg80211_pmsr_wdev_down(wdev);
+}
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
-@@ -793,6 +793,7 @@ static const struct nla_policy nl80211_p
+@@ -796,6 +796,7 @@ static const struct nla_policy nl80211_p
[NL80211_ATTR_MBSSID_CONFIG] =
NLA_POLICY_NESTED(nl80211_mbssid_config_policy),
[NL80211_ATTR_MBSSID_ELEMS] = { .type = NLA_NESTED },
};
/* policy for the key attributes */
-@@ -9269,12 +9270,6 @@ static int nl80211_start_radar_detection
+@@ -9272,12 +9273,6 @@ static int nl80211_start_radar_detection
if (err)
return err;
err = cfg80211_chandef_dfs_required(wiphy, &chandef, wdev->iftype);
if (err < 0)
return err;
-@@ -9285,6 +9280,16 @@ static int nl80211_start_radar_detection
+@@ -9288,6 +9283,16 @@ static int nl80211_start_radar_detection
if (!cfg80211_chandef_dfs_usable(wiphy, &chandef))
return -EINVAL;
* cfg80211_gtk_rekey_notify - notify userspace about driver rekeying
--- a/net/wireless/core.c
+++ b/net/wireless/core.c
-@@ -552,7 +552,9 @@ use_default_name:
+@@ -543,7 +543,9 @@ use_default_name:
INIT_WORK(&rdev->rfkill_block, cfg80211_rfkill_block_work);
INIT_WORK(&rdev->conn_work, cfg80211_conn_work);
INIT_WORK(&rdev->event_work, cfg80211_event_work);
init_waitqueue_head(&rdev->dev_wait);
-@@ -1062,11 +1064,13 @@ void wiphy_unregister(struct wiphy *wiph
+@@ -1053,11 +1055,13 @@ void wiphy_unregister(struct wiphy *wiph
cancel_work_sync(&rdev->conn_work);
flush_work(&rdev->event_work);
cancel_delayed_work_sync(&rdev->dfs_update_channels_wk);
NL80211_RADAR_CAC_ABORTED);
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
-@@ -9260,42 +9260,60 @@ static int nl80211_start_radar_detection
+@@ -9263,42 +9263,60 @@ static int nl80211_start_radar_detection
struct cfg80211_chan_def chandef;
enum nl80211_dfs_regions dfs_region;
unsigned int cac_time_ms;
cac_time_ms = cfg80211_chandef_dfs_cac_time(&rdev->wiphy, &chandef);
if (WARN_ON(!cac_time_ms))
-@@ -9308,6 +9326,9 @@ static int nl80211_start_radar_detection
+@@ -9311,6 +9329,9 @@ static int nl80211_start_radar_detection
wdev->cac_start_time = jiffies;
wdev->cac_time_ms = cac_time_ms;
}
return err;
}
-@@ -15926,7 +15947,8 @@ static const struct genl_small_ops nl802
+@@ -15941,7 +15962,8 @@ static const struct genl_small_ops nl802
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.doit = nl80211_start_radar_detection,
.flags = GENL_UNS_ADMIN_PERM,
bool cfg80211_any_wiphy_oper_chan(struct wiphy *wiphy,
--- a/net/wireless/core.c
+++ b/net/wireless/core.c
-@@ -552,9 +552,10 @@ use_default_name:
+@@ -543,9 +543,10 @@ use_default_name:
INIT_WORK(&rdev->rfkill_block, cfg80211_rfkill_block_work);
INIT_WORK(&rdev->conn_work, cfg80211_conn_work);
INIT_WORK(&rdev->event_work, cfg80211_event_work);
init_waitqueue_head(&rdev->dev_wait);
-@@ -1064,13 +1065,13 @@ void wiphy_unregister(struct wiphy *wiph
+@@ -1055,13 +1056,13 @@ void wiphy_unregister(struct wiphy *wiph
cancel_work_sync(&rdev->conn_work);
flush_work(&rdev->event_work);
cancel_delayed_work_sync(&rdev->dfs_update_channels_wk);
#ifdef CONFIG_PM
if (rdev->wiphy.wowlan_config && rdev->ops->set_wakeup)
-@@ -1219,7 +1220,7 @@ void __cfg80211_leave(struct cfg80211_re
+@@ -1210,7 +1211,7 @@ void __cfg80211_leave(struct cfg80211_re
cfg80211_pmsr_wdev_down(wdev);
}
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
-@@ -793,7 +793,7 @@ static const struct nla_policy nl80211_p
+@@ -796,7 +796,7 @@ static const struct nla_policy nl80211_p
[NL80211_ATTR_MBSSID_CONFIG] =
NLA_POLICY_NESTED(nl80211_mbssid_config_policy),
[NL80211_ATTR_MBSSID_ELEMS] = { .type = NLA_NESTED },
};
/* policy for the key attributes */
-@@ -9288,9 +9288,9 @@ static int nl80211_start_radar_detection
+@@ -9291,9 +9291,9 @@ static int nl80211_start_radar_detection
goto unlock;
}
+++ /dev/null
-From: Deren Wu <deren.wu@mediatek.com>
-Date: Sun, 13 Feb 2022 00:20:15 +0800
-Subject: [PATCH] mac80211: fix EAPoL rekey fail in 802.3 rx path
-
-mac80211 set capability NL80211_EXT_FEATURE_CONTROL_PORT_OVER_NL80211
-to upper layer by default. That means we should pass EAPoL packets through
-nl80211 path only, and should not send the EAPoL skb to netdevice diretly.
-At the meanwhile, wpa_supplicant would not regist sock to listen EAPoL skb
-on the netdevice.
-
-However, there is no contorl_port_protocol handler in mac80211 for 802.3 RX
-packets, mac80211 driver would pass up the EAPoL rekey frame to netdevice
-and wpa_supplicant would be never interactive with this kind of packets,
-if SUPPORTS_RX_DECAP_OFFLOAD is enabled. This causes STA always rekey fail
-if EAPoL frame go through 802.3 path.
-
-To avoid this problem, align the same process as 802.11 type to handle
-this frame before put it into network stack.
-
-Fixes: 80a915ec4427 ("mac80211: add rx decapsulation offload support")
-Signed-off-by: Deren Wu <deren.wu@mediatek.com>
----
-
---- a/net/mac80211/rx.c
-+++ b/net/mac80211/rx.c
-@@ -4523,16 +4523,7 @@ static void ieee80211_rx_8023(struct iee
-
- /* deliver to local stack */
- skb->protocol = eth_type_trans(skb, fast_rx->dev);
-- memset(skb->cb, 0, sizeof(skb->cb));
-- if (rx->list)
--#if LINUX_VERSION_IS_GEQ(4,19,0)
-- list_add_tail(&skb->list, rx->list);
--#else
-- __skb_queue_tail(rx->list, skb);
--#endif
-- else
-- netif_receive_skb(skb);
--
-+ ieee80211_deliver_skb_to_local_stack(skb, rx);
- }
-
- static bool ieee80211_invoke_fast_rx(struct ieee80211_rx_data *rx,
+++ /dev/null
-From: Nicolas Escande <nico.escande@gmail.com>
-Date: Mon, 14 Feb 2022 18:32:14 +0100
-Subject: [PATCH] mac80211: fix forwarded mesh frames AC & queue selection
-
-There are two problems with the current code that have been highlighted
-with the AQL feature that is now enbaled by default.
-
-First problem is in ieee80211_rx_h_mesh_fwding(),
-ieee80211_select_queue_80211() is used on received packets to choose
-the sending AC queue of the forwarding packet although this function
-should only be called on TX packet (it uses ieee80211_tx_info).
-This ends with forwarded mesh packets been sent on unrelated random AC
-queue. To fix that, AC queue can directly be infered from skb->priority
-which has been extracted from QOS info (see ieee80211_parse_qos()).
-
-Second problem is the value of queue_mapping set on forwarded mesh
-frames via skb_set_queue_mapping() is not the AC of the packet but a
-hardware queue index. This may or may not work depending on AC to HW
-queue mapping which is driver specific.
-
-Both of these issues lead to improper AC selection while forwarding
-mesh packets but more importantly due to improper airtime accounting
-(which is done on a per STA, per AC basis) caused traffic stall with
-the introduction of AQL.
-
-Fixes: cf44012810cc ("mac80211: fix unnecessary frame drops in mesh fwding")
-Fixes: d3c1597b8d1b ("mac80211: fix forwarded mesh frame queue mapping")
-Co-developed-by: Remi Pommarel <repk@triplefau.lt>
-Signed-off-by: Remi Pommarel <repk@triplefau.lt>
-Signed-off-by: Nicolas Escande <nico.escande@gmail.com>
----
-
---- a/net/mac80211/rx.c
-+++ b/net/mac80211/rx.c
-@@ -2921,13 +2921,13 @@ ieee80211_rx_h_mesh_fwding(struct ieee80
- ether_addr_equal(sdata->vif.addr, hdr->addr3))
- return RX_CONTINUE;
-
-- ac = ieee80211_select_queue_80211(sdata, skb, hdr);
-+ ac = ieee802_1d_to_ac[skb->priority];
- q = sdata->vif.hw_queue[ac];
- if (ieee80211_queue_stopped(&local->hw, q)) {
- IEEE80211_IFSTA_MESH_CTR_INC(ifmsh, dropped_frames_congestion);
- return RX_DROP_MONITOR;
- }
-- skb_set_queue_mapping(skb, q);
-+ skb_set_queue_mapping(skb, ac);
-
- if (!--mesh_hdr->ttl) {
- if (!is_multicast_ether_addr(hdr->addr1))
if (csa) {
new->cntdwn_current_counter = csa->count;
-@@ -1329,8 +1366,11 @@ static int ieee80211_stop_ap(struct wiph
+@@ -1332,8 +1369,11 @@ static int ieee80211_stop_ap(struct wiph
mutex_unlock(&local->mtx);
struct rcu_head rcu_head;
};
-@@ -1063,6 +1064,20 @@ ieee80211_vif_get_shift(struct ieee80211
+@@ -1083,6 +1084,20 @@ ieee80211_vif_get_shift(struct ieee80211
return shift;
}
+++ /dev/null
-From: Ping-Ke Shih <pkshih@realtek.com>
-Date: Mon, 3 Jan 2022 09:36:21 +0800
-Subject: [PATCH] mac80211: allow non-standard VHT MCS-10/11
-
-Some AP can possibly try non-standard VHT rate and mac80211 warns and drops
-packets, and leads low TCP throughput.
-
- Rate marked as a VHT rate but data is invalid: MCS: 10, NSS: 2
- WARNING: CPU: 1 PID: 7817 at net/mac80211/rx.c:4856 ieee80211_rx_list+0x223/0x2f0 [mac8021
-
-Since commit c27aa56a72b8 ("cfg80211: add VHT rate entries for MCS-10 and MCS-11")
-has added, mac80211 adds this support as well.
-
-After this patch, throughput is good and iw can get the bitrate:
- rx bitrate: 975.1 MBit/s VHT-MCS 10 80MHz short GI VHT-NSS 2
-or
- rx bitrate: 1083.3 MBit/s VHT-MCS 11 80MHz short GI VHT-NSS 2
-
-Buglink: https://bugzilla.suse.com/show_bug.cgi?id=1192891
-Reported-by: Goldwyn Rodrigues <rgoldwyn@suse.com>
-Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
-Link: https://lore.kernel.org/r/20220103013623.17052-1-pkshih@realtek.com
-Signed-off-by: Johannes Berg <johannes.berg@intel.com>
----
-
---- a/net/mac80211/rx.c
-+++ b/net/mac80211/rx.c
-@@ -4945,7 +4945,7 @@ void ieee80211_rx_list(struct ieee80211_
- goto drop;
- break;
- case RX_ENC_VHT:
-- if (WARN_ONCE(status->rate_idx > 9 ||
-+ if (WARN_ONCE(status->rate_idx > 11 ||
- !status->nss ||
- status->nss > 8,
- "Rate marked as a VHT rate but data is invalid: MCS: %d, NSS: %d\n",
--- a/net/wireless/core.c
+++ b/net/wireless/core.c
-@@ -634,21 +634,6 @@ static int wiphy_verify_combinations(str
+@@ -625,21 +625,6 @@ static int wiphy_verify_combinations(str
c->limits[j].max > 1))
return -EINVAL;
CFG80211_TESTMODE_DUMP(ieee80211_testmode_dump)
--- a/net/mac80211/ieee80211_i.h
+++ b/net/mac80211/ieee80211_i.h
-@@ -1444,6 +1444,7 @@ struct ieee80211_local {
+@@ -1464,6 +1464,7 @@ struct ieee80211_local {
int dynamic_ps_forced_timeout;
int user_power_level; /* in dBm, for all interfaces */
local->hw.max_mtu = IEEE80211_MAX_DATA_LEN;
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
-@@ -794,6 +794,7 @@ static const struct nla_policy nl80211_p
+@@ -797,6 +797,7 @@ static const struct nla_policy nl80211_p
NLA_POLICY_NESTED(nl80211_mbssid_config_policy),
[NL80211_ATTR_MBSSID_ELEMS] = { .type = NLA_NESTED },
[NL80211_ATTR_RADAR_BACKGROUND] = { .type = NLA_FLAG },
};
/* policy for the key attributes */
-@@ -3374,6 +3375,22 @@ static int nl80211_set_wiphy(struct sk_b
+@@ -3377,6 +3378,22 @@ static int nl80211_set_wiphy(struct sk_b
if (result)
goto out;
}