From: Sven Eckelmann <sven@narfation.org>
Date: Fri, 30 Oct 2020 12:02:21 +0100
Subject: 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>
Forwarded: https://lore.kernel.org/all/1829665.1PRlr7bOQj@ripper/

diff --git a/drivers/net/wireless/ath/ath11k/core.h b/drivers/net/wireless/ath/ath11k/core.h
index 63a9f47146fe6dec0942176c04437e7900b05efe..2585518cb1a853bbae3b59af93a3bd3e1310f646 100644
--- a/drivers/net/wireless/ath/ath11k/core.h
+++ b/drivers/net/wireless/ath/ath11k/core.h
@@ -208,7 +208,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,
diff --git a/drivers/net/wireless/ath/ath11k/mac.c b/drivers/net/wireless/ath/ath11k/mac.c
index 9beda3b94da5d28af53eb25c287a24c41bc6285c..6f0d830dc7c946351b642af9444b12ed82bec558 100644
--- a/drivers/net/wireless/ath/ath11k/mac.c
+++ b/drivers/net/wireless/ath/ath11k/mac.c
@@ -9385,6 +9385,8 @@ static int __ath11k_mac_register(struct ath11k *ar)
 		goto err_free_if_combs;
 	}
 
+	set_bit(ATH11K_FLAG_REGISTERED, &ab->dev_flags);
+
 	if (!ab->hw_params.supports_monitor)
 		/* There's a race between calling ieee80211_register_hw()
 		 * and here where the monitor mode is enabled for a little
diff --git a/drivers/net/wireless/ath/ath11k/qmi.c b/drivers/net/wireless/ath/ath11k/qmi.c
index f9a8f96e7d31b404d6b47d12cc37a885fb55f764..f3dd4604db2e4c834238e306ad20194f253fe432 100644
--- a/drivers/net/wireless/ath/ath11k/qmi.c
+++ b/drivers/net/wireless/ath/ath11k/qmi.c
@@ -4465,7 +4465,7 @@ static void ath11k_qmi_driver_event_work(struct work_struct *work)
 			break;
 		case ATH11K_QMI_EVENT_FW_READY:
 			clear_bit(ATH11K_FLAG_QMI_FAIL, &ab->dev_flags);
-			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;
@@ -4487,7 +4487,7 @@ static void ath11k_qmi_driver_event_work(struct work_struct *work)
 				}
 
 				ath11k_core_qmi_firmware_ready(ab);
-				set_bit(ATH11K_FLAG_REGISTERED, &ab->dev_flags);
+				set_bit(ATH11K_FLAG_FW_READY, &ab->dev_flags);
 			}
 
 			break;
