static int ath12k_start_vdev_delay(struct ath12k *ar,
                                   struct ath12k_link_vif *arvif);
 static void ath12k_mac_stop(struct ath12k *ar);
-static int ath12k_mac_vdev_create(struct ath12k *ar, struct ieee80211_vif *vif);
-static int ath12k_mac_vdev_delete(struct ath12k *ar, struct ieee80211_vif *vif);
+static int ath12k_mac_vdev_create(struct ath12k *ar, struct ath12k_link_vif *arvif);
+static int ath12k_mac_vdev_delete(struct ath12k *ar, struct ath12k_link_vif *arvif);
 
 static const char *ath12k_mac_phymode_str(enum wmi_phy_mode mode)
 {
 }
 
 static void ath12k_peer_assoc_h_basic(struct ath12k *ar,
-                                     struct ieee80211_vif *vif,
+                                     struct ath12k_link_vif *arvif,
                                      struct ieee80211_sta *sta,
                                      struct ath12k_wmi_peer_assoc_arg *arg)
 {
-       struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
+       struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
        struct ieee80211_hw *hw = ath12k_ar_to_hw(ar);
-       struct ath12k_link_vif *arvif;
        u32 aid;
 
        lockdep_assert_wiphy(hw->wiphy);
 
-       arvif = &ahvif->deflink;
        if (vif->type == NL80211_IFTYPE_STATION)
                aid = vif->cfg.aid;
        else
 }
 
 static void ath12k_peer_assoc_h_crypto(struct ath12k *ar,
-                                      struct ieee80211_vif *vif,
+                                      struct ath12k_link_vif *arvif,
                                       struct ieee80211_sta *sta,
                                       struct ath12k_wmi_peer_assoc_arg *arg)
 {
-       struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
+       struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
        struct ieee80211_bss_conf *info = &vif->bss_conf;
-       struct ath12k_link_vif *arvif;
        struct cfg80211_chan_def def;
        struct cfg80211_bss *bss;
        struct ieee80211_hw *hw = ath12k_ar_to_hw(ar);
 
        lockdep_assert_wiphy(hw->wiphy);
 
-       arvif = &ahvif->deflink;
        if (WARN_ON(ath12k_mac_vif_chan(vif, &def)))
                return;
 
 }
 
 static void ath12k_peer_assoc_h_rates(struct ath12k *ar,
-                                     struct ieee80211_vif *vif,
+                                     struct ath12k_link_vif *arvif,
                                      struct ieee80211_sta *sta,
                                      struct ath12k_wmi_peer_assoc_arg *arg)
 {
-       struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
+       struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
        struct wmi_rate_set_arg *rateset = &arg->peer_legacy_rates;
        struct cfg80211_chan_def def;
        const struct ieee80211_supported_band *sband;
        const struct ieee80211_rate *rates;
        struct ieee80211_hw *hw = ath12k_ar_to_hw(ar);
-       struct ath12k_link_vif *arvif;
        enum nl80211_band band;
        u32 ratemask;
        u8 rate;
 
        lockdep_assert_wiphy(hw->wiphy);
 
-       arvif = &ahvif->deflink;
        if (WARN_ON(ath12k_mac_vif_chan(vif, &def)))
                return;
 
 }
 
 static void ath12k_peer_assoc_h_ht(struct ath12k *ar,
-                                  struct ieee80211_vif *vif,
+                                  struct ath12k_link_vif *arvif,
                                   struct ieee80211_sta *sta,
                                   struct ath12k_wmi_peer_assoc_arg *arg)
 {
-       struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
+       struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
        const struct ieee80211_sta_ht_cap *ht_cap = &sta->deflink.ht_cap;
-       struct ath12k_link_vif *arvif;
        struct cfg80211_chan_def def;
        enum nl80211_band band;
        const u8 *ht_mcs_mask;
 
        lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
 
-       arvif = &ahvif->deflink;
        if (WARN_ON(ath12k_mac_vif_chan(vif, &def)))
                return;
 
 }
 
 static void ath12k_peer_assoc_h_vht(struct ath12k *ar,
-                                   struct ieee80211_vif *vif,
+                                   struct ath12k_link_vif *arvif,
                                    struct ieee80211_sta *sta,
                                    struct ath12k_wmi_peer_assoc_arg *arg)
 {
-       struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
+       struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
        const struct ieee80211_sta_vht_cap *vht_cap = &sta->deflink.vht_cap;
-       struct ath12k_link_vif *arvif;
        struct cfg80211_chan_def def;
        enum nl80211_band band;
        const u16 *vht_mcs_mask;
 
        lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
 
-       arvif = &ahvif->deflink;
-
        if (WARN_ON(ath12k_mac_vif_chan(vif, &def)))
                return;
 
 }
 
 static void ath12k_peer_assoc_h_he(struct ath12k *ar,
-                                  struct ieee80211_vif *vif,
+                                  struct ath12k_link_vif *arvif,
                                   struct ieee80211_sta *sta,
                                   struct ath12k_wmi_peer_assoc_arg *arg)
 {
+       struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
        const struct ieee80211_sta_he_cap *he_cap = &sta->deflink.he_cap;
        int i;
        u8 ampdu_factor, max_nss;
 }
 
 static void ath12k_peer_assoc_h_he_6ghz(struct ath12k *ar,
-                                       struct ieee80211_vif *vif,
+                                       struct ath12k_link_vif *arvif,
                                        struct ieee80211_sta *sta,
                                        struct ath12k_wmi_peer_assoc_arg *arg)
 {
        const struct ieee80211_sta_he_cap *he_cap = &sta->deflink.he_cap;
+       struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
        struct cfg80211_chan_def def;
        enum nl80211_band band;
        u8 ampdu_factor, mpdu_density;
 }
 
 static void ath12k_peer_assoc_h_qos(struct ath12k *ar,
-                                   struct ieee80211_vif *vif,
+                                   struct ath12k_link_vif *arvif,
                                    struct ieee80211_sta *sta,
                                    struct ath12k_wmi_peer_assoc_arg *arg)
 {
-       struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
-
-       switch (ahvif->vdev_type) {
+       switch (arvif->ahvif->vdev_type) {
        case WMI_VDEV_TYPE_AP:
                if (sta->wme) {
                        /* TODO: Check WME vs QoS */
 }
 
 static void ath12k_peer_assoc_h_phymode(struct ath12k *ar,
-                                       struct ieee80211_vif *vif,
+                                       struct ath12k_link_vif *arvif,
                                        struct ieee80211_sta *sta,
                                        struct ath12k_wmi_peer_assoc_arg *arg)
 {
        const u8 *ht_mcs_mask;
        const u16 *vht_mcs_mask;
        enum wmi_phy_mode phymode = MODE_UNKNOWN;
-       struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
-       struct ath12k_link_vif *arvif;
 
        lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
 
-       arvif = &ahvif->deflink;
+       struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
+
        if (WARN_ON(ath12k_mac_vif_chan(vif, &def)))
                return;
 
 }
 
 static void ath12k_peer_assoc_h_eht(struct ath12k *ar,
-                                   struct ieee80211_vif *vif,
+                                   struct ath12k_link_vif *arvif,
                                    struct ieee80211_sta *sta,
                                    struct ath12k_wmi_peer_assoc_arg *arg)
 {
-       struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
        const struct ieee80211_sta_eht_cap *eht_cap = &sta->deflink.eht_cap;
        const struct ieee80211_sta_he_cap *he_cap = &sta->deflink.he_cap;
        const struct ieee80211_eht_mcs_nss_supp_20mhz_only *bw_20;
        const struct ieee80211_eht_mcs_nss_supp_bw *bw;
-       struct ath12k_link_vif *arvif;
        u32 *rx_mcs, *tx_mcs;
 
        lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
 
-       arvif = &ahvif->deflink;
        if (!sta->deflink.he_cap.has_he || !eht_cap->has_eht)
                return;
 
 }
 
 static void ath12k_peer_assoc_prepare(struct ath12k *ar,
-                                     struct ieee80211_vif *vif,
+                                     struct ath12k_link_vif *arvif,
                                      struct ieee80211_sta *sta,
                                      struct ath12k_wmi_peer_assoc_arg *arg,
                                      bool reassoc)
        reinit_completion(&ar->peer_assoc_done);
 
        arg->peer_new_assoc = !reassoc;
-       ath12k_peer_assoc_h_basic(ar, vif, sta, arg);
-       ath12k_peer_assoc_h_crypto(ar, vif, sta, arg);
-       ath12k_peer_assoc_h_rates(ar, vif, sta, arg);
-       ath12k_peer_assoc_h_ht(ar, vif, sta, arg);
-       ath12k_peer_assoc_h_vht(ar, vif, sta, arg);
-       ath12k_peer_assoc_h_he(ar, vif, sta, arg);
-       ath12k_peer_assoc_h_he_6ghz(ar, vif, sta, arg);
-       ath12k_peer_assoc_h_eht(ar, vif, sta, arg);
-       ath12k_peer_assoc_h_qos(ar, vif, sta, arg);
-       ath12k_peer_assoc_h_phymode(ar, vif, sta, arg);
+       ath12k_peer_assoc_h_basic(ar, arvif, sta, arg);
+       ath12k_peer_assoc_h_crypto(ar, arvif, sta, arg);
+       ath12k_peer_assoc_h_rates(ar, arvif, sta, arg);
+       ath12k_peer_assoc_h_ht(ar, arvif, sta, arg);
+       ath12k_peer_assoc_h_vht(ar, arvif, sta, arg);
+       ath12k_peer_assoc_h_he(ar, arvif, sta, arg);
+       ath12k_peer_assoc_h_he_6ghz(ar, arvif, sta, arg);
+       ath12k_peer_assoc_h_eht(ar, arvif, sta, arg);
+       ath12k_peer_assoc_h_qos(ar, arvif, sta, arg);
+       ath12k_peer_assoc_h_phymode(ar, arvif, sta, arg);
        ath12k_peer_assoc_h_smps(sta, arg);
 
        /* TODO: amsdu_disable req? */
                return;
        }
 
-       ath12k_peer_assoc_prepare(ar, vif, ap_sta, &peer_arg, false);
+       ath12k_peer_assoc_prepare(ar, arvif, ap_sta, &peer_arg, false);
 
        rcu_read_unlock();
 
 }
 
 static void ath12k_recalculate_mgmt_rate(struct ath12k *ar,
-                                        struct ieee80211_vif *vif,
+                                        struct ath12k_link_vif *arvif,
                                         struct cfg80211_chan_def *def)
 {
-       struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
+       struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
        struct ieee80211_hw *hw = ath12k_ar_to_hw(ar);
        const struct ieee80211_supported_band *sband;
-       struct ath12k_link_vif *arvif;
        u8 basic_rate_idx;
        int hw_rate_code;
        u32 vdev_param;
 
        lockdep_assert_wiphy(hw->wiphy);
 
-       arvif = &ahvif->deflink;
        sband = hw->wiphy->bands[def->chan->band];
        basic_rate_idx = ffs(vif->bss_conf.basic_rates) - 1;
        bitrate = sband->bitrates[basic_rate_idx].bitrate;
 
        if (changed & BSS_CHANGED_BASIC_RATES &&
            !ath12k_mac_vif_chan(vif, &def))
-               ath12k_recalculate_mgmt_rate(ar, vif, &def);
+               ath12k_recalculate_mgmt_rate(ar, arvif, &def);
 
        if (changed & BSS_CHANGED_TWT) {
                if (info->twt_requester || info->twt_responder)
                         * would assign the arvif->ar to NULL after the call
                         */
                        prev_ar = arvif->ar;
-                       ret = ath12k_mac_vdev_delete(prev_ar, vif);
+                       ret = ath12k_mac_vdev_delete(prev_ar, arvif);
                        if (ret)
                                ath12k_warn(prev_ar->ab,
                                            "unable to delete scan vdev %d\n", ret);
                }
        }
        if (create) {
-               ret = ath12k_mac_vdev_create(ar, vif);
+               ret = ath12k_mac_vdev_create(ar, arvif);
                if (ret) {
                        ath12k_warn(ar->ab, "unable to create scan vdev %d\n", ret);
                        return -EINVAL;
 }
 
 static int ath12k_mac_set_key(struct ath12k *ar, enum set_key_cmd cmd,
-                             struct ieee80211_vif *vif, struct ieee80211_sta *sta,
+                             struct ath12k_link_vif *arvif, struct ieee80211_sta *sta,
                              struct ieee80211_key_conf *key)
 {
-       struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
+       struct ath12k_vif *ahvif = arvif->ahvif;
+       struct ieee80211_vif *vif = ath12k_ahvif_to_vif(ahvif);
        struct ath12k_base *ab = ar->ab;
-       struct ath12k_link_vif *arvif;
        struct ath12k_peer *peer;
        struct ath12k_sta *arsta;
        const u8 *peer_addr;
 
        lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
 
-       arvif = &ahvif->deflink;
        if (test_bit(ATH12K_FLAG_HW_CRYPTO_DISABLED, &ab->dev_flags))
                return 1;
 
         * should be use based on link id passed from mac80211 and such link
         * access needs to be protected with ah->conf_mutex.
         */
-       ret = ath12k_mac_set_key(ar, cmd, vif, sta, key);
+       ret = ath12k_mac_set_key(ar, cmd, arvif, sta, key);
 
        return ret;
 }
 }
 
 static int ath12k_station_assoc(struct ath12k *ar,
-                               struct ieee80211_vif *vif,
+                               struct ath12k_link_vif *arvif,
                                struct ieee80211_sta *sta,
                                bool reassoc)
 {
-       struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
+       struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
        struct ath12k_wmi_peer_assoc_arg peer_arg;
        int ret;
        struct cfg80211_chan_def def;
        enum nl80211_band band;
-       struct ath12k_link_vif *arvif;
        struct cfg80211_bitrate_mask *mask;
        u8 num_vht_rates;
 
        lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
 
-       arvif = &ahvif->deflink;
        if (WARN_ON(ath12k_mac_vif_chan(vif, &def)))
                return -EPERM;
 
        band = def.chan->band;
        mask = &arvif->bitrate_mask;
 
-       ath12k_peer_assoc_prepare(ar, vif, sta, &peer_arg, reassoc);
+       ath12k_peer_assoc_prepare(ar, arvif, sta, &peer_arg, reassoc);
 
        if (peer_arg.peer_nss < 1) {
                ath12k_warn(ar->ab,
 }
 
 static int ath12k_station_disassoc(struct ath12k *ar,
-                                  struct ieee80211_vif *vif,
+                                  struct ath12k_link_vif *arvif,
                                   struct ieee80211_sta *sta)
 {
-       struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
-       struct ath12k_link_vif *arvif;
        int ret;
 
        lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
 
-       arvif = &ahvif->deflink;
        if (!sta->wme) {
                arvif->num_legacy_stations--;
                ret = ath12k_recalc_rtscts_prot(arvif);
                           ath12k_mac_max_vht_nss(vht_mcs_mask)));
 
        if (changed & IEEE80211_RC_BW_CHANGED) {
-               ath12k_peer_assoc_h_phymode(ar, vif, sta, &peer_arg);
+               ath12k_peer_assoc_h_phymode(ar, arvif, sta, &peer_arg);
                peer_phymode = peer_arg.peer_phymode;
 
                if (bw > bw_prev) {
                         * is provided in the new bitrate mask we set the
                         * other rates using peer_assoc command.
                         */
-                       ath12k_peer_assoc_prepare(ar, vif, sta,
+                       ath12k_peer_assoc_prepare(ar, arvif, sta,
                                                  &peer_arg, true);
 
                        err = ath12k_wmi_send_peer_assoc_cmd(ar, &peer_arg);
 }
 
 static int ath12k_mac_station_add(struct ath12k *ar,
-                                 struct ieee80211_vif *vif,
+                                 struct ath12k_link_vif *arvif,
                                  struct ieee80211_sta *sta)
 {
        struct ath12k_base *ab = ar->ab;
-       struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
+       struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
        struct ath12k_sta *arsta = ath12k_sta_to_arsta(sta);
        struct ath12k_wmi_peer_create_arg peer_param;
-       struct ath12k_link_vif *arvif;
        int ret;
 
        lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
 
-       arvif = &ahvif->deflink;
        ret = ath12k_mac_inc_num_stations(arvif, sta);
        if (ret) {
                ath12k_warn(ab, "refusing to associate station: too many connected already (%d)\n",
                arsta->arvif = arvif;
                wiphy_work_init(&arsta->update_wk, ath12k_sta_rc_update_wk);
 
-               ret = ath12k_mac_station_add(ar, vif, sta);
+               ret = ath12k_mac_station_add(ar, arvif, sta);
                if (ret)
                        ath12k_warn(ar->ab, "Failed to add station: %pM for VDEV: %d\n",
                                    sta->addr, arvif->vdev_id);
                   (vif->type == NL80211_IFTYPE_AP ||
                    vif->type == NL80211_IFTYPE_MESH_POINT ||
                    vif->type == NL80211_IFTYPE_ADHOC)) {
-               ret = ath12k_station_assoc(ar, vif, sta, false);
+               ret = ath12k_station_assoc(ar, arvif, sta, false);
                if (ret)
                        ath12k_warn(ar->ab, "Failed to associate station: %pM\n",
                                    sta->addr);
                   (vif->type == NL80211_IFTYPE_AP ||
                    vif->type == NL80211_IFTYPE_MESH_POINT ||
                    vif->type == NL80211_IFTYPE_ADHOC)) {
-               ret = ath12k_station_disassoc(ar, vif, sta);
+               ret = ath12k_station_disassoc(ar, arvif, sta);
                if (ret)
                        ath12k_warn(ar->ab, "Failed to disassociate station: %pM\n",
                                    sta->addr);
        ath12k_mac_update_vif_offload(&ahvif->deflink);
 }
 
-int ath12k_mac_vdev_create(struct ath12k *ar, struct ieee80211_vif *vif)
+int ath12k_mac_vdev_create(struct ath12k *ar, struct ath12k_link_vif *arvif)
 {
        struct ath12k_hw *ah = ar->ah;
        struct ath12k_base *ab = ar->ab;
        struct ieee80211_hw *hw = ah->hw;
-       struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
+       struct ath12k_vif *ahvif = arvif->ahvif;
+       struct ieee80211_vif *vif = ath12k_ahvif_to_vif(ahvif);
        struct ath12k_wmi_vdev_create_arg vdev_arg = {0};
        struct ath12k_wmi_peer_create_arg peer_param;
-       struct ath12k_link_vif *arvif;
        u32 param_id, param_value;
        u16 nss;
        int i;
 
        lockdep_assert_wiphy(hw->wiphy);
 
-       arvif = &ahvif->deflink;
        arvif->ar = ar;
        vdev_id = __ffs64(ab->free_vdev_map);
        arvif->vdev_id = vdev_id;
        return ret;
 }
 
-static void ath12k_mac_vif_cache_flush(struct ath12k *ar, struct ieee80211_vif *vif)
+static void ath12k_mac_vif_cache_flush(struct ath12k *ar,  struct ath12k_link_vif *arvif)
 {
-       struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
-       struct ath12k_vif_cache *cache;
+       struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
+       struct ath12k_vif_cache *cache = arvif->cache;
        struct ath12k_base *ab = ar->ab;
-       struct ath12k_link_vif *arvif;
+
        int ret;
 
        lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
 
-       arvif = &ahvif->deflink;
-       cache = arvif->cache;
        if (!cache)
                return;
 
        }
 
        if (cache->key_conf.changed) {
-               ret = ath12k_mac_set_key(ar, cache->key_conf.cmd, vif, NULL,
+               ret = ath12k_mac_set_key(ar, cache->key_conf.cmd, arvif, NULL,
                                         cache->key_conf.key);
                if (ret)
                        ath12k_warn(ab, "unable to apply set key param to vdev %d ret %d\n",
 }
 
 static struct ath12k *ath12k_mac_assign_vif_to_vdev(struct ieee80211_hw *hw,
-                                                   struct ieee80211_vif *vif,
+                                                   struct ath12k_link_vif *arvif,
                                                    struct ieee80211_chanctx_conf *ctx)
 {
-       struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
-       struct ath12k_link_vif *arvif;
+       struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
        struct ath12k_hw *ah = hw->priv;
        struct ath12k *ar, *prev_ar;
        struct ath12k_base *ab;
 
        lockdep_assert_wiphy(hw->wiphy);
 
-       arvif = &ahvif->deflink;
-
        if (ah->num_radio == 1)
                ar = ah->radio;
        else if (ctx)
                         * be set to NULL after vdev delete is done
                         */
                        prev_ar = arvif->ar;
-                       ret = ath12k_mac_vdev_delete(prev_ar, vif);
+                       ret = ath12k_mac_vdev_delete(prev_ar, arvif);
                        if (ret)
                                ath12k_warn(prev_ar->ab, "unable to delete vdev %d\n",
                                            ret);
                goto unlock;
        }
 
-       ret = ath12k_mac_vdev_create(ar, vif);
+       ret = ath12k_mac_vdev_create(ar, arvif);
        if (ret) {
                ath12k_warn(ab, "failed to create vdev %pM ret %d", vif->addr, ret);
                goto unlock;
         * add_interface(), Apply any parameters for the vdev which were received
         * after add_interface, corresponding to this vif.
         */
-       ath12k_mac_vif_cache_flush(ar, vif);
+       ath12k_mac_vif_cache_flush(ar, arvif);
 unlock:
        return arvif->ar;
 }
         * creation until channel_assign to determine the radio on which the
         * vdev needs to be created
         */
-       ath12k_mac_assign_vif_to_vdev(hw, vif, NULL);
+       ath12k_mac_assign_vif_to_vdev(hw, arvif, NULL);
 
        return 0;
 }
        }
 }
 
-static int ath12k_mac_vdev_delete(struct ath12k *ar, struct ieee80211_vif *vif)
+static int ath12k_mac_vdev_delete(struct ath12k *ar, struct ath12k_link_vif *arvif)
 {
-       struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
+       struct ath12k_vif *ahvif = arvif->ahvif;
+       struct ieee80211_vif *vif = ath12k_ahvif_to_vif(ahvif);
        struct ath12k_base *ab = ar->ab;
-       struct ath12k_link_vif *arvif;
        unsigned long time_left;
        int ret;
 
        lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
 
-       arvif = &ahvif->deflink;
        reinit_completion(&ar->vdev_delete_done);
 
        ret = ath12k_wmi_vdev_delete(ar, arvif->vdev_id);
                                    arvif->vdev_id, ret);
        }
 
-       ath12k_mac_vdev_delete(ar, vif);
+       ath12k_mac_vdev_delete(ar, arvif);
 }
 
 /* FIXME: Has to be verified. */
         */
        arvif = &ahvif->deflink;
 
-       ar = ath12k_mac_assign_vif_to_vdev(hw, vif, ctx);
+       ar = ath12k_mac_assign_vif_to_vdev(hw, arvif, ctx);
        if (WARN_ON(!ar)) {
                ret = -EINVAL;
                goto out;
                         * would assign the arvif->ar to NULL after the call
                         */
                        prev_ar = arvif->ar;
-                       ret = ath12k_mac_vdev_delete(prev_ar, vif);
+                       ret = ath12k_mac_vdev_delete(prev_ar, arvif);
                        if (ret) {
                                ath12k_warn(prev_ar->ab,
                                            "unable to delete scan vdev for roc: %d\n",
        }
 
        if (create) {
-               ret = ath12k_mac_vdev_create(ar, vif);
+               ret = ath12k_mac_vdev_create(ar, arvif);
                if (ret) {
                        ath12k_warn(ar->ab, "unable to create scan vdev for roc: %d\n",
                                    ret);