wifi: iwlwifi: mvm: disconnect station vifs if recovery failed
authorEmmanuel Grumbach <emmanuel.grumbach@intel.com>
Sun, 28 Jan 2024 06:53:56 +0000 (08:53 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Fri, 2 Feb 2024 12:47:46 +0000 (13:47 +0100)
This will allow to reconnect immediately instead of leaving the
connection in a limbo state.

Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
Reviewed-by: Gregory Greenman <gregory.greenman@intel.com>
Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com>
Link: https://msgid.link/20240128084842.e90531cd3a36.Iebdc9483983c0d8497f9dcf9d79ec37332a5fdcc@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
drivers/net/wireless/intel/iwlwifi/mvm/fw.c

index b6acf4a..1750241 100644 (file)
@@ -1504,6 +1504,13 @@ void iwl_mvm_get_acpi_tables(struct iwl_mvm *mvm)
 
 #endif /* CONFIG_ACPI */
 
+static void iwl_mvm_disconnect_iterator(void *data, u8 *mac,
+                                       struct ieee80211_vif *vif)
+{
+       if (vif->type == NL80211_IFTYPE_STATION)
+               ieee80211_hw_restart_disconnect(vif);
+}
+
 void iwl_mvm_send_recovery_cmd(struct iwl_mvm *mvm, u32 flags)
 {
        u32 error_log_size = mvm->fw->ucode_capa.error_log_size;
@@ -1548,10 +1555,15 @@ void iwl_mvm_send_recovery_cmd(struct iwl_mvm *mvm, u32 flags)
        /* skb respond is only relevant in ERROR_RECOVERY_UPDATE_DB */
        if (flags & ERROR_RECOVERY_UPDATE_DB) {
                resp = le32_to_cpu(*(__le32 *)host_cmd.resp_pkt->data);
-               if (resp)
+               if (resp) {
                        IWL_ERR(mvm,
                                "Failed to send recovery cmd blob was invalid %d\n",
                                resp);
+
+                       ieee80211_iterate_interfaces(mvm->hw, 0,
+                                                    iwl_mvm_disconnect_iterator,
+                                                    mvm);
+               }
        }
 }