{
        struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
        struct ieee80211_local *local = sdata->local;
-       struct ieee80211_bss_conf *bss_conf = &sdata->vif.bss_conf;
        struct ieee80211_link_data *link = &sdata->deflink;
        u32 changed = 0;
        struct ieee80211_prep_tx_info info = {
        ieee80211_stop_poll(sdata);
 
        ifmgd->associated = false;
-       link->u.mgd.bss = NULL;
+
+       /* other links will be destroyed */
+       sdata->deflink.u.mgd.bss = NULL;
+
        netif_carrier_off(sdata->dev);
 
        /*
                 * driver requested so.
                 */
                if (ieee80211_hw_check(&local->hw, DEAUTH_NEED_MGD_TX_PREP) &&
-                   !link->u.mgd.have_beacon) {
+                   !sdata->deflink.u.mgd.have_beacon) {
                        drv_mgd_prepare_tx(sdata->local, sdata, &info);
                }
 
        changed |= BSS_CHANGED_ASSOC;
        sdata->vif.cfg.assoc = false;
 
-       link->u.mgd.p2p_noa_index = -1;
-       memset(&link->conf->p2p_noa_attr, 0,
-              sizeof(link->conf->p2p_noa_attr));
+       sdata->deflink.u.mgd.p2p_noa_index = -1;
+       memset(&sdata->vif.bss_conf.p2p_noa_attr, 0,
+              sizeof(sdata->vif.bss_conf.p2p_noa_attr));
 
        /* on the next assoc, re-program HT/VHT parameters */
        memset(&ifmgd->ht_capa, 0, sizeof(ifmgd->ht_capa));
        memset(&ifmgd->vht_capa, 0, sizeof(ifmgd->vht_capa));
        memset(&ifmgd->vht_capa_mask, 0, sizeof(ifmgd->vht_capa_mask));
 
-       /* reset MU-MIMO ownership and group data */
-       memset(link->conf->mu_group.membership, 0,
-              sizeof(link->conf->mu_group.membership));
-       memset(link->conf->mu_group.position, 0,
-              sizeof(link->conf->mu_group.position));
-       changed |= BSS_CHANGED_MU_GROUPS;
-       link->conf->mu_mimo_owner = false;
+       /*
+        * reset MU-MIMO ownership and group data in default link,
+        * if used, other links are destroyed
+        */
+       memset(sdata->vif.bss_conf.mu_group.membership, 0,
+              sizeof(sdata->vif.bss_conf.mu_group.membership));
+       memset(sdata->vif.bss_conf.mu_group.position, 0,
+              sizeof(sdata->vif.bss_conf.mu_group.position));
+       if (!sdata->vif.valid_links)
+               changed |= BSS_CHANGED_MU_GROUPS;
+       sdata->vif.bss_conf.mu_mimo_owner = false;
 
-       link->ap_power_level = IEEE80211_UNSET_POWER_LEVEL;
+       sdata->deflink.ap_power_level = IEEE80211_UNSET_POWER_LEVEL;
 
        del_timer_sync(&local->dynamic_ps_timer);
        cancel_work_sync(&local->dynamic_ps_enable_work);
        if (sdata->vif.cfg.arp_addr_cnt)
                changed |= BSS_CHANGED_ARP_FILTER;
 
-       link->conf->qos = false;
+       sdata->vif.bss_conf.qos = false;
        changed |= BSS_CHANGED_QOS;
 
        /* The BSSID (not really interesting) and HT changed */
        del_timer_sync(&sdata->u.mgd.conn_mon_timer);
        del_timer_sync(&sdata->u.mgd.bcn_mon_timer);
        del_timer_sync(&sdata->u.mgd.timer);
-       del_timer_sync(&link->u.mgd.chswitch_timer);
+       del_timer_sync(&sdata->deflink.u.mgd.chswitch_timer);
 
-       link->conf->dtim_period = 0;
-       link->conf->beacon_rate = NULL;
+       sdata->vif.bss_conf.dtim_period = 0;
+       sdata->vif.bss_conf.beacon_rate = NULL;
 
-       link->u.mgd.have_beacon = false;
-       link->u.mgd.tracking_signal_avg = false;
-       link->u.mgd.disable_wmm_tracking = false;
+       sdata->deflink.u.mgd.have_beacon = false;
+       sdata->deflink.u.mgd.tracking_signal_avg = false;
+       sdata->deflink.u.mgd.disable_wmm_tracking = false;
 
        ifmgd->flags = 0;
-       link->u.mgd.conn_flags = 0;
+       sdata->deflink.u.mgd.conn_flags = 0;
        mutex_lock(&local->mtx);
        ieee80211_link_release_channel(link);
 
-       link->conf->csa_active = false;
-       link->u.mgd.csa_waiting_bcn = false;
-       link->u.mgd.csa_ignored_same_chan = false;
-       if (link->csa_block_tx) {
+       sdata->vif.bss_conf.csa_active = false;
+       sdata->deflink.u.mgd.csa_waiting_bcn = false;
+       sdata->deflink.u.mgd.csa_ignored_same_chan = false;
+       if (sdata->deflink.csa_block_tx) {
                ieee80211_wake_vif_queues(local, sdata,
                                          IEEE80211_QUEUE_STOP_REASON_CSA);
-               link->csa_block_tx = false;
+               sdata->deflink.csa_block_tx = false;
        }
        mutex_unlock(&local->mtx);
 
        memset(ifmgd->tx_tspec, 0, sizeof(ifmgd->tx_tspec));
        cancel_delayed_work_sync(&ifmgd->tx_tspec_wk);
 
-       bss_conf->pwr_reduction = 0;
-       bss_conf->tx_pwr_env_num = 0;
-       memset(bss_conf->tx_pwr_env, 0, sizeof(bss_conf->tx_pwr_env));
+       sdata->vif.bss_conf.pwr_reduction = 0;
+       sdata->vif.bss_conf.tx_pwr_env_num = 0;
+       memset(sdata->vif.bss_conf.tx_pwr_env, 0,
+              sizeof(sdata->vif.bss_conf.tx_pwr_env));
 }
 
 static void ieee80211_reset_ap_probe(struct ieee80211_sub_if_data *sdata)
                                        WLAN_REASON_DISASSOC_DUE_TO_INACTIVITY,
                               tx, frame_buf);
        mutex_lock(&local->mtx);
+       /* the other links will be destroyed */
        sdata->vif.bss_conf.csa_active = false;
        sdata->deflink.u.mgd.csa_waiting_bcn = false;
        if (sdata->deflink.csa_block_tx) {
                del_timer_sync(&sdata->u.mgd.timer);
                sta_info_destroy_addr(sdata, assoc_data->bss->bssid);
 
-               /* FIXME: other links are destroyed? */
                sdata->deflink.u.mgd.conn_flags = 0;
                eth_zero_addr(sdata->deflink.u.mgd.bssid);
                ieee80211_link_info_change_notify(sdata, &sdata->deflink,
 
        return 0;
  err_clear:
-       eth_zero_addr(link->u.mgd.bssid);
+       eth_zero_addr(sdata->deflink.u.mgd.bssid);
        ieee80211_link_info_change_notify(sdata, &sdata->deflink,
                                          BSS_CHANGED_BSSID);
        ifmgd->assoc_data = NULL;