Currently, on WCN3990, the station disconnect after hardware recovery is
not working as expected. This is because of setting the
IEEE80211_SDATA_DISCONNECT_HW_RESTART flag very early in the hardware
recovery process even before the driver invokes ieee80211_hw_restart().
On the contrary, mac80211 expects this flag to be set after
ieee80211_hw_restart() is invoked for it to trigger station disconnect.

Set the IEEE80211_SDATA_DISCONNECT_HW_RESTART flag in
ath10k_reconfig_complete() instead to fix this.

The other targets are not affected by this change, since the hardware
params flag is not set.

Tested-on: WCN3990 hw1.0 SNOC WLAN.HL.3.2.2.c10-00754-QCAHLSWMTPL-1

Fixes: 2c3fc50591ff ("ath10k: Trigger sta disconnect on hardware restart")
Signed-off-by: Youghandhar Chintala <quic_yough...@quicinc.com>
---
 drivers/net/wireless/ath/ath10k/core.c | 9 ---------
 drivers/net/wireless/ath/ath10k/mac.c  | 8 ++++++++
 2 files changed, 8 insertions(+), 9 deletions(-)

diff --git a/drivers/net/wireless/ath/ath10k/core.c 
b/drivers/net/wireless/ath/ath10k/core.c
index 533ed7169e11..6cdb225b7eac 100644
--- a/drivers/net/wireless/ath/ath10k/core.c
+++ b/drivers/net/wireless/ath/ath10k/core.c
@@ -2504,7 +2504,6 @@ EXPORT_SYMBOL(ath10k_core_napi_sync_disable);
 static void ath10k_core_restart(struct work_struct *work)
 {
        struct ath10k *ar = container_of(work, struct ath10k, restart_work);
-       struct ath10k_vif *arvif;
        int ret;
 
        set_bit(ATH10K_FLAG_CRASH_FLUSH, &ar->dev_flags);
@@ -2543,14 +2542,6 @@ static void ath10k_core_restart(struct work_struct *work)
                ar->state = ATH10K_STATE_RESTARTING;
                ath10k_halt(ar);
                ath10k_scan_finish(ar);
-               if (ar->hw_params.hw_restart_disconnect) {
-                       list_for_each_entry(arvif, &ar->arvifs, list) {
-                               if (arvif->is_up &&
-                                   arvif->vdev_type == WMI_VDEV_TYPE_STA)
-                                       
ieee80211_hw_restart_disconnect(arvif->vif);
-                       }
-               }
-
                ieee80211_restart_hw(ar->hw);
                break;
        case ATH10K_STATE_OFF:
diff --git a/drivers/net/wireless/ath/ath10k/mac.c 
b/drivers/net/wireless/ath/ath10k/mac.c
index 9c4bf2fdbc0f..ab12e3e0c515 100644
--- a/drivers/net/wireless/ath/ath10k/mac.c
+++ b/drivers/net/wireless/ath/ath10k/mac.c
@@ -8109,6 +8109,7 @@ static void ath10k_reconfig_complete(struct ieee80211_hw 
*hw,
                                     enum ieee80211_reconfig_type reconfig_type)
 {
        struct ath10k *ar = hw->priv;
+       struct ath10k_vif *arvif;
 
        if (reconfig_type != IEEE80211_RECONFIG_TYPE_RESTART)
                return;
@@ -8123,6 +8124,13 @@ static void ath10k_reconfig_complete(struct ieee80211_hw 
*hw,
                ar->state = ATH10K_STATE_ON;
                ieee80211_wake_queues(ar->hw);
                clear_bit(ATH10K_FLAG_RESTARTING, &ar->dev_flags);
+               if (ar->hw_params.hw_restart_disconnect) {
+                       list_for_each_entry(arvif, &ar->arvifs, list) {
+                               if (arvif->is_up && arvif->vdev_type == 
WMI_VDEV_TYPE_STA)
+                                       
ieee80211_hw_restart_disconnect(arvif->vif);
+                               }
+               }
+
        }
 
        mutex_unlock(&ar->conf_mutex);
-- 
2.38.0


_______________________________________________
ath10k mailing list
ath10k@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/ath10k

Reply via email to