>From 931e5eb59e64804f3a90598b26c56643c43deb35 Mon Sep 17 00:00:00 2001
From: Sven Eckelmann <sven@narfation.org>
Date: Fri, 30 Oct 2020 12:02:21 +0100
Subject: [RFC PATCH] ath11k: Accept new regdomain during initialization
The driver is registering as iee80211_hw with its OPs and is then able to
be called by the upper layer. This for example happens early in the phase
when the correct regulary domain should be set. But the regulary domain
will only be accepted when the ATH11K_FLAG_REGISTERED flag was set after
the ATH11K_QMI_EVENT_FW_READY was processed. So it can easily happen that
the regularly domain is not correctly processed when
ATH11K_QMI_EVENT_FW_READY isn't handled immediately:
$ iw reg set CA
$ iw reg get|grep country
country CA: DFS-FCC
country CA: DFS-FCC
country CA: DFS-FCC
$ echo "c000000.wifi1" > /sys/bus/platform/drivers/ath11k/unbind
$ echo "c000000.wifi1" > /sys/bus/platform/drivers/ath11k/bind
$ iw reg get|grep country
country CA: DFS-FCC
country US: DFS-FCC
country US: DFS-FCC
It is therefore essential to accept the regulatory changes without having
seen the ATH11K_QMI_EVENT_FW_READY. And since there are also potentially
more problems in ath11k_debug_pdev_create, ath11k_mac_register and
ath11k_mac_allocate with their use of ATH11K_FLAG_REGISTERED, it is better
to move the ATH11K_QMI_EVENT_FW_READY. to a new flag.
Tested with WLAN.HK.2.4.0.1.r1-00019-QCAHKSWPL_SILICONZ-1
Fixes: d5c65159f289 ("ath11k: driver for Qualcomm IEEE 802.11ax devices")
Signed-off-by: Sven Eckelmann <sven@narfation.org>
---
drivers/net/wireless/ath/ath11k/core.h | 2 +-
drivers/net/wireless/ath/ath11k/mac.c | 2 ++
drivers/net/wireless/ath/ath11k/qmi.c | 4 ++--
3 files changed, 5 insertions(+), 3 deletions(-)
@@ -170,7 +170,7 @@ enum ath11k_scan_state {
enum ath11k_dev_flags {
ATH11K_CAC_RUNNING,
- ATH11K_FLAG_CORE_REGISTERED,
+ ATH11K_FLAG_FW_READY,
ATH11K_FLAG_CRASH_FLUSH,
ATH11K_FLAG_RAW_MODE,
ATH11K_FLAG_HW_CRYPTO_DISABLED,
@@ -6280,6 +6280,8 @@ static int __ath11k_mac_register(struct ath11k *ar)
*/
ar->hw->wiphy->interface_modes &= ~BIT(NL80211_IFTYPE_MONITOR);
+ set_bit(ATH11K_FLAG_REGISTERED, &ab->dev_flags);
+
/* Apply the regd received during initialization */
ret = ath11k_regd_update(ar, true);
if (ret) {
@@ -2612,7 +2612,7 @@ static void ath11k_qmi_driver_event_work(struct work_struct *work)
ath11k_qmi_event_load_bdf(qmi);
break;
case ATH11K_QMI_EVENT_FW_READY:
- if (test_bit(ATH11K_FLAG_REGISTERED, &ab->dev_flags)) {
+ if (test_bit(ATH11K_FLAG_FW_READY, &ab->dev_flags)) {
ath11k_hal_dump_srng_stats(ab);
queue_work(ab->workqueue, &ab->restart_work);
break;
@@ -2620,7 +2620,7 @@ static void ath11k_qmi_driver_event_work(struct work_struct *work)
ath11k_core_qmi_firmware_ready(ab);
ab->qmi.cal_done = 1;
- set_bit(ATH11K_FLAG_REGISTERED, &ab->dev_flags);
+ set_bit(ATH11K_FLAG_FW_READY, &ab->dev_flags);
break;
case ATH11K_QMI_EVENT_COLD_BOOT_CAL_DONE:
--
2.28.0