From: RISCi_ATOM Date: Tue, 9 Jul 2024 16:57:51 +0000 (-0400) Subject: kernel: mac80211 Remove patches for non-free devices we don't use / support. X-Git-Tag: v6.1-20240716~29 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=a053b80355d6aa107962d42e985be31328b3419b;p=librecmc%2Flibrecmc.git kernel: mac80211 Remove patches for non-free devices we don't use / support. --- diff --git a/package/kernel/mac80211/patches/ath10k/080-ath10k_thermal_config.patch b/package/kernel/mac80211/patches/ath10k/080-ath10k_thermal_config.patch deleted file mode 100644 index 41ad6006b5..0000000000 --- a/package/kernel/mac80211/patches/ath10k/080-ath10k_thermal_config.patch +++ /dev/null @@ -1,47 +0,0 @@ ---- a/drivers/net/wireless/ath/ath10k/Kconfig -+++ b/drivers/net/wireless/ath/ath10k/Kconfig -@@ -86,6 +86,12 @@ config ATH10K_TRACING - help - Select this to ath10k use tracing infrastructure. - -+config ATH10K_THERMAL -+ bool "Atheros ath10k thermal monitoring support" -+ depends on THERMAL -+ ---help--- -+ Select this to ath10k use hwmon for thermal measurement. -+ - config ATH10K_DFS_CERTIFIED - bool "Atheros DFS support for certified platforms" - depends on ATH10K && CFG80211_CERTIFICATION_ONUS ---- a/drivers/net/wireless/ath/ath10k/Makefile -+++ b/drivers/net/wireless/ath/ath10k/Makefile -@@ -18,7 +18,7 @@ ath10k_core-y += mac.o \ - ath10k_core-$(CPTCFG_ATH10K_SPECTRAL) += spectral.o - ath10k_core-$(CPTCFG_NL80211_TESTMODE) += testmode.o - ath10k_core-$(CPTCFG_ATH10K_TRACING) += trace.o --ath10k_core-$(CONFIG_THERMAL) += thermal.o -+ath10k_core-$(CPTCFG_ATH10K_THERMAL) += thermal.o - ath10k_core-$(CPTCFG_MAC80211_DEBUGFS) += debugfs_sta.o - ath10k_core-$(CONFIG_PM) += wow.o - ath10k_core-$(CONFIG_DEV_COREDUMP) += coredump.o ---- a/drivers/net/wireless/ath/ath10k/thermal.h -+++ b/drivers/net/wireless/ath/ath10k/thermal.h -@@ -25,7 +25,7 @@ struct ath10k_thermal { - int temperature; - }; - --#if IS_REACHABLE(CONFIG_THERMAL) -+#if IS_REACHABLE(CPTCFG_ATH10K_THERMAL) - int ath10k_thermal_register(struct ath10k *ar); - void ath10k_thermal_unregister(struct ath10k *ar); - void ath10k_thermal_event_temperature(struct ath10k *ar, int temperature); ---- a/local-symbols -+++ b/local-symbols -@@ -161,6 +161,7 @@ ATH10K_SNOC= - ATH10K_DEBUG= - ATH10K_DEBUGFS= - ATH10K_SPECTRAL= -+ATH10K_THERMAL= - ATH10K_TRACING= - ATH10K_DFS_CERTIFIED= - WCN36XX= diff --git a/package/kernel/mac80211/patches/ath10k/921-ath10k_init_devices_synchronously.patch b/package/kernel/mac80211/patches/ath10k/921-ath10k_init_devices_synchronously.patch deleted file mode 100644 index dd9e0069c3..0000000000 --- a/package/kernel/mac80211/patches/ath10k/921-ath10k_init_devices_synchronously.patch +++ /dev/null @@ -1,33 +0,0 @@ -From: Sven Eckelmann -Date: Tue, 18 Nov 2014 12:29:28 +0100 -Subject: [PATCH] ath10k: Don't initialize devices asynchronously - -libreCMC requires all PHYs to be initialized to create the configuration files -during bootup. ath10k violates this because it delays the creation of the PHY -to a not well defined point in the future. - -Forcing the work to be done immediately works around this problem but may also -delay the boot when firmware images cannot be found. - -Signed-off-by: Sven Eckelmann ---- - ---- a/drivers/net/wireless/ath/ath10k/core.c -+++ b/drivers/net/wireless/ath/ath10k/core.c -@@ -3516,6 +3516,16 @@ int ath10k_core_register(struct ath10k * - - queue_work(ar->workqueue, &ar->register_work); - -+ /* libreCMC requires all PHYs to be initialized to create the -+ * configuration files during bootup. ath10k violates this -+ * because it delays the creation of the PHY to a not well defined -+ * point in the future. -+ * -+ * Forcing the work to be done immediately works around this problem -+ * but may also delay the boot when firmware images cannot be found. -+ */ -+ flush_workqueue(ar->workqueue); -+ - return 0; - } - EXPORT_SYMBOL(ath10k_core_register); diff --git a/package/kernel/mac80211/patches/ath10k/930-ath10k_add_tpt_led_trigger.patch b/package/kernel/mac80211/patches/ath10k/930-ath10k_add_tpt_led_trigger.patch deleted file mode 100644 index e8beed17e8..0000000000 --- a/package/kernel/mac80211/patches/ath10k/930-ath10k_add_tpt_led_trigger.patch +++ /dev/null @@ -1,37 +0,0 @@ ---- a/drivers/net/wireless/ath/ath10k/mac.c -+++ b/drivers/net/wireless/ath/ath10k/mac.c -@@ -9909,6 +9909,21 @@ static int ath10k_mac_init_rd(struct ath - return 0; - } - -+#ifdef CPTCFG_MAC80211_LEDS -+static const struct ieee80211_tpt_blink ath10k_tpt_blink[] = { -+ { .throughput = 0 * 1024, .blink_time = 334 }, -+ { .throughput = 1 * 1024, .blink_time = 260 }, -+ { .throughput = 2 * 1024, .blink_time = 220 }, -+ { .throughput = 5 * 1024, .blink_time = 190 }, -+ { .throughput = 10 * 1024, .blink_time = 170 }, -+ { .throughput = 25 * 1024, .blink_time = 150 }, -+ { .throughput = 54 * 1024, .blink_time = 130 }, -+ { .throughput = 120 * 1024, .blink_time = 110 }, -+ { .throughput = 265 * 1024, .blink_time = 80 }, -+ { .throughput = 586 * 1024, .blink_time = 50 }, -+}; -+#endif -+ - int ath10k_mac_register(struct ath10k *ar) - { - static const u32 cipher_suites[] = { -@@ -10267,6 +10282,12 @@ int ath10k_mac_register(struct ath10k *a - - ar->hw->weight_multiplier = ATH10K_AIRTIME_WEIGHT_MULTIPLIER; - -+#ifdef CPTCFG_MAC80211_LEDS -+ ieee80211_create_tpt_led_trigger(ar->hw, -+ IEEE80211_TPT_LEDTRIG_FL_RADIO, ath10k_tpt_blink, -+ ARRAY_SIZE(ath10k_tpt_blink)); -+#endif -+ - ret = ieee80211_register_hw(ar->hw); - if (ret) { - ath10k_err(ar, "failed to register ieee80211: %d\n", ret); diff --git a/package/kernel/mac80211/patches/ath10k/974-ath10k_add-LED-and-GPIO-controlling-support-for-various-chipsets.patch b/package/kernel/mac80211/patches/ath10k/974-ath10k_add-LED-and-GPIO-controlling-support-for-various-chipsets.patch deleted file mode 100644 index 1c1630c051..0000000000 --- a/package/kernel/mac80211/patches/ath10k/974-ath10k_add-LED-and-GPIO-controlling-support-for-various-chipsets.patch +++ /dev/null @@ -1,609 +0,0 @@ -From: Sebastian Gottschall - -Adds LED and GPIO Control support for 988x, 9887, 9888, 99x0, 9984 based -chipsets with on chipset connected led's using WMI Firmware API. The LED -device will get available named as "ath10k-phyX" at sysfs and can be controlled -with various triggers. adds also debugfs interface for gpio control. - -This patch is specific for OpenWRt base, as is use old backported package -with old wireless source. Support for QCA9984 is removed and a simbol -is added to local-simbol file to export the actually compile the code -with the ATH10K_LEDS simbol. - - -Signed-off-by: Sebastian Gottschall -Reviewed-by: Steve deRosier -[kvalo: major reorg and cleanup] -Signed-off-by: Kalle Valo -Signed-off-by: Ansuel Smith ---- - -v13: - -* only compile tested! - -* fix all checkpatch warnings - -* fix commit log - -* sizeof(struct ath10k_gpiocontrol) -> sizeof(*gpio) - -* unsigned -> unsigned int - -* remove GPIOLIB code, that should be added in a separate patch - -* rename gpio.c to leds.c - -* add leds.h - -* rename some functions: - - ath10k_attach_led() -> ath10k_leds_register() - ath10k_unregister_led() -> ath10k_leds_unregister() - ath10k_reset_led_pin() -> ath10k_leds_start() - -* call ath10k_leds_unregister() before ath10k_thermal_unregister() to preserve ordering - -* call ath10k_leds_start() only from ath10k_core_start() and not from mac.c - -* rename struct ath10k_gpiocontrol as anonymous function under struct - ath10k::leds, no need for memory allocation - -* merge ath10k_add_led() to ath10k_attach_led(), which is it's only caller - -* remove #if IS_ENABLED() checks from most of places, memory savings from those were not worth it - -* Kconfig help text improvement and move it lower in the menu, also don't enable it by default - -* switch to set_brightness_blocking() so that the callback can sleep, - then no need to use ath10k_wmi_cmd_send_nowait() and can take mutex - to access ar->state - -* don't touch ath10k_wmi_pdev_get_temperature() - -* as QCA6174/QCA9377 are not (yet) supported don't add the command to WMI-TLV interface - -* remove debugfs interface, that should be added in another patch - -* cleanup includes - - - drivers/net/wireless/ath/ath10k/Kconfig | 10 +++ - drivers/net/wireless/ath/ath10k/Makefile | 1 + - drivers/net/wireless/ath/ath10k/core.c | 22 +++++++ - drivers/net/wireless/ath/ath10k/core.h | 9 ++- - drivers/net/wireless/ath/ath10k/hw.h | 1 + - drivers/net/wireless/ath/ath10k/leds.c | 103 ++++++++++++++++++++++++++++++ - drivers/net/wireless/ath/ath10k/leds.h | 45 +++++++++++++ - drivers/net/wireless/ath/ath10k/mac.c | 1 + - drivers/net/wireless/ath/ath10k/wmi-ops.h | 32 ++++++++++ - drivers/net/wireless/ath/ath10k/wmi-tlv.c | 2 + - drivers/net/wireless/ath/ath10k/wmi.c | 54 ++++++++++++++++ - drivers/net/wireless/ath/ath10k/wmi.h | 35 ++++++++++ - 12 files changed, 314 insertions(+), 1 deletion(-) - create mode 100644 drivers/net/wireless/ath/ath10k/leds.c - create mode 100644 drivers/net/wireless/ath/ath10k/leds.h ---- a/drivers/net/wireless/ath/ath10k/Kconfig -+++ b/drivers/net/wireless/ath/ath10k/Kconfig -@@ -71,6 +71,16 @@ config ATH10K_DEBUGFS - - If unsure, say Y to make it easier to debug problems. - -+config ATH10K_LEDS -+ bool "Atheros ath10k LED support" -+ depends on ATH10K -+ select MAC80211_LEDS -+ select LEDS_CLASS -+ select NEW_LEDS -+ default y -+ ---help--- -+ This option is necessary, if you want LED support for chipset connected led pins. If unsure, say N. -+ - config ATH10K_SPECTRAL - bool "Atheros ath10k spectral scan support" - depends on ATH10K_DEBUGFS ---- a/drivers/net/wireless/ath/ath10k/Makefile -+++ b/drivers/net/wireless/ath/ath10k/Makefile -@@ -19,6 +19,7 @@ ath10k_core-$(CPTCFG_ATH10K_SPECTRAL) += - ath10k_core-$(CPTCFG_NL80211_TESTMODE) += testmode.o - ath10k_core-$(CPTCFG_ATH10K_TRACING) += trace.o - ath10k_core-$(CPTCFG_ATH10K_THERMAL) += thermal.o -+ath10k_core-$(CPTCFG_ATH10K_LEDS) += leds.o - ath10k_core-$(CPTCFG_MAC80211_DEBUGFS) += debugfs_sta.o - ath10k_core-$(CONFIG_PM) += wow.o - ath10k_core-$(CONFIG_DEV_COREDUMP) += coredump.o ---- a/local-symbols -+++ b/local-symbols -@@ -162,6 +162,7 @@ ATH10K_DEBUG= - ATH10K_DEBUGFS= - ATH10K_SPECTRAL= - ATH10K_THERMAL= -+ATH10K_LEDS= - ATH10K_TRACING= - ATH10K_DFS_CERTIFIED= - WCN36XX= ---- a/drivers/net/wireless/ath/ath10k/core.c -+++ b/drivers/net/wireless/ath/ath10k/core.c -@@ -26,6 +26,7 @@ - #include "testmode.h" - #include "wmi-ops.h" - #include "coredump.h" -+#include "leds.h" - - unsigned int ath10k_debug_mask; - EXPORT_SYMBOL(ath10k_debug_mask); -@@ -65,6 +66,7 @@ static const struct ath10k_hw_params ath - .dev_id = QCA988X_2_0_DEVICE_ID, - .bus = ATH10K_BUS_PCI, - .name = "qca988x hw2.0", -+ .led_pin = 1, - .patch_load_addr = QCA988X_HW_2_0_PATCH_LOAD_ADDR, - .uart_pin = 7, - .cc_wraparound_type = ATH10K_HW_CC_WRAP_SHIFTED_ALL, -@@ -146,6 +148,7 @@ static const struct ath10k_hw_params ath - .dev_id = QCA9887_1_0_DEVICE_ID, - .bus = ATH10K_BUS_PCI, - .name = "qca9887 hw1.0", -+ .led_pin = 1, - .patch_load_addr = QCA9887_HW_1_0_PATCH_LOAD_ADDR, - .uart_pin = 7, - .cc_wraparound_type = ATH10K_HW_CC_WRAP_SHIFTED_ALL, -@@ -387,6 +390,7 @@ static const struct ath10k_hw_params ath - .dev_id = QCA99X0_2_0_DEVICE_ID, - .bus = ATH10K_BUS_PCI, - .name = "qca99x0 hw2.0", -+ .led_pin = 17, - .patch_load_addr = QCA99X0_HW_2_0_PATCH_LOAD_ADDR, - .uart_pin = 7, - .otp_exe_param = 0x00000700, -@@ -433,6 +437,7 @@ static const struct ath10k_hw_params ath - .dev_id = QCA9984_1_0_DEVICE_ID, - .bus = ATH10K_BUS_PCI, - .name = "qca9984/qca9994 hw1.0", -+ .led_pin = 17, - .patch_load_addr = QCA9984_HW_1_0_PATCH_LOAD_ADDR, - .uart_pin = 7, - .cc_wraparound_type = ATH10K_HW_CC_WRAP_SHIFTED_EACH, -@@ -486,6 +491,7 @@ static const struct ath10k_hw_params ath - .dev_id = QCA9888_2_0_DEVICE_ID, - .bus = ATH10K_BUS_PCI, - .name = "qca9888 hw2.0", -+ .led_pin = 17, - .patch_load_addr = QCA9888_HW_2_0_PATCH_LOAD_ADDR, - .uart_pin = 7, - .cc_wraparound_type = ATH10K_HW_CC_WRAP_SHIFTED_EACH, -@@ -3231,6 +3237,10 @@ int ath10k_core_start(struct ath10k *ar, - goto err_hif_stop; - } - -+ status = ath10k_leds_start(ar); -+ if (status) -+ goto err_hif_stop; -+ - return 0; - - err_hif_stop: -@@ -3489,9 +3499,18 @@ static void ath10k_core_register_work(st - goto err_spectral_destroy; - } - -+ status = ath10k_leds_register(ar); -+ if (status) { -+ ath10k_err(ar, "could not register leds: %d\n", -+ status); -+ goto err_thermal_unregister; -+ } -+ - set_bit(ATH10K_FLAG_CORE_REGISTERED, &ar->dev_flags); - return; - -+err_thermal_unregister: -+ ath10k_thermal_unregister(ar); - err_spectral_destroy: - ath10k_spectral_destroy(ar); - err_debug_destroy: -@@ -3537,6 +3556,8 @@ void ath10k_core_unregister(struct ath10 - if (!test_bit(ATH10K_FLAG_CORE_REGISTERED, &ar->dev_flags)) - return; - -+ ath10k_leds_unregister(ar); -+ - ath10k_thermal_unregister(ar); - /* Stop spectral before unregistering from mac80211 to remove the - * relayfs debugfs file cleanly. Otherwise the parent debugfs tree ---- a/drivers/net/wireless/ath/ath10k/core.h -+++ b/drivers/net/wireless/ath/ath10k/core.h -@@ -14,6 +14,7 @@ - #include - #include - #include -+#include - - #include "htt.h" - #include "htc.h" -@@ -1253,6 +1254,13 @@ struct ath10k { - } testmode; - - struct { -+ struct gpio_led wifi_led; -+ struct led_classdev cdev; -+ char label[48]; -+ u32 gpio_state_pin; -+ } leds; -+ -+ struct { - /* protected by data_lock */ - u32 rx_crc_err_drop; - u32 fw_crash_counter; ---- a/drivers/net/wireless/ath/ath10k/hw.h -+++ b/drivers/net/wireless/ath/ath10k/hw.h -@@ -519,6 +519,7 @@ struct ath10k_hw_params { - const char *name; - u32 patch_load_addr; - int uart_pin; -+ int led_pin; - u32 otp_exe_param; - - /* Type of hw cycle counter wraparound logic, for more info ---- /dev/null -+++ b/drivers/net/wireless/ath/ath10k/leds.c -@@ -0,0 +1,103 @@ -+/* -+ * Copyright (c) 2005-2011 Atheros Communications Inc. -+ * Copyright (c) 2011-2017 Qualcomm Atheros, Inc. -+ * Copyright (c) 2018 Sebastian Gottschall -+ * Copyright (c) 2018, The Linux Foundation. All rights reserved. -+ * -+ * Permission to use, copy, modify, and/or distribute this software for any -+ * purpose with or without fee is hereby granted, provided that the above -+ * copyright notice and this permission notice appear in all copies. -+ * -+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -+ */ -+ -+#include -+ -+#include "core.h" -+#include "wmi.h" -+#include "wmi-ops.h" -+ -+#include "leds.h" -+ -+static int ath10k_leds_set_brightness_blocking(struct led_classdev *led_cdev, -+ enum led_brightness brightness) -+{ -+ struct ath10k *ar = container_of(led_cdev, struct ath10k, -+ leds.cdev); -+ struct gpio_led *led = &ar->leds.wifi_led; -+ -+ mutex_lock(&ar->conf_mutex); -+ -+ if (ar->state != ATH10K_STATE_ON) -+ goto out; -+ -+ ar->leds.gpio_state_pin = (brightness != LED_OFF) ^ led->active_low; -+ ath10k_wmi_gpio_output(ar, led->gpio, ar->leds.gpio_state_pin); -+ -+out: -+ mutex_unlock(&ar->conf_mutex); -+ -+ return 0; -+} -+ -+int ath10k_leds_start(struct ath10k *ar) -+{ -+ if (ar->hw_params.led_pin == 0) -+ /* leds not supported */ -+ return 0; -+ -+ /* under some circumstances, the gpio pin gets reconfigured -+ * to default state by the firmware, so we need to -+ * reconfigure it this behaviour has only ben seen on -+ * QCA9984 and QCA99XX devices so far -+ */ -+ ath10k_wmi_gpio_config(ar, ar->hw_params.led_pin, 0, -+ WMI_GPIO_PULL_NONE, WMI_GPIO_INTTYPE_DISABLE); -+ ath10k_wmi_gpio_output(ar, ar->hw_params.led_pin, 1); -+ -+ return 0; -+} -+ -+int ath10k_leds_register(struct ath10k *ar) -+{ -+ int ret; -+ -+ if (ar->hw_params.led_pin == 0) -+ /* leds not supported */ -+ return 0; -+ -+ snprintf(ar->leds.label, sizeof(ar->leds.label), "ath10k-%s", -+ wiphy_name(ar->hw->wiphy)); -+ ar->leds.wifi_led.active_low = 1; -+ ar->leds.wifi_led.gpio = ar->hw_params.led_pin; -+ ar->leds.wifi_led.name = ar->leds.label; -+ ar->leds.wifi_led.default_state = LEDS_GPIO_DEFSTATE_KEEP; -+ -+ ar->leds.cdev.name = ar->leds.label; -+ ar->leds.cdev.brightness_set_blocking = ath10k_leds_set_brightness_blocking; -+ -+ /* FIXME: this assignment doesn't make sense as it's NULL, remove it? */ -+ ar->leds.cdev.default_trigger = ar->leds.wifi_led.default_trigger; -+ -+ ret = led_classdev_register(wiphy_dev(ar->hw->wiphy), &ar->leds.cdev); -+ if (ret) -+ return ret; -+ -+ return 0; -+} -+ -+void ath10k_leds_unregister(struct ath10k *ar) -+{ -+ if (ar->hw_params.led_pin == 0) -+ /* leds not supported */ -+ return; -+ -+ led_classdev_unregister(&ar->leds.cdev); -+} -+ ---- /dev/null -+++ b/drivers/net/wireless/ath/ath10k/leds.h -@@ -0,0 +1,41 @@ -+/* -+ * Copyright (c) 2018, The Linux Foundation. All rights reserved. -+ * -+ * Permission to use, copy, modify, and/or distribute this software for any -+ * purpose with or without fee is hereby granted, provided that the above -+ * copyright notice and this permission notice appear in all copies. -+ * -+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -+ */ -+#ifndef _LEDS_H_ -+#define _LEDS_H_ -+ -+#include "core.h" -+ -+#ifdef CPTCFG_ATH10K_LEDS -+void ath10k_leds_unregister(struct ath10k *ar); -+int ath10k_leds_start(struct ath10k *ar); -+int ath10k_leds_register(struct ath10k *ar); -+#else -+static inline void ath10k_leds_unregister(struct ath10k *ar) -+{ -+} -+ -+static inline int ath10k_leds_start(struct ath10k *ar) -+{ -+ return 0; -+} -+ -+static inline int ath10k_leds_register(struct ath10k *ar) -+{ -+ return 0; -+} -+ -+#endif -+#endif /* _LEDS_H_ */ ---- a/drivers/net/wireless/ath/ath10k/mac.c -+++ b/drivers/net/wireless/ath/ath10k/mac.c -@@ -24,6 +24,7 @@ - #include "wmi-tlv.h" - #include "wmi-ops.h" - #include "wow.h" -+#include "leds.h" - - /*********/ - /* Rates */ ---- a/drivers/net/wireless/ath/ath10k/wmi-ops.h -+++ b/drivers/net/wireless/ath/ath10k/wmi-ops.h -@@ -226,7 +226,10 @@ struct wmi_ops { - const struct wmi_bb_timing_cfg_arg *arg); - struct sk_buff *(*gen_per_peer_per_tid_cfg)(struct ath10k *ar, - const struct wmi_per_peer_per_tid_cfg_arg *arg); -+ struct sk_buff *(*gen_gpio_config)(struct ath10k *ar, u32 gpio_num, -+ u32 input, u32 pull_type, u32 intr_mode); - -+ struct sk_buff *(*gen_gpio_output)(struct ath10k *ar, u32 gpio_num, u32 set); - }; - - int ath10k_wmi_cmd_send(struct ath10k *ar, struct sk_buff *skb, u32 cmd_id); -@@ -1122,6 +1125,35 @@ ath10k_wmi_force_fw_hang(struct ath10k * - return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->force_fw_hang_cmdid); - } - -+static inline int ath10k_wmi_gpio_config(struct ath10k *ar, u32 gpio_num, -+ u32 input, u32 pull_type, u32 intr_mode) -+{ -+ struct sk_buff *skb; -+ -+ if (!ar->wmi.ops->gen_gpio_config) -+ return -EOPNOTSUPP; -+ -+ skb = ar->wmi.ops->gen_gpio_config(ar, gpio_num, input, pull_type, intr_mode); -+ if (IS_ERR(skb)) -+ return PTR_ERR(skb); -+ -+ return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->gpio_config_cmdid); -+} -+ -+static inline int ath10k_wmi_gpio_output(struct ath10k *ar, u32 gpio_num, u32 set) -+{ -+ struct sk_buff *skb; -+ -+ if (!ar->wmi.ops->gen_gpio_config) -+ return -EOPNOTSUPP; -+ -+ skb = ar->wmi.ops->gen_gpio_output(ar, gpio_num, set); -+ if (IS_ERR(skb)) -+ return PTR_ERR(skb); -+ -+ return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->gpio_output_cmdid); -+} -+ - static inline int - ath10k_wmi_dbglog_cfg(struct ath10k *ar, u64 module_enable, u32 log_level) - { ---- a/drivers/net/wireless/ath/ath10k/wmi-tlv.c -+++ b/drivers/net/wireless/ath/ath10k/wmi-tlv.c -@@ -4594,6 +4594,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, -+ /* .gen_gpio_config not implemented */ -+ /* .gen_gpio_output not implemented */ - }; - - 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 -@@ -7472,6 +7472,49 @@ ath10k_wmi_op_gen_peer_set_param(struct - return skb; - } - -+static struct sk_buff *ath10k_wmi_op_gen_gpio_config(struct ath10k *ar, -+ u32 gpio_num, u32 input, -+ u32 pull_type, u32 intr_mode) -+{ -+ struct wmi_gpio_config_cmd *cmd; -+ struct sk_buff *skb; -+ -+ skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); -+ if (!skb) -+ return ERR_PTR(-ENOMEM); -+ -+ cmd = (struct wmi_gpio_config_cmd *)skb->data; -+ cmd->pull_type = __cpu_to_le32(pull_type); -+ cmd->gpio_num = __cpu_to_le32(gpio_num); -+ cmd->input = __cpu_to_le32(input); -+ cmd->intr_mode = __cpu_to_le32(intr_mode); -+ -+ ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi gpio_config gpio_num 0x%08x input 0x%08x pull_type 0x%08x intr_mode 0x%08x\n", -+ gpio_num, input, pull_type, intr_mode); -+ -+ return skb; -+} -+ -+static struct sk_buff *ath10k_wmi_op_gen_gpio_output(struct ath10k *ar, -+ u32 gpio_num, u32 set) -+{ -+ struct wmi_gpio_output_cmd *cmd; -+ struct sk_buff *skb; -+ -+ skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); -+ if (!skb) -+ return ERR_PTR(-ENOMEM); -+ -+ cmd = (struct wmi_gpio_output_cmd *)skb->data; -+ cmd->gpio_num = __cpu_to_le32(gpio_num); -+ cmd->set = __cpu_to_le32(set); -+ -+ ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi gpio_output gpio_num 0x%08x set 0x%08x\n", -+ gpio_num, set); -+ -+ return skb; -+} -+ - static struct sk_buff * - ath10k_wmi_op_gen_set_psmode(struct ath10k *ar, u32 vdev_id, - enum wmi_sta_ps_mode psmode) -@@ -9160,6 +9203,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_gpio_config = ath10k_wmi_op_gen_gpio_config, -+ .gen_gpio_output = ath10k_wmi_op_gen_gpio_output, -+ - /* .gen_bcn_tmpl not implemented */ - /* .gen_prb_tmpl not implemented */ - /* .gen_p2p_go_bcn_ie not implemented */ -@@ -9230,6 +9276,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_gpio_config = ath10k_wmi_op_gen_gpio_config, -+ .gen_gpio_output = ath10k_wmi_op_gen_gpio_output, - /* .gen_bcn_tmpl not implemented */ - /* .gen_prb_tmpl not implemented */ - /* .gen_p2p_go_bcn_ie not implemented */ -@@ -9302,6 +9350,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_gpio_config = ath10k_wmi_op_gen_gpio_config, -+ .gen_gpio_output = ath10k_wmi_op_gen_gpio_output, - /* .gen_pdev_enable_adaptive_cca not implemented */ - }; - -@@ -9373,6 +9423,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_gpio_config = ath10k_wmi_op_gen_gpio_config, -+ .gen_gpio_output = ath10k_wmi_op_gen_gpio_output, - /* .gen_bcn_tmpl not implemented */ - /* .gen_prb_tmpl not implemented */ - /* .gen_p2p_go_bcn_ie not implemented */ -@@ -9454,6 +9506,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, -+ .gen_gpio_config = ath10k_wmi_op_gen_gpio_config, -+ .gen_gpio_output = ath10k_wmi_op_gen_gpio_output, - }; - - int ath10k_wmi_attach(struct ath10k *ar) ---- a/drivers/net/wireless/ath/ath10k/wmi.h -+++ b/drivers/net/wireless/ath/ath10k/wmi.h -@@ -3030,6 +3030,41 @@ enum wmi_10_4_feature_mask { - - }; - -+/* WMI_GPIO_CONFIG_CMDID */ -+enum { -+ WMI_GPIO_PULL_NONE, -+ WMI_GPIO_PULL_UP, -+ WMI_GPIO_PULL_DOWN, -+}; -+ -+enum { -+ WMI_GPIO_INTTYPE_DISABLE, -+ WMI_GPIO_INTTYPE_RISING_EDGE, -+ WMI_GPIO_INTTYPE_FALLING_EDGE, -+ WMI_GPIO_INTTYPE_BOTH_EDGE, -+ WMI_GPIO_INTTYPE_LEVEL_LOW, -+ WMI_GPIO_INTTYPE_LEVEL_HIGH -+}; -+ -+/* WMI_GPIO_CONFIG_CMDID */ -+struct wmi_gpio_config_cmd { -+ __le32 gpio_num; /* GPIO number to be setup */ -+ __le32 input; /* 0 - Output/ 1 - Input */ -+ __le32 pull_type; /* Pull type defined above */ -+ __le32 intr_mode; /* Interrupt mode defined above (Input) */ -+} __packed; -+ -+/* WMI_GPIO_OUTPUT_CMDID */ -+struct wmi_gpio_output_cmd { -+ __le32 gpio_num; /* GPIO number to be setup */ -+ __le32 set; /* Set the GPIO pin*/ -+} __packed; -+ -+/* WMI_GPIO_INPUT_EVENTID */ -+struct wmi_gpio_input_event { -+ __le32 gpio_num; /* GPIO number which changed state */ -+} __packed; -+ - struct wmi_ext_resource_config_10_4_cmd { - /* contains enum wmi_host_platform_type */ - __le32 host_platform_config; diff --git a/package/kernel/mac80211/patches/ath10k/975-ath10k-use-tpt-trigger-by-default.patch b/package/kernel/mac80211/patches/ath10k/975-ath10k-use-tpt-trigger-by-default.patch deleted file mode 100644 index 4c1f9aa815..0000000000 --- a/package/kernel/mac80211/patches/ath10k/975-ath10k-use-tpt-trigger-by-default.patch +++ /dev/null @@ -1,53 +0,0 @@ -From 79c9d7aabae1d1da9eea97d83b61e1517a8a2221 Mon Sep 17 00:00:00 2001 -From: Mathias Kresin -Date: Fri, 22 Jun 2018 18:59:44 +0200 -Subject: [PATCH] ath10k: use tpt LED trigger by default - -Use the tpt LED trigger for each created phy led. Ths way LEDs attached -to the ath10k GPIO pins are indicating the phy status and blink on -traffic. - -Signed-off-by: Mathias Kresin ---- - drivers/net/wireless/ath/ath10k/core.h | 4 ++++ - drivers/net/wireless/ath/ath10k/leds.c | 4 +--- - drivers/net/wireless/ath/ath10k/mac.c | 2 +- - 3 files changed, 6 insertions(+), 4 deletions(-) - ---- a/drivers/net/wireless/ath/ath10k/core.h -+++ b/drivers/net/wireless/ath/ath10k/core.h -@@ -1309,6 +1309,10 @@ struct ath10k { - s32 tx_power_2g_limit; - s32 tx_power_5g_limit; - -+#ifdef CPTCFG_MAC80211_LEDS -+ const char *led_default_trigger; -+#endif -+ - /* must be last */ - u8 drv_priv[] __aligned(sizeof(void *)); - }; ---- a/drivers/net/wireless/ath/ath10k/leds.c -+++ b/drivers/net/wireless/ath/ath10k/leds.c -@@ -81,9 +81,7 @@ int ath10k_leds_register(struct ath10k * - - ar->leds.cdev.name = ar->leds.label; - ar->leds.cdev.brightness_set_blocking = ath10k_leds_set_brightness_blocking; -- -- /* FIXME: this assignment doesn't make sense as it's NULL, remove it? */ -- ar->leds.cdev.default_trigger = ar->leds.wifi_led.default_trigger; -+ ar->leds.cdev.default_trigger = ar->led_default_trigger; - - ret = led_classdev_register(wiphy_dev(ar->hw->wiphy), &ar->leds.cdev); - if (ret) ---- a/drivers/net/wireless/ath/ath10k/mac.c -+++ b/drivers/net/wireless/ath/ath10k/mac.c -@@ -10284,7 +10284,7 @@ int ath10k_mac_register(struct ath10k *a - ar->hw->weight_multiplier = ATH10K_AIRTIME_WEIGHT_MULTIPLIER; - - #ifdef CPTCFG_MAC80211_LEDS -- ieee80211_create_tpt_led_trigger(ar->hw, -+ ar->led_default_trigger = ieee80211_create_tpt_led_trigger(ar->hw, - IEEE80211_TPT_LEDTRIG_FL_RADIO, ath10k_tpt_blink, - ARRAY_SIZE(ath10k_tpt_blink)); - #endif diff --git a/package/kernel/mac80211/patches/ath10k/981-ath10k-adjust-tx-power-reduction-for-US-regulatory-d.patch b/package/kernel/mac80211/patches/ath10k/981-ath10k-adjust-tx-power-reduction-for-US-regulatory-d.patch deleted file mode 100644 index 3626debf19..0000000000 --- a/package/kernel/mac80211/patches/ath10k/981-ath10k-adjust-tx-power-reduction-for-US-regulatory-d.patch +++ /dev/null @@ -1,101 +0,0 @@ -From: Sven Eckelmann -Date: Wed, 28 Nov 2018 16:16:27 +0100 -Subject: ath10k: adjust tx power reduction for US regulatory domain - -FCC allows maximum antenna gain of 6 dBi. 15.247(b)(4): - -> (4) The conducted output power limit -> specified in paragraph (b) of this section -> is based on the use of antennas -> with directional gains that do not exceed -> 6 dBi. Except as shown in paragraph -> (c) of this section, if transmitting -> antennas of directional gain greater -> than 6 dBi are used, the conducted -> output power from the intentional radiator -> shall be reduced below the stated -> values in paragraphs (b)(1), (b)(2), -> and (b)(3) of this section, as appropriate, -> by the amount in dB that the -> directional gain of the antenna exceeds -> 6 dBi. - -https://www.gpo.gov/fdsys/pkg/CFR-2013-title47-vol1/pdf/CFR-2013-title47-vol1-sec15-247.pdf - -Signed-off-by: Sven Eckelmann - -Forwarded: no - ---- a/drivers/net/wireless/ath/ath10k/mac.c -+++ b/drivers/net/wireless/ath/ath10k/mac.c -@@ -1028,6 +1028,40 @@ static inline int ath10k_vdev_setup_sync - return ar->last_wmi_vdev_start_status; - } - -+static u32 ath10k_get_max_antenna_gain(struct ath10k *ar, -+ u32 ch_max_antenna_gain) -+{ -+ u32 max_antenna_gain; -+ -+ if (ar->dfs_detector && ar->dfs_detector->region == NL80211_DFS_FCC) { -+ /* FCC allows maximum antenna gain of 6 dBi. 15.247(b)(4): -+ * -+ * > (4) The conducted output power limit -+ * > specified in paragraph (b) of this section -+ * > is based on the use of antennas -+ * > with directional gains that do not exceed -+ * > 6 dBi. Except as shown in paragraph -+ * > (c) of this section, if transmitting -+ * > antennas of directional gain greater -+ * > than 6 dBi are used, the conducted -+ * > output power from the intentional radiator -+ * > shall be reduced below the stated -+ * > values in paragraphs (b)(1), (b)(2), -+ * > and (b)(3) of this section, as appropriate, -+ * > by the amount in dB that the -+ * > directional gain of the antenna exceeds -+ * > 6 dBi. -+ * -+ * https://www.gpo.gov/fdsys/pkg/CFR-2013-title47-vol1/pdf/CFR-2013-title47-vol1-sec15-247.pdf -+ */ -+ max_antenna_gain = 6; -+ } else { -+ max_antenna_gain = 0; -+ } -+ -+ return max(ch_max_antenna_gain, max_antenna_gain); -+} -+ - static int ath10k_monitor_vdev_start(struct ath10k *ar, int vdev_id) - { - struct cfg80211_chan_def *chandef = NULL; -@@ -1060,7 +1094,8 @@ static int ath10k_monitor_vdev_start(str - arg.channel.min_power = 0; - arg.channel.max_power = channel->max_power * 2; - arg.channel.max_reg_power = channel->max_reg_power * 2; -- arg.channel.max_antenna_gain = channel->max_antenna_gain; -+ arg.channel.max_antenna_gain = ath10k_get_max_antenna_gain(ar, -+ channel->max_antenna_gain); - - reinit_completion(&ar->vdev_setup_done); - reinit_completion(&ar->vdev_delete_done); -@@ -1506,7 +1541,8 @@ static int ath10k_vdev_start_restart(str - arg.channel.min_power = 0; - arg.channel.max_power = chandef->chan->max_power * 2; - arg.channel.max_reg_power = chandef->chan->max_reg_power * 2; -- arg.channel.max_antenna_gain = chandef->chan->max_antenna_gain; -+ arg.channel.max_antenna_gain = ath10k_get_max_antenna_gain(ar, -+ chandef->chan->max_antenna_gain); - - if (arvif->vdev_type == WMI_VDEV_TYPE_AP) { - arg.ssid = arvif->u.ap.ssid; -@@ -3437,7 +3473,8 @@ static int ath10k_update_channel_list(st - ch->min_power = 0; - ch->max_power = channel->max_power * 2; - ch->max_reg_power = channel->max_reg_power * 2; -- ch->max_antenna_gain = channel->max_antenna_gain; -+ ch->max_antenna_gain = ath10k_get_max_antenna_gain(ar, -+ channel->max_antenna_gain); - ch->reg_class_id = 0; /* FIXME */ - - /* FIXME: why use only legacy modes, why not any diff --git a/package/kernel/mac80211/patches/ath10k/984-ath10k-Try-to-get-mac-address-from-dts.patch b/package/kernel/mac80211/patches/ath10k/984-ath10k-Try-to-get-mac-address-from-dts.patch deleted file mode 100644 index 084e28a2d9..0000000000 --- a/package/kernel/mac80211/patches/ath10k/984-ath10k-Try-to-get-mac-address-from-dts.patch +++ /dev/null @@ -1,37 +0,0 @@ -From 22fb5991a44c78ff18ec0082dc90c809356eb893 Mon Sep 17 00:00:00 2001 -From: Ansuel Smith -Date: Sun, 27 Sep 2020 19:23:35 +0200 -Subject: [PATCH 1/2] ath10k: Try to get mac-address from dts - -Most of embedded device that have the ath10k wifi integrated store the -mac-address in nvmem partitions. Try to fetch the mac-address using the -standard 'of_get_mac_address' than in all the check also try to fetch the -address using the nvmem api searching for a defined 'mac-address' cell. -Mac-address defined in the dts have priority than any other address found. - -Tested-on: QCA9984 hw1.0 PCI 10.4 - -Signed-off-by: Ansuel Smith ---- - drivers/net/wireless/ath/ath10k/core.c | 10 ++++++++++ - 1 file changed, 10 insertions(+) - ---- a/drivers/net/wireless/ath/ath10k/core.c -+++ b/drivers/net/wireless/ath/ath10k/core.c -@@ -8,6 +8,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -3407,6 +3408,8 @@ static int ath10k_core_probe_fw(struct a - - device_get_mac_address(ar->dev, ar->mac_addr); - -+ of_get_mac_address(ar->dev->of_node, ar->mac_addr); -+ - ret = ath10k_core_init_firmware_features(ar); - if (ret) { - ath10k_err(ar, "fatal problem with firmware features: %d\n", diff --git a/package/kernel/mac80211/patches/ath10k/988-ath10k-always-use-mac80211-loss-detection.patch b/package/kernel/mac80211/patches/ath10k/988-ath10k-always-use-mac80211-loss-detection.patch deleted file mode 100644 index f025fea63b..0000000000 --- a/package/kernel/mac80211/patches/ath10k/988-ath10k-always-use-mac80211-loss-detection.patch +++ /dev/null @@ -1,28 +0,0 @@ -From f7d6edafe4358e3880a26775cfde4cd5c71ba063 Mon Sep 17 00:00:00 2001 -From: David Bauer -Date: Wed, 5 Jul 2023 01:30:29 +0200 -Subject: [PATCH] ath10k: always use mac80211 loss detection - -ath10k does not report excessive loss in case of broken block-ack -sessions. The loss is communicated to the host-os, but ath10k does not -trigger a low-ack events by itself. - -The mac80211 framework for loss detection however detects this -circumstance well in case of ath10k. So use it regardless of ath10k's -own loss detection mechanism. - -Signed-off-by: David Bauer ---- - drivers/net/wireless/ath/ath10k/mac.c | 1 - - 1 file changed, 1 deletion(-) - ---- a/drivers/net/wireless/ath/ath10k/mac.c -+++ b/drivers/net/wireless/ath/ath10k/mac.c -@@ -10080,7 +10080,6 @@ int ath10k_mac_register(struct ath10k *a - ieee80211_hw_set(ar->hw, CHANCTX_STA_CSA); - ieee80211_hw_set(ar->hw, QUEUE_CONTROL); - ieee80211_hw_set(ar->hw, SUPPORTS_TX_FRAG); -- ieee80211_hw_set(ar->hw, REPORTS_LOW_ACK); - - if (!test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags)) - ieee80211_hw_set(ar->hw, SW_CRYPTO_CONTROL); diff --git a/package/kernel/mac80211/patches/ath10k/990-ath10k-small-buffers.patch b/package/kernel/mac80211/patches/ath10k/990-ath10k-small-buffers.patch deleted file mode 100644 index 2f560c70a0..0000000000 --- a/package/kernel/mac80211/patches/ath10k/990-ath10k-small-buffers.patch +++ /dev/null @@ -1,64 +0,0 @@ ---- a/drivers/net/wireless/ath/ath10k/htt.h -+++ b/drivers/net/wireless/ath/ath10k/htt.h -@@ -235,7 +235,11 @@ enum htt_rx_ring_flags { - }; - - #define HTT_RX_RING_SIZE_MIN 128 -+#ifndef CONFIG_ATH10K_SMALLBUFFERS - #define HTT_RX_RING_SIZE_MAX 2048 -+#else -+#define HTT_RX_RING_SIZE_MAX 512 -+#endif - #define HTT_RX_RING_SIZE HTT_RX_RING_SIZE_MAX - #define HTT_RX_RING_FILL_LEVEL (((HTT_RX_RING_SIZE) / 2) - 1) - #define HTT_RX_RING_FILL_LEVEL_DUAL_MAC (HTT_RX_RING_SIZE - 1) ---- a/drivers/net/wireless/ath/ath10k/pci.c -+++ b/drivers/net/wireless/ath/ath10k/pci.c -@@ -131,7 +131,11 @@ static const struct ce_attr pci_host_ce_ - .flags = CE_ATTR_FLAGS, - .src_nentries = 0, - .src_sz_max = 2048, -+#ifndef CONFIG_ATH10K_SMALLBUFFERS - .dest_nentries = 512, -+#else -+ .dest_nentries = 128, -+#endif - .recv_cb = ath10k_pci_htt_htc_rx_cb, - }, - -@@ -140,7 +144,11 @@ static const struct ce_attr pci_host_ce_ - .flags = CE_ATTR_FLAGS, - .src_nentries = 0, - .src_sz_max = 2048, -+#ifndef CONFIG_ATH10K_SMALLBUFFERS - .dest_nentries = 128, -+#else -+ .dest_nentries = 64, -+#endif - .recv_cb = ath10k_pci_htc_rx_cb, - }, - -@@ -167,7 +175,11 @@ static const struct ce_attr pci_host_ce_ - .flags = CE_ATTR_FLAGS, - .src_nentries = 0, - .src_sz_max = 512, -+#ifndef CONFIG_ATH10K_SMALLBUFFERS - .dest_nentries = 512, -+#else -+ .dest_nentries = 128, -+#endif - .recv_cb = ath10k_pci_htt_rx_cb, - }, - -@@ -192,7 +204,11 @@ static const struct ce_attr pci_host_ce_ - .flags = CE_ATTR_FLAGS, - .src_nentries = 0, - .src_sz_max = 2048, -+#ifndef CONFIG_ATH10K_SMALLBUFFERS - .dest_nentries = 128, -+#else -+ .dest_nentries = 96, -+#endif - .recv_cb = ath10k_pci_pktlog_rx_cb, - }, - diff --git a/package/kernel/mac80211/patches/ath11k/0001-wifi-ath11k-stop-tx-queues-immediately-upon-firmware.patch b/package/kernel/mac80211/patches/ath11k/0001-wifi-ath11k-stop-tx-queues-immediately-upon-firmware.patch deleted file mode 100644 index d0dc04febf..0000000000 --- a/package/kernel/mac80211/patches/ath11k/0001-wifi-ath11k-stop-tx-queues-immediately-upon-firmware.patch +++ /dev/null @@ -1,78 +0,0 @@ -From 81e60b2dfb2744ab6642c4aa62534b4f711fdc5d Mon Sep 17 00:00:00 2001 -From: Aditya Kumar Singh -Date: Tue, 27 Sep 2022 09:18:54 +0300 -Subject: [PATCH] wifi: ath11k: stop tx queues immediately upon firmware exit - -Currently, recovery flag is set immediately upon firmware -exit but tx queues are stopped once firmware arrives back -and is ready which is during ath11k_core_restart. Once -ieee80211 hw restart is completed, tx queues are resumed. -If during the time delta between firmware exit and firmware -ready, mac80211 send packets, currently ath11k will drop it -since recovery flag will be set. But warning prints will -come - - "ath11k c000000.wifi: failed to transmit frame -108" - -If more tx packets are there, this could lead to flooding -of above print. - -However, actually tx queues should be stopped immediately -when firmware leaves. This will prevent packets to get -dropped when firmware is recovering. - -Add fix to stop tx queues immediately after firmware exit. - -Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.5.0.1-01100-QCAHKSWPL_SILICONZ-1 - -Signed-off-by: Aditya Kumar Singh -Signed-off-by: Kalle Valo -Link: https://lore.kernel.org/r/20220923170235.18873-1-quic_adisi@quicinc.com ---- - drivers/net/wireless/ath/ath11k/core.c | 5 +---- - drivers/net/wireless/ath/ath11k/core.h | 1 + - drivers/net/wireless/ath/ath11k/qmi.c | 3 +++ - 3 files changed, 5 insertions(+), 4 deletions(-) - ---- a/drivers/net/wireless/ath/ath11k/core.c -+++ b/drivers/net/wireless/ath/ath11k/core.c -@@ -1641,7 +1641,7 @@ static void ath11k_update_11d(struct wor - } - } - --static void ath11k_core_pre_reconfigure_recovery(struct ath11k_base *ab) -+void ath11k_core_pre_reconfigure_recovery(struct ath11k_base *ab) - { - struct ath11k *ar; - struct ath11k_pdev *pdev; -@@ -1730,9 +1730,6 @@ static void ath11k_core_restart(struct w - struct ath11k_base *ab = container_of(work, struct ath11k_base, restart_work); - int ret; - -- if (!ab->is_reset) -- ath11k_core_pre_reconfigure_recovery(ab); -- - ret = ath11k_core_reconfigure_on_crash(ab); - if (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 - 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); - - const struct firmware *ath11k_core_firmware_request(struct ath11k_base *ab, - const char *filename); ---- a/drivers/net/wireless/ath/ath11k/qmi.c -+++ b/drivers/net/wireless/ath/ath11k/qmi.c -@@ -3164,6 +3164,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); -+ -+ if (!ab->is_reset) -+ ath11k_core_pre_reconfigure_recovery(ab); - break; - case ATH11K_QMI_EVENT_REQUEST_MEM: - ret = ath11k_qmi_event_mem_request(qmi); diff --git a/package/kernel/mac80211/patches/ath11k/0002-wifi-ath11k-Don-t-exit-on-wakeup-failure.patch b/package/kernel/mac80211/patches/ath11k/0002-wifi-ath11k-Don-t-exit-on-wakeup-failure.patch deleted file mode 100644 index 47385e0458..0000000000 --- a/package/kernel/mac80211/patches/ath11k/0002-wifi-ath11k-Don-t-exit-on-wakeup-failure.patch +++ /dev/null @@ -1,45 +0,0 @@ -From 45d2e268369b0c768d5a644f319758bcfd370521 Mon Sep 17 00:00:00 2001 -From: Baochen Qiang -Date: Wed, 28 Sep 2022 09:51:40 +0800 -Subject: [PATCH] wifi: ath11k: Don't exit on wakeup failure - -Currently, ath11k_pcic_read() returns an error if wakeup() -fails, this makes firmware crash debug quite hard because we can -get nothing. - -Change to go ahead on wakeup failure, in that case we still may -get something valid to check. There should be no mislead due -to incorrect content because we are aware of the failure with the -log printed. - -Tested-on: WCN6855 hw2.0 PCI WLAN.HSP.1.1-01720.1-QCAHSPSWPL_V1_V2_SILICONZ_LITE-1 - -Signed-off-by: Baochen Qiang -Signed-off-by: Kalle Valo -Link: https://lore.kernel.org/r/20220928015140.5431-1-quic_bqiang@quicinc.com ---- - drivers/net/wireless/ath/ath11k/pcic.c | 13 ++++++++++--- - 1 file changed, 10 insertions(+), 3 deletions(-) - ---- a/drivers/net/wireless/ath/ath11k/pcic.c -+++ b/drivers/net/wireless/ath/ath11k/pcic.c -@@ -218,9 +218,16 @@ int ath11k_pcic_read(struct ath11k_base - if (wakeup_required && ab->pci.ops->wakeup) { - ret = ab->pci.ops->wakeup(ab); - if (ret) { -- ath11k_warn(ab, "failed to wakeup for read from 0x%x: %d\n", -- start, ret); -- return ret; -+ ath11k_warn(ab, -+ "wakeup failed, data may be invalid: %d", -+ ret); -+ /* Even though wakeup() failed, continue processing rather -+ * than returning because some parts of the data may still -+ * be valid and useful in some cases, e.g. could give us -+ * some clues on firmware crash. -+ * Mislead due to invalid data could be avoided because we -+ * are aware of the wakeup failure. -+ */ - } - } - diff --git a/package/kernel/mac80211/patches/ath11k/0005-wifi-ath11k-Fix-spelling-mistake-chnange-change.patch b/package/kernel/mac80211/patches/ath11k/0005-wifi-ath11k-Fix-spelling-mistake-chnange-change.patch deleted file mode 100644 index 4b52252ef3..0000000000 --- a/package/kernel/mac80211/patches/ath11k/0005-wifi-ath11k-Fix-spelling-mistake-chnange-change.patch +++ /dev/null @@ -1,25 +0,0 @@ -From a797f479bf3e02c6d179c2e6aeace7f9b22b0acd Mon Sep 17 00:00:00 2001 -From: Colin Ian King -Date: Wed, 28 Sep 2022 15:38:34 +0100 -Subject: [PATCH] wifi: ath11k: Fix spelling mistake "chnange" -> "change" - -There is a spelling mistake in an ath11k_dbg debug message. Fix it. - -Signed-off-by: Colin Ian King -Signed-off-by: Kalle Valo -Link: https://lore.kernel.org/r/20220928143834.35189-1-colin.i.king@gmail.com ---- - drivers/net/wireless/ath/ath11k/wmi.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/drivers/net/wireless/ath/ath11k/wmi.c -+++ b/drivers/net/wireless/ath/ath11k/wmi.c -@@ -6829,7 +6829,7 @@ static void ath11k_wmi_event_peer_sta_ps - } - - ath11k_dbg(ab, ATH11K_DBG_WMI, -- "peer sta ps chnange ev addr %pM state %u sup_bitmap %x ps_valid %u ts %u\n", -+ "peer sta ps change ev addr %pM state %u sup_bitmap %x ps_valid %u ts %u\n", - ev->peer_macaddr.addr, ev->peer_ps_state, - ev->ps_supported_bitmap, ev->peer_ps_valid, - ev->peer_ps_timestamp); diff --git a/package/kernel/mac80211/patches/ath11k/0007-wifi-ath11k-suppress-add-interface-error.patch b/package/kernel/mac80211/patches/ath11k/0007-wifi-ath11k-suppress-add-interface-error.patch deleted file mode 100644 index fbef0abb8d..0000000000 --- a/package/kernel/mac80211/patches/ath11k/0007-wifi-ath11k-suppress-add-interface-error.patch +++ /dev/null @@ -1,52 +0,0 @@ -From 638b26652b0438563a76ec90014c8cba34db982b Mon Sep 17 00:00:00 2001 -From: Karthikeyan Periyasamy -Date: Thu, 6 Oct 2022 06:28:42 +0530 -Subject: [PATCH 7/9] wifi: ath11k: suppress add interface error - -In the VIF (other than monitor type) creation request, we should not -throw the error code when the monitor VIF creation fails, since the -actual VIF creation succeeds. If we throw the error code from driver -then the actual VIF creation get fail. So suppress the monitor VIF -creation error by throwing warning message instead of error code. - -Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.6.0.1-00760-QCAHKSWPL_SILICONZ-1 - -Signed-off-by: Karthikeyan Periyasamy -Signed-off-by: Kalle Valo -Link: https://lore.kernel.org/r/20221006005842.8599-1-quic_periyasa@quicinc.com ---- - drivers/net/wireless/ath/ath11k/mac.c | 9 +++------ - 1 file changed, 3 insertions(+), 6 deletions(-) - ---- a/drivers/net/wireless/ath/ath11k/mac.c -+++ b/drivers/net/wireless/ath/ath11k/mac.c -@@ -6421,18 +6421,16 @@ static int ath11k_mac_op_add_interface(s - - ath11k_dp_vdev_tx_attach(ar, arvif); - -+ ath11k_debugfs_add_interface(arvif); -+ - if (vif->type != NL80211_IFTYPE_MONITOR && - test_bit(ATH11K_FLAG_MONITOR_CONF_ENABLED, &ar->monitor_flags)) { - ret = ath11k_mac_monitor_vdev_create(ar); -- if (ret) { -+ if (ret) - ath11k_warn(ar->ab, "failed to create monitor vdev during add interface: %d", - ret); -- goto err_peer_del; -- } - } - -- ath11k_debugfs_add_interface(arvif); -- - mutex_unlock(&ar->conf_mutex); - - return 0; -@@ -6457,7 +6455,6 @@ err_vdev_del: - spin_unlock_bh(&ar->data_lock); - - err: -- ath11k_debugfs_remove_interface(arvif); - mutex_unlock(&ar->conf_mutex); - - return ret; diff --git a/package/kernel/mac80211/patches/ath11k/0008-wifi-ath11k-add-support-to-configure-channel-dwell-t.patch b/package/kernel/mac80211/patches/ath11k/0008-wifi-ath11k-add-support-to-configure-channel-dwell-t.patch deleted file mode 100644 index d0b19fe59f..0000000000 --- a/package/kernel/mac80211/patches/ath11k/0008-wifi-ath11k-add-support-to-configure-channel-dwell-t.patch +++ /dev/null @@ -1,102 +0,0 @@ -From c362daa213cdeb0a9e7c2ed84849544c24505720 Mon Sep 17 00:00:00 2001 -From: Manikanta Pubbisetty -Date: Fri, 7 Oct 2022 10:41:30 +0530 -Subject: [PATCH 8/9] wifi: ath11k: add support to configure channel dwell time - -Add support to configure channel dwell time during scan. -Dwell time help to stay on the channel for a specified duration -during scan and aid userspace in finding WiFi networks. Very -useful in passive scans where longer dwell times are needed -to find the WiFi networks. - -Configure channel dwell time from duration of the scan request -received from mac80211 when the duration is non-zero. When the -scan request does not have duration value, use the default ones, -the current implementation. - -Advertise corresponding feature flag NL80211_EXT_FEATURE_SET_SCAN_DWELL -to enable the feature. - -Change is applicable for all ath11k hardware. - -Tested-on: WCN6750 hw1.0 AHB WLAN.MSL.1.0.1-00887-QCAMSLSWPLZ-1 - -Signed-off-by: Manikanta Pubbisetty -Reviewed-by: Jeff Johnson -Signed-off-by: Kalle Valo -Link: https://lore.kernel.org/r/20221007051130.6067-1-quic_mpubbise@quicinc.com ---- - drivers/net/wireless/ath/ath11k/mac.c | 33 +++++++++++++++++++++++---- - 1 file changed, 29 insertions(+), 4 deletions(-) - ---- a/drivers/net/wireless/ath/ath11k/mac.c -+++ b/drivers/net/wireless/ath/ath11k/mac.c -@@ -241,7 +241,10 @@ const struct htt_rx_ring_tlv_filter ath1 - #define ath11k_a_rates (ath11k_legacy_rates + 4) - #define ath11k_a_rates_size (ARRAY_SIZE(ath11k_legacy_rates) - 4) - --#define ATH11K_MAC_SCAN_TIMEOUT_MSECS 200 /* in msecs */ -+#define ATH11K_MAC_SCAN_CMD_EVT_OVERHEAD 200 /* in msecs */ -+ -+/* Overhead due to the processing of channel switch events from FW */ -+#define ATH11K_SCAN_CHANNEL_SWITCH_WMI_EVT_OVERHEAD 10 /* in msecs */ - - static const u32 ath11k_smps_map[] = { - [WLAN_HT_CAP_SM_PS_STATIC] = WMI_PEER_SMPS_STATIC, -@@ -3612,6 +3615,7 @@ static int ath11k_mac_op_hw_scan(struct - struct scan_req_params arg; - int ret = 0; - int i; -+ u32 scan_timeout; - - mutex_lock(&ar->conf_mutex); - -@@ -3681,6 +3685,26 @@ static int ath11k_mac_op_hw_scan(struct - ether_addr_copy(arg.mac_mask.addr, req->mac_addr_mask); - } - -+ /* if duration is set, default dwell times will be overwritten */ -+ if (req->duration) { -+ arg.dwell_time_active = req->duration; -+ arg.dwell_time_active_2g = req->duration; -+ arg.dwell_time_active_6g = req->duration; -+ arg.dwell_time_passive = req->duration; -+ arg.dwell_time_passive_6g = req->duration; -+ arg.burst_duration = req->duration; -+ -+ scan_timeout = min_t(u32, arg.max_rest_time * -+ (arg.num_chan - 1) + (req->duration + -+ ATH11K_SCAN_CHANNEL_SWITCH_WMI_EVT_OVERHEAD) * -+ arg.num_chan, arg.max_scan_time); -+ } else { -+ scan_timeout = arg.max_scan_time; -+ } -+ -+ /* Add a margin to account for event/command processing */ -+ scan_timeout += ATH11K_MAC_SCAN_CMD_EVT_OVERHEAD; -+ - ret = ath11k_start_scan(ar, &arg); - if (ret) { - ath11k_warn(ar->ab, "failed to start hw scan: %d\n", ret); -@@ -3689,10 +3713,8 @@ static int ath11k_mac_op_hw_scan(struct - spin_unlock_bh(&ar->data_lock); - } - -- /* Add a 200ms margin to account for event/command processing */ - ieee80211_queue_delayed_work(ar->hw, &ar->scan.timeout, -- msecs_to_jiffies(arg.max_scan_time + -- ATH11K_MAC_SCAN_TIMEOUT_MSECS)); -+ msecs_to_jiffies(scan_timeout)); - - exit: - kfree(arg.chan_list); -@@ -9060,6 +9082,9 @@ static int __ath11k_mac_register(struct - NL80211_EXT_FEATURE_UNSOL_BCAST_PROBE_RESP); - } - -+ wiphy_ext_feature_set(ar->hw->wiphy, -+ NL80211_EXT_FEATURE_SET_SCAN_DWELL); -+ - ath11k_reg_init(ar); - - if (!test_bit(ATH11K_FLAG_RAW_MODE, &ab->dev_flags)) { diff --git a/package/kernel/mac80211/patches/ath11k/0010-wifi-ath11k-Fix-firmware-crash-on-vdev-delete-race-c.patch b/package/kernel/mac80211/patches/ath11k/0010-wifi-ath11k-Fix-firmware-crash-on-vdev-delete-race-c.patch deleted file mode 100644 index 7275af06ea..0000000000 --- a/package/kernel/mac80211/patches/ath11k/0010-wifi-ath11k-Fix-firmware-crash-on-vdev-delete-race-c.patch +++ /dev/null @@ -1,116 +0,0 @@ -From 3811fa1f231f1a3e29759efef4992116604aab8b Mon Sep 17 00:00:00 2001 -From: Sowmiya Sree Elavalagan -Date: Tue, 11 Oct 2022 15:23:46 +0530 -Subject: [PATCH] wifi: ath11k: Fix firmware crash on vdev delete race - condition - -Current code does not wait for vdev delete completion on vdev create -failures and tries to send another vdev create followed by vdev set -param to firmware with same vdev id. This causes firmware crash. -Fix this crash by waiting for vdev delete completion on vdev -create failures. - -Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.6.0.1-00905-QCAHKSWPL_SILICONZ-1 - -Signed-off-by: Sowmiya Sree Elavalagan -Signed-off-by: Kalle Valo -Link: https://lore.kernel.org/r/20221011095346.3901-1-quic_ssreeela@quicinc.com ---- - drivers/net/wireless/ath/ath11k/mac.c | 60 +++++++++++++++++---------- - 1 file changed, 37 insertions(+), 23 deletions(-) - ---- a/drivers/net/wireless/ath/ath11k/mac.c -+++ b/drivers/net/wireless/ath/ath11k/mac.c -@@ -6233,6 +6233,40 @@ void ath11k_mac_11d_scan_stop_all(struct - } - } - -+static int ath11k_mac_vdev_delete(struct ath11k *ar, struct ath11k_vif *arvif) -+{ -+ unsigned long time_left; -+ struct ieee80211_vif *vif = arvif->vif; -+ int ret = 0; -+ -+ lockdep_assert_held(&ar->conf_mutex); -+ -+ reinit_completion(&ar->vdev_delete_done); -+ -+ ret = ath11k_wmi_vdev_delete(ar, arvif->vdev_id); -+ if (ret) { -+ ath11k_warn(ar->ab, "failed to delete WMI vdev %d: %d\n", -+ arvif->vdev_id, ret); -+ return ret; -+ } -+ -+ time_left = wait_for_completion_timeout(&ar->vdev_delete_done, -+ ATH11K_VDEV_DELETE_TIMEOUT_HZ); -+ if (time_left == 0) { -+ ath11k_warn(ar->ab, "Timeout in receiving vdev delete response\n"); -+ return -ETIMEDOUT; -+ } -+ -+ ar->ab->free_vdev_map |= 1LL << (arvif->vdev_id); -+ ar->allocated_vdev_map &= ~(1LL << arvif->vdev_id); -+ ar->num_created_vdevs--; -+ -+ ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "vdev %pM deleted, vdev_id %d\n", -+ vif->addr, arvif->vdev_id); -+ -+ return ret; -+} -+ - static int ath11k_mac_op_add_interface(struct ieee80211_hw *hw, - struct ieee80211_vif *vif) - { -@@ -6468,10 +6502,7 @@ err_peer_del: - } - - err_vdev_del: -- ath11k_wmi_vdev_delete(ar, arvif->vdev_id); -- ar->num_created_vdevs--; -- ar->allocated_vdev_map &= ~(1LL << arvif->vdev_id); -- ab->free_vdev_map |= 1LL << arvif->vdev_id; -+ ath11k_mac_vdev_delete(ar, arvif); - spin_lock_bh(&ar->data_lock); - list_del(&arvif->list); - spin_unlock_bh(&ar->data_lock); -@@ -6499,7 +6530,6 @@ static void ath11k_mac_op_remove_interfa - struct ath11k *ar = hw->priv; - struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif); - struct ath11k_base *ab = ar->ab; -- unsigned long time_left; - int ret; - int i; - -@@ -6520,29 +6550,13 @@ static void ath11k_mac_op_remove_interfa - arvif->vdev_id, ret); - } - -- reinit_completion(&ar->vdev_delete_done); -- -- ret = ath11k_wmi_vdev_delete(ar, arvif->vdev_id); -+ ret = ath11k_mac_vdev_delete(ar, arvif); - if (ret) { -- ath11k_warn(ab, "failed to delete WMI vdev %d: %d\n", -+ ath11k_warn(ab, "failed to delete vdev %d: %d\n", - arvif->vdev_id, ret); - goto err_vdev_del; - } - -- time_left = wait_for_completion_timeout(&ar->vdev_delete_done, -- ATH11K_VDEV_DELETE_TIMEOUT_HZ); -- if (time_left == 0) { -- ath11k_warn(ab, "Timeout in receiving vdev delete response\n"); -- goto err_vdev_del; -- } -- -- ab->free_vdev_map |= 1LL << (arvif->vdev_id); -- ar->allocated_vdev_map &= ~(1LL << arvif->vdev_id); -- ar->num_created_vdevs--; -- -- ath11k_dbg(ab, ATH11K_DBG_MAC, "vdev %pM deleted, vdev_id %d\n", -- vif->addr, arvif->vdev_id); -- - if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) { - clear_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags); - ar->monitor_vdev_id = -1; diff --git a/package/kernel/mac80211/patches/ath11k/0011-wifi-ath11k-fix-monitor-vdev-creation-with-firmware-.patch b/package/kernel/mac80211/patches/ath11k/0011-wifi-ath11k-fix-monitor-vdev-creation-with-firmware-.patch deleted file mode 100644 index 2f066d0a56..0000000000 --- a/package/kernel/mac80211/patches/ath11k/0011-wifi-ath11k-fix-monitor-vdev-creation-with-firmware-.patch +++ /dev/null @@ -1,40 +0,0 @@ -From f3ca72b0327101a074a871539e61775d43908ca4 Mon Sep 17 00:00:00 2001 -From: Nagarajan Maran -Date: Fri, 14 Oct 2022 21:20:54 +0530 -Subject: [PATCH] wifi: ath11k: fix monitor vdev creation with firmware - recovery - -During firmware recovery, the monitor interface is not -getting created in the driver and firmware since -the respective flags are not updated properly. - -So after firmware recovery is successful, when monitor -interface is brought down manually, firmware assertion -is observed, since we are trying to bring down the -interface which is not yet created in the firmware. - -Fix this by updating the monitor flags properly per -phy#, during firmware recovery. - -Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1 - -Signed-off-by: Nagarajan Maran -Signed-off-by: Kalle Valo -Link: https://lore.kernel.org/r/20221014155054.11471-1-quic_nmaran@quicinc.com ---- - drivers/net/wireless/ath/ath11k/core.c | 4 ++++ - 1 file changed, 4 insertions(+) - ---- a/drivers/net/wireless/ath/ath11k/core.c -+++ b/drivers/net/wireless/ath/ath11k/core.c -@@ -1677,6 +1677,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); -+ -+ ar->monitor_vdev_id = -1; -+ clear_bit(ATH11K_FLAG_MONITOR_STARTED, &ar->monitor_flags); -+ clear_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags); - } - - wake_up(&ab->wmi_ab.tx_credits_wq); diff --git a/package/kernel/mac80211/patches/ath11k/0012-wifi-ath11k-Fix-qmi_msg_handler-data-structure-initi.patch b/package/kernel/mac80211/patches/ath11k/0012-wifi-ath11k-Fix-qmi_msg_handler-data-structure-initi.patch deleted file mode 100644 index fccfa4385a..0000000000 --- a/package/kernel/mac80211/patches/ath11k/0012-wifi-ath11k-Fix-qmi_msg_handler-data-structure-initi.patch +++ /dev/null @@ -1,33 +0,0 @@ -From ed3725e15a154ebebf44e0c34806c57525483f92 Mon Sep 17 00:00:00 2001 -From: Rahul Bhattacharjee -Date: Fri, 21 Oct 2022 14:31:26 +0530 -Subject: [PATCH] wifi: ath11k: Fix qmi_msg_handler data structure - initialization - -qmi_msg_handler is required to be null terminated by QMI module. -There might be a case where a handler for a msg id is not present in the -handlers array which can lead to infinite loop while searching the handler -and therefore out of bound access in qmi_invoke_handler(). -Hence update the initialization in qmi_msg_handler data structure. - -Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.5.0.1-01100-QCAHKSWPL_SILICONZ-1 - -Signed-off-by: Rahul Bhattacharjee -Signed-off-by: Kalle Valo -Link: https://lore.kernel.org/r/20221021090126.28626-1-quic_rbhattac@quicinc.com ---- - drivers/net/wireless/ath/ath11k/qmi.c | 3 +++ - 1 file changed, 3 insertions(+) - ---- a/drivers/net/wireless/ath/ath11k/qmi.c -+++ b/drivers/net/wireless/ath/ath11k/qmi.c -@@ -1702,6 +1702,9 @@ static struct qmi_elem_info qmi_wlfw_fw_ - .data_type = QMI_EOTI, - .array_type = NO_ARRAY, - }, -+ -+ /* end of list */ -+ {}, - }; - - static int ath11k_qmi_host_cap_send(struct ath11k_base *ab) diff --git a/package/kernel/mac80211/patches/ath11k/0013-wifi-ath11k-synchronize-ath11k_mac_he_gi_to_nl80211_.patch b/package/kernel/mac80211/patches/ath11k/0013-wifi-ath11k-synchronize-ath11k_mac_he_gi_to_nl80211_.patch deleted file mode 100644 index 1e89b4d4f2..0000000000 --- a/package/kernel/mac80211/patches/ath11k/0013-wifi-ath11k-synchronize-ath11k_mac_he_gi_to_nl80211_.patch +++ /dev/null @@ -1,42 +0,0 @@ -From dd1c2322694522f674c874f5fa02ac5ae39135dd Mon Sep 17 00:00:00 2001 -From: "Jiri Slaby (SUSE)" -Date: Mon, 31 Oct 2022 12:43:41 +0100 -Subject: [PATCH] wifi: ath11k: synchronize - ath11k_mac_he_gi_to_nl80211_he_gi()'s return type - -ath11k_mac_he_gi_to_nl80211_he_gi() generates a valid warning with gcc-13: - drivers/net/wireless/ath/ath11k/mac.c:321:20: error: conflicting types for 'ath11k_mac_he_gi_to_nl80211_he_gi' due to enum/integer mismatch; have 'enum nl80211_he_gi(u8)' - drivers/net/wireless/ath/ath11k/mac.h:166:5: note: previous declaration of 'ath11k_mac_he_gi_to_nl80211_he_gi' with type 'u32(u8)' - -I.e. the type of the return value ath11k_mac_he_gi_to_nl80211_he_gi() in -the declaration is u32, while the definition spells enum nl80211_he_gi. -Synchronize them to the latter. - -Cc: Martin Liska -Cc: Kalle Valo -Cc: "David S. Miller" -Cc: Eric Dumazet -Cc: Jakub Kicinski -Cc: Paolo Abeni -Cc: ath11k@lists.infradead.org -Cc: linux-wireless@vger.kernel.org -Cc: netdev@vger.kernel.org -Signed-off-by: Jiri Slaby (SUSE) -Reviewed-by: Jeff Johnson -Signed-off-by: Kalle Valo -Link: https://lore.kernel.org/r/20221031114341.10377-1-jirislaby@kernel.org ---- - drivers/net/wireless/ath/ath11k/mac.h | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/drivers/net/wireless/ath/ath11k/mac.h -+++ b/drivers/net/wireless/ath/ath11k/mac.h -@@ -163,7 +163,7 @@ void ath11k_mac_drain_tx(struct ath11k * - void ath11k_mac_peer_cleanup_all(struct ath11k *ar); - int ath11k_mac_tx_mgmt_pending_free(int buf_id, void *skb, void *ctx); - u8 ath11k_mac_bw_to_mac80211_bw(u8 bw); --u32 ath11k_mac_he_gi_to_nl80211_he_gi(u8 sgi); -+enum nl80211_he_gi ath11k_mac_he_gi_to_nl80211_he_gi(u8 sgi); - enum nl80211_he_ru_alloc ath11k_mac_phy_he_ru_to_nl80211_he_ru_alloc(u16 ru_phy); - enum nl80211_he_ru_alloc ath11k_mac_he_ru_tones_to_nl80211_he_ru_alloc(u16 ru_tones); - enum ath11k_supported_bw ath11k_mac_mac80211_bw_to_ath11k_bw(enum rate_info_bw bw); diff --git a/package/kernel/mac80211/patches/ath11k/0016-wifi-ath11k-Make-QMI-message-rules-const.patch b/package/kernel/mac80211/patches/ath11k/0016-wifi-ath11k-Make-QMI-message-rules-const.patch deleted file mode 100644 index 1f48df73f7..0000000000 --- a/package/kernel/mac80211/patches/ath11k/0016-wifi-ath11k-Make-QMI-message-rules-const.patch +++ /dev/null @@ -1,341 +0,0 @@ -From 93c1592889fca46d09d833455628bab05516cdbf Mon Sep 17 00:00:00 2001 -From: Jeff Johnson -Date: Wed, 14 Sep 2022 17:23:03 -0700 -Subject: [PATCH] wifi: ath11k: Make QMI message rules const - -Commit ff6d365898d4 ("soc: qcom: qmi: use const for struct -qmi_elem_info") allows QMI message encoding/decoding rules to be -const, so do that for ath11k. - -Compile tested only. - -Signed-off-by: Jeff Johnson -Signed-off-by: Kalle Valo -Link: https://lore.kernel.org/r/20220915002303.12206-1-quic_jjohnson@quicinc.com ---- - drivers/net/wireless/ath/ath11k/qmi.c | 72 +++++++++++++-------------- - 1 file changed, 36 insertions(+), 36 deletions(-) - ---- a/drivers/net/wireless/ath/ath11k/qmi.c -+++ b/drivers/net/wireless/ath/ath11k/qmi.c -@@ -29,7 +29,7 @@ module_param_named(cold_boot_cal, ath11k - MODULE_PARM_DESC(cold_boot_cal, - "Decrease the channel switch time but increase the driver load time (Default: true)"); - --static struct qmi_elem_info qmi_wlanfw_host_cap_req_msg_v01_ei[] = { -+static const struct qmi_elem_info qmi_wlanfw_host_cap_req_msg_v01_ei[] = { - { - .data_type = QMI_OPT_FLAG, - .elem_len = 1, -@@ -280,7 +280,7 @@ static struct qmi_elem_info qmi_wlanfw_h - }, - }; - --static struct qmi_elem_info qmi_wlanfw_host_cap_resp_msg_v01_ei[] = { -+static const struct qmi_elem_info qmi_wlanfw_host_cap_resp_msg_v01_ei[] = { - { - .data_type = QMI_STRUCT, - .elem_len = 1, -@@ -297,7 +297,7 @@ static struct qmi_elem_info qmi_wlanfw_h - }, - }; - --static struct qmi_elem_info qmi_wlanfw_ind_register_req_msg_v01_ei[] = { -+static const struct qmi_elem_info qmi_wlanfw_ind_register_req_msg_v01_ei[] = { - { - .data_type = QMI_OPT_FLAG, - .elem_len = 1, -@@ -522,7 +522,7 @@ static struct qmi_elem_info qmi_wlanfw_i - }, - }; - --static struct qmi_elem_info qmi_wlanfw_ind_register_resp_msg_v01_ei[] = { -+static const struct qmi_elem_info qmi_wlanfw_ind_register_resp_msg_v01_ei[] = { - { - .data_type = QMI_STRUCT, - .elem_len = 1, -@@ -558,7 +558,7 @@ static struct qmi_elem_info qmi_wlanfw_i - }, - }; - --static struct qmi_elem_info qmi_wlanfw_mem_cfg_s_v01_ei[] = { -+static const struct qmi_elem_info qmi_wlanfw_mem_cfg_s_v01_ei[] = { - { - .data_type = QMI_UNSIGNED_8_BYTE, - .elem_len = 1, -@@ -590,7 +590,7 @@ static struct qmi_elem_info qmi_wlanfw_m - }, - }; - --static struct qmi_elem_info qmi_wlanfw_mem_seg_s_v01_ei[] = { -+static const struct qmi_elem_info qmi_wlanfw_mem_seg_s_v01_ei[] = { - { - .data_type = QMI_UNSIGNED_4_BYTE, - .elem_len = 1, -@@ -632,7 +632,7 @@ static struct qmi_elem_info qmi_wlanfw_m - }, - }; - --static struct qmi_elem_info qmi_wlanfw_request_mem_ind_msg_v01_ei[] = { -+static const struct qmi_elem_info qmi_wlanfw_request_mem_ind_msg_v01_ei[] = { - { - .data_type = QMI_DATA_LEN, - .elem_len = 1, -@@ -659,7 +659,7 @@ static struct qmi_elem_info qmi_wlanfw_r - }, - }; - --static struct qmi_elem_info qmi_wlanfw_mem_seg_resp_s_v01_ei[] = { -+static const struct qmi_elem_info qmi_wlanfw_mem_seg_resp_s_v01_ei[] = { - { - .data_type = QMI_UNSIGNED_8_BYTE, - .elem_len = 1, -@@ -699,7 +699,7 @@ static struct qmi_elem_info qmi_wlanfw_m - }, - }; - --static struct qmi_elem_info qmi_wlanfw_respond_mem_req_msg_v01_ei[] = { -+static const struct qmi_elem_info qmi_wlanfw_respond_mem_req_msg_v01_ei[] = { - { - .data_type = QMI_DATA_LEN, - .elem_len = 1, -@@ -726,7 +726,7 @@ static struct qmi_elem_info qmi_wlanfw_r - }, - }; - --static struct qmi_elem_info qmi_wlanfw_respond_mem_resp_msg_v01_ei[] = { -+static const struct qmi_elem_info qmi_wlanfw_respond_mem_resp_msg_v01_ei[] = { - { - .data_type = QMI_STRUCT, - .elem_len = 1, -@@ -744,7 +744,7 @@ static struct qmi_elem_info qmi_wlanfw_r - }, - }; - --static struct qmi_elem_info qmi_wlanfw_cap_req_msg_v01_ei[] = { -+static const struct qmi_elem_info qmi_wlanfw_cap_req_msg_v01_ei[] = { - { - .data_type = QMI_EOTI, - .array_type = NO_ARRAY, -@@ -752,7 +752,7 @@ static struct qmi_elem_info qmi_wlanfw_c - }, - }; - --static struct qmi_elem_info qmi_wlanfw_device_info_req_msg_v01_ei[] = { -+static const struct qmi_elem_info qmi_wlanfw_device_info_req_msg_v01_ei[] = { - { - .data_type = QMI_EOTI, - .array_type = NO_ARRAY, -@@ -760,7 +760,7 @@ static struct qmi_elem_info qmi_wlanfw_d - }, - }; - --static struct qmi_elem_info qmi_wlfw_device_info_resp_msg_v01_ei[] = { -+static const struct qmi_elem_info qmi_wlfw_device_info_resp_msg_v01_ei[] = { - { - .data_type = QMI_STRUCT, - .elem_len = 1, -@@ -814,7 +814,7 @@ static struct qmi_elem_info qmi_wlfw_dev - }, - }; - --static struct qmi_elem_info qmi_wlanfw_rf_chip_info_s_v01_ei[] = { -+static const struct qmi_elem_info qmi_wlanfw_rf_chip_info_s_v01_ei[] = { - { - .data_type = QMI_UNSIGNED_4_BYTE, - .elem_len = 1, -@@ -840,7 +840,7 @@ static struct qmi_elem_info qmi_wlanfw_r - }, - }; - --static struct qmi_elem_info qmi_wlanfw_rf_board_info_s_v01_ei[] = { -+static const struct qmi_elem_info qmi_wlanfw_rf_board_info_s_v01_ei[] = { - { - .data_type = QMI_UNSIGNED_4_BYTE, - .elem_len = 1, -@@ -857,7 +857,7 @@ static struct qmi_elem_info qmi_wlanfw_r - }, - }; - --static struct qmi_elem_info qmi_wlanfw_soc_info_s_v01_ei[] = { -+static const struct qmi_elem_info qmi_wlanfw_soc_info_s_v01_ei[] = { - { - .data_type = QMI_UNSIGNED_4_BYTE, - .elem_len = 1, -@@ -873,7 +873,7 @@ static struct qmi_elem_info qmi_wlanfw_s - }, - }; - --static struct qmi_elem_info qmi_wlanfw_fw_version_info_s_v01_ei[] = { -+static const struct qmi_elem_info qmi_wlanfw_fw_version_info_s_v01_ei[] = { - { - .data_type = QMI_UNSIGNED_4_BYTE, - .elem_len = 1, -@@ -899,7 +899,7 @@ static struct qmi_elem_info qmi_wlanfw_f - }, - }; - --static struct qmi_elem_info qmi_wlanfw_cap_resp_msg_v01_ei[] = { -+static const struct qmi_elem_info qmi_wlanfw_cap_resp_msg_v01_ei[] = { - { - .data_type = QMI_STRUCT, - .elem_len = 1, -@@ -1100,7 +1100,7 @@ static struct qmi_elem_info qmi_wlanfw_c - }, - }; - --static struct qmi_elem_info qmi_wlanfw_bdf_download_req_msg_v01_ei[] = { -+static const struct qmi_elem_info qmi_wlanfw_bdf_download_req_msg_v01_ei[] = { - { - .data_type = QMI_UNSIGNED_1_BYTE, - .elem_len = 1, -@@ -1235,7 +1235,7 @@ static struct qmi_elem_info qmi_wlanfw_b - }, - }; - --static struct qmi_elem_info qmi_wlanfw_bdf_download_resp_msg_v01_ei[] = { -+static const struct qmi_elem_info qmi_wlanfw_bdf_download_resp_msg_v01_ei[] = { - { - .data_type = QMI_STRUCT, - .elem_len = 1, -@@ -1253,7 +1253,7 @@ static struct qmi_elem_info qmi_wlanfw_b - }, - }; - --static struct qmi_elem_info qmi_wlanfw_m3_info_req_msg_v01_ei[] = { -+static const struct qmi_elem_info qmi_wlanfw_m3_info_req_msg_v01_ei[] = { - { - .data_type = QMI_UNSIGNED_8_BYTE, - .elem_len = 1, -@@ -1277,7 +1277,7 @@ static struct qmi_elem_info qmi_wlanfw_m - }, - }; - --static struct qmi_elem_info qmi_wlanfw_m3_info_resp_msg_v01_ei[] = { -+static const struct qmi_elem_info qmi_wlanfw_m3_info_resp_msg_v01_ei[] = { - { - .data_type = QMI_STRUCT, - .elem_len = 1, -@@ -1294,7 +1294,7 @@ static struct qmi_elem_info qmi_wlanfw_m - }, - }; - --static struct qmi_elem_info qmi_wlanfw_ce_tgt_pipe_cfg_s_v01_ei[] = { -+static const struct qmi_elem_info qmi_wlanfw_ce_tgt_pipe_cfg_s_v01_ei[] = { - { - .data_type = QMI_UNSIGNED_4_BYTE, - .elem_len = 1, -@@ -1347,7 +1347,7 @@ static struct qmi_elem_info qmi_wlanfw_c - }, - }; - --static struct qmi_elem_info qmi_wlanfw_ce_svc_pipe_cfg_s_v01_ei[] = { -+static const struct qmi_elem_info qmi_wlanfw_ce_svc_pipe_cfg_s_v01_ei[] = { - { - .data_type = QMI_UNSIGNED_4_BYTE, - .elem_len = 1, -@@ -1382,7 +1382,7 @@ static struct qmi_elem_info qmi_wlanfw_c - }, - }; - --static struct qmi_elem_info qmi_wlanfw_shadow_reg_cfg_s_v01_ei[] = { -+static const struct qmi_elem_info qmi_wlanfw_shadow_reg_cfg_s_v01_ei[] = { - { - .data_type = QMI_UNSIGNED_2_BYTE, - .elem_len = 1, -@@ -1406,7 +1406,7 @@ static struct qmi_elem_info qmi_wlanfw_s - }, - }; - --static struct qmi_elem_info qmi_wlanfw_shadow_reg_v2_cfg_s_v01_ei[] = { -+static const struct qmi_elem_info qmi_wlanfw_shadow_reg_v2_cfg_s_v01_ei[] = { - { - .data_type = QMI_UNSIGNED_4_BYTE, - .elem_len = 1, -@@ -1423,7 +1423,7 @@ static struct qmi_elem_info qmi_wlanfw_s - }, - }; - --static struct qmi_elem_info qmi_wlanfw_wlan_mode_req_msg_v01_ei[] = { -+static const struct qmi_elem_info qmi_wlanfw_wlan_mode_req_msg_v01_ei[] = { - { - .data_type = QMI_UNSIGNED_4_BYTE, - .elem_len = 1, -@@ -1458,7 +1458,7 @@ static struct qmi_elem_info qmi_wlanfw_w - }, - }; - --static struct qmi_elem_info qmi_wlanfw_wlan_mode_resp_msg_v01_ei[] = { -+static const struct qmi_elem_info qmi_wlanfw_wlan_mode_resp_msg_v01_ei[] = { - { - .data_type = QMI_STRUCT, - .elem_len = 1, -@@ -1476,7 +1476,7 @@ static struct qmi_elem_info qmi_wlanfw_w - }, - }; - --static struct qmi_elem_info qmi_wlanfw_wlan_cfg_req_msg_v01_ei[] = { -+static const struct qmi_elem_info qmi_wlanfw_wlan_cfg_req_msg_v01_ei[] = { - { - .data_type = QMI_OPT_FLAG, - .elem_len = 1, -@@ -1615,7 +1615,7 @@ static struct qmi_elem_info qmi_wlanfw_w - }, - }; - --static struct qmi_elem_info qmi_wlanfw_wlan_cfg_resp_msg_v01_ei[] = { -+static const struct qmi_elem_info qmi_wlanfw_wlan_cfg_resp_msg_v01_ei[] = { - { - .data_type = QMI_STRUCT, - .elem_len = 1, -@@ -1632,28 +1632,28 @@ static struct qmi_elem_info qmi_wlanfw_w - }, - }; - --static struct qmi_elem_info qmi_wlanfw_mem_ready_ind_msg_v01_ei[] = { -+static const struct qmi_elem_info qmi_wlanfw_mem_ready_ind_msg_v01_ei[] = { - { - .data_type = QMI_EOTI, - .array_type = NO_ARRAY, - }, - }; - --static struct qmi_elem_info qmi_wlanfw_fw_ready_ind_msg_v01_ei[] = { -+static const struct qmi_elem_info qmi_wlanfw_fw_ready_ind_msg_v01_ei[] = { - { - .data_type = QMI_EOTI, - .array_type = NO_ARRAY, - }, - }; - --static struct qmi_elem_info qmi_wlanfw_cold_boot_cal_done_ind_msg_v01_ei[] = { -+static const struct qmi_elem_info qmi_wlanfw_cold_boot_cal_done_ind_msg_v01_ei[] = { - { - .data_type = QMI_EOTI, - .array_type = NO_ARRAY, - }, - }; - --static struct qmi_elem_info qmi_wlanfw_wlan_ini_req_msg_v01_ei[] = { -+static const struct qmi_elem_info qmi_wlanfw_wlan_ini_req_msg_v01_ei[] = { - { - .data_type = QMI_OPT_FLAG, - .elem_len = 1, -@@ -1679,7 +1679,7 @@ static struct qmi_elem_info qmi_wlanfw_w - }, - }; - --static struct qmi_elem_info qmi_wlanfw_wlan_ini_resp_msg_v01_ei[] = { -+static const struct qmi_elem_info qmi_wlanfw_wlan_ini_resp_msg_v01_ei[] = { - { - .data_type = QMI_STRUCT, - .elem_len = 1, -@@ -1697,7 +1697,7 @@ static struct qmi_elem_info qmi_wlanfw_w - }, - }; - --static struct qmi_elem_info qmi_wlfw_fw_init_done_ind_msg_v01_ei[] = { -+static const struct qmi_elem_info qmi_wlfw_fw_init_done_ind_msg_v01_ei[] = { - { - .data_type = QMI_EOTI, - .array_type = NO_ARRAY, diff --git a/package/kernel/mac80211/patches/ath11k/0017-wifi-ath11k-Trigger-sta-disconnect-on-hardware-resta.patch b/package/kernel/mac80211/patches/ath11k/0017-wifi-ath11k-Trigger-sta-disconnect-on-hardware-resta.patch deleted file mode 100644 index f95e5027b2..0000000000 --- a/package/kernel/mac80211/patches/ath11k/0017-wifi-ath11k-Trigger-sta-disconnect-on-hardware-resta.patch +++ /dev/null @@ -1,119 +0,0 @@ -From a018750a2cceaf4427c4ee3d9ce3e83a171d5bd6 Mon Sep 17 00:00:00 2001 -From: Youghandhar Chintala -Date: Fri, 4 Nov 2022 14:24:03 +0530 -Subject: [PATCH] wifi: ath11k: Trigger sta disconnect on hardware restart - -Currently after the hardware restart triggered from the driver, the -station interface connection remains intact, since a disconnect trigger -is not sent to userspace. This can lead to a problem in targets where -the wifi mac sequence is added by the firmware. - -After the target restart, its wifi mac sequence number gets reset to -zero. Hence AP to which our device is connected will receive frames with -a wifi mac sequence number jump to the past, thereby resulting in the -AP dropping all these frames, until the frame arrives with a wifi mac -sequence number which AP was expecting. - -To avoid such frame drops, its better to trigger a station disconnect -upon target hardware restart which can be done with API -ieee80211_reconfig_disconnect exposed to mac80211. - -The other targets are not affected by this change, since the hardware -params flag is not set. - -Reported-by: kernel test robot - -Tested-on: WCN6750 hw1.0 AHB WLAN.MSL.1.0.1-00887-QCAMSLSWPLZ-1 - -Signed-off-by: Youghandhar Chintala -Signed-off-by: Kalle Valo -Link: https://lore.kernel.org/r/20221104085403.11025-1-quic_youghand@quicinc.com ---- - drivers/net/wireless/ath/ath11k/core.c | 6 ++++++ - drivers/net/wireless/ath/ath11k/hw.h | 1 + - drivers/net/wireless/ath/ath11k/mac.c | 7 +++++++ - 3 files changed, 14 insertions(+) - ---- a/drivers/net/wireless/ath/ath11k/core.c -+++ b/drivers/net/wireless/ath/ath11k/core.c -@@ -195,6 +195,7 @@ static const struct ath11k_hw_params ath - .tcl_ring_retry = true, - .tx_ring_size = DP_TCL_DATA_RING_SIZE, - .smp2p_wow_exit = false, -+ .support_fw_mac_sequence = false, - }, - { - .name = "qca6390 hw2.0", -@@ -277,6 +278,7 @@ static const struct ath11k_hw_params ath - .tcl_ring_retry = true, - .tx_ring_size = DP_TCL_DATA_RING_SIZE, - .smp2p_wow_exit = false, -+ .support_fw_mac_sequence = true, - }, - { - .name = "qcn9074 hw1.0", -@@ -356,6 +358,7 @@ static const struct ath11k_hw_params ath - .tcl_ring_retry = true, - .tx_ring_size = DP_TCL_DATA_RING_SIZE, - .smp2p_wow_exit = false, -+ .support_fw_mac_sequence = false, - }, - { - .name = "wcn6855 hw2.0", -@@ -438,6 +441,7 @@ static const struct ath11k_hw_params ath - .tcl_ring_retry = true, - .tx_ring_size = DP_TCL_DATA_RING_SIZE, - .smp2p_wow_exit = false, -+ .support_fw_mac_sequence = true, - }, - { - .name = "wcn6855 hw2.1", -@@ -519,6 +523,7 @@ static const struct ath11k_hw_params ath - .tcl_ring_retry = true, - .tx_ring_size = DP_TCL_DATA_RING_SIZE, - .smp2p_wow_exit = false, -+ .support_fw_mac_sequence = true, - }, - { - .name = "wcn6750 hw1.0", -@@ -597,6 +602,7 @@ static const struct ath11k_hw_params ath - .tcl_ring_retry = false, - .tx_ring_size = DP_TCL_DATA_RING_SIZE_WCN6750, - .smp2p_wow_exit = true, -+ .support_fw_mac_sequence = true, - }, - }; - ---- a/drivers/net/wireless/ath/ath11k/hw.h -+++ b/drivers/net/wireless/ath/ath11k/hw.h -@@ -219,6 +219,7 @@ struct ath11k_hw_params { - bool tcl_ring_retry; - u32 tx_ring_size; - bool smp2p_wow_exit; -+ bool support_fw_mac_sequence; - }; - - struct ath11k_hw_ops { ---- a/drivers/net/wireless/ath/ath11k/mac.c -+++ b/drivers/net/wireless/ath/ath11k/mac.c -@@ -8010,6 +8010,7 @@ ath11k_mac_op_reconfig_complete(struct i - struct ath11k *ar = hw->priv; - struct ath11k_base *ab = ar->ab; - int recovery_count; -+ struct ath11k_vif *arvif; - - if (reconfig_type != IEEE80211_RECONFIG_TYPE_RESTART) - return; -@@ -8045,6 +8046,12 @@ ath11k_mac_op_reconfig_complete(struct i - ath11k_dbg(ab, ATH11K_DBG_BOOT, "reset success\n"); - } - } -+ if (ar->ab->hw_params.support_fw_mac_sequence) { -+ list_for_each_entry(arvif, &ar->arvifs, list) { -+ if (arvif->is_up && arvif->vdev_type == WMI_VDEV_TYPE_STA) -+ ieee80211_hw_restart_disconnect(arvif->vif); -+ } -+ } - } - - mutex_unlock(&ar->conf_mutex); diff --git a/package/kernel/mac80211/patches/ath11k/0018-wifi-ath11k-Fix-race-condition-with-struct-htt_ppdu_.patch b/package/kernel/mac80211/patches/ath11k/0018-wifi-ath11k-Fix-race-condition-with-struct-htt_ppdu_.patch deleted file mode 100644 index cef61ee344..0000000000 --- a/package/kernel/mac80211/patches/ath11k/0018-wifi-ath11k-Fix-race-condition-with-struct-htt_ppdu_.patch +++ /dev/null @@ -1,103 +0,0 @@ -From e44de90453bb2b46a523df78c39eb896bab35dcd Mon Sep 17 00:00:00 2001 -From: Govindaraj Saminathan -Date: Tue, 29 Nov 2022 13:04:02 +0200 -Subject: [PATCH] wifi: ath11k: Fix race condition with struct - htt_ppdu_stats_info - -A crash happens when running the traffic with multiple clients: - -Crash Signature : Unable to handle kernel paging request at -virtual address ffffffd700970918 During the crash, PC points to -"ieee80211_tx_rate_update+0x30/0x68 [mac80211]" -LR points to "ath11k_dp_htt_htc_t2h_msg_handler+0x5a8/0x8a0 [ath11k]". - -Struct ppdu_stats_info is allocated and accessed from event callback via copy -engine tasklet, this has a problem when freeing it from ath11k_mac_op_stop(). - -Use data_lock during entire ath11k_dp_htt_get_ppdu_desc() call to protect -struct htt_ppdu_stats_info access and to avoid race condition when accessing it -from ath11k_mac_op_stop(). - -Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1 - -Signed-off-by: Govindaraj Saminathan -Co-developed-by: Karthikeyan Kathirvel -Signed-off-by: Karthikeyan Kathirvel -Signed-off-by: Kalle Valo -Link: https://lore.kernel.org/r/20221124071104.22506-1-quic_kathirve@quicinc.com ---- - drivers/net/wireless/ath/ath11k/dp_rx.c | 22 +++++++++++----------- - 1 file changed, 11 insertions(+), 11 deletions(-) - ---- a/drivers/net/wireless/ath/ath11k/dp_rx.c -+++ b/drivers/net/wireless/ath/ath11k/dp_rx.c -@@ -1535,13 +1535,12 @@ struct htt_ppdu_stats_info *ath11k_dp_ht - { - struct htt_ppdu_stats_info *ppdu_info; - -- spin_lock_bh(&ar->data_lock); -+ lockdep_assert_held(&ar->data_lock); -+ - if (!list_empty(&ar->ppdu_stats_info)) { - list_for_each_entry(ppdu_info, &ar->ppdu_stats_info, list) { -- if (ppdu_info->ppdu_id == ppdu_id) { -- spin_unlock_bh(&ar->data_lock); -+ if (ppdu_info->ppdu_id == ppdu_id) - return ppdu_info; -- } - } - - if (ar->ppdu_stat_list_depth > HTT_PPDU_DESC_MAX_DEPTH) { -@@ -1553,16 +1552,13 @@ struct htt_ppdu_stats_info *ath11k_dp_ht - kfree(ppdu_info); - } - } -- spin_unlock_bh(&ar->data_lock); - - ppdu_info = kzalloc(sizeof(*ppdu_info), GFP_ATOMIC); - if (!ppdu_info) - return NULL; - -- spin_lock_bh(&ar->data_lock); - list_add_tail(&ppdu_info->list, &ar->ppdu_stats_info); - ar->ppdu_stat_list_depth++; -- spin_unlock_bh(&ar->data_lock); - - return ppdu_info; - } -@@ -1586,16 +1582,17 @@ static int ath11k_htt_pull_ppdu_stats(st - ar = ath11k_mac_get_ar_by_pdev_id(ab, pdev_id); - if (!ar) { - ret = -EINVAL; -- goto exit; -+ goto out; - } - - if (ath11k_debugfs_is_pktlog_lite_mode_enabled(ar)) - trace_ath11k_htt_ppdu_stats(ar, skb->data, len); - -+ spin_lock_bh(&ar->data_lock); - ppdu_info = ath11k_dp_htt_get_ppdu_desc(ar, ppdu_id); - if (!ppdu_info) { - ret = -EINVAL; -- goto exit; -+ goto out_unlock_data; - } - - ppdu_info->ppdu_id = ppdu_id; -@@ -1604,10 +1601,13 @@ static int ath11k_htt_pull_ppdu_stats(st - (void *)ppdu_info); - if (ret) { - ath11k_warn(ab, "Failed to parse tlv %d\n", ret); -- goto exit; -+ goto out_unlock_data; - } - --exit: -+out_unlock_data: -+ spin_unlock_bh(&ar->data_lock); -+ -+out: - rcu_read_unlock(); - - return ret; diff --git a/package/kernel/mac80211/patches/ath11k/0019-wifi-ath11k-update-hw-params-for-IPQ5018.patch b/package/kernel/mac80211/patches/ath11k/0019-wifi-ath11k-update-hw-params-for-IPQ5018.patch deleted file mode 100644 index 25d39ddb0d..0000000000 --- a/package/kernel/mac80211/patches/ath11k/0019-wifi-ath11k-update-hw-params-for-IPQ5018.patch +++ /dev/null @@ -1,125 +0,0 @@ -From 8dfe875aa24aec68baf6702018633c84c2c1feca Mon Sep 17 00:00:00 2001 -From: Sriram R -Date: Fri, 2 Dec 2022 23:37:13 +0200 -Subject: [PATCH] wifi: ath11k: update hw params for IPQ5018 - -Add new compatible string for IPQ5018 and add -required hw params for IPQ5018. The hw descriptors size and -datapath ops are similar to QCN9074, hence reuse the same. - -Tested-on: IPQ5018 hw1.0 AHB WLAN.HK.2.6.0.1-00861-QCAHKSWPL_SILICONZ-1 - -Signed-off-by: Sriram R -Co-developed-by: Karthikeyan Kathirvel -Signed-off-by: Karthikeyan Kathirvel -Signed-off-by: Kalle Valo -Link: https://lore.kernel.org/r/20221122132152.17771-3-quic_kathirve@quicinc.com ---- - drivers/net/wireless/ath/ath11k/core.c | 71 ++++++++++++++++++++++++++ - drivers/net/wireless/ath/ath11k/core.h | 8 +++ - 2 files changed, 79 insertions(+) - ---- a/drivers/net/wireless/ath/ath11k/core.c -+++ b/drivers/net/wireless/ath/ath11k/core.c -@@ -604,6 +604,77 @@ static const struct ath11k_hw_params ath - .smp2p_wow_exit = true, - .support_fw_mac_sequence = true, - }, -+ { -+ .hw_rev = ATH11K_HW_IPQ5018_HW10, -+ .name = "ipq5018 hw1.0", -+ .fw = { -+ .dir = "IPQ5018/hw1.0", -+ .board_size = 256 * 1024, -+ .cal_offset = 128 * 1024, -+ }, -+ .max_radios = MAX_RADIOS_5018, -+ .bdf_addr = 0x4BA00000, -+ /* hal_desc_sz and hw ops are similar to qcn9074 */ -+ .hal_desc_sz = sizeof(struct hal_rx_desc_qcn9074), -+ .qmi_service_ins_id = ATH11K_QMI_WLFW_SERVICE_INS_ID_V01_IPQ8074, -+ .ring_mask = &ath11k_hw_ring_mask_ipq8074, -+ .credit_flow = false, -+ .max_tx_ring = 1, -+ .spectral = { -+ .fft_sz = 2, -+ .fft_pad_sz = 0, -+ .summary_pad_sz = 16, -+ .fft_hdr_len = 24, -+ .max_fft_bins = 1024, -+ }, -+ .internal_sleep_clock = false, -+ .host_ce_config = ath11k_host_ce_config_qcn9074, -+ .ce_count = CE_CNT_5018, -+ .rxdma1_enable = true, -+ .num_rxmda_per_pdev = RXDMA_PER_PDEV_5018, -+ .rx_mac_buf_ring = false, -+ .vdev_start_delay = false, -+ .htt_peer_map_v2 = true, -+ .interface_modes = BIT(NL80211_IFTYPE_STATION) | -+ BIT(NL80211_IFTYPE_AP) | -+ BIT(NL80211_IFTYPE_MESH_POINT), -+ .supports_monitor = false, -+ .supports_sta_ps = false, -+ .supports_shadow_regs = false, -+ .fw_mem_mode = 0, -+ .num_vdevs = 16 + 1, -+ .num_peers = 512, -+ .supports_regdb = false, -+ .idle_ps = false, -+ .supports_suspend = false, -+ .hal_params = &ath11k_hw_hal_params_ipq8074, -+ .single_pdev_only = false, -+ .cold_boot_calib = true, -+ .fix_l1ss = true, -+ .supports_dynamic_smps_6ghz = false, -+ .alloc_cacheable_memory = true, -+ .supports_rssi_stats = false, -+ .fw_wmi_diag_event = false, -+ .current_cc_support = false, -+ .dbr_debug_support = true, -+ .global_reset = false, -+ .bios_sar_capa = NULL, -+ .m3_fw_support = false, -+ .fixed_bdf_addr = true, -+ .fixed_mem_region = true, -+ .static_window_map = false, -+ .hybrid_bus_type = false, -+ .fixed_fw_mem = false, -+ .support_off_channel_tx = false, -+ .supports_multi_bssid = false, -+ -+ .sram_dump = {}, -+ -+ .tcl_ring_retry = true, -+ .tx_ring_size = DP_TCL_DATA_RING_SIZE, -+ .smp2p_wow_exit = false, -+ .support_fw_mac_sequence = false, -+ }, - }; - - static inline struct ath11k_pdev *ath11k_core_get_single_pdev(struct ath11k_base *ab) ---- a/drivers/net/wireless/ath/ath11k/core.h -+++ b/drivers/net/wireless/ath/ath11k/core.h -@@ -142,6 +142,7 @@ enum ath11k_hw_rev { - ATH11K_HW_WCN6855_HW20, - ATH11K_HW_WCN6855_HW21, - ATH11K_HW_WCN6750_HW10, -+ ATH11K_HW_IPQ5018_HW10, - }; - - enum ath11k_firmware_mode { -@@ -230,6 +231,13 @@ struct ath11k_he { - - #define MAX_RADIOS 3 - -+/* ipq5018 hw param macros */ -+#define MAX_RADIOS_5018 1 -+#define CE_CNT_5018 6 -+#define TARGET_CE_CNT_5018 9 -+#define SVC_CE_MAP_LEN_5018 17 -+#define RXDMA_PER_PDEV_5018 1 -+ - enum { - WMI_HOST_TP_SCALE_MAX = 0, - WMI_HOST_TP_SCALE_50 = 1, diff --git a/package/kernel/mac80211/patches/ath11k/0020-wifi-ath11k-update-ce-configurations-for-IPQ5018.patch b/package/kernel/mac80211/patches/ath11k/0020-wifi-ath11k-update-ce-configurations-for-IPQ5018.patch deleted file mode 100644 index 95643a95fe..0000000000 --- a/package/kernel/mac80211/patches/ath11k/0020-wifi-ath11k-update-ce-configurations-for-IPQ5018.patch +++ /dev/null @@ -1,246 +0,0 @@ -From 26af7aabd2d8225c6b2056234626ba5099610871 Mon Sep 17 00:00:00 2001 -From: Sriram R -Date: Fri, 2 Dec 2022 23:37:14 +0200 -Subject: [PATCH] wifi: ath11k: update ce configurations for IPQ5018 - -IPQ5018 is a single pdev device. Update host -and target CE configurations accordingly. - -Tested-on: IPQ5018 hw1.0 AHB WLAN.HK.2.6.0.1-00861-QCAHKSWPL_SILICONZ-1 - -Signed-off-by: Sriram R -Co-developed-by: Karthikeyan Kathirvel -Signed-off-by: Karthikeyan Kathirvel -Signed-off-by: Kalle Valo -Link: https://lore.kernel.org/r/20221122132152.17771-4-quic_kathirve@quicinc.com ---- - drivers/net/wireless/ath/ath11k/core.c | 4 + - drivers/net/wireless/ath/ath11k/core.h | 3 + - drivers/net/wireless/ath/ath11k/hw.c | 191 +++++++++++++++++++++++++ - 3 files changed, 198 insertions(+) - ---- a/drivers/net/wireless/ath/ath11k/core.c -+++ b/drivers/net/wireless/ath/ath11k/core.c -@@ -630,6 +630,10 @@ static const struct ath11k_hw_params ath - .internal_sleep_clock = false, - .host_ce_config = ath11k_host_ce_config_qcn9074, - .ce_count = CE_CNT_5018, -+ .target_ce_config = ath11k_target_ce_config_wlan_ipq5018, -+ .target_ce_count = TARGET_CE_CNT_5018, -+ .svc_to_ce_map = ath11k_target_service_to_ce_map_wlan_ipq5018, -+ .svc_to_ce_map_len = SVC_CE_MAP_LEN_5018, - .rxdma1_enable = true, - .num_rxmda_per_pdev = RXDMA_PER_PDEV_5018, - .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 - 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[]; - -+extern const struct ce_pipe_config ath11k_target_ce_config_wlan_ipq5018[]; -+extern const struct service_to_pipe ath11k_target_service_to_ce_map_wlan_ipq5018[]; -+ - extern const struct ce_pipe_config ath11k_target_ce_config_wlan_qcn9074[]; - extern const struct service_to_pipe ath11k_target_service_to_ce_map_wlan_qcn9074[]; - int ath11k_core_qmi_firmware_ready(struct ath11k_base *ab); ---- a/drivers/net/wireless/ath/ath11k/hw.c -+++ b/drivers/net/wireless/ath/ath11k/hw.c -@@ -1972,6 +1972,197 @@ const struct ath11k_hw_ring_mask ath11k_ - }, - }; - -+/* Target firmware's Copy Engine configuration for IPQ5018 */ -+const struct ce_pipe_config ath11k_target_ce_config_wlan_ipq5018[] = { -+ /* CE0: host->target HTC control and raw streams */ -+ { -+ .pipenum = __cpu_to_le32(0), -+ .pipedir = __cpu_to_le32(PIPEDIR_OUT), -+ .nentries = __cpu_to_le32(32), -+ .nbytes_max = __cpu_to_le32(2048), -+ .flags = __cpu_to_le32(CE_ATTR_FLAGS), -+ .reserved = __cpu_to_le32(0), -+ }, -+ -+ /* CE1: target->host HTT + HTC control */ -+ { -+ .pipenum = __cpu_to_le32(1), -+ .pipedir = __cpu_to_le32(PIPEDIR_IN), -+ .nentries = __cpu_to_le32(32), -+ .nbytes_max = __cpu_to_le32(2048), -+ .flags = __cpu_to_le32(CE_ATTR_FLAGS), -+ .reserved = __cpu_to_le32(0), -+ }, -+ -+ /* CE2: target->host WMI */ -+ { -+ .pipenum = __cpu_to_le32(2), -+ .pipedir = __cpu_to_le32(PIPEDIR_IN), -+ .nentries = __cpu_to_le32(32), -+ .nbytes_max = __cpu_to_le32(2048), -+ .flags = __cpu_to_le32(CE_ATTR_FLAGS), -+ .reserved = __cpu_to_le32(0), -+ }, -+ -+ /* CE3: host->target WMI */ -+ { -+ .pipenum = __cpu_to_le32(3), -+ .pipedir = __cpu_to_le32(PIPEDIR_OUT), -+ .nentries = __cpu_to_le32(32), -+ .nbytes_max = __cpu_to_le32(2048), -+ .flags = __cpu_to_le32(CE_ATTR_FLAGS), -+ .reserved = __cpu_to_le32(0), -+ }, -+ -+ /* CE4: host->target HTT */ -+ { -+ .pipenum = __cpu_to_le32(4), -+ .pipedir = __cpu_to_le32(PIPEDIR_OUT), -+ .nentries = __cpu_to_le32(256), -+ .nbytes_max = __cpu_to_le32(256), -+ .flags = __cpu_to_le32(CE_ATTR_FLAGS | CE_ATTR_DIS_INTR), -+ .reserved = __cpu_to_le32(0), -+ }, -+ -+ /* CE5: target->host Pktlog */ -+ { -+ .pipenum = __cpu_to_le32(5), -+ .pipedir = __cpu_to_le32(PIPEDIR_IN), -+ .nentries = __cpu_to_le32(32), -+ .nbytes_max = __cpu_to_le32(2048), -+ .flags = __cpu_to_le32(CE_ATTR_FLAGS), -+ .reserved = __cpu_to_le32(0), -+ }, -+ -+ /* CE6: Reserved for target autonomous hif_memcpy */ -+ { -+ .pipenum = __cpu_to_le32(6), -+ .pipedir = __cpu_to_le32(PIPEDIR_INOUT), -+ .nentries = __cpu_to_le32(32), -+ .nbytes_max = __cpu_to_le32(16384), -+ .flags = __cpu_to_le32(CE_ATTR_FLAGS), -+ .reserved = __cpu_to_le32(0), -+ }, -+ -+ /* CE7 used only by Host */ -+ { -+ .pipenum = __cpu_to_le32(7), -+ .pipedir = __cpu_to_le32(PIPEDIR_OUT), -+ .nentries = __cpu_to_le32(32), -+ .nbytes_max = __cpu_to_le32(2048), -+ .flags = __cpu_to_le32(0x2000), -+ .reserved = __cpu_to_le32(0), -+ }, -+ -+ /* CE8 target->host used only by IPA */ -+ { -+ .pipenum = __cpu_to_le32(8), -+ .pipedir = __cpu_to_le32(PIPEDIR_INOUT), -+ .nentries = __cpu_to_le32(32), -+ .nbytes_max = __cpu_to_le32(16384), -+ .flags = __cpu_to_le32(CE_ATTR_FLAGS), -+ .reserved = __cpu_to_le32(0), -+ }, -+}; -+ -+/* Map from service/endpoint to Copy Engine for IPQ5018. -+ * This table is derived from the CE TABLE, above. -+ * It is passed to the Target at startup for use by firmware. -+ */ -+const struct service_to_pipe ath11k_target_service_to_ce_map_wlan_ipq5018[] = { -+ { -+ .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_VO), -+ .pipedir = __cpu_to_le32(PIPEDIR_OUT), /* out = UL = host -> target */ -+ .pipenum = __cpu_to_le32(3), -+ }, -+ { -+ .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_VO), -+ .pipedir = __cpu_to_le32(PIPEDIR_IN), /* in = DL = target -> host */ -+ .pipenum = __cpu_to_le32(2), -+ }, -+ { -+ .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_BK), -+ .pipedir = __cpu_to_le32(PIPEDIR_OUT), /* out = UL = host -> target */ -+ .pipenum = __cpu_to_le32(3), -+ }, -+ { -+ .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_BK), -+ .pipedir = __cpu_to_le32(PIPEDIR_IN), /* in = DL = target -> host */ -+ .pipenum = __cpu_to_le32(2), -+ }, -+ { -+ .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_BE), -+ .pipedir = __cpu_to_le32(PIPEDIR_OUT), /* out = UL = host -> target */ -+ .pipenum = __cpu_to_le32(3), -+ }, -+ { -+ .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_BE), -+ .pipedir = __cpu_to_le32(PIPEDIR_IN), /* in = DL = target -> host */ -+ .pipenum = __cpu_to_le32(2), -+ }, -+ { -+ .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_VI), -+ .pipedir = __cpu_to_le32(PIPEDIR_OUT), /* out = UL = host -> target */ -+ .pipenum = __cpu_to_le32(3), -+ }, -+ { -+ .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_VI), -+ .pipedir = __cpu_to_le32(PIPEDIR_IN), /* in = DL = target -> host */ -+ .pipenum = __cpu_to_le32(2), -+ }, -+ { -+ .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_CONTROL), -+ .pipedir = __cpu_to_le32(PIPEDIR_OUT), /* out = UL = host -> target */ -+ .pipenum = __cpu_to_le32(3), -+ }, -+ { -+ .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_CONTROL), -+ .pipedir = __cpu_to_le32(PIPEDIR_IN), /* in = DL = target -> host */ -+ .pipenum = __cpu_to_le32(2), -+ }, -+ -+ { -+ .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_RSVD_CTRL), -+ .pipedir = __cpu_to_le32(PIPEDIR_OUT), /* out = UL = host -> target */ -+ .pipenum = __cpu_to_le32(0), -+ }, -+ { -+ .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_RSVD_CTRL), -+ .pipedir = __cpu_to_le32(PIPEDIR_IN), /* in = DL = target -> host */ -+ .pipenum = __cpu_to_le32(1), -+ }, -+ -+ { -+ .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_TEST_RAW_STREAMS), -+ .pipedir = __cpu_to_le32(PIPEDIR_OUT), /* out = UL = host -> target */ -+ .pipenum = __cpu_to_le32(0), -+ }, -+ { -+ .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_TEST_RAW_STREAMS), -+ .pipedir = __cpu_to_le32(PIPEDIR_IN), /* in = DL = target -> host */ -+ .pipenum = __cpu_to_le32(1), -+ }, -+ { -+ .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_HTT_DATA_MSG), -+ .pipedir = __cpu_to_le32(PIPEDIR_OUT), /* out = UL = host -> target */ -+ .pipenum = __cpu_to_le32(4), -+ }, -+ { -+ .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_HTT_DATA_MSG), -+ .pipedir = __cpu_to_le32(PIPEDIR_IN), /* in = DL = target -> host */ -+ .pipenum = __cpu_to_le32(1), -+ }, -+ { -+ .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_PKT_LOG), -+ .pipedir = __cpu_to_le32(PIPEDIR_IN), /* in = DL = target -> host */ -+ .pipenum = __cpu_to_le32(5), -+ }, -+ -+ /* (Additions here) */ -+ -+ { /* terminator entry */ } -+}; -+ - const struct ath11k_hw_regs ipq8074_regs = { - /* SW2TCL(x) R0 ring configuration address */ - .hal_tcl1_ring_base_lsb = 0x00000510, diff --git a/package/kernel/mac80211/patches/ath11k/0021-wifi-ath11k-remap-ce-register-space-for-IPQ5018.patch b/package/kernel/mac80211/patches/ath11k/0021-wifi-ath11k-remap-ce-register-space-for-IPQ5018.patch deleted file mode 100644 index d07a258ac2..0000000000 --- a/package/kernel/mac80211/patches/ath11k/0021-wifi-ath11k-remap-ce-register-space-for-IPQ5018.patch +++ /dev/null @@ -1,351 +0,0 @@ -From b42b3678c91f3ca6e0888bf5a15c1e8678fd5f2d Mon Sep 17 00:00:00 2001 -From: Sriram R -Date: Fri, 2 Dec 2022 23:37:14 +0200 -Subject: [PATCH] wifi: ath11k: remap ce register space for IPQ5018 - -In IPQ5018 ce register space is moved out of wcss unlike -ipq8074 or ipq6018 and the space is not contiguous, -hence remap the CE registers to a new space to access them. - -Register read/write is modified to check if the register to be written -falls in the CE register space and corresponding register is written. -Also adjust the interrupt register address to ce irq enable/disable. - -Tested-on: IPQ5018 hw1.0 AHB WLAN.HK.2.6.0.1-00861-QCAHKSWPL_SILICONZ-1 - -Signed-off-by: Sriram R -Co-developed-by: Karthikeyan Kathirvel -Signed-off-by: Karthikeyan Kathirvel -Signed-off-by: Kalle Valo -Link: https://lore.kernel.org/r/20221122132152.17771-5-quic_kathirve@quicinc.com ---- - drivers/net/wireless/ath/ath11k/ahb.c | 44 ++++++++++++++++++++++---- - drivers/net/wireless/ath/ath11k/ce.h | 16 ++++++++++ - drivers/net/wireless/ath/ath11k/core.c | 8 +++++ - drivers/net/wireless/ath/ath11k/core.h | 1 + - drivers/net/wireless/ath/ath11k/hal.c | 17 ++++++---- - drivers/net/wireless/ath/ath11k/hal.h | 5 +++ - drivers/net/wireless/ath/ath11k/hw.c | 17 ++++++++++ - drivers/net/wireless/ath/ath11k/hw.h | 9 ++++++ - drivers/net/wireless/ath/ath11k/pci.c | 2 ++ - 9 files changed, 107 insertions(+), 12 deletions(-) - ---- a/drivers/net/wireless/ath/ath11k/ahb.c -+++ b/drivers/net/wireless/ath/ath11k/ahb.c -@@ -267,30 +267,42 @@ static void ath11k_ahb_clearbit32(struct - static void ath11k_ahb_ce_irq_enable(struct ath11k_base *ab, u16 ce_id) - { - const struct ce_attr *ce_attr; -+ const struct ce_ie_addr *ce_ie_addr = ab->hw_params.ce_ie_addr; -+ u32 ie1_reg_addr, ie2_reg_addr, ie3_reg_addr; -+ -+ ie1_reg_addr = ce_ie_addr->ie1_reg_addr + ATH11K_CE_OFFSET(ab); -+ ie2_reg_addr = ce_ie_addr->ie2_reg_addr + ATH11K_CE_OFFSET(ab); -+ ie3_reg_addr = ce_ie_addr->ie3_reg_addr + ATH11K_CE_OFFSET(ab); - - ce_attr = &ab->hw_params.host_ce_config[ce_id]; - if (ce_attr->src_nentries) -- ath11k_ahb_setbit32(ab, ce_id, CE_HOST_IE_ADDRESS); -+ ath11k_ahb_setbit32(ab, ce_id, ie1_reg_addr); - - if (ce_attr->dest_nentries) { -- ath11k_ahb_setbit32(ab, ce_id, CE_HOST_IE_2_ADDRESS); -+ ath11k_ahb_setbit32(ab, ce_id, ie2_reg_addr); - ath11k_ahb_setbit32(ab, ce_id + CE_HOST_IE_3_SHIFT, -- CE_HOST_IE_3_ADDRESS); -+ ie3_reg_addr); - } - } - - static void ath11k_ahb_ce_irq_disable(struct ath11k_base *ab, u16 ce_id) - { - const struct ce_attr *ce_attr; -+ const struct ce_ie_addr *ce_ie_addr = ab->hw_params.ce_ie_addr; -+ u32 ie1_reg_addr, ie2_reg_addr, ie3_reg_addr; -+ -+ ie1_reg_addr = ce_ie_addr->ie1_reg_addr + ATH11K_CE_OFFSET(ab); -+ ie2_reg_addr = ce_ie_addr->ie2_reg_addr + ATH11K_CE_OFFSET(ab); -+ ie3_reg_addr = ce_ie_addr->ie3_reg_addr + ATH11K_CE_OFFSET(ab); - - ce_attr = &ab->hw_params.host_ce_config[ce_id]; - if (ce_attr->src_nentries) -- ath11k_ahb_clearbit32(ab, ce_id, CE_HOST_IE_ADDRESS); -+ ath11k_ahb_clearbit32(ab, ce_id, ie1_reg_addr); - - if (ce_attr->dest_nentries) { -- ath11k_ahb_clearbit32(ab, ce_id, CE_HOST_IE_2_ADDRESS); -+ ath11k_ahb_clearbit32(ab, ce_id, ie2_reg_addr); - ath11k_ahb_clearbit32(ab, ce_id + CE_HOST_IE_3_SHIFT, -- CE_HOST_IE_3_ADDRESS); -+ ie3_reg_addr); - } - } - -@@ -1142,10 +1154,26 @@ static int ath11k_ahb_probe(struct platf - goto err_core_free; - } - -+ ab->mem_ce = ab->mem; -+ - ret = ath11k_core_pre_init(ab); - if (ret) - goto err_core_free; - -+ if (ab->hw_params.ce_remap) { -+ const struct ce_remap *ce_remap = ab->hw_params.ce_remap; -+ /* ce register space is moved out of wcss unlike ipq8074 or ipq6018 -+ * and the space is not contiguous, hence remapping the CE registers -+ * to a new space for accessing them. -+ */ -+ ab->mem_ce = ioremap(ce_remap->base, ce_remap->size); -+ if (IS_ERR(ab->mem_ce)) { -+ dev_err(&pdev->dev, "ce ioremap error\n"); -+ ret = -ENOMEM; -+ goto err_core_free; -+ } -+ } -+ - ret = ath11k_ahb_setup_resources(ab); - if (ret) - goto err_core_free; -@@ -1236,6 +1264,10 @@ static void ath11k_ahb_free_resources(st - ath11k_ahb_release_smp2p_handle(ab); - ath11k_ahb_fw_resource_deinit(ab); - ath11k_ce_free_pipes(ab); -+ -+ if (ab->hw_params.ce_remap) -+ iounmap(ab->mem_ce); -+ - ath11k_core_free(ab); - platform_set_drvdata(pdev, NULL); - } ---- a/drivers/net/wireless/ath/ath11k/ce.h -+++ b/drivers/net/wireless/ath/ath11k/ce.h -@@ -49,6 +49,11 @@ void ath11k_ce_byte_swap(void *mem, u32 - #define CE_HOST_IE_2_ADDRESS 0x00A18040 - #define CE_HOST_IE_3_ADDRESS CE_HOST_IE_ADDRESS - -+/* CE IE registers are different for IPQ5018 */ -+#define CE_HOST_IPQ5018_IE_ADDRESS 0x0841804C -+#define CE_HOST_IPQ5018_IE_2_ADDRESS 0x08418050 -+#define CE_HOST_IPQ5018_IE_3_ADDRESS CE_HOST_IPQ5018_IE_ADDRESS -+ - #define CE_HOST_IE_3_SHIFT 0xC - - #define CE_RING_IDX_INCR(nentries_mask, idx) (((idx) + 1) & (nentries_mask)) -@@ -84,6 +89,17 @@ struct ce_pipe_config { - __le32 reserved; - }; - -+struct ce_ie_addr { -+ u32 ie1_reg_addr; -+ u32 ie2_reg_addr; -+ u32 ie3_reg_addr; -+}; -+ -+struct ce_remap { -+ u32 base; -+ u32 size; -+}; -+ - struct ce_attr { - /* CE_ATTR_* values */ - unsigned int flags; ---- a/drivers/net/wireless/ath/ath11k/core.c -+++ b/drivers/net/wireless/ath/ath11k/core.c -@@ -54,6 +54,7 @@ static const struct ath11k_hw_params ath - .target_ce_count = 11, - .svc_to_ce_map = ath11k_target_service_to_ce_map_wlan_ipq8074, - .svc_to_ce_map_len = 21, -+ .ce_ie_addr = &ath11k_ce_ie_addr_ipq8074, - .single_pdev_only = false, - .rxdma1_enable = true, - .num_rxmda_per_pdev = 1, -@@ -137,6 +138,7 @@ static const struct ath11k_hw_params ath - .target_ce_count = 11, - .svc_to_ce_map = ath11k_target_service_to_ce_map_wlan_ipq6018, - .svc_to_ce_map_len = 19, -+ .ce_ie_addr = &ath11k_ce_ie_addr_ipq8074, - .single_pdev_only = false, - .rxdma1_enable = true, - .num_rxmda_per_pdev = 1, -@@ -218,6 +220,7 @@ static const struct ath11k_hw_params ath - .target_ce_count = 9, - .svc_to_ce_map = ath11k_target_service_to_ce_map_wlan_qca6390, - .svc_to_ce_map_len = 14, -+ .ce_ie_addr = &ath11k_ce_ie_addr_ipq8074, - .single_pdev_only = true, - .rxdma1_enable = false, - .num_rxmda_per_pdev = 2, -@@ -301,6 +304,7 @@ static const struct ath11k_hw_params ath - .target_ce_count = 9, - .svc_to_ce_map = ath11k_target_service_to_ce_map_wlan_qcn9074, - .svc_to_ce_map_len = 18, -+ .ce_ie_addr = &ath11k_ce_ie_addr_ipq8074, - .rxdma1_enable = true, - .num_rxmda_per_pdev = 1, - .rx_mac_buf_ring = false, -@@ -381,6 +385,7 @@ static const struct ath11k_hw_params ath - .target_ce_count = 9, - .svc_to_ce_map = ath11k_target_service_to_ce_map_wlan_qca6390, - .svc_to_ce_map_len = 14, -+ .ce_ie_addr = &ath11k_ce_ie_addr_ipq8074, - .single_pdev_only = true, - .rxdma1_enable = false, - .num_rxmda_per_pdev = 2, -@@ -546,6 +551,7 @@ static const struct ath11k_hw_params ath - .target_ce_count = 9, - .svc_to_ce_map = ath11k_target_service_to_ce_map_wlan_qca6390, - .svc_to_ce_map_len = 14, -+ .ce_ie_addr = &ath11k_ce_ie_addr_ipq8074, - .single_pdev_only = true, - .rxdma1_enable = false, - .num_rxmda_per_pdev = 1, -@@ -634,6 +640,8 @@ static const struct ath11k_hw_params ath - .target_ce_count = TARGET_CE_CNT_5018, - .svc_to_ce_map = ath11k_target_service_to_ce_map_wlan_ipq5018, - .svc_to_ce_map_len = SVC_CE_MAP_LEN_5018, -+ .ce_ie_addr = &ath11k_ce_ie_addr_ipq5018, -+ .ce_remap = &ath11k_ce_remap_ipq5018, - .rxdma1_enable = true, - .num_rxmda_per_pdev = RXDMA_PER_PDEV_5018, - .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 { - struct ath11k_dp dp; - - void __iomem *mem; -+ void __iomem *mem_ce; - unsigned long mem_len; - - struct { ---- a/drivers/net/wireless/ath/ath11k/hal.c -+++ b/drivers/net/wireless/ath/ath11k/hal.c -@@ -1220,16 +1220,20 @@ static int ath11k_hal_srng_create_config - s->reg_start[1] = HAL_SEQ_WCSS_UMAC_TCL_REG + HAL_TCL_STATUS_RING_HP; - - s = &hal->srng_config[HAL_CE_SRC]; -- s->reg_start[0] = HAL_SEQ_WCSS_UMAC_CE0_SRC_REG(ab) + HAL_CE_DST_RING_BASE_LSB; -- s->reg_start[1] = HAL_SEQ_WCSS_UMAC_CE0_SRC_REG(ab) + HAL_CE_DST_RING_HP; -+ s->reg_start[0] = HAL_SEQ_WCSS_UMAC_CE0_SRC_REG(ab) + HAL_CE_DST_RING_BASE_LSB + -+ ATH11K_CE_OFFSET(ab); -+ s->reg_start[1] = HAL_SEQ_WCSS_UMAC_CE0_SRC_REG(ab) + HAL_CE_DST_RING_HP + -+ ATH11K_CE_OFFSET(ab); - s->reg_size[0] = HAL_SEQ_WCSS_UMAC_CE1_SRC_REG(ab) - - HAL_SEQ_WCSS_UMAC_CE0_SRC_REG(ab); - s->reg_size[1] = HAL_SEQ_WCSS_UMAC_CE1_SRC_REG(ab) - - HAL_SEQ_WCSS_UMAC_CE0_SRC_REG(ab); - - s = &hal->srng_config[HAL_CE_DST]; -- s->reg_start[0] = HAL_SEQ_WCSS_UMAC_CE0_DST_REG(ab) + HAL_CE_DST_RING_BASE_LSB; -- s->reg_start[1] = HAL_SEQ_WCSS_UMAC_CE0_DST_REG(ab) + HAL_CE_DST_RING_HP; -+ s->reg_start[0] = HAL_SEQ_WCSS_UMAC_CE0_DST_REG(ab) + HAL_CE_DST_RING_BASE_LSB + -+ ATH11K_CE_OFFSET(ab); -+ s->reg_start[1] = HAL_SEQ_WCSS_UMAC_CE0_DST_REG(ab) + HAL_CE_DST_RING_HP + -+ ATH11K_CE_OFFSET(ab); - s->reg_size[0] = HAL_SEQ_WCSS_UMAC_CE1_DST_REG(ab) - - HAL_SEQ_WCSS_UMAC_CE0_DST_REG(ab); - s->reg_size[1] = HAL_SEQ_WCSS_UMAC_CE1_DST_REG(ab) - -@@ -1237,8 +1241,9 @@ static int ath11k_hal_srng_create_config - - s = &hal->srng_config[HAL_CE_DST_STATUS]; - s->reg_start[0] = HAL_SEQ_WCSS_UMAC_CE0_DST_REG(ab) + -- HAL_CE_DST_STATUS_RING_BASE_LSB; -- s->reg_start[1] = HAL_SEQ_WCSS_UMAC_CE0_DST_REG(ab) + HAL_CE_DST_STATUS_RING_HP; -+ HAL_CE_DST_STATUS_RING_BASE_LSB + ATH11K_CE_OFFSET(ab); -+ s->reg_start[1] = HAL_SEQ_WCSS_UMAC_CE0_DST_REG(ab) + HAL_CE_DST_STATUS_RING_HP + -+ ATH11K_CE_OFFSET(ab); - s->reg_size[0] = HAL_SEQ_WCSS_UMAC_CE1_DST_REG(ab) - - HAL_SEQ_WCSS_UMAC_CE0_DST_REG(ab); - s->reg_size[1] = HAL_SEQ_WCSS_UMAC_CE1_DST_REG(ab) - ---- a/drivers/net/wireless/ath/ath11k/hal.h -+++ b/drivers/net/wireless/ath/ath11k/hal.h -@@ -321,6 +321,10 @@ struct ath11k_base; - #define HAL_WBM2SW_RELEASE_RING_BASE_MSB_RING_SIZE 0x000fffff - #define HAL_RXDMA_RING_MAX_SIZE 0x0000ffff - -+/* IPQ5018 ce registers */ -+#define HAL_IPQ5018_CE_WFSS_REG_BASE 0x08400000 -+#define HAL_IPQ5018_CE_SIZE 0x200000 -+ - /* Add any other errors here and return them in - * ath11k_hal_rx_desc_get_err(). - */ -@@ -519,6 +523,7 @@ enum hal_srng_dir { - #define HAL_SRNG_FLAGS_MSI_INTR 0x00020000 - #define HAL_SRNG_FLAGS_CACHED 0x20000000 - #define HAL_SRNG_FLAGS_LMAC_RING 0x80000000 -+#define HAL_SRNG_FLAGS_REMAP_CE_RING 0x10000000 - - #define HAL_SRNG_TLV_HDR_TAG GENMASK(9, 1) - #define HAL_SRNG_TLV_HDR_LEN GENMASK(25, 10) ---- a/drivers/net/wireless/ath/ath11k/hw.c -+++ b/drivers/net/wireless/ath/ath11k/hw.c -@@ -2163,6 +2163,23 @@ const struct service_to_pipe ath11k_targ - { /* terminator entry */ } - }; - -+const struct ce_ie_addr ath11k_ce_ie_addr_ipq8074 = { -+ .ie1_reg_addr = CE_HOST_IE_ADDRESS, -+ .ie2_reg_addr = CE_HOST_IE_2_ADDRESS, -+ .ie3_reg_addr = CE_HOST_IE_3_ADDRESS, -+}; -+ -+const struct ce_ie_addr ath11k_ce_ie_addr_ipq5018 = { -+ .ie1_reg_addr = CE_HOST_IPQ5018_IE_ADDRESS - HAL_IPQ5018_CE_WFSS_REG_BASE, -+ .ie2_reg_addr = CE_HOST_IPQ5018_IE_2_ADDRESS - HAL_IPQ5018_CE_WFSS_REG_BASE, -+ .ie3_reg_addr = CE_HOST_IPQ5018_IE_3_ADDRESS - HAL_IPQ5018_CE_WFSS_REG_BASE, -+}; -+ -+const struct ce_remap ath11k_ce_remap_ipq5018 = { -+ .base = HAL_IPQ5018_CE_WFSS_REG_BASE, -+ .size = HAL_IPQ5018_CE_SIZE, -+}; -+ - const struct ath11k_hw_regs ipq8074_regs = { - /* SW2TCL(x) R0 ring configuration address */ - .hal_tcl1_ring_base_lsb = 0x00000510, ---- a/drivers/net/wireless/ath/ath11k/hw.h -+++ b/drivers/net/wireless/ath/ath11k/hw.h -@@ -80,6 +80,8 @@ - #define ATH11K_M3_FILE "m3.bin" - #define ATH11K_REGDB_FILE_NAME "regdb.bin" - -+#define ATH11K_CE_OFFSET(ab) (ab->mem_ce - ab->mem) -+ - enum ath11k_hw_rate_cck { - ATH11K_HW_RATE_CCK_LP_11M = 0, - ATH11K_HW_RATE_CCK_LP_5_5M, -@@ -158,6 +160,8 @@ struct ath11k_hw_params { - u32 target_ce_count; - const struct service_to_pipe *svc_to_ce_map; - u32 svc_to_ce_map_len; -+ const struct ce_ie_addr *ce_ie_addr; -+ const struct ce_remap *ce_remap; - - bool single_pdev_only; - -@@ -277,6 +281,11 @@ extern const struct ath11k_hw_ring_mask - extern const struct ath11k_hw_ring_mask ath11k_hw_ring_mask_qcn9074; - extern const struct ath11k_hw_ring_mask ath11k_hw_ring_mask_wcn6750; - -+extern const struct ce_ie_addr ath11k_ce_ie_addr_ipq8074; -+extern const struct ce_ie_addr ath11k_ce_ie_addr_ipq5018; -+ -+extern const struct ce_remap ath11k_ce_remap_ipq5018; -+ - extern const struct ath11k_hw_hal_params ath11k_hw_hal_params_ipq8074; - extern const struct ath11k_hw_hal_params ath11k_hw_hal_params_qca6390; - extern const struct ath11k_hw_hal_params ath11k_hw_hal_params_wcn6750; ---- a/drivers/net/wireless/ath/ath11k/pci.c -+++ b/drivers/net/wireless/ath/ath11k/pci.c -@@ -543,6 +543,8 @@ static int ath11k_pci_claim(struct ath11 - goto clear_master; - } - -+ ab->mem_ce = ab->mem; -+ - ath11k_dbg(ab, ATH11K_DBG_BOOT, "boot pci_mem 0x%pK\n", ab->mem); - return 0; - diff --git a/package/kernel/mac80211/patches/ath11k/0022-wifi-ath11k-update-hal-srng-regs-for-IPQ5018.patch b/package/kernel/mac80211/patches/ath11k/0022-wifi-ath11k-update-hal-srng-regs-for-IPQ5018.patch deleted file mode 100644 index 35ea20a3c4..0000000000 --- a/package/kernel/mac80211/patches/ath11k/0022-wifi-ath11k-update-hal-srng-regs-for-IPQ5018.patch +++ /dev/null @@ -1,130 +0,0 @@ -From 711b80acbdfb9667a9cf8374e13320a6e624ce73 Mon Sep 17 00:00:00 2001 -From: Sriram R -Date: Fri, 2 Dec 2022 23:37:14 +0200 -Subject: [PATCH] wifi: ath11k: update hal srng regs for IPQ5018 - -IPQ5018 hal srng register address & offsets are not -similar to IPQ8074/IPQ6018/QCN9074, hence define a -new set of srng register group data for IPQ5018. - -Tested-on: IPQ5018 hw1.0 AHB WLAN.HK.2.6.0.1-00861-QCAHKSWPL_SILICONZ-1 - -Signed-off-by: Sriram R -Co-developed-by: Karthikeyan Kathirvel -Signed-off-by: Karthikeyan Kathirvel -Signed-off-by: Kalle Valo -Link: https://lore.kernel.org/r/20221122132152.17771-6-quic_kathirve@quicinc.com ---- - drivers/net/wireless/ath/ath11k/core.c | 1 + - drivers/net/wireless/ath/ath11k/hw.c | 79 ++++++++++++++++++++++++++ - drivers/net/wireless/ath/ath11k/hw.h | 1 + - 3 files changed, 81 insertions(+) - ---- a/drivers/net/wireless/ath/ath11k/core.c -+++ b/drivers/net/wireless/ath/ath11k/core.c -@@ -634,6 +634,7 @@ static const struct ath11k_hw_params ath - .max_fft_bins = 1024, - }, - .internal_sleep_clock = false, -+ .regs = &ipq5018_regs, - .host_ce_config = ath11k_host_ce_config_qcn9074, - .ce_count = CE_CNT_5018, - .target_ce_config = ath11k_target_ce_config_wlan_ipq5018, ---- a/drivers/net/wireless/ath/ath11k/hw.c -+++ b/drivers/net/wireless/ath/ath11k/hw.c -@@ -2645,6 +2645,85 @@ static const struct ath11k_hw_tcl2wbm_rb - }, - }; - -+const struct ath11k_hw_regs ipq5018_regs = { -+ /* SW2TCL(x) R0 ring configuration address */ -+ .hal_tcl1_ring_base_lsb = 0x00000694, -+ .hal_tcl1_ring_base_msb = 0x00000698, -+ .hal_tcl1_ring_id = 0x0000069c, -+ .hal_tcl1_ring_misc = 0x000006a4, -+ .hal_tcl1_ring_tp_addr_lsb = 0x000006b0, -+ .hal_tcl1_ring_tp_addr_msb = 0x000006b4, -+ .hal_tcl1_ring_consumer_int_setup_ix0 = 0x000006c4, -+ .hal_tcl1_ring_consumer_int_setup_ix1 = 0x000006c8, -+ .hal_tcl1_ring_msi1_base_lsb = 0x000006dc, -+ .hal_tcl1_ring_msi1_base_msb = 0x000006e0, -+ .hal_tcl1_ring_msi1_data = 0x000006e4, -+ .hal_tcl2_ring_base_lsb = 0x000006ec, -+ .hal_tcl_ring_base_lsb = 0x0000079c, -+ -+ /* TCL STATUS ring address */ -+ .hal_tcl_status_ring_base_lsb = 0x000008a4, -+ -+ /* REO2SW(x) R0 ring configuration address */ -+ .hal_reo1_ring_base_lsb = 0x000001ec, -+ .hal_reo1_ring_base_msb = 0x000001f0, -+ .hal_reo1_ring_id = 0x000001f4, -+ .hal_reo1_ring_misc = 0x000001fc, -+ .hal_reo1_ring_hp_addr_lsb = 0x00000200, -+ .hal_reo1_ring_hp_addr_msb = 0x00000204, -+ .hal_reo1_ring_producer_int_setup = 0x00000210, -+ .hal_reo1_ring_msi1_base_lsb = 0x00000234, -+ .hal_reo1_ring_msi1_base_msb = 0x00000238, -+ .hal_reo1_ring_msi1_data = 0x0000023c, -+ .hal_reo2_ring_base_lsb = 0x00000244, -+ .hal_reo1_aging_thresh_ix_0 = 0x00000564, -+ .hal_reo1_aging_thresh_ix_1 = 0x00000568, -+ .hal_reo1_aging_thresh_ix_2 = 0x0000056c, -+ .hal_reo1_aging_thresh_ix_3 = 0x00000570, -+ -+ /* REO2SW(x) R2 ring pointers (head/tail) address */ -+ .hal_reo1_ring_hp = 0x00003028, -+ .hal_reo1_ring_tp = 0x0000302c, -+ .hal_reo2_ring_hp = 0x00003030, -+ -+ /* REO2TCL R0 ring configuration address */ -+ .hal_reo_tcl_ring_base_lsb = 0x000003fc, -+ .hal_reo_tcl_ring_hp = 0x00003058, -+ -+ /* SW2REO ring address */ -+ .hal_sw2reo_ring_base_lsb = 0x0000013c, -+ .hal_sw2reo_ring_hp = 0x00003018, -+ -+ /* REO CMD ring address */ -+ .hal_reo_cmd_ring_base_lsb = 0x000000e4, -+ .hal_reo_cmd_ring_hp = 0x00003010, -+ -+ /* REO status address */ -+ .hal_reo_status_ring_base_lsb = 0x00000504, -+ .hal_reo_status_hp = 0x00003070, -+ -+ /* WCSS relative address */ -+ .hal_seq_wcss_umac_ce0_src_reg = 0x08400000 -+ - HAL_IPQ5018_CE_WFSS_REG_BASE, -+ .hal_seq_wcss_umac_ce0_dst_reg = 0x08401000 -+ - HAL_IPQ5018_CE_WFSS_REG_BASE, -+ .hal_seq_wcss_umac_ce1_src_reg = 0x08402000 -+ - HAL_IPQ5018_CE_WFSS_REG_BASE, -+ .hal_seq_wcss_umac_ce1_dst_reg = 0x08403000 -+ - HAL_IPQ5018_CE_WFSS_REG_BASE, -+ -+ /* WBM Idle address */ -+ .hal_wbm_idle_link_ring_base_lsb = 0x00000874, -+ .hal_wbm_idle_link_ring_misc = 0x00000884, -+ -+ /* SW2WBM release address */ -+ .hal_wbm_release_ring_base_lsb = 0x000001ec, -+ -+ /* WBM2SW release address */ -+ .hal_wbm0_release_ring_base_lsb = 0x00000924, -+ .hal_wbm1_release_ring_base_lsb = 0x0000097c, -+}; -+ - const struct ath11k_hw_hal_params ath11k_hw_hal_params_ipq8074 = { - .rx_buf_rbm = HAL_RX_BUF_RBM_SW3_BM, - .tcl2wbm_rbm_map = ath11k_hw_tcl2wbm_rbm_map_ipq8074, ---- a/drivers/net/wireless/ath/ath11k/hw.h -+++ b/drivers/net/wireless/ath/ath11k/hw.h -@@ -415,6 +415,7 @@ extern const struct ath11k_hw_regs qca63 - extern const struct ath11k_hw_regs qcn9074_regs; - extern const struct ath11k_hw_regs wcn6855_regs; - extern const struct ath11k_hw_regs wcn6750_regs; -+extern const struct ath11k_hw_regs ipq5018_regs; - - static inline const char *ath11k_bd_ie_type_str(enum ath11k_bd_ie_type type) - { diff --git a/package/kernel/mac80211/patches/ath11k/0023-wifi-ath11k-initialize-hw_ops-for-IPQ5018.patch b/package/kernel/mac80211/patches/ath11k/0023-wifi-ath11k-initialize-hw_ops-for-IPQ5018.patch deleted file mode 100644 index 5ef701a445..0000000000 --- a/package/kernel/mac80211/patches/ath11k/0023-wifi-ath11k-initialize-hw_ops-for-IPQ5018.patch +++ /dev/null @@ -1,90 +0,0 @@ -From ba60f2793d3a37a00da14bb56a26558a902d2831 Mon Sep 17 00:00:00 2001 -From: Sriram R -Date: Fri, 2 Dec 2022 23:37:14 +0200 -Subject: [PATCH] wifi: ath11k: initialize hw_ops for IPQ5018 - -The ipq5018_ops is initialized for IPQ5018. This is different from -other platforms. - -Tested-on: IPQ5018 hw1.0 AHB WLAN.HK.2.6.0.1-00861-QCAHKSWPL_SILICONZ-1 - -Signed-off-by: Sriram R -Co-developed-by: Karthikeyan Kathirvel -Signed-off-by: Karthikeyan Kathirvel -Signed-off-by: Kalle Valo -Link: https://lore.kernel.org/r/20221122132152.17771-7-quic_kathirve@quicinc.com ---- - drivers/net/wireless/ath/ath11k/core.c | 1 + - drivers/net/wireless/ath/ath11k/hw.c | 40 ++++++++++++++++++++++++++ - drivers/net/wireless/ath/ath11k/hw.h | 1 + - 3 files changed, 42 insertions(+) - ---- a/drivers/net/wireless/ath/ath11k/core.c -+++ b/drivers/net/wireless/ath/ath11k/core.c -@@ -635,6 +635,7 @@ static const struct ath11k_hw_params ath - }, - .internal_sleep_clock = false, - .regs = &ipq5018_regs, -+ .hw_ops = &ipq5018_ops, - .host_ce_config = ath11k_host_ce_config_qcn9074, - .ce_count = CE_CNT_5018, - .target_ce_config = ath11k_target_ce_config_wlan_ipq5018, ---- a/drivers/net/wireless/ath/ath11k/hw.c -+++ b/drivers/net/wireless/ath/ath11k/hw.c -@@ -1084,6 +1084,46 @@ const struct ath11k_hw_ops wcn6750_ops = - .get_ring_selector = ath11k_hw_wcn6750_get_tcl_ring_selector, - }; - -+/* IPQ5018 hw ops is similar to QCN9074 except for the dest ring remap */ -+const struct ath11k_hw_ops ipq5018_ops = { -+ .get_hw_mac_from_pdev_id = ath11k_hw_ipq6018_mac_from_pdev_id, -+ .wmi_init_config = ath11k_init_wmi_config_ipq8074, -+ .mac_id_to_pdev_id = ath11k_hw_mac_id_to_pdev_id_ipq8074, -+ .mac_id_to_srng_id = ath11k_hw_mac_id_to_srng_id_ipq8074, -+ .tx_mesh_enable = ath11k_hw_qcn9074_tx_mesh_enable, -+ .rx_desc_get_first_msdu = ath11k_hw_qcn9074_rx_desc_get_first_msdu, -+ .rx_desc_get_last_msdu = ath11k_hw_qcn9074_rx_desc_get_last_msdu, -+ .rx_desc_get_l3_pad_bytes = ath11k_hw_qcn9074_rx_desc_get_l3_pad_bytes, -+ .rx_desc_get_hdr_status = ath11k_hw_qcn9074_rx_desc_get_hdr_status, -+ .rx_desc_encrypt_valid = ath11k_hw_qcn9074_rx_desc_encrypt_valid, -+ .rx_desc_get_encrypt_type = ath11k_hw_qcn9074_rx_desc_get_encrypt_type, -+ .rx_desc_get_decap_type = ath11k_hw_qcn9074_rx_desc_get_decap_type, -+ .rx_desc_get_mesh_ctl = ath11k_hw_qcn9074_rx_desc_get_mesh_ctl, -+ .rx_desc_get_ldpc_support = ath11k_hw_qcn9074_rx_desc_get_ldpc_support, -+ .rx_desc_get_mpdu_seq_ctl_vld = ath11k_hw_qcn9074_rx_desc_get_mpdu_seq_ctl_vld, -+ .rx_desc_get_mpdu_fc_valid = ath11k_hw_qcn9074_rx_desc_get_mpdu_fc_valid, -+ .rx_desc_get_mpdu_start_seq_no = ath11k_hw_qcn9074_rx_desc_get_mpdu_start_seq_no, -+ .rx_desc_get_msdu_len = ath11k_hw_qcn9074_rx_desc_get_msdu_len, -+ .rx_desc_get_msdu_sgi = ath11k_hw_qcn9074_rx_desc_get_msdu_sgi, -+ .rx_desc_get_msdu_rate_mcs = ath11k_hw_qcn9074_rx_desc_get_msdu_rate_mcs, -+ .rx_desc_get_msdu_rx_bw = ath11k_hw_qcn9074_rx_desc_get_msdu_rx_bw, -+ .rx_desc_get_msdu_freq = ath11k_hw_qcn9074_rx_desc_get_msdu_freq, -+ .rx_desc_get_msdu_pkt_type = ath11k_hw_qcn9074_rx_desc_get_msdu_pkt_type, -+ .rx_desc_get_msdu_nss = ath11k_hw_qcn9074_rx_desc_get_msdu_nss, -+ .rx_desc_get_mpdu_tid = ath11k_hw_qcn9074_rx_desc_get_mpdu_tid, -+ .rx_desc_get_mpdu_peer_id = ath11k_hw_qcn9074_rx_desc_get_mpdu_peer_id, -+ .rx_desc_copy_attn_end_tlv = ath11k_hw_qcn9074_rx_desc_copy_attn_end, -+ .rx_desc_get_mpdu_start_tag = ath11k_hw_qcn9074_rx_desc_get_mpdu_start_tag, -+ .rx_desc_get_mpdu_ppdu_id = ath11k_hw_qcn9074_rx_desc_get_mpdu_ppdu_id, -+ .rx_desc_set_msdu_len = ath11k_hw_qcn9074_rx_desc_set_msdu_len, -+ .rx_desc_get_attention = ath11k_hw_qcn9074_rx_desc_get_attention, -+ .rx_desc_get_msdu_payload = ath11k_hw_qcn9074_rx_desc_get_msdu_payload, -+ .mpdu_info_get_peerid = ath11k_hw_ipq8074_mpdu_info_get_peerid, -+ .rx_desc_mac_addr2_valid = ath11k_hw_ipq9074_rx_desc_mac_addr2_valid, -+ .rx_desc_mpdu_start_addr2 = ath11k_hw_ipq9074_rx_desc_mpdu_start_addr2, -+ -+}; -+ - #define ATH11K_TX_RING_MASK_0 BIT(0) - #define ATH11K_TX_RING_MASK_1 BIT(1) - #define ATH11K_TX_RING_MASK_2 BIT(2) ---- a/drivers/net/wireless/ath/ath11k/hw.h -+++ b/drivers/net/wireless/ath/ath11k/hw.h -@@ -275,6 +275,7 @@ extern const struct ath11k_hw_ops qca639 - extern const struct ath11k_hw_ops qcn9074_ops; - extern const struct ath11k_hw_ops wcn6855_ops; - extern const struct ath11k_hw_ops wcn6750_ops; -+extern const struct ath11k_hw_ops ipq5018_ops; - - extern const struct ath11k_hw_ring_mask ath11k_hw_ring_mask_ipq8074; - extern const struct ath11k_hw_ring_mask ath11k_hw_ring_mask_qca6390; diff --git a/package/kernel/mac80211/patches/ath11k/0024-wifi-ath11k-add-new-hw-ops-for-IPQ5018-to-get-rx-des.patch b/package/kernel/mac80211/patches/ath11k/0024-wifi-ath11k-add-new-hw-ops-for-IPQ5018-to-get-rx-des.patch deleted file mode 100644 index 64531f13f8..0000000000 --- a/package/kernel/mac80211/patches/ath11k/0024-wifi-ath11k-add-new-hw-ops-for-IPQ5018-to-get-rx-des.patch +++ /dev/null @@ -1,84 +0,0 @@ -From 69968f88f1770d61cae0febef805fd00d66cf6a1 Mon Sep 17 00:00:00 2001 -From: Sriram R -Date: Fri, 2 Dec 2022 23:37:15 +0200 -Subject: [PATCH] wifi: ath11k: add new hw ops for IPQ5018 to get rx dest ring - hashmap - -The Destination ring control register is different -for IPQ5018 when compared to IPQ8074/IPQ6018/QCN9074. -Hence create a new hw ops to fetch the hash ring map -for different device variants. ipq5018 hw ops -is similar to qcn9074 except for this change, so reuse -all the qcn9074 ops for ipq5018. - -Tested-on: IPQ5018 hw1.0 AHB WLAN.HK.2.6.0.1-00861-QCAHKSWPL_SILICONZ-1 - -Signed-off-by: Sriram R -Co-developed-by: Karthikeyan Kathirvel -Signed-off-by: Karthikeyan Kathirvel -Signed-off-by: Kalle Valo -Link: https://lore.kernel.org/r/20221122132152.17771-8-quic_kathirve@quicinc.com ---- - drivers/net/wireless/ath/ath11k/hw.c | 44 ++++++++++++++++++++++++++++ - 1 file changed, 44 insertions(+) - ---- a/drivers/net/wireless/ath/ath11k/hw.c -+++ b/drivers/net/wireless/ath/ath11k/hw.c -@@ -791,6 +791,49 @@ static void ath11k_hw_wcn6855_reo_setup( - ring_hash_map); - } - -+static void ath11k_hw_ipq5018_reo_setup(struct ath11k_base *ab) -+{ -+ u32 reo_base = HAL_SEQ_WCSS_UMAC_REO_REG; -+ u32 val; -+ -+ /* Each hash entry uses three bits to map to a particular ring. */ -+ u32 ring_hash_map = HAL_HASH_ROUTING_RING_SW1 << 0 | -+ HAL_HASH_ROUTING_RING_SW2 << 4 | -+ HAL_HASH_ROUTING_RING_SW3 << 8 | -+ HAL_HASH_ROUTING_RING_SW4 << 12 | -+ HAL_HASH_ROUTING_RING_SW1 << 16 | -+ HAL_HASH_ROUTING_RING_SW2 << 20 | -+ HAL_HASH_ROUTING_RING_SW3 << 24 | -+ HAL_HASH_ROUTING_RING_SW4 << 28; -+ -+ val = ath11k_hif_read32(ab, reo_base + HAL_REO1_GEN_ENABLE); -+ -+ val &= ~HAL_REO1_GEN_ENABLE_FRAG_DST_RING; -+ val |= FIELD_PREP(HAL_REO1_GEN_ENABLE_FRAG_DST_RING, -+ HAL_SRNG_RING_ID_REO2SW1) | -+ FIELD_PREP(HAL_REO1_GEN_ENABLE_AGING_LIST_ENABLE, 1) | -+ FIELD_PREP(HAL_REO1_GEN_ENABLE_AGING_FLUSH_ENABLE, 1); -+ ath11k_hif_write32(ab, reo_base + HAL_REO1_GEN_ENABLE, val); -+ -+ ath11k_hif_write32(ab, reo_base + HAL_REO1_AGING_THRESH_IX_0(ab), -+ HAL_DEFAULT_REO_TIMEOUT_USEC); -+ ath11k_hif_write32(ab, reo_base + HAL_REO1_AGING_THRESH_IX_1(ab), -+ HAL_DEFAULT_REO_TIMEOUT_USEC); -+ ath11k_hif_write32(ab, reo_base + HAL_REO1_AGING_THRESH_IX_2(ab), -+ HAL_DEFAULT_REO_TIMEOUT_USEC); -+ ath11k_hif_write32(ab, reo_base + HAL_REO1_AGING_THRESH_IX_3(ab), -+ HAL_DEFAULT_REO_TIMEOUT_USEC); -+ -+ ath11k_hif_write32(ab, reo_base + HAL_REO1_DEST_RING_CTRL_IX_0, -+ ring_hash_map); -+ ath11k_hif_write32(ab, reo_base + HAL_REO1_DEST_RING_CTRL_IX_1, -+ ring_hash_map); -+ ath11k_hif_write32(ab, reo_base + HAL_REO1_DEST_RING_CTRL_IX_2, -+ ring_hash_map); -+ ath11k_hif_write32(ab, reo_base + HAL_REO1_DEST_RING_CTRL_IX_3, -+ ring_hash_map); -+} -+ - static u16 ath11k_hw_ipq8074_mpdu_info_get_peerid(u8 *tlv_data) - { - u16 peer_id = 0; -@@ -1117,6 +1160,7 @@ const struct ath11k_hw_ops ipq5018_ops = - .rx_desc_get_mpdu_ppdu_id = ath11k_hw_qcn9074_rx_desc_get_mpdu_ppdu_id, - .rx_desc_set_msdu_len = ath11k_hw_qcn9074_rx_desc_set_msdu_len, - .rx_desc_get_attention = ath11k_hw_qcn9074_rx_desc_get_attention, -+ .reo_setup = ath11k_hw_ipq5018_reo_setup, - .rx_desc_get_msdu_payload = ath11k_hw_qcn9074_rx_desc_get_msdu_payload, - .mpdu_info_get_peerid = ath11k_hw_ipq8074_mpdu_info_get_peerid, - .rx_desc_mac_addr2_valid = ath11k_hw_ipq9074_rx_desc_mac_addr2_valid, diff --git a/package/kernel/mac80211/patches/ath11k/0025-wifi-ath11k-add-ipq5018-device-support.patch b/package/kernel/mac80211/patches/ath11k/0025-wifi-ath11k-add-ipq5018-device-support.patch deleted file mode 100644 index 5b930e8d4f..0000000000 --- a/package/kernel/mac80211/patches/ath11k/0025-wifi-ath11k-add-ipq5018-device-support.patch +++ /dev/null @@ -1,31 +0,0 @@ -From 25edca7bb18a2a40cc7e54c6f522e9b3c917e2c5 Mon Sep 17 00:00:00 2001 -From: Sriram R -Date: Fri, 2 Dec 2022 23:37:15 +0200 -Subject: [PATCH] wifi: ath11k: add ipq5018 device support - -ipq5018 is a ahb 2ghz device, enable the compatible support for -ipq5018 in ahb. - -Tested-on: IPQ5018 hw1.0 AHB WLAN.HK.2.6.0.1-00861-QCAHKSWPL_SILICONZ-1 - -Signed-off-by: Sriram R -Co-developed-by: Karthikeyan Kathirvel -Signed-off-by: Karthikeyan Kathirvel -Signed-off-by: Kalle Valo -Link: https://lore.kernel.org/r/20221122132152.17771-9-quic_kathirve@quicinc.com ---- - drivers/net/wireless/ath/ath11k/ahb.c | 3 +++ - 1 file changed, 3 insertions(+) - ---- a/drivers/net/wireless/ath/ath11k/ahb.c -+++ b/drivers/net/wireless/ath/ath11k/ahb.c -@@ -32,6 +32,9 @@ static const struct of_device_id ath11k_ - { .compatible = "qcom,wcn6750-wifi", - .data = (void *)ATH11K_HW_WCN6750_HW10, - }, -+ { .compatible = "qcom,ipq5018-wifi", -+ .data = (void *)ATH11K_HW_IPQ5018_HW10, -+ }, - { } - }; - diff --git a/package/kernel/mac80211/patches/ath11k/0026-wifi-ath11k-Fix-scan-request-param-frame-size-warnin.patch b/package/kernel/mac80211/patches/ath11k/0026-wifi-ath11k-Fix-scan-request-param-frame-size-warnin.patch deleted file mode 100644 index 50c14e7b98..0000000000 --- a/package/kernel/mac80211/patches/ath11k/0026-wifi-ath11k-Fix-scan-request-param-frame-size-warnin.patch +++ /dev/null @@ -1,161 +0,0 @@ -From d45daa6d1a8da080f1b516c570a8428a7b9225e4 Mon Sep 17 00:00:00 2001 -From: Karthikeyan Kathirvel -Date: Tue, 6 Dec 2022 00:51:25 +0530 -Subject: [PATCH] wifi: ath11k: Fix scan request param frame size warning - -Following warning was observed - -drivers/net/wireless/ath/ath11k/mac.c:2351:1: warning: the frame -size of 1184 bytes is larger than 1024 bytes [-Wframe-larger-than=] - -A local variable is declared with a size larger than 1024 bytes -this causing a compilation warning. Change the local variable to -heap memory to fix the warning. - -Tested-on: IPQ8074 AHB WLAN.HK.2.7.0.1-01701-QCAHKSWPL_SILICONZ-1 v2 - -Signed-off-by: Karthikeyan Kathirvel -Signed-off-by: Kalle Valo -Link: https://lore.kernel.org/r/20221205192125.13533-1-quic_kathirve@quicinc.com ---- - drivers/net/wireless/ath/ath11k/mac.c | 83 +++++++++++++++------------ - 1 file changed, 45 insertions(+), 38 deletions(-) - ---- a/drivers/net/wireless/ath/ath11k/mac.c -+++ b/drivers/net/wireless/ath/ath11k/mac.c -@@ -3612,7 +3612,7 @@ static int ath11k_mac_op_hw_scan(struct - struct ath11k *ar = hw->priv; - struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif); - struct cfg80211_scan_request *req = &hw_req->req; -- struct scan_req_params arg; -+ struct scan_req_params *arg = NULL; - int ret = 0; - int i; - u32 scan_timeout; -@@ -3640,72 +3640,78 @@ static int ath11k_mac_op_hw_scan(struct - if (ret) - goto exit; - -- memset(&arg, 0, sizeof(arg)); -- ath11k_wmi_start_scan_init(ar, &arg); -- arg.vdev_id = arvif->vdev_id; -- arg.scan_id = ATH11K_SCAN_ID; -+ arg = kzalloc(sizeof(*arg), GFP_KERNEL); -+ -+ if (!arg) { -+ ret = -ENOMEM; -+ goto exit; -+ } -+ -+ ath11k_wmi_start_scan_init(ar, arg); -+ arg->vdev_id = arvif->vdev_id; -+ arg->scan_id = ATH11K_SCAN_ID; - - if (req->ie_len) { -- arg.extraie.ptr = kmemdup(req->ie, req->ie_len, GFP_KERNEL); -- if (!arg.extraie.ptr) { -+ arg->extraie.ptr = kmemdup(req->ie, req->ie_len, GFP_KERNEL); -+ if (!arg->extraie.ptr) { - ret = -ENOMEM; - goto exit; - } -- arg.extraie.len = req->ie_len; -+ arg->extraie.len = req->ie_len; - } - - if (req->n_ssids) { -- arg.num_ssids = req->n_ssids; -- for (i = 0; i < arg.num_ssids; i++) { -- arg.ssid[i].length = req->ssids[i].ssid_len; -- memcpy(&arg.ssid[i].ssid, req->ssids[i].ssid, -+ arg->num_ssids = req->n_ssids; -+ for (i = 0; i < arg->num_ssids; i++) { -+ arg->ssid[i].length = req->ssids[i].ssid_len; -+ memcpy(&arg->ssid[i].ssid, req->ssids[i].ssid, - req->ssids[i].ssid_len); - } - } else { -- arg.scan_flags |= WMI_SCAN_FLAG_PASSIVE; -+ arg->scan_flags |= WMI_SCAN_FLAG_PASSIVE; - } - - if (req->n_channels) { -- arg.num_chan = req->n_channels; -- arg.chan_list = kcalloc(arg.num_chan, sizeof(*arg.chan_list), -- GFP_KERNEL); -+ arg->num_chan = req->n_channels; -+ arg->chan_list = kcalloc(arg->num_chan, sizeof(*arg->chan_list), -+ GFP_KERNEL); - -- if (!arg.chan_list) { -+ if (!arg->chan_list) { - ret = -ENOMEM; - goto exit; - } - -- for (i = 0; i < arg.num_chan; i++) -- arg.chan_list[i] = req->channels[i]->center_freq; -+ for (i = 0; i < arg->num_chan; i++) -+ arg->chan_list[i] = req->channels[i]->center_freq; - } - - if (req->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) { -- arg.scan_f_add_spoofed_mac_in_probe = 1; -- ether_addr_copy(arg.mac_addr.addr, req->mac_addr); -- ether_addr_copy(arg.mac_mask.addr, req->mac_addr_mask); -+ arg->scan_f_add_spoofed_mac_in_probe = 1; -+ ether_addr_copy(arg->mac_addr.addr, req->mac_addr); -+ ether_addr_copy(arg->mac_mask.addr, req->mac_addr_mask); - } - - /* if duration is set, default dwell times will be overwritten */ - if (req->duration) { -- arg.dwell_time_active = req->duration; -- arg.dwell_time_active_2g = req->duration; -- arg.dwell_time_active_6g = req->duration; -- arg.dwell_time_passive = req->duration; -- arg.dwell_time_passive_6g = req->duration; -- arg.burst_duration = req->duration; -+ arg->dwell_time_active = req->duration; -+ arg->dwell_time_active_2g = req->duration; -+ arg->dwell_time_active_6g = req->duration; -+ arg->dwell_time_passive = req->duration; -+ arg->dwell_time_passive_6g = req->duration; -+ arg->burst_duration = req->duration; - -- scan_timeout = min_t(u32, arg.max_rest_time * -- (arg.num_chan - 1) + (req->duration + -+ scan_timeout = min_t(u32, arg->max_rest_time * -+ (arg->num_chan - 1) + (req->duration + - ATH11K_SCAN_CHANNEL_SWITCH_WMI_EVT_OVERHEAD) * -- arg.num_chan, arg.max_scan_time); -+ arg->num_chan, arg->max_scan_time); - } else { -- scan_timeout = arg.max_scan_time; -+ scan_timeout = arg->max_scan_time; - } - - /* Add a margin to account for event/command processing */ - scan_timeout += ATH11K_MAC_SCAN_CMD_EVT_OVERHEAD; - -- ret = ath11k_start_scan(ar, &arg); -+ ret = ath11k_start_scan(ar, arg); - if (ret) { - ath11k_warn(ar->ab, "failed to start hw scan: %d\n", ret); - spin_lock_bh(&ar->data_lock); -@@ -3717,10 +3723,11 @@ static int ath11k_mac_op_hw_scan(struct - msecs_to_jiffies(scan_timeout)); - - exit: -- kfree(arg.chan_list); -- -- if (req->ie_len) -- kfree(arg.extraie.ptr); -+ if (arg) { -+ kfree(arg->chan_list); -+ kfree(arg->extraie.ptr); -+ kfree(arg); -+ } - - mutex_unlock(&ar->conf_mutex); - diff --git a/package/kernel/mac80211/patches/ath11k/0029-wifi-ath11k-Add-support-to-configure-FTM-responder-r.patch b/package/kernel/mac80211/patches/ath11k/0029-wifi-ath11k-Add-support-to-configure-FTM-responder-r.patch deleted file mode 100644 index f652d689b5..0000000000 --- a/package/kernel/mac80211/patches/ath11k/0029-wifi-ath11k-Add-support-to-configure-FTM-responder-r.patch +++ /dev/null @@ -1,169 +0,0 @@ -From a27c6a5853eb9d4f293b99be73a6891fe88263c7 Mon Sep 17 00:00:00 2001 -From: Sowmiya Sree Elavalagan -Date: Tue, 10 Jan 2023 15:30:57 +0200 -Subject: [PATCH] wifi: ath11k: Add support to configure FTM responder role - -Fine Timing Measurement(FTM) support is used to measure round trip -time between two nodes. - -Enable FTM responder feature using hw_params on supported device. -Since FTM functionality is offloaded to firmware, adding the -interface allows user space to enable or disable FTM responder. -Also add support for advertising the same in extended capabilities. - -QCA6390, WCN6855 and WCN6750 do not support this feature. - -Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1 -Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1 - -Signed-off-by: Sowmiya Sree Elavalagan -Signed-off-by: Raj Kumar Bhagat -Signed-off-by: Kalle Valo -Link: https://lore.kernel.org/r/20221220044435.10506-1-quic_rajkbhag@quicinc.com ---- - drivers/net/wireless/ath/ath11k/core.c | 8 ++++++++ - drivers/net/wireless/ath/ath11k/core.h | 1 + - drivers/net/wireless/ath/ath11k/hw.h | 1 + - drivers/net/wireless/ath/ath11k/mac.c | 20 +++++++++++++++++++- - drivers/net/wireless/ath/ath11k/wmi.h | 1 + - 5 files changed, 30 insertions(+), 1 deletion(-) - ---- a/drivers/net/wireless/ath/ath11k/core.c -+++ b/drivers/net/wireless/ath/ath11k/core.c -@@ -116,6 +116,7 @@ static const struct ath11k_hw_params ath - .tcl_ring_retry = true, - .tx_ring_size = DP_TCL_DATA_RING_SIZE, - .smp2p_wow_exit = false, -+ .ftm_responder = true, - }, - { - .hw_rev = ATH11K_HW_IPQ6018_HW10, -@@ -198,6 +199,7 @@ static const struct ath11k_hw_params ath - .tx_ring_size = DP_TCL_DATA_RING_SIZE, - .smp2p_wow_exit = false, - .support_fw_mac_sequence = false, -+ .ftm_responder = true, - }, - { - .name = "qca6390 hw2.0", -@@ -282,6 +284,7 @@ static const struct ath11k_hw_params ath - .tx_ring_size = DP_TCL_DATA_RING_SIZE, - .smp2p_wow_exit = false, - .support_fw_mac_sequence = true, -+ .ftm_responder = false, - }, - { - .name = "qcn9074 hw1.0", -@@ -363,6 +366,7 @@ static const struct ath11k_hw_params ath - .tx_ring_size = DP_TCL_DATA_RING_SIZE, - .smp2p_wow_exit = false, - .support_fw_mac_sequence = false, -+ .ftm_responder = true, - }, - { - .name = "wcn6855 hw2.0", -@@ -447,6 +451,7 @@ static const struct ath11k_hw_params ath - .tx_ring_size = DP_TCL_DATA_RING_SIZE, - .smp2p_wow_exit = false, - .support_fw_mac_sequence = true, -+ .ftm_responder = false, - }, - { - .name = "wcn6855 hw2.1", -@@ -529,6 +534,7 @@ static const struct ath11k_hw_params ath - .tx_ring_size = DP_TCL_DATA_RING_SIZE, - .smp2p_wow_exit = false, - .support_fw_mac_sequence = true, -+ .ftm_responder = false, - }, - { - .name = "wcn6750 hw1.0", -@@ -609,6 +615,7 @@ static const struct ath11k_hw_params ath - .tx_ring_size = DP_TCL_DATA_RING_SIZE_WCN6750, - .smp2p_wow_exit = true, - .support_fw_mac_sequence = true, -+ .ftm_responder = false, - }, - { - .hw_rev = ATH11K_HW_IPQ5018_HW10, -@@ -688,6 +695,7 @@ static const struct ath11k_hw_params ath - .tx_ring_size = DP_TCL_DATA_RING_SIZE, - .smp2p_wow_exit = false, - .support_fw_mac_sequence = false, -+ .ftm_responder = true, - }, - }; - ---- a/drivers/net/wireless/ath/ath11k/core.h -+++ b/drivers/net/wireless/ath/ath11k/core.h -@@ -346,6 +346,7 @@ struct ath11k_vif { - - bool is_started; - bool is_up; -+ bool ftm_responder; - bool spectral_enabled; - bool ps; - u32 aid; ---- a/drivers/net/wireless/ath/ath11k/hw.h -+++ b/drivers/net/wireless/ath/ath11k/hw.h -@@ -224,6 +224,7 @@ struct ath11k_hw_params { - u32 tx_ring_size; - bool smp2p_wow_exit; - bool support_fw_mac_sequence; -+ bool ftm_responder; - }; - - struct ath11k_hw_ops { ---- a/drivers/net/wireless/ath/ath11k/mac.c -+++ b/drivers/net/wireless/ath/ath11k/mac.c -@@ -3110,7 +3110,7 @@ static void ath11k_mac_op_bss_info_chang - u16 bitrate; - int ret = 0; - u8 rateidx; -- u32 rate; -+ u32 rate, param; - u32 ipv4_cnt; - - mutex_lock(&ar->conf_mutex); -@@ -3412,6 +3412,20 @@ static void ath11k_mac_op_bss_info_chang - } - } - -+ if (changed & BSS_CHANGED_FTM_RESPONDER && -+ arvif->ftm_responder != info->ftm_responder && -+ ar->ab->hw_params.ftm_responder && -+ (vif->type == NL80211_IFTYPE_AP || -+ vif->type == NL80211_IFTYPE_MESH_POINT)) { -+ arvif->ftm_responder = info->ftm_responder; -+ param = WMI_VDEV_PARAM_ENABLE_DISABLE_RTT_RESPONDER_ROLE; -+ ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param, -+ arvif->ftm_responder); -+ if (ret) -+ ath11k_warn(ar->ab, "Failed to set ftm responder %i: %d\n", -+ arvif->vdev_id, ret); -+ } -+ - if (changed & BSS_CHANGED_FILS_DISCOVERY || - changed & BSS_CHANGED_UNSOL_BCAST_PROBE_RESP) - ath11k_mac_fils_discovery(arvif, info); -@@ -9113,6 +9127,10 @@ static int __ath11k_mac_register(struct - wiphy_ext_feature_set(ar->hw->wiphy, - NL80211_EXT_FEATURE_SET_SCAN_DWELL); - -+ if (ab->hw_params.ftm_responder) -+ wiphy_ext_feature_set(ar->hw->wiphy, -+ NL80211_EXT_FEATURE_ENABLE_FTM_RESPONDER); -+ - ath11k_reg_init(ar); - - if (!test_bit(ATH11K_FLAG_RAW_MODE, &ab->dev_flags)) { ---- a/drivers/net/wireless/ath/ath11k/wmi.h -+++ b/drivers/net/wireless/ath/ath11k/wmi.h -@@ -1073,6 +1073,7 @@ enum wmi_tlv_vdev_param { - WMI_VDEV_PARAM_ENABLE_BCAST_PROBE_RESPONSE, - WMI_VDEV_PARAM_FILS_MAX_CHANNEL_GUARD_TIME, - WMI_VDEV_PARAM_HE_LTF = 0x74, -+ WMI_VDEV_PARAM_ENABLE_DISABLE_RTT_RESPONDER_ROLE = 0x7d, - WMI_VDEV_PARAM_BA_MODE = 0x7e, - WMI_VDEV_PARAM_AUTORATE_MISC_CFG = 0x80, - WMI_VDEV_PARAM_SET_HE_SOUNDING_MODE = 0x87, diff --git a/package/kernel/mac80211/patches/ath11k/0030-wifi-ath11k-add-channel-177-into-5-GHz-channel-list.patch b/package/kernel/mac80211/patches/ath11k/0030-wifi-ath11k-add-channel-177-into-5-GHz-channel-list.patch deleted file mode 100644 index d0ed9c54b8..0000000000 --- a/package/kernel/mac80211/patches/ath11k/0030-wifi-ath11k-add-channel-177-into-5-GHz-channel-list.patch +++ /dev/null @@ -1,41 +0,0 @@ -From e5e94d10c85653609a2893c8d0ef24a27471b68f Mon Sep 17 00:00:00 2001 -From: Wen Gong -Date: Tue, 10 Jan 2023 15:30:58 +0200 -Subject: [PATCH] wifi: ath11k: add channel 177 into 5 GHz channel list - -Add support for the 5 GHz channel 177 with center frequency 5885 MHz and -operating class 125 per IEEE Std 802.11ax-2021, Table E-4. - -Tested-on: WCN6855 hw2.0 PCI WLAN.HSP.1.1-03125-QCAHSPSWPL_V1_V2_SILICONZ_LITE-3 - -Signed-off-by: Wen Gong -Signed-off-by: Kalle Valo -Link: https://lore.kernel.org/r/20221220101912.30816-1-quic_wgong@quicinc.com ---- - drivers/net/wireless/ath/ath11k/core.h | 4 ++-- - drivers/net/wireless/ath/ath11k/mac.c | 1 + - 2 files changed, 3 insertions(+), 2 deletions(-) - ---- a/drivers/net/wireless/ath/ath11k/core.h -+++ b/drivers/net/wireless/ath/ath11k/core.h -@@ -521,8 +521,8 @@ struct ath11k_sta { - #define ATH11K_MIN_5G_FREQ 4150 - #define ATH11K_MIN_6G_FREQ 5925 - #define ATH11K_MAX_6G_FREQ 7115 --#define ATH11K_NUM_CHANS 101 --#define ATH11K_MAX_5G_CHAN 173 -+#define ATH11K_NUM_CHANS 102 -+#define ATH11K_MAX_5G_CHAN 177 - - enum ath11k_state { - ATH11K_STATE_OFF, ---- a/drivers/net/wireless/ath/ath11k/mac.c -+++ b/drivers/net/wireless/ath/ath11k/mac.c -@@ -96,6 +96,7 @@ static const struct ieee80211_channel at - CHAN5G(165, 5825, 0), - CHAN5G(169, 5845, 0), - CHAN5G(173, 5865, 0), -+ CHAN5G(177, 5885, 0), - }; - - static const struct ieee80211_channel ath11k_6ghz_channels[] = { diff --git a/package/kernel/mac80211/patches/ath11k/0031-wifi-ath11k-fix-ce-memory-mapping-for-ahb-devices.patch b/package/kernel/mac80211/patches/ath11k/0031-wifi-ath11k-fix-ce-memory-mapping-for-ahb-devices.patch deleted file mode 100644 index 2786799972..0000000000 --- a/package/kernel/mac80211/patches/ath11k/0031-wifi-ath11k-fix-ce-memory-mapping-for-ahb-devices.patch +++ /dev/null @@ -1,114 +0,0 @@ -From 53a998c4d7284debd77734d01e1466e59a1d03b2 Mon Sep 17 00:00:00 2001 -From: Raj Kumar Bhagat -Date: Fri, 13 Jan 2023 12:02:09 +0530 -Subject: [PATCH] wifi: ath11k: fix ce memory mapping for ahb devices - -Currently ath11k_ahb module is not loaded successfully and the wifi -interface is not created. Kernel trace is seen while loading the -ath11k_ahb module. The issue is seen in all ath11k AHB devices except -in IPQ5018. - -This happens because in ath11k_ahb_probe(), ab->mem_ce is initialized -with the value of ab->mem. However, at this instant ab->mem is not -yet set. - -Later, during write to a particular memory via ath11k_ahb_write32() -this ab->mem_ce is used with particular offset. Since ab->mem_ce is -not set properly this possibly leads to memory conflict to handle -kernel paging request and the below trace is seen. - -[ 93.035047] Unable to handle kernel paging request at virtual address ffff800100a00000 -[ 93.035083] Mem abort info: -[ 93.041869] ESR = 0x0000000096000045 -[ 93.044561] EC = 0x25: DABT (current EL), IL = 32 bits -[ 93.048377] SET = 0, FnV = 0 -[ 93.053840] EA = 0, S1PTW = 0 -[ 93.056704] FSC = 0x05: level 1 translation fault -[ 93.059745] Data abort info: -[ 93.064603] ISV = 0, ISS = 0x00000045 -[ 93.067729] CM = 0, WnR = 1 -[ 93.071287] swapper pgtable: 4k pages, 48-bit VAs, pgdp=0000000042219000 -[ 93.074409] [ffff800100a00000] pgd=100000007ffff003, p4d=100000007ffff003, pud=0000000000000000 -[ 93.081195] Internal error: Oops: 0000000096000045 [#1] PREEMPT SMP -[ 93.089598] Modules linked in: ath11k_ahb ath11k_pci ath11k qmi_helpers -[ 93.095851] CPU: 2 PID: 66 Comm: kworker/u8:3 Not tainted 6.1.0-rc8-wt-ath-658126-g58e4b9df840c-dirty #2 -[ 93.102454] Hardware name: Qualcomm Technologies, Inc. IPQ8074/AP-HK14 (DT) -[ 93.112171] Workqueue: ath11k_qmi_driver_event ath11k_qmi_driver_event_work [ath11k] -[ 93.118856] pstate: 40000005 (nZcv daif -PAN -UAO -TCO -DIT -SSBS BTYPE=--) -[ 93.126838] pc : ath11k_ahb_write32+0xc/0x18 [ath11k_ahb] -[ 93.133520] lr : ath11k_hal_srng_setup+0x860/0x8f0 [ath11k] -[ 93.139075] sp : ffff80000aaebb70 -[ 93.144452] x29: ffff80000aaebb70 x28: 0000000000000020 x27: ffff80000aaebc50 -[ 93.147934] x26: ffff000004923750 x25: ffff000004921200 x24: ffff000004928000 -[ 93.155051] x23: 0000000000000020 x22: ffff000004930000 x21: ffff000004923200 -[ 93.162170] x20: ffff000004920000 x19: 00000000eea00000 x18: ffff0000049200f0 -[ 93.169288] x17: 0000000000000000 x16: 0000000000000000 x15: 000000000000025e -[ 93.176405] x14: ffff000003c414f0 x13: 0000000000000000 x12: 0000000000000008 -[ 93.183524] x11: ffff000003c41488 x10: 0000000000000040 x9 : 0000000000000000 -[ 93.190641] x8 : ffff80000a9dd100 x7 : 0000000000000000 x6 : 000000000000003f -[ 93.197759] x5 : ffff800100a00400 x4 : ffff8000031f4018 x3 : 0000000000000004 -[ 93.204877] x2 : 0000000047b62000 x1 : ffff800100a00000 x0 : ffff800012000000 -[ 93.211996] Call trace: -[ 93.219104] ath11k_ahb_write32+0xc/0x18 [ath11k_ahb] -[ 93.221366] ath11k_ce_init_ring+0x184/0x278 [ath11k] -[ 93.226576] ath11k_ce_init_pipes+0x4c/0x1a0 [ath11k] -[ 93.231610] ath11k_core_qmi_firmware_ready+0x3c/0x568 [ath11k] -[ 93.236646] ath11k_qmi_driver_event_work+0x168/0x4f8 [ath11k] -[ 93.242376] process_one_work+0x144/0x350 -[ 93.248275] worker_thread+0x120/0x430 -[ 93.252352] kthread+0xf4/0x110 -[ 93.255997] ret_from_fork+0x10/0x20 -[ 93.259043] Code: d503201f f94e1c00 8b214001 d50332bf (b9000022) -[ 93.262863] ---[ end trace 0000000000000000 ]--- - -However, for the device IPQ5018 ath11k_hw_params .ce_remap is -defined. This parameter is used to recalculate ab->mem_ce and hence, -this issue is not seen in IPQ5018. - -Hence, fix this by initializing ab->mem_ce after ab->mem is set. -ab->mem is set inside the ath11k_ahb_setup_resources() therefore -initialize ab->mem_ce after ath11k_ahb_setup_resources(). - -Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1 - -Fixes: b42b3678c91f ("wifi: ath11k: remap ce register space for IPQ5018") - -Signed-off-by: Raj Kumar Bhagat -Signed-off-by: Kalle Valo -Link: https://lore.kernel.org/r/20230113063209.7256-1-quic_rajkbhag@quicinc.com ---- - drivers/net/wireless/ath/ath11k/ahb.c | 12 ++++++------ - 1 file changed, 6 insertions(+), 6 deletions(-) - ---- a/drivers/net/wireless/ath/ath11k/ahb.c -+++ b/drivers/net/wireless/ath/ath11k/ahb.c -@@ -1157,12 +1157,16 @@ static int ath11k_ahb_probe(struct platf - goto err_core_free; - } - -- ab->mem_ce = ab->mem; -- - ret = ath11k_core_pre_init(ab); - if (ret) - goto err_core_free; - -+ ret = ath11k_ahb_setup_resources(ab); -+ if (ret) -+ goto err_core_free; -+ -+ ab->mem_ce = ab->mem; -+ - if (ab->hw_params.ce_remap) { - const struct ce_remap *ce_remap = ab->hw_params.ce_remap; - /* ce register space is moved out of wcss unlike ipq8074 or ipq6018 -@@ -1177,10 +1181,6 @@ static int ath11k_ahb_probe(struct platf - } - } - -- ret = ath11k_ahb_setup_resources(ab); -- if (ret) -- goto err_core_free; -- - ret = ath11k_ahb_fw_resources_init(ab); - if (ret) - goto err_core_free; diff --git a/package/kernel/mac80211/patches/ath11k/0033-wifi-ath11k-Set-ext-passive-scan-flag-to-adjust-pass.patch b/package/kernel/mac80211/patches/ath11k/0033-wifi-ath11k-Set-ext-passive-scan-flag-to-adjust-pass.patch deleted file mode 100644 index 79b79e1053..0000000000 --- a/package/kernel/mac80211/patches/ath11k/0033-wifi-ath11k-Set-ext-passive-scan-flag-to-adjust-pass.patch +++ /dev/null @@ -1,73 +0,0 @@ -From cf8f3d4deb02a8fdc806c46d4112b69868544697 Mon Sep 17 00:00:00 2001 -From: Tamizh Chelvam Raja -Date: Wed, 15 Feb 2023 20:31:36 +0200 -Subject: [PATCH] wifi: ath11k: Set ext passive scan flag to adjust passive - scan start time - -Set the WMI_SCAN_FLAG_EXT_PASSIVE_SCAN_START_TIME_ENHANCE flag -while sending the scan command. If this flag is enabled when the -incoming scan request comes with a strict start time and its duration -overlaps with next TBTT, then target adjust the start time accordingly -for passive scan. Target supporting this feature will advertise -WMI_TLV_SERVICE_PASSIVE_SCAN_START_TIME_ENHANCE. - -Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.4.0.1-01467-QCAHKSWPL_SILICONZ-1 - -Signed-off-by: Tamizh Chelvam Raja -Signed-off-by: Kalle Valo -Link: https://lore.kernel.org/r/20221222131720.11368-1-quic_tamizhr@quicinc.com ---- - drivers/net/wireless/ath/ath11k/wmi.c | 8 ++++++++ - drivers/net/wireless/ath/ath11k/wmi.h | 3 +++ - 2 files changed, 11 insertions(+) - ---- a/drivers/net/wireless/ath/ath11k/wmi.c -+++ b/drivers/net/wireless/ath/ath11k/wmi.c -@@ -2068,6 +2068,12 @@ void ath11k_wmi_start_scan_init(struct a - WMI_SCAN_EVENT_FOREIGN_CHAN | - WMI_SCAN_EVENT_DEQUEUED; - arg->scan_flags |= WMI_SCAN_CHAN_STAT_EVENT; -+ -+ if (test_bit(WMI_TLV_SERVICE_PASSIVE_SCAN_START_TIME_ENHANCE, -+ ar->ab->wmi_ab.svc_map)) -+ arg->scan_ctrl_flags_ext |= -+ WMI_SCAN_FLAG_EXT_PASSIVE_SCAN_START_TIME_ENHANCE; -+ - arg->num_bssid = 1; - - /* fill bssid_list[0] with 0xff, otherwise bssid and RA will be -@@ -2149,6 +2155,8 @@ ath11k_wmi_copy_scan_event_cntrl_flags(s - /* for adaptive scan mode using 3 bits (21 - 23 bits) */ - WMI_SCAN_SET_DWELL_MODE(cmd->scan_ctrl_flags, - param->adaptive_dwell_time_mode); -+ -+ cmd->scan_ctrl_flags_ext = param->scan_ctrl_flags_ext; - } - - int ath11k_wmi_send_scan_start_cmd(struct ath11k *ar, ---- a/drivers/net/wireless/ath/ath11k/wmi.h -+++ b/drivers/net/wireless/ath/ath11k/wmi.h -@@ -2093,6 +2093,7 @@ enum wmi_tlv_service { - WMI_TLV_SERVICE_EXT2_MSG = 220, - WMI_TLV_SERVICE_PEER_POWER_SAVE_DURATION_SUPPORT = 246, - WMI_TLV_SERVICE_SRG_SRP_SPATIAL_REUSE_SUPPORT = 249, -+ WMI_TLV_SERVICE_PASSIVE_SCAN_START_TIME_ENHANCE = 263, - - /* The second 128 bits */ - WMI_MAX_EXT_SERVICE = 256, -@@ -3223,6 +3224,7 @@ struct wmi_start_scan_cmd { - - #define WMI_SCAN_DWELL_MODE_MASK 0x00E00000 - #define WMI_SCAN_DWELL_MODE_SHIFT 21 -+#define WMI_SCAN_FLAG_EXT_PASSIVE_SCAN_START_TIME_ENHANCE 0x00000800 - - enum { - WMI_SCAN_DWELL_MODE_DEFAULT = 0, -@@ -3270,6 +3272,7 @@ struct scan_req_params { - }; - u32 scan_events; - }; -+ u32 scan_ctrl_flags_ext; - u32 dwell_time_active; - u32 dwell_time_active_2g; - u32 dwell_time_passive; diff --git a/package/kernel/mac80211/patches/ath11k/0034-wifi-ath11k-fix-return-value-check-in-ath11k_ahb_pro.patch b/package/kernel/mac80211/patches/ath11k/0034-wifi-ath11k-fix-return-value-check-in-ath11k_ahb_pro.patch deleted file mode 100644 index 59132913bd..0000000000 --- a/package/kernel/mac80211/patches/ath11k/0034-wifi-ath11k-fix-return-value-check-in-ath11k_ahb_pro.patch +++ /dev/null @@ -1,27 +0,0 @@ -From 342fcde9d91460f01f65707e16368a1571271a3a Mon Sep 17 00:00:00 2001 -From: Yang Yingliang -Date: Fri, 17 Feb 2023 11:00:31 +0800 -Subject: [PATCH] wifi: ath11k: fix return value check in ath11k_ahb_probe() - -ioremap() returns NULL pointer not PTR_ERR() when it fails, -so replace the IS_ERR() check with NULL pointer check. - -Fixes: b42b3678c91f ("wifi: ath11k: remap ce register space for IPQ5018") -Signed-off-by: Yang Yingliang -Signed-off-by: Kalle Valo -Link: https://lore.kernel.org/r/20230217030031.4021289-1-yangyingliang@huawei.com ---- - drivers/net/wireless/ath/ath11k/ahb.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/drivers/net/wireless/ath/ath11k/ahb.c -+++ b/drivers/net/wireless/ath/ath11k/ahb.c -@@ -1174,7 +1174,7 @@ static int ath11k_ahb_probe(struct platf - * to a new space for accessing them. - */ - ab->mem_ce = ioremap(ce_remap->base, ce_remap->size); -- if (IS_ERR(ab->mem_ce)) { -+ if (!ab->mem_ce) { - dev_err(&pdev->dev, "ce ioremap error\n"); - ret = -ENOMEM; - goto err_core_free; diff --git a/package/kernel/mac80211/patches/ath11k/0035-wifi-ath11k-Use-platform_get_irq-to-get-the-interrup.patch b/package/kernel/mac80211/patches/ath11k/0035-wifi-ath11k-Use-platform_get_irq-to-get-the-interrup.patch deleted file mode 100644 index 93a9da8fc2..0000000000 --- a/package/kernel/mac80211/patches/ath11k/0035-wifi-ath11k-Use-platform_get_irq-to-get-the-interrup.patch +++ /dev/null @@ -1,50 +0,0 @@ -From f117276638b7600b981b3fe28550823cfbe1ef23 Mon Sep 17 00:00:00 2001 -From: Douglas Anderson -Date: Wed, 1 Feb 2023 08:54:42 -0800 -Subject: [PATCH] wifi: ath11k: Use platform_get_irq() to get the interrupt - -As of commit a1a2b7125e10 ("of/platform: Drop static setup of IRQ -resource from DT core"), we need to use platform_get_irq() instead of -platform_get_resource() to get our IRQs because -platform_get_resource() simply won't get them anymore. - -This was already fixed in several other Atheros WiFi drivers, -apparently in response to Zeal Robot reports. An example of another -fix is commit 9503a1fc123d ("ath9k: Use platform_get_irq() to get the -interrupt"). ath11k seems to have been missed in this effort, though. - -Without this change, WiFi wasn't coming up on my Qualcomm sc7280-based -hardware. Specifically, "platform_get_resource(pdev, IORESOURCE_IRQ, -i)" was failing even for i=0. - -Tested-on: WCN6750 hw1.0 AHB WLAN.MSL.1.0.1-00887-QCAMSLSWPLZ-1 - -Fixes: a1a2b7125e10 ("of/platform: Drop static setup of IRQ resource from DT core") -Fixes: 00402f49d26f ("ath11k: Add support for WCN6750 device") -Signed-off-by: Douglas Anderson -Tested-by: Jun Yu -Reviewed-by: Lad Prabhakar -Signed-off-by: Kalle Valo -Link: https://lore.kernel.org/r/20230201084131.v2.1.I69cf3d56c97098287fe3a70084ee515098390b70@changeid ---- - drivers/net/wireless/ath/ath11k/ahb.c | 8 ++++---- - 1 file changed, 4 insertions(+), 4 deletions(-) - ---- a/drivers/net/wireless/ath/ath11k/ahb.c -+++ b/drivers/net/wireless/ath/ath11k/ahb.c -@@ -874,11 +874,11 @@ static int ath11k_ahb_setup_msi_resource - ab->pci.msi.ep_base_data = int_prop + 32; - - for (i = 0; i < ab->pci.msi.config->total_vectors; i++) { -- res = platform_get_resource(pdev, IORESOURCE_IRQ, i); -- if (!res) -- return -ENODEV; -+ ret = platform_get_irq(pdev, i); -+ if (ret < 0) -+ return ret; - -- ab->pci.msi.irqs[i] = res->start; -+ ab->pci.msi.irqs[i] = ret; - } - - set_bit(ATH11K_FLAG_MULTI_MSI_VECTORS, &ab->dev_flags); diff --git a/package/kernel/mac80211/patches/ath11k/0036-wifi-ath11k-fix-SAC-bug-on-peer-addition-with-sta-ba.patch b/package/kernel/mac80211/patches/ath11k/0036-wifi-ath11k-fix-SAC-bug-on-peer-addition-with-sta-ba.patch deleted file mode 100644 index b37f070ba6..0000000000 --- a/package/kernel/mac80211/patches/ath11k/0036-wifi-ath11k-fix-SAC-bug-on-peer-addition-with-sta-ba.patch +++ /dev/null @@ -1,53 +0,0 @@ -From 60b7d62ba8cdbd073997bff0f1cdae8d844002c0 Mon Sep 17 00:00:00 2001 -From: Christian Marangi -Date: Thu, 9 Feb 2023 23:26:22 +0100 -Subject: [PATCH] wifi: ath11k: fix SAC bug on peer addition with sta band - migration - -Fix sleep in atomic context warning detected by Smatch static checker -analyzer. - -Following the locking pattern for peer_rhash_add lock tbl_mtx_lock mutex -always even if sta is not transitioning to another band. -This is peer_add function and a more secure locking should not cause -performance regression. - -Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.5.0.1-01208-QCAHKSWPL_SILICONZ-1 - -Fixes: d673cb6fe6c0 ("wifi: ath11k: fix peer addition/deletion error on sta band migration") -Reported-by: Dan Carpenter -Signed-off-by: Christian Marangi -Signed-off-by: Kalle Valo -Link: https://lore.kernel.org/r/20230209222622.1751-1-ansuelsmth@gmail.com ---- - drivers/net/wireless/ath/ath11k/peer.c | 5 +++-- - 1 file changed, 3 insertions(+), 2 deletions(-) - ---- a/drivers/net/wireless/ath/ath11k/peer.c -+++ b/drivers/net/wireless/ath/ath11k/peer.c -@@ -382,22 +382,23 @@ int ath11k_peer_create(struct ath11k *ar - return -ENOBUFS; - } - -+ mutex_lock(&ar->ab->tbl_mtx_lock); - spin_lock_bh(&ar->ab->base_lock); - peer = ath11k_peer_find_by_addr(ar->ab, param->peer_addr); - if (peer) { - if (peer->vdev_id == param->vdev_id) { - spin_unlock_bh(&ar->ab->base_lock); -+ mutex_unlock(&ar->ab->tbl_mtx_lock); - return -EINVAL; - } - - /* Assume sta is transitioning to another band. - * Remove here the peer from rhash. - */ -- mutex_lock(&ar->ab->tbl_mtx_lock); - ath11k_peer_rhash_delete(ar->ab, peer); -- mutex_unlock(&ar->ab->tbl_mtx_lock); - } - spin_unlock_bh(&ar->ab->base_lock); -+ mutex_unlock(&ar->ab->tbl_mtx_lock); - - ret = ath11k_wmi_send_peer_create_cmd(ar, param); - if (ret) { diff --git a/package/kernel/mac80211/patches/ath11k/0037-wifi-ath11k-allow-system-suspend-to-survive-ath11k.patch b/package/kernel/mac80211/patches/ath11k/0037-wifi-ath11k-allow-system-suspend-to-survive-ath11k.patch deleted file mode 100644 index fa680954e6..0000000000 --- a/package/kernel/mac80211/patches/ath11k/0037-wifi-ath11k-allow-system-suspend-to-survive-ath11k.patch +++ /dev/null @@ -1,43 +0,0 @@ -From 7c15430822e71e90203d87e6d0cfe83fa058b0dc Mon Sep 17 00:00:00 2001 -From: Len Brown -Date: Wed, 1 Feb 2023 12:32:01 -0600 -Subject: [PATCH] wifi: ath11k: allow system suspend to survive ath11k - -When ath11k runs into internal errors upon suspend, -it returns an error code to pci_pm_suspend, which -aborts the entire system suspend. - -The driver should not abort system suspend, but should -keep its internal errors to itself, and allow the system -to suspend. Otherwise, a user can suspend a laptop -by closing the lid and sealing it into a case, assuming -that is will suspend, rather than heating up and draining -the battery when in transit. - -In practice, the ath11k device seems to have plenty of transient -errors, and subsequent suspend cycles after this failure -often succeed. - -https://bugzilla.kernel.org/show_bug.cgi?id=216968 - -Fixes: d1b0c33850d29 ("ath11k: implement suspend for QCA6390 PCI devices") - -Signed-off-by: Len Brown -Cc: stable@vger.kernel.org -Signed-off-by: Kalle Valo -Link: https://lore.kernel.org/r/20230201183201.14431-1-len.brown@intel.com ---- - drivers/net/wireless/ath/ath11k/pci.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/drivers/net/wireless/ath/ath11k/pci.c -+++ b/drivers/net/wireless/ath/ath11k/pci.c -@@ -998,7 +998,7 @@ static __maybe_unused int ath11k_pci_pm_ - if (ret) - ath11k_warn(ab, "failed to resume core: %d\n", ret); - -- return ret; -+ return 0; - } - - static SIMPLE_DEV_PM_OPS(ath11k_pci_pm_ops, diff --git a/package/kernel/mac80211/patches/ath11k/0038-wifi-ath11k-modify-accessor-macros-to-match-index-si.patch b/package/kernel/mac80211/patches/ath11k/0038-wifi-ath11k-modify-accessor-macros-to-match-index-si.patch deleted file mode 100644 index 42bf170a03..0000000000 --- a/package/kernel/mac80211/patches/ath11k/0038-wifi-ath11k-modify-accessor-macros-to-match-index-si.patch +++ /dev/null @@ -1,61 +0,0 @@ -From a96f10422e74cde27c100b321b127ec32ae75747 Mon Sep 17 00:00:00 2001 -From: Muna Sinada -Date: Fri, 24 Feb 2023 12:28:03 +0200 -Subject: [PATCH] wifi: ath11k: modify accessor macros to match index size - -HE PHY is only 11 bytes, therefore it should be using byte indexes -instead of dword. Change corresponding macros to reflect this. - -Signed-off-by: Muna Sinada -Signed-off-by: Kalle Valo -Link: https://lore.kernel.org/r/1666128501-12364-2-git-send-email-quic_msinada@quicinc.com ---- - drivers/net/wireless/ath/ath11k/wmi.h | 24 +++++++++++++----------- - 1 file changed, 13 insertions(+), 11 deletions(-) - ---- a/drivers/net/wireless/ath/ath11k/wmi.h -+++ b/drivers/net/wireless/ath/ath11k/wmi.h -@@ -2859,30 +2859,32 @@ struct rx_reorder_queue_remove_params { - #define WMI_VDEV_PARAM_TXBF_SU_TX_BFER BIT(2) - #define WMI_VDEV_PARAM_TXBF_MU_TX_BFER BIT(3) - --#define HECAP_PHYDWORD_0 0 --#define HECAP_PHYDWORD_1 1 --#define HECAP_PHYDWORD_2 2 -+#define HE_PHYCAP_BYTE_0 0 -+#define HE_PHYCAP_BYTE_1 1 -+#define HE_PHYCAP_BYTE_2 2 -+#define HE_PHYCAP_BYTE_3 3 -+#define HE_PHYCAP_BYTE_4 4 - --#define HECAP_PHY_SU_BFER BIT(31) -+#define HECAP_PHY_SU_BFER BIT(7) - #define HECAP_PHY_SU_BFEE BIT(0) - #define HECAP_PHY_MU_BFER BIT(1) --#define HECAP_PHY_UL_MUMIMO BIT(22) --#define HECAP_PHY_UL_MUOFDMA BIT(23) -+#define HECAP_PHY_UL_MUMIMO BIT(6) -+#define HECAP_PHY_UL_MUOFDMA BIT(7) - - #define HECAP_PHY_SUBFMR_GET(hecap_phy) \ -- FIELD_GET(HECAP_PHY_SU_BFER, hecap_phy[HECAP_PHYDWORD_0]) -+ FIELD_GET(HECAP_PHY_SU_BFER, hecap_phy[HE_PHYCAP_BYTE_3]) - - #define HECAP_PHY_SUBFME_GET(hecap_phy) \ -- FIELD_GET(HECAP_PHY_SU_BFEE, hecap_phy[HECAP_PHYDWORD_1]) -+ FIELD_GET(HECAP_PHY_SU_BFEE, hecap_phy[HE_PHYCAP_BYTE_4]) - - #define HECAP_PHY_MUBFMR_GET(hecap_phy) \ -- FIELD_GET(HECAP_PHY_MU_BFER, hecap_phy[HECAP_PHYDWORD_1]) -+ FIELD_GET(HECAP_PHY_MU_BFER, hecap_phy[HE_PHYCAP_BYTE_4]) - - #define HECAP_PHY_ULMUMIMO_GET(hecap_phy) \ -- FIELD_GET(HECAP_PHY_UL_MUMIMO, hecap_phy[HECAP_PHYDWORD_0]) -+ FIELD_GET(HECAP_PHY_UL_MUMIMO, hecap_phy[HE_PHYCAP_BYTE_2]) - - #define HECAP_PHY_ULOFDMA_GET(hecap_phy) \ -- FIELD_GET(HECAP_PHY_UL_MUOFDMA, hecap_phy[HECAP_PHYDWORD_0]) -+ FIELD_GET(HECAP_PHY_UL_MUOFDMA, hecap_phy[HE_PHYCAP_BYTE_2]) - - #define HE_MODE_SU_TX_BFEE BIT(0) - #define HE_MODE_SU_TX_BFER BIT(1) diff --git a/package/kernel/mac80211/patches/ath11k/0039-wifi-ath11k-push-MU-MIMO-params-from-hostapd-to-hard.patch b/package/kernel/mac80211/patches/ath11k/0039-wifi-ath11k-push-MU-MIMO-params-from-hostapd-to-hard.patch deleted file mode 100644 index 298ce1a612..0000000000 --- a/package/kernel/mac80211/patches/ath11k/0039-wifi-ath11k-push-MU-MIMO-params-from-hostapd-to-hard.patch +++ /dev/null @@ -1,300 +0,0 @@ -From 38dfe775d0abf511341f37c1cb77b919a3ad410b Mon Sep 17 00:00:00 2001 -From: Muna Sinada -Date: Fri, 24 Feb 2023 12:28:04 +0200 -Subject: [PATCH] wifi: ath11k: push MU-MIMO params from hostapd to hardware - -In the previous behaviour only HE IE in management frames are changed -regarding MU-MIMO configurations and not in hardware. Adding push of -MU-MIMO configurations to the hardware as well. - -Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.4.0.1-00356-QCAHKSWPL_SILICONZ-1 - -Co-developed-by: Anilkumar Kolli -Signed-off-by: Anilkumar Kolli -Signed-off-by: Muna Sinada -Signed-off-by: Kalle Valo -Link: https://lore.kernel.org/r/1666128501-12364-3-git-send-email-quic_msinada@quicinc.com ---- - drivers/net/wireless/ath/ath11k/mac.c | 200 ++++++++++++++++---------- - drivers/net/wireless/ath/ath11k/wmi.h | 3 + - 2 files changed, 130 insertions(+), 73 deletions(-) - ---- a/drivers/net/wireless/ath/ath11k/mac.c -+++ b/drivers/net/wireless/ath/ath11k/mac.c -@@ -2699,6 +2699,117 @@ static int ath11k_setup_peer_smps(struct - ath11k_smps_map[smps]); - } - -+static bool ath11k_mac_set_he_txbf_conf(struct ath11k_vif *arvif) -+{ -+ struct ath11k *ar = arvif->ar; -+ u32 param, value; -+ int ret; -+ -+ if (!arvif->vif->bss_conf.he_support) -+ return true; -+ -+ param = WMI_VDEV_PARAM_SET_HEMU_MODE; -+ value = 0; -+ if (arvif->vif->bss_conf.he_su_beamformer) { -+ value |= FIELD_PREP(HE_MODE_SU_TX_BFER, HE_SU_BFER_ENABLE); -+ if (arvif->vif->bss_conf.he_mu_beamformer && -+ arvif->vdev_type == WMI_VDEV_TYPE_AP) -+ value |= FIELD_PREP(HE_MODE_MU_TX_BFER, HE_MU_BFER_ENABLE); -+ } -+ -+ if (arvif->vif->type != NL80211_IFTYPE_MESH_POINT) { -+ value |= FIELD_PREP(HE_MODE_DL_OFDMA, HE_DL_MUOFDMA_ENABLE) | -+ FIELD_PREP(HE_MODE_UL_OFDMA, HE_UL_MUOFDMA_ENABLE); -+ -+ if (arvif->vif->bss_conf.he_full_ul_mumimo) -+ value |= FIELD_PREP(HE_MODE_UL_MUMIMO, HE_UL_MUMIMO_ENABLE); -+ -+ if (arvif->vif->bss_conf.he_su_beamformee) -+ value |= FIELD_PREP(HE_MODE_SU_TX_BFEE, HE_SU_BFEE_ENABLE); -+ } -+ -+ ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param, value); -+ if (ret) { -+ ath11k_warn(ar->ab, "failed to set vdev %d HE MU mode: %d\n", -+ arvif->vdev_id, ret); -+ return false; -+ } -+ -+ param = WMI_VDEV_PARAM_SET_HE_SOUNDING_MODE; -+ value = FIELD_PREP(HE_VHT_SOUNDING_MODE, HE_VHT_SOUNDING_MODE_ENABLE) | -+ FIELD_PREP(HE_TRIG_NONTRIG_SOUNDING_MODE, -+ HE_TRIG_NONTRIG_SOUNDING_MODE_ENABLE); -+ ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, -+ param, value); -+ if (ret) { -+ ath11k_warn(ar->ab, "failed to set vdev %d sounding mode: %d\n", -+ arvif->vdev_id, ret); -+ return false; -+ } -+ return true; -+} -+ -+static bool ath11k_mac_vif_recalc_sta_he_txbf(struct ath11k *ar, -+ struct ieee80211_vif *vif, -+ struct ieee80211_sta_he_cap *he_cap) -+{ -+ struct ath11k_vif *arvif = (void *)vif->drv_priv; -+ struct ieee80211_he_cap_elem he_cap_elem = {0}; -+ struct ieee80211_sta_he_cap *cap_band = NULL; -+ struct cfg80211_chan_def def; -+ u32 param = WMI_VDEV_PARAM_SET_HEMU_MODE; -+ u32 hemode = 0; -+ int ret; -+ -+ if (!vif->bss_conf.he_support) -+ return true; -+ -+ if (vif->type != NL80211_IFTYPE_STATION) -+ return false; -+ -+ if (WARN_ON(ath11k_mac_vif_chan(vif, &def))) -+ return false; -+ -+ if (def.chan->band == NL80211_BAND_2GHZ) -+ cap_band = &ar->mac.iftype[NL80211_BAND_2GHZ][vif->type].he_cap; -+ else -+ cap_band = &ar->mac.iftype[NL80211_BAND_5GHZ][vif->type].he_cap; -+ -+ memcpy(&he_cap_elem, &cap_band->he_cap_elem, sizeof(he_cap_elem)); -+ -+ if (HECAP_PHY_SUBFME_GET(he_cap_elem.phy_cap_info)) { -+ if (HECAP_PHY_SUBFMR_GET(he_cap->he_cap_elem.phy_cap_info)) -+ hemode |= FIELD_PREP(HE_MODE_SU_TX_BFEE, HE_SU_BFEE_ENABLE); -+ if (HECAP_PHY_MUBFMR_GET(he_cap->he_cap_elem.phy_cap_info)) -+ hemode |= FIELD_PREP(HE_MODE_MU_TX_BFEE, HE_MU_BFEE_ENABLE); -+ } -+ -+ if (vif->type != NL80211_IFTYPE_MESH_POINT) { -+ hemode |= FIELD_PREP(HE_MODE_DL_OFDMA, HE_DL_MUOFDMA_ENABLE) | -+ FIELD_PREP(HE_MODE_UL_OFDMA, HE_UL_MUOFDMA_ENABLE); -+ -+ if (HECAP_PHY_ULMUMIMO_GET(he_cap_elem.phy_cap_info)) -+ if (HECAP_PHY_ULMUMIMO_GET(he_cap->he_cap_elem.phy_cap_info)) -+ hemode |= FIELD_PREP(HE_MODE_UL_MUMIMO, -+ HE_UL_MUMIMO_ENABLE); -+ -+ if (FIELD_GET(HE_MODE_MU_TX_BFEE, hemode)) -+ hemode |= FIELD_PREP(HE_MODE_SU_TX_BFEE, HE_SU_BFEE_ENABLE); -+ -+ if (FIELD_GET(HE_MODE_MU_TX_BFER, hemode)) -+ hemode |= FIELD_PREP(HE_MODE_SU_TX_BFER, HE_SU_BFER_ENABLE); -+ } -+ -+ ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param, hemode); -+ if (ret) { -+ ath11k_warn(ar->ab, "failed to submit vdev param txbf 0x%x: %d\n", -+ hemode, ret); -+ return false; -+ } -+ -+ return true; -+} -+ - static void ath11k_bss_assoc(struct ieee80211_hw *hw, - struct ieee80211_vif *vif, - struct ieee80211_bss_conf *bss_conf) -@@ -2709,6 +2820,7 @@ static void ath11k_bss_assoc(struct ieee - struct ieee80211_sta *ap_sta; - struct ath11k_peer *peer; - bool is_auth = false; -+ struct ieee80211_sta_he_cap he_cap; - int ret; - - lockdep_assert_held(&ar->conf_mutex); -@@ -2726,6 +2838,9 @@ static void ath11k_bss_assoc(struct ieee - return; - } - -+ /* he_cap here is updated at assoc success for sta mode only */ -+ he_cap = ap_sta->deflink.he_cap; -+ - ath11k_peer_assoc_prepare(ar, vif, ap_sta, &peer_arg, false); - - rcu_read_unlock(); -@@ -2753,6 +2868,12 @@ static void ath11k_bss_assoc(struct ieee - return; - } - -+ if (!ath11k_mac_vif_recalc_sta_he_txbf(ar, vif, &he_cap)) { -+ ath11k_warn(ar->ab, "failed to recalc he txbf for vdev %i on bss %pM\n", -+ arvif->vdev_id, bss_conf->bssid); -+ return; -+ } -+ - WARN_ON(arvif->is_up); - - arvif->aid = vif->cfg.aid; -@@ -3202,6 +3323,8 @@ static void ath11k_mac_op_bss_info_chang - ether_addr_copy(arvif->bssid, info->bssid); - - if (changed & BSS_CHANGED_BEACON_ENABLED) { -+ if (info->enable_beacon) -+ ath11k_mac_set_he_txbf_conf(arvif); - ath11k_control_beaconing(arvif, info); - - if (arvif->is_up && vif->bss_conf.he_support && -@@ -5392,6 +5515,10 @@ static int ath11k_mac_copy_he_cap(struct - - he_cap_elem->mac_cap_info[1] &= - IEEE80211_HE_MAC_CAP1_TF_MAC_PAD_DUR_MASK; -+ he_cap_elem->phy_cap_info[0] &= -+ ~IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G; -+ he_cap_elem->phy_cap_info[0] &= -+ ~IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G; - - he_cap_elem->phy_cap_info[5] &= - ~IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_MASK; -@@ -6026,69 +6153,6 @@ ath11k_mac_setup_vdev_create_params(stru - } - } - --static u32 --ath11k_mac_prepare_he_mode(struct ath11k_pdev *pdev, u32 viftype) --{ -- struct ath11k_pdev_cap *pdev_cap = &pdev->cap; -- struct ath11k_band_cap *cap_band = NULL; -- u32 *hecap_phy_ptr = NULL; -- u32 hemode = 0; -- -- if (pdev->cap.supported_bands & WMI_HOST_WLAN_2G_CAP) -- cap_band = &pdev_cap->band[NL80211_BAND_2GHZ]; -- else -- cap_band = &pdev_cap->band[NL80211_BAND_5GHZ]; -- -- hecap_phy_ptr = &cap_band->he_cap_phy_info[0]; -- -- hemode = FIELD_PREP(HE_MODE_SU_TX_BFEE, HE_SU_BFEE_ENABLE) | -- FIELD_PREP(HE_MODE_SU_TX_BFER, HECAP_PHY_SUBFMR_GET(hecap_phy_ptr)) | -- FIELD_PREP(HE_MODE_UL_MUMIMO, HECAP_PHY_ULMUMIMO_GET(hecap_phy_ptr)); -- -- /* TODO WDS and other modes */ -- if (viftype == NL80211_IFTYPE_AP) { -- hemode |= FIELD_PREP(HE_MODE_MU_TX_BFER, -- HECAP_PHY_MUBFMR_GET(hecap_phy_ptr)) | -- FIELD_PREP(HE_MODE_DL_OFDMA, HE_DL_MUOFDMA_ENABLE) | -- FIELD_PREP(HE_MODE_UL_OFDMA, HE_UL_MUOFDMA_ENABLE); -- } else { -- hemode |= FIELD_PREP(HE_MODE_MU_TX_BFEE, HE_MU_BFEE_ENABLE); -- } -- -- return hemode; --} -- --static int ath11k_set_he_mu_sounding_mode(struct ath11k *ar, -- struct ath11k_vif *arvif) --{ -- u32 param_id, param_value; -- struct ath11k_base *ab = ar->ab; -- int ret = 0; -- -- param_id = WMI_VDEV_PARAM_SET_HEMU_MODE; -- param_value = ath11k_mac_prepare_he_mode(ar->pdev, arvif->vif->type); -- ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, -- param_id, param_value); -- if (ret) { -- ath11k_warn(ab, "failed to set vdev %d HE MU mode: %d param_value %x\n", -- arvif->vdev_id, ret, param_value); -- return ret; -- } -- param_id = WMI_VDEV_PARAM_SET_HE_SOUNDING_MODE; -- param_value = -- FIELD_PREP(HE_VHT_SOUNDING_MODE, HE_VHT_SOUNDING_MODE_ENABLE) | -- FIELD_PREP(HE_TRIG_NONTRIG_SOUNDING_MODE, -- HE_TRIG_NONTRIG_SOUNDING_MODE_ENABLE); -- ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, -- param_id, param_value); -- if (ret) { -- ath11k_warn(ab, "failed to set vdev %d HE MU mode: %d\n", -- arvif->vdev_id, ret); -- return ret; -- } -- return ret; --} -- - static void ath11k_mac_op_update_vif_offload(struct ieee80211_hw *hw, - struct ieee80211_vif *vif) - { -@@ -6757,7 +6821,6 @@ ath11k_mac_vdev_start_restart(struct ath - struct ath11k_base *ab = ar->ab; - struct wmi_vdev_start_req_arg arg = {}; - const struct cfg80211_chan_def *chandef = &ctx->def; -- int he_support = arvif->vif->bss_conf.he_support; - int ret = 0; - - lockdep_assert_held(&ar->conf_mutex); -@@ -6798,15 +6861,6 @@ ath11k_mac_vdev_start_restart(struct ath - spin_lock_bh(&ab->base_lock); - arg.regdomain = ar->ab->dfs_region; - spin_unlock_bh(&ab->base_lock); -- -- if (he_support) { -- ret = ath11k_set_he_mu_sounding_mode(ar, arvif); -- if (ret) { -- ath11k_warn(ar->ab, "failed to set he mode vdev %i\n", -- arg.vdev_id); -- return ret; -- } -- } - } - - arg.channel.passive |= !!(chandef->chan->flags & IEEE80211_CHAN_NO_IR); ---- a/drivers/net/wireless/ath/ath11k/wmi.h -+++ b/drivers/net/wireless/ath/ath11k/wmi.h -@@ -2897,8 +2897,11 @@ struct rx_reorder_queue_remove_params { - #define HE_DL_MUOFDMA_ENABLE 1 - #define HE_UL_MUOFDMA_ENABLE 1 - #define HE_DL_MUMIMO_ENABLE 1 -+#define HE_UL_MUMIMO_ENABLE 1 - #define HE_MU_BFEE_ENABLE 1 - #define HE_SU_BFEE_ENABLE 1 -+#define HE_MU_BFER_ENABLE 1 -+#define HE_SU_BFER_ENABLE 1 - - #define HE_VHT_SOUNDING_MODE_ENABLE 1 - #define HE_SU_MU_SOUNDING_MODE_ENABLE 1 diff --git a/package/kernel/mac80211/patches/ath11k/0040-wifi-ath11k-move-HE-MCS-mapper-to-a-separate-functio.patch b/package/kernel/mac80211/patches/ath11k/0040-wifi-ath11k-move-HE-MCS-mapper-to-a-separate-functio.patch deleted file mode 100644 index 6bc9880e10..0000000000 --- a/package/kernel/mac80211/patches/ath11k/0040-wifi-ath11k-move-HE-MCS-mapper-to-a-separate-functio.patch +++ /dev/null @@ -1,67 +0,0 @@ -From 8077c1bbbc28e527fb29143c46f32c6a9d6cadf0 Mon Sep 17 00:00:00 2001 -From: Muna Sinada -Date: Fri, 24 Feb 2023 12:28:04 +0200 -Subject: [PATCH] wifi: ath11k: move HE MCS mapper to a separate function - -Move HE MCS mapper to a separate function and call new function -in ath11k_mac_copy_he_cap(). - -Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.4.0.1-00356-QCAHKSWPL_SILICONZ-1 - -Signed-off-by: Muna Sinada -Signed-off-by: Kalle Valo -Link: https://lore.kernel.org/r/1666128501-12364-4-git-send-email-quic_msinada@quicinc.com ---- - drivers/net/wireless/ath/ath11k/mac.c | 34 +++++++++++++++++---------- - 1 file changed, 22 insertions(+), 12 deletions(-) - ---- a/drivers/net/wireless/ath/ath11k/mac.c -+++ b/drivers/net/wireless/ath/ath11k/mac.c -@@ -5483,6 +5483,27 @@ static __le16 ath11k_mac_setup_he_6ghz_c - return cpu_to_le16(bcap->he_6ghz_capa); - } - -+static void ath11k_mac_set_hemcsmap(struct ath11k *ar, -+ struct ath11k_pdev_cap *cap, -+ struct ieee80211_sta_he_cap *he_cap, -+ int band) -+{ -+ struct ath11k_band_cap *band_cap = &cap->band[band]; -+ -+ he_cap->he_mcs_nss_supp.rx_mcs_80 = -+ cpu_to_le16(band_cap->he_mcs & 0xffff); -+ he_cap->he_mcs_nss_supp.tx_mcs_80 = -+ cpu_to_le16(band_cap->he_mcs & 0xffff); -+ he_cap->he_mcs_nss_supp.rx_mcs_160 = -+ cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff); -+ he_cap->he_mcs_nss_supp.tx_mcs_160 = -+ cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff); -+ he_cap->he_mcs_nss_supp.rx_mcs_80p80 = -+ cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff); -+ he_cap->he_mcs_nss_supp.tx_mcs_80p80 = -+ cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff); -+} -+ - static int ath11k_mac_copy_he_cap(struct ath11k *ar, - struct ath11k_pdev_cap *cap, - struct ieee80211_sband_iftype_data *data, -@@ -5544,18 +5565,7 @@ static int ath11k_mac_copy_he_cap(struct - break; - } - -- he_cap->he_mcs_nss_supp.rx_mcs_80 = -- cpu_to_le16(band_cap->he_mcs & 0xffff); -- he_cap->he_mcs_nss_supp.tx_mcs_80 = -- cpu_to_le16(band_cap->he_mcs & 0xffff); -- he_cap->he_mcs_nss_supp.rx_mcs_160 = -- cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff); -- he_cap->he_mcs_nss_supp.tx_mcs_160 = -- cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff); -- he_cap->he_mcs_nss_supp.rx_mcs_80p80 = -- cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff); -- he_cap->he_mcs_nss_supp.tx_mcs_80p80 = -- cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff); -+ ath11k_mac_set_hemcsmap(ar, cap, he_cap, band); - - memset(he_cap->ppe_thres, 0, sizeof(he_cap->ppe_thres)); - if (he_cap_elem->phy_cap_info[6] & diff --git a/package/kernel/mac80211/patches/ath11k/0041-wifi-ath11k-generate-rx-and-tx-mcs-maps-for-supporte.patch b/package/kernel/mac80211/patches/ath11k/0041-wifi-ath11k-generate-rx-and-tx-mcs-maps-for-supporte.patch deleted file mode 100644 index 5cb7801b29..0000000000 --- a/package/kernel/mac80211/patches/ath11k/0041-wifi-ath11k-generate-rx-and-tx-mcs-maps-for-supporte.patch +++ /dev/null @@ -1,64 +0,0 @@ -From ebf82988f844dd98e6b007cffcc5e95986056995 Mon Sep 17 00:00:00 2001 -From: Muna Sinada -Date: Fri, 24 Feb 2023 12:28:04 +0200 -Subject: [PATCH] wifi: ath11k: generate rx and tx mcs maps for supported HE - mcs - -Generate rx and tx mcs maps in ath11k_mac_set_hemcsmap() and set them -in supported mcs/nss for HE capabilities. - -Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.4.0.1-00356-QCAHKSWPL_SILICONZ-1 - -Signed-off-by: Muna Sinada -Signed-off-by: Kalle Valo -Link: https://lore.kernel.org/r/1666128501-12364-5-git-send-email-quic_msinada@quicinc.com ---- - drivers/net/wireless/ath/ath11k/mac.c | 30 ++++++++++++++++++++------- - 1 file changed, 23 insertions(+), 7 deletions(-) - ---- a/drivers/net/wireless/ath/ath11k/mac.c -+++ b/drivers/net/wireless/ath/ath11k/mac.c -@@ -5488,20 +5488,36 @@ static void ath11k_mac_set_hemcsmap(stru - struct ieee80211_sta_he_cap *he_cap, - int band) - { -- struct ath11k_band_cap *band_cap = &cap->band[band]; -+ u16 txmcs_map, rxmcs_map; -+ u32 i; - -+ rxmcs_map = 0; -+ txmcs_map = 0; -+ for (i = 0; i < 8; i++) { -+ if (i < ar->num_tx_chains && -+ (ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift) & BIT(i)) -+ txmcs_map |= IEEE80211_HE_MCS_SUPPORT_0_11 << (i * 2); -+ else -+ txmcs_map |= IEEE80211_HE_MCS_NOT_SUPPORTED << (i * 2); -+ -+ if (i < ar->num_rx_chains && -+ (ar->cfg_rx_chainmask >> cap->tx_chain_mask_shift) & BIT(i)) -+ rxmcs_map |= IEEE80211_HE_MCS_SUPPORT_0_11 << (i * 2); -+ else -+ rxmcs_map |= IEEE80211_HE_MCS_NOT_SUPPORTED << (i * 2); -+ } - he_cap->he_mcs_nss_supp.rx_mcs_80 = -- cpu_to_le16(band_cap->he_mcs & 0xffff); -+ cpu_to_le16(rxmcs_map & 0xffff); - he_cap->he_mcs_nss_supp.tx_mcs_80 = -- cpu_to_le16(band_cap->he_mcs & 0xffff); -+ cpu_to_le16(txmcs_map & 0xffff); - he_cap->he_mcs_nss_supp.rx_mcs_160 = -- cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff); -+ cpu_to_le16(rxmcs_map & 0xffff); - he_cap->he_mcs_nss_supp.tx_mcs_160 = -- cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff); -+ cpu_to_le16(txmcs_map & 0xffff); - he_cap->he_mcs_nss_supp.rx_mcs_80p80 = -- cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff); -+ cpu_to_le16(rxmcs_map & 0xffff); - he_cap->he_mcs_nss_supp.tx_mcs_80p80 = -- cpu_to_le16((band_cap->he_mcs >> 16) & 0xffff); -+ cpu_to_le16(txmcs_map & 0xffff); - } - - static int ath11k_mac_copy_he_cap(struct ath11k *ar, diff --git a/package/kernel/mac80211/patches/ath11k/0042-wifi-ath11k-Add-tx-ack-signal-support-for-management.patch b/package/kernel/mac80211/patches/ath11k/0042-wifi-ath11k-Add-tx-ack-signal-support-for-management.patch deleted file mode 100644 index 8d41657311..0000000000 --- a/package/kernel/mac80211/patches/ath11k/0042-wifi-ath11k-Add-tx-ack-signal-support-for-management.patch +++ /dev/null @@ -1,150 +0,0 @@ -From 01c6c9fccbd51c1d9eab0f5794b0271b026178df Mon Sep 17 00:00:00 2001 -From: Abinaya Kalaiselvan -Date: Mon, 19 Dec 2022 11:08:44 +0530 -Subject: [PATCH] wifi: ath11k: Add tx ack signal support for management - packets - -Add support to notify tx ack signal values for management -packets to userspace through nl80211 interface. - -Advertise NL80211_EXT_FEATURE_ACK_SIGNAL_SUPPORT flag -to enable this feature and it will be used for data -packets as well. - -Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1 - -Signed-off-by: Abinaya Kalaiselvan -Signed-off-by: Maharaja Kennadyrajan -Signed-off-by: Kalle Valo -Link: https://lore.kernel.org/r/20221219053844.4084486-1-quic_mkenna@quicinc.com ---- - drivers/net/wireless/ath/ath11k/hw.c | 1 + - drivers/net/wireless/ath/ath11k/mac.c | 5 +++++ - drivers/net/wireless/ath/ath11k/wmi.c | 27 ++++++++++++++++----------- - drivers/net/wireless/ath/ath11k/wmi.h | 3 +++ - 4 files changed, 25 insertions(+), 11 deletions(-) - ---- a/drivers/net/wireless/ath/ath11k/hw.c -+++ b/drivers/net/wireless/ath/ath11k/hw.c -@@ -201,6 +201,7 @@ static void ath11k_init_wmi_config_ipq80 - config->twt_ap_pdev_count = ab->num_radios; - config->twt_ap_sta_count = 1000; - config->flag1 |= WMI_RSRC_CFG_FLAG1_BSS_CHANNEL_INFO_64; -+ config->flag1 |= WMI_RSRC_CFG_FLAG1_ACK_RSSI; - } - - 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 -@@ -9174,6 +9174,11 @@ static int __ath11k_mac_register(struct - goto err_free_if_combs; - } - -+ if (test_bit(WMI_TLV_SERVICE_TX_DATA_MGMT_ACK_RSSI, -+ ar->ab->wmi_ab.svc_map)) -+ wiphy_ext_feature_set(ar->hw->wiphy, -+ NL80211_EXT_FEATURE_ACK_SIGNAL_SUPPORT); -+ - ar->hw->queues = ATH11K_HW_MAX_QUEUES; - ar->hw->wiphy->tx_queue_len = ATH11K_QUEUE_LEN; - ar->hw->offchannel_tx_hw_queue = ATH11K_HW_MAX_QUEUES - 1; ---- a/drivers/net/wireless/ath/ath11k/wmi.c -+++ b/drivers/net/wireless/ath/ath11k/wmi.c -@@ -5229,8 +5229,8 @@ static int ath11k_pull_mgmt_rx_params_tl - return 0; - } - --static int wmi_process_mgmt_tx_comp(struct ath11k *ar, u32 desc_id, -- u32 status) -+static int wmi_process_mgmt_tx_comp(struct ath11k *ar, -+ struct wmi_mgmt_tx_compl_event *tx_compl_param) - { - struct sk_buff *msdu; - struct ieee80211_tx_info *info; -@@ -5238,24 +5238,29 @@ static int wmi_process_mgmt_tx_comp(stru - int num_mgmt; - - spin_lock_bh(&ar->txmgmt_idr_lock); -- msdu = idr_find(&ar->txmgmt_idr, desc_id); -+ msdu = idr_find(&ar->txmgmt_idr, tx_compl_param->desc_id); - - if (!msdu) { - ath11k_warn(ar->ab, "received mgmt tx compl for invalid msdu_id: %d\n", -- desc_id); -+ tx_compl_param->desc_id); - spin_unlock_bh(&ar->txmgmt_idr_lock); - return -ENOENT; - } - -- idr_remove(&ar->txmgmt_idr, desc_id); -+ idr_remove(&ar->txmgmt_idr, tx_compl_param->desc_id); - spin_unlock_bh(&ar->txmgmt_idr_lock); - - skb_cb = ATH11K_SKB_CB(msdu); - dma_unmap_single(ar->ab->dev, skb_cb->paddr, msdu->len, DMA_TO_DEVICE); - - info = IEEE80211_SKB_CB(msdu); -- if ((!(info->flags & IEEE80211_TX_CTL_NO_ACK)) && !status) -+ if ((!(info->flags & IEEE80211_TX_CTL_NO_ACK)) && -+ !tx_compl_param->status) { - info->flags |= IEEE80211_TX_STAT_ACK; -+ if (test_bit(WMI_TLV_SERVICE_TX_DATA_MGMT_ACK_RSSI, -+ ar->ab->wmi_ab.svc_map)) -+ info->status.ack_signal = tx_compl_param->ack_rssi; -+ } - - ieee80211_tx_status_irqsafe(ar->hw, msdu); - -@@ -5267,7 +5272,7 @@ static int wmi_process_mgmt_tx_comp(stru - - ath11k_dbg(ar->ab, ATH11K_DBG_WMI, - "wmi mgmt tx comp pending %d desc id %d\n", -- num_mgmt, desc_id); -+ num_mgmt, tx_compl_param->desc_id); - - if (!num_mgmt) - wake_up(&ar->txmgmt_empty_waitq); -@@ -5300,6 +5305,7 @@ static int ath11k_pull_mgmt_tx_compl_par - param->pdev_id = ev->pdev_id; - param->desc_id = ev->desc_id; - param->status = ev->status; -+ param->ack_rssi = ev->ack_rssi; - - kfree(tb); - return 0; -@@ -7070,13 +7076,12 @@ static void ath11k_mgmt_tx_compl_event(s - goto exit; - } - -- wmi_process_mgmt_tx_comp(ar, tx_compl_param.desc_id, -- tx_compl_param.status); -+ wmi_process_mgmt_tx_comp(ar, &tx_compl_param); - - ath11k_dbg(ab, ATH11K_DBG_MGMT, -- "mgmt tx compl ev pdev_id %d, desc_id %d, status %d", -+ "mgmt tx compl ev pdev_id %d, desc_id %d, status %d ack_rssi %d", - tx_compl_param.pdev_id, tx_compl_param.desc_id, -- tx_compl_param.status); -+ tx_compl_param.status, tx_compl_param.ack_rssi); - - exit: - rcu_read_unlock(); ---- a/drivers/net/wireless/ath/ath11k/wmi.h -+++ b/drivers/net/wireless/ath/ath11k/wmi.h -@@ -2311,6 +2311,7 @@ struct wmi_init_cmd { - } __packed; - - #define WMI_RSRC_CFG_FLAG1_BSS_CHANNEL_INFO_64 BIT(5) -+#define WMI_RSRC_CFG_FLAG1_ACK_RSSI BIT(18) - - struct wmi_resource_config { - u32 tlv_header; -@@ -4550,6 +4551,8 @@ struct wmi_mgmt_tx_compl_event { - u32 desc_id; - u32 status; - u32 pdev_id; -+ u32 ppdu_id; -+ u32 ack_rssi; - } __packed; - - struct wmi_scan_event { diff --git a/package/kernel/mac80211/patches/ath11k/0043-wifi-ath11k-use-proper-regulatory-reference-for-band.patch b/package/kernel/mac80211/patches/ath11k/0043-wifi-ath11k-use-proper-regulatory-reference-for-band.patch deleted file mode 100644 index 5bc195528e..0000000000 --- a/package/kernel/mac80211/patches/ath11k/0043-wifi-ath11k-use-proper-regulatory-reference-for-band.patch +++ /dev/null @@ -1,216 +0,0 @@ -From 25e289e1f52e1f4fb1d07622c6a24f8d8a8e420d Mon Sep 17 00:00:00 2001 -From: Aditya Kumar Singh -Date: Wed, 1 Mar 2023 16:20:58 +0200 -Subject: [PATCH] wifi: ath11k: use proper regulatory reference for bands - -Currently, during regulatory event, 2 GHz/5 GHz is referred -to as 2G/5G including variable names. However, there is no -such entity as 2G or 5G. - -Re-name such occurences to its proper name. No functional changes. - -Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1 -Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1 -Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.5.0.1-01100-QCAHKSWPL_SILICONZ-1 - -Signed-off-by: Aditya Kumar Singh -Signed-off-by: Kalle Valo -Link: https://lore.kernel.org/r/20230110121024.14051-2-quic_adisi@quicinc.com ---- - drivers/net/wireless/ath/ath11k/reg.c | 20 ++++----- - drivers/net/wireless/ath/ath11k/wmi.c | 58 ++++++++++++++------------- - drivers/net/wireless/ath/ath11k/wmi.h | 28 ++++++------- - 3 files changed, 54 insertions(+), 52 deletions(-) - ---- a/drivers/net/wireless/ath/ath11k/reg.c -+++ b/drivers/net/wireless/ath/ath11k/reg.c -@@ -619,7 +619,7 @@ ath11k_reg_build_regd(struct ath11k_base - u32 flags; - char alpha2[3]; - -- num_rules = reg_info->num_5g_reg_rules + reg_info->num_2g_reg_rules; -+ num_rules = reg_info->num_5ghz_reg_rules + reg_info->num_2ghz_reg_rules; - - if (!num_rules) - goto ret; -@@ -644,20 +644,20 @@ ath11k_reg_build_regd(struct ath11k_base - alpha2, ath11k_reg_get_regdom_str(tmp_regd->dfs_region), - reg_info->dfs_region, num_rules); - /* Update reg_rules[] below. Firmware is expected to -- * send these rules in order(2G rules first and then 5G) -+ * send these rules in order(2 GHz rules first and then 5 GHz) - */ - for (; i < num_rules; i++) { -- if (reg_info->num_2g_reg_rules && -- (i < reg_info->num_2g_reg_rules)) { -- reg_rule = reg_info->reg_rules_2g_ptr + i; -+ if (reg_info->num_2ghz_reg_rules && -+ (i < reg_info->num_2ghz_reg_rules)) { -+ reg_rule = reg_info->reg_rules_2ghz_ptr + i; - max_bw = min_t(u16, reg_rule->max_bw, -- reg_info->max_bw_2g); -+ reg_info->max_bw_2ghz); - flags = 0; -- } else if (reg_info->num_5g_reg_rules && -- (j < reg_info->num_5g_reg_rules)) { -- reg_rule = reg_info->reg_rules_5g_ptr + j++; -+ } else if (reg_info->num_5ghz_reg_rules && -+ (j < reg_info->num_5ghz_reg_rules)) { -+ reg_rule = reg_info->reg_rules_5ghz_ptr + j++; - max_bw = min_t(u16, reg_rule->max_bw, -- reg_info->max_bw_5g); -+ reg_info->max_bw_5ghz); - - /* FW doesn't pass NL80211_RRF_AUTO_BW flag for - * BW Auto correction, we can enable this by default ---- a/drivers/net/wireless/ath/ath11k/wmi.c -+++ b/drivers/net/wireless/ath/ath11k/wmi.c -@@ -4959,7 +4959,7 @@ static int ath11k_pull_reg_chan_list_upd - const void **tb; - const struct wmi_reg_chan_list_cc_event *chan_list_event_hdr; - struct wmi_regulatory_rule_struct *wmi_reg_rule; -- u32 num_2g_reg_rules, num_5g_reg_rules; -+ u32 num_2ghz_reg_rules, num_5ghz_reg_rules; - int ret; - - ath11k_dbg(ab, ATH11K_DBG_WMI, "processing regulatory channel list\n"); -@@ -4978,10 +4978,10 @@ static int ath11k_pull_reg_chan_list_upd - return -EPROTO; - } - -- reg_info->num_2g_reg_rules = chan_list_event_hdr->num_2g_reg_rules; -- reg_info->num_5g_reg_rules = chan_list_event_hdr->num_5g_reg_rules; -+ reg_info->num_2ghz_reg_rules = chan_list_event_hdr->num_2ghz_reg_rules; -+ reg_info->num_5ghz_reg_rules = chan_list_event_hdr->num_5ghz_reg_rules; - -- if (!(reg_info->num_2g_reg_rules + reg_info->num_5g_reg_rules)) { -+ if (!(reg_info->num_2ghz_reg_rules + reg_info->num_5ghz_reg_rules)) { - ath11k_warn(ab, "No regulatory rules available in the event info\n"); - kfree(tb); - return -EINVAL; -@@ -5008,46 +5008,48 @@ static int ath11k_pull_reg_chan_list_upd - else if (chan_list_event_hdr->status_code == WMI_REG_SET_CC_STATUS_FAIL) - reg_info->status_code = REG_SET_CC_STATUS_FAIL; - -- reg_info->min_bw_2g = chan_list_event_hdr->min_bw_2g; -- reg_info->max_bw_2g = chan_list_event_hdr->max_bw_2g; -- reg_info->min_bw_5g = chan_list_event_hdr->min_bw_5g; -- reg_info->max_bw_5g = chan_list_event_hdr->max_bw_5g; -+ reg_info->min_bw_2ghz = chan_list_event_hdr->min_bw_2ghz; -+ reg_info->max_bw_2ghz = chan_list_event_hdr->max_bw_2ghz; -+ reg_info->min_bw_5ghz = chan_list_event_hdr->min_bw_5ghz; -+ reg_info->max_bw_5ghz = chan_list_event_hdr->max_bw_5ghz; - -- num_2g_reg_rules = reg_info->num_2g_reg_rules; -- num_5g_reg_rules = reg_info->num_5g_reg_rules; -+ num_2ghz_reg_rules = reg_info->num_2ghz_reg_rules; -+ num_5ghz_reg_rules = reg_info->num_5ghz_reg_rules; - - ath11k_dbg(ab, ATH11K_DBG_WMI, -- "%s:cc %s dsf %d BW: min_2g %d max_2g %d min_5g %d max_5g %d", -+ "%s:cc %s dsf %d BW: min_2ghz %d max_2ghz %d min_5ghz %d max_5ghz %d", - __func__, reg_info->alpha2, reg_info->dfs_region, -- reg_info->min_bw_2g, reg_info->max_bw_2g, -- reg_info->min_bw_5g, reg_info->max_bw_5g); -+ reg_info->min_bw_2ghz, reg_info->max_bw_2ghz, -+ reg_info->min_bw_5ghz, reg_info->max_bw_5ghz); - - ath11k_dbg(ab, ATH11K_DBG_WMI, -- "%s: num_2g_reg_rules %d num_5g_reg_rules %d", __func__, -- num_2g_reg_rules, num_5g_reg_rules); -+ "%s: num_2ghz_reg_rules %d num_5ghz_reg_rules %d", __func__, -+ num_2ghz_reg_rules, num_5ghz_reg_rules); - - wmi_reg_rule = - (struct wmi_regulatory_rule_struct *)((u8 *)chan_list_event_hdr - + sizeof(*chan_list_event_hdr) - + sizeof(struct wmi_tlv)); - -- if (num_2g_reg_rules) { -- reg_info->reg_rules_2g_ptr = create_reg_rules_from_wmi(num_2g_reg_rules, -- wmi_reg_rule); -- if (!reg_info->reg_rules_2g_ptr) { -+ if (num_2ghz_reg_rules) { -+ reg_info->reg_rules_2ghz_ptr = -+ create_reg_rules_from_wmi(num_2ghz_reg_rules, -+ wmi_reg_rule); -+ if (!reg_info->reg_rules_2ghz_ptr) { - kfree(tb); -- ath11k_warn(ab, "Unable to Allocate memory for 2g rules\n"); -+ ath11k_warn(ab, "Unable to Allocate memory for 2 GHz rules\n"); - return -ENOMEM; - } - } - -- if (num_5g_reg_rules) { -- wmi_reg_rule += num_2g_reg_rules; -- reg_info->reg_rules_5g_ptr = create_reg_rules_from_wmi(num_5g_reg_rules, -- wmi_reg_rule); -- if (!reg_info->reg_rules_5g_ptr) { -+ if (num_5ghz_reg_rules) { -+ wmi_reg_rule += num_2ghz_reg_rules; -+ reg_info->reg_rules_5ghz_ptr = -+ create_reg_rules_from_wmi(num_5ghz_reg_rules, -+ wmi_reg_rule); -+ if (!reg_info->reg_rules_5ghz_ptr) { - kfree(tb); -- ath11k_warn(ab, "Unable to Allocate memory for 5g rules\n"); -+ ath11k_warn(ab, "Unable to Allocate memory for 5 GHz rules\n"); - return -ENOMEM; - } - } -@@ -6619,8 +6621,8 @@ fallback: - WARN_ON(1); - mem_free: - if (reg_info) { -- kfree(reg_info->reg_rules_2g_ptr); -- kfree(reg_info->reg_rules_5g_ptr); -+ kfree(reg_info->reg_rules_2ghz_ptr); -+ kfree(reg_info->reg_rules_5ghz_ptr); - kfree(reg_info); - } - return ret; ---- a/drivers/net/wireless/ath/ath11k/wmi.h -+++ b/drivers/net/wireless/ath/ath11k/wmi.h -@@ -4129,14 +4129,14 @@ struct cur_regulatory_info { - u8 alpha2[REG_ALPHA2_LEN + 1]; - u32 dfs_region; - u32 phybitmap; -- u32 min_bw_2g; -- u32 max_bw_2g; -- u32 min_bw_5g; -- u32 max_bw_5g; -- u32 num_2g_reg_rules; -- u32 num_5g_reg_rules; -- struct cur_reg_rule *reg_rules_2g_ptr; -- struct cur_reg_rule *reg_rules_5g_ptr; -+ u32 min_bw_2ghz; -+ u32 max_bw_2ghz; -+ u32 min_bw_5ghz; -+ u32 max_bw_5ghz; -+ u32 num_2ghz_reg_rules; -+ u32 num_5ghz_reg_rules; -+ struct cur_reg_rule *reg_rules_2ghz_ptr; -+ struct cur_reg_rule *reg_rules_5ghz_ptr; - }; - - struct wmi_reg_chan_list_cc_event { -@@ -4148,12 +4148,12 @@ struct wmi_reg_chan_list_cc_event { - u32 domain_code; - u32 dfs_region; - u32 phybitmap; -- u32 min_bw_2g; -- u32 max_bw_2g; -- u32 min_bw_5g; -- u32 max_bw_5g; -- u32 num_2g_reg_rules; -- u32 num_5g_reg_rules; -+ u32 min_bw_2ghz; -+ u32 max_bw_2ghz; -+ u32 min_bw_5ghz; -+ u32 max_bw_5ghz; -+ u32 num_2ghz_reg_rules; -+ u32 num_5ghz_reg_rules; - } __packed; - - struct wmi_regulatory_rule_struct { diff --git a/package/kernel/mac80211/patches/ath11k/0044-wifi-ath11k-add-support-to-parse-new-WMI-event-for-6.patch b/package/kernel/mac80211/patches/ath11k/0044-wifi-ath11k-add-support-to-parse-new-WMI-event-for-6.patch deleted file mode 100644 index e165c09dc4..0000000000 --- a/package/kernel/mac80211/patches/ath11k/0044-wifi-ath11k-add-support-to-parse-new-WMI-event-for-6.patch +++ /dev/null @@ -1,844 +0,0 @@ -From 91fa00fa69224aae5afb720c5e68b22e4c4f7333 Mon Sep 17 00:00:00 2001 -From: Aditya Kumar Singh -Date: Wed, 1 Mar 2023 16:20:59 +0200 -Subject: [PATCH] wifi: ath11k: add support to parse new WMI event for 6 GHz - -In order to support different power levels of 6 GHz AP and client, -new WMI event for regulatory - WMI_REG_CHAN_LIST_CC_EXT_EVENTID is -added in firmware. This event provides new parameters required for -6 GHz regulatory rules. - -Add support for parsing 2.4 GHz, 5 GHz and 6 GHz reg rules and other -parameters from WMI_REG_CHAN_LIST_CC_EXT_EVENTID. - -Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1 -Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1 -Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.5.0.1-01100-QCAHKSWPL_SILICONZ-1 - -Signed-off-by: Lavanya Suresh -Signed-off-by: Wen Gong -Signed-off-by: Aditya Kumar Singh -Signed-off-by: Kalle Valo -Link: https://lore.kernel.org/r/20230110121024.14051-3-quic_adisi@quicinc.com ---- - drivers/net/wireless/ath/ath11k/reg.c | 37 ++- - drivers/net/wireless/ath/ath11k/wmi.c | 418 +++++++++++++++++++++++++- - drivers/net/wireless/ath/ath11k/wmi.h | 163 +++++++++- - 3 files changed, 584 insertions(+), 34 deletions(-) - ---- a/drivers/net/wireless/ath/ath11k/reg.c -+++ b/drivers/net/wireless/ath/ath11k/reg.c -@@ -613,7 +613,7 @@ ath11k_reg_build_regd(struct ath11k_base - { - struct ieee80211_regdomain *tmp_regd, *default_regd, *new_regd = NULL; - struct cur_reg_rule *reg_rule; -- u8 i = 0, j = 0; -+ u8 i = 0, j = 0, k = 0; - u8 num_rules; - u16 max_bw; - u32 flags; -@@ -621,6 +621,12 @@ ath11k_reg_build_regd(struct ath11k_base - - num_rules = reg_info->num_5ghz_reg_rules + reg_info->num_2ghz_reg_rules; - -+ /* FIXME: Currently taking reg rules for 6 GHz only from Indoor AP mode list. -+ * This can be updated after complete 6 GHz regulatory support is added. -+ */ -+ if (reg_info->is_ext_reg_event) -+ num_rules += reg_info->num_6ghz_rules_ap[WMI_REG_INDOOR_AP]; -+ - if (!num_rules) - goto ret; - -@@ -666,6 +672,14 @@ ath11k_reg_build_regd(struct ath11k_base - * per other BW rule flags we pass from here - */ - flags = NL80211_RRF_AUTO_BW; -+ } else if (reg_info->is_ext_reg_event && -+ reg_info->num_6ghz_rules_ap[WMI_REG_INDOOR_AP] && -+ (k < reg_info->num_6ghz_rules_ap[WMI_REG_INDOOR_AP])) { -+ reg_rule = reg_info->reg_rules_6ghz_ap_ptr[WMI_REG_INDOOR_AP] + -+ k++; -+ max_bw = min_t(u16, reg_rule->max_bw, -+ reg_info->max_bw_6ghz_ap[WMI_REG_INDOOR_AP]); -+ flags = NL80211_RRF_AUTO_BW; - } else { - break; - } -@@ -693,12 +707,21 @@ ath11k_reg_build_regd(struct ath11k_base - continue; - } - -- ath11k_dbg(ab, ATH11K_DBG_REG, -- "\t%d. (%d - %d @ %d) (%d, %d) (%d ms) (FLAGS %d)\n", -- i + 1, reg_rule->start_freq, reg_rule->end_freq, -- max_bw, reg_rule->ant_gain, reg_rule->reg_power, -- tmp_regd->reg_rules[i].dfs_cac_ms, -- flags); -+ if (reg_info->is_ext_reg_event) { -+ ath11k_dbg(ab, ATH11K_DBG_REG, -+ "\t%d. (%d - %d @ %d) (%d, %d) (%d ms) (FLAGS %d) (%d, %d)\n", -+ i + 1, reg_rule->start_freq, reg_rule->end_freq, -+ max_bw, reg_rule->ant_gain, reg_rule->reg_power, -+ tmp_regd->reg_rules[i].dfs_cac_ms, flags, -+ reg_rule->psd_flag, reg_rule->psd_eirp); -+ } else { -+ ath11k_dbg(ab, ATH11K_DBG_REG, -+ "\t%d. (%d - %d @ %d) (%d, %d) (%d ms) (FLAGS %d)\n", -+ i + 1, reg_rule->start_freq, reg_rule->end_freq, -+ max_bw, reg_rule->ant_gain, reg_rule->reg_power, -+ tmp_regd->reg_rules[i].dfs_cac_ms, -+ flags); -+ } - } - - tmp_regd->n_reg_rules = i; ---- a/drivers/net/wireless/ath/ath11k/wmi.c -+++ b/drivers/net/wireless/ath/ath11k/wmi.c -@@ -105,6 +105,8 @@ static const struct wmi_tlv_policy wmi_t - = { .min_len = sizeof(struct wmi_vdev_stopped_event) }, - [WMI_TAG_REG_CHAN_LIST_CC_EVENT] - = { .min_len = sizeof(struct wmi_reg_chan_list_cc_event) }, -+ [WMI_TAG_REG_CHAN_LIST_CC_EXT_EVENT] -+ = { .min_len = sizeof(struct wmi_reg_chan_list_cc_ext_event) }, - [WMI_TAG_MGMT_RX_HDR] - = { .min_len = sizeof(struct wmi_mgmt_rx_hdr) }, - [WMI_TAG_MGMT_TX_COMPL_EVENT] -@@ -3974,6 +3976,10 @@ ath11k_wmi_copy_resource_config(struct w - wmi_cfg->sched_params = tg_cfg->sched_params; - wmi_cfg->twt_ap_pdev_count = tg_cfg->twt_ap_pdev_count; - wmi_cfg->twt_ap_sta_count = tg_cfg->twt_ap_sta_count; -+ wmi_cfg->host_service_flags &= -+ ~(1 << WMI_CFG_HOST_SERVICE_FLAG_REG_CC_EXT); -+ wmi_cfg->host_service_flags |= (tg_cfg->is_reg_cc_ext_event_supported << -+ WMI_CFG_HOST_SERVICE_FLAG_REG_CC_EXT); - } - - static int ath11k_init_cmd_send(struct ath11k_pdev_wmi *wmi, -@@ -4192,6 +4198,10 @@ int ath11k_wmi_cmd_init(struct ath11k_ba - - ab->hw_params.hw_ops->wmi_init_config(ab, &config); - -+ if (test_bit(WMI_TLV_SERVICE_REG_CC_EXT_EVENT_SUPPORT, -+ ab->wmi_ab.svc_map)) -+ config.is_reg_cc_ext_event_supported = 1; -+ - memcpy(&wmi_sc->wlan_resource_config, &config, sizeof(config)); - - init_param.res_cfg = &wmi_sc->wlan_resource_config; -@@ -4995,18 +5005,11 @@ static int ath11k_pull_reg_chan_list_upd - reg_info->phy_id = chan_list_event_hdr->phy_id; - reg_info->ctry_code = chan_list_event_hdr->country_id; - reg_info->reg_dmn_pair = chan_list_event_hdr->domain_code; -- if (chan_list_event_hdr->status_code == WMI_REG_SET_CC_STATUS_PASS) -- reg_info->status_code = REG_SET_CC_STATUS_PASS; -- else if (chan_list_event_hdr->status_code == WMI_REG_CURRENT_ALPHA2_NOT_FOUND) -- reg_info->status_code = REG_CURRENT_ALPHA2_NOT_FOUND; -- else if (chan_list_event_hdr->status_code == WMI_REG_INIT_ALPHA2_NOT_FOUND) -- reg_info->status_code = REG_INIT_ALPHA2_NOT_FOUND; -- else if (chan_list_event_hdr->status_code == WMI_REG_SET_CC_CHANGE_NOT_ALLOWED) -- reg_info->status_code = REG_SET_CC_CHANGE_NOT_ALLOWED; -- else if (chan_list_event_hdr->status_code == WMI_REG_SET_CC_STATUS_NO_MEMORY) -- reg_info->status_code = REG_SET_CC_STATUS_NO_MEMORY; -- else if (chan_list_event_hdr->status_code == WMI_REG_SET_CC_STATUS_FAIL) -- reg_info->status_code = REG_SET_CC_STATUS_FAIL; -+ -+ reg_info->status_code = -+ ath11k_wmi_cc_setting_code_to_reg(chan_list_event_hdr->status_code); -+ -+ reg_info->is_ext_reg_event = false; - - reg_info->min_bw_2ghz = chan_list_event_hdr->min_bw_2ghz; - reg_info->max_bw_2ghz = chan_list_event_hdr->max_bw_2ghz; -@@ -5060,6 +5063,372 @@ static int ath11k_pull_reg_chan_list_upd - return 0; - } - -+static struct cur_reg_rule -+*create_ext_reg_rules_from_wmi(u32 num_reg_rules, -+ struct wmi_regulatory_ext_rule *wmi_reg_rule) -+{ -+ struct cur_reg_rule *reg_rule_ptr; -+ u32 count; -+ -+ reg_rule_ptr = kcalloc(num_reg_rules, sizeof(*reg_rule_ptr), GFP_ATOMIC); -+ -+ if (!reg_rule_ptr) -+ return NULL; -+ -+ for (count = 0; count < num_reg_rules; count++) { -+ reg_rule_ptr[count].start_freq = -+ u32_get_bits(wmi_reg_rule[count].freq_info, -+ REG_RULE_START_FREQ); -+ reg_rule_ptr[count].end_freq = -+ u32_get_bits(wmi_reg_rule[count].freq_info, -+ REG_RULE_END_FREQ); -+ reg_rule_ptr[count].max_bw = -+ u32_get_bits(wmi_reg_rule[count].bw_pwr_info, -+ REG_RULE_MAX_BW); -+ reg_rule_ptr[count].reg_power = -+ u32_get_bits(wmi_reg_rule[count].bw_pwr_info, -+ REG_RULE_REG_PWR); -+ reg_rule_ptr[count].ant_gain = -+ u32_get_bits(wmi_reg_rule[count].bw_pwr_info, -+ REG_RULE_ANT_GAIN); -+ reg_rule_ptr[count].flags = -+ u32_get_bits(wmi_reg_rule[count].flag_info, -+ REG_RULE_FLAGS); -+ reg_rule_ptr[count].psd_flag = -+ u32_get_bits(wmi_reg_rule[count].psd_power_info, -+ REG_RULE_PSD_INFO); -+ reg_rule_ptr[count].psd_eirp = -+ u32_get_bits(wmi_reg_rule[count].psd_power_info, -+ REG_RULE_PSD_EIRP); -+ } -+ -+ return reg_rule_ptr; -+} -+ -+static u8 -+ath11k_invalid_5ghz_reg_ext_rules_from_wmi(u32 num_reg_rules, -+ const struct wmi_regulatory_ext_rule *rule) -+{ -+ u8 num_invalid_5ghz_rules = 0; -+ u32 count, start_freq; -+ -+ for (count = 0; count < num_reg_rules; count++) { -+ start_freq = u32_get_bits(rule[count].freq_info, -+ REG_RULE_START_FREQ); -+ -+ if (start_freq >= ATH11K_MIN_6G_FREQ) -+ num_invalid_5ghz_rules++; -+ } -+ -+ return num_invalid_5ghz_rules; -+} -+ -+static int ath11k_pull_reg_chan_list_ext_update_ev(struct ath11k_base *ab, -+ struct sk_buff *skb, -+ struct cur_regulatory_info *reg_info) -+{ -+ const void **tb; -+ const struct wmi_reg_chan_list_cc_ext_event *ext_chan_list_event_hdr; -+ struct wmi_regulatory_ext_rule *ext_wmi_reg_rule; -+ u32 num_2ghz_reg_rules, num_5ghz_reg_rules; -+ u32 num_6ghz_reg_rules_ap[WMI_REG_CURRENT_MAX_AP_TYPE]; -+ u32 num_6ghz_client[WMI_REG_CURRENT_MAX_AP_TYPE][WMI_REG_MAX_CLIENT_TYPE]; -+ u32 total_reg_rules = 0; -+ int ret, i, j, num_invalid_5ghz_ext_rules = 0; -+ -+ ath11k_dbg(ab, ATH11K_DBG_WMI, "processing regulatory ext channel list\n"); -+ -+ tb = ath11k_wmi_tlv_parse_alloc(ab, skb->data, skb->len, GFP_ATOMIC); -+ if (IS_ERR(tb)) { -+ ret = PTR_ERR(tb); -+ ath11k_warn(ab, "failed to parse tlv: %d\n", ret); -+ return ret; -+ } -+ -+ ext_chan_list_event_hdr = tb[WMI_TAG_REG_CHAN_LIST_CC_EXT_EVENT]; -+ if (!ext_chan_list_event_hdr) { -+ ath11k_warn(ab, "failed to fetch reg chan list ext update ev\n"); -+ kfree(tb); -+ return -EPROTO; -+ } -+ -+ reg_info->num_2ghz_reg_rules = -+ ext_chan_list_event_hdr->num_2ghz_reg_rules; -+ reg_info->num_5ghz_reg_rules = -+ ext_chan_list_event_hdr->num_5ghz_reg_rules; -+ reg_info->num_6ghz_rules_ap[WMI_REG_INDOOR_AP] = -+ ext_chan_list_event_hdr->num_6ghz_reg_rules_ap_lpi; -+ reg_info->num_6ghz_rules_ap[WMI_REG_STANDARD_POWER_AP] = -+ ext_chan_list_event_hdr->num_6ghz_reg_rules_ap_sp; -+ reg_info->num_6ghz_rules_ap[WMI_REG_VERY_LOW_POWER_AP] = -+ ext_chan_list_event_hdr->num_6ghz_reg_rules_ap_vlp; -+ -+ for (i = 0; i < WMI_REG_MAX_CLIENT_TYPE; i++) { -+ reg_info->num_6ghz_rules_client[WMI_REG_INDOOR_AP][i] = -+ ext_chan_list_event_hdr->num_6ghz_reg_rules_client_lpi[i]; -+ reg_info->num_6ghz_rules_client[WMI_REG_STANDARD_POWER_AP][i] = -+ ext_chan_list_event_hdr->num_6ghz_reg_rules_client_sp[i]; -+ reg_info->num_6ghz_rules_client[WMI_REG_VERY_LOW_POWER_AP][i] = -+ ext_chan_list_event_hdr->num_6ghz_reg_rules_client_vlp[i]; -+ } -+ -+ num_2ghz_reg_rules = reg_info->num_2ghz_reg_rules; -+ num_5ghz_reg_rules = reg_info->num_5ghz_reg_rules; -+ -+ total_reg_rules += num_2ghz_reg_rules; -+ total_reg_rules += num_5ghz_reg_rules; -+ -+ if ((num_2ghz_reg_rules > MAX_REG_RULES) || -+ (num_5ghz_reg_rules > MAX_REG_RULES)) { -+ ath11k_warn(ab, "Num reg rules for 2.4 GHz/5 GHz exceeds max limit (num_2ghz_reg_rules: %d num_5ghz_reg_rules: %d max_rules: %d)\n", -+ num_2ghz_reg_rules, num_5ghz_reg_rules, MAX_REG_RULES); -+ kfree(tb); -+ return -EINVAL; -+ } -+ -+ for (i = 0; i < WMI_REG_CURRENT_MAX_AP_TYPE; i++) { -+ num_6ghz_reg_rules_ap[i] = reg_info->num_6ghz_rules_ap[i]; -+ -+ if (num_6ghz_reg_rules_ap[i] > MAX_6GHZ_REG_RULES) { -+ ath11k_warn(ab, "Num 6 GHz reg rules for AP mode(%d) exceeds max limit (num_6ghz_reg_rules_ap: %d, max_rules: %d)\n", -+ i, num_6ghz_reg_rules_ap[i], MAX_6GHZ_REG_RULES); -+ kfree(tb); -+ return -EINVAL; -+ } -+ -+ total_reg_rules += num_6ghz_reg_rules_ap[i]; -+ } -+ -+ for (i = 0; i < WMI_REG_MAX_CLIENT_TYPE; i++) { -+ num_6ghz_client[WMI_REG_INDOOR_AP][i] = -+ reg_info->num_6ghz_rules_client[WMI_REG_INDOOR_AP][i]; -+ total_reg_rules += num_6ghz_client[WMI_REG_INDOOR_AP][i]; -+ -+ num_6ghz_client[WMI_REG_STANDARD_POWER_AP][i] = -+ reg_info->num_6ghz_rules_client[WMI_REG_STANDARD_POWER_AP][i]; -+ total_reg_rules += num_6ghz_client[WMI_REG_STANDARD_POWER_AP][i]; -+ -+ num_6ghz_client[WMI_REG_VERY_LOW_POWER_AP][i] = -+ reg_info->num_6ghz_rules_client[WMI_REG_VERY_LOW_POWER_AP][i]; -+ total_reg_rules += num_6ghz_client[WMI_REG_VERY_LOW_POWER_AP][i]; -+ -+ if ((num_6ghz_client[WMI_REG_INDOOR_AP][i] > MAX_6GHZ_REG_RULES) || -+ (num_6ghz_client[WMI_REG_STANDARD_POWER_AP][i] > -+ MAX_6GHZ_REG_RULES) || -+ (num_6ghz_client[WMI_REG_VERY_LOW_POWER_AP][i] > -+ MAX_6GHZ_REG_RULES)) { -+ ath11k_warn(ab, -+ "Num 6 GHz client reg rules exceeds max limit, for client(type: %d)\n", -+ i); -+ kfree(tb); -+ return -EINVAL; -+ } -+ } -+ -+ if (!total_reg_rules) { -+ ath11k_warn(ab, "No reg rules available\n"); -+ kfree(tb); -+ return -EINVAL; -+ } -+ -+ memcpy(reg_info->alpha2, &ext_chan_list_event_hdr->alpha2, -+ REG_ALPHA2_LEN); -+ -+ reg_info->dfs_region = ext_chan_list_event_hdr->dfs_region; -+ reg_info->phybitmap = ext_chan_list_event_hdr->phybitmap; -+ reg_info->num_phy = ext_chan_list_event_hdr->num_phy; -+ reg_info->phy_id = ext_chan_list_event_hdr->phy_id; -+ reg_info->ctry_code = ext_chan_list_event_hdr->country_id; -+ reg_info->reg_dmn_pair = ext_chan_list_event_hdr->domain_code; -+ -+ reg_info->status_code = -+ ath11k_wmi_cc_setting_code_to_reg(ext_chan_list_event_hdr->status_code); -+ -+ reg_info->is_ext_reg_event = true; -+ -+ reg_info->min_bw_2ghz = ext_chan_list_event_hdr->min_bw_2ghz; -+ reg_info->max_bw_2ghz = ext_chan_list_event_hdr->max_bw_2ghz; -+ reg_info->min_bw_5ghz = ext_chan_list_event_hdr->min_bw_5ghz; -+ reg_info->max_bw_5ghz = ext_chan_list_event_hdr->max_bw_5ghz; -+ -+ reg_info->min_bw_6ghz_ap[WMI_REG_INDOOR_AP] = -+ ext_chan_list_event_hdr->min_bw_6ghz_ap_lpi; -+ reg_info->max_bw_6ghz_ap[WMI_REG_INDOOR_AP] = -+ ext_chan_list_event_hdr->max_bw_6ghz_ap_lpi; -+ reg_info->min_bw_6ghz_ap[WMI_REG_STANDARD_POWER_AP] = -+ ext_chan_list_event_hdr->min_bw_6ghz_ap_sp; -+ reg_info->max_bw_6ghz_ap[WMI_REG_STANDARD_POWER_AP] = -+ ext_chan_list_event_hdr->max_bw_6ghz_ap_sp; -+ reg_info->min_bw_6ghz_ap[WMI_REG_VERY_LOW_POWER_AP] = -+ ext_chan_list_event_hdr->min_bw_6ghz_ap_vlp; -+ reg_info->max_bw_6ghz_ap[WMI_REG_VERY_LOW_POWER_AP] = -+ ext_chan_list_event_hdr->max_bw_6ghz_ap_vlp; -+ -+ for (i = 0; i < WMI_REG_MAX_CLIENT_TYPE; i++) { -+ reg_info->min_bw_6ghz_client[WMI_REG_INDOOR_AP][i] = -+ ext_chan_list_event_hdr->min_bw_6ghz_client_lpi[i]; -+ reg_info->max_bw_6ghz_client[WMI_REG_INDOOR_AP][i] = -+ ext_chan_list_event_hdr->max_bw_6ghz_client_lpi[i]; -+ reg_info->min_bw_6ghz_client[WMI_REG_STANDARD_POWER_AP][i] = -+ ext_chan_list_event_hdr->min_bw_6ghz_client_sp[i]; -+ reg_info->max_bw_6ghz_client[WMI_REG_STANDARD_POWER_AP][i] = -+ ext_chan_list_event_hdr->max_bw_6ghz_client_sp[i]; -+ reg_info->min_bw_6ghz_client[WMI_REG_VERY_LOW_POWER_AP][i] = -+ ext_chan_list_event_hdr->min_bw_6ghz_client_vlp[i]; -+ reg_info->max_bw_6ghz_client[WMI_REG_VERY_LOW_POWER_AP][i] = -+ ext_chan_list_event_hdr->max_bw_6ghz_client_vlp[i]; -+ } -+ -+ ath11k_dbg(ab, ATH11K_DBG_WMI, -+ "%s:cc_ext %s dsf %d BW: min_2ghz %d max_2ghz %d min_5ghz %d max_5ghz %d", -+ __func__, reg_info->alpha2, reg_info->dfs_region, -+ reg_info->min_bw_2ghz, reg_info->max_bw_2ghz, -+ reg_info->min_bw_5ghz, reg_info->max_bw_5ghz); -+ -+ ath11k_dbg(ab, ATH11K_DBG_WMI, -+ "num_2ghz_reg_rules %d num_5ghz_reg_rules %d", -+ num_2ghz_reg_rules, num_5ghz_reg_rules); -+ -+ ath11k_dbg(ab, ATH11K_DBG_WMI, -+ "num_6ghz_reg_rules_ap_lpi: %d num_6ghz_reg_rules_ap_sp: %d num_6ghz_reg_rules_ap_vlp: %d", -+ num_6ghz_reg_rules_ap[WMI_REG_INDOOR_AP], -+ num_6ghz_reg_rules_ap[WMI_REG_STANDARD_POWER_AP], -+ num_6ghz_reg_rules_ap[WMI_REG_VERY_LOW_POWER_AP]); -+ -+ j = WMI_REG_DEFAULT_CLIENT; -+ ath11k_dbg(ab, ATH11K_DBG_WMI, -+ "6 GHz Regular client: num_6ghz_reg_rules_lpi: %d num_6ghz_reg_rules_sp: %d num_6ghz_reg_rules_vlp: %d", -+ num_6ghz_client[WMI_REG_INDOOR_AP][j], -+ num_6ghz_client[WMI_REG_STANDARD_POWER_AP][j], -+ num_6ghz_client[WMI_REG_VERY_LOW_POWER_AP][j]); -+ -+ j = WMI_REG_SUBORDINATE_CLIENT; -+ ath11k_dbg(ab, ATH11K_DBG_WMI, -+ "6 GHz Subordinate client: num_6ghz_reg_rules_lpi: %d num_6ghz_reg_rules_sp: %d num_6ghz_reg_rules_vlp: %d", -+ num_6ghz_client[WMI_REG_INDOOR_AP][j], -+ num_6ghz_client[WMI_REG_STANDARD_POWER_AP][j], -+ num_6ghz_client[WMI_REG_VERY_LOW_POWER_AP][j]); -+ -+ ext_wmi_reg_rule = -+ (struct wmi_regulatory_ext_rule *)((u8 *)ext_chan_list_event_hdr -+ + sizeof(*ext_chan_list_event_hdr) -+ + sizeof(struct wmi_tlv)); -+ if (num_2ghz_reg_rules) { -+ reg_info->reg_rules_2ghz_ptr = -+ create_ext_reg_rules_from_wmi(num_2ghz_reg_rules, -+ ext_wmi_reg_rule); -+ -+ if (!reg_info->reg_rules_2ghz_ptr) { -+ kfree(tb); -+ ath11k_warn(ab, "Unable to Allocate memory for 2 GHz rules\n"); -+ return -ENOMEM; -+ } -+ } -+ -+ ext_wmi_reg_rule += num_2ghz_reg_rules; -+ -+ /* Firmware might include 6 GHz reg rule in 5 GHz rule list -+ * for few countries along with separate 6 GHz rule. -+ * Having same 6 GHz reg rule in 5 GHz and 6 GHz rules list -+ * causes intersect check to be true, and same rules will be -+ * shown multiple times in iw cmd. -+ * Hence, avoid parsing 6 GHz rule from 5 GHz reg rule list -+ */ -+ num_invalid_5ghz_ext_rules = -+ ath11k_invalid_5ghz_reg_ext_rules_from_wmi(num_5ghz_reg_rules, -+ ext_wmi_reg_rule); -+ -+ if (num_invalid_5ghz_ext_rules) { -+ ath11k_dbg(ab, ATH11K_DBG_WMI, -+ "CC: %s 5 GHz reg rules number %d from fw, %d number of invalid 5 GHz rules", -+ reg_info->alpha2, reg_info->num_5ghz_reg_rules, -+ num_invalid_5ghz_ext_rules); -+ -+ num_5ghz_reg_rules = num_5ghz_reg_rules - num_invalid_5ghz_ext_rules; -+ reg_info->num_5ghz_reg_rules = num_5ghz_reg_rules; -+ } -+ -+ if (num_5ghz_reg_rules) { -+ reg_info->reg_rules_5ghz_ptr = -+ create_ext_reg_rules_from_wmi(num_5ghz_reg_rules, -+ ext_wmi_reg_rule); -+ -+ if (!reg_info->reg_rules_5ghz_ptr) { -+ kfree(tb); -+ ath11k_warn(ab, "Unable to Allocate memory for 5 GHz rules\n"); -+ return -ENOMEM; -+ } -+ } -+ -+ /* We have adjusted the number of 5 GHz reg rules above. But still those -+ * many rules needs to be adjusted in ext_wmi_reg_rule. -+ * -+ * NOTE: num_invalid_5ghz_ext_rules will be 0 for rest other cases. -+ */ -+ ext_wmi_reg_rule += (num_5ghz_reg_rules + num_invalid_5ghz_ext_rules); -+ -+ for (i = 0; i < WMI_REG_CURRENT_MAX_AP_TYPE; i++) { -+ reg_info->reg_rules_6ghz_ap_ptr[i] = -+ create_ext_reg_rules_from_wmi(num_6ghz_reg_rules_ap[i], -+ ext_wmi_reg_rule); -+ -+ if (!reg_info->reg_rules_6ghz_ap_ptr[i]) { -+ kfree(tb); -+ ath11k_warn(ab, "Unable to Allocate memory for 6 GHz AP rules\n"); -+ return -ENOMEM; -+ } -+ -+ ext_wmi_reg_rule += num_6ghz_reg_rules_ap[i]; -+ } -+ -+ for (j = 0; j < WMI_REG_CURRENT_MAX_AP_TYPE; j++) { -+ for (i = 0; i < WMI_REG_MAX_CLIENT_TYPE; i++) { -+ reg_info->reg_rules_6ghz_client_ptr[j][i] = -+ create_ext_reg_rules_from_wmi(num_6ghz_client[j][i], -+ ext_wmi_reg_rule); -+ -+ if (!reg_info->reg_rules_6ghz_client_ptr[j][i]) { -+ kfree(tb); -+ ath11k_warn(ab, "Unable to Allocate memory for 6 GHz client rules\n"); -+ return -ENOMEM; -+ } -+ -+ ext_wmi_reg_rule += num_6ghz_client[j][i]; -+ } -+ } -+ -+ reg_info->client_type = ext_chan_list_event_hdr->client_type; -+ reg_info->rnr_tpe_usable = ext_chan_list_event_hdr->rnr_tpe_usable; -+ reg_info->unspecified_ap_usable = -+ ext_chan_list_event_hdr->unspecified_ap_usable; -+ reg_info->domain_code_6ghz_ap[WMI_REG_INDOOR_AP] = -+ ext_chan_list_event_hdr->domain_code_6ghz_ap_lpi; -+ reg_info->domain_code_6ghz_ap[WMI_REG_STANDARD_POWER_AP] = -+ ext_chan_list_event_hdr->domain_code_6ghz_ap_sp; -+ reg_info->domain_code_6ghz_ap[WMI_REG_VERY_LOW_POWER_AP] = -+ ext_chan_list_event_hdr->domain_code_6ghz_ap_vlp; -+ -+ for (i = 0; i < WMI_REG_MAX_CLIENT_TYPE; i++) { -+ reg_info->domain_code_6ghz_client[WMI_REG_INDOOR_AP][i] = -+ ext_chan_list_event_hdr->domain_code_6ghz_client_lpi[i]; -+ reg_info->domain_code_6ghz_client[WMI_REG_STANDARD_POWER_AP][i] = -+ ext_chan_list_event_hdr->domain_code_6ghz_client_sp[i]; -+ reg_info->domain_code_6ghz_client[WMI_REG_VERY_LOW_POWER_AP][i] = -+ ext_chan_list_event_hdr->domain_code_6ghz_client_vlp[i]; -+ } -+ -+ reg_info->domain_code_6ghz_super_id = -+ ext_chan_list_event_hdr->domain_code_6ghz_super_id; -+ -+ ath11k_dbg(ab, ATH11K_DBG_WMI, "6 GHz client_type: %d domain_code_6ghz_super_id: %d", -+ reg_info->client_type, reg_info->domain_code_6ghz_super_id); -+ -+ ath11k_dbg(ab, ATH11K_DBG_WMI, "processed regulatory ext channel list\n"); -+ -+ kfree(tb); -+ return 0; -+} -+ - static int ath11k_pull_peer_del_resp_ev(struct ath11k_base *ab, struct sk_buff *skb, - struct wmi_peer_delete_resp_event *peer_del_resp) - { -@@ -6507,12 +6876,14 @@ static bool ath11k_reg_is_world_alpha(ch - return false; - } - --static int ath11k_reg_chan_list_event(struct ath11k_base *ab, struct sk_buff *skb) -+static int ath11k_reg_chan_list_event(struct ath11k_base *ab, -+ struct sk_buff *skb, -+ enum wmi_reg_chan_list_cmd_type id) - { - struct cur_regulatory_info *reg_info = NULL; - struct ieee80211_regdomain *regd = NULL; - bool intersect = false; -- int ret = 0, pdev_idx; -+ int ret = 0, pdev_idx, i, j; - struct ath11k *ar; - - reg_info = kzalloc(sizeof(*reg_info), GFP_ATOMIC); -@@ -6521,7 +6892,11 @@ static int ath11k_reg_chan_list_event(st - goto fallback; - } - -- ret = ath11k_pull_reg_chan_list_update_ev(ab, skb, reg_info); -+ if (id == WMI_REG_CHAN_LIST_CC_ID) -+ ret = ath11k_pull_reg_chan_list_update_ev(ab, skb, reg_info); -+ else -+ ret = ath11k_pull_reg_chan_list_ext_update_ev(ab, skb, reg_info); -+ - if (ret) { - ath11k_warn(ab, "failed to extract regulatory info from received event\n"); - goto fallback; -@@ -6623,6 +6998,14 @@ mem_free: - if (reg_info) { - kfree(reg_info->reg_rules_2ghz_ptr); - kfree(reg_info->reg_rules_5ghz_ptr); -+ if (reg_info->is_ext_reg_event) { -+ for (i = 0; i < WMI_REG_CURRENT_MAX_AP_TYPE; i++) -+ kfree(reg_info->reg_rules_6ghz_ap_ptr[i]); -+ -+ for (j = 0; j < WMI_REG_CURRENT_MAX_AP_TYPE; j++) -+ for (i = 0; i < WMI_REG_MAX_CLIENT_TYPE; i++) -+ kfree(reg_info->reg_rules_6ghz_client_ptr[j][i]); -+ } - kfree(reg_info); - } - return ret; -@@ -8054,7 +8437,10 @@ static void ath11k_wmi_tlv_op_rx(struct - ath11k_service_ready_ext2_event(ab, skb); - break; - case WMI_REG_CHAN_LIST_CC_EVENTID: -- ath11k_reg_chan_list_event(ab, skb); -+ ath11k_reg_chan_list_event(ab, skb, WMI_REG_CHAN_LIST_CC_ID); -+ break; -+ case WMI_REG_CHAN_LIST_CC_EXT_EVENTID: -+ ath11k_reg_chan_list_event(ab, skb, WMI_REG_CHAN_LIST_CC_EXT_ID); - break; - case WMI_READY_EVENTID: - ath11k_ready_event(ab, skb); ---- a/drivers/net/wireless/ath/ath11k/wmi.h -+++ b/drivers/net/wireless/ath/ath11k/wmi.h -@@ -797,6 +797,7 @@ enum wmi_tlv_event_id { - WMI_RMC_NEW_LEADER_EVENTID = WMI_TLV_CMD(WMI_GRP_RMC), - WMI_REG_CHAN_LIST_CC_EVENTID = WMI_TLV_CMD(WMI_GRP_REGULATORY), - WMI_11D_NEW_COUNTRY_EVENTID, -+ WMI_REG_CHAN_LIST_CC_EXT_EVENTID, - WMI_NDI_CAP_RSP_EVENTID = WMI_TLV_CMD(WMI_GRP_PROTOTYPE), - WMI_NDP_INITIATOR_RSP_EVENTID, - WMI_NDP_RESPONDER_RSP_EVENTID, -@@ -1865,6 +1866,8 @@ enum wmi_tlv_tag { - WMI_TAG_PDEV_SRG_OBSS_BSSID_ENABLE_BITMAP_CMD, - WMI_TAG_PDEV_NON_SRG_OBSS_COLOR_ENABLE_BITMAP_CMD, - WMI_TAG_PDEV_NON_SRG_OBSS_BSSID_ENABLE_BITMAP_CMD, -+ WMI_TAG_REGULATORY_RULE_EXT_STRUCT = 0x3A9, -+ WMI_TAG_REG_CHAN_LIST_CC_EXT_EVENT, - WMI_TAG_PDEV_SET_BIOS_SAR_TABLE_CMD = 0x3D8, - WMI_TAG_PDEV_SET_BIOS_GEO_TABLE_CMD, - WMI_TAG_MAX -@@ -2097,6 +2100,7 @@ enum wmi_tlv_service { - - /* The second 128 bits */ - WMI_MAX_EXT_SERVICE = 256, -+ WMI_TLV_SERVICE_REG_CC_EXT_EVENT_SUPPORT = 281, - WMI_TLV_SERVICE_BIOS_SAR_SUPPORT = 326, - - /* The third 128 bits */ -@@ -2313,6 +2317,8 @@ struct wmi_init_cmd { - #define WMI_RSRC_CFG_FLAG1_BSS_CHANNEL_INFO_64 BIT(5) - #define WMI_RSRC_CFG_FLAG1_ACK_RSSI BIT(18) - -+#define WMI_CFG_HOST_SERVICE_FLAG_REG_CC_EXT 4 -+ - struct wmi_resource_config { - u32 tlv_header; - u32 num_vdevs; -@@ -2372,6 +2378,15 @@ struct wmi_resource_config { - u32 sched_params; - u32 twt_ap_pdev_count; - u32 twt_ap_sta_count; -+ u32 max_nlo_ssids; -+ u32 num_pkt_filters; -+ u32 num_max_sta_vdevs; -+ u32 max_bssid_indicator; -+ u32 ul_resp_config; -+ u32 msdu_flow_override_config0; -+ u32 msdu_flow_override_config1; -+ u32 flags2; -+ u32 host_service_flags; - } __packed; - - struct wmi_service_ready_event { -@@ -2854,6 +2869,8 @@ struct rx_reorder_queue_remove_params { - #define REG_RULE_MAX_BW 0x0000ffff - #define REG_RULE_REG_PWR 0x00ff0000 - #define REG_RULE_ANT_GAIN 0xff000000 -+#define REG_RULE_PSD_INFO BIT(0) -+#define REG_RULE_PSD_EIRP 0xff0000 - - #define WMI_VDEV_PARAM_TXBF_SU_TX_BFEE BIT(0) - #define WMI_VDEV_PARAM_TXBF_MU_TX_BFEE BIT(1) -@@ -4049,6 +4066,7 @@ struct wmi_he_rate_set { - - #define MAX_REG_RULES 10 - #define REG_ALPHA2_LEN 2 -+#define MAX_6GHZ_REG_RULES 5 - - enum wmi_start_event_param { - WMI_VDEV_START_RESP_EVENT = 0, -@@ -4079,16 +4097,6 @@ enum wmi_vdev_start_resp_status_code { - WMI_VDEV_START_RESPONSE_INVALID_REGDOMAIN = 4, - }; - --; --enum cc_setting_code { -- REG_SET_CC_STATUS_PASS = 0, -- REG_CURRENT_ALPHA2_NOT_FOUND = 1, -- REG_INIT_ALPHA2_NOT_FOUND = 2, -- REG_SET_CC_CHANGE_NOT_ALLOWED = 3, -- REG_SET_CC_STATUS_NO_MEMORY = 4, -- REG_SET_CC_STATUS_FAIL = 5, --}; -- - /* Regaulatory Rule Flags Passed by FW */ - #define REGULATORY_CHAN_DISABLED BIT(0) - #define REGULATORY_CHAN_NO_IR BIT(1) -@@ -4102,13 +4110,72 @@ enum cc_setting_code { - #define REGULATORY_CHAN_NO_20MHZ BIT(11) - #define REGULATORY_CHAN_NO_10MHZ BIT(12) - --enum { -+enum wmi_reg_chan_list_cmd_type { -+ WMI_REG_CHAN_LIST_CC_ID = 0, -+ WMI_REG_CHAN_LIST_CC_EXT_ID = 1, -+}; -+ -+enum wmi_reg_cc_setting_code { - WMI_REG_SET_CC_STATUS_PASS = 0, - WMI_REG_CURRENT_ALPHA2_NOT_FOUND = 1, - WMI_REG_INIT_ALPHA2_NOT_FOUND = 2, - WMI_REG_SET_CC_CHANGE_NOT_ALLOWED = 3, - WMI_REG_SET_CC_STATUS_NO_MEMORY = 4, - WMI_REG_SET_CC_STATUS_FAIL = 5, -+ -+ /* add new setting code above, update in -+ * @enum cc_setting_code as well. -+ * Also handle it in ath11k_wmi_cc_setting_code_to_reg() -+ */ -+}; -+ -+enum cc_setting_code { -+ REG_SET_CC_STATUS_PASS = 0, -+ REG_CURRENT_ALPHA2_NOT_FOUND = 1, -+ REG_INIT_ALPHA2_NOT_FOUND = 2, -+ REG_SET_CC_CHANGE_NOT_ALLOWED = 3, -+ REG_SET_CC_STATUS_NO_MEMORY = 4, -+ REG_SET_CC_STATUS_FAIL = 5, -+ -+ /* add new setting code above, update in -+ * @enum wmi_reg_cc_setting_code as well. -+ */ -+}; -+ -+static inline enum cc_setting_code -+ath11k_wmi_cc_setting_code_to_reg(enum wmi_reg_cc_setting_code status_code) -+{ -+ switch (status_code) { -+ case WMI_REG_SET_CC_STATUS_PASS: -+ return REG_SET_CC_STATUS_PASS; -+ case WMI_REG_CURRENT_ALPHA2_NOT_FOUND: -+ return REG_CURRENT_ALPHA2_NOT_FOUND; -+ case WMI_REG_INIT_ALPHA2_NOT_FOUND: -+ return REG_INIT_ALPHA2_NOT_FOUND; -+ case WMI_REG_SET_CC_CHANGE_NOT_ALLOWED: -+ return REG_SET_CC_CHANGE_NOT_ALLOWED; -+ case WMI_REG_SET_CC_STATUS_NO_MEMORY: -+ return REG_SET_CC_STATUS_NO_MEMORY; -+ case WMI_REG_SET_CC_STATUS_FAIL: -+ return REG_SET_CC_STATUS_FAIL; -+ } -+ -+ return REG_SET_CC_STATUS_FAIL; -+} -+ -+enum wmi_reg_6ghz_ap_type { -+ WMI_REG_INDOOR_AP = 0, -+ WMI_REG_STANDARD_POWER_AP = 1, -+ WMI_REG_VERY_LOW_POWER_AP = 2, -+ -+ WMI_REG_CURRENT_MAX_AP_TYPE, -+ WMI_REG_MAX_AP_TYPE = 7, -+}; -+ -+enum wmi_reg_6ghz_client_type { -+ WMI_REG_DEFAULT_CLIENT = 0, -+ WMI_REG_SUBORDINATE_CLIENT = 1, -+ WMI_REG_MAX_CLIENT_TYPE = 2, - }; - - struct cur_reg_rule { -@@ -4118,6 +4185,8 @@ struct cur_reg_rule { - u8 reg_power; - u8 ant_gain; - u16 flags; -+ bool psd_flag; -+ s8 psd_eirp; - }; - - struct cur_regulatory_info { -@@ -4137,6 +4206,22 @@ struct cur_regulatory_info { - u32 num_5ghz_reg_rules; - struct cur_reg_rule *reg_rules_2ghz_ptr; - struct cur_reg_rule *reg_rules_5ghz_ptr; -+ bool is_ext_reg_event; -+ enum wmi_reg_6ghz_client_type client_type; -+ bool rnr_tpe_usable; -+ bool unspecified_ap_usable; -+ u8 domain_code_6ghz_ap[WMI_REG_CURRENT_MAX_AP_TYPE]; -+ u8 domain_code_6ghz_client[WMI_REG_CURRENT_MAX_AP_TYPE][WMI_REG_MAX_CLIENT_TYPE]; -+ u32 domain_code_6ghz_super_id; -+ u32 min_bw_6ghz_ap[WMI_REG_CURRENT_MAX_AP_TYPE]; -+ u32 max_bw_6ghz_ap[WMI_REG_CURRENT_MAX_AP_TYPE]; -+ u32 min_bw_6ghz_client[WMI_REG_CURRENT_MAX_AP_TYPE][WMI_REG_MAX_CLIENT_TYPE]; -+ u32 max_bw_6ghz_client[WMI_REG_CURRENT_MAX_AP_TYPE][WMI_REG_MAX_CLIENT_TYPE]; -+ u32 num_6ghz_rules_ap[WMI_REG_CURRENT_MAX_AP_TYPE]; -+ u32 num_6ghz_rules_client[WMI_REG_CURRENT_MAX_AP_TYPE][WMI_REG_MAX_CLIENT_TYPE]; -+ struct cur_reg_rule *reg_rules_6ghz_ap_ptr[WMI_REG_CURRENT_MAX_AP_TYPE]; -+ struct cur_reg_rule *reg_rules_6ghz_client_ptr -+ [WMI_REG_CURRENT_MAX_AP_TYPE][WMI_REG_MAX_CLIENT_TYPE]; - }; - - struct wmi_reg_chan_list_cc_event { -@@ -4163,6 +4248,61 @@ struct wmi_regulatory_rule_struct { - u32 flag_info; - }; - -+#define WMI_REG_CLIENT_MAX 4 -+ -+struct wmi_reg_chan_list_cc_ext_event { -+ u32 status_code; -+ u32 phy_id; -+ u32 alpha2; -+ u32 num_phy; -+ u32 country_id; -+ u32 domain_code; -+ u32 dfs_region; -+ u32 phybitmap; -+ u32 min_bw_2ghz; -+ u32 max_bw_2ghz; -+ u32 min_bw_5ghz; -+ u32 max_bw_5ghz; -+ u32 num_2ghz_reg_rules; -+ u32 num_5ghz_reg_rules; -+ u32 client_type; -+ u32 rnr_tpe_usable; -+ u32 unspecified_ap_usable; -+ u32 domain_code_6ghz_ap_lpi; -+ u32 domain_code_6ghz_ap_sp; -+ u32 domain_code_6ghz_ap_vlp; -+ u32 domain_code_6ghz_client_lpi[WMI_REG_CLIENT_MAX]; -+ u32 domain_code_6ghz_client_sp[WMI_REG_CLIENT_MAX]; -+ u32 domain_code_6ghz_client_vlp[WMI_REG_CLIENT_MAX]; -+ u32 domain_code_6ghz_super_id; -+ u32 min_bw_6ghz_ap_sp; -+ u32 max_bw_6ghz_ap_sp; -+ u32 min_bw_6ghz_ap_lpi; -+ u32 max_bw_6ghz_ap_lpi; -+ u32 min_bw_6ghz_ap_vlp; -+ u32 max_bw_6ghz_ap_vlp; -+ u32 min_bw_6ghz_client_sp[WMI_REG_CLIENT_MAX]; -+ u32 max_bw_6ghz_client_sp[WMI_REG_CLIENT_MAX]; -+ u32 min_bw_6ghz_client_lpi[WMI_REG_CLIENT_MAX]; -+ u32 max_bw_6ghz_client_lpi[WMI_REG_CLIENT_MAX]; -+ u32 min_bw_6ghz_client_vlp[WMI_REG_CLIENT_MAX]; -+ u32 max_bw_6ghz_client_vlp[WMI_REG_CLIENT_MAX]; -+ u32 num_6ghz_reg_rules_ap_sp; -+ u32 num_6ghz_reg_rules_ap_lpi; -+ u32 num_6ghz_reg_rules_ap_vlp; -+ u32 num_6ghz_reg_rules_client_sp[WMI_REG_CLIENT_MAX]; -+ u32 num_6ghz_reg_rules_client_lpi[WMI_REG_CLIENT_MAX]; -+ u32 num_6ghz_reg_rules_client_vlp[WMI_REG_CLIENT_MAX]; -+} __packed; -+ -+struct wmi_regulatory_ext_rule { -+ u32 tlv_header; -+ u32 freq_info; -+ u32 bw_pwr_info; -+ u32 flag_info; -+ u32 psd_power_info; -+} __packed; -+ - struct wmi_vdev_delete_resp_event { - u32 vdev_id; - } __packed; -@@ -5358,6 +5498,7 @@ struct target_resource_config { - u32 sched_params; - u32 twt_ap_pdev_count; - u32 twt_ap_sta_count; -+ u8 is_reg_cc_ext_event_supported; - }; - - enum wmi_debug_log_param { diff --git a/package/kernel/mac80211/patches/ath11k/0045-wifi-ath11k-add-debug-prints-in-regulatory-WMI-event.patch b/package/kernel/mac80211/patches/ath11k/0045-wifi-ath11k-add-debug-prints-in-regulatory-WMI-event.patch deleted file mode 100644 index b88e51928f..0000000000 --- a/package/kernel/mac80211/patches/ath11k/0045-wifi-ath11k-add-debug-prints-in-regulatory-WMI-event.patch +++ /dev/null @@ -1,567 +0,0 @@ -From e238e62ba8868a784e485eb94451c87cd1b85cee Mon Sep 17 00:00:00 2001 -From: Aditya Kumar Singh -Date: Wed, 1 Mar 2023 16:20:59 +0200 -Subject: [PATCH] wifi: ath11k: add debug prints in regulatory WMI event - processing - -Add some more debug prints in processing regulatory WMI event in order to -increase more debuggability. - -Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1 -Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1 -Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.5.0.1-01100-QCAHKSWPL_SILICONZ-1 - -Signed-off-by: Aditya Kumar Singh -Signed-off-by: Kalle Valo -Link: https://lore.kernel.org/r/20230110121024.14051-4-quic_adisi@quicinc.com ---- - drivers/net/wireless/ath/ath11k/reg.c | 2 +- - drivers/net/wireless/ath/ath11k/wmi.c | 207 ++++++++++++++++++-------- - drivers/net/wireless/ath/ath11k/wmi.h | 142 ++++++++++++++++++ - 3 files changed, 291 insertions(+), 60 deletions(-) - ---- a/drivers/net/wireless/ath/ath11k/reg.c -+++ b/drivers/net/wireless/ath/ath11k/reg.c -@@ -646,7 +646,7 @@ ath11k_reg_build_regd(struct ath11k_base - tmp_regd->dfs_region = ath11k_map_fw_dfs_region(reg_info->dfs_region); - - ath11k_dbg(ab, ATH11K_DBG_REG, -- "\r\nCountry %s, CFG Regdomain %s FW Regdomain %d, num_reg_rules %d\n", -+ "Country %s, CFG Regdomain %s FW Regdomain %d, num_reg_rules %d\n", - alpha2, ath11k_reg_get_regdom_str(tmp_regd->dfs_region), - reg_info->dfs_region, num_rules); - /* Update reg_rules[] below. Firmware is expected to ---- a/drivers/net/wireless/ath/ath11k/wmi.c -+++ b/drivers/net/wireless/ath/ath11k/wmi.c -@@ -4925,6 +4925,26 @@ static int ath11k_pull_vdev_start_resp_t - return 0; - } - -+static void ath11k_print_reg_rule(struct ath11k_base *ab, const char *band, -+ u32 num_reg_rules, -+ struct cur_reg_rule *reg_rule_ptr) -+{ -+ struct cur_reg_rule *reg_rule = reg_rule_ptr; -+ u32 count; -+ -+ ath11k_dbg(ab, ATH11K_DBG_WMI, "number of reg rules in %s band: %d\n", -+ band, num_reg_rules); -+ -+ for (count = 0; count < num_reg_rules; count++) { -+ ath11k_dbg(ab, ATH11K_DBG_WMI, -+ "reg rule %d: (%d - %d @ %d) (%d, %d) (FLAGS %d)\n", -+ count + 1, reg_rule->start_freq, reg_rule->end_freq, -+ reg_rule->max_bw, reg_rule->ant_gain, -+ reg_rule->reg_power, reg_rule->flags); -+ reg_rule++; -+ } -+} -+ - static struct cur_reg_rule - *create_reg_rules_from_wmi(u32 num_reg_rules, - struct wmi_regulatory_rule_struct *wmi_reg_rule) -@@ -5006,6 +5026,10 @@ static int ath11k_pull_reg_chan_list_upd - reg_info->ctry_code = chan_list_event_hdr->country_id; - reg_info->reg_dmn_pair = chan_list_event_hdr->domain_code; - -+ ath11k_dbg(ab, ATH11K_DBG_WMI, -+ "status_code %s", -+ ath11k_cc_status_to_str(reg_info->status_code)); -+ - reg_info->status_code = - ath11k_wmi_cc_setting_code_to_reg(chan_list_event_hdr->status_code); - -@@ -5020,13 +5044,13 @@ static int ath11k_pull_reg_chan_list_upd - num_5ghz_reg_rules = reg_info->num_5ghz_reg_rules; - - ath11k_dbg(ab, ATH11K_DBG_WMI, -- "%s:cc %s dsf %d BW: min_2ghz %d max_2ghz %d min_5ghz %d max_5ghz %d", -- __func__, reg_info->alpha2, reg_info->dfs_region, -+ "cc %s dsf %d BW: min_2ghz %d max_2ghz %d min_5ghz %d max_5ghz %d", -+ reg_info->alpha2, reg_info->dfs_region, - reg_info->min_bw_2ghz, reg_info->max_bw_2ghz, - reg_info->min_bw_5ghz, reg_info->max_bw_5ghz); - - ath11k_dbg(ab, ATH11K_DBG_WMI, -- "%s: num_2ghz_reg_rules %d num_5ghz_reg_rules %d", __func__, -+ "num_2ghz_reg_rules %d num_5ghz_reg_rules %d", - num_2ghz_reg_rules, num_5ghz_reg_rules); - - wmi_reg_rule = -@@ -5043,6 +5067,10 @@ static int ath11k_pull_reg_chan_list_upd - ath11k_warn(ab, "Unable to Allocate memory for 2 GHz rules\n"); - return -ENOMEM; - } -+ -+ ath11k_print_reg_rule(ab, "2 GHz", -+ num_2ghz_reg_rules, -+ reg_info->reg_rules_2ghz_ptr); - } - - if (num_5ghz_reg_rules) { -@@ -5055,6 +5083,10 @@ static int ath11k_pull_reg_chan_list_upd - ath11k_warn(ab, "Unable to Allocate memory for 5 GHz rules\n"); - return -ENOMEM; - } -+ -+ ath11k_print_reg_rule(ab, "5 GHz", -+ num_5ghz_reg_rules, -+ reg_info->reg_rules_5ghz_ptr); - } - - ath11k_dbg(ab, ATH11K_DBG_WMI, "processed regulatory channel list\n"); -@@ -5128,7 +5160,7 @@ static int ath11k_pull_reg_chan_list_ext - struct cur_regulatory_info *reg_info) - { - const void **tb; -- const struct wmi_reg_chan_list_cc_ext_event *ext_chan_list_event_hdr; -+ const struct wmi_reg_chan_list_cc_ext_event *ev; - struct wmi_regulatory_ext_rule *ext_wmi_reg_rule; - u32 num_2ghz_reg_rules, num_5ghz_reg_rules; - u32 num_6ghz_reg_rules_ap[WMI_REG_CURRENT_MAX_AP_TYPE]; -@@ -5145,31 +5177,29 @@ static int ath11k_pull_reg_chan_list_ext - return ret; - } - -- ext_chan_list_event_hdr = tb[WMI_TAG_REG_CHAN_LIST_CC_EXT_EVENT]; -- if (!ext_chan_list_event_hdr) { -+ ev = tb[WMI_TAG_REG_CHAN_LIST_CC_EXT_EVENT]; -+ if (!ev) { - ath11k_warn(ab, "failed to fetch reg chan list ext update ev\n"); - kfree(tb); - return -EPROTO; - } - -- reg_info->num_2ghz_reg_rules = -- ext_chan_list_event_hdr->num_2ghz_reg_rules; -- reg_info->num_5ghz_reg_rules = -- ext_chan_list_event_hdr->num_5ghz_reg_rules; -+ reg_info->num_2ghz_reg_rules = ev->num_2ghz_reg_rules; -+ reg_info->num_5ghz_reg_rules = ev->num_5ghz_reg_rules; - reg_info->num_6ghz_rules_ap[WMI_REG_INDOOR_AP] = -- ext_chan_list_event_hdr->num_6ghz_reg_rules_ap_lpi; -+ ev->num_6ghz_reg_rules_ap_lpi; - reg_info->num_6ghz_rules_ap[WMI_REG_STANDARD_POWER_AP] = -- ext_chan_list_event_hdr->num_6ghz_reg_rules_ap_sp; -+ ev->num_6ghz_reg_rules_ap_sp; - reg_info->num_6ghz_rules_ap[WMI_REG_VERY_LOW_POWER_AP] = -- ext_chan_list_event_hdr->num_6ghz_reg_rules_ap_vlp; -+ ev->num_6ghz_reg_rules_ap_vlp; - - for (i = 0; i < WMI_REG_MAX_CLIENT_TYPE; i++) { - reg_info->num_6ghz_rules_client[WMI_REG_INDOOR_AP][i] = -- ext_chan_list_event_hdr->num_6ghz_reg_rules_client_lpi[i]; -+ ev->num_6ghz_reg_rules_client_lpi[i]; - reg_info->num_6ghz_rules_client[WMI_REG_STANDARD_POWER_AP][i] = -- ext_chan_list_event_hdr->num_6ghz_reg_rules_client_sp[i]; -+ ev->num_6ghz_reg_rules_client_sp[i]; - reg_info->num_6ghz_rules_client[WMI_REG_VERY_LOW_POWER_AP][i] = -- ext_chan_list_event_hdr->num_6ghz_reg_rules_client_vlp[i]; -+ ev->num_6ghz_reg_rules_client_vlp[i]; - } - - num_2ghz_reg_rules = reg_info->num_2ghz_reg_rules; -@@ -5231,57 +5261,79 @@ static int ath11k_pull_reg_chan_list_ext - return -EINVAL; - } - -- memcpy(reg_info->alpha2, &ext_chan_list_event_hdr->alpha2, -- REG_ALPHA2_LEN); -+ memcpy(reg_info->alpha2, &ev->alpha2, REG_ALPHA2_LEN); -+ -+ reg_info->dfs_region = ev->dfs_region; -+ reg_info->phybitmap = ev->phybitmap; -+ reg_info->num_phy = ev->num_phy; -+ reg_info->phy_id = ev->phy_id; -+ reg_info->ctry_code = ev->country_id; -+ reg_info->reg_dmn_pair = ev->domain_code; - -- reg_info->dfs_region = ext_chan_list_event_hdr->dfs_region; -- reg_info->phybitmap = ext_chan_list_event_hdr->phybitmap; -- reg_info->num_phy = ext_chan_list_event_hdr->num_phy; -- reg_info->phy_id = ext_chan_list_event_hdr->phy_id; -- reg_info->ctry_code = ext_chan_list_event_hdr->country_id; -- reg_info->reg_dmn_pair = ext_chan_list_event_hdr->domain_code; -+ ath11k_dbg(ab, ATH11K_DBG_WMI, -+ "status_code %s", -+ ath11k_cc_status_to_str(reg_info->status_code)); - - reg_info->status_code = -- ath11k_wmi_cc_setting_code_to_reg(ext_chan_list_event_hdr->status_code); -+ ath11k_wmi_cc_setting_code_to_reg(ev->status_code); - - reg_info->is_ext_reg_event = true; - -- reg_info->min_bw_2ghz = ext_chan_list_event_hdr->min_bw_2ghz; -- reg_info->max_bw_2ghz = ext_chan_list_event_hdr->max_bw_2ghz; -- reg_info->min_bw_5ghz = ext_chan_list_event_hdr->min_bw_5ghz; -- reg_info->max_bw_5ghz = ext_chan_list_event_hdr->max_bw_5ghz; -+ reg_info->min_bw_2ghz = ev->min_bw_2ghz; -+ reg_info->max_bw_2ghz = ev->max_bw_2ghz; -+ reg_info->min_bw_5ghz = ev->min_bw_5ghz; -+ reg_info->max_bw_5ghz = ev->max_bw_5ghz; - - reg_info->min_bw_6ghz_ap[WMI_REG_INDOOR_AP] = -- ext_chan_list_event_hdr->min_bw_6ghz_ap_lpi; -+ ev->min_bw_6ghz_ap_lpi; - reg_info->max_bw_6ghz_ap[WMI_REG_INDOOR_AP] = -- ext_chan_list_event_hdr->max_bw_6ghz_ap_lpi; -+ ev->max_bw_6ghz_ap_lpi; - reg_info->min_bw_6ghz_ap[WMI_REG_STANDARD_POWER_AP] = -- ext_chan_list_event_hdr->min_bw_6ghz_ap_sp; -+ ev->min_bw_6ghz_ap_sp; - reg_info->max_bw_6ghz_ap[WMI_REG_STANDARD_POWER_AP] = -- ext_chan_list_event_hdr->max_bw_6ghz_ap_sp; -+ ev->max_bw_6ghz_ap_sp; - reg_info->min_bw_6ghz_ap[WMI_REG_VERY_LOW_POWER_AP] = -- ext_chan_list_event_hdr->min_bw_6ghz_ap_vlp; -+ ev->min_bw_6ghz_ap_vlp; - reg_info->max_bw_6ghz_ap[WMI_REG_VERY_LOW_POWER_AP] = -- ext_chan_list_event_hdr->max_bw_6ghz_ap_vlp; -+ ev->max_bw_6ghz_ap_vlp; -+ -+ ath11k_dbg(ab, ATH11K_DBG_WMI, -+ "6 GHz AP BW: LPI (%d - %d), SP (%d - %d), VLP (%d - %d)\n", -+ reg_info->min_bw_6ghz_ap[WMI_REG_INDOOR_AP], -+ reg_info->max_bw_6ghz_ap[WMI_REG_INDOOR_AP], -+ reg_info->min_bw_6ghz_ap[WMI_REG_STANDARD_POWER_AP], -+ reg_info->max_bw_6ghz_ap[WMI_REG_STANDARD_POWER_AP], -+ reg_info->min_bw_6ghz_ap[WMI_REG_VERY_LOW_POWER_AP], -+ reg_info->max_bw_6ghz_ap[WMI_REG_VERY_LOW_POWER_AP]); - - for (i = 0; i < WMI_REG_MAX_CLIENT_TYPE; i++) { - reg_info->min_bw_6ghz_client[WMI_REG_INDOOR_AP][i] = -- ext_chan_list_event_hdr->min_bw_6ghz_client_lpi[i]; -+ ev->min_bw_6ghz_client_lpi[i]; - reg_info->max_bw_6ghz_client[WMI_REG_INDOOR_AP][i] = -- ext_chan_list_event_hdr->max_bw_6ghz_client_lpi[i]; -+ ev->max_bw_6ghz_client_lpi[i]; - reg_info->min_bw_6ghz_client[WMI_REG_STANDARD_POWER_AP][i] = -- ext_chan_list_event_hdr->min_bw_6ghz_client_sp[i]; -+ ev->min_bw_6ghz_client_sp[i]; - reg_info->max_bw_6ghz_client[WMI_REG_STANDARD_POWER_AP][i] = -- ext_chan_list_event_hdr->max_bw_6ghz_client_sp[i]; -+ ev->max_bw_6ghz_client_sp[i]; - reg_info->min_bw_6ghz_client[WMI_REG_VERY_LOW_POWER_AP][i] = -- ext_chan_list_event_hdr->min_bw_6ghz_client_vlp[i]; -+ ev->min_bw_6ghz_client_vlp[i]; - reg_info->max_bw_6ghz_client[WMI_REG_VERY_LOW_POWER_AP][i] = -- ext_chan_list_event_hdr->max_bw_6ghz_client_vlp[i]; -+ ev->max_bw_6ghz_client_vlp[i]; -+ -+ ath11k_dbg(ab, ATH11K_DBG_WMI, -+ "6 GHz %s BW: LPI (%d - %d), SP (%d - %d), VLP (%d - %d)\n", -+ ath11k_6ghz_client_type_to_str(i), -+ reg_info->min_bw_6ghz_client[WMI_REG_INDOOR_AP][i], -+ reg_info->max_bw_6ghz_client[WMI_REG_INDOOR_AP][i], -+ reg_info->min_bw_6ghz_client[WMI_REG_STANDARD_POWER_AP][i], -+ reg_info->max_bw_6ghz_client[WMI_REG_STANDARD_POWER_AP][i], -+ reg_info->min_bw_6ghz_client[WMI_REG_VERY_LOW_POWER_AP][i], -+ reg_info->max_bw_6ghz_client[WMI_REG_VERY_LOW_POWER_AP][i]); - } - - ath11k_dbg(ab, ATH11K_DBG_WMI, -- "%s:cc_ext %s dsf %d BW: min_2ghz %d max_2ghz %d min_5ghz %d max_5ghz %d", -- __func__, reg_info->alpha2, reg_info->dfs_region, -+ "cc_ext %s dsf %d BW: min_2ghz %d max_2ghz %d min_5ghz %d max_5ghz %d", -+ reg_info->alpha2, reg_info->dfs_region, - reg_info->min_bw_2ghz, reg_info->max_bw_2ghz, - reg_info->min_bw_5ghz, reg_info->max_bw_5ghz); - -@@ -5310,9 +5362,8 @@ static int ath11k_pull_reg_chan_list_ext - num_6ghz_client[WMI_REG_VERY_LOW_POWER_AP][j]); - - ext_wmi_reg_rule = -- (struct wmi_regulatory_ext_rule *)((u8 *)ext_chan_list_event_hdr -- + sizeof(*ext_chan_list_event_hdr) -- + sizeof(struct wmi_tlv)); -+ (struct wmi_regulatory_ext_rule *)((u8 *)ev + sizeof(*ev) + -+ sizeof(struct wmi_tlv)); - if (num_2ghz_reg_rules) { - reg_info->reg_rules_2ghz_ptr = - create_ext_reg_rules_from_wmi(num_2ghz_reg_rules, -@@ -5323,6 +5374,10 @@ static int ath11k_pull_reg_chan_list_ext - ath11k_warn(ab, "Unable to Allocate memory for 2 GHz rules\n"); - return -ENOMEM; - } -+ -+ ath11k_print_reg_rule(ab, "2 GHz", -+ num_2ghz_reg_rules, -+ reg_info->reg_rules_2ghz_ptr); - } - - ext_wmi_reg_rule += num_2ghz_reg_rules; -@@ -5358,6 +5413,10 @@ static int ath11k_pull_reg_chan_list_ext - ath11k_warn(ab, "Unable to Allocate memory for 5 GHz rules\n"); - return -ENOMEM; - } -+ -+ ath11k_print_reg_rule(ab, "5 GHz", -+ num_5ghz_reg_rules, -+ reg_info->reg_rules_5ghz_ptr); - } - - /* We have adjusted the number of 5 GHz reg rules above. But still those -@@ -5378,10 +5437,17 @@ static int ath11k_pull_reg_chan_list_ext - return -ENOMEM; - } - -+ ath11k_print_reg_rule(ab, ath11k_6ghz_ap_type_to_str(i), -+ num_6ghz_reg_rules_ap[i], -+ reg_info->reg_rules_6ghz_ap_ptr[i]); -+ - ext_wmi_reg_rule += num_6ghz_reg_rules_ap[i]; - } - - for (j = 0; j < WMI_REG_CURRENT_MAX_AP_TYPE; j++) { -+ ath11k_dbg(ab, ATH11K_DBG_WMI, -+ "6 GHz AP type %s", ath11k_6ghz_ap_type_to_str(j)); -+ - for (i = 0; i < WMI_REG_MAX_CLIENT_TYPE; i++) { - reg_info->reg_rules_6ghz_client_ptr[j][i] = - create_ext_reg_rules_from_wmi(num_6ghz_client[j][i], -@@ -5393,35 +5459,58 @@ static int ath11k_pull_reg_chan_list_ext - return -ENOMEM; - } - -+ ath11k_print_reg_rule(ab, -+ ath11k_6ghz_client_type_to_str(i), -+ num_6ghz_client[j][i], -+ reg_info->reg_rules_6ghz_client_ptr[j][i]); -+ - ext_wmi_reg_rule += num_6ghz_client[j][i]; - } - } - -- reg_info->client_type = ext_chan_list_event_hdr->client_type; -- reg_info->rnr_tpe_usable = ext_chan_list_event_hdr->rnr_tpe_usable; -+ reg_info->client_type = ev->client_type; -+ reg_info->rnr_tpe_usable = ev->rnr_tpe_usable; - reg_info->unspecified_ap_usable = -- ext_chan_list_event_hdr->unspecified_ap_usable; -+ ev->unspecified_ap_usable; - reg_info->domain_code_6ghz_ap[WMI_REG_INDOOR_AP] = -- ext_chan_list_event_hdr->domain_code_6ghz_ap_lpi; -+ ev->domain_code_6ghz_ap_lpi; - reg_info->domain_code_6ghz_ap[WMI_REG_STANDARD_POWER_AP] = -- ext_chan_list_event_hdr->domain_code_6ghz_ap_sp; -+ ev->domain_code_6ghz_ap_sp; - reg_info->domain_code_6ghz_ap[WMI_REG_VERY_LOW_POWER_AP] = -- ext_chan_list_event_hdr->domain_code_6ghz_ap_vlp; -+ ev->domain_code_6ghz_ap_vlp; -+ -+ ath11k_dbg(ab, ATH11K_DBG_WMI, -+ "6 GHz reg info client type %s rnr_tpe_usable %d unspecified_ap_usable %d AP sub domain: lpi %s, sp %s, vlp %s\n", -+ ath11k_6ghz_client_type_to_str(reg_info->client_type), -+ reg_info->rnr_tpe_usable, -+ reg_info->unspecified_ap_usable, -+ ath11k_sub_reg_6ghz_to_str(ev->domain_code_6ghz_ap_lpi), -+ ath11k_sub_reg_6ghz_to_str(ev->domain_code_6ghz_ap_sp), -+ ath11k_sub_reg_6ghz_to_str(ev->domain_code_6ghz_ap_vlp)); - - for (i = 0; i < WMI_REG_MAX_CLIENT_TYPE; i++) { - reg_info->domain_code_6ghz_client[WMI_REG_INDOOR_AP][i] = -- ext_chan_list_event_hdr->domain_code_6ghz_client_lpi[i]; -+ ev->domain_code_6ghz_client_lpi[i]; - reg_info->domain_code_6ghz_client[WMI_REG_STANDARD_POWER_AP][i] = -- ext_chan_list_event_hdr->domain_code_6ghz_client_sp[i]; -+ ev->domain_code_6ghz_client_sp[i]; - reg_info->domain_code_6ghz_client[WMI_REG_VERY_LOW_POWER_AP][i] = -- ext_chan_list_event_hdr->domain_code_6ghz_client_vlp[i]; -+ ev->domain_code_6ghz_client_vlp[i]; -+ -+ ath11k_dbg(ab, ATH11K_DBG_WMI, -+ "6 GHz client type %s client sub domain: lpi %s, sp %s, vlp %s\n", -+ ath11k_6ghz_client_type_to_str(i), -+ ath11k_sub_reg_6ghz_to_str(ev->domain_code_6ghz_client_lpi[i]), -+ ath11k_sub_reg_6ghz_to_str(ev->domain_code_6ghz_client_sp[i]), -+ ath11k_sub_reg_6ghz_to_str(ev->domain_code_6ghz_client_vlp[i]) -+ ); - } - -- reg_info->domain_code_6ghz_super_id = -- ext_chan_list_event_hdr->domain_code_6ghz_super_id; -+ reg_info->domain_code_6ghz_super_id = ev->domain_code_6ghz_super_id; - -- ath11k_dbg(ab, ATH11K_DBG_WMI, "6 GHz client_type: %d domain_code_6ghz_super_id: %d", -- reg_info->client_type, reg_info->domain_code_6ghz_super_id); -+ ath11k_dbg(ab, ATH11K_DBG_WMI, -+ "6 GHz client_type %s 6 GHz super domain %s", -+ ath11k_6ghz_client_type_to_str(reg_info->client_type), -+ ath11k_super_reg_6ghz_to_str(reg_info->domain_code_6ghz_super_id)); - - ath11k_dbg(ab, ATH11K_DBG_WMI, "processed regulatory ext channel list\n"); - ---- a/drivers/net/wireless/ath/ath11k/wmi.h -+++ b/drivers/net/wireless/ath/ath11k/wmi.h -@@ -4139,6 +4139,7 @@ enum cc_setting_code { - - /* add new setting code above, update in - * @enum wmi_reg_cc_setting_code as well. -+ * Also handle it in ath11k_cc_status_to_str() - */ - }; - -@@ -4163,21 +4164,162 @@ ath11k_wmi_cc_setting_code_to_reg(enum w - return REG_SET_CC_STATUS_FAIL; - } - -+static inline const char *ath11k_cc_status_to_str(enum cc_setting_code code) -+{ -+ switch (code) { -+ case REG_SET_CC_STATUS_PASS: -+ return "REG_SET_CC_STATUS_PASS"; -+ case REG_CURRENT_ALPHA2_NOT_FOUND: -+ return "REG_CURRENT_ALPHA2_NOT_FOUND"; -+ case REG_INIT_ALPHA2_NOT_FOUND: -+ return "REG_INIT_ALPHA2_NOT_FOUND"; -+ case REG_SET_CC_CHANGE_NOT_ALLOWED: -+ return "REG_SET_CC_CHANGE_NOT_ALLOWED"; -+ case REG_SET_CC_STATUS_NO_MEMORY: -+ return "REG_SET_CC_STATUS_NO_MEMORY"; -+ case REG_SET_CC_STATUS_FAIL: -+ return "REG_SET_CC_STATUS_FAIL"; -+ } -+ -+ return "Unknown CC status"; -+} -+ - enum wmi_reg_6ghz_ap_type { - WMI_REG_INDOOR_AP = 0, - WMI_REG_STANDARD_POWER_AP = 1, - WMI_REG_VERY_LOW_POWER_AP = 2, - -+ /* add AP type above, handle in ath11k_6ghz_ap_type_to_str() -+ */ - WMI_REG_CURRENT_MAX_AP_TYPE, - WMI_REG_MAX_AP_TYPE = 7, - }; - -+static inline const char * -+ath11k_6ghz_ap_type_to_str(enum wmi_reg_6ghz_ap_type type) -+{ -+ switch (type) { -+ case WMI_REG_INDOOR_AP: -+ return "INDOOR AP"; -+ case WMI_REG_STANDARD_POWER_AP: -+ return "STANDARD POWER AP"; -+ case WMI_REG_VERY_LOW_POWER_AP: -+ return "VERY LOW POWER AP"; -+ case WMI_REG_CURRENT_MAX_AP_TYPE: -+ return "CURRENT_MAX_AP_TYPE"; -+ case WMI_REG_MAX_AP_TYPE: -+ return "MAX_AP_TYPE"; -+ } -+ -+ return "unknown 6 GHz AP type"; -+} -+ - enum wmi_reg_6ghz_client_type { - WMI_REG_DEFAULT_CLIENT = 0, - WMI_REG_SUBORDINATE_CLIENT = 1, - WMI_REG_MAX_CLIENT_TYPE = 2, -+ -+ /* add client type above, handle it in -+ * ath11k_6ghz_client_type_to_str() -+ */ -+}; -+ -+static inline const char * -+ath11k_6ghz_client_type_to_str(enum wmi_reg_6ghz_client_type type) -+{ -+ switch (type) { -+ case WMI_REG_DEFAULT_CLIENT: -+ return "DEFAULT CLIENT"; -+ case WMI_REG_SUBORDINATE_CLIENT: -+ return "SUBORDINATE CLIENT"; -+ case WMI_REG_MAX_CLIENT_TYPE: -+ return "MAX_CLIENT_TYPE"; -+ } -+ -+ return "unknown 6 GHz client type"; -+} -+ -+enum reg_subdomains_6ghz { -+ EMPTY_6GHZ = 0x0, -+ FCC1_CLIENT_LPI_REGULAR_6GHZ = 0x01, -+ FCC1_CLIENT_SP_6GHZ = 0x02, -+ FCC1_AP_LPI_6GHZ = 0x03, -+ FCC1_CLIENT_LPI_SUBORDINATE = FCC1_AP_LPI_6GHZ, -+ FCC1_AP_SP_6GHZ = 0x04, -+ ETSI1_LPI_6GHZ = 0x10, -+ ETSI1_VLP_6GHZ = 0x11, -+ ETSI2_LPI_6GHZ = 0x12, -+ ETSI2_VLP_6GHZ = 0x13, -+ APL1_LPI_6GHZ = 0x20, -+ APL1_VLP_6GHZ = 0x21, -+ -+ /* add sub-domain above, handle it in -+ * ath11k_sub_reg_6ghz_to_str() -+ */ -+}; -+ -+static inline const char * -+ath11k_sub_reg_6ghz_to_str(enum reg_subdomains_6ghz sub_id) -+{ -+ switch (sub_id) { -+ case EMPTY_6GHZ: -+ return "N/A"; -+ case FCC1_CLIENT_LPI_REGULAR_6GHZ: -+ return "FCC1_CLIENT_LPI_REGULAR_6GHZ"; -+ case FCC1_CLIENT_SP_6GHZ: -+ return "FCC1_CLIENT_SP_6GHZ"; -+ case FCC1_AP_LPI_6GHZ: -+ return "FCC1_AP_LPI_6GHZ/FCC1_CLIENT_LPI_SUBORDINATE"; -+ case FCC1_AP_SP_6GHZ: -+ return "FCC1_AP_SP_6GHZ"; -+ case ETSI1_LPI_6GHZ: -+ return "ETSI1_LPI_6GHZ"; -+ case ETSI1_VLP_6GHZ: -+ return "ETSI1_VLP_6GHZ"; -+ case ETSI2_LPI_6GHZ: -+ return "ETSI2_LPI_6GHZ"; -+ case ETSI2_VLP_6GHZ: -+ return "ETSI2_VLP_6GHZ"; -+ case APL1_LPI_6GHZ: -+ return "APL1_LPI_6GHZ"; -+ case APL1_VLP_6GHZ: -+ return "APL1_VLP_6GHZ"; -+ } -+ -+ return "unknown sub reg id"; -+} -+ -+enum reg_super_domain_6ghz { -+ FCC1_6GHZ = 0x01, -+ ETSI1_6GHZ = 0x02, -+ ETSI2_6GHZ = 0x03, -+ APL1_6GHZ = 0x04, -+ FCC1_6GHZ_CL = 0x05, -+ -+ /* add super domain above, handle it in -+ * ath11k_super_reg_6ghz_to_str() -+ */ - }; - -+static inline const char * -+ath11k_super_reg_6ghz_to_str(enum reg_super_domain_6ghz domain_id) -+{ -+ switch (domain_id) { -+ case FCC1_6GHZ: -+ return "FCC1_6GHZ"; -+ case ETSI1_6GHZ: -+ return "ETSI1_6GHZ"; -+ case ETSI2_6GHZ: -+ return "ETSI2_6GHZ"; -+ case APL1_6GHZ: -+ return "APL1_6GHZ"; -+ case FCC1_6GHZ_CL: -+ return "FCC1_6GHZ_CL"; -+ } -+ -+ return "unknown domain id"; -+} -+ - struct cur_reg_rule { - u16 start_freq; - u16 end_freq; diff --git a/package/kernel/mac80211/patches/ath11k/0046-wifi-ath11k-Replace-fake-flex-array-with-flexible-ar.patch b/package/kernel/mac80211/patches/ath11k/0046-wifi-ath11k-Replace-fake-flex-array-with-flexible-ar.patch deleted file mode 100644 index bd16178564..0000000000 --- a/package/kernel/mac80211/patches/ath11k/0046-wifi-ath11k-Replace-fake-flex-array-with-flexible-ar.patch +++ /dev/null @@ -1,246 +0,0 @@ -From 3b1088a09ec9438523c251d8435e78988824bc0d Mon Sep 17 00:00:00 2001 -From: "Gustavo A. R. Silva" -Date: Tue, 7 Mar 2023 16:22:39 -0600 -Subject: [PATCH] wifi: ath11k: Replace fake flex-array with flexible-array - member -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Zero-length arrays as fake flexible arrays are deprecated and we are -moving towards adopting C99 flexible-array members instead. - -Address 25 of the following warnings found with GCC-13 and --fstrict-flex-arrays=3 enabled: -drivers/net/wireless/ath/ath11k/debugfs_htt_stats.c:30:51: warning: array subscript is outside array bounds of ‘const u32[0]’ {aka ‘const unsigned int[]’} [-Warray-bounds=] - -This helps with the ongoing efforts to tighten the FORTIFY_SOURCE -routines on memcpy() and help us make progress towards globally -enabling -fstrict-flex-arrays=3 [1]. - -Link: https://github.com/KSPP/linux/issues/21 -Link: https://github.com/KSPP/linux/issues/266 -Link: https://gcc.gnu.org/pipermail/gcc-patches/2022-October/602902.html [1] -Signed-off-by: Gustavo A. R. Silva -Reviewed-by: Simon Horman -Signed-off-by: Kalle Valo -Link: https://lore.kernel.org/r/ZAe5L5DtmsQxzqRH@work ---- - .../wireless/ath/ath11k/debugfs_htt_stats.h | 73 +++++++++++-------- - 1 file changed, 43 insertions(+), 30 deletions(-) - ---- a/drivers/net/wireless/ath/ath11k/debugfs_htt_stats.h -+++ b/drivers/net/wireless/ath/ath11k/debugfs_htt_stats.h -@@ -143,7 +143,8 @@ enum htt_tx_pdev_underrun_enum { - /* Bytes stored in little endian order */ - /* Length should be multiple of DWORD */ - struct htt_stats_string_tlv { -- u32 data[0]; /* Can be variable length */ -+ /* Can be variable length */ -+ DECLARE_FLEX_ARRAY(u32, data); - } __packed; - - #define HTT_STATS_MAC_ID GENMASK(7, 0) -@@ -205,27 +206,32 @@ struct htt_tx_pdev_stats_cmn_tlv { - - /* NOTE: Variable length TLV, use length spec to infer array size */ - struct htt_tx_pdev_stats_urrn_tlv_v { -- u32 urrn_stats[0]; /* HTT_TX_PDEV_MAX_URRN_STATS */ -+ /* HTT_TX_PDEV_MAX_URRN_STATS */ -+ DECLARE_FLEX_ARRAY(u32, urrn_stats); - }; - - /* NOTE: Variable length TLV, use length spec to infer array size */ - struct htt_tx_pdev_stats_flush_tlv_v { -- u32 flush_errs[0]; /* HTT_TX_PDEV_MAX_FLUSH_REASON_STATS */ -+ /* HTT_TX_PDEV_MAX_FLUSH_REASON_STATS */ -+ DECLARE_FLEX_ARRAY(u32, flush_errs); - }; - - /* NOTE: Variable length TLV, use length spec to infer array size */ - struct htt_tx_pdev_stats_sifs_tlv_v { -- u32 sifs_status[0]; /* HTT_TX_PDEV_MAX_SIFS_BURST_STATS */ -+ /* HTT_TX_PDEV_MAX_SIFS_BURST_STATS */ -+ DECLARE_FLEX_ARRAY(u32, sifs_status); - }; - - /* NOTE: Variable length TLV, use length spec to infer array size */ - struct htt_tx_pdev_stats_phy_err_tlv_v { -- u32 phy_errs[0]; /* HTT_TX_PDEV_MAX_PHY_ERR_STATS */ -+ /* HTT_TX_PDEV_MAX_PHY_ERR_STATS */ -+ DECLARE_FLEX_ARRAY(u32, phy_errs); - }; - - /* NOTE: Variable length TLV, use length spec to infer array size */ - struct htt_tx_pdev_stats_sifs_hist_tlv_v { -- u32 sifs_hist_status[0]; /* HTT_TX_PDEV_SIFS_BURST_HIST_STATS */ -+ /* HTT_TX_PDEV_SIFS_BURST_HIST_STATS */ -+ DECLARE_FLEX_ARRAY(u32, sifs_hist_status); - }; - - struct htt_tx_pdev_stats_tx_ppdu_stats_tlv_v { -@@ -590,20 +596,20 @@ struct htt_tx_hwq_difs_latency_stats_tlv - - /* NOTE: Variable length TLV, use length spec to infer array size */ - struct htt_tx_hwq_cmd_result_stats_tlv_v { -- /* Histogram of sched cmd result */ -- u32 cmd_result[0]; /* HTT_TX_HWQ_MAX_CMD_RESULT_STATS */ -+ /* Histogram of sched cmd result, HTT_TX_HWQ_MAX_CMD_RESULT_STATS */ -+ DECLARE_FLEX_ARRAY(u32, cmd_result); - }; - - /* NOTE: Variable length TLV, use length spec to infer array size */ - struct htt_tx_hwq_cmd_stall_stats_tlv_v { -- /* Histogram of various pause conitions */ -- u32 cmd_stall_status[0]; /* HTT_TX_HWQ_MAX_CMD_STALL_STATS */ -+ /* Histogram of various pause conitions, HTT_TX_HWQ_MAX_CMD_STALL_STATS */ -+ DECLARE_FLEX_ARRAY(u32, cmd_stall_status); - }; - - /* NOTE: Variable length TLV, use length spec to infer array size */ - struct htt_tx_hwq_fes_result_stats_tlv_v { -- /* Histogram of number of user fes result */ -- u32 fes_result[0]; /* HTT_TX_HWQ_MAX_FES_RESULT_STATS */ -+ /* Histogram of number of user fes result, HTT_TX_HWQ_MAX_FES_RESULT_STATS */ -+ DECLARE_FLEX_ARRAY(u32, fes_result); - }; - - /* NOTE: Variable length TLV, use length spec to infer array size -@@ -635,8 +641,8 @@ struct htt_tx_hwq_tried_mpdu_cnt_hist_tl - * #define WAL_TXOP_USED_HISTOGRAM_INTERVAL 1000 ( 1 ms ) - */ - struct htt_tx_hwq_txop_used_cnt_hist_tlv_v { -- /* Histogram of txop used cnt */ -- u32 txop_used_cnt_hist[0]; /* HTT_TX_HWQ_TXOP_USED_CNT_HIST */ -+ /* Histogram of txop used cnt, HTT_TX_HWQ_TXOP_USED_CNT_HIST */ -+ DECLARE_FLEX_ARRAY(u32, txop_used_cnt_hist); - }; - - /* == TX SELFGEN STATS == */ -@@ -804,17 +810,20 @@ struct htt_tx_pdev_mpdu_stats_tlv { - /* == TX SCHED STATS == */ - /* NOTE: Variable length TLV, use length spec to infer array size */ - struct htt_sched_txq_cmd_posted_tlv_v { -- u32 sched_cmd_posted[0]; /* HTT_TX_PDEV_SCHED_TX_MODE_MAX */ -+ /* HTT_TX_PDEV_SCHED_TX_MODE_MAX */ -+ DECLARE_FLEX_ARRAY(u32, sched_cmd_posted); - }; - - /* NOTE: Variable length TLV, use length spec to infer array size */ - struct htt_sched_txq_cmd_reaped_tlv_v { -- u32 sched_cmd_reaped[0]; /* HTT_TX_PDEV_SCHED_TX_MODE_MAX */ -+ /* HTT_TX_PDEV_SCHED_TX_MODE_MAX */ -+ DECLARE_FLEX_ARRAY(u32, sched_cmd_reaped); - }; - - /* NOTE: Variable length TLV, use length spec to infer array size */ - struct htt_sched_txq_sched_order_su_tlv_v { -- u32 sched_order_su[0]; /* HTT_TX_PDEV_NUM_SCHED_ORDER_LOG */ -+ /* HTT_TX_PDEV_NUM_SCHED_ORDER_LOG */ -+ DECLARE_FLEX_ARRAY(u32, sched_order_su); - }; - - enum htt_sched_txq_sched_ineligibility_tlv_enum { -@@ -842,7 +851,7 @@ enum htt_sched_txq_sched_ineligibility_t - /* NOTE: Variable length TLV, use length spec to infer array size */ - struct htt_sched_txq_sched_ineligibility_tlv_v { - /* indexed by htt_sched_txq_sched_ineligibility_tlv_enum */ -- u32 sched_ineligibility[0]; -+ DECLARE_FLEX_ARRAY(u32, sched_ineligibility); - }; - - #define HTT_TX_PDEV_STATS_SCHED_PER_TXQ_MAC_ID GENMASK(7, 0) -@@ -888,18 +897,20 @@ struct htt_stats_tx_sched_cmn_tlv { - - /* NOTE: Variable length TLV, use length spec to infer array size */ - struct htt_tx_tqm_gen_mpdu_stats_tlv_v { -- u32 gen_mpdu_end_reason[0]; /* HTT_TX_TQM_MAX_GEN_MPDU_END_REASON */ -+ /* HTT_TX_TQM_MAX_GEN_MPDU_END_REASON */ -+ DECLARE_FLEX_ARRAY(u32, gen_mpdu_end_reason); - }; - - /* NOTE: Variable length TLV, use length spec to infer array size */ - struct htt_tx_tqm_list_mpdu_stats_tlv_v { -- u32 list_mpdu_end_reason[0]; /* HTT_TX_TQM_MAX_LIST_MPDU_END_REASON */ -+ /* HTT_TX_TQM_MAX_LIST_MPDU_END_REASON */ -+ DECLARE_FLEX_ARRAY(u32, list_mpdu_end_reason); - }; - - /* NOTE: Variable length TLV, use length spec to infer array size */ - struct htt_tx_tqm_list_mpdu_cnt_tlv_v { -- u32 list_mpdu_cnt_hist[0]; -- /* HTT_TX_TQM_MAX_LIST_MPDU_CNT_HISTOGRAM_BINS */ -+ /* HTT_TX_TQM_MAX_LIST_MPDU_CNT_HISTOGRAM_BINS */ -+ DECLARE_FLEX_ARRAY(u32, list_mpdu_cnt_hist); - }; - - struct htt_tx_tqm_pdev_stats_tlv_v { -@@ -1098,7 +1109,7 @@ struct htt_tx_de_compl_stats_tlv { - * ENTRIES_PER_BIN_COUNT) - */ - struct htt_tx_de_fw2wbm_ring_full_hist_tlv { -- u32 fw2wbm_ring_full_hist[0]; -+ DECLARE_FLEX_ARRAY(u32, fw2wbm_ring_full_hist); - }; - - struct htt_tx_de_cmn_stats_tlv { -@@ -1151,7 +1162,7 @@ struct htt_ring_if_cmn_tlv { - /* NOTE: Variable length TLV, use length spec to infer array size */ - struct htt_sfm_client_user_tlv_v { - /* Number of DWORDS used per user and per client */ -- u32 dwords_used_by_user_n[0]; -+ DECLARE_FLEX_ARRAY(u32, dwords_used_by_user_n); - }; - - struct htt_sfm_client_tlv { -@@ -1436,12 +1447,14 @@ struct htt_rx_soc_fw_stats_tlv { - - /* NOTE: Variable length TLV, use length spec to infer array size */ - struct htt_rx_soc_fw_refill_ring_empty_tlv_v { -- u32 refill_ring_empty_cnt[0]; /* HTT_RX_STATS_REFILL_MAX_RING */ -+ /* HTT_RX_STATS_REFILL_MAX_RING */ -+ DECLARE_FLEX_ARRAY(u32, refill_ring_empty_cnt); - }; - - /* NOTE: Variable length TLV, use length spec to infer array size */ - struct htt_rx_soc_fw_refill_ring_num_refill_tlv_v { -- u32 refill_ring_num_refill[0]; /* HTT_RX_STATS_REFILL_MAX_RING */ -+ /* HTT_RX_STATS_REFILL_MAX_RING */ -+ DECLARE_FLEX_ARRAY(u32, refill_ring_num_refill); - }; - - /* RXDMA error code from WBM released packets */ -@@ -1473,7 +1486,7 @@ enum htt_rx_rxdma_error_code_enum { - - /* NOTE: Variable length TLV, use length spec to infer array size */ - struct htt_rx_soc_fw_refill_ring_num_rxdma_err_tlv_v { -- u32 rxdma_err[0]; /* HTT_RX_RXDMA_MAX_ERR_CODE */ -+ DECLARE_FLEX_ARRAY(u32, rxdma_err); /* HTT_RX_RXDMA_MAX_ERR_CODE */ - }; - - /* REO error code from WBM released packets */ -@@ -1505,7 +1518,7 @@ enum htt_rx_reo_error_code_enum { - - /* NOTE: Variable length TLV, use length spec to infer array size */ - struct htt_rx_soc_fw_refill_ring_num_reo_err_tlv_v { -- u32 reo_err[0]; /* HTT_RX_REO_MAX_ERR_CODE */ -+ DECLARE_FLEX_ARRAY(u32, reo_err); /* HTT_RX_REO_MAX_ERR_CODE */ - }; - - /* == RX PDEV STATS == */ -@@ -1622,13 +1635,13 @@ struct htt_rx_pdev_fw_stats_phy_err_tlv - /* NOTE: Variable length TLV, use length spec to infer array size */ - struct htt_rx_pdev_fw_ring_mpdu_err_tlv_v { - /* Num error MPDU for each RxDMA error type */ -- u32 fw_ring_mpdu_err[0]; /* HTT_RX_STATS_RXDMA_MAX_ERR */ -+ DECLARE_FLEX_ARRAY(u32, fw_ring_mpdu_err); /* HTT_RX_STATS_RXDMA_MAX_ERR */ - }; - - /* NOTE: Variable length TLV, use length spec to infer array size */ - struct htt_rx_pdev_fw_mpdu_drop_tlv_v { - /* Num MPDU dropped */ -- u32 fw_mpdu_drop[0]; /* HTT_RX_STATS_FW_DROP_REASON_MAX */ -+ DECLARE_FLEX_ARRAY(u32, fw_mpdu_drop); /* HTT_RX_STATS_FW_DROP_REASON_MAX */ - }; - - #define HTT_PDEV_CCA_STATS_TX_FRAME_INFO_PRESENT (0x1) diff --git a/package/kernel/mac80211/patches/ath11k/0047-wifi-ath11k-fix-deinitialization-of-firmware-resourc.patch b/package/kernel/mac80211/patches/ath11k/0047-wifi-ath11k-fix-deinitialization-of-firmware-resourc.patch deleted file mode 100644 index eec11f50e3..0000000000 --- a/package/kernel/mac80211/patches/ath11k/0047-wifi-ath11k-fix-deinitialization-of-firmware-resourc.patch +++ /dev/null @@ -1,79 +0,0 @@ -From 5a78ac33e3cb8822da64dd1af196e83664b332b0 Mon Sep 17 00:00:00 2001 -From: Aditya Kumar Singh -Date: Thu, 9 Mar 2023 15:23:08 +0530 -Subject: [PATCH] wifi: ath11k: fix deinitialization of firmware resources - -Currently, in ath11k_ahb_fw_resources_init(), iommu domain -mapping is done only for the chipsets having fixed firmware -memory. Also, for such chipsets, mapping is done only if it -does not have TrustZone support. - -During deinitialization, only if TrustZone support is not there, -iommu is unmapped back. However, for non fixed firmware memory -chipsets, TrustZone support is not there and this makes the -condition check to true and it tries to unmap the memory which -was not mapped during initialization. - -This leads to the following trace - - -[ 83.198790] Unable to handle kernel NULL pointer dereference at virtual address 0000000000000008 -[ 83.259537] Modules linked in: ath11k_ahb ath11k qmi_helpers -.. snip .. -[ 83.280286] pstate: 20000005 (nzCv daif -PAN -UAO -TCO -DIT -SSBS BTYPE=--) -[ 83.287228] pc : __iommu_unmap+0x30/0x140 -[ 83.293907] lr : iommu_unmap+0x5c/0xa4 -[ 83.298072] sp : ffff80000b3abad0 -.. snip .. -[ 83.369175] Call trace: -[ 83.376282] __iommu_unmap+0x30/0x140 -[ 83.378541] iommu_unmap+0x5c/0xa4 -[ 83.382360] ath11k_ahb_fw_resource_deinit.part.12+0x2c/0xac [ath11k_ahb] -[ 83.385666] ath11k_ahb_free_resources+0x140/0x17c [ath11k_ahb] -[ 83.392521] ath11k_ahb_shutdown+0x34/0x40 [ath11k_ahb] -[ 83.398248] platform_shutdown+0x20/0x2c -[ 83.403455] device_shutdown+0x16c/0x1c4 -[ 83.407621] kernel_restart_prepare+0x34/0x3c -[ 83.411529] kernel_restart+0x14/0x74 -[ 83.415781] __do_sys_reboot+0x1c4/0x22c -[ 83.419427] __arm64_sys_reboot+0x1c/0x24 -[ 83.423420] invoke_syscall+0x44/0xfc -[ 83.427326] el0_svc_common.constprop.3+0xac/0xe8 -[ 83.430974] do_el0_svc+0xa0/0xa8 -[ 83.435659] el0_svc+0x1c/0x44 -[ 83.438957] el0t_64_sync_handler+0x60/0x144 -[ 83.441910] el0t_64_sync+0x15c/0x160 -[ 83.446343] Code: aa0103f4 f9400001 f90027a1 d2800001 (f94006a0) -[ 83.449903] ---[ end trace 0000000000000000 ]--- - -This can be reproduced by probing an AHB chipset which is not -having a fixed memory region. During reboot (or rmmod) trace -can be seen. - -Fix this issue by adding a condition check on firmware fixed memory -hw_param as done in the counter initialization function. - -Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1 - -Fixes: f9eec4947add ("ath11k: Add support for targets without trustzone") -Signed-off-by: Aditya Kumar Singh -Signed-off-by: Kalle Valo -Link: https://lore.kernel.org/r/20230309095308.24937-1-quic_adisi@quicinc.com ---- - drivers/net/wireless/ath/ath11k/ahb.c | 6 ++++++ - 1 file changed, 6 insertions(+) - ---- a/drivers/net/wireless/ath/ath11k/ahb.c -+++ b/drivers/net/wireless/ath/ath11k/ahb.c -@@ -1078,6 +1078,12 @@ static int ath11k_ahb_fw_resource_deinit - struct iommu_domain *iommu; - size_t unmapped_size; - -+ /* Chipsets not requiring MSA would have not initialized -+ * MSA resources, return success in such cases. -+ */ -+ if (!ab->hw_params.fixed_fw_mem) -+ return 0; -+ - if (ab_ahb->fw.use_tz) - return 0; - diff --git a/package/kernel/mac80211/patches/ath11k/0048-wifi-ath11k-fix-BUFFER_DONE-read-on-monitor-ring-rx-.patch b/package/kernel/mac80211/patches/ath11k/0048-wifi-ath11k-fix-BUFFER_DONE-read-on-monitor-ring-rx-.patch deleted file mode 100644 index 3e22645331..0000000000 --- a/package/kernel/mac80211/patches/ath11k/0048-wifi-ath11k-fix-BUFFER_DONE-read-on-monitor-ring-rx-.patch +++ /dev/null @@ -1,130 +0,0 @@ -From 68e93ac5a31d4975b25f819b2dfe914c72abc3bb Mon Sep 17 00:00:00 2001 -From: Harshitha Prem -Date: Wed, 15 Mar 2023 12:24:43 +0200 -Subject: [PATCH] wifi: ath11k: fix BUFFER_DONE read on monitor ring rx buffer - -Perform dma_sync_single_for_cpu() on monitor ring rx buffer before -reading BUFFER_DONE tag and do dma_unmap_single() only after device -had set BUFFER_DONE tag to the buffer. - -Also when BUFFER_DONE tag is not set, allow the buffer to get read -next time without freeing skb. - -This helps to fix AP+Monitor VAP with flood traffic scenario to see -monitor ring rx buffer overrun missing BUFFER_DONE tag to be set. - -Also remove redundant rx dma buf free performed on DP -rx_mon_status_refill_ring. - -Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1 - -Signed-off-by: Sathishkumar Muruganandam -Signed-off-by: Harshitha Prem -Signed-off-by: Kalle Valo -Link: https://lore.kernel.org/r/20230309164434.32660-1-quic_hprem@quicinc.com ---- - drivers/net/wireless/ath/ath11k/dp_rx.c | 57 ++++++++++--------------- - 1 file changed, 23 insertions(+), 34 deletions(-) - ---- a/drivers/net/wireless/ath/ath11k/dp_rx.c -+++ b/drivers/net/wireless/ath/ath11k/dp_rx.c -@@ -435,7 +435,6 @@ fail_free_skb: - static int ath11k_dp_rxdma_buf_ring_free(struct ath11k *ar, - struct dp_rxdma_ring *rx_ring) - { -- struct ath11k_pdev_dp *dp = &ar->dp; - struct sk_buff *skb; - int buf_id; - -@@ -453,28 +452,6 @@ static int ath11k_dp_rxdma_buf_ring_free - idr_destroy(&rx_ring->bufs_idr); - spin_unlock_bh(&rx_ring->idr_lock); - -- /* if rxdma1_enable is false, mon_status_refill_ring -- * isn't setup, so don't clean. -- */ -- if (!ar->ab->hw_params.rxdma1_enable) -- return 0; -- -- rx_ring = &dp->rx_mon_status_refill_ring[0]; -- -- spin_lock_bh(&rx_ring->idr_lock); -- idr_for_each_entry(&rx_ring->bufs_idr, skb, buf_id) { -- idr_remove(&rx_ring->bufs_idr, buf_id); -- /* XXX: Understand where internal driver does this dma_unmap -- * of rxdma_buffer. -- */ -- dma_unmap_single(ar->ab->dev, ATH11K_SKB_RXCB(skb)->paddr, -- skb->len + skb_tailroom(skb), DMA_BIDIRECTIONAL); -- dev_kfree_skb_any(skb); -- } -- -- idr_destroy(&rx_ring->bufs_idr); -- spin_unlock_bh(&rx_ring->idr_lock); -- - return 0; - } - -@@ -3029,39 +3006,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); -+ spin_unlock_bh(&rx_ring->idr_lock); -+ - if (!skb) { - ath11k_warn(ab, "rx monitor status with invalid buf_id %d\n", - buf_id); -- spin_unlock_bh(&rx_ring->idr_lock); - pmon->buf_state = DP_MON_STATUS_REPLINISH; - goto move_next; - } - -- idr_remove(&rx_ring->bufs_idr, buf_id); -- spin_unlock_bh(&rx_ring->idr_lock); -- - rxcb = ATH11K_SKB_RXCB(skb); - -- dma_unmap_single(ab->dev, rxcb->paddr, -- skb->len + skb_tailroom(skb), -- DMA_FROM_DEVICE); -+ dma_sync_single_for_cpu(ab->dev, rxcb->paddr, -+ skb->len + skb_tailroom(skb), -+ DMA_FROM_DEVICE); - - tlv = (struct hal_tlv_hdr *)skb->data; - if (FIELD_GET(HAL_TLV_HDR_TAG, tlv->tl) != - HAL_RX_STATUS_BUFFER_DONE) { -- ath11k_warn(ab, "mon status DONE not set %lx\n", -+ ath11k_warn(ab, "mon status DONE not set %lx, buf_id %d\n", - FIELD_GET(HAL_TLV_HDR_TAG, -- tlv->tl)); -- dev_kfree_skb_any(skb); -+ tlv->tl), buf_id); -+ /* If done status is missing, hold onto status -+ * ring until status is done for this status -+ * ring buffer. -+ * Keep HP in mon_status_ring unchanged, -+ * and break from here. -+ * Check status for same buffer for next time -+ */ - pmon->buf_state = DP_MON_STATUS_NO_DMA; -- goto move_next; -+ break; - } - -+ spin_lock_bh(&rx_ring->idr_lock); -+ idr_remove(&rx_ring->bufs_idr, buf_id); -+ spin_unlock_bh(&rx_ring->idr_lock); - if (ab->hw_params.full_monitor_mode) { - ath11k_dp_rx_mon_update_status_buf_state(pmon, tlv); - if (paddr == pmon->mon_status_paddr) - pmon->buf_state = DP_MON_STATUS_MATCH; - } -+ -+ dma_unmap_single(ab->dev, rxcb->paddr, -+ skb->len + skb_tailroom(skb), -+ DMA_FROM_DEVICE); -+ - __skb_queue_tail(skb_list, skb); - } else { - pmon->buf_state = DP_MON_STATUS_REPLINISH; diff --git a/package/kernel/mac80211/patches/ath11k/0049-wifi-ath11k-Optimize-6-GHz-scan-time.patch b/package/kernel/mac80211/patches/ath11k/0049-wifi-ath11k-Optimize-6-GHz-scan-time.patch deleted file mode 100644 index f468990feb..0000000000 --- a/package/kernel/mac80211/patches/ath11k/0049-wifi-ath11k-Optimize-6-GHz-scan-time.patch +++ /dev/null @@ -1,101 +0,0 @@ -From 8b4d2f080afbd4280ecca0f4b3ceea943a7a86d0 Mon Sep 17 00:00:00 2001 -From: Manikanta Pubbisetty -Date: Thu, 23 Mar 2023 11:39:13 +0530 -Subject: [PATCH] wifi: ath11k: Optimize 6 GHz scan time - -Currently, time taken to scan all supported channels on WCN6750 -is ~8 seconds and connection time is almost 10 seconds. WCN6750 -supports three Wi-Fi bands (i.e., 2.4/5/6 GHz) and the numbers of -channels for scan come around ~100 channels (default case). -Since the chip doesn't have support for DBS (Dual Band Simultaneous), -scans cannot be parallelized resulting in longer scan times. - -Among the 100 odd channels, ~60 channels are in 6 GHz band. Therefore, -optimizing the scan for 6 GHz channels will bring down the overall -scan time. - -WCN6750 firmware has support to scan a 6 GHz channel based on co-located -AP information i.e., RNR IE which is found in the legacy 2.4/5 GHz scan -results. When a scan request with all supported channel list is enqueued -to the firmware, then based on WMI_SCAN_CHAN_FLAG_SCAN_ONLY_IF_RNR_FOUND -scan channel flag, firmware will scan only those 6 GHz channels for which -RNR IEs are found in the legacy scan results. - -In the proposed design, based on NL80211_SCAN_FLAG_COLOCATED_6GHZ scan -flag, driver will set the WMI_SCAN_CHAN_FLAG_SCAN_ONLY_IF_RNR_FOUND flag -for non-PSC channels. Since there is high probability to find 6 GHz APs -on PSC channels, these channels are always scanned. Only non-PSC channels -are selectively scanned based on cached RNR information from the legacy -scan results. - -If NL80211_SCAN_FLAG_COLOCATED_6GHZ is not set in the scan flags, -then scan will happen on all supported channels (default behavior). - -With these optimizations, scan time is improved by 1.5-1.8 seconds on -WCN6750. Similar savings have been observed on WCN6855. - -Tested-on: WCN6750 hw1.0 AHB WLAN.MSL.1.0.1-00887-QCAMSLSWPLZ-1 -Tested-on: WCN6855 hw2.1 PCI WLAN.HSP.1.1-03125-QCAHSPSWPL_V1_V2_SILICONZ_LITE-3.6510.16 - -Signed-off-by: Manikanta Pubbisetty -Signed-off-by: Kalle Valo -Link: https://lore.kernel.org/r/20230323060913.10097-1-quic_mpubbise@quicinc.com ---- - drivers/net/wireless/ath/ath11k/mac.c | 25 +++++++++++++++++++++++-- - drivers/net/wireless/ath/ath11k/wmi.h | 4 ++++ - 2 files changed, 27 insertions(+), 2 deletions(-) - ---- a/drivers/net/wireless/ath/ath11k/mac.c -+++ b/drivers/net/wireless/ath/ath11k/mac.c -@@ -3819,8 +3819,29 @@ static int ath11k_mac_op_hw_scan(struct - goto exit; - } - -- for (i = 0; i < arg->num_chan; i++) -- arg->chan_list[i] = req->channels[i]->center_freq; -+ for (i = 0; i < arg->num_chan; i++) { -+ if (test_bit(WMI_TLV_SERVICE_SCAN_CONFIG_PER_CHANNEL, -+ ar->ab->wmi_ab.svc_map)) { -+ arg->chan_list[i] = -+ u32_encode_bits(req->channels[i]->center_freq, -+ WMI_SCAN_CONFIG_PER_CHANNEL_MASK); -+ -+ /* If NL80211_SCAN_FLAG_COLOCATED_6GHZ is set in scan -+ * flags, then scan all PSC channels in 6 GHz band and -+ * those non-PSC channels where RNR IE is found during -+ * the legacy 2.4/5 GHz scan. -+ * If NL80211_SCAN_FLAG_COLOCATED_6GHZ is not set, -+ * then all channels in 6 GHz will be scanned. -+ */ -+ if (req->channels[i]->band == NL80211_BAND_6GHZ && -+ req->flags & NL80211_SCAN_FLAG_COLOCATED_6GHZ && -+ !cfg80211_channel_is_psc(req->channels[i])) -+ arg->chan_list[i] |= -+ WMI_SCAN_CH_FLAG_SCAN_ONLY_IF_RNR_FOUND; -+ } else { -+ arg->chan_list[i] = req->channels[i]->center_freq; -+ } -+ } - } - - if (req->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) { ---- a/drivers/net/wireless/ath/ath11k/wmi.h -+++ b/drivers/net/wireless/ath/ath11k/wmi.h -@@ -2100,6 +2100,7 @@ enum wmi_tlv_service { - - /* The second 128 bits */ - WMI_MAX_EXT_SERVICE = 256, -+ WMI_TLV_SERVICE_SCAN_CONFIG_PER_CHANNEL = 265, - WMI_TLV_SERVICE_REG_CC_EXT_EVENT_SUPPORT = 281, - WMI_TLV_SERVICE_BIOS_SAR_SUPPORT = 326, - -@@ -3249,6 +3250,9 @@ struct wmi_start_scan_cmd { - #define WMI_SCAN_DWELL_MODE_SHIFT 21 - #define WMI_SCAN_FLAG_EXT_PASSIVE_SCAN_START_TIME_ENHANCE 0x00000800 - -+#define WMI_SCAN_CONFIG_PER_CHANNEL_MASK GENMASK(19, 0) -+#define WMI_SCAN_CH_FLAG_SCAN_ONLY_IF_RNR_FOUND BIT(20) -+ - enum { - WMI_SCAN_DWELL_MODE_DEFAULT = 0, - WMI_SCAN_DWELL_MODE_CONSERVATIVE = 1, diff --git a/package/kernel/mac80211/patches/ath11k/0050-wifi-ath11k-Configure-the-FTM-responder-role-using-f.patch b/package/kernel/mac80211/patches/ath11k/0050-wifi-ath11k-Configure-the-FTM-responder-role-using-f.patch deleted file mode 100644 index bca08b177f..0000000000 --- a/package/kernel/mac80211/patches/ath11k/0050-wifi-ath11k-Configure-the-FTM-responder-role-using-f.patch +++ /dev/null @@ -1,117 +0,0 @@ -From 813968c24126cc5c8320cd5db0e262069a535063 Mon Sep 17 00:00:00 2001 -From: Ganesh Babu Jothiram -Date: Fri, 24 Mar 2023 16:57:00 +0200 -Subject: [PATCH] wifi: ath11k: Configure the FTM responder role using firmware - capability flag - -Fine Time Measurement(FTM) is offloaded feature to firmware. -Hence, the configuration of FTM responder role is done using -firmware capability flag instead of hw param. - -Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1 - -Signed-off-by: Ganesh Babu Jothiram -Signed-off-by: Kalle Valo -Link: https://lore.kernel.org/r/20230317072034.8217-1-quic_gjothira@quicinc.com ---- - drivers/net/wireless/ath/ath11k/core.c | 8 -------- - drivers/net/wireless/ath/ath11k/hw.h | 1 - - drivers/net/wireless/ath/ath11k/mac.c | 4 ++-- - 3 files changed, 2 insertions(+), 11 deletions(-) - ---- a/drivers/net/wireless/ath/ath11k/core.c -+++ b/drivers/net/wireless/ath/ath11k/core.c -@@ -116,7 +116,6 @@ static const struct ath11k_hw_params ath - .tcl_ring_retry = true, - .tx_ring_size = DP_TCL_DATA_RING_SIZE, - .smp2p_wow_exit = false, -- .ftm_responder = true, - }, - { - .hw_rev = ATH11K_HW_IPQ6018_HW10, -@@ -199,7 +198,6 @@ static const struct ath11k_hw_params ath - .tx_ring_size = DP_TCL_DATA_RING_SIZE, - .smp2p_wow_exit = false, - .support_fw_mac_sequence = false, -- .ftm_responder = true, - }, - { - .name = "qca6390 hw2.0", -@@ -284,7 +282,6 @@ static const struct ath11k_hw_params ath - .tx_ring_size = DP_TCL_DATA_RING_SIZE, - .smp2p_wow_exit = false, - .support_fw_mac_sequence = true, -- .ftm_responder = false, - }, - { - .name = "qcn9074 hw1.0", -@@ -366,7 +363,6 @@ static const struct ath11k_hw_params ath - .tx_ring_size = DP_TCL_DATA_RING_SIZE, - .smp2p_wow_exit = false, - .support_fw_mac_sequence = false, -- .ftm_responder = true, - }, - { - .name = "wcn6855 hw2.0", -@@ -451,7 +447,6 @@ static const struct ath11k_hw_params ath - .tx_ring_size = DP_TCL_DATA_RING_SIZE, - .smp2p_wow_exit = false, - .support_fw_mac_sequence = true, -- .ftm_responder = false, - }, - { - .name = "wcn6855 hw2.1", -@@ -534,7 +529,6 @@ static const struct ath11k_hw_params ath - .tx_ring_size = DP_TCL_DATA_RING_SIZE, - .smp2p_wow_exit = false, - .support_fw_mac_sequence = true, -- .ftm_responder = false, - }, - { - .name = "wcn6750 hw1.0", -@@ -615,7 +609,6 @@ static const struct ath11k_hw_params ath - .tx_ring_size = DP_TCL_DATA_RING_SIZE_WCN6750, - .smp2p_wow_exit = true, - .support_fw_mac_sequence = true, -- .ftm_responder = false, - }, - { - .hw_rev = ATH11K_HW_IPQ5018_HW10, -@@ -695,7 +688,6 @@ static const struct ath11k_hw_params ath - .tx_ring_size = DP_TCL_DATA_RING_SIZE, - .smp2p_wow_exit = false, - .support_fw_mac_sequence = false, -- .ftm_responder = true, - }, - }; - ---- a/drivers/net/wireless/ath/ath11k/hw.h -+++ b/drivers/net/wireless/ath/ath11k/hw.h -@@ -224,7 +224,6 @@ struct ath11k_hw_params { - u32 tx_ring_size; - bool smp2p_wow_exit; - bool support_fw_mac_sequence; -- bool ftm_responder; - }; - - struct ath11k_hw_ops { ---- a/drivers/net/wireless/ath/ath11k/mac.c -+++ b/drivers/net/wireless/ath/ath11k/mac.c -@@ -3538,7 +3538,7 @@ static void ath11k_mac_op_bss_info_chang - - if (changed & BSS_CHANGED_FTM_RESPONDER && - arvif->ftm_responder != info->ftm_responder && -- ar->ab->hw_params.ftm_responder && -+ test_bit(WMI_TLV_SERVICE_RTT, ar->ab->wmi_ab.svc_map) && - (vif->type == NL80211_IFTYPE_AP || - vif->type == NL80211_IFTYPE_MESH_POINT)) { - arvif->ftm_responder = info->ftm_responder; -@@ -9234,7 +9234,7 @@ static int __ath11k_mac_register(struct - wiphy_ext_feature_set(ar->hw->wiphy, - NL80211_EXT_FEATURE_SET_SCAN_DWELL); - -- if (ab->hw_params.ftm_responder) -+ if (test_bit(WMI_TLV_SERVICE_RTT, ar->ab->wmi_ab.svc_map)) - wiphy_ext_feature_set(ar->hw->wiphy, - NL80211_EXT_FEATURE_ENABLE_FTM_RESPONDER); - diff --git a/package/kernel/mac80211/patches/ath11k/0051-wifi-ath11k-fix-rssi-station-dump-not-updated-in-QCN.patch b/package/kernel/mac80211/patches/ath11k/0051-wifi-ath11k-fix-rssi-station-dump-not-updated-in-QCN.patch deleted file mode 100644 index 835dece1fe..0000000000 --- a/package/kernel/mac80211/patches/ath11k/0051-wifi-ath11k-fix-rssi-station-dump-not-updated-in-QCN.patch +++ /dev/null @@ -1,158 +0,0 @@ -From 031ffa6c2cd305a57ccc6d610f2decd956b2e7f6 Mon Sep 17 00:00:00 2001 -From: P Praneesh -Date: Fri, 24 Mar 2023 16:57:00 +0200 -Subject: [PATCH] wifi: ath11k: fix rssi station dump not updated in QCN9074 - -In QCN9074, station dump signal values display default value which -is -95 dbm, since there is firmware header change for HAL_RX_MPDU_START -between QCN9074 and IPQ8074 which cause wrong peer_id fetch from msdu. -Fix this by updating hal_rx_mpdu_info with corresponding QCN9074 tlv -format. - -Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1 -Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.4.0.1-01695-QCAHKSWPL_SILICONZ-1 - -Signed-off-by: P Praneesh -Signed-off-by: Kalle Valo -Link: https://lore.kernel.org/r/20230320110312.20639-1-quic_ppranees@quicinc.com ---- - drivers/net/wireless/ath/ath11k/hal_rx.c | 10 ++++++++- - drivers/net/wireless/ath/ath11k/hal_rx.h | 18 +++++++++++++++- - drivers/net/wireless/ath/ath11k/hw.c | 27 ++++++++++++++++-------- - drivers/net/wireless/ath/ath11k/hw.h | 2 +- - 4 files changed, 45 insertions(+), 12 deletions(-) - ---- 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 - ath11k_hal_rx_populate_byte_count(rx_tlv, ppdu_info, rx_user_status); - } - -+static u16 ath11k_hal_rx_mpduinfo_get_peerid(struct ath11k_base *ab, -+ struct hal_rx_mpdu_info *mpdu_info) -+{ -+ return ab->hw_params.hw_ops->mpdu_info_get_peerid(mpdu_info); -+} -+ - 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 - break; - } - case HAL_RX_MPDU_START: { -+ struct hal_rx_mpdu_info *mpdu_info = -+ (struct hal_rx_mpdu_info *)tlv_data; - u16 peer_id; - -- peer_id = ab->hw_params.hw_ops->mpdu_info_get_peerid(tlv_data); -+ peer_id = ath11k_hal_rx_mpduinfo_get_peerid(ab, mpdu_info); - if (peer_id) - ppdu_info->peer_id = peer_id; - break; ---- a/drivers/net/wireless/ath/ath11k/hal_rx.h -+++ b/drivers/net/wireless/ath/ath11k/hal_rx.h -@@ -405,7 +405,7 @@ struct hal_rx_phyrx_rssi_legacy_info { - #define HAL_RX_MPDU_INFO_INFO0_PEERID_WCN6855 GENMASK(15, 0) - #define HAL_RX_MPDU_INFO_INFO1_MPDU_LEN GENMASK(13, 0) - --struct hal_rx_mpdu_info { -+struct hal_rx_mpdu_info_ipq8074 { - __le32 rsvd0; - __le32 info0; - __le32 rsvd1[11]; -@@ -413,12 +413,28 @@ struct hal_rx_mpdu_info { - __le32 rsvd2[9]; - } __packed; - -+struct hal_rx_mpdu_info_qcn9074 { -+ __le32 rsvd0[10]; -+ __le32 info0; -+ __le32 rsvd1[2]; -+ __le32 info1; -+ __le32 rsvd2[9]; -+} __packed; -+ - struct hal_rx_mpdu_info_wcn6855 { - __le32 rsvd0[8]; - __le32 info0; - __le32 rsvd1[14]; - } __packed; - -+struct hal_rx_mpdu_info { -+ union { -+ struct hal_rx_mpdu_info_ipq8074 ipq8074; -+ struct hal_rx_mpdu_info_qcn9074 qcn9074; -+ struct hal_rx_mpdu_info_wcn6855 wcn6855; -+ } u; -+} __packed; -+ - #define HAL_RX_PPDU_END_DURATION GENMASK(23, 0) - struct hal_rx_ppdu_end_duration { - __le32 rsvd0[9]; ---- a/drivers/net/wireless/ath/ath11k/hw.c -+++ b/drivers/net/wireless/ath/ath11k/hw.c -@@ -835,26 +835,35 @@ static void ath11k_hw_ipq5018_reo_setup( - ring_hash_map); - } - --static u16 ath11k_hw_ipq8074_mpdu_info_get_peerid(u8 *tlv_data) -+static u16 -+ath11k_hw_ipq8074_mpdu_info_get_peerid(struct hal_rx_mpdu_info *mpdu_info) - { - u16 peer_id = 0; -- struct hal_rx_mpdu_info *mpdu_info = -- (struct hal_rx_mpdu_info *)tlv_data; - - peer_id = FIELD_GET(HAL_RX_MPDU_INFO_INFO0_PEERID, -- __le32_to_cpu(mpdu_info->info0)); -+ __le32_to_cpu(mpdu_info->u.ipq8074.info0)); - - return peer_id; - } - --static u16 ath11k_hw_wcn6855_mpdu_info_get_peerid(u8 *tlv_data) -+static u16 -+ath11k_hw_qcn9074_mpdu_info_get_peerid(struct hal_rx_mpdu_info *mpdu_info) -+{ -+ u16 peer_id = 0; -+ -+ peer_id = FIELD_GET(HAL_RX_MPDU_INFO_INFO0_PEERID, -+ __le32_to_cpu(mpdu_info->u.qcn9074.info0)); -+ -+ return peer_id; -+} -+ -+static u16 -+ath11k_hw_wcn6855_mpdu_info_get_peerid(struct hal_rx_mpdu_info *mpdu_info) - { - u16 peer_id = 0; -- struct hal_rx_mpdu_info_wcn6855 *mpdu_info = -- (struct hal_rx_mpdu_info_wcn6855 *)tlv_data; - - peer_id = FIELD_GET(HAL_RX_MPDU_INFO_INFO0_PEERID_WCN6855, -- __le32_to_cpu(mpdu_info->info0)); -+ __le32_to_cpu(mpdu_info->u.wcn6855.info0)); - return peer_id; - } - -@@ -1042,7 +1051,7 @@ const struct ath11k_hw_ops qcn9074_ops = - .rx_desc_get_attention = ath11k_hw_qcn9074_rx_desc_get_attention, - .rx_desc_get_msdu_payload = ath11k_hw_qcn9074_rx_desc_get_msdu_payload, - .reo_setup = ath11k_hw_ipq8074_reo_setup, -- .mpdu_info_get_peerid = ath11k_hw_ipq8074_mpdu_info_get_peerid, -+ .mpdu_info_get_peerid = ath11k_hw_qcn9074_mpdu_info_get_peerid, - .rx_desc_mac_addr2_valid = ath11k_hw_ipq9074_rx_desc_mac_addr2_valid, - .rx_desc_mpdu_start_addr2 = ath11k_hw_ipq9074_rx_desc_mpdu_start_addr2, - .get_ring_selector = ath11k_hw_ipq8074_get_tcl_ring_selector, ---- a/drivers/net/wireless/ath/ath11k/hw.h -+++ b/drivers/net/wireless/ath/ath11k/hw.h -@@ -263,7 +263,7 @@ struct ath11k_hw_ops { - struct rx_attention *(*rx_desc_get_attention)(struct hal_rx_desc *desc); - u8 *(*rx_desc_get_msdu_payload)(struct hal_rx_desc *desc); - void (*reo_setup)(struct ath11k_base *ab); -- u16 (*mpdu_info_get_peerid)(u8 *tlv_data); -+ u16 (*mpdu_info_get_peerid)(struct hal_rx_mpdu_info *mpdu_info); - bool (*rx_desc_mac_addr2_valid)(struct hal_rx_desc *desc); - u8* (*rx_desc_mpdu_start_addr2)(struct hal_rx_desc *desc); - u32 (*get_ring_selector)(struct sk_buff *skb); diff --git a/package/kernel/mac80211/patches/ath11k/0052-wifi-ath11k-Fix-invalid-management-rx-frame-length-i.patch b/package/kernel/mac80211/patches/ath11k/0052-wifi-ath11k-Fix-invalid-management-rx-frame-length-i.patch deleted file mode 100644 index 0c1637fb04..0000000000 --- a/package/kernel/mac80211/patches/ath11k/0052-wifi-ath11k-Fix-invalid-management-rx-frame-length-i.patch +++ /dev/null @@ -1,115 +0,0 @@ -From 447b0398a9cd41ca343dfd43e555af92d6214487 Mon Sep 17 00:00:00 2001 -From: Bhagavathi Perumal S -Date: Fri, 24 Mar 2023 16:57:00 +0200 -Subject: [PATCH] wifi: ath11k: Fix invalid management rx frame length issue - -The WMI management rx event has multiple arrays of TLVs, however the common -WMI TLV parser won't handle multiple TLV tags of same type. -So the multiple array tags of WMI management rx TLV is parsed incorrectly -and the length calculated becomes wrong when the target sends multiple -array tags. - -Add separate TLV parser to handle multiple arrays for WMI management rx -TLV. This fixes invalid length issue when the target sends multiple array -tags. - -Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1 - -Signed-off-by: Bhagavathi Perumal S -Co-developed-by: Nagarajan Maran -Signed-off-by: Nagarajan Maran -Signed-off-by: Kalle Valo -Link: https://lore.kernel.org/r/20230320133840.30162-1-quic_nmaran@quicinc.com ---- - drivers/net/wireless/ath/ath11k/wmi.c | 45 +++++++++++++++++++++------ - 1 file changed, 35 insertions(+), 10 deletions(-) - ---- a/drivers/net/wireless/ath/ath11k/wmi.c -+++ b/drivers/net/wireless/ath/ath11k/wmi.c -@@ -82,6 +82,12 @@ struct wmi_tlv_fw_stats_parse { - bool chain_rssi_done; - }; - -+struct wmi_tlv_mgmt_rx_parse { -+ const struct wmi_mgmt_rx_hdr *fixed; -+ const u8 *frame_buf; -+ bool frame_buf_done; -+}; -+ - static const struct wmi_tlv_policy wmi_tlv_policies[] = { - [WMI_TAG_ARRAY_BYTE] - = { .min_len = 0 }, -@@ -5633,28 +5639,49 @@ static int ath11k_pull_vdev_stopped_para - return 0; - } - -+static int ath11k_wmi_tlv_mgmt_rx_parse(struct ath11k_base *ab, -+ u16 tag, u16 len, -+ const void *ptr, void *data) -+{ -+ struct wmi_tlv_mgmt_rx_parse *parse = data; -+ -+ switch (tag) { -+ case WMI_TAG_MGMT_RX_HDR: -+ parse->fixed = ptr; -+ break; -+ case WMI_TAG_ARRAY_BYTE: -+ if (!parse->frame_buf_done) { -+ parse->frame_buf = ptr; -+ parse->frame_buf_done = true; -+ } -+ break; -+ } -+ return 0; -+} -+ - static int ath11k_pull_mgmt_rx_params_tlv(struct ath11k_base *ab, - struct sk_buff *skb, - struct mgmt_rx_event_params *hdr) - { -- const void **tb; -+ struct wmi_tlv_mgmt_rx_parse parse = { }; - const struct wmi_mgmt_rx_hdr *ev; - const u8 *frame; - int ret; - -- tb = ath11k_wmi_tlv_parse_alloc(ab, skb->data, skb->len, GFP_ATOMIC); -- if (IS_ERR(tb)) { -- ret = PTR_ERR(tb); -- ath11k_warn(ab, "failed to parse tlv: %d\n", ret); -+ ret = ath11k_wmi_tlv_iter(ab, skb->data, skb->len, -+ ath11k_wmi_tlv_mgmt_rx_parse, -+ &parse); -+ if (ret) { -+ ath11k_warn(ab, "failed to parse mgmt rx tlv %d\n", -+ ret); - return ret; - } - -- ev = tb[WMI_TAG_MGMT_RX_HDR]; -- frame = tb[WMI_TAG_ARRAY_BYTE]; -+ ev = parse.fixed; -+ frame = parse.frame_buf; - - if (!ev || !frame) { - ath11k_warn(ab, "failed to fetch mgmt rx hdr"); -- kfree(tb); - return -EPROTO; - } - -@@ -5673,7 +5700,6 @@ static int ath11k_pull_mgmt_rx_params_tl - - if (skb->len < (frame - skb->data) + hdr->buf_len) { - ath11k_warn(ab, "invalid length in mgmt rx hdr ev"); -- kfree(tb); - return -EPROTO; - } - -@@ -5685,7 +5711,6 @@ static int ath11k_pull_mgmt_rx_params_tl - - ath11k_ce_byte_swap(skb->data, hdr->buf_len); - -- kfree(tb); - return 0; - } - diff --git a/package/kernel/mac80211/patches/ath11k/0053-wifi-ath11k-fix-writing-to-unintended-memory-region.patch b/package/kernel/mac80211/patches/ath11k/0053-wifi-ath11k-fix-writing-to-unintended-memory-region.patch deleted file mode 100644 index 7b8a7d4543..0000000000 --- a/package/kernel/mac80211/patches/ath11k/0053-wifi-ath11k-fix-writing-to-unintended-memory-region.patch +++ /dev/null @@ -1,43 +0,0 @@ -From 756a7f90878f0866fd2fe167ef37e90b47326b96 Mon Sep 17 00:00:00 2001 -From: P Praneesh -Date: Fri, 24 Mar 2023 16:57:01 +0200 -Subject: [PATCH] wifi: ath11k: fix writing to unintended memory region - -While initializing spectral, the magic value is getting written to the -invalid memory address leading to random boot-up crash. This occurs -due to the incorrect index increment in ath11k_dbring_fill_magic_value -function. Fix it by replacing the existing logic with memset32 to ensure -there is no invalid memory access. - -Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.4.0.1-01838-QCAHKSWPL_SILICONZ-1 - -Fixes: d3d358efc553 ("ath11k: add spectral/CFR buffer validation support") -Signed-off-by: P Praneesh -Signed-off-by: Kalle Valo -Link: https://lore.kernel.org/r/20230321052900.16895-1-quic_ppranees@quicinc.com ---- - drivers/net/wireless/ath/ath11k/dbring.c | 12 ++++++------ - 1 file changed, 6 insertions(+), 6 deletions(-) - ---- a/drivers/net/wireless/ath/ath11k/dbring.c -+++ b/drivers/net/wireless/ath/ath11k/dbring.c -@@ -26,13 +26,13 @@ int ath11k_dbring_validate_buffer(struct - static void ath11k_dbring_fill_magic_value(struct ath11k *ar, - void *buffer, u32 size) - { -- u32 *temp; -- int idx; -+ /* memset32 function fills buffer payload with the ATH11K_DB_MAGIC_VALUE -+ * and the variable size is expected to be the number of u32 values -+ * to be stored, not the number of bytes. -+ */ -+ size = size / sizeof(u32); - -- size = size >> 2; -- -- for (idx = 0, temp = buffer; idx < size; idx++, temp++) -- *temp++ = ATH11K_DB_MAGIC_VALUE; -+ memset32(buffer, ATH11K_DB_MAGIC_VALUE, size); - } - - static int ath11k_dbring_bufs_replenish(struct ath11k *ar, diff --git a/package/kernel/mac80211/patches/ath11k/0054-wifi-ath11k-Send-11d-scan-start-before-WMI_START_SCA.patch b/package/kernel/mac80211/patches/ath11k/0054-wifi-ath11k-Send-11d-scan-start-before-WMI_START_SCA.patch deleted file mode 100644 index 0f8e637592..0000000000 --- a/package/kernel/mac80211/patches/ath11k/0054-wifi-ath11k-Send-11d-scan-start-before-WMI_START_SCA.patch +++ /dev/null @@ -1,61 +0,0 @@ -From e89a51aedf380bc60219dc9afa96c36507060fb3 Mon Sep 17 00:00:00 2001 -From: Manikanta Pubbisetty -Date: Wed, 15 Mar 2023 21:48:17 +0530 -Subject: [PATCH] wifi: ath11k: Send 11d scan start before WMI_START_SCAN_CMDID - -Firmwares advertising the support of triggering 11d algorithm on the -scan results of a regular scan expects driver to send -WMI_11D_SCAN_START_CMDID before sending WMI_START_SCAN_CMDID. -Triggering 11d algorithm on the scan results of a normal scan helps -in completely avoiding a separate 11d scan for determining regdomain. -This indirectly helps in speeding up connections on station -interfaces on the chipsets supporting 11D scan. - -To enable this feature, send WMI_11D_SCAN_START_CMDID just before -sending WMI_START_SCAN_CMDID if the firmware advertises -WMI_TLV_SERVICE_SUPPORT_11D_FOR_HOST_SCAN service flag. - -WCN6750 & WCN6855 supports this feature. - -Tested-on: WCN6750 hw1.0 AHB WLAN.MSL.1.0.1-01160-QCAMSLSWPLZ-1 -Tested-on: WCN6855 hw2.1 PCI WLAN.HSP.1.1-03125-QCAHSPSWPL_V1_V2_SILICONZ_LITE-3.6510.23 - -Signed-off-by: Manikanta Pubbisetty -Signed-off-by: Kalle Valo -Link: https://lore.kernel.org/r/20230315161817.29627-1-quic_mpubbise@quicinc.com ---- - drivers/net/wireless/ath/ath11k/mac.c | 12 ++++++++++++ - drivers/net/wireless/ath/ath11k/wmi.h | 1 + - 2 files changed, 13 insertions(+) - ---- a/drivers/net/wireless/ath/ath11k/mac.c -+++ b/drivers/net/wireless/ath/ath11k/mac.c -@@ -3755,6 +3755,18 @@ static int ath11k_mac_op_hw_scan(struct - int i; - u32 scan_timeout; - -+ /* Firmwares advertising the support of triggering 11D algorithm -+ * on the scan results of a regular scan expects driver to send -+ * WMI_11D_SCAN_START_CMDID before sending WMI_START_SCAN_CMDID. -+ * With this feature, separate 11D scan can be avoided since -+ * regdomain can be determined with the scan results of the -+ * regular scan. -+ */ -+ if (ar->state_11d == ATH11K_11D_PREPARING && -+ test_bit(WMI_TLV_SERVICE_SUPPORT_11D_FOR_HOST_SCAN, -+ ar->ab->wmi_ab.svc_map)) -+ ath11k_mac_11d_scan_start(ar, arvif->vdev_id); -+ - mutex_lock(&ar->conf_mutex); - - spin_lock_bh(&ar->data_lock); ---- a/drivers/net/wireless/ath/ath11k/wmi.h -+++ b/drivers/net/wireless/ath/ath11k/wmi.h -@@ -2103,6 +2103,7 @@ enum wmi_tlv_service { - WMI_TLV_SERVICE_SCAN_CONFIG_PER_CHANNEL = 265, - WMI_TLV_SERVICE_REG_CC_EXT_EVENT_SUPPORT = 281, - WMI_TLV_SERVICE_BIOS_SAR_SUPPORT = 326, -+ WMI_TLV_SERVICE_SUPPORT_11D_FOR_HOST_SCAN = 357, - - /* The third 128 bits */ - WMI_MAX_EXT2_SERVICE = 384 diff --git a/package/kernel/mac80211/patches/ath11k/0055-wifi-ath11k-Remove-redundant-pci_clear_master.patch b/package/kernel/mac80211/patches/ath11k/0055-wifi-ath11k-Remove-redundant-pci_clear_master.patch deleted file mode 100644 index 0439727e72..0000000000 --- a/package/kernel/mac80211/patches/ath11k/0055-wifi-ath11k-Remove-redundant-pci_clear_master.patch +++ /dev/null @@ -1,58 +0,0 @@ -From f812e2a9f85d6bea78957ccb5197e4491316848b Mon Sep 17 00:00:00 2001 -From: Cai Huoqing -Date: Thu, 23 Mar 2023 19:26:09 +0800 -Subject: [PATCH] wifi: ath11k: Remove redundant pci_clear_master - -Remove pci_clear_master to simplify the code, -the bus-mastering is also cleared in do_pci_disable_device, -like this: -./drivers/pci/pci.c:2197 -static void do_pci_disable_device(struct pci_dev *dev) -{ - u16 pci_command; - - pci_read_config_word(dev, PCI_COMMAND, &pci_command); - if (pci_command & PCI_COMMAND_MASTER) { - pci_command &= ~PCI_COMMAND_MASTER; - pci_write_config_word(dev, PCI_COMMAND, pci_command); - } - - pcibios_disable_device(dev); -}. -And dev->is_busmaster is set to 0 in pci_disable_device. - -Signed-off-by: Cai Huoqing -Signed-off-by: Kalle Valo -Link: https://lore.kernel.org/r/20230323112613.7550-1-cai.huoqing@linux.dev ---- - drivers/net/wireless/ath/ath11k/pci.c | 5 +---- - 1 file changed, 1 insertion(+), 4 deletions(-) - ---- a/drivers/net/wireless/ath/ath11k/pci.c -+++ b/drivers/net/wireless/ath/ath11k/pci.c -@@ -540,7 +540,7 @@ static int ath11k_pci_claim(struct ath11 - if (!ab->mem) { - ath11k_err(ab, "failed to map pci bar %d\n", ATH11K_PCI_BAR_NUM); - ret = -EIO; -- goto clear_master; -+ goto release_region; - } - - ab->mem_ce = ab->mem; -@@ -548,8 +548,6 @@ static int ath11k_pci_claim(struct ath11 - ath11k_dbg(ab, ATH11K_DBG_BOOT, "boot pci_mem 0x%pK\n", ab->mem); - return 0; - --clear_master: -- pci_clear_master(pdev); - release_region: - pci_release_region(pdev, ATH11K_PCI_BAR_NUM); - disable_device: -@@ -565,7 +563,6 @@ static void ath11k_pci_free_region(struc - - pci_iounmap(pci_dev, ab->mem); - ab->mem = NULL; -- pci_clear_master(pci_dev); - pci_release_region(pci_dev, ATH11K_PCI_BAR_NUM); - if (pci_is_enabled(pci_dev)) - pci_disable_device(pci_dev); diff --git a/package/kernel/mac80211/patches/ath11k/0056-wifi-ath11k-Disable-Spectral-scan-upon-removing-inte.patch b/package/kernel/mac80211/patches/ath11k/0056-wifi-ath11k-Disable-Spectral-scan-upon-removing-inte.patch deleted file mode 100644 index 44532a4d72..0000000000 --- a/package/kernel/mac80211/patches/ath11k/0056-wifi-ath11k-Disable-Spectral-scan-upon-removing-inte.patch +++ /dev/null @@ -1,36 +0,0 @@ -From 5c690db63b45c6c4c4932b13173af71df369dba5 Mon Sep 17 00:00:00 2001 -From: Tamizh Chelvam Raja -Date: Tue, 28 Mar 2023 12:41:50 +0530 -Subject: [PATCH] wifi: ath11k: Disable Spectral scan upon removing interface - -Host might receive spectral events during interface -down sequence and this might create below errors. - -failed to handle dma buf release event -22 -failed to handle dma buf release event -22 - -Fix this by disabling spectral config during remove interface. - -Tested-on: IPQ5018 hw1.0 AHB WLAN.HK.2.6.0.1-00861-QCAHKSWPL_SILICONZ-1 - -Signed-off-by: Tamizh Chelvam Raja -Signed-off-by: Kalle Valo -Link: https://lore.kernel.org/r/20230328071150.29645-1-quic_tamizhr@quicinc.com ---- - drivers/net/wireless/ath/ath11k/mac.c | 5 +++++ - 1 file changed, 5 insertions(+) - ---- a/drivers/net/wireless/ath/ath11k/mac.c -+++ b/drivers/net/wireless/ath/ath11k/mac.c -@@ -6685,6 +6685,11 @@ static void ath11k_mac_op_remove_interfa - ath11k_dbg(ab, ATH11K_DBG_MAC, "mac remove interface (vdev %d)\n", - arvif->vdev_id); - -+ ret = ath11k_spectral_vif_stop(arvif); -+ if (ret) -+ ath11k_warn(ab, "failed to stop spectral for vdev %i: %d\n", -+ arvif->vdev_id, ret); -+ - if (arvif->vdev_type == WMI_VDEV_TYPE_STA) - ath11k_mac_11d_scan_stop(ar); - diff --git a/package/kernel/mac80211/patches/ath11k/0057-wifi-ath11k-enable-SAR-support-on-WCN6750.patch b/package/kernel/mac80211/patches/ath11k/0057-wifi-ath11k-enable-SAR-support-on-WCN6750.patch deleted file mode 100644 index 5e64e552c1..0000000000 --- a/package/kernel/mac80211/patches/ath11k/0057-wifi-ath11k-enable-SAR-support-on-WCN6750.patch +++ /dev/null @@ -1,29 +0,0 @@ -From abf57d84973ce1abcb67504ac0df8aea1fe09a76 Mon Sep 17 00:00:00 2001 -From: Youghandhar Chintala -Date: Tue, 28 Mar 2023 17:04:55 +0530 -Subject: [PATCH] wifi: ath11k: enable SAR support on WCN6750 - -Currently, SAR is enabled only on WCN6855, enable this for WCN6750 too. This -functionality gets triggered, when the user space application calls -NL80211_CMD_SET_SAR_SPECS. - -Tested-on: WCN6750 hw1.0 AHB WLAN.MSL.1.0.1-00887-QCAMSLSWPLZ-1 - -Signed-off-by: Youghandhar Chintala -Signed-off-by: Kalle Valo -Link: https://lore.kernel.org/r/20230328113455.11252-1-quic_youghand@quicinc.com ---- - drivers/net/wireless/ath/ath11k/core.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/drivers/net/wireless/ath/ath11k/core.c -+++ b/drivers/net/wireless/ath/ath11k/core.c -@@ -593,7 +593,7 @@ static const struct ath11k_hw_params ath - .current_cc_support = true, - .dbr_debug_support = false, - .global_reset = false, -- .bios_sar_capa = NULL, -+ .bios_sar_capa = &ath11k_hw_sar_capa_wcn6855, - .m3_fw_support = false, - .fixed_bdf_addr = false, - .fixed_mem_region = false, diff --git a/package/kernel/mac80211/patches/ath11k/0058-wifi-ath11k-pci-Add-more-MODULE_FIRMWARE-entries.patch b/package/kernel/mac80211/patches/ath11k/0058-wifi-ath11k-pci-Add-more-MODULE_FIRMWARE-entries.patch deleted file mode 100644 index 585864eff2..0000000000 --- a/package/kernel/mac80211/patches/ath11k/0058-wifi-ath11k-pci-Add-more-MODULE_FIRMWARE-entries.patch +++ /dev/null @@ -1,36 +0,0 @@ -From 06c58473969239e00d76b683edd511952060ca56 Mon Sep 17 00:00:00 2001 -From: Takashi Iwai -Date: Thu, 30 Mar 2023 16:37:18 +0200 -Subject: [PATCH] wifi: ath11k: pci: Add more MODULE_FIRMWARE() entries - -As there are a few more models supported by the driver, let's add the -missing MODULE_FIRMWARE() entries for them. The lack of them resulted -in the missing device enablement on some systems, such as the -installation image of openSUSE. - -While we are at it, use the wildcard instead of listing each firmware -files individually for each. - -Signed-off-by: Takashi Iwai -Reviewed-by: Simon Horman -Signed-off-by: Kalle Valo -Link: https://lore.kernel.org/r/20230330143718.19511-1-tiwai@suse.de ---- - drivers/net/wireless/ath/ath11k/pci.c | 9 +++++---- - 1 file changed, 5 insertions(+), 4 deletions(-) - ---- a/drivers/net/wireless/ath/ath11k/pci.c -+++ b/drivers/net/wireless/ath/ath11k/pci.c -@@ -1036,7 +1036,8 @@ module_exit(ath11k_pci_exit); - MODULE_DESCRIPTION("Driver support for Qualcomm Technologies 802.11ax WLAN PCIe devices"); - MODULE_LICENSE("Dual BSD/GPL"); - --/* QCA639x 2.0 firmware files */ --MODULE_FIRMWARE(ATH11K_FW_DIR "/QCA6390/hw2.0/" ATH11K_BOARD_API2_FILE); --MODULE_FIRMWARE(ATH11K_FW_DIR "/QCA6390/hw2.0/" ATH11K_AMSS_FILE); --MODULE_FIRMWARE(ATH11K_FW_DIR "/QCA6390/hw2.0/" ATH11K_M3_FILE); -+/* firmware files */ -+MODULE_FIRMWARE(ATH11K_FW_DIR "/QCA6390/hw2.0/*"); -+MODULE_FIRMWARE(ATH11K_FW_DIR "/QCN9074/hw1.0/*"); -+MODULE_FIRMWARE(ATH11K_FW_DIR "/WCN6855/hw2.0/*"); -+MODULE_FIRMWARE(ATH11K_FW_DIR "/WCN6855/hw2.1/*"); diff --git a/package/kernel/mac80211/patches/ath11k/0059-wifi-ath11k-print-a-warning-when-crypto_alloc_shash-.patch b/package/kernel/mac80211/patches/ath11k/0059-wifi-ath11k-print-a-warning-when-crypto_alloc_shash-.patch deleted file mode 100644 index fab52a0fa7..0000000000 --- a/package/kernel/mac80211/patches/ath11k/0059-wifi-ath11k-print-a-warning-when-crypto_alloc_shash-.patch +++ /dev/null @@ -1,34 +0,0 @@ -From a87a9110ac0dcbfd9458b6665c141fa1c16a669d Mon Sep 17 00:00:00 2001 -From: Kalle Valo -Date: Wed, 5 Apr 2023 12:04:25 +0300 -Subject: [PATCH] wifi: ath11k: print a warning when crypto_alloc_shash() fails - -Christoph reported that ath11k failed to initialise when michael_mic.ko -module was not installed. To make it easier to notice that case print a -warning when crypto_alloc_shash() fails. - -Compile tested only. - -Reported-by: Christoph Hellwig -Link: https://lore.kernel.org/all/20221130133016.GC3055@lst.de/ -Signed-off-by: Kalle Valo -Link: https://lore.kernel.org/r/20230405090425.1351-1-kvalo@kernel.org ---- - drivers/net/wireless/ath/ath11k/dp_rx.c | 5 ++++- - 1 file changed, 4 insertions(+), 1 deletion(-) - ---- a/drivers/net/wireless/ath/ath11k/dp_rx.c -+++ b/drivers/net/wireless/ath/ath11k/dp_rx.c -@@ -3106,8 +3106,11 @@ int ath11k_peer_rx_frag_setup(struct ath - int i; - - tfm = crypto_alloc_shash("michael_mic", 0, 0); -- if (IS_ERR(tfm)) -+ if (IS_ERR(tfm)) { -+ ath11k_warn(ab, "failed to allocate michael_mic shash: %ld\n", -+ PTR_ERR(tfm)); - return PTR_ERR(tfm); -+ } - - spin_lock_bh(&ab->base_lock); - diff --git a/package/kernel/mac80211/patches/ath11k/0060-wifi-ath11k-Ignore-frags-from-uninitialized-peer-in-.patch b/package/kernel/mac80211/patches/ath11k/0060-wifi-ath11k-Ignore-frags-from-uninitialized-peer-in-.patch deleted file mode 100644 index 5bbf9e04a4..0000000000 --- a/package/kernel/mac80211/patches/ath11k/0060-wifi-ath11k-Ignore-frags-from-uninitialized-peer-in-.patch +++ /dev/null @@ -1,104 +0,0 @@ -From a06bfb3c9f69f303692cdae87bc0899d2ae8b2a6 Mon Sep 17 00:00:00 2001 -From: Harshitha Prem -Date: Tue, 4 Apr 2023 00:11:54 +0530 -Subject: [PATCH] wifi: ath11k: Ignore frags from uninitialized peer in dp. - -When max virtual ap interfaces are configured in all the bands with -ACS and hostapd restart is done every 60s, a crash is observed at -random times. -In this certain scenario, a fragmented packet is received for -self peer, for which rx_tid and rx_frags are not initialized in -datapath. While handling this fragment, crash is observed as the -rx_frag list is uninitialised and when we walk in -ath11k_dp_rx_h_sort_frags, skb null leads to exception. - -To address this, before processing received fragments we check -dp_setup_done flag is set to ensure that peer has completed its -dp peer setup for fragment queue, else ignore processing the -fragments. - -Call trace: - ath11k_dp_process_rx_err+0x550/0x1084 [ath11k] - ath11k_dp_service_srng+0x70/0x370 [ath11k] - 0xffffffc009693a04 - __napi_poll+0x30/0xa4 - net_rx_action+0x118/0x270 - __do_softirq+0x10c/0x244 - irq_exit+0x64/0xb4 - __handle_domain_irq+0x88/0xac - gic_handle_irq+0x74/0xbc - el1_irq+0xf0/0x1c0 - arch_cpu_idle+0x10/0x18 - do_idle+0x104/0x248 - cpu_startup_entry+0x20/0x64 - rest_init+0xd0/0xdc - arch_call_rest_init+0xc/0x14 - start_kernel+0x480/0x4b8 - Code: f9400281 f94066a2 91405021 b94a0023 (f9406401) - -Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1 - -Signed-off-by: Harshitha Prem -Signed-off-by: Nagarajan Maran -Signed-off-by: Kalle Valo -Link: https://lore.kernel.org/r/20230403184155.8670-2-quic_nmaran@quicinc.com ---- - drivers/net/wireless/ath/ath11k/dp.c | 4 +++- - drivers/net/wireless/ath/ath11k/dp_rx.c | 8 ++++++++ - drivers/net/wireless/ath/ath11k/peer.h | 1 + - 3 files changed, 12 insertions(+), 1 deletion(-) - ---- a/drivers/net/wireless/ath/ath11k/dp.c -+++ b/drivers/net/wireless/ath/ath11k/dp.c -@@ -36,6 +36,7 @@ void ath11k_dp_peer_cleanup(struct ath11 - } - - ath11k_peer_rx_tid_cleanup(ar, peer); -+ peer->dp_setup_done = false; - crypto_free_shash(peer->tfm_mmic); - spin_unlock_bh(&ab->base_lock); - } -@@ -72,7 +73,8 @@ int ath11k_dp_peer_setup(struct ath11k * - ret = ath11k_peer_rx_frag_setup(ar, addr, vdev_id); - if (ret) { - ath11k_warn(ab, "failed to setup rx defrag context\n"); -- return ret; -+ tid--; -+ goto peer_clean; - } - - /* TODO: Setup other peer specific resource used in data path */ ---- a/drivers/net/wireless/ath/ath11k/dp_rx.c -+++ b/drivers/net/wireless/ath/ath11k/dp_rx.c -@@ -3130,6 +3130,7 @@ int ath11k_peer_rx_frag_setup(struct ath - } - - peer->tfm_mmic = tfm; -+ peer->dp_setup_done = true; - spin_unlock_bh(&ab->base_lock); - - return 0; -@@ -3575,6 +3576,13 @@ static int ath11k_dp_rx_frag_h_mpdu(stru - ret = -ENOENT; - goto out_unlock; - } -+ if (!peer->dp_setup_done) { -+ ath11k_warn(ab, "The peer %pM [%d] has uninitialized datapath\n", -+ peer->addr, peer_id); -+ ret = -ENOENT; -+ goto out_unlock; -+ } -+ - rx_tid = &peer->rx_tid[tid]; - - if ((!skb_queue_empty(&rx_tid->rx_frags) && seqno != rx_tid->cur_sn) || ---- a/drivers/net/wireless/ath/ath11k/peer.h -+++ b/drivers/net/wireless/ath/ath11k/peer.h -@@ -35,6 +35,7 @@ struct ath11k_peer { - u16 sec_type; - u16 sec_type_grp; - bool is_authorized; -+ bool dp_setup_done; - }; - - void ath11k_peer_unmap_event(struct ath11k_base *ab, u16 peer_id); diff --git a/package/kernel/mac80211/patches/ath11k/0061-wifi-ath11k-fix-undefined-behavior-with-__fls-in-dp.patch b/package/kernel/mac80211/patches/ath11k/0061-wifi-ath11k-fix-undefined-behavior-with-__fls-in-dp.patch deleted file mode 100644 index d68c19f160..0000000000 --- a/package/kernel/mac80211/patches/ath11k/0061-wifi-ath11k-fix-undefined-behavior-with-__fls-in-dp.patch +++ /dev/null @@ -1,29 +0,0 @@ -From 41e02bf4ae32cf2ac47b08b4caaa9c1a032e4ce7 Mon Sep 17 00:00:00 2001 -From: Harshitha Prem -Date: Tue, 4 Apr 2023 00:11:55 +0530 -Subject: [PATCH] wifi: ath11k: fix undefined behavior with __fls in dp - -"__fls" would have an undefined behavior if the argument is passed -as "0". Hence, added changes to handle the same. - -Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1 - -Signed-off-by: Harshitha Prem -Signed-off-by: Nagarajan Maran -Signed-off-by: Kalle Valo -Link: https://lore.kernel.org/r/20230403184155.8670-3-quic_nmaran@quicinc.com ---- - drivers/net/wireless/ath/ath11k/dp_rx.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/drivers/net/wireless/ath/ath11k/dp_rx.c -+++ b/drivers/net/wireless/ath/ath11k/dp_rx.c -@@ -3598,7 +3598,7 @@ static int ath11k_dp_rx_frag_h_mpdu(stru - goto out_unlock; - } - -- if (frag_no > __fls(rx_tid->rx_frag_bitmap)) -+ if (!rx_tid->rx_frag_bitmap || (frag_no > __fls(rx_tid->rx_frag_bitmap))) - __skb_queue_tail(&rx_tid->rx_frags, msdu); - else - ath11k_dp_rx_h_sort_frags(ar, &rx_tid->rx_frags, msdu); diff --git a/package/kernel/mac80211/patches/ath11k/0062-wifi-ath11k-fix-double-free-of-peer-rx_tid-during-re.patch b/package/kernel/mac80211/patches/ath11k/0062-wifi-ath11k-fix-double-free-of-peer-rx_tid-during-re.patch deleted file mode 100644 index dd37b1e4fa..0000000000 --- a/package/kernel/mac80211/patches/ath11k/0062-wifi-ath11k-fix-double-free-of-peer-rx_tid-during-re.patch +++ /dev/null @@ -1,144 +0,0 @@ -From 93a91f40c25c3d0e61f8540a7accf105090f9995 Mon Sep 17 00:00:00 2001 -From: Harshitha Prem -Date: Mon, 17 Apr 2023 13:35:00 +0300 -Subject: [PATCH] wifi: ath11k: fix double free of peer rx_tid during reo cmd - failure - -Peer rx_tid is locally copied thrice during peer_rx_tid_cleanup to -send REO_CMD_UPDATE_RX_QUEUE followed by REO_CMD_FLUSH_CACHE to flush -all aged REO descriptors from HW cache. - -When sending REO_CMD_FLUSH_CACHE fails, we do dma unmap of already -mapped rx_tid->vaddr and free it. This is not checked during -reo_cmd_list_cleanup() and dp_reo_cmd_free() before trying to free and -unmap again. - -Fix this by setting rx_tid->vaddr NULL in rx tid delete and also -wherever freeing it to check in reo_cmd_list_cleanup() and -reo_cmd_free() before trying to free again. - -Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1 -Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1 - -Signed-off-by: Sathishkumar Muruganandam -Signed-off-by: Harshitha Prem -Signed-off-by: Kalle Valo -Link: https://lore.kernel.org/r/20230403182420.23375-2-quic_hprem@quicinc.com ---- - drivers/net/wireless/ath/ath11k/dp_rx.c | 43 ++++++++++++++++++------- - 1 file changed, 31 insertions(+), 12 deletions(-) - ---- a/drivers/net/wireless/ath/ath11k/dp_rx.c -+++ b/drivers/net/wireless/ath/ath11k/dp_rx.c -@@ -668,13 +668,18 @@ void ath11k_dp_reo_cmd_list_cleanup(stru - struct ath11k_dp *dp = &ab->dp; - struct dp_reo_cmd *cmd, *tmp; - struct dp_reo_cache_flush_elem *cmd_cache, *tmp_cache; -+ struct dp_rx_tid *rx_tid; - - spin_lock_bh(&dp->reo_cmd_lock); - list_for_each_entry_safe(cmd, tmp, &dp->reo_cmd_list, list) { - list_del(&cmd->list); -- dma_unmap_single(ab->dev, cmd->data.paddr, -- cmd->data.size, DMA_BIDIRECTIONAL); -- kfree(cmd->data.vaddr); -+ rx_tid = &cmd->data; -+ if (rx_tid->vaddr) { -+ dma_unmap_single(ab->dev, rx_tid->paddr, -+ rx_tid->size, DMA_BIDIRECTIONAL); -+ kfree(rx_tid->vaddr); -+ rx_tid->vaddr = NULL; -+ } - kfree(cmd); - } - -@@ -682,9 +687,13 @@ void ath11k_dp_reo_cmd_list_cleanup(stru - &dp->reo_cmd_cache_flush_list, list) { - list_del(&cmd_cache->list); - dp->reo_cmd_cache_flush_count--; -- dma_unmap_single(ab->dev, cmd_cache->data.paddr, -- cmd_cache->data.size, DMA_BIDIRECTIONAL); -- kfree(cmd_cache->data.vaddr); -+ rx_tid = &cmd_cache->data; -+ if (rx_tid->vaddr) { -+ dma_unmap_single(ab->dev, rx_tid->paddr, -+ rx_tid->size, DMA_BIDIRECTIONAL); -+ kfree(rx_tid->vaddr); -+ rx_tid->vaddr = NULL; -+ } - kfree(cmd_cache); - } - spin_unlock_bh(&dp->reo_cmd_lock); -@@ -698,10 +707,12 @@ static void ath11k_dp_reo_cmd_free(struc - if (status != HAL_REO_CMD_SUCCESS) - ath11k_warn(dp->ab, "failed to flush rx tid hw desc, tid %d status %d\n", - rx_tid->tid, status); -- -- dma_unmap_single(dp->ab->dev, rx_tid->paddr, rx_tid->size, -- DMA_BIDIRECTIONAL); -- kfree(rx_tid->vaddr); -+ if (rx_tid->vaddr) { -+ dma_unmap_single(dp->ab->dev, rx_tid->paddr, rx_tid->size, -+ DMA_BIDIRECTIONAL); -+ kfree(rx_tid->vaddr); -+ rx_tid->vaddr = NULL; -+ } - } - - static void ath11k_dp_reo_cache_flush(struct ath11k_base *ab, -@@ -740,6 +751,7 @@ static void ath11k_dp_reo_cache_flush(st - dma_unmap_single(ab->dev, rx_tid->paddr, rx_tid->size, - DMA_BIDIRECTIONAL); - kfree(rx_tid->vaddr); -+ rx_tid->vaddr = NULL; - } - } - -@@ -792,6 +804,7 @@ free_desc: - dma_unmap_single(ab->dev, rx_tid->paddr, rx_tid->size, - DMA_BIDIRECTIONAL); - kfree(rx_tid->vaddr); -+ rx_tid->vaddr = NULL; - } - - void ath11k_peer_rx_tid_delete(struct ath11k *ar, -@@ -804,6 +817,8 @@ void ath11k_peer_rx_tid_delete(struct at - if (!rx_tid->active) - return; - -+ rx_tid->active = false; -+ - cmd.flag = HAL_REO_CMD_FLG_NEED_STATUS; - cmd.addr_lo = lower_32_bits(rx_tid->paddr); - cmd.addr_hi = upper_32_bits(rx_tid->paddr); -@@ -818,9 +833,11 @@ void ath11k_peer_rx_tid_delete(struct at - dma_unmap_single(ar->ab->dev, rx_tid->paddr, rx_tid->size, - DMA_BIDIRECTIONAL); - kfree(rx_tid->vaddr); -+ rx_tid->vaddr = NULL; - } - -- rx_tid->active = false; -+ rx_tid->paddr = 0; -+ rx_tid->size = 0; - } - - static int ath11k_dp_rx_link_desc_return(struct ath11k_base *ab, -@@ -967,6 +984,7 @@ static void ath11k_dp_rx_tid_mem_free(st - dma_unmap_single(ab->dev, rx_tid->paddr, rx_tid->size, - DMA_BIDIRECTIONAL); - kfree(rx_tid->vaddr); -+ rx_tid->vaddr = NULL; - - rx_tid->active = false; - -@@ -1067,7 +1085,8 @@ int ath11k_peer_rx_tid_setup(struct ath1 - return ret; - - err_mem_free: -- kfree(vaddr); -+ kfree(rx_tid->vaddr); -+ rx_tid->vaddr = NULL; - - return ret; - } diff --git a/package/kernel/mac80211/patches/ath11k/0063-wifi-ath11k-Prevent-REO-cmd-failures.patch b/package/kernel/mac80211/patches/ath11k/0063-wifi-ath11k-Prevent-REO-cmd-failures.patch deleted file mode 100644 index 4b9af18062..0000000000 --- a/package/kernel/mac80211/patches/ath11k/0063-wifi-ath11k-Prevent-REO-cmd-failures.patch +++ /dev/null @@ -1,43 +0,0 @@ -From a8ae833657a45746debde85c38bb7f070d344026 Mon Sep 17 00:00:00 2001 -From: Harshitha Prem -Date: Mon, 17 Apr 2023 13:35:01 +0300 -Subject: [PATCH] wifi: ath11k: Prevent REO cmd failures - -Prevent REO cmd failures causing double free by increasing REO cmd -ring size and moving REO status ring mask to IRQ group 3 from group -0 to separate from tx completion ring on IRQ group 0 which may delay -reo status processing. - -Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1 -Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1 - -Signed-off-by: Sathishkumar Muruganandam -Signed-off-by: Harshitha Prem -Signed-off-by: Kalle Valo -Link: https://lore.kernel.org/r/20230403182420.23375-3-quic_hprem@quicinc.com ---- - drivers/net/wireless/ath/ath11k/dp.h | 2 +- - drivers/net/wireless/ath/ath11k/hw.c | 1 + - 2 files changed, 2 insertions(+), 1 deletion(-) - ---- a/drivers/net/wireless/ath/ath11k/dp.h -+++ b/drivers/net/wireless/ath/ath11k/dp.h -@@ -214,7 +214,7 @@ struct ath11k_pdev_dp { - #define DP_REO_REINJECT_RING_SIZE 32 - #define DP_RX_RELEASE_RING_SIZE 1024 - #define DP_REO_EXCEPTION_RING_SIZE 128 --#define DP_REO_CMD_RING_SIZE 128 -+#define DP_REO_CMD_RING_SIZE 256 - #define DP_REO_STATUS_RING_SIZE 2048 - #define DP_RXDMA_BUF_RING_SIZE 4096 - #define DP_RXDMA_REFILL_RING_SIZE 2048 ---- a/drivers/net/wireless/ath/ath11k/hw.c -+++ b/drivers/net/wireless/ath/ath11k/hw.c -@@ -1233,6 +1233,7 @@ const struct ath11k_hw_ring_mask ath11k_ - ATH11K_RX_WBM_REL_RING_MASK_0, - }, - .reo_status = { -+ 0, 0, 0, - ATH11K_REO_STATUS_RING_MASK_0, - }, - .rxdma2host = { diff --git a/package/kernel/mac80211/patches/ath11k/0064-wifi-ath11k-add-peer-mac-information-in-failure-case.patch b/package/kernel/mac80211/patches/ath11k/0064-wifi-ath11k-add-peer-mac-information-in-failure-case.patch deleted file mode 100644 index fbcbdfff71..0000000000 --- a/package/kernel/mac80211/patches/ath11k/0064-wifi-ath11k-add-peer-mac-information-in-failure-case.patch +++ /dev/null @@ -1,74 +0,0 @@ -From 20487cc3ff36bbfa9505f0a078ba98f09abfc717 Mon Sep 17 00:00:00 2001 -From: Harshitha Prem -Date: Mon, 17 Apr 2023 13:35:01 +0300 -Subject: [PATCH] wifi: ath11k: add peer mac information in failure cases - -During reo command failure, the peer mac detail for which the reo -command was not successful is unknown. Hence, to improve the -debuggability, add the peer mac information in the failure cases -which would be useful during multi client cases. - -Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1 -Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1 - -Signed-off-by: Sathishkumar Muruganandam -Signed-off-by: Harshitha Prem -Signed-off-by: Kalle Valo -Link: https://lore.kernel.org/r/20230403182420.23375-4-quic_hprem@quicinc.com ---- - drivers/net/wireless/ath/ath11k/dp_rx.c | 16 ++++++++++------ - 1 file changed, 10 insertions(+), 6 deletions(-) - ---- a/drivers/net/wireless/ath/ath11k/dp_rx.c -+++ b/drivers/net/wireless/ath/ath11k/dp_rx.c -@@ -1009,7 +1009,8 @@ int ath11k_peer_rx_tid_setup(struct ath1 - - peer = ath11k_peer_find(ab, vdev_id, peer_mac); - if (!peer) { -- ath11k_warn(ab, "failed to find the peer to set up rx tid\n"); -+ ath11k_warn(ab, "failed to find the peer %pM to set up rx tid\n", -+ peer_mac); - spin_unlock_bh(&ab->base_lock); - return -ENOENT; - } -@@ -1022,7 +1023,8 @@ int ath11k_peer_rx_tid_setup(struct ath1 - ba_win_sz, ssn, true); - spin_unlock_bh(&ab->base_lock); - if (ret) { -- ath11k_warn(ab, "failed to update reo for rx tid %d\n", tid); -+ ath11k_warn(ab, "failed to update reo for peer %pM rx tid %d\n: %d", -+ peer_mac, tid, ret); - return ret; - } - -@@ -1030,8 +1032,8 @@ int ath11k_peer_rx_tid_setup(struct ath1 - peer_mac, paddr, - tid, 1, ba_win_sz); - if (ret) -- ath11k_warn(ab, "failed to send wmi command to update rx reorder queue, tid :%d (%d)\n", -- tid, ret); -+ ath11k_warn(ab, "failed to send wmi rx reorder queue for peer %pM tid %d: %d\n", -+ peer_mac, tid, ret); - return ret; - } - -@@ -1064,6 +1066,8 @@ int ath11k_peer_rx_tid_setup(struct ath1 - ret = dma_mapping_error(ab->dev, paddr); - if (ret) { - spin_unlock_bh(&ab->base_lock); -+ ath11k_warn(ab, "failed to setup dma map for peer %pM rx tid %d: %d\n", -+ peer_mac, tid, ret); - goto err_mem_free; - } - -@@ -1077,8 +1081,8 @@ int ath11k_peer_rx_tid_setup(struct ath1 - ret = ath11k_wmi_peer_rx_reorder_queue_setup(ar, vdev_id, peer_mac, - paddr, tid, 1, ba_win_sz); - if (ret) { -- ath11k_warn(ar->ab, "failed to setup rx reorder queue, tid :%d (%d)\n", -- tid, ret); -+ ath11k_warn(ar->ab, "failed to setup rx reorder queue for peer %pM tid %d: %d\n", -+ peer_mac, tid, ret); - ath11k_dp_rx_tid_mem_free(ab, peer_mac, vdev_id, tid); - } - diff --git a/package/kernel/mac80211/patches/ath11k/0065-wifi-ath11k-fix-tx-status-reporting-in-encap-offload.patch b/package/kernel/mac80211/patches/ath11k/0065-wifi-ath11k-fix-tx-status-reporting-in-encap-offload.patch deleted file mode 100644 index e2fe419158..0000000000 --- a/package/kernel/mac80211/patches/ath11k/0065-wifi-ath11k-fix-tx-status-reporting-in-encap-offload.patch +++ /dev/null @@ -1,119 +0,0 @@ -From 6257c702264c44d74c6b71f0c62a7665da2dc356 Mon Sep 17 00:00:00 2001 -From: Pradeep Kumar Chitrapu -Date: Mon, 17 Apr 2023 13:35:02 +0300 -Subject: [PATCH] wifi: ath11k: fix tx status reporting in encap offload mode - -ieee80211_tx_status() treats packets in 802.11 frame format and -tries to extract sta address from packet header. When tx encap -offload is enabled, this becomes invalid operation. Hence, switch -to using ieee80211_tx_status_ext() after filling in station -address for handling both 802.11 and 802.3 frames. - -Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1 - -Signed-off-by: Pradeep Kumar Chitrapu -Signed-off-by: Kalle Valo -Link: https://lore.kernel.org/r/20230403195738.25367-2-quic_pradeepc@quicinc.com ---- - drivers/net/wireless/ath/ath11k/dp.h | 4 +++ - drivers/net/wireless/ath/ath11k/dp_tx.c | 33 ++++++++++++++++++++++++- - drivers/net/wireless/ath/ath11k/dp_tx.h | 1 + - 3 files changed, 37 insertions(+), 1 deletion(-) - ---- a/drivers/net/wireless/ath/ath11k/dp.h -+++ b/drivers/net/wireless/ath/ath11k/dp.h -@@ -303,12 +303,16 @@ struct ath11k_dp { - - #define HTT_TX_WBM_COMP_STATUS_OFFSET 8 - -+#define HTT_INVALID_PEER_ID 0xffff -+ - /* HTT tx completion is overlaid in wbm_release_ring */ - #define HTT_TX_WBM_COMP_INFO0_STATUS GENMASK(12, 9) - #define HTT_TX_WBM_COMP_INFO0_REINJECT_REASON GENMASK(16, 13) - #define HTT_TX_WBM_COMP_INFO0_REINJECT_REASON GENMASK(16, 13) - - #define HTT_TX_WBM_COMP_INFO1_ACK_RSSI GENMASK(31, 24) -+#define HTT_TX_WBM_COMP_INFO2_SW_PEER_ID GENMASK(15, 0) -+#define HTT_TX_WBM_COMP_INFO2_VALID BIT(21) - - struct htt_tx_wbm_completion { - u32 info0; ---- a/drivers/net/wireless/ath/ath11k/dp_tx.c -+++ b/drivers/net/wireless/ath/ath11k/dp_tx.c -@@ -316,10 +316,12 @@ ath11k_dp_tx_htt_tx_complete_buf(struct - struct dp_tx_ring *tx_ring, - struct ath11k_dp_htt_wbm_tx_status *ts) - { -+ struct ieee80211_tx_status status = { 0 }; - struct sk_buff *msdu; - struct ieee80211_tx_info *info; - struct ath11k_skb_cb *skb_cb; - struct ath11k *ar; -+ struct ath11k_peer *peer; - - spin_lock(&tx_ring->tx_idr_lock); - msdu = idr_remove(&tx_ring->txbuf_idr, ts->msdu_id); -@@ -341,6 +343,11 @@ ath11k_dp_tx_htt_tx_complete_buf(struct - - dma_unmap_single(ab->dev, skb_cb->paddr, msdu->len, DMA_TO_DEVICE); - -+ if (!skb_cb->vif) { -+ dev_kfree_skb_any(msdu); -+ return; -+ } -+ - memset(&info->status, 0, sizeof(info->status)); - - if (ts->acked) { -@@ -355,7 +362,23 @@ ath11k_dp_tx_htt_tx_complete_buf(struct - } - } - -- ieee80211_tx_status(ar->hw, msdu); -+ spin_lock_bh(&ab->base_lock); -+ peer = ath11k_peer_find_by_id(ab, ts->peer_id); -+ if (!peer || !peer->sta) { -+ ath11k_dbg(ab, ATH11K_DBG_DATA, -+ "dp_tx: failed to find the peer with peer_id %d\n", -+ ts->peer_id); -+ spin_unlock_bh(&ab->base_lock); -+ dev_kfree_skb_any(msdu); -+ return; -+ } -+ spin_unlock_bh(&ab->base_lock); -+ -+ status.sta = peer->sta; -+ status.info = info; -+ status.skb = msdu; -+ -+ ieee80211_tx_status_ext(ar->hw, &status); - } - - static void -@@ -379,7 +402,15 @@ ath11k_dp_tx_process_htt_tx_complete(str - ts.msdu_id = msdu_id; - ts.ack_rssi = FIELD_GET(HTT_TX_WBM_COMP_INFO1_ACK_RSSI, - status_desc->info1); -+ -+ if (FIELD_GET(HTT_TX_WBM_COMP_INFO2_VALID, status_desc->info2)) -+ ts.peer_id = FIELD_GET(HTT_TX_WBM_COMP_INFO2_SW_PEER_ID, -+ status_desc->info2); -+ else -+ ts.peer_id = HTT_INVALID_PEER_ID; -+ - ath11k_dp_tx_htt_tx_complete_buf(ab, tx_ring, &ts); -+ - break; - case HAL_WBM_REL_HTT_TX_COMP_STATUS_REINJ: - case HAL_WBM_REL_HTT_TX_COMP_STATUS_INSPECT: ---- a/drivers/net/wireless/ath/ath11k/dp_tx.h -+++ b/drivers/net/wireless/ath/ath11k/dp_tx.h -@@ -13,6 +13,7 @@ struct ath11k_dp_htt_wbm_tx_status { - u32 msdu_id; - bool acked; - int ack_rssi; -+ u16 peer_id; - }; - - void ath11k_dp_tx_update_txcompl(struct ath11k *ar, struct hal_tx_status *ts); diff --git a/package/kernel/mac80211/patches/ath11k/0066-wifi-ath11k-Fix-incorrect-update-of-radiotap-fields.patch b/package/kernel/mac80211/patches/ath11k/0066-wifi-ath11k-Fix-incorrect-update-of-radiotap-fields.patch deleted file mode 100644 index 4f94580100..0000000000 --- a/package/kernel/mac80211/patches/ath11k/0066-wifi-ath11k-Fix-incorrect-update-of-radiotap-fields.patch +++ /dev/null @@ -1,49 +0,0 @@ -From 2f0c9ac8362da09c80f1cd422ef7fd6fa9b252b9 Mon Sep 17 00:00:00 2001 -From: Pradeep Kumar Chitrapu -Date: Mon, 17 Apr 2023 13:35:02 +0300 -Subject: [PATCH] wifi: ath11k: Fix incorrect update of radiotap fields - -Fix incorrect update of ppdu stats causing incorrect radiotap -fields. - -Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1 - -Signed-off-by: Pradeep Kumar Chitrapu -Signed-off-by: Kalle Valo -Link: https://lore.kernel.org/r/20230403195738.25367-3-quic_pradeepc@quicinc.com ---- - drivers/net/wireless/ath/ath11k/hal_rx.c | 4 ++-- - drivers/net/wireless/ath/ath11k/hal_rx.h | 2 +- - 2 files changed, 3 insertions(+), 3 deletions(-) - ---- 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 - info1 = __le32_to_cpu(vht_sig->info1); - - ppdu_info->ldpc = FIELD_GET(HAL_RX_VHT_SIG_A_INFO_INFO1_SU_MU_CODING, -- info0); -+ info1); - 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 - * PHYRX_OTHER_RECEIVE_INFO TLV. - */ - ppdu_info->rssi_comb = -- FIELD_GET(HAL_RX_PHYRX_RSSI_LEGACY_INFO_INFO1_RSSI_COMB, -+ FIELD_GET(HAL_RX_PHYRX_RSSI_LEGACY_INFO_INFO0_RSSI_COMB, - __le32_to_cpu(rssi->info0)); - - if (db2dbm) { ---- a/drivers/net/wireless/ath/ath11k/hal_rx.h -+++ b/drivers/net/wireless/ath/ath11k/hal_rx.h -@@ -385,7 +385,7 @@ struct hal_rx_he_sig_b2_ofdma_info { - __le32 info0; - } __packed; - --#define HAL_RX_PHYRX_RSSI_LEGACY_INFO_INFO1_RSSI_COMB GENMASK(15, 8) -+#define HAL_RX_PHYRX_RSSI_LEGACY_INFO_INFO0_RSSI_COMB GENMASK(15, 8) - - #define HAL_RX_PHYRX_RSSI_PREAMBLE_PRI20 GENMASK(7, 0) - diff --git a/package/kernel/mac80211/patches/ath11k/0067-wifi-ath11k-Fix-SKB-corruption-in-REO-destination-ri.patch b/package/kernel/mac80211/patches/ath11k/0067-wifi-ath11k-Fix-SKB-corruption-in-REO-destination-ri.patch deleted file mode 100644 index 8b300f3a79..0000000000 --- a/package/kernel/mac80211/patches/ath11k/0067-wifi-ath11k-Fix-SKB-corruption-in-REO-destination-ri.patch +++ /dev/null @@ -1,70 +0,0 @@ -From f9fff67d2d7ca6fa8066132003a3deef654c55b1 Mon Sep 17 00:00:00 2001 -From: Nagarajan Maran -Date: Mon, 17 Apr 2023 13:35:02 +0300 -Subject: [PATCH] wifi: ath11k: Fix SKB corruption in REO destination ring - -While running traffics for a long time, randomly an RX descriptor -filled with value "0" from REO destination ring is received. -This descriptor which is invalid causes the wrong SKB (SKB stored in -the IDR lookup with buffer id "0") to be fetched which in turn -causes SKB memory corruption issue and the same leads to crash -after some time. - -Changed the start id for idr allocation to "1" and the buffer id "0" -is reserved for error validation. Introduced Sanity check to validate -the descriptor, before processing the SKB. - -Crash Signature : - -Unable to handle kernel paging request at virtual address 3f004900 -PC points to "b15_dma_inv_range+0x30/0x50" -LR points to "dma_cache_maint_page+0x8c/0x128". -The Backtrace obtained is as follows: -[<8031716c>] (b15_dma_inv_range) from [<80313a4c>] (dma_cache_maint_page+0x8c/0x128) -[<80313a4c>] (dma_cache_maint_page) from [<80313b90>] (__dma_page_dev_to_cpu+0x28/0xcc) -[<80313b90>] (__dma_page_dev_to_cpu) from [<7fb5dd68>] (ath11k_dp_process_rx+0x1e8/0x4a4 [ath11k]) -[<7fb5dd68>] (ath11k_dp_process_rx [ath11k]) from [<7fb53c20>] (ath11k_dp_service_srng+0xb0/0x2ac [ath11k]) -[<7fb53c20>] (ath11k_dp_service_srng [ath11k]) from [<7f67bba4>] (ath11k_pci_ext_grp_napi_poll+0x1c/0x78 [ath11k_pci]) -[<7f67bba4>] (ath11k_pci_ext_grp_napi_poll [ath11k_pci]) from [<807d5cf4>] (__napi_poll+0x28/0xb8) -[<807d5cf4>] (__napi_poll) from [<807d5f28>] (net_rx_action+0xf0/0x280) -[<807d5f28>] (net_rx_action) from [<80302148>] (__do_softirq+0xd0/0x280) -[<80302148>] (__do_softirq) from [<80320408>] (irq_exit+0x74/0xd4) -[<80320408>] (irq_exit) from [<803638a4>] (__handle_domain_irq+0x90/0xb4) -[<803638a4>] (__handle_domain_irq) from [<805bedec>] (gic_handle_irq+0x58/0x90) -[<805bedec>] (gic_handle_irq) from [<80301a78>] (__irq_svc+0x58/0x8c) - -Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1 - -Signed-off-by: Nagarajan Maran -Signed-off-by: Kalle Valo -Link: https://lore.kernel.org/r/20230403191533.28114-1-quic_nmaran@quicinc.com ---- - drivers/net/wireless/ath/ath11k/dp_rx.c | 9 ++++++--- - 1 file changed, 6 insertions(+), 3 deletions(-) - ---- a/drivers/net/wireless/ath/ath11k/dp_rx.c -+++ b/drivers/net/wireless/ath/ath11k/dp_rx.c -@@ -389,10 +389,10 @@ int ath11k_dp_rxbufs_replenish(struct at - goto fail_free_skb; - - spin_lock_bh(&rx_ring->idr_lock); -- buf_id = idr_alloc(&rx_ring->bufs_idr, skb, 0, -- rx_ring->bufs_max * 3, GFP_ATOMIC); -+ buf_id = idr_alloc(&rx_ring->bufs_idr, skb, 1, -+ (rx_ring->bufs_max * 3) + 1, GFP_ATOMIC); - spin_unlock_bh(&rx_ring->idr_lock); -- if (buf_id < 0) -+ if (buf_id <= 0) - goto fail_dma_unmap; - - desc = ath11k_hal_srng_src_get_next_entry(ab, srng); -@@ -2665,6 +2665,9 @@ try_again: - cookie); - mac_id = FIELD_GET(DP_RXDMA_BUF_COOKIE_PDEV_ID, cookie); - -+ if (unlikely(buf_id == 0)) -+ continue; -+ - ar = ab->pdevs[mac_id].ar; - rx_ring = &ar->dp.rx_refill_buf_ring; - spin_lock_bh(&rx_ring->idr_lock); diff --git a/package/kernel/mac80211/patches/ath11k/0068-wifi-ath11k-Remove-disabling-of-80-80-and-160-MHz.patch b/package/kernel/mac80211/patches/ath11k/0068-wifi-ath11k-Remove-disabling-of-80-80-and-160-MHz.patch deleted file mode 100644 index ce5ffd273b..0000000000 --- a/package/kernel/mac80211/patches/ath11k/0068-wifi-ath11k-Remove-disabling-of-80-80-and-160-MHz.patch +++ /dev/null @@ -1,49 +0,0 @@ -From b100722a777f6455d913666a376f81342b2cb995 Mon Sep 17 00:00:00 2001 -From: Muna Sinada -Date: Mon, 17 Apr 2023 13:22:27 -0700 -Subject: [PATCH] wifi: ath11k: Remove disabling of 80+80 and 160 MHz - -This is a regression fix for 80+80 and 160 MHz support bits being -cleared, therefore not adverised. Remove disable of 80+80 and 160 MHz -capability flags and assign valid center frequency 2 similar to -VHT80_80. - -Fixes: 38dfe775d0ab ("wifi: ath11k: push MU-MIMO params from hostapd to hardware") -Reported-by: Robert Marko -Tested-by: Robert Marko # IPQ8074 WLAN.HK.2.9.0.1-01385-QCAHKSWPL_SILICONZ-1 -Link: https://bugzilla.kernel.org/show_bug.cgi?id=217299 -Co-developed-by: P Praneesh -Signed-off-by: P Praneesh -Signed-off-by: Muna Sinada -Signed-off-by: Kalle Valo -Link: https://lore.kernel.org/r/1681762947-13882-1-git-send-email-quic_msinada@quicinc.com ---- - drivers/net/wireless/ath/ath11k/mac.c | 4 ---- - drivers/net/wireless/ath/ath11k/wmi.c | 3 ++- - 2 files changed, 2 insertions(+), 5 deletions(-) - ---- a/drivers/net/wireless/ath/ath11k/mac.c -+++ b/drivers/net/wireless/ath/ath11k/mac.c -@@ -5585,10 +5585,6 @@ static int ath11k_mac_copy_he_cap(struct - - he_cap_elem->mac_cap_info[1] &= - IEEE80211_HE_MAC_CAP1_TF_MAC_PAD_DUR_MASK; -- he_cap_elem->phy_cap_info[0] &= -- ~IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G; -- he_cap_elem->phy_cap_info[0] &= -- ~IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G; - - he_cap_elem->phy_cap_info[5] &= - ~IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_MASK; ---- a/drivers/net/wireless/ath/ath11k/wmi.c -+++ b/drivers/net/wireless/ath/ath11k/wmi.c -@@ -871,7 +871,8 @@ static void ath11k_wmi_put_wmi_channel(s - - chan->band_center_freq2 = arg->channel.band_center_freq1; - -- } else if (arg->channel.mode == MODE_11AC_VHT80_80) { -+ } else if ((arg->channel.mode == MODE_11AC_VHT80_80) || -+ (arg->channel.mode == MODE_11AX_HE80_80)) { - chan->band_center_freq2 = arg->channel.band_center_freq2; - } else { - chan->band_center_freq2 = 0; diff --git a/package/kernel/mac80211/patches/ath11k/0069-wifi-ath11k-fix-registration-of-6Ghz-only-phy-withou.patch b/package/kernel/mac80211/patches/ath11k/0069-wifi-ath11k-fix-registration-of-6Ghz-only-phy-withou.patch deleted file mode 100644 index 32468dbc4c..0000000000 --- a/package/kernel/mac80211/patches/ath11k/0069-wifi-ath11k-fix-registration-of-6Ghz-only-phy-withou.patch +++ /dev/null @@ -1,61 +0,0 @@ -From e2ceb1de2f83aafd8003f0b72dfd4b7441e97d14 Mon Sep 17 00:00:00 2001 -From: Maxime Bizon -Date: Fri, 21 Apr 2023 16:54:45 +0200 -Subject: [PATCH] wifi: ath11k: fix registration of 6Ghz-only phy without the - full channel range - -Because of what seems to be a typo, a 6Ghz-only phy for which the BDF -does not allow the 7115Mhz channel will fail to register: - - WARNING: CPU: 2 PID: 106 at net/wireless/core.c:907 wiphy_register+0x914/0x954 - Modules linked in: ath11k_pci sbsa_gwdt - CPU: 2 PID: 106 Comm: kworker/u8:5 Not tainted 6.3.0-rc7-next-20230418-00549-g1e096a17625a-dirty #9 - Hardware name: Freebox V7R Board (DT) - Workqueue: ath11k_qmi_driver_event ath11k_qmi_driver_event_work - pstate: 60000005 (nZCv daif -PAN -UAO -TCO -DIT -SSBS BTYPE=--) - pc : wiphy_register+0x914/0x954 - lr : ieee80211_register_hw+0x67c/0xc10 - sp : ffffff800b123aa0 - x29: ffffff800b123aa0 x28: 0000000000000000 x27: 0000000000000000 - x26: 0000000000000000 x25: 0000000000000006 x24: ffffffc008d51418 - x23: ffffffc008cb0838 x22: ffffff80176c2460 x21: 0000000000000168 - x20: ffffff80176c0000 x19: ffffff80176c03e0 x18: 0000000000000014 - x17: 00000000cbef338c x16: 00000000d2a26f21 x15: 00000000ad6bb85f - x14: 0000000000000020 x13: 0000000000000020 x12: 00000000ffffffbd - x11: 0000000000000208 x10: 00000000fffffdf7 x9 : ffffffc009394718 - x8 : ffffff80176c0528 x7 : 000000007fffffff x6 : 0000000000000006 - x5 : 0000000000000005 x4 : ffffff800b304284 x3 : ffffff800b304284 - x2 : ffffff800b304d98 x1 : 0000000000000000 x0 : 0000000000000000 - Call trace: - wiphy_register+0x914/0x954 - ieee80211_register_hw+0x67c/0xc10 - ath11k_mac_register+0x7c4/0xe10 - ath11k_core_qmi_firmware_ready+0x1f4/0x570 - ath11k_qmi_driver_event_work+0x198/0x590 - process_one_work+0x1b8/0x328 - worker_thread+0x6c/0x414 - kthread+0x100/0x104 - ret_from_fork+0x10/0x20 - ---[ end trace 0000000000000000 ]--- - ath11k_pci 0002:01:00.0: ieee80211 registration failed: -22 - ath11k_pci 0002:01:00.0: failed register the radio with mac80211: -22 - ath11k_pci 0002:01:00.0: failed to create pdev core: -22 - -Signed-off-by: Maxime Bizon -Signed-off-by: Kalle Valo -Link: https://lore.kernel.org/r/20230421145445.2612280-1-mbizon@freebox.fr ---- - drivers/net/wireless/ath/ath11k/mac.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/drivers/net/wireless/ath/ath11k/mac.c -+++ b/drivers/net/wireless/ath/ath11k/mac.c -@@ -8892,7 +8892,7 @@ static int ath11k_mac_setup_channels_rat - } - - if (supported_bands & WMI_HOST_WLAN_5G_CAP) { -- if (reg_cap->high_5ghz_chan >= ATH11K_MAX_6G_FREQ) { -+ if (reg_cap->high_5ghz_chan >= ATH11K_MIN_6G_FREQ) { - channels = kmemdup(ath11k_6ghz_channels, - sizeof(ath11k_6ghz_channels), GFP_KERNEL); - if (!channels) { diff --git a/package/kernel/mac80211/patches/ath11k/0070-wifi-ath-work-around-false-positive-stringop-overrea.patch b/package/kernel/mac80211/patches/ath11k/0070-wifi-ath-work-around-false-positive-stringop-overrea.patch deleted file mode 100644 index aa4df16a90..0000000000 --- a/package/kernel/mac80211/patches/ath11k/0070-wifi-ath-work-around-false-positive-stringop-overrea.patch +++ /dev/null @@ -1,84 +0,0 @@ -From 695df2f417d25202bdac9cde3c82d2acb6492b4d Mon Sep 17 00:00:00 2001 -From: Arnd Bergmann -Date: Fri, 5 May 2023 16:11:25 +0300 -Subject: [PATCH] wifi: ath: work around false-positive stringop-overread - warning - -In a rare arm64 randconfig build, I got multiple warnings for ath11k -and ath12k: - -In function 'ath11k_peer_assoc_h_ht', - inlined from 'ath11k_peer_assoc_prepare' at drivers/net/wireless/ath/ath11k/mac.c:2665:2: -drivers/net/wireless/ath/ath11k/mac.c:1709:13: error: 'ath11k_peer_assoc_h_ht_masked' reading 10 bytes from a region of size 0 [-Werror=stringop-overread] - 1709 | if (ath11k_peer_assoc_h_ht_masked(ht_mcs_mask)) - | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -This happens whenever gcc-13 fails to inline one of the functions -that take a fixed-length array argument but gets passed a pointer. - -Change these functions to all take a regular pointer argument -instead. - -Signed-off-by: Arnd Bergmann -Signed-off-by: Kalle Valo -Link: https://lore.kernel.org/r/20230417205447.1800912-1-arnd@kernel.org ---- - drivers/net/wireless/ath/ath11k/mac.c | 12 ++++++------ - 1 file changed, 6 insertions(+), 6 deletions(-) - ---- a/drivers/net/wireless/ath/ath11k/mac.c -+++ b/drivers/net/wireless/ath/ath11k/mac.c -@@ -433,7 +433,7 @@ u8 ath11k_mac_bitrate_to_idx(const struc - } - - static u32 --ath11k_mac_max_ht_nss(const u8 ht_mcs_mask[IEEE80211_HT_MCS_MASK_LEN]) -+ath11k_mac_max_ht_nss(const u8 *ht_mcs_mask) - { - int nss; - -@@ -445,7 +445,7 @@ ath11k_mac_max_ht_nss(const u8 ht_mcs_ma - } - - static u32 --ath11k_mac_max_vht_nss(const u16 vht_mcs_mask[NL80211_VHT_NSS_MAX]) -+ath11k_mac_max_vht_nss(const u16 *vht_mcs_mask) - { - int nss; - -@@ -457,7 +457,7 @@ ath11k_mac_max_vht_nss(const u16 vht_mcs - } - - static u32 --ath11k_mac_max_he_nss(const u16 he_mcs_mask[NL80211_HE_NSS_MAX]) -+ath11k_mac_max_he_nss(const u16 *he_mcs_mask) - { - int nss; - -@@ -1658,7 +1658,7 @@ static void ath11k_peer_assoc_h_rates(st - } - - static bool --ath11k_peer_assoc_h_ht_masked(const u8 ht_mcs_mask[IEEE80211_HT_MCS_MASK_LEN]) -+ath11k_peer_assoc_h_ht_masked(const u8 *ht_mcs_mask) - { - int nss; - -@@ -1670,7 +1670,7 @@ ath11k_peer_assoc_h_ht_masked(const u8 h - } - - static bool --ath11k_peer_assoc_h_vht_masked(const u16 vht_mcs_mask[]) -+ath11k_peer_assoc_h_vht_masked(const u16 *vht_mcs_mask) - { - int nss; - -@@ -2065,7 +2065,7 @@ static u16 ath11k_peer_assoc_h_he_limit( - } - - static bool --ath11k_peer_assoc_h_he_masked(const u16 he_mcs_mask[NL80211_HE_NSS_MAX]) -+ath11k_peer_assoc_h_he_masked(const u16 *he_mcs_mask) - { - int nss; - diff --git a/package/kernel/mac80211/patches/ath11k/0071-wifi-ath11k-driver-settings-for-MBSSID-and-EMA.patch b/package/kernel/mac80211/patches/ath11k/0071-wifi-ath11k-driver-settings-for-MBSSID-and-EMA.patch deleted file mode 100644 index bede4819ca..0000000000 --- a/package/kernel/mac80211/patches/ath11k/0071-wifi-ath11k-driver-settings-for-MBSSID-and-EMA.patch +++ /dev/null @@ -1,133 +0,0 @@ -From a08dbb04d7365a04d52882143cf196005bfc88c3 Mon Sep 17 00:00:00 2001 -From: Aloka Dixit -Date: Fri, 5 May 2023 16:11:27 +0300 -Subject: [PATCH 71/77] wifi: ath11k: driver settings for MBSSID and EMA - -Advertise the driver support for multiple BSSID (MBSSID) and -enhanced multi-BSSID advertisements (EMA) by setting extended -capabilities. - -Configure mbssid_max_interfaces and ema_max_profile_periodicity -fields in structure wiphy which are used to advertise maximum number -of interfaces and profile periodicity supported by the driver. - -Add new WMI fields to configure maximum vdev count supported for -MBSSID and profile periodicity in case of EMA. -Setting WMI_RSRC_CFG_FLAG2_CALC_NEXT_DTIM_COUNT_SET flag -indicates that the firmware should track and update the DTIM counts -for each non-transmitted profile. - -Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1 - -Signed-off-by: Aloka Dixit -Co-developed-by: John Crispin -Signed-off-by: John Crispin -Signed-off-by: Kalle Valo -Link: https://lore.kernel.org/r/20230405221648.17950-2-quic_alokad@quicinc.com ---- - drivers/net/wireless/ath/ath11k/hw.c | 3 +++ - drivers/net/wireless/ath/ath11k/hw.h | 1 + - drivers/net/wireless/ath/ath11k/mac.c | 7 +++++++ - drivers/net/wireless/ath/ath11k/wmi.c | 3 +++ - drivers/net/wireless/ath/ath11k/wmi.h | 6 ++++++ - 5 files changed, 20 insertions(+) - ---- a/drivers/net/wireless/ath/ath11k/hw.c -+++ b/drivers/net/wireless/ath/ath11k/hw.c -@@ -202,6 +202,9 @@ static void ath11k_init_wmi_config_ipq80 - config->twt_ap_sta_count = 1000; - config->flag1 |= WMI_RSRC_CFG_FLAG1_BSS_CHANNEL_INFO_64; - config->flag1 |= WMI_RSRC_CFG_FLAG1_ACK_RSSI; -+ config->ema_max_vap_cnt = ab->num_radios; -+ config->ema_max_profile_period = TARGET_EMA_MAX_PROFILE_PERIOD; -+ config->beacon_tx_offload_max_vdev += config->ema_max_vap_cnt; - } - - static int ath11k_hw_mac_id_to_pdev_id_ipq8074(struct ath11k_hw_params *hw, ---- a/drivers/net/wireless/ath/ath11k/hw.h -+++ b/drivers/net/wireless/ath/ath11k/hw.h -@@ -64,6 +64,7 @@ - #define TARGET_NUM_WDS_ENTRIES 32 - #define TARGET_DMA_BURST_SIZE 1 - #define TARGET_RX_BATCHMODE 1 -+#define TARGET_EMA_MAX_PROFILE_PERIOD 8 - - #define ATH11K_HW_MAX_QUEUES 4 - #define ATH11K_QUEUE_LEN 4096 ---- a/drivers/net/wireless/ath/ath11k/mac.c -+++ b/drivers/net/wireless/ath/ath11k/mac.c -@@ -9001,19 +9001,23 @@ static int ath11k_mac_setup_iface_combin - - static const u8 ath11k_if_types_ext_capa[] = { - [0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING, -+ [2] = WLAN_EXT_CAPA3_MULTI_BSSID_SUPPORT, - [7] = WLAN_EXT_CAPA8_OPMODE_NOTIF, - }; - - static const u8 ath11k_if_types_ext_capa_sta[] = { - [0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING, -+ [2] = WLAN_EXT_CAPA3_MULTI_BSSID_SUPPORT, - [7] = WLAN_EXT_CAPA8_OPMODE_NOTIF, - [9] = WLAN_EXT_CAPA10_TWT_REQUESTER_SUPPORT, - }; - - static const u8 ath11k_if_types_ext_capa_ap[] = { - [0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING, -+ [2] = WLAN_EXT_CAPA3_MULTI_BSSID_SUPPORT, - [7] = WLAN_EXT_CAPA8_OPMODE_NOTIF, - [9] = WLAN_EXT_CAPA10_TWT_RESPONDER_SUPPORT, -+ [10] = WLAN_EXT_CAPA11_EMA_SUPPORT, - }; - - static const struct wiphy_iftype_ext_capab ath11k_iftypes_ext_capa[] = { -@@ -9251,6 +9255,9 @@ static int __ath11k_mac_register(struct - wiphy_ext_feature_set(ar->hw->wiphy, - NL80211_EXT_FEATURE_ENABLE_FTM_RESPONDER); - -+ ar->hw->wiphy->mbssid_max_interfaces = TARGET_NUM_VDEVS(ab); -+ ar->hw->wiphy->ema_max_profile_periodicity = TARGET_EMA_MAX_PROFILE_PERIOD; -+ - ath11k_reg_init(ar); - - if (!test_bit(ATH11K_FLAG_RAW_MODE, &ab->dev_flags)) { ---- a/drivers/net/wireless/ath/ath11k/wmi.c -+++ b/drivers/net/wireless/ath/ath11k/wmi.c -@@ -3987,6 +3987,9 @@ ath11k_wmi_copy_resource_config(struct w - ~(1 << WMI_CFG_HOST_SERVICE_FLAG_REG_CC_EXT); - wmi_cfg->host_service_flags |= (tg_cfg->is_reg_cc_ext_event_supported << - WMI_CFG_HOST_SERVICE_FLAG_REG_CC_EXT); -+ wmi_cfg->flags2 = WMI_RSRC_CFG_FLAG2_CALC_NEXT_DTIM_COUNT_SET; -+ wmi_cfg->ema_max_vap_cnt = tg_cfg->ema_max_vap_cnt; -+ wmi_cfg->ema_max_profile_period = tg_cfg->ema_max_profile_period; - } - - static int ath11k_init_cmd_send(struct ath11k_pdev_wmi *wmi, ---- a/drivers/net/wireless/ath/ath11k/wmi.h -+++ b/drivers/net/wireless/ath/ath11k/wmi.h -@@ -2317,6 +2317,7 @@ struct wmi_init_cmd { - } __packed; - - #define WMI_RSRC_CFG_FLAG1_BSS_CHANNEL_INFO_64 BIT(5) -+#define WMI_RSRC_CFG_FLAG2_CALC_NEXT_DTIM_COUNT_SET BIT(9) - #define WMI_RSRC_CFG_FLAG1_ACK_RSSI BIT(18) - - #define WMI_CFG_HOST_SERVICE_FLAG_REG_CC_EXT 4 -@@ -2389,6 +2390,9 @@ struct wmi_resource_config { - u32 msdu_flow_override_config1; - u32 flags2; - u32 host_service_flags; -+ u32 max_rnr_neighbours; -+ u32 ema_max_vap_cnt; -+ u32 ema_max_profile_period; - } __packed; - - struct wmi_service_ready_event { -@@ -5646,6 +5650,8 @@ struct target_resource_config { - u32 twt_ap_pdev_count; - u32 twt_ap_sta_count; - u8 is_reg_cc_ext_event_supported; -+ u32 ema_max_vap_cnt; -+ u32 ema_max_profile_period; - }; - - enum wmi_debug_log_param { diff --git a/package/kernel/mac80211/patches/ath11k/0072-wifi-ath11k-MBSSID-configuration-during-vdev-create-.patch b/package/kernel/mac80211/patches/ath11k/0072-wifi-ath11k-MBSSID-configuration-during-vdev-create-.patch deleted file mode 100644 index 4ba0717319..0000000000 --- a/package/kernel/mac80211/patches/ath11k/0072-wifi-ath11k-MBSSID-configuration-during-vdev-create-.patch +++ /dev/null @@ -1,215 +0,0 @@ -From 5a81610acf66c4ad6e1a1fbd09f3f555fca863b1 Mon Sep 17 00:00:00 2001 -From: Aloka Dixit -Date: Fri, 5 May 2023 16:11:27 +0300 -Subject: [PATCH 72/77] wifi: ath11k: MBSSID configuration during vdev - create/start - -Configure multiple BSSID flags and index of the transmitting interface -in vdev create/start commands depending on the service bit -WMI_TLV_SERVICE_MBSS_PARAM_IN_VDEV_START_SUPPORT. - -Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1 - -Signed-off-by: Aloka Dixit -Co-developed-by: John Crispin -Signed-off-by: John Crispin -Signed-off-by: Kalle Valo -Link: https://lore.kernel.org/r/20230405221648.17950-3-quic_alokad@quicinc.com ---- - drivers/net/wireless/ath/ath11k/mac.c | 70 +++++++++++++++++++++++++-- - drivers/net/wireless/ath/ath11k/wmi.c | 5 ++ - drivers/net/wireless/ath/ath11k/wmi.h | 19 ++++++++ - 3 files changed, 90 insertions(+), 4 deletions(-) - ---- a/drivers/net/wireless/ath/ath11k/mac.c -+++ b/drivers/net/wireless/ath/ath11k/mac.c -@@ -6181,17 +6181,62 @@ static void ath11k_mac_op_stop(struct ie - atomic_set(&ar->num_pending_mgmt_tx, 0); - } - --static void --ath11k_mac_setup_vdev_create_params(struct ath11k_vif *arvif, -- struct vdev_create_params *params) -+static int ath11k_mac_setup_vdev_params_mbssid(struct ath11k_vif *arvif, -+ u32 *flags, u32 *tx_vdev_id) -+{ -+ struct ath11k *ar = arvif->ar; -+ struct ath11k_vif *tx_arvif; -+ struct ieee80211_vif *tx_vif; -+ -+ *tx_vdev_id = 0; -+ tx_vif = arvif->vif->mbssid_tx_vif; -+ if (!tx_vif) { -+ *flags = WMI_HOST_VDEV_FLAGS_NON_MBSSID_AP; -+ return 0; -+ } -+ -+ tx_arvif = (void *)tx_vif->drv_priv; -+ -+ if (arvif->vif->bss_conf.nontransmitted) { -+ if (ar->hw->wiphy != ieee80211_vif_to_wdev(tx_vif)->wiphy) -+ return -EINVAL; -+ -+ *flags = WMI_HOST_VDEV_FLAGS_NON_TRANSMIT_AP; -+ *tx_vdev_id = ath11k_vif_to_arvif(tx_vif)->vdev_id; -+ } else if (tx_arvif == arvif) { -+ *flags = WMI_HOST_VDEV_FLAGS_TRANSMIT_AP; -+ } else { -+ return -EINVAL; -+ } -+ -+ if (arvif->vif->bss_conf.ema_ap) -+ *flags |= WMI_HOST_VDEV_FLAGS_EMA_MODE; -+ -+ return 0; -+} -+ -+static int ath11k_mac_setup_vdev_create_params(struct ath11k_vif *arvif, -+ struct vdev_create_params *params) - { - struct ath11k *ar = arvif->ar; - struct ath11k_pdev *pdev = ar->pdev; -+ int ret; - - params->if_id = arvif->vdev_id; - params->type = arvif->vdev_type; - params->subtype = arvif->vdev_subtype; - params->pdev_id = pdev->pdev_id; -+ params->mbssid_flags = 0; -+ params->mbssid_tx_vdev_id = 0; -+ -+ if (!test_bit(WMI_TLV_SERVICE_MBSS_PARAM_IN_VDEV_START_SUPPORT, -+ ar->ab->wmi_ab.svc_map)) { -+ ret = ath11k_mac_setup_vdev_params_mbssid(arvif, -+ ¶ms->mbssid_flags, -+ ¶ms->mbssid_tx_vdev_id); -+ if (ret) -+ return ret; -+ } - - if (pdev->cap.supported_bands & WMI_HOST_WLAN_2G_CAP) { - params->chains[NL80211_BAND_2GHZ].tx = ar->num_tx_chains; -@@ -6206,6 +6251,7 @@ ath11k_mac_setup_vdev_create_params(stru - params->chains[NL80211_BAND_6GHZ].tx = ar->num_tx_chains; - params->chains[NL80211_BAND_6GHZ].rx = ar->num_rx_chains; - } -+ return 0; - } - - static void ath11k_mac_op_update_vif_offload(struct ieee80211_hw *hw, -@@ -6500,7 +6546,12 @@ static int ath11k_mac_op_add_interface(s - for (i = 0; i < ARRAY_SIZE(vif->hw_queue); i++) - vif->hw_queue[i] = i % (ATH11K_HW_MAX_QUEUES - 1); - -- ath11k_mac_setup_vdev_create_params(arvif, &vdev_param); -+ ret = ath11k_mac_setup_vdev_create_params(arvif, &vdev_param); -+ if (ret) { -+ ath11k_warn(ab, "failed to create vdev parameters %d: %d\n", -+ arvif->vdev_id, ret); -+ goto err; -+ } - - ret = ath11k_wmi_vdev_create(ar, vif->addr, &vdev_param); - if (ret) { -@@ -6905,6 +6956,17 @@ ath11k_mac_vdev_start_restart(struct ath - arg.pref_tx_streams = ar->num_tx_chains; - arg.pref_rx_streams = ar->num_rx_chains; - -+ arg.mbssid_flags = 0; -+ arg.mbssid_tx_vdev_id = 0; -+ if (test_bit(WMI_TLV_SERVICE_MBSS_PARAM_IN_VDEV_START_SUPPORT, -+ ar->ab->wmi_ab.svc_map)) { -+ ret = ath11k_mac_setup_vdev_params_mbssid(arvif, -+ &arg.mbssid_flags, -+ &arg.mbssid_tx_vdev_id); -+ if (ret) -+ return ret; -+ } -+ - if (arvif->vdev_type == WMI_VDEV_TYPE_AP) { - arg.ssid = arvif->u.ap.ssid; - arg.ssid_len = arvif->u.ap.ssid_len; ---- a/drivers/net/wireless/ath/ath11k/wmi.c -+++ b/drivers/net/wireless/ath/ath11k/wmi.c -@@ -724,6 +724,9 @@ int ath11k_wmi_vdev_create(struct ath11k - cmd->vdev_subtype = param->subtype; - cmd->num_cfg_txrx_streams = WMI_NUM_SUPPORTED_BAND_MAX; - cmd->pdev_id = param->pdev_id; -+ cmd->mbssid_flags = param->mbssid_flags; -+ cmd->mbssid_tx_vdev_id = param->mbssid_tx_vdev_id; -+ - ether_addr_copy(cmd->vdev_macaddr.addr, macaddr); - - ptr = skb->data + sizeof(*cmd); -@@ -941,6 +944,8 @@ int ath11k_wmi_vdev_start(struct ath11k - cmd->cac_duration_ms = arg->cac_duration_ms; - cmd->regdomain = arg->regdomain; - cmd->he_ops = arg->he_ops; -+ cmd->mbssid_flags = arg->mbssid_flags; -+ cmd->mbssid_tx_vdev_id = arg->mbssid_tx_vdev_id; - - if (!restart) { - if (arg->ssid) { ---- a/drivers/net/wireless/ath/ath11k/wmi.h -+++ b/drivers/net/wireless/ath/ath11k/wmi.h -@@ -137,6 +137,14 @@ enum { - WMI_AUTORATE_3200NS_GI = BIT(11), - }; - -+enum { -+ WMI_HOST_VDEV_FLAGS_NON_MBSSID_AP = 0x00000001, -+ WMI_HOST_VDEV_FLAGS_TRANSMIT_AP = 0x00000002, -+ WMI_HOST_VDEV_FLAGS_NON_TRANSMIT_AP = 0x00000004, -+ WMI_HOST_VDEV_FLAGS_EMA_MODE = 0x00000008, -+ WMI_HOST_VDEV_FLAGS_SCAN_MODE_VAP = 0x00000010, -+}; -+ - /* - * wmi command groups. - */ -@@ -2096,6 +2104,7 @@ enum wmi_tlv_service { - WMI_TLV_SERVICE_EXT2_MSG = 220, - WMI_TLV_SERVICE_PEER_POWER_SAVE_DURATION_SUPPORT = 246, - WMI_TLV_SERVICE_SRG_SRP_SPATIAL_REUSE_SUPPORT = 249, -+ WMI_TLV_SERVICE_MBSS_PARAM_IN_VDEV_START_SUPPORT = 253, - WMI_TLV_SERVICE_PASSIVE_SCAN_START_TIME_ENHANCE = 263, - - /* The second 128 bits */ -@@ -2583,6 +2592,8 @@ struct vdev_create_params { - u8 rx; - } chains[NUM_NL80211_BANDS]; - u32 pdev_id; -+ u32 mbssid_flags; -+ u32 mbssid_tx_vdev_id; - }; - - struct wmi_vdev_create_cmd { -@@ -2593,6 +2604,8 @@ struct wmi_vdev_create_cmd { - struct wmi_mac_addr vdev_macaddr; - u32 num_cfg_txrx_streams; - u32 pdev_id; -+ u32 mbssid_flags; -+ u32 mbssid_tx_vdev_id; - } __packed; - - struct wmi_vdev_txrx_streams { -@@ -2656,6 +2669,9 @@ struct wmi_vdev_start_request_cmd { - u32 he_ops; - u32 cac_duration_ms; - u32 regdomain; -+ u32 min_data_rate; -+ u32 mbssid_flags; -+ u32 mbssid_tx_vdev_id; - } __packed; - - #define MGMT_TX_DL_FRM_LEN 64 -@@ -2825,6 +2841,9 @@ struct wmi_vdev_start_req_arg { - u32 pref_rx_streams; - u32 pref_tx_streams; - u32 num_noa_descriptors; -+ u32 min_data_rate; -+ u32 mbssid_flags; -+ u32 mbssid_tx_vdev_id; - }; - - struct peer_create_params { diff --git a/package/kernel/mac80211/patches/ath11k/0073-wifi-ath11k-rename-MBSSID-fields-in-wmi_vdev_up_cmd.patch b/package/kernel/mac80211/patches/ath11k/0073-wifi-ath11k-rename-MBSSID-fields-in-wmi_vdev_up_cmd.patch deleted file mode 100644 index 023a1dbb9f..0000000000 --- a/package/kernel/mac80211/patches/ath11k/0073-wifi-ath11k-rename-MBSSID-fields-in-wmi_vdev_up_cmd.patch +++ /dev/null @@ -1,52 +0,0 @@ -From cf604e72bc6e6db68c7fcaa8779b03ec14b8d2fa Mon Sep 17 00:00:00 2001 -From: Aloka Dixit -Date: Fri, 5 May 2023 16:11:27 +0300 -Subject: [PATCH 73/77] wifi: ath11k: rename MBSSID fields in wmi_vdev_up_cmd - -Rename trans_bssid to tx_vdev_bssid to make it similar to vdev_bssid. - -Rename profile_num to nontx_profile_cnt, and profile_idx to -nontx_profile_idx which makes it clear that these store configurations -related to MBSSID non-transmitting profiles. - -Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1 - -Signed-off-by: Aloka Dixit -Signed-off-by: Kalle Valo -Link: https://lore.kernel.org/r/20230405221648.17950-4-quic_alokad@quicinc.com ---- - drivers/net/wireless/ath/ath11k/wmi.c | 6 +++--- - drivers/net/wireless/ath/ath11k/wmi.h | 6 +++--- - 2 files changed, 6 insertions(+), 6 deletions(-) - ---- a/drivers/net/wireless/ath/ath11k/wmi.c -+++ b/drivers/net/wireless/ath/ath11k/wmi.c -@@ -1029,10 +1029,10 @@ int ath11k_wmi_vdev_up(struct ath11k *ar - bss_conf = &arvif->vif->bss_conf; - - if (bss_conf->nontransmitted) { -- ether_addr_copy(cmd->trans_bssid.addr, -+ ether_addr_copy(cmd->tx_vdev_bssid.addr, - bss_conf->transmitter_bssid); -- cmd->profile_idx = bss_conf->bssid_index; -- cmd->profile_num = bss_conf->bssid_indicator; -+ cmd->nontx_profile_idx = bss_conf->bssid_index; -+ cmd->nontx_profile_cnt = bss_conf->bssid_indicator; - } - } - ---- a/drivers/net/wireless/ath/ath11k/wmi.h -+++ b/drivers/net/wireless/ath/ath11k/wmi.h -@@ -2625,9 +2625,9 @@ struct wmi_vdev_up_cmd { - u32 vdev_id; - u32 vdev_assoc_id; - struct wmi_mac_addr vdev_bssid; -- struct wmi_mac_addr trans_bssid; -- u32 profile_idx; -- u32 profile_num; -+ struct wmi_mac_addr tx_vdev_bssid; -+ u32 nontx_profile_idx; -+ u32 nontx_profile_cnt; - } __packed; - - struct wmi_vdev_stop_cmd { diff --git a/package/kernel/mac80211/patches/ath11k/0074-wifi-ath11k-MBSSID-parameter-configuration-in-AP-mod.patch b/package/kernel/mac80211/patches/ath11k/0074-wifi-ath11k-MBSSID-parameter-configuration-in-AP-mod.patch deleted file mode 100644 index d93e27dd42..0000000000 --- a/package/kernel/mac80211/patches/ath11k/0074-wifi-ath11k-MBSSID-parameter-configuration-in-AP-mod.patch +++ /dev/null @@ -1,138 +0,0 @@ -From c82dc33f252fd8883be66f2d0230af0fd734c683 Mon Sep 17 00:00:00 2001 -From: Aloka Dixit -Date: Fri, 5 May 2023 16:11:27 +0300 -Subject: [PATCH 74/77] wifi: ath11k: MBSSID parameter configuration in AP mode - -Include MBSSID parameters in WMI vdev up operation. - -Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1 - -Signed-off-by: Aloka Dixit -Co-developed-by: John Crispin -Signed-off-by: John Crispin -Signed-off-by: Kalle Valo -Link: https://lore.kernel.org/r/20230405221648.17950-5-quic_alokad@quicinc.com ---- - drivers/net/wireless/ath/ath11k/mac.c | 29 +++++++++++++++++++++------ - drivers/net/wireless/ath/ath11k/wmi.c | 8 +++++++- - drivers/net/wireless/ath/ath11k/wmi.h | 3 ++- - 3 files changed, 32 insertions(+), 8 deletions(-) - ---- a/drivers/net/wireless/ath/ath11k/mac.c -+++ b/drivers/net/wireless/ath/ath11k/mac.c -@@ -964,7 +964,7 @@ static int ath11k_mac_monitor_vdev_start - return ret; - } - -- ret = ath11k_wmi_vdev_up(ar, vdev_id, 0, ar->mac_addr); -+ ret = ath11k_wmi_vdev_up(ar, vdev_id, 0, ar->mac_addr, NULL, 0, 0); - if (ret) { - ath11k_warn(ar->ab, "failed to put up monitor vdev %i: %d\n", - vdev_id, ret); -@@ -1423,6 +1423,7 @@ static void ath11k_control_beaconing(str - struct ieee80211_bss_conf *info) - { - struct ath11k *ar = arvif->ar; -+ struct ath11k_vif *tx_arvif = NULL; - int ret = 0; - - lockdep_assert_held(&arvif->ar->conf_mutex); -@@ -1451,8 +1452,14 @@ static void ath11k_control_beaconing(str - - ether_addr_copy(arvif->bssid, info->bssid); - -+ if (arvif->vif->mbssid_tx_vif) -+ tx_arvif = (struct ath11k_vif *)arvif->vif->mbssid_tx_vif->drv_priv; -+ - ret = ath11k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid, -- arvif->bssid); -+ arvif->bssid, -+ tx_arvif ? tx_arvif->bssid : NULL, -+ info->bssid_index, -+ 1 << info->bssid_indicator); - if (ret) { - ath11k_warn(ar->ab, "failed to bring up vdev %d: %i\n", - arvif->vdev_id, ret); -@@ -2879,7 +2886,8 @@ static void ath11k_bss_assoc(struct ieee - arvif->aid = vif->cfg.aid; - ether_addr_copy(arvif->bssid, bss_conf->bssid); - -- ret = ath11k_wmi_vdev_up(ar, arvif->vdev_id, arvif->aid, arvif->bssid); -+ ret = ath11k_wmi_vdev_up(ar, arvif->vdev_id, arvif->aid, arvif->bssid, -+ NULL, 0, 0); - if (ret) { - ath11k_warn(ar->ab, "failed to set vdev %d up: %d\n", - arvif->vdev_id, ret); -@@ -7133,7 +7141,8 @@ ath11k_mac_update_vif_chan(struct ath11k - int n_vifs) - { - struct ath11k_base *ab = ar->ab; -- struct ath11k_vif *arvif; -+ struct ath11k_vif *arvif, *tx_arvif = NULL; -+ struct ieee80211_vif *mbssid_tx_vif; - int ret; - int i; - bool monitor_vif = false; -@@ -7187,8 +7196,15 @@ ath11k_mac_update_vif_chan(struct ath11k - ath11k_warn(ab, "failed to update bcn tmpl during csa: %d\n", - ret); - -+ mbssid_tx_vif = arvif->vif->mbssid_tx_vif; -+ if (mbssid_tx_vif) -+ tx_arvif = (struct ath11k_vif *)mbssid_tx_vif->drv_priv; -+ - ret = ath11k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid, -- arvif->bssid); -+ arvif->bssid, -+ tx_arvif ? tx_arvif->bssid : NULL, -+ arvif->vif->bss_conf.bssid_index, -+ 1 << arvif->vif->bss_conf.bssid_indicator); - if (ret) { - ath11k_warn(ab, "failed to bring vdev up %d: %d\n", - arvif->vdev_id, ret); -@@ -7306,7 +7322,8 @@ static int ath11k_start_vdev_delay(struc - } - - if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) { -- ret = ath11k_wmi_vdev_up(ar, arvif->vdev_id, 0, ar->mac_addr); -+ ret = ath11k_wmi_vdev_up(ar, arvif->vdev_id, 0, ar->mac_addr, -+ NULL, 0, 0); - if (ret) { - ath11k_warn(ab, "failed put monitor up: %d\n", ret); - return ret; ---- a/drivers/net/wireless/ath/ath11k/wmi.c -+++ b/drivers/net/wireless/ath/ath11k/wmi.c -@@ -1001,7 +1001,8 @@ int ath11k_wmi_vdev_start(struct ath11k - return ret; - } - --int ath11k_wmi_vdev_up(struct ath11k *ar, u32 vdev_id, u32 aid, const u8 *bssid) -+int ath11k_wmi_vdev_up(struct ath11k *ar, u32 vdev_id, u32 aid, const u8 *bssid, -+ u8 *tx_bssid, u32 nontx_profile_idx, u32 nontx_profile_cnt) - { - struct ath11k_pdev_wmi *wmi = ar->wmi; - struct wmi_vdev_up_cmd *cmd; -@@ -1025,6 +1026,11 @@ int ath11k_wmi_vdev_up(struct ath11k *ar - - ether_addr_copy(cmd->vdev_bssid.addr, bssid); - -+ cmd->nontx_profile_idx = nontx_profile_idx; -+ cmd->nontx_profile_cnt = nontx_profile_cnt; -+ if (tx_bssid) -+ ether_addr_copy(cmd->tx_vdev_bssid.addr, tx_bssid); -+ - if (arvif && arvif->vif->type == NL80211_IFTYPE_STATION) { - bss_conf = &arvif->vif->bss_conf; - ---- a/drivers/net/wireless/ath/ath11k/wmi.h -+++ b/drivers/net/wireless/ath/ath11k/wmi.h -@@ -6301,7 +6301,8 @@ int ath11k_wmi_bcn_tmpl(struct ath11k *a - struct sk_buff *bcn); - int ath11k_wmi_vdev_down(struct ath11k *ar, u8 vdev_id); - int ath11k_wmi_vdev_up(struct ath11k *ar, u32 vdev_id, u32 aid, -- const u8 *bssid); -+ const u8 *bssid, u8 *tx_bssid, u32 nontx_profile_idx, -+ u32 nontx_profile_cnt); - int ath11k_wmi_vdev_stop(struct ath11k *ar, u8 vdev_id); - int ath11k_wmi_vdev_start(struct ath11k *ar, struct wmi_vdev_start_req_arg *arg, - bool restart); diff --git a/package/kernel/mac80211/patches/ath11k/0075-wifi-ath11k-refactor-vif-parameter-configurations.patch b/package/kernel/mac80211/patches/ath11k/0075-wifi-ath11k-refactor-vif-parameter-configurations.patch deleted file mode 100644 index 8509e55978..0000000000 --- a/package/kernel/mac80211/patches/ath11k/0075-wifi-ath11k-refactor-vif-parameter-configurations.patch +++ /dev/null @@ -1,86 +0,0 @@ -From cb9bea773c85e372931cd7a177db4165adf29d95 Mon Sep 17 00:00:00 2001 -From: Aloka Dixit -Date: Fri, 5 May 2023 16:11:28 +0300 -Subject: [PATCH 75/77] wifi: ath11k: refactor vif parameter configurations - -Security parameters for each non-transmitting profile can be -different when MBSSID is enabled and this information is included -in the MBSSID element in the Beacon frame. Current implementation -to set rsnie_present and wpaie_present does not parse this element -hence it applies only to the transmitting interface. - -Move the code to a separate function to make additions for -non-transmitting interfaces cleaner. - -Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1 - -Signed-off-by: Aloka Dixit -Signed-off-by: Kalle Valo -Link: https://lore.kernel.org/r/20230405221648.17950-6-quic_alokad@quicinc.com ---- - drivers/net/wireless/ath/ath11k/mac.c | 41 ++++++++++++++++----------- - 1 file changed, 24 insertions(+), 17 deletions(-) - ---- a/drivers/net/wireless/ath/ath11k/mac.c -+++ b/drivers/net/wireless/ath/ath11k/mac.c -@@ -1351,28 +1351,14 @@ err_mon_del: - return ret; - } - --static int ath11k_mac_setup_bcn_tmpl(struct ath11k_vif *arvif) -+static void ath11k_mac_set_vif_params(struct ath11k_vif *arvif, -+ struct sk_buff *bcn) - { -- struct ath11k *ar = arvif->ar; -- struct ath11k_base *ab = ar->ab; -- struct ieee80211_hw *hw = ar->hw; -- struct ieee80211_vif *vif = arvif->vif; -- struct ieee80211_mutable_offsets offs = {}; -- struct sk_buff *bcn; - struct ieee80211_mgmt *mgmt; - u8 *ies; -- int ret; -- -- if (arvif->vdev_type != WMI_VDEV_TYPE_AP) -- return 0; -- -- bcn = ieee80211_beacon_get_template(hw, vif, &offs, 0); -- if (!bcn) { -- ath11k_warn(ab, "failed to get beacon template from mac80211\n"); -- return -EPERM; -- } - - ies = bcn->data + ieee80211_get_hdrlen_from_skb(bcn); -+ mgmt = (struct ieee80211_mgmt *)bcn->data; - ies += sizeof(mgmt->u.beacon); - - if (cfg80211_find_ie(WLAN_EID_RSN, ies, (skb_tail_pointer(bcn) - ies))) -@@ -1386,7 +1372,28 @@ static int ath11k_mac_setup_bcn_tmpl(str - arvif->wpaie_present = true; - else - arvif->wpaie_present = false; -+} -+ -+static int ath11k_mac_setup_bcn_tmpl(struct ath11k_vif *arvif) -+{ -+ struct ath11k *ar = arvif->ar; -+ struct ath11k_base *ab = ar->ab; -+ struct ieee80211_hw *hw = ar->hw; -+ struct ieee80211_vif *vif = arvif->vif; -+ struct ieee80211_mutable_offsets offs = {}; -+ struct sk_buff *bcn; -+ int ret; -+ -+ if (arvif->vdev_type != WMI_VDEV_TYPE_AP) -+ return 0; -+ -+ bcn = ieee80211_beacon_get_template(hw, vif, &offs, 0); -+ if (!bcn) { -+ ath11k_warn(ab, "failed to get beacon template from mac80211\n"); -+ return -EPERM; -+ } - -+ ath11k_mac_set_vif_params(arvif, bcn); - ret = ath11k_wmi_bcn_tmpl(ar, arvif->vdev_id, &offs, bcn); - - kfree_skb(bcn); diff --git a/package/kernel/mac80211/patches/ath11k/0076-wifi-ath11k-MBSSID-beacon-support.patch b/package/kernel/mac80211/patches/ath11k/0076-wifi-ath11k-MBSSID-beacon-support.patch deleted file mode 100644 index d23ea8deea..0000000000 --- a/package/kernel/mac80211/patches/ath11k/0076-wifi-ath11k-MBSSID-beacon-support.patch +++ /dev/null @@ -1,190 +0,0 @@ -From 335a92765d308dfe22826f5562cd4b4389b45e71 Mon Sep 17 00:00:00 2001 -From: Aloka Dixit -Date: Fri, 5 May 2023 16:11:28 +0300 -Subject: [PATCH 76/77] wifi: ath11k: MBSSID beacon support - -- Split ath11k_mac_setup_bcn_tmpl() to move the beacon retrieval and - WMI command to a new function, ath11k_mac_setup_bcn_tmpl_legacy(). - In the original function add checks to use the transmitting interface - when MBSSID is enabled. -- Set rsnie_present and wpaie_present fields for the non-transmitting - interfaces when MBSSID is enabled. - -Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1 - -Signed-off-by: Aloka Dixit -Co-developed-by: John Crispin -Signed-off-by: John Crispin -Signed-off-by: Kalle Valo -Link: https://lore.kernel.org/r/20230405221648.17950-7-quic_alokad@quicinc.com ---- - drivers/net/wireless/ath/ath11k/mac.c | 116 ++++++++++++++++++++++++-- - drivers/net/wireless/ath/ath11k/wmi.c | 1 + - 2 files changed, 112 insertions(+), 5 deletions(-) - ---- a/drivers/net/wireless/ath/ath11k/mac.c -+++ b/drivers/net/wireless/ath/ath11k/mac.c -@@ -1351,6 +1351,84 @@ err_mon_del: - return ret; - } - -+static void ath11k_mac_setup_nontx_vif_rsnie(struct ath11k_vif *arvif, -+ bool tx_arvif_rsnie_present, -+ const u8 *profile, u8 profile_len) -+{ -+ if (cfg80211_find_ie(WLAN_EID_RSN, profile, profile_len)) { -+ arvif->rsnie_present = true; -+ } else if (tx_arvif_rsnie_present) { -+ int i; -+ u8 nie_len; -+ const u8 *nie = cfg80211_find_ext_ie(WLAN_EID_EXT_NON_INHERITANCE, -+ profile, profile_len); -+ if (!nie) -+ return; -+ -+ nie_len = nie[1]; -+ nie += 2; -+ for (i = 0; i < nie_len; i++) { -+ if (nie[i] == WLAN_EID_RSN) { -+ arvif->rsnie_present = false; -+ break; -+ } -+ } -+ } -+} -+ -+static bool ath11k_mac_set_nontx_vif_params(struct ath11k_vif *tx_arvif, -+ struct ath11k_vif *arvif, -+ struct sk_buff *bcn) -+{ -+ struct ieee80211_mgmt *mgmt; -+ const u8 *ies, *profile, *next_profile; -+ int ies_len; -+ -+ ies = bcn->data + ieee80211_get_hdrlen_from_skb(bcn); -+ mgmt = (struct ieee80211_mgmt *)bcn->data; -+ ies += sizeof(mgmt->u.beacon); -+ ies_len = skb_tail_pointer(bcn) - ies; -+ -+ ies = cfg80211_find_ie(WLAN_EID_MULTIPLE_BSSID, ies, ies_len); -+ arvif->rsnie_present = tx_arvif->rsnie_present; -+ -+ while (ies) { -+ u8 mbssid_len; -+ -+ ies_len -= (2 + ies[1]); -+ mbssid_len = ies[1] - 1; -+ profile = &ies[3]; -+ -+ while (mbssid_len) { -+ u8 profile_len; -+ -+ profile_len = profile[1]; -+ next_profile = profile + (2 + profile_len); -+ mbssid_len -= (2 + profile_len); -+ -+ profile += 2; -+ profile_len -= (2 + profile[1]); -+ profile += (2 + profile[1]); /* nontx capabilities */ -+ profile_len -= (2 + profile[1]); -+ profile += (2 + profile[1]); /* SSID */ -+ if (profile[2] == arvif->vif->bss_conf.bssid_index) { -+ profile_len -= 5; -+ profile = profile + 5; -+ ath11k_mac_setup_nontx_vif_rsnie(arvif, -+ tx_arvif->rsnie_present, -+ profile, -+ profile_len); -+ return true; -+ } -+ profile = next_profile; -+ } -+ ies = cfg80211_find_ie(WLAN_EID_MULTIPLE_BSSID, profile, -+ ies_len); -+ } -+ -+ return false; -+} -+ - static void ath11k_mac_set_vif_params(struct ath11k_vif *arvif, - struct sk_buff *bcn) - { -@@ -1374,18 +1452,26 @@ static void ath11k_mac_set_vif_params(st - arvif->wpaie_present = false; - } - --static int ath11k_mac_setup_bcn_tmpl(struct ath11k_vif *arvif) -+static int ath11k_mac_setup_bcn_tmpl_mbssid(struct ath11k_vif *arvif) - { - struct ath11k *ar = arvif->ar; - struct ath11k_base *ab = ar->ab; -+ struct ath11k_vif *tx_arvif = arvif; - struct ieee80211_hw *hw = ar->hw; - struct ieee80211_vif *vif = arvif->vif; - struct ieee80211_mutable_offsets offs = {}; - struct sk_buff *bcn; - int ret; - -- if (arvif->vdev_type != WMI_VDEV_TYPE_AP) -- return 0; -+ if (arvif->vif->mbssid_tx_vif) { -+ tx_arvif = (void *)arvif->vif->mbssid_tx_vif->drv_priv; -+ if (tx_arvif != arvif) { -+ ar = tx_arvif->ar; -+ ab = ar->ab; -+ hw = ar->hw; -+ vif = tx_arvif->vif; -+ } -+ } - - bcn = ieee80211_beacon_get_template(hw, vif, &offs, 0); - if (!bcn) { -@@ -1393,9 +1479,12 @@ static int ath11k_mac_setup_bcn_tmpl(str - return -EPERM; - } - -- ath11k_mac_set_vif_params(arvif, bcn); -- ret = ath11k_wmi_bcn_tmpl(ar, arvif->vdev_id, &offs, bcn); -+ if (tx_arvif == arvif) -+ ath11k_mac_set_vif_params(tx_arvif, bcn); -+ else if (!ath11k_mac_set_nontx_vif_params(tx_arvif, arvif, bcn)) -+ return -EINVAL; - -+ ret = ath11k_wmi_bcn_tmpl(ar, arvif->vdev_id, &offs, bcn); - kfree_skb(bcn); - - if (ret) -@@ -1405,6 +1494,23 @@ static int ath11k_mac_setup_bcn_tmpl(str - return ret; - } - -+static int ath11k_mac_setup_bcn_tmpl(struct ath11k_vif *arvif) -+{ -+ struct ieee80211_vif *vif = arvif->vif; -+ -+ if (arvif->vdev_type != WMI_VDEV_TYPE_AP) -+ return 0; -+ -+ /* Target does not expect beacon templates for the already up -+ * non-transmitting interfaces, and results in a crash if sent. -+ */ -+ if (vif->mbssid_tx_vif && -+ arvif != (void *)vif->mbssid_tx_vif->drv_priv && arvif->is_up) -+ return 0; -+ -+ return ath11k_mac_setup_bcn_tmpl_mbssid(arvif); -+} -+ - void ath11k_mac_bcn_tx_event(struct ath11k_vif *arvif) - { - struct ieee80211_vif *vif = arvif->vif; ---- a/drivers/net/wireless/ath/ath11k/wmi.c -+++ b/drivers/net/wireless/ath/ath11k/wmi.c -@@ -1737,6 +1737,7 @@ int ath11k_wmi_bcn_tmpl(struct ath11k *a - } - - cmd->buf_len = bcn->len; -+ cmd->mbssid_ie_offset = offs->mbssid_off; - - ptr = skb->data + sizeof(*cmd); - diff --git a/package/kernel/mac80211/patches/ath11k/0077-wifi-ath11k-EMA-beacon-support.patch b/package/kernel/mac80211/patches/ath11k/0077-wifi-ath11k-EMA-beacon-support.patch deleted file mode 100644 index 51353fa3e4..0000000000 --- a/package/kernel/mac80211/patches/ath11k/0077-wifi-ath11k-EMA-beacon-support.patch +++ /dev/null @@ -1,156 +0,0 @@ -From 87bd401138161008fdb82fbca6e213af117bfeb9 Mon Sep 17 00:00:00 2001 -From: Aloka Dixit -Date: Fri, 5 May 2023 16:11:28 +0300 -Subject: [PATCH 77/77] wifi: ath11k: EMA beacon support - -Add new function ath11k_mac_setup_bcn_tmpl_ema() which invokes the new -API provided by MAC80211 to retrieve EMA beacons. - -Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1 - -Signed-off-by: Aloka Dixit -Co-developed-by: John Crispin -Signed-off-by: John Crispin -Signed-off-by: Kalle Valo -Link: https://lore.kernel.org/r/20230405221648.17950-8-quic_alokad@quicinc.com ---- - drivers/net/wireless/ath/ath11k/mac.c | 59 ++++++++++++++++++++++++++- - drivers/net/wireless/ath/ath11k/wmi.c | 3 +- - drivers/net/wireless/ath/ath11k/wmi.h | 11 ++++- - 3 files changed, 70 insertions(+), 3 deletions(-) - ---- a/drivers/net/wireless/ath/ath11k/mac.c -+++ b/drivers/net/wireless/ath/ath11k/mac.c -@@ -1452,6 +1452,60 @@ static void ath11k_mac_set_vif_params(st - arvif->wpaie_present = false; - } - -+static int ath11k_mac_setup_bcn_tmpl_ema(struct ath11k_vif *arvif) -+{ -+ struct ath11k_vif *tx_arvif; -+ struct ieee80211_ema_beacons *beacons; -+ int ret = 0; -+ bool nontx_vif_params_set = false; -+ u32 params = 0; -+ u8 i = 0; -+ -+ tx_arvif = (void *)arvif->vif->mbssid_tx_vif->drv_priv; -+ -+ beacons = ieee80211_beacon_get_template_ema_list(tx_arvif->ar->hw, -+ tx_arvif->vif, 0); -+ if (!beacons || !beacons->cnt) { -+ ath11k_warn(arvif->ar->ab, -+ "failed to get ema beacon templates from mac80211\n"); -+ return -EPERM; -+ } -+ -+ if (tx_arvif == arvif) -+ ath11k_mac_set_vif_params(tx_arvif, beacons->bcn[0].skb); -+ else -+ arvif->wpaie_present = tx_arvif->wpaie_present; -+ -+ for (i = 0; i < beacons->cnt; i++) { -+ if (tx_arvif != arvif && !nontx_vif_params_set) -+ nontx_vif_params_set = -+ ath11k_mac_set_nontx_vif_params(tx_arvif, arvif, -+ beacons->bcn[i].skb); -+ -+ params = beacons->cnt; -+ params |= (i << WMI_EMA_TMPL_IDX_SHIFT); -+ params |= ((!i ? 1 : 0) << WMI_EMA_FIRST_TMPL_SHIFT); -+ params |= ((i + 1 == beacons->cnt ? 1 : 0) << WMI_EMA_LAST_TMPL_SHIFT); -+ -+ ret = ath11k_wmi_bcn_tmpl(tx_arvif->ar, tx_arvif->vdev_id, -+ &beacons->bcn[i].offs, -+ beacons->bcn[i].skb, params); -+ if (ret) { -+ ath11k_warn(tx_arvif->ar->ab, -+ "failed to set ema beacon template id %i error %d\n", -+ i, ret); -+ break; -+ } -+ } -+ -+ ieee80211_beacon_free_ema_list(beacons); -+ -+ if (tx_arvif != arvif && !nontx_vif_params_set) -+ return -EINVAL; /* Profile not found in the beacons */ -+ -+ return ret; -+} -+ - static int ath11k_mac_setup_bcn_tmpl_mbssid(struct ath11k_vif *arvif) - { - struct ath11k *ar = arvif->ar; -@@ -1484,7 +1538,7 @@ static int ath11k_mac_setup_bcn_tmpl_mbs - else if (!ath11k_mac_set_nontx_vif_params(tx_arvif, arvif, bcn)) - return -EINVAL; - -- ret = ath11k_wmi_bcn_tmpl(ar, arvif->vdev_id, &offs, bcn); -+ ret = ath11k_wmi_bcn_tmpl(ar, arvif->vdev_id, &offs, bcn, 0); - kfree_skb(bcn); - - if (ret) -@@ -1508,6 +1562,9 @@ static int ath11k_mac_setup_bcn_tmpl(str - arvif != (void *)vif->mbssid_tx_vif->drv_priv && arvif->is_up) - return 0; - -+ if (vif->bss_conf.ema_ap && vif->mbssid_tx_vif) -+ return ath11k_mac_setup_bcn_tmpl_ema(arvif); -+ - return ath11k_mac_setup_bcn_tmpl_mbssid(arvif); - } - ---- a/drivers/net/wireless/ath/ath11k/wmi.c -+++ b/drivers/net/wireless/ath/ath11k/wmi.c -@@ -1699,7 +1699,7 @@ int ath11k_wmi_send_bcn_offload_control_ - - int ath11k_wmi_bcn_tmpl(struct ath11k *ar, u32 vdev_id, - struct ieee80211_mutable_offsets *offs, -- struct sk_buff *bcn) -+ struct sk_buff *bcn, u32 ema_params) - { - struct ath11k_pdev_wmi *wmi = ar->wmi; - struct wmi_bcn_tmpl_cmd *cmd; -@@ -1738,6 +1738,7 @@ int ath11k_wmi_bcn_tmpl(struct ath11k *a - - cmd->buf_len = bcn->len; - cmd->mbssid_ie_offset = offs->mbssid_off; -+ cmd->ema_params = ema_params; - - ptr = skb->data + sizeof(*cmd); - ---- a/drivers/net/wireless/ath/ath11k/wmi.h -+++ b/drivers/net/wireless/ath/ath11k/wmi.h -@@ -3566,6 +3566,10 @@ struct wmi_get_pdev_temperature_cmd { - - #define WMI_BEACON_TX_BUFFER_SIZE 512 - -+#define WMI_EMA_TMPL_IDX_SHIFT 8 -+#define WMI_EMA_FIRST_TMPL_SHIFT 16 -+#define WMI_EMA_LAST_TMPL_SHIFT 24 -+ - struct wmi_bcn_tmpl_cmd { - u32 tlv_header; - u32 vdev_id; -@@ -3576,6 +3580,11 @@ struct wmi_bcn_tmpl_cmd { - u32 csa_event_bitmap; - u32 mbssid_ie_offset; - u32 esp_ie_offset; -+ u32 csc_switch_count_offset; -+ u32 csc_event_bitmap; -+ u32 mu_edca_ie_offset; -+ u32 feature_enable_bitmap; -+ u32 ema_params; - } __packed; - - struct wmi_key_seq_counter { -@@ -6298,7 +6307,7 @@ int ath11k_wmi_mgmt_send(struct ath11k * - struct sk_buff *frame); - int ath11k_wmi_bcn_tmpl(struct ath11k *ar, u32 vdev_id, - struct ieee80211_mutable_offsets *offs, -- struct sk_buff *bcn); -+ struct sk_buff *bcn, u32 ema_param); - int ath11k_wmi_vdev_down(struct ath11k *ar, u8 vdev_id); - int ath11k_wmi_vdev_up(struct ath11k *ar, u32 vdev_id, u32 aid, - const u8 *bssid, u8 *tx_bssid, u32 nontx_profile_idx, diff --git a/package/kernel/mac80211/patches/ath11k/0078-wifi-ath11k-Relocate-the-func-ath11k_mac_bitrate_mas.patch b/package/kernel/mac80211/patches/ath11k/0078-wifi-ath11k-Relocate-the-func-ath11k_mac_bitrate_mas.patch deleted file mode 100644 index 610bf72514..0000000000 --- a/package/kernel/mac80211/patches/ath11k/0078-wifi-ath11k-Relocate-the-func-ath11k_mac_bitrate_mas.patch +++ /dev/null @@ -1,75 +0,0 @@ -From 570eec3d40505c30babbe3b8f85a38496c975ab2 Mon Sep 17 00:00:00 2001 -From: Maharaja Kennadyrajan -Date: Tue, 9 May 2023 20:07:23 +0300 -Subject: [PATCH] wifi: ath11k: Relocate the func - ath11k_mac_bitrate_mask_num_ht_rates() and change hweight16 to hweight8 - -Relocate the function ath11k_mac_bitrate_mask_num_ht_rates() definition -to call this function from other functions which helps to avoid the -compilation error (function not defined). - -ht_mcs[] is 1 byte array and it is enough to use hweight8() instead -of hweight16(). Hence, fixed the same. - -Tested on: Compile tested only. - -Signed-off-by: Maharaja Kennadyrajan -Signed-off-by: Kalle Valo -Link: https://lore.kernel.org/r/20230504092033.3542456-2-quic_mkenna@quicinc.com ---- - drivers/net/wireless/ath/ath11k/mac.c | 30 +++++++++++++-------------- - 1 file changed, 15 insertions(+), 15 deletions(-) - ---- a/drivers/net/wireless/ath/ath11k/mac.c -+++ b/drivers/net/wireless/ath/ath11k/mac.c -@@ -1,7 +1,7 @@ - // SPDX-License-Identifier: BSD-3-Clause-Clear - /* - * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved. -- * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved. -+ * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved. - */ - - #include -@@ -4338,6 +4338,20 @@ exit: - } - - static int -+ath11k_mac_bitrate_mask_num_ht_rates(struct ath11k *ar, -+ enum nl80211_band band, -+ const struct cfg80211_bitrate_mask *mask) -+{ -+ int num_rates = 0; -+ int i; -+ -+ for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) -+ num_rates += hweight8(mask->control[band].ht_mcs[i]); -+ -+ return num_rates; -+} -+ -+static int - ath11k_mac_bitrate_mask_num_vht_rates(struct ath11k *ar, - enum nl80211_band band, - const struct cfg80211_bitrate_mask *mask) -@@ -7791,20 +7805,6 @@ static void ath11k_mac_op_flush(struct i - ath11k_mac_flush_tx_complete(ar); - } - --static int --ath11k_mac_bitrate_mask_num_ht_rates(struct ath11k *ar, -- enum nl80211_band band, -- const struct cfg80211_bitrate_mask *mask) --{ -- int num_rates = 0; -- int i; -- -- for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) -- num_rates += hweight16(mask->control[band].ht_mcs[i]); -- -- return num_rates; --} -- - static bool - ath11k_mac_has_single_legacy_rate(struct ath11k *ar, - enum nl80211_band band, diff --git a/package/kernel/mac80211/patches/ath11k/0079-wifi-ath11k-Send-HT-fixed-rate-in-WMI-peer-fixed-par.patch b/package/kernel/mac80211/patches/ath11k/0079-wifi-ath11k-Send-HT-fixed-rate-in-WMI-peer-fixed-par.patch deleted file mode 100644 index 6282f4462e..0000000000 --- a/package/kernel/mac80211/patches/ath11k/0079-wifi-ath11k-Send-HT-fixed-rate-in-WMI-peer-fixed-par.patch +++ /dev/null @@ -1,141 +0,0 @@ -From df8e3729ffc0aa645839693f74ee7b6d999cdf64 Mon Sep 17 00:00:00 2001 -From: Maharaja Kennadyrajan -Date: Tue, 9 May 2023 20:07:24 +0300 -Subject: [PATCH] wifi: ath11k: Send HT fixed rate in WMI peer fixed param - -Due to the firmware behavior with HT fixed rate setting, -HT fixed rate MCS with NSS > 1 are treated as NSS = 1 -HT rates in the firmware and enables the HT fixed rate of -NSS = 1. - -This leads to HT fixed rate is always configured for NSS = 1 -even though the user sets NSS = 2 or > 1 HT fixed MCS in the -set bitrate command. - -Currently HT fixed MCS is sent via WMI peer assoc command. -Fix this issue, by sending the HT fixed rate MCS in WMI peer -fixed param instead of sending in peer assoc command. - -Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1 - -Signed-off-by: Maharaja Kennadyrajan -Signed-off-by: Kalle Valo -Link: https://lore.kernel.org/r/20230504092033.3542456-3-quic_mkenna@quicinc.com ---- - drivers/net/wireless/ath/ath11k/mac.c | 63 ++++++++++++++++++++++++++- - 1 file changed, 61 insertions(+), 2 deletions(-) - ---- a/drivers/net/wireless/ath/ath11k/mac.c -+++ b/drivers/net/wireless/ath/ath11k/mac.c -@@ -4480,6 +4480,54 @@ ath11k_mac_set_peer_he_fixed_rate(struct - return ret; - } - -+static int -+ath11k_mac_set_peer_ht_fixed_rate(struct ath11k_vif *arvif, -+ struct ieee80211_sta *sta, -+ const struct cfg80211_bitrate_mask *mask, -+ enum nl80211_band band) -+{ -+ struct ath11k *ar = arvif->ar; -+ u8 ht_rate, nss = 0; -+ u32 rate_code; -+ int ret, i; -+ -+ lockdep_assert_held(&ar->conf_mutex); -+ -+ for (i = 0; i < ARRAY_SIZE(mask->control[band].ht_mcs); i++) { -+ if (hweight8(mask->control[band].ht_mcs[i]) == 1) { -+ nss = i + 1; -+ ht_rate = ffs(mask->control[band].ht_mcs[i]) - 1; -+ } -+ } -+ -+ if (!nss) { -+ ath11k_warn(ar->ab, "No single HT Fixed rate found to set for %pM", -+ sta->addr); -+ return -EINVAL; -+ } -+ -+ /* Avoid updating invalid nss as fixed rate*/ -+ if (nss > sta->deflink.rx_nss) -+ return -EINVAL; -+ -+ ath11k_dbg(ar->ab, ATH11K_DBG_MAC, -+ "Setting Fixed HT Rate for peer %pM. Device will not switch to any other selected rates", -+ sta->addr); -+ -+ rate_code = ATH11K_HW_RATE_CODE(ht_rate, nss - 1, -+ WMI_RATE_PREAMBLE_HT); -+ ret = ath11k_wmi_set_peer_param(ar, sta->addr, -+ arvif->vdev_id, -+ WMI_PEER_PARAM_FIXED_RATE, -+ rate_code); -+ if (ret) -+ ath11k_warn(ar->ab, -+ "failed to update STA %pM HT Fixed Rate %d: %d\n", -+ sta->addr, rate_code, ret); -+ -+ return ret; -+} -+ - static int ath11k_station_assoc(struct ath11k *ar, - struct ieee80211_vif *vif, - struct ieee80211_sta *sta, -@@ -4491,7 +4539,7 @@ static int ath11k_station_assoc(struct a - struct cfg80211_chan_def def; - enum nl80211_band band; - struct cfg80211_bitrate_mask *mask; -- u8 num_vht_rates, num_he_rates; -+ u8 num_ht_rates, num_vht_rates, num_he_rates; - - lockdep_assert_held(&ar->conf_mutex); - -@@ -4519,6 +4567,7 @@ static int ath11k_station_assoc(struct a - - num_vht_rates = ath11k_mac_bitrate_mask_num_vht_rates(ar, band, mask); - num_he_rates = ath11k_mac_bitrate_mask_num_he_rates(ar, band, mask); -+ num_ht_rates = ath11k_mac_bitrate_mask_num_ht_rates(ar, band, mask); - - /* If single VHT/HE rate is configured (by set_bitrate_mask()), - * peer_assoc will disable VHT/HE. This is now enabled by a peer specific -@@ -4535,6 +4584,11 @@ static int ath11k_station_assoc(struct a - band); - if (ret) - return ret; -+ } else if (sta->deflink.ht_cap.ht_supported && num_ht_rates == 1) { -+ ret = ath11k_mac_set_peer_ht_fixed_rate(arvif, sta, mask, -+ band); -+ if (ret) -+ return ret; - } - - /* Re-assoc is run only to update supported rates for given station. It -@@ -4608,7 +4662,7 @@ static void ath11k_sta_rc_update_wk(stru - const u16 *vht_mcs_mask; - const u16 *he_mcs_mask; - u32 changed, bw, nss, smps, bw_prev; -- int err, num_vht_rates, num_he_rates; -+ int err, num_ht_rates, num_vht_rates, num_he_rates; - const struct cfg80211_bitrate_mask *mask; - struct peer_assoc_params peer_arg; - enum wmi_phy_mode peer_phymode; -@@ -4724,6 +4778,8 @@ static void ath11k_sta_rc_update_wk(stru - - if (changed & IEEE80211_RC_SUPP_RATES_CHANGED) { - mask = &arvif->bitrate_mask; -+ num_ht_rates = ath11k_mac_bitrate_mask_num_ht_rates(ar, band, -+ mask); - num_vht_rates = ath11k_mac_bitrate_mask_num_vht_rates(ar, band, - mask); - num_he_rates = ath11k_mac_bitrate_mask_num_he_rates(ar, band, -@@ -4746,6 +4802,9 @@ static void ath11k_sta_rc_update_wk(stru - } else if (sta->deflink.he_cap.has_he && num_he_rates == 1) { - ath11k_mac_set_peer_he_fixed_rate(arvif, sta, mask, - band); -+ } else if (sta->deflink.ht_cap.ht_supported && num_ht_rates == 1) { -+ ath11k_mac_set_peer_ht_fixed_rate(arvif, sta, mask, -+ band); - } else { - /* If the peer is non-VHT/HE or no fixed VHT/HE rate - * is provided in the new bitrate mask we set the diff --git a/package/kernel/mac80211/patches/ath11k/0080-wifi-ath11k-add-support-default-regdb-while-searchin.patch b/package/kernel/mac80211/patches/ath11k/0080-wifi-ath11k-add-support-default-regdb-while-searchin.patch deleted file mode 100644 index 5ff40aac7a..0000000000 --- a/package/kernel/mac80211/patches/ath11k/0080-wifi-ath11k-add-support-default-regdb-while-searchin.patch +++ /dev/null @@ -1,127 +0,0 @@ -From 88ca89202f8e8afb5225eb5244d79cd67c15d744 Mon Sep 17 00:00:00 2001 -From: Wen Gong -Date: Fri, 26 May 2023 12:41:06 +0300 -Subject: [PATCH] wifi: ath11k: add support default regdb while searching - board-2.bin for WCN6855 - -Sometimes board-2.bin does not have the regdb data which matched the -parameters such as vendor, device, subsystem-vendor, subsystem-device -and etc. Add default regdb data with 'bus=%s' into board-2.bin for -WCN6855, then ath11k use 'bus=pci' to search regdb data in board-2.bin -for WCN6855. - -kernel: [ 122.515808] ath11k_pci 0000:03:00.0: boot using board name 'bus=pci,vendor=17cb,device=1103,subsystem-vendor=17cb,subsystem-device=3374,qmi-chip-id=2,qmi-board-id=262' -kernel: [ 122.517240] ath11k_pci 0000:03:00.0: boot firmware request ath11k/WCN6855/hw2.0/board-2.bin size 6179564 -kernel: [ 122.517280] ath11k_pci 0000:03:00.0: failed to fetch regdb data for bus=pci,vendor=17cb,device=1103,subsystem-vendor=17cb,subsystem-device=3374,qmi-chip-id=2,qmi-board-id=262 from ath11k/WCN6855/hw2.0/board-2.bin -kernel: [ 122.517464] ath11k_pci 0000:03:00.0: boot using board name 'bus=pci' -kernel: [ 122.518901] ath11k_pci 0000:03:00.0: boot firmware request ath11k/WCN6855/hw2.0/board-2.bin size 6179564 -kernel: [ 122.518915] ath11k_pci 0000:03:00.0: board name -kernel: [ 122.518917] ath11k_pci 0000:03:00.0: 00000000: 62 75 73 3d 70 63 69 bus=pci -kernel: [ 122.518918] ath11k_pci 0000:03:00.0: boot found match regdb data for name 'bus=pci' -kernel: [ 122.518920] ath11k_pci 0000:03:00.0: boot found regdb data for 'bus=pci' -kernel: [ 122.518921] ath11k_pci 0000:03:00.0: fetched regdb - -Tested-on: WCN6855 hw2.0 PCI WLAN.HSP.1.1-03125-QCAHSPSWPL_V1_V2_SILICONZ_LITE-3 - -Signed-off-by: Wen Gong -Signed-off-by: Kalle Valo -Link: https://lore.kernel.org/r/20230517133959.8224-1-quic_wgong@quicinc.com ---- - drivers/net/wireless/ath/ath11k/core.c | 53 +++++++++++++++++++------- - 1 file changed, 40 insertions(+), 13 deletions(-) - ---- a/drivers/net/wireless/ath/ath11k/core.c -+++ b/drivers/net/wireless/ath/ath11k/core.c -@@ -961,7 +961,8 @@ int ath11k_core_check_dt(struct ath11k_b - } - - static int __ath11k_core_create_board_name(struct ath11k_base *ab, char *name, -- size_t name_len, bool with_variant) -+ size_t name_len, bool with_variant, -+ bool bus_type_mode) - { - /* strlen(',variant=') + strlen(ab->qmi.target.bdf_ext) */ - char variant[9 + ATH11K_QMI_BDF_EXT_STR_LENGTH] = { 0 }; -@@ -972,15 +973,20 @@ 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), -- ab->id.vendor, ab->id.device, -- ab->id.subsystem_vendor, -- ab->id.subsystem_device, -- ab->qmi.target.chip_id, -- ab->qmi.target.board_id, -- variant); -+ if (bus_type_mode) -+ scnprintf(name, name_len, -+ "bus=%s", -+ ath11k_bus_str(ab->hif.bus)); -+ else -+ 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), -+ ab->id.vendor, ab->id.device, -+ ab->id.subsystem_vendor, -+ ab->id.subsystem_device, -+ ab->qmi.target.chip_id, -+ ab->qmi.target.board_id, -+ variant); - break; - default: - scnprintf(name, name_len, -@@ -999,13 +1005,19 @@ static int __ath11k_core_create_board_na - static int ath11k_core_create_board_name(struct ath11k_base *ab, char *name, - size_t name_len) - { -- return __ath11k_core_create_board_name(ab, name, name_len, true); -+ return __ath11k_core_create_board_name(ab, name, name_len, true, false); - } - - static int ath11k_core_create_fallback_board_name(struct ath11k_base *ab, char *name, - size_t name_len) - { -- return __ath11k_core_create_board_name(ab, name, name_len, false); -+ return __ath11k_core_create_board_name(ab, name, name_len, false, false); -+} -+ -+static int ath11k_core_create_bus_type_board_name(struct ath11k_base *ab, char *name, -+ size_t name_len) -+{ -+ return __ath11k_core_create_board_name(ab, name, name_len, false, true); - } - - const struct firmware *ath11k_core_firmware_request(struct ath11k_base *ab, -@@ -1309,7 +1321,7 @@ success: - - int ath11k_core_fetch_regdb(struct ath11k_base *ab, struct ath11k_board_data *bd) - { -- char boardname[BOARD_NAME_SIZE]; -+ char boardname[BOARD_NAME_SIZE], default_boardname[BOARD_NAME_SIZE]; - int ret; - - ret = ath11k_core_create_board_name(ab, boardname, BOARD_NAME_SIZE); -@@ -1323,6 +1335,21 @@ int ath11k_core_fetch_regdb(struct ath11 - ATH11K_BD_IE_REGDB, - ATH11K_BD_IE_REGDB_NAME, - ATH11K_BD_IE_REGDB_DATA); -+ if (!ret) -+ goto exit; -+ -+ ret = ath11k_core_create_bus_type_board_name(ab, default_boardname, -+ BOARD_NAME_SIZE); -+ if (ret) { -+ ath11k_dbg(ab, ATH11K_DBG_BOOT, -+ "failed to create default board name for regdb: %d", ret); -+ goto exit; -+ } -+ -+ ret = ath11k_core_fetch_board_data_api_n(ab, bd, default_boardname, -+ ATH11K_BD_IE_REGDB, -+ ATH11K_BD_IE_REGDB_NAME, -+ ATH11K_BD_IE_REGDB_DATA); - if (!ret) - goto exit; - diff --git a/package/kernel/mac80211/patches/ath11k/0081-wifi-ath11k-remove-unused-function-ath11k_tm_event_w.patch b/package/kernel/mac80211/patches/ath11k/0081-wifi-ath11k-remove-unused-function-ath11k_tm_event_w.patch deleted file mode 100644 index b5dc83f007..0000000000 --- a/package/kernel/mac80211/patches/ath11k/0081-wifi-ath11k-remove-unused-function-ath11k_tm_event_w.patch +++ /dev/null @@ -1,128 +0,0 @@ -From 86f85575a3f6a20cef1c8bb98e78585fe3a53ccc Mon Sep 17 00:00:00 2001 -From: Govindaraj Saminathan -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 -Signed-off-by: Raj Kumar Bhagat -Signed-off-by: Kalle Valo -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) diff --git a/package/kernel/mac80211/patches/ath11k/0082-wifi-ath11k-factory-test-mode-support.patch b/package/kernel/mac80211/patches/ath11k/0082-wifi-ath11k-factory-test-mode-support.patch deleted file mode 100644 index f1b262724f..0000000000 --- a/package/kernel/mac80211/patches/ath11k/0082-wifi-ath11k-factory-test-mode-support.patch +++ /dev/null @@ -1,850 +0,0 @@ -From b43310e44edc823a7f02af1e1e2b4e8a9abc7d91 Mon Sep 17 00:00:00 2001 -From: Govindaraj Saminathan -Date: Fri, 26 May 2023 12:41:07 +0300 -Subject: [PATCH 83/84] wifi: ath11k: factory test mode support - -Add support to process factory test mode commands (FTM) for calibration. -By default firmware start with NORMAL mode and to process the FTM commands -firmware needs to be restarted in FTM mode using module parameter ftm_mode. -The pre-request is all the radios should be down before starting the test. - -When start command ATH11K_TM_CMD_TESTMODE_START is received, ar->state -is set to Test Mode. If the FTM command or event length is greater -than 256 bytes, it will be broken down into multiple segments and -encoded with TLV header if it is segmented commands, else it is sent -to firmware as it is. - -On receiving UTF event from firmware, if it is segmented event, the driver -will wait until it receives all the segments and notify the complete -data to user application. In case the segmented sequence are missed or -lost from the firmware, driver will skip the already received partial data. - -In case of unsegmented UTF event from firmware, driver notifies the -data to the user application as it comes. Applications handles -the data further. - -Command to boot in ftm mode: - -insmod ath11k ftm_mode=1 - -Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1 - -Signed-off-by: Govindaraj Saminathan -Co-developed-by: Sowmiya Sree Elavalagan -Signed-off-by: Sowmiya Sree Elavalagan -Signed-off-by: Raj Kumar Bhagat -Signed-off-by: Kalle Valo -Link: https://lore.kernel.org/r/20230517135934.16408-4-quic_rajkbhag@quicinc.com ---- - drivers/net/wireless/ath/ath11k/ahb.c | 3 +- - drivers/net/wireless/ath/ath11k/core.c | 21 +- - drivers/net/wireless/ath/ath11k/core.h | 16 +- - drivers/net/wireless/ath/ath11k/debug.h | 1 + - drivers/net/wireless/ath/ath11k/mac.c | 11 +- - drivers/net/wireless/ath/ath11k/pci.c | 3 +- - drivers/net/wireless/ath/ath11k/testmode.c | 350 ++++++++++++++++++- - drivers/net/wireless/ath/ath11k/testmode.h | 6 + - drivers/net/wireless/ath/ath11k/testmode_i.h | 18 +- - drivers/net/wireless/ath/ath11k/wmi.c | 11 +- - drivers/net/wireless/ath/ath11k/wmi.h | 22 ++ - drivers/net/wireless/ath/ath11k/wow.c | 3 +- - 12 files changed, 444 insertions(+), 21 deletions(-) - ---- a/drivers/net/wireless/ath/ath11k/ahb.c -+++ b/drivers/net/wireless/ath/ath11k/ahb.c -@@ -1,7 +1,7 @@ - // SPDX-License-Identifier: BSD-3-Clause-Clear - /* - * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved. -- * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. -+ * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved. - */ - - #include -@@ -1155,6 +1155,7 @@ static int ath11k_ahb_probe(struct platf - ab->hif.ops = hif_ops; - ab->pdev = pdev; - ab->hw_rev = hw_rev; -+ ab->fw_mode = ATH11K_FIRMWARE_MODE_NORMAL; - platform_set_drvdata(pdev, ab); - - ret = ath11k_pcic_register_pci_ops(ab, pci_ops); ---- a/drivers/net/wireless/ath/ath11k/core.c -+++ b/drivers/net/wireless/ath/ath11k/core.c -@@ -1,7 +1,7 @@ - // SPDX-License-Identifier: BSD-3-Clause-Clear - /* - * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved. -- * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved. -+ * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved. - */ - - #include -@@ -32,6 +32,10 @@ module_param_named(frame_mode, ath11k_fr - MODULE_PARM_DESC(frame_mode, - "Datapath frame mode (0: raw, 1: native wifi (default), 2: ethernet)"); - -+bool ath11k_ftm_mode; -+module_param_named(ftm_mode, ath11k_ftm_mode, bool, 0444); -+MODULE_PARM_DESC(ftm_mode, "Boots up in factory test mode"); -+ - 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 - { - int ret; - -+ if (ath11k_ftm_mode) { -+ ab->fw_mode = ATH11K_FIRMWARE_MODE_FTM; -+ ath11k_info(ab, "Booting in factory test mode\n"); -+ } -+ - 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; - -- 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 - for (i = 0; i < ab->num_radios; i++) { - pdev = &ab->pdevs[i]; - ar = pdev->ar; -- if (!ar || ar->state == ATH11K_STATE_OFF) -+ if (!ar || ar->state == ATH11K_STATE_OFF || -+ ar->state == ATH11K_STATE_FTM) - continue; - - ieee80211_stop_queues(ar->hw); -@@ -1841,7 +1851,12 @@ static void ath11k_core_post_reconfigure - ath11k_warn(ab, - "device is wedged, will not restart radio %d\n", i); - break; -+ case ATH11K_STATE_FTM: -+ ath11k_dbg(ab, ATH11K_DBG_TESTMODE, -+ "fw mode reset done radio %d\n", i); -+ break; - } -+ - mutex_unlock(&ar->conf_mutex); - } - complete(&ab->driver_recovery); ---- a/drivers/net/wireless/ath/ath11k/core.h -+++ b/drivers/net/wireless/ath/ath11k/core.h -@@ -1,7 +1,7 @@ - /* SPDX-License-Identifier: BSD-3-Clause-Clear */ - /* - * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved. -- * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved. -+ * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved. - */ - - #ifndef ATH11K_CORE_H -@@ -52,6 +52,7 @@ - #define ATH11K_SMBIOS_BDF_EXT_MAGIC "BDF_" - - extern unsigned int ath11k_frame_mode; -+extern bool ath11k_ftm_mode; - - #define ATH11K_SCAN_TIMEOUT_HZ (20 * HZ) - -@@ -277,6 +278,7 @@ enum ath11k_dev_flags { - ATH11K_FLAG_FIXED_MEM_RGN, - ATH11K_FLAG_DEVICE_INIT_DONE, - ATH11K_FLAG_MULTI_MSI_VECTORS, -+ ATH11K_FLAG_FTM_SEGMENTED, - }; - - enum ath11k_monitor_flags { -@@ -530,6 +532,7 @@ enum ath11k_state { - ATH11K_STATE_RESTARTING, - ATH11K_STATE_RESTARTED, - ATH11K_STATE_WEDGED, -+ ATH11K_STATE_FTM, - /* Add other states as required */ - }; - -@@ -709,6 +712,8 @@ struct ath11k { - u32 last_ppdu_id; - u32 cached_ppdu_id; - int monitor_vdev_id; -+ struct completion fw_mode_reset; -+ u8 ftm_msgref; - #ifdef CPTCFG_ATH11K_DEBUGFS - struct ath11k_debug debug; - #endif -@@ -838,6 +843,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; -+ enum ath11k_firmware_mode fw_mode; - struct platform_device *pdev; - struct device *dev; - struct ath11k_qmi qmi; -@@ -978,6 +984,14 @@ struct ath11k_base { - const struct ath11k_pci_ops *ops; - } pci; - -+#ifdef CPTCFG_NL80211_TESTMODE -+ struct { -+ u32 data_pos; -+ u32 expected_seq; -+ u8 *eventdata; -+ } testmode; -+#endif -+ - /* must be last */ - u8 drv_priv[] __aligned(sizeof(void *)); - }; ---- a/drivers/net/wireless/ath/ath11k/debug.h -+++ b/drivers/net/wireless/ath/ath11k/debug.h -@@ -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. - */ - - #ifndef _ATH11K_DEBUG_H_ ---- a/drivers/net/wireless/ath/ath11k/mac.c -+++ b/drivers/net/wireless/ath/ath11k/mac.c -@@ -643,7 +643,10 @@ struct ath11k *ath11k_mac_get_ar_by_pdev - return NULL; - - for (i = 0; i < ab->num_radios; i++) { -- pdev = rcu_dereference(ab->pdevs_active[i]); -+ if (ab->fw_mode == ATH11K_FIRMWARE_MODE_FTM) -+ pdev = &ab->pdevs[i]; -+ else -+ pdev = rcu_dereference(ab->pdevs_active[i]); - - if (pdev && pdev->pdev_id == pdev_id) - return (pdev->ar ? pdev->ar : NULL); -@@ -6271,6 +6274,11 @@ static int ath11k_mac_op_start(struct ie - struct ath11k_pdev *pdev = ar->pdev; - int ret; - -+ if (ath11k_ftm_mode) { -+ ath11k_warn(ab, "mac operations not supported in factory test mode\n"); -+ return -EOPNOTSUPP; -+ } -+ - ath11k_mac_drain_tx(ar); - mutex_lock(&ar->conf_mutex); - -@@ -6285,6 +6293,7 @@ static int ath11k_mac_op_start(struct ie - case ATH11K_STATE_RESTARTED: - case ATH11K_STATE_WEDGED: - case ATH11K_STATE_ON: -+ case ATH11K_STATE_FTM: - WARN_ON(1); - ret = -EINVAL; - goto err; ---- a/drivers/net/wireless/ath/ath11k/pci.c -+++ b/drivers/net/wireless/ath/ath11k/pci.c -@@ -1,7 +1,7 @@ - // SPDX-License-Identifier: BSD-3-Clause-Clear - /* - * Copyright (c) 2019-2020 The Linux Foundation. All rights reserved. -- * Copyright (c) 2021-2022, Qualcomm Innovation Center, Inc. All rights reserved. -+ * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved. - */ - - #include -@@ -745,6 +745,7 @@ static int ath11k_pci_probe(struct pci_d - ab_pci->ab = ab; - ab_pci->pdev = pdev; - ab->hif.ops = &ath11k_pci_hif_ops; -+ ab->fw_mode = ATH11K_FIRMWARE_MODE_NORMAL; - pci_set_drvdata(pdev, ab); - spin_lock_init(&ab_pci->window_lock); - ---- a/drivers/net/wireless/ath/ath11k/testmode.c -+++ b/drivers/net/wireless/ath/ath11k/testmode.c -@@ -12,6 +12,9 @@ - #include "core.h" - #include "testmode_i.h" - -+#define ATH11K_FTM_SEGHDR_CURRENT_SEQ GENMASK(3, 0) -+#define ATH11K_FTM_SEGHDR_TOTAL_SEGMENTS GENMASK(7, 4) -+ - static const struct nla_policy ath11k_tm_policy[ATH11K_TM_ATTR_MAX + 1] = { - [ATH11K_TM_ATTR_CMD] = { .type = NLA_U32 }, - [ATH11K_TM_ATTR_DATA] = { .type = NLA_BINARY, -@@ -21,13 +24,217 @@ static const struct nla_policy ath11k_tm - [ATH11K_TM_ATTR_VERSION_MINOR] = { .type = NLA_U32 }, - }; - -+static struct ath11k *ath11k_tm_get_ar(struct ath11k_base *ab) -+{ -+ struct ath11k_pdev *pdev; -+ struct ath11k *ar = NULL; -+ int i; -+ -+ for (i = 0; i < ab->num_radios; i++) { -+ pdev = &ab->pdevs[i]; -+ ar = pdev->ar; -+ -+ if (ar && ar->state == ATH11K_STATE_FTM) -+ break; -+ } -+ -+ return ar; -+} -+ -+/* This function handles unsegmented events. Data in various events are aggregated -+ * in application layer, this event is unsegmented from host perspective. -+ */ -+static void ath11k_tm_wmi_event_unsegmented(struct ath11k_base *ab, u32 cmd_id, -+ struct sk_buff *skb) -+{ -+ struct sk_buff *nl_skb; -+ struct ath11k *ar; -+ -+ ath11k_dbg(ab, ATH11K_DBG_TESTMODE, -+ "event wmi cmd_id %d skb length %d\n", -+ cmd_id, skb->len); -+ ath11k_dbg_dump(ab, ATH11K_DBG_TESTMODE, NULL, "", skb->data, skb->len); -+ -+ ar = ath11k_tm_get_ar(ab); -+ if (!ar) { -+ ath11k_warn(ab, "testmode event not handled due to invalid pdev\n"); -+ return; -+ } -+ -+ spin_lock_bh(&ar->data_lock); -+ -+ nl_skb = cfg80211_testmode_alloc_event_skb(ar->hw->wiphy, -+ 2 * nla_total_size(sizeof(u32)) + -+ nla_total_size(skb->len), -+ GFP_ATOMIC); -+ if (!nl_skb) { -+ ath11k_warn(ab, -+ "failed to allocate skb for unsegmented testmode wmi event\n"); -+ goto out; -+ } -+ -+ if (nla_put_u32(nl_skb, ATH11K_TM_ATTR_CMD, ATH11K_TM_CMD_WMI) || -+ nla_put_u32(nl_skb, ATH11K_TM_ATTR_WMI_CMDID, cmd_id) || -+ nla_put(nl_skb, ATH11K_TM_ATTR_DATA, skb->len, skb->data)) { -+ ath11k_warn(ab, "failed to populate testmode unsegmented event\n"); -+ kfree_skb(nl_skb); -+ goto out; -+ } -+ -+ cfg80211_testmode_event(nl_skb, GFP_ATOMIC); -+ spin_unlock_bh(&ar->data_lock); -+ return; -+ -+out: -+ spin_unlock_bh(&ar->data_lock); -+ ath11k_warn(ab, "Failed to send testmode event to higher layers\n"); -+} -+ -+/* This function handles segmented events. Data of various events received -+ * from firmware is aggregated and sent to application layer -+ */ -+static int ath11k_tm_process_event(struct ath11k_base *ab, u32 cmd_id, -+ const struct wmi_ftm_event_msg *ftm_msg, -+ u16 length) -+{ -+ struct sk_buff *nl_skb; -+ int ret = 0; -+ struct ath11k *ar; -+ u8 const *buf_pos; -+ u16 datalen; -+ u8 total_segments, current_seq; -+ u32 data_pos; -+ u32 pdev_id; -+ -+ ath11k_dbg(ab, ATH11K_DBG_TESTMODE, -+ "event wmi cmd_id %d ftm event msg %pK datalen %d\n", -+ cmd_id, ftm_msg, length); -+ ath11k_dbg_dump(ab, ATH11K_DBG_TESTMODE, NULL, "", ftm_msg, length); -+ pdev_id = DP_HW2SW_MACID(ftm_msg->seg_hdr.pdev_id); -+ -+ if (pdev_id >= ab->num_radios) { -+ ath11k_warn(ab, "testmode event not handled due to invalid pdev id: %d\n", -+ pdev_id); -+ return -EINVAL; -+ } -+ -+ ar = ab->pdevs[pdev_id].ar; -+ if (!ar) { -+ ath11k_warn(ab, "testmode event not handled due to absence of pdev\n"); -+ return -ENODEV; -+ } -+ -+ current_seq = FIELD_GET(ATH11K_FTM_SEGHDR_CURRENT_SEQ, -+ ftm_msg->seg_hdr.segmentinfo); -+ total_segments = FIELD_GET(ATH11K_FTM_SEGHDR_TOTAL_SEGMENTS, -+ ftm_msg->seg_hdr.segmentinfo); -+ datalen = length - (sizeof(struct wmi_ftm_seg_hdr)); -+ buf_pos = ftm_msg->data; -+ -+ spin_lock_bh(&ar->data_lock); -+ -+ if (current_seq == 0) { -+ ab->testmode.expected_seq = 0; -+ ab->testmode.data_pos = 0; -+ } -+ -+ data_pos = ab->testmode.data_pos; -+ -+ if ((data_pos + datalen) > ATH11K_FTM_EVENT_MAX_BUF_LENGTH) { -+ ath11k_warn(ab, "Invalid ftm event length at %d: %d\n", -+ data_pos, datalen); -+ ret = -EINVAL; -+ goto out; -+ } -+ -+ memcpy(&ab->testmode.eventdata[data_pos], buf_pos, datalen); -+ data_pos += datalen; -+ -+ if (++ab->testmode.expected_seq != total_segments) { -+ ab->testmode.data_pos = data_pos; -+ ath11k_dbg(ab, ATH11K_DBG_TESTMODE, -+ "partial data received current_seq %d total_seg %d\n", -+ current_seq, total_segments); -+ goto out; -+ } -+ -+ ath11k_dbg(ab, ATH11K_DBG_TESTMODE, -+ "total data length pos %d len %d\n", -+ data_pos, ftm_msg->seg_hdr.len); -+ nl_skb = cfg80211_testmode_alloc_event_skb(ar->hw->wiphy, -+ 2 * nla_total_size(sizeof(u32)) + -+ nla_total_size(data_pos), -+ GFP_ATOMIC); -+ if (!nl_skb) { -+ ath11k_warn(ab, -+ "failed to allocate skb for segmented testmode wmi event\n"); -+ ret = -ENOMEM; -+ goto out; -+ } -+ -+ if (nla_put_u32(nl_skb, ATH11K_TM_ATTR_CMD, -+ ATH11K_TM_CMD_WMI_FTM) || -+ nla_put_u32(nl_skb, ATH11K_TM_ATTR_WMI_CMDID, cmd_id) || -+ nla_put(nl_skb, ATH11K_TM_ATTR_DATA, data_pos, -+ &ab->testmode.eventdata[0])) { -+ ath11k_warn(ab, "failed to populate segmented testmode event"); -+ kfree_skb(nl_skb); -+ ret = -ENOBUFS; -+ goto out; -+ } -+ -+ cfg80211_testmode_event(nl_skb, GFP_ATOMIC); -+ -+out: -+ spin_unlock_bh(&ar->data_lock); -+ return ret; -+} -+ -+static void ath11k_tm_wmi_event_segmented(struct ath11k_base *ab, u32 cmd_id, -+ struct sk_buff *skb) -+{ -+ const void **tb; -+ const struct wmi_ftm_event_msg *ev; -+ u16 length; -+ int ret; -+ -+ tb = ath11k_wmi_tlv_parse_alloc(ab, skb->data, skb->len, GFP_ATOMIC); -+ if (IS_ERR(tb)) { -+ ret = PTR_ERR(tb); -+ ath11k_warn(ab, "failed to parse ftm event tlv: %d\n", ret); -+ return; -+ } -+ -+ ev = tb[WMI_TAG_ARRAY_BYTE]; -+ if (!ev) { -+ ath11k_warn(ab, "failed to fetch ftm msg\n"); -+ kfree(tb); -+ return; -+ } -+ -+ length = skb->len - TLV_HDR_SIZE; -+ ret = ath11k_tm_process_event(ab, cmd_id, ev, length); -+ if (ret) -+ ath11k_warn(ab, "Failed to process ftm event\n"); -+ -+ kfree(tb); -+} -+ -+void ath11k_tm_wmi_event(struct ath11k_base *ab, u32 cmd_id, struct sk_buff *skb) -+{ -+ if (test_bit(ATH11K_FLAG_FTM_SEGMENTED, &ab->dev_flags)) -+ ath11k_tm_wmi_event_segmented(ab, cmd_id, skb); -+ else -+ ath11k_tm_wmi_event_unsegmented(ab, cmd_id, skb); -+} -+ - static int ath11k_tm_cmd_get_version(struct ath11k *ar, struct nlattr *tb[]) - { - struct sk_buff *skb; - int ret; - - ath11k_dbg(ar->ab, ATH11K_DBG_TESTMODE, -- "testmode cmd get version_major %d version_minor %d\n", -+ "cmd get version_major %d version_minor %d\n", - ATH11K_TESTMODE_VERSION_MAJOR, - ATH11K_TESTMODE_VERSION_MINOR); - -@@ -53,6 +260,43 @@ static int ath11k_tm_cmd_get_version(str - return cfg80211_testmode_reply(skb); - } - -+static int ath11k_tm_cmd_testmode_start(struct ath11k *ar, struct nlattr *tb[]) -+{ -+ int ret; -+ -+ mutex_lock(&ar->conf_mutex); -+ -+ if (ar->state == ATH11K_STATE_FTM) { -+ ret = -EALREADY; -+ goto err; -+ } -+ -+ /* start utf only when the driver is not in use */ -+ if (ar->state != ATH11K_STATE_OFF) { -+ ret = -EBUSY; -+ goto err; -+ } -+ -+ ar->ab->testmode.eventdata = kzalloc(ATH11K_FTM_EVENT_MAX_BUF_LENGTH, -+ GFP_KERNEL); -+ if (!ar->ab->testmode.eventdata) { -+ ret = -ENOMEM; -+ goto err; -+ } -+ -+ ar->state = ATH11K_STATE_FTM; -+ ar->ftm_msgref = 0; -+ -+ mutex_unlock(&ar->conf_mutex); -+ -+ ath11k_dbg(ar->ab, ATH11K_DBG_TESTMODE, "cmd start\n"); -+ return 0; -+ -+err: -+ mutex_unlock(&ar->conf_mutex); -+ return ret; -+} -+ - static int ath11k_tm_cmd_wmi(struct ath11k *ar, struct nlattr *tb[]) - { - struct ath11k_pdev_wmi *wmi = ar->wmi; -@@ -63,11 +307,6 @@ static int ath11k_tm_cmd_wmi(struct ath1 - - mutex_lock(&ar->conf_mutex); - -- if (ar->state != ATH11K_STATE_ON) { -- ret = -ENETDOWN; -- goto out; -- } -- - if (!tb[ATH11K_TM_ATTR_DATA]) { - ret = -EINVAL; - goto out; -@@ -80,11 +319,17 @@ static int ath11k_tm_cmd_wmi(struct ath1 - - buf = nla_data(tb[ATH11K_TM_ATTR_DATA]); - buf_len = nla_len(tb[ATH11K_TM_ATTR_DATA]); -+ if (!buf_len) { -+ ath11k_warn(ar->ab, "No data present in testmode wmi command\n"); -+ ret = -EINVAL; -+ goto out; -+ } -+ - cmd_id = nla_get_u32(tb[ATH11K_TM_ATTR_WMI_CMDID]); - - ath11k_dbg(ar->ab, ATH11K_DBG_TESTMODE, -- "testmode cmd wmi cmd_id %d buf %pK buf_len %d\n", -- cmd_id, buf, buf_len); -+ "cmd wmi cmd_id %d buf length %d\n", -+ cmd_id, buf_len); - - ath11k_dbg_dump(ar->ab, ATH11K_DBG_TESTMODE, NULL, "", buf, buf_len); - -@@ -111,6 +356,91 @@ out: - return ret; - } - -+static int ath11k_tm_cmd_wmi_ftm(struct ath11k *ar, struct nlattr *tb[]) -+{ -+ struct ath11k_pdev_wmi *wmi = ar->wmi; -+ struct ath11k_base *ab = ar->ab; -+ struct sk_buff *skb; -+ u32 cmd_id, buf_len, hdr_info; -+ int ret; -+ void *buf; -+ u8 segnumber = 0, seginfo; -+ u16 chunk_len, total_bytes, num_segments; -+ u8 *bufpos; -+ struct wmi_ftm_cmd *ftm_cmd; -+ -+ set_bit(ATH11K_FLAG_FTM_SEGMENTED, &ab->dev_flags); -+ -+ mutex_lock(&ar->conf_mutex); -+ -+ if (ar->state != ATH11K_STATE_FTM) { -+ ret = -ENETDOWN; -+ goto out; -+ } -+ -+ if (!tb[ATH11K_TM_ATTR_DATA]) { -+ ret = -EINVAL; -+ goto out; -+ } -+ -+ buf = nla_data(tb[ATH11K_TM_ATTR_DATA]); -+ buf_len = nla_len(tb[ATH11K_TM_ATTR_DATA]); -+ cmd_id = WMI_PDEV_UTF_CMDID; -+ -+ ath11k_dbg(ar->ab, ATH11K_DBG_TESTMODE, -+ "cmd wmi ftm cmd_id %d buffer length %d\n", -+ cmd_id, buf_len); -+ ath11k_dbg_dump(ar->ab, ATH11K_DBG_TESTMODE, NULL, "", buf, buf_len); -+ -+ bufpos = buf; -+ total_bytes = buf_len; -+ num_segments = total_bytes / MAX_WMI_UTF_LEN; -+ -+ if (buf_len - (num_segments * MAX_WMI_UTF_LEN)) -+ num_segments++; -+ -+ while (buf_len) { -+ chunk_len = min_t(u16, buf_len, MAX_WMI_UTF_LEN); -+ -+ skb = ath11k_wmi_alloc_skb(wmi->wmi_ab, (chunk_len + -+ sizeof(struct wmi_ftm_cmd))); -+ if (!skb) { -+ ret = -ENOMEM; -+ goto out; -+ } -+ -+ ftm_cmd = (struct wmi_ftm_cmd *)skb->data; -+ hdr_info = FIELD_PREP(WMI_TLV_TAG, WMI_TAG_ARRAY_BYTE) | -+ FIELD_PREP(WMI_TLV_LEN, (chunk_len + -+ sizeof(struct wmi_ftm_seg_hdr))); -+ ftm_cmd->tlv_header = hdr_info; -+ ftm_cmd->seg_hdr.len = total_bytes; -+ ftm_cmd->seg_hdr.msgref = ar->ftm_msgref; -+ seginfo = FIELD_PREP(ATH11K_FTM_SEGHDR_TOTAL_SEGMENTS, num_segments) | -+ FIELD_PREP(ATH11K_FTM_SEGHDR_CURRENT_SEQ, segnumber); -+ ftm_cmd->seg_hdr.segmentinfo = seginfo; -+ segnumber++; -+ -+ memcpy(&ftm_cmd->data, bufpos, chunk_len); -+ -+ ret = ath11k_wmi_cmd_send(wmi, skb, cmd_id); -+ if (ret) { -+ ath11k_warn(ar->ab, "failed to send wmi ftm command: %d\n", ret); -+ goto out; -+ } -+ -+ buf_len -= chunk_len; -+ bufpos += chunk_len; -+ } -+ -+ ar->ftm_msgref++; -+ ret = 0; -+ -+out: -+ mutex_unlock(&ar->conf_mutex); -+ return ret; -+} -+ - int ath11k_tm_cmd(struct ieee80211_hw *hw, struct ieee80211_vif *vif, - void *data, int len) - { -@@ -131,6 +461,10 @@ int ath11k_tm_cmd(struct ieee80211_hw *h - return ath11k_tm_cmd_get_version(ar, tb); - case ATH11K_TM_CMD_WMI: - return ath11k_tm_cmd_wmi(ar, tb); -+ case ATH11K_TM_CMD_TESTMODE_START: -+ return ath11k_tm_cmd_testmode_start(ar, tb); -+ case ATH11K_TM_CMD_WMI_FTM: -+ return ath11k_tm_cmd_wmi_ftm(ar, tb); - default: - return -EOPNOTSUPP; - } ---- a/drivers/net/wireless/ath/ath11k/testmode.h -+++ b/drivers/net/wireless/ath/ath11k/testmode.h -@@ -8,11 +8,17 @@ - - #ifdef CPTCFG_NL80211_TESTMODE - -+void ath11k_tm_wmi_event(struct ath11k_base *ab, 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 void ath11k_tm_wmi_event(struct ath11k_base *ab, u32 cmd_id, -+ struct sk_buff *skb) -+{ -+} -+ - static inline int ath11k_tm_cmd(struct ieee80211_hw *hw, - struct ieee80211_vif *vif, - void *data, int len) ---- a/drivers/net/wireless/ath/ath11k/testmode_i.h -+++ b/drivers/net/wireless/ath/ath11k/testmode_i.h -@@ -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. - */ - - /* "API" level of the ath11k testmode interface. Bump it after every -@@ -11,9 +12,10 @@ - /* Bump this after every _compatible_ interface change, for example - * addition of a new command or an attribute. - */ --#define ATH11K_TESTMODE_VERSION_MINOR 0 -+#define ATH11K_TESTMODE_VERSION_MINOR 1 - - #define ATH11K_TM_DATA_MAX_LEN 5000 -+#define ATH11K_FTM_EVENT_MAX_BUF_LENGTH 2048 - - enum ath11k_tm_attr { - __ATH11K_TM_ATTR_INVALID = 0, -@@ -47,4 +49,18 @@ enum ath11k_tm_cmd { - * ATH11K_TM_ATTR_DATA. - */ - ATH11K_TM_CMD_WMI = 1, -+ -+ /* Boots the UTF firmware, the netdev interface must be down at the -+ * time. -+ */ -+ ATH11K_TM_CMD_TESTMODE_START = 2, -+ -+ /* The command used to transmit a FTM WMI command to the firmware -+ * and the event to receive WMI events from the firmware. The data -+ * received only contain the payload, need to add the tlv header -+ * and send the cmd to firmware with command id WMI_PDEV_UTF_CMDID. -+ * The data payload size could be large and the driver needs to -+ * send segmented data to firmware. -+ */ -+ ATH11K_TM_CMD_WMI_FTM = 3, - }; ---- a/drivers/net/wireless/ath/ath11k/wmi.c -+++ b/drivers/net/wireless/ath/ath11k/wmi.c -@@ -1,7 +1,7 @@ - // SPDX-License-Identifier: BSD-3-Clause-Clear - /* - * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved. -- * Copyright (c) 2021, Qualcomm Innovation Center, Inc. All rights reserved. -+ * Copyright (c) 2021, 2023 Qualcomm Innovation Center, Inc. All rights reserved. - */ - #include - #include -@@ -19,6 +19,7 @@ - #include "mac.h" - #include "hw.h" - #include "peer.h" -+#include "testmode.h" - - struct wmi_tlv_policy { - size_t min_len; -@@ -237,9 +238,8 @@ static int ath11k_wmi_tlv_parse(struct a - (void *)tb); - } - --static const void ** --ath11k_wmi_tlv_parse_alloc(struct ath11k_base *ab, const void *ptr, -- size_t len, gfp_t gfp) -+const void **ath11k_wmi_tlv_parse_alloc(struct ath11k_base *ab, const void *ptr, -+ size_t len, gfp_t gfp) - { - const void **tb; - int ret; -@@ -8628,6 +8628,9 @@ static void ath11k_wmi_tlv_op_rx(struct - case WMI_PDEV_CSA_SWITCH_COUNT_STATUS_EVENTID: - ath11k_wmi_pdev_csa_switch_count_status_event(ab, skb); - break; -+ case WMI_PDEV_UTF_EVENTID: -+ ath11k_tm_wmi_event(ab, id, skb); -+ break; - case WMI_PDEV_TEMPERATURE_EVENTID: - ath11k_wmi_pdev_temperature_event(ab, skb); - break; ---- a/drivers/net/wireless/ath/ath11k/wmi.h -+++ b/drivers/net/wireless/ath/ath11k/wmi.h -@@ -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. - */ - - #ifndef ATH11K_WMI_H -@@ -68,6 +69,7 @@ struct wmi_tlv { - - #define WMI_APPEND_TO_EXISTING_CHAN_LIST_FLAG 1 - -+#define MAX_WMI_UTF_LEN 252 - #define WMI_BA_MODE_BUFFER_SIZE_256 3 - /* - * HW mode config type replicated from FW header -@@ -3564,6 +3566,24 @@ struct wmi_get_pdev_temperature_cmd { - u32 pdev_id; - } __packed; - -+struct wmi_ftm_seg_hdr { -+ u32 len; -+ u32 msgref; -+ u32 segmentinfo; -+ u32 pdev_id; -+} __packed; -+ -+struct wmi_ftm_cmd { -+ u32 tlv_header; -+ struct wmi_ftm_seg_hdr seg_hdr; -+ u8 data[]; -+} __packed; -+ -+struct wmi_ftm_event_msg { -+ struct wmi_ftm_seg_hdr seg_hdr; -+ u8 data[]; -+} __packed; -+ - #define WMI_BEACON_TX_BUFFER_SIZE 512 - - #define WMI_EMA_TMPL_IDX_SHIFT 8 -@@ -6300,6 +6320,8 @@ enum wmi_sta_keepalive_method { - #define WMI_STA_KEEPALIVE_INTERVAL_DEFAULT 30 - #define WMI_STA_KEEPALIVE_INTERVAL_DISABLE 0 - -+const void **ath11k_wmi_tlv_parse_alloc(struct ath11k_base *ab, const void *ptr, -+ size_t len, gfp_t gfp); - int ath11k_wmi_cmd_send(struct ath11k_pdev_wmi *wmi, struct sk_buff *skb, - u32 cmd_id); - struct sk_buff *ath11k_wmi_alloc_skb(struct ath11k_wmi_base *wmi_sc, u32 len); ---- a/drivers/net/wireless/ath/ath11k/wow.c -+++ b/drivers/net/wireless/ath/ath11k/wow.c -@@ -1,7 +1,7 @@ - // SPDX-License-Identifier: BSD-3-Clause-Clear - /* - * Copyright (c) 2020 The Linux Foundation. All rights reserved. -- * Copyright (c) 2022, Qualcomm Innovation Center, Inc. All rights reserved. -+ * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved. - */ - - #include -@@ -838,6 +838,7 @@ exit: - case ATH11K_STATE_RESTARTING: - case ATH11K_STATE_RESTARTED: - case ATH11K_STATE_WEDGED: -+ case ATH11K_STATE_FTM: - ath11k_warn(ar->ab, "encountered unexpected device state %d on resume, cannot recover\n", - ar->state); - ret = -EIO; diff --git a/package/kernel/mac80211/patches/ath11k/0083-wifi-ath11k-Allow-ath11k-to-boot-without-caldata-in-.patch b/package/kernel/mac80211/patches/ath11k/0083-wifi-ath11k-Allow-ath11k-to-boot-without-caldata-in-.patch deleted file mode 100644 index 5a1fa88294..0000000000 --- a/package/kernel/mac80211/patches/ath11k/0083-wifi-ath11k-Allow-ath11k-to-boot-without-caldata-in-.patch +++ /dev/null @@ -1,47 +0,0 @@ -From 8aeba427296bff6a6051686f1d139c89a0b00e4c Mon Sep 17 00:00:00 2001 -From: Sowmiya Sree Elavalagan -Date: Fri, 26 May 2023 12:41:07 +0300 -Subject: [PATCH 84/84] wifi: ath11k: Allow ath11k to boot without caldata in - ftm mode - -Currently, if ath11k is unable to load the calibration data file it will -always exit. However the calibration data may not be present in factory -test mode, so update the logic to allow the driver to execute in FTM mode -even if downloading the calibration data fails. - -Tested-on : IPQ8074 hw2.0 AHB WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1 - -Signed-off-by: Sowmiya Sree Elavalagan -Signed-off-by: Raj Kumar Bhagat -Signed-off-by: Kalle Valo -Link: https://lore.kernel.org/r/20230517135934.16408-5-quic_rajkbhag@quicinc.com ---- - drivers/net/wireless/ath/ath11k/qmi.c | 10 +++++++++- - 1 file changed, 9 insertions(+), 1 deletion(-) - ---- a/drivers/net/wireless/ath/ath11k/qmi.c -+++ b/drivers/net/wireless/ath/ath11k/qmi.c -@@ -1,7 +1,7 @@ - // SPDX-License-Identifier: BSD-3-Clause-Clear - /* - * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved. -- * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. -+ * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved. - */ - - #include -@@ -2460,6 +2460,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)) { -+ /* Caldata may not be present during first time calibration in -+ * factory hence allow to boot without loading caldata in ftm mode -+ */ -+ if (ath11k_ftm_mode) { -+ ath11k_info(ab, -+ "Booting without cal data file in factory test mode\n"); -+ return 0; -+ } - ret = PTR_ERR(fw_entry); - ath11k_warn(ab, - "qmi failed to load CAL data file:%s\n", diff --git a/package/kernel/mac80211/patches/ath11k/0084-wifi-ath11k-Add-HTT-stats-for-PHY-reset-case.patch b/package/kernel/mac80211/patches/ath11k/0084-wifi-ath11k-Add-HTT-stats-for-PHY-reset-case.patch deleted file mode 100644 index 946f5f7b57..0000000000 --- a/package/kernel/mac80211/patches/ath11k/0084-wifi-ath11k-Add-HTT-stats-for-PHY-reset-case.patch +++ /dev/null @@ -1,261 +0,0 @@ -From 2d4f9093e2d8531ad0a2bb98fe5b36dc8addf2a2 Mon Sep 17 00:00:00 2001 -From: Nidhi Jain -Date: Fri, 26 May 2023 12:41:07 +0300 -Subject: [PATCH] wifi: ath11k: Add HTT stats for PHY reset case - -New HTT stats are added with stats type 37 to -provide PHY reset stats and PHY reset counter stats. - -PHY reset stats are used to display the current -PHY-related operation information such as band, CCA -threshold, current operating channel etc., - -PHY reset counter stats are used to display the -PHY reset counter values like calibration counts, -temperature based recalibration counts etc., - -Usage: -echo 37 > /sys/kernel/debug/ieee80211/phyX/ath11k/htt_stats_type -cat /sys/kernel/debug/ieee80211/phyx/ath11k/htt_stats - -Output: - -HTT_PHY_RESET_STATS_TLV: -pdev_id = 0 -chan_mhz = 5180 -chan_band_center_freq1 = 5210 -chan_band_center_freq2 = 0 -chan_phy_mode = 18 -chan_flags = 0x8 -chan_num = 36 -reset_cause = 0x50000 -prev_reset_cause = 0x50000 -phy_warm_reset_src = 0x0 -rx_gain_tbl_mode = 0 -xbar_val = 0xfac688 -force_calibration = 0 -phyrf_mode = 0 -phy_homechan = 0 -phy_tx_ch_mask = 0x3 -phy_rx_ch_mask = 0x3 -phybb_ini_mask = 0x5 -phyrf_ini_mask = 0x0 -phy_dfs_en_mask = 0x0 -phy_sscan_en_mask = 0x0 -phy_synth_sel_mask = 0x0 -phy_adfs_freq = 0 -cck_fir_settings = 0x0 -phy_dyn_pri_chan = 6 -cca_thresh = 0x26232020 -dyn_cca_status = 0 -rxdesense_thresh_hw = 0xcfe0afe -rxdesense_thresh_sw = 0xcfe0afe - -HTT_PHY_RESET_COUNTERS_TLV: -pdev_id = 0 -cf_active_low_fail_cnt = 0 -cf_active_low_pass_cnt = 0 -phy_off_through_vreg_cnt = 0 -force_calibration_cnt = 0 -rf_mode_switch_phy_off_cnt = 0 - -Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1 - -Signed-off-by: Nidhi Jain -Signed-off-by: Maharaja Kennadyrajan -Signed-off-by: Kalle Valo -Link: https://lore.kernel.org/r/20230517141242.2754293-1-quic_mkenna@quicinc.com ---- - .../wireless/ath/ath11k/debugfs_htt_stats.c | 114 ++++++++++++++++++ - .../wireless/ath/ath11k/debugfs_htt_stats.h | 43 +++++++ - 2 files changed, 157 insertions(+) - ---- a/drivers/net/wireless/ath/ath11k/debugfs_htt_stats.c -+++ b/drivers/net/wireless/ath/ath11k/debugfs_htt_stats.c -@@ -4011,6 +4011,114 @@ void htt_print_phy_stats_tlv(const void - stats_req->buf_len = len; - } - -+static inline void -+htt_print_phy_reset_counters_tlv(const void *tag_buf, -+ u16 tag_len, -+ struct debug_htt_stats_req *stats_req) -+{ -+ const struct htt_phy_reset_counters_tlv *htt_stats_buf = tag_buf; -+ u8 *buf = stats_req->buf; -+ u32 len = stats_req->buf_len; -+ u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE; -+ -+ if (tag_len < sizeof(*htt_stats_buf)) -+ return; -+ -+ len += scnprintf(buf + len, buf_len - len, "HTT_PHY_RESET_COUNTERS_TLV:\n"); -+ -+ len += scnprintf(buf + len, buf_len - len, "pdev_id = %u\n", -+ htt_stats_buf->pdev_id); -+ len += scnprintf(buf + len, buf_len - len, "cf_active_low_fail_cnt = %u\n", -+ htt_stats_buf->cf_active_low_fail_cnt); -+ len += scnprintf(buf + len, buf_len - len, "cf_active_low_pass_cnt = %u\n", -+ htt_stats_buf->cf_active_low_pass_cnt); -+ len += scnprintf(buf + len, buf_len - len, "phy_off_through_vreg_cnt = %u\n", -+ htt_stats_buf->phy_off_through_vreg_cnt); -+ len += scnprintf(buf + len, buf_len - len, "force_calibration_cnt = %u\n", -+ htt_stats_buf->force_calibration_cnt); -+ len += scnprintf(buf + len, buf_len - len, "rf_mode_switch_phy_off_cnt = %u\n", -+ htt_stats_buf->rf_mode_switch_phy_off_cnt); -+ -+ stats_req->buf_len = len; -+} -+ -+static inline void -+htt_print_phy_reset_stats_tlv(const void *tag_buf, -+ u16 tag_len, -+ struct debug_htt_stats_req *stats_req) -+{ -+ const struct htt_phy_reset_stats_tlv *htt_stats_buf = tag_buf; -+ u8 *buf = stats_req->buf; -+ u32 len = stats_req->buf_len; -+ u32 buf_len = ATH11K_HTT_STATS_BUF_SIZE; -+ -+ if (tag_len < sizeof(*htt_stats_buf)) -+ return; -+ -+ len += scnprintf(buf + len, buf_len - len, "HTT_PHY_RESET_STATS_TLV:\n"); -+ -+ len += scnprintf(buf + len, buf_len - len, "pdev_id = %u\n", -+ htt_stats_buf->pdev_id); -+ len += scnprintf(buf + len, buf_len - len, "chan_mhz = %u\n", -+ htt_stats_buf->chan_mhz); -+ len += scnprintf(buf + len, buf_len - len, "chan_band_center_freq1 = %u\n", -+ htt_stats_buf->chan_band_center_freq1); -+ len += scnprintf(buf + len, buf_len - len, "chan_band_center_freq2 = %u\n", -+ htt_stats_buf->chan_band_center_freq2); -+ len += scnprintf(buf + len, buf_len - len, "chan_phy_mode = %u\n", -+ htt_stats_buf->chan_phy_mode); -+ len += scnprintf(buf + len, buf_len - len, "chan_flags = 0x%0x\n", -+ htt_stats_buf->chan_flags); -+ len += scnprintf(buf + len, buf_len - len, "chan_num = %u\n", -+ htt_stats_buf->chan_num); -+ len += scnprintf(buf + len, buf_len - len, "reset_cause = 0x%0x\n", -+ htt_stats_buf->reset_cause); -+ len += scnprintf(buf + len, buf_len - len, "prev_reset_cause = 0x%0x\n", -+ htt_stats_buf->prev_reset_cause); -+ len += scnprintf(buf + len, buf_len - len, "phy_warm_reset_src = 0x%0x\n", -+ htt_stats_buf->phy_warm_reset_src); -+ len += scnprintf(buf + len, buf_len - len, "rx_gain_tbl_mode = %d\n", -+ htt_stats_buf->rx_gain_tbl_mode); -+ len += scnprintf(buf + len, buf_len - len, "xbar_val = 0x%0x\n", -+ htt_stats_buf->xbar_val); -+ len += scnprintf(buf + len, buf_len - len, "force_calibration = %u\n", -+ htt_stats_buf->force_calibration); -+ len += scnprintf(buf + len, buf_len - len, "phyrf_mode = %u\n", -+ htt_stats_buf->phyrf_mode); -+ len += scnprintf(buf + len, buf_len - len, "phy_homechan = %u\n", -+ htt_stats_buf->phy_homechan); -+ len += scnprintf(buf + len, buf_len - len, "phy_tx_ch_mask = 0x%0x\n", -+ htt_stats_buf->phy_tx_ch_mask); -+ len += scnprintf(buf + len, buf_len - len, "phy_rx_ch_mask = 0x%0x\n", -+ htt_stats_buf->phy_rx_ch_mask); -+ len += scnprintf(buf + len, buf_len - len, "phybb_ini_mask = 0x%0x\n", -+ htt_stats_buf->phybb_ini_mask); -+ len += scnprintf(buf + len, buf_len - len, "phyrf_ini_mask = 0x%0x\n", -+ htt_stats_buf->phyrf_ini_mask); -+ len += scnprintf(buf + len, buf_len - len, "phy_dfs_en_mask = 0x%0x\n", -+ htt_stats_buf->phy_dfs_en_mask); -+ len += scnprintf(buf + len, buf_len - len, "phy_sscan_en_mask = 0x%0x\n", -+ htt_stats_buf->phy_sscan_en_mask); -+ len += scnprintf(buf + len, buf_len - len, "phy_synth_sel_mask = 0x%0x\n", -+ htt_stats_buf->phy_synth_sel_mask); -+ len += scnprintf(buf + len, buf_len - len, "phy_adfs_freq = %u\n", -+ htt_stats_buf->phy_adfs_freq); -+ len += scnprintf(buf + len, buf_len - len, "cck_fir_settings = 0x%0x\n", -+ htt_stats_buf->cck_fir_settings); -+ len += scnprintf(buf + len, buf_len - len, "phy_dyn_pri_chan = %u\n", -+ htt_stats_buf->phy_dyn_pri_chan); -+ len += scnprintf(buf + len, buf_len - len, "cca_thresh = 0x%0x\n", -+ htt_stats_buf->cca_thresh); -+ len += scnprintf(buf + len, buf_len - len, "dyn_cca_status = %u\n", -+ htt_stats_buf->dyn_cca_status); -+ len += scnprintf(buf + len, buf_len - len, "rxdesense_thresh_hw = 0x%x\n", -+ htt_stats_buf->rxdesense_thresh_hw); -+ len += scnprintf(buf + len, buf_len - len, "rxdesense_thresh_sw = 0x%x\n", -+ htt_stats_buf->rxdesense_thresh_sw); -+ -+ stats_req->buf_len = len; -+} -+ - static inline - void htt_print_peer_ctrl_path_txrx_stats_tlv(const void *tag_buf, - struct debug_htt_stats_req *stats_req) -@@ -4425,6 +4533,12 @@ static int ath11k_dbg_htt_ext_stats_pars - case HTT_STATS_PHY_STATS_TAG: - htt_print_phy_stats_tlv(tag_buf, stats_req); - break; -+ case HTT_STATS_PHY_RESET_COUNTERS_TAG: -+ htt_print_phy_reset_counters_tlv(tag_buf, len, stats_req); -+ break; -+ case HTT_STATS_PHY_RESET_STATS_TAG: -+ htt_print_phy_reset_stats_tlv(tag_buf, len, stats_req); -+ break; - case HTT_STATS_PEER_CTRL_PATH_TXRX_STATS_TAG: - htt_print_peer_ctrl_path_txrx_stats_tlv(tag_buf, stats_req); - break; ---- a/drivers/net/wireless/ath/ath11k/debugfs_htt_stats.h -+++ b/drivers/net/wireless/ath/ath11k/debugfs_htt_stats.h -@@ -111,6 +111,8 @@ enum htt_tlv_tag_t { - HTT_STATS_TXBF_OFDMA_STEER_STATS_TAG = 116, - HTT_STATS_PHY_COUNTERS_TAG = 121, - HTT_STATS_PHY_STATS_TAG = 122, -+ HTT_STATS_PHY_RESET_COUNTERS_TAG = 123, -+ HTT_STATS_PHY_RESET_STATS_TAG = 124, - - HTT_STATS_MAX_TAG, - }; -@@ -1964,6 +1966,47 @@ struct htt_phy_stats_tlv { - u32 fw_run_time; - }; - -+struct htt_phy_reset_counters_tlv { -+ u32 pdev_id; -+ u32 cf_active_low_fail_cnt; -+ u32 cf_active_low_pass_cnt; -+ u32 phy_off_through_vreg_cnt; -+ u32 force_calibration_cnt; -+ u32 rf_mode_switch_phy_off_cnt; -+}; -+ -+struct htt_phy_reset_stats_tlv { -+ u32 pdev_id; -+ u32 chan_mhz; -+ u32 chan_band_center_freq1; -+ u32 chan_band_center_freq2; -+ u32 chan_phy_mode; -+ u32 chan_flags; -+ u32 chan_num; -+ u32 reset_cause; -+ u32 prev_reset_cause; -+ u32 phy_warm_reset_src; -+ u32 rx_gain_tbl_mode; -+ u32 xbar_val; -+ u32 force_calibration; -+ u32 phyrf_mode; -+ u32 phy_homechan; -+ u32 phy_tx_ch_mask; -+ u32 phy_rx_ch_mask; -+ u32 phybb_ini_mask; -+ u32 phyrf_ini_mask; -+ u32 phy_dfs_en_mask; -+ u32 phy_sscan_en_mask; -+ u32 phy_synth_sel_mask; -+ u32 phy_adfs_freq; -+ u32 cck_fir_settings; -+ u32 phy_dyn_pri_chan; -+ u32 cca_thresh; -+ u32 dyn_cca_status; -+ u32 rxdesense_thresh_hw; -+ u32 rxdesense_thresh_sw; -+}; -+ - struct htt_peer_ctrl_path_txrx_stats_tlv { - /* peer mac address */ - u8 peer_mac_addr[ETH_ALEN]; diff --git a/package/kernel/mac80211/patches/ath11k/100-wifi-ath11k-use-unique-QRTR-instance-ID.patch b/package/kernel/mac80211/patches/ath11k/100-wifi-ath11k-use-unique-QRTR-instance-ID.patch deleted file mode 100644 index 9676abb407..0000000000 --- a/package/kernel/mac80211/patches/ath11k/100-wifi-ath11k-use-unique-QRTR-instance-ID.patch +++ /dev/null @@ -1,162 +0,0 @@ -From 534a5f99d589cfa6b244b4433c192b6a278a67ff Mon Sep 17 00:00:00 2001 -From: Robert Marko -Date: Sat, 5 Nov 2022 20:15:40 +0100 -Subject: [PATCH] wifi: ath11k: use unique QRTR instance ID - -Currently, trying to use AHB + PCI/MHI cards or multiple PCI/MHI cards -will cause a clash in the QRTR instance node ID and prevent the driver -from talking via QMI to the card and thus initializing it with: -[ 9.836329] ath11k c000000.wifi: host capability request failed: 1 90 -[ 9.842047] ath11k c000000.wifi: failed to send qmi host cap: -22 - -So, in order to allow for this combination of cards, especially AHB + PCI -cards like IPQ8074 + QCN9074 (Used by me and tested on) set the desired -QRTR instance ID offset by calculating a unique one based on PCI domain -and bus ID-s and writing it to bits 7-0 of BHI_ERRDBG2 MHI register by -using the SBL state callback that is added as part of the series. -We also have to make sure that new QRTR offset is added on top of the -default QRTR instance ID-s that are currently used in the driver. - -This finally allows using AHB + PCI or multiple PCI cards on the same -system. - -Since this is not supported on QCA6390 and like, its limited to QCN9074 -which is known to support changing QRTR instance ID. - -Before: -root@libreCMC:/# qrtr-lookup - Service Version Instance Node Port - 1054 1 0 7 1 - 69 1 2 7 3 ATH10k WLAN firmware service - -After: -root@libreCMC:/# qrtr-lookup - Service Version Instance Node Port - 1054 1 0 7 1 - 69 1 2 7 3 ATH10k WLAN firmware service - 15 1 0 8 1 Test service - 69 1 8 8 2 ATH10k WLAN firmware service - -Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.5.0.1-01208-QCAHKSWPL_SILICONZ-1 -Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.5.0.1-01208-QCAHKSWPL_SILICONZ-1 - -Signed-off-by: Robert Marko ---- - drivers/net/wireless/ath/ath11k/mhi.c | 49 ++++++++++++++++++--------- - drivers/net/wireless/ath/ath11k/mhi.h | 3 ++ - drivers/net/wireless/ath/ath11k/pci.c | 9 ++++- - 3 files changed, 44 insertions(+), 17 deletions(-) - ---- a/drivers/net/wireless/ath/ath11k/mhi.c -+++ b/drivers/net/wireless/ath/ath11k/mhi.c -@@ -294,6 +294,34 @@ static void ath11k_mhi_op_runtime_put(st - { - } - -+static int ath11k_mhi_op_read_reg(struct mhi_controller *mhi_cntrl, -+ void __iomem *addr, -+ u32 *out) -+{ -+ *out = readl(addr); -+ -+ return 0; -+} -+ -+static void ath11k_mhi_op_write_reg(struct mhi_controller *mhi_cntrl, -+ void __iomem *addr, -+ u32 val) -+{ -+ writel(val, addr); -+} -+ -+static void ath11k_mhi_qrtr_instance_set(struct mhi_controller *mhi_cntrl) -+{ -+ struct ath11k_base *ab = dev_get_drvdata(mhi_cntrl->cntrl_dev); -+ -+ if (ab->hw_rev == ATH11K_HW_QCN9074_HW10) { -+ ath11k_mhi_op_write_reg(mhi_cntrl, -+ mhi_cntrl->bhi + BHI_ERRDBG2, -+ FIELD_PREP(QRTR_INSTANCE_MASK, -+ ab->qmi.service_ins_id - ab->hw_params.qmi_service_ins_id)); -+ } -+} -+ - static char *ath11k_mhi_op_callback_to_str(enum mhi_callback reason) - { - switch (reason) { -@@ -315,6 +343,8 @@ static char *ath11k_mhi_op_callback_to_s - return "MHI_CB_FATAL_ERROR"; - case MHI_CB_BW_REQ: - return "MHI_CB_BW_REQ"; -+ case MHI_CB_EE_SBL_MODE: -+ return "MHI_CB_EE_SBL_MODE"; - default: - return "UNKNOWN"; - } -@@ -336,27 +366,14 @@ static void ath11k_mhi_op_status_cb(stru - if (!(test_bit(ATH11K_FLAG_UNREGISTERING, &ab->dev_flags))) - queue_work(ab->workqueue_aux, &ab->reset_work); - break; -+ case MHI_CB_EE_SBL_MODE: -+ ath11k_mhi_qrtr_instance_set(mhi_cntrl); -+ break; - default: - break; - } - } - --static int ath11k_mhi_op_read_reg(struct mhi_controller *mhi_cntrl, -- void __iomem *addr, -- u32 *out) --{ -- *out = readl(addr); -- -- return 0; --} -- --static void ath11k_mhi_op_write_reg(struct mhi_controller *mhi_cntrl, -- void __iomem *addr, -- u32 val) --{ -- writel(val, addr); --} -- - static int ath11k_mhi_read_addr_from_dt(struct mhi_controller *mhi_ctrl) - { - struct device_node *np; ---- a/drivers/net/wireless/ath/ath11k/mhi.h -+++ b/drivers/net/wireless/ath/ath11k/mhi.h -@@ -16,6 +16,9 @@ - #define MHICTRL 0x38 - #define MHICTRL_RESET_MASK 0x2 - -+#define BHI_ERRDBG2 0x38 -+#define QRTR_INSTANCE_MASK GENMASK(7, 0) -+ - int ath11k_mhi_start(struct ath11k_pci *ar_pci); - void ath11k_mhi_stop(struct ath11k_pci *ar_pci); - int ath11k_mhi_register(struct ath11k_pci *ar_pci); ---- a/drivers/net/wireless/ath/ath11k/pci.c -+++ b/drivers/net/wireless/ath/ath11k/pci.c -@@ -370,13 +370,20 @@ static void ath11k_pci_sw_reset(struct a - static void ath11k_pci_init_qmi_ce_config(struct ath11k_base *ab) - { - struct ath11k_qmi_ce_cfg *cfg = &ab->qmi.ce_cfg; -+ struct ath11k_pci *ab_pci = ath11k_pci_priv(ab); -+ struct pci_bus *bus = ab_pci->pdev->bus; - - cfg->tgt_ce = ab->hw_params.target_ce_config; - cfg->tgt_ce_len = ab->hw_params.target_ce_count; - - cfg->svc_to_ce_map = ab->hw_params.svc_to_ce_map; - cfg->svc_to_ce_map_len = ab->hw_params.svc_to_ce_map_len; -- ab->qmi.service_ins_id = ab->hw_params.qmi_service_ins_id; -+ -+ if (ab->hw_rev == ATH11K_HW_QCN9074_HW10) { -+ ab->qmi.service_ins_id = ab->hw_params.qmi_service_ins_id + -+ (((pci_domain_nr(bus) & 0xF) << 4) | (bus->number & 0xF)); -+ } else -+ ab->qmi.service_ins_id = ab->hw_params.qmi_service_ins_id; - - ath11k_ce_get_shadow_config(ab, &cfg->shadow_reg_v2, - &cfg->shadow_reg_v2_len); diff --git a/package/kernel/mac80211/patches/ath11k/900-ath11k-control-thermal-support-via-symbol.patch b/package/kernel/mac80211/patches/ath11k/900-ath11k-control-thermal-support-via-symbol.patch deleted file mode 100644 index 342218a671..0000000000 --- a/package/kernel/mac80211/patches/ath11k/900-ath11k-control-thermal-support-via-symbol.patch +++ /dev/null @@ -1,66 +0,0 @@ -From 703d6551f71e7290619d6effe2a25a64e10538b7 Mon Sep 17 00:00:00 2001 -From: Robert Marko -Date: Thu, 15 Dec 2022 12:20:52 +0100 -Subject: [PATCH] ath11k: control thermal support via symbol - -Currently, thermal support will get built if CONFIG_THERMAL is reachable, -however this is not suitable for libreCMC as with ALL_KMODS being set to y -ATH11K_THERMAL wont get selected and so hwmon and thermal kmods wont get -pulled in resulting in a build-failure. - -So, to avoid that, lets do what is already done for ath10k and add a -config symbol into backports for enabling thermal support. - -Signed-off-by: Robert Marko ---- - drivers/net/wireless/ath/ath11k/Kconfig | 7 +++++++ - drivers/net/wireless/ath/ath11k/Makefile | 2 +- - drivers/net/wireless/ath/ath11k/thermal.h | 2 +- - local-symbols | 1 + - 4 files changed, 10 insertions(+), 2 deletions(-) - ---- a/drivers/net/wireless/ath/ath11k/Kconfig -+++ b/drivers/net/wireless/ath/ath11k/Kconfig -@@ -61,3 +61,10 @@ config ATH11K_SPECTRAL - Enable ath11k spectral scan support - - Say Y to enable access to the FFT/spectral data via debugfs. -+ -+config ATH11K_THERMAL -+ bool "ath11k thermal sensors and throttling support" -+ depends on ATH11K -+ depends on THERMAL -+ help -+ Enable ath11k thermal sensors and throttling support. ---- a/drivers/net/wireless/ath/ath11k/Makefile -+++ b/drivers/net/wireless/ath/ath11k/Makefile -@@ -22,7 +22,7 @@ ath11k-y += core.o \ - ath11k-$(CPTCFG_ATH11K_DEBUGFS) += debugfs.o debugfs_htt_stats.o debugfs_sta.o - ath11k-$(CPTCFG_NL80211_TESTMODE) += testmode.o - ath11k-$(CPTCFG_ATH11K_TRACING) += trace.o --ath11k-$(CONFIG_THERMAL) += thermal.o -+ath11k-$(CPTCFG_ATH11K_THERMAL) += thermal.o - ath11k-$(CPTCFG_ATH11K_SPECTRAL) += spectral.o - ath11k-$(CONFIG_PM) += wow.o - ---- a/drivers/net/wireless/ath/ath11k/thermal.h -+++ b/drivers/net/wireless/ath/ath11k/thermal.h -@@ -25,7 +25,7 @@ struct ath11k_thermal { - int temperature; - }; - --#if IS_REACHABLE(CONFIG_THERMAL) -+#if IS_REACHABLE(CPTCFG_ATH11K_THERMAL) - int ath11k_thermal_register(struct ath11k_base *sc); - void ath11k_thermal_unregister(struct ath11k_base *sc); - int ath11k_thermal_set_throttling(struct ath11k *ar, u32 throttle_state); ---- a/local-symbols -+++ b/local-symbols -@@ -174,6 +174,7 @@ ATH11K_DEBUG= - ATH11K_DEBUGFS= - ATH11K_TRACING= - ATH11K_SPECTRAL= -+ATH11K_THERMAL= - WLAN_VENDOR_ATMEL= - ATMEL= - PCI_ATMEL= diff --git a/package/kernel/mac80211/patches/ath11k/901-wifi-ath11k-pci-fix-compilation-in-5.16-and-older.patch b/package/kernel/mac80211/patches/ath11k/901-wifi-ath11k-pci-fix-compilation-in-5.16-and-older.patch deleted file mode 100644 index 7215656389..0000000000 --- a/package/kernel/mac80211/patches/ath11k/901-wifi-ath11k-pci-fix-compilation-in-5.16-and-older.patch +++ /dev/null @@ -1,29 +0,0 @@ -From 04178918e7f6b5f34dde81ec79ee8a1ccace3be3 Mon Sep 17 00:00:00 2001 -From: Robert Marko -Date: Mon, 17 Oct 2022 11:45:03 +0200 -Subject: [PATCH] wifi: ath11k: pci: fix compilation in 5.16 and older - -Commit ("genirq/msi, treewide: Use a named struct for PCI/MSI attributes") -changed the msi_desc structure a bit, however that is only available in -kernels 5.17 and newer, so check for kernel version to allow compilation -in 5.16 and older. - -Signed-off-by: Robert Marko ---- - drivers/net/wireless/ath/ath11k/pci.c | 4 ++++ - 1 file changed, 4 insertions(+) - ---- a/drivers/net/wireless/ath/ath11k/pci.c -+++ b/drivers/net/wireless/ath/ath11k/pci.c -@@ -458,7 +458,11 @@ static int ath11k_pci_alloc_msi(struct a - pci_read_config_dword(pci_dev, pci_dev->msi_cap + PCI_MSI_ADDRESS_LO, - &ab->pci.msi.addr_lo); - -+#if (LINUX_VERSION_CODE > KERNEL_VERSION(5, 17, 0)) - if (msi_desc->pci.msi_attrib.is_64) { -+#else -+ if (msi_desc->msi_attrib.is_64) { -+#endif - pci_read_config_dword(pci_dev, pci_dev->msi_cap + PCI_MSI_ADDRESS_HI, - &ab->pci.msi.addr_hi); - } else { diff --git a/package/kernel/mac80211/patches/ath11k/902-ath11k-Disable-coldboot-calibration-for-IPQ8074.patch b/package/kernel/mac80211/patches/ath11k/902-ath11k-Disable-coldboot-calibration-for-IPQ8074.patch deleted file mode 100644 index 5454fa75e4..0000000000 --- a/package/kernel/mac80211/patches/ath11k/902-ath11k-Disable-coldboot-calibration-for-IPQ8074.patch +++ /dev/null @@ -1,24 +0,0 @@ -From dd3b9c59cfa1e9e0b73a575f4646be905691eaef Mon Sep 17 00:00:00 2001 -From: Robert Marko -Date: Sat, 16 Oct 2021 19:34:10 +0200 -Subject: [PATCH 241/241] ath11k: Disable coldboot calibration for IPQ8074 - -There is a bug with the remoteproc reset after coldboot calibration, -so until that is resolved disabled it to allow using the radio. - -Signed-off-by: Robert Marko ---- - drivers/net/wireless/ath/ath11k/core.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/drivers/net/wireless/ath/ath11k/core.c -+++ b/drivers/net/wireless/ath/ath11k/core.c -@@ -86,7 +86,7 @@ static const struct ath11k_hw_params ath - .supports_shadow_regs = false, - .idle_ps = false, - .supports_sta_ps = false, -- .cold_boot_calib = true, -+ .cold_boot_calib = false, - .cbcal_restart_fw = true, - .fw_mem_mode = 0, - .num_vdevs = 16 + 1, diff --git a/package/kernel/mac80211/patches/ath11k/903-ath11k-support-setting-FW-memory-mode-via-DT.patch b/package/kernel/mac80211/patches/ath11k/903-ath11k-support-setting-FW-memory-mode-via-DT.patch deleted file mode 100644 index 22c2493ca9..0000000000 --- a/package/kernel/mac80211/patches/ath11k/903-ath11k-support-setting-FW-memory-mode-via-DT.patch +++ /dev/null @@ -1,74 +0,0 @@ -From fb1c40c225cbc413d82c872dd8c8af3469b2b921 Mon Sep 17 00:00:00 2001 -From: Robert Marko -Date: Fri, 16 Dec 2022 17:17:52 +0100 -Subject: [PATCH] ath11k: support setting FW memory mode via DT - -ath11k is really memory intensive for devices with less that 1GB of RAM, -so lets allow saving a significant amount of memory by setting the FW to -Mode-1 via DTS for devices that need it. - -However the drawback is reduced number of VDEV-s and peers which is a -reasonable tradeoff. - -Mode-2 allows for further reduction, but it has further restrictions. - -While we are here, lets add a print to be able to easily determine what -FW memory mode is being used. - -Signed-off-by: Robert Marko ---- - drivers/net/wireless/ath/ath11k/core.c | 28 ++++++++++++++++++++++++-- - 1 file changed, 26 insertions(+), 2 deletions(-) - ---- a/drivers/net/wireless/ath/ath11k/core.c -+++ b/drivers/net/wireless/ath/ath11k/core.c -@@ -36,7 +36,7 @@ bool ath11k_ftm_mode; - module_param_named(ftm_mode, ath11k_ftm_mode, bool, 0444); - MODULE_PARM_DESC(ftm_mode, "Boots up in factory test mode"); - --static const struct ath11k_hw_params ath11k_hw_params[] = { -+static struct ath11k_hw_params ath11k_hw_params[] = { - { - .hw_rev = ATH11K_HW_IPQ8074, - .name = "ipq8074 hw2.0", -@@ -1953,7 +1953,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; -- int i; -+ u32 fw_mem_mode; -+ int i, ret; - - for (i = 0; i < ARRAY_SIZE(ath11k_hw_params); i++) { - hw_params = &ath11k_hw_params[i]; -@@ -1969,7 +1970,30 @@ static int ath11k_init_hw_params(struct - - ab->hw_params = *hw_params; - -+ ret = of_property_read_u32(ab->dev->of_node, -+ "qcom,ath11k-fw-memory-mode", -+ &fw_mem_mode); -+ if (!ret) { -+ if (fw_mem_mode == 0) { -+ ab->hw_params.fw_mem_mode = 0; -+ ab->hw_params.num_vdevs = 16 + 1; -+ ab->hw_params.num_peers = 512; -+ } -+ else if (fw_mem_mode == 1) { -+ ab->hw_params.fw_mem_mode = 1; -+ ab->hw_params.num_vdevs = 8; -+ ab->hw_params.num_peers = 128; -+ } else if (fw_mem_mode == 2) { -+ ab->hw_params.fw_mem_mode = 2; -+ ab->hw_params.num_vdevs = 8; -+ ab->hw_params.num_peers = 128; -+ ab->hw_params.cold_boot_calib = false; -+ } else -+ ath11k_info(ab, "Unsupported FW memory mode: %u\n", fw_mem_mode); -+ } -+ - ath11k_info(ab, "%s\n", ab->hw_params.name); -+ ath11k_info(ab, "FW memory mode: %d\n", ab->hw_params.fw_mem_mode); - - return 0; - } diff --git a/package/kernel/mac80211/patches/ath11k/905-ath11k-remove-intersection-support-for-regulatory-ru.patch b/package/kernel/mac80211/patches/ath11k/905-ath11k-remove-intersection-support-for-regulatory-ru.patch deleted file mode 100644 index b0ceb00ba0..0000000000 --- a/package/kernel/mac80211/patches/ath11k/905-ath11k-remove-intersection-support-for-regulatory-ru.patch +++ /dev/null @@ -1,317 +0,0 @@ -From abdd0985a36189ef2cc0e393b027276e86137ace Mon Sep 17 00:00:00 2001 -From: Aditya Kumar Singh -Date: Tue, 11 Apr 2023 20:08:49 +0200 -Subject: [PATCH] ath11k: remove intersection support for regulatory rules - -Currently, regulatory rules from new country settings is intersected with -rules from default country settings(during initialisation) in order to prevent -users to bypass their default country settings such as power limits, channel -flags, etc. - -However, the country setting in the BDF will take higher higher precendence -and FW will protect it. Therefore, there is no need to handle intersection -on the driver side now. - -Remove regulatory rules intersection logic support. - -Signed-off-by: Aditya Kumar Singh ---- - drivers/net/wireless/ath/ath11k/reg.c | 168 +++----------------------- - drivers/net/wireless/ath/ath11k/reg.h | 2 +- - drivers/net/wireless/ath/ath11k/wmi.c | 24 +--- - 3 files changed, 16 insertions(+), 178 deletions(-) - ---- a/drivers/net/wireless/ath/ath11k/reg.c -+++ b/drivers/net/wireless/ath/ath11k/reg.c -@@ -352,129 +352,6 @@ static u32 ath11k_map_fw_reg_flags(u16 r - return flags; - } - --static bool --ath11k_reg_can_intersect(struct ieee80211_reg_rule *rule1, -- struct ieee80211_reg_rule *rule2) --{ -- u32 start_freq1, end_freq1; -- u32 start_freq2, end_freq2; -- -- start_freq1 = rule1->freq_range.start_freq_khz; -- start_freq2 = rule2->freq_range.start_freq_khz; -- -- end_freq1 = rule1->freq_range.end_freq_khz; -- end_freq2 = rule2->freq_range.end_freq_khz; -- -- if ((start_freq1 >= start_freq2 && -- start_freq1 < end_freq2) || -- (start_freq2 > start_freq1 && -- start_freq2 < end_freq1)) -- return true; -- -- /* TODO: Should we restrict intersection feasibility -- * based on min bandwidth of the intersected region also, -- * say the intersected rule should have a min bandwidth -- * of 20MHz? -- */ -- -- return false; --} -- --static void ath11k_reg_intersect_rules(struct ieee80211_reg_rule *rule1, -- struct ieee80211_reg_rule *rule2, -- struct ieee80211_reg_rule *new_rule) --{ -- u32 start_freq1, end_freq1; -- u32 start_freq2, end_freq2; -- u32 freq_diff, max_bw; -- -- start_freq1 = rule1->freq_range.start_freq_khz; -- start_freq2 = rule2->freq_range.start_freq_khz; -- -- end_freq1 = rule1->freq_range.end_freq_khz; -- end_freq2 = rule2->freq_range.end_freq_khz; -- -- new_rule->freq_range.start_freq_khz = max_t(u32, start_freq1, -- start_freq2); -- new_rule->freq_range.end_freq_khz = min_t(u32, end_freq1, end_freq2); -- -- freq_diff = new_rule->freq_range.end_freq_khz - -- new_rule->freq_range.start_freq_khz; -- max_bw = min_t(u32, rule1->freq_range.max_bandwidth_khz, -- rule2->freq_range.max_bandwidth_khz); -- new_rule->freq_range.max_bandwidth_khz = min_t(u32, max_bw, freq_diff); -- -- new_rule->power_rule.max_antenna_gain = -- min_t(u32, rule1->power_rule.max_antenna_gain, -- rule2->power_rule.max_antenna_gain); -- -- new_rule->power_rule.max_eirp = min_t(u32, rule1->power_rule.max_eirp, -- rule2->power_rule.max_eirp); -- -- /* Use the flags of both the rules */ -- new_rule->flags = rule1->flags | rule2->flags; -- -- /* To be safe, lts use the max cac timeout of both rules */ -- new_rule->dfs_cac_ms = max_t(u32, rule1->dfs_cac_ms, -- rule2->dfs_cac_ms); --} -- --static struct ieee80211_regdomain * --ath11k_regd_intersect(struct ieee80211_regdomain *default_regd, -- struct ieee80211_regdomain *curr_regd) --{ -- u8 num_old_regd_rules, num_curr_regd_rules, num_new_regd_rules; -- struct ieee80211_reg_rule *old_rule, *curr_rule, *new_rule; -- struct ieee80211_regdomain *new_regd = NULL; -- u8 i, j, k; -- -- num_old_regd_rules = default_regd->n_reg_rules; -- num_curr_regd_rules = curr_regd->n_reg_rules; -- num_new_regd_rules = 0; -- -- /* Find the number of intersecting rules to allocate new regd memory */ -- for (i = 0; i < num_old_regd_rules; i++) { -- old_rule = default_regd->reg_rules + i; -- for (j = 0; j < num_curr_regd_rules; j++) { -- curr_rule = curr_regd->reg_rules + j; -- -- if (ath11k_reg_can_intersect(old_rule, curr_rule)) -- num_new_regd_rules++; -- } -- } -- -- if (!num_new_regd_rules) -- return NULL; -- -- new_regd = kzalloc(sizeof(*new_regd) + (num_new_regd_rules * -- sizeof(struct ieee80211_reg_rule)), -- GFP_ATOMIC); -- -- if (!new_regd) -- return NULL; -- -- /* We set the new country and dfs region directly and only trim -- * the freq, power, antenna gain by intersecting with the -- * default regdomain. Also MAX of the dfs cac timeout is selected. -- */ -- new_regd->n_reg_rules = num_new_regd_rules; -- memcpy(new_regd->alpha2, curr_regd->alpha2, sizeof(new_regd->alpha2)); -- new_regd->dfs_region = curr_regd->dfs_region; -- new_rule = new_regd->reg_rules; -- -- for (i = 0, k = 0; i < num_old_regd_rules; i++) { -- old_rule = default_regd->reg_rules + i; -- for (j = 0; j < num_curr_regd_rules; j++) { -- curr_rule = curr_regd->reg_rules + j; -- -- if (ath11k_reg_can_intersect(old_rule, curr_rule)) -- ath11k_reg_intersect_rules(old_rule, curr_rule, -- (new_rule + k++)); -- } -- } -- return new_regd; --} -- - static const char * - ath11k_reg_get_regdom_str(enum nl80211_dfs_regions dfs_region) - { -@@ -609,9 +486,9 @@ ath11k_reg_update_weather_radar_band(str - - struct ieee80211_regdomain * - ath11k_reg_build_regd(struct ath11k_base *ab, -- struct cur_regulatory_info *reg_info, bool intersect) -+ struct cur_regulatory_info *reg_info) - { -- struct ieee80211_regdomain *tmp_regd, *default_regd, *new_regd = NULL; -+ struct ieee80211_regdomain *new_regd = NULL; - struct cur_reg_rule *reg_rule; - u8 i = 0, j = 0, k = 0; - u8 num_rules; -@@ -628,26 +505,26 @@ ath11k_reg_build_regd(struct ath11k_base - num_rules += reg_info->num_6ghz_rules_ap[WMI_REG_INDOOR_AP]; - - if (!num_rules) -- goto ret; -+ return new_regd; - - /* Add max additional rules to accommodate weather radar band */ - if (reg_info->dfs_region == ATH11K_DFS_REG_ETSI) - num_rules += 2; - -- tmp_regd = kzalloc(sizeof(*tmp_regd) + -+ new_regd = kzalloc(sizeof(*new_regd) + - (num_rules * sizeof(struct ieee80211_reg_rule)), - GFP_ATOMIC); -- if (!tmp_regd) -- goto ret; -+ if (!new_regd) -+ return new_regd; - -- memcpy(tmp_regd->alpha2, reg_info->alpha2, REG_ALPHA2_LEN + 1); -+ memcpy(new_regd->alpha2, reg_info->alpha2, REG_ALPHA2_LEN + 1); - memcpy(alpha2, reg_info->alpha2, REG_ALPHA2_LEN + 1); - alpha2[2] = '\0'; -- tmp_regd->dfs_region = ath11k_map_fw_dfs_region(reg_info->dfs_region); -+ new_regd->dfs_region = ath11k_map_fw_dfs_region(reg_info->dfs_region); - - ath11k_dbg(ab, ATH11K_DBG_REG, - "Country %s, CFG Regdomain %s FW Regdomain %d, num_reg_rules %d\n", -- alpha2, ath11k_reg_get_regdom_str(tmp_regd->dfs_region), -+ alpha2, ath11k_reg_get_regdom_str(new_regd->dfs_region), - reg_info->dfs_region, num_rules); - /* Update reg_rules[] below. Firmware is expected to - * send these rules in order(2 GHz rules first and then 5 GHz) -@@ -686,7 +563,7 @@ ath11k_reg_build_regd(struct ath11k_base - - flags |= ath11k_map_fw_reg_flags(reg_rule->flags); - -- ath11k_reg_update_rule(tmp_regd->reg_rules + i, -+ ath11k_reg_update_rule(new_regd->reg_rules + i, - reg_rule->start_freq, - reg_rule->end_freq, max_bw, - reg_rule->ant_gain, reg_rule->reg_power, -@@ -701,7 +578,7 @@ ath11k_reg_build_regd(struct ath11k_base - reg_info->dfs_region == ATH11K_DFS_REG_ETSI && - (reg_rule->end_freq > ETSI_WEATHER_RADAR_BAND_LOW && - reg_rule->start_freq < ETSI_WEATHER_RADAR_BAND_HIGH)){ -- ath11k_reg_update_weather_radar_band(ab, tmp_regd, -+ ath11k_reg_update_weather_radar_band(ab, new_regd, - reg_rule, &i, - flags, max_bw); - continue; -@@ -712,37 +589,20 @@ ath11k_reg_build_regd(struct ath11k_base - "\t%d. (%d - %d @ %d) (%d, %d) (%d ms) (FLAGS %d) (%d, %d)\n", - i + 1, reg_rule->start_freq, reg_rule->end_freq, - max_bw, reg_rule->ant_gain, reg_rule->reg_power, -- tmp_regd->reg_rules[i].dfs_cac_ms, flags, -+ new_regd->reg_rules[i].dfs_cac_ms, flags, - reg_rule->psd_flag, reg_rule->psd_eirp); - } else { - ath11k_dbg(ab, ATH11K_DBG_REG, - "\t%d. (%d - %d @ %d) (%d, %d) (%d ms) (FLAGS %d)\n", - i + 1, reg_rule->start_freq, reg_rule->end_freq, - max_bw, reg_rule->ant_gain, reg_rule->reg_power, -- tmp_regd->reg_rules[i].dfs_cac_ms, -+ new_regd->reg_rules[i].dfs_cac_ms, - flags); - } - } - -- tmp_regd->n_reg_rules = i; -- -- if (intersect) { -- default_regd = ab->default_regd[reg_info->phy_id]; -- -- /* Get a new regd by intersecting the received regd with -- * our default regd. -- */ -- new_regd = ath11k_regd_intersect(default_regd, tmp_regd); -- kfree(tmp_regd); -- if (!new_regd) { -- ath11k_warn(ab, "Unable to create intersected regdomain\n"); -- goto ret; -- } -- } else { -- new_regd = tmp_regd; -- } -+ new_regd->n_reg_rules = i; - --ret: - return new_regd; - } - ---- a/drivers/net/wireless/ath/ath11k/reg.h -+++ b/drivers/net/wireless/ath/ath11k/reg.h -@@ -30,7 +30,7 @@ void ath11k_reg_free(struct ath11k_base - void ath11k_regd_update_work(struct work_struct *work); - struct ieee80211_regdomain * - ath11k_reg_build_regd(struct ath11k_base *ab, -- struct cur_regulatory_info *reg_info, bool intersect); -+ struct cur_regulatory_info *reg_info); - int ath11k_regd_update(struct ath11k *ar); - int ath11k_reg_update_chan_list(struct ath11k *ar, bool wait); - #endif ---- a/drivers/net/wireless/ath/ath11k/wmi.c -+++ b/drivers/net/wireless/ath/ath11k/wmi.c -@@ -6996,24 +6996,12 @@ static void ath11k_wmi_htc_tx_complete(s - wake_up(&wmi->tx_ce_desc_wq); - } - --static bool ath11k_reg_is_world_alpha(char *alpha) --{ -- if (alpha[0] == '0' && alpha[1] == '0') -- return true; -- -- if (alpha[0] == 'n' && alpha[1] == 'a') -- return true; -- -- return false; --} -- - static int ath11k_reg_chan_list_event(struct ath11k_base *ab, - struct sk_buff *skb, - enum wmi_reg_chan_list_cmd_type id) - { - struct cur_regulatory_info *reg_info = NULL; - struct ieee80211_regdomain *regd = NULL; -- bool intersect = false; - int ret = 0, pdev_idx, i, j; - struct ath11k *ar; - -@@ -7075,17 +7063,7 @@ static int ath11k_reg_chan_list_event(st - (char *)reg_info->alpha2, 2)) - goto mem_free; - -- /* Intersect new rules with default regd if a new country setting was -- * requested, i.e a default regd was already set during initialization -- * and the regd coming from this event has a valid country info. -- */ -- if (ab->default_regd[pdev_idx] && -- !ath11k_reg_is_world_alpha((char *) -- ab->default_regd[pdev_idx]->alpha2) && -- !ath11k_reg_is_world_alpha((char *)reg_info->alpha2)) -- intersect = true; -- -- regd = ath11k_reg_build_regd(ab, reg_info, intersect); -+ regd = ath11k_reg_build_regd(ab, reg_info); - if (!regd) { - ath11k_warn(ab, "failed to build regd from reg_info\n"); - goto fallback; diff --git a/package/kernel/mac80211/patches/mt7601u/001-wifi-mt7601u-update-firmware-path.patch b/package/kernel/mac80211/patches/mt7601u/001-wifi-mt7601u-update-firmware-path.patch deleted file mode 100644 index 5d982906c5..0000000000 --- a/package/kernel/mac80211/patches/mt7601u/001-wifi-mt7601u-update-firmware-path.patch +++ /dev/null @@ -1,55 +0,0 @@ -From patchwork Mon May 15 22:56:53 2023 -Content-Type: text/plain; charset="utf-8" -MIME-Version: 1.0 -Content-Transfer-Encoding: 7bit -X-Patchwork-Submitter: Daniel Golle -X-Patchwork-Id: 13242309 -X-Patchwork-Delegate: kvalo@adurom.com -Return-Path: -Date: Tue, 16 May 2023 00:56:53 +0200 -From: Daniel Golle -To: Jakub Kicinski , Kalle Valo , - "David S. Miller" , - Eric Dumazet , - Paolo Abeni , - Matthias Brugger , - AngeloGioacchino Del Regno - , - linux-wireless@vger.kernel.org, netdev@vger.kernel.org, - linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, - linux-mediatek@lists.infradead.org -Subject: [PATCH] wifi: mt7601u: update firmware path -Message-ID: - -MIME-Version: 1.0 -Content-Disposition: inline -Precedence: bulk -List-ID: -X-Mailing-List: linux-wireless@vger.kernel.org - -mt7601u.bin was moved to mediatek/ folder in linux-wireless via commit -8451c2b1 ("mt76xx: Move the old Mediatek WiFi firmware to mediatek") -and linux-firmware release 20230515. - -Update the firmware path requested by the mt7601u driver to follow up -with the move of the file. - -Signed-off-by: Daniel Golle ---- - drivers/net/wireless/mediatek/mt7601u/usb.h | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - - -base-commit: 0d9b41daa5907756a31772d8af8ac5ff25cf17c1 - ---- a/drivers/net/wireless/mediatek/mt7601u/usb.h -+++ b/drivers/net/wireless/mediatek/mt7601u/usb.h -@@ -8,7 +8,7 @@ - - #include "mt7601u.h" - --#define MT7601U_FIRMWARE "mt7601u.bin" -+#define MT7601U_FIRMWARE "mediatek/mt7601u.bin" - - #define MT_VEND_REQ_MAX_RETRY 10 - #define MT_VEND_REQ_TOUT_MS 300 diff --git a/package/kernel/mac80211/patches/rt2x00/100-rt2x00_options.patch b/package/kernel/mac80211/patches/rt2x00/100-rt2x00_options.patch deleted file mode 100644 index 295904c64e..0000000000 --- a/package/kernel/mac80211/patches/rt2x00/100-rt2x00_options.patch +++ /dev/null @@ -1,47 +0,0 @@ ---- a/drivers/net/wireless/ralink/rt2x00/Kconfig -+++ b/drivers/net/wireless/ralink/rt2x00/Kconfig -@@ -226,36 +226,37 @@ config RT2800SOC - - - config RT2800_LIB -- tristate -+ tristate "RT2800 USB/PCI support" - depends on m - - config RT2800_LIB_MMIO -- tristate -+ tristate "RT2800 MMIO support" - depends on m - select RT2X00_LIB_MMIO - select RT2800_LIB - - config RT2X00_LIB_MMIO -- tristate -+ tristate "RT2x00 MMIO support" - depends on m - - config RT2X00_LIB_PCI -- tristate -+ tristate "RT2x00 PCI support" - depends on m - select RT2X00_LIB - - config RT2X00_LIB_SOC -- tristate -+ tristate "RT2x00 SoC support" -+ depends on SOC_RT288X || SOC_RT305X || SOC_MT7620 - depends on m - select RT2X00_LIB - - config RT2X00_LIB_USB -- tristate -+ tristate "RT2x00 USB support" - depends on m - select RT2X00_LIB - - config RT2X00_LIB -- tristate -+ tristate "RT2x00 support" - depends on m - - config RT2X00_LIB_FIRMWARE diff --git a/package/kernel/mac80211/patches/rt2x00/501-rt2x00-allow-to-build-rt2800soc-module-for-RT3883.patch b/package/kernel/mac80211/patches/rt2x00/501-rt2x00-allow-to-build-rt2800soc-module-for-RT3883.patch deleted file mode 100644 index b4106b0197..0000000000 --- a/package/kernel/mac80211/patches/rt2x00/501-rt2x00-allow-to-build-rt2800soc-module-for-RT3883.patch +++ /dev/null @@ -1,30 +0,0 @@ -From 91094ed065f7794886b4a5490fd6de942f036bb4 Mon Sep 17 00:00:00 2001 -From: Gabor Juhos -Date: Sun, 24 Mar 2013 19:26:26 +0100 -Subject: [PATCH] rt2x00: allow to build rt2800soc module for RT3883 - -Signed-off-by: Gabor Juhos ---- - drivers/net/wireless/ralink/rt2x00/Kconfig | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/drivers/net/wireless/ralink/rt2x00/Kconfig -+++ b/drivers/net/wireless/ralink/rt2x00/Kconfig -@@ -211,7 +211,7 @@ endif - config RT2800SOC - tristate "Ralink WiSoC support" - depends on m -- depends on SOC_RT288X || SOC_RT305X || SOC_MT7620 -+ depends on SOC_RT288X || SOC_RT305X || SOC_RT3883 || SOC_MT7620 - select RT2X00_LIB_SOC - select RT2X00_LIB_MMIO - select RT2X00_LIB_CRYPTO -@@ -246,7 +246,7 @@ config RT2X00_LIB_PCI - - config RT2X00_LIB_SOC - tristate "RT2x00 SoC support" -- depends on SOC_RT288X || SOC_RT305X || SOC_MT7620 -+ depends on SOC_RT288X || SOC_RT305X || SOC_RT3883 || SOC_MT7620 - depends on m - select RT2X00_LIB - diff --git a/package/kernel/mac80211/patches/rt2x00/601-rt2x00-introduce-rt2x00_platform_h.patch b/package/kernel/mac80211/patches/rt2x00/601-rt2x00-introduce-rt2x00_platform_h.patch deleted file mode 100644 index 1e6211a470..0000000000 --- a/package/kernel/mac80211/patches/rt2x00/601-rt2x00-introduce-rt2x00_platform_h.patch +++ /dev/null @@ -1,32 +0,0 @@ ---- /dev/null -+++ b/include/linux/rt2x00_platform.h -@@ -0,0 +1,19 @@ -+/* -+ * Platform data definition for the rt2x00 driver -+ * -+ * Copyright (C) 2011 Gabor Juhos -+ * -+ * This program is free software; you can redistribute it and/or modify it -+ * under the terms of the GNU General Public License version 2 as published -+ * by the Free Software Foundation. -+ * -+ */ -+ -+#ifndef _RT2X00_PLATFORM_H -+#define _RT2X00_PLATFORM_H -+ -+struct rt2x00_platform_data { -+ char *eeprom_file_name; -+}; -+ -+#endif /* _RT2X00_PLATFORM_H */ ---- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h -+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h -@@ -28,6 +28,7 @@ - #include - #include - #include -+#include - - #include - diff --git a/package/kernel/mac80211/patches/rt2x00/602-rt2x00-introduce-rt2x00eeprom.patch b/package/kernel/mac80211/patches/rt2x00/602-rt2x00-introduce-rt2x00eeprom.patch deleted file mode 100644 index ab0fa3670d..0000000000 --- a/package/kernel/mac80211/patches/rt2x00/602-rt2x00-introduce-rt2x00eeprom.patch +++ /dev/null @@ -1,296 +0,0 @@ ---- a/local-symbols -+++ b/local-symbols -@@ -347,6 +347,7 @@ RT2X00_LIB_FIRMWARE= - RT2X00_LIB_CRYPTO= - RT2X00_LIB_LEDS= - RT2X00_LIB_DEBUGFS= -+RT2X00_LIB_EEPROM= - RT2X00_DEBUG= - WLAN_VENDOR_REALTEK= - RTL8180= ---- a/drivers/net/wireless/ralink/rt2x00/Kconfig -+++ b/drivers/net/wireless/ralink/rt2x00/Kconfig -@@ -70,6 +70,7 @@ config RT2800PCI - select RT2X00_LIB_MMIO - select RT2X00_LIB_PCI - select RT2X00_LIB_FIRMWARE -+ select RT2X00_LIB_EEPROM - select RT2X00_LIB_CRYPTO - depends on CRC_CCITT - depends on EEPROM_93CX6 -@@ -216,6 +217,7 @@ config RT2800SOC - select RT2X00_LIB_MMIO - select RT2X00_LIB_CRYPTO - select RT2X00_LIB_FIRMWARE -+ select RT2X00_LIB_EEPROM - select RT2800_LIB - select RT2800_LIB_MMIO - help -@@ -266,6 +268,9 @@ config RT2X00_LIB_FIRMWARE - config RT2X00_LIB_CRYPTO - bool - -+config RT2X00_LIB_EEPROM -+ bool -+ - config RT2X00_LIB_LEDS - bool - default y if (RT2X00_LIB=y && LEDS_CLASS=y) || (RT2X00_LIB=m && LEDS_CLASS!=n) ---- a/drivers/net/wireless/ralink/rt2x00/Makefile -+++ b/drivers/net/wireless/ralink/rt2x00/Makefile -@@ -8,6 +8,7 @@ rt2x00lib-$(CPTCFG_RT2X00_LIB_DEBUGFS) + - rt2x00lib-$(CPTCFG_RT2X00_LIB_CRYPTO) += rt2x00crypto.o - rt2x00lib-$(CPTCFG_RT2X00_LIB_FIRMWARE) += rt2x00firmware.o - rt2x00lib-$(CPTCFG_RT2X00_LIB_LEDS) += rt2x00leds.o -+rt2x00lib-$(CPTCFG_RT2X00_LIB_EEPROM) += rt2x00eeprom.o - - obj-$(CPTCFG_RT2X00_LIB) += rt2x00lib.o - obj-$(CPTCFG_RT2X00_LIB_MMIO) += rt2x00mmio.o ---- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.h -+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.h -@@ -47,6 +47,8 @@ struct rt2800_drv_data { - struct ieee80211_sta *wcid_to_sta[STA_IDS_SIZE]; - }; - -+#include "rt2800.h" -+ - struct rt2800_ops { - u32 (*register_read)(struct rt2x00_dev *rt2x00dev, - const unsigned int offset); -@@ -145,6 +147,15 @@ static inline int rt2800_read_eeprom(str - { - const struct rt2800_ops *rt2800ops = rt2x00dev->ops->drv; - -+ if (rt2x00dev->eeprom_file) { -+ memcpy(rt2x00dev->eeprom, rt2x00dev->eeprom_file->data, -+ EEPROM_SIZE); -+ return 0; -+ } -+ -+ if (!rt2800ops->read_eeprom) -+ return -EINVAL; -+ - return rt2800ops->read_eeprom(rt2x00dev); - } - ---- a/drivers/net/wireless/ralink/rt2x00/rt2800soc.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2800soc.c -@@ -90,19 +90,6 @@ static int rt2800soc_set_device_state(st - return retval; - } - --static int rt2800soc_read_eeprom(struct rt2x00_dev *rt2x00dev) --{ -- void __iomem *base_addr = ioremap(0x1F040000, EEPROM_SIZE); -- -- if (!base_addr) -- return -ENOMEM; -- -- memcpy_fromio(rt2x00dev->eeprom, base_addr, EEPROM_SIZE); -- -- iounmap(base_addr); -- return 0; --} -- - /* Firmware functions */ - static char *rt2800soc_get_firmware_name(struct rt2x00_dev *rt2x00dev) - { -@@ -168,7 +155,6 @@ static const struct rt2800_ops rt2800soc - .register_multiread = rt2x00mmio_register_multiread, - .register_multiwrite = rt2x00mmio_register_multiwrite, - .regbusy_read = rt2x00mmio_regbusy_read, -- .read_eeprom = rt2800soc_read_eeprom, - .hwcrypt_disabled = rt2800soc_hwcrypt_disabled, - .drv_write_firmware = rt2800soc_write_firmware, - .drv_init_registers = rt2800mmio_init_registers, ---- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h -+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h -@@ -703,6 +703,7 @@ enum rt2x00_capability_flags { - REQUIRE_HT_TX_DESC, - REQUIRE_PS_AUTOWAKE, - REQUIRE_DELAYED_RFKILL, -+ REQUIRE_EEPROM_FILE, - - /* - * Capabilities -@@ -980,6 +981,11 @@ struct rt2x00_dev { - const struct firmware *fw; - - /* -+ * EEPROM image. -+ */ -+ const struct firmware *eeprom_file; -+ -+ /* - * FIFO for storing tx status reports between isr and tasklet. - */ - DECLARE_KFIFO_PTR(txstatus_fifo, u32); ---- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c -@@ -1419,6 +1419,10 @@ int rt2x00lib_probe_dev(struct rt2x00_de - INIT_DELAYED_WORK(&rt2x00dev->autowakeup_work, rt2x00lib_autowakeup); - INIT_WORK(&rt2x00dev->sleep_work, rt2x00lib_sleep); - -+ retval = rt2x00lib_load_eeprom_file(rt2x00dev); -+ if (retval) -+ goto exit; -+ - /* - * Let the driver probe the device to detect the capabilities. - */ -@@ -1559,6 +1563,11 @@ void rt2x00lib_remove_dev(struct rt2x00_ - * Free the driver data. - */ - kfree(rt2x00dev->drv_data); -+ -+ /* -+ * Free EEPROM image. -+ */ -+ rt2x00lib_free_eeprom_file(rt2x00dev); - } - EXPORT_SYMBOL_GPL(rt2x00lib_remove_dev); - ---- /dev/null -+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00eeprom.c -@@ -0,0 +1,106 @@ -+/* -+ Copyright (C) 2004 - 2009 Ivo van Doorn -+ Copyright (C) 2004 - 2009 Gertjan van Wingerde -+ -+ -+ This program is free software; you can redistribute it and/or modify -+ it under the terms of the GNU General Public License as published by -+ the Free Software Foundation; either version 2 of the License, or -+ (at your option) any later version. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with this program; if not, write to the -+ Free Software Foundation, Inc., -+ 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -+ */ -+ -+/* -+ Module: rt2x00lib -+ Abstract: rt2x00 eeprom file loading routines. -+ */ -+ -+#include -+#include -+ -+#include "rt2x00.h" -+#include "rt2x00lib.h" -+ -+static const char * -+rt2x00lib_get_eeprom_file_name(struct rt2x00_dev *rt2x00dev) -+{ -+ struct rt2x00_platform_data *pdata = rt2x00dev->dev->platform_data; -+ -+ if (pdata && pdata->eeprom_file_name) -+ return pdata->eeprom_file_name; -+ -+ return NULL; -+} -+ -+static int rt2x00lib_request_eeprom_file(struct rt2x00_dev *rt2x00dev) -+{ -+ const struct firmware *ee; -+ const char *ee_name; -+ int retval; -+ -+ ee_name = rt2x00lib_get_eeprom_file_name(rt2x00dev); -+ if (!ee_name && test_bit(REQUIRE_EEPROM_FILE, &rt2x00dev->cap_flags)) { -+ rt2x00_err(rt2x00dev, "Required EEPROM name is missing."); -+ return -EINVAL; -+ } -+ -+ if (!ee_name) -+ return 0; -+ -+ rt2x00_info(rt2x00dev, "Loading EEPROM data from '%s'.\n", ee_name); -+ -+ retval = request_firmware(&ee, ee_name, rt2x00dev->dev); -+ if (retval) { -+ rt2x00_err(rt2x00dev, "Failed to request EEPROM.\n"); -+ return retval; -+ } -+ -+ if (!ee || !ee->size || !ee->data) { -+ rt2x00_err(rt2x00dev, "Failed to read EEPROM file.\n"); -+ retval = -ENOENT; -+ goto err_exit; -+ } -+ -+ if (ee->size != rt2x00dev->ops->eeprom_size) { -+ rt2x00_err(rt2x00dev, -+ "EEPROM file size is invalid, it should be %d bytes\n", -+ rt2x00dev->ops->eeprom_size); -+ retval = -EINVAL; -+ goto err_release_ee; -+ } -+ -+ rt2x00dev->eeprom_file = ee; -+ return 0; -+ -+err_release_ee: -+ release_firmware(ee); -+err_exit: -+ return retval; -+} -+ -+int rt2x00lib_load_eeprom_file(struct rt2x00_dev *rt2x00dev) -+{ -+ int retval; -+ -+ retval = rt2x00lib_request_eeprom_file(rt2x00dev); -+ if (retval) -+ return retval; -+ -+ return 0; -+} -+ -+void rt2x00lib_free_eeprom_file(struct rt2x00_dev *rt2x00dev) -+{ -+ if (rt2x00dev->eeprom_file && rt2x00dev->eeprom_file->size) -+ release_firmware(rt2x00dev->eeprom_file); -+ rt2x00dev->eeprom_file = NULL; -+} ---- a/drivers/net/wireless/ralink/rt2x00/rt2x00lib.h -+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00lib.h -@@ -286,6 +286,22 @@ static inline void rt2x00lib_free_firmwa - #endif /* CPTCFG_RT2X00_LIB_FIRMWARE */ - - /* -+ * EEPROM file handlers. -+ */ -+#ifdef CPTCFG_RT2X00_LIB_EEPROM -+int rt2x00lib_load_eeprom_file(struct rt2x00_dev *rt2x00dev); -+void rt2x00lib_free_eeprom_file(struct rt2x00_dev *rt2x00dev); -+#else -+static inline int rt2x00lib_load_eeprom_file(struct rt2x00_dev *rt2x00dev) -+{ -+ return 0; -+} -+static inline void rt2x00lib_free_eeprom_file(struct rt2x00_dev *rt2x00dev) -+{ -+} -+#endif /* CPTCFG_RT2X00_LIB_EEPROM */ -+ -+/* - * Debugfs handlers. - */ - #ifdef CPTCFG_RT2X00_LIB_DEBUGFS ---- a/drivers/net/wireless/ralink/rt2x00/rt2x00soc.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00soc.c -@@ -86,6 +86,7 @@ int rt2x00soc_probe(struct platform_devi - if (IS_ERR(rt2x00dev->clk)) - rt2x00dev->clk = NULL; - -+ set_bit(REQUIRE_EEPROM_FILE, &rt2x00dev->cap_flags); - rt2x00_set_chip_intf(rt2x00dev, RT2X00_CHIP_INTF_SOC); - - retval = rt2x00soc_alloc_reg(rt2x00dev); diff --git a/package/kernel/mac80211/patches/rt2x00/603-rt2x00-of_load_eeprom_filename.patch b/package/kernel/mac80211/patches/rt2x00/603-rt2x00-of_load_eeprom_filename.patch deleted file mode 100644 index 431e090237..0000000000 --- a/package/kernel/mac80211/patches/rt2x00/603-rt2x00-of_load_eeprom_filename.patch +++ /dev/null @@ -1,31 +0,0 @@ ---- a/drivers/net/wireless/ralink/rt2x00/rt2x00eeprom.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00eeprom.c -@@ -26,6 +26,7 @@ - - #include - #include -+#include - - #include "rt2x00.h" - #include "rt2x00lib.h" -@@ -34,10 +35,20 @@ static const char * - rt2x00lib_get_eeprom_file_name(struct rt2x00_dev *rt2x00dev) - { - struct rt2x00_platform_data *pdata = rt2x00dev->dev->platform_data; -+#ifdef CONFIG_OF -+ struct device_node *np; -+ const char *eep; -+#endif - - if (pdata && pdata->eeprom_file_name) - return pdata->eeprom_file_name; - -+#ifdef CONFIG_OF -+ np = rt2x00dev->dev->of_node; -+ if (np && of_property_read_string(np, "ralink,eeprom", &eep) == 0) -+ return eep; -+#endif -+ - return NULL; - } - diff --git a/package/kernel/mac80211/patches/rt2x00/604-rt2x00-load-eeprom-on-SoC-from-a-mtd-device-defines-.patch b/package/kernel/mac80211/patches/rt2x00/604-rt2x00-load-eeprom-on-SoC-from-a-mtd-device-defines-.patch deleted file mode 100644 index 7338eb15b2..0000000000 --- a/package/kernel/mac80211/patches/rt2x00/604-rt2x00-load-eeprom-on-SoC-from-a-mtd-device-defines-.patch +++ /dev/null @@ -1,113 +0,0 @@ -From 339fe73f340161a624cc08e738d2244814852c3e Mon Sep 17 00:00:00 2001 -From: John Crispin -Date: Sun, 17 Mar 2013 00:55:04 +0100 -Subject: [PATCH] rt2x00: load eeprom on SoC from a mtd device defines inside - OF - -Signed-off-by: John Crispin ---- - drivers/net/wireless/ralink/rt2x00/Kconfig | 1 + - drivers/net/wireless/ralink/rt2x00/rt2x00eeprom.c | 65 +++++++++++++++++++++++ - 2 files changed, 66 insertions(+) - ---- a/drivers/net/wireless/ralink/rt2x00/Kconfig -+++ b/drivers/net/wireless/ralink/rt2x00/Kconfig -@@ -220,6 +220,7 @@ config RT2800SOC - select RT2X00_LIB_EEPROM - select RT2800_LIB - select RT2800_LIB_MMIO -+ select MTD if SOC_RT288X || SOC_RT305X - help - This adds support for Ralink WiSoC devices. - Supported chips: RT2880, RT3050, RT3052, RT3350, RT3352. ---- a/drivers/net/wireless/ralink/rt2x00/rt2x00eeprom.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00eeprom.c -@@ -26,11 +26,76 @@ - - #include - #include -+#if IS_ENABLED(CONFIG_MTD) -+#include -+#include -+#endif - #include - - #include "rt2x00.h" - #include "rt2x00lib.h" - -+#if IS_ENABLED(CONFIG_MTD) -+static int rt2800lib_read_eeprom_mtd(struct rt2x00_dev *rt2x00dev) -+{ -+ int ret = -EINVAL; -+#ifdef CONFIG_OF -+ static struct firmware mtd_fw; -+ struct device_node *np = rt2x00dev->dev->of_node, *mtd_np = NULL; -+ size_t retlen, len = rt2x00dev->ops->eeprom_size; -+ int i, size, offset = 0; -+ struct mtd_info *mtd; -+ const char *part; -+ const __be32 *list; -+ phandle phandle; -+ -+ list = of_get_property(np, "ralink,mtd-eeprom", &size); -+ if (!list) -+ return -ENOENT; -+ -+ phandle = be32_to_cpup(list++); -+ if (phandle) -+ mtd_np = of_find_node_by_phandle(phandle); -+ if (!mtd_np) { -+ dev_err(rt2x00dev->dev, "failed to load mtd phandle\n"); -+ return -EINVAL; -+ } -+ -+ part = of_get_property(mtd_np, "label", NULL); -+ if (!part) -+ part = mtd_np->name; -+ -+ mtd = get_mtd_device_nm(part); -+ if (IS_ERR(mtd)) { -+ dev_err(rt2x00dev->dev, "failed to get mtd device \"%s\"\n", part); -+ return PTR_ERR(mtd); -+ } -+ -+ if (size > sizeof(*list)) -+ offset = be32_to_cpup(list); -+ -+ ret = mtd_read(mtd, offset, len, &retlen, (u_char *) rt2x00dev->eeprom); -+ put_mtd_device(mtd); -+ -+ if ((retlen != rt2x00dev->ops->eeprom_size) || ret) { -+ dev_err(rt2x00dev->dev, "failed to load eeprom from device \"%s\"\n", part); -+ return ret; -+ } -+ -+ if (of_find_property(np, "ralink,mtd-eeprom-swap", NULL)) -+ for (i = 0; i < len/sizeof(u16); i++) -+ rt2x00dev->eeprom[i] = swab16(rt2x00dev->eeprom[i]); -+ -+ rt2x00dev->eeprom_file = &mtd_fw; -+ mtd_fw.data = (const u8 *) rt2x00dev->eeprom; -+ -+ dev_info(rt2x00dev->dev, "loaded eeprom from mtd device \"%s\"\n", part); -+#endif -+ -+ return ret; -+} -+#endif -+ - static const char * - rt2x00lib_get_eeprom_file_name(struct rt2x00_dev *rt2x00dev) - { -@@ -58,6 +123,11 @@ static int rt2x00lib_request_eeprom_file - const char *ee_name; - int retval; - -+#if IS_ENABLED(CONFIG_MTD) -+ if (!rt2800lib_read_eeprom_mtd(rt2x00dev)) -+ return 0; -+#endif -+ - ee_name = rt2x00lib_get_eeprom_file_name(rt2x00dev); - if (!ee_name && test_bit(REQUIRE_EEPROM_FILE, &rt2x00dev->cap_flags)) { - rt2x00_err(rt2x00dev, "Required EEPROM name is missing."); diff --git a/package/kernel/mac80211/patches/rt2x00/606-rt2x00-allow_disabling_bands_through_platform_data.patch b/package/kernel/mac80211/patches/rt2x00/606-rt2x00-allow_disabling_bands_through_platform_data.patch deleted file mode 100644 index ffee2189d2..0000000000 --- a/package/kernel/mac80211/patches/rt2x00/606-rt2x00-allow_disabling_bands_through_platform_data.patch +++ /dev/null @@ -1,47 +0,0 @@ ---- a/include/linux/rt2x00_platform.h -+++ b/include/linux/rt2x00_platform.h -@@ -14,6 +14,9 @@ - - struct rt2x00_platform_data { - char *eeprom_file_name; -+ -+ int disable_2ghz; -+ int disable_5ghz; - }; - - #endif /* _RT2X00_PLATFORM_H */ ---- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c -@@ -1007,6 +1007,22 @@ static int rt2x00lib_probe_hw_modes(stru - unsigned int num_rates; - unsigned int i; - -+ if (rt2x00dev->dev->platform_data) { -+ struct rt2x00_platform_data *pdata; -+ -+ pdata = rt2x00dev->dev->platform_data; -+ if (pdata->disable_2ghz) -+ spec->supported_bands &= ~SUPPORT_BAND_2GHZ; -+ if (pdata->disable_5ghz) -+ spec->supported_bands &= ~SUPPORT_BAND_5GHZ; -+ } -+ -+ if ((spec->supported_bands & SUPPORT_BAND_BOTH) == 0) { -+ rt2x00_err(rt2x00dev, "No supported bands\n"); -+ return -EINVAL; -+ } -+ -+ - num_rates = 0; - if (spec->supported_rates & SUPPORT_RATE_CCK) - num_rates += 4; ---- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h -+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h -@@ -408,6 +408,7 @@ struct hw_mode_spec { - unsigned int supported_bands; - #define SUPPORT_BAND_2GHZ 0x00000001 - #define SUPPORT_BAND_5GHZ 0x00000002 -+#define SUPPORT_BAND_BOTH (SUPPORT_BAND_2GHZ | SUPPORT_BAND_5GHZ) - - unsigned int supported_rates; - #define SUPPORT_RATE_CCK 0x00000001 diff --git a/package/kernel/mac80211/patches/rt2x00/607-rt2x00-add_platform_data_mac_addr.patch b/package/kernel/mac80211/patches/rt2x00/607-rt2x00-add_platform_data_mac_addr.patch deleted file mode 100644 index 37553bb80a..0000000000 --- a/package/kernel/mac80211/patches/rt2x00/607-rt2x00-add_platform_data_mac_addr.patch +++ /dev/null @@ -1,25 +0,0 @@ ---- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c -@@ -989,6 +989,12 @@ static void rt2x00lib_rate(struct ieee80 - - void rt2x00lib_set_mac_address(struct rt2x00_dev *rt2x00dev, u8 *eeprom_mac_addr) - { -+ struct rt2x00_platform_data *pdata; -+ -+ pdata = rt2x00dev->dev->platform_data; -+ if (pdata && pdata->mac_address) -+ ether_addr_copy(eeprom_mac_addr, pdata->mac_address); -+ - of_get_mac_address(rt2x00dev->dev->of_node, eeprom_mac_addr); - - if (!is_valid_ether_addr(eeprom_mac_addr)) { ---- a/include/linux/rt2x00_platform.h -+++ b/include/linux/rt2x00_platform.h -@@ -14,6 +14,7 @@ - - struct rt2x00_platform_data { - char *eeprom_file_name; -+ const u8 *mac_address; - - int disable_2ghz; - int disable_5ghz; diff --git a/package/kernel/mac80211/patches/rt2x00/608-rt2x00-allow_disabling_bands_through_dts.patch b/package/kernel/mac80211/patches/rt2x00/608-rt2x00-allow_disabling_bands_through_dts.patch deleted file mode 100644 index 6211809c0a..0000000000 --- a/package/kernel/mac80211/patches/rt2x00/608-rt2x00-allow_disabling_bands_through_dts.patch +++ /dev/null @@ -1,19 +0,0 @@ ---- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c -@@ -1012,6 +1012,16 @@ static int rt2x00lib_probe_hw_modes(stru - struct ieee80211_rate *rates; - unsigned int num_rates; - unsigned int i; -+#ifdef CONFIG_OF -+ struct device_node *np = rt2x00dev->dev->of_node; -+ unsigned int enabled; -+ if (!of_property_read_u32(np, "ralink,2ghz", -+ &enabled) && !enabled) -+ spec->supported_bands &= ~SUPPORT_BAND_2GHZ; -+ if (!of_property_read_u32(np, "ralink,5ghz", -+ &enabled) && !enabled) -+ spec->supported_bands &= ~SUPPORT_BAND_5GHZ; -+#endif /* CONFIG_OF */ - - if (rt2x00dev->dev->platform_data) { - struct rt2x00_platform_data *pdata; diff --git a/package/kernel/mac80211/patches/rt2x00/609-rt2x00-make-wmac-loadable-via-OF-on-rt288x-305x-SoC.patch b/package/kernel/mac80211/patches/rt2x00/609-rt2x00-make-wmac-loadable-via-OF-on-rt288x-305x-SoC.patch deleted file mode 100644 index 8964f8bf10..0000000000 --- a/package/kernel/mac80211/patches/rt2x00/609-rt2x00-make-wmac-loadable-via-OF-on-rt288x-305x-SoC.patch +++ /dev/null @@ -1,33 +0,0 @@ -From 04dbd87265f6ba4a373b211ba324b437d224fb2d Mon Sep 17 00:00:00 2001 -From: John Crispin -Date: Sun, 17 Mar 2013 00:03:31 +0100 -Subject: [PATCH 21/38] rt2x00: make wmac loadable via OF on rt288x/305x SoC - -This patch ads the match table to allow loading the wmac support from a -devicetree. - -Signed-off-by: John Crispin ---- - drivers/net/wireless/ralink/rt2x00/rt2800pci.c | 7 +++++++ - 1 file changed, 7 insertions(+) - ---- a/drivers/net/wireless/ralink/rt2x00/rt2800soc.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2800soc.c -@@ -225,10 +225,17 @@ static int rt2800soc_probe(struct platfo - return rt2x00soc_probe(pdev, &rt2800soc_ops); - } - -+static const struct of_device_id rt2880_wmac_match[] = { -+ { .compatible = "ralink,rt2880-wmac" }, -+ {}, -+}; -+MODULE_DEVICE_TABLE(of, rt2880_wmac_match); -+ - static struct platform_driver rt2800soc_driver = { - .driver = { - .name = "rt2800_wmac", - .mod_name = KBUILD_MODNAME, -+ .of_match_table = rt2880_wmac_match, - }, - .probe = rt2800soc_probe, - .remove = rt2x00soc_remove, diff --git a/package/kernel/mac80211/patches/rt2x00/610-rt2x00-change-led-polarity-from-OF.patch b/package/kernel/mac80211/patches/rt2x00/610-rt2x00-change-led-polarity-from-OF.patch deleted file mode 100644 index acc8a8edb8..0000000000 --- a/package/kernel/mac80211/patches/rt2x00/610-rt2x00-change-led-polarity-from-OF.patch +++ /dev/null @@ -1,40 +0,0 @@ ---- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -25,6 +25,7 @@ - #include - #include - #include -+#include - - #include "rt2x00.h" - #include "rt2800lib.h" -@@ -11131,6 +11132,17 @@ static int rt2800_init_eeprom(struct rt2 - rt2800_init_led(rt2x00dev, &rt2x00dev->led_assoc, LED_TYPE_ASSOC); - rt2800_init_led(rt2x00dev, &rt2x00dev->led_qual, LED_TYPE_QUALITY); - -+ { -+ struct device_node *np = rt2x00dev->dev->of_node; -+ unsigned int led_polarity; -+ -+ /* Allow overriding polarity from OF */ -+ if (!of_property_read_u32(np, "ralink,led-polarity", -+ &led_polarity)) -+ rt2x00_set_field16(&eeprom, EEPROM_FREQ_LED_POLARITY, -+ led_polarity); -+ } -+ - rt2x00dev->led_mcu_reg = eeprom; - #endif /* CPTCFG_RT2X00_LIB_LEDS */ - ---- a/drivers/net/wireless/ralink/rt2x00/rt2x00leds.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00leds.c -@@ -98,6 +98,9 @@ static int rt2x00leds_register_led(struc - led->led_dev.name = name; - led->led_dev.brightness = LED_OFF; - -+ if (rt2x00_is_soc(rt2x00dev)) -+ led->led_dev.brightness_set(&led->led_dev, LED_OFF); -+ - retval = led_classdev_register(device, &led->led_dev); - if (retval) { - rt2x00_err(rt2x00dev, "Failed to register led handler\n"); diff --git a/package/kernel/mac80211/patches/rt2x00/611-rt2x00-add-AP+STA-support.patch b/package/kernel/mac80211/patches/rt2x00/611-rt2x00-add-AP+STA-support.patch deleted file mode 100644 index 5ef5fc8def..0000000000 --- a/package/kernel/mac80211/patches/rt2x00/611-rt2x00-add-AP+STA-support.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c -@@ -1358,7 +1358,7 @@ static inline void rt2x00lib_set_if_comb - */ - if_limit = &rt2x00dev->if_limits_ap; - if_limit->max = rt2x00dev->ops->max_ap_intf; -- if_limit->types = BIT(NL80211_IFTYPE_AP); -+ if_limit->types = BIT(NL80211_IFTYPE_AP) | BIT(NL80211_IFTYPE_STATION); - #ifdef CPTCFG_MAC80211_MESH - if_limit->types |= BIT(NL80211_IFTYPE_MESH_POINT); - #endif diff --git a/package/kernel/mac80211/patches/rt2x00/994-rt2x00-import-support-for-external-LNA-on-MT7620.patch b/package/kernel/mac80211/patches/rt2x00/994-rt2x00-import-support-for-external-LNA-on-MT7620.patch deleted file mode 100644 index deaa03be6c..0000000000 --- a/package/kernel/mac80211/patches/rt2x00/994-rt2x00-import-support-for-external-LNA-on-MT7620.patch +++ /dev/null @@ -1,161 +0,0 @@ -From 0fce1109f894ec7fcd72cb098843a1eff786716a Mon Sep 17 00:00:00 2001 -From: Daniel Golle -Date: Fri, 16 Sep 2022 20:49:42 +0100 -Subject: [PATCH 16/16] rt2x00: import support for external LNA on MT7620 -To: linux-wireless@vger.kernel.org, - Stanislaw Gruszka , - Helmut Schaa -Cc: Kalle Valo , - David S. Miller , - Eric Dumazet , - Jakub Kicinski , - Paolo Abeni , - Johannes Berg - -In order to carry out calibration on boards with ePA or eLNA the PA pin -needs to be switch to GPIO mode on MT7620. Implement that by selecting -pinctrl state "pa_gpio" which should be defined for MT7620 boards with -eLNA or ePA beside the "default" state. - -Reported-by: Serge Vasilugin -Signed-off-by: Daniel Golle ---- - .../net/wireless/ralink/rt2x00/rt2800lib.c | 58 +++++++++++++++++++ - drivers/net/wireless/ralink/rt2x00/rt2x00.h | 5 ++ - .../net/wireless/ralink/rt2x00/rt2x00soc.c | 15 +++++ - 3 files changed, 78 insertions(+) - ---- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -304,6 +304,24 @@ static void rt2800_rf_write(struct rt2x0 - mutex_unlock(&rt2x00dev->csr_mutex); - } - -+void rt6352_enable_pa_pin(struct rt2x00_dev *rt2x00dev, int enable) -+{ -+ if (!rt2x00dev->pinctrl) -+ return; -+ -+ if (enable) { -+ if (!rt2x00dev->pins_default) -+ return; -+ -+ pinctrl_select_state(rt2x00dev->pinctrl, rt2x00dev->pins_default); -+ } else { -+ if (!rt2x00dev->pins_pa_gpio) -+ return; -+ -+ pinctrl_select_state(rt2x00dev->pinctrl, rt2x00dev->pins_pa_gpio); -+ } -+} -+ - static const unsigned int rt2800_eeprom_map[EEPROM_WORD_COUNT] = { - [EEPROM_CHIP_ID] = 0x0000, - [EEPROM_VERSION] = 0x0001, -@@ -4469,6 +4487,29 @@ static void rt2800_config_channel(struct - rt2800_register_write(rt2x00dev, TX1_RF_GAIN_ATTEN, - 0x6C6C6B6C); - } -+ -+ if (rt2x00_has_cap_external_lna_bg(rt2x00dev)) { -+ reg = rt2800_register_read(rt2x00dev, RF_CONTROL3); -+ reg |= 0x00000101; -+ rt2800_register_write(rt2x00dev, RF_CONTROL3, reg); -+ -+ reg = rt2800_register_read(rt2x00dev, RF_BYPASS3); -+ reg |= 0x00000101; -+ rt2800_register_write(rt2x00dev, RF_BYPASS3, reg); -+ -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 14, 0x66); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 17, 0x20); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 18, 0x42); -+ rt2800_bbp_write(rt2x00dev, 75, 0x68); -+ rt2800_bbp_write(rt2x00dev, 76, 0x4C); -+ rt2800_bbp_write(rt2x00dev, 79, 0x1C); -+ rt2800_bbp_write(rt2x00dev, 80, 0x0C); -+ rt2800_bbp_write(rt2x00dev, 82, 0xB6); -+ /* bank 0 RF reg 42 and glrt BBP reg 141 will be set in -+ * config channel function in dependence of channel and -+ * HT20/HT40 so don't touch it -+ */ -+ } - } - - bbp = rt2800_bbp_read(rt2x00dev, 4); -@@ -10583,6 +10624,7 @@ static void rt2800_init_rfcsr_6352(struc - rt2800_rfcsr_write_dccal(rt2x00dev, 5, 0x00); - rt2800_rfcsr_write_dccal(rt2x00dev, 17, 0x7C); - -+ rt6352_enable_pa_pin(rt2x00dev, 0); - rt2800_r_calibration(rt2x00dev); - rt2800_rf_self_txdc_cal(rt2x00dev); - rt2800_rxdcoc_calibration(rt2x00dev); -@@ -10590,6 +10632,22 @@ static void rt2800_init_rfcsr_6352(struc - rt2800_bw_filter_calibration(rt2x00dev, false); - rt2800_loft_iq_calibration(rt2x00dev); - rt2800_rxiq_calibration(rt2x00dev); -+ rt6352_enable_pa_pin(rt2x00dev, 1); -+ -+ if (rt2x00_has_cap_external_lna_bg(rt2x00dev)) { -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 14, 0x66); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 17, 0x20); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 18, 0x42); -+ rt2800_bbp_write(rt2x00dev, 75, 0x68); -+ rt2800_bbp_write(rt2x00dev, 76, 0x4C); -+ rt2800_bbp_write(rt2x00dev, 79, 0x1C); -+ rt2800_bbp_write(rt2x00dev, 80, 0x0C); -+ rt2800_bbp_write(rt2x00dev, 82, 0xB6); -+ /* bank 0 RF reg 42 and glrt BBP reg 141 will be set in config -+ * channel function in dependence of channel and HT20/HT40, -+ * so don't touch them here. -+ */ -+ } - } - - static void rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev) ---- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h -+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h -@@ -28,6 +28,7 @@ - #include - #include - #include -+#include - #include - - #include -@@ -1029,6 +1030,11 @@ struct rt2x00_dev { - - /* Clock for System On Chip devices. */ - struct clk *clk; -+ -+ /* pinctrl and states for System On Chip devices with PA/LNA. */ -+ struct pinctrl *pinctrl; -+ struct pinctrl_state *pins_default; -+ struct pinctrl_state *pins_pa_gpio; - }; - - struct rt2x00_bar_list_entry { ---- a/drivers/net/wireless/ralink/rt2x00/rt2x00soc.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00soc.c -@@ -97,6 +97,21 @@ int rt2x00soc_probe(struct platform_devi - if (retval) - goto exit_free_reg; - -+ rt2x00dev->pinctrl = devm_pinctrl_get(&pdev->dev); -+ if (IS_ERR(rt2x00dev->pinctrl)) { -+ rt2x00dev->pinctrl = NULL; -+ rt2x00dev->pins_default = NULL; -+ rt2x00dev->pins_pa_gpio = NULL; -+ } else { -+ rt2x00dev->pins_default = pinctrl_lookup_state(rt2x00dev->pinctrl, "default"); -+ if (IS_ERR(rt2x00dev->pins_default)) -+ rt2x00dev->pins_default = NULL; -+ -+ rt2x00dev->pins_pa_gpio = pinctrl_lookup_state(rt2x00dev->pinctrl, "pa_gpio"); -+ if (IS_ERR(rt2x00dev->pins_pa_gpio)) -+ rt2x00dev->pins_pa_gpio = NULL; -+ } -+ - return 0; - - exit_free_reg: diff --git a/package/kernel/mac80211/patches/rt2x00/995-rt2x00-mt7620-introduce-accessors-for-CHIP_VER-register.patch b/package/kernel/mac80211/patches/rt2x00/995-rt2x00-mt7620-introduce-accessors-for-CHIP_VER-register.patch deleted file mode 100644 index 97a56de2b3..0000000000 --- a/package/kernel/mac80211/patches/rt2x00/995-rt2x00-mt7620-introduce-accessors-for-CHIP_VER-register.patch +++ /dev/null @@ -1,139 +0,0 @@ ---- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.h -+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.h -@@ -78,6 +78,9 @@ struct rt2800_ops { - int (*drv_init_registers)(struct rt2x00_dev *rt2x00dev); - __le32 *(*drv_get_txwi)(struct queue_entry *entry); - unsigned int (*drv_get_dma_done)(struct data_queue *queue); -+ int (*hw_get_chippkg)(void); -+ int (*hw_get_chipver)(void); -+ int (*hw_get_chipeco)(void); - }; - - static inline u32 rt2800_register_read(struct rt2x00_dev *rt2x00dev, -@@ -195,6 +198,27 @@ static inline unsigned int rt2800_drv_ge - return rt2800ops->drv_get_dma_done(queue); - } - -+static inline int rt2800_hw_get_chippkg(struct rt2x00_dev *rt2x00dev) -+{ -+ const struct rt2800_ops *rt2800ops = rt2x00dev->ops->drv; -+ -+ return rt2800ops->hw_get_chippkg(); -+} -+ -+static inline int rt2800_hw_get_chipver(struct rt2x00_dev *rt2x00dev) -+{ -+ const struct rt2800_ops *rt2800ops = rt2x00dev->ops->drv; -+ -+ return rt2800ops->hw_get_chipver(); -+} -+ -+static inline int rt2800_hw_get_chipeco(struct rt2x00_dev *rt2x00dev) -+{ -+ const struct rt2800_ops *rt2800ops = rt2x00dev->ops->drv; -+ -+ return rt2800ops->hw_get_chipeco(); -+} -+ - void rt2800_mcu_request(struct rt2x00_dev *rt2x00dev, - const u8 command, const u8 token, - const u8 arg0, const u8 arg1); ---- a/drivers/net/wireless/ralink/rt2x00/rt2800pci.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2800pci.c -@@ -286,6 +286,10 @@ static int rt2800pci_read_eeprom(struct - return retval; - } - -+static int rt2800pci_get_chippkg(void) { return 0; } -+static int rt2800pci_get_chipver(void) { return 0; } -+static int rt2800pci_get_chipeco(void) { return 0; } -+ - static const struct ieee80211_ops rt2800pci_mac80211_ops = { - .tx = rt2x00mac_tx, - .wake_tx_queue = ieee80211_handle_wake_tx_queue, -@@ -329,6 +333,9 @@ static const struct rt2800_ops rt2800pci - .drv_init_registers = rt2800mmio_init_registers, - .drv_get_txwi = rt2800mmio_get_txwi, - .drv_get_dma_done = rt2800mmio_get_dma_done, -+ .hw_get_chippkg = rt2800pci_get_chippkg, -+ .hw_get_chipver = rt2800pci_get_chipver, -+ .hw_get_chipeco = rt2800pci_get_chipeco, - }; - - static const struct rt2x00lib_ops rt2800pci_rt2x00_ops = { ---- a/drivers/net/wireless/ralink/rt2x00/rt2800soc.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2800soc.c -@@ -27,6 +27,12 @@ - #include "rt2800lib.h" - #include "rt2800mmio.h" - -+/* Needed to probe CHIP_VER register on MT7620 */ -+#ifdef CONFIG_SOC_MT7620 -+#include -+#include -+#endif -+ - /* Allow hardware encryption to be disabled. */ - static bool modparam_nohwcrypt; - module_param_named(nohwcrypt, modparam_nohwcrypt, bool, 0444); -@@ -118,6 +124,27 @@ static int rt2800soc_write_firmware(stru - return 0; - } - -+#ifdef CONFIG_SOC_MT7620 -+static int rt2800soc_get_chippkg(void) -+{ -+ return mt7620_get_pkg(); -+} -+ -+static int rt2800soc_get_chipver(void) -+{ -+ return mt7620_get_chipver(); -+} -+ -+static int rt2800soc_get_chipeco(void) -+{ -+ return mt7620_get_eco(); -+} -+#else -+static int rt2800soc_get_chippkg(void) { return 0; } -+static int rt2800soc_get_chipver(void) { return 0; } -+static int rt2800soc_get_chipeco(void) { return 0; } -+#endif -+ - static const struct ieee80211_ops rt2800soc_mac80211_ops = { - .tx = rt2x00mac_tx, - .wake_tx_queue = ieee80211_handle_wake_tx_queue, -@@ -160,6 +187,9 @@ static const struct rt2800_ops rt2800soc - .drv_init_registers = rt2800mmio_init_registers, - .drv_get_txwi = rt2800mmio_get_txwi, - .drv_get_dma_done = rt2800mmio_get_dma_done, -+ .hw_get_chippkg = rt2800soc_get_chippkg, -+ .hw_get_chipver = rt2800soc_get_chipver, -+ .hw_get_chipeco = rt2800soc_get_chipeco, - }; - - static const struct rt2x00lib_ops rt2800soc_rt2x00_ops = { ---- a/drivers/net/wireless/ralink/rt2x00/rt2800usb.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2800usb.c -@@ -628,6 +628,10 @@ static int rt2800usb_probe_hw(struct rt2 - return 0; - } - -+static int rt2800usb_get_chippkg(void) { return 0; } -+static int rt2800usb_get_chipver(void) { return 0; } -+static int rt2800usb_get_chipeco(void) { return 0; } -+ - static const struct ieee80211_ops rt2800usb_mac80211_ops = { - .tx = rt2x00mac_tx, - .wake_tx_queue = ieee80211_handle_wake_tx_queue, -@@ -672,6 +676,9 @@ static const struct rt2800_ops rt2800usb - .drv_init_registers = rt2800usb_init_registers, - .drv_get_txwi = rt2800usb_get_txwi, - .drv_get_dma_done = rt2800usb_get_dma_done, -+ .hw_get_chippkg = rt2800usb_get_chippkg, -+ .hw_get_chipver = rt2800usb_get_chipver, -+ .hw_get_chipeco = rt2800usb_get_chipeco, - }; - - static const struct rt2x00lib_ops rt2800usb_rt2x00_ops = { diff --git a/package/kernel/mac80211/patches/rt2x00/996-rt2x00-mt7620-differentiate-based-on-SoC-CHIP_VER.patch b/package/kernel/mac80211/patches/rt2x00/996-rt2x00-mt7620-differentiate-based-on-SoC-CHIP_VER.patch deleted file mode 100644 index dab6e05ffd..0000000000 --- a/package/kernel/mac80211/patches/rt2x00/996-rt2x00-mt7620-differentiate-based-on-SoC-CHIP_VER.patch +++ /dev/null @@ -1,408 +0,0 @@ ---- a/drivers/net/wireless/ralink/rt2x00/rt2800.h -+++ b/drivers/net/wireless/ralink/rt2x00/rt2800.h -@@ -1044,6 +1044,11 @@ - #define MIMO_PS_CFG_RX_STBY_POL FIELD32(0x00000010) - #define MIMO_PS_CFG_RX_RX_STBY0 FIELD32(0x00000020) - -+#define BB_PA_MODE_CFG0 0x1214 -+#define BB_PA_MODE_CFG1 0x1218 -+#define RF_PA_MODE_CFG0 0x121C -+#define RF_PA_MODE_CFG1 0x1220 -+ - /* - * EDCA_AC0_CFG: - */ ---- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -3778,14 +3778,16 @@ static void rt2800_config_channel_rf7620 - rt2x00_set_field8(&rfcsr, RFCSR19_K, rf->rf4); - rt2800_rfcsr_write(rt2x00dev, 19, rfcsr); - -- /* Default: XO=20MHz , SDM mode */ -- rfcsr = rt2800_rfcsr_read(rt2x00dev, 16); -- rt2x00_set_field8(&rfcsr, RFCSR16_SDM_MODE_MT7620, 0x80); -- rt2800_rfcsr_write(rt2x00dev, 16, rfcsr); -- -- rfcsr = rt2800_rfcsr_read(rt2x00dev, 21); -- rt2x00_set_field8(&rfcsr, RFCSR21_BIT8, 1); -- rt2800_rfcsr_write(rt2x00dev, 21, rfcsr); -+ if (rt2800_hw_get_chipver(rt2x00dev) > 1) { -+ /* Default: XO=20MHz , SDM mode */ -+ rfcsr = rt2800_rfcsr_read(rt2x00dev, 16); -+ rt2x00_set_field8(&rfcsr, RFCSR16_SDM_MODE_MT7620, 0x80); -+ rt2800_rfcsr_write(rt2x00dev, 16, rfcsr); -+ -+ rfcsr = rt2800_rfcsr_read(rt2x00dev, 21); -+ rt2x00_set_field8(&rfcsr, RFCSR21_BIT8, 1); -+ rt2800_rfcsr_write(rt2x00dev, 21, rfcsr); -+ } - - rfcsr = rt2800_rfcsr_read(rt2x00dev, 1); - rt2x00_set_field8(&rfcsr, RFCSR1_TX2_EN_MT7620, -@@ -3819,18 +3821,23 @@ static void rt2800_config_channel_rf7620 - rt2800_rfcsr_write_dccal(rt2x00dev, 59, 0x20); - } - -- if (conf_is_ht40(conf)) { -- rt2800_rfcsr_write_dccal(rt2x00dev, 58, 0x08); -- rt2800_rfcsr_write_dccal(rt2x00dev, 59, 0x08); -- } else { -- rt2800_rfcsr_write_dccal(rt2x00dev, 58, 0x28); -- rt2800_rfcsr_write_dccal(rt2x00dev, 59, 0x28); -+ if (rt2800_hw_get_chipver(rt2x00dev) > 1) { -+ if (conf_is_ht40(conf)) { -+ rt2800_rfcsr_write_dccal(rt2x00dev, 58, 0x08); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 59, 0x08); -+ } else { -+ rt2800_rfcsr_write_dccal(rt2x00dev, 58, 0x28); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 59, 0x28); -+ } - } - -- rfcsr = rt2800_rfcsr_read(rt2x00dev, 28); -- rt2x00_set_field8(&rfcsr, RFCSR28_CH11_HT40, -- conf_is_ht40(conf) && (rf->channel == 11)); -- rt2800_rfcsr_write(rt2x00dev, 28, rfcsr); -+ if (rt2800_hw_get_chipver(rt2x00dev) > 1 && -+ rt2800_hw_get_chipeco(rt2x00dev) == 2) { -+ rfcsr = rt2800_rfcsr_read(rt2x00dev, 28); -+ rt2x00_set_field8(&rfcsr, RFCSR28_CH11_HT40, -+ conf_is_ht40(conf) && (rf->channel == 11)); -+ rt2800_rfcsr_write(rt2x00dev, 28, rfcsr); -+ } - - if (!test_bit(DEVICE_STATE_SCANNING, &rt2x00dev->flags)) { - if (conf_is_ht40(conf)) { -@@ -3929,25 +3936,29 @@ static void rt2800_config_alc(struct rt2 - if (unlikely(rt2800_wait_bbp_rf_ready(rt2x00dev, MAC_STATUS_CFG_BBP_RF_BUSY))) - rt2x00_warn(rt2x00dev, "RF busy while configuring ALC\n"); - -- if (chan->center_freq > 2457) { -- bbp = rt2800_bbp_read(rt2x00dev, 30); -- bbp = 0x40; -- rt2800_bbp_write(rt2x00dev, 30, bbp); -- rt2800_rfcsr_write(rt2x00dev, 39, 0); -- if (rt2x00_has_cap_external_lna_bg(rt2x00dev)) -- rt2800_rfcsr_write(rt2x00dev, 42, 0xfb); -- else -- rt2800_rfcsr_write(rt2x00dev, 42, 0x7b); -- } else { -- bbp = rt2800_bbp_read(rt2x00dev, 30); -- bbp = 0x1f; -- rt2800_bbp_write(rt2x00dev, 30, bbp); -- rt2800_rfcsr_write(rt2x00dev, 39, 0x80); -- if (rt2x00_has_cap_external_lna_bg(rt2x00dev)) -- rt2800_rfcsr_write(rt2x00dev, 42, 0xdb); -- else -- rt2800_rfcsr_write(rt2x00dev, 42, 0x5b); -+ if (rt2800_hw_get_chipver(rt2x00dev) > 1 && -+ rt2800_hw_get_chipeco(rt2x00dev) >= 2) { -+ if (chan->center_freq > 2457) { -+ bbp = rt2800_bbp_read(rt2x00dev, 30); -+ bbp = 0x40; -+ rt2800_bbp_write(rt2x00dev, 30, bbp); -+ rt2800_rfcsr_write(rt2x00dev, 39, 0); -+ if (rt2x00_has_cap_external_lna_bg(rt2x00dev)) -+ rt2800_rfcsr_write(rt2x00dev, 42, 0xfb); -+ else -+ rt2800_rfcsr_write(rt2x00dev, 42, 0x7b); -+ } else { -+ bbp = rt2800_bbp_read(rt2x00dev, 30); -+ bbp = 0x1f; -+ rt2800_bbp_write(rt2x00dev, 30, bbp); -+ rt2800_rfcsr_write(rt2x00dev, 39, 0x80); -+ if (rt2x00_has_cap_external_lna_bg(rt2x00dev)) -+ rt2800_rfcsr_write(rt2x00dev, 42, 0xdb); -+ else -+ rt2800_rfcsr_write(rt2x00dev, 42, 0x5b); -+ } - } -+ - rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, mac_sys_ctrl); - - rt2800_vco_calibration(rt2x00dev); -@@ -6011,18 +6022,33 @@ static int rt2800_init_registers(struct - } else if (rt2x00_rt(rt2x00dev, RT5350)) { - rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000404); - } else if (rt2x00_rt(rt2x00dev, RT6352)) { -- rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000401); -- rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x000C0001); -- rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x00000000); -- rt2800_register_write(rt2x00dev, TX_ALC_VGA3, 0x00000000); -- rt2800_register_write(rt2x00dev, TX0_BB_GAIN_ATTEN, 0x0); -- rt2800_register_write(rt2x00dev, TX1_BB_GAIN_ATTEN, 0x0); -- rt2800_register_write(rt2x00dev, TX0_RF_GAIN_ATTEN, 0x6C6C666C); -- rt2800_register_write(rt2x00dev, TX1_RF_GAIN_ATTEN, 0x6C6C666C); -- rt2800_register_write(rt2x00dev, TX0_RF_GAIN_CORRECT, -- 0x3630363A); -- rt2800_register_write(rt2x00dev, TX1_RF_GAIN_CORRECT, -- 0x3630363A); -+ if (rt2800_hw_get_chipver(rt2x00dev) <= 1) { -+ rt2800_register_write(rt2x00dev, TX_ALC_VGA3, -+ 0x00000000); -+ rt2800_register_write(rt2x00dev, BB_PA_MODE_CFG0, -+ 0x000055FF); -+ rt2800_register_write(rt2x00dev, BB_PA_MODE_CFG1, -+ 0x00550055); -+ rt2800_register_write(rt2x00dev, RF_PA_MODE_CFG0, -+ 0x000055FF); -+ rt2800_register_write(rt2x00dev, RF_PA_MODE_CFG1, -+ 0x00550055); -+ } else { -+ rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000401); -+ rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x000C0001); -+ rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x00000000); -+ rt2800_register_write(rt2x00dev, TX_ALC_VGA3, 0x00000000); -+ rt2800_register_write(rt2x00dev, TX0_BB_GAIN_ATTEN, 0x0); -+ rt2800_register_write(rt2x00dev, TX1_BB_GAIN_ATTEN, 0x0); -+ rt2800_register_write(rt2x00dev, TX0_RF_GAIN_ATTEN, -+ 0x6C6C666C); -+ rt2800_register_write(rt2x00dev, TX1_RF_GAIN_ATTEN, -+ 0x6C6C666C); -+ rt2800_register_write(rt2x00dev, TX0_RF_GAIN_CORRECT, -+ 0x3630363A); -+ rt2800_register_write(rt2x00dev, TX1_RF_GAIN_CORRECT, -+ 0x3630363A); -+ } - reg = rt2800_register_read(rt2x00dev, TX_ALC_CFG_1); - rt2x00_set_field32(®, TX_ALC_CFG_1_ROS_BUSY_EN, 0); - rt2800_register_write(rt2x00dev, TX_ALC_CFG_1, reg); -@@ -7127,14 +7153,16 @@ static void rt2800_init_bbp_6352(struct - rt2800_bbp_write(rt2x00dev, 188, 0x00); - rt2800_bbp_write(rt2x00dev, 189, 0x00); - -- rt2800_bbp_write(rt2x00dev, 91, 0x06); -- rt2800_bbp_write(rt2x00dev, 92, 0x04); -- rt2800_bbp_write(rt2x00dev, 93, 0x54); -- rt2800_bbp_write(rt2x00dev, 99, 0x50); -- rt2800_bbp_write(rt2x00dev, 148, 0x84); -- rt2800_bbp_write(rt2x00dev, 167, 0x80); -- rt2800_bbp_write(rt2x00dev, 178, 0xFF); -- rt2800_bbp_write(rt2x00dev, 106, 0x13); -+ if (rt2800_hw_get_chipver(rt2x00dev) > 1) { -+ rt2800_bbp_write(rt2x00dev, 91, 0x06); -+ rt2800_bbp_write(rt2x00dev, 92, 0x04); -+ rt2800_bbp_write(rt2x00dev, 93, 0x54); -+ rt2800_bbp_write(rt2x00dev, 99, 0x50); -+ rt2800_bbp_write(rt2x00dev, 148, 0x84); -+ rt2800_bbp_write(rt2x00dev, 167, 0x80); -+ rt2800_bbp_write(rt2x00dev, 178, 0xFF); -+ rt2800_bbp_write(rt2x00dev, 106, 0x13); -+ } - - /* BBP for G band GLRT function (BBP_128 ~ BBP_221) */ - rt2800_bbp_glrt_write(rt2x00dev, 0, 0x00); -@@ -10408,31 +10436,36 @@ static void rt2800_init_rfcsr_6352(struc - rt2800_rfcsr_write(rt2x00dev, 42, 0x5B); - rt2800_rfcsr_write(rt2x00dev, 43, 0x00); - -- rt2800_rfcsr_write(rt2x00dev, 11, 0x21); -- if (rt2800_clk_is_20mhz(rt2x00dev)) -- rt2800_rfcsr_write(rt2x00dev, 13, 0x03); -- else -- rt2800_rfcsr_write(rt2x00dev, 13, 0x00); -- rt2800_rfcsr_write(rt2x00dev, 14, 0x7C); -- rt2800_rfcsr_write(rt2x00dev, 16, 0x80); -- rt2800_rfcsr_write(rt2x00dev, 17, 0x99); -- rt2800_rfcsr_write(rt2x00dev, 18, 0x99); -- rt2800_rfcsr_write(rt2x00dev, 19, 0x09); -- rt2800_rfcsr_write(rt2x00dev, 20, 0x50); -- rt2800_rfcsr_write(rt2x00dev, 21, 0xB0); -- rt2800_rfcsr_write(rt2x00dev, 22, 0x00); -- rt2800_rfcsr_write(rt2x00dev, 23, 0x06); -- rt2800_rfcsr_write(rt2x00dev, 24, 0x00); -- rt2800_rfcsr_write(rt2x00dev, 25, 0x00); -- rt2800_rfcsr_write(rt2x00dev, 26, 0x5D); -- rt2800_rfcsr_write(rt2x00dev, 27, 0x00); -- rt2800_rfcsr_write(rt2x00dev, 28, 0x61); -- rt2800_rfcsr_write(rt2x00dev, 29, 0xB5); -- rt2800_rfcsr_write(rt2x00dev, 43, 0x02); -- -- rt2800_rfcsr_write(rt2x00dev, 28, 0x62); -- rt2800_rfcsr_write(rt2x00dev, 29, 0xAD); -- rt2800_rfcsr_write(rt2x00dev, 39, 0x80); -+ if (rt2800_hw_get_chipver(rt2x00dev) > 1) { -+ rt2800_rfcsr_write(rt2x00dev, 11, 0x21); -+ if (rt2800_clk_is_20mhz(rt2x00dev)) -+ rt2800_rfcsr_write(rt2x00dev, 13, 0x03); -+ else -+ rt2800_rfcsr_write(rt2x00dev, 13, 0x00); -+ rt2800_rfcsr_write(rt2x00dev, 14, 0x7C); -+ rt2800_rfcsr_write(rt2x00dev, 16, 0x80); -+ rt2800_rfcsr_write(rt2x00dev, 17, 0x99); -+ rt2800_rfcsr_write(rt2x00dev, 18, 0x99); -+ rt2800_rfcsr_write(rt2x00dev, 19, 0x09); -+ rt2800_rfcsr_write(rt2x00dev, 20, 0x50); -+ rt2800_rfcsr_write(rt2x00dev, 21, 0xB0); -+ rt2800_rfcsr_write(rt2x00dev, 22, 0x00); -+ rt2800_rfcsr_write(rt2x00dev, 23, 0x06); -+ rt2800_rfcsr_write(rt2x00dev, 24, 0x00); -+ rt2800_rfcsr_write(rt2x00dev, 25, 0x00); -+ rt2800_rfcsr_write(rt2x00dev, 26, 0x5D); -+ rt2800_rfcsr_write(rt2x00dev, 27, 0x00); -+ rt2800_rfcsr_write(rt2x00dev, 28, 0x61); -+ rt2800_rfcsr_write(rt2x00dev, 29, 0xB5); -+ rt2800_rfcsr_write(rt2x00dev, 43, 0x02); -+ } -+ -+ if (rt2800_hw_get_chipver(rt2x00dev) > 1 && -+ rt2800_hw_get_chipeco(rt2x00dev) >= 2) { -+ rt2800_rfcsr_write(rt2x00dev, 28, 0x62); -+ rt2800_rfcsr_write(rt2x00dev, 29, 0xAD); -+ rt2800_rfcsr_write(rt2x00dev, 39, 0x80); -+ } - - /* Initialize RF channel register to default value */ - rt2800_rfcsr_write_chanreg(rt2x00dev, 0, 0x03); -@@ -10498,63 +10531,71 @@ static void rt2800_init_rfcsr_6352(struc - - rt2800_rfcsr_write_bank(rt2x00dev, 6, 45, 0xC5); - -- rt2800_rfcsr_write_chanreg(rt2x00dev, 9, 0x47); -- rt2800_rfcsr_write_chanreg(rt2x00dev, 10, 0x71); -- rt2800_rfcsr_write_chanreg(rt2x00dev, 11, 0x33); -- rt2800_rfcsr_write_chanreg(rt2x00dev, 14, 0x0E); -- rt2800_rfcsr_write_chanreg(rt2x00dev, 17, 0x23); -- rt2800_rfcsr_write_chanreg(rt2x00dev, 19, 0xA4); -- rt2800_rfcsr_write_chanreg(rt2x00dev, 20, 0x02); -- rt2800_rfcsr_write_chanreg(rt2x00dev, 21, 0x12); -- rt2800_rfcsr_write_chanreg(rt2x00dev, 28, 0x1C); -- rt2800_rfcsr_write_chanreg(rt2x00dev, 29, 0xEB); -- rt2800_rfcsr_write_chanreg(rt2x00dev, 32, 0x7D); -- rt2800_rfcsr_write_chanreg(rt2x00dev, 34, 0xD6); -- rt2800_rfcsr_write_chanreg(rt2x00dev, 36, 0x08); -- rt2800_rfcsr_write_chanreg(rt2x00dev, 38, 0xB4); -- rt2800_rfcsr_write_chanreg(rt2x00dev, 43, 0xD3); -- rt2800_rfcsr_write_chanreg(rt2x00dev, 44, 0xB3); -- rt2800_rfcsr_write_chanreg(rt2x00dev, 45, 0xD5); -- rt2800_rfcsr_write_chanreg(rt2x00dev, 46, 0x27); -- rt2800_rfcsr_write_bank(rt2x00dev, 4, 47, 0x67); -- rt2800_rfcsr_write_bank(rt2x00dev, 6, 47, 0x69); -- rt2800_rfcsr_write_chanreg(rt2x00dev, 48, 0xFF); -- rt2800_rfcsr_write_bank(rt2x00dev, 4, 54, 0x27); -- rt2800_rfcsr_write_bank(rt2x00dev, 6, 54, 0x20); -- rt2800_rfcsr_write_chanreg(rt2x00dev, 55, 0x66); -- rt2800_rfcsr_write_chanreg(rt2x00dev, 56, 0xFF); -- rt2800_rfcsr_write_chanreg(rt2x00dev, 57, 0x1C); -- rt2800_rfcsr_write_chanreg(rt2x00dev, 58, 0x20); -- rt2800_rfcsr_write_chanreg(rt2x00dev, 59, 0x6B); -- rt2800_rfcsr_write_chanreg(rt2x00dev, 60, 0xF7); -- rt2800_rfcsr_write_chanreg(rt2x00dev, 61, 0x09); -- -- rt2800_rfcsr_write_chanreg(rt2x00dev, 10, 0x51); -- rt2800_rfcsr_write_chanreg(rt2x00dev, 14, 0x06); -- rt2800_rfcsr_write_chanreg(rt2x00dev, 19, 0xA7); -- rt2800_rfcsr_write_chanreg(rt2x00dev, 28, 0x2C); -- rt2800_rfcsr_write_chanreg(rt2x00dev, 55, 0x64); -- rt2800_rfcsr_write_chanreg(rt2x00dev, 8, 0x51); -- rt2800_rfcsr_write_chanreg(rt2x00dev, 9, 0x36); -- rt2800_rfcsr_write_chanreg(rt2x00dev, 11, 0x53); -- rt2800_rfcsr_write_chanreg(rt2x00dev, 14, 0x16); -- -- rt2800_rfcsr_write_chanreg(rt2x00dev, 47, 0x6C); -- rt2800_rfcsr_write_chanreg(rt2x00dev, 48, 0xFC); -- rt2800_rfcsr_write_chanreg(rt2x00dev, 49, 0x1F); -- rt2800_rfcsr_write_chanreg(rt2x00dev, 54, 0x27); -- rt2800_rfcsr_write_chanreg(rt2x00dev, 55, 0x66); -- rt2800_rfcsr_write_chanreg(rt2x00dev, 59, 0x6B); -- -- /* Initialize RF channel register for DRQFN */ -- rt2800_rfcsr_write_chanreg(rt2x00dev, 43, 0xD3); -- rt2800_rfcsr_write_chanreg(rt2x00dev, 44, 0xE3); -- rt2800_rfcsr_write_chanreg(rt2x00dev, 45, 0xE5); -- rt2800_rfcsr_write_chanreg(rt2x00dev, 47, 0x28); -- rt2800_rfcsr_write_chanreg(rt2x00dev, 55, 0x68); -- rt2800_rfcsr_write_chanreg(rt2x00dev, 56, 0xF7); -- rt2800_rfcsr_write_chanreg(rt2x00dev, 58, 0x02); -- rt2800_rfcsr_write_chanreg(rt2x00dev, 60, 0xC7); -+ if (rt2800_hw_get_chipver(rt2x00dev) > 1) { -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 9, 0x47); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 10, 0x71); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 11, 0x33); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 14, 0x0E); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 17, 0x23); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 19, 0xA4); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 20, 0x02); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 21, 0x12); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 28, 0x1C); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 29, 0xEB); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 32, 0x7D); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 34, 0xD6); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 36, 0x08); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 38, 0xB4); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 43, 0xD3); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 44, 0xB3); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 45, 0xD5); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 46, 0x27); -+ rt2800_rfcsr_write_bank(rt2x00dev, 4, 47, 0x67); -+ rt2800_rfcsr_write_bank(rt2x00dev, 6, 47, 0x69); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 48, 0xFF); -+ rt2800_rfcsr_write_bank(rt2x00dev, 4, 54, 0x27); -+ rt2800_rfcsr_write_bank(rt2x00dev, 6, 54, 0x20); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 55, 0x66); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 56, 0xFF); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 57, 0x1C); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 58, 0x20); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 59, 0x6B); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 60, 0xF7); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 61, 0x09); -+ } -+ -+ if (rt2800_hw_get_chipver(rt2x00dev) > 1 && -+ rt2800_hw_get_chipeco(rt2x00dev) >= 2) { -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 10, 0x51); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 14, 0x06); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 19, 0xA7); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 28, 0x2C); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 55, 0x64); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 8, 0x51); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 9, 0x36); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 11, 0x53); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 14, 0x16); -+ -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 47, 0x6C); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 48, 0xFC); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 49, 0x1F); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 54, 0x27); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 55, 0x66); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 59, 0x6B); -+ } -+ -+ if (rt2800_hw_get_chippkg(rt2x00dev) == 0 && -+ rt2800_hw_get_chipver(rt2x00dev) == 1) { -+ /* Initialize RF channel register for DRQFN */ -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 43, 0xD3); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 44, 0xE3); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 45, 0xE5); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 47, 0x28); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 55, 0x68); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 56, 0xF7); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 58, 0x02); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 60, 0xC7); -+ } - - /* Initialize RF DC calibration register to default value */ - rt2800_rfcsr_write_dccal(rt2x00dev, 0, 0x47); -@@ -10617,12 +10658,17 @@ static void rt2800_init_rfcsr_6352(struc - rt2800_rfcsr_write_dccal(rt2x00dev, 62, 0x00); - rt2800_rfcsr_write_dccal(rt2x00dev, 63, 0x00); - -- rt2800_rfcsr_write_dccal(rt2x00dev, 3, 0x08); -- rt2800_rfcsr_write_dccal(rt2x00dev, 4, 0x04); -- rt2800_rfcsr_write_dccal(rt2x00dev, 5, 0x20); -+ if (rt2800_hw_get_chipver(rt2x00dev) > 1) { -+ rt2800_rfcsr_write_dccal(rt2x00dev, 3, 0x08); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 4, 0x04); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 5, 0x20); -+ } - -- rt2800_rfcsr_write_dccal(rt2x00dev, 5, 0x00); -- rt2800_rfcsr_write_dccal(rt2x00dev, 17, 0x7C); -+ if (rt2800_hw_get_chipver(rt2x00dev) > 1 && -+ rt2800_hw_get_chipeco(rt2x00dev) >= 2) { -+ rt2800_rfcsr_write_dccal(rt2x00dev, 5, 0x00); -+ rt2800_rfcsr_write_dccal(rt2x00dev, 17, 0x7C); -+ } - - rt6352_enable_pa_pin(rt2x00dev, 0); - rt2800_r_calibration(rt2x00dev); diff --git a/package/kernel/mac80211/patches/rt2x00/998-wifi-rt2x00-rework-MT7620-PA-LNA-RF-calibration.patch b/package/kernel/mac80211/patches/rt2x00/998-wifi-rt2x00-rework-MT7620-PA-LNA-RF-calibration.patch deleted file mode 100644 index 5f6f5140d9..0000000000 --- a/package/kernel/mac80211/patches/rt2x00/998-wifi-rt2x00-rework-MT7620-PA-LNA-RF-calibration.patch +++ /dev/null @@ -1,413 +0,0 @@ -From: Shiji Yang -Date: Tue, 25 Jul 2023 20:05:06 +0800 -Subject: [PATCH] wifi: rt2x00: rework MT7620 PA/LNA RF calibration - -1. Move MT7620 PA/LNA calibration code to dedicated functions. -2. For external PA/LNA devices, restore RF and BBP registers before - R-Calibration. -3. Do Rx DCOC calibration again before RXIQ calibration. -4. Correct MAC_SYS_CTRL register RX mask to 0x08 in R-Calibration - function. For MAC_SYS_CTRL register, Bit[2] controls MAC_TX_EN - and Bit[3] controls MAC_RX_EN (Bit index starts from 0). -5. Move the channel configuration code from rt2800_vco_calibration() - to the rt2800_config_channel(). -6. Use MT7620 SOC specific AGC initial LNA value instead of the - RT5592's value. -7. Adjust the register operation sequence according to the vendor - driver code. This may not be useful, but it can make things - clearer when developers try to review it. - -Signed-off-by: Shiji Yang ---- - .../net/wireless/ralink/rt2x00/rt2800lib.c | 306 ++++++++++-------- - drivers/net/wireless/ralink/rt2x00/rt2x00.h | 6 + - 2 files changed, 182 insertions(+), 130 deletions(-) - ---- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -3881,14 +3881,6 @@ static void rt2800_config_channel_rf7620 - rfcsr |= tx_agc_fc; - rt2800_rfcsr_write_bank(rt2x00dev, 7, 59, rfcsr); - } -- -- if (conf_is_ht40(conf)) { -- rt2800_bbp_glrt_write(rt2x00dev, 141, 0x10); -- rt2800_bbp_glrt_write(rt2x00dev, 157, 0x2f); -- } else { -- rt2800_bbp_glrt_write(rt2x00dev, 141, 0x1a); -- rt2800_bbp_glrt_write(rt2x00dev, 157, 0x40); -- } - } - - static void rt2800_config_alc_rt6352(struct rt2x00_dev *rt2x00dev, -@@ -4457,89 +4449,63 @@ static void rt2800_config_channel(struct - usleep_range(1000, 1500); - } - -- if (rt2x00_rt(rt2x00dev, RT5592) || rt2x00_rt(rt2x00dev, RT6352)) { -+ if (rt2x00_rt(rt2x00dev, RT5592)) { - reg = 0x10; -- if (!conf_is_ht40(conf)) { -- if (rt2x00_rt(rt2x00dev, RT6352) && -- rt2x00_has_cap_external_lna_bg(rt2x00dev)) { -- reg |= 0x5; -- } else { -- reg |= 0xa; -- } -- } -+ if (!conf_is_ht40(conf)) -+ reg |= 0xa; - rt2800_bbp_write(rt2x00dev, 195, 141); - rt2800_bbp_write(rt2x00dev, 196, reg); - -- /* AGC init. -- * Despite the vendor driver using different values here for -- * RT6352 chip, we use 0x1c for now. This may have to be changed -- * once TSSI got implemented. -- */ - reg = (rf->channel <= 14 ? 0x1c : 0x24) + 2*rt2x00dev->lna_gain; - rt2800_bbp_write_with_rx_chain(rt2x00dev, 66, reg); -- -- if (rt2x00_rt(rt2x00dev, RT5592)) -- rt2800_iq_calibrate(rt2x00dev, rf->channel); -+ -+ rt2800_iq_calibrate(rt2x00dev, rf->channel); - } - - if (rt2x00_rt(rt2x00dev, RT6352)) { -- if (test_bit(CAPABILITY_EXTERNAL_PA_TX0, -- &rt2x00dev->cap_flags)) { -- reg = rt2800_register_read(rt2x00dev, RF_CONTROL3); -- reg |= 0x00000101; -- rt2800_register_write(rt2x00dev, RF_CONTROL3, reg); -- -- reg = rt2800_register_read(rt2x00dev, RF_BYPASS3); -- reg |= 0x00000101; -- rt2800_register_write(rt2x00dev, RF_BYPASS3, reg); -- -- rt2800_rfcsr_write_chanreg(rt2x00dev, 43, 0x73); -- rt2800_rfcsr_write_chanreg(rt2x00dev, 44, 0x73); -- rt2800_rfcsr_write_chanreg(rt2x00dev, 45, 0x73); -- rt2800_rfcsr_write_chanreg(rt2x00dev, 46, 0x27); -- rt2800_rfcsr_write_chanreg(rt2x00dev, 47, 0xC8); -- rt2800_rfcsr_write_chanreg(rt2x00dev, 48, 0xA4); -- rt2800_rfcsr_write_chanreg(rt2x00dev, 49, 0x05); -- rt2800_rfcsr_write_chanreg(rt2x00dev, 54, 0x27); -- rt2800_rfcsr_write_chanreg(rt2x00dev, 55, 0xC8); -- rt2800_rfcsr_write_chanreg(rt2x00dev, 56, 0xA4); -- rt2800_rfcsr_write_chanreg(rt2x00dev, 57, 0x05); -- rt2800_rfcsr_write_chanreg(rt2x00dev, 58, 0x27); -- rt2800_rfcsr_write_chanreg(rt2x00dev, 59, 0xC8); -- rt2800_rfcsr_write_chanreg(rt2x00dev, 60, 0xA4); -- rt2800_rfcsr_write_chanreg(rt2x00dev, 61, 0x05); -- rt2800_rfcsr_write_dccal(rt2x00dev, 05, 0x00); -+ /* BBP for GLRT BW */ -+ if (conf_is_ht40(conf)) { -+ rt2800_bbp_glrt_write(rt2x00dev, 141, 0x10); -+ rt2800_bbp_glrt_write(rt2x00dev, 157, 0x2f); -+ } else { -+ rt2800_bbp_glrt_write(rt2x00dev, 141, 0x1a); -+ rt2800_bbp_glrt_write(rt2x00dev, 157, 0x40); - -- rt2800_register_write(rt2x00dev, TX0_RF_GAIN_CORRECT, -- 0x36303636); -- rt2800_register_write(rt2x00dev, TX0_RF_GAIN_ATTEN, -- 0x6C6C6B6C); -- rt2800_register_write(rt2x00dev, TX1_RF_GAIN_ATTEN, -- 0x6C6C6B6C); -+ if (rt2800_hw_get_chippkg(rt2x00dev) == 1 && -+ rt2x00_has_cap_external_lna_bg(rt2x00dev)) -+ rt2800_bbp_glrt_write(rt2x00dev, 141, 0x15); - } - -- if (rt2x00_has_cap_external_lna_bg(rt2x00dev)) { -- reg = rt2800_register_read(rt2x00dev, RF_CONTROL3); -- reg |= 0x00000101; -- rt2800_register_write(rt2x00dev, RF_CONTROL3, reg); -- -- reg = rt2800_register_read(rt2x00dev, RF_BYPASS3); -- reg |= 0x00000101; -- rt2800_register_write(rt2x00dev, RF_BYPASS3, reg); -- -- rt2800_rfcsr_write_chanreg(rt2x00dev, 14, 0x66); -- rt2800_rfcsr_write_chanreg(rt2x00dev, 17, 0x20); -- rt2800_rfcsr_write_chanreg(rt2x00dev, 18, 0x42); -- rt2800_bbp_write(rt2x00dev, 75, 0x68); -- rt2800_bbp_write(rt2x00dev, 76, 0x4C); -- rt2800_bbp_write(rt2x00dev, 79, 0x1C); -- rt2800_bbp_write(rt2x00dev, 80, 0x0C); -- rt2800_bbp_write(rt2x00dev, 82, 0xB6); -- /* bank 0 RF reg 42 and glrt BBP reg 141 will be set in -- * config channel function in dependence of channel and -- * HT20/HT40 so don't touch it -- */ -+ if (rt2x00dev->default_ant.rx_chain_num == 1) { -+ rt2800_bbp_write(rt2x00dev, 91, 0x07); -+ rt2800_bbp_write(rt2x00dev, 95, 0x1A); -+ rt2800_bbp_write(rt2x00dev, 195, 128); -+ rt2800_bbp_write(rt2x00dev, 196, 0xA0); -+ rt2800_bbp_write(rt2x00dev, 195, 170); -+ rt2800_bbp_write(rt2x00dev, 196, 0x12); -+ rt2800_bbp_write(rt2x00dev, 195, 171); -+ rt2800_bbp_write(rt2x00dev, 196, 0x10); -+ } else { -+ rt2800_bbp_write(rt2x00dev, 91, 0x06); -+ rt2800_bbp_write(rt2x00dev, 95, 0x9A); -+ rt2800_bbp_write(rt2x00dev, 195, 128); -+ rt2800_bbp_write(rt2x00dev, 196, 0xE0); -+ rt2800_bbp_write(rt2x00dev, 195, 170); -+ rt2800_bbp_write(rt2x00dev, 196, 0x30); -+ rt2800_bbp_write(rt2x00dev, 195, 171); -+ rt2800_bbp_write(rt2x00dev, 196, 0x30); - } -+ -+ /* AGC init */ -+ reg = rf->channel <= 14 ? 0x04 + 2 * rt2x00dev->lna_gain : 0; -+ rt2800_bbp_write_with_rx_chain(rt2x00dev, 66, reg); -+ -+ /* On 11A, We should delay and wait RF/BBP to be stable -+ * and the appropriate time should be 1000 micro seconds -+ * 2005/06/05 - On 11G, we also need this delay time. -+ * Otherwise it's difficult to pass the WHQL. -+ */ -+ usleep_range(1000, 1500); - } - - bbp = rt2800_bbp_read(rt2x00dev, 4); -@@ -5649,43 +5615,6 @@ void rt2800_vco_calibration(struct rt2x0 - } - } - rt2800_register_write(rt2x00dev, TX_PIN_CFG, tx_pin); -- -- if (rt2x00_rt(rt2x00dev, RT6352)) { -- if (rt2x00dev->default_ant.rx_chain_num == 1) { -- rt2800_bbp_write(rt2x00dev, 91, 0x07); -- rt2800_bbp_write(rt2x00dev, 95, 0x1A); -- rt2800_bbp_write(rt2x00dev, 195, 128); -- rt2800_bbp_write(rt2x00dev, 196, 0xA0); -- rt2800_bbp_write(rt2x00dev, 195, 170); -- rt2800_bbp_write(rt2x00dev, 196, 0x12); -- rt2800_bbp_write(rt2x00dev, 195, 171); -- rt2800_bbp_write(rt2x00dev, 196, 0x10); -- } else { -- rt2800_bbp_write(rt2x00dev, 91, 0x06); -- rt2800_bbp_write(rt2x00dev, 95, 0x9A); -- rt2800_bbp_write(rt2x00dev, 195, 128); -- rt2800_bbp_write(rt2x00dev, 196, 0xE0); -- rt2800_bbp_write(rt2x00dev, 195, 170); -- rt2800_bbp_write(rt2x00dev, 196, 0x30); -- rt2800_bbp_write(rt2x00dev, 195, 171); -- rt2800_bbp_write(rt2x00dev, 196, 0x30); -- } -- -- if (rt2x00_has_cap_external_lna_bg(rt2x00dev)) { -- rt2800_bbp_write(rt2x00dev, 75, 0x68); -- rt2800_bbp_write(rt2x00dev, 76, 0x4C); -- rt2800_bbp_write(rt2x00dev, 79, 0x1C); -- rt2800_bbp_write(rt2x00dev, 80, 0x0C); -- rt2800_bbp_write(rt2x00dev, 82, 0xB6); -- } -- -- /* On 11A, We should delay and wait RF/BBP to be stable -- * and the appropriate time should be 1000 micro seconds -- * 2005/06/05 - On 11G, we also need this delay time. -- * Otherwise it's difficult to pass the WHQL. -- */ -- usleep_range(1000, 1500); -- } - } - EXPORT_SYMBOL_GPL(rt2800_vco_calibration); - -@@ -8650,7 +8579,7 @@ static void rt2800_r_calibration(struct - rt2x00_warn(rt2x00dev, "Wait MAC Tx Status to MAX !!!\n"); - - maccfg = rt2800_register_read(rt2x00dev, MAC_SYS_CTRL); -- maccfg &= (~0x04); -+ maccfg &= (~0x08); - rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, maccfg); - - if (unlikely(rt2800_wait_bbp_rf_ready(rt2x00dev, MAC_STATUS_CFG_BBP_RF_BUSY_RX))) -@@ -10688,30 +10617,143 @@ static void rt2800_init_rfcsr_6352(struc - rt2800_rfcsr_write_dccal(rt2x00dev, 5, 0x00); - rt2800_rfcsr_write_dccal(rt2x00dev, 17, 0x7C); - } -+} - -- rt6352_enable_pa_pin(rt2x00dev, 0); -- rt2800_r_calibration(rt2x00dev); -- rt2800_rf_self_txdc_cal(rt2x00dev); -- rt2800_rxdcoc_calibration(rt2x00dev); -- rt2800_bw_filter_calibration(rt2x00dev, true); -- rt2800_bw_filter_calibration(rt2x00dev, false); -- rt2800_loft_iq_calibration(rt2x00dev); -- rt2800_rxiq_calibration(rt2x00dev); -- rt6352_enable_pa_pin(rt2x00dev, 1); -+static void rt2800_init_palna_rt6352(struct rt2x00_dev *rt2x00dev) -+{ -+ u32 reg; -+ -+ if (rt2x00_has_cap_external_pa(rt2x00dev)) { -+ reg = rt2800_register_read(rt2x00dev, RF_CONTROL3); -+ reg |= 0x00000101; -+ rt2800_register_write(rt2x00dev, RF_CONTROL3, reg); -+ -+ reg = rt2800_register_read(rt2x00dev, RF_BYPASS3); -+ reg |= 0x00000101; -+ rt2800_register_write(rt2x00dev, RF_BYPASS3, reg); -+ } - -- if (rt2x00_has_cap_external_lna_bg(rt2x00dev)) { -+ if (rt2800_hw_get_chippkg(rt2x00dev) == 1 && -+ rt2x00_has_cap_external_lna_bg(rt2x00dev)) { - rt2800_rfcsr_write_chanreg(rt2x00dev, 14, 0x66); - rt2800_rfcsr_write_chanreg(rt2x00dev, 17, 0x20); - rt2800_rfcsr_write_chanreg(rt2x00dev, 18, 0x42); -+ } -+ -+ if (rt2800_hw_get_chippkg(rt2x00dev) == 1 && -+ rt2x00_has_cap_external_pa(rt2x00dev)) { -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 43, 0x73); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 44, 0x73); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 45, 0x73); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 46, 0x27); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 47, 0xC8); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 48, 0xA4); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 49, 0x05); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 54, 0x27); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 55, 0xC8); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 56, 0xA4); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 57, 0x05); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 58, 0x27); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 59, 0xC8); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 60, 0xA4); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 61, 0x05); -+ } -+ -+ if (rt2800_hw_get_chippkg(rt2x00dev) == 1 && -+ rt2x00_has_cap_external_pa(rt2x00dev)) -+ rt2800_rfcsr_write_dccal(rt2x00dev, 05, 0x00); -+ -+ if (rt2800_hw_get_chippkg(rt2x00dev) == 1 && -+ rt2x00_has_cap_external_lna_bg(rt2x00dev)) { - rt2800_bbp_write(rt2x00dev, 75, 0x68); - rt2800_bbp_write(rt2x00dev, 76, 0x4C); - rt2800_bbp_write(rt2x00dev, 79, 0x1C); - rt2800_bbp_write(rt2x00dev, 80, 0x0C); - rt2800_bbp_write(rt2x00dev, 82, 0xB6); -- /* bank 0 RF reg 42 and glrt BBP reg 141 will be set in config -- * channel function in dependence of channel and HT20/HT40, -- * so don't touch them here. -- */ -+ } -+ -+ if (rt2800_hw_get_chippkg(rt2x00dev) == 1 && -+ rt2x00_has_cap_external_pa(rt2x00dev)) { -+ rt2800_register_write(rt2x00dev, TX0_RF_GAIN_CORRECT, 0x36303636); -+ rt2800_register_write(rt2x00dev, TX0_RF_GAIN_ATTEN, 0x6C6C6B6C); -+ rt2800_register_write(rt2x00dev, TX1_RF_GAIN_ATTEN, 0x6C6C6B6C); -+ } -+} -+ -+static void rt2800_restore_rf_bbp_rt6352(struct rt2x00_dev *rt2x00dev) -+{ -+ if (rt2x00_has_cap_external_pa(rt2x00dev)) { -+ rt2800_register_write(rt2x00dev, RF_CONTROL3, 0x0); -+ rt2800_register_write(rt2x00dev, RF_BYPASS3, 0x0); -+ } -+ -+ if (rt2800_hw_get_chippkg(rt2x00dev) == 1 && -+ rt2x00_has_cap_external_lna_bg(rt2x00dev)) { -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 14, 0x16); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 17, 0x23); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 18, 0x02); -+ } -+ -+ if (rt2800_hw_get_chippkg(rt2x00dev) == 1 && -+ rt2x00_has_cap_external_pa(rt2x00dev)) { -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 43, 0xD3); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 44, 0xB3); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 45, 0xD5); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 46, 0x27); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 47, 0x6C); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 48, 0xFC); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 49, 0x1F); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 54, 0x27); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 55, 0x66); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 56, 0xFF); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 57, 0x1C); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 58, 0x20); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 59, 0x6B); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 60, 0xF7); -+ rt2800_rfcsr_write_chanreg(rt2x00dev, 61, 0x09); -+ } -+ -+ if (rt2800_hw_get_chippkg(rt2x00dev) == 1 && -+ rt2x00_has_cap_external_lna_bg(rt2x00dev)) { -+ rt2800_bbp_write(rt2x00dev, 75, 0x60); -+ rt2800_bbp_write(rt2x00dev, 76, 0x44); -+ rt2800_bbp_write(rt2x00dev, 79, 0x1C); -+ rt2800_bbp_write(rt2x00dev, 80, 0x0C); -+ rt2800_bbp_write(rt2x00dev, 82, 0xB6); -+ } -+ -+ if (rt2800_hw_get_chippkg(rt2x00dev) == 1 && -+ rt2x00_has_cap_external_pa(rt2x00dev)) { -+ rt2800_register_write(rt2x00dev, TX0_RF_GAIN_CORRECT, 0x3630363A); -+ rt2800_register_write(rt2x00dev, TX0_RF_GAIN_ATTEN, 0x6C6C666C); -+ rt2800_register_write(rt2x00dev, TX1_RF_GAIN_ATTEN, 0x6C6C666C); -+ } -+} -+ -+static void rt2800_calibration_rt6352(struct rt2x00_dev *rt2x00dev) -+{ -+ if (rt2x00_has_cap_external_pa(rt2x00dev) || -+ rt2x00_has_cap_external_lna_bg(rt2x00dev)) { -+ rt6352_enable_pa_pin(rt2x00dev, 0); -+ rt2800_restore_rf_bbp_rt6352(rt2x00dev); -+ } -+ -+ rt2800_r_calibration(rt2x00dev); -+ rt2800_rf_self_txdc_cal(rt2x00dev); -+ rt2800_rxdcoc_calibration(rt2x00dev); -+ rt2800_bw_filter_calibration(rt2x00dev, true); -+ rt2800_bw_filter_calibration(rt2x00dev, false); -+ rt2800_loft_iq_calibration(rt2x00dev); -+ -+ /* missing DPD Calibration for devices using internal PA */ -+ -+ rt2800_rxdcoc_calibration(rt2x00dev); -+ rt2800_rxiq_calibration(rt2x00dev); -+ -+ if (rt2x00_has_cap_external_pa(rt2x00dev) || -+ rt2x00_has_cap_external_lna_bg(rt2x00dev)) { -+ rt6352_enable_pa_pin(rt2x00dev, 1); -+ rt2800_init_palna_rt6352(rt2x00dev); - } - } - -@@ -10804,6 +10846,10 @@ int rt2800_enable_radio(struct rt2x00_de - rt2800_init_bbp(rt2x00dev); - rt2800_init_rfcsr(rt2x00dev); - -+ /* Do calibration and init PA/LNA for RT6352 */ -+ if (rt2x00_rt(rt2x00dev, RT6352)) -+ rt2800_calibration_rt6352(rt2x00dev); -+ - if (rt2x00_is_usb(rt2x00dev) && - (rt2x00_rt(rt2x00dev, RT3070) || - rt2x00_rt(rt2x00dev, RT3071) || ---- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h -+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h -@@ -1277,6 +1277,12 @@ rt2x00_has_cap_external_lna_bg(struct rt - } - - static inline bool -+rt2x00_has_cap_external_pa(struct rt2x00_dev *rt2x00dev) -+{ -+ return rt2x00_has_cap_flag(rt2x00dev, CAPABILITY_EXTERNAL_PA_TX0); -+} -+ -+static inline bool - rt2x00_has_cap_double_antenna(struct rt2x00_dev *rt2x00dev) - { - return rt2x00_has_cap_flag(rt2x00dev, CAPABILITY_DOUBLE_ANTENNA);