wifi: iwlwifi: mvm: assign link STA ID lookups during restart
authorBenjamin Berg <benjamin.berg@intel.com>
Wed, 20 Mar 2024 21:26:24 +0000 (23:26 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Mon, 25 Mar 2024 14:39:53 +0000 (15:39 +0100)
When restarting the HW, mac80211 first adds the STA back with only one
link enabled. This means that iwl_mvm_alloc_sta_after_restart will not
see the other links and will not do the assignment.

As such, do the assignment when mac80211 is activating the link for the
station.

Signed-off-by: Benjamin Berg <benjamin.berg@intel.com>
Reviewed-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com>
Link: https://msgid.link/20240320232419.4a3273e5c6be.I7cb6cf096ab135f4b489f2806b116563624aa5ee@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
drivers/net/wireless/intel/iwlwifi/mvm/mld-sta.c

index 6f9ba0c18fa38f07e2582c96ee75d970ed2aa21d..74813342b803adedaa85b64532a3037b2a2486e1 100644 (file)
@@ -1117,10 +1117,21 @@ int iwl_mvm_mld_update_sta_links(struct iwl_mvm *mvm,
                }
 
                if (test_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status)) {
-                       if (WARN_ON(!mvm_sta->link[link_id])) {
+                       struct iwl_mvm_link_sta *mvm_link_sta =
+                               rcu_dereference_protected(mvm_sta->link[link_id],
+                                                         lockdep_is_held(&mvm->mutex));
+                       u32 sta_id;
+
+                       if (WARN_ON(!mvm_link_sta)) {
                                ret = -EINVAL;
                                goto err;
                        }
+
+                       sta_id = mvm_link_sta->sta_id;
+
+                       rcu_assign_pointer(mvm->fw_id_to_mac_id[sta_id], sta);
+                       rcu_assign_pointer(mvm->fw_id_to_link_sta[sta_id],
+                                          link_sta);
                } else {
                        if (WARN_ON(mvm_sta->link[link_id])) {
                                ret = -EINVAL;