/* For counting bound interfaces */
 struct iwl_mvm_active_iface_iterator_data {
        struct ieee80211_vif *ignore_vif;
-       u8 sta_vif_ap_sta_id;
+       struct ieee80211_sta *sta_vif_ap_sta;
        enum iwl_sf_state sta_vif_state;
        u32 num_active_macs;
 };
        data->num_active_macs++;
 
        if (vif->type == NL80211_IFTYPE_STATION) {
-               data->sta_vif_ap_sta_id = mvmvif->deflink.ap_sta_id;
+               data->sta_vif_ap_sta = mvmvif->ap_sta;
                if (vif->cfg.assoc)
                        data->sta_vif_state = SF_FULL_ON;
                else
        }
 }
 
-static int iwl_mvm_sf_config(struct iwl_mvm *mvm, u8 sta_id,
+static int iwl_mvm_sf_config(struct iwl_mvm *mvm, struct ieee80211_sta *sta,
                             enum iwl_sf_state new_state)
 {
        struct iwl_sf_cfg_cmd sf_cmd = {
                .state = cpu_to_le32(new_state),
        };
-       struct ieee80211_sta *sta;
        int ret = 0;
 
        if (mvm->cfg->disable_dummy_notification)
                iwl_mvm_fill_sf_command(mvm, &sf_cmd, NULL);
                break;
        case SF_FULL_ON:
-               if (sta_id == IWL_MVM_INVALID_STA) {
+               if (!sta) {
                        IWL_ERR(mvm,
                                "No station: Cannot switch SF to FULL_ON\n");
                        return -EINVAL;
                }
-               rcu_read_lock();
-               sta = rcu_dereference(mvm->fw_id_to_mac_id[sta_id]);
-               if (IS_ERR_OR_NULL(sta)) {
-                       IWL_ERR(mvm, "Invalid station id\n");
-                       rcu_read_unlock();
-                       return -EINVAL;
-               }
                iwl_mvm_fill_sf_command(mvm, &sf_cmd, sta);
-               rcu_read_unlock();
                break;
        case SF_INIT_OFF:
                iwl_mvm_fill_sf_command(mvm, &sf_cmd, NULL);
                      bool remove_vif)
 {
        enum iwl_sf_state new_state;
-       u8 sta_id = IWL_MVM_INVALID_STA;
        struct iwl_mvm_vif *mvmvif = NULL;
        struct iwl_mvm_active_iface_iterator_data data = {
                .ignore_vif = changed_vif,
                .sta_vif_state = SF_UNINIT,
-               .sta_vif_ap_sta_id = IWL_MVM_INVALID_STA,
        };
+       struct ieee80211_sta *sta = NULL;
 
        /*
         * Ignore the call if we are in HW Restart flow, or if the handled
                         * and we filled the relevant data during iteration
                         */
                        new_state = data.sta_vif_state;
-                       sta_id = data.sta_vif_ap_sta_id;
+                       sta = data.sta_vif_ap_sta;
                } else {
                        if (WARN_ON(!changed_vif))
                                return -EINVAL;
                        } else if (changed_vif->cfg.assoc &&
                                   changed_vif->bss_conf.dtim_period) {
                                mvmvif = iwl_mvm_vif_from_mac80211(changed_vif);
-                               sta_id = mvmvif->deflink.ap_sta_id;
+                               sta = mvmvif->ap_sta;
                                new_state = SF_FULL_ON;
                        } else {
                                new_state = SF_INIT_OFF;
                new_state = SF_UNINIT;
        }
 
-       /* For MLO it's ok to use deflink->sta_id as it's needed only to get
-        * a pointer to mac80211 sta
-        */
-       return iwl_mvm_sf_config(mvm, sta_id, new_state);
+       return iwl_mvm_sf_config(mvm, sta, new_state);
 }