mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-30 10:39:04 +00:00
mac80211: update to version 6.9.9
Brings lots of driver updates and API changes needed for mt76 updates. Disable iwlwifi and ath11k on 5.15, since backport is too difficult, and the only remaining targets won't need those drivers. Signed-off-by: Felix Fietkau <nbd@nbd.name>
This commit is contained in:
parent
a98cacbeb4
commit
1bfcc1ea8a
35
package/kernel/ath10k-ct/patches/010-mac80211_backport.patch
Normal file
35
package/kernel/ath10k-ct/patches/010-mac80211_backport.patch
Normal file
@ -0,0 +1,35 @@
|
||||
--- a/ath10k-6.4/mac.c
|
||||
+++ b/ath10k-6.4/mac.c
|
||||
@@ -2310,8 +2310,8 @@ static void ath10k_mac_vif_ap_csa_count_
|
||||
if (!arvif->is_up)
|
||||
return;
|
||||
|
||||
- if (!ieee80211_beacon_cntdwn_is_complete(vif)) {
|
||||
- ieee80211_beacon_update_cntdwn(vif);
|
||||
+ if (!ieee80211_beacon_cntdwn_is_complete(vif, 0)) {
|
||||
+ ieee80211_beacon_update_cntdwn(vif, 0);
|
||||
|
||||
ret = ath10k_mac_setup_bcn_tmpl(arvif);
|
||||
if (ret)
|
||||
@@ -2323,7 +2323,7 @@ static void ath10k_mac_vif_ap_csa_count_
|
||||
ath10k_warn(ar, "failed to update prb tmpl during csa: %d\n",
|
||||
ret);
|
||||
} else {
|
||||
- ieee80211_csa_finish(vif);
|
||||
+ ieee80211_csa_finish(vif, 0);
|
||||
}
|
||||
}
|
||||
|
||||
--- a/ath10k-6.4/wmi.c
|
||||
+++ b/ath10k-6.4/wmi.c
|
||||
@@ -4284,8 +4284,8 @@ void ath10k_wmi_event_host_swba(struct a
|
||||
* actual channel switch is done
|
||||
*/
|
||||
if (arvif->vif->bss_conf.csa_active &&
|
||||
- ieee80211_beacon_cntdwn_is_complete(arvif->vif)) {
|
||||
- ieee80211_csa_finish(arvif->vif);
|
||||
+ ieee80211_beacon_cntdwn_is_complete(arvif->vif, 0)) {
|
||||
+ ieee80211_csa_finish(arvif->vif, 0);
|
||||
continue;
|
||||
}
|
||||
|
@ -10,13 +10,13 @@ include $(INCLUDE_DIR)/kernel.mk
|
||||
|
||||
PKG_NAME:=mac80211
|
||||
|
||||
PKG_VERSION:=6.6.15
|
||||
PKG_RELEASE:=2
|
||||
PKG_VERSION:=6.9.9
|
||||
PKG_RELEASE:=1
|
||||
PKG_LICENSE:=GPL-2.0-only
|
||||
PKG_LICENSE_FILES:=COPYING
|
||||
|
||||
PKG_SOURCE_URL:=http://mirror2.openwrt.org/sources/
|
||||
PKG_HASH:=3bbc461121134fda9089c084a5eed577d05e7837a157edf9a3797937172a3ece
|
||||
PKG_HASH:=3417da091a57c7b1c145d44c1fae9f1e0bac6d0c8ad61b37e57b0a802eeb2837
|
||||
|
||||
PKG_SOURCE:=backports-$(PKG_VERSION).tar.xz
|
||||
PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/$(if $(BUILD_VARIANT),$(PKG_NAME)-$(BUILD_VARIANT)/)backports-$(PKG_VERSION)
|
||||
@ -333,7 +333,6 @@ endif
|
||||
ifeq ($(strip $(CONFIG_EXTERNAL_KERNEL_TREE)),"")
|
||||
ifeq ($(strip $(CONFIG_KERNEL_GIT_CLONE_URI)),"")
|
||||
define Build/Configure
|
||||
cmp $(PKG_BUILD_DIR)/include/linux/ath9k_platform.h $(LINUX_DIR)/include/linux/ath9k_platform.h
|
||||
cmp $(PKG_BUILD_DIR)/include/linux/ath5k_platform.h $(LINUX_DIR)/include/linux/ath5k_platform.h
|
||||
cmp $(PKG_BUILD_DIR)/include/linux/rt2x00_platform.h $(LINUX_DIR)/include/linux/rt2x00_platform.h
|
||||
endef
|
||||
|
@ -296,7 +296,7 @@ define KernelPackage/ath11k
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
TITLE:=Qualcomm 802.11ax wireless chipset support (common code)
|
||||
URL:=https://wireless.wiki.kernel.org/en/users/drivers/ath11k
|
||||
DEPENDS+= +kmod-ath +@DRIVER_11AC_SUPPORT +@DRIVER_11AX_SUPPORT \
|
||||
DEPENDS+= +kmod-ath +@DRIVER_11AC_SUPPORT +@DRIVER_11AX_SUPPORT @!LINUX_5_15 \
|
||||
+kmod-crypto-michael-mic +ATH11K_THERMAL:kmod-hwmon-core +ATH11K_THERMAL:kmod-thermal
|
||||
FILES:=$(PKG_BUILD_DIR)/drivers/soc/qcom/qmi_helpers.ko \
|
||||
$(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath11k/ath11k.ko
|
||||
|
@ -6,7 +6,7 @@ config-$(CONFIG_PACKAGE_IWLWIFI_DEBUGFS)+= IWLWIFI_DEBUGFS
|
||||
|
||||
define KernelPackage/iwlwifi
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
DEPENDS:= +kmod-mac80211 +kmod-ptp @PCI_SUPPORT +@DRIVER_11AC_SUPPORT +@DRIVER_11AX_SUPPORT
|
||||
DEPENDS:= +kmod-mac80211 +kmod-ptp @PCI_SUPPORT +@DRIVER_11AC_SUPPORT +@DRIVER_11AX_SUPPORT @!LINUX_5_15
|
||||
TITLE:=Intel AGN Wireless support
|
||||
FILES:= \
|
||||
$(PKG_BUILD_DIR)/drivers/net/wireless/intel/iwlwifi/iwlwifi.ko \
|
||||
|
@ -1,117 +0,0 @@
|
||||
From e8053643b6d70e23a634f14e4408f3a6d1d3a6bf Mon Sep 17 00:00:00 2001
|
||||
From: Shiji Yang <yangshiji66@qq.com>
|
||||
Date: Sat, 27 May 2023 09:04:48 +0000
|
||||
Subject: [PATCH] wifi: ath: add struct_group for struct ath_cycle_counters
|
||||
|
||||
Add a struct_group to around all members in struct ath_cycle_counters.
|
||||
It can help the compiler detect the intended bounds of the memcpy() and
|
||||
memset().
|
||||
|
||||
This patch fixes the following build warning:
|
||||
|
||||
In function 'fortify_memset_chk',
|
||||
inlined from 'ath9k_ps_wakeup' at /home/db/openwrt/build_dir/target-mips_24kc_musl/linux-ath79_generic/backports-6.1.24/drivers/net/wireless/ath/ath9k/main.c:140:3:
|
||||
./include/linux/fortify-string.h:314:25: error: call to '__write_overflow_field' declared with attribute warning: detected write beyond size of field (1st parameter); maybe use struct_group()? [-Werror=attribute-warning]
|
||||
314 | __write_overflow_field(p_size_field, size);
|
||||
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Signed-off-by: Shiji Yang <yangshiji66@qq.com>
|
||||
---
|
||||
drivers/net/wireless/ath/ath.h | 10 ++++++----
|
||||
drivers/net/wireless/ath/ath5k/ani.c | 2 +-
|
||||
drivers/net/wireless/ath/ath5k/base.c | 4 ++--
|
||||
drivers/net/wireless/ath/ath5k/mac80211-ops.c | 2 +-
|
||||
drivers/net/wireless/ath/ath9k/link.c | 2 +-
|
||||
drivers/net/wireless/ath/ath9k/main.c | 4 ++--
|
||||
drivers/net/wireless/ath/hw.c | 2 +-
|
||||
7 files changed, 14 insertions(+), 12 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath.h
|
||||
+++ b/drivers/net/wireless/ath/ath.h
|
||||
@@ -43,10 +43,12 @@ struct ath_ani {
|
||||
};
|
||||
|
||||
struct ath_cycle_counters {
|
||||
- u32 cycles;
|
||||
- u32 rx_busy;
|
||||
- u32 rx_frame;
|
||||
- u32 tx_frame;
|
||||
+ struct_group(cnts,
|
||||
+ u32 cycles;
|
||||
+ u32 rx_busy;
|
||||
+ u32 rx_frame;
|
||||
+ u32 tx_frame;
|
||||
+ );
|
||||
};
|
||||
|
||||
enum ath_device_state {
|
||||
--- a/drivers/net/wireless/ath/ath5k/ani.c
|
||||
+++ b/drivers/net/wireless/ath/ath5k/ani.c
|
||||
@@ -379,7 +379,7 @@ ath5k_hw_ani_get_listen_time(struct ath5
|
||||
spin_lock_bh(&common->cc_lock);
|
||||
|
||||
ath_hw_cycle_counters_update(common);
|
||||
- memcpy(&as->last_cc, &common->cc_ani, sizeof(as->last_cc));
|
||||
+ memcpy(&as->last_cc.cnts, &common->cc_ani.cnts, sizeof(as->last_cc.cnts));
|
||||
|
||||
/* clears common->cc_ani */
|
||||
listen = ath_hw_get_listen_time(common);
|
||||
--- a/drivers/net/wireless/ath/ath5k/base.c
|
||||
+++ b/drivers/net/wireless/ath/ath5k/base.c
|
||||
@@ -2985,8 +2985,8 @@ ath5k_reset(struct ath5k_hw *ah, struct
|
||||
memset(&ah->survey, 0, sizeof(ah->survey));
|
||||
spin_lock_bh(&common->cc_lock);
|
||||
ath_hw_cycle_counters_update(common);
|
||||
- memset(&common->cc_survey, 0, sizeof(common->cc_survey));
|
||||
- memset(&common->cc_ani, 0, sizeof(common->cc_ani));
|
||||
+ memset(&common->cc_survey.cnts, 0, sizeof(common->cc_survey.cnts));
|
||||
+ memset(&common->cc_ani.cnts, 0, sizeof(common->cc_ani.cnts));
|
||||
spin_unlock_bh(&common->cc_lock);
|
||||
|
||||
/*
|
||||
--- a/drivers/net/wireless/ath/ath5k/mac80211-ops.c
|
||||
+++ b/drivers/net/wireless/ath/ath5k/mac80211-ops.c
|
||||
@@ -664,7 +664,7 @@ ath5k_get_survey(struct ieee80211_hw *hw
|
||||
ah->survey.time_rx += cc->rx_frame / div;
|
||||
ah->survey.time_tx += cc->tx_frame / div;
|
||||
}
|
||||
- memset(cc, 0, sizeof(*cc));
|
||||
+ memset(&cc->cnts, 0, sizeof(cc->cnts));
|
||||
spin_unlock_bh(&common->cc_lock);
|
||||
|
||||
memcpy(survey, &ah->survey, sizeof(*survey));
|
||||
--- a/drivers/net/wireless/ath/ath9k/link.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/link.c
|
||||
@@ -536,7 +536,7 @@ int ath_update_survey_stats(struct ath_s
|
||||
if (cc->cycles > 0)
|
||||
ret = cc->rx_busy * 100 / cc->cycles;
|
||||
|
||||
- memset(cc, 0, sizeof(*cc));
|
||||
+ memset(&cc->cnts, 0, sizeof(cc->cnts));
|
||||
|
||||
ath_update_survey_nf(sc, pos);
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath9k/main.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/main.c
|
||||
@@ -135,8 +135,8 @@ void ath9k_ps_wakeup(struct ath_softc *s
|
||||
if (power_mode != ATH9K_PM_AWAKE) {
|
||||
spin_lock(&common->cc_lock);
|
||||
ath_hw_cycle_counters_update(common);
|
||||
- memset(&common->cc_survey, 0, sizeof(common->cc_survey));
|
||||
- memset(&common->cc_ani, 0, sizeof(common->cc_ani));
|
||||
+ memset(&common->cc_survey.cnts, 0, sizeof(common->cc_survey.cnts));
|
||||
+ memset(&common->cc_ani.cnts, 0, sizeof(common->cc_ani.cnts));
|
||||
spin_unlock(&common->cc_lock);
|
||||
}
|
||||
|
||||
--- a/drivers/net/wireless/ath/hw.c
|
||||
+++ b/drivers/net/wireless/ath/hw.c
|
||||
@@ -183,7 +183,7 @@ int32_t ath_hw_get_listen_time(struct at
|
||||
listen_time = (cc->cycles - cc->rx_frame - cc->tx_frame) /
|
||||
(common->clockrate * 1000);
|
||||
|
||||
- memset(cc, 0, sizeof(*cc));
|
||||
+ memset(&cc->cnts, 0, sizeof(cc->cnts));
|
||||
|
||||
return listen_time;
|
||||
}
|
@ -82,7 +82,7 @@
|
||||
help
|
||||
--- a/local-symbols
|
||||
+++ b/local-symbols
|
||||
@@ -101,6 +101,7 @@ ADM8211=
|
||||
@@ -94,6 +94,7 @@ ADM8211=
|
||||
ATH_COMMON=
|
||||
WLAN_VENDOR_ATH=
|
||||
ATH_DEBUG=
|
||||
|
@ -1,6 +1,6 @@
|
||||
--- a/net/wireless/reg.c
|
||||
+++ b/net/wireless/reg.c
|
||||
@@ -3340,6 +3340,8 @@ void regulatory_hint_country_ie(struct w
|
||||
@@ -3364,6 +3364,8 @@ void regulatory_hint_country_ie(struct w
|
||||
enum environment_cap env = ENVIRON_ANY;
|
||||
struct regulatory_request *request = NULL, *lr;
|
||||
|
||||
@ -9,7 +9,7 @@
|
||||
/* IE len must be evenly divisible by 2 */
|
||||
if (country_ie_len & 0x01)
|
||||
return;
|
||||
@@ -3591,6 +3593,7 @@ static bool is_wiphy_all_set_reg_flag(en
|
||||
@@ -3615,6 +3617,7 @@ static bool is_wiphy_all_set_reg_flag(en
|
||||
|
||||
void regulatory_hint_disconnect(void)
|
||||
{
|
||||
|
@ -18,7 +18,7 @@
|
||||
static bool
|
||||
ath5k_pci_eeprom_read(struct ath_common *common, u32 offset, u16 *data)
|
||||
@@ -79,6 +80,19 @@ ath5k_pci_eeprom_read(struct ath_common
|
||||
struct ath5k_hw *ah = (struct ath5k_hw *) common->ah;
|
||||
struct ath5k_hw *ah = common->ah;
|
||||
u32 status, timeout;
|
||||
|
||||
+ struct ath5k_platform_data *pdata = NULL;
|
||||
|
@ -1,51 +0,0 @@
|
||||
[PATCH 1/2] carl9170: re-fix fortified-memset warning
|
||||
@ 2023-06-23 15:23 Arnd Bergmann
|
||||
2023-06-23 15:24 ` [PATCH 2/2] mac80211: make ieee80211_tx_info padding explicit Arnd Bergmann
|
||||
` (2 more replies)
|
||||
0 siblings, 3 replies; 9+ messages in thread
|
||||
From: Arnd Bergmann @ 2023-06-23 15:23 UTC (permalink / raw)
|
||||
To: Christian Lamparter, Kalle Valo, Kees Cook, Johannes Berg
|
||||
Cc: Arnd Bergmann, linux-wireless, linux-kernel
|
||||
|
||||
From: Arnd Bergmann <arnd@arndb.de>
|
||||
|
||||
The carl9170_tx_release() function sometimes triggers a fortified-memset
|
||||
warning in my randconfig builds:
|
||||
|
||||
In file included from include/linux/string.h:254,
|
||||
from drivers/net/wireless/ath/carl9170/tx.c:40:
|
||||
In function 'fortify_memset_chk',
|
||||
inlined from 'carl9170_tx_release' at drivers/net/wireless/ath/carl9170/tx.c:283:2,
|
||||
inlined from 'kref_put' at include/linux/kref.h:65:3,
|
||||
inlined from 'carl9170_tx_put_skb' at drivers/net/wireless/ath/carl9170/tx.c:342:9:
|
||||
include/linux/fortify-string.h:493:25: error: call to '__write_overflow_field' declared with attribute warning: detected write beyond size of field (1st parameter); maybe use struct_group()? [-Werror=attribute-warning]
|
||||
493 | __write_overflow_field(p_size_field, size);
|
||||
|
||||
Kees previously tried to avoid this by using memset_after(), but it seems
|
||||
this does not fully address the problem. I noticed that the memset_after()
|
||||
here is done on a different part of the union (status) than the original
|
||||
cast was from (rate_driver_data), which may confuse the compiler.
|
||||
|
||||
Unfortunately, the memset_after() trick does not work on driver_rates[]
|
||||
because that is part of an anonymous struct, and I could not get
|
||||
struct_group() to do this either. Using two separate memset() calls
|
||||
on the two members does address the warning though.
|
||||
|
||||
Fixes: fb5f6a0e8063b ("mac80211: Use memset_after() to clear tx status")
|
||||
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
|
||||
---
|
||||
drivers/net/wireless/ath/carl9170/tx.c | 3 ++-
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/wireless/ath/carl9170/tx.c
|
||||
+++ b/drivers/net/wireless/ath/carl9170/tx.c
|
||||
@@ -280,7 +280,8 @@ static void carl9170_tx_release(struct k
|
||||
* carl9170_tx_fill_rateinfo() has filled the rate information
|
||||
* before we get to this point.
|
||||
*/
|
||||
- memset_after(&txinfo->status, 0, rates);
|
||||
+ memset(&txinfo->pad, 0, sizeof(txinfo->pad));
|
||||
+ memset(&txinfo->rate_driver_data, 0, sizeof(txinfo->rate_driver_data));
|
||||
|
||||
if (atomic_read(&ar->tx_total_queued))
|
||||
ar->tx_schedule = true;
|
@ -1,6 +1,6 @@
|
||||
--- a/drivers/net/wireless/ath/ath10k/Kconfig
|
||||
+++ b/drivers/net/wireless/ath/ath10k/Kconfig
|
||||
@@ -87,6 +87,12 @@ config ATH10K_TRACING
|
||||
@@ -88,6 +88,12 @@ config ATH10K_TRACING
|
||||
help
|
||||
Select this to ath10k use tracing infrastructure.
|
||||
|
||||
@ -37,7 +37,7 @@
|
||||
void ath10k_thermal_event_temperature(struct ath10k *ar, int temperature);
|
||||
--- a/local-symbols
|
||||
+++ b/local-symbols
|
||||
@@ -160,6 +160,7 @@ ATH10K_SNOC=
|
||||
@@ -153,6 +153,7 @@ ATH10K_SNOC=
|
||||
ATH10K_DEBUG=
|
||||
ATH10K_DEBUGFS=
|
||||
ATH10K_SPECTRAL=
|
||||
|
@ -14,7 +14,7 @@ Signed-off-by: Sven Eckelmann <sven@open-mesh.com>
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath10k/core.c
|
||||
+++ b/drivers/net/wireless/ath/ath10k/core.c
|
||||
@@ -3507,6 +3507,16 @@ int ath10k_core_register(struct ath10k *
|
||||
@@ -3527,6 +3527,16 @@ int ath10k_core_register(struct ath10k *
|
||||
|
||||
queue_work(ar->workqueue, &ar->register_work);
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
--- a/drivers/net/wireless/ath/ath10k/mac.c
|
||||
+++ b/drivers/net/wireless/ath/ath10k/mac.c
|
||||
@@ -9917,6 +9917,21 @@ static int ath10k_mac_init_rd(struct ath
|
||||
@@ -9918,6 +9918,21 @@ static int ath10k_mac_init_rd(struct ath
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -22,7 +22,7 @@
|
||||
int ath10k_mac_register(struct ath10k *ar)
|
||||
{
|
||||
static const u32 cipher_suites[] = {
|
||||
@@ -10275,6 +10290,12 @@ int ath10k_mac_register(struct ath10k *a
|
||||
@@ -10280,6 +10295,12 @@ int ath10k_mac_register(struct ath10k *a
|
||||
|
||||
ar->hw->weight_multiplier = ATH10K_AIRTIME_WEIGHT_MULTIPLIER;
|
||||
|
||||
|
@ -38,7 +38,7 @@ Link: https://msgid.link/20230611080505.17393-1-ansuelsmth@gmail.com
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath10k/Kconfig
|
||||
+++ b/drivers/net/wireless/ath/ath10k/Kconfig
|
||||
@@ -72,6 +72,12 @@ config ATH10K_DEBUGFS
|
||||
@@ -73,6 +73,12 @@ config ATH10K_DEBUGFS
|
||||
|
||||
If unsure, say Y to make it easier to debug problems.
|
||||
|
||||
@ -63,7 +63,7 @@ Link: https://msgid.link/20230611080505.17393-1-ansuelsmth@gmail.com
|
||||
ath10k_core-$(CONFIG_DEV_COREDUMP) += coredump.o
|
||||
--- a/local-symbols
|
||||
+++ b/local-symbols
|
||||
@@ -161,6 +161,7 @@ ATH10K_DEBUG=
|
||||
@@ -154,6 +154,7 @@ ATH10K_DEBUG=
|
||||
ATH10K_DEBUGFS=
|
||||
ATH10K_SPECTRAL=
|
||||
ATH10K_THERMAL=
|
||||
@ -73,7 +73,7 @@ Link: https://msgid.link/20230611080505.17393-1-ansuelsmth@gmail.com
|
||||
WCN36XX=
|
||||
--- a/drivers/net/wireless/ath/ath10k/core.c
|
||||
+++ b/drivers/net/wireless/ath/ath10k/core.c
|
||||
@@ -26,6 +26,7 @@
|
||||
@@ -27,6 +27,7 @@
|
||||
#include "testmode.h"
|
||||
#include "wmi-ops.h"
|
||||
#include "coredump.h"
|
||||
@ -81,7 +81,7 @@ Link: https://msgid.link/20230611080505.17393-1-ansuelsmth@gmail.com
|
||||
|
||||
unsigned int ath10k_debug_mask;
|
||||
EXPORT_SYMBOL(ath10k_debug_mask);
|
||||
@@ -67,6 +68,7 @@ static const struct ath10k_hw_params ath
|
||||
@@ -68,6 +69,7 @@ static const struct ath10k_hw_params ath
|
||||
.name = "qca988x hw2.0",
|
||||
.patch_load_addr = QCA988X_HW_2_0_PATCH_LOAD_ADDR,
|
||||
.uart_pin = 7,
|
||||
@ -89,7 +89,7 @@ Link: https://msgid.link/20230611080505.17393-1-ansuelsmth@gmail.com
|
||||
.cc_wraparound_type = ATH10K_HW_CC_WRAP_SHIFTED_ALL,
|
||||
.otp_exe_param = 0,
|
||||
.channel_counters_freq_hz = 88000,
|
||||
@@ -107,6 +109,7 @@ static const struct ath10k_hw_params ath
|
||||
@@ -109,6 +111,7 @@ static const struct ath10k_hw_params ath
|
||||
.name = "qca988x hw2.0 ubiquiti",
|
||||
.patch_load_addr = QCA988X_HW_2_0_PATCH_LOAD_ADDR,
|
||||
.uart_pin = 7,
|
||||
@ -97,7 +97,7 @@ Link: https://msgid.link/20230611080505.17393-1-ansuelsmth@gmail.com
|
||||
.cc_wraparound_type = ATH10K_HW_CC_WRAP_SHIFTED_ALL,
|
||||
.otp_exe_param = 0,
|
||||
.channel_counters_freq_hz = 88000,
|
||||
@@ -148,6 +151,7 @@ static const struct ath10k_hw_params ath
|
||||
@@ -151,6 +154,7 @@ static const struct ath10k_hw_params ath
|
||||
.name = "qca9887 hw1.0",
|
||||
.patch_load_addr = QCA9887_HW_1_0_PATCH_LOAD_ADDR,
|
||||
.uart_pin = 7,
|
||||
@ -105,7 +105,7 @@ Link: https://msgid.link/20230611080505.17393-1-ansuelsmth@gmail.com
|
||||
.cc_wraparound_type = ATH10K_HW_CC_WRAP_SHIFTED_ALL,
|
||||
.otp_exe_param = 0,
|
||||
.channel_counters_freq_hz = 88000,
|
||||
@@ -189,6 +193,7 @@ static const struct ath10k_hw_params ath
|
||||
@@ -193,6 +197,7 @@ static const struct ath10k_hw_params ath
|
||||
.name = "qca6174 hw3.2 sdio",
|
||||
.patch_load_addr = QCA6174_HW_3_0_PATCH_LOAD_ADDR,
|
||||
.uart_pin = 19,
|
||||
@ -113,7 +113,7 @@ Link: https://msgid.link/20230611080505.17393-1-ansuelsmth@gmail.com
|
||||
.otp_exe_param = 0,
|
||||
.channel_counters_freq_hz = 88000,
|
||||
.max_probe_resp_desc_thres = 0,
|
||||
@@ -225,6 +230,7 @@ static const struct ath10k_hw_params ath
|
||||
@@ -230,6 +235,7 @@ static const struct ath10k_hw_params ath
|
||||
.name = "qca6164 hw2.1",
|
||||
.patch_load_addr = QCA6174_HW_2_1_PATCH_LOAD_ADDR,
|
||||
.uart_pin = 6,
|
||||
@ -121,7 +121,7 @@ Link: https://msgid.link/20230611080505.17393-1-ansuelsmth@gmail.com
|
||||
.otp_exe_param = 0,
|
||||
.channel_counters_freq_hz = 88000,
|
||||
.max_probe_resp_desc_thres = 0,
|
||||
@@ -265,6 +271,7 @@ static const struct ath10k_hw_params ath
|
||||
@@ -271,6 +277,7 @@ static const struct ath10k_hw_params ath
|
||||
.name = "qca6174 hw2.1",
|
||||
.patch_load_addr = QCA6174_HW_2_1_PATCH_LOAD_ADDR,
|
||||
.uart_pin = 6,
|
||||
@ -129,7 +129,7 @@ Link: https://msgid.link/20230611080505.17393-1-ansuelsmth@gmail.com
|
||||
.otp_exe_param = 0,
|
||||
.channel_counters_freq_hz = 88000,
|
||||
.max_probe_resp_desc_thres = 0,
|
||||
@@ -305,6 +312,7 @@ static const struct ath10k_hw_params ath
|
||||
@@ -312,6 +319,7 @@ static const struct ath10k_hw_params ath
|
||||
.name = "qca6174 hw3.0",
|
||||
.patch_load_addr = QCA6174_HW_3_0_PATCH_LOAD_ADDR,
|
||||
.uart_pin = 6,
|
||||
@ -137,7 +137,7 @@ Link: https://msgid.link/20230611080505.17393-1-ansuelsmth@gmail.com
|
||||
.otp_exe_param = 0,
|
||||
.channel_counters_freq_hz = 88000,
|
||||
.max_probe_resp_desc_thres = 0,
|
||||
@@ -345,6 +353,7 @@ static const struct ath10k_hw_params ath
|
||||
@@ -353,6 +361,7 @@ static const struct ath10k_hw_params ath
|
||||
.name = "qca6174 hw3.2",
|
||||
.patch_load_addr = QCA6174_HW_3_0_PATCH_LOAD_ADDR,
|
||||
.uart_pin = 6,
|
||||
@ -145,7 +145,7 @@ Link: https://msgid.link/20230611080505.17393-1-ansuelsmth@gmail.com
|
||||
.otp_exe_param = 0,
|
||||
.channel_counters_freq_hz = 88000,
|
||||
.max_probe_resp_desc_thres = 0,
|
||||
@@ -389,6 +398,7 @@ static const struct ath10k_hw_params ath
|
||||
@@ -398,6 +407,7 @@ static const struct ath10k_hw_params ath
|
||||
.name = "qca99x0 hw2.0",
|
||||
.patch_load_addr = QCA99X0_HW_2_0_PATCH_LOAD_ADDR,
|
||||
.uart_pin = 7,
|
||||
@ -153,7 +153,7 @@ Link: https://msgid.link/20230611080505.17393-1-ansuelsmth@gmail.com
|
||||
.otp_exe_param = 0x00000700,
|
||||
.continuous_frag_desc = true,
|
||||
.cck_rate_map_rev2 = true,
|
||||
@@ -435,6 +445,7 @@ static const struct ath10k_hw_params ath
|
||||
@@ -445,6 +455,7 @@ static const struct ath10k_hw_params ath
|
||||
.name = "qca9984/qca9994 hw1.0",
|
||||
.patch_load_addr = QCA9984_HW_1_0_PATCH_LOAD_ADDR,
|
||||
.uart_pin = 7,
|
||||
@ -161,7 +161,7 @@ Link: https://msgid.link/20230611080505.17393-1-ansuelsmth@gmail.com
|
||||
.cc_wraparound_type = ATH10K_HW_CC_WRAP_SHIFTED_EACH,
|
||||
.otp_exe_param = 0x00000700,
|
||||
.continuous_frag_desc = true,
|
||||
@@ -488,6 +499,7 @@ static const struct ath10k_hw_params ath
|
||||
@@ -499,6 +510,7 @@ static const struct ath10k_hw_params ath
|
||||
.name = "qca9888 hw2.0",
|
||||
.patch_load_addr = QCA9888_HW_2_0_PATCH_LOAD_ADDR,
|
||||
.uart_pin = 7,
|
||||
@ -169,7 +169,7 @@ Link: https://msgid.link/20230611080505.17393-1-ansuelsmth@gmail.com
|
||||
.cc_wraparound_type = ATH10K_HW_CC_WRAP_SHIFTED_EACH,
|
||||
.otp_exe_param = 0x00000700,
|
||||
.continuous_frag_desc = true,
|
||||
@@ -538,6 +550,7 @@ static const struct ath10k_hw_params ath
|
||||
@@ -550,6 +562,7 @@ static const struct ath10k_hw_params ath
|
||||
.name = "qca9377 hw1.0",
|
||||
.patch_load_addr = QCA9377_HW_1_0_PATCH_LOAD_ADDR,
|
||||
.uart_pin = 6,
|
||||
@ -177,7 +177,7 @@ Link: https://msgid.link/20230611080505.17393-1-ansuelsmth@gmail.com
|
||||
.otp_exe_param = 0,
|
||||
.channel_counters_freq_hz = 88000,
|
||||
.max_probe_resp_desc_thres = 0,
|
||||
@@ -578,6 +591,7 @@ static const struct ath10k_hw_params ath
|
||||
@@ -591,6 +604,7 @@ static const struct ath10k_hw_params ath
|
||||
.name = "qca9377 hw1.1",
|
||||
.patch_load_addr = QCA9377_HW_1_0_PATCH_LOAD_ADDR,
|
||||
.uart_pin = 6,
|
||||
@ -185,7 +185,7 @@ Link: https://msgid.link/20230611080505.17393-1-ansuelsmth@gmail.com
|
||||
.otp_exe_param = 0,
|
||||
.channel_counters_freq_hz = 88000,
|
||||
.max_probe_resp_desc_thres = 0,
|
||||
@@ -620,6 +634,7 @@ static const struct ath10k_hw_params ath
|
||||
@@ -634,6 +648,7 @@ static const struct ath10k_hw_params ath
|
||||
.name = "qca9377 hw1.1 sdio",
|
||||
.patch_load_addr = QCA9377_HW_1_0_PATCH_LOAD_ADDR,
|
||||
.uart_pin = 19,
|
||||
@ -193,7 +193,7 @@ Link: https://msgid.link/20230611080505.17393-1-ansuelsmth@gmail.com
|
||||
.otp_exe_param = 0,
|
||||
.channel_counters_freq_hz = 88000,
|
||||
.max_probe_resp_desc_thres = 0,
|
||||
@@ -653,6 +668,7 @@ static const struct ath10k_hw_params ath
|
||||
@@ -668,6 +683,7 @@ static const struct ath10k_hw_params ath
|
||||
.name = "qca4019 hw1.0",
|
||||
.patch_load_addr = QCA4019_HW_1_0_PATCH_LOAD_ADDR,
|
||||
.uart_pin = 7,
|
||||
@ -201,7 +201,7 @@ Link: https://msgid.link/20230611080505.17393-1-ansuelsmth@gmail.com
|
||||
.cc_wraparound_type = ATH10K_HW_CC_WRAP_SHIFTED_EACH,
|
||||
.otp_exe_param = 0x0010000,
|
||||
.continuous_frag_desc = true,
|
||||
@@ -698,6 +714,7 @@ static const struct ath10k_hw_params ath
|
||||
@@ -714,6 +730,7 @@ static const struct ath10k_hw_params ath
|
||||
.dev_id = 0,
|
||||
.bus = ATH10K_BUS_SNOC,
|
||||
.name = "wcn3990 hw1.0",
|
||||
@ -209,7 +209,7 @@ Link: https://msgid.link/20230611080505.17393-1-ansuelsmth@gmail.com
|
||||
.continuous_frag_desc = true,
|
||||
.tx_chain_mask = 0x7,
|
||||
.rx_chain_mask = 0x7,
|
||||
@@ -3222,6 +3239,10 @@ int ath10k_core_start(struct ath10k *ar,
|
||||
@@ -3242,6 +3259,10 @@ int ath10k_core_start(struct ath10k *ar,
|
||||
goto err_hif_stop;
|
||||
}
|
||||
|
||||
@ -220,7 +220,7 @@ Link: https://msgid.link/20230611080505.17393-1-ansuelsmth@gmail.com
|
||||
return 0;
|
||||
|
||||
err_hif_stop:
|
||||
@@ -3480,9 +3501,18 @@ static void ath10k_core_register_work(st
|
||||
@@ -3500,9 +3521,18 @@ static void ath10k_core_register_work(st
|
||||
goto err_spectral_destroy;
|
||||
}
|
||||
|
||||
@ -239,7 +239,7 @@ Link: https://msgid.link/20230611080505.17393-1-ansuelsmth@gmail.com
|
||||
err_spectral_destroy:
|
||||
ath10k_spectral_destroy(ar);
|
||||
err_debug_destroy:
|
||||
@@ -3528,6 +3558,8 @@ void ath10k_core_unregister(struct ath10
|
||||
@@ -3548,6 +3578,8 @@ void ath10k_core_unregister(struct ath10
|
||||
if (!test_bit(ATH10K_FLAG_CORE_REGISTERED, &ar->dev_flags))
|
||||
return;
|
||||
|
||||
@ -250,7 +250,7 @@ Link: https://msgid.link/20230611080505.17393-1-ansuelsmth@gmail.com
|
||||
* 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 @@
|
||||
@@ -15,6 +15,7 @@
|
||||
#include <linux/pci.h>
|
||||
#include <linux/uuid.h>
|
||||
#include <linux/time.h>
|
||||
@ -258,7 +258,7 @@ Link: https://msgid.link/20230611080505.17393-1-ansuelsmth@gmail.com
|
||||
|
||||
#include "htt.h"
|
||||
#include "htc.h"
|
||||
@@ -1256,6 +1257,13 @@ struct ath10k {
|
||||
@@ -1257,6 +1258,13 @@ struct ath10k {
|
||||
} testmode;
|
||||
|
||||
struct {
|
||||
@ -274,7 +274,7 @@ Link: https://msgid.link/20230611080505.17393-1-ansuelsmth@gmail.com
|
||||
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 {
|
||||
@@ -521,6 +521,7 @@ struct ath10k_hw_params {
|
||||
const char *name;
|
||||
u32 patch_load_addr;
|
||||
int uart_pin;
|
||||
@ -414,7 +414,7 @@ Link: https://msgid.link/20230611080505.17393-1-ansuelsmth@gmail.com
|
||||
+#endif /* _LEDS_H_ */
|
||||
--- a/drivers/net/wireless/ath/ath10k/mac.c
|
||||
+++ b/drivers/net/wireless/ath/ath10k/mac.c
|
||||
@@ -24,6 +24,7 @@
|
||||
@@ -25,6 +25,7 @@
|
||||
#include "wmi-tlv.h"
|
||||
#include "wmi-ops.h"
|
||||
#include "wow.h"
|
||||
@ -473,7 +473,7 @@ Link: https://msgid.link/20230611080505.17393-1-ansuelsmth@gmail.com
|
||||
{
|
||||
--- a/drivers/net/wireless/ath/ath10k/wmi-tlv.c
|
||||
+++ b/drivers/net/wireless/ath/ath10k/wmi-tlv.c
|
||||
@@ -4601,6 +4601,8 @@ static const struct wmi_ops wmi_tlv_ops
|
||||
@@ -4606,6 +4606,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,
|
||||
@ -484,7 +484,7 @@ Link: https://msgid.link/20230611080505.17393-1-ansuelsmth@gmail.com
|
||||
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
|
||||
@@ -7493,6 +7493,49 @@ ath10k_wmi_op_gen_peer_set_param(struct
|
||||
return skb;
|
||||
}
|
||||
|
||||
@ -534,7 +534,7 @@ Link: https://msgid.link/20230611080505.17393-1-ansuelsmth@gmail.com
|
||||
static struct sk_buff *
|
||||
ath10k_wmi_op_gen_set_psmode(struct ath10k *ar, u32 vdev_id,
|
||||
enum wmi_sta_ps_mode psmode)
|
||||
@@ -9138,6 +9181,9 @@ static const struct wmi_ops wmi_ops = {
|
||||
@@ -9157,6 +9200,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,
|
||||
@ -544,7 +544,7 @@ Link: https://msgid.link/20230611080505.17393-1-ansuelsmth@gmail.com
|
||||
/* .gen_bcn_tmpl not implemented */
|
||||
/* .gen_prb_tmpl not implemented */
|
||||
/* .gen_p2p_go_bcn_ie not implemented */
|
||||
@@ -9208,6 +9254,8 @@ static const struct wmi_ops wmi_10_1_ops
|
||||
@@ -9227,6 +9273,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,
|
||||
@ -553,7 +553,7 @@ Link: https://msgid.link/20230611080505.17393-1-ansuelsmth@gmail.com
|
||||
/* .gen_bcn_tmpl not implemented */
|
||||
/* .gen_prb_tmpl not implemented */
|
||||
/* .gen_p2p_go_bcn_ie not implemented */
|
||||
@@ -9280,6 +9328,8 @@ static const struct wmi_ops wmi_10_2_ops
|
||||
@@ -9299,6 +9347,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,
|
||||
@ -562,7 +562,7 @@ Link: https://msgid.link/20230611080505.17393-1-ansuelsmth@gmail.com
|
||||
/* .gen_pdev_enable_adaptive_cca not implemented */
|
||||
};
|
||||
|
||||
@@ -9351,6 +9401,8 @@ static const struct wmi_ops wmi_10_2_4_o
|
||||
@@ -9370,6 +9420,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,
|
||||
@ -571,7 +571,7 @@ Link: https://msgid.link/20230611080505.17393-1-ansuelsmth@gmail.com
|
||||
/* .gen_bcn_tmpl not implemented */
|
||||
/* .gen_prb_tmpl not implemented */
|
||||
/* .gen_p2p_go_bcn_ie not implemented */
|
||||
@@ -9432,6 +9484,8 @@ static const struct wmi_ops wmi_10_4_ops
|
||||
@@ -9451,6 +9503,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,
|
||||
@ -582,7 +582,7 @@ Link: https://msgid.link/20230611080505.17393-1-ansuelsmth@gmail.com
|
||||
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 {
|
||||
@@ -3034,6 +3034,41 @@ enum wmi_10_4_feature_mask {
|
||||
|
||||
};
|
||||
|
||||
|
@ -16,7 +16,7 @@ Signed-off-by: Mathias Kresin <dev@kresin.me>
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath10k/core.h
|
||||
+++ b/drivers/net/wireless/ath/ath10k/core.h
|
||||
@@ -1312,6 +1312,10 @@ struct ath10k {
|
||||
@@ -1313,6 +1313,10 @@ struct ath10k {
|
||||
s32 tx_power_2g_limit;
|
||||
s32 tx_power_5g_limit;
|
||||
|
||||
@ -40,7 +40,7 @@ Signed-off-by: Mathias Kresin <dev@kresin.me>
|
||||
if (ret)
|
||||
--- a/drivers/net/wireless/ath/ath10k/mac.c
|
||||
+++ b/drivers/net/wireless/ath/ath10k/mac.c
|
||||
@@ -10292,7 +10292,7 @@ int ath10k_mac_register(struct ath10k *a
|
||||
@@ -10297,7 +10297,7 @@ int ath10k_mac_register(struct ath10k *a
|
||||
ar->hw->weight_multiplier = ATH10K_AIRTIME_WEIGHT_MULTIPLIER;
|
||||
|
||||
#ifdef CPTCFG_MAC80211_LEDS
|
||||
|
@ -28,7 +28,7 @@ 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
|
||||
@@ -1022,6 +1022,40 @@ static inline int ath10k_vdev_setup_sync
|
||||
return ar->last_wmi_vdev_start_status;
|
||||
}
|
||||
|
||||
@ -69,7 +69,7 @@ Forwarded: no
|
||||
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
|
||||
@@ -1054,7 +1088,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;
|
||||
@ -79,7 +79,7 @@ Forwarded: no
|
||||
|
||||
reinit_completion(&ar->vdev_setup_done);
|
||||
reinit_completion(&ar->vdev_delete_done);
|
||||
@@ -1506,7 +1541,8 @@ static int ath10k_vdev_start_restart(str
|
||||
@@ -1500,7 +1535,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;
|
||||
@ -89,7 +89,7 @@ Forwarded: no
|
||||
|
||||
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
|
||||
@@ -3431,7 +3467,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;
|
||||
|
@ -18,7 +18,7 @@ Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath10k/core.c
|
||||
+++ b/drivers/net/wireless/ath/ath10k/core.c
|
||||
@@ -8,6 +8,7 @@
|
||||
@@ -9,6 +9,7 @@
|
||||
#include <linux/module.h>
|
||||
#include <linux/firmware.h>
|
||||
#include <linux/of.h>
|
||||
@ -26,7 +26,7 @@ Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
|
||||
#include <linux/property.h>
|
||||
#include <linux/dmi.h>
|
||||
#include <linux/ctype.h>
|
||||
@@ -3409,6 +3410,8 @@ static int ath10k_core_probe_fw(struct a
|
||||
@@ -3429,6 +3430,8 @@ static int ath10k_core_probe_fw(struct a
|
||||
|
||||
device_get_mac_address(ar->dev, ar->mac_addr);
|
||||
|
||||
|
@ -18,7 +18,7 @@ Signed-off-by: David Bauer <mail@david-bauer.net>
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath10k/mac.c
|
||||
+++ b/drivers/net/wireless/ath/ath10k/mac.c
|
||||
@@ -10088,7 +10088,6 @@ int ath10k_mac_register(struct ath10k *a
|
||||
@@ -10089,7 +10089,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);
|
||||
|
@ -1,6 +1,6 @@
|
||||
--- 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 {
|
||||
@@ -236,7 +236,11 @@ enum htt_rx_ring_flags {
|
||||
};
|
||||
|
||||
#define HTT_RX_RING_SIZE_MIN 128
|
||||
@ -14,7 +14,7 @@
|
||||
#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_
|
||||
@@ -132,7 +132,11 @@ static const struct ce_attr pci_host_ce_
|
||||
.flags = CE_ATTR_FLAGS,
|
||||
.src_nentries = 0,
|
||||
.src_sz_max = 2048,
|
||||
@ -26,7 +26,7 @@
|
||||
.recv_cb = ath10k_pci_htt_htc_rx_cb,
|
||||
},
|
||||
|
||||
@@ -140,7 +144,11 @@ static const struct ce_attr pci_host_ce_
|
||||
@@ -141,7 +145,11 @@ static const struct ce_attr pci_host_ce_
|
||||
.flags = CE_ATTR_FLAGS,
|
||||
.src_nentries = 0,
|
||||
.src_sz_max = 2048,
|
||||
@ -38,7 +38,7 @@
|
||||
.recv_cb = ath10k_pci_htc_rx_cb,
|
||||
},
|
||||
|
||||
@@ -167,7 +175,11 @@ static const struct ce_attr pci_host_ce_
|
||||
@@ -168,7 +176,11 @@ static const struct ce_attr pci_host_ce_
|
||||
.flags = CE_ATTR_FLAGS,
|
||||
.src_nentries = 0,
|
||||
.src_sz_max = 512,
|
||||
@ -50,7 +50,7 @@
|
||||
.recv_cb = ath10k_pci_htt_rx_cb,
|
||||
},
|
||||
|
||||
@@ -192,7 +204,11 @@ static const struct ce_attr pci_host_ce_
|
||||
@@ -193,7 +205,11 @@ static const struct ce_attr pci_host_ce_
|
||||
.flags = CE_ATTR_FLAGS,
|
||||
.src_nentries = 0,
|
||||
.src_sz_max = 2048,
|
||||
|
@ -1,34 +0,0 @@
|
||||
From 4a93b554cf9fa64faa7cf164c0d32fc3ce67108b Mon Sep 17 00:00:00 2001
|
||||
From: Arowa Suliman <arowa@chromium.org>
|
||||
Date: Sat, 26 Aug 2023 08:42:42 +0300
|
||||
Subject: [PATCH] wifi: ath11k: mhi: add a warning message for MHI_CB_EE_RDDM
|
||||
crash
|
||||
|
||||
Currently, the ath11k driver does not print a crash signature when a
|
||||
MHI_CB_EE_RDDM crash happens. Checked by triggering a simulated crash using the
|
||||
command and checking dmesg for logs:
|
||||
|
||||
echo assert > /sys/kernel/debug/ath11k/../simulate_fw_crash
|
||||
|
||||
Add a warning when firmware crash MHI_CB_EE_RDDM happens.
|
||||
|
||||
Tested-on: WCN6855 hw2.0 PCI WLAN.HSP.1.1-03125-QCAHSPSWPL_V1_V2_SILICONZ_LITE-3.6510.23
|
||||
|
||||
Signed-off-by: Arowa Suliman <arowa@chromium.org>
|
||||
Reviewed-by: Jeff Johnson <quic_jjohnson@quicinc.com>
|
||||
Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
|
||||
Link: https://lore.kernel.org/r/20230714001126.463127-1-arowa@chromium.org
|
||||
---
|
||||
drivers/net/wireless/ath/ath11k/mhi.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath11k/mhi.c
|
||||
+++ b/drivers/net/wireless/ath/ath11k/mhi.c
|
||||
@@ -333,6 +333,7 @@ static void ath11k_mhi_op_status_cb(stru
|
||||
ath11k_warn(ab, "firmware crashed: MHI_CB_SYS_ERROR\n");
|
||||
break;
|
||||
case MHI_CB_EE_RDDM:
|
||||
+ ath11k_warn(ab, "firmware crashed: MHI_CB_EE_RDDM\n");
|
||||
if (!(test_bit(ATH11K_FLAG_UNREGISTERING, &ab->dev_flags)))
|
||||
queue_work(ab->workqueue_aux, &ab->reset_work);
|
||||
break;
|
@ -1,75 +0,0 @@
|
||||
From 5bd2ced044bb95029d5c44cf7d23ced73e0fc05b Mon Sep 17 00:00:00 2001
|
||||
From: Muna Sinada <quic_msinada@quicinc.com>
|
||||
Date: Sat, 26 Aug 2023 08:42:46 +0300
|
||||
Subject: [PATCH] wifi: ath11k: move references from rsvd2 to info fields
|
||||
|
||||
Remove references to reserved fields and add new info fields for
|
||||
struct hal_rx_ppdu_end_user_stats. Reserved fields should not be
|
||||
accessed, therefore existing references to it are to be changed to
|
||||
referencing specific info fields.
|
||||
|
||||
Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.4.0.1-00356-QCAHKSWPL_SILICONZ-1
|
||||
|
||||
Signed-off-by: Muna Sinada <quic_msinada@quicinc.com>
|
||||
Acked-by: Jeff Johnson <quic_jjohnson@quicinc.com>
|
||||
Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
|
||||
Link: https://lore.kernel.org/r/1692827868-15667-1-git-send-email-quic_msinada@quicinc.com
|
||||
---
|
||||
drivers/net/wireless/ath/ath11k/hal_rx.c | 10 +++++-----
|
||||
drivers/net/wireless/ath/ath11k/hal_rx.h | 11 ++++++++---
|
||||
2 files changed, 13 insertions(+), 8 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath11k/hal_rx.c
|
||||
+++ b/drivers/net/wireless/ath/ath11k/hal_rx.c
|
||||
@@ -814,7 +814,7 @@ ath11k_hal_rx_handle_ofdma_info(void *rx
|
||||
|
||||
rx_user_status->ul_ofdma_user_v0_word0 = __le32_to_cpu(ppdu_end_user->info6);
|
||||
|
||||
- rx_user_status->ul_ofdma_user_v0_word1 = __le32_to_cpu(ppdu_end_user->rsvd2[10]);
|
||||
+ rx_user_status->ul_ofdma_user_v0_word1 = __le32_to_cpu(ppdu_end_user->info9);
|
||||
}
|
||||
|
||||
static inline void
|
||||
@@ -825,11 +825,11 @@ ath11k_hal_rx_populate_byte_count(void *
|
||||
(struct hal_rx_ppdu_end_user_stats *)rx_tlv;
|
||||
|
||||
rx_user_status->mpdu_ok_byte_count =
|
||||
- FIELD_GET(HAL_RX_PPDU_END_USER_STATS_RSVD2_6_MPDU_OK_BYTE_COUNT,
|
||||
- __le32_to_cpu(ppdu_end_user->rsvd2[6]));
|
||||
+ FIELD_GET(HAL_RX_PPDU_END_USER_STATS_INFO8_MPDU_OK_BYTE_COUNT,
|
||||
+ __le32_to_cpu(ppdu_end_user->info7));
|
||||
rx_user_status->mpdu_err_byte_count =
|
||||
- FIELD_GET(HAL_RX_PPDU_END_USER_STATS_RSVD2_8_MPDU_ERR_BYTE_COUNT,
|
||||
- __le32_to_cpu(ppdu_end_user->rsvd2[8]));
|
||||
+ FIELD_GET(HAL_RX_PPDU_END_USER_STATS_INFO9_MPDU_ERR_BYTE_COUNT,
|
||||
+ __le32_to_cpu(ppdu_end_user->info8));
|
||||
}
|
||||
|
||||
static inline void
|
||||
--- a/drivers/net/wireless/ath/ath11k/hal_rx.h
|
||||
+++ b/drivers/net/wireless/ath/ath11k/hal_rx.h
|
||||
@@ -222,8 +222,8 @@ struct hal_rx_ppdu_start {
|
||||
#define HAL_RX_PPDU_END_USER_STATS_INFO6_TID_BITMAP GENMASK(15, 0)
|
||||
#define HAL_RX_PPDU_END_USER_STATS_INFO6_TID_EOSP_BITMAP GENMASK(31, 16)
|
||||
|
||||
-#define HAL_RX_PPDU_END_USER_STATS_RSVD2_6_MPDU_OK_BYTE_COUNT GENMASK(24, 0)
|
||||
-#define HAL_RX_PPDU_END_USER_STATS_RSVD2_8_MPDU_ERR_BYTE_COUNT GENMASK(24, 0)
|
||||
+#define HAL_RX_PPDU_END_USER_STATS_INFO7_MPDU_OK_BYTE_COUNT GENMASK(24, 0)
|
||||
+#define HAL_RX_PPDU_END_USER_STATS_INFO8_MPDU_ERR_BYTE_COUNT GENMASK(24, 0)
|
||||
|
||||
struct hal_rx_ppdu_end_user_stats {
|
||||
__le32 rsvd0[2];
|
||||
@@ -236,7 +236,12 @@ struct hal_rx_ppdu_end_user_stats {
|
||||
__le32 info4;
|
||||
__le32 info5;
|
||||
__le32 info6;
|
||||
- __le32 rsvd2[11];
|
||||
+ __le32 rsvd2[5];
|
||||
+ __le32 info7;
|
||||
+ __le32 rsvd3;
|
||||
+ __le32 info8;
|
||||
+ __le32 rsvd3[2];
|
||||
+ __le32 info9;
|
||||
} __packed;
|
||||
|
||||
struct hal_rx_ppdu_end_user_stats_ext {
|
@ -1,100 +0,0 @@
|
||||
From 7791487cd16cafd018cba0bf73789111a9f16843 Mon Sep 17 00:00:00 2001
|
||||
From: Muna Sinada <quic_msinada@quicinc.com>
|
||||
Date: Sat, 26 Aug 2023 08:42:46 +0300
|
||||
Subject: [PATCH] wifi: ath11k: fix tid bitmap is 0 in peer rx mu stats
|
||||
|
||||
Correct parsing of reading offset for rx tid 16 bit bitmap. Incorrect
|
||||
offset caused peer rx mu stats tid bitmap to always be zero. This
|
||||
correction is in the software context and does not affect the
|
||||
firmware interface.
|
||||
|
||||
Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.4.0.1-00356-QCAHKSWPL_SILICONZ-1
|
||||
|
||||
Signed-off-by: Muna Sinada <quic_msinada@quicinc.com>
|
||||
Acked-by: Jeff Johnson <quic_jjohnson@quicinc.com>
|
||||
Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
|
||||
Link: https://lore.kernel.org/r/1692827868-15667-2-git-send-email-quic_msinada@quicinc.com
|
||||
---
|
||||
drivers/net/wireless/ath/ath11k/hal_rx.c | 10 +++++-----
|
||||
drivers/net/wireless/ath/ath11k/hal_rx.h | 17 +++++++++--------
|
||||
2 files changed, 14 insertions(+), 13 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath11k/hal_rx.c
|
||||
+++ b/drivers/net/wireless/ath/ath11k/hal_rx.c
|
||||
@@ -814,7 +814,7 @@ ath11k_hal_rx_handle_ofdma_info(void *rx
|
||||
|
||||
rx_user_status->ul_ofdma_user_v0_word0 = __le32_to_cpu(ppdu_end_user->info6);
|
||||
|
||||
- rx_user_status->ul_ofdma_user_v0_word1 = __le32_to_cpu(ppdu_end_user->info9);
|
||||
+ rx_user_status->ul_ofdma_user_v0_word1 = __le32_to_cpu(ppdu_end_user->info10);
|
||||
}
|
||||
|
||||
static inline void
|
||||
@@ -826,10 +826,10 @@ ath11k_hal_rx_populate_byte_count(void *
|
||||
|
||||
rx_user_status->mpdu_ok_byte_count =
|
||||
FIELD_GET(HAL_RX_PPDU_END_USER_STATS_INFO8_MPDU_OK_BYTE_COUNT,
|
||||
- __le32_to_cpu(ppdu_end_user->info7));
|
||||
+ __le32_to_cpu(ppdu_end_user->info8));
|
||||
rx_user_status->mpdu_err_byte_count =
|
||||
FIELD_GET(HAL_RX_PPDU_END_USER_STATS_INFO9_MPDU_ERR_BYTE_COUNT,
|
||||
- __le32_to_cpu(ppdu_end_user->info8));
|
||||
+ __le32_to_cpu(ppdu_end_user->info9));
|
||||
}
|
||||
|
||||
static inline void
|
||||
@@ -903,8 +903,8 @@ ath11k_hal_rx_parse_mon_status_tlv(struc
|
||||
FIELD_GET(HAL_RX_PPDU_END_USER_STATS_INFO2_AST_INDEX,
|
||||
__le32_to_cpu(eu_stats->info2));
|
||||
ppdu_info->tid =
|
||||
- ffs(FIELD_GET(HAL_RX_PPDU_END_USER_STATS_INFO6_TID_BITMAP,
|
||||
- __le32_to_cpu(eu_stats->info6))) - 1;
|
||||
+ ffs(FIELD_GET(HAL_RX_PPDU_END_USER_STATS_INFO7_TID_BITMAP,
|
||||
+ __le32_to_cpu(eu_stats->info7))) - 1;
|
||||
ppdu_info->tcp_msdu_count =
|
||||
FIELD_GET(HAL_RX_PPDU_END_USER_STATS_INFO4_TCP_MSDU_CNT,
|
||||
__le32_to_cpu(eu_stats->info4));
|
||||
--- a/drivers/net/wireless/ath/ath11k/hal_rx.h
|
||||
+++ b/drivers/net/wireless/ath/ath11k/hal_rx.h
|
||||
@@ -149,7 +149,7 @@ struct hal_rx_mon_ppdu_info {
|
||||
u8 beamformed;
|
||||
u8 rssi_comb;
|
||||
u8 rssi_chain_pri20[HAL_RX_MAX_NSS];
|
||||
- u8 tid;
|
||||
+ u16 tid;
|
||||
u16 ht_flags;
|
||||
u16 vht_flags;
|
||||
u16 he_flags;
|
||||
@@ -219,11 +219,11 @@ struct hal_rx_ppdu_start {
|
||||
#define HAL_RX_PPDU_END_USER_STATS_INFO5_OTHER_MSDU_CNT GENMASK(15, 0)
|
||||
#define HAL_RX_PPDU_END_USER_STATS_INFO5_TCP_ACK_MSDU_CNT GENMASK(31, 16)
|
||||
|
||||
-#define HAL_RX_PPDU_END_USER_STATS_INFO6_TID_BITMAP GENMASK(15, 0)
|
||||
-#define HAL_RX_PPDU_END_USER_STATS_INFO6_TID_EOSP_BITMAP GENMASK(31, 16)
|
||||
+#define HAL_RX_PPDU_END_USER_STATS_INFO7_TID_BITMAP GENMASK(15, 0)
|
||||
+#define HAL_RX_PPDU_END_USER_STATS_INFO7_TID_EOSP_BITMAP GENMASK(31, 16)
|
||||
|
||||
-#define HAL_RX_PPDU_END_USER_STATS_INFO7_MPDU_OK_BYTE_COUNT GENMASK(24, 0)
|
||||
-#define HAL_RX_PPDU_END_USER_STATS_INFO8_MPDU_ERR_BYTE_COUNT GENMASK(24, 0)
|
||||
+#define HAL_RX_PPDU_END_USER_STATS_INFO8_MPDU_OK_BYTE_COUNT GENMASK(24, 0)
|
||||
+#define HAL_RX_PPDU_END_USER_STATS_INFO9_MPDU_ERR_BYTE_COUNT GENMASK(24, 0)
|
||||
|
||||
struct hal_rx_ppdu_end_user_stats {
|
||||
__le32 rsvd0[2];
|
||||
@@ -236,12 +236,13 @@ struct hal_rx_ppdu_end_user_stats {
|
||||
__le32 info4;
|
||||
__le32 info5;
|
||||
__le32 info6;
|
||||
- __le32 rsvd2[5];
|
||||
__le32 info7;
|
||||
- __le32 rsvd3;
|
||||
+ __le32 rsvd2[4];
|
||||
__le32 info8;
|
||||
- __le32 rsvd3[2];
|
||||
+ __le32 rsvd3;
|
||||
__le32 info9;
|
||||
+ __le32 rsvd4[2];
|
||||
+ __le32 info10;
|
||||
} __packed;
|
||||
|
||||
struct hal_rx_ppdu_end_user_stats_ext {
|
@ -1,214 +0,0 @@
|
||||
From 1133af5aea588a58043244a4ecb5ce511b310356 Mon Sep 17 00:00:00 2001
|
||||
From: Wen Gong <quic_wgong@quicinc.com>
|
||||
Date: Wed, 30 Aug 2023 02:02:26 -0400
|
||||
Subject: [PATCH] wifi: ath11k: add chip id board name while searching
|
||||
board-2.bin for WCN6855
|
||||
|
||||
Sometimes board-2.bin does not have the board data which matched the
|
||||
parameters such as bus type, vendor, device, subsystem-vendor,
|
||||
subsystem-device, qmi-chip-id and qmi-board-id, then wlan will load fail.
|
||||
|
||||
Hence add another type which only matches the bus type and qmi-chip-id,
|
||||
then the ratio of missing board data reduced.
|
||||
|
||||
Tested-on: WCN6855 hw2.0 PCI WLAN.HSP.1.1-03125-QCAHSPSWPL_V1_V2_SILICONZ_LITE-3.6510.23
|
||||
|
||||
Signed-off-by: Wen Gong <quic_wgong@quicinc.com>
|
||||
Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
|
||||
Link: https://lore.kernel.org/r/20230830060226.18664-1-quic_wgong@quicinc.com
|
||||
---
|
||||
drivers/net/wireless/ath/ath11k/core.c | 108 ++++++++++++++++++++-----
|
||||
1 file changed, 87 insertions(+), 21 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath11k/core.c
|
||||
+++ b/drivers/net/wireless/ath/ath11k/core.c
|
||||
@@ -985,9 +985,15 @@ int ath11k_core_check_dt(struct ath11k_b
|
||||
return 0;
|
||||
}
|
||||
|
||||
+enum ath11k_bdf_name_type {
|
||||
+ ATH11K_BDF_NAME_FULL,
|
||||
+ ATH11K_BDF_NAME_BUS_NAME,
|
||||
+ ATH11K_BDF_NAME_CHIP_ID,
|
||||
+};
|
||||
+
|
||||
static int __ath11k_core_create_board_name(struct ath11k_base *ab, char *name,
|
||||
size_t name_len, bool with_variant,
|
||||
- bool bus_type_mode)
|
||||
+ enum ath11k_bdf_name_type name_type)
|
||||
{
|
||||
/* strlen(',variant=') + strlen(ab->qmi.target.bdf_ext) */
|
||||
char variant[9 + ATH11K_QMI_BDF_EXT_STR_LENGTH] = { 0 };
|
||||
@@ -998,11 +1004,8 @@ static int __ath11k_core_create_board_na
|
||||
|
||||
switch (ab->id.bdf_search) {
|
||||
case ATH11K_BDF_SEARCH_BUS_AND_BOARD:
|
||||
- if (bus_type_mode)
|
||||
- scnprintf(name, name_len,
|
||||
- "bus=%s",
|
||||
- ath11k_bus_str(ab->hif.bus));
|
||||
- else
|
||||
+ switch (name_type) {
|
||||
+ case ATH11K_BDF_NAME_FULL:
|
||||
scnprintf(name, name_len,
|
||||
"bus=%s,vendor=%04x,device=%04x,subsystem-vendor=%04x,subsystem-device=%04x,qmi-chip-id=%d,qmi-board-id=%d%s",
|
||||
ath11k_bus_str(ab->hif.bus),
|
||||
@@ -1012,6 +1015,19 @@ static int __ath11k_core_create_board_na
|
||||
ab->qmi.target.chip_id,
|
||||
ab->qmi.target.board_id,
|
||||
variant);
|
||||
+ break;
|
||||
+ case ATH11K_BDF_NAME_BUS_NAME:
|
||||
+ scnprintf(name, name_len,
|
||||
+ "bus=%s",
|
||||
+ ath11k_bus_str(ab->hif.bus));
|
||||
+ break;
|
||||
+ case ATH11K_BDF_NAME_CHIP_ID:
|
||||
+ scnprintf(name, name_len,
|
||||
+ "bus=%s,qmi-chip-id=%d",
|
||||
+ ath11k_bus_str(ab->hif.bus),
|
||||
+ ab->qmi.target.chip_id);
|
||||
+ break;
|
||||
+ }
|
||||
break;
|
||||
default:
|
||||
scnprintf(name, name_len,
|
||||
@@ -1030,19 +1046,29 @@ static int __ath11k_core_create_board_na
|
||||
static int ath11k_core_create_board_name(struct ath11k_base *ab, char *name,
|
||||
size_t name_len)
|
||||
{
|
||||
- return __ath11k_core_create_board_name(ab, name, name_len, true, false);
|
||||
+ return __ath11k_core_create_board_name(ab, name, name_len, true,
|
||||
+ ATH11K_BDF_NAME_FULL);
|
||||
}
|
||||
|
||||
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, false);
|
||||
+ return __ath11k_core_create_board_name(ab, name, name_len, false,
|
||||
+ ATH11K_BDF_NAME_FULL);
|
||||
}
|
||||
|
||||
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);
|
||||
+ return __ath11k_core_create_board_name(ab, name, name_len, false,
|
||||
+ ATH11K_BDF_NAME_BUS_NAME);
|
||||
+}
|
||||
+
|
||||
+static int ath11k_core_create_chip_id_board_name(struct ath11k_base *ab, char *name,
|
||||
+ size_t name_len)
|
||||
+{
|
||||
+ return __ath11k_core_create_board_name(ab, name, name_len, false,
|
||||
+ ATH11K_BDF_NAME_CHIP_ID);
|
||||
}
|
||||
|
||||
const struct firmware *ath11k_core_firmware_request(struct ath11k_base *ab,
|
||||
@@ -1289,16 +1315,21 @@ int ath11k_core_fetch_board_data_api_1(s
|
||||
#define BOARD_NAME_SIZE 200
|
||||
int ath11k_core_fetch_bdf(struct ath11k_base *ab, struct ath11k_board_data *bd)
|
||||
{
|
||||
- char boardname[BOARD_NAME_SIZE], fallback_boardname[BOARD_NAME_SIZE];
|
||||
+ char *boardname = NULL, *fallback_boardname = NULL, *chip_id_boardname = NULL;
|
||||
char *filename, filepath[100];
|
||||
- int ret;
|
||||
+ int ret = 0;
|
||||
|
||||
filename = ATH11K_BOARD_API2_FILE;
|
||||
+ boardname = kzalloc(BOARD_NAME_SIZE, GFP_KERNEL);
|
||||
+ if (!boardname) {
|
||||
+ ret = -ENOMEM;
|
||||
+ goto exit;
|
||||
+ }
|
||||
|
||||
- ret = ath11k_core_create_board_name(ab, boardname, sizeof(boardname));
|
||||
+ ret = ath11k_core_create_board_name(ab, boardname, BOARD_NAME_SIZE);
|
||||
if (ret) {
|
||||
ath11k_err(ab, "failed to create board name: %d", ret);
|
||||
- return ret;
|
||||
+ goto exit;
|
||||
}
|
||||
|
||||
ab->bd_api = 2;
|
||||
@@ -1307,13 +1338,19 @@ int ath11k_core_fetch_bdf(struct ath11k_
|
||||
ATH11K_BD_IE_BOARD_NAME,
|
||||
ATH11K_BD_IE_BOARD_DATA);
|
||||
if (!ret)
|
||||
- goto success;
|
||||
+ goto exit;
|
||||
+
|
||||
+ fallback_boardname = kzalloc(BOARD_NAME_SIZE, GFP_KERNEL);
|
||||
+ if (!fallback_boardname) {
|
||||
+ ret = -ENOMEM;
|
||||
+ goto exit;
|
||||
+ }
|
||||
|
||||
ret = ath11k_core_create_fallback_board_name(ab, fallback_boardname,
|
||||
- sizeof(fallback_boardname));
|
||||
+ BOARD_NAME_SIZE);
|
||||
if (ret) {
|
||||
ath11k_err(ab, "failed to create fallback board name: %d", ret);
|
||||
- return ret;
|
||||
+ goto exit;
|
||||
}
|
||||
|
||||
ret = ath11k_core_fetch_board_data_api_n(ab, bd, fallback_boardname,
|
||||
@@ -1321,7 +1358,28 @@ int ath11k_core_fetch_bdf(struct ath11k_
|
||||
ATH11K_BD_IE_BOARD_NAME,
|
||||
ATH11K_BD_IE_BOARD_DATA);
|
||||
if (!ret)
|
||||
- goto success;
|
||||
+ goto exit;
|
||||
+
|
||||
+ chip_id_boardname = kzalloc(BOARD_NAME_SIZE, GFP_KERNEL);
|
||||
+ if (!chip_id_boardname) {
|
||||
+ ret = -ENOMEM;
|
||||
+ goto exit;
|
||||
+ }
|
||||
+
|
||||
+ ret = ath11k_core_create_chip_id_board_name(ab, chip_id_boardname,
|
||||
+ BOARD_NAME_SIZE);
|
||||
+ if (ret) {
|
||||
+ ath11k_err(ab, "failed to create chip id board name: %d", ret);
|
||||
+ goto exit;
|
||||
+ }
|
||||
+
|
||||
+ ret = ath11k_core_fetch_board_data_api_n(ab, bd, chip_id_boardname,
|
||||
+ ATH11K_BD_IE_BOARD,
|
||||
+ ATH11K_BD_IE_BOARD_NAME,
|
||||
+ ATH11K_BD_IE_BOARD_DATA);
|
||||
+
|
||||
+ if (!ret)
|
||||
+ goto exit;
|
||||
|
||||
ab->bd_api = 1;
|
||||
ret = ath11k_core_fetch_board_data_api_1(ab, bd, ATH11K_DEFAULT_BOARD_FILE);
|
||||
@@ -1334,14 +1392,22 @@ int ath11k_core_fetch_bdf(struct ath11k_
|
||||
ath11k_err(ab, "failed to fetch board data for %s from %s\n",
|
||||
fallback_boardname, filepath);
|
||||
|
||||
+ ath11k_err(ab, "failed to fetch board data for %s from %s\n",
|
||||
+ chip_id_boardname, filepath);
|
||||
+
|
||||
ath11k_err(ab, "failed to fetch board.bin from %s\n",
|
||||
ab->hw_params.fw.dir);
|
||||
- return ret;
|
||||
}
|
||||
|
||||
-success:
|
||||
- ath11k_dbg(ab, ATH11K_DBG_BOOT, "using board api %d\n", ab->bd_api);
|
||||
- return 0;
|
||||
+exit:
|
||||
+ kfree(boardname);
|
||||
+ kfree(fallback_boardname);
|
||||
+ kfree(chip_id_boardname);
|
||||
+
|
||||
+ if (!ret)
|
||||
+ ath11k_dbg(ab, ATH11K_DBG_BOOT, "using board api %d\n", ab->bd_api);
|
||||
+
|
||||
+ return ret;
|
||||
}
|
||||
|
||||
int ath11k_core_fetch_regdb(struct ath11k_base *ab, struct ath11k_board_data *bd)
|
@ -1,32 +0,0 @@
|
||||
From ac13a7842ab46a87aa315514d6d7e19b03cb2adc Mon Sep 17 00:00:00 2001
|
||||
From: Dmitry Antipov <dmantipov@yandex.ru>
|
||||
Date: Wed, 6 Sep 2023 12:36:55 +0300
|
||||
Subject: [PATCH] wifi: ath11k: drop NULL pointer check in
|
||||
ath11k_update_per_peer_tx_stats()
|
||||
|
||||
Since 'user_stats' is a fixed-size array of 'struct htt_ppdu_user_stats'
|
||||
in 'struct htt_ppdu_stats', any of its member can't be NULL and so
|
||||
relevant check may be dropped.
|
||||
|
||||
Found by Linux Verification Center (linuxtesting.org) with SVACE.
|
||||
|
||||
Signed-off-by: Dmitry Antipov <dmantipov@yandex.ru>
|
||||
Acked-by: Jeff Johnson <quic_jjohnson@quicinc.com>
|
||||
Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
|
||||
Link: https://lore.kernel.org/r/20230906093704.14001-1-dmantipov@yandex.ru
|
||||
---
|
||||
drivers/net/wireless/ath/ath11k/dp_rx.c | 3 ---
|
||||
1 file changed, 3 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath11k/dp_rx.c
|
||||
+++ b/drivers/net/wireless/ath/ath11k/dp_rx.c
|
||||
@@ -1388,9 +1388,6 @@ ath11k_update_per_peer_tx_stats(struct a
|
||||
u8 tid = HTT_PPDU_STATS_NON_QOS_TID;
|
||||
bool is_ampdu = false;
|
||||
|
||||
- if (!usr_stats)
|
||||
- return;
|
||||
-
|
||||
if (!(usr_stats->tlv_flags & BIT(HTT_PPDU_STATS_TAG_USR_RATE)))
|
||||
return;
|
||||
|
@ -1,38 +0,0 @@
|
||||
From 82ae3f4635382ff23e2ece55b5d5e713223951ec Mon Sep 17 00:00:00 2001
|
||||
From: Dmitry Antipov <dmantipov@yandex.ru>
|
||||
Date: Thu, 24 Aug 2023 10:50:44 +0300
|
||||
Subject: [PATCH] wifi: ath11k: drop redundant check in
|
||||
ath11k_dp_rx_mon_dest_process()
|
||||
|
||||
In 'ath11k_dp_rx_mon_dest_process()', 'mon_dst_srng' points to
|
||||
a member of 'srng_list', which is a fixed-size array inside
|
||||
'struct ath11k_hal'. This way, if 'ring_id' is valid (i. e.
|
||||
between 0 and HAL_SRNG_RING_ID_MAX - 1 inclusive), 'mon_dst_srng'
|
||||
can't be NULL and so relevant check may be dropped.
|
||||
|
||||
Found by Linux Verification Center (linuxtesting.org) with SVACE.
|
||||
|
||||
Signed-off-by: Dmitry Antipov <dmantipov@yandex.ru>
|
||||
Acked-by: Jeff Johnson <quic_jjohnson@quicinc.com>
|
||||
Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
|
||||
Link: https://lore.kernel.org/r/20230824075121.121144-1-dmantipov@yandex.ru
|
||||
---
|
||||
drivers/net/wireless/ath/ath11k/dp_rx.c | 7 -------
|
||||
1 file changed, 7 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath11k/dp_rx.c
|
||||
+++ b/drivers/net/wireless/ath/ath11k/dp_rx.c
|
||||
@@ -5100,13 +5100,6 @@ static void ath11k_dp_rx_mon_dest_proces
|
||||
|
||||
mon_dst_srng = &ar->ab->hal.srng_list[ring_id];
|
||||
|
||||
- if (!mon_dst_srng) {
|
||||
- ath11k_warn(ar->ab,
|
||||
- "HAL Monitor Destination Ring Init Failed -- %p",
|
||||
- mon_dst_srng);
|
||||
- return;
|
||||
- }
|
||||
-
|
||||
spin_lock_bh(&pmon->mon_lock);
|
||||
|
||||
ath11k_hal_srng_access_begin(ar->ab, mon_dst_srng);
|
@ -1,46 +0,0 @@
|
||||
From 9066794113c4813b6ce4a66ed6ce14ecdf35625d Mon Sep 17 00:00:00 2001
|
||||
From: Dmitry Antipov <dmantipov@yandex.ru>
|
||||
Date: Thu, 24 Aug 2023 10:50:45 +0300
|
||||
Subject: [PATCH] wifi: ath11k: remove unused members of 'struct ath11k_base'
|
||||
|
||||
Remove set but otherwise unused 'wlan_init_status' and
|
||||
'wmi_ready' members of 'struct ath11k_base', adjust
|
||||
'ath11k_wmi_tlv_rdy_parse()' accordingly.
|
||||
|
||||
Signed-off-by: Dmitry Antipov <dmantipov@yandex.ru>
|
||||
Acked-by: Jeff Johnson <quic_jjohnson@quicinc.com>
|
||||
Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
|
||||
Link: https://lore.kernel.org/r/20230824075121.121144-2-dmantipov@yandex.ru
|
||||
---
|
||||
drivers/net/wireless/ath/ath11k/core.h | 2 --
|
||||
drivers/net/wireless/ath/ath11k/wmi.c | 2 --
|
||||
2 files changed, 4 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath11k/core.h
|
||||
+++ b/drivers/net/wireless/ath/ath11k/core.h
|
||||
@@ -901,8 +901,6 @@ struct ath11k_base {
|
||||
struct list_head peers;
|
||||
wait_queue_head_t peer_mapping_wq;
|
||||
u8 mac_addr[ETH_ALEN];
|
||||
- bool wmi_ready;
|
||||
- u32 wlan_init_status;
|
||||
int irq_num[ATH11K_IRQ_NUM_MAX];
|
||||
struct ath11k_ext_irq_grp ext_irq_grp[ATH11K_EXT_IRQ_GRP_NUM_MAX];
|
||||
struct ath11k_targ_cap target_caps;
|
||||
--- a/drivers/net/wireless/ath/ath11k/wmi.c
|
||||
+++ b/drivers/net/wireless/ath/ath11k/wmi.c
|
||||
@@ -7222,14 +7222,12 @@ static int ath11k_wmi_tlv_rdy_parse(stru
|
||||
memset(&fixed_param, 0, sizeof(fixed_param));
|
||||
memcpy(&fixed_param, (struct wmi_ready_event *)ptr,
|
||||
min_t(u16, sizeof(fixed_param), len));
|
||||
- ab->wlan_init_status = fixed_param.ready_event_min.status;
|
||||
rdy_parse->num_extra_mac_addr =
|
||||
fixed_param.ready_event_min.num_extra_mac_addr;
|
||||
|
||||
ether_addr_copy(ab->mac_addr,
|
||||
fixed_param.ready_event_min.mac_addr.addr);
|
||||
ab->pktlog_defs_checksum = fixed_param.pktlog_defs_checksum;
|
||||
- ab->wmi_ready = true;
|
||||
break;
|
||||
case WMI_TAG_ARRAY_FIXED_STRUCT:
|
||||
addr_list = (struct wmi_mac_addr *)ptr;
|
@ -1,60 +0,0 @@
|
||||
From 458f66c30df2b8495790cf6fca76ebad44046921 Mon Sep 17 00:00:00 2001
|
||||
From: Dmitry Antipov <dmantipov@yandex.ru>
|
||||
Date: Thu, 21 Sep 2023 11:16:57 +0300
|
||||
Subject: [PATCH] wifi: ath11k: use kstrtoul_from_user() where appropriate
|
||||
|
||||
Use 'kstrtoul_from_user()' in 'ath11k_write_file_spectral_count()'
|
||||
and 'ath11k_write_file_spectral_bins()'
|
||||
|
||||
Signed-off-by: Dmitry Antipov <dmantipov@yandex.ru>
|
||||
Acked-by: Jeff Johnson <quic_jjohnson@quicinc.com>
|
||||
Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
|
||||
Link: https://lore.kernel.org/r/20230824075121.121144-4-dmantipov@yandex.ru
|
||||
---
|
||||
drivers/net/wireless/ath/ath11k/spectral.c | 26 +++++++---------------
|
||||
1 file changed, 8 insertions(+), 18 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath11k/spectral.c
|
||||
+++ b/drivers/net/wireless/ath/ath11k/spectral.c
|
||||
@@ -386,16 +386,11 @@ static ssize_t ath11k_write_file_spectra
|
||||
{
|
||||
struct ath11k *ar = file->private_data;
|
||||
unsigned long val;
|
||||
- char buf[32];
|
||||
- ssize_t len;
|
||||
-
|
||||
- len = min(count, sizeof(buf) - 1);
|
||||
- if (copy_from_user(buf, user_buf, len))
|
||||
- return -EFAULT;
|
||||
+ ssize_t ret;
|
||||
|
||||
- buf[len] = '\0';
|
||||
- if (kstrtoul(buf, 0, &val))
|
||||
- return -EINVAL;
|
||||
+ ret = kstrtoul_from_user(user_buf, count, 0, &val);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
|
||||
if (val > ATH11K_SPECTRAL_SCAN_COUNT_MAX)
|
||||
return -EINVAL;
|
||||
@@ -441,16 +436,11 @@ static ssize_t ath11k_write_file_spectra
|
||||
{
|
||||
struct ath11k *ar = file->private_data;
|
||||
unsigned long val;
|
||||
- char buf[32];
|
||||
- ssize_t len;
|
||||
-
|
||||
- len = min(count, sizeof(buf) - 1);
|
||||
- if (copy_from_user(buf, user_buf, len))
|
||||
- return -EFAULT;
|
||||
+ ssize_t ret;
|
||||
|
||||
- buf[len] = '\0';
|
||||
- if (kstrtoul(buf, 0, &val))
|
||||
- return -EINVAL;
|
||||
+ ret = kstrtoul_from_user(user_buf, count, 0, &val);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
|
||||
if (val < ATH11K_SPECTRAL_MIN_BINS ||
|
||||
val > ar->ab->hw_params.spectral.max_fft_bins)
|
@ -1,248 +0,0 @@
|
||||
From 87fd0602610d6965c45afc61780ac98842e8f902 Mon Sep 17 00:00:00 2001
|
||||
From: Wu Yunchuan <yunchuan@nfschina.com>
|
||||
Date: Thu, 21 Sep 2023 11:50:05 +0300
|
||||
Subject: [PATCH] wifi: ath11k: remove unnecessary (void*) conversions
|
||||
|
||||
No need cast (void *) to (struct ath11k_base *),
|
||||
struct hal_rx_msdu_link *), (struct ath11k_buffer_addr *) or
|
||||
other types.
|
||||
|
||||
Signed-off-by: Wu Yunchuan <yunchuan@nfschina.com>
|
||||
Acked-by: Jeff Johnson <quic_jjohnson@quicinc.com>
|
||||
Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
|
||||
Link: https://lore.kernel.org/r/20230919045150.524304-1-yunchuan@nfschina.com
|
||||
---
|
||||
drivers/net/wireless/ath/ath11k/dp.c | 2 +-
|
||||
drivers/net/wireless/ath/ath11k/dp_rx.c | 13 +++++--------
|
||||
drivers/net/wireless/ath/ath11k/hal.c | 8 +++-----
|
||||
drivers/net/wireless/ath/ath11k/hal_rx.c | 17 +++++++----------
|
||||
drivers/net/wireless/ath/ath11k/hal_tx.c | 2 +-
|
||||
drivers/net/wireless/ath/ath11k/mac.c | 4 ++--
|
||||
drivers/net/wireless/ath/ath11k/spectral.c | 2 +-
|
||||
drivers/net/wireless/ath/ath11k/wmi.c | 6 +++---
|
||||
8 files changed, 23 insertions(+), 31 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath11k/dp.c
|
||||
+++ b/drivers/net/wireless/ath/ath11k/dp.c
|
||||
@@ -1009,7 +1009,7 @@ void ath11k_dp_vdev_tx_attach(struct ath
|
||||
|
||||
static int ath11k_dp_tx_pending_cleanup(int buf_id, void *skb, void *ctx)
|
||||
{
|
||||
- struct ath11k_base *ab = (struct ath11k_base *)ctx;
|
||||
+ struct ath11k_base *ab = ctx;
|
||||
struct sk_buff *msdu = skb;
|
||||
|
||||
dma_unmap_single(ab->dev, ATH11K_SKB_CB(msdu)->paddr, msdu->len,
|
||||
--- a/drivers/net/wireless/ath/ath11k/dp_rx.c
|
||||
+++ b/drivers/net/wireless/ath/ath11k/dp_rx.c
|
||||
@@ -1256,7 +1256,7 @@ static int ath11k_htt_tlv_ppdu_stats_par
|
||||
int cur_user;
|
||||
u16 peer_id;
|
||||
|
||||
- ppdu_info = (struct htt_ppdu_stats_info *)data;
|
||||
+ ppdu_info = data;
|
||||
|
||||
switch (tag) {
|
||||
case HTT_PPDU_STATS_TAG_COMMON:
|
||||
@@ -4492,8 +4492,7 @@ int ath11k_dp_rx_monitor_link_desc_retur
|
||||
src_srng_desc = ath11k_hal_srng_src_get_next_entry(ar->ab, hal_srng);
|
||||
|
||||
if (src_srng_desc) {
|
||||
- struct ath11k_buffer_addr *src_desc =
|
||||
- (struct ath11k_buffer_addr *)src_srng_desc;
|
||||
+ struct ath11k_buffer_addr *src_desc = src_srng_desc;
|
||||
|
||||
*src_desc = *((struct ath11k_buffer_addr *)p_last_buf_addr_info);
|
||||
} else {
|
||||
@@ -4512,8 +4511,7 @@ void ath11k_dp_rx_mon_next_link_desc_get
|
||||
u8 *rbm,
|
||||
void **pp_buf_addr_info)
|
||||
{
|
||||
- struct hal_rx_msdu_link *msdu_link =
|
||||
- (struct hal_rx_msdu_link *)rx_msdu_link_desc;
|
||||
+ struct hal_rx_msdu_link *msdu_link = rx_msdu_link_desc;
|
||||
struct ath11k_buffer_addr *buf_addr_info;
|
||||
|
||||
buf_addr_info = (struct ath11k_buffer_addr *)&msdu_link->buf_addr_info;
|
||||
@@ -4554,7 +4552,7 @@ static void ath11k_hal_rx_msdu_list_get(
|
||||
u32 first = FIELD_PREP(RX_MSDU_DESC_INFO0_FIRST_MSDU_IN_MPDU, 1);
|
||||
u8 tmp = 0;
|
||||
|
||||
- msdu_link = (struct hal_rx_msdu_link *)msdu_link_desc;
|
||||
+ msdu_link = msdu_link_desc;
|
||||
msdu_details = &msdu_link->msdu_link[0];
|
||||
|
||||
for (i = 0; i < HAL_RX_NUM_MSDU_DESC; i++) {
|
||||
@@ -4651,8 +4649,7 @@ ath11k_dp_rx_mon_mpdu_pop(struct ath11k
|
||||
bool is_frag, is_first_msdu;
|
||||
bool drop_mpdu = false;
|
||||
struct ath11k_skb_rxcb *rxcb;
|
||||
- struct hal_reo_entrance_ring *ent_desc =
|
||||
- (struct hal_reo_entrance_ring *)ring_entry;
|
||||
+ struct hal_reo_entrance_ring *ent_desc = ring_entry;
|
||||
int buf_id;
|
||||
u32 rx_link_buf_info[2];
|
||||
u8 rbm;
|
||||
--- a/drivers/net/wireless/ath/ath11k/hal.c
|
||||
+++ b/drivers/net/wireless/ath/ath11k/hal.c
|
||||
@@ -571,7 +571,7 @@ u32 ath11k_hal_ce_get_desc_size(enum hal
|
||||
void ath11k_hal_ce_src_set_desc(void *buf, dma_addr_t paddr, u32 len, u32 id,
|
||||
u8 byte_swap_data)
|
||||
{
|
||||
- struct hal_ce_srng_src_desc *desc = (struct hal_ce_srng_src_desc *)buf;
|
||||
+ struct hal_ce_srng_src_desc *desc = buf;
|
||||
|
||||
desc->buffer_addr_low = paddr & HAL_ADDR_LSB_REG_MASK;
|
||||
desc->buffer_addr_info =
|
||||
@@ -586,8 +586,7 @@ void ath11k_hal_ce_src_set_desc(void *bu
|
||||
|
||||
void ath11k_hal_ce_dst_set_desc(void *buf, dma_addr_t paddr)
|
||||
{
|
||||
- struct hal_ce_srng_dest_desc *desc =
|
||||
- (struct hal_ce_srng_dest_desc *)buf;
|
||||
+ struct hal_ce_srng_dest_desc *desc = buf;
|
||||
|
||||
desc->buffer_addr_low = paddr & HAL_ADDR_LSB_REG_MASK;
|
||||
desc->buffer_addr_info =
|
||||
@@ -597,8 +596,7 @@ void ath11k_hal_ce_dst_set_desc(void *bu
|
||||
|
||||
u32 ath11k_hal_ce_dst_status_get_length(void *buf)
|
||||
{
|
||||
- struct hal_ce_srng_dst_status_desc *desc =
|
||||
- (struct hal_ce_srng_dst_status_desc *)buf;
|
||||
+ struct hal_ce_srng_dst_status_desc *desc = buf;
|
||||
u32 len;
|
||||
|
||||
len = FIELD_GET(HAL_CE_DST_STATUS_DESC_FLAGS_LEN, desc->flags);
|
||||
--- a/drivers/net/wireless/ath/ath11k/hal_rx.c
|
||||
+++ b/drivers/net/wireless/ath/ath11k/hal_rx.c
|
||||
@@ -265,7 +265,7 @@ out:
|
||||
void ath11k_hal_rx_buf_addr_info_set(void *desc, dma_addr_t paddr,
|
||||
u32 cookie, u8 manager)
|
||||
{
|
||||
- struct ath11k_buffer_addr *binfo = (struct ath11k_buffer_addr *)desc;
|
||||
+ struct ath11k_buffer_addr *binfo = desc;
|
||||
u32 paddr_lo, paddr_hi;
|
||||
|
||||
paddr_lo = lower_32_bits(paddr);
|
||||
@@ -279,7 +279,7 @@ void ath11k_hal_rx_buf_addr_info_set(voi
|
||||
void ath11k_hal_rx_buf_addr_info_get(void *desc, dma_addr_t *paddr,
|
||||
u32 *cookie, u8 *rbm)
|
||||
{
|
||||
- struct ath11k_buffer_addr *binfo = (struct ath11k_buffer_addr *)desc;
|
||||
+ struct ath11k_buffer_addr *binfo = desc;
|
||||
|
||||
*paddr =
|
||||
(((u64)FIELD_GET(BUFFER_ADDR_INFO1_ADDR, binfo->info1)) << 32) |
|
||||
@@ -292,7 +292,7 @@ void ath11k_hal_rx_msdu_link_info_get(vo
|
||||
u32 *msdu_cookies,
|
||||
enum hal_rx_buf_return_buf_manager *rbm)
|
||||
{
|
||||
- struct hal_rx_msdu_link *link = (struct hal_rx_msdu_link *)link_desc;
|
||||
+ struct hal_rx_msdu_link *link = link_desc;
|
||||
struct hal_rx_msdu_details *msdu;
|
||||
int i;
|
||||
|
||||
@@ -699,7 +699,7 @@ u32 ath11k_hal_reo_qdesc_size(u32 ba_win
|
||||
void ath11k_hal_reo_qdesc_setup(void *vaddr, int tid, u32 ba_window_size,
|
||||
u32 start_seq, enum hal_pn_type type)
|
||||
{
|
||||
- struct hal_rx_reo_queue *qdesc = (struct hal_rx_reo_queue *)vaddr;
|
||||
+ struct hal_rx_reo_queue *qdesc = vaddr;
|
||||
struct hal_rx_reo_queue_ext *ext_desc;
|
||||
|
||||
memset(qdesc, 0, sizeof(*qdesc));
|
||||
@@ -809,8 +809,7 @@ static inline void
|
||||
ath11k_hal_rx_handle_ofdma_info(void *rx_tlv,
|
||||
struct hal_rx_user_status *rx_user_status)
|
||||
{
|
||||
- struct hal_rx_ppdu_end_user_stats *ppdu_end_user =
|
||||
- (struct hal_rx_ppdu_end_user_stats *)rx_tlv;
|
||||
+ struct hal_rx_ppdu_end_user_stats *ppdu_end_user = rx_tlv;
|
||||
|
||||
rx_user_status->ul_ofdma_user_v0_word0 = __le32_to_cpu(ppdu_end_user->info6);
|
||||
|
||||
@@ -821,8 +820,7 @@ static inline void
|
||||
ath11k_hal_rx_populate_byte_count(void *rx_tlv, void *ppduinfo,
|
||||
struct hal_rx_user_status *rx_user_status)
|
||||
{
|
||||
- struct hal_rx_ppdu_end_user_stats *ppdu_end_user =
|
||||
- (struct hal_rx_ppdu_end_user_stats *)rx_tlv;
|
||||
+ struct hal_rx_ppdu_end_user_stats *ppdu_end_user = rx_tlv;
|
||||
|
||||
rx_user_status->mpdu_ok_byte_count =
|
||||
FIELD_GET(HAL_RX_PPDU_END_USER_STATS_INFO8_MPDU_OK_BYTE_COUNT,
|
||||
@@ -1540,8 +1538,7 @@ void ath11k_hal_rx_reo_ent_buf_paddr_get
|
||||
u32 *sw_cookie, void **pp_buf_addr,
|
||||
u8 *rbm, u32 *msdu_cnt)
|
||||
{
|
||||
- struct hal_reo_entrance_ring *reo_ent_ring =
|
||||
- (struct hal_reo_entrance_ring *)rx_desc;
|
||||
+ struct hal_reo_entrance_ring *reo_ent_ring = rx_desc;
|
||||
struct ath11k_buffer_addr *buf_addr_info;
|
||||
struct rx_mpdu_desc *rx_mpdu_desc_info_details;
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath11k/hal_tx.c
|
||||
+++ b/drivers/net/wireless/ath/ath11k/hal_tx.c
|
||||
@@ -37,7 +37,7 @@ static const u8 dscp_tid_map[DSCP_TID_MA
|
||||
void ath11k_hal_tx_cmd_desc_setup(struct ath11k_base *ab, void *cmd,
|
||||
struct hal_tx_info *ti)
|
||||
{
|
||||
- struct hal_tcl_data_cmd *tcl_cmd = (struct hal_tcl_data_cmd *)cmd;
|
||||
+ struct hal_tcl_data_cmd *tcl_cmd = cmd;
|
||||
|
||||
tcl_cmd->buf_addr_info.info0 =
|
||||
FIELD_PREP(BUFFER_ADDR_INFO0_ADDR, ti->paddr);
|
||||
--- a/drivers/net/wireless/ath/ath11k/mac.c
|
||||
+++ b/drivers/net/wireless/ath/ath11k/mac.c
|
||||
@@ -6970,8 +6970,8 @@ err:
|
||||
|
||||
static int ath11k_mac_vif_unref(int buf_id, void *skb, void *ctx)
|
||||
{
|
||||
- struct ieee80211_vif *vif = (struct ieee80211_vif *)ctx;
|
||||
- struct ath11k_skb_cb *skb_cb = ATH11K_SKB_CB((struct sk_buff *)skb);
|
||||
+ struct ieee80211_vif *vif = ctx;
|
||||
+ struct ath11k_skb_cb *skb_cb = ATH11K_SKB_CB(skb);
|
||||
|
||||
if (skb_cb->vif == vif)
|
||||
skb_cb->vif = NULL;
|
||||
--- a/drivers/net/wireless/ath/ath11k/spectral.c
|
||||
+++ b/drivers/net/wireless/ath/ath11k/spectral.c
|
||||
@@ -592,7 +592,7 @@ int ath11k_spectral_process_fft(struct a
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
- tlv = (struct spectral_tlv *)data;
|
||||
+ tlv = data;
|
||||
tlv_len = FIELD_GET(SPECTRAL_TLV_HDR_LEN, __le32_to_cpu(tlv->header));
|
||||
/* convert Dword into bytes */
|
||||
tlv_len *= ATH11K_SPECTRAL_DWORD_SIZE;
|
||||
--- a/drivers/net/wireless/ath/ath11k/wmi.c
|
||||
+++ b/drivers/net/wireless/ath/ath11k/wmi.c
|
||||
@@ -2281,7 +2281,7 @@ int ath11k_wmi_send_scan_start_cmd(struc
|
||||
tlv->header = FIELD_PREP(WMI_TLV_TAG, WMI_TAG_ARRAY_UINT32) |
|
||||
FIELD_PREP(WMI_TLV_LEN, len);
|
||||
ptr += TLV_HDR_SIZE;
|
||||
- tmp_ptr = (u32 *)ptr;
|
||||
+ tmp_ptr = ptr;
|
||||
|
||||
for (i = 0; i < params->num_chan; ++i)
|
||||
tmp_ptr[i] = params->chan_list[i];
|
||||
@@ -4148,7 +4148,7 @@ static int ath11k_init_cmd_send(struct a
|
||||
ptr += TLV_HDR_SIZE + len;
|
||||
|
||||
if (param->hw_mode_id != WMI_HOST_HW_MODE_MAX) {
|
||||
- hw_mode = (struct wmi_pdev_set_hw_mode_cmd_param *)ptr;
|
||||
+ hw_mode = ptr;
|
||||
hw_mode->tlv_header = FIELD_PREP(WMI_TLV_TAG,
|
||||
WMI_TAG_PDEV_SET_HW_MODE_CMD) |
|
||||
FIELD_PREP(WMI_TLV_LEN,
|
||||
@@ -4168,7 +4168,7 @@ static int ath11k_init_cmd_send(struct a
|
||||
len = sizeof(*band_to_mac);
|
||||
|
||||
for (idx = 0; idx < param->num_band_to_mac; idx++) {
|
||||
- band_to_mac = (void *)ptr;
|
||||
+ band_to_mac = ptr;
|
||||
|
||||
band_to_mac->tlv_header = FIELD_PREP(WMI_TLV_TAG,
|
||||
WMI_TAG_PDEV_BAND_TO_MAC) |
|
@ -1,96 +0,0 @@
|
||||
From 4fd15bb705d3faa7e6adab2daba2e3af80d9b6bd Mon Sep 17 00:00:00 2001
|
||||
From: Dmitry Antipov <dmantipov@yandex.ru>
|
||||
Date: Tue, 26 Sep 2023 07:29:04 +0300
|
||||
Subject: [PATCH] wifi: ath11k: fix ath11k_mac_op_remain_on_channel() stack
|
||||
usage
|
||||
|
||||
When compiling with clang 16.0.6, I've noticed the following:
|
||||
|
||||
drivers/net/wireless/ath/ath11k/mac.c:8903:12: warning: stack frame
|
||||
size (1032) exceeds limit (1024) in 'ath11k_mac_op_remain_on_channel'
|
||||
[-Wframe-larger-than]
|
||||
static int ath11k_mac_op_remain_on_channel(struct ieee80211_hw *hw,
|
||||
^
|
||||
68/1032 (6.59%) spills, 964/1032 (93.41%) variables
|
||||
|
||||
So switch to kzalloc()'ed instance of 'struct scan_req_params' like
|
||||
it's done in 'ath11k_mac_op_hw_scan()'. Compile tested only.
|
||||
|
||||
Signed-off-by: Dmitry Antipov <dmantipov@yandex.ru>
|
||||
Acked-by: Jeff Johnson <quic_jjohnson@quicinc.com>
|
||||
Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
|
||||
Link: https://lore.kernel.org/r/20230926042906.13725-1-dmantipov@yandex.ru
|
||||
---
|
||||
drivers/net/wireless/ath/ath11k/mac.c | 44 +++++++++++++++------------
|
||||
1 file changed, 25 insertions(+), 19 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath11k/mac.c
|
||||
+++ b/drivers/net/wireless/ath/ath11k/mac.c
|
||||
@@ -8908,7 +8908,7 @@ static int ath11k_mac_op_remain_on_chann
|
||||
{
|
||||
struct ath11k *ar = hw->priv;
|
||||
struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
|
||||
- struct scan_req_params arg;
|
||||
+ struct scan_req_params *arg;
|
||||
int ret;
|
||||
u32 scan_time_msec;
|
||||
|
||||
@@ -8940,27 +8940,31 @@ static int ath11k_mac_op_remain_on_chann
|
||||
|
||||
scan_time_msec = ar->hw->wiphy->max_remain_on_channel_duration * 2;
|
||||
|
||||
- memset(&arg, 0, sizeof(arg));
|
||||
- ath11k_wmi_start_scan_init(ar, &arg);
|
||||
- arg.num_chan = 1;
|
||||
- arg.chan_list = kcalloc(arg.num_chan, sizeof(*arg.chan_list),
|
||||
- GFP_KERNEL);
|
||||
- if (!arg.chan_list) {
|
||||
+ arg = kzalloc(sizeof(*arg), GFP_KERNEL);
|
||||
+ if (!arg) {
|
||||
ret = -ENOMEM;
|
||||
goto exit;
|
||||
}
|
||||
+ ath11k_wmi_start_scan_init(ar, arg);
|
||||
+ arg->num_chan = 1;
|
||||
+ arg->chan_list = kcalloc(arg->num_chan, sizeof(*arg->chan_list),
|
||||
+ GFP_KERNEL);
|
||||
+ if (!arg->chan_list) {
|
||||
+ ret = -ENOMEM;
|
||||
+ goto free_arg;
|
||||
+ }
|
||||
|
||||
- arg.vdev_id = arvif->vdev_id;
|
||||
- arg.scan_id = ATH11K_SCAN_ID;
|
||||
- arg.chan_list[0] = chan->center_freq;
|
||||
- arg.dwell_time_active = scan_time_msec;
|
||||
- arg.dwell_time_passive = scan_time_msec;
|
||||
- arg.max_scan_time = scan_time_msec;
|
||||
- arg.scan_flags |= WMI_SCAN_FLAG_PASSIVE;
|
||||
- arg.scan_flags |= WMI_SCAN_FILTER_PROBE_REQ;
|
||||
- arg.burst_duration = duration;
|
||||
+ arg->vdev_id = arvif->vdev_id;
|
||||
+ arg->scan_id = ATH11K_SCAN_ID;
|
||||
+ arg->chan_list[0] = chan->center_freq;
|
||||
+ arg->dwell_time_active = scan_time_msec;
|
||||
+ arg->dwell_time_passive = scan_time_msec;
|
||||
+ arg->max_scan_time = scan_time_msec;
|
||||
+ arg->scan_flags |= WMI_SCAN_FLAG_PASSIVE;
|
||||
+ arg->scan_flags |= WMI_SCAN_FILTER_PROBE_REQ;
|
||||
+ arg->burst_duration = duration;
|
||||
|
||||
- ret = ath11k_start_scan(ar, &arg);
|
||||
+ ret = ath11k_start_scan(ar, arg);
|
||||
if (ret) {
|
||||
ath11k_warn(ar->ab, "failed to start roc scan: %d\n", ret);
|
||||
|
||||
@@ -8986,7 +8990,9 @@ static int ath11k_mac_op_remain_on_chann
|
||||
ret = 0;
|
||||
|
||||
free_chan_list:
|
||||
- kfree(arg.chan_list);
|
||||
+ kfree(arg->chan_list);
|
||||
+free_arg:
|
||||
+ kfree(arg);
|
||||
exit:
|
||||
mutex_unlock(&ar->conf_mutex);
|
||||
return ret;
|
@ -1,67 +0,0 @@
|
||||
From 9e61589ac3c2d23c528d3ffd44604d98553ea1cb Mon Sep 17 00:00:00 2001
|
||||
From: Kalle Valo <quic_kvalo@quicinc.com>
|
||||
Date: Wed, 27 Sep 2023 17:27:08 +0300
|
||||
Subject: [PATCH] wifi: ath11k: mac: fix struct ieee80211_sband_iftype_data
|
||||
handling
|
||||
|
||||
Commit e8c1841278a7 ("wifi: cfg80211: annotate iftype_data pointer with
|
||||
sparse") added sparse checks for struct ieee80211_sband_iftype_data handling
|
||||
which immediately found an issue in ath11k:
|
||||
|
||||
drivers/net/wireless/ath/ath11k/mac.c:7952:22: warning: incorrect type in argument 1 (different address spaces)
|
||||
drivers/net/wireless/ath/ath11k/mac.c:7952:22: expected struct ieee80211_sta_he_cap const *he_cap
|
||||
drivers/net/wireless/ath/ath11k/mac.c:7952:22: got struct ieee80211_sta_he_cap const [noderef] __iftype_data *
|
||||
|
||||
The problem here is that we are accessing sband->iftype_data directly even
|
||||
though we should use for_each_sband_iftype_data() or similar. Fortunately
|
||||
there's ieee80211_get_he_iftype_cap_vif() which is just what we need here so
|
||||
use it to get HE capabilities.
|
||||
|
||||
Tested-on: WCN6855 hw2.0 PCI WLAN.HSP.1.1-03125-QCAHSPSWPL_V1_V2_SILICONZ_LITE-3.6510.23
|
||||
|
||||
Reported-by: Johannes Berg <johannes@sipsolutions.net>
|
||||
Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
|
||||
Link: https://lore.kernel.org/r/20230927142708.2897504-2-kvalo@kernel.org
|
||||
---
|
||||
drivers/net/wireless/ath/ath11k/mac.c | 10 ++++++++--
|
||||
1 file changed, 8 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath11k/mac.c
|
||||
+++ b/drivers/net/wireless/ath/ath11k/mac.c
|
||||
@@ -7913,12 +7913,14 @@ ath11k_mac_get_tx_mcs_map(const struct i
|
||||
|
||||
static bool
|
||||
ath11k_mac_bitrate_mask_get_single_nss(struct ath11k *ar,
|
||||
+ struct ath11k_vif *arvif,
|
||||
enum nl80211_band band,
|
||||
const struct cfg80211_bitrate_mask *mask,
|
||||
int *nss)
|
||||
{
|
||||
struct ieee80211_supported_band *sband = &ar->mac.sbands[band];
|
||||
u16 vht_mcs_map = le16_to_cpu(sband->vht_cap.vht_mcs.tx_mcs_map);
|
||||
+ const struct ieee80211_sta_he_cap *he_cap;
|
||||
u16 he_mcs_map = 0;
|
||||
u8 ht_nss_mask = 0;
|
||||
u8 vht_nss_mask = 0;
|
||||
@@ -7949,7 +7951,11 @@ ath11k_mac_bitrate_mask_get_single_nss(s
|
||||
return false;
|
||||
}
|
||||
|
||||
- he_mcs_map = le16_to_cpu(ath11k_mac_get_tx_mcs_map(&sband->iftype_data->he_cap));
|
||||
+ he_cap = ieee80211_get_he_iftype_cap_vif(sband, arvif->vif);
|
||||
+ if (!he_cap)
|
||||
+ return false;
|
||||
+
|
||||
+ he_mcs_map = le16_to_cpu(ath11k_mac_get_tx_mcs_map(he_cap));
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(mask->control[band].he_mcs); i++) {
|
||||
if (mask->control[band].he_mcs[i] == 0)
|
||||
@@ -8365,7 +8371,7 @@ ath11k_mac_op_set_bitrate_mask(struct ie
|
||||
ieee80211_iterate_stations_atomic(ar->hw,
|
||||
ath11k_mac_disable_peer_fixed_rate,
|
||||
arvif);
|
||||
- } else if (ath11k_mac_bitrate_mask_get_single_nss(ar, band, mask,
|
||||
+ } else if (ath11k_mac_bitrate_mask_get_single_nss(ar, arvif, band, mask,
|
||||
&single_nss)) {
|
||||
rate = WMI_FIXED_RATE_NONE;
|
||||
nss = single_nss;
|
@ -1,80 +0,0 @@
|
||||
From 69fcb525905600a151997cd16367bb92c34a2b14 Mon Sep 17 00:00:00 2001
|
||||
From: Aditya Kumar Singh <quic_adisi@quicinc.com>
|
||||
Date: Tue, 3 Oct 2023 17:26:54 +0300
|
||||
Subject: [PATCH] wifi: ath11k: fix CAC running state during virtual interface
|
||||
start
|
||||
|
||||
Currently channel definition's primary channel's DFS CAC time
|
||||
as well as primary channel's state i.e usable are used to set
|
||||
the CAC_RUNNING flag for the ath11k radio structure. However,
|
||||
this is wrong since certain channel definition are possbile
|
||||
where primary channel may not be a DFS channel but, secondary
|
||||
channel is a DFS channel. For example - channel 36 with 160 MHz
|
||||
bandwidth.
|
||||
In such cases, the flag will not be set which is wrong.
|
||||
|
||||
Fix this issue by using cfg80211_chandef_dfs_usable() function
|
||||
from cfg80211 which return trues if at least one channel is in
|
||||
usable state.
|
||||
|
||||
While at it, modify the CAC running debug log message to print
|
||||
the CAC time as well in milli-seconds.
|
||||
|
||||
Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1
|
||||
|
||||
Signed-off-by: Aditya Kumar Singh <quic_adisi@quicinc.com>
|
||||
Acked-by: Jeff Johnson <quic_jjohnson@quicinc.com>
|
||||
Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
|
||||
Link: https://lore.kernel.org/r/20230912051857.2284-3-quic_adisi@quicinc.com
|
||||
---
|
||||
drivers/net/wireless/ath/ath11k/mac.c | 19 +++++++++++--------
|
||||
1 file changed, 11 insertions(+), 8 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath11k/mac.c
|
||||
+++ b/drivers/net/wireless/ath/ath11k/mac.c
|
||||
@@ -5,6 +5,7 @@
|
||||
*/
|
||||
|
||||
#include <net/mac80211.h>
|
||||
+#include <net/cfg80211.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/bitfield.h>
|
||||
#include <linux/inetdevice.h>
|
||||
@@ -7196,6 +7197,7 @@ ath11k_mac_vdev_start_restart(struct ath
|
||||
struct wmi_vdev_start_req_arg arg = {};
|
||||
const struct cfg80211_chan_def *chandef = &ctx->def;
|
||||
int ret = 0;
|
||||
+ unsigned int dfs_cac_time;
|
||||
|
||||
lockdep_assert_held(&ar->conf_mutex);
|
||||
|
||||
@@ -7275,20 +7277,21 @@ ath11k_mac_vdev_start_restart(struct ath
|
||||
ath11k_dbg(ab, ATH11K_DBG_MAC, "vdev %pM started, vdev_id %d\n",
|
||||
arvif->vif->addr, arvif->vdev_id);
|
||||
|
||||
- /* Enable CAC Flag in the driver by checking the channel DFS cac time,
|
||||
- * i.e dfs_cac_ms value which will be valid only for radar channels
|
||||
- * and state as NL80211_DFS_USABLE which indicates CAC needs to be
|
||||
+ /* Enable CAC Flag in the driver by checking the all sub-channel's DFS
|
||||
+ * state as NL80211_DFS_USABLE which indicates CAC needs to be
|
||||
* done before channel usage. This flags is used to drop rx packets.
|
||||
* during CAC.
|
||||
*/
|
||||
/* TODO Set the flag for other interface types as required */
|
||||
- if (arvif->vdev_type == WMI_VDEV_TYPE_AP &&
|
||||
- chandef->chan->dfs_cac_ms &&
|
||||
- chandef->chan->dfs_state == NL80211_DFS_USABLE) {
|
||||
+ if (arvif->vdev_type == WMI_VDEV_TYPE_AP && ctx->radar_enabled &&
|
||||
+ cfg80211_chandef_dfs_usable(ar->hw->wiphy, chandef)) {
|
||||
set_bit(ATH11K_CAC_RUNNING, &ar->dev_flags);
|
||||
+ dfs_cac_time = cfg80211_chandef_dfs_cac_time(ar->hw->wiphy,
|
||||
+ chandef);
|
||||
ath11k_dbg(ab, ATH11K_DBG_MAC,
|
||||
- "CAC Started in chan_freq %d for vdev %d\n",
|
||||
- arg.channel.freq, arg.vdev_id);
|
||||
+ "cac started dfs_cac_time %u center_freq %d center_freq1 %d for vdev %d\n",
|
||||
+ dfs_cac_time, arg.channel.freq, chandef->center_freq1,
|
||||
+ arg.vdev_id);
|
||||
}
|
||||
|
||||
ret = ath11k_mac_set_txbf_conf(arvif);
|
@ -1,43 +0,0 @@
|
||||
From 77f1ee6fd8b6e470f721d05a2e269039d5cafcb7 Mon Sep 17 00:00:00 2001
|
||||
From: Aditya Kumar Singh <quic_adisi@quicinc.com>
|
||||
Date: Tue, 3 Oct 2023 17:26:54 +0300
|
||||
Subject: [PATCH] wifi: ath11k: fix Tx power value during active CAC
|
||||
|
||||
Tx power is fetched from firmware's pdev stats. However, during active
|
||||
CAC, firmware does not fill the current Tx power and sends the max
|
||||
initialised value filled during firmware init. If host sends this power
|
||||
to user space, this is wrong since in certain situations, the Tx power
|
||||
could be greater than the max allowed by the regulatory. Hence, host
|
||||
should not be fetching the Tx power during an active CAC.
|
||||
|
||||
Fix this issue by returning -EAGAIN error so that user space knows that there's
|
||||
no valid value available.
|
||||
|
||||
Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1
|
||||
|
||||
Fixes: 9a2aa68afe3d ("wifi: ath11k: add get_txpower mac ops")
|
||||
Signed-off-by: Aditya Kumar Singh <quic_adisi@quicinc.com>
|
||||
Acked-by: Jeff Johnson <quic_jjohnson@quicinc.com>
|
||||
Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
|
||||
Link: https://lore.kernel.org/r/20230912051857.2284-4-quic_adisi@quicinc.com
|
||||
---
|
||||
drivers/net/wireless/ath/ath11k/mac.c | 8 ++++++++
|
||||
1 file changed, 8 insertions(+)
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath11k/mac.c
|
||||
+++ b/drivers/net/wireless/ath/ath11k/mac.c
|
||||
@@ -9068,6 +9068,14 @@ static int ath11k_mac_op_get_txpower(str
|
||||
return -EAGAIN;
|
||||
}
|
||||
|
||||
+ /* Firmware doesn't provide Tx power during CAC hence no need to fetch
|
||||
+ * the stats.
|
||||
+ */
|
||||
+ if (test_bit(ATH11K_CAC_RUNNING, &ar->dev_flags)) {
|
||||
+ mutex_unlock(&ar->conf_mutex);
|
||||
+ return -EAGAIN;
|
||||
+ }
|
||||
+
|
||||
req_param.pdev_id = ar->pdev->pdev_id;
|
||||
req_param.stats_id = WMI_REQUEST_PDEV_STAT;
|
||||
|
@ -1,37 +0,0 @@
|
||||
From e149353e6562f3e3246f75dfc4cca6a0cc5b4efc Mon Sep 17 00:00:00 2001
|
||||
From: Aloka Dixit <quic_alokad@quicinc.com>
|
||||
Date: Mon, 9 Oct 2023 10:13:54 +0300
|
||||
Subject: [PATCH] wifi: ath11k: call ath11k_mac_fils_discovery() without
|
||||
condition
|
||||
|
||||
Mac80211 does not set flags BSS_CHANGED_FILS_DISCOVERY and
|
||||
BSS_CHANGED_UNSOL_BCAST_PROBE_RESP if there are no updates to
|
||||
FILS discovery and unsolicited broadcast probe response transmission
|
||||
configurations respectively. This results in the transmissions getting
|
||||
stopped during BSS change operations which do not include these
|
||||
attributes. Remove the checks for the flags and always send the existing
|
||||
configuration to firmware.
|
||||
|
||||
Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1
|
||||
|
||||
Signed-off-by: Aloka Dixit <quic_alokad@quicinc.com>
|
||||
Acked-by: Jeff Johnson <quic_jjohnson@quicinc.com>
|
||||
Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
|
||||
Link: https://lore.kernel.org/r/20231004044915.6817-1-quic_alokad@quicinc.com
|
||||
---
|
||||
drivers/net/wireless/ath/ath11k/mac.c | 4 +---
|
||||
1 file changed, 1 insertion(+), 3 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath11k/mac.c
|
||||
+++ b/drivers/net/wireless/ath/ath11k/mac.c
|
||||
@@ -3732,9 +3732,7 @@ static void ath11k_mac_op_bss_info_chang
|
||||
arvif->vdev_id, ret);
|
||||
}
|
||||
|
||||
- if (changed & BSS_CHANGED_FILS_DISCOVERY ||
|
||||
- changed & BSS_CHANGED_UNSOL_BCAST_PROBE_RESP)
|
||||
- ath11k_mac_fils_discovery(arvif, info);
|
||||
+ ath11k_mac_fils_discovery(arvif, info);
|
||||
|
||||
if (changed & BSS_CHANGED_ARP_FILTER) {
|
||||
ipv4_cnt = min(vif->cfg.arp_addr_cnt, ATH11K_IPV4_MAX_COUNT);
|
@ -1,39 +0,0 @@
|
||||
From a47111663491ff2829df0626493ce81b48dd880a Mon Sep 17 00:00:00 2001
|
||||
From: Kalle Valo <quic_kvalo@quicinc.com>
|
||||
Date: Tue, 10 Oct 2023 09:22:50 +0300
|
||||
Subject: [PATCH] wifi: ath11k: ath11k_debugfs_register(): fix
|
||||
format-truncation warning
|
||||
|
||||
In v6.6-rc4 with GCC 13.2 I see a new warning:
|
||||
|
||||
drivers/net/wireless/ath/ath11k/debugfs.c: In function 'ath11k_debugfs_register':
|
||||
drivers/net/wireless/ath/ath11k/debugfs.c:1597:51: error: '%d' directive output may be truncated writing between 1 and 3 bytes into a region of size 2 [-Werror=format-truncation=]
|
||||
drivers/net/wireless/ath/ath11k/debugfs.c:1597:48: note: directive argument in the range [0, 255]
|
||||
drivers/net/wireless/ath/ath11k/debugfs.c:1597:9: note: 'snprintf' output between 5 and 7 bytes into a destination of size 5
|
||||
|
||||
Increase the size of pdev_name to 10 bytes to make sure there's enough room for
|
||||
the string. Also change the format to '%u' as ar->pdev_idx is u8.
|
||||
|
||||
Compile tested only.
|
||||
|
||||
Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
|
||||
Link: https://lore.kernel.org/r/20231010062250.2580951-1-kvalo@kernel.org
|
||||
---
|
||||
drivers/net/wireless/ath/ath11k/debugfs.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath11k/debugfs.c
|
||||
+++ b/drivers/net/wireless/ath/ath11k/debugfs.c
|
||||
@@ -1591,10 +1591,10 @@ static const struct file_operations fops
|
||||
int ath11k_debugfs_register(struct ath11k *ar)
|
||||
{
|
||||
struct ath11k_base *ab = ar->ab;
|
||||
- char pdev_name[5];
|
||||
+ char pdev_name[10];
|
||||
char buf[100] = {0};
|
||||
|
||||
- snprintf(pdev_name, sizeof(pdev_name), "%s%d", "mac", ar->pdev_idx);
|
||||
+ snprintf(pdev_name, sizeof(pdev_name), "%s%u", "mac", ar->pdev_idx);
|
||||
|
||||
ar->debug.debugfs_pdev = debugfs_create_dir(pdev_name, ab->debugfs_soc);
|
||||
if (IS_ERR(ar->debug.debugfs_pdev))
|
@ -1,84 +0,0 @@
|
||||
From 534c2dd8099a9cc4bad8ea8b3c7fa1f730e10d5d Mon Sep 17 00:00:00 2001
|
||||
From: Aditya Kumar Singh <quic_adisi@quicinc.com>
|
||||
Date: Tue, 10 Oct 2023 10:27:19 +0300
|
||||
Subject: [PATCH] wifi: ath11k: add parsing of phy bitmap for reg rules
|
||||
|
||||
Certain regulatory domains could put restrictions on phy mode operation.
|
||||
For example, in a few countries HE Operation is not allowed. For such
|
||||
countries, firmware indicates this via phy bitmap in each reg rule.
|
||||
|
||||
Currently, there is no logic to parse this info and then pass it on to the
|
||||
cfg80211/regulatory.
|
||||
|
||||
Add parsing of this phy bitmap from the regulatory channel change event and
|
||||
then accordingly map it to cfg80211/regulatory flags and pass it on to it.
|
||||
|
||||
While at it, correct typo in debug print s/dsf/dfs.
|
||||
|
||||
Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1
|
||||
|
||||
Signed-off-by: Aditya Kumar Singh <quic_adisi@quicinc.com>
|
||||
Acked-by: Jeff Johnson <quic_jjohnson@quicinc.com>
|
||||
Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
|
||||
Link: https://lore.kernel.org/r/20231004092655.25020-1-quic_adisi@quicinc.com
|
||||
---
|
||||
drivers/net/wireless/ath/ath11k/reg.c | 11 +++++++++++
|
||||
drivers/net/wireless/ath/ath11k/reg.h | 3 +++
|
||||
drivers/net/wireless/ath/ath11k/wmi.c | 5 +++--
|
||||
3 files changed, 17 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath11k/reg.c
|
||||
+++ b/drivers/net/wireless/ath/ath11k/reg.c
|
||||
@@ -352,6 +352,16 @@ static u32 ath11k_map_fw_reg_flags(u16 r
|
||||
return flags;
|
||||
}
|
||||
|
||||
+static u32 ath11k_map_fw_phy_flags(u32 phy_flags)
|
||||
+{
|
||||
+ u32 flags = 0;
|
||||
+
|
||||
+ if (phy_flags & ATH11K_REG_PHY_BITMAP_NO11AX)
|
||||
+ flags |= NL80211_RRF_NO_HE;
|
||||
+
|
||||
+ return flags;
|
||||
+}
|
||||
+
|
||||
static bool
|
||||
ath11k_reg_can_intersect(struct ieee80211_reg_rule *rule1,
|
||||
struct ieee80211_reg_rule *rule2)
|
||||
@@ -685,6 +695,7 @@ ath11k_reg_build_regd(struct ath11k_base
|
||||
}
|
||||
|
||||
flags |= ath11k_map_fw_reg_flags(reg_rule->flags);
|
||||
+ flags |= ath11k_map_fw_phy_flags(reg_info->phybitmap);
|
||||
|
||||
ath11k_reg_update_rule(tmp_regd->reg_rules + i,
|
||||
reg_rule->start_freq,
|
||||
--- a/drivers/net/wireless/ath/ath11k/reg.h
|
||||
+++ b/drivers/net/wireless/ath/ath11k/reg.h
|
||||
@@ -24,6 +24,9 @@ enum ath11k_dfs_region {
|
||||
ATH11K_DFS_REG_UNDEF,
|
||||
};
|
||||
|
||||
+/* Phy bitmaps */
|
||||
+#define ATH11K_REG_PHY_BITMAP_NO11AX BIT(5)
|
||||
+
|
||||
/* ATH11K Regulatory API's */
|
||||
void ath11k_reg_init(struct ath11k *ar);
|
||||
void ath11k_reg_free(struct ath11k_base *ab);
|
||||
--- a/drivers/net/wireless/ath/ath11k/wmi.c
|
||||
+++ b/drivers/net/wireless/ath/ath11k/wmi.c
|
||||
@@ -5440,10 +5440,11 @@ static int ath11k_pull_reg_chan_list_ext
|
||||
}
|
||||
|
||||
ath11k_dbg(ab, ATH11K_DBG_WMI,
|
||||
- "cc_ext %s dsf %d BW: min_2ghz %d max_2ghz %d min_5ghz %d max_5ghz %d",
|
||||
+ "cc_ext %s dfs %d BW: min_2ghz %d max_2ghz %d min_5ghz %d max_5ghz %d phy_bitmap 0x%x",
|
||||
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);
|
||||
+ reg_info->min_bw_5ghz, reg_info->max_bw_5ghz,
|
||||
+ reg_info->phybitmap);
|
||||
|
||||
ath11k_dbg(ab, ATH11K_DBG_WMI,
|
||||
"num_2ghz_reg_rules %d num_5ghz_reg_rules %d",
|
@ -1,38 +0,0 @@
|
||||
From 480d230bef0ecd06e72ae3a84117142e38e77503 Mon Sep 17 00:00:00 2001
|
||||
From: Jeff Johnson <quic_jjohnson@quicinc.com>
|
||||
Date: Mon, 9 Oct 2023 09:36:54 -0700
|
||||
Subject: [PATCH] wifi: ath11k: Remove unused struct ath11k_htc_frame
|
||||
|
||||
struct ath11k_htc_frame is unused, and since it illogically contains
|
||||
two consecutive flexible arrays, it could never be used, so remove it.
|
||||
|
||||
No functional changes, compile tested only.
|
||||
|
||||
Signed-off-by: Jeff Johnson <quic_jjohnson@quicinc.com>
|
||||
Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
|
||||
Link: https://lore.kernel.org/r/20231009-ath11k_htc_frame-v1-1-81d405b7a195@quicinc.com
|
||||
---
|
||||
drivers/net/wireless/ath/ath11k/htc.h | 12 ------------
|
||||
1 file changed, 12 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath11k/htc.h
|
||||
+++ b/drivers/net/wireless/ath/ath11k/htc.h
|
||||
@@ -156,18 +156,6 @@ struct ath11k_htc_record {
|
||||
};
|
||||
} __packed __aligned(4);
|
||||
|
||||
-/* note: the trailer offset is dynamic depending
|
||||
- * on payload length. this is only a struct layout draft
|
||||
- */
|
||||
-struct ath11k_htc_frame {
|
||||
- struct ath11k_htc_hdr hdr;
|
||||
- union {
|
||||
- struct ath11k_htc_msg msg;
|
||||
- u8 payload[0];
|
||||
- };
|
||||
- struct ath11k_htc_record trailer[0];
|
||||
-} __packed __aligned(4);
|
||||
-
|
||||
enum ath11k_htc_svc_gid {
|
||||
ATH11K_HTC_SVC_GRP_RSVD = 0,
|
||||
ATH11K_HTC_SVC_GRP_WMI = 1,
|
@ -1,384 +0,0 @@
|
||||
From 10c65f97b424fcee439463f933140df2a0022f98 Mon Sep 17 00:00:00 2001
|
||||
From: Jeff Johnson <quic_jjohnson@quicinc.com>
|
||||
Date: Mon, 9 Oct 2023 09:39:42 -0700
|
||||
Subject: [PATCH] wifi: ath11k: Introduce and use ath11k_sta_to_arsta()
|
||||
|
||||
Currently, the logic to return an ath11k_sta pointer, given a
|
||||
ieee80211_sta pointer, uses typecasting throughout the driver. In
|
||||
general, conversion functions are preferable to typecasting since
|
||||
using a conversion function allows the compiler to validate the types
|
||||
of both the input and output parameters.
|
||||
|
||||
ath11k already defines a conversion function ath11k_vif_to_arvif() for
|
||||
a similar conversion. So introduce ath11k_sta_to_arsta() for this use
|
||||
case, and convert all of the existing typecasting to use this
|
||||
function.
|
||||
|
||||
No functional changes, compile tested only.
|
||||
|
||||
Signed-off-by: Jeff Johnson <quic_jjohnson@quicinc.com>
|
||||
Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
|
||||
Link: https://lore.kernel.org/r/20231009-ath11k_sta_to_arsta-v1-1-1563e3a307e8@quicinc.com
|
||||
---
|
||||
drivers/net/wireless/ath/ath11k/core.h | 5 ++++
|
||||
drivers/net/wireless/ath/ath11k/debugfs.c | 4 +--
|
||||
drivers/net/wireless/ath/ath11k/debugfs_sta.c | 30 +++++++++----------
|
||||
drivers/net/wireless/ath/ath11k/dp_rx.c | 8 ++---
|
||||
drivers/net/wireless/ath/ath11k/dp_tx.c | 4 +--
|
||||
drivers/net/wireless/ath/ath11k/mac.c | 18 +++++------
|
||||
drivers/net/wireless/ath/ath11k/peer.c | 2 +-
|
||||
drivers/net/wireless/ath/ath11k/wmi.c | 6 ++--
|
||||
8 files changed, 41 insertions(+), 36 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath11k/core.h
|
||||
+++ b/drivers/net/wireless/ath/ath11k/core.h
|
||||
@@ -1223,6 +1223,11 @@ static inline struct ath11k_vif *ath11k_
|
||||
return (struct ath11k_vif *)vif->drv_priv;
|
||||
}
|
||||
|
||||
+static inline struct ath11k_sta *ath11k_sta_to_arsta(struct ieee80211_sta *sta)
|
||||
+{
|
||||
+ return (struct ath11k_sta *)sta->drv_priv;
|
||||
+}
|
||||
+
|
||||
static inline struct ath11k *ath11k_ab_to_ar(struct ath11k_base *ab,
|
||||
int mac_id)
|
||||
{
|
||||
--- a/drivers/net/wireless/ath/ath11k/debugfs.c
|
||||
+++ b/drivers/net/wireless/ath/ath11k/debugfs.c
|
||||
@@ -1459,7 +1459,7 @@ static void ath11k_reset_peer_ps_duratio
|
||||
struct ieee80211_sta *sta)
|
||||
{
|
||||
struct ath11k *ar = data;
|
||||
- struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
|
||||
+ struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
|
||||
|
||||
spin_lock_bh(&ar->data_lock);
|
||||
arsta->ps_total_duration = 0;
|
||||
@@ -1510,7 +1510,7 @@ static void ath11k_peer_ps_state_disable
|
||||
struct ieee80211_sta *sta)
|
||||
{
|
||||
struct ath11k *ar = data;
|
||||
- struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
|
||||
+ struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
|
||||
|
||||
spin_lock_bh(&ar->data_lock);
|
||||
arsta->peer_ps_state = WMI_PEER_PS_STATE_DISABLED;
|
||||
--- a/drivers/net/wireless/ath/ath11k/debugfs_sta.c
|
||||
+++ b/drivers/net/wireless/ath/ath11k/debugfs_sta.c
|
||||
@@ -136,7 +136,7 @@ static ssize_t ath11k_dbg_sta_dump_tx_st
|
||||
size_t count, loff_t *ppos)
|
||||
{
|
||||
struct ieee80211_sta *sta = file->private_data;
|
||||
- struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
|
||||
+ struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
|
||||
struct ath11k *ar = arsta->arvif->ar;
|
||||
struct ath11k_htt_data_stats *stats;
|
||||
static const char *str_name[ATH11K_STATS_TYPE_MAX] = {"succ", "fail",
|
||||
@@ -243,7 +243,7 @@ static ssize_t ath11k_dbg_sta_dump_rx_st
|
||||
size_t count, loff_t *ppos)
|
||||
{
|
||||
struct ieee80211_sta *sta = file->private_data;
|
||||
- struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
|
||||
+ struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
|
||||
struct ath11k *ar = arsta->arvif->ar;
|
||||
struct ath11k_rx_peer_stats *rx_stats = arsta->rx_stats;
|
||||
int len = 0, i, retval = 0;
|
||||
@@ -340,7 +340,7 @@ static int
|
||||
ath11k_dbg_sta_open_htt_peer_stats(struct inode *inode, struct file *file)
|
||||
{
|
||||
struct ieee80211_sta *sta = inode->i_private;
|
||||
- struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
|
||||
+ struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
|
||||
struct ath11k *ar = arsta->arvif->ar;
|
||||
struct debug_htt_stats_req *stats_req;
|
||||
int type = ar->debug.htt_stats.type;
|
||||
@@ -376,7 +376,7 @@ static int
|
||||
ath11k_dbg_sta_release_htt_peer_stats(struct inode *inode, struct file *file)
|
||||
{
|
||||
struct ieee80211_sta *sta = inode->i_private;
|
||||
- struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
|
||||
+ struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
|
||||
struct ath11k *ar = arsta->arvif->ar;
|
||||
|
||||
mutex_lock(&ar->conf_mutex);
|
||||
@@ -413,7 +413,7 @@ static ssize_t ath11k_dbg_sta_write_peer
|
||||
size_t count, loff_t *ppos)
|
||||
{
|
||||
struct ieee80211_sta *sta = file->private_data;
|
||||
- struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
|
||||
+ struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
|
||||
struct ath11k *ar = arsta->arvif->ar;
|
||||
int ret, enable;
|
||||
|
||||
@@ -453,7 +453,7 @@ static ssize_t ath11k_dbg_sta_read_peer_
|
||||
size_t count, loff_t *ppos)
|
||||
{
|
||||
struct ieee80211_sta *sta = file->private_data;
|
||||
- struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
|
||||
+ struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
|
||||
struct ath11k *ar = arsta->arvif->ar;
|
||||
char buf[32] = {0};
|
||||
int len;
|
||||
@@ -480,7 +480,7 @@ static ssize_t ath11k_dbg_sta_write_delb
|
||||
size_t count, loff_t *ppos)
|
||||
{
|
||||
struct ieee80211_sta *sta = file->private_data;
|
||||
- struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
|
||||
+ struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
|
||||
struct ath11k *ar = arsta->arvif->ar;
|
||||
u32 tid, initiator, reason;
|
||||
int ret;
|
||||
@@ -531,7 +531,7 @@ static ssize_t ath11k_dbg_sta_write_addb
|
||||
size_t count, loff_t *ppos)
|
||||
{
|
||||
struct ieee80211_sta *sta = file->private_data;
|
||||
- struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
|
||||
+ struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
|
||||
struct ath11k *ar = arsta->arvif->ar;
|
||||
u32 tid, status;
|
||||
int ret;
|
||||
@@ -581,7 +581,7 @@ static ssize_t ath11k_dbg_sta_write_addb
|
||||
size_t count, loff_t *ppos)
|
||||
{
|
||||
struct ieee80211_sta *sta = file->private_data;
|
||||
- struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
|
||||
+ struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
|
||||
struct ath11k *ar = arsta->arvif->ar;
|
||||
u32 tid, buf_size;
|
||||
int ret;
|
||||
@@ -632,7 +632,7 @@ static ssize_t ath11k_dbg_sta_read_aggr_
|
||||
size_t count, loff_t *ppos)
|
||||
{
|
||||
struct ieee80211_sta *sta = file->private_data;
|
||||
- struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
|
||||
+ struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
|
||||
struct ath11k *ar = arsta->arvif->ar;
|
||||
char buf[64];
|
||||
int len = 0;
|
||||
@@ -652,7 +652,7 @@ static ssize_t ath11k_dbg_sta_write_aggr
|
||||
size_t count, loff_t *ppos)
|
||||
{
|
||||
struct ieee80211_sta *sta = file->private_data;
|
||||
- struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
|
||||
+ struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
|
||||
struct ath11k *ar = arsta->arvif->ar;
|
||||
u32 aggr_mode;
|
||||
int ret;
|
||||
@@ -697,7 +697,7 @@ ath11k_write_htt_peer_stats_reset(struct
|
||||
size_t count, loff_t *ppos)
|
||||
{
|
||||
struct ieee80211_sta *sta = file->private_data;
|
||||
- struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
|
||||
+ struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
|
||||
struct ath11k *ar = arsta->arvif->ar;
|
||||
struct htt_ext_stats_cfg_params cfg_params = { 0 };
|
||||
int ret;
|
||||
@@ -756,7 +756,7 @@ static ssize_t ath11k_dbg_sta_read_peer_
|
||||
size_t count, loff_t *ppos)
|
||||
{
|
||||
struct ieee80211_sta *sta = file->private_data;
|
||||
- struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
|
||||
+ struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
|
||||
struct ath11k *ar = arsta->arvif->ar;
|
||||
char buf[20];
|
||||
int len;
|
||||
@@ -783,7 +783,7 @@ static ssize_t ath11k_dbg_sta_read_curre
|
||||
loff_t *ppos)
|
||||
{
|
||||
struct ieee80211_sta *sta = file->private_data;
|
||||
- struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
|
||||
+ struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
|
||||
struct ath11k *ar = arsta->arvif->ar;
|
||||
u64 time_since_station_in_power_save;
|
||||
char buf[20];
|
||||
@@ -817,7 +817,7 @@ static ssize_t ath11k_dbg_sta_read_total
|
||||
size_t count, loff_t *ppos)
|
||||
{
|
||||
struct ieee80211_sta *sta = file->private_data;
|
||||
- struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
|
||||
+ struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
|
||||
struct ath11k *ar = arsta->arvif->ar;
|
||||
char buf[20];
|
||||
u64 power_save_duration;
|
||||
--- a/drivers/net/wireless/ath/ath11k/dp_rx.c
|
||||
+++ b/drivers/net/wireless/ath/ath11k/dp_rx.c
|
||||
@@ -1099,7 +1099,7 @@ int ath11k_dp_rx_ampdu_start(struct ath1
|
||||
struct ieee80211_ampdu_params *params)
|
||||
{
|
||||
struct ath11k_base *ab = ar->ab;
|
||||
- struct ath11k_sta *arsta = (void *)params->sta->drv_priv;
|
||||
+ struct ath11k_sta *arsta = ath11k_sta_to_arsta(params->sta);
|
||||
int vdev_id = arsta->arvif->vdev_id;
|
||||
int ret;
|
||||
|
||||
@@ -1117,7 +1117,7 @@ int ath11k_dp_rx_ampdu_stop(struct ath11
|
||||
{
|
||||
struct ath11k_base *ab = ar->ab;
|
||||
struct ath11k_peer *peer;
|
||||
- struct ath11k_sta *arsta = (void *)params->sta->drv_priv;
|
||||
+ struct ath11k_sta *arsta = ath11k_sta_to_arsta(params->sta);
|
||||
int vdev_id = arsta->arvif->vdev_id;
|
||||
dma_addr_t paddr;
|
||||
bool active;
|
||||
@@ -1456,7 +1456,7 @@ ath11k_update_per_peer_tx_stats(struct a
|
||||
}
|
||||
|
||||
sta = peer->sta;
|
||||
- arsta = (struct ath11k_sta *)sta->drv_priv;
|
||||
+ arsta = ath11k_sta_to_arsta(sta);
|
||||
|
||||
memset(&arsta->txrate, 0, sizeof(arsta->txrate));
|
||||
|
||||
@@ -5248,7 +5248,7 @@ int ath11k_dp_rx_process_mon_status(stru
|
||||
goto next_skb;
|
||||
}
|
||||
|
||||
- arsta = (struct ath11k_sta *)peer->sta->drv_priv;
|
||||
+ arsta = ath11k_sta_to_arsta(peer->sta);
|
||||
ath11k_dp_rx_update_peer_stats(arsta, ppdu_info);
|
||||
|
||||
if (ath11k_debugfs_is_pktlog_peer_valid(ar, peer->addr))
|
||||
--- a/drivers/net/wireless/ath/ath11k/dp_tx.c
|
||||
+++ b/drivers/net/wireless/ath/ath11k/dp_tx.c
|
||||
@@ -467,7 +467,7 @@ void ath11k_dp_tx_update_txcompl(struct
|
||||
}
|
||||
|
||||
sta = peer->sta;
|
||||
- arsta = (struct ath11k_sta *)sta->drv_priv;
|
||||
+ arsta = ath11k_sta_to_arsta(sta);
|
||||
|
||||
memset(&arsta->txrate, 0, sizeof(arsta->txrate));
|
||||
pkt_type = FIELD_GET(HAL_TX_RATE_STATS_INFO0_PKT_TYPE,
|
||||
@@ -627,7 +627,7 @@ static void ath11k_dp_tx_complete_msdu(s
|
||||
ieee80211_free_txskb(ar->hw, msdu);
|
||||
return;
|
||||
}
|
||||
- arsta = (struct ath11k_sta *)peer->sta->drv_priv;
|
||||
+ arsta = ath11k_sta_to_arsta(peer->sta);
|
||||
status.sta = peer->sta;
|
||||
status.skb = msdu;
|
||||
status.info = info;
|
||||
--- a/drivers/net/wireless/ath/ath11k/mac.c
|
||||
+++ b/drivers/net/wireless/ath/ath11k/mac.c
|
||||
@@ -2832,7 +2832,7 @@ static void ath11k_peer_assoc_prepare(st
|
||||
|
||||
lockdep_assert_held(&ar->conf_mutex);
|
||||
|
||||
- arsta = (struct ath11k_sta *)sta->drv_priv;
|
||||
+ arsta = ath11k_sta_to_arsta(sta);
|
||||
|
||||
memset(arg, 0, sizeof(*arg));
|
||||
|
||||
@@ -4313,7 +4313,7 @@ static int ath11k_mac_op_set_key(struct
|
||||
ath11k_warn(ab, "peer %pM disappeared!\n", peer_addr);
|
||||
|
||||
if (sta) {
|
||||
- arsta = (struct ath11k_sta *)sta->drv_priv;
|
||||
+ arsta = ath11k_sta_to_arsta(sta);
|
||||
|
||||
switch (key->cipher) {
|
||||
case WLAN_CIPHER_SUITE_TKIP:
|
||||
@@ -4904,7 +4904,7 @@ static int ath11k_mac_station_add(struct
|
||||
{
|
||||
struct ath11k_base *ab = ar->ab;
|
||||
struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
|
||||
- struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
|
||||
+ struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
|
||||
struct peer_create_params peer_param;
|
||||
int ret;
|
||||
|
||||
@@ -5028,7 +5028,7 @@ static int ath11k_mac_op_sta_state(struc
|
||||
{
|
||||
struct ath11k *ar = hw->priv;
|
||||
struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
|
||||
- struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
|
||||
+ struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
|
||||
struct ath11k_peer *peer;
|
||||
int ret = 0;
|
||||
|
||||
@@ -5194,7 +5194,7 @@ static void ath11k_mac_op_sta_set_4addr(
|
||||
struct ieee80211_sta *sta, bool enabled)
|
||||
{
|
||||
struct ath11k *ar = hw->priv;
|
||||
- struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
|
||||
+ struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
|
||||
|
||||
if (enabled && !arsta->use_4addr_set) {
|
||||
ieee80211_queue_work(ar->hw, &arsta->set_4addr_wk);
|
||||
@@ -5208,7 +5208,7 @@ static void ath11k_mac_op_sta_rc_update(
|
||||
u32 changed)
|
||||
{
|
||||
struct ath11k *ar = hw->priv;
|
||||
- struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
|
||||
+ struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
|
||||
struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
|
||||
struct ath11k_peer *peer;
|
||||
u32 bw, smps;
|
||||
@@ -6201,7 +6201,7 @@ static void ath11k_mac_op_tx(struct ieee
|
||||
}
|
||||
|
||||
if (control->sta)
|
||||
- arsta = (struct ath11k_sta *)control->sta->drv_priv;
|
||||
+ arsta = ath11k_sta_to_arsta(control->sta);
|
||||
|
||||
ret = ath11k_dp_tx(ar, arvif, arsta, skb);
|
||||
if (unlikely(ret)) {
|
||||
@@ -8233,7 +8233,7 @@ static void ath11k_mac_set_bitrate_mask_
|
||||
struct ieee80211_sta *sta)
|
||||
{
|
||||
struct ath11k_vif *arvif = data;
|
||||
- struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
|
||||
+ struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
|
||||
struct ath11k *ar = arvif->ar;
|
||||
|
||||
spin_lock_bh(&ar->data_lock);
|
||||
@@ -8637,7 +8637,7 @@ static void ath11k_mac_op_sta_statistics
|
||||
struct ieee80211_sta *sta,
|
||||
struct station_info *sinfo)
|
||||
{
|
||||
- struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
|
||||
+ struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
|
||||
struct ath11k *ar = arsta->arvif->ar;
|
||||
s8 signal;
|
||||
bool db2dbm = test_bit(WMI_TLV_SERVICE_HW_DB2DBM_CONVERSION_SUPPORT,
|
||||
--- a/drivers/net/wireless/ath/ath11k/peer.c
|
||||
+++ b/drivers/net/wireless/ath/ath11k/peer.c
|
||||
@@ -446,7 +446,7 @@ int ath11k_peer_create(struct ath11k *ar
|
||||
peer->sec_type_grp = HAL_ENCRYPT_TYPE_OPEN;
|
||||
|
||||
if (sta) {
|
||||
- arsta = (struct ath11k_sta *)sta->drv_priv;
|
||||
+ arsta = ath11k_sta_to_arsta(sta);
|
||||
arsta->tcl_metadata |= FIELD_PREP(HTT_TCL_META_DATA_TYPE, 0) |
|
||||
FIELD_PREP(HTT_TCL_META_DATA_PEER_ID,
|
||||
peer->peer_id);
|
||||
--- a/drivers/net/wireless/ath/ath11k/wmi.c
|
||||
+++ b/drivers/net/wireless/ath/ath11k/wmi.c
|
||||
@@ -6453,7 +6453,7 @@ static int ath11k_wmi_tlv_rssi_chain_par
|
||||
goto exit;
|
||||
}
|
||||
|
||||
- arsta = (struct ath11k_sta *)sta->drv_priv;
|
||||
+ arsta = ath11k_sta_to_arsta(sta);
|
||||
|
||||
BUILD_BUG_ON(ARRAY_SIZE(arsta->chain_signal) >
|
||||
ARRAY_SIZE(stats_rssi->rssi_avg_beacon));
|
||||
@@ -6541,7 +6541,7 @@ static int ath11k_wmi_tlv_fw_stats_data_
|
||||
arvif->bssid,
|
||||
NULL);
|
||||
if (sta) {
|
||||
- arsta = (struct ath11k_sta *)sta->drv_priv;
|
||||
+ arsta = ath11k_sta_to_arsta(sta);
|
||||
arsta->rssi_beacon = src->beacon_snr;
|
||||
ath11k_dbg(ab, ATH11K_DBG_WMI,
|
||||
"stats vdev id %d snr %d\n",
|
||||
@@ -7468,7 +7468,7 @@ static void ath11k_wmi_event_peer_sta_ps
|
||||
goto exit;
|
||||
}
|
||||
|
||||
- arsta = (struct ath11k_sta *)sta->drv_priv;
|
||||
+ arsta = ath11k_sta_to_arsta(sta);
|
||||
|
||||
spin_lock_bh(&ar->data_lock);
|
||||
|
@ -13,7 +13,7 @@ Signed-off-by: Mantas Pucka <mantas@8devices.com>
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath11k/core.c
|
||||
+++ b/drivers/net/wireless/ath/ath11k/core.c
|
||||
@@ -168,8 +168,8 @@ static const struct ath11k_hw_params ath
|
||||
@@ -170,8 +170,8 @@ static const struct ath11k_hw_params ath
|
||||
.supports_shadow_regs = false,
|
||||
.idle_ps = false,
|
||||
.supports_sta_ps = false,
|
||||
|
@ -49,7 +49,7 @@ Signed-off-by: Robert Marko <robimarko@gmail.com>
|
||||
|
||||
--- 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
|
||||
@@ -239,6 +239,34 @@ static void ath11k_mhi_op_runtime_put(st
|
||||
{
|
||||
}
|
||||
|
||||
@ -84,7 +84,7 @@ Signed-off-by: Robert Marko <robimarko@gmail.com>
|
||||
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
|
||||
@@ -260,6 +288,8 @@ static char *ath11k_mhi_op_callback_to_s
|
||||
return "MHI_CB_FATAL_ERROR";
|
||||
case MHI_CB_BW_REQ:
|
||||
return "MHI_CB_BW_REQ";
|
||||
@ -93,7 +93,7 @@ Signed-off-by: Robert Marko <robimarko@gmail.com>
|
||||
default:
|
||||
return "UNKNOWN";
|
||||
}
|
||||
@@ -337,27 +367,14 @@ static void ath11k_mhi_op_status_cb(stru
|
||||
@@ -282,27 +312,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;
|
||||
@ -126,7 +126,7 @@ Signed-off-by: Robert Marko <robimarko@gmail.com>
|
||||
struct device_node *np;
|
||||
--- a/drivers/net/wireless/ath/ath11k/mhi.h
|
||||
+++ b/drivers/net/wireless/ath/ath11k/mhi.h
|
||||
@@ -16,6 +16,9 @@
|
||||
@@ -17,6 +17,9 @@
|
||||
#define MHICTRL 0x38
|
||||
#define MHICTRL_RESET_MASK 0x2
|
||||
|
||||
@ -138,7 +138,7 @@ Signed-off-by: Robert Marko <robimarko@gmail.com>
|
||||
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
|
||||
@@ -371,13 +371,20 @@ static void ath11k_pci_sw_reset(struct a
|
||||
@@ -374,13 +374,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;
|
||||
|
@ -14,7 +14,7 @@ Signed-off-by: Christian Lamparter <chunkeey@gmail.com>
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath11k/mac.c
|
||||
+++ b/drivers/net/wireless/ath/ath11k/mac.c
|
||||
@@ -9455,6 +9455,7 @@ static int __ath11k_mac_register(struct
|
||||
@@ -10034,6 +10034,7 @@ static int __ath11k_mac_register(struct
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
|
@ -34,7 +34,7 @@ Signed-off-by: Robert Marko <robimarko@gmail.com>
|
||||
+ 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 \
|
||||
@@ -23,7 +23,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
|
||||
@ -45,18 +45,18 @@ Signed-off-by: Robert Marko <robimarko@gmail.com>
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath11k/thermal.h
|
||||
+++ b/drivers/net/wireless/ath/ath11k/thermal.h
|
||||
@@ -25,7 +25,7 @@ struct ath11k_thermal {
|
||||
@@ -26,7 +26,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_register(struct ath11k_base *ab);
|
||||
void ath11k_thermal_unregister(struct ath11k_base *ab);
|
||||
int ath11k_thermal_set_throttling(struct ath11k *ar, u32 throttle_state);
|
||||
--- a/local-symbols
|
||||
+++ b/local-symbols
|
||||
@@ -173,6 +173,7 @@ ATH11K_DEBUG=
|
||||
@@ -166,6 +166,7 @@ ATH11K_DEBUG=
|
||||
ATH11K_DEBUGFS=
|
||||
ATH11K_TRACING=
|
||||
ATH11K_SPECTRAL=
|
||||
|
@ -1,29 +0,0 @@
|
||||
From 04178918e7f6b5f34dde81ec79ee8a1ccace3be3 Mon Sep 17 00:00:00 2001
|
||||
From: Robert Marko <robimarko@gmail.com>
|
||||
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 <robimarko@gmail.com>
|
||||
---
|
||||
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
|
||||
@@ -459,7 +459,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 {
|
@ -22,7 +22,7 @@ Signed-off-by: Robert Marko <robimarko@gmail.com>
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath11k/core.c
|
||||
+++ b/drivers/net/wireless/ath/ath11k/core.c
|
||||
@@ -36,7 +36,7 @@ bool ath11k_ftm_mode;
|
||||
@@ -37,7 +37,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");
|
||||
|
||||
@ -31,7 +31,7 @@ Signed-off-by: Robert Marko <robimarko@gmail.com>
|
||||
{
|
||||
.hw_rev = ATH11K_HW_IPQ8074,
|
||||
.name = "ipq8074 hw2.0",
|
||||
@@ -2040,7 +2040,8 @@ static void ath11k_core_reset(struct wor
|
||||
@@ -2138,7 +2138,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;
|
||||
@ -41,7 +41,7 @@ Signed-off-by: Robert Marko <robimarko@gmail.com>
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(ath11k_hw_params); i++) {
|
||||
hw_params = &ath11k_hw_params[i];
|
||||
@@ -2056,7 +2057,31 @@ static int ath11k_init_hw_params(struct
|
||||
@@ -2154,7 +2155,31 @@ static int ath11k_init_hw_params(struct
|
||||
|
||||
ab->hw_params = *hw_params;
|
||||
|
||||
|
@ -23,7 +23,7 @@ Signed-off-by: Aditya Kumar Singh <quic_adisi@quicinc.com>
|
||||
|
||||
--- a/drivers/net/wireless/ath/ath11k/reg.c
|
||||
+++ b/drivers/net/wireless/ath/ath11k/reg.c
|
||||
@@ -362,129 +362,6 @@ static u32 ath11k_map_fw_phy_flags(u32 p
|
||||
@@ -363,134 +363,6 @@ static u32 ath11k_map_fw_phy_flags(u32 p
|
||||
return flags;
|
||||
}
|
||||
|
||||
@ -89,6 +89,11 @@ Signed-off-by: Aditya Kumar Singh <quic_adisi@quicinc.com>
|
||||
- /* Use the flags of both the rules */
|
||||
- new_rule->flags = rule1->flags | rule2->flags;
|
||||
-
|
||||
- if ((rule1->flags & NL80211_RRF_PSD) && (rule2->flags & NL80211_RRF_PSD))
|
||||
- new_rule->psd = min_t(s8, rule1->psd, rule2->psd);
|
||||
- else
|
||||
- new_rule->flags &= ~NL80211_RRF_PSD;
|
||||
-
|
||||
- /* 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);
|
||||
@ -153,20 +158,22 @@ Signed-off-by: Aditya Kumar Singh <quic_adisi@quicinc.com>
|
||||
static const char *
|
||||
ath11k_reg_get_regdom_str(enum nl80211_dfs_regions dfs_region)
|
||||
{
|
||||
@@ -619,9 +496,9 @@ ath11k_reg_update_weather_radar_band(str
|
||||
@@ -641,11 +513,11 @@ ath11k_reg_ap_pwr_convert(enum ieee80211
|
||||
|
||||
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 cur_regulatory_info *reg_info, bool intersect,
|
||||
+ struct cur_regulatory_info *reg_info,
|
||||
enum wmi_vdev_type vdev_type,
|
||||
enum ieee80211_ap_reg_power power_type)
|
||||
{
|
||||
- struct ieee80211_regdomain *tmp_regd, *default_regd, *new_regd = NULL;
|
||||
+ struct ieee80211_regdomain *new_regd = NULL;
|
||||
struct cur_reg_rule *reg_rule;
|
||||
struct cur_reg_rule *reg_rule, *reg_rule_6ghz;
|
||||
u8 i = 0, j = 0, k = 0;
|
||||
u8 num_rules;
|
||||
@@ -638,26 +515,26 @@ ath11k_reg_build_regd(struct ath11k_base
|
||||
num_rules += reg_info->num_6ghz_rules_ap[WMI_REG_INDOOR_AP];
|
||||
@@ -688,26 +560,26 @@ ath11k_reg_build_regd(struct ath11k_base
|
||||
}
|
||||
|
||||
if (!num_rules)
|
||||
- goto ret;
|
||||
@ -199,7 +206,7 @@ Signed-off-by: Aditya Kumar Singh <quic_adisi@quicinc.com>
|
||||
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)
|
||||
@@ -697,7 +574,7 @@ ath11k_reg_build_regd(struct ath11k_base
|
||||
@@ -746,7 +618,7 @@ ath11k_reg_build_regd(struct ath11k_base
|
||||
flags |= ath11k_map_fw_reg_flags(reg_rule->flags);
|
||||
flags |= ath11k_map_fw_phy_flags(reg_info->phybitmap);
|
||||
|
||||
@ -208,7 +215,7 @@ Signed-off-by: Aditya Kumar Singh <quic_adisi@quicinc.com>
|
||||
reg_rule->start_freq,
|
||||
reg_rule->end_freq, max_bw,
|
||||
reg_rule->ant_gain, reg_rule->reg_power,
|
||||
@@ -712,7 +589,7 @@ ath11k_reg_build_regd(struct ath11k_base
|
||||
@@ -761,7 +633,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)){
|
||||
@ -217,7 +224,7 @@ Signed-off-by: Aditya Kumar Singh <quic_adisi@quicinc.com>
|
||||
reg_rule, &i,
|
||||
flags, max_bw);
|
||||
continue;
|
||||
@@ -723,37 +600,20 @@ ath11k_reg_build_regd(struct ath11k_base
|
||||
@@ -772,51 +644,23 @@ 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,
|
||||
@ -236,7 +243,8 @@ Signed-off-by: Aditya Kumar Singh <quic_adisi@quicinc.com>
|
||||
}
|
||||
|
||||
- tmp_regd->n_reg_rules = i;
|
||||
-
|
||||
+ new_regd->n_reg_rules = i;
|
||||
|
||||
- if (intersect) {
|
||||
- default_regd = ab->default_regd[reg_info->phy_id];
|
||||
-
|
||||
@ -252,29 +260,11 @@ Signed-off-by: Aditya Kumar Singh <quic_adisi@quicinc.com>
|
||||
- } 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
|
||||
@@ -33,7 +33,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
|
||||
@@ -7060,24 +7060,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')
|
||||
@ -286,19 +276,20 @@ Signed-off-by: Aditya Kumar Singh <quic_adisi@quicinc.com>
|
||||
- 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)
|
||||
static enum wmi_vdev_type ath11k_reg_get_ar_vdev_type(struct ath11k *ar)
|
||||
{
|
||||
struct cur_regulatory_info *reg_info = NULL;
|
||||
struct ieee80211_regdomain *regd = NULL;
|
||||
struct ath11k_vif *arvif;
|
||||
@@ -839,7 +683,6 @@ int ath11k_reg_handle_chan_list(struct a
|
||||
enum ieee80211_ap_reg_power power_type)
|
||||
{
|
||||
struct ieee80211_regdomain *regd;
|
||||
- bool intersect = false;
|
||||
int ret = 0, pdev_idx, i, j;
|
||||
int pdev_idx;
|
||||
struct ath11k *ar;
|
||||
|
||||
@@ -7141,17 +7129,7 @@ static int ath11k_reg_chan_list_event(st
|
||||
enum wmi_vdev_type vdev_type;
|
||||
@@ -891,24 +734,14 @@ int ath11k_reg_handle_chan_list(struct a
|
||||
(char *)reg_info->alpha2, 2))
|
||||
goto mem_free;
|
||||
goto retfail;
|
||||
|
||||
- /* Intersect new rules with default regd if a new country setting was
|
||||
- * requested, i.e a default regd was already set during initialization
|
||||
@ -310,8 +301,28 @@ Signed-off-by: Aditya Kumar Singh <quic_adisi@quicinc.com>
|
||||
- !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);
|
||||
ar = ab->pdevs[pdev_idx].ar;
|
||||
vdev_type = ath11k_reg_get_ar_vdev_type(ar);
|
||||
|
||||
ath11k_dbg(ab, ATH11K_DBG_WMI,
|
||||
- "wmi handle chan list power type %d vdev type %d intersect %d\n",
|
||||
- power_type, vdev_type, intersect);
|
||||
+ "wmi handle chan list power type %d vdev type %d\n",
|
||||
+ power_type, vdev_type);
|
||||
|
||||
- regd = ath11k_reg_build_regd(ab, reg_info, intersect, vdev_type, power_type);
|
||||
+ regd = ath11k_reg_build_regd(ab, reg_info, vdev_type, power_type);
|
||||
if (!regd) {
|
||||
ath11k_warn(ab, "failed to build regd from reg_info\n");
|
||||
goto fallback;
|
||||
--- a/drivers/net/wireless/ath/ath11k/reg.h
|
||||
+++ b/drivers/net/wireless/ath/ath11k/reg.h
|
||||
@@ -35,7 +35,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,
|
||||
enum wmi_vdev_type vdev_type,
|
||||
enum ieee80211_ap_reg_power power_type);
|
||||
int ath11k_regd_update(struct ath11k *ar);
|
||||
|
@ -10,7 +10,7 @@
|
||||
sc->debug.debugfs_phy, &sc->sc_ah->gpio_mask);
|
||||
--- a/drivers/net/wireless/ath/ath.h
|
||||
+++ b/drivers/net/wireless/ath/ath.h
|
||||
@@ -153,6 +153,7 @@ struct ath_common {
|
||||
@@ -151,6 +151,7 @@ struct ath_common {
|
||||
int debug_mask;
|
||||
enum ath_device_state state;
|
||||
unsigned long op_flags;
|
||||
|
@ -1,15 +1,3 @@
|
||||
--- a/include/linux/ath9k_platform.h
|
||||
+++ b/include/linux/ath9k_platform.h
|
||||
@@ -46,6 +46,9 @@ struct ath9k_platform_data {
|
||||
int (*external_reset)(void);
|
||||
|
||||
bool use_eeprom;
|
||||
+
|
||||
+ int num_leds;
|
||||
+ const struct gpio_led *leds;
|
||||
};
|
||||
|
||||
#endif /* _LINUX_ATH9K_PLATFORM_H */
|
||||
--- a/drivers/net/wireless/ath/ath9k/gpio.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/gpio.c
|
||||
@@ -15,6 +15,7 @@
|
||||
|
@ -125,7 +125,7 @@
|
||||
REG_SET_BIT(ah, AR_BTCOEX_WL_LNADIV, AR_BTCOEX_WL_LNADIV_FORCE_ON);
|
||||
--- a/drivers/net/wireless/ath/ath9k/main.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/main.c
|
||||
@@ -538,6 +538,11 @@ irqreturn_t ath_isr(int irq, void *dev)
|
||||
@@ -537,6 +537,11 @@ irqreturn_t ath_isr(int irq, void *dev)
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
|
@ -18,7 +18,7 @@
|
||||
void (*spectral_scan_trigger)(struct ath_hw *ah);
|
||||
--- a/drivers/net/wireless/ath/ath9k/ar9003_phy.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.c
|
||||
@@ -1918,6 +1918,26 @@ void ar9003_hw_init_rate_txpower(struct
|
||||
@@ -1915,6 +1915,26 @@ void ar9003_hw_init_rate_txpower(struct
|
||||
}
|
||||
}
|
||||
|
||||
@ -45,7 +45,7 @@
|
||||
void ar9003_hw_attach_phy_ops(struct ath_hw *ah)
|
||||
{
|
||||
struct ath_hw_private_ops *priv_ops = ath9k_hw_private_ops(ah);
|
||||
@@ -1954,6 +1974,7 @@ void ar9003_hw_attach_phy_ops(struct ath
|
||||
@@ -1951,6 +1971,7 @@ void ar9003_hw_attach_phy_ops(struct ath
|
||||
priv_ops->set_radar_params = ar9003_hw_set_radar_params;
|
||||
priv_ops->fast_chan_change = ar9003_hw_fast_chan_change;
|
||||
|
||||
|
@ -79,7 +79,7 @@
|
||||
static const u8 ofdm2pwr[] = {
|
||||
ALL_TARGET_LEGACY_6_24,
|
||||
ALL_TARGET_LEGACY_6_24,
|
||||
@@ -1068,11 +1054,6 @@ static bool ar9003_hw_ani_control(struct
|
||||
@@ -1065,11 +1051,6 @@ static bool ar9003_hw_ani_control(struct
|
||||
struct ath_common *common = ath9k_hw_common(ah);
|
||||
struct ath9k_channel *chan = ah->curchan;
|
||||
struct ar5416AniState *aniState = &ah->ani;
|
||||
@ -91,7 +91,7 @@
|
||||
s32 value, value2;
|
||||
|
||||
switch (cmd & ah->ani_function) {
|
||||
@@ -1086,61 +1067,6 @@ static bool ar9003_hw_ani_control(struct
|
||||
@@ -1083,61 +1064,6 @@ static bool ar9003_hw_ani_control(struct
|
||||
*/
|
||||
u32 on = param ? 1 : 0;
|
||||
|
||||
|
@ -128,16 +128,3 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
|
||||
if (pdata && pdata->leds && pdata->num_leds)
|
||||
for (i = 0; i < pdata->num_leds; i++) {
|
||||
--- a/include/linux/ath9k_platform.h
|
||||
+++ b/include/linux/ath9k_platform.h
|
||||
@@ -49,6 +49,10 @@ struct ath9k_platform_data {
|
||||
|
||||
int num_leds;
|
||||
const struct gpio_led *leds;
|
||||
+
|
||||
+ unsigned num_btns;
|
||||
+ const struct gpio_keys_button *btns;
|
||||
+ unsigned btn_poll_interval;
|
||||
};
|
||||
|
||||
#endif /* _LINUX_ATH9K_PLATFORM_H */
|
||||
|
@ -339,7 +339,7 @@
|
||||
|
||||
static void ath9k_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
|
||||
u32 queues, bool drop);
|
||||
@@ -659,6 +660,7 @@ void ath_reset_work(struct work_struct *
|
||||
@@ -658,6 +659,7 @@ void ath_reset_work(struct work_struct *
|
||||
static int ath9k_start(struct ieee80211_hw *hw)
|
||||
{
|
||||
struct ath_softc *sc = hw->priv;
|
||||
@ -347,7 +347,7 @@
|
||||
struct ath_hw *ah = sc->sc_ah;
|
||||
struct ath_common *common = ath9k_hw_common(ah);
|
||||
struct ieee80211_channel *curchan = sc->cur_chan->chandef.chan;
|
||||
@@ -737,6 +739,11 @@ static int ath9k_start(struct ieee80211_
|
||||
@@ -736,6 +738,11 @@ static int ath9k_start(struct ieee80211_
|
||||
AR_GPIO_OUTPUT_MUX_AS_OUTPUT);
|
||||
}
|
||||
|
||||
@ -371,7 +371,7 @@
|
||||
|
||||
--- a/local-symbols
|
||||
+++ b/local-symbols
|
||||
@@ -128,6 +128,7 @@ ATH9K_WOW=
|
||||
@@ -121,6 +121,7 @@ ATH9K_WOW=
|
||||
ATH9K_RFKILL=
|
||||
ATH9K_CHANNEL_CONTEXT=
|
||||
ATH9K_PCOEM=
|
||||
@ -400,4 +400,4 @@
|
||||
+
|
||||
config ATH9K_DEBUGFS
|
||||
bool "Atheros ath9k debugging"
|
||||
depends on ATH9K && DEBUG_FS
|
||||
depends on ATH9K && DEBUG_FS && MAC80211_DEBUGFS
|
||||
|
@ -209,7 +209,7 @@
|
||||
static int ath_ahb_probe(struct platform_device *pdev)
|
||||
{
|
||||
void __iomem *mem;
|
||||
@@ -80,6 +318,17 @@ static int ath_ahb_probe(struct platform
|
||||
@@ -80,6 +274,17 @@ static int ath_ahb_probe(struct platform
|
||||
int ret = 0;
|
||||
struct ath_hw *ah;
|
||||
char hw_name[64];
|
||||
@ -227,7 +227,7 @@
|
||||
|
||||
if (!dev_get_platdata(&pdev->dev)) {
|
||||
dev_err(&pdev->dev, "no platform data specified\n");
|
||||
@@ -118,13 +367,16 @@ static int ath_ahb_probe(struct platform
|
||||
@@ -118,17 +323,23 @@ static int ath_ahb_probe(struct platform
|
||||
sc->mem = mem;
|
||||
sc->irq = irq;
|
||||
|
||||
@ -245,18 +245,15 @@
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "failed to initialize device\n");
|
||||
goto err_irq;
|
||||
@@ -155,6 +407,9 @@ static int ath_ahb_remove(struct platfor
|
||||
free_irq(sc->irq, sc);
|
||||
ieee80211_free_hw(sc->hw);
|
||||
}
|
||||
+#ifdef CONFIG_OF
|
||||
+ pdev->dev.platform_data = NULL;
|
||||
+#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -164,6 +419,9 @@ static struct platform_driver ath_ahb_dr
|
||||
.remove = ath_ahb_remove,
|
||||
ah = sc->sc_ah;
|
||||
ath9k_hw_name(ah, hw_name, sizeof(hw_name));
|
||||
@@ -162,6 +373,9 @@ static struct platform_driver ath_ahb_dr
|
||||
.remove_new = ath_ahb_remove,
|
||||
.driver = {
|
||||
.name = "ath9k",
|
||||
+#ifdef CONFIG_OF
|
||||
|
@ -22,7 +22,7 @@
|
||||
static int modparam_bad_frames_preempt;
|
||||
module_param_named(bad_frames_preempt, modparam_bad_frames_preempt, int, 0444);
|
||||
MODULE_PARM_DESC(bad_frames_preempt,
|
||||
@@ -2869,10 +2874,10 @@ static int b43_gpio_init(struct b43_wlde
|
||||
@@ -2870,10 +2875,10 @@ static int b43_gpio_init(struct b43_wlde
|
||||
u32 mask, set;
|
||||
|
||||
b43_maskset32(dev, B43_MMIO_MACCTL, ~B43_MACCTL_GPOUTSMSK, 0);
|
||||
|
@ -9,7 +9,7 @@
|
||||
antenna = b43_antenna_to_phyctl(antenna);
|
||||
ctl = b43_shm_read16(dev, B43_SHM_SHARED, B43_SHM_SH_BEACPHYCTL);
|
||||
/* We can't send beacons with short preamble. Would get PHY errors. */
|
||||
@@ -3284,8 +3284,8 @@ static int b43_chip_init(struct b43_wlde
|
||||
@@ -3285,8 +3285,8 @@ static int b43_chip_init(struct b43_wlde
|
||||
|
||||
/* Select the antennae */
|
||||
if (phy->ops->set_rx_antenna)
|
||||
@ -20,7 +20,7 @@
|
||||
|
||||
if (phy->type == B43_PHYTYPE_B) {
|
||||
value16 = b43_read16(dev, 0x005E);
|
||||
@@ -3986,7 +3986,6 @@ static int b43_op_config(struct ieee8021
|
||||
@@ -3988,7 +3988,6 @@ static int b43_op_config(struct ieee8021
|
||||
struct b43_wldev *dev = wl->current_dev;
|
||||
struct b43_phy *phy = &dev->phy;
|
||||
struct ieee80211_conf *conf = &hw->conf;
|
||||
@ -28,7 +28,7 @@
|
||||
int err = 0;
|
||||
|
||||
mutex_lock(&wl->mutex);
|
||||
@@ -4029,11 +4028,9 @@ static int b43_op_config(struct ieee8021
|
||||
@@ -4031,11 +4030,9 @@ static int b43_op_config(struct ieee8021
|
||||
}
|
||||
|
||||
/* Antennas for RX and management frame TX. */
|
||||
@ -42,7 +42,7 @@
|
||||
|
||||
if (wl->radio_enabled != phy->radio_on) {
|
||||
if (wl->radio_enabled) {
|
||||
@@ -5176,6 +5173,47 @@ static int b43_op_get_survey(struct ieee
|
||||
@@ -5178,6 +5175,47 @@ static int b43_op_get_survey(struct ieee
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -88,9 +88,9 @@
|
||||
+}
|
||||
+
|
||||
static const struct ieee80211_ops b43_hw_ops = {
|
||||
.tx = b43_op_tx,
|
||||
.wake_tx_queue = ieee80211_handle_wake_tx_queue,
|
||||
@@ -5198,6 +5236,8 @@ static const struct ieee80211_ops b43_hw
|
||||
.add_chanctx = ieee80211_emulate_add_chanctx,
|
||||
.remove_chanctx = ieee80211_emulate_remove_chanctx,
|
||||
@@ -5204,6 +5242,8 @@ static const struct ieee80211_ops b43_hw
|
||||
.sw_scan_complete = b43_op_sw_scan_complete_notifier,
|
||||
.get_survey = b43_op_get_survey,
|
||||
.rfkill_poll = b43_rfkill_poll,
|
||||
@ -99,7 +99,7 @@
|
||||
};
|
||||
|
||||
/* Hard-reset the chip. Do not call this directly.
|
||||
@@ -5499,6 +5539,8 @@ static int b43_one_core_attach(struct b4
|
||||
@@ -5505,6 +5545,8 @@ static int b43_one_core_attach(struct b4
|
||||
if (!wldev)
|
||||
goto out;
|
||||
|
||||
@ -108,7 +108,7 @@
|
||||
wldev->use_pio = b43_modparam_pio;
|
||||
wldev->dev = dev;
|
||||
wldev->wl = wl;
|
||||
@@ -5590,6 +5632,9 @@ static struct b43_wl *b43_wireless_init(
|
||||
@@ -5596,6 +5638,9 @@ static struct b43_wl *b43_wireless_init(
|
||||
|
||||
wiphy_ext_feature_set(hw->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST);
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
--- a/drivers/net/wireless/broadcom/b43/main.c
|
||||
+++ b/drivers/net/wireless/broadcom/b43/main.c
|
||||
@@ -2886,6 +2886,14 @@ static int b43_gpio_init(struct b43_wlde
|
||||
@@ -2887,6 +2887,14 @@ static int b43_gpio_init(struct b43_wlde
|
||||
} else if (dev->dev->chip_id == 0x5354) {
|
||||
/* Don't allow overtaking buttons GPIOs */
|
||||
set &= 0x2; /* 0x2 is LED GPIO on BCM5354 */
|
||||
|
@ -10,7 +10,7 @@ Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||
@@ -979,8 +979,36 @@ static struct wireless_dev *brcmf_cfg802
|
||||
@@ -980,8 +980,36 @@ static struct wireless_dev *brcmf_cfg802
|
||||
struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
|
||||
struct brcmf_pub *drvr = cfg->pub;
|
||||
struct wireless_dev *wdev;
|
||||
|
@ -14,7 +14,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.org>
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||
@@ -3327,6 +3327,10 @@ brcmf_cfg80211_set_power_mgmt(struct wip
|
||||
@@ -3313,6 +3313,10 @@ brcmf_cfg80211_set_power_mgmt(struct wip
|
||||
* preference in cfg struct to apply this to
|
||||
* FW later while initializing the dongle
|
||||
*/
|
||||
|
@ -9,7 +9,7 @@ Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
|
||||
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
||||
@@ -7987,6 +7987,7 @@ static s32 brcmf_translate_country_code(
|
||||
@@ -7979,6 +7979,7 @@ static s32 brcmf_translate_country_code(
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -17,7 +17,7 @@ Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
|
||||
static int
|
||||
brcmf_parse_dump_obss(char *buf, struct brcmf_dump_survey *survey)
|
||||
{
|
||||
@@ -8209,6 +8210,7 @@ exit:
|
||||
@@ -8201,6 +8202,7 @@ exit:
|
||||
brcmf_set_mpc(ifp, 1);
|
||||
return err;
|
||||
}
|
||||
@ -25,7 +25,7 @@ Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
|
||||
|
||||
static void brcmf_cfg80211_reg_notifier(struct wiphy *wiphy,
|
||||
struct regulatory_request *req)
|
||||
@@ -8361,8 +8363,10 @@ struct brcmf_cfg80211_info *brcmf_cfg802
|
||||
@@ -8353,8 +8355,10 @@ struct brcmf_cfg80211_info *brcmf_cfg802
|
||||
if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_WOWL_GTK))
|
||||
ops->set_rekey_data = brcmf_cfg80211_set_rekey_data;
|
||||
#endif
|
||||
|
@ -27,7 +27,7 @@
|
||||
@set -e ; test -f local-symbols || ( \
|
||||
echo "/--------------" ;\
|
||||
echo "| You shouldn't run make in the backports tree, but only in" ;\
|
||||
@@ -60,58 +62,62 @@ mrproper:
|
||||
@@ -60,57 +62,62 @@ mrproper:
|
||||
echo "| (that isn't currently running.)" ;\
|
||||
echo "\\--" ;\
|
||||
false)
|
||||
@ -56,13 +56,12 @@
|
||||
- done \
|
||||
- ) > Kconfig.kernel ;\
|
||||
- kver=$$($(MAKE) --no-print-directory -C $(KLIB_BUILD) M=$(BACKPORT_DIR) \
|
||||
- kernelversion | sed 's/^\(\([3-5]\|2\.6\)\.[0-9]\+\).*/\1/;t;d');\
|
||||
- kernelversion | sed 's/^\(\([3-6]\|2\.6\)\.[0-9]\+\).*/\1/;t;d');\
|
||||
- test "$$kver" != "" || echo "Kernel version parse failed!" ;\
|
||||
- test "$$kver" != "" ;\
|
||||
- kvers="$$(seq 14 39 | sed 's/^/2.6./')" ;\
|
||||
- kvers="$$kvers $$(seq 0 19 | sed 's/^/3./')" ;\
|
||||
- kvers="$$kvers $$(seq 0 20 | sed 's/^/4./')" ;\
|
||||
- kvers="$$kvers $$(seq 0 99 | sed 's/^/5./')" ;\
|
||||
- kvers="$$kvers $$(seq 0 19 | sed 's/^/5./')" ;\
|
||||
- kvers="$$kvers $$(seq 0 20 | sed 's/^/6./')" ;\
|
||||
- print=0 ;\
|
||||
- for v in $$kvers ; do \
|
||||
- if [ "$$print" = "1" ] ; then \
|
||||
@ -112,14 +111,13 @@
|
||||
+ @echo " done."
|
||||
+
|
||||
+Kconfig.versions: Kconfig.kernel
|
||||
+ @kver=$$($(MAKE) --no-print-directory -C $(KLIB_BUILD) M=$(BACKPORT_DIR) \
|
||||
+ kernelversion | sed 's/^\(\([3-5]\|2\.6\)\.[0-9]\+\).*/\1/;t;d');\
|
||||
+ @kver=$$($(MAKE) --no-print-directory -C $(KLIB_BUILD) M=$(BACKPORT_DIR) \
|
||||
+ kernelversion | sed 's/^\(\([3-6]\|2\.6\)\.[0-9]\+\).*/\1/;t;d');\
|
||||
+ test "$$kver" != "" || echo "Kernel version parse failed!" ;\
|
||||
+ test "$$kver" != "" ;\
|
||||
+ kvers="$$(seq 14 39 | sed 's/^/2.6./')" ;\
|
||||
+ kvers="$$kvers $$(seq 0 19 | sed 's/^/3./')" ;\
|
||||
+ kvers="$$kvers $$(seq 0 20 | sed 's/^/4./')" ;\
|
||||
+ kvers="$$kvers $$(seq 0 99 | sed 's/^/5./')" ;\
|
||||
+ kvers="$$kvers $$(seq 0 19 | sed 's/^/5./')" ;\
|
||||
+ kvers="$$kvers $$(seq 0 20 | sed 's/^/6./')" ;\
|
||||
+ print=0 ;\
|
||||
+ for v in $$kvers ; do \
|
||||
+ if [ "$$print" = "1" ] ; then \
|
||||
@ -127,8 +125,9 @@
|
||||
+ echo " def_bool y" ;\
|
||||
+ fi ;\
|
||||
+ if [ "$$v" = "$$kver" ] ; then print=1 ; fi ;\
|
||||
+ done > $@
|
||||
+ @RHEL_MAJOR=$$(grep '^RHEL_MAJOR' $(KERNEL_MAKEFILE) | \
|
||||
+ done > Kconfig.versions ;\
|
||||
+ # RHEL as well, sadly we need to grep for it ;\
|
||||
+ RHEL_MAJOR=$$(grep '^RHEL_MAJOR' $(KERNEL_MAKEFILE) | \
|
||||
+ sed 's/.*=\s*\([0-9]*\)/\1/;t;d') ;\
|
||||
+ RHEL_MINOR=$$(grep '^RHEL_MINOR' $(KERNEL_MAKEFILE) | \
|
||||
+ sed 's/.*=\s*\([0-9]*\)/\1/;t;d') ;\
|
||||
|
@ -1,6 +1,6 @@
|
||||
--- a/local-symbols
|
||||
+++ b/local-symbols
|
||||
@@ -493,43 +493,6 @@ USB_VL600=
|
||||
@@ -471,43 +471,6 @@ USB_VL600=
|
||||
USB_NET_CH9200=
|
||||
USB_NET_AQC111=
|
||||
USB_RTL8153_ECM=
|
||||
@ -90,7 +90,7 @@
|
||||
config B43_PHY_G
|
||||
--- a/drivers/net/wireless/broadcom/b43/main.c
|
||||
+++ b/drivers/net/wireless/broadcom/b43/main.c
|
||||
@@ -2853,7 +2853,7 @@ static struct ssb_device *b43_ssb_gpio_d
|
||||
@@ -2854,7 +2854,7 @@ static struct ssb_device *b43_ssb_gpio_d
|
||||
{
|
||||
struct ssb_bus *bus = dev->dev->sdev->bus;
|
||||
|
||||
@ -99,7 +99,7 @@
|
||||
return (bus->chipco.dev ? bus->chipco.dev : bus->pcicore.dev);
|
||||
#else
|
||||
return bus->chipco.dev;
|
||||
@@ -4871,7 +4871,7 @@ static int b43_wireless_core_init(struct
|
||||
@@ -4873,7 +4873,7 @@ static int b43_wireless_core_init(struct
|
||||
}
|
||||
if (sprom->boardflags_lo & B43_BFL_XTAL_NOSLOW)
|
||||
hf |= B43_HF_DSCRQ; /* Disable slowclock requests from ucode. */
|
||||
@ -171,7 +171,7 @@
|
||||
depends on CORDIC
|
||||
--- a/Kconfig.local
|
||||
+++ b/Kconfig.local
|
||||
@@ -1483,117 +1483,6 @@ config BACKPORTED_USB_NET_AQC111
|
||||
@@ -1417,117 +1417,6 @@ config BACKPORTED_USB_NET_AQC111
|
||||
config BACKPORTED_USB_RTL8153_ECM
|
||||
tristate
|
||||
default USB_RTL8153_ECM
|
||||
@ -303,7 +303,7 @@
|
||||
source "$BACKPORT_DIR/drivers/staging/Kconfig"
|
||||
--- a/Makefile.kernel
|
||||
+++ b/Makefile.kernel
|
||||
@@ -43,8 +43,6 @@ obj-$(CPTCFG_QRTR) += net/qrtr/
|
||||
@@ -42,8 +42,6 @@ obj-$(CPTCFG_QRTR) += net/qrtr/
|
||||
obj-$(CPTCFG_QCOM_QMI_HELPERS) += drivers/soc/qcom/
|
||||
obj-$(CPTCFG_MHI_BUS) += drivers/bus/mhi/
|
||||
obj-$(CPTCFG_WLAN) += drivers/net/wireless/
|
||||
|
@ -1,24 +0,0 @@
|
||||
--- a/drivers/net/wireless/virtual/mac80211_hwsim.c
|
||||
+++ b/drivers/net/wireless/virtual/mac80211_hwsim.c
|
||||
@@ -6179,7 +6179,9 @@ static struct genl_family hwsim_genl_fam
|
||||
.module = THIS_MODULE,
|
||||
.small_ops = hwsim_ops,
|
||||
.n_small_ops = ARRAY_SIZE(hwsim_ops),
|
||||
+#if LINUX_VERSION_IS_GEQ(6,1,0)
|
||||
.resv_start_op = HWSIM_CMD_REPORT_PMSR + 1, // match with __HWSIM_CMD_MAX
|
||||
+#endif
|
||||
.mcgrps = hwsim_mcgrps,
|
||||
.n_mcgrps = ARRAY_SIZE(hwsim_mcgrps),
|
||||
};
|
||||
--- a/net/wireless/nl80211.c
|
||||
+++ b/net/wireless/nl80211.c
|
||||
@@ -17551,7 +17551,9 @@ static struct genl_family nl80211_fam __
|
||||
.n_ops = ARRAY_SIZE(nl80211_ops),
|
||||
.small_ops = nl80211_small_ops,
|
||||
.n_small_ops = ARRAY_SIZE(nl80211_small_ops),
|
||||
+#if LINUX_VERSION_IS_GEQ(6,1,0)
|
||||
.resv_start_op = NL80211_CMD_REMOVE_LINK_STA + 1,
|
||||
+#endif
|
||||
.mcgrps = nl80211_mcgrps,
|
||||
.n_mcgrps = ARRAY_SIZE(nl80211_mcgrps),
|
||||
.parallel_ops = true,
|
@ -32,7 +32,7 @@ Signed-off-by: Robert Marko <robimarko@gmail.com>
|
||||
source "$BACKPORT_DIR/drivers/net/usb/Kconfig"
|
||||
--- a/Makefile.kernel
|
||||
+++ b/Makefile.kernel
|
||||
@@ -39,9 +39,7 @@ obj-y += compat/
|
||||
@@ -38,9 +38,7 @@ obj-y += compat/
|
||||
|
||||
obj-$(CPTCFG_CFG80211) += net/wireless/
|
||||
obj-$(CPTCFG_MAC80211) += net/mac80211/
|
||||
@ -59,7 +59,7 @@ Signed-off-by: Robert Marko <robimarko@gmail.com>
|
||||
|
||||
--- a/local-symbols
|
||||
+++ b/local-symbols
|
||||
@@ -65,14 +65,6 @@ MAC80211_MESH_PS_DEBUG=
|
||||
@@ -59,14 +59,6 @@ MAC80211_MESH_PS_DEBUG=
|
||||
MAC80211_TDLS_DEBUG=
|
||||
MAC80211_DEBUG_COUNTERS=
|
||||
MAC80211_STA_HASH_MAX_SIZE=
|
||||
@ -73,4 +73,4 @@ Signed-off-by: Robert Marko <robimarko@gmail.com>
|
||||
-MHI_BUS_EP=
|
||||
QCOM_AOSS_QMP=
|
||||
QCOM_COMMAND_DB=
|
||||
QCOM_CPR=
|
||||
QCOM_GENI_SE=
|
||||
|
@ -1,6 +1,6 @@
|
||||
--- a/backport-include/linux/random.h
|
||||
+++ b/backport-include/linux/random.h
|
||||
@@ -23,7 +23,7 @@ static inline u16 get_random_u16(void)
|
||||
@@ -15,7 +15,7 @@ static inline u16 get_random_u16(void)
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -1,159 +0,0 @@
|
||||
From: Felix Fietkau <nbd@nbd.name>
|
||||
Date: Mon, 17 Apr 2023 19:42:38 +0200
|
||||
Subject: [PATCH] Revert "wifi: iwlwifi: Use generic thermal_zone_get_trip()
|
||||
function"
|
||||
|
||||
This reverts commit 3d2f20ad46f83b333025f5e8e4afc34be8f13c4c.
|
||||
---
|
||||
|
||||
--- a/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h
|
||||
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h
|
||||
@@ -531,7 +531,7 @@ struct iwl_mvm_tt_mgmt {
|
||||
* @tzone: thermal zone device data
|
||||
*/
|
||||
struct iwl_mvm_thermal_device {
|
||||
- struct thermal_trip trips[IWL_MAX_DTS_TRIPS];
|
||||
+ s16 temp_trips[IWL_MAX_DTS_TRIPS];
|
||||
u8 fw_trips_index[IWL_MAX_DTS_TRIPS];
|
||||
struct thermal_zone_device *tzone;
|
||||
};
|
||||
--- a/drivers/net/wireless/intel/iwlwifi/mvm/tt.c
|
||||
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/tt.c
|
||||
@@ -573,11 +573,11 @@ int iwl_mvm_send_temp_report_ths_cmd(str
|
||||
* and uncompressed, the FW should get it compressed and sorted
|
||||
*/
|
||||
|
||||
- /* compress trips to cmd array, remove uninitialized values*/
|
||||
+ /* compress temp_trips to cmd array, remove uninitialized values*/
|
||||
for (i = 0; i < IWL_MAX_DTS_TRIPS; i++) {
|
||||
- if (mvm->tz_device.trips[i].temperature != INT_MIN) {
|
||||
+ if (mvm->tz_device.temp_trips[i] != S16_MIN) {
|
||||
cmd.thresholds[idx++] =
|
||||
- cpu_to_le16((s16)(mvm->tz_device.trips[i].temperature / 1000));
|
||||
+ cpu_to_le16(mvm->tz_device.temp_trips[i]);
|
||||
}
|
||||
}
|
||||
cmd.num_temps = cpu_to_le32(idx);
|
||||
@@ -593,8 +593,8 @@ int iwl_mvm_send_temp_report_ths_cmd(str
|
||||
*/
|
||||
for (i = 0; i < idx; i++) {
|
||||
for (j = 0; j < IWL_MAX_DTS_TRIPS; j++) {
|
||||
- if ((int)(le16_to_cpu(cmd.thresholds[i]) * 1000) ==
|
||||
- mvm->tz_device.trips[j].temperature)
|
||||
+ if (le16_to_cpu(cmd.thresholds[i]) ==
|
||||
+ mvm->tz_device.temp_trips[j])
|
||||
mvm->tz_device.fw_trips_index[i] = j;
|
||||
}
|
||||
}
|
||||
@@ -638,12 +638,37 @@ out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
+static int iwl_mvm_tzone_get_trip_temp(struct thermal_zone_device *device,
|
||||
+ int trip, int *temp)
|
||||
+{
|
||||
+ struct iwl_mvm *mvm = (struct iwl_mvm *)device->devdata;
|
||||
+
|
||||
+ if (trip < 0 || trip >= IWL_MAX_DTS_TRIPS)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ *temp = mvm->tz_device.temp_trips[trip] * 1000;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int iwl_mvm_tzone_get_trip_type(struct thermal_zone_device *device,
|
||||
+ int trip, enum thermal_trip_type *type)
|
||||
+{
|
||||
+ if (trip < 0 || trip >= IWL_MAX_DTS_TRIPS)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ *type = THERMAL_TRIP_PASSIVE;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static int iwl_mvm_tzone_set_trip_temp(struct thermal_zone_device *device,
|
||||
int trip, int temp)
|
||||
{
|
||||
struct iwl_mvm *mvm = thermal_zone_device_priv(device);
|
||||
struct iwl_mvm_thermal_device *tzone;
|
||||
- int ret;
|
||||
+ int i, ret;
|
||||
+ s16 temperature;
|
||||
|
||||
mutex_lock(&mvm->mutex);
|
||||
|
||||
@@ -653,17 +678,40 @@ static int iwl_mvm_tzone_set_trip_temp(s
|
||||
goto out;
|
||||
}
|
||||
|
||||
+ if (trip < 0 || trip >= IWL_MAX_DTS_TRIPS) {
|
||||
+ ret = -EINVAL;
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
if ((temp / 1000) > S16_MAX) {
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
+ temperature = (s16)(temp / 1000);
|
||||
tzone = &mvm->tz_device;
|
||||
+
|
||||
if (!tzone) {
|
||||
ret = -EIO;
|
||||
goto out;
|
||||
}
|
||||
|
||||
+ /* no updates*/
|
||||
+ if (tzone->temp_trips[trip] == temperature) {
|
||||
+ ret = 0;
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ /* already existing temperature */
|
||||
+ for (i = 0; i < IWL_MAX_DTS_TRIPS; i++) {
|
||||
+ if (tzone->temp_trips[i] == temperature) {
|
||||
+ ret = -EINVAL;
|
||||
+ goto out;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ tzone->temp_trips[trip] = temperature;
|
||||
+
|
||||
ret = iwl_mvm_send_temp_report_ths_cmd(mvm);
|
||||
out:
|
||||
mutex_unlock(&mvm->mutex);
|
||||
@@ -672,6 +720,8 @@ out:
|
||||
|
||||
static struct thermal_zone_device_ops tzone_ops = {
|
||||
.get_temp = iwl_mvm_tzone_get_temp,
|
||||
+ .get_trip_temp = iwl_mvm_tzone_get_trip_temp,
|
||||
+ .get_trip_type = iwl_mvm_tzone_get_trip_type,
|
||||
.set_trip_temp = iwl_mvm_tzone_set_trip_temp,
|
||||
};
|
||||
|
||||
@@ -693,8 +743,7 @@ static void iwl_mvm_thermal_zone_registe
|
||||
BUILD_BUG_ON(ARRAY_SIZE(name) >= THERMAL_NAME_LENGTH);
|
||||
|
||||
sprintf(name, "iwlwifi_%u", atomic_inc_return(&counter) & 0xFF);
|
||||
- mvm->tz_device.tzone = thermal_zone_device_register_with_trips(name,
|
||||
- mvm->tz_device.trips,
|
||||
+ mvm->tz_device.tzone = thermal_zone_device_register(name,
|
||||
IWL_MAX_DTS_TRIPS,
|
||||
IWL_WRITABLE_TRIPS_MSK,
|
||||
mvm, &tzone_ops,
|
||||
@@ -717,10 +766,8 @@ static void iwl_mvm_thermal_zone_registe
|
||||
/* 0 is a valid temperature,
|
||||
* so initialize the array with S16_MIN which invalid temperature
|
||||
*/
|
||||
- for (i = 0 ; i < IWL_MAX_DTS_TRIPS; i++) {
|
||||
- mvm->tz_device.trips[i].temperature = INT_MIN;
|
||||
- mvm->tz_device.trips[i].type = THERMAL_TRIP_PASSIVE;
|
||||
- }
|
||||
+ for (i = 0 ; i < IWL_MAX_DTS_TRIPS; i++)
|
||||
+ mvm->tz_device.temp_trips[i] = S16_MIN;
|
||||
}
|
||||
|
||||
static int iwl_mvm_tcool_get_max_state(struct thermal_cooling_device *cdev,
|
@ -0,0 +1,26 @@
|
||||
--- a/drivers/net/wireless/intel/iwlwifi/mvm/tt.c
|
||||
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/tt.c
|
||||
@@ -689,13 +689,23 @@ static void iwl_mvm_thermal_zone_registe
|
||||
for (i = 0 ; i < IWL_MAX_DTS_TRIPS; i++) {
|
||||
mvm->tz_device.trips[i].temperature = THERMAL_TEMP_INVALID;
|
||||
mvm->tz_device.trips[i].type = THERMAL_TRIP_PASSIVE;
|
||||
+#if LINUX_VERSION_IS_GEQ(6,9,0)
|
||||
mvm->tz_device.trips[i].flags = THERMAL_TRIP_FLAG_RW_TEMP;
|
||||
+#endif
|
||||
}
|
||||
+#if LINUX_VERSION_IS_GEQ(6,9,0)
|
||||
mvm->tz_device.tzone = thermal_zone_device_register_with_trips(name,
|
||||
mvm->tz_device.trips,
|
||||
IWL_MAX_DTS_TRIPS,
|
||||
mvm, &tzone_ops,
|
||||
NULL, 0, 0);
|
||||
+#else
|
||||
+ mvm->tz_device.tzone = thermal_zone_device_register_with_trips(name,
|
||||
+ mvm->tz_device.trips,
|
||||
+ IWL_MAX_DTS_TRIPS, 0,
|
||||
+ mvm, &tzone_ops,
|
||||
+ NULL, 0, 0);
|
||||
+#endif
|
||||
if (IS_ERR(mvm->tz_device.tzone)) {
|
||||
IWL_DEBUG_TEMP(mvm,
|
||||
"Failed to register to thermal zone (err = %ld)\n",
|
@ -1,31 +1,31 @@
|
||||
--- a/net/wireless/nl80211.c
|
||||
+++ b/net/wireless/nl80211.c
|
||||
@@ -16442,8 +16442,14 @@ static u32 nl80211_internal_flags[] = {
|
||||
@@ -16383,9 +16383,14 @@ static u32 nl80211_internal_flags[] = {
|
||||
#undef SELECTOR
|
||||
};
|
||||
|
||||
+#if LINUX_VERSION_IS_LESS(6,2,0)
|
||||
static int nl80211_pre_doit(const struct genl_ops *ops, struct sk_buff *skb,
|
||||
struct genl_info *info)
|
||||
+#else
|
||||
+static int nl80211_pre_doit(const struct genl_split_ops *ops,
|
||||
+ struct sk_buff *skb,
|
||||
+static int nl80211_pre_doit(const struct genl_ops *ops, struct sk_buff *skb,
|
||||
+ struct genl_info *info)
|
||||
+#else
|
||||
static int nl80211_pre_doit(const struct genl_split_ops *ops,
|
||||
struct sk_buff *skb,
|
||||
struct genl_info *info)
|
||||
+#endif
|
||||
{
|
||||
struct cfg80211_registered_device *rdev = NULL;
|
||||
struct wireless_dev *wdev = NULL;
|
||||
@@ -16543,8 +16549,14 @@ out_unlock:
|
||||
@@ -16485,9 +16490,14 @@ out_unlock:
|
||||
return err;
|
||||
}
|
||||
|
||||
+#if LINUX_VERSION_IS_LESS(6,2,0)
|
||||
static void nl80211_post_doit(const struct genl_ops *ops, struct sk_buff *skb,
|
||||
struct genl_info *info)
|
||||
+#else
|
||||
+static void nl80211_post_doit(const struct genl_split_ops *ops,
|
||||
+ struct sk_buff *skb,
|
||||
+static void nl80211_post_doit(const struct genl_ops *ops, struct sk_buff *skb,
|
||||
+ struct genl_info *info)
|
||||
+#else
|
||||
static void nl80211_post_doit(const struct genl_split_ops *ops,
|
||||
struct sk_buff *skb,
|
||||
struct genl_info *info)
|
||||
+#endif
|
||||
{
|
||||
u32 internal_flags = nl80211_internal_flags[ops->internal_flags];
|
@ -1,22 +0,0 @@
|
||||
--- a/net/wireless/nl80211.c
|
||||
+++ b/net/wireless/nl80211.c
|
||||
@@ -16442,8 +16442,7 @@ static u32 nl80211_internal_flags[] = {
|
||||
#undef SELECTOR
|
||||
};
|
||||
|
||||
-static int nl80211_pre_doit(const struct genl_split_ops *ops,
|
||||
- struct sk_buff *skb,
|
||||
+static int nl80211_pre_doit(const struct genl_ops *ops, struct sk_buff *skb,
|
||||
struct genl_info *info)
|
||||
{
|
||||
struct cfg80211_registered_device *rdev = NULL;
|
||||
@@ -16544,8 +16543,7 @@ out_unlock:
|
||||
return err;
|
||||
}
|
||||
|
||||
-static void nl80211_post_doit(const struct genl_split_ops *ops,
|
||||
- struct sk_buff *skb,
|
||||
+static void nl80211_post_doit(const struct genl_ops *ops, struct sk_buff *skb,
|
||||
struct genl_info *info)
|
||||
{
|
||||
u32 internal_flags = nl80211_internal_flags[ops->internal_flags];
|
@ -1,32 +0,0 @@
|
||||
--- a/backport-include/net/genetlink.h
|
||||
+++ b/backport-include/net/genetlink.h
|
||||
@@ -3,6 +3,7 @@
|
||||
#include_next <net/genetlink.h>
|
||||
#include <linux/version.h>
|
||||
|
||||
+#if LINUX_VERSION_IS_LESS(4,12,0)
|
||||
static inline void __bp_genl_info_userhdr_set(struct genl_info *info,
|
||||
void *userhdr)
|
||||
{
|
||||
@@ -14,7 +15,6 @@ static inline void *__bp_genl_info_userh
|
||||
return info->userhdr;
|
||||
}
|
||||
|
||||
-#if LINUX_VERSION_IS_LESS(4,12,0)
|
||||
#define GENL_SET_ERR_MSG(info, msg) NL_SET_ERR_MSG(genl_info_extack(info), msg)
|
||||
|
||||
static inline int genl_err_attr(struct genl_info *info, int err,
|
||||
@@ -44,11 +44,13 @@ static inline struct netlink_ext_ack *ge
|
||||
#endif
|
||||
}
|
||||
|
||||
+#if LINUX_VERSION_IS_LESS(6,6,0)
|
||||
/* this gets put in place of info->userhdr, since we use that above */
|
||||
static inline void *genl_info_userhdr(struct genl_info *info)
|
||||
{
|
||||
return (u8 *)info->genlhdr + GENL_HDRLEN;
|
||||
}
|
||||
+#endif
|
||||
|
||||
#if LINUX_VERSION_IS_LESS(4,10,0)
|
||||
#define __genl_ro_after_init
|
@ -0,0 +1,14 @@
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
|
||||
@@ -1581,7 +1581,11 @@ static int brcmf_usb_reset_device(struct
|
||||
|
||||
void brcmf_usb_exit(void)
|
||||
{
|
||||
+#if LINUX_VERSION_IS_GEQ(6,8,0)
|
||||
struct device_driver *drv = &brcmf_usbdrvr.driver;
|
||||
+#else
|
||||
+ struct device_driver *drv = &brcmf_usbdrvr.drvwrap.driver;
|
||||
+#endif
|
||||
int ret;
|
||||
|
||||
brcmf_dbg(USB, "Enter\n");
|
@ -1,160 +0,0 @@
|
||||
--- a/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h
|
||||
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h
|
||||
@@ -531,7 +531,11 @@ struct iwl_mvm_tt_mgmt {
|
||||
* @tzone: thermal zone device data
|
||||
*/
|
||||
struct iwl_mvm_thermal_device {
|
||||
+#if LINUX_VERSION_IS_LESS(6,6,0)
|
||||
s16 temp_trips[IWL_MAX_DTS_TRIPS];
|
||||
+#else
|
||||
+ struct thermal_trip trips[IWL_MAX_DTS_TRIPS];
|
||||
+#endif
|
||||
u8 fw_trips_index[IWL_MAX_DTS_TRIPS];
|
||||
struct thermal_zone_device *tzone;
|
||||
};
|
||||
--- a/drivers/net/wireless/intel/iwlwifi/mvm/tt.c
|
||||
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/tt.c
|
||||
@@ -573,6 +573,7 @@ int iwl_mvm_send_temp_report_ths_cmd(str
|
||||
* and uncompressed, the FW should get it compressed and sorted
|
||||
*/
|
||||
|
||||
+#if LINUX_VERSION_IS_LESS(6,6,0)
|
||||
/* compress temp_trips to cmd array, remove uninitialized values*/
|
||||
for (i = 0; i < IWL_MAX_DTS_TRIPS; i++) {
|
||||
if (mvm->tz_device.temp_trips[i] != S16_MIN) {
|
||||
@@ -580,6 +581,15 @@ int iwl_mvm_send_temp_report_ths_cmd(str
|
||||
cpu_to_le16(mvm->tz_device.temp_trips[i]);
|
||||
}
|
||||
}
|
||||
+#else
|
||||
+ /* compress trips to cmd array, remove uninitialized values*/
|
||||
+ for (i = 0; i < IWL_MAX_DTS_TRIPS; i++) {
|
||||
+ if (mvm->tz_device.trips[i].temperature != INT_MIN) {
|
||||
+ cmd.thresholds[idx++] =
|
||||
+ cpu_to_le16((s16)(mvm->tz_device.trips[i].temperature / 1000));
|
||||
+ }
|
||||
+ }
|
||||
+#endif
|
||||
cmd.num_temps = cpu_to_le32(idx);
|
||||
|
||||
if (!idx)
|
||||
@@ -593,8 +603,13 @@ int iwl_mvm_send_temp_report_ths_cmd(str
|
||||
*/
|
||||
for (i = 0; i < idx; i++) {
|
||||
for (j = 0; j < IWL_MAX_DTS_TRIPS; j++) {
|
||||
+#if LINUX_VERSION_IS_LESS(6,6,0)
|
||||
if (le16_to_cpu(cmd.thresholds[i]) ==
|
||||
mvm->tz_device.temp_trips[j])
|
||||
+#else
|
||||
+ if ((int)(le16_to_cpu(cmd.thresholds[i]) * 1000) ==
|
||||
+ mvm->tz_device.trips[j].temperature)
|
||||
+#endif
|
||||
mvm->tz_device.fw_trips_index[i] = j;
|
||||
}
|
||||
}
|
||||
@@ -638,6 +653,7 @@ out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
+#if LINUX_VERSION_IS_LESS(6,6,0)
|
||||
static int iwl_mvm_tzone_get_trip_temp(struct thermal_zone_device *device,
|
||||
int trip, int *temp)
|
||||
{
|
||||
@@ -661,14 +677,19 @@ static int iwl_mvm_tzone_get_trip_type(s
|
||||
|
||||
return 0;
|
||||
}
|
||||
+#endif
|
||||
|
||||
static int iwl_mvm_tzone_set_trip_temp(struct thermal_zone_device *device,
|
||||
int trip, int temp)
|
||||
{
|
||||
struct iwl_mvm *mvm = thermal_zone_device_priv(device);
|
||||
struct iwl_mvm_thermal_device *tzone;
|
||||
+#if LINUX_VERSION_IS_LESS(6,6,0)
|
||||
int i, ret;
|
||||
s16 temperature;
|
||||
+#else
|
||||
+ int ret;
|
||||
+#endif
|
||||
|
||||
mutex_lock(&mvm->mutex);
|
||||
|
||||
@@ -678,17 +699,21 @@ static int iwl_mvm_tzone_set_trip_temp(s
|
||||
goto out;
|
||||
}
|
||||
|
||||
+#if LINUX_VERSION_IS_LESS(6,6,0)
|
||||
if (trip < 0 || trip >= IWL_MAX_DTS_TRIPS) {
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
+#endif
|
||||
|
||||
if ((temp / 1000) > S16_MAX) {
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
+#if LINUX_VERSION_IS_LESS(6,6,0)
|
||||
temperature = (s16)(temp / 1000);
|
||||
+#endif
|
||||
tzone = &mvm->tz_device;
|
||||
|
||||
if (!tzone) {
|
||||
@@ -696,6 +721,7 @@ static int iwl_mvm_tzone_set_trip_temp(s
|
||||
goto out;
|
||||
}
|
||||
|
||||
+#if LINUX_VERSION_IS_LESS(6,6,0)
|
||||
/* no updates*/
|
||||
if (tzone->temp_trips[trip] == temperature) {
|
||||
ret = 0;
|
||||
@@ -711,6 +737,7 @@ static int iwl_mvm_tzone_set_trip_temp(s
|
||||
}
|
||||
|
||||
tzone->temp_trips[trip] = temperature;
|
||||
+#endif
|
||||
|
||||
ret = iwl_mvm_send_temp_report_ths_cmd(mvm);
|
||||
out:
|
||||
@@ -720,8 +747,10 @@ out:
|
||||
|
||||
static struct thermal_zone_device_ops tzone_ops = {
|
||||
.get_temp = iwl_mvm_tzone_get_temp,
|
||||
+#if LINUX_VERSION_IS_LESS(6,6,0)
|
||||
.get_trip_temp = iwl_mvm_tzone_get_trip_temp,
|
||||
.get_trip_type = iwl_mvm_tzone_get_trip_type,
|
||||
+#endif
|
||||
.set_trip_temp = iwl_mvm_tzone_set_trip_temp,
|
||||
};
|
||||
|
||||
@@ -743,7 +772,12 @@ static void iwl_mvm_thermal_zone_registe
|
||||
BUILD_BUG_ON(ARRAY_SIZE(name) >= THERMAL_NAME_LENGTH);
|
||||
|
||||
sprintf(name, "iwlwifi_%u", atomic_inc_return(&counter) & 0xFF);
|
||||
+#if LINUX_VERSION_IS_LESS(6,6,0)
|
||||
mvm->tz_device.tzone = thermal_zone_device_register(name,
|
||||
+#else
|
||||
+ mvm->tz_device.tzone = thermal_zone_device_register_with_trips(name,
|
||||
+ mvm->tz_device.trips,
|
||||
+#endif
|
||||
IWL_MAX_DTS_TRIPS,
|
||||
IWL_WRITABLE_TRIPS_MSK,
|
||||
mvm, &tzone_ops,
|
||||
@@ -766,8 +800,15 @@ static void iwl_mvm_thermal_zone_registe
|
||||
/* 0 is a valid temperature,
|
||||
* so initialize the array with S16_MIN which invalid temperature
|
||||
*/
|
||||
+#if LINUX_VERSION_IS_LESS(6,6,0)
|
||||
for (i = 0 ; i < IWL_MAX_DTS_TRIPS; i++)
|
||||
mvm->tz_device.temp_trips[i] = S16_MIN;
|
||||
+#else
|
||||
+ for (i = 0 ; i < IWL_MAX_DTS_TRIPS; i++) {
|
||||
+ mvm->tz_device.trips[i].temperature = INT_MIN;
|
||||
+ mvm->tz_device.trips[i].type = THERMAL_TRIP_PASSIVE;
|
||||
+ }
|
||||
+#endif
|
||||
}
|
||||
|
||||
static int iwl_mvm_tcool_get_max_state(struct thermal_cooling_device *cdev,
|
@ -1,6 +1,6 @@
|
||||
--- a/drivers/net/wireless/marvell/mwl8k.c
|
||||
+++ b/drivers/net/wireless/marvell/mwl8k.c
|
||||
@@ -5703,6 +5703,7 @@ MODULE_FIRMWARE("mwl8k/fmimage_8366.fw")
|
||||
@@ -5707,6 +5707,7 @@ MODULE_FIRMWARE("mwl8k/fmimage_8366.fw")
|
||||
MODULE_FIRMWARE(MWL8K_8366_AP_FW(MWL8K_8366_AP_FW_API));
|
||||
|
||||
static const struct pci_device_id mwl8k_pci_id_table[] = {
|
||||
|
@ -1,6 +1,6 @@
|
||||
--- a/drivers/net/wireless/marvell/mwl8k.c
|
||||
+++ b/drivers/net/wireless/marvell/mwl8k.c
|
||||
@@ -6289,6 +6289,8 @@ static int mwl8k_probe(struct pci_dev *p
|
||||
@@ -6293,6 +6293,8 @@ static int mwl8k_probe(struct pci_dev *p
|
||||
|
||||
priv->running_bsses = 0;
|
||||
|
||||
@ -9,7 +9,7 @@
|
||||
return rc;
|
||||
|
||||
err_stop_firmware:
|
||||
@@ -6322,8 +6324,6 @@ static void mwl8k_remove(struct pci_dev
|
||||
@@ -6326,8 +6328,6 @@ static void mwl8k_remove(struct pci_dev
|
||||
return;
|
||||
priv = hw->priv;
|
||||
|
||||
|
@ -139,7 +139,7 @@ Signed-off-by: Pali Rohár <pali@kernel.org>
|
||||
mwifiex_init_fw_complete(adapter);
|
||||
return -1;
|
||||
} else if (adapter->last_init_cmd == cmdresp_no)
|
||||
@@ -1273,8 +1353,8 @@ mwifiex_process_sleep_confirm_resp(struc
|
||||
@@ -1265,8 +1345,8 @@ mwifiex_process_sleep_confirm_resp(struc
|
||||
|
||||
if (command != HostCmd_CMD_802_11_PS_MODE_ENH) {
|
||||
mwifiex_dbg(adapter, ERROR,
|
||||
@ -152,7 +152,7 @@ Signed-off-by: Pali Rohár <pali@kernel.org>
|
||||
|
||||
--- a/drivers/net/wireless/marvell/mwifiex/main.h
|
||||
+++ b/drivers/net/wireless/marvell/mwifiex/main.h
|
||||
@@ -1086,6 +1086,8 @@ void mwifiex_cancel_all_pending_cmd(stru
|
||||
@@ -1084,6 +1084,8 @@ void mwifiex_cancel_all_pending_cmd(stru
|
||||
void mwifiex_cancel_pending_scan_cmd(struct mwifiex_adapter *adapter);
|
||||
void mwifiex_cancel_scan(struct mwifiex_adapter *adapter);
|
||||
|
||||
|
@ -1,43 +0,0 @@
|
||||
From 2ecfe6f07e8e6257cad3d3290c5aec2102120041 Mon Sep 17 00:00:00 2001
|
||||
From: Shiji Yang <yangshiji66@outlook.com>
|
||||
Date: Sat, 23 Sep 2023 09:01:01 +0800
|
||||
Subject: wifi: rt2x00: fix MT7620 low RSSI issue
|
||||
|
||||
On Mediatek vendor driver[1], MT7620 (RT6352) uses different RSSI
|
||||
base value '-2' compared to the other RT2x00 chips. This patch
|
||||
introduces the SoC specific base value to fix the low RSSI value
|
||||
reports on MT7620.
|
||||
|
||||
[1] Found on MT76x2E_MT7620_LinuxAP_V3.0.4.0_P3 ConvertToRssi().
|
||||
|
||||
Signed-off-by: Shiji Yang <yangshiji66@outlook.com>
|
||||
Acked-by: Stanislaw Gruszka <stf_xl@wp.pl>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://lore.kernel.org/r/TYAP286MB031571CDB146C414A908A66DBCFEA@TYAP286MB0315.JPNP286.PROD.OUTLOOK.COM
|
||||
---
|
||||
drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 7 ++++---
|
||||
1 file changed, 4 insertions(+), 3 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
@@ -856,6 +856,7 @@ static int rt2800_agc_to_rssi(struct rt2
|
||||
s8 rssi0 = rt2x00_get_field32(rxwi_w2, RXWI_W2_RSSI0);
|
||||
s8 rssi1 = rt2x00_get_field32(rxwi_w2, RXWI_W2_RSSI1);
|
||||
s8 rssi2 = rt2x00_get_field32(rxwi_w2, RXWI_W2_RSSI2);
|
||||
+ s8 base_val = rt2x00_rt(rt2x00dev, RT6352) ? -2 : -12;
|
||||
u16 eeprom;
|
||||
u8 offset0;
|
||||
u8 offset1;
|
||||
@@ -880,9 +881,9 @@ static int rt2800_agc_to_rssi(struct rt2
|
||||
* If the value in the descriptor is 0, it is considered invalid
|
||||
* and the default (extremely low) rssi value is assumed
|
||||
*/
|
||||
- rssi0 = (rssi0) ? (-12 - offset0 - rt2x00dev->lna_gain - rssi0) : -128;
|
||||
- rssi1 = (rssi1) ? (-12 - offset1 - rt2x00dev->lna_gain - rssi1) : -128;
|
||||
- rssi2 = (rssi2) ? (-12 - offset2 - rt2x00dev->lna_gain - rssi2) : -128;
|
||||
+ rssi0 = (rssi0) ? (base_val - offset0 - rt2x00dev->lna_gain - rssi0) : -128;
|
||||
+ rssi1 = (rssi1) ? (base_val - offset1 - rt2x00dev->lna_gain - rssi1) : -128;
|
||||
+ rssi2 = (rssi2) ? (base_val - offset2 - rt2x00dev->lna_gain - rssi2) : -128;
|
||||
|
||||
/*
|
||||
* mac80211 only accepts a single RSSI value. Calculating the
|
@ -1,78 +0,0 @@
|
||||
From 69708fbb2c698f262e03360d064c7066e0679953 Mon Sep 17 00:00:00 2001
|
||||
From: Shiji Yang <yangshiji66@outlook.com>
|
||||
Date: Sat, 14 Oct 2023 14:55:01 +0800
|
||||
Subject: wifi: rt2x00: fix rt2800 watchdog function
|
||||
|
||||
The watchdog function is broken on rt2800 series SoCs. This patch
|
||||
fixes the incorrect watchdog logic to make it work again.
|
||||
|
||||
1. Update current wdt queue index if it's not equal to the previous
|
||||
index. Watchdog compares the current and previous queue index to
|
||||
judge if the queue hung.
|
||||
2. Make sure hung_{rx,tx} 'true' status won't be override by the
|
||||
normal queue. Any queue hangs should trigger a reset action.
|
||||
3. Clear the watchdog counter of all queues before resetting the
|
||||
hardware. This change may help to avoid the reset loop.
|
||||
4. Change hang check function return type to bool as we only need
|
||||
to return two status, yes or no.
|
||||
|
||||
Signed-off-by: Shiji Yang <yangshiji66@outlook.com>
|
||||
Acked-by: Stanislaw Gruszka <stf_xl@wp.pl>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://lore.kernel.org/r/TYAP286MB0315BC1D83D31154924F0D39BCD1A@TYAP286MB0315.JPNP286.PROD.OUTLOOK.COM
|
||||
---
|
||||
drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 17 +++++++++++------
|
||||
1 file changed, 11 insertions(+), 6 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
@@ -1237,13 +1237,14 @@ void rt2800_txdone_nostatus(struct rt2x0
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rt2800_txdone_nostatus);
|
||||
|
||||
-static int rt2800_check_hung(struct data_queue *queue)
|
||||
+static bool rt2800_check_hung(struct data_queue *queue)
|
||||
{
|
||||
unsigned int cur_idx = rt2800_drv_get_dma_done(queue);
|
||||
|
||||
- if (queue->wd_idx != cur_idx)
|
||||
+ if (queue->wd_idx != cur_idx) {
|
||||
+ queue->wd_idx = cur_idx;
|
||||
queue->wd_count = 0;
|
||||
- else
|
||||
+ } else
|
||||
queue->wd_count++;
|
||||
|
||||
return queue->wd_count > 16;
|
||||
@@ -1280,7 +1281,7 @@ void rt2800_watchdog(struct rt2x00_dev *
|
||||
case QID_MGMT:
|
||||
if (rt2x00queue_empty(queue))
|
||||
continue;
|
||||
- hung_tx = rt2800_check_hung(queue);
|
||||
+ hung_tx = hung_tx || rt2800_check_hung(queue);
|
||||
break;
|
||||
case QID_RX:
|
||||
/* For station mode we should reactive at least
|
||||
@@ -1289,7 +1290,7 @@ void rt2800_watchdog(struct rt2x00_dev *
|
||||
*/
|
||||
if (rt2x00dev->intf_sta_count == 0)
|
||||
continue;
|
||||
- hung_rx = rt2800_check_hung(queue);
|
||||
+ hung_rx = hung_rx || rt2800_check_hung(queue);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@@ -1302,8 +1303,12 @@ void rt2800_watchdog(struct rt2x00_dev *
|
||||
if (hung_rx)
|
||||
rt2x00_warn(rt2x00dev, "Watchdog RX hung detected\n");
|
||||
|
||||
- if (hung_tx || hung_rx)
|
||||
+ if (hung_tx || hung_rx) {
|
||||
+ queue_for_each(rt2x00dev, queue)
|
||||
+ queue->wd_count = 0;
|
||||
+
|
||||
ieee80211_restart_hw(rt2x00dev->hw);
|
||||
+ }
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rt2800_watchdog);
|
||||
|
@ -1,124 +0,0 @@
|
||||
From 1ffe76d5ae78553948d67a978acd9945c2f0a175 Mon Sep 17 00:00:00 2001
|
||||
From: Shiji Yang <yangshiji66@outlook.com>
|
||||
Date: Thu, 19 Oct 2023 19:58:56 +0800
|
||||
Subject: wifi: rt2x00: improve MT7620 register initialization
|
||||
|
||||
1. Do not hard reset the BBP. We can use soft reset instead. This
|
||||
change has some help to the calibration failure issue.
|
||||
2. Enable falling back to legacy rate from the HT/RTS rate by
|
||||
setting the HT_FBK_TO_LEGACY register.
|
||||
3. Implement MCS rate specific maximum PSDU size. It can improve
|
||||
the transmission quality under the low RSSI condition.
|
||||
4. Set BBP_84 register value to 0x19. This is used for extension
|
||||
channel overlapping IOT.
|
||||
|
||||
Signed-off-by: Shiji Yang <yangshiji66@outlook.com>
|
||||
Acked-by: Stanislaw Gruszka <stf_xl@wp.pl>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://lore.kernel.org/r/TYAP286MB031553CCD4B7A3B89C85935DBCD4A@TYAP286MB0315.JPNP286.PROD.OUTLOOK.COM
|
||||
---
|
||||
drivers/net/wireless/ralink/rt2x00/rt2800.h | 18 ++++++++++++++++++
|
||||
drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 24 ++++++++++++++++++++++++
|
||||
drivers/net/wireless/ralink/rt2x00/rt2800mmio.c | 3 +++
|
||||
3 files changed, 45 insertions(+)
|
||||
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800.h
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800.h
|
||||
@@ -871,6 +871,18 @@
|
||||
#define LED_CFG_LED_POLAR FIELD32(0x40000000)
|
||||
|
||||
/*
|
||||
+ * AMPDU_MAX_LEN_20M1S: Per MCS max A-MPDU length, 20 MHz, MCS 0-7
|
||||
+ * AMPDU_MAX_LEN_20M2S: Per MCS max A-MPDU length, 20 MHz, MCS 8-15
|
||||
+ * AMPDU_MAX_LEN_40M1S: Per MCS max A-MPDU length, 40 MHz, MCS 0-7
|
||||
+ * AMPDU_MAX_LEN_40M2S: Per MCS max A-MPDU length, 40 MHz, MCS 8-15
|
||||
+ * Maximum A-MPDU length = 2^(AMPDU_MAX - 5) kilobytes
|
||||
+ */
|
||||
+#define AMPDU_MAX_LEN_20M1S 0x1030
|
||||
+#define AMPDU_MAX_LEN_20M2S 0x1034
|
||||
+#define AMPDU_MAX_LEN_40M1S 0x1038
|
||||
+#define AMPDU_MAX_LEN_40M2S 0x103C
|
||||
+
|
||||
+/*
|
||||
* AMPDU_BA_WINSIZE: Force BlockAck window size
|
||||
* FORCE_WINSIZE_ENABLE:
|
||||
* 0: Disable forcing of BlockAck window size
|
||||
@@ -1545,6 +1557,12 @@
|
||||
*/
|
||||
#define EXP_ACK_TIME 0x1380
|
||||
|
||||
+/*
|
||||
+ * HT_FBK_TO_LEGACY: Enable/Disable HT/RTS fallback to OFDM/CCK rate
|
||||
+ * Not available for legacy SoCs
|
||||
+ */
|
||||
+#define HT_FBK_TO_LEGACY 0x1384
|
||||
+
|
||||
/* TX_PWR_CFG_5 */
|
||||
#define TX_PWR_CFG_5 0x1384
|
||||
#define TX_PWR_CFG_5_MCS16_CH0 FIELD32(0x0000000f)
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
@@ -5851,6 +5851,7 @@ static int rt2800_init_registers(struct
|
||||
struct rt2800_drv_data *drv_data = rt2x00dev->drv_data;
|
||||
u32 reg;
|
||||
u16 eeprom;
|
||||
+ u8 bbp;
|
||||
unsigned int i;
|
||||
int ret;
|
||||
|
||||
@@ -5860,6 +5861,19 @@ static int rt2800_init_registers(struct
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
+ if (rt2x00_rt(rt2x00dev, RT6352)) {
|
||||
+ rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, 0x01);
|
||||
+
|
||||
+ bbp = rt2800_bbp_read(rt2x00dev, 21);
|
||||
+ bbp |= 0x01;
|
||||
+ rt2800_bbp_write(rt2x00dev, 21, bbp);
|
||||
+ bbp = rt2800_bbp_read(rt2x00dev, 21);
|
||||
+ bbp &= (~0x01);
|
||||
+ rt2800_bbp_write(rt2x00dev, 21, bbp);
|
||||
+
|
||||
+ rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, 0x00);
|
||||
+ }
|
||||
+
|
||||
rt2800_register_write(rt2x00dev, LEGACY_BASIC_RATE, 0x0000013f);
|
||||
rt2800_register_write(rt2x00dev, HT_BASIC_RATE, 0x00008003);
|
||||
|
||||
@@ -6013,6 +6027,14 @@ static int rt2800_init_registers(struct
|
||||
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);
|
||||
+
|
||||
+ rt2800_register_write(rt2x00dev, AMPDU_MAX_LEN_20M1S, 0x77754433);
|
||||
+ rt2800_register_write(rt2x00dev, AMPDU_MAX_LEN_20M2S, 0x77765543);
|
||||
+ rt2800_register_write(rt2x00dev, AMPDU_MAX_LEN_40M1S, 0x77765544);
|
||||
+ rt2800_register_write(rt2x00dev, AMPDU_MAX_LEN_40M2S, 0x77765544);
|
||||
+
|
||||
+ rt2800_register_write(rt2x00dev, HT_FBK_TO_LEGACY, 0x1010);
|
||||
+
|
||||
} else {
|
||||
rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000000);
|
||||
rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00080606);
|
||||
@@ -7231,6 +7253,8 @@ static void rt2800_init_bbp_6352(struct
|
||||
rt2800_bbp_dcoc_write(rt2x00dev, 159, 0x64);
|
||||
|
||||
rt2800_bbp4_mac_if_ctrl(rt2x00dev);
|
||||
+
|
||||
+ rt2800_bbp_write(rt2x00dev, 84, 0x19);
|
||||
}
|
||||
|
||||
static void rt2800_init_bbp(struct rt2x00_dev *rt2x00dev)
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800mmio.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800mmio.c
|
||||
@@ -760,6 +760,9 @@ int rt2800mmio_init_registers(struct rt2
|
||||
|
||||
rt2x00mmio_register_write(rt2x00dev, PWR_PIN_CFG, 0x00000003);
|
||||
|
||||
+ if (rt2x00_rt(rt2x00dev, RT6352))
|
||||
+ return 0;
|
||||
+
|
||||
reg = 0;
|
||||
rt2x00_set_field32(®, MAC_SYS_CTRL_RESET_CSR, 1);
|
||||
rt2x00_set_field32(®, MAC_SYS_CTRL_RESET_BBP, 1);
|
@ -1,146 +0,0 @@
|
||||
From a28533c6be1711584bf3ec978309d5c590029821 Mon Sep 17 00:00:00 2001
|
||||
From: Shiji Yang <yangshiji66@outlook.com>
|
||||
Date: Thu, 19 Oct 2023 19:58:57 +0800
|
||||
Subject: wifi: rt2x00: rework MT7620 channel config function
|
||||
|
||||
1. Move the channel configuration code from rt2800_vco_calibration()
|
||||
to the rt2800_config_channel().
|
||||
2. Use MT7620 SoC specific AGC initial LNA value instead of the
|
||||
RT5592's value.
|
||||
3. BBP{195,196} pairing write has been replaced with
|
||||
rt2800_bbp_glrt_write() to reduce redundant code.
|
||||
|
||||
Signed-off-by: Shiji Yang <yangshiji66@outlook.com>
|
||||
Acked-by: Stanislaw Gruszka <stf_xl@wp.pl>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://lore.kernel.org/r/TYAP286MB0315622A4340BFFA530B1B86BCD4A@TYAP286MB0315.JPNP286.PROD.OUTLOOK.COM
|
||||
---
|
||||
drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 91 ++++++++++----------------
|
||||
1 file changed, 35 insertions(+), 56 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
@@ -3861,14 +3861,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,
|
||||
@@ -4437,32 +4429,46 @@ static void rt2800_config_channel(struct
|
||||
usleep_range(1000, 1500);
|
||||
}
|
||||
|
||||
- if (rt2x00_rt(rt2x00dev, RT5592) || rt2x00_rt(rt2x00dev, RT6352)) {
|
||||
- reg = 0x10;
|
||||
- if (!conf_is_ht40(conf)) {
|
||||
- if (rt2x00_rt(rt2x00dev, RT6352) &&
|
||||
- rt2x00_has_cap_external_lna_bg(rt2x00dev)) {
|
||||
- reg |= 0x5;
|
||||
- } else {
|
||||
- reg |= 0xa;
|
||||
- }
|
||||
- }
|
||||
- rt2800_bbp_write(rt2x00dev, 195, 141);
|
||||
- rt2800_bbp_write(rt2x00dev, 196, reg);
|
||||
+ if (rt2x00_rt(rt2x00dev, RT5592)) {
|
||||
+ bbp = conf_is_ht40(conf) ? 0x10 : 0x1a;
|
||||
+ rt2800_bbp_glrt_write(rt2x00dev, 141, bbp);
|
||||
|
||||
- /* 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);
|
||||
+ bbp = (rf->channel <= 14 ? 0x1c : 0x24) + 2 * rt2x00dev->lna_gain;
|
||||
+ rt2800_bbp_write_with_rx_chain(rt2x00dev, 66, bbp);
|
||||
|
||||
- if (rt2x00_rt(rt2x00dev, RT5592))
|
||||
- rt2800_iq_calibrate(rt2x00dev, rf->channel);
|
||||
+ rt2800_iq_calibrate(rt2x00dev, rf->channel);
|
||||
}
|
||||
|
||||
if (rt2x00_rt(rt2x00dev, RT6352)) {
|
||||
+ /* BBP for GLRT BW */
|
||||
+ bbp = conf_is_ht40(conf) ?
|
||||
+ 0x10 : rt2x00_has_cap_external_lna_bg(rt2x00dev) ?
|
||||
+ 0x15 : 0x1a;
|
||||
+ rt2800_bbp_glrt_write(rt2x00dev, 141, bbp);
|
||||
+
|
||||
+ bbp = conf_is_ht40(conf) ? 0x2f : 0x40;
|
||||
+ rt2800_bbp_glrt_write(rt2x00dev, 157, bbp);
|
||||
+
|
||||
+ if (rt2x00dev->default_ant.rx_chain_num == 1) {
|
||||
+ rt2800_bbp_write(rt2x00dev, 91, 0x07);
|
||||
+ rt2800_bbp_write(rt2x00dev, 95, 0x1a);
|
||||
+ rt2800_bbp_glrt_write(rt2x00dev, 128, 0xa0);
|
||||
+ rt2800_bbp_glrt_write(rt2x00dev, 170, 0x12);
|
||||
+ rt2800_bbp_glrt_write(rt2x00dev, 171, 0x10);
|
||||
+ } else {
|
||||
+ rt2800_bbp_write(rt2x00dev, 91, 0x06);
|
||||
+ rt2800_bbp_write(rt2x00dev, 95, 0x9a);
|
||||
+ rt2800_bbp_glrt_write(rt2x00dev, 128, 0xe0);
|
||||
+ rt2800_bbp_glrt_write(rt2x00dev, 170, 0x30);
|
||||
+ rt2800_bbp_glrt_write(rt2x00dev, 171, 0x30);
|
||||
+ }
|
||||
+
|
||||
+ /* AGC init */
|
||||
+ bbp = rf->channel <= 14 ? 0x04 + 2 * rt2x00dev->lna_gain : 0;
|
||||
+ rt2800_bbp_write_with_rx_chain(rt2x00dev, 66, bbp);
|
||||
+
|
||||
+ usleep_range(1000, 1500);
|
||||
+
|
||||
if (test_bit(CAPABILITY_EXTERNAL_PA_TX0,
|
||||
&rt2x00dev->cap_flags)) {
|
||||
reg = rt2800_register_read(rt2x00dev, RF_CONTROL3);
|
||||
@@ -5608,26 +5614,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);
|
||||
@@ -5635,13 +5621,6 @@ void rt2800_vco_calibration(struct rt2x0
|
||||
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);
|
@ -1,241 +0,0 @@
|
||||
From cca74bed37af1c8217bcd8282d9b384efdbf73bd Mon Sep 17 00:00:00 2001
|
||||
From: Shiji Yang <yangshiji66@outlook.com>
|
||||
Date: Thu, 19 Oct 2023 19:58:58 +0800
|
||||
Subject: 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. Add some missing LNA related registers' initialization.
|
||||
|
||||
Signed-off-by: Shiji Yang <yangshiji66@outlook.com>
|
||||
Acked-by: Stanislaw Gruszka <stf_xl@wp.pl>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://lore.kernel.org/r/TYAP286MB0315979F92DC563019B8F238BCD4A@TYAP286MB0315.JPNP286.PROD.OUTLOOK.COM
|
||||
---
|
||||
drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 176 +++++++++++++++++--------
|
||||
drivers/net/wireless/ralink/rt2x00/rt2x00.h | 6 +
|
||||
2 files changed, 130 insertions(+), 52 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
@@ -4468,41 +4468,6 @@ static void rt2800_config_channel(struct
|
||||
rt2800_bbp_write_with_rx_chain(rt2x00dev, 66, bbp);
|
||||
|
||||
usleep_range(1000, 1500);
|
||||
-
|
||||
- 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);
|
||||
-
|
||||
- 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);
|
||||
- }
|
||||
}
|
||||
|
||||
bbp = rt2800_bbp_read(rt2x00dev, 4);
|
||||
@@ -5612,16 +5577,6 @@ void rt2800_vco_calibration(struct rt2x0
|
||||
}
|
||||
}
|
||||
rt2800_register_write(rt2x00dev, TX_PIN_CFG, tx_pin);
|
||||
-
|
||||
- if (rt2x00_rt(rt2x00dev, RT6352)) {
|
||||
- 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);
|
||||
- }
|
||||
- }
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rt2800_vco_calibration);
|
||||
|
||||
@@ -10348,6 +10303,128 @@ do_cal:
|
||||
rt2800_register_write(rt2x00dev, RF_BYPASS0, MAC_RF_BYPASS0);
|
||||
}
|
||||
|
||||
+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 (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 (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 (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 (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)
|
||||
+{
|
||||
+ u32 reg;
|
||||
+
|
||||
+ if (rt2x00_has_cap_external_pa(rt2x00dev) ||
|
||||
+ rt2x00_has_cap_external_lna_bg(rt2x00dev))
|
||||
+ 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 internal PA devices */
|
||||
+
|
||||
+ rt2800_rxdcoc_calibration(rt2x00dev);
|
||||
+ rt2800_rxiq_calibration(rt2x00dev);
|
||||
+
|
||||
+ if (!rt2x00_has_cap_external_pa(rt2x00dev) &&
|
||||
+ !rt2x00_has_cap_external_lna_bg(rt2x00dev))
|
||||
+ return;
|
||||
+
|
||||
+ 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)) {
|
||||
+ rt2800_rfcsr_write_chanreg(rt2x00dev, 14, 0x66);
|
||||
+ rt2800_rfcsr_write_chanreg(rt2x00dev, 17, 0x20);
|
||||
+ rt2800_rfcsr_write_chanreg(rt2x00dev, 18, 0x42);
|
||||
+ }
|
||||
+
|
||||
+ if (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 (rt2x00_has_cap_external_pa(rt2x00dev))
|
||||
+ rt2800_rfcsr_write_dccal(rt2x00dev, 05, 0x00);
|
||||
+
|
||||
+ 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);
|
||||
+ }
|
||||
+
|
||||
+ if (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_init_rfcsr_6352(struct rt2x00_dev *rt2x00dev)
|
||||
{
|
||||
/* Initialize RF central register to default value */
|
||||
@@ -10612,13 +10689,8 @@ static void rt2800_init_rfcsr_6352(struc
|
||||
rt2800_rfcsr_write_dccal(rt2x00dev, 5, 0x00);
|
||||
rt2800_rfcsr_write_dccal(rt2x00dev, 17, 0x7C);
|
||||
|
||||
- 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);
|
||||
+ /* Do calibration and init PA/LNA */
|
||||
+ rt2800_calibration_rt6352(rt2x00dev);
|
||||
}
|
||||
|
||||
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
|
||||
@@ -1263,6 +1263,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);
|
@ -1,177 +0,0 @@
|
||||
From b1275cdd7456ef811747dfb4f3c46310ddd300cd Mon Sep 17 00:00:00 2001
|
||||
From: Shiji Yang <yangshiji66@outlook.com>
|
||||
Date: Sat, 4 Nov 2023 16:57:58 +0800
|
||||
Subject: wifi: rt2x00: introduce DMA busy check watchdog for rt2800
|
||||
|
||||
When I tried to fix the watchdog of rt2800, I found that sometimes
|
||||
the watchdog can not reset the hung device. This is because the
|
||||
queue is not completely stuck, it just becomes very slow. The MTK
|
||||
vendor driver for the new chip MT7603/MT7612 has a DMA busy watchdog
|
||||
to detect device hangs by checking DMA busy status. This watchdog
|
||||
implementation is something similar to it. To reduce unnecessary
|
||||
reset, we can check the INT_SOURCE_CSR register together as I found
|
||||
that when the radio hung, the RX/TX coherent interrupt will always
|
||||
stuck at triggered state.
|
||||
|
||||
The 'watchdog' module parameter has been extended to control all
|
||||
watchdogs(0=disabled, 1=hang watchdog, 2=DMA watchdog, 3=both). This
|
||||
new watchdog function is a slight schedule and it won't affect the
|
||||
transmission speed. So we can turn on it by default. Due to the
|
||||
INT_SOURCE_CSR register is invalid on rt2800 USB NICs, the DMA busy
|
||||
watchdog will be automatically disabled for them.
|
||||
|
||||
Tested on MT7620 and RT5350.
|
||||
|
||||
Signed-off-by: Shiji Yang <yangshiji66@outlook.com>
|
||||
Acked-by: Stanislaw Gruszka <stf_xl@wp.pl>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://lore.kernel.org/r/TYAP286MB0315D7462CE08A119A99DE34BCA4A@TYAP286MB0315.JPNP286.PROD.OUTLOOK.COM
|
||||
---
|
||||
drivers/net/wireless/ralink/rt2x00/rt2800.h | 4 ++
|
||||
drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 77 ++++++++++++++++++++++----
|
||||
drivers/net/wireless/ralink/rt2x00/rt2x00.h | 3 +
|
||||
3 files changed, 73 insertions(+), 11 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800.h
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800.h
|
||||
@@ -3194,4 +3194,8 @@ enum rt2800_eeprom_word {
|
||||
*/
|
||||
#define BCN_TBTT_OFFSET 64
|
||||
|
||||
+/* Watchdog type mask */
|
||||
+#define RT2800_WATCHDOG_HANG BIT(0)
|
||||
+#define RT2800_WATCHDOG_DMA_BUSY BIT(1)
|
||||
+
|
||||
#endif /* RT2800_H */
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
@@ -30,9 +30,10 @@
|
||||
#include "rt2800lib.h"
|
||||
#include "rt2800.h"
|
||||
|
||||
-static bool modparam_watchdog;
|
||||
-module_param_named(watchdog, modparam_watchdog, bool, S_IRUGO);
|
||||
-MODULE_PARM_DESC(watchdog, "Enable watchdog to detect tx/rx hangs and reset hardware if detected");
|
||||
+static unsigned int modparam_watchdog = RT2800_WATCHDOG_DMA_BUSY;
|
||||
+module_param_named(watchdog, modparam_watchdog, uint, 0444);
|
||||
+MODULE_PARM_DESC(watchdog, "Enable watchdog to recover tx/rx hangs.\n"
|
||||
+ "\t\t(0=disabled, 1=hang watchdog, 2=DMA watchdog(default), 3=both)");
|
||||
|
||||
/*
|
||||
* Register access.
|
||||
@@ -1261,15 +1262,12 @@ static void rt2800_update_survey(struct
|
||||
chan_survey->time_ext_busy += rt2800_register_read(rt2x00dev, CH_BUSY_STA_SEC);
|
||||
}
|
||||
|
||||
-void rt2800_watchdog(struct rt2x00_dev *rt2x00dev)
|
||||
+static bool rt2800_watchdog_hung(struct rt2x00_dev *rt2x00dev)
|
||||
{
|
||||
struct data_queue *queue;
|
||||
bool hung_tx = false;
|
||||
bool hung_rx = false;
|
||||
|
||||
- if (test_bit(DEVICE_STATE_SCANNING, &rt2x00dev->flags))
|
||||
- return;
|
||||
-
|
||||
rt2800_update_survey(rt2x00dev);
|
||||
|
||||
queue_for_each(rt2x00dev, queue) {
|
||||
@@ -1297,18 +1295,72 @@ void rt2800_watchdog(struct rt2x00_dev *
|
||||
}
|
||||
}
|
||||
|
||||
+ if (!hung_tx && !hung_rx)
|
||||
+ return false;
|
||||
+
|
||||
if (hung_tx)
|
||||
rt2x00_warn(rt2x00dev, "Watchdog TX hung detected\n");
|
||||
|
||||
if (hung_rx)
|
||||
rt2x00_warn(rt2x00dev, "Watchdog RX hung detected\n");
|
||||
|
||||
- if (hung_tx || hung_rx) {
|
||||
- queue_for_each(rt2x00dev, queue)
|
||||
- queue->wd_count = 0;
|
||||
+ queue_for_each(rt2x00dev, queue)
|
||||
+ queue->wd_count = 0;
|
||||
+
|
||||
+ return true;
|
||||
+}
|
||||
+
|
||||
+static bool rt2800_watchdog_dma_busy(struct rt2x00_dev *rt2x00dev)
|
||||
+{
|
||||
+ bool busy_rx, busy_tx;
|
||||
+ u32 reg_cfg = rt2800_register_read(rt2x00dev, WPDMA_GLO_CFG);
|
||||
+ u32 reg_int = rt2800_register_read(rt2x00dev, INT_SOURCE_CSR);
|
||||
+
|
||||
+ if (rt2x00_get_field32(reg_cfg, WPDMA_GLO_CFG_RX_DMA_BUSY) &&
|
||||
+ rt2x00_get_field32(reg_int, INT_SOURCE_CSR_RX_COHERENT))
|
||||
+ rt2x00dev->rxdma_busy++;
|
||||
+ else
|
||||
+ rt2x00dev->rxdma_busy = 0;
|
||||
|
||||
+ if (rt2x00_get_field32(reg_cfg, WPDMA_GLO_CFG_TX_DMA_BUSY) &&
|
||||
+ rt2x00_get_field32(reg_int, INT_SOURCE_CSR_TX_COHERENT))
|
||||
+ rt2x00dev->txdma_busy++;
|
||||
+ else
|
||||
+ rt2x00dev->txdma_busy = 0;
|
||||
+
|
||||
+ busy_rx = rt2x00dev->rxdma_busy > 30 ? true : false;
|
||||
+ busy_tx = rt2x00dev->txdma_busy > 30 ? true : false;
|
||||
+
|
||||
+ if (!busy_rx && !busy_tx)
|
||||
+ return false;
|
||||
+
|
||||
+ if (busy_rx)
|
||||
+ rt2x00_warn(rt2x00dev, "Watchdog RX DMA busy detected\n");
|
||||
+
|
||||
+ if (busy_tx)
|
||||
+ rt2x00_warn(rt2x00dev, "Watchdog TX DMA busy detected\n");
|
||||
+
|
||||
+ rt2x00dev->rxdma_busy = 0;
|
||||
+ rt2x00dev->txdma_busy = 0;
|
||||
+
|
||||
+ return true;
|
||||
+}
|
||||
+
|
||||
+void rt2800_watchdog(struct rt2x00_dev *rt2x00dev)
|
||||
+{
|
||||
+ bool reset = false;
|
||||
+
|
||||
+ if (test_bit(DEVICE_STATE_SCANNING, &rt2x00dev->flags))
|
||||
+ return;
|
||||
+
|
||||
+ if (modparam_watchdog & RT2800_WATCHDOG_DMA_BUSY)
|
||||
+ reset = rt2800_watchdog_dma_busy(rt2x00dev);
|
||||
+
|
||||
+ if (modparam_watchdog & RT2800_WATCHDOG_HANG)
|
||||
+ reset = rt2800_watchdog_hung(rt2x00dev) || reset;
|
||||
+
|
||||
+ if (reset)
|
||||
ieee80211_restart_hw(rt2x00dev->hw);
|
||||
- }
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rt2800_watchdog);
|
||||
|
||||
@@ -12016,6 +12068,9 @@ int rt2800_probe_hw(struct rt2x00_dev *r
|
||||
__set_bit(REQUIRE_TASKLET_CONTEXT, &rt2x00dev->cap_flags);
|
||||
}
|
||||
|
||||
+ /* USB NICs don't support DMA watchdog as INT_SOURCE_CSR is invalid */
|
||||
+ if (rt2x00_is_usb(rt2x00dev))
|
||||
+ modparam_watchdog &= ~RT2800_WATCHDOG_DMA_BUSY;
|
||||
if (modparam_watchdog) {
|
||||
__set_bit(CAPABILITY_RESTART_HW, &rt2x00dev->cap_flags);
|
||||
rt2x00dev->link.watchdog_interval = msecs_to_jiffies(100);
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h
|
||||
@@ -926,6 +926,9 @@ struct rt2x00_dev {
|
||||
*/
|
||||
u16 beacon_int;
|
||||
|
||||
+ /* Rx/Tx DMA busy watchdog counter */
|
||||
+ u16 rxdma_busy, txdma_busy;
|
||||
+
|
||||
/**
|
||||
* Timestamp of last received beacon
|
||||
*/
|
@ -1,43 +0,0 @@
|
||||
From 570beb6285fd355904b22625da20809f477096c5 Mon Sep 17 00:00:00 2001
|
||||
From: Shiji Yang <yangshiji66@outlook.com>
|
||||
Date: Sat, 4 Nov 2023 16:57:59 +0800
|
||||
Subject: wifi: rt2x00: disable RTS threshold for rt2800 by default
|
||||
|
||||
rt2800 has a lot of registers to control the RTS enable/disable
|
||||
status for different rates. And the driver control them via
|
||||
rt2800_set_rts_threshold(). When RTS was disabled in user
|
||||
interface, this function won't be called at all. This means that
|
||||
the RTS is still 'on' for CCK and OFDM rates. So we'd better to
|
||||
disable them by default because it should be like this. The RTS
|
||||
for HT20 and HT40 is already default off so we don't need to
|
||||
touch them. If we toggle the RTS status, these register bits
|
||||
will be enable/disable again by rt2800_set_rts_threshold().
|
||||
|
||||
Signed-off-by: Shiji Yang <yangshiji66@outlook.com>
|
||||
Acked-by: Stanislaw Gruszka <stf_xl@wp.pl>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://lore.kernel.org/r/TYAP286MB03155DDB953155B7A2DE849ABCA4A@TYAP286MB0315.JPNP286.PROD.OUTLOOK.COM
|
||||
---
|
||||
drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
@@ -6100,7 +6100,7 @@ static int rt2800_init_registers(struct
|
||||
rt2x00_set_field32(®, CCK_PROT_CFG_TX_OP_ALLOW_MM40, 0);
|
||||
rt2x00_set_field32(®, CCK_PROT_CFG_TX_OP_ALLOW_GF20, 1);
|
||||
rt2x00_set_field32(®, CCK_PROT_CFG_TX_OP_ALLOW_GF40, 0);
|
||||
- rt2x00_set_field32(®, CCK_PROT_CFG_RTS_TH_EN, 1);
|
||||
+ rt2x00_set_field32(®, CCK_PROT_CFG_RTS_TH_EN, 0);
|
||||
rt2800_register_write(rt2x00dev, CCK_PROT_CFG, reg);
|
||||
|
||||
reg = rt2800_register_read(rt2x00dev, OFDM_PROT_CFG);
|
||||
@@ -6113,7 +6113,7 @@ static int rt2800_init_registers(struct
|
||||
rt2x00_set_field32(®, OFDM_PROT_CFG_TX_OP_ALLOW_MM40, 0);
|
||||
rt2x00_set_field32(®, OFDM_PROT_CFG_TX_OP_ALLOW_GF20, 1);
|
||||
rt2x00_set_field32(®, OFDM_PROT_CFG_TX_OP_ALLOW_GF40, 0);
|
||||
- rt2x00_set_field32(®, OFDM_PROT_CFG_RTS_TH_EN, 1);
|
||||
+ rt2x00_set_field32(®, OFDM_PROT_CFG_RTS_TH_EN, 0);
|
||||
rt2800_register_write(rt2x00dev, OFDM_PROT_CFG, reg);
|
||||
|
||||
reg = rt2800_register_read(rt2x00dev, MM20_PROT_CFG);
|
@ -1,67 +0,0 @@
|
||||
From a11d965a218f0cd95b13fe44d0bcd8a20ce134a8 Mon Sep 17 00:00:00 2001
|
||||
From: Shiji Yang <yangshiji66@outlook.com>
|
||||
Date: Sat, 4 Nov 2023 16:58:00 +0800
|
||||
Subject: wifi: rt2x00: restart beacon queue when hardware reset
|
||||
|
||||
When a hardware reset is triggered, all registers are reset, so all
|
||||
queues are forced to stop in hardware interface. However, mac80211
|
||||
will not automatically stop the queue. If we don't manually stop the
|
||||
beacon queue, the queue will be deadlocked and unable to start again.
|
||||
This patch fixes the issue where Apple devices cannot connect to the
|
||||
AP after calling ieee80211_restart_hw().
|
||||
|
||||
Signed-off-by: Shiji Yang <yangshiji66@outlook.com>
|
||||
Acked-by: Stanislaw Gruszka <stf_xl@wp.pl>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://lore.kernel.org/r/TYAP286MB031530EB6D98DCE4DF20766CBCA4A@TYAP286MB0315.JPNP286.PROD.OUTLOOK.COM
|
||||
---
|
||||
drivers/net/wireless/ralink/rt2x00/rt2x00dev.c | 3 +++
|
||||
drivers/net/wireless/ralink/rt2x00/rt2x00mac.c | 11 +++++++++++
|
||||
2 files changed, 14 insertions(+)
|
||||
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c
|
||||
@@ -101,6 +101,7 @@ void rt2x00lib_disable_radio(struct rt2x
|
||||
rt2x00link_stop_tuner(rt2x00dev);
|
||||
rt2x00queue_stop_queues(rt2x00dev);
|
||||
rt2x00queue_flush_queues(rt2x00dev, true);
|
||||
+ rt2x00queue_stop_queue(rt2x00dev->bcn);
|
||||
|
||||
/*
|
||||
* Disable radio.
|
||||
@@ -1286,6 +1287,7 @@ int rt2x00lib_start(struct rt2x00_dev *r
|
||||
rt2x00dev->intf_ap_count = 0;
|
||||
rt2x00dev->intf_sta_count = 0;
|
||||
rt2x00dev->intf_associated = 0;
|
||||
+ rt2x00dev->intf_beaconing = 0;
|
||||
|
||||
/* Enable the radio */
|
||||
retval = rt2x00lib_enable_radio(rt2x00dev);
|
||||
@@ -1312,6 +1314,7 @@ void rt2x00lib_stop(struct rt2x00_dev *r
|
||||
rt2x00dev->intf_ap_count = 0;
|
||||
rt2x00dev->intf_sta_count = 0;
|
||||
rt2x00dev->intf_associated = 0;
|
||||
+ rt2x00dev->intf_beaconing = 0;
|
||||
}
|
||||
|
||||
static inline void rt2x00lib_set_if_combinations(struct rt2x00_dev *rt2x00dev)
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2x00mac.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00mac.c
|
||||
@@ -598,6 +598,17 @@ void rt2x00mac_bss_info_changed(struct i
|
||||
*/
|
||||
if (changes & BSS_CHANGED_BEACON_ENABLED) {
|
||||
mutex_lock(&intf->beacon_skb_mutex);
|
||||
+
|
||||
+ /*
|
||||
+ * Clear the 'enable_beacon' flag and clear beacon because
|
||||
+ * the beacon queue has been stopped after hardware reset.
|
||||
+ */
|
||||
+ if (test_bit(DEVICE_STATE_RESET, &rt2x00dev->flags) &&
|
||||
+ intf->enable_beacon) {
|
||||
+ intf->enable_beacon = false;
|
||||
+ rt2x00queue_clear_beacon(rt2x00dev, vif);
|
||||
+ }
|
||||
+
|
||||
if (!bss_conf->enable_beacon && intf->enable_beacon) {
|
||||
rt2x00dev->intf_beaconing--;
|
||||
intf->enable_beacon = false;
|
@ -15,12 +15,12 @@ Signed-off-by: Shiji Yang <yangshiji66@outlook.com>
|
||||
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
|
||||
@@ -8711,7 +8711,7 @@ static void rt2800_rxdcoc_calibration(st
|
||||
rt2800_rfcsr_write_bank(rt2x00dev, 5, 4, saverfb5r4);
|
||||
rt2800_rfcsr_write_bank(rt2x00dev, 7, 4, saverfb7r4);
|
||||
@@ -8692,7 +8692,7 @@ static void rt2800_rxdcoc_calibration(st
|
||||
rfvalue |= 0x03;
|
||||
rt2800_rfcsr_write_bank(rt2x00dev, 0, 2, rfvalue);
|
||||
|
||||
- rt2800_bbp_write(rt2x00dev, 158, 141);
|
||||
+ rt2800_bbp_write(rt2x00dev, 158, 140);
|
||||
bbpreg = rt2800_bbp_read(rt2x00dev, 159);
|
||||
bbpreg = bbpreg & (~0x40);
|
||||
bbpreg |= 0x10;
|
||||
rt2800_bbp_write(rt2x00dev, 159, bbpreg);
|
||||
|
@ -21,7 +21,7 @@ Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
||||
|
||||
--- a/local-symbols
|
||||
+++ b/local-symbols
|
||||
@@ -352,6 +352,7 @@ RT2X00_LIB_FIRMWARE=
|
||||
@@ -334,6 +334,7 @@ RT2X00_LIB_FIRMWARE=
|
||||
RT2X00_LIB_CRYPTO=
|
||||
RT2X00_LIB_LEDS=
|
||||
RT2X00_LIB_DEBUGFS=
|
||||
@ -89,7 +89,7 @@ Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
||||
/* Firmware functions */
|
||||
static char *rt2800soc_get_firmware_name(struct rt2x00_dev *rt2x00dev)
|
||||
{
|
||||
@@ -168,7 +155,7 @@ static const struct rt2800_ops rt2800soc
|
||||
@@ -172,7 +159,7 @@ static const struct rt2800_ops rt2800soc
|
||||
.register_multiread = rt2x00mmio_register_multiread,
|
||||
.register_multiwrite = rt2x00mmio_register_multiwrite,
|
||||
.regbusy_read = rt2x00mmio_regbusy_read,
|
||||
|
@ -13,7 +13,7 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
|
||||
|
||||
--- a/drivers/net/wireless/ralink/rt2x00/rt2800soc.c
|
||||
+++ b/drivers/net/wireless/ralink/rt2x00/rt2800soc.c
|
||||
@@ -226,10 +226,17 @@ static int rt2800soc_probe(struct platfo
|
||||
@@ -230,10 +230,17 @@ static int rt2800soc_probe(struct platfo
|
||||
return rt2x00soc_probe(pdev, &rt2800soc_ops);
|
||||
}
|
||||
|
||||
|
@ -8,7 +8,7 @@
|
||||
|
||||
#include "rt2x00.h"
|
||||
#include "rt2800lib.h"
|
||||
@@ -11285,6 +11286,17 @@ static int rt2800_init_eeprom(struct rt2
|
||||
@@ -11282,6 +11283,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);
|
||||
|
||||
|
@ -52,7 +52,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
||||
static const unsigned int rt2800_eeprom_map[EEPROM_WORD_COUNT] = {
|
||||
[EEPROM_CHIP_ID] = 0x0000,
|
||||
[EEPROM_VERSION] = 0x0001,
|
||||
@@ -10407,8 +10425,10 @@ static void rt2800_calibration_rt6352(st
|
||||
@@ -10404,8 +10422,10 @@ static void rt2800_calibration_rt6352(st
|
||||
u32 reg;
|
||||
|
||||
if (rt2x00_has_cap_external_pa(rt2x00dev) ||
|
||||
@ -64,7 +64,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
||||
|
||||
rt2800_r_calibration(rt2x00dev);
|
||||
rt2800_rf_self_txdc_cal(rt2x00dev);
|
||||
@@ -10426,6 +10446,8 @@ static void rt2800_calibration_rt6352(st
|
||||
@@ -10423,6 +10443,8 @@ static void rt2800_calibration_rt6352(st
|
||||
!rt2x00_has_cap_external_lna_bg(rt2x00dev))
|
||||
return;
|
||||
|
||||
|
@ -49,9 +49,9 @@
|
||||
+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
|
||||
.add_chanctx = ieee80211_emulate_add_chanctx,
|
||||
.remove_chanctx = ieee80211_emulate_remove_chanctx,
|
||||
@@ -333,6 +337,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,
|
||||
@ -102,9 +102,9 @@
|
||||
+#endif
|
||||
+
|
||||
static const struct ieee80211_ops rt2800soc_mac80211_ops = {
|
||||
.tx = rt2x00mac_tx,
|
||||
.wake_tx_queue = ieee80211_handle_wake_tx_queue,
|
||||
@@ -161,6 +188,9 @@ static const struct rt2800_ops rt2800soc
|
||||
.add_chanctx = ieee80211_emulate_add_chanctx,
|
||||
.remove_chanctx = ieee80211_emulate_remove_chanctx,
|
||||
@@ -165,6 +192,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,
|
||||
@ -125,9 +125,9 @@
|
||||
+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
|
||||
.add_chanctx = ieee80211_emulate_add_chanctx,
|
||||
.remove_chanctx = ieee80211_emulate_remove_chanctx,
|
||||
@@ -676,6 +680,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,
|
||||
|
@ -202,7 +202,7 @@
|
||||
|
||||
/* BBP for G band GLRT function (BBP_128 ~ BBP_221) */
|
||||
rt2800_bbp_glrt_write(rt2x00dev, 0, 0x00);
|
||||
@@ -10381,6 +10410,9 @@ static void rt2800_restore_rf_bbp_rt6352
|
||||
@@ -10378,6 +10407,9 @@ static void rt2800_restore_rf_bbp_rt6352
|
||||
rt2800_register_write(rt2x00dev, RF_BYPASS3, 0x0);
|
||||
}
|
||||
|
||||
@ -212,7 +212,7 @@
|
||||
if (rt2x00_has_cap_external_lna_bg(rt2x00dev)) {
|
||||
rt2800_rfcsr_write_chanreg(rt2x00dev, 14, 0x16);
|
||||
rt2800_rfcsr_write_chanreg(rt2x00dev, 17, 0x23);
|
||||
@@ -10458,6 +10490,9 @@ static void rt2800_calibration_rt6352(st
|
||||
@@ -10455,6 +10487,9 @@ static void rt2800_calibration_rt6352(st
|
||||
rt2800_register_write(rt2x00dev, RF_BYPASS3, reg);
|
||||
}
|
||||
|
||||
@ -222,7 +222,7 @@
|
||||
if (rt2x00_has_cap_external_lna_bg(rt2x00dev)) {
|
||||
rt2800_rfcsr_write_chanreg(rt2x00dev, 14, 0x66);
|
||||
rt2800_rfcsr_write_chanreg(rt2x00dev, 17, 0x20);
|
||||
@@ -10548,31 +10583,36 @@ static void rt2800_init_rfcsr_6352(struc
|
||||
@@ -10545,31 +10580,36 @@ static void rt2800_init_rfcsr_6352(struc
|
||||
rt2800_rfcsr_write(rt2x00dev, 42, 0x5B);
|
||||
rt2800_rfcsr_write(rt2x00dev, 43, 0x00);
|
||||
|
||||
@ -284,7 +284,7 @@
|
||||
|
||||
/* Initialize RF channel register to default value */
|
||||
rt2800_rfcsr_write_chanreg(rt2x00dev, 0, 0x03);
|
||||
@@ -10638,63 +10678,71 @@ static void rt2800_init_rfcsr_6352(struc
|
||||
@@ -10635,63 +10675,71 @@ static void rt2800_init_rfcsr_6352(struc
|
||||
|
||||
rt2800_rfcsr_write_bank(rt2x00dev, 6, 45, 0xC5);
|
||||
|
||||
@ -411,7 +411,7 @@
|
||||
|
||||
/* Initialize RF DC calibration register to default value */
|
||||
rt2800_rfcsr_write_dccal(rt2x00dev, 0, 0x47);
|
||||
@@ -10757,12 +10805,17 @@ static void rt2800_init_rfcsr_6352(struc
|
||||
@@ -10754,12 +10802,17 @@ static void rt2800_init_rfcsr_6352(struc
|
||||
rt2800_rfcsr_write_dccal(rt2x00dev, 62, 0x00);
|
||||
rt2800_rfcsr_write_dccal(rt2x00dev, 63, 0x00);
|
||||
|
||||
|
@ -1,27 +0,0 @@
|
||||
From d55cb6d8a99441aff55cb9ce663a07f7f1667e83 Mon Sep 17 00:00:00 2001
|
||||
From: Martin Kaistra <martin.kaistra@linutronix.de>
|
||||
Date: Fri, 22 Dec 2023 11:14:22 +0100
|
||||
Subject: [PATCH 01/21] wifi: rtl8xxxu: remove assignment of priv->vif in
|
||||
rtl8xxxu_bss_info_changed()
|
||||
|
||||
priv->vif gets already set in rtl8xxxu_add_interface, there is no need
|
||||
to set it also in rtl8xxxu_bss_info_changed().
|
||||
|
||||
Signed-off-by: Martin Kaistra <martin.kaistra@linutronix.de>
|
||||
Reviewed-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://msgid.link/20231222101442.626837-2-martin.kaistra@linutronix.de
|
||||
---
|
||||
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 1 -
|
||||
1 file changed, 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
@@ -5004,7 +5004,6 @@ rtl8xxxu_bss_info_changed(struct ieee802
|
||||
|
||||
rtl8xxxu_update_ra_report(rarpt, highest_rate, sgi, bw);
|
||||
|
||||
- priv->vif = vif;
|
||||
priv->rssi_level = RTL8XXXU_RATR_STA_INIT;
|
||||
|
||||
priv->fops->update_rate_mask(priv, ramask, 0, sgi,
|
@ -1,61 +0,0 @@
|
||||
From 2bbd7d584046038ce655e476628bb15e1460fac6 Mon Sep 17 00:00:00 2001
|
||||
From: Martin Kaistra <martin.kaistra@linutronix.de>
|
||||
Date: Fri, 22 Dec 2023 11:14:23 +0100
|
||||
Subject: [PATCH 02/21] wifi: rtl8xxxu: prepare supporting two virtual
|
||||
interfaces
|
||||
|
||||
To prepare for concurrent mode, add an array ("vifs") to rtl8xxxu_priv
|
||||
to keep track of both interfaces.
|
||||
|
||||
Keep the old priv->vif as long there are still users of it and let
|
||||
priv->vifs[0] point to the same location.
|
||||
|
||||
Signed-off-by: Martin Kaistra <martin.kaistra@linutronix.de>
|
||||
Reviewed-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://msgid.link/20231222101442.626837-3-martin.kaistra@linutronix.de
|
||||
---
|
||||
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h | 2 ++
|
||||
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 10 +++++++---
|
||||
2 files changed, 9 insertions(+), 3 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
|
||||
@@ -1897,6 +1897,8 @@ struct rtl8xxxu_priv {
|
||||
* is supported and no iface_combinations are provided.
|
||||
*/
|
||||
struct ieee80211_vif *vif;
|
||||
+
|
||||
+ struct ieee80211_vif *vifs[2];
|
||||
struct delayed_work ra_watchdog;
|
||||
struct work_struct c2hcmd_work;
|
||||
struct sk_buff_head c2hcmd_queue;
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
@@ -6569,10 +6569,12 @@ static int rtl8xxxu_add_interface(struct
|
||||
int ret;
|
||||
u8 val8;
|
||||
|
||||
- if (!priv->vif)
|
||||
+ if (!priv->vif) {
|
||||
priv->vif = vif;
|
||||
- else
|
||||
+ priv->vifs[0] = vif;
|
||||
+ } else {
|
||||
return -EOPNOTSUPP;
|
||||
+ }
|
||||
|
||||
switch (vif->type) {
|
||||
case NL80211_IFTYPE_STATION:
|
||||
@@ -6622,8 +6624,10 @@ static void rtl8xxxu_remove_interface(st
|
||||
|
||||
dev_dbg(&priv->udev->dev, "%s\n", __func__);
|
||||
|
||||
- if (priv->vif)
|
||||
+ if (priv->vif) {
|
||||
priv->vif = NULL;
|
||||
+ priv->vifs[0] = NULL;
|
||||
+ }
|
||||
}
|
||||
|
||||
static int rtl8xxxu_config(struct ieee80211_hw *hw, u32 changed)
|
@ -1,102 +0,0 @@
|
||||
From 7f444692cde83c1455682c2d0d2c9a666422b867 Mon Sep 17 00:00:00 2001
|
||||
From: Martin Kaistra <martin.kaistra@linutronix.de>
|
||||
Date: Fri, 22 Dec 2023 11:14:24 +0100
|
||||
Subject: [PATCH 03/21] wifi: rtl8xxxu: support setting linktype for both
|
||||
interfaces
|
||||
|
||||
To prepare for concurrent mode, enhance the set_linktype function to be
|
||||
able to set the linktype in the MSR register for both hardware ports.
|
||||
|
||||
Until the users of set_linktype can handle multiple interfaces, use
|
||||
port_num = 0.
|
||||
|
||||
Signed-off-by: Martin Kaistra <martin.kaistra@linutronix.de>
|
||||
Reviewed-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://msgid.link/20231222101442.626837-4-martin.kaistra@linutronix.de
|
||||
---
|
||||
.../wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 37 +++++++++++--------
|
||||
1 file changed, 22 insertions(+), 15 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
@@ -1633,33 +1633,41 @@ rtl8xxxu_gen1_set_tx_power(struct rtl8xx
|
||||
}
|
||||
|
||||
static void rtl8xxxu_set_linktype(struct rtl8xxxu_priv *priv,
|
||||
- enum nl80211_iftype linktype)
|
||||
+ enum nl80211_iftype linktype, int port_num)
|
||||
{
|
||||
- u8 val8;
|
||||
-
|
||||
- val8 = rtl8xxxu_read8(priv, REG_MSR);
|
||||
- val8 &= ~MSR_LINKTYPE_MASK;
|
||||
+ u8 val8, type;
|
||||
|
||||
switch (linktype) {
|
||||
case NL80211_IFTYPE_UNSPECIFIED:
|
||||
- val8 |= MSR_LINKTYPE_NONE;
|
||||
+ type = MSR_LINKTYPE_NONE;
|
||||
break;
|
||||
case NL80211_IFTYPE_ADHOC:
|
||||
- val8 |= MSR_LINKTYPE_ADHOC;
|
||||
+ type = MSR_LINKTYPE_ADHOC;
|
||||
break;
|
||||
case NL80211_IFTYPE_STATION:
|
||||
- val8 |= MSR_LINKTYPE_STATION;
|
||||
+ type = MSR_LINKTYPE_STATION;
|
||||
break;
|
||||
case NL80211_IFTYPE_AP:
|
||||
- val8 |= MSR_LINKTYPE_AP;
|
||||
+ type = MSR_LINKTYPE_AP;
|
||||
break;
|
||||
default:
|
||||
- goto out;
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ switch (port_num) {
|
||||
+ case 0:
|
||||
+ val8 = rtl8xxxu_read8(priv, REG_MSR) & 0x0c;
|
||||
+ val8 |= type;
|
||||
+ break;
|
||||
+ case 1:
|
||||
+ val8 = rtl8xxxu_read8(priv, REG_MSR) & 0x03;
|
||||
+ val8 |= type << 2;
|
||||
+ break;
|
||||
+ default:
|
||||
+ return;
|
||||
}
|
||||
|
||||
rtl8xxxu_write8(priv, REG_MSR, val8);
|
||||
-out:
|
||||
- return;
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -4236,7 +4244,6 @@ static int rtl8xxxu_init_device(struct i
|
||||
}
|
||||
|
||||
rtl8xxxu_set_mac(priv);
|
||||
- rtl8xxxu_set_linktype(priv, NL80211_IFTYPE_STATION);
|
||||
|
||||
/*
|
||||
* Configure initial WMAC settings
|
||||
@@ -4964,7 +4971,7 @@ rtl8xxxu_bss_info_changed(struct ieee802
|
||||
if (changed & BSS_CHANGED_ASSOC) {
|
||||
dev_dbg(dev, "Changed ASSOC: %i!\n", vif->cfg.assoc);
|
||||
|
||||
- rtl8xxxu_set_linktype(priv, vif->type);
|
||||
+ rtl8xxxu_set_linktype(priv, vif->type, 0);
|
||||
|
||||
if (vif->cfg.assoc) {
|
||||
u32 ramask;
|
||||
@@ -6610,7 +6617,7 @@ static int rtl8xxxu_add_interface(struct
|
||||
ret = -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
- rtl8xxxu_set_linktype(priv, vif->type);
|
||||
+ rtl8xxxu_set_linktype(priv, vif->type, 0);
|
||||
ether_addr_copy(priv->mac_addr, vif->addr);
|
||||
rtl8xxxu_set_mac(priv);
|
||||
|
@ -1,28 +0,0 @@
|
||||
From a047e46a7b98de384a158b25a05dc09aa7d70c5f Mon Sep 17 00:00:00 2001
|
||||
From: Martin Kaistra <martin.kaistra@linutronix.de>
|
||||
Date: Fri, 22 Dec 2023 11:14:25 +0100
|
||||
Subject: [PATCH 04/21] wifi: rtl8xxxu: 8188e: convert usage of priv->vif to
|
||||
priv->vifs[0]
|
||||
|
||||
The driver currently does not support AP or concurrent mode for 8188e,
|
||||
so just use priv->vifs[0] instead of priv->vif for now.
|
||||
|
||||
Signed-off-by: Martin Kaistra <martin.kaistra@linutronix.de>
|
||||
Reviewed-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://msgid.link/20231222101442.626837-5-martin.kaistra@linutronix.de
|
||||
---
|
||||
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188e.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188e.c
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188e.c
|
||||
@@ -1699,7 +1699,7 @@ void rtl8188e_handle_ra_tx_report2(struc
|
||||
/* We only use macid 0, so only the first item is relevant.
|
||||
* AP mode will use more of them if it's ever implemented.
|
||||
*/
|
||||
- if (!priv->vif || priv->vif->type == NL80211_IFTYPE_STATION)
|
||||
+ if (!priv->vifs[0] || priv->vifs[0]->type == NL80211_IFTYPE_STATION)
|
||||
items = 1;
|
||||
|
||||
for (macid = 0; macid < items; macid++) {
|
@ -1,72 +0,0 @@
|
||||
From 00add60cad3c9690ac0f9d4f6685f96ccd607670 Mon Sep 17 00:00:00 2001
|
||||
From: Martin Kaistra <martin.kaistra@linutronix.de>
|
||||
Date: Fri, 22 Dec 2023 11:14:26 +0100
|
||||
Subject: [PATCH 05/21] wifi: rtl8xxxu: support setting mac address register
|
||||
for both interfaces
|
||||
|
||||
To prepare for concurrent mode, enhance rtl8xxxu_set_mac() to write the
|
||||
mac address of the respective interface to REG_MACID or REG_MACID1.
|
||||
|
||||
Remove the call to rtl8xxxu_set_mac() from the init function as we set
|
||||
it in rtl8xxxu_add_interface() later anyway.
|
||||
|
||||
Until rtl8xxxu_add_interface() can handle both interfaces, call
|
||||
rtl8xxxu_set_mac() with port_num = 0.
|
||||
|
||||
Signed-off-by: Martin Kaistra <martin.kaistra@linutronix.de>
|
||||
Reviewed-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://msgid.link/20231222101442.626837-6-martin.kaistra@linutronix.de
|
||||
---
|
||||
.../wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 20 +++++++++++++------
|
||||
1 file changed, 14 insertions(+), 6 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
@@ -3580,15 +3580,25 @@ void rtl8723a_phy_lc_calibrate(struct rt
|
||||
rtl8xxxu_write8(priv, REG_TXPAUSE, 0x00);
|
||||
}
|
||||
|
||||
-static int rtl8xxxu_set_mac(struct rtl8xxxu_priv *priv)
|
||||
+static int rtl8xxxu_set_mac(struct rtl8xxxu_priv *priv, int port_num)
|
||||
{
|
||||
int i;
|
||||
u16 reg;
|
||||
|
||||
- reg = REG_MACID;
|
||||
+ switch (port_num) {
|
||||
+ case 0:
|
||||
+ reg = REG_MACID;
|
||||
+ break;
|
||||
+ case 1:
|
||||
+ reg = REG_MACID1;
|
||||
+ break;
|
||||
+ default:
|
||||
+ WARN_ONCE("%s: invalid port_num\n", __func__);
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
|
||||
for (i = 0; i < ETH_ALEN; i++)
|
||||
- rtl8xxxu_write8(priv, reg + i, priv->mac_addr[i]);
|
||||
+ rtl8xxxu_write8(priv, reg + i, priv->vifs[port_num]->addr[i]);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -4243,8 +4253,6 @@ static int rtl8xxxu_init_device(struct i
|
||||
rtl8xxxu_write32(priv, REG_HIMR, 0xffffffff);
|
||||
}
|
||||
|
||||
- rtl8xxxu_set_mac(priv);
|
||||
-
|
||||
/*
|
||||
* Configure initial WMAC settings
|
||||
*/
|
||||
@@ -6619,7 +6627,7 @@ static int rtl8xxxu_add_interface(struct
|
||||
|
||||
rtl8xxxu_set_linktype(priv, vif->type, 0);
|
||||
ether_addr_copy(priv->mac_addr, vif->addr);
|
||||
- rtl8xxxu_set_mac(priv);
|
||||
+ rtl8xxxu_set_mac(priv, 0);
|
||||
|
||||
return ret;
|
||||
}
|
@ -1,75 +0,0 @@
|
||||
From 9aa776209ca31695bead52674ad943848ccc97d5 Mon Sep 17 00:00:00 2001
|
||||
From: Martin Kaistra <martin.kaistra@linutronix.de>
|
||||
Date: Fri, 22 Dec 2023 11:14:27 +0100
|
||||
Subject: [PATCH 06/21] wifi: rtl8xxxu: extend wifi connected check to both
|
||||
interfaces
|
||||
|
||||
There are multiple places in the code where the current connection
|
||||
status of wifi is checked. The driver will support two interfaces soon
|
||||
and either one of them (or both) could be connected.
|
||||
|
||||
Convert all uses of (vif && vif->cfg.assoc) to a new helper
|
||||
function rtl8xxxu_is_assoc() which checks both interfaces.
|
||||
|
||||
Signed-off-by: Martin Kaistra <martin.kaistra@linutronix.de>
|
||||
Reviewed-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://msgid.link/20231222101442.626837-7-martin.kaistra@linutronix.de
|
||||
---
|
||||
.../wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 20 +++++++++----------
|
||||
1 file changed, 9 insertions(+), 11 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
@@ -6043,18 +6043,20 @@ void rtl8723bu_update_bt_link_info(struc
|
||||
btcoex->bt_busy = false;
|
||||
}
|
||||
|
||||
+static inline bool rtl8xxxu_is_assoc(struct rtl8xxxu_priv *priv)
|
||||
+{
|
||||
+ return (priv->vifs[0] && priv->vifs[0]->cfg.assoc) ||
|
||||
+ (priv->vifs[1] && priv->vifs[1]->cfg.assoc);
|
||||
+}
|
||||
+
|
||||
static
|
||||
void rtl8723bu_handle_bt_inquiry(struct rtl8xxxu_priv *priv)
|
||||
{
|
||||
- struct ieee80211_vif *vif;
|
||||
struct rtl8xxxu_btcoex *btcoex;
|
||||
- bool wifi_connected;
|
||||
|
||||
- vif = priv->vif;
|
||||
btcoex = &priv->bt_coex;
|
||||
- wifi_connected = (vif && vif->cfg.assoc);
|
||||
|
||||
- if (!wifi_connected) {
|
||||
+ if (!rtl8xxxu_is_assoc(priv)) {
|
||||
rtl8723bu_set_ps_tdma(priv, 0x8, 0x0, 0x0, 0x0, 0x0);
|
||||
rtl8723bu_set_coex_with_type(priv, 0);
|
||||
} else if (btcoex->has_sco || btcoex->has_hid || btcoex->has_a2dp) {
|
||||
@@ -6072,15 +6074,11 @@ void rtl8723bu_handle_bt_inquiry(struct
|
||||
static
|
||||
void rtl8723bu_handle_bt_info(struct rtl8xxxu_priv *priv)
|
||||
{
|
||||
- struct ieee80211_vif *vif;
|
||||
struct rtl8xxxu_btcoex *btcoex;
|
||||
- bool wifi_connected;
|
||||
|
||||
- vif = priv->vif;
|
||||
btcoex = &priv->bt_coex;
|
||||
- wifi_connected = (vif && vif->cfg.assoc);
|
||||
|
||||
- if (wifi_connected) {
|
||||
+ if (rtl8xxxu_is_assoc(priv)) {
|
||||
u32 val32 = 0;
|
||||
u32 high_prio_tx = 0, high_prio_rx = 0;
|
||||
|
||||
@@ -7103,7 +7101,7 @@ static void rtl8xxxu_track_cfo(struct rt
|
||||
int cfo_khz_a, cfo_khz_b, cfo_average;
|
||||
int crystal_cap;
|
||||
|
||||
- if (!priv->vif || !priv->vif->cfg.assoc) {
|
||||
+ if (!rtl8xxxu_is_assoc(priv)) {
|
||||
/* Reset */
|
||||
cfo->adjust = true;
|
||||
|
@ -1,70 +0,0 @@
|
||||
From 80fd8687db41b1e04f78c37137d090f2165cca6e Mon Sep 17 00:00:00 2001
|
||||
From: Martin Kaistra <martin.kaistra@linutronix.de>
|
||||
Date: Fri, 22 Dec 2023 11:14:28 +0100
|
||||
Subject: [PATCH 07/21] wifi: rtl8xxxu: extend check for matching bssid to both
|
||||
interfaces
|
||||
|
||||
The driver will support two interfaces soon, which both can be in
|
||||
station mode, so extend the check, whether cfo information should be
|
||||
parsed, to cover both interfaces.
|
||||
|
||||
For better code readability put the lines with priv->vifs[port_num] in a
|
||||
separate function.
|
||||
|
||||
Signed-off-by: Martin Kaistra <martin.kaistra@linutronix.de>
|
||||
Reviewed-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://msgid.link/20231222101442.626837-8-martin.kaistra@linutronix.de
|
||||
---
|
||||
.../wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 22 ++++++++++++-------
|
||||
1 file changed, 14 insertions(+), 8 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
@@ -5706,6 +5706,16 @@ static void rtl8xxxu_update_beacon_work_
|
||||
rtl8xxxu_send_beacon_frame(hw, vif);
|
||||
}
|
||||
|
||||
+static inline bool rtl8xxxu_is_packet_match_bssid(struct rtl8xxxu_priv *priv,
|
||||
+ struct ieee80211_hdr *hdr,
|
||||
+ int port_num)
|
||||
+{
|
||||
+ return priv->vifs[port_num] &&
|
||||
+ priv->vifs[port_num]->type == NL80211_IFTYPE_STATION &&
|
||||
+ priv->vifs[port_num]->cfg.assoc &&
|
||||
+ ether_addr_equal(priv->vifs[port_num]->bss_conf.bssid, hdr->addr2);
|
||||
+}
|
||||
+
|
||||
void rtl8723au_rx_parse_phystats(struct rtl8xxxu_priv *priv,
|
||||
struct ieee80211_rx_status *rx_status,
|
||||
struct rtl8723au_phy_stats *phy_stats,
|
||||
@@ -5722,12 +5732,10 @@ void rtl8723au_rx_parse_phystats(struct
|
||||
rx_status->signal = priv->fops->cck_rssi(priv, phy_stats);
|
||||
} else {
|
||||
bool parse_cfo = priv->fops->set_crystal_cap &&
|
||||
- priv->vif &&
|
||||
- priv->vif->type == NL80211_IFTYPE_STATION &&
|
||||
- priv->vif->cfg.assoc &&
|
||||
!crc_icv_err &&
|
||||
!ieee80211_is_ctl(hdr->frame_control) &&
|
||||
- ether_addr_equal(priv->vif->bss_conf.bssid, hdr->addr2);
|
||||
+ (rtl8xxxu_is_packet_match_bssid(priv, hdr, 0) ||
|
||||
+ rtl8xxxu_is_packet_match_bssid(priv, hdr, 1));
|
||||
|
||||
if (parse_cfo) {
|
||||
priv->cfo_tracking.cfo_tail[0] = phy_stats->path_cfotail[0];
|
||||
@@ -5762,12 +5770,10 @@ static void jaguar2_rx_parse_phystats_ty
|
||||
bool crc_icv_err)
|
||||
{
|
||||
bool parse_cfo = priv->fops->set_crystal_cap &&
|
||||
- priv->vif &&
|
||||
- priv->vif->type == NL80211_IFTYPE_STATION &&
|
||||
- priv->vif->cfg.assoc &&
|
||||
!crc_icv_err &&
|
||||
!ieee80211_is_ctl(hdr->frame_control) &&
|
||||
- ether_addr_equal(priv->vif->bss_conf.bssid, hdr->addr2);
|
||||
+ (rtl8xxxu_is_packet_match_bssid(priv, hdr, 0) ||
|
||||
+ rtl8xxxu_is_packet_match_bssid(priv, hdr, 1));
|
||||
u8 pwdb_max = 0;
|
||||
int rx_path;
|
||||
|
@ -1,51 +0,0 @@
|
||||
From f86dd8eaf8da84ee5b803d90b8c311d7e2725d0b Mon Sep 17 00:00:00 2001
|
||||
From: Martin Kaistra <martin.kaistra@linutronix.de>
|
||||
Date: Fri, 22 Dec 2023 11:14:29 +0100
|
||||
Subject: [PATCH 08/21] wifi: rtl8xxxu: don't parse CFO, if both interfaces are
|
||||
connected in STA mode
|
||||
|
||||
If both interfaces are in STATION mode and both are connected to an AP,
|
||||
there might be conflicting CFO values for the two connections. Ignore
|
||||
the CFO information in this case.
|
||||
|
||||
Signed-off-by: Martin Kaistra <martin.kaistra@linutronix.de>
|
||||
Reviewed-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://msgid.link/20231222101442.626837-9-martin.kaistra@linutronix.de
|
||||
---
|
||||
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 10 ++++++++++
|
||||
1 file changed, 10 insertions(+)
|
||||
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
@@ -5716,6 +5716,14 @@ static inline bool rtl8xxxu_is_packet_ma
|
||||
ether_addr_equal(priv->vifs[port_num]->bss_conf.bssid, hdr->addr2);
|
||||
}
|
||||
|
||||
+static inline bool rtl8xxxu_is_sta_sta(struct rtl8xxxu_priv *priv)
|
||||
+{
|
||||
+ return (priv->vifs[0] && priv->vifs[0]->cfg.assoc &&
|
||||
+ priv->vifs[0]->type == NL80211_IFTYPE_STATION) &&
|
||||
+ (priv->vifs[1] && priv->vifs[1]->cfg.assoc &&
|
||||
+ priv->vifs[1]->type == NL80211_IFTYPE_STATION);
|
||||
+}
|
||||
+
|
||||
void rtl8723au_rx_parse_phystats(struct rtl8xxxu_priv *priv,
|
||||
struct ieee80211_rx_status *rx_status,
|
||||
struct rtl8723au_phy_stats *phy_stats,
|
||||
@@ -5734,6 +5742,7 @@ void rtl8723au_rx_parse_phystats(struct
|
||||
bool parse_cfo = priv->fops->set_crystal_cap &&
|
||||
!crc_icv_err &&
|
||||
!ieee80211_is_ctl(hdr->frame_control) &&
|
||||
+ !rtl8xxxu_is_sta_sta(priv) &&
|
||||
(rtl8xxxu_is_packet_match_bssid(priv, hdr, 0) ||
|
||||
rtl8xxxu_is_packet_match_bssid(priv, hdr, 1));
|
||||
|
||||
@@ -5772,6 +5781,7 @@ static void jaguar2_rx_parse_phystats_ty
|
||||
bool parse_cfo = priv->fops->set_crystal_cap &&
|
||||
!crc_icv_err &&
|
||||
!ieee80211_is_ctl(hdr->frame_control) &&
|
||||
+ !rtl8xxxu_is_sta_sta(priv) &&
|
||||
(rtl8xxxu_is_packet_match_bssid(priv, hdr, 0) ||
|
||||
rtl8xxxu_is_packet_match_bssid(priv, hdr, 1));
|
||||
u8 pwdb_max = 0;
|
@ -1,67 +0,0 @@
|
||||
From 3ff7a05996f901a7a10068b42e9dc8435f908a4c Mon Sep 17 00:00:00 2001
|
||||
From: Martin Kaistra <martin.kaistra@linutronix.de>
|
||||
Date: Fri, 22 Dec 2023 11:14:30 +0100
|
||||
Subject: [PATCH 09/21] wifi: rtl8xxxu: support setting bssid register for
|
||||
multiple interfaces
|
||||
|
||||
To prepare for concurrent mode, enhance rtl8xxxu_set_bssid() to write the
|
||||
BSSID of the respective interface to REG_BSSID or REG_BSSID1.
|
||||
|
||||
Like done with rtl8xxxu_set_mac(), call rtl8xxxu_set_bssid() with
|
||||
port_num = 0, until the callers also support multiple interfaces.
|
||||
|
||||
Signed-off-by: Martin Kaistra <martin.kaistra@linutronix.de>
|
||||
Reviewed-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://msgid.link/20231222101442.626837-10-martin.kaistra@linutronix.de
|
||||
---
|
||||
.../wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 18 ++++++++++++++----
|
||||
1 file changed, 14 insertions(+), 4 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
@@ -3603,14 +3603,24 @@ static int rtl8xxxu_set_mac(struct rtl8x
|
||||
return 0;
|
||||
}
|
||||
|
||||
-static int rtl8xxxu_set_bssid(struct rtl8xxxu_priv *priv, const u8 *bssid)
|
||||
+static int rtl8xxxu_set_bssid(struct rtl8xxxu_priv *priv, const u8 *bssid, int port_num)
|
||||
{
|
||||
int i;
|
||||
u16 reg;
|
||||
|
||||
dev_dbg(&priv->udev->dev, "%s: (%pM)\n", __func__, bssid);
|
||||
|
||||
- reg = REG_BSSID;
|
||||
+ switch (port_num) {
|
||||
+ case 0:
|
||||
+ reg = REG_BSSID;
|
||||
+ break;
|
||||
+ case 1:
|
||||
+ reg = REG_BSSID1;
|
||||
+ break;
|
||||
+ default:
|
||||
+ WARN_ONCE("%s: invalid port_num\n", __func__);
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
|
||||
for (i = 0; i < ETH_ALEN; i++)
|
||||
rtl8xxxu_write8(priv, reg + i, bssid[i]);
|
||||
@@ -5068,7 +5078,7 @@ rtl8xxxu_bss_info_changed(struct ieee802
|
||||
|
||||
if (changed & BSS_CHANGED_BSSID) {
|
||||
dev_dbg(dev, "Changed BSSID!\n");
|
||||
- rtl8xxxu_set_bssid(priv, bss_conf->bssid);
|
||||
+ rtl8xxxu_set_bssid(priv, bss_conf->bssid, 0);
|
||||
}
|
||||
|
||||
if (changed & BSS_CHANGED_BASIC_RATES) {
|
||||
@@ -5097,7 +5107,7 @@ static int rtl8xxxu_start_ap(struct ieee
|
||||
struct device *dev = &priv->udev->dev;
|
||||
|
||||
dev_dbg(dev, "Start AP mode\n");
|
||||
- rtl8xxxu_set_bssid(priv, vif->bss_conf.bssid);
|
||||
+ rtl8xxxu_set_bssid(priv, vif->bss_conf.bssid, 0);
|
||||
rtl8xxxu_write16(priv, REG_BCN_INTERVAL, vif->bss_conf.beacon_int);
|
||||
priv->fops->report_connect(priv, RTL8XXXU_BC_MC_MACID, 0, true);
|
||||
|
@ -1,44 +0,0 @@
|
||||
From 43532c050f8eec4056a21978fdb5b958e1477553 Mon Sep 17 00:00:00 2001
|
||||
From: Martin Kaistra <martin.kaistra@linutronix.de>
|
||||
Date: Fri, 22 Dec 2023 11:14:31 +0100
|
||||
Subject: [PATCH 10/21] wifi: rtl8xxxu: support multiple interfaces in
|
||||
set_aifs()
|
||||
|
||||
In concurrent mode supported by this driver, both interfaces will use
|
||||
the same channel and same wireless mode.
|
||||
It is therefore possible to get the wireless mode by checking the first
|
||||
connected interface.
|
||||
|
||||
Signed-off-by: Martin Kaistra <martin.kaistra@linutronix.de>
|
||||
Reviewed-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://msgid.link/20231222101442.626837-11-martin.kaistra@linutronix.de
|
||||
---
|
||||
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 10 ++++++++--
|
||||
1 file changed, 8 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
@@ -4913,14 +4913,20 @@ static void rtl8xxxu_set_aifs(struct rtl
|
||||
u8 aifs, aifsn, sifs;
|
||||
int i;
|
||||
|
||||
- if (priv->vif) {
|
||||
+ for (i = 0; i < ARRAY_SIZE(priv->vifs); i++) {
|
||||
+ if (!priv->vifs[i])
|
||||
+ continue;
|
||||
+
|
||||
struct ieee80211_sta *sta;
|
||||
|
||||
rcu_read_lock();
|
||||
- sta = ieee80211_find_sta(priv->vif, priv->vif->bss_conf.bssid);
|
||||
+ sta = ieee80211_find_sta(priv->vifs[i], priv->vifs[i]->bss_conf.bssid);
|
||||
if (sta)
|
||||
wireless_mode = rtl8xxxu_wireless_mode(priv->hw, sta);
|
||||
rcu_read_unlock();
|
||||
+
|
||||
+ if (wireless_mode)
|
||||
+ break;
|
||||
}
|
||||
|
||||
if (priv->hw->conf.chandef.chan->band == NL80211_BAND_5GHZ ||
|
@ -1,28 +0,0 @@
|
||||
From 05b22e9b7d84253f765cde01cb09d144094b61c9 Mon Sep 17 00:00:00 2001
|
||||
From: Martin Kaistra <martin.kaistra@linutronix.de>
|
||||
Date: Fri, 22 Dec 2023 11:14:32 +0100
|
||||
Subject: [PATCH 11/21] wifi: rtl8xxxu: support multiple interfaces in
|
||||
update_beacon_work_callback()
|
||||
|
||||
As we only want to support AP mode/sending beacons on port 0, it is
|
||||
enough to replace priv->vif with priv->vifs[0].
|
||||
|
||||
Signed-off-by: Martin Kaistra <martin.kaistra@linutronix.de>
|
||||
Reviewed-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://msgid.link/20231222101442.626837-12-martin.kaistra@linutronix.de
|
||||
---
|
||||
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
@@ -5712,7 +5712,7 @@ static void rtl8xxxu_update_beacon_work_
|
||||
struct rtl8xxxu_priv *priv =
|
||||
container_of(work, struct rtl8xxxu_priv, update_beacon_work);
|
||||
struct ieee80211_hw *hw = priv->hw;
|
||||
- struct ieee80211_vif *vif = priv->vif;
|
||||
+ struct ieee80211_vif *vif = priv->vifs[0];
|
||||
|
||||
if (!vif) {
|
||||
WARN_ONCE(true, "no vif to update beacon\n");
|
@ -1,33 +0,0 @@
|
||||
From 6b76638287055791e74b32c401a39ea1b91e7158 Mon Sep 17 00:00:00 2001
|
||||
From: Martin Kaistra <martin.kaistra@linutronix.de>
|
||||
Date: Fri, 22 Dec 2023 11:14:33 +0100
|
||||
Subject: [PATCH 12/21] wifi: rtl8xxxu: support multiple interfaces in
|
||||
configure_filter()
|
||||
|
||||
As we only want to support AP mode/sending beacons on port 0, change
|
||||
from priv->vif to priv->vifs[0] in the check for AP mode.
|
||||
Additionally, if we are in AP mode, don't filter RX beacon and probe
|
||||
response frames to still allow working STATION mode on the other
|
||||
interface.
|
||||
|
||||
Signed-off-by: Martin Kaistra <martin.kaistra@linutronix.de>
|
||||
Reviewed-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://msgid.link/20231222101442.626837-13-martin.kaistra@linutronix.de
|
||||
---
|
||||
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
@@ -6794,8 +6794,8 @@ static void rtl8xxxu_configure_filter(st
|
||||
else
|
||||
rcr |= RCR_CHECK_BSSID_BEACON | RCR_CHECK_BSSID_MATCH;
|
||||
|
||||
- if (priv->vif && priv->vif->type == NL80211_IFTYPE_AP)
|
||||
- rcr &= ~RCR_CHECK_BSSID_MATCH;
|
||||
+ if (priv->vifs[0] && priv->vifs[0]->type == NL80211_IFTYPE_AP)
|
||||
+ rcr &= ~(RCR_CHECK_BSSID_MATCH | RCR_CHECK_BSSID_BEACON);
|
||||
|
||||
if (*total_flags & FIF_CONTROL)
|
||||
rcr |= RCR_ACCEPT_CTRL_FRAME;
|
@ -1,66 +0,0 @@
|
||||
From 3f9baa99f8429ea6f56e7cc8d881c027518e9573 Mon Sep 17 00:00:00 2001
|
||||
From: Martin Kaistra <martin.kaistra@linutronix.de>
|
||||
Date: Fri, 22 Dec 2023 11:14:34 +0100
|
||||
Subject: [PATCH 13/21] wifi: rtl8xxxu: support multiple interfaces in
|
||||
watchdog_callback()
|
||||
|
||||
Check first whether priv->vifs[0] exists and is of type STATION, then go
|
||||
to priv->vifs[1]. Make sure to call refresh_rate_mask for both
|
||||
interfaces.
|
||||
|
||||
Signed-off-by: Martin Kaistra <martin.kaistra@linutronix.de>
|
||||
Reviewed-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://msgid.link/20231222101442.626837-14-martin.kaistra@linutronix.de
|
||||
---
|
||||
.../wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 19 +++++++++++--------
|
||||
1 file changed, 11 insertions(+), 8 deletions(-)
|
||||
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
||||
@@ -7200,11 +7200,15 @@ static void rtl8xxxu_watchdog_callback(s
|
||||
{
|
||||
struct ieee80211_vif *vif;
|
||||
struct rtl8xxxu_priv *priv;
|
||||
+ int i;
|
||||
|
||||
priv = container_of(work, struct rtl8xxxu_priv, ra_watchdog.work);
|
||||
- vif = priv->vif;
|
||||
+ for (i = 0; i < ARRAY_SIZE(priv->vifs); i++) {
|
||||
+ vif = priv->vifs[i];
|
||||
+
|
||||
+ if (!vif || vif->type != NL80211_IFTYPE_STATION)
|
||||
+ continue;
|
||||
|
||||
- if (vif && vif->type == NL80211_IFTYPE_STATION) {
|
||||
int signal;
|
||||
struct ieee80211_sta *sta;
|
||||
|
||||
@@ -7215,22 +7219,21 @@ static void rtl8xxxu_watchdog_callback(s
|
||||
|
||||
dev_dbg(dev, "%s: no sta found\n", __func__);
|
||||
rcu_read_unlock();
|
||||
- goto out;
|
||||
+ continue;
|
||||
}
|
||||
rcu_read_unlock();
|
||||
|
||||
signal = ieee80211_ave_rssi(vif);
|
||||
|
||||
- priv->fops->report_rssi(priv, 0,
|
||||
+ priv->fops->report_rssi(priv, rtl8xxxu_get_macid(priv, sta),
|
||||
rtl8xxxu_signal_to_snr(signal));
|
||||
|
||||
- if (priv->fops->set_crystal_cap)
|
||||
- rtl8xxxu_track_cfo(priv);
|
||||
-
|
||||
rtl8xxxu_refresh_rate_mask(priv, signal, sta, false);
|
||||
}
|
||||
|
||||
-out:
|
||||
+ if (priv->fops->set_crystal_cap)
|
||||
+ rtl8xxxu_track_cfo(priv);
|
||||
+
|
||||
schedule_delayed_work(&priv->ra_watchdog, 2 * HZ);
|
||||
}
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user