RCU_INIT_POINTER(mvm->fw_id_to_link_sta[i], NULL);
        }
 
-       for (i = 0; i < IWL_FW_MAX_LINK_ID + 1; i++)
-               RCU_INIT_POINTER(mvm->link_id_to_link_conf[i], NULL);
-
        mvm->tdls_cs.peer.sta_id = IWL_INVALID_STA;
 
        /* reset quota debouncing buffer - 0xff will yield invalid data */
 
 #undef NAME_PR
 }
 
-static u32 iwl_mvm_get_free_fw_link_id(struct iwl_mvm *mvm,
-                                      struct iwl_mvm_vif *mvm_vif)
-{
-       u32 i;
-
-       lockdep_assert_held(&mvm->mutex);
-
-       for (i = 0; i < ARRAY_SIZE(mvm->link_id_to_link_conf); i++)
-               if (!rcu_access_pointer(mvm->link_id_to_link_conf[i]))
-                       return i;
-
-       return IWL_MVM_FW_LINK_ID_INVALID;
-}
-
 static int iwl_mvm_link_cmd_send(struct iwl_mvm *mvm,
                                 struct iwl_link_config_cmd *cmd,
                                 enum iwl_ctxt_action action)
        return ret;
 }
 
-int iwl_mvm_set_link_mapping(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
-                            struct ieee80211_bss_conf *link_conf)
+void iwl_mvm_set_link_fw_id(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
+                           struct ieee80211_bss_conf *link_conf)
 {
        struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
        struct iwl_mvm_vif_link_info *link_info =
                mvmvif->link[link_conf->link_id];
 
-       if (link_info->fw_link_id == IWL_MVM_FW_LINK_ID_INVALID) {
-               link_info->fw_link_id = iwl_mvm_get_free_fw_link_id(mvm,
-                                                                   mvmvif);
-               if (link_info->fw_link_id >=
-                   ARRAY_SIZE(mvm->link_id_to_link_conf))
-                       return -EINVAL;
-
-               rcu_assign_pointer(mvm->link_id_to_link_conf[link_info->fw_link_id],
-                                  link_conf);
-       }
-
-       return 0;
+       if (link_info->fw_link_id == IWL_MVM_FW_LINK_ID_INVALID)
+               link_info->fw_link_id = mvmvif->id;
 }
 
 int iwl_mvm_add_link(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
        struct iwl_link_config_cmd cmd = {};
        unsigned int cmd_id = WIDE_ID(MAC_CONF_GROUP, LINK_CONFIG_CMD);
        u8 cmd_ver = iwl_fw_lookup_cmd_ver(mvm->fw, cmd_id, 1);
-       int ret;
 
        if (WARN_ON_ONCE(!link_info))
                return -EINVAL;
 
-       ret = iwl_mvm_set_link_mapping(mvm, vif, link_conf);
-       if (ret)
-               return ret;
+       iwl_mvm_set_link_fw_id(mvm, vif, link_conf);
 
        /* Update SF - Disable if needed. if this fails, SF might still be on
         * while many macs are bound, which is forbidden - so fail the binding.
        return ret;
 }
 
-int iwl_mvm_unset_link_mapping(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
-                              struct ieee80211_bss_conf *link_conf)
-{
-       struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
-       struct iwl_mvm_vif_link_info *link_info =
-               mvmvif->link[link_conf->link_id];
-
-       /* mac80211 thought we have the link, but it was never configured */
-       if (WARN_ON(!link_info ||
-                   link_info->fw_link_id >=
-                   ARRAY_SIZE(mvm->link_id_to_link_conf)))
-               return -EINVAL;
-
-       RCU_INIT_POINTER(mvm->link_id_to_link_conf[link_info->fw_link_id],
-                        NULL);
-       return 0;
-}
-
 int iwl_mvm_remove_link(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
                        struct ieee80211_bss_conf *link_conf)
 {
        struct iwl_link_config_cmd cmd = {};
        int ret;
 
-       ret = iwl_mvm_unset_link_mapping(mvm, vif, link_conf);
-       if (ret)
-               return 0;
-
        cmd.link_id = cpu_to_le32(link_info->fw_link_id);
        link_info->fw_link_id = IWL_MVM_FW_LINK_ID_INVALID;
        cmd.spec_link_id = link_conf->link_id;
 
        u32 id = le32_to_cpu(mb->link_id);
        union iwl_dbg_tlv_tp_data tp_data = { .fw_pkt = pkt };
        u32 mac_type;
-       int link_id = -1;
+       int link_id;
        u8 notif_ver = iwl_fw_lookup_notif_ver(mvm->fw, LEGACY_GROUP,
                                               MISSED_BEACONS_NOTIFICATION,
                                               0);
        if (new_notif_ver)
                notif_ver = new_notif_ver;
 
-       /* before version four the ID in the notification refers to mac ID */
-       if (notif_ver < 4) {
-               vif = iwl_mvm_rcu_dereference_vif_id(mvm, id, false);
-               bss_conf = &vif->bss_conf;
-       } else {
-               bss_conf = iwl_mvm_rcu_fw_link_id_to_link_conf(mvm, id, false);
-
-               if (!bss_conf)
-                       return;
-
-               vif = bss_conf->vif;
-               link_id = bss_conf->link_id;
-       }
-
        IWL_DEBUG_INFO(mvm,
                       "missed bcn %s_id=%u, consecutive=%u (%u)\n",
                       notif_ver < 4 ? "mac" : "link",
                       le32_to_cpu(mb->consec_missed_beacons),
                       le32_to_cpu(mb->consec_missed_beacons_since_last_rx));
 
+       /*
+        * starting from version 4 the ID is link ID, but driver
+        * uses link ID == MAC ID, so always treat as MAC ID
+        */
+       vif = iwl_mvm_rcu_dereference_vif_id(mvm, id, false);
        if (!vif)
                return;
 
+       bss_conf = &vif->bss_conf;
+       link_id = bss_conf->link_id;
        mac_type = iwl_mvm_get_mac_type(vif);
 
        IWL_DEBUG_INFO(mvm, "missed beacon mac_type=%u,\n", mac_type);
        } else {
                struct iwl_channel_switch_start_notif *notif = (void *)pkt->data;
                u32 link_id = le32_to_cpu(notif->link_id);
-               struct ieee80211_bss_conf *bss_conf =
-                       iwl_mvm_rcu_fw_link_id_to_link_conf(mvm, link_id, true);
 
-               if (!bss_conf)
+               /* we use link ID == MAC ID */
+               vif = iwl_mvm_rcu_dereference_vif_id(mvm, link_id, true);
+               if (!vif)
                        goto out_unlock;
 
                id = link_id;
-               mac_link_id = bss_conf->link_id;
-               vif = bss_conf->vif;
-               csa_active = bss_conf->csa_active;
+               mac_link_id = vif->bss_conf.link_id;
+               csa_active = vif->bss_conf.csa_active;
        }
 
        mvmvif = iwl_mvm_vif_from_mac80211(vif);
 
 
        vif->driver_flags = IEEE80211_VIF_REMOVE_AP_AFTER_DISASSOC;
 
-       ret = iwl_mvm_set_link_mapping(mvm, vif, &vif->bss_conf);
-       if (ret)
-               goto out;
+       iwl_mvm_set_link_fw_id(mvm, vif, &vif->bss_conf);
 
        /*
         * Not much to do here. The stack will not allow interface
                mvm->monitor_on = false;
 
 out:
-       iwl_mvm_unset_link_mapping(mvm, vif, &vif->bss_conf);
        if (vif->type == NL80211_IFTYPE_AP ||
            vif->type == NL80211_IFTYPE_ADHOC) {
                iwl_mvm_dealloc_int_sta(mvm, &mvmvif->deflink.mcast_sta);
 
 
        struct ieee80211_vif __rcu *vif_id_to_mac[NUM_MAC_INDEX_DRIVER];
 
-       struct ieee80211_bss_conf __rcu *link_id_to_link_conf[IWL_FW_MAX_LINK_ID + 1];
-
        u8 *error_recovery_buf;
 
 #ifdef CONFIG_IWLWIFI_LEDS
                                         lockdep_is_held(&mvm->mutex));
 }
 
-static inline struct ieee80211_bss_conf *
-iwl_mvm_rcu_fw_link_id_to_link_conf(struct iwl_mvm *mvm, u8 link_id, bool rcu)
-{
-       if (IWL_FW_CHECK(mvm, link_id >= ARRAY_SIZE(mvm->link_id_to_link_conf),
-                        "erroneous FW link ID: %d\n", link_id))
-               return NULL;
-
-       if (rcu)
-               return rcu_dereference(mvm->link_id_to_link_conf[link_id]);
-
-       return rcu_dereference_protected(mvm->link_id_to_link_conf[link_id],
-                                        lockdep_is_held(&mvm->mutex));
-}
-
 static inline bool iwl_mvm_is_adaptive_dwell_supported(struct iwl_mvm *mvm)
 {
        return fw_has_api(&mvm->fw->ucode_capa,
 
 /* Links */
 void iwl_mvm_init_link(struct iwl_mvm_vif_link_info *link);
-int iwl_mvm_set_link_mapping(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
-                            struct ieee80211_bss_conf *link_conf);
+void iwl_mvm_set_link_fw_id(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
+                           struct ieee80211_bss_conf *link_conf);
 int iwl_mvm_add_link(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
                     struct ieee80211_bss_conf *link_conf);
 int iwl_mvm_link_changed(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
                         struct ieee80211_bss_conf *link_conf,
                         u32 changes, bool active);
-int iwl_mvm_unset_link_mapping(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
-                              struct ieee80211_bss_conf *link_conf);
 int iwl_mvm_remove_link(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
                        struct ieee80211_bss_conf *link_conf);
 int iwl_mvm_disable_link(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
 
        u32 rx_bytes[MAC_INDEX_AUX] = {};
        int fw_link_id;
 
-       for (fw_link_id = 0; fw_link_id < ARRAY_SIZE(mvm->link_id_to_link_conf);
+       /* driver uses link ID == MAC ID */
+       for (fw_link_id = 0; fw_link_id < ARRAY_SIZE(mvm->vif_id_to_mac);
             fw_link_id++) {
                struct iwl_stats_ntfy_per_link *link_stats;
-               struct ieee80211_bss_conf *bss_conf;
-               struct iwl_mvm_vif *mvmvif;
                struct iwl_mvm_vif_link_info *link_info;
+               struct iwl_mvm_vif *mvmvif;
+               struct ieee80211_vif *vif;
                int link_id;
                int sig;
 
-               bss_conf = iwl_mvm_rcu_fw_link_id_to_link_conf(mvm, fw_link_id,
-                                                              false);
-               if (!bss_conf)
+               vif = iwl_mvm_rcu_dereference_vif_id(mvm, fw_link_id, false);
+               if (!vif)
                        continue;
 
-               if (bss_conf->vif->type != NL80211_IFTYPE_STATION)
+               if (vif->type != NL80211_IFTYPE_STATION)
                        continue;
 
-               link_id = bss_conf->link_id;
+               link_id = vif->bss_conf.link_id;
                if (link_id >= ARRAY_SIZE(mvmvif->link))
                        continue;
 
-               mvmvif = iwl_mvm_vif_from_mac80211(bss_conf->vif);
+               mvmvif = iwl_mvm_vif_from_mac80211(vif);
                link_info = mvmvif->link[link_id];
                if (!link_info)
                        continue;
 
                if (link_info->phy_ctxt &&
                    link_info->phy_ctxt->channel->band == NL80211_BAND_2GHZ)
-                       iwl_mvm_bt_coex_update_link_esr(mvm, bss_conf->vif,
-                                                       link_id);
+                       iwl_mvm_bt_coex_update_link_esr(mvm, vif, link_id);
 
                /* make sure that beacon statistics don't go backwards with TCM
                 * request to clear statistics
                                mvmvif->link[link_id]->beacon_stats.num_beacons;
 
                sig = -le32_to_cpu(link_stats->beacon_filter_average_energy);
-               iwl_mvm_update_link_sig(bss_conf->vif, sig, link_info,
-                                       bss_conf);
+               iwl_mvm_update_link_sig(vif, sig, link_info, &vif->bss_conf);
 
                if (WARN_ONCE(mvmvif->id >= MAC_INDEX_AUX,
                              "invalid mvmvif id: %d", mvmvif->id))
 
 {
        struct iwl_rx_packet *pkt = rxb_addr(rxb);
        struct iwl_session_prot_notif *notif = (void *)pkt->data;
-       unsigned int ver =
-               iwl_fw_lookup_notif_ver(mvm->fw, MAC_CONF_GROUP,
-                                       SESSION_PROTECTION_NOTIF, 2);
        int id = le32_to_cpu(notif->mac_link_id);
        struct ieee80211_vif *vif;
        struct iwl_mvm_vif *mvmvif;
-       unsigned int notif_link_id;
 
        rcu_read_lock();
 
-       if (ver <= 2) {
-               vif = iwl_mvm_rcu_dereference_vif_id(mvm, id, true);
-       } else {
-               struct ieee80211_bss_conf *link_conf =
-                       iwl_mvm_rcu_fw_link_id_to_link_conf(mvm, id, true);
-
-               if (!link_conf)
-                       goto out_unlock;
-
-               notif_link_id = link_conf->link_id;
-               vif = link_conf->vif;
-       }
-
+       /* note we use link ID == MAC ID */
+       vif = iwl_mvm_rcu_dereference_vif_id(mvm, id, true);
        if (!vif)
                goto out_unlock;
 
        mvmvif = iwl_mvm_vif_from_mac80211(vif);
 
-       if (WARN(ver > 2 && mvmvif->time_event_data.link_id >= 0 &&
-                mvmvif->time_event_data.link_id != notif_link_id,
-                "SESSION_PROTECTION_NOTIF was received for link %u, while the current time event is on link %u\n",
-                notif_link_id, mvmvif->time_event_data.link_id))
-               goto out_unlock;
-
        /* The vif is not a P2P_DEVICE, maintain its time_event_data */
        if (vif->type != NL80211_IFTYPE_P2P_DEVICE) {
                struct iwl_mvm_time_event_data *te_data =