ar5523_info(ar, "STA not found!\n");
                return WLAN_MODE_11b;
        }
-       sta_rate_set = sta->supp_rates[ar->hw->conf.chandef.chan->band];
+       sta_rate_set = sta->deflink.supp_rates[ar->hw->conf.chandef.chan->band];
 
        for (bit = 0; bit < band->n_bitrates; bit++) {
                if (sta_rate_set & 1) {
                ar5523_info(ar, "STA not found. Cannot set rates\n");
                sta_rate_set = bss_conf->basic_rates;
        } else
-               sta_rate_set = sta->supp_rates[ar->hw->conf.chandef.chan->band];
+               sta_rate_set = sta->deflink.supp_rates[ar->hw->conf.chandef.chan->band];
 
        ar5523_dbg(ar, "sta rate_set = %08x\n", sta_rate_set);
 
 
 
        band = def.chan->band;
        sband = ar->hw->wiphy->bands[band];
-       ratemask = sta->supp_rates[band];
+       ratemask = sta->deflink.supp_rates[band];
        ratemask &= arvif->bitrate_mask.control[band].legacy;
        rates = sband->bitrates;
 
                                   struct ieee80211_sta *sta,
                                   struct wmi_peer_assoc_complete_arg *arg)
 {
-       const struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
+       const struct ieee80211_sta_ht_cap *ht_cap = &sta->deflink.ht_cap;
        struct ath10k_vif *arvif = (void *)vif->drv_priv;
        struct cfg80211_chan_def def;
        enum nl80211_band band;
        if (ht_cap->cap & IEEE80211_HT_CAP_LDPC_CODING)
                arg->peer_flags |= ar->wmi.peer_flags->ldbc;
 
-       if (sta->bandwidth >= IEEE80211_STA_RX_BW_40) {
+       if (sta->deflink.bandwidth >= IEEE80211_STA_RX_BW_40) {
                arg->peer_flags |= ar->wmi.peer_flags->bw40;
                arg->peer_rate_caps |= WMI_RC_CW40_FLAG;
        }
                        arg->peer_ht_rates.rates[i] = i;
        } else {
                arg->peer_ht_rates.num_rates = n;
-               arg->peer_num_spatial_streams = min(sta->rx_nss, max_nss);
+               arg->peer_num_spatial_streams = min(sta->deflink.rx_nss,
+                                                   max_nss);
        }
 
        ath10k_dbg(ar, ATH10K_DBG_MAC, "mac ht peer %pM mcs cnt %d nss %d\n",
                                    struct ieee80211_sta *sta,
                                    struct wmi_peer_assoc_complete_arg *arg)
 {
-       const struct ieee80211_sta_vht_cap *vht_cap = &sta->vht_cap;
+       const struct ieee80211_sta_vht_cap *vht_cap = &sta->deflink.vht_cap;
        struct ath10k_vif *arvif = (void *)vif->drv_priv;
        struct ath10k_hw_params *hw = &ar->hw_params;
        struct cfg80211_chan_def def;
                                 (1U << (IEEE80211_HT_MAX_AMPDU_FACTOR +
                                        ampdu_factor)) - 1);
 
-       if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
+       if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80)
                arg->peer_flags |= ar->wmi.peer_flags->bw80;
 
-       if (sta->bandwidth == IEEE80211_STA_RX_BW_160)
+       if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160)
                arg->peer_flags |= ar->wmi.peer_flags->bw160;
 
        /* Calculate peer NSS capability from VHT capabilities if STA
                    vht_mcs_mask[i])
                        max_nss = i + 1;
        }
-       arg->peer_num_spatial_streams = min(sta->rx_nss, max_nss);
+       arg->peer_num_spatial_streams = min(sta->deflink.rx_nss, max_nss);
        arg->peer_vht_rates.rx_max_rate =
                __le16_to_cpu(vht_cap->vht_mcs.rx_highest);
        arg->peer_vht_rates.rx_mcs_set =
 
 static bool ath10k_mac_sta_has_ofdm_only(struct ieee80211_sta *sta)
 {
-       return sta->supp_rates[NL80211_BAND_2GHZ] >>
+       return sta->deflink.supp_rates[NL80211_BAND_2GHZ] >>
               ATH10K_MAC_FIRST_OFDM_RATE_IDX;
 }
 
 static enum wmi_phy_mode ath10k_mac_get_phymode_vht(struct ath10k *ar,
                                                    struct ieee80211_sta *sta)
 {
-       if (sta->bandwidth == IEEE80211_STA_RX_BW_160) {
-               switch (sta->vht_cap.cap & IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK) {
+       if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160) {
+               switch (sta->deflink.vht_cap.cap & IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK) {
                case IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ:
                        return MODE_11AC_VHT160;
                case IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ:
                }
        }
 
-       if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
+       if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80)
                return MODE_11AC_VHT80;
 
-       if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
+       if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
                return MODE_11AC_VHT40;
 
-       if (sta->bandwidth == IEEE80211_STA_RX_BW_20)
+       if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_20)
                return MODE_11AC_VHT20;
 
        return MODE_UNKNOWN;
 
        switch (band) {
        case NL80211_BAND_2GHZ:
-               if (sta->vht_cap.vht_supported &&
+               if (sta->deflink.vht_cap.vht_supported &&
                    !ath10k_peer_assoc_h_vht_masked(vht_mcs_mask)) {
-                       if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
+                       if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
                                phymode = MODE_11AC_VHT40;
                        else
                                phymode = MODE_11AC_VHT20;
-               } else if (sta->ht_cap.ht_supported &&
+               } else if (sta->deflink.ht_cap.ht_supported &&
                           !ath10k_peer_assoc_h_ht_masked(ht_mcs_mask)) {
-                       if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
+                       if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
                                phymode = MODE_11NG_HT40;
                        else
                                phymode = MODE_11NG_HT20;
                /*
                 * Check VHT first.
                 */
-               if (sta->vht_cap.vht_supported &&
+               if (sta->deflink.vht_cap.vht_supported &&
                    !ath10k_peer_assoc_h_vht_masked(vht_mcs_mask)) {
                        phymode = ath10k_mac_get_phymode_vht(ar, sta);
-               } else if (sta->ht_cap.ht_supported &&
+               } else if (sta->deflink.ht_cap.ht_supported &&
                           !ath10k_peer_assoc_h_ht_masked(ht_mcs_mask)) {
-                       if (sta->bandwidth >= IEEE80211_STA_RX_BW_40)
+                       if (sta->deflink.bandwidth >= IEEE80211_STA_RX_BW_40)
                                phymode = MODE_11NA_HT40;
                        else
                                phymode = MODE_11NA_HT20;
        /* ap_sta must be accessed only within rcu section which must be left
         * before calling ath10k_setup_peer_smps() which might sleep.
         */
-       ht_cap = ap_sta->ht_cap;
-       vht_cap = ap_sta->vht_cap;
+       ht_cap = ap_sta->deflink.ht_cap;
+       vht_cap = ap_sta->deflink.vht_cap;
 
        ret = ath10k_peer_assoc_prepare(ar, vif, ap_sta, &peer_arg);
        if (ret) {
         */
        if (!reassoc) {
                ret = ath10k_setup_peer_smps(ar, arvif, sta->addr,
-                                            &sta->ht_cap);
+                                            &sta->deflink.ht_cap);
                if (ret) {
                        ath10k_warn(ar, "failed to setup peer SMPS for vdev %d: %d\n",
                                    arvif->vdev_id, ret);
        int ret = 0;
        s16 txpwr;
 
-       if (sta->txpwr.type == NL80211_TX_POWER_AUTOMATIC) {
+       if (sta->deflink.txpwr.type == NL80211_TX_POWER_AUTOMATIC) {
                txpwr = 0;
        } else {
-               txpwr = sta->txpwr.power;
+               txpwr = sta->deflink.txpwr.power;
                if (!txpwr)
                        return -EINVAL;
        }
                                         struct ieee80211_sta *sta,
                                         u32 rate_ctrl_flag, u8 nss)
 {
-       if (nss > sta->rx_nss) {
+       if (nss > sta->deflink.rx_nss) {
                ath10k_warn(ar, "Invalid nss field, configured %u limit %u\n",
-                           nss, sta->rx_nss);
+                           nss, sta->deflink.rx_nss);
                return -EINVAL;
        }
 
        if (ATH10K_HW_PREAMBLE(rate_ctrl_flag) == WMI_RATE_PREAMBLE_VHT) {
-               if (!sta->vht_cap.vht_supported) {
+               if (!sta->deflink.vht_cap.vht_supported) {
                        ath10k_warn(ar, "Invalid VHT rate for sta %pM\n",
                                    sta->addr);
                        return -EINVAL;
                }
        } else if (ATH10K_HW_PREAMBLE(rate_ctrl_flag) == WMI_RATE_PREAMBLE_HT) {
-               if (!sta->ht_cap.ht_supported || sta->vht_cap.vht_supported) {
+               if (!sta->deflink.ht_cap.ht_supported || sta->deflink.vht_cap.vht_supported) {
                        ath10k_warn(ar, "Invalid HT rate for sta %pM\n",
                                    sta->addr);
                        return -EINVAL;
                }
        } else {
-               if (sta->ht_cap.ht_supported || sta->vht_cap.vht_supported)
+               if (sta->deflink.ht_cap.ht_supported || sta->deflink.vht_cap.vht_supported)
                        return -EINVAL;
        }
 
        u8 rate = arvif->vht_pfr;
 
        /* skip non vht and multiple rate peers */
-       if (!sta->vht_cap.vht_supported || arvif->vht_num_rates != 1)
+       if (!sta->deflink.vht_cap.vht_supported || arvif->vht_num_rates != 1)
                return false;
 
        err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
        int err;
 
        /* clear vht peers only */
-       if (arsta->arvif != arvif || !sta->vht_cap.vht_supported)
+       if (arsta->arvif != arvif || !sta->deflink.vht_cap.vht_supported)
                return;
 
        err = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, sta->addr,
 
        ath10k_dbg(ar, ATH10K_DBG_STA,
                   "mac sta rc update for %pM changed %08x bw %d nss %d smps %d\n",
-                  sta->addr, changed, sta->bandwidth, sta->rx_nss,
+                  sta->addr, changed, sta->deflink.bandwidth,
+                  sta->deflink.rx_nss,
                   sta->smps_mode);
 
        if (changed & IEEE80211_RC_BW_CHANGED) {
                bw = WMI_PEER_CHWIDTH_20MHZ;
 
-               switch (sta->bandwidth) {
+               switch (sta->deflink.bandwidth) {
                case IEEE80211_STA_RX_BW_20:
                        bw = WMI_PEER_CHWIDTH_20MHZ;
                        break;
                        break;
                default:
                        ath10k_warn(ar, "Invalid bandwidth %d in rc update for %pM\n",
-                                   sta->bandwidth, sta->addr);
+                                   sta->deflink.bandwidth, sta->addr);
                        bw = WMI_PEER_CHWIDTH_20MHZ;
                        break;
                }
        }
 
        if (changed & IEEE80211_RC_NSS_CHANGED)
-               arsta->nss = sta->rx_nss;
+               arsta->nss = sta->deflink.rx_nss;
 
        if (changed & IEEE80211_RC_SMPS_CHANGED) {
                smps = WMI_PEER_SMPS_PS_NONE;
 
 
        band = def.chan->band;
        sband = ar->hw->wiphy->bands[band];
-       ratemask = sta->supp_rates[band];
+       ratemask = sta->deflink.supp_rates[band];
        ratemask &= arvif->bitrate_mask.control[band].legacy;
        rates = sband->bitrates;
 
                                   struct ieee80211_sta *sta,
                                   struct peer_assoc_params *arg)
 {
-       const struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
+       const struct ieee80211_sta_ht_cap *ht_cap = &sta->deflink.ht_cap;
        struct ath11k_vif *arvif = (void *)vif->drv_priv;
        struct cfg80211_chan_def def;
        enum nl80211_band band;
        if (ht_cap->cap & IEEE80211_HT_CAP_LDPC_CODING)
                arg->ldpc_flag = true;
 
-       if (sta->bandwidth >= IEEE80211_STA_RX_BW_40) {
+       if (sta->deflink.bandwidth >= IEEE80211_STA_RX_BW_40) {
                arg->bw_40 = true;
                arg->peer_rate_caps |= WMI_HOST_RC_CW40_FLAG;
        }
                        arg->peer_ht_rates.rates[i] = i;
        } else {
                arg->peer_ht_rates.num_rates = n;
-               arg->peer_nss = min(sta->rx_nss, max_nss);
+               arg->peer_nss = min(sta->deflink.rx_nss, max_nss);
        }
 
        ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac ht peer %pM mcs cnt %d nss %d\n",
                                    struct ieee80211_sta *sta,
                                    struct peer_assoc_params *arg)
 {
-       const struct ieee80211_sta_vht_cap *vht_cap = &sta->vht_cap;
+       const struct ieee80211_sta_vht_cap *vht_cap = &sta->deflink.vht_cap;
        struct ath11k_vif *arvif = (void *)vif->drv_priv;
        struct cfg80211_chan_def def;
        enum nl80211_band band;
                                 (1U << (IEEE80211_HT_MAX_AMPDU_FACTOR +
                                        ampdu_factor)) - 1);
 
-       if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
+       if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80)
                arg->bw_80 = true;
 
-       if (sta->bandwidth == IEEE80211_STA_RX_BW_160)
+       if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160)
                arg->bw_160 = true;
 
        vht_nss =  ath11k_mac_max_vht_nss(vht_mcs_mask);
 
-       if (vht_nss > sta->rx_nss) {
+       if (vht_nss > sta->deflink.rx_nss) {
                user_rate_valid = false;
-               for (nss_idx = sta->rx_nss - 1; nss_idx >= 0; nss_idx--) {
+               for (nss_idx = sta->deflink.rx_nss - 1; nss_idx >= 0; nss_idx--) {
                        if (vht_mcs_mask[nss_idx]) {
                                user_rate_valid = true;
                                break;
 
        if (!user_rate_valid) {
                ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac setting vht range mcs value to peer supported nss %d for peer %pM\n",
-                          sta->rx_nss, sta->addr);
-               vht_mcs_mask[sta->rx_nss - 1] = vht_mcs_mask[vht_nss - 1];
+                          sta->deflink.rx_nss, sta->addr);
+               vht_mcs_mask[sta->deflink.rx_nss - 1] = vht_mcs_mask[vht_nss - 1];
        }
 
        /* Calculate peer NSS capability from VHT capabilities if STA
                    vht_mcs_mask[i])
                        max_nss = i + 1;
        }
-       arg->peer_nss = min(sta->rx_nss, max_nss);
+       arg->peer_nss = min(sta->deflink.rx_nss, max_nss);
        arg->rx_max_rate = __le16_to_cpu(vht_cap->vht_mcs.rx_highest);
        arg->rx_mcs_set = __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map);
        arg->tx_max_rate = __le16_to_cpu(vht_cap->vht_mcs.tx_highest);
 {
        struct ath11k_vif *arvif = (void *)vif->drv_priv;
        struct cfg80211_chan_def def;
-       const struct ieee80211_sta_he_cap *he_cap = &sta->he_cap;
+       const struct ieee80211_sta_he_cap *he_cap = &sta->deflink.he_cap;
        enum nl80211_band band;
        u16 *he_mcs_mask;
        u8 max_nss, he_mcs;
        else
                max_nss = rx_mcs_80;
 
-       arg->peer_nss = min(sta->rx_nss, max_nss);
+       arg->peer_nss = min(sta->deflink.rx_nss, max_nss);
 
        memcpy_and_pad(&arg->peer_he_cap_macinfo,
                       sizeof(arg->peer_he_cap_macinfo),
                                   IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_MASK);
 
        if (ampdu_factor) {
-               if (sta->vht_cap.vht_supported)
+               if (sta->deflink.vht_cap.vht_supported)
                        arg->peer_max_mpdu = (1 << (IEEE80211_HE_VHT_MAX_AMPDU_FACTOR +
                                                    ampdu_factor)) - 1;
-               else if (sta->ht_cap.ht_supported)
+               else if (sta->deflink.ht_cap.ht_supported)
                        arg->peer_max_mpdu = (1 << (IEEE80211_HE_HT_MAX_AMPDU_FACTOR +
                                                    ampdu_factor)) - 1;
        }
 
        he_nss =  ath11k_mac_max_he_nss(he_mcs_mask);
 
-       if (he_nss > sta->rx_nss) {
+       if (he_nss > sta->deflink.rx_nss) {
                user_rate_valid = false;
-               for (nss_idx = sta->rx_nss - 1; nss_idx >= 0; nss_idx--) {
+               for (nss_idx = sta->deflink.rx_nss - 1; nss_idx >= 0; nss_idx--) {
                        if (he_mcs_mask[nss_idx]) {
                                user_rate_valid = true;
                                break;
 
        if (!user_rate_valid) {
                ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac setting he range mcs value to peer supported nss %d for peer %pM\n",
-                          sta->rx_nss, sta->addr);
-               he_mcs_mask[sta->rx_nss - 1] = he_mcs_mask[he_nss - 1];
+                          sta->deflink.rx_nss, sta->addr);
+               he_mcs_mask[sta->deflink.rx_nss - 1] = he_mcs_mask[he_nss - 1];
        }
 
-       switch (sta->bandwidth) {
+       switch (sta->deflink.bandwidth) {
        case IEEE80211_STA_RX_BW_160:
                if (he_cap->he_cap_elem.phy_cap_info[0] &
                    IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G) {
                    he_mcs_mask[i])
                        max_nss = i + 1;
        }
-       arg->peer_nss = min(sta->rx_nss, max_nss);
+       arg->peer_nss = min(sta->deflink.rx_nss, max_nss);
 
        if (arg->peer_phymode == MODE_11AX_HE160 ||
            arg->peer_phymode == MODE_11AX_HE80_80) {
                                        struct ieee80211_sta *sta,
                                        struct peer_assoc_params *arg)
 {
-       const struct ieee80211_sta_he_cap *he_cap = &sta->he_cap;
+       const struct ieee80211_sta_he_cap *he_cap = &sta->deflink.he_cap;
        struct cfg80211_chan_def def;
        enum nl80211_band band;
        u8  ampdu_factor;
 
        band = def.chan->band;
 
-       if (!arg->he_flag || band != NL80211_BAND_6GHZ || !sta->he_6ghz_capa.capa)
+       if (!arg->he_flag || band != NL80211_BAND_6GHZ || !sta->deflink.he_6ghz_capa.capa)
                return;
 
-       if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
+       if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
                arg->bw_40 = true;
 
-       if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
+       if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80)
                arg->bw_80 = true;
 
-       if (sta->bandwidth == IEEE80211_STA_RX_BW_160)
+       if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160)
                arg->bw_160 = true;
 
-       arg->peer_he_caps_6ghz = le16_to_cpu(sta->he_6ghz_capa.capa);
+       arg->peer_he_caps_6ghz = le16_to_cpu(sta->deflink.he_6ghz_capa.capa);
        arg->peer_mpdu_density =
                ath11k_parse_mpdudensity(FIELD_GET(IEEE80211_HE_6GHZ_CAP_MIN_MPDU_START,
                                                   arg->peer_he_caps_6ghz));
 static void ath11k_peer_assoc_h_smps(struct ieee80211_sta *sta,
                                     struct peer_assoc_params *arg)
 {
-       const struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
+       const struct ieee80211_sta_ht_cap *ht_cap = &sta->deflink.ht_cap;
        int smps;
 
-       if (!ht_cap->ht_supported && !sta->he_6ghz_capa.capa)
+       if (!ht_cap->ht_supported && !sta->deflink.he_6ghz_capa.capa)
                return;
 
        if (ht_cap->ht_supported) {
                smps = ht_cap->cap & IEEE80211_HT_CAP_SM_PS;
                smps >>= IEEE80211_HT_CAP_SM_PS_SHIFT;
        } else {
-               smps = le16_get_bits(sta->he_6ghz_capa.capa,
+               smps = le16_get_bits(sta->deflink.he_6ghz_capa.capa,
                                     IEEE80211_HE_6GHZ_CAP_SM_PS);
        }
 
 
 static bool ath11k_mac_sta_has_ofdm_only(struct ieee80211_sta *sta)
 {
-       return sta->supp_rates[NL80211_BAND_2GHZ] >>
+       return sta->deflink.supp_rates[NL80211_BAND_2GHZ] >>
               ATH11K_MAC_FIRST_OFDM_RATE_IDX;
 }
 
 static enum wmi_phy_mode ath11k_mac_get_phymode_vht(struct ath11k *ar,
                                                    struct ieee80211_sta *sta)
 {
-       if (sta->bandwidth == IEEE80211_STA_RX_BW_160) {
-               switch (sta->vht_cap.cap &
+       if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160) {
+               switch (sta->deflink.vht_cap.cap &
                        IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK) {
                case IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ:
                        return MODE_11AC_VHT160;
                }
        }
 
-       if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
+       if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80)
                return MODE_11AC_VHT80;
 
-       if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
+       if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
                return MODE_11AC_VHT40;
 
-       if (sta->bandwidth == IEEE80211_STA_RX_BW_20)
+       if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_20)
                return MODE_11AC_VHT20;
 
        return MODE_UNKNOWN;
 static enum wmi_phy_mode ath11k_mac_get_phymode_he(struct ath11k *ar,
                                                   struct ieee80211_sta *sta)
 {
-       if (sta->bandwidth == IEEE80211_STA_RX_BW_160) {
-               if (sta->he_cap.he_cap_elem.phy_cap_info[0] &
+       if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160) {
+               if (sta->deflink.he_cap.he_cap_elem.phy_cap_info[0] &
                     IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G)
                        return MODE_11AX_HE160;
-               else if (sta->he_cap.he_cap_elem.phy_cap_info[0] &
-                    IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G)
+               else if (sta->deflink.he_cap.he_cap_elem.phy_cap_info[0] &
+                        IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G)
                        return MODE_11AX_HE80_80;
                /* not sure if this is a valid case? */
                return MODE_11AX_HE160;
        }
 
-       if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
+       if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80)
                return MODE_11AX_HE80;
 
-       if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
+       if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
                return MODE_11AX_HE40;
 
-       if (sta->bandwidth == IEEE80211_STA_RX_BW_20)
+       if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_20)
                return MODE_11AX_HE20;
 
        return MODE_UNKNOWN;
 
        switch (band) {
        case NL80211_BAND_2GHZ:
-               if (sta->he_cap.has_he &&
+               if (sta->deflink.he_cap.has_he &&
                    !ath11k_peer_assoc_h_he_masked(he_mcs_mask)) {
-                       if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
+                       if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80)
                                phymode = MODE_11AX_HE80_2G;
-                       else if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
+                       else if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
                                phymode = MODE_11AX_HE40_2G;
                        else
                                phymode = MODE_11AX_HE20_2G;
-               } else if (sta->vht_cap.vht_supported &&
-                   !ath11k_peer_assoc_h_vht_masked(vht_mcs_mask)) {
-                       if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
+               } else if (sta->deflink.vht_cap.vht_supported &&
+                          !ath11k_peer_assoc_h_vht_masked(vht_mcs_mask)) {
+                       if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
                                phymode = MODE_11AC_VHT40;
                        else
                                phymode = MODE_11AC_VHT20;
-               } else if (sta->ht_cap.ht_supported &&
+               } else if (sta->deflink.ht_cap.ht_supported &&
                           !ath11k_peer_assoc_h_ht_masked(ht_mcs_mask)) {
-                       if (sta->bandwidth == IEEE80211_STA_RX_BW_40)
+                       if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
                                phymode = MODE_11NG_HT40;
                        else
                                phymode = MODE_11NG_HT20;
        case NL80211_BAND_5GHZ:
        case NL80211_BAND_6GHZ:
                /* Check HE first */
-               if (sta->he_cap.has_he &&
+               if (sta->deflink.he_cap.has_he &&
                    !ath11k_peer_assoc_h_he_masked(he_mcs_mask)) {
                        phymode = ath11k_mac_get_phymode_he(ar, sta);
-               } else if (sta->vht_cap.vht_supported &&
-                   !ath11k_peer_assoc_h_vht_masked(vht_mcs_mask)) {
+               } else if (sta->deflink.vht_cap.vht_supported &&
+                          !ath11k_peer_assoc_h_vht_masked(vht_mcs_mask)) {
                        phymode = ath11k_mac_get_phymode_vht(ar, sta);
-               } else if (sta->ht_cap.ht_supported &&
+               } else if (sta->deflink.ht_cap.ht_supported &&
                           !ath11k_peer_assoc_h_ht_masked(ht_mcs_mask)) {
-                       if (sta->bandwidth >= IEEE80211_STA_RX_BW_40)
+                       if (sta->deflink.bandwidth >= IEEE80211_STA_RX_BW_40)
                                phymode = MODE_11NA_HT40;
                        else
                                phymode = MODE_11NA_HT20;
        }
 
        ret = ath11k_setup_peer_smps(ar, arvif, bss_conf->bssid,
-                                    &ap_sta->ht_cap,
-                                    le16_to_cpu(ap_sta->he_6ghz_capa.capa));
+                                    &ap_sta->deflink.ht_cap,
+                                    le16_to_cpu(ap_sta->deflink.he_6ghz_capa.capa));
        if (ret) {
                ath11k_warn(ar->ab, "failed to setup peer SMPS for vdev %d: %d\n",
                            arvif->vdev_id, ret);
        }
 
        /* Avoid updating invalid nss as fixed rate*/
-       if (nss > sta->rx_nss)
+       if (nss > sta->deflink.rx_nss)
                return -EINVAL;
 
        ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
        }
 
        /* Avoid updating invalid nss as fixed rate */
-       if (nss > sta->rx_nss)
+       if (nss > sta->deflink.rx_nss)
                return -EINVAL;
 
        ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
         * fixed param.
         * Note that all other rates and NSS will be disabled for this peer.
         */
-       if (sta->vht_cap.vht_supported && num_vht_rates == 1) {
+       if (sta->deflink.vht_cap.vht_supported && num_vht_rates == 1) {
                ret = ath11k_mac_set_peer_vht_fixed_rate(arvif, sta, mask,
                                                         band);
                if (ret)
                        return ret;
-       } else if (sta->he_cap.has_he && num_he_rates == 1) {
+       } else if (sta->deflink.he_cap.has_he && num_he_rates == 1) {
                ret = ath11k_mac_set_peer_he_fixed_rate(arvif, sta, mask,
                                                        band);
                if (ret)
                return 0;
 
        ret = ath11k_setup_peer_smps(ar, arvif, sta->addr,
-                                    &sta->ht_cap, le16_to_cpu(sta->he_6ghz_capa.capa));
+                                    &sta->deflink.ht_cap,
+                                    le16_to_cpu(sta->deflink.he_6ghz_capa.capa));
        if (ret) {
                ath11k_warn(ar->ab, "failed to setup peer SMPS for vdev %d: %d\n",
                            arvif->vdev_id, ret);
                 * TODO: Check RATEMASK_CMDID to support auto rates selection
                 * across HT/VHT and for multiple VHT MCS support.
                 */
-               if (sta->vht_cap.vht_supported && num_vht_rates == 1) {
+               if (sta->deflink.vht_cap.vht_supported && num_vht_rates == 1) {
                        ath11k_mac_set_peer_vht_fixed_rate(arvif, sta, mask,
                                                           band);
-               } else if (sta->he_cap.has_he && num_he_rates == 1) {
+               } else if (sta->deflink.he_cap.has_he && num_he_rates == 1) {
                        ath11k_mac_set_peer_he_fixed_rate(arvif, sta, mask,
                                                          band);
                } else {
        int ret = 0;
        s16 txpwr;
 
-       if (sta->txpwr.type == NL80211_TX_POWER_AUTOMATIC) {
+       if (sta->deflink.txpwr.type == NL80211_TX_POWER_AUTOMATIC) {
                txpwr = 0;
        } else {
-               txpwr = sta->txpwr.power;
+               txpwr = sta->deflink.txpwr.power;
                if (!txpwr)
                        return -EINVAL;
        }
 
        ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
                   "mac sta rc update for %pM changed %08x bw %d nss %d smps %d\n",
-                  sta->addr, changed, sta->bandwidth, sta->rx_nss,
+                  sta->addr, changed, sta->deflink.bandwidth,
+                  sta->deflink.rx_nss,
                   sta->smps_mode);
 
        spin_lock_bh(&ar->data_lock);
        if (changed & IEEE80211_RC_BW_CHANGED) {
                bw = WMI_PEER_CHWIDTH_20MHZ;
 
-               switch (sta->bandwidth) {
+               switch (sta->deflink.bandwidth) {
                case IEEE80211_STA_RX_BW_20:
                        bw = WMI_PEER_CHWIDTH_20MHZ;
                        break;
                        break;
                default:
                        ath11k_warn(ar->ab, "Invalid bandwidth %d in rc update for %pM\n",
-                                   sta->bandwidth, sta->addr);
+                                   sta->deflink.bandwidth, sta->addr);
                        bw = WMI_PEER_CHWIDTH_20MHZ;
                        break;
                }
        }
 
        if (changed & IEEE80211_RC_NSS_CHANGED)
-               arsta->nss = sta->rx_nss;
+               arsta->nss = sta->deflink.rx_nss;
 
        if (changed & IEEE80211_RC_SMPS_CHANGED) {
                smps = WMI_PEER_SMPS_PS_NONE;
        spin_lock_bh(&ar->ab->base_lock);
        list_for_each_entry_safe(peer, tmp, &ar->ab->peers, list) {
                if (peer->sta) {
-                       if (vht_fixed_rate && (!peer->sta->vht_cap.vht_supported ||
-                                              peer->sta->rx_nss < vht_nss)) {
+                       if (vht_fixed_rate && (!peer->sta->deflink.vht_cap.vht_supported ||
+                                              peer->sta->deflink.rx_nss < vht_nss)) {
                                ret = false;
                                goto out;
                        }
-                       if (he_fixed_rate && (!peer->sta->he_cap.has_he ||
-                                             peer->sta->rx_nss < he_nss)) {
+                       if (he_fixed_rate && (!peer->sta->deflink.he_cap.has_he ||
+                                             peer->sta->deflink.rx_nss < he_nss)) {
                                ret = false;
                                goto out;
                        }
 
        if (buf == NULL)
                return -ENOMEM;
 
-       if (!an->sta->ht_cap.ht_supported) {
+       if (!an->sta->deflink.ht_cap.ht_supported) {
                len = scnprintf(buf, size, "%s\n",
                                "HT not supported");
                goto exit;
        band = ah->curchan->chan->band;
        rstats = &an->rx_rate_stats;
 
-       if (!sta->ht_cap.ht_supported)
+       if (!sta->deflink.ht_cap.ht_supported)
                goto legacy;
 
        len += scnprintf(buf + len, size - len,
 
                ista->index = sta_idx;
                tsta.is_vif_sta = 0;
                maxampdu = 1 << (IEEE80211_HT_MAX_AMPDU_FACTOR +
-                                sta->ht_cap.ampdu_factor);
+                                sta->deflink.ht_cap.ampdu_factor);
                tsta.maxampdu = cpu_to_be16(maxampdu);
        } else {
                memcpy(&tsta.macaddr, vif->addr, ETH_ALEN);
        sband = priv->hw->wiphy->bands[priv->hw->conf.chandef.chan->band];
 
        for (i = 0, j = 0; i < sband->n_bitrates; i++) {
-               if (sta->supp_rates[sband->band] & BIT(i)) {
+               if (sta->deflink.supp_rates[sband->band] & BIT(i)) {
                        trate->rates.legacy_rates.rs_rates[j]
                                = (sband->bitrates[i].bitrate * 2) / 10;
                        j++;
        }
        trate->rates.legacy_rates.rs_nrates = j;
 
-       if (sta->ht_cap.ht_supported) {
+       if (sta->deflink.ht_cap.ht_supported) {
                for (i = 0, j = 0; i < 77; i++) {
-                       if (sta->ht_cap.mcs.rx_mask[i/8] & (1<<(i%8)))
+                       if (sta->deflink.ht_cap.mcs.rx_mask[i/8] & (1<<(i%8)))
                                trate->rates.ht_rates.rs_rates[j++] = i;
                        if (j == ATH_HTC_RATE_MAX)
                                break;
                trate->rates.ht_rates.rs_nrates = j;
 
                caps = WLAN_RC_HT_FLAG;
-               if (sta->ht_cap.cap & IEEE80211_HT_CAP_RX_STBC)
+               if (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_RX_STBC)
                        caps |= ATH_RC_TX_STBC_FLAG;
-               if (sta->ht_cap.mcs.rx_mask[1])
+               if (sta->deflink.ht_cap.mcs.rx_mask[1])
                        caps |= WLAN_RC_DS_FLAG;
-               if ((sta->ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40) &&
-                    (conf_is_ht40(&priv->hw->conf)))
+               if ((sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40) &&
+                   (conf_is_ht40(&priv->hw->conf)))
                        caps |= WLAN_RC_40_FLAG;
                if (conf_is_ht40(&priv->hw->conf) &&
-                   (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40))
+                   (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_40))
                        caps |= WLAN_RC_SGI_FLAG;
                else if (conf_is_ht20(&priv->hw->conf) &&
-                        (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20))
+                        (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_20))
                        caps |= WLAN_RC_SGI_FLAG;
        }
 
 
        case IEEE80211_AMPDU_TX_OPERATIONAL:
                atid = ath_node_to_tid(an, tid);
                atid->baw_size = IEEE80211_MIN_AMPDU_BUF <<
-                               sta->ht_cap.ampdu_factor;
+                                       sta->deflink.ht_cap.ampdu_factor;
                break;
        default:
                ath_err(ath9k_hw_common(sc->sc_ah), "Unknown AMPDU action\n");
 
         * in HT IBSS when a beacon with HT-info is received after the station
         * has already been added.
         */
-       if (sta->ht_cap.ht_supported) {
+       if (sta->deflink.ht_cap.ht_supported) {
                an->maxampdu = (1 << (IEEE80211_HT_MAX_AMPDU_FACTOR +
-                                     sta->ht_cap.ampdu_factor)) - 1;
-               density = ath9k_parse_mpdudensity(sta->ht_cap.ampdu_density);
+                                     sta->deflink.ht_cap.ampdu_factor)) - 1;
+               density = ath9k_parse_mpdudensity(sta->deflink.ht_cap.ampdu_density);
                an->mpdudensity = density;
        }
 
 
 
        atomic_set(&sta_info->pending_frames, 0);
 
-       if (sta->ht_cap.ht_supported) {
-               if (sta->ht_cap.ampdu_density > 6) {
+       if (sta->deflink.ht_cap.ht_supported) {
+               if (sta->deflink.ht_cap.ampdu_density > 6) {
                        /*
                         * HW does support 16us AMPDU density.
                         * No HT-Xmit for station.
                for (i = 0; i < ARRAY_SIZE(sta_info->agg); i++)
                        RCU_INIT_POINTER(sta_info->agg[i], NULL);
 
-               sta_info->ampdu_max_len = 1 << (3 + sta->ht_cap.ampdu_factor);
+               sta_info->ampdu_max_len = 1 << (3 + sta->deflink.ht_cap.ampdu_factor);
                sta_info->ht_sta = true;
        }
 
        unsigned int i;
        bool cleanup = false;
 
-       if (sta->ht_cap.ht_supported) {
+       if (sta->deflink.ht_cap.ht_supported) {
 
                sta_info->ht_sta = false;
 
 
                if (unlikely(!sta || !cvif))
                        goto err_out;
 
-               factor = min_t(unsigned int, 1u, sta->ht_cap.ampdu_factor);
-               density = sta->ht_cap.ampdu_density;
+               factor = min_t(unsigned int, 1u,
+                              sta->deflink.ht_cap.ampdu_factor);
+               density = sta->deflink.ht_cap.ampdu_density;
 
                if (density) {
                        /*
 
        int i, size;
        u16 *rates_table;
        struct wcn36xx_sta *sta_priv = wcn36xx_sta_to_priv(sta);
-       u32 rates = sta->supp_rates[band];
+       u32 rates = sta->deflink.supp_rates[band];
 
        memset(&sta_priv->supported_rates, 0,
                sizeof(sta_priv->supported_rates));
                }
        }
 
-       if (sta->ht_cap.ht_supported) {
-               BUILD_BUG_ON(sizeof(sta->ht_cap.mcs.rx_mask) >
-                       sizeof(sta_priv->supported_rates.supported_mcs_set));
+       if (sta->deflink.ht_cap.ht_supported) {
+               BUILD_BUG_ON(sizeof(sta->deflink.ht_cap.mcs.rx_mask) >
+                            sizeof(sta_priv->supported_rates.supported_mcs_set));
                memcpy(sta_priv->supported_rates.supported_mcs_set,
-                      sta->ht_cap.mcs.rx_mask,
-                      sizeof(sta->ht_cap.mcs.rx_mask));
+                      sta->deflink.ht_cap.mcs.rx_mask,
+                      sizeof(sta->deflink.ht_cap.mcs.rx_mask));
        }
 
-       if (sta->vht_cap.vht_supported) {
+       if (sta->deflink.vht_cap.vht_supported) {
                sta_priv->supported_rates.op_rate_mode = STA_11ac;
                sta_priv->supported_rates.vht_rx_mcs_map =
-                               sta->vht_cap.vht_mcs.rx_mcs_map;
+                               sta->deflink.vht_cap.vht_mcs.rx_mcs_map;
                sta_priv->supported_rates.vht_tx_mcs_map =
-                               sta->vht_cap.vht_mcs.tx_mcs_map;
+                               sta->deflink.vht_cap.vht_mcs.tx_mcs_map;
        }
 }
 
 
 {
        if (NL80211_BAND_5GHZ == WCN36XX_BAND(wcn))
                bss_params->nw_type = WCN36XX_HAL_11A_NW_TYPE;
-       else if (sta && sta->ht_cap.ht_supported)
+       else if (sta && sta->deflink.ht_cap.ht_supported)
                bss_params->nw_type = WCN36XX_HAL_11N_NW_TYPE;
-       else if (sta && (sta->supp_rates[NL80211_BAND_2GHZ] & 0x7f))
+       else if (sta && (sta->deflink.supp_rates[NL80211_BAND_2GHZ] & 0x7f))
                bss_params->nw_type = WCN36XX_HAL_11G_NW_TYPE;
        else
                bss_params->nw_type = WCN36XX_HAL_11B_NW_TYPE;
                struct ieee80211_sta *sta,
                struct wcn36xx_hal_config_bss_params *bss_params)
 {
-       if (sta && sta->ht_cap.ht_supported) {
-               unsigned long caps = sta->ht_cap.cap;
-               bss_params->ht = sta->ht_cap.ht_supported;
+       if (sta && sta->deflink.ht_cap.ht_supported) {
+               unsigned long caps = sta->deflink.ht_cap.cap;
+
+               bss_params->ht = sta->deflink.ht_cap.ht_supported;
                bss_params->tx_channel_width_set = is_cap_supported(caps,
                        IEEE80211_HT_CAP_SUP_WIDTH_20_40);
                bss_params->lsig_tx_op_protection_full_support =
                               struct ieee80211_sta *sta,
                               struct wcn36xx_hal_config_bss_params_v1 *bss)
 {
-       if (sta && sta->vht_cap.vht_supported)
+       if (sta && sta->deflink.vht_cap.vht_supported)
                bss->vht_capable = 1;
 }
 
 static void wcn36xx_smd_set_sta_ht_params(struct ieee80211_sta *sta,
                struct wcn36xx_hal_config_sta_params *sta_params)
 {
-       if (sta->ht_cap.ht_supported) {
-               unsigned long caps = sta->ht_cap.cap;
-               sta_params->ht_capable = sta->ht_cap.ht_supported;
+       if (sta->deflink.ht_cap.ht_supported) {
+               unsigned long caps = sta->deflink.ht_cap.cap;
+
+               sta_params->ht_capable = sta->deflink.ht_cap.ht_supported;
                sta_params->tx_channel_width_set = is_cap_supported(caps,
                        IEEE80211_HT_CAP_SUP_WIDTH_20_40);
                sta_params->lsig_txop_protection = is_cap_supported(caps,
                        IEEE80211_HT_CAP_LSIG_TXOP_PROT);
 
-               sta_params->max_ampdu_size = sta->ht_cap.ampdu_factor;
-               sta_params->max_ampdu_density = sta->ht_cap.ampdu_density;
+               sta_params->max_ampdu_size = sta->deflink.ht_cap.ampdu_factor;
+               sta_params->max_ampdu_density = sta->deflink.ht_cap.ampdu_density;
                /* max_amsdu_size: 1 : 3839 bytes, 0 : 7935 bytes (max) */
                sta_params->max_amsdu_size = !is_cap_supported(caps,
                        IEEE80211_HT_CAP_MAX_AMSDU);
                struct ieee80211_sta *sta,
                struct wcn36xx_hal_config_sta_params_v1 *sta_params)
 {
-       if (sta->vht_cap.vht_supported) {
-               unsigned long caps = sta->vht_cap.cap;
+       if (sta->deflink.vht_cap.vht_supported) {
+               unsigned long caps = sta->deflink.vht_cap.cap;
 
-               sta_params->vht_capable = sta->vht_cap.vht_supported;
+               sta_params->vht_capable = sta->deflink.vht_cap.vht_supported;
                sta_params->vht_ldpc_enabled =
                        is_cap_supported(caps, IEEE80211_VHT_CAP_RXLDPC);
                if (get_feat_caps(wcn->fw_feat_caps, MU_MIMO)) {
 static void wcn36xx_smd_set_sta_ht_ldpc_params(struct ieee80211_sta *sta,
                struct wcn36xx_hal_config_sta_params_v1 *sta_params)
 {
-       if (sta->ht_cap.ht_supported) {
+       if (sta->deflink.ht_cap.ht_supported) {
                sta_params->ht_ldpc_enabled =
-                       is_cap_supported(sta->ht_cap.cap, IEEE80211_HT_CAP_LDPC_CODING);
+                       is_cap_supported(sta->deflink.ht_cap.cap,
+                                        IEEE80211_HT_CAP_LDPC_CODING);
        }
 }
 
 
                spin_lock_bh(&wl->lock);
                brcms_c_ampdu_tx_operational(wl->wlc, tid, buf_size,
                        (1 << (IEEE80211_HT_MAX_AMPDU_FACTOR +
-                        sta->ht_cap.ampdu_factor)) - 1);
+                        sta->deflink.ht_cap.ampdu_factor)) - 1);
                spin_unlock_bh(&wl->lock);
                /* Power save wakeup */
                break;
 
         * after assoc.. */
 
        for (i = sband->n_bitrates - 1; i >= 0; i--) {
-               if (sta->supp_rates[sband->band] & (1 << i)) {
+               if (sta->deflink.supp_rates[sband->band] & (1 << i)) {
                        rs_sta->last_txrate_idx = i;
                        break;
                }
        }
 
-       il->_3945.sta_supp_rates = sta->supp_rates[sband->band];
+       il->_3945.sta_supp_rates = sta->deflink.supp_rates[sband->band];
        /* For 5 GHz band it start at IL_FIRST_OFDM_RATE */
        if (sband->band == NL80211_BAND_5GHZ) {
                rs_sta->last_txrate_idx += IL_FIRST_OFDM_RATE;
                il_sta = NULL;
        }
 
-       rate_mask = sta->supp_rates[sband->band];
+       rate_mask = sta->deflink.supp_rates[sband->band];
 
        /* get user max rate if set */
        max_rate_idx = fls(txrc->rate_idx_mask) - 1;
 
 static bool
 il4965_rs_use_green(struct il_priv *il, struct ieee80211_sta *sta)
 {
-       return (sta->ht_cap.cap & IEEE80211_HT_CAP_GRN_FLD) &&
+       return (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_GRN_FLD) &&
               !il->ht.non_gf_sta_present;
 }
 
        lq_sta->last_rate_n_flags = tx_rate;
 done:
        /* See if there's a better rate or modulation mode to try. */
-       if (sta->supp_rates[sband->band])
+       if (sta->deflink.supp_rates[sband->band])
                il4965_rs_rate_scale_perform(il, skb, sta, lq_sta);
 }
 
        s32 rate;
        s8 is_green = lq_sta->is_green;
 
-       if (!conf_is_ht(conf) || !sta->ht_cap.ht_supported)
+       if (!conf_is_ht(conf) || !sta->deflink.ht_cap.ht_supported)
                return -1;
 
        if (sta->smps_mode == IEEE80211_SMPS_STATIC)
        tbl->max_search = IL_MAX_SEARCH;
        rate_mask = lq_sta->active_mimo2_rate;
 
-       if (il_is_ht40_tx_allowed(il, &sta->ht_cap))
+       if (il_is_ht40_tx_allowed(il, &sta->deflink.ht_cap))
                tbl->is_ht40 = 1;
        else
                tbl->is_ht40 = 0;
        u8 is_green = lq_sta->is_green;
        s32 rate;
 
-       if (!conf_is_ht(conf) || !sta->ht_cap.ht_supported)
+       if (!conf_is_ht(conf) || !sta->deflink.ht_cap.ht_supported)
                return -1;
 
        D_RATE("LQ: try to switch to SISO\n");
        tbl->max_search = IL_MAX_SEARCH;
        rate_mask = lq_sta->active_siso_rate;
 
-       if (il_is_ht40_tx_allowed(il, &sta->ht_cap))
+       if (il_is_ht40_tx_allowed(il, &sta->deflink.ht_cap))
                tbl->is_ht40 = 1;
        else
                tbl->is_ht40 = 0;
        struct il_scale_tbl_info *search_tbl =
            &(lq_sta->lq_info[(1 - lq_sta->active_tbl)]);
        struct il_rate_scale_data *win = &(tbl->win[idx]);
-       struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
+       struct ieee80211_sta_ht_cap *ht_cap = &sta->deflink.ht_cap;
        u32 sz =
            (sizeof(struct il_scale_tbl_info) -
             (sizeof(struct il_rate_scale_data) * RATE_COUNT));
        struct il_scale_tbl_info *search_tbl =
            &(lq_sta->lq_info[(1 - lq_sta->active_tbl)]);
        struct il_rate_scale_data *win = &(tbl->win[idx]);
-       struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
+       struct ieee80211_sta_ht_cap *ht_cap = &sta->deflink.ht_cap;
        u32 sz =
            (sizeof(struct il_scale_tbl_info) -
             (sizeof(struct il_rate_scale_data) * RATE_COUNT));
            (info->flags & IEEE80211_TX_CTL_NO_ACK))
                return;
 
-       lq_sta->supp_rates = sta->supp_rates[lq_sta->band];
+       lq_sta->supp_rates = sta->deflink.supp_rates[lq_sta->band];
 
        tid = il4965_rs_tl_add_packet(lq_sta, hdr);
        if (tid != MAX_TID_COUNT && (lq_sta->tx_agg_tid_en & (1 << tid))) {
        int i, j;
        struct ieee80211_hw *hw = il->hw;
        struct ieee80211_conf *conf = &il->hw->conf;
-       struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
+       struct ieee80211_sta_ht_cap *ht_cap = &sta->deflink.ht_cap;
        struct il_station_priv *sta_priv;
        struct il_lq_sta *lq_sta;
        struct ieee80211_supported_band *sband;
                                                       win[i]);
 
        lq_sta->flush_timer = 0;
-       lq_sta->supp_rates = sta->supp_rates[sband->band];
+       lq_sta->supp_rates = sta->deflink.supp_rates[sband->band];
        for (j = 0; j < LQ_SIZE; j++)
                for (i = 0; i < RATE_COUNT; i++)
                        il4965_rs_rate_scale_clear_win(&lq_sta->lq_info[j].
 
 static void
 il_set_ht_add_station(struct il_priv *il, u8 idx, struct ieee80211_sta *sta)
 {
-       struct ieee80211_sta_ht_cap *sta_ht_inf = &sta->ht_cap;
+       struct ieee80211_sta_ht_cap *sta_ht_inf = &sta->deflink.ht_cap;
        __le32 sta_flags;
 
        if (!sta || !sta_ht_inf->ht_supported)
            cpu_to_le32((u32) sta_ht_inf->
                        ampdu_density << STA_FLG_AGG_MPDU_DENSITY_POS);
 
-       if (il_is_ht40_tx_allowed(il, &sta->ht_cap))
+       if (il_is_ht40_tx_allowed(il, &sta->deflink.ht_cap))
                sta_flags |= STA_FLG_HT40_EN_MSK;
        else
                sta_flags &= ~STA_FLG_HT40_EN_MSK;
                rcu_read_lock();
                sta = ieee80211_find_sta(vif, bss_conf->bssid);
                if (sta) {
-                       struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
+                       struct ieee80211_sta_ht_cap *ht_cap = &sta->deflink.ht_cap;
                        int maxstreams;
 
                        maxstreams =
 
        lq_sta->last_rate_n_flags = tx_rate;
 done:
        /* See if there's a better rate or modulation mode to try. */
-       if (sta && sta->supp_rates[sband->band])
+       if (sta && sta->deflink.supp_rates[sband->band])
                rs_rate_scale_perform(priv, skb, sta, lq_sta);
 
        if (priv->lib->bt_params && priv->lib->bt_params->advanced_bt_coexist)
        struct iwl_station_priv *sta_priv = (void *)sta->drv_priv;
        struct iwl_rxon_context *ctx = sta_priv->ctx;
 
-       if (!conf_is_ht(conf) || !sta->ht_cap.ht_supported)
+       if (!conf_is_ht(conf) || !sta->deflink.ht_cap.ht_supported)
                return -1;
 
        if (sta->smps_mode == IEEE80211_SMPS_STATIC)
        struct iwl_station_priv *sta_priv = (void *)sta->drv_priv;
        struct iwl_rxon_context *ctx = sta_priv->ctx;
 
-       if (!conf_is_ht(conf) || !sta->ht_cap.ht_supported)
+       if (!conf_is_ht(conf) || !sta->deflink.ht_cap.ht_supported)
                return -1;
 
        if (sta->smps_mode == IEEE80211_SMPS_STATIC)
        struct iwl_station_priv *sta_priv = (void *)sta->drv_priv;
        struct iwl_rxon_context *ctx = sta_priv->ctx;
 
-       if (!conf_is_ht(conf) || !sta->ht_cap.ht_supported)
+       if (!conf_is_ht(conf) || !sta->deflink.ht_cap.ht_supported)
                return -1;
 
        IWL_DEBUG_RATE(priv, "LQ: try to switch to SISO\n");
        struct iwl_scale_tbl_info *search_tbl =
                                &(lq_sta->lq_info[(1 - lq_sta->active_tbl)]);
        struct iwl_rate_scale_data *window = &(tbl->win[index]);
-       struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
+       struct ieee80211_sta_ht_cap *ht_cap = &sta->deflink.ht_cap;
        u32 sz = (sizeof(struct iwl_scale_tbl_info) -
                  (sizeof(struct iwl_rate_scale_data) * IWL_RATE_COUNT));
        u8 start_action;
        struct iwl_scale_tbl_info *search_tbl =
                                &(lq_sta->lq_info[(1 - lq_sta->active_tbl)]);
        struct iwl_rate_scale_data *window = &(tbl->win[index]);
-       struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
+       struct ieee80211_sta_ht_cap *ht_cap = &sta->deflink.ht_cap;
        u32 sz = (sizeof(struct iwl_scale_tbl_info) -
                  (sizeof(struct iwl_rate_scale_data) * IWL_RATE_COUNT));
        u8 start_action;
        struct iwl_scale_tbl_info *search_tbl =
                                &(lq_sta->lq_info[(1 - lq_sta->active_tbl)]);
        struct iwl_rate_scale_data *window = &(tbl->win[index]);
-       struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
+       struct ieee80211_sta_ht_cap *ht_cap = &sta->deflink.ht_cap;
        u32 sz = (sizeof(struct iwl_scale_tbl_info) -
                  (sizeof(struct iwl_rate_scale_data) * IWL_RATE_COUNT));
        u8 start_action;
            info->flags & IEEE80211_TX_CTL_NO_ACK)
                return;
 
-       lq_sta->supp_rates = sta->supp_rates[lq_sta->band];
+       lq_sta->supp_rates = sta->deflink.supp_rates[lq_sta->band];
 
        tid = rs_tl_add_packet(lq_sta, hdr);
        if ((tid != IWL_MAX_TID_COUNT) &&
        int i, j;
        struct ieee80211_hw *hw = priv->hw;
        struct ieee80211_conf *conf = &priv->hw->conf;
-       struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
+       struct ieee80211_sta_ht_cap *ht_cap = &sta->deflink.ht_cap;
        struct iwl_station_priv *sta_priv;
        struct iwl_lq_sta *lq_sta;
        struct ieee80211_supported_band *sband;
                        rs_rate_scale_clear_window(&lq_sta->lq_info[j].win[i]);
 
        lq_sta->flush_timer = 0;
-       lq_sta->supp_rates = sta->supp_rates[sband->band];
+       lq_sta->supp_rates = sta->deflink.supp_rates[sband->band];
 
        IWL_DEBUG_RATE(priv, "LQ: *** rate scale station global init for station %d ***\n",
                       sta_id);
        /*
         * active legacy rates as per supported rates bitmap
         */
-       supp = sta->supp_rates[sband->band];
+       supp = sta->deflink.supp_rates[sband->band];
        lq_sta->active_legacy_rate = 0;
        for_each_set_bit(i, &supp, BITS_PER_LONG)
                lq_sta->active_legacy_rate |= BIT(sband->bitrates[i].hw_value);
 
                        break;
                }
 
-               ht_cap = &sta->ht_cap;
+               ht_cap = &sta->deflink.ht_cap;
 
                need_multiple = true;
 
 
        if (!sta)
                return true;
 
-       return sta->bandwidth >= IEEE80211_STA_RX_BW_40;
+       return sta->deflink.bandwidth >= IEEE80211_STA_RX_BW_40;
 }
 
 static void iwl_sta_calc_ht_flags(struct iwl_priv *priv,
                                  struct iwl_rxon_context *ctx,
                                  __le32 *flags, __le32 *mask)
 {
-       struct ieee80211_sta_ht_cap *sta_ht_inf = &sta->ht_cap;
+       struct ieee80211_sta_ht_cap *sta_ht_inf = &sta->deflink.ht_cap;
 
        *mask = STA_FLG_RTS_MIMO_PROT_MSK |
                STA_FLG_MIMO_DIS_MSK |
 
        /* TODO: wowlan_config_cmd->wowlan_ba_teardown_tids */
 
        wowlan_config_cmd->is_11n_connection =
-                                       ap_sta->ht_cap.ht_supported;
+                                       ap_sta->deflink.ht_cap.ht_supported;
        wowlan_config_cmd->flags = ENABLE_L3_FILTERING |
                ENABLE_NBNS_FILTERING | ENABLE_DHCP_FILTERING;
 
 
                                            struct ieee80211_sta *sta,
                                            struct iwl_he_pkt_ext_v2 *pkt_ext)
 {
-       u8 nss = (sta->he_cap.ppe_thres[0] & IEEE80211_PPE_THRES_NSS_MASK) + 1;
-       u8 *ppe = &sta->he_cap.ppe_thres[0];
+       u8 nss = (sta->deflink.he_cap.ppe_thres[0] & IEEE80211_PPE_THRES_NSS_MASK) + 1;
+       u8 *ppe = &sta->deflink.he_cap.ppe_thres[0];
        u8 ru_index_bitmap =
                u8_get_bits(*ppe,
                            IEEE80211_PPE_THRES_RU_INDEX_BITMASK_MASK);
                return;
        }
 
-       if (!sta->he_cap.has_he) {
+       if (!sta->deflink.he_cap.has_he) {
                rcu_read_unlock();
                return;
        }
                flags |= STA_CTXT_HE_RU_2MHZ_BLOCK;
 
        /* HTC flags */
-       if (sta->he_cap.he_cap_elem.mac_cap_info[0] &
+       if (sta->deflink.he_cap.he_cap_elem.mac_cap_info[0] &
            IEEE80211_HE_MAC_CAP0_HTC_HE)
                sta_ctxt_cmd.htc_flags |= cpu_to_le32(IWL_HE_HTC_SUPPORT);
-       if ((sta->he_cap.he_cap_elem.mac_cap_info[1] &
+       if ((sta->deflink.he_cap.he_cap_elem.mac_cap_info[1] &
              IEEE80211_HE_MAC_CAP1_LINK_ADAPTATION) ||
-           (sta->he_cap.he_cap_elem.mac_cap_info[2] &
+           (sta->deflink.he_cap.he_cap_elem.mac_cap_info[2] &
              IEEE80211_HE_MAC_CAP2_LINK_ADAPTATION)) {
                u8 link_adap =
-                       ((sta->he_cap.he_cap_elem.mac_cap_info[2] &
+                       ((sta->deflink.he_cap.he_cap_elem.mac_cap_info[2] &
                          IEEE80211_HE_MAC_CAP2_LINK_ADAPTATION) << 1) +
-                        (sta->he_cap.he_cap_elem.mac_cap_info[1] &
+                        (sta->deflink.he_cap.he_cap_elem.mac_cap_info[1] &
                          IEEE80211_HE_MAC_CAP1_LINK_ADAPTATION);
 
                if (link_adap == 2)
                        sta_ctxt_cmd.htc_flags |=
                                cpu_to_le32(IWL_HE_HTC_LINK_ADAP_BOTH);
        }
-       if (sta->he_cap.he_cap_elem.mac_cap_info[2] & IEEE80211_HE_MAC_CAP2_BSR)
+       if (sta->deflink.he_cap.he_cap_elem.mac_cap_info[2] & IEEE80211_HE_MAC_CAP2_BSR)
                sta_ctxt_cmd.htc_flags |= cpu_to_le32(IWL_HE_HTC_BSR_SUPP);
-       if (sta->he_cap.he_cap_elem.mac_cap_info[3] &
+       if (sta->deflink.he_cap.he_cap_elem.mac_cap_info[3] &
            IEEE80211_HE_MAC_CAP3_OMI_CONTROL)
                sta_ctxt_cmd.htc_flags |= cpu_to_le32(IWL_HE_HTC_OMI_SUPP);
-       if (sta->he_cap.he_cap_elem.mac_cap_info[4] & IEEE80211_HE_MAC_CAP4_BQR)
+       if (sta->deflink.he_cap.he_cap_elem.mac_cap_info[4] & IEEE80211_HE_MAC_CAP4_BQR)
                sta_ctxt_cmd.htc_flags |= cpu_to_le32(IWL_HE_HTC_BQR_SUPP);
 
        /*
               sizeof(sta_ctxt_cmd.pkt_ext));
 
        /* If PPE Thresholds exist, parse them into a FW-familiar format. */
-       if (sta->he_cap.he_cap_elem.phy_cap_info[6] &
+       if (sta->deflink.he_cap.he_cap_elem.phy_cap_info[6] &
                IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT) {
                iwl_mvm_set_pkt_ext_from_he_ppe(mvm, sta,
                                                &sta_ctxt_cmd.pkt_ext);
        * according to Common Nominal Packet Padding fiels. */
        } else {
                u8 nominal_padding =
-                       u8_get_bits(sta->he_cap.he_cap_elem.phy_cap_info[9],
+                       u8_get_bits(sta->deflink.he_cap.he_cap_elem.phy_cap_info[9],
                                    IEEE80211_HE_PHY_CAP9_NOMINAL_PKT_PADDING_MASK);
                if (nominal_padding != IEEE80211_HE_PHY_CAP9_NOMINAL_PKT_PADDING_RESERVED)
                        iwl_mvm_set_pkt_ext_from_nominal_padding(&sta_ctxt_cmd.pkt_ext,
                                                                 &flags);
        }
 
-       if (sta->he_cap.he_cap_elem.mac_cap_info[2] &
+       if (sta->deflink.he_cap.he_cap_elem.mac_cap_info[2] &
            IEEE80211_HE_MAC_CAP2_32BIT_BA_BITMAP)
                flags |= STA_CTXT_HE_32BIT_BA_BITMAP;
 
-       if (sta->he_cap.he_cap_elem.mac_cap_info[2] &
+       if (sta->deflink.he_cap.he_cap_elem.mac_cap_info[2] &
            IEEE80211_HE_MAC_CAP2_ACK_EN)
                flags |= STA_CTXT_HE_ACK_ENABLED;
 
                }
 
                if (vif->type == NL80211_IFTYPE_STATION)
-                       vif->bss_conf.he_support = sta->he_cap.has_he;
+                       vif->bss_conf.he_support = sta->deflink.he_cap.has_he;
 
                if (sta->tdls &&
                    (vif->p2p ||
        } else if (old_state == IEEE80211_STA_AUTH &&
                   new_state == IEEE80211_STA_ASSOC) {
                if (vif->type == NL80211_IFTYPE_AP) {
-                       vif->bss_conf.he_support = sta->he_cap.has_he;
+                       vif->bss_conf.he_support = sta->deflink.he_cap.has_he;
                        mvmvif->ap_assoc_sta_count++;
                        iwl_mvm_mac_ctxt_changed(mvm, vif, false, NULL);
                        if (vif->bss_conf.he_support &&
                            !iwlwifi_mod_params.disable_11ax)
                                iwl_mvm_cfg_he_sta(mvm, vif, mvm_sta->sta_id);
                } else if (vif->type == NL80211_IFTYPE_STATION) {
-                       vif->bss_conf.he_support = sta->he_cap.has_he;
+                       vif->bss_conf.he_support = sta->deflink.he_cap.has_he;
 
                        mvmvif->he_ru_2mhz_block = false;
-                       if (sta->he_cap.has_he)
+                       if (sta->deflink.he_cap.has_he)
                                iwl_mvm_check_he_obss_narrow_bw_ru(hw, vif);
 
                        iwl_mvm_mac_ctxt_changed(mvm, vif, false, NULL);
 
 
 static u8 rs_fw_bw_from_sta_bw(struct ieee80211_sta *sta)
 {
-       switch (sta->bandwidth) {
+       switch (sta->deflink.bandwidth) {
        case IEEE80211_STA_RX_BW_160:
                return IWL_TLC_MNG_CH_WIDTH_160MHZ;
        case IEEE80211_STA_RX_BW_80:
 
 static u8 rs_fw_sgi_cw_support(struct ieee80211_sta *sta)
 {
-       struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
-       struct ieee80211_sta_vht_cap *vht_cap = &sta->vht_cap;
-       struct ieee80211_sta_he_cap *he_cap = &sta->he_cap;
+       struct ieee80211_sta_ht_cap *ht_cap = &sta->deflink.ht_cap;
+       struct ieee80211_sta_vht_cap *vht_cap = &sta->deflink.vht_cap;
+       struct ieee80211_sta_he_cap *he_cap = &sta->deflink.he_cap;
        u8 supp = 0;
 
        if (he_cap->has_he)
                                  struct ieee80211_sta *sta,
                                  struct ieee80211_supported_band *sband)
 {
-       struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
-       struct ieee80211_sta_vht_cap *vht_cap = &sta->vht_cap;
-       struct ieee80211_sta_he_cap *he_cap = &sta->he_cap;
+       struct ieee80211_sta_ht_cap *ht_cap = &sta->deflink.ht_cap;
+       struct ieee80211_sta_vht_cap *vht_cap = &sta->deflink.vht_cap;
+       struct ieee80211_sta_he_cap *he_cap = &sta->deflink.he_cap;
        bool vht_ena = vht_cap->vht_supported;
        u16 flags = 0;
 
 {
        u16 supp;
        int i, highest_mcs;
-       u8 max_nss = sta->rx_nss;
+       u8 max_nss = sta->deflink.rx_nss;
        struct ieee80211_vht_cap ieee_vht_cap = {
                .vht_cap_info = cpu_to_le32(vht_cap->cap),
                .supp_mcs = vht_cap->vht_mcs,
                        continue;
 
                supp = BIT(highest_mcs + 1) - 1;
-               if (sta->bandwidth == IEEE80211_STA_RX_BW_20)
+               if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_20)
                        supp &= ~BIT(IWL_TLC_MNG_HT_RATE_MCS9);
 
                cmd->ht_rates[i][IWL_TLC_MCS_PER_BW_80] = cpu_to_le16(supp);
                 * configuration is supported - only for MCS 0 since we already
                 * decoded the MCS bits anyway ourselves.
                 */
-               if (sta->bandwidth == IEEE80211_STA_RX_BW_160 &&
+               if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160 &&
                    ieee80211_get_vht_max_nss(&ieee_vht_cap,
                                              IEEE80211_VHT_CHANWIDTH_160MHZ,
                                              0, true, nss) >= nss)
                           struct ieee80211_supported_band *sband,
                           struct iwl_tlc_config_cmd_v4 *cmd)
 {
-       const struct ieee80211_sta_he_cap *he_cap = &sta->he_cap;
+       const struct ieee80211_sta_he_cap *he_cap = &sta->deflink.he_cap;
        u16 mcs_160 = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_160);
        u16 mcs_80 = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_80);
        u16 tx_mcs_80 =
        u16 tx_mcs_160 =
                le16_to_cpu(sband->iftype_data->he_cap.he_mcs_nss_supp.tx_mcs_160);
        int i;
-       u8 nss = sta->rx_nss;
+       u8 nss = sta->deflink.rx_nss;
 
        /* the station support only a single receive chain */
        if (sta->smps_mode == IEEE80211_SMPS_STATIC)
        int i;
        u16 supp = 0;
        unsigned long tmp; /* must be unsigned long for for_each_set_bit */
-       const struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
-       const struct ieee80211_sta_vht_cap *vht_cap = &sta->vht_cap;
-       const struct ieee80211_sta_he_cap *he_cap = &sta->he_cap;
+       const struct ieee80211_sta_ht_cap *ht_cap = &sta->deflink.ht_cap;
+       const struct ieee80211_sta_vht_cap *vht_cap = &sta->deflink.vht_cap;
+       const struct ieee80211_sta_he_cap *he_cap = &sta->deflink.he_cap;
 
        /* non HT rates */
-       tmp = sta->supp_rates[sband->band];
+       tmp = sta->deflink.supp_rates[sband->band];
        for_each_set_bit(i, &tmp, BITS_PER_LONG)
                supp |= BIT(sband->bitrates[i].hw_value);
 
 u16 rs_fw_get_max_amsdu_len(struct ieee80211_sta *sta)
 {
        struct iwl_mvm_sta *mvmsta = iwl_mvm_sta_from_mac80211(sta);
-       const struct ieee80211_sta_vht_cap *vht_cap = &sta->vht_cap;
-       const struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
+       const struct ieee80211_sta_vht_cap *vht_cap = &sta->deflink.vht_cap;
+       const struct ieee80211_sta_ht_cap *ht_cap = &sta->deflink.ht_cap;
 
        if (mvmsta->vif->bss_conf.chandef.chan->band == NL80211_BAND_6GHZ) {
-               switch (le16_get_bits(sta->he_6ghz_capa.capa,
+               switch (le16_get_bits(sta->deflink.he_6ghz_capa.capa,
                                      IEEE80211_HE_6GHZ_CAP_MAX_MPDU_LEN)) {
                case IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_11454:
                        return IEEE80211_MAX_MPDU_LEN_VHT_11454;
 
                          struct rs_rate *rate,
                          const struct rs_tx_column *next_col)
 {
-       if (!sta->ht_cap.ht_supported)
+       if (!sta->deflink.ht_cap.ht_supported)
                return false;
 
        if (sta->smps_mode == IEEE80211_SMPS_STATIC)
                          struct rs_rate *rate,
                          const struct rs_tx_column *next_col)
 {
-       if (!sta->ht_cap.ht_supported)
+       if (!sta->deflink.ht_cap.ht_supported)
                return false;
 
        return true;
                         struct rs_rate *rate,
                         const struct rs_tx_column *next_col)
 {
-       struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
-       struct ieee80211_sta_vht_cap *vht_cap = &sta->vht_cap;
+       struct ieee80211_sta_ht_cap *ht_cap = &sta->deflink.ht_cap;
+       struct ieee80211_sta_vht_cap *vht_cap = &sta->deflink.vht_cap;
 
        if (is_ht20(rate) && (ht_cap->cap &
                             IEEE80211_HT_CAP_SGI_20))
 
 static u32 rs_bw_from_sta_bw(struct ieee80211_sta *sta)
 {
-       struct ieee80211_sta_vht_cap *sta_vht_cap = &sta->vht_cap;
+       struct ieee80211_sta_vht_cap *sta_vht_cap = &sta->deflink.vht_cap;
        struct ieee80211_vht_cap vht_cap = {
                .vht_cap_info = cpu_to_le32(sta_vht_cap->cap),
                .supp_mcs = sta_vht_cap->vht_mcs,
        };
 
-       switch (sta->bandwidth) {
+       switch (sta->deflink.bandwidth) {
        case IEEE80211_STA_RX_BW_160:
                /*
                 * Don't use 160 MHz if VHT extended NSS support
                if (ieee80211_get_vht_max_nss(&vht_cap,
                                              IEEE80211_VHT_CHANWIDTH_160MHZ,
                                              0, true,
-                                             sta->rx_nss) < sta->rx_nss)
+                                             sta->deflink.rx_nss) < sta->deflink.rx_nss)
                        return RATE_MCS_CHAN_WIDTH_80;
                return RATE_MCS_CHAN_WIDTH_160;
        case IEEE80211_STA_RX_BW_80:
         * In case of VHT/HT when the rssi is low fallback to the case of
         * legacy rates.
         */
-       if (sta->vht_cap.vht_supported &&
+       if (sta->deflink.vht_cap.vht_supported &&
            best_rssi > IWL_RS_LOW_RSSI_THRESHOLD) {
                /*
                 * In AP mode, when a new station associates, rs is initialized
                        nentries = ARRAY_SIZE(rs_optimal_rates_vht_20mhz);
                        break;
                default:
-                       IWL_ERR(mvm, "Invalid BW %d\n", sta->bandwidth);
+                       IWL_ERR(mvm, "Invalid BW %d\n",
+                               sta->deflink.bandwidth);
                        goto out;
                }
 
                active_rate = lq_sta->active_siso_rate;
                rate->type = LQ_VHT_SISO;
                rate->bw = bw;
-       } else if (sta->ht_cap.ht_supported &&
+       } else if (sta->deflink.ht_cap.ht_supported &&
                   best_rssi > IWL_RS_LOW_RSSI_THRESHOLD) {
                initial_rates = rs_optimal_rates_ht;
                nentries = ARRAY_SIZE(rs_optimal_rates_ht);
 
                        /* VHT MCS9 isn't valid for 20Mhz for NSS=1,2 */
                        if (i == IWL_RATE_MCS_9_INDEX &&
-                           sta->bandwidth == IEEE80211_STA_RX_BW_20)
+                           sta->deflink.bandwidth == IEEE80211_STA_RX_BW_20)
                                continue;
 
                        lq_sta->active_siso_rate |= BIT(i);
                }
        }
 
-       if (sta->rx_nss < 2)
+       if (sta->deflink.rx_nss < 2)
                return;
 
        highest_mcs = rs_vht_highest_rx_mcs_index(vht_cap, 2);
 
                        /* VHT MCS9 isn't valid for 20Mhz for NSS=1,2 */
                        if (i == IWL_RATE_MCS_9_INDEX &&
-                           sta->bandwidth == IEEE80211_STA_RX_BW_20)
+                           sta->deflink.bandwidth == IEEE80211_STA_RX_BW_20)
                                continue;
 
                        lq_sta->active_mimo2_rate |= BIT(i);
 {
        int i, j;
        struct ieee80211_hw *hw = mvm->hw;
-       struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
-       struct ieee80211_sta_vht_cap *vht_cap = &sta->vht_cap;
+       struct ieee80211_sta_ht_cap *ht_cap = &sta->deflink.ht_cap;
+       struct ieee80211_sta_vht_cap *vht_cap = &sta->deflink.vht_cap;
        struct iwl_mvm_sta *mvmsta = iwl_mvm_sta_from_mac80211(sta);
        struct iwl_lq_sta *lq_sta = &mvmsta->lq_sta.rs_drv;
        struct ieee80211_supported_band *sband;
        /*
         * active legacy rates as per supported rates bitmap
         */
-       supp = sta->supp_rates[sband->band];
+       supp = sta->deflink.supp_rates[sband->band];
        lq_sta->active_legacy_rate = 0;
        for_each_set_bit(i, &supp, BITS_PER_LONG)
                lq_sta->active_legacy_rate |= BIT(sband->bitrates[i].hw_value);
        IWL_DEBUG_RATE(mvm, "reduced txpower: %d\n", reduced_txp);
 done:
        /* See if there's a better rate or modulation mode to try. */
-       if (sta->supp_rates[info->band])
+       if (sta->deflink.supp_rates[info->band])
                rs_rate_scale_perform(mvm, sta, lq_sta, tid, ndp);
 }
 
 
         * capabilities of the AP station, and choose the watermark accordingly.
         */
        if (sta) {
-               if (sta->ht_cap.ht_supported ||
-                   sta->vht_cap.vht_supported ||
-                   sta->he_cap.has_he) {
-                       switch (sta->rx_nss) {
+               if (sta->deflink.ht_cap.ht_supported ||
+                   sta->deflink.vht_cap.vht_supported ||
+                   sta->deflink.he_cap.has_he) {
+                       switch (sta->deflink.rx_nss) {
                        case 1:
                                watermark = SF_W_MARK_SISO;
                                break;
 
                }
        }
 
-       switch (sta->bandwidth) {
+       switch (sta->deflink.bandwidth) {
        case IEEE80211_STA_RX_BW_320:
        case IEEE80211_STA_RX_BW_160:
                add_sta_cmd.station_flags |= cpu_to_le32(STA_FLG_FAT_EN_160MHZ);
                add_sta_cmd.station_flags |= cpu_to_le32(STA_FLG_FAT_EN_40MHZ);
                fallthrough;
        case IEEE80211_STA_RX_BW_20:
-               if (sta->ht_cap.ht_supported)
+               if (sta->deflink.ht_cap.ht_supported)
                        add_sta_cmd.station_flags |=
                                cpu_to_le32(STA_FLG_FAT_EN_20MHZ);
                break;
        }
 
-       switch (sta->rx_nss) {
+       switch (sta->deflink.rx_nss) {
        case 1:
                add_sta_cmd.station_flags |= cpu_to_le32(STA_FLG_MIMO_EN_SISO);
                break;
                break;
        }
 
-       if (sta->ht_cap.ht_supported) {
+       if (sta->deflink.ht_cap.ht_supported) {
                add_sta_cmd.station_flags_msk |=
                        cpu_to_le32(STA_FLG_MAX_AGG_SIZE_MSK |
                                    STA_FLG_AGG_MPDU_DENS_MSK);
 
-               mpdu_dens = sta->ht_cap.ampdu_density;
+               mpdu_dens = sta->deflink.ht_cap.ampdu_density;
        }
 
        if (mvm_sta->vif->bss_conf.chandef.chan->band == NL80211_BAND_6GHZ) {
                        cpu_to_le32(STA_FLG_MAX_AGG_SIZE_MSK |
                                    STA_FLG_AGG_MPDU_DENS_MSK);
 
-               mpdu_dens = le16_get_bits(sta->he_6ghz_capa.capa,
+               mpdu_dens = le16_get_bits(sta->deflink.he_6ghz_capa.capa,
                                          IEEE80211_HE_6GHZ_CAP_MIN_MPDU_START);
-               agg_size = le16_get_bits(sta->he_6ghz_capa.capa,
-                               IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP);
-       } else
-       if (sta->vht_cap.vht_supported) {
-               agg_size = sta->vht_cap.cap &
+               agg_size = le16_get_bits(sta->deflink.he_6ghz_capa.capa,
+                                        IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP);
+       } else if (sta->deflink.vht_cap.vht_supported) {
+               agg_size = sta->deflink.vht_cap.cap &
                        IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK;
                agg_size >>=
                        IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT;
-       } else if (sta->ht_cap.ht_supported) {
-               agg_size = sta->ht_cap.ampdu_factor;
+       } else if (sta->deflink.ht_cap.ht_supported) {
+               agg_size = sta->deflink.ht_cap.ampdu_factor;
        }
 
        /* D6.0 10.12.2 A-MPDU length limit rules
         * Maximum AMPDU Length Exponent Extension field in its HE
         * Capabilities element
         */
-       if (sta->he_cap.has_he)
-               agg_size += u8_get_bits(sta->he_cap.he_cap_elem.mac_cap_info[3],
+       if (sta->deflink.he_cap.has_he)
+               agg_size += u8_get_bits(sta->deflink.he_cap.he_cap_elem.mac_cap_info[3],
                                        IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_MASK);
 
        /* Limit to max A-MPDU supported by FW */
                /* this queue isn't used for traffic (cab_queue) */
                if (IS_ERR_OR_NULL(sta)) {
                        size = IWL_MGMT_QUEUE_SIZE;
-               } else if (sta->he_cap.has_he) {
+               } else if (sta->deflink.he_cap.has_he) {
                        /* support for 256 ba size */
                        size = IWL_DEFAULT_QUEUE_SIZE_HE;
                } else {
 
        int lmac = iwl_mvm_get_lmac_id(mvm->fw, band);
 
        /* For HE redirect to trigger based fifos */
-       if (sta->he_cap.has_he && !WARN_ON(!iwl_mvm_has_new_tx_api(mvm)))
+       if (sta->deflink.he_cap.has_he && !WARN_ON(!iwl_mvm_has_new_tx_api(mvm)))
                ac += 4;
 
        txf = iwl_mvm_mac_ac_to_tx_fifo(mvm, ac);
         * section 8.7.3 NOTE 3).
         */
        if (info->flags & IEEE80211_TX_CTL_AMPDU &&
-           !sta->vht_cap.vht_supported)
+           !sta->deflink.vht_cap.vht_supported)
                max_amsdu_len = min_t(unsigned int, max_amsdu_len, 4095);
 
        /* Sub frame header + SNAP + IP header + TCP header + MSS */
        if (WARN_ON_ONCE(mvmsta->sta_id == IWL_MVM_INVALID_STA))
                return -1;
 
-       if (unlikely(ieee80211_is_any_nullfunc(fc)) && sta->he_cap.has_he)
+       if (unlikely(ieee80211_is_any_nullfunc(fc)) && sta->deflink.he_cap.has_he)
                return -1;
 
        if (unlikely(ieee80211_is_probe_resp(fc)))
 
        u32 bw = U32_MAX;
        enum nl80211_chan_width confbw = NL80211_CHAN_WIDTH_20_NOHT;
 
-       switch (sta->bandwidth) {
+       switch (sta->deflink.bandwidth) {
 #define C(_bw) case IEEE80211_STA_RX_BW_##_bw: bw = _bw; break
        C(20);
        C(40);
 
        WARN(bw > hwsim_get_chanwidth(confbw),
             "intf %pM: bad STA %pM bandwidth %d MHz (%d) > channel config %d MHz (%d)\n",
-            vif->addr, sta->addr, bw, sta->bandwidth,
+            vif->addr, sta->addr, bw, sta->deflink.bandwidth,
             hwsim_get_chanwidth(data->bw), data->bw);
 }
 
 
 
        txpriority = index;
 
-       if (priv->ap_fw && sta && sta->ht_cap.ht_supported && !eapol_frame &&
+       if (priv->ap_fw && sta && sta->deflink.ht_cap.ht_supported && !eapol_frame &&
            ieee80211_is_data_qos(wh->frame_control)) {
                tid = qos & 0xf;
                mwl8k_tx_count_packet(sta, tid);
        cmd->create_params.reset_seq_no_flag = 1;
 
        cmd->create_params.param_info =
-               (stream->sta->ht_cap.ampdu_factor &
+               (stream->sta->deflink.ht_cap.ampdu_factor &
                 IEEE80211_HT_AMPDU_PARM_FACTOR) |
-               ((stream->sta->ht_cap.ampdu_density << 2) &
+               ((stream->sta->deflink.ht_cap.ampdu_density << 2) &
                 IEEE80211_HT_AMPDU_PARM_DENSITY);
 
        cmd->create_params.flags =
        cmd->stn_id = cpu_to_le16(sta->aid);
        cmd->action = cpu_to_le16(MWL8K_STA_ACTION_ADD);
        if (hw->conf.chandef.chan->band == NL80211_BAND_2GHZ)
-               rates = sta->supp_rates[NL80211_BAND_2GHZ];
+               rates = sta->deflink.supp_rates[NL80211_BAND_2GHZ];
        else
-               rates = sta->supp_rates[NL80211_BAND_5GHZ] << 5;
+               rates = sta->deflink.supp_rates[NL80211_BAND_5GHZ] << 5;
        cmd->legacy_rates = cpu_to_le32(rates);
-       if (sta->ht_cap.ht_supported) {
-               cmd->ht_rates[0] = sta->ht_cap.mcs.rx_mask[0];
-               cmd->ht_rates[1] = sta->ht_cap.mcs.rx_mask[1];
-               cmd->ht_rates[2] = sta->ht_cap.mcs.rx_mask[2];
-               cmd->ht_rates[3] = sta->ht_cap.mcs.rx_mask[3];
-               cmd->ht_capabilities_info = cpu_to_le16(sta->ht_cap.cap);
-               cmd->mac_ht_param_info = (sta->ht_cap.ampdu_factor & 3) |
-                       ((sta->ht_cap.ampdu_density & 7) << 2);
+       if (sta->deflink.ht_cap.ht_supported) {
+               cmd->ht_rates[0] = sta->deflink.ht_cap.mcs.rx_mask[0];
+               cmd->ht_rates[1] = sta->deflink.ht_cap.mcs.rx_mask[1];
+               cmd->ht_rates[2] = sta->deflink.ht_cap.mcs.rx_mask[2];
+               cmd->ht_rates[3] = sta->deflink.ht_cap.mcs.rx_mask[3];
+               cmd->ht_capabilities_info = cpu_to_le16(sta->deflink.ht_cap.cap);
+               cmd->mac_ht_param_info = (sta->deflink.ht_cap.ampdu_factor & 3) |
+                       ((sta->deflink.ht_cap.ampdu_density & 7) << 2);
                cmd->is_qos_sta = 1;
        }
 
        p = &cmd->peer_info;
        p->peer_type = MWL8K_PEER_TYPE_ACCESSPOINT;
        p->basic_caps = cpu_to_le16(vif->bss_conf.assoc_capability);
-       p->ht_support = sta->ht_cap.ht_supported;
-       p->ht_caps = cpu_to_le16(sta->ht_cap.cap);
-       p->extended_ht_caps = (sta->ht_cap.ampdu_factor & 3) |
-               ((sta->ht_cap.ampdu_density & 7) << 2);
+       p->ht_support = sta->deflink.ht_cap.ht_supported;
+       p->ht_caps = cpu_to_le16(sta->deflink.ht_cap.cap);
+       p->extended_ht_caps = (sta->deflink.ht_cap.ampdu_factor & 3) |
+               ((sta->deflink.ht_cap.ampdu_density & 7) << 2);
        if (hw->conf.chandef.chan->band == NL80211_BAND_2GHZ)
-               rates = sta->supp_rates[NL80211_BAND_2GHZ];
+               rates = sta->deflink.supp_rates[NL80211_BAND_2GHZ];
        else
-               rates = sta->supp_rates[NL80211_BAND_5GHZ] << 5;
+               rates = sta->deflink.supp_rates[NL80211_BAND_5GHZ] << 5;
        legacy_rate_mask_to_array(p->legacy_rates, rates);
-       memcpy(p->ht_rates, &sta->ht_cap.mcs, 16);
+       memcpy(p->ht_rates, &sta->deflink.ht_cap.mcs, 16);
        p->interop = 1;
        p->amsdu_enabled = 0;
 
                }
 
                if (hw->conf.chandef.chan->band == NL80211_BAND_2GHZ) {
-                       ap_legacy_rates = ap->supp_rates[NL80211_BAND_2GHZ];
+                       ap_legacy_rates = ap->deflink.supp_rates[NL80211_BAND_2GHZ];
                } else {
                        ap_legacy_rates =
-                               ap->supp_rates[NL80211_BAND_5GHZ] << 5;
+                               ap->deflink.supp_rates[NL80211_BAND_5GHZ] << 5;
                }
-               memcpy(ap_mcs_rates, &ap->ht_cap.mcs, 16);
+               memcpy(ap_mcs_rates, &ap->deflink.ht_cap.mcs, 16);
 
                rcu_read_unlock();
 
                ret = mwl8k_cmd_update_stadb_add(hw, vif, sta);
                if (ret >= 0) {
                        MWL8K_STA(sta)->peer_id = ret;
-                       if (sta->ht_cap.ht_supported)
+                       if (sta->deflink.ht_cap.ht_supported)
                                MWL8K_STA(sta)->is_ampdu_allowed = true;
                        ret = 0;
                }
 
 
        addr = mt7603_wtbl1_addr(idx);
 
-       ampdu_density = sta->ht_cap.ampdu_density;
+       ampdu_density = sta->deflink.ht_cap.ampdu_density;
        if (ampdu_density < IEEE80211_HT_MPDU_DENSITY_4)
                ampdu_density = IEEE80211_HT_MPDU_DENSITY_4;
 
        val = mt76_rr(dev, addr + 2 * 4);
        val &= MT_WTBL1_W2_KEY_TYPE | MT_WTBL1_W2_ADMISSION_CONTROL;
-       val |= FIELD_PREP(MT_WTBL1_W2_AMPDU_FACTOR, sta->ht_cap.ampdu_factor) |
-              FIELD_PREP(MT_WTBL1_W2_MPDU_DENSITY, sta->ht_cap.ampdu_density) |
+       val |= FIELD_PREP(MT_WTBL1_W2_AMPDU_FACTOR,
+                         sta->deflink.ht_cap.ampdu_factor) |
+              FIELD_PREP(MT_WTBL1_W2_MPDU_DENSITY,
+                         sta->deflink.ht_cap.ampdu_density) |
               MT_WTBL1_W2_TXS_BAF_REPORT;
 
-       if (sta->ht_cap.cap)
+       if (sta->deflink.ht_cap.cap)
                val |= MT_WTBL1_W2_HT;
-       if (sta->vht_cap.cap)
+       if (sta->deflink.vht_cap.cap)
                val |= MT_WTBL1_W2_VHT;
 
        mt76_wr(dev, addr + 2 * 4, val);
        val = mt76_rr(dev, addr + 9 * 4);
        val &= ~(MT_WTBL2_W9_SHORT_GI_20 | MT_WTBL2_W9_SHORT_GI_40 |
                 MT_WTBL2_W9_SHORT_GI_80);
-       if (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20)
+       if (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_20)
                val |= MT_WTBL2_W9_SHORT_GI_20;
-       if (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40)
+       if (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_40)
                val |= MT_WTBL2_W9_SHORT_GI_40;
        mt76_wr(dev, addr + 9 * 4, val);
 }
 
 static void
 mt76_connac_mcu_sta_he_tlv(struct sk_buff *skb, struct ieee80211_sta *sta)
 {
-       struct ieee80211_sta_he_cap *he_cap = &sta->he_cap;
+       struct ieee80211_sta_he_cap *he_cap = &sta->deflink.he_cap;
        struct ieee80211_he_cap_elem *elem = &he_cap->he_cap_elem;
        struct sta_rec_he *he;
        struct tlv *tlv;
 
        he->he_cap = cpu_to_le32(cap);
 
-       switch (sta->bandwidth) {
+       switch (sta->deflink.bandwidth) {
        case IEEE80211_STA_RX_BW_160:
                if (elem->phy_cap_info[0] &
                    IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G)
        u8 mode = 0;
 
        if (sta) {
-               ht_cap = &sta->ht_cap;
-               vht_cap = &sta->vht_cap;
-               he_cap = &sta->he_cap;
+               ht_cap = &sta->deflink.ht_cap;
+               vht_cap = &sta->deflink.vht_cap;
+               he_cap = &sta->deflink.he_cap;
        } else {
                struct ieee80211_supported_band *sband;
 
        u16 supp_rates;
 
        /* starec ht */
-       if (sta->ht_cap.ht_supported) {
+       if (sta->deflink.ht_cap.ht_supported) {
                struct sta_rec_ht *ht;
 
                tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_HT, sizeof(*ht));
                ht = (struct sta_rec_ht *)tlv;
-               ht->ht_cap = cpu_to_le16(sta->ht_cap.cap);
+               ht->ht_cap = cpu_to_le16(sta->deflink.ht_cap.cap);
        }
 
        /* starec vht */
-       if (sta->vht_cap.vht_supported) {
+       if (sta->deflink.vht_cap.vht_supported) {
                struct sta_rec_vht *vht;
                int len;
 
                len = is_mt7921(dev) ? sizeof(*vht) : sizeof(*vht) - 4;
                tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_VHT, len);
                vht = (struct sta_rec_vht *)tlv;
-               vht->vht_cap = cpu_to_le32(sta->vht_cap.cap);
-               vht->vht_rx_mcs_map = sta->vht_cap.vht_mcs.rx_mcs_map;
-               vht->vht_tx_mcs_map = sta->vht_cap.vht_mcs.tx_mcs_map;
+               vht->vht_cap = cpu_to_le32(sta->deflink.vht_cap.cap);
+               vht->vht_rx_mcs_map = sta->deflink.vht_cap.vht_mcs.rx_mcs_map;
+               vht->vht_tx_mcs_map = sta->deflink.vht_cap.vht_mcs.tx_mcs_map;
        }
 
        /* starec uapsd */
        if (!is_mt7921(dev))
                return;
 
-       if (sta->ht_cap.ht_supported || sta->he_cap.has_he)
+       if (sta->deflink.ht_cap.ht_supported || sta->deflink.he_cap.has_he)
                mt76_connac_mcu_sta_amsdu_tlv(skb, sta, vif);
 
        /* starec he */
-       if (sta->he_cap.has_he) {
+       if (sta->deflink.he_cap.has_he) {
                mt76_connac_mcu_sta_he_tlv(skb, sta);
                if (band == NL80211_BAND_6GHZ &&
                    sta_state == MT76_STA_INFO_STATE_ASSOC) {
                        tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_HE_6G,
                                                      sizeof(*he_6g_capa));
                        he_6g_capa = (struct sta_rec_he_6g_capa *)tlv;
-                       he_6g_capa->capa = sta->he_6ghz_capa.capa;
+                       he_6g_capa->capa = sta->deflink.he_6ghz_capa.capa;
                }
        }
 
        phy->basic_rate = cpu_to_le16((u16)vif->bss_conf.basic_rates);
        phy->rcpi = rcpi;
        phy->ampdu = FIELD_PREP(IEEE80211_HT_AMPDU_PARM_FACTOR,
-                               sta->ht_cap.ampdu_factor) |
+                               sta->deflink.ht_cap.ampdu_factor) |
                     FIELD_PREP(IEEE80211_HT_AMPDU_PARM_DENSITY,
-                               sta->ht_cap.ampdu_density);
+                               sta->deflink.ht_cap.ampdu_density);
 
        tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_RA, sizeof(*ra_info));
        ra_info = (struct sta_rec_ra_info *)tlv;
 
-       supp_rates = sta->supp_rates[band];
+       supp_rates = sta->deflink.supp_rates[band];
        if (band == NL80211_BAND_2GHZ)
                supp_rates = FIELD_PREP(RA_LEGACY_OFDM, supp_rates >> 4) |
                             FIELD_PREP(RA_LEGACY_CCK, supp_rates & 0xf);
 
        ra_info->legacy = cpu_to_le16(supp_rates);
 
-       if (sta->ht_cap.ht_supported)
-               memcpy(ra_info->rx_mcs_bitmask, sta->ht_cap.mcs.rx_mask,
+       if (sta->deflink.ht_cap.ht_supported)
+               memcpy(ra_info->rx_mcs_bitmask,
+                      sta->deflink.ht_cap.mcs.rx_mask,
                       HT_MCS_MASK_NUM);
 
        tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_STATE, sizeof(*state));
        state = (struct sta_rec_state *)tlv;
        state->state = sta_state;
 
-       if (sta->vht_cap.vht_supported) {
-               state->vht_opmode = sta->bandwidth;
-               state->vht_opmode |= (sta->rx_nss - 1) <<
+       if (sta->deflink.vht_cap.vht_supported) {
+               state->vht_opmode = sta->deflink.bandwidth;
+               state->vht_opmode |= (sta->deflink.rx_nss - 1) <<
                        IEEE80211_OPMODE_NOTIF_RX_NSS_SHIFT;
        }
 }
        struct tlv *tlv;
        u32 flags = 0;
 
-       if (sta->ht_cap.ht_supported || sta->he_6ghz_capa.capa) {
+       if (sta->deflink.ht_cap.ht_supported || sta->deflink.he_6ghz_capa.capa) {
                tlv = mt76_connac_mcu_add_nested_tlv(skb, WTBL_HT, sizeof(*ht),
                                                     wtbl_tlv, sta_wtbl);
                ht = (struct wtbl_ht *)tlv;
                ht->ldpc = ht_ldpc &&
-                          !!(sta->ht_cap.cap & IEEE80211_HT_CAP_LDPC_CODING);
+                          !!(sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_LDPC_CODING);
 
-               if (sta->ht_cap.ht_supported) {
-                       ht->af = sta->ht_cap.ampdu_factor;
-                       ht->mm = sta->ht_cap.ampdu_density;
+               if (sta->deflink.ht_cap.ht_supported) {
+                       ht->af = sta->deflink.ht_cap.ampdu_factor;
+                       ht->mm = sta->deflink.ht_cap.ampdu_density;
                } else {
-                       ht->af = le16_get_bits(sta->he_6ghz_capa.capa,
+                       ht->af = le16_get_bits(sta->deflink.he_6ghz_capa.capa,
                                               IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP);
-                       ht->mm = le16_get_bits(sta->he_6ghz_capa.capa,
+                       ht->mm = le16_get_bits(sta->deflink.he_6ghz_capa.capa,
                                               IEEE80211_HE_6GHZ_CAP_MIN_MPDU_START);
                }
 
                ht->ht = true;
        }
 
-       if (sta->vht_cap.vht_supported || sta->he_6ghz_capa.capa) {
+       if (sta->deflink.vht_cap.vht_supported || sta->deflink.he_6ghz_capa.capa) {
                struct wtbl_vht *vht;
                u8 af;
 
                                                     sta_wtbl);
                vht = (struct wtbl_vht *)tlv;
                vht->ldpc = vht_ldpc &&
-                           !!(sta->vht_cap.cap & IEEE80211_VHT_CAP_RXLDPC);
+                           !!(sta->deflink.vht_cap.cap & IEEE80211_VHT_CAP_RXLDPC);
                vht->vht = true;
 
                af = FIELD_GET(IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK,
-                              sta->vht_cap.cap);
+                              sta->deflink.vht_cap.cap);
                if (ht)
                        ht->af = max(ht->af, af);
        }
 
        mt76_connac_mcu_wtbl_smps_tlv(skb, sta, sta_wtbl, wtbl_tlv);
 
-       if (is_connac_v1(dev) && sta->ht_cap.ht_supported) {
+       if (is_connac_v1(dev) && sta->deflink.ht_cap.ht_supported) {
                /* sgi */
                u32 msk = MT_WTBL_W5_SHORT_GI_20 | MT_WTBL_W5_SHORT_GI_40 |
                          MT_WTBL_W5_SHORT_GI_80 | MT_WTBL_W5_SHORT_GI_160;
                                                     sizeof(*raw), wtbl_tlv,
                                                     sta_wtbl);
 
-               if (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20)
+               if (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_20)
                        flags |= MT_WTBL_W5_SHORT_GI_20;
-               if (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40)
+               if (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_40)
                        flags |= MT_WTBL_W5_SHORT_GI_40;
 
-               if (sta->vht_cap.vht_supported) {
-                       if (sta->vht_cap.cap & IEEE80211_VHT_CAP_SHORT_GI_80)
+               if (sta->deflink.vht_cap.vht_supported) {
+                       if (sta->deflink.vht_cap.cap & IEEE80211_VHT_CAP_SHORT_GI_80)
                                flags |= MT_WTBL_W5_SHORT_GI_80;
-                       if (sta->vht_cap.cap & IEEE80211_VHT_CAP_SHORT_GI_160)
+                       if (sta->deflink.vht_cap.cap & IEEE80211_VHT_CAP_SHORT_GI_160)
                                flags |= MT_WTBL_W5_SHORT_GI_160;
                }
                raw = (struct wtbl_raw *)tlv;
                return 0x38;
 
        if (sta) {
-               ht_cap = &sta->ht_cap;
-               vht_cap = &sta->vht_cap;
-               he_cap = &sta->he_cap;
+               ht_cap = &sta->deflink.ht_cap;
+               vht_cap = &sta->deflink.vht_cap;
+               he_cap = &sta->deflink.he_cap;
        } else {
                struct ieee80211_supported_band *sband;
 
 
                txwi->ack_ctl |= MT_TXWI_ACK_CTL_NSEQ;
        if ((info->flags & IEEE80211_TX_CTL_AMPDU) && sta) {
                u8 ba_size = IEEE80211_MIN_AMPDU_BUF;
-               u8 ampdu_density = sta->ht_cap.ampdu_density;
+               u8 ampdu_density = sta->deflink.ht_cap.ampdu_density;
 
-               ba_size <<= sta->ht_cap.ampdu_factor;
+               ba_size <<= sta->deflink.ht_cap.ampdu_factor;
                ba_size = min_t(int, 63, ba_size - 1);
                if (info->flags & IEEE80211_TX_CTL_RATE_CTRL_PROBE)
                        ba_size = 0;
 
 
        phy.ldpc = (phy.bw || phy.ldpc) * GENMASK(2, 0);
        for (i = 0; i <= phy.bw; i++) {
-               phy.sgi |= gi << (i << sta->he_cap.has_he);
-               phy.he_ltf |= he_ltf << (i << sta->he_cap.has_he);
+               phy.sgi |= gi << (i << sta->deflink.he_cap.has_he);
+               phy.he_ltf |= he_ltf << (i << sta->deflink.he_cap.has_he);
        }
        field = RATE_PARAM_FIXED;
 
 
        u16 fc, tid;
        u32 val;
 
-       if (!sta || !(sta->ht_cap.ht_supported || sta->he_cap.has_he))
+       if (!sta || !(sta->deflink.ht_cap.ht_supported || sta->deflink.he_cap.has_he))
                return;
 
        tid = le32_get_bits(txwi[1], MT_TXD1_TID);
 
        struct mt7915_dev *dev = msta->vif->phy->dev;
        enum nl80211_band band = msta->vif->phy->mt76->chandef.chan->band;
        const u16 *mask = msta->vif->bitrate_mask.control[band].he_mcs;
-       int nss, max_nss = sta->rx_nss > 3 ? 4 : sta->rx_nss;
+       int nss, max_nss = sta->deflink.rx_nss > 3 ? 4 : sta->deflink.rx_nss;
 
        for (nss = 0; nss < max_nss; nss++) {
                int mcs;
 
                /* only support 2ss on 160MHz for mt7915 */
                if (is_mt7915(&dev->mt76) && nss > 1 &&
-                   sta->bandwidth == IEEE80211_STA_RX_BW_160)
+                   sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160)
                        break;
        }
 
 {
        struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
        struct mt7915_dev *dev = msta->vif->phy->dev;
-       u16 mcs_map = le16_to_cpu(sta->vht_cap.vht_mcs.rx_mcs_map);
-       int nss, max_nss = sta->rx_nss > 3 ? 4 : sta->rx_nss;
+       u16 mcs_map = le16_to_cpu(sta->deflink.vht_cap.vht_mcs.rx_mcs_map);
+       int nss, max_nss = sta->deflink.rx_nss > 3 ? 4 : sta->deflink.rx_nss;
        u16 mcs;
 
        for (nss = 0; nss < max_nss; nss++, mcs_map >>= 2) {
 
                /* only support 2ss on 160MHz for mt7915 */
                if (is_mt7915(&dev->mt76) && nss > 1 &&
-                   sta->bandwidth == IEEE80211_STA_RX_BW_160)
+                   sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160)
                        break;
        }
 }
 mt7915_mcu_set_sta_ht_mcs(struct ieee80211_sta *sta, u8 *ht_mcs,
                          const u8 *mask)
 {
-       int nss, max_nss = sta->rx_nss > 3 ? 4 : sta->rx_nss;
+       int nss, max_nss = sta->deflink.rx_nss > 3 ? 4 : sta->deflink.rx_nss;
 
        for (nss = 0; nss < max_nss; nss++)
-               ht_mcs[nss] = sta->ht_cap.mcs.rx_mask[nss] & mask[nss];
+               ht_mcs[nss] = sta->deflink.ht_cap.mcs.rx_mask[nss] & mask[nss];
 }
 
 static int
                      struct ieee80211_vif *vif)
 {
        struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
-       struct ieee80211_he_cap_elem *elem = &sta->he_cap.he_cap_elem;
+       struct ieee80211_he_cap_elem *elem = &sta->deflink.he_cap.he_cap_elem;
        struct ieee80211_he_mcs_nss_supp mcs_map;
        struct sta_rec_he *he;
        struct tlv *tlv;
        u32 cap = 0;
 
-       if (!sta->he_cap.has_he)
+       if (!sta->deflink.he_cap.has_he)
                return;
 
        tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_HE, sizeof(*he));
 
        he->he_cap = cpu_to_le32(cap);
 
-       mcs_map = sta->he_cap.he_mcs_nss_supp;
-       switch (sta->bandwidth) {
+       mcs_map = sta->deflink.he_cap.he_mcs_nss_supp;
+       switch (sta->deflink.bandwidth) {
        case IEEE80211_STA_RX_BW_160:
                if (elem->phy_cap_info[0] &
                    IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G)
                        struct ieee80211_vif *vif)
 {
        struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
-       struct ieee80211_he_cap_elem *elem = &sta->he_cap.he_cap_elem;
+       struct ieee80211_he_cap_elem *elem = &sta->deflink.he_cap.he_cap_elem;
        struct sta_rec_muru *muru;
        struct tlv *tlv;
 
        muru->cfg.mimo_ul_en = true;
        muru->cfg.ofdma_dl_en = true;
 
-       if (sta->vht_cap.vht_supported)
+       if (sta->deflink.vht_cap.vht_supported)
                muru->mimo_dl.vht_mu_bfee =
-                       !!(sta->vht_cap.cap & IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE);
+                       !!(sta->deflink.vht_cap.cap & IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE);
 
-       if (!sta->he_cap.has_he)
+       if (!sta->deflink.he_cap.has_he)
                return;
 
        muru->mimo_dl.partial_bw_dl_mimo =
        struct sta_rec_ht *ht;
        struct tlv *tlv;
 
-       if (!sta->ht_cap.ht_supported)
+       if (!sta->deflink.ht_cap.ht_supported)
                return;
 
        tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_HT, sizeof(*ht));
 
        ht = (struct sta_rec_ht *)tlv;
-       ht->ht_cap = cpu_to_le16(sta->ht_cap.cap);
+       ht->ht_cap = cpu_to_le16(sta->deflink.ht_cap.cap);
 }
 
 static void
        struct sta_rec_vht *vht;
        struct tlv *tlv;
 
-       if (!sta->vht_cap.vht_supported)
+       if (!sta->deflink.vht_cap.vht_supported)
                return;
 
        tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_VHT, sizeof(*vht));
 
        vht = (struct sta_rec_vht *)tlv;
-       vht->vht_cap = cpu_to_le32(sta->vht_cap.cap);
-       vht->vht_rx_mcs_map = sta->vht_cap.vht_mcs.rx_mcs_map;
-       vht->vht_tx_mcs_map = sta->vht_cap.vht_mcs.tx_mcs_map;
+       vht->vht_cap = cpu_to_le32(sta->deflink.vht_cap.cap);
+       vht->vht_rx_mcs_map = sta->deflink.vht_cap.vht_mcs.rx_mcs_map;
+       vht->vht_tx_mcs_map = sta->deflink.vht_cap.vht_mcs.tx_mcs_map;
 }
 
 static void
        if (!bfee && tx_ant < 2)
                return false;
 
-       if (sta->he_cap.has_he) {
-               struct ieee80211_he_cap_elem *pe = &sta->he_cap.he_cap_elem;
+       if (sta->deflink.he_cap.has_he) {
+               struct ieee80211_he_cap_elem *pe = &sta->deflink.he_cap.he_cap_elem;
 
                if (bfee)
                        return mvif->cap.he_su_ebfee &&
                               HE_PHY(CAP4_SU_BEAMFORMEE, pe->phy_cap_info[4]);
        }
 
-       if (sta->vht_cap.vht_supported) {
-               u32 cap = sta->vht_cap.cap;
+       if (sta->deflink.vht_cap.vht_supported) {
+               u32 cap = sta->deflink.vht_cap.cap;
 
                if (bfee)
                        return mvif->cap.vht_su_ebfee &&
 mt7915_mcu_sta_bfer_ht(struct ieee80211_sta *sta, struct mt7915_phy *phy,
                       struct sta_rec_bf *bf)
 {
-       struct ieee80211_mcs_info *mcs = &sta->ht_cap.mcs;
+       struct ieee80211_mcs_info *mcs = &sta->deflink.ht_cap.mcs;
        u8 n = 0;
 
        bf->tx_mode = MT_PHY_TYPE_HT;
 mt7915_mcu_sta_bfer_vht(struct ieee80211_sta *sta, struct mt7915_phy *phy,
                        struct sta_rec_bf *bf, bool explicit)
 {
-       struct ieee80211_sta_vht_cap *pc = &sta->vht_cap;
+       struct ieee80211_sta_vht_cap *pc = &sta->deflink.vht_cap;
        struct ieee80211_sta_vht_cap *vc = &phy->mt76->sband_5g.sband.vht_cap;
        u16 mcs_map = le16_to_cpu(pc->vht_mcs.rx_mcs_map);
        u8 nss_mcs = mt7915_mcu_get_sta_nss(mcs_map);
                bf->ncol = min_t(u8, nss_mcs, bf->nrow);
                bf->ibf_ncol = bf->ncol;
 
-               if (sta->bandwidth == IEEE80211_STA_RX_BW_160)
+               if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160)
                        bf->nrow = 1;
        } else {
                bf->nrow = tx_ant;
                bf->ncol = min_t(u8, nss_mcs, bf->nrow);
                bf->ibf_ncol = nss_mcs;
 
-               if (sta->bandwidth == IEEE80211_STA_RX_BW_160)
+               if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160)
                        bf->ibf_nrow = 1;
        }
 }
 mt7915_mcu_sta_bfer_he(struct ieee80211_sta *sta, struct ieee80211_vif *vif,
                       struct mt7915_phy *phy, struct sta_rec_bf *bf)
 {
-       struct ieee80211_sta_he_cap *pc = &sta->he_cap;
+       struct ieee80211_sta_he_cap *pc = &sta->deflink.he_cap;
        struct ieee80211_he_cap_elem *pe = &pc->he_cap_elem;
        const struct ieee80211_sta_he_cap *vc =
                mt76_connac_get_he_phy_cap(phy->mt76, vif);
        bf->ncol = min_t(u8, nss_mcs, bf->nrow);
        bf->ibf_ncol = bf->ncol;
 
-       if (sta->bandwidth != IEEE80211_STA_RX_BW_160)
+       if (sta->deflink.bandwidth != IEEE80211_STA_RX_BW_160)
                return;
 
        /* go over for 160MHz and 80p80 */
        };
        bool ebf;
 
-       if (!(sta->ht_cap.ht_supported || sta->he_cap.has_he))
+       if (!(sta->deflink.ht_cap.ht_supported || sta->deflink.he_cap.has_he))
                return;
 
        ebf = mt7915_is_ebf_supported(phy, vif, sta, false);
         * vht: support eBF and iBF
         * ht: iBF only, since mac80211 lacks of eBF support
         */
-       if (sta->he_cap.has_he && ebf)
+       if (sta->deflink.he_cap.has_he && ebf)
                mt7915_mcu_sta_bfer_he(sta, vif, phy, bf);
-       else if (sta->vht_cap.vht_supported)
+       else if (sta->deflink.vht_cap.vht_supported)
                mt7915_mcu_sta_bfer_vht(sta, phy, bf, ebf);
-       else if (sta->ht_cap.ht_supported)
+       else if (sta->deflink.ht_cap.ht_supported)
                mt7915_mcu_sta_bfer_ht(sta, phy, bf);
        else
                return;
 
        bf->bf_cap = ebf ? ebf : dev->ibf << 1;
-       bf->bw = sta->bandwidth;
-       bf->ibf_dbw = sta->bandwidth;
+       bf->bw = sta->deflink.bandwidth;
+       bf->ibf_dbw = sta->deflink.bandwidth;
        bf->ibf_nrow = tx_ant;
 
-       if (!ebf && sta->bandwidth <= IEEE80211_STA_RX_BW_40 && !bf->ncol)
+       if (!ebf && sta->deflink.bandwidth <= IEEE80211_STA_RX_BW_40 && !bf->ncol)
                bf->ibf_timeout = 0x48;
        else
                bf->ibf_timeout = 0x18;
        else
                bf->mem_20m = matrix[bf->nrow][bf->ncol];
 
-       switch (sta->bandwidth) {
+       switch (sta->deflink.bandwidth) {
        case IEEE80211_STA_RX_BW_160:
        case IEEE80211_STA_RX_BW_80:
                bf->mem_total = bf->mem_20m * 2;
        struct tlv *tlv;
        u8 nrow = 0;
 
-       if (!(sta->vht_cap.vht_supported || sta->he_cap.has_he))
+       if (!(sta->deflink.vht_cap.vht_supported || sta->deflink.he_cap.has_he))
                return;
 
        if (!mt7915_is_ebf_supported(phy, vif, sta, true))
        tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_BFEE, sizeof(*bfee));
        bfee = (struct sta_rec_bfee *)tlv;
 
-       if (sta->he_cap.has_he) {
-               struct ieee80211_he_cap_elem *pe = &sta->he_cap.he_cap_elem;
+       if (sta->deflink.he_cap.has_he) {
+               struct ieee80211_he_cap_elem *pe = &sta->deflink.he_cap.he_cap_elem;
 
                nrow = HE_PHY(CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_MASK,
                              pe->phy_cap_info[5]);
-       } else if (sta->vht_cap.vht_supported) {
-               struct ieee80211_sta_vht_cap *pc = &sta->vht_cap;
+       } else if (sta->deflink.vht_cap.vht_supported) {
+               struct ieee80211_sta_vht_cap *pc = &sta->deflink.vht_cap;
 
                nrow = FIELD_GET(IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK,
                                 pc->cap);
        do {                                                                    \
                u8 i, gi = mask->control[band]._gi;                             \
                gi = (_he) ? gi : gi == NL80211_TXRATE_FORCE_SGI;               \
-               for (i = 0; i <= sta->bandwidth; i++) {                         \
+               for (i = 0; i <= sta->deflink.bandwidth; i++) {                 \
                        phy.sgi |= gi << (i << (_he));                          \
                        phy.he_ltf |= mask->control[band].he_ltf << (i << (_he));\
                }                                                               \
                }                                                               \
        } while (0)
 
-       if (sta->he_cap.has_he) {
+       if (sta->deflink.he_cap.has_he) {
                __sta_phy_bitrate_mask_check(he_mcs, he_gi, 1);
-       } else if (sta->vht_cap.vht_supported) {
+       } else if (sta->deflink.vht_cap.vht_supported) {
                __sta_phy_bitrate_mask_check(vht_mcs, gi, 0);
-       } else if (sta->ht_cap.ht_supported) {
+       } else if (sta->deflink.ht_cap.ht_supported) {
                __sta_phy_bitrate_mask_check(ht_mcs, gi, 0);
        } else {
                nrates = hweight32(mask->control[band].legacy);
                 * actual txrate hardware sends out.
                 */
                addr = mt7915_mac_wtbl_lmac_addr(dev, msta->wcid.idx, 7);
-               if (sta->he_cap.has_he)
+               if (sta->deflink.he_cap.has_he)
                        mt76_rmw_field(dev, addr, GENMASK(31, 24), phy.sgi);
                else
                        mt76_rmw_field(dev, addr, GENMASK(15, 12), phy.sgi);
        enum nl80211_band band = chandef->chan->band;
        struct sta_rec_ra *ra;
        struct tlv *tlv;
-       u32 supp_rate = sta->supp_rates[band];
+       u32 supp_rate = sta->deflink.supp_rates[band];
        u32 cap = sta->wme ? STA_CAP_WMM : 0;
 
        tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_RA, sizeof(*ra));
        ra->auto_rate = true;
        ra->phy_mode = mt76_connac_get_phy_mode(mphy, vif, band, sta);
        ra->channel = chandef->chan->hw_value;
-       ra->bw = sta->bandwidth;
-       ra->phy.bw = sta->bandwidth;
+       ra->bw = sta->deflink.bandwidth;
+       ra->phy.bw = sta->deflink.bandwidth;
        ra->mmps_mode = mt7915_mcu_get_mmps_mode(sta->smps_mode);
 
        if (supp_rate) {
                }
        }
 
-       if (sta->ht_cap.ht_supported) {
+       if (sta->deflink.ht_cap.ht_supported) {
                ra->supp_mode |= MODE_HT;
-               ra->af = sta->ht_cap.ampdu_factor;
-               ra->ht_gf = !!(sta->ht_cap.cap & IEEE80211_HT_CAP_GRN_FLD);
+               ra->af = sta->deflink.ht_cap.ampdu_factor;
+               ra->ht_gf = !!(sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_GRN_FLD);
 
                cap |= STA_CAP_HT;
-               if (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20)
+               if (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_20)
                        cap |= STA_CAP_SGI_20;
-               if (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40)
+               if (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_40)
                        cap |= STA_CAP_SGI_40;
-               if (sta->ht_cap.cap & IEEE80211_HT_CAP_TX_STBC)
+               if (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_TX_STBC)
                        cap |= STA_CAP_TX_STBC;
-               if (sta->ht_cap.cap & IEEE80211_HT_CAP_RX_STBC)
+               if (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_RX_STBC)
                        cap |= STA_CAP_RX_STBC;
                if (mvif->cap.ht_ldpc &&
-                   (sta->ht_cap.cap & IEEE80211_HT_CAP_LDPC_CODING))
+                   (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_LDPC_CODING))
                        cap |= STA_CAP_LDPC;
 
                mt7915_mcu_set_sta_ht_mcs(sta, ra->ht_mcs,
                ra->supp_ht_mcs = *(__le32 *)ra->ht_mcs;
        }
 
-       if (sta->vht_cap.vht_supported) {
+       if (sta->deflink.vht_cap.vht_supported) {
                u8 af;
 
                ra->supp_mode |= MODE_VHT;
                af = FIELD_GET(IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK,
-                              sta->vht_cap.cap);
+                              sta->deflink.vht_cap.cap);
                ra->af = max_t(u8, ra->af, af);
 
                cap |= STA_CAP_VHT;
-               if (sta->vht_cap.cap & IEEE80211_VHT_CAP_SHORT_GI_80)
+               if (sta->deflink.vht_cap.cap & IEEE80211_VHT_CAP_SHORT_GI_80)
                        cap |= STA_CAP_VHT_SGI_80;
-               if (sta->vht_cap.cap & IEEE80211_VHT_CAP_SHORT_GI_160)
+               if (sta->deflink.vht_cap.cap & IEEE80211_VHT_CAP_SHORT_GI_160)
                        cap |= STA_CAP_VHT_SGI_160;
-               if (sta->vht_cap.cap & IEEE80211_VHT_CAP_TXSTBC)
+               if (sta->deflink.vht_cap.cap & IEEE80211_VHT_CAP_TXSTBC)
                        cap |= STA_CAP_VHT_TX_STBC;
-               if (sta->vht_cap.cap & IEEE80211_VHT_CAP_RXSTBC_1)
+               if (sta->deflink.vht_cap.cap & IEEE80211_VHT_CAP_RXSTBC_1)
                        cap |= STA_CAP_VHT_RX_STBC;
                if (mvif->cap.vht_ldpc &&
-                   (sta->vht_cap.cap & IEEE80211_VHT_CAP_RXLDPC))
+                   (sta->deflink.vht_cap.cap & IEEE80211_VHT_CAP_RXLDPC))
                        cap |= STA_CAP_VHT_LDPC;
 
                mt7915_mcu_set_sta_vht_mcs(sta, ra->supp_vht_mcs,
                                           mask->control[band].vht_mcs);
        }
 
-       if (sta->he_cap.has_he) {
+       if (sta->deflink.he_cap.has_he) {
                ra->supp_mode |= MODE_HE;
                cap |= STA_CAP_HE;
 
-               if (sta->he_6ghz_capa.capa)
-                       ra->af = le16_get_bits(sta->he_6ghz_capa.capa,
+               if (sta->deflink.he_6ghz_capa.capa)
+                       ra->af = le16_get_bits(sta->deflink.he_6ghz_capa.capa,
                                               IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP);
        }
 
 
        u16 fc, tid;
        u32 val;
 
-       if (!sta || !(sta->ht_cap.ht_supported || sta->he_cap.has_he))
+       if (!sta || !(sta->deflink.ht_cap.ht_supported || sta->deflink.he_cap.has_he))
                return;
 
        tid = le32_get_bits(txwi[1], MT_TXD1_TID);
 
                msta = container_of(wcid, struct mt76_sta, wcid);
                sta = container_of(msta, struct ieee80211_sta, drv_priv);
 
-               min_factor = min(min_factor, sta->ht_cap.ampdu_factor);
+               min_factor = min(min_factor, sta->deflink.ht_cap.ampdu_factor);
        }
        rcu_read_unlock();
 
 
        if ((info->flags & IEEE80211_TX_CTL_AMPDU) && sta) {
                u8 ba_size = IEEE80211_MIN_AMPDU_BUF;
 
-               ba_size <<= sta->ht_cap.ampdu_factor;
+               ba_size <<= sta->deflink.ht_cap.ampdu_factor;
                ba_size = min_t(int, 63, ba_size);
                if (info->flags & IEEE80211_TX_CTL_RATE_CTRL_PROBE)
                        ba_size = 0;
                txwi->flags =
                        cpu_to_le16(MT_TXWI_FLAGS_AMPDU |
                                    FIELD_PREP(MT_TXWI_FLAGS_MPDU_DENSITY,
-                                              sta->ht_cap.ampdu_density));
+                                              sta->deflink.ht_cap.ampdu_density));
                if (info->flags & IEEE80211_TX_CTL_RATE_CTRL_PROBE)
                        txwi->flags = 0;
        }
 
         * do not have a choice if some connected STA is not capable to
         * receive the same amount of data like the others.
         */
-       if (sta->ht_cap.ht_supported) {
-               drv_data->ampdu_factor_cnt[sta->ht_cap.ampdu_factor & 3]++;
+       if (sta->deflink.ht_cap.ht_supported) {
+               drv_data->ampdu_factor_cnt[sta->deflink.ht_cap.ampdu_factor & 3]++;
                rt2800_set_max_psdu_len(rt2x00dev);
        }
 
        struct rt2x00_sta *sta_priv = sta_to_rt2x00_sta(sta);
        int wcid = sta_priv->wcid;
 
-       if (sta->ht_cap.ht_supported) {
-               drv_data->ampdu_factor_cnt[sta->ht_cap.ampdu_factor & 3]--;
+       if (sta->deflink.ht_cap.ht_supported) {
+               drv_data->ampdu_factor_cnt[sta->deflink.ht_cap.ampdu_factor & 3]--;
                rt2800_set_max_psdu_len(rt2x00dev);
        }
 
 
        if (sta) {
                sta_priv = sta_to_rt2x00_sta(sta);
                txdesc->u.ht.wcid = sta_priv->wcid;
-               density = sta->ht_cap.ampdu_density;
+               density = sta->deflink.ht_cap.ampdu_density;
        }
 
        /*
 
        u16 network_type = WIRELESS_MODE_UNKNOWN;
 
        if (hw->conf.chandef.chan->band == NL80211_BAND_5GHZ) {
-               if (sta->vht_cap.vht_supported)
+               if (sta->deflink.vht_cap.vht_supported)
                        network_type = WIRELESS_MODE_AC;
-               else if (sta->ht_cap.ht_supported)
+               else if (sta->deflink.ht_cap.ht_supported)
                        network_type = WIRELESS_MODE_N_5G;
 
                network_type |= WIRELESS_MODE_A;
        } else {
-               if (sta->vht_cap.vht_supported)
+               if (sta->deflink.vht_cap.vht_supported)
                        network_type = WIRELESS_MODE_AC;
-               else if (sta->ht_cap.ht_supported)
+               else if (sta->deflink.ht_cap.ht_supported)
                        network_type = WIRELESS_MODE_N_24G;
 
-               if (sta->supp_rates[0] <= 0xf)
+               if (sta->deflink.supp_rates[0] <= 0xf)
                        network_type |= WIRELESS_MODE_B;
-               else if (sta->supp_rates[0] & 0xf)
+               else if (sta->deflink.supp_rates[0] & 0xf)
                        network_type |= (WIRELESS_MODE_B | WIRELESS_MODE_G);
                else
                        network_type |= WIRELESS_MODE_G;
                                goto error;
                        }
 
-                       if (sta->ht_cap.ht_supported)
+                       if (sta->deflink.ht_cap.ht_supported)
                                dev_info(dev, "%s: HT supported\n", __func__);
-                       if (sta->vht_cap.vht_supported)
+                       if (sta->deflink.vht_cap.vht_supported)
                                dev_info(dev, "%s: VHT supported\n", __func__);
 
                        /* TODO: Set bits 28-31 for rate adaptive id */
-                       ramask = (sta->supp_rates[0] & 0xfff) |
-                               sta->ht_cap.mcs.rx_mask[0] << 12 |
-                               sta->ht_cap.mcs.rx_mask[1] << 20;
-                       if (sta->ht_cap.cap &
+                       ramask = (sta->deflink.supp_rates[0] & 0xfff) |
+                               sta->deflink.ht_cap.mcs.rx_mask[0] << 12 |
+                               sta->deflink.ht_cap.mcs.rx_mask[1] << 20;
+                       if (sta->deflink.ht_cap.cap &
                            (IEEE80211_HT_CAP_SGI_40 | IEEE80211_HT_CAP_SGI_20))
                                sgi = 1;
                        rcu_read_unlock();
        /* (tx_info->flags & IEEE80211_TX_CTL_AMPDU) && */
        ampdu_enable = false;
        if (ieee80211_is_data_qos(hdr->frame_control) && sta) {
-               if (sta->ht_cap.ht_supported) {
+               if (sta->deflink.ht_cap.ht_supported) {
                        u32 ampdu, val32;
                        u8 *qc = ieee80211_get_qos_ctl(hdr);
                        u8 tid = qc[0] & IEEE80211_QOS_CTL_TID_MASK;
 
-                       ampdu = (u32)sta->ht_cap.ampdu_density;
+                       ampdu = (u32)sta->deflink.ht_cap.ampdu_density;
                        val32 = ampdu << TXDESC_AMPDU_DENSITY_SHIFT;
                        tx_desc->txdw2 |= cpu_to_le32(val32);
 
 
        if (rate_flag & IEEE80211_TX_RC_SHORT_GI ||
            (ieee80211_is_data_qos(hdr->frame_control) &&
-            sta && sta->ht_cap.cap &
+            sta && sta->deflink.ht_cap.cap &
             (IEEE80211_HT_CAP_SGI_40 | IEEE80211_HT_CAP_SGI_20)))
                sgi = true;
 
        switch (action) {
        case IEEE80211_AMPDU_TX_START:
                dev_dbg(dev, "%s: IEEE80211_AMPDU_TX_START\n", __func__);
-               ampdu_factor = sta->ht_cap.ampdu_factor;
-               ampdu_density = sta->ht_cap.ampdu_density;
+               ampdu_factor = sta->deflink.ht_cap.ampdu_factor;
+               ampdu_density = sta->deflink.ht_cap.ampdu_density;
                rtl8xxxu_set_ampdu_factor(priv, ampdu_factor);
                rtl8xxxu_set_ampdu_min_space(priv, ampdu_density);
                dev_dbg(dev,
                u32 rate_bitmap = 0;
 
                rcu_read_lock();
-               rate_bitmap = (sta->supp_rates[0] & 0xfff) |
-                               (sta->ht_cap.mcs.rx_mask[0] << 12) |
-                               (sta->ht_cap.mcs.rx_mask[1] << 20);
-               if (sta->ht_cap.cap &
+               rate_bitmap = (sta->deflink.supp_rates[0] & 0xfff) |
+                               (sta->deflink.ht_cap.mcs.rx_mask[0] << 12) |
+                               (sta->deflink.ht_cap.mcs.rx_mask[1] << 20);
+               if (sta->deflink.ht_cap.cap &
                    (IEEE80211_HT_CAP_SGI_40 | IEEE80211_HT_CAP_SGI_20))
                        sgi = 1;
                rcu_read_unlock();
 
        if (sta == NULL)
                return;
 
-       sgi_40 = sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40;
-       sgi_20 = sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20;
-       sgi_80 = sta->vht_cap.cap & IEEE80211_VHT_CAP_SHORT_GI_80;
+       sgi_40 = sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_40;
+       sgi_20 = sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_20;
+       sgi_80 = sta->deflink.vht_cap.cap & IEEE80211_VHT_CAP_SHORT_GI_80;
 
-       if ((!sta->ht_cap.ht_supported) && (!sta->vht_cap.vht_supported))
+       if (!sta->deflink.ht_cap.ht_supported &&
+           !sta->deflink.vht_cap.vht_supported)
                return;
 
        if (!sgi_40 && !sgi_20)
        } else if (mac->opmode == NL80211_IFTYPE_AP ||
                 mac->opmode == NL80211_IFTYPE_ADHOC ||
                 mac->opmode == NL80211_IFTYPE_MESH_POINT) {
-               bw_40 = sta->ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40;
-               bw_80 = sta->vht_cap.vht_supported;
+               bw_40 = sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40;
+               bw_80 = sta->deflink.vht_cap.vht_supported;
        }
 
        if (bw_80) {
        if (mac->opmode == NL80211_IFTYPE_AP ||
            mac->opmode == NL80211_IFTYPE_ADHOC ||
            mac->opmode == NL80211_IFTYPE_MESH_POINT) {
-               if (!(sta->ht_cap.ht_supported) ||
-                   !(sta->ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40))
+               if (!(sta->deflink.ht_cap.ht_supported) ||
+                   !(sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40))
                        return;
        } else if (mac->opmode == NL80211_IFTYPE_STATION) {
-               if (!mac->bw_40 || !(sta->ht_cap.ht_supported))
+               if (!mac->bw_40 || !(sta->deflink.ht_cap.ht_supported))
                        return;
        }
        if (tcb_desc->multicast || tcb_desc->broadcast)
                if (mac->opmode == NL80211_IFTYPE_AP ||
                    mac->opmode == NL80211_IFTYPE_ADHOC ||
                    mac->opmode == NL80211_IFTYPE_MESH_POINT) {
-                       if (!(sta->vht_cap.vht_supported))
+                       if (!(sta->deflink.vht_cap.vht_supported))
                                return;
                } else if (mac->opmode == NL80211_IFTYPE_STATION) {
                        if (!mac->bw_80 ||
-                           !(sta->vht_cap.vht_supported))
+                           !(sta->deflink.vht_cap.vht_supported))
                                return;
                }
                if (tcb_desc->hw_rate <=
        struct rtl_priv *rtlpriv = rtl_priv(hw);
        struct rtl_phy *rtlphy = &(rtlpriv->phy);
        u8 hw_rate;
-       u16 tx_mcs_map = le16_to_cpu(sta->vht_cap.vht_mcs.tx_mcs_map);
+       u16 tx_mcs_map = le16_to_cpu(sta->deflink.vht_cap.vht_mcs.tx_mcs_map);
 
        if ((get_rf_type(rtlphy) == RF_2T2R) &&
            (tx_mcs_map & 0x000c) != 0x000c) {
        u8 hw_rate;
 
        if (get_rf_type(rtlphy) == RF_2T2R &&
-           sta->ht_cap.mcs.rx_mask[1] != 0)
+           sta->deflink.ht_cap.mcs.rx_mask[1] != 0)
                hw_rate = rtlpriv->cfg->maps[RTL_RC_HT_RATEMCS15];
        else
                hw_rate = rtlpriv->cfg->maps[RTL_RC_HT_RATEMCS7];
                         *and N rate will all be controlled by FW
                         *when tcb_desc->use_driver_rate = false
                         */
-                       if (sta && sta->vht_cap.vht_supported) {
+                       if (sta && sta->deflink.vht_cap.vht_supported) {
                                tcb_desc->hw_rate =
                                _rtl_get_vht_highest_n_rate(hw, sta);
                        } else {
-                               if (sta && sta->ht_cap.ht_supported) {
+                               if (sta && sta->deflink.ht_cap.ht_supported) {
                                        tcb_desc->hw_rate =
                                                _rtl_get_highest_n_rate(hw, sta);
                                } else {
 
                spin_unlock_bh(&rtlpriv->locks.entry_list_lock);
                if (rtlhal->current_bandtype == BAND_ON_2_4G) {
                        sta_entry->wireless_mode = WIRELESS_MODE_G;
-                       if (sta->supp_rates[0] <= 0xf)
+                       if (sta->deflink.supp_rates[0] <= 0xf)
                                sta_entry->wireless_mode = WIRELESS_MODE_B;
-                       if (sta->ht_cap.ht_supported)
+                       if (sta->deflink.ht_cap.ht_supported)
                                sta_entry->wireless_mode = WIRELESS_MODE_N_24G;
 
                        if (vif->type == NL80211_IFTYPE_ADHOC)
                                sta_entry->wireless_mode = WIRELESS_MODE_G;
                } else if (rtlhal->current_bandtype == BAND_ON_5G) {
                        sta_entry->wireless_mode = WIRELESS_MODE_A;
-                       if (sta->ht_cap.ht_supported)
+                       if (sta->deflink.ht_cap.ht_supported)
                                sta_entry->wireless_mode = WIRELESS_MODE_N_5G;
-                       if (sta->vht_cap.vht_supported)
+                       if (sta->deflink.vht_cap.vht_supported)
                                sta_entry->wireless_mode = WIRELESS_MODE_AC_5G;
 
                        if (vif->type == NL80211_IFTYPE_ADHOC)
                }
                /*disable cck rate for p2p*/
                if (mac->p2p)
-                       sta->supp_rates[0] &= 0xfffffff0;
+                       sta->deflink.supp_rates[0] &= 0xfffffff0;
 
                memcpy(sta_entry->mac_addr, sta->addr, ETH_ALEN);
                rtl_dbg(rtlpriv, COMP_MAC80211, DBG_DMESG,
                        rtl_dbg(rtlpriv, COMP_EASY_CONCURRENT, DBG_LOUD,
                                "send PS STATIC frame\n");
                        if (rtlpriv->dm.supp_phymode_switch) {
-                               if (sta->ht_cap.ht_supported)
+                               if (sta->deflink.ht_cap.ht_supported)
                                        rtl_send_smps_action(hw, sta,
                                                        IEEE80211_SMPS_STATIC);
                        }
                        if (rtlhal->current_bandtype == BAND_ON_5G) {
                                mac->mode = WIRELESS_MODE_A;
                        } else {
-                               if (sta->supp_rates[0] <= 0xf)
+                               if (sta->deflink.supp_rates[0] <= 0xf)
                                        mac->mode = WIRELESS_MODE_B;
                                else
                                        mac->mode = WIRELESS_MODE_G;
                        }
 
-                       if (sta->ht_cap.ht_supported) {
+                       if (sta->deflink.ht_cap.ht_supported) {
                                if (rtlhal->current_bandtype == BAND_ON_2_4G)
                                        mac->mode = WIRELESS_MODE_N_24G;
                                else
                                        mac->mode = WIRELESS_MODE_N_5G;
                        }
 
-                       if (sta->vht_cap.vht_supported) {
+                       if (sta->deflink.vht_cap.vht_supported) {
                                if (rtlhal->current_bandtype == BAND_ON_5G)
                                        mac->mode = WIRELESS_MODE_AC_5G;
                                else
                rcu_read_lock();
                sta = ieee80211_find_sta(vif, (u8 *)bss_conf->bssid);
                if (sta) {
-                       if (sta->ht_cap.ampdu_density >
+                       if (sta->deflink.ht_cap.ampdu_density >
                            mac->current_ampdu_density)
                                mac->current_ampdu_density =
-                                   sta->ht_cap.ampdu_density;
-                       if (sta->ht_cap.ampdu_factor <
+                                   sta->deflink.ht_cap.ampdu_density;
+                       if (sta->deflink.ht_cap.ampdu_factor <
                            mac->current_ampdu_factor)
                                mac->current_ampdu_factor =
-                                   sta->ht_cap.ampdu_factor;
+                                   sta->deflink.ht_cap.ampdu_factor;
                }
                rcu_read_unlock();
 
                if (rtlhal->current_bandtype == BAND_ON_5G) {
                        mac->mode = WIRELESS_MODE_A;
                } else {
-                       if (sta->supp_rates[0] <= 0xf)
+                       if (sta->deflink.supp_rates[0] <= 0xf)
                                mac->mode = WIRELESS_MODE_B;
                        else
                                mac->mode = WIRELESS_MODE_G;
                }
 
-               if (sta->ht_cap.ht_supported) {
+               if (sta->deflink.ht_cap.ht_supported) {
                        if (rtlhal->current_bandtype == BAND_ON_2_4G)
                                mac->mode = WIRELESS_MODE_N_24G;
                        else
                                mac->mode = WIRELESS_MODE_N_5G;
                }
 
-               if (sta->vht_cap.vht_supported) {
+               if (sta->deflink.vht_cap.vht_supported) {
                        if (rtlhal->current_bandtype == BAND_ON_5G)
                                mac->mode = WIRELESS_MODE_AC_5G;
                        else
                        sta_entry->wireless_mode = mac->mode;
                }
 
-               if (sta->ht_cap.ht_supported) {
+               if (sta->deflink.ht_cap.ht_supported) {
                        mac->ht_enable = true;
 
                        /*
                         * */
                }
 
-               if (sta->vht_cap.vht_supported)
+               if (sta->deflink.vht_cap.vht_supported)
                        mac->vht_enable = true;
 
                if (changed & BSS_CHANGED_BASIC_RATES) {
                        /* for 5G must << RATE_6M_INDEX = 4,
                         * because 5G have no cck rate*/
                        if (rtlhal->current_bandtype == BAND_ON_5G)
-                               basic_rates = sta->supp_rates[1] << 4;
+                               basic_rates = sta->deflink.supp_rates[1] << 4;
                        else
-                               basic_rates = sta->supp_rates[0];
+                               basic_rates = sta->deflink.supp_rates[0];
 
                        mac->basic_rates = basic_rates;
                        rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_BASIC_RATE,
 
                                else
                                        return N_MODE_MCS15_RIX;
                        } else if (wireless_mode == WIRELESS_MODE_AC_24G) {
-                               if (sta->bandwidth == IEEE80211_STA_RX_BW_20) {
+                               if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_20) {
                                        ieee80211_rate_set_vht(&rate,
                                                               AC_MODE_MCS8_RIX,
                                                               nss);
                                else
                                        return N_MODE_MCS15_RIX;
                        } else if (wireless_mode == WIRELESS_MODE_AC_5G) {
-                               if (sta->bandwidth == IEEE80211_STA_RX_BW_20) {
+                               if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_20) {
                                        ieee80211_rate_set_vht(&rate,
                                                               AC_MODE_MCS8_RIX,
                                                               nss);
        u8 sgi_20 = 0, sgi_40 = 0, sgi_80 = 0;
 
        if (sta) {
-               sgi_20 = sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20;
-               sgi_40 = sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40;
-               sgi_80 = sta->vht_cap.cap & IEEE80211_VHT_CAP_SHORT_GI_80;
+               sgi_20 = sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_20;
+               sgi_40 = sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_40;
+               sgi_80 = sta->deflink.vht_cap.cap & IEEE80211_VHT_CAP_SHORT_GI_80;
                sta_entry = (struct rtl_sta_info *)sta->drv_priv;
                wireless_mode = sta_entry->wireless_mode;
        }
                        rate->flags |= IEEE80211_TX_RC_USE_SHORT_PREAMBLE;
                if (mac->opmode == NL80211_IFTYPE_AP ||
                        mac->opmode == NL80211_IFTYPE_ADHOC) {
-                       if (sta && (sta->ht_cap.cap &
+                       if (sta && (sta->deflink.ht_cap.cap &
                                    IEEE80211_HT_CAP_SUP_WIDTH_20_40))
                                rate->flags |= IEEE80211_TX_RC_40_MHZ_WIDTH;
-                       if (sta && sta->vht_cap.vht_supported)
+                       if (sta && sta->deflink.vht_cap.vht_supported)
                                rate->flags |= IEEE80211_TX_RC_80_MHZ_WIDTH;
                } else {
                        if (mac->bw_80)
 
                if (sgi_20 || sgi_40 || sgi_80)
                        rate->flags |= IEEE80211_TX_RC_SHORT_GI;
-               if (sta && sta->ht_cap.ht_supported &&
+               if (sta && sta->deflink.ht_cap.ht_supported &&
                    (wireless_mode == WIRELESS_MODE_N_5G ||
                     wireless_mode == WIRELESS_MODE_N_24G))
                        rate->flags |= IEEE80211_TX_RC_MCS;
-               if (sta && sta->vht_cap.vht_supported &&
+               if (sta && sta->deflink.vht_cap.vht_supported &&
                    (wireless_mode == WIRELESS_MODE_AC_5G ||
                     wireless_mode == WIRELESS_MODE_AC_24G ||
                     wireless_mode == WIRELESS_MODE_AC_ONLY))
        if (sta) {
                /* Check if aggregation has to be enabled for this tid */
                sta_entry = (struct rtl_sta_info *)sta->drv_priv;
-               if (sta->ht_cap.ht_supported &&
+               if (sta->deflink.ht_cap.ht_supported &&
                    !(skb->protocol == cpu_to_be16(ETH_P_PAE))) {
                        if (ieee80211_is_data_qos(fc)) {
                                u8 tid = rtl_get_tid(skb);
 
        u16 shortgi_rate;
        u32 tmp_ratr_value;
        u8 curtxbw_40mhz = mac->bw_40;
-       u8 curshortgi_40mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
+       u8 curshortgi_40mhz = (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
                                1 : 0;
-       u8 curshortgi_20mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
+       u8 curshortgi_20mhz = (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
                                1 : 0;
        enum wireless_mode wirelessmode = mac->mode;
        u32 ratr_mask;
 
        if (rtlhal->current_bandtype == BAND_ON_5G)
-               ratr_value = sta->supp_rates[1] << 4;
+               ratr_value = sta->deflink.supp_rates[1] << 4;
        else
-               ratr_value = sta->supp_rates[0];
+               ratr_value = sta->deflink.supp_rates[0];
        if (mac->opmode == NL80211_IFTYPE_ADHOC)
                ratr_value = 0xfff;
-       ratr_value |= (sta->ht_cap.mcs.rx_mask[1] << 20 |
-                      sta->ht_cap.mcs.rx_mask[0] << 12);
+       ratr_value |= (sta->deflink.ht_cap.mcs.rx_mask[1] << 20 |
+                      sta->deflink.ht_cap.mcs.rx_mask[0] << 12);
        switch (wirelessmode) {
        case WIRELESS_MODE_B:
                if (ratr_value & 0x0000000c)
        struct rtl_sta_info *sta_entry = NULL;
        u32 ratr_bitmap;
        u8 ratr_index;
-       u8 curtxbw_40mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40)
+       u8 curtxbw_40mhz = (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40)
                                ? 1 : 0;
-       u8 curshortgi_40mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
+       u8 curshortgi_40mhz = (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
                                1 : 0;
-       u8 curshortgi_20mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
+       u8 curshortgi_20mhz = (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
                                1 : 0;
        enum wireless_mode wirelessmode = 0;
        bool b_shortgi = false;
                macid = sta->aid + 1;
 
        if (rtlhal->current_bandtype == BAND_ON_5G)
-               ratr_bitmap = sta->supp_rates[1] << 4;
+               ratr_bitmap = sta->deflink.supp_rates[1] << 4;
        else
-               ratr_bitmap = sta->supp_rates[0];
+               ratr_bitmap = sta->deflink.supp_rates[0];
        if (mac->opmode == NL80211_IFTYPE_ADHOC)
                ratr_bitmap = 0xfff;
-       ratr_bitmap |= (sta->ht_cap.mcs.rx_mask[1] << 20 |
-                       sta->ht_cap.mcs.rx_mask[0] << 12);
+       ratr_bitmap |= (sta->deflink.ht_cap.mcs.rx_mask[1] << 20 |
+                       sta->deflink.ht_cap.mcs.rx_mask[0] << 12);
        switch (wirelessmode) {
        case WIRELESS_MODE_B:
                ratr_index = RATR_INX_WIRELESS_B;
 
        } else if (mac->opmode == NL80211_IFTYPE_AP ||
                mac->opmode == NL80211_IFTYPE_ADHOC) {
                if (sta)
-                       bw_40 = sta->ht_cap.cap &
+                       bw_40 = sta->deflink.ht_cap.cap &
                                IEEE80211_HT_CAP_SUP_WIDTH_20_40;
        }
        seq_number = (le16_to_cpu(hdr->seq_ctrl) & IEEE80211_SCTL_SEQ) >> 4;
                set_tx_desc_linip(pdesc, 0);
                set_tx_desc_pkt_size(pdesc, (u16)skb_len);
                if (sta) {
-                       u8 ampdu_density = sta->ht_cap.ampdu_density;
+                       u8 ampdu_density = sta->deflink.ht_cap.ampdu_density;
                        set_tx_desc_ampdu_density(pdesc, ampdu_density);
                }
                if (info->control.hw_key) {
 
        u16 shortgi_rate;
        u32 tmp_ratr_value;
        u8 curtxbw_40mhz = mac->bw_40;
-       u8 curshortgi_40mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
+       u8 curshortgi_40mhz = (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
                               1 : 0;
-       u8 curshortgi_20mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
+       u8 curshortgi_20mhz = (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
                               1 : 0;
        enum wireless_mode wirelessmode = mac->mode;
        u32 ratr_mask;
 
        if (rtlhal->current_bandtype == BAND_ON_5G)
-               ratr_value = sta->supp_rates[1] << 4;
+               ratr_value = sta->deflink.supp_rates[1] << 4;
        else
-               ratr_value = sta->supp_rates[0];
+               ratr_value = sta->deflink.supp_rates[0];
        if (mac->opmode == NL80211_IFTYPE_ADHOC)
                ratr_value = 0xfff;
 
-       ratr_value |= (sta->ht_cap.mcs.rx_mask[1] << 20 |
-                       sta->ht_cap.mcs.rx_mask[0] << 12);
+       ratr_value |= (sta->deflink.ht_cap.mcs.rx_mask[1] << 20 |
+                       sta->deflink.ht_cap.mcs.rx_mask[0] << 12);
        switch (wirelessmode) {
        case WIRELESS_MODE_B:
                if (ratr_value & 0x0000000c)
        struct rtl_sta_info *sta_entry = NULL;
        u32 ratr_bitmap;
        u8 ratr_index;
-       u8 curtxbw_40mhz = (sta->ht_cap.cap &
+       u8 curtxbw_40mhz = (sta->deflink.ht_cap.cap &
                            IEEE80211_HT_CAP_SUP_WIDTH_20_40) ? 1 : 0;
-       u8 curshortgi_40mhz = (sta->ht_cap.cap &
+       u8 curshortgi_40mhz = (sta->deflink.ht_cap.cap &
                               IEEE80211_HT_CAP_SGI_40) ?  1 : 0;
-       u8 curshortgi_20mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
+       u8 curshortgi_20mhz = (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
                                1 : 0;
        enum wireless_mode wirelessmode = 0;
        bool shortgi = false;
                macid = sta->aid + 1;
 
        if (rtlhal->current_bandtype == BAND_ON_5G)
-               ratr_bitmap = sta->supp_rates[1] << 4;
+               ratr_bitmap = sta->deflink.supp_rates[1] << 4;
        else
-               ratr_bitmap = sta->supp_rates[0];
+               ratr_bitmap = sta->deflink.supp_rates[0];
        if (mac->opmode == NL80211_IFTYPE_ADHOC)
                ratr_bitmap = 0xfff;
-       ratr_bitmap |= (sta->ht_cap.mcs.rx_mask[1] << 20 |
-                       sta->ht_cap.mcs.rx_mask[0] << 12);
+       ratr_bitmap |= (sta->deflink.ht_cap.mcs.rx_mask[1] << 20 |
+                       sta->deflink.ht_cap.mcs.rx_mask[0] << 12);
        switch (wirelessmode) {
        case WIRELESS_MODE_B:
                ratr_index = RATR_INX_WIRELESS_B;
 
                   mac->opmode == NL80211_IFTYPE_ADHOC ||
                   mac->opmode == NL80211_IFTYPE_MESH_POINT) {
                if (sta)
-                       bw_40 = sta->bandwidth >= IEEE80211_STA_RX_BW_40;
+                       bw_40 = sta->deflink.bandwidth >= IEEE80211_STA_RX_BW_40;
        }
 
        seq_number = (le16_to_cpu(hdr->seq_ctrl) & IEEE80211_SCTL_SEQ) >> 4;
                set_tx_desc_pkt_size(pdesc, (u16)skb->len);
 
                if (sta) {
-                       u8 ampdu_density = sta->ht_cap.ampdu_density;
+                       u8 ampdu_density = sta->deflink.ht_cap.ampdu_density;
 
                        set_tx_desc_ampdu_density(pdesc, ampdu_density);
                }
 
        u16 shortgi_rate;
        u32 tmp_ratr_value;
        u8 curtxbw_40mhz = mac->bw_40;
-       u8 curshortgi_40mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
+       u8 curshortgi_40mhz = (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
                               1 : 0;
-       u8 curshortgi_20mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
+       u8 curshortgi_20mhz = (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
                               1 : 0;
        enum wireless_mode wirelessmode = mac->mode;
 
        if (rtlhal->current_bandtype == BAND_ON_5G)
-               ratr_value = sta->supp_rates[1] << 4;
+               ratr_value = sta->deflink.supp_rates[1] << 4;
        else
-               ratr_value = sta->supp_rates[0];
+               ratr_value = sta->deflink.supp_rates[0];
        if (mac->opmode == NL80211_IFTYPE_ADHOC)
                ratr_value = 0xfff;
 
-       ratr_value |= (sta->ht_cap.mcs.rx_mask[1] << 20 |
-                       sta->ht_cap.mcs.rx_mask[0] << 12);
+       ratr_value |= (sta->deflink.ht_cap.mcs.rx_mask[1] << 20 |
+                       sta->deflink.ht_cap.mcs.rx_mask[0] << 12);
        switch (wirelessmode) {
        case WIRELESS_MODE_B:
                if (ratr_value & 0x0000000c)
        struct rtl_sta_info *sta_entry = NULL;
        u32 ratr_bitmap;
        u8 ratr_index;
-       u8 curtxbw_40mhz = (sta->bandwidth >= IEEE80211_STA_RX_BW_40) ? 1 : 0;
+       u8 curtxbw_40mhz = (sta->deflink.bandwidth >= IEEE80211_STA_RX_BW_40) ? 1 : 0;
        u8 curshortgi_40mhz = curtxbw_40mhz &&
-                             (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
+                             (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
                                1 : 0;
-       u8 curshortgi_20mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
+       u8 curshortgi_20mhz = (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
                                1 : 0;
        enum wireless_mode wirelessmode = 0;
        bool shortgi = false;
                macid = sta->aid + 1;
 
        if (rtlhal->current_bandtype == BAND_ON_5G)
-               ratr_bitmap = sta->supp_rates[1] << 4;
+               ratr_bitmap = sta->deflink.supp_rates[1] << 4;
        else
-               ratr_bitmap = sta->supp_rates[0];
+               ratr_bitmap = sta->deflink.supp_rates[0];
        if (mac->opmode == NL80211_IFTYPE_ADHOC)
                ratr_bitmap = 0xfff;
-       ratr_bitmap |= (sta->ht_cap.mcs.rx_mask[1] << 20 |
-                       sta->ht_cap.mcs.rx_mask[0] << 12);
+       ratr_bitmap |= (sta->deflink.ht_cap.mcs.rx_mask[1] << 20 |
+                       sta->deflink.ht_cap.mcs.rx_mask[0] << 12);
        switch (wirelessmode) {
        case WIRELESS_MODE_B:
                ratr_index = RATR_INX_WIRELESS_B;
 
        rcu_read_lock();
        sta = ieee80211_find_sta(mac->vif, mac->bssid);
        if (sta) {
-               u8 ampdu_density = sta->ht_cap.ampdu_density;
+               u8 ampdu_density = sta->deflink.ht_cap.ampdu_density;
 
                set_tx_desc_ampdu_density(txdesc, ampdu_density);
        }
 
        u16 shortgi_rate;
        u32 tmp_ratr_value;
        u8 curtxbw_40mhz = mac->bw_40;
-       u8 curshortgi_40mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
+       u8 curshortgi_40mhz = (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
                                                        1 : 0;
-       u8 curshortgi_20mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
+       u8 curshortgi_20mhz = (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
                                                        1 : 0;
        enum wireless_mode wirelessmode = mac->mode;
 
        if (rtlhal->current_bandtype == BAND_ON_5G)
-               ratr_value = sta->supp_rates[1] << 4;
+               ratr_value = sta->deflink.supp_rates[1] << 4;
        else
-               ratr_value = sta->supp_rates[0];
-       ratr_value |= (sta->ht_cap.mcs.rx_mask[1] << 20 |
-                      sta->ht_cap.mcs.rx_mask[0] << 12);
+               ratr_value = sta->deflink.supp_rates[0];
+       ratr_value |= (sta->deflink.ht_cap.mcs.rx_mask[1] << 20 |
+                      sta->deflink.ht_cap.mcs.rx_mask[0] << 12);
        switch (wirelessmode) {
        case WIRELESS_MODE_A:
                ratr_value &= 0x00000FF0;
        struct rtl_sta_info *sta_entry = NULL;
        u32 ratr_bitmap;
        u8 ratr_index;
-       u8 curtxbw_40mhz = (sta->bandwidth >= IEEE80211_STA_RX_BW_40) ? 1 : 0;
-       u8 curshortgi_40mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
+       u8 curtxbw_40mhz = (sta->deflink.bandwidth >= IEEE80211_STA_RX_BW_40) ? 1 : 0;
+       u8 curshortgi_40mhz = (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
                                                        1 : 0;
-       u8 curshortgi_20mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
+       u8 curshortgi_20mhz = (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
                                                        1 : 0;
        enum wireless_mode wirelessmode = 0;
        bool shortgi = false;
                macid = sta->aid + 1;
 
        if (rtlhal->current_bandtype == BAND_ON_5G)
-               ratr_bitmap = sta->supp_rates[1] << 4;
+               ratr_bitmap = sta->deflink.supp_rates[1] << 4;
        else
-               ratr_bitmap = sta->supp_rates[0];
-       ratr_bitmap |= (sta->ht_cap.mcs.rx_mask[1] << 20 |
-                       sta->ht_cap.mcs.rx_mask[0] << 12);
+               ratr_bitmap = sta->deflink.supp_rates[0];
+       ratr_bitmap |= (sta->deflink.ht_cap.mcs.rx_mask[1] << 20 |
+                       sta->deflink.ht_cap.mcs.rx_mask[0] << 12);
        switch (wirelessmode) {
        case WIRELESS_MODE_B:
                ratr_index = RATR_INX_WIRELESS_B;
 
        } else if (mac->opmode == NL80211_IFTYPE_AP ||
                mac->opmode == NL80211_IFTYPE_ADHOC) {
                if (sta)
-                       bw_40 = sta->bandwidth >= IEEE80211_STA_RX_BW_40;
+                       bw_40 = sta->deflink.bandwidth >= IEEE80211_STA_RX_BW_40;
        }
        seq_number = (le16_to_cpu(hdr->seq_ctrl) & IEEE80211_SCTL_SEQ) >> 4;
        rtl_get_tcb_desc(hw, info, sta, skb, ptcb_desc);
                set_tx_desc_linip(pdesc, 0);
                set_tx_desc_pkt_size(pdesc, (u16)skb_len);
                if (sta) {
-                       u8 ampdu_density = sta->ht_cap.ampdu_density;
+                       u8 ampdu_density = sta->deflink.ht_cap.ampdu_density;
                        set_tx_desc_ampdu_density(pdesc, ampdu_density);
                }
                if (info->control.hw_key) {
 
        struct rtl_sta_info *sta_entry = NULL;
        u32 ratr_bitmap;
        u8 ratr_index;
-       u8 curtxbw_40mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40)
+       u8 curtxbw_40mhz = (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40)
                             ? 1 : 0;
-       u8 b_curshortgi_40mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
+       u8 b_curshortgi_40mhz = (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
                                1 : 0;
-       u8 b_curshortgi_20mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
+       u8 b_curshortgi_20mhz = (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
                                1 : 0;
        enum wireless_mode wirelessmode = 0;
        bool b_shortgi = false;
                 mac->opmode == NL80211_IFTYPE_ADHOC)
                macid = sta->aid + 1;
 
-       ratr_bitmap = sta->supp_rates[0];
+       ratr_bitmap = sta->deflink.supp_rates[0];
        if (mac->opmode == NL80211_IFTYPE_ADHOC)
                ratr_bitmap = 0xfff;
 
-       ratr_bitmap |= (sta->ht_cap.mcs.rx_mask[1] << 20 |
-                       sta->ht_cap.mcs.rx_mask[0] << 12);
+       ratr_bitmap |= (sta->deflink.ht_cap.mcs.rx_mask[1] << 20 |
+                       sta->deflink.ht_cap.mcs.rx_mask[0] << 12);
 
        switch (wirelessmode) {
        case WIRELESS_MODE_B:
 
        } else if (mac->opmode == NL80211_IFTYPE_AP ||
                   mac->opmode == NL80211_IFTYPE_ADHOC) {
                if (sta)
-                       bw_40 = sta->ht_cap.cap &
+                       bw_40 = sta->deflink.ht_cap.cap &
                                IEEE80211_HT_CAP_SUP_WIDTH_20_40;
        }
        seq_number = (le16_to_cpu(hdr->seq_ctrl) & IEEE80211_SCTL_SEQ) >> 4;
 
                set_tx_desc_linip(pdesc, 0);
                if (sta) {
-                       u8 ampdu_density = sta->ht_cap.ampdu_density;
+                       u8 ampdu_density = sta->deflink.ht_cap.ampdu_density;
 
                        set_tx_desc_ampdu_density(pdesc, ampdu_density);
                }
 
        u16 shortgi_rate = 0;
        u32 tmp_ratr_value = 0;
        u8 curtxbw_40mhz = mac->bw_40;
-       u8 curshortgi_40mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
+       u8 curshortgi_40mhz = (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
                                1 : 0;
-       u8 curshortgi_20mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
+       u8 curshortgi_20mhz = (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
                                1 : 0;
        enum wireless_mode wirelessmode = mac->mode;
 
        if (rtlhal->current_bandtype == BAND_ON_5G)
-               ratr_value = sta->supp_rates[1] << 4;
+               ratr_value = sta->deflink.supp_rates[1] << 4;
        else
-               ratr_value = sta->supp_rates[0];
+               ratr_value = sta->deflink.supp_rates[0];
        if (mac->opmode == NL80211_IFTYPE_ADHOC)
                ratr_value = 0xfff;
-       ratr_value |= (sta->ht_cap.mcs.rx_mask[1] << 20 |
-                       sta->ht_cap.mcs.rx_mask[0] << 12);
+       ratr_value |= (sta->deflink.ht_cap.mcs.rx_mask[1] << 20 |
+                       sta->deflink.ht_cap.mcs.rx_mask[0] << 12);
        switch (wirelessmode) {
        case WIRELESS_MODE_B:
                ratr_value &= 0x0000000D;
        struct rtl_sta_info *sta_entry = NULL;
        u32 ratr_bitmap;
        u8 ratr_index = 0;
-       u8 curtxbw_40mhz = (sta->bandwidth >= IEEE80211_STA_RX_BW_40) ? 1 : 0;
-       u8 curshortgi_40mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
+       u8 curtxbw_40mhz = (sta->deflink.bandwidth >= IEEE80211_STA_RX_BW_40) ? 1 : 0;
+       u8 curshortgi_40mhz = (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
                                1 : 0;
-       u8 curshortgi_20mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
+       u8 curshortgi_20mhz = (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
                                1 : 0;
        enum wireless_mode wirelessmode = 0;
        bool shortgi = false;
                macid = sta->aid + 1;
 
        if (rtlhal->current_bandtype == BAND_ON_5G)
-               ratr_bitmap = sta->supp_rates[1] << 4;
+               ratr_bitmap = sta->deflink.supp_rates[1] << 4;
        else
-               ratr_bitmap = sta->supp_rates[0];
+               ratr_bitmap = sta->deflink.supp_rates[0];
        if (mac->opmode == NL80211_IFTYPE_ADHOC)
                ratr_bitmap = 0xfff;
-       ratr_bitmap |= (sta->ht_cap.mcs.rx_mask[1] << 20 |
-                       sta->ht_cap.mcs.rx_mask[0] << 12);
+       ratr_bitmap |= (sta->deflink.ht_cap.mcs.rx_mask[1] << 20 |
+                       sta->deflink.ht_cap.mcs.rx_mask[0] << 12);
        switch (wirelessmode) {
        case WIRELESS_MODE_B:
                band |= WIRELESS_11B;
 
        } else if (mac->opmode == NL80211_IFTYPE_AP ||
                mac->opmode == NL80211_IFTYPE_ADHOC) {
                if (sta)
-                       bw_40 = sta->bandwidth >= IEEE80211_STA_RX_BW_40;
+                       bw_40 = sta->deflink.bandwidth >= IEEE80211_STA_RX_BW_40;
        }
 
        seq_number = (le16_to_cpu(hdr->seq_ctrl) & IEEE80211_SCTL_SEQ) >> 4;
 
        u16 shortgi_rate;
        u32 tmp_ratr_value;
        u8 curtxbw_40mhz = mac->bw_40;
-       u8 curshortgi_40mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
+       u8 curshortgi_40mhz = (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
                                1 : 0;
-       u8 curshortgi_20mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
+       u8 curshortgi_20mhz = (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
                                1 : 0;
        enum wireless_mode wirelessmode = mac->mode;
        u32 ratr_mask;
 
        if (rtlhal->current_bandtype == BAND_ON_5G)
-               ratr_value = sta->supp_rates[1] << 4;
+               ratr_value = sta->deflink.supp_rates[1] << 4;
        else
-               ratr_value = sta->supp_rates[0];
+               ratr_value = sta->deflink.supp_rates[0];
        if (mac->opmode == NL80211_IFTYPE_ADHOC)
                ratr_value = 0xfff;
-       ratr_value |= (sta->ht_cap.mcs.rx_mask[1] << 20 |
-                       sta->ht_cap.mcs.rx_mask[0] << 12);
+       ratr_value |= (sta->deflink.ht_cap.mcs.rx_mask[1] << 20 |
+                       sta->deflink.ht_cap.mcs.rx_mask[0] << 12);
        switch (wirelessmode) {
        case WIRELESS_MODE_B:
                if (ratr_value & 0x0000000c)
        struct rtl_sta_info *sta_entry = NULL;
        u32 ratr_bitmap;
        u8 ratr_index;
-       u8 curtxbw_40mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40)
+       u8 curtxbw_40mhz = (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40)
                                ? 1 : 0;
-       u8 curshortgi_40mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
+       u8 curshortgi_40mhz = (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
                                1 : 0;
-       u8 curshortgi_20mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
+       u8 curshortgi_20mhz = (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
                                1 : 0;
        enum wireless_mode wirelessmode = 0;
        bool shortgi = false;
                macid = sta->aid + 1;
 
        if (rtlhal->current_bandtype == BAND_ON_5G)
-               ratr_bitmap = sta->supp_rates[1] << 4;
+               ratr_bitmap = sta->deflink.supp_rates[1] << 4;
        else
-               ratr_bitmap = sta->supp_rates[0];
+               ratr_bitmap = sta->deflink.supp_rates[0];
        if (mac->opmode == NL80211_IFTYPE_ADHOC)
                ratr_bitmap = 0xfff;
-       ratr_bitmap |= (sta->ht_cap.mcs.rx_mask[1] << 20 |
-                       sta->ht_cap.mcs.rx_mask[0] << 12);
+       ratr_bitmap |= (sta->deflink.ht_cap.mcs.rx_mask[1] << 20 |
+                       sta->deflink.ht_cap.mcs.rx_mask[0] << 12);
        switch (wirelessmode) {
        case WIRELESS_MODE_B:
                ratr_index = RATR_INX_WIRELESS_B;
 
        } else if (mac->opmode == NL80211_IFTYPE_AP ||
                mac->opmode == NL80211_IFTYPE_ADHOC) {
                if (sta)
-                       bw_40 = sta->ht_cap.cap &
+                       bw_40 = sta->deflink.ht_cap.cap &
                                IEEE80211_HT_CAP_SUP_WIDTH_20_40;
        }
 
                set_tx_desc_pkt_size(pdesc, (u16)skb->len);
 
                if (sta) {
-                       u8 ampdu_density = sta->ht_cap.ampdu_density;
+                       u8 ampdu_density = sta->deflink.ht_cap.ampdu_density;
                        set_tx_desc_ampdu_density(pdesc, ampdu_density);
                }
 
 
        struct rtl_sta_info *sta_entry = NULL;
        u32 ratr_bitmap;
        u8 ratr_index;
-       u8 curtxbw_40mhz = (sta->ht_cap.cap &
+       u8 curtxbw_40mhz = (sta->deflink.ht_cap.cap &
                              IEEE80211_HT_CAP_SUP_WIDTH_20_40) ? 1 : 0;
-       u8 curshortgi_40mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
+       u8 curshortgi_40mhz = (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
                                1 : 0;
-       u8 curshortgi_20mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
+       u8 curshortgi_20mhz = (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
                                1 : 0;
        enum wireless_mode wirelessmode = 0;
        bool shortgi = false;
                 mac->opmode == NL80211_IFTYPE_ADHOC)
                macid = sta->aid + 1;
 
-       ratr_bitmap = sta->supp_rates[0];
+       ratr_bitmap = sta->deflink.supp_rates[0];
 
        if (mac->opmode == NL80211_IFTYPE_ADHOC)
                ratr_bitmap = 0xfff;
 
-       ratr_bitmap |= (sta->ht_cap.mcs.rx_mask[1] << 20 |
-                       sta->ht_cap.mcs.rx_mask[0] << 12);
+       ratr_bitmap |= (sta->deflink.ht_cap.mcs.rx_mask[1] << 20 |
+                       sta->deflink.ht_cap.mcs.rx_mask[0] << 12);
        switch (wirelessmode) {
        case WIRELESS_MODE_B:
                ratr_index = RATR_INX_WIRELESS_B;
 
        } else if (mac->opmode == NL80211_IFTYPE_AP ||
                mac->opmode == NL80211_IFTYPE_ADHOC) {
                if (sta)
-                       bw_40 = sta->ht_cap.cap &
+                       bw_40 = sta->deflink.ht_cap.cap &
                                IEEE80211_HT_CAP_SUP_WIDTH_20_40;
        }
        seq_number = (le16_to_cpu(hdr->seq_ctrl) & IEEE80211_SCTL_SEQ) >> 4;
                set_tx_desc_linip(pdesc, 0);
                set_tx_desc_pkt_size(pdesc, (u16)skb_len);
                if (sta) {
-                       u8 ampdu_density = sta->ht_cap.ampdu_density;
+                       u8 ampdu_density = sta->deflink.ht_cap.ampdu_density;
                        set_tx_desc_ampdu_density(pdesc, ampdu_density);
                }
                if (info->control.hw_key) {
 
        u16 shortgi_rate;
        u32 tmp_ratr_value;
        u8 curtxbw_40mhz = mac->bw_40;
-       u8 b_curshortgi_40mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
+       u8 b_curshortgi_40mhz = (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
                                1 : 0;
-       u8 b_curshortgi_20mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
+       u8 b_curshortgi_20mhz = (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
                                1 : 0;
        enum wireless_mode wirelessmode = mac->mode;
 
        if (rtlhal->current_bandtype == BAND_ON_5G)
-               ratr_value = sta->supp_rates[1] << 4;
+               ratr_value = sta->deflink.supp_rates[1] << 4;
        else
-               ratr_value = sta->supp_rates[0];
+               ratr_value = sta->deflink.supp_rates[0];
        if (mac->opmode == NL80211_IFTYPE_ADHOC)
                ratr_value = 0xfff;
-       ratr_value |= (sta->ht_cap.mcs.rx_mask[1] << 20 |
-                       sta->ht_cap.mcs.rx_mask[0] << 12);
+       ratr_value |= (sta->deflink.ht_cap.mcs.rx_mask[1] << 20 |
+                       sta->deflink.ht_cap.mcs.rx_mask[0] << 12);
        switch (wirelessmode) {
        case WIRELESS_MODE_B:
                if (ratr_value & 0x0000000c)
                              u8 mac_id)
 {
        bool b_short_gi = false;
-       u8 b_curshortgi_40mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
+       u8 b_curshortgi_40mhz = (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
                                1 : 0;
-       u8 b_curshortgi_20mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
+       u8 b_curshortgi_20mhz = (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
                                1 : 0;
        u8 b_curshortgi_80mhz = 0;
-       b_curshortgi_80mhz = (sta->vht_cap.cap &
+       b_curshortgi_80mhz = (sta->deflink.vht_cap.cap &
                              IEEE80211_VHT_CAP_SHORT_GI_80) ? 1 : 0;
 
        if (mac_id == MAC_ID_STATIC_FOR_BROADCAST_MULTICAST)
        u32 ratr_bitmap;
        u8 ratr_index;
        enum wireless_mode wirelessmode = 0;
-       u8 curtxbw_40mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40)
+       u8 curtxbw_40mhz = (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40)
                                ? 1 : 0;
        bool b_shortgi = false;
        u8 rate_mask[7];
        if (wirelessmode == WIRELESS_MODE_N_5G ||
            wirelessmode == WIRELESS_MODE_AC_5G ||
            wirelessmode == WIRELESS_MODE_A)
-               ratr_bitmap = sta->supp_rates[NL80211_BAND_5GHZ] << 4;
+               ratr_bitmap = sta->deflink.supp_rates[NL80211_BAND_5GHZ] << 4;
        else
-               ratr_bitmap = sta->supp_rates[NL80211_BAND_2GHZ];
+               ratr_bitmap = sta->deflink.supp_rates[NL80211_BAND_2GHZ];
 
        if (mac->opmode == NL80211_IFTYPE_ADHOC)
                ratr_bitmap = 0xfff;
 
        if (wirelessmode == WIRELESS_MODE_N_24G
                || wirelessmode == WIRELESS_MODE_N_5G)
-               ratr_bitmap |= (sta->ht_cap.mcs.rx_mask[1] << 20 |
-                               sta->ht_cap.mcs.rx_mask[0] << 12);
+               ratr_bitmap |= (sta->deflink.ht_cap.mcs.rx_mask[1] << 20 |
+                               sta->deflink.ht_cap.mcs.rx_mask[0] << 12);
        else if (wirelessmode == WIRELESS_MODE_AC_24G
                || wirelessmode == WIRELESS_MODE_AC_5G
                || wirelessmode == WIRELESS_MODE_AC_ONLY)
                ratr_bitmap |= _rtl8821ae_rate_to_bitmap_2ssvht(
-                               sta->vht_cap.vht_mcs.rx_mcs_map) << 12;
+                               sta->deflink.vht_cap.vht_mcs.rx_mcs_map) << 12;
 
        b_shortgi = _rtl8821ae_get_ra_shortgi(hw, sta, macid);
        rf_type = _rtl8821ae_get_ra_rftype(hw, wirelessmode, ratr_bitmap);
 
                set_tx_desc_linip(pdesc, 0);
                set_tx_desc_pkt_size(pdesc, (u16)skb_len);
                if (sta) {
-                       u8 ampdu_density = sta->ht_cap.ampdu_density;
+                       u8 ampdu_density = sta->deflink.ht_cap.ampdu_density;
 
                        set_tx_desc_ampdu_density(pdesc, ampdu_density);
                }
 
        }
 
        ic_vht_cap = &hw->wiphy->bands[NL80211_BAND_5GHZ]->vht_cap;
-       vht_cap = &sta->vht_cap;
+       vht_cap = &sta->deflink.vht_cap;
 
        if ((ic_vht_cap->cap & IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE) &&
            (vht_cap->cap & IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE)) {
 
 static u64 get_vht_ra_mask(struct ieee80211_sta *sta)
 {
        u64 ra_mask = 0;
-       u16 mcs_map = le16_to_cpu(sta->vht_cap.vht_mcs.rx_mcs_map);
+       u16 mcs_map = le16_to_cpu(sta->deflink.vht_cap.vht_mcs.rx_mcs_map);
        u8 vht_mcs_cap;
        int i, nss;
 
        bool is_vht_enable = false;
        bool is_support_sgi = false;
 
-       if (sta->vht_cap.vht_supported) {
+       if (sta->deflink.vht_cap.vht_supported) {
                is_vht_enable = true;
                ra_mask |= get_vht_ra_mask(sta);
-               if (sta->vht_cap.cap & IEEE80211_VHT_CAP_RXSTBC_MASK)
+               if (sta->deflink.vht_cap.cap & IEEE80211_VHT_CAP_RXSTBC_MASK)
                        stbc_en = VHT_STBC_EN;
-               if (sta->vht_cap.cap & IEEE80211_VHT_CAP_RXLDPC)
+               if (sta->deflink.vht_cap.cap & IEEE80211_VHT_CAP_RXLDPC)
                        ldpc_en = VHT_LDPC_EN;
-       } else if (sta->ht_cap.ht_supported) {
-               ra_mask |= (sta->ht_cap.mcs.rx_mask[1] << 20) |
-                          (sta->ht_cap.mcs.rx_mask[0] << 12);
-               if (sta->ht_cap.cap & IEEE80211_HT_CAP_RX_STBC)
+       } else if (sta->deflink.ht_cap.ht_supported) {
+               ra_mask |= (sta->deflink.ht_cap.mcs.rx_mask[1] << 20) |
+                          (sta->deflink.ht_cap.mcs.rx_mask[0] << 12);
+               if (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_RX_STBC)
                        stbc_en = HT_STBC_EN;
-               if (sta->ht_cap.cap & IEEE80211_HT_CAP_LDPC_CODING)
+               if (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_LDPC_CODING)
                        ldpc_en = HT_LDPC_EN;
        }
 
                ra_mask &= RA_MASK_VHT_RATES_1SS | RA_MASK_HT_RATES_1SS;
 
        if (hal->current_band_type == RTW_BAND_5G) {
-               ra_mask |= (u64)sta->supp_rates[NL80211_BAND_5GHZ] << 4;
+               ra_mask |= (u64)sta->deflink.supp_rates[NL80211_BAND_5GHZ] << 4;
                ra_mask_bak = ra_mask;
-               if (sta->vht_cap.vht_supported) {
+               if (sta->deflink.vht_cap.vht_supported) {
                        ra_mask &= RA_MASK_VHT_RATES | RA_MASK_OFDM_IN_VHT;
                        wireless_set = WIRELESS_OFDM | WIRELESS_VHT;
-               } else if (sta->ht_cap.ht_supported) {
+               } else if (sta->deflink.ht_cap.ht_supported) {
                        ra_mask &= RA_MASK_HT_RATES | RA_MASK_OFDM_IN_HT_5G;
                        wireless_set = WIRELESS_OFDM | WIRELESS_HT;
                } else {
                }
                dm_info->rrsr_val_init = RRSR_INIT_5G;
        } else if (hal->current_band_type == RTW_BAND_2G) {
-               ra_mask |= sta->supp_rates[NL80211_BAND_2GHZ];
+               ra_mask |= sta->deflink.supp_rates[NL80211_BAND_2GHZ];
                ra_mask_bak = ra_mask;
-               if (sta->vht_cap.vht_supported) {
+               if (sta->deflink.vht_cap.vht_supported) {
                        ra_mask &= RA_MASK_VHT_RATES | RA_MASK_CCK_IN_VHT |
                                   RA_MASK_OFDM_IN_VHT;
                        wireless_set = WIRELESS_CCK | WIRELESS_OFDM |
                                       WIRELESS_HT | WIRELESS_VHT;
-               } else if (sta->ht_cap.ht_supported) {
+               } else if (sta->deflink.ht_cap.ht_supported) {
                        ra_mask &= RA_MASK_HT_RATES | RA_MASK_CCK_IN_HT |
                                   RA_MASK_OFDM_IN_HT_2G;
                        wireless_set = WIRELESS_CCK | WIRELESS_OFDM |
                                       WIRELESS_HT;
-               } else if (sta->supp_rates[0] <= 0xf) {
+               } else if (sta->deflink.supp_rates[0] <= 0xf) {
                        wireless_set = WIRELESS_CCK;
                } else {
                        ra_mask &= RA_MASK_OFDM_RATES | RA_MASK_CCK_IN_BG;
                wireless_set = 0;
        }
 
-       switch (sta->bandwidth) {
+       switch (sta->deflink.bandwidth) {
        case IEEE80211_STA_RX_BW_80:
                bw_mode = RTW_CHANNEL_WIDTH_80;
-               is_support_sgi = sta->vht_cap.vht_supported &&
-                                (sta->vht_cap.cap & IEEE80211_VHT_CAP_SHORT_GI_80);
+               is_support_sgi = sta->deflink.vht_cap.vht_supported &&
+                                (sta->deflink.vht_cap.cap & IEEE80211_VHT_CAP_SHORT_GI_80);
                break;
        case IEEE80211_STA_RX_BW_40:
                bw_mode = RTW_CHANNEL_WIDTH_40;
-               is_support_sgi = sta->ht_cap.ht_supported &&
-                                (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40);
+               is_support_sgi = sta->deflink.ht_cap.ht_supported &&
+                                (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_40);
                break;
        default:
                bw_mode = RTW_CHANNEL_WIDTH_20;
-               is_support_sgi = sta->ht_cap.ht_supported &&
-                                (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20);
+               is_support_sgi = sta->deflink.ht_cap.ht_supported &&
+                                (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_20);
                break;
        }
 
-       if (sta->vht_cap.vht_supported && ra_mask & 0xffc00000) {
+       if (sta->deflink.vht_cap.vht_supported && ra_mask & 0xffc00000) {
                tx_num = 2;
                rf_type = RF_2T2R;
-       } else if (sta->ht_cap.ht_supported && ra_mask & 0xfff00000) {
+       } else if (sta->deflink.ht_cap.ht_supported && ra_mask & 0xfff00000) {
                tx_num = 2;
                rf_type = RF_2T2R;
        }
 
 
 static u8 get_tx_ampdu_factor(struct ieee80211_sta *sta)
 {
-       u8 exp = sta->ht_cap.ampdu_factor;
+       u8 exp = sta->deflink.ht_cap.ampdu_factor;
 
        /* the least ampdu factor is 8K, and the value in the tx desc is the
         * max aggregation num, which represents val * 2 packets can be
 
 static u8 get_tx_ampdu_density(struct ieee80211_sta *sta)
 {
-       return sta->ht_cap.ampdu_density;
+       return sta->deflink.ht_cap.ampdu_density;
 }
 
 static u8 get_highest_ht_tx_rate(struct rtw_dev *rtwdev,
 {
        u8 rate;
 
-       if (rtwdev->hal.rf_type == RF_2T2R && sta->ht_cap.mcs.rx_mask[1] != 0)
+       if (rtwdev->hal.rf_type == RF_2T2R && sta->deflink.ht_cap.mcs.rx_mask[1] != 0)
                rate = DESC_RATEMCS15;
        else
                rate = DESC_RATEMCS7;
        u8 rate;
        u16 tx_mcs_map;
 
-       tx_mcs_map = le16_to_cpu(sta->vht_cap.vht_mcs.tx_mcs_map);
+       tx_mcs_map = le16_to_cpu(sta->deflink.vht_cap.vht_mcs.tx_mcs_map);
        if (efuse->hw_cap.nss == 1) {
                switch (tx_mcs_map & 0x3) {
                case IEEE80211_VHT_MCS_SUPPORT_0_7:
        if (info->control.use_rts || skb->len > hw->wiphy->rts_threshold)
                pkt_info->rts = true;
 
-       if (sta->vht_cap.vht_supported)
+       if (sta->deflink.vht_cap.vht_supported)
                rate = get_highest_vht_tx_rate(rtwdev, sta);
-       else if (sta->ht_cap.ht_supported)
+       else if (sta->deflink.ht_cap.ht_supported)
                rate = get_highest_ht_tx_rate(rtwdev, sta);
-       else if (sta->supp_rates[0] <= 0xf)
+       else if (sta->deflink.supp_rates[0] <= 0xf)
                rate = DESC_RATE11M;
        else
                rate = DESC_RATE54M;
 
 
                rtw89_debug(rtwdev, RTW89_DBG_BTC,
                            "[BTC], STA support HE=%d VHT=%d HT=%d\n",
-                           sta->he_cap.has_he,
-                           sta->vht_cap.vht_supported,
-                           sta->ht_cap.ht_supported);
-               if (sta->he_cap.has_he)
+                           sta->deflink.he_cap.has_he,
+                           sta->deflink.vht_cap.vht_supported,
+                           sta->deflink.ht_cap.ht_supported);
+               if (sta->deflink.he_cap.has_he)
                        mode |= BIT(BTC_WL_MODE_HE);
-               if (sta->vht_cap.vht_supported)
+               if (sta->deflink.vht_cap.vht_supported)
                        mode |= BIT(BTC_WL_MODE_VHT);
-               if (sta->ht_cap.ht_supported)
+               if (sta->deflink.ht_cap.ht_supported)
                        mode |= BIT(BTC_WL_MODE_HT);
 
                r.mode = mode;
 
 
        ampdu_num = (u8)((rtwsta->ampdu_params[tid].agg_num ?
                          rtwsta->ampdu_params[tid].agg_num :
-                         4 << sta->ht_cap.ampdu_factor) - 1);
+                         4 << sta->deflink.ht_cap.ampdu_factor) - 1);
 
        desc_info->agg_en = true;
-       desc_info->ampdu_density = sta->ht_cap.ampdu_density;
+       desc_info->ampdu_density = sta->deflink.ht_cap.ampdu_density;
        desc_info->ampdu_num = ampdu_num;
 }
 
        if (pkt_type < PACKET_MAX)
                return false;
 
-       if (!sta || !sta->he_cap.has_he)
+       if (!sta || !sta->deflink.he_cap.has_he)
                return false;
 
        if (!ieee80211_is_data_qos(fc))
 
 
 static inline bool rtw89_sta_has_beamformer_cap(struct ieee80211_sta *sta)
 {
-       if ((sta->vht_cap.cap & IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE) ||
-           (sta->vht_cap.cap & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE) ||
-           (sta->he_cap.he_cap_elem.phy_cap_info[3] & IEEE80211_HE_PHY_CAP3_SU_BEAMFORMER) ||
-           (sta->he_cap.he_cap_elem.phy_cap_info[4] & IEEE80211_HE_PHY_CAP4_MU_BEAMFORMER))
+       if ((sta->deflink.vht_cap.cap & IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE) ||
+           (sta->deflink.vht_cap.cap & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE) ||
+           (sta->deflink.he_cap.he_cap_elem.phy_cap_info[3] &
+                       IEEE80211_HE_PHY_CAP3_SU_BEAMFORMER) ||
+           (sta->deflink.he_cap.he_cap_elem.phy_cap_info[4] &
+                       IEEE80211_HE_PHY_CAP4_MU_BEAMFORMER))
                return true;
        return false;
 }
 
 {
        bool ppe_th;
        u8 ppe16, ppe8;
-       u8 nss = min(sta->rx_nss, rtwdev->hal.tx_nss) - 1;
-       u8 ppe_thres_hdr = sta->he_cap.ppe_thres[0];
+       u8 nss = min(sta->deflink.rx_nss, rtwdev->hal.tx_nss) - 1;
+       u8 ppe_thres_hdr = sta->deflink.he_cap.ppe_thres[0];
        u8 ru_bitmap;
        u8 n, idx, sh;
        u16 ppe;
        int i;
 
-       if (!sta->he_cap.has_he)
+       if (!sta->deflink.he_cap.has_he)
                return;
 
        ppe_th = FIELD_GET(IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT,
-                          sta->he_cap.he_cap_elem.phy_cap_info[6]);
+                          sta->deflink.he_cap.he_cap_elem.phy_cap_info[6]);
        if (!ppe_th) {
                u8 pad;
 
                pad = FIELD_GET(IEEE80211_HE_PHY_CAP9_NOMINAL_PKT_PADDING_MASK,
-                               sta->he_cap.he_cap_elem.phy_cap_info[9]);
+                               sta->deflink.he_cap.he_cap_elem.phy_cap_info[9]);
 
                for (i = 0; i < RTW89_PPE_BW_NUM; i++)
                        pads[i] = pad;
                sh = n & 7;
                n += IEEE80211_PPE_THRES_INFO_PPET_SIZE * 2;
 
-               ppe = le16_to_cpu(*((__le16 *)&sta->he_cap.ppe_thres[idx]));
+               ppe = le16_to_cpu(*((__le16 *)&sta->deflink.he_cap.ppe_thres[idx]));
                ppe16 = (ppe >> sh) & IEEE80211_PPE_THRES_NSS_MASK;
                sh += IEEE80211_PPE_THRES_INFO_PPET_SIZE;
                ppe8 = (ppe >> sh) & IEEE80211_PPE_THRES_NSS_MASK;
        SET_CMC_TBL_NOMINAL_PKT_PADDING40(skb->data, pads[RTW89_CHANNEL_WIDTH_40]);
        SET_CMC_TBL_NOMINAL_PKT_PADDING80(skb->data, pads[RTW89_CHANNEL_WIDTH_80]);
        if (sta)
-               SET_CMC_TBL_BSR_QUEUE_SIZE_FORMAT(skb->data, sta->he_cap.has_he);
+               SET_CMC_TBL_BSR_QUEUE_SIZE_FORMAT(skb->data,
+                                                 sta->deflink.he_cap.has_he);
        if (rtwvif->net_type == RTW89_NET_TYPE_AP_MODE)
                SET_CMC_TBL_DATA_DCM(skb->data, 0);
 
 
        u8 nc = 1, nr = 3, ng = 0, cb = 1, cs = 1, ldpc_en = 1, stbc_en = 1;
        u8 port_sel = rtwvif->port;
        u8 sound_dim = 3, t;
-       u8 *phy_cap = sta->he_cap.he_cap_elem.phy_cap_info;
+       u8 *phy_cap = sta->deflink.he_cap.he_cap_elem.phy_cap_info;
        u32 reg;
        u16 val;
        int ret;
                              phy_cap[5]);
                sound_dim = min(sound_dim, t);
        }
-       if ((sta->vht_cap.cap & IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE) ||
-           (sta->vht_cap.cap & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE)) {
-               ldpc_en &= !!(sta->vht_cap.cap & IEEE80211_VHT_CAP_RXLDPC);
-               stbc_en &= !!(sta->vht_cap.cap & IEEE80211_VHT_CAP_RXSTBC_MASK);
+       if ((sta->deflink.vht_cap.cap & IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE) ||
+           (sta->deflink.vht_cap.cap & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE)) {
+               ldpc_en &= !!(sta->deflink.vht_cap.cap & IEEE80211_VHT_CAP_RXLDPC);
+               stbc_en &= !!(sta->deflink.vht_cap.cap & IEEE80211_VHT_CAP_RXSTBC_MASK);
                t = FIELD_GET(IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK,
-                             sta->vht_cap.cap);
+                             sta->deflink.vht_cap.cap);
                sound_dim = min(sound_dim, t);
        }
        nc = min(nc, sound_dim);
        if (ret)
                return ret;
 
-       if (sta->he_cap.has_he) {
+       if (sta->deflink.he_cap.has_he) {
                rrsc |= (BIT(RTW89_MAC_BF_RRSC_HE_MSC0) |
                         BIT(RTW89_MAC_BF_RRSC_HE_MSC3) |
                         BIT(RTW89_MAC_BF_RRSC_HE_MSC5));
        }
-       if (sta->vht_cap.vht_supported) {
+       if (sta->deflink.vht_cap.vht_supported) {
                rrsc |= (BIT(RTW89_MAC_BF_RRSC_VHT_MSC0) |
                         BIT(RTW89_MAC_BF_RRSC_VHT_MSC3) |
                         BIT(RTW89_MAC_BF_RRSC_VHT_MSC5));
        }
-       if (sta->ht_cap.ht_supported) {
+       if (sta->deflink.ht_cap.ht_supported) {
                rrsc |= (BIT(RTW89_MAC_BF_RRSC_HT_MSC0) |
                         BIT(RTW89_MAC_BF_RRSC_HT_MSC3) |
                         BIT(RTW89_MAC_BF_RRSC_HT_MSC5));
 
 
 static u64 get_he_ra_mask(struct ieee80211_sta *sta)
 {
-       struct ieee80211_sta_he_cap cap = sta->he_cap;
+       struct ieee80211_sta_he_cap cap = sta->deflink.he_cap;
        u16 mcs_map;
 
-       switch (sta->bandwidth) {
+       switch (sta->deflink.bandwidth) {
        case IEEE80211_STA_RX_BW_160:
                if (cap.he_cap_elem.phy_cap_info[0] &
                    IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G)
                return -1;
        }
 
-       if (sta->he_cap.has_he) {
+       if (sta->deflink.he_cap.has_he) {
                cfg_mask |= u64_encode_bits(mask->control[band].he_mcs[0],
                                            RA_MASK_HE_1SS_RATES);
                cfg_mask |= u64_encode_bits(mask->control[band].he_mcs[1],
                                            RA_MASK_HE_2SS_RATES);
-       } else if (sta->vht_cap.vht_supported) {
+       } else if (sta->deflink.vht_cap.vht_supported) {
                cfg_mask |= u64_encode_bits(mask->control[band].vht_mcs[0],
                                            RA_MASK_VHT_1SS_RATES);
                cfg_mask |= u64_encode_bits(mask->control[band].vht_mcs[1],
                                            RA_MASK_VHT_2SS_RATES);
-       } else if (sta->ht_cap.ht_supported) {
+       } else if (sta->deflink.ht_cap.ht_supported) {
                cfg_mask |= u64_encode_bits(mask->control[band].ht_mcs[0],
                                            RA_MASK_HT_1SS_RATES);
                cfg_mask |= u64_encode_bits(mask->control[band].ht_mcs[1],
 
        memset(ra, 0, sizeof(*ra));
        /* Set the ra mask from sta's capability */
-       if (sta->he_cap.has_he) {
+       if (sta->deflink.he_cap.has_he) {
                mode |= RTW89_RA_MODE_HE;
                csi_mode = RTW89_RA_RPT_MODE_HE;
                ra_mask |= get_he_ra_mask(sta);
                high_rate_masks = rtw89_ra_mask_he_rates;
-               if (sta->he_cap.he_cap_elem.phy_cap_info[2] &
+               if (sta->deflink.he_cap.he_cap_elem.phy_cap_info[2] &
                    IEEE80211_HE_PHY_CAP2_STBC_RX_UNDER_80MHZ)
                        stbc_en = 1;
-               if (sta->he_cap.he_cap_elem.phy_cap_info[1] &
+               if (sta->deflink.he_cap.he_cap_elem.phy_cap_info[1] &
                    IEEE80211_HE_PHY_CAP1_LDPC_CODING_IN_PAYLOAD)
                        ldpc_en = 1;
-       } else if (sta->vht_cap.vht_supported) {
-               u16 mcs_map = le16_to_cpu(sta->vht_cap.vht_mcs.rx_mcs_map);
+       } else if (sta->deflink.vht_cap.vht_supported) {
+               u16 mcs_map = le16_to_cpu(sta->deflink.vht_cap.vht_mcs.rx_mcs_map);
 
                mode |= RTW89_RA_MODE_VHT;
                csi_mode = RTW89_RA_RPT_MODE_VHT;
                /* MCS9, MCS8, MCS7 */
                ra_mask |= get_mcs_ra_mask(mcs_map, 9, 1);
                high_rate_masks = rtw89_ra_mask_vht_rates;
-               if (sta->vht_cap.cap & IEEE80211_VHT_CAP_RXSTBC_MASK)
+               if (sta->deflink.vht_cap.cap & IEEE80211_VHT_CAP_RXSTBC_MASK)
                        stbc_en = 1;
-               if (sta->vht_cap.cap & IEEE80211_VHT_CAP_RXLDPC)
+               if (sta->deflink.vht_cap.cap & IEEE80211_VHT_CAP_RXLDPC)
                        ldpc_en = 1;
-       } else if (sta->ht_cap.ht_supported) {
+       } else if (sta->deflink.ht_cap.ht_supported) {
                mode |= RTW89_RA_MODE_HT;
                csi_mode = RTW89_RA_RPT_MODE_HT;
-               ra_mask |= ((u64)sta->ht_cap.mcs.rx_mask[3] << 48) |
-                          ((u64)sta->ht_cap.mcs.rx_mask[2] << 36) |
-                          (sta->ht_cap.mcs.rx_mask[1] << 24) |
-                          (sta->ht_cap.mcs.rx_mask[0] << 12);
+               ra_mask |= ((u64)sta->deflink.ht_cap.mcs.rx_mask[3] << 48) |
+                          ((u64)sta->deflink.ht_cap.mcs.rx_mask[2] << 36) |
+                          (sta->deflink.ht_cap.mcs.rx_mask[1] << 24) |
+                          (sta->deflink.ht_cap.mcs.rx_mask[0] << 12);
                high_rate_masks = rtw89_ra_mask_ht_rates;
-               if (sta->ht_cap.cap & IEEE80211_HT_CAP_RX_STBC)
+               if (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_RX_STBC)
                        stbc_en = 1;
-               if (sta->ht_cap.cap & IEEE80211_HT_CAP_LDPC_CODING)
+               if (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_LDPC_CODING)
                        ldpc_en = 1;
        }
 
        switch (rtwdev->hal.current_band_type) {
        case RTW89_BAND_2G:
-               ra_mask |= sta->supp_rates[NL80211_BAND_2GHZ];
-               if (sta->supp_rates[NL80211_BAND_2GHZ] <= 0xf)
+               ra_mask |= sta->deflink.supp_rates[NL80211_BAND_2GHZ];
+               if (sta->deflink.supp_rates[NL80211_BAND_2GHZ] <= 0xf)
                        mode |= RTW89_RA_MODE_CCK;
                else
                        mode |= RTW89_RA_MODE_CCK | RTW89_RA_MODE_OFDM;
                break;
        case RTW89_BAND_5G:
-               ra_mask |= (u64)sta->supp_rates[NL80211_BAND_5GHZ] << 4;
+               ra_mask |= (u64)sta->deflink.supp_rates[NL80211_BAND_5GHZ] << 4;
                mode |= RTW89_RA_MODE_OFDM;
                break;
        case RTW89_BAND_6G:
-               ra_mask |= (u64)sta->supp_rates[NL80211_BAND_6GHZ] << 4;
+               ra_mask |= (u64)sta->deflink.supp_rates[NL80211_BAND_6GHZ] << 4;
                mode |= RTW89_RA_MODE_OFDM;
                break;
        default:
        ra_mask = rtw89_phy_ra_mask_recover(ra_mask, ra_mask_bak);
        ra_mask &= rtw89_phy_ra_mask_cfg(rtwdev, rtwsta);
 
-       switch (sta->bandwidth) {
+       switch (sta->deflink.bandwidth) {
        case IEEE80211_STA_RX_BW_160:
                bw_mode = RTW89_CHANNEL_WIDTH_160;
-               sgi = sta->vht_cap.vht_supported &&
-                     (sta->vht_cap.cap & IEEE80211_VHT_CAP_SHORT_GI_160);
+               sgi = sta->deflink.vht_cap.vht_supported &&
+                     (sta->deflink.vht_cap.cap & IEEE80211_VHT_CAP_SHORT_GI_160);
                break;
        case IEEE80211_STA_RX_BW_80:
                bw_mode = RTW89_CHANNEL_WIDTH_80;
-               sgi = sta->vht_cap.vht_supported &&
-                     (sta->vht_cap.cap & IEEE80211_VHT_CAP_SHORT_GI_80);
+               sgi = sta->deflink.vht_cap.vht_supported &&
+                     (sta->deflink.vht_cap.cap & IEEE80211_VHT_CAP_SHORT_GI_80);
                break;
        case IEEE80211_STA_RX_BW_40:
                bw_mode = RTW89_CHANNEL_WIDTH_40;
-               sgi = sta->ht_cap.ht_supported &&
-                     (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40);
+               sgi = sta->deflink.ht_cap.ht_supported &&
+                     (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_40);
                break;
        default:
                bw_mode = RTW89_CHANNEL_WIDTH_20;
-               sgi = sta->ht_cap.ht_supported &&
-                     (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20);
+               sgi = sta->deflink.ht_cap.ht_supported &&
+                     (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_20);
                break;
        }
 
-       if (sta->he_cap.he_cap_elem.phy_cap_info[3] &
+       if (sta->deflink.he_cap.he_cap_elem.phy_cap_info[3] &
            IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_RX_16_QAM)
                ra->dcm_cap = 1;
 
        ra->macid = rtwsta->mac_id;
        ra->stbc_cap = stbc_en;
        ra->ldpc_cap = ldpc_en;
-       ra->ss_num = min(sta->rx_nss, rtwdev->hal.tx_nss) - 1;
+       ra->ss_num = min(sta->deflink.rx_nss, rtwdev->hal.tx_nss) - 1;
        ra->en_sgi = sgi;
        ra->ra_mask = ra_mask;
 
 
 
        if ((vif->type == NL80211_IFTYPE_STATION) ||
            (vif->type == NL80211_IFTYPE_P2P_CLIENT)) {
-               common->bitrate_mask[common->band] = sta->supp_rates[common->band];
-               common->vif_info[0].is_ht = sta->ht_cap.ht_supported;
-               if (sta->ht_cap.ht_supported) {
+               common->bitrate_mask[common->band] = sta->deflink.supp_rates[common->band];
+               common->vif_info[0].is_ht = sta->deflink.ht_cap.ht_supported;
+               if (sta->deflink.ht_cap.ht_supported) {
                        common->bitrate_mask[NL80211_BAND_2GHZ] =
-                                       sta->supp_rates[NL80211_BAND_2GHZ];
-                       if ((sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ||
-                           (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40))
+                                       sta->deflink.supp_rates[NL80211_BAND_2GHZ];
+                       if ((sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ||
+                           (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_40))
                                common->vif_info[0].sgi = true;
                        ieee80211_start_tx_ba_session(sta, 0, 0);
                }
 
                is_ht = common->vif_info[0].is_ht;
                is_sgi = common->vif_info[0].sgi;
        } else {
-               rate_bitmap = sta->supp_rates[band];
-               is_ht = sta->ht_cap.ht_supported;
-               if ((sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ||
-                   (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40))
+               rate_bitmap = sta->deflink.supp_rates[band];
+               is_ht = sta->deflink.ht_cap.ht_supported;
+               if ((sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ||
+                   (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_40))
                        is_sgi = true;
        }
 
 
                        if (info->bssid && !info->ibss_joined)
                                sta = ieee80211_find_sta(vif, info->bssid);
                        if (sta) {
-                               priv->ht_info.ht_cap = sta->ht_cap;
+                               priv->ht_info.ht_cap = sta->deflink.ht_cap;
                                priv->bss_params.operational_rate_set =
                                        cw1200_rate_mask_to_wsm(priv,
-                                                               sta->supp_rates[priv->channel->band]);
+                                               sta->deflink.supp_rates[priv->channel->band]);
                                priv->ht_info.channel_type = cfg80211_get_chandef_type(&dev->conf.chandef);
                                priv->ht_info.operation_mode = info->ht_operation_mode;
                        } else {
 
                                        WL1271_PSD_LEGACY;
 
 
-       sta_rates = sta->supp_rates[wlvif->band];
-       if (sta->ht_cap.ht_supported)
+       sta_rates = sta->deflink.supp_rates[wlvif->band];
+       if (sta->deflink.ht_cap.ht_supported)
                sta_rates |=
-                       (sta->ht_cap.mcs.rx_mask[0] << HW_HT_RATES_OFFSET) |
-                       (sta->ht_cap.mcs.rx_mask[1] << HW_MIMO_RATES_OFFSET);
+                       (sta->deflink.ht_cap.mcs.rx_mask[0] << HW_HT_RATES_OFFSET) |
+                       (sta->deflink.ht_cap.mcs.rx_mask[1] << HW_MIMO_RATES_OFFSET);
 
        cmd->supported_rates =
                cpu_to_le32(wl1271_tx_enabled_rates_get(wl, sta_rates,
 
                rcu_read_lock();
                sta = ieee80211_find_sta(vif, bss_conf->bssid);
                if (sta) {
-                       u8 *rx_mask = sta->ht_cap.mcs.rx_mask;
+                       u8 *rx_mask = sta->deflink.ht_cap.mcs.rx_mask;
 
                        /* save the supp_rates of the ap */
-                       sta_rate_set = sta->supp_rates[wlvif->band];
-                       if (sta->ht_cap.ht_supported)
+                       sta_rate_set = sta->deflink.supp_rates[wlvif->band];
+                       if (sta->deflink.ht_cap.ht_supported)
                                sta_rate_set |=
                                        (rx_mask[0] << HW_HT_RATES_OFFSET) |
                                        (rx_mask[1] << HW_MIMO_RATES_OFFSET);
-                       sta_ht_cap = sta->ht_cap;
+                       sta_ht_cap = sta->deflink.ht_cap;
                        sta_exists = true;
                }
 
                if (ret < 0)
                        return ret;
 
-               ret = wl1271_acx_set_ht_capabilities(wl, &sta->ht_cap, true,
+               ret = wl1271_acx_set_ht_capabilities(wl, &sta->deflink.ht_cap,
+                                                    true,
                                                     wl_sta->hlid);
                if (ret)
                        return ret;
                return;
 
        /* this callback is atomic, so schedule a new work */
-       wlvif->rc_update_bw = sta->bandwidth;
-       memcpy(&wlvif->rc_ht_cap, &sta->ht_cap, sizeof(sta->ht_cap));
+       wlvif->rc_update_bw = sta->deflink.bandwidth;
+       memcpy(&wlvif->rc_ht_cap, &sta->deflink.ht_cap,
+              sizeof(sta->deflink.ht_cap));
        ieee80211_queue_work(hw, &wlvif->rc_update_work);
 }
 
 
        rcu_read_lock(); /* protect sta */
        if (info->bssid && !info->ibss_joined)
                sta = ieee80211_find_sta(wvif->vif, info->bssid);
-       if (sta && sta->ht_cap.ht_supported)
-               ampdu_density = sta->ht_cap.ampdu_density;
-       if (sta && sta->ht_cap.ht_supported &&
+       if (sta && sta->deflink.ht_cap.ht_supported)
+               ampdu_density = sta->deflink.ht_cap.ampdu_density;
+       if (sta && sta->deflink.ht_cap.ht_supported &&
            !(info->ht_operation_mode & IEEE80211_HT_OP_MODE_NON_GF_STA_PRSNT))
-               greenfield = !!(sta->ht_cap.cap & IEEE80211_HT_CAP_GRN_FLD);
+               greenfield = !!(sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_GRN_FLD);
        rcu_read_unlock();
 
        wvif->join_in_progress = false;
 
        enum nl80211_tx_power_setting type;
 };
 
+#define MAX_STA_LINKS                  15
+
+/**
+ * struct ieee80211_link_sta - station Link specific info
+ * All link specific info for a STA link for a non MLD STA(single)
+ * or a MLD STA(multiple entries) are stored here.
+ *
+ * @addr: MAC address of the Link STA. For non-MLO STA this is same as the addr
+ *     in ieee80211_sta. For MLO Link STA this addr can be same or different
+ *     from addr in ieee80211_sta (representing MLD STA addr)
+ * @supp_rates: Bitmap of supported rates
+ * @ht_cap: HT capabilities of this STA; restricted to our own capabilities
+ * @vht_cap: VHT capabilities of this STA; restricted to our own capabilities
+ * @he_cap: HE capabilities of this STA
+ * @he_6ghz_capa: on 6 GHz, holds the HE 6 GHz band capabilities
+ * @eht_cap: EHT capabilities of this STA
+ * @bandwidth: current bandwidth the station can receive with
+ * @rx_nss: in HT/VHT, the maximum number of spatial streams the
+ *     station can receive at the moment, changed by operating mode
+ *     notifications and capabilities. The value is only valid after
+ *     the station moves to associated state.
+ * @txpwr: the station tx power configuration
+ *
+ */
+struct ieee80211_link_sta {
+       u8 addr[ETH_ALEN];
+
+       u32 supp_rates[NUM_NL80211_BANDS];
+       struct ieee80211_sta_ht_cap ht_cap;
+       struct ieee80211_sta_vht_cap vht_cap;
+       struct ieee80211_sta_he_cap he_cap;
+       struct ieee80211_he_6ghz_capa he_6ghz_capa;
+       struct ieee80211_sta_eht_cap eht_cap;
+
+       u8 rx_nss;
+       enum ieee80211_sta_rx_bandwidth bandwidth;
+       struct ieee80211_sta_txpwr txpwr;
+};
+
 /**
  * struct ieee80211_sta - station table entry
  *
  * either be protected by rcu_read_lock() explicitly or implicitly,
  * or you must take good care to not use such a pointer after a
  * call to your sta_remove callback that removed it.
+ * This also represents the MLD STA in case of MLO association
+ * and holds pointers to various link STA's
  *
  * @addr: MAC address
  * @aid: AID we assigned to the station if we're an AP
- * @supp_rates: Bitmap of supported rates (per band)
- * @ht_cap: HT capabilities of this STA; restricted to our own capabilities
- * @vht_cap: VHT capabilities of this STA; restricted to our own capabilities
- * @he_cap: HE capabilities of this STA
- * @he_6ghz_capa: on 6 GHz, holds the HE 6 GHz band capabilities
- * @eht_cap: EHT capabilities of this STA
  * @max_rx_aggregation_subframes: maximal amount of frames in a single AMPDU
  *     that this station is allowed to transmit to us.
  *     Can be modified by driver.
  *     if wme is supported. The bits order is like in
  *     IEEE80211_WMM_IE_STA_QOSINFO_AC_*.
  * @max_sp: max Service Period. Only valid if wme is supported.
- * @bandwidth: current bandwidth the station can receive with
- * @rx_nss: in HT/VHT, the maximum number of spatial streams the
- *     station can receive at the moment, changed by operating mode
- *     notifications and capabilities. The value is only valid after
- *     the station moves to associated state.
  * @smps_mode: current SMPS mode (off, static or dynamic)
  * @rates: rate control selection table
  * @tdls: indicates whether the STA is a TDLS peer
  * @support_p2p_ps: indicates whether the STA supports P2P PS mechanism or not.
  * @max_rc_amsdu_len: Maximum A-MSDU size in bytes recommended by rate control.
  * @max_tid_amsdu_len: Maximum A-MSDU size in bytes for this TID
- * @txpwr: the station tx power configuration
  * @txq: per-TID data TX queues (if driver uses the TXQ abstraction); note that
  *     the last entry (%IEEE80211_NUM_TIDS) is used for non-data frames
+ * @multi_link_sta: Identifies if this sta is a MLD STA
+ * @deflink: This holds the default link STA information, for non MLO STA all link
+ *     specific STA information is accessed through @deflink or through
+ *     link[0] which points to address of @deflink. For MLO Link STA
+ *     the first added link STA will point to deflink.
+ * @link: reference to Link Sta entries. For Non MLO STA, except 1st link,
+ *     i.e link[0] all links would be assigned to NULL by default and
+ *     would access link information via @deflink or link[0]. For MLO
+ *     STA, first link STA being added will point its link pointer to
+ *     @deflink address and remaining would be allocated and the address
+ *     would be assigned to link[link_id] where link_id is the id assigned
+ *     by the AP.
  */
 struct ieee80211_sta {
-       u32 supp_rates[NUM_NL80211_BANDS];
        u8 addr[ETH_ALEN];
        u16 aid;
-       struct ieee80211_sta_ht_cap ht_cap;
-       struct ieee80211_sta_vht_cap vht_cap;
-       struct ieee80211_sta_he_cap he_cap;
-       struct ieee80211_he_6ghz_capa he_6ghz_capa;
-       struct ieee80211_sta_eht_cap eht_cap;
        u16 max_rx_aggregation_subframes;
        bool wme;
        u8 uapsd_queues;
        u8 max_sp;
-       u8 rx_nss;
-       enum ieee80211_sta_rx_bandwidth bandwidth;
        enum ieee80211_smps_mode smps_mode;
        struct ieee80211_sta_rates __rcu *rates;
        bool tdls;
        bool support_p2p_ps;
        u16 max_rc_amsdu_len;
        u16 max_tid_amsdu_len[IEEE80211_NUM_TIDS];
-       struct ieee80211_sta_txpwr txpwr;
 
        struct ieee80211_txq *txq[IEEE80211_NUM_TIDS + 1];
 
+       bool multi_link_sta;
+       struct ieee80211_link_sta deflink;
+       struct ieee80211_link_sta *link[MAX_STA_LINKS];
+
        /* must be last */
        u8 drv_priv[] __aligned(sizeof(void *));
 };
                                 enum nl80211_band band,
                                 int index)
 {
-       return (sta == NULL || sta->supp_rates[band] & BIT(index));
+       return (sta == NULL || sta->deflink.supp_rates[band] & BIT(index));
 }
 
 static inline s8
 
        mgmt->u.action.u.addba_resp.timeout = cpu_to_le16(timeout);
        mgmt->u.action.u.addba_resp.status = cpu_to_le16(status);
 
-       if (sta->sta.he_cap.has_he && addbaext)
+       if (sta->sta.deflink.he_cap.has_he && addbaext)
                ieee80211_add_addbaext(sdata, skb, addbaext, buf_size);
 
        ieee80211_tx_skb(sdata, skb);
                goto end;
        }
 
-       if (!sta->sta.ht_cap.ht_supported &&
+       if (!sta->sta.deflink.ht_cap.ht_supported &&
            sta->sdata->vif.bss_conf.chandef.chan->band != NL80211_BAND_6GHZ) {
                ht_dbg(sta->sdata,
                       "STA %pM erroneously requests BA session on tid %d w/o QoS\n",
                goto end;
        }
 
-       if (sta->sta.eht_cap.has_eht)
+       if (sta->sta.deflink.eht_cap.has_eht)
                max_buf_size = IEEE80211_MAX_AMPDU_BUF_EHT;
-       else if (sta->sta.he_cap.has_he)
+       else if (sta->sta.deflink.he_cap.has_he)
                max_buf_size = IEEE80211_MAX_AMPDU_BUF_HE;
        else
                max_buf_size = IEEE80211_MAX_AMPDU_BUF_HT;
         * and if buffer size does not exceeds max value */
        /* XXX: check own ht delayed BA capability?? */
        if (((ba_policy != 1) &&
-            (!(sta->sta.ht_cap.cap & IEEE80211_HT_CAP_DELAY_BA))) ||
+            (!(sta->sta.deflink.ht_cap.cap & IEEE80211_HT_CAP_DELAY_BA))) ||
            (buf_size > max_buf_size)) {
                status = WLAN_STATUS_INVALID_QOS_PARAM;
                ht_dbg_ratelimited(sta->sdata,
                        goto free;
        }
 
-       if (sta->sta.eht_cap.has_eht && elems && elems->addba_ext_ie) {
+       if (sta->sta.deflink.eht_cap.has_eht && elems && elems->addba_ext_ie) {
                u8 buf_size_1k = u8_get_bits(elems->addba_ext_ie->data,
                                             IEEE80211_ADDBA_EXT_BUF_SIZE_MASK);
 
 
        sta->ampdu_mlme.addba_req_num[tid]++;
        spin_unlock_bh(&sta->lock);
 
-       if (sta->sta.he_cap.has_he) {
+       if (sta->sta.deflink.he_cap.has_he) {
                buf_size = local->hw.max_tx_aggregation_subframes;
        } else {
                /*
                 "Requested to start BA session on reserved tid=%d", tid))
                return -EINVAL;
 
-       if (!pubsta->ht_cap.ht_supported &&
+       if (!pubsta->deflink.ht_cap.ht_supported &&
            sta->sdata->vif.bss_conf.chandef.chan->band != NL80211_BAND_6GHZ)
                return -EINVAL;
 
         * is set when we receive a bss info from a probe response or a beacon.
         */
        if (sta->sdata->vif.type == NL80211_IFTYPE_ADHOC &&
-           !sta->sta.ht_cap.ht_supported) {
+           !sta->sta.deflink.ht_cap.ht_supported) {
                ht_dbg(sdata,
                       "BA request denied - IBSS STA %pM does not advertise HT support\n",
                       pubsta->addr);
 
                struct sta_info *sta = container_of(pubsta, struct sta_info,
                                                    sta);
                struct ieee80211_rx_status stat;
-               struct ieee80211_tx_rate *tx_rate = &sta->tx_stats.last_rate;
-               struct rate_info *ri = &sta->tx_stats.last_rate_info;
+               struct ieee80211_tx_rate *tx_rate = &sta->deflink.tx_stats.last_rate;
+               struct rate_info *ri = &sta->deflink.tx_stats.last_rate_info;
                u32 duration, overhead;
                u8 agg_shift;
 
 
                if (pairwise)
                        key = key_mtx_dereference(local, sta->ptk[key_idx]);
                else
-                       key = key_mtx_dereference(local, sta->gtk[key_idx]);
+                       key = key_mtx_dereference(local,
+                                                 sta->deflink.gtk[key_idx]);
        } else
                key = key_mtx_dereference(local, sdata->keys[key_idx]);
 
                else if (!pairwise &&
                         key_idx < NUM_DEFAULT_KEYS + NUM_DEFAULT_MGMT_KEYS +
                         NUM_DEFAULT_BEACON_KEYS)
-                       key = rcu_dereference(sta->gtk[key_idx]);
+                       key = rcu_dereference(sta->deflink.gtk[key_idx]);
        } else
                key = rcu_dereference(sdata->keys[key_idx]);
 
                sta->listen_interval = params->listen_interval;
 
        if (params->sta_modify_mask & STATION_PARAM_APPLY_STA_TXPOWER) {
-               sta->sta.txpwr.type = params->txpwr.type;
+               sta->sta.deflink.txpwr.type = params->txpwr.type;
                if (params->txpwr.type == NL80211_TX_POWER_LIMITED)
-                       sta->sta.txpwr.power = params->txpwr.power;
+                       sta->sta.deflink.txpwr.power = params->txpwr.power;
                ret = drv_sta_set_txpwr(local, sdata, sta);
                if (ret)
                        return ret;
                ieee80211_parse_bitrates(&sdata->vif.bss_conf.chandef,
                                         sband, params->supported_rates,
                                         params->supported_rates_len,
-                                        &sta->sta.supp_rates[sband->band]);
+                                        &sta->sta.deflink.supp_rates[sband->band]);
        }
 
        if (params->ht_capa)
 
 
        switch (width) {
        case IEEE80211_STA_RX_BW_20:
-               if (sta->sta.ht_cap.ht_supported)
+               if (sta->sta.deflink.ht_cap.ht_supported)
                        return NL80211_CHAN_WIDTH_20;
                else
                        return NL80211_CHAN_WIDTH_20_NOHT;
                new_sta_bw = ieee80211_sta_cur_vht_bw(sta);
 
                /* nothing change */
-               if (new_sta_bw == sta->sta.bandwidth)
+               if (new_sta_bw == sta->sta.deflink.bandwidth)
                        continue;
 
                /* vif changed to narrow BW and narrow BW for station wasn't
                 * requested or vise versa */
-               if ((new_sta_bw < sta->sta.bandwidth) == !narrowed)
+               if ((new_sta_bw < sta->sta.deflink.bandwidth) == !narrowed)
                        continue;
 
-               sta->sta.bandwidth = new_sta_bw;
+               sta->sta.deflink.bandwidth = new_sta_bw;
                rate_control_rate_update(local, sband, sta,
                                         IEEE80211_RC_BW_CHANGED);
        }
 
        int i;
        ssize_t bufsz = 512;
        struct sta_info *sta = file->private_data;
-       struct ieee80211_sta_ht_cap *htc = &sta->sta.ht_cap;
+       struct ieee80211_sta_ht_cap *htc = &sta->sta.deflink.ht_cap;
        ssize_t ret;
 
        buf = kzalloc(bufsz, GFP_KERNEL);
 {
        char *buf, *p;
        struct sta_info *sta = file->private_data;
-       struct ieee80211_sta_vht_cap *vhtc = &sta->sta.vht_cap;
+       struct ieee80211_sta_vht_cap *vhtc = &sta->sta.deflink.vht_cap;
        ssize_t ret;
        ssize_t bufsz = 512;
 
        char *buf, *p;
        size_t buf_sz = PAGE_SIZE;
        struct sta_info *sta = file->private_data;
-       struct ieee80211_sta_he_cap *hec = &sta->sta.he_cap;
+       struct ieee80211_sta_he_cap *hec = &sta->sta.deflink.he_cap;
        struct ieee80211_he_mcs_nss_supp *nss = &hec->he_mcs_nss_supp;
        u8 ppe_size;
        u8 *cap;
        DEBUGFS_ADD(vht_capa);
        DEBUGFS_ADD(he_capa);
 
-       DEBUGFS_ADD_COUNTER(rx_duplicates, rx_stats.num_duplicates);
-       DEBUGFS_ADD_COUNTER(rx_fragments, rx_stats.fragments);
-       DEBUGFS_ADD_COUNTER(tx_filtered, status_stats.filtered);
+       DEBUGFS_ADD_COUNTER(rx_duplicates, deflink.rx_stats.num_duplicates);
+       DEBUGFS_ADD_COUNTER(rx_fragments, deflink.rx_stats.fragments);
+       DEBUGFS_ADD_COUNTER(tx_filtered, deflink.status_stats.filtered);
 
        if (local->ops->wake_tx_queue) {
                DEBUGFS_ADD(aqm);
 
                                    const struct ieee80211_eht_cap_elem *eht_cap_ie_elem,
                                    u8 eht_cap_len, struct sta_info *sta)
 {
-       struct ieee80211_sta_eht_cap *eht_cap = &sta->sta.eht_cap;
+       struct ieee80211_sta_eht_cap *eht_cap = &sta->sta.deflink.eht_cap;
        struct ieee80211_he_cap_elem *he_cap_ie_elem = (void *)he_cap_ie;
        u8 eht_ppe_size = 0;
        u8 mcs_nss_size;
 
        eht_cap->has_eht = true;
 
-       sta->cur_max_bandwidth = ieee80211_sta_cap_rx_bw(sta);
-       sta->sta.bandwidth = ieee80211_sta_cur_vht_bw(sta);
+       sta->deflink.cur_max_bandwidth = ieee80211_sta_cap_rx_bw(sta);
+       sta->sta.deflink.bandwidth = ieee80211_sta_cur_vht_bw(sta);
 }
 
                sta_set_sinfo(sta, &sinfo, false);
 
                i = 0;
-               ADD_STA_STATS(sta);
+               ADD_STA_STATS(sta->link[0]);
 
                data[i++] = sta->sta_state;
 
                        memset(&sinfo, 0, sizeof(sinfo));
                        sta_set_sinfo(sta, &sinfo, false);
                        i = 0;
-                       ADD_STA_STATS(sta);
+                       ADD_STA_STATS(sta->link[0]);
                }
        }
 
 
                break;
        }
 
-       sta->sta.he_6ghz_capa = *he_6ghz_capa;
+       sta->sta.deflink.he_6ghz_capa = *he_6ghz_capa;
 }
 
 static void ieee80211_he_mcs_disable(__le16 *he_mcs)
                                  const struct ieee80211_he_6ghz_capa *he_6ghz_capa,
                                  struct sta_info *sta)
 {
-       struct ieee80211_sta_he_cap *he_cap = &sta->sta.he_cap;
+       struct ieee80211_sta_he_cap *he_cap = &sta->sta.deflink.he_cap;
        struct ieee80211_sta_he_cap own_he_cap;
        struct ieee80211_he_cap_elem *he_cap_ie_elem = (void *)he_cap_ie;
        u8 he_ppe_size;
 
        he_cap->has_he = true;
 
-       sta->cur_max_bandwidth = ieee80211_sta_cap_rx_bw(sta);
-       sta->sta.bandwidth = ieee80211_sta_cur_vht_bw(sta);
+       sta->deflink.cur_max_bandwidth = ieee80211_sta_cap_rx_bw(sta);
+       sta->sta.deflink.bandwidth = ieee80211_sta_cur_vht_bw(sta);
 
        if (sband->band == NL80211_BAND_6GHZ && he_6ghz_capa)
                ieee80211_update_from_he_6ghz_capa(he_6ghz_capa, sta);
 
                sta->sta.max_amsdu_len = IEEE80211_MAX_MPDU_LEN_HT_3839;
 
  apply:
-       changed = memcmp(&sta->sta.ht_cap, &ht_cap, sizeof(ht_cap));
+       changed = memcmp(&sta->sta.deflink.ht_cap, &ht_cap, sizeof(ht_cap));
 
-       memcpy(&sta->sta.ht_cap, &ht_cap, sizeof(ht_cap));
+       memcpy(&sta->sta.deflink.ht_cap, &ht_cap, sizeof(ht_cap));
 
        switch (sdata->vif.bss_conf.chandef.width) {
        default:
                break;
        }
 
-       sta->sta.bandwidth = bw;
+       sta->sta.deflink.bandwidth = bw;
 
-       sta->cur_max_bandwidth =
+       sta->deflink.cur_max_bandwidth =
                ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40 ?
                                IEEE80211_STA_RX_BW_40 : IEEE80211_STA_RX_BW_20;
 
 
 
        /* make sure mandatory rates are always added */
        sband = local->hw.wiphy->bands[band];
-       sta->sta.supp_rates[band] = supp_rates |
+       sta->sta.deflink.supp_rates[band] = supp_rates |
                        ieee80211_mandatory_rates(sband, scan_width);
 
        return ieee80211_ibss_finish_sta(sta);
                if (sta) {
                        u32 prev_rates;
 
-                       prev_rates = sta->sta.supp_rates[band];
+                       prev_rates = sta->sta.deflink.supp_rates[band];
                        /* make sure mandatory rates are always added */
                        scan_width = NL80211_BSS_CHAN_WIDTH_20;
                        if (rx_status->bw == RATE_INFO_BW_5)
                        else if (rx_status->bw == RATE_INFO_BW_10)
                                scan_width = NL80211_BSS_CHAN_WIDTH_10;
 
-                       sta->sta.supp_rates[band] = supp_rates |
+                       sta->sta.deflink.supp_rates[band] = supp_rates |
                                ieee80211_mandatory_rates(sband, scan_width);
-                       if (sta->sta.supp_rates[band] != prev_rates) {
+                       if (sta->sta.deflink.supp_rates[band] != prev_rates) {
                                ibss_dbg(sdata,
                                         "updated supp_rates set for %pM based on beacon/probe_resp (0x%x -> 0x%x)\n",
                                         sta->sta.addr, prev_rates,
-                                        sta->sta.supp_rates[band]);
+                                        sta->sta.deflink.supp_rates[band]);
                                rates_updated = true;
                        }
                } else {
                /* we both use HT */
                struct ieee80211_ht_cap htcap_ie;
                struct cfg80211_chan_def chandef;
-               enum ieee80211_sta_rx_bandwidth bw = sta->sta.bandwidth;
+               enum ieee80211_sta_rx_bandwidth bw = sta->sta.deflink.bandwidth;
 
                cfg80211_chandef_create(&chandef, channel, NL80211_CHAN_NO_HT);
                ieee80211_chandef_ht_oper(elems->ht_operation, &chandef);
                    sdata->u.ibss.chandef.width != NL80211_CHAN_WIDTH_40) {
                        /* we both use VHT */
                        struct ieee80211_vht_cap cap_ie;
-                       struct ieee80211_sta_vht_cap cap = sta->sta.vht_cap;
+                       struct ieee80211_sta_vht_cap cap = sta->sta.deflink.vht_cap;
                        u32 vht_cap_info =
                                le32_to_cpu(elems->vht_cap_elem->vht_cap_info);
 
                        memcpy(&cap_ie, elems->vht_cap_elem, sizeof(cap_ie));
                        ieee80211_vht_cap_ie_to_sta_vht_cap(sdata, sband,
                                                            &cap_ie, sta);
-                       if (memcmp(&cap, &sta->sta.vht_cap, sizeof(cap)))
+                       if (memcmp(&cap, &sta->sta.deflink.vht_cap, sizeof(cap)))
                                rates_updated |= true;
                }
 
-               if (bw != sta->sta.bandwidth)
+               if (bw != sta->sta.deflink.bandwidth)
                        rates_updated |= true;
 
                if (!cfg80211_chandef_compatible(&sdata->u.ibss.chandef,
 
        if (sta && rates_updated) {
                u32 changed = IEEE80211_RC_SUPP_RATES_CHANGED;
-               u8 rx_nss = sta->sta.rx_nss;
+               u8 rx_nss = sta->sta.deflink.rx_nss;
 
                /* Force rx_nss recalculation */
-               sta->sta.rx_nss = 0;
+               sta->sta.deflink.rx_nss = 0;
                rate_control_rate_init(sta);
-               if (sta->sta.rx_nss != rx_nss)
+               if (sta->sta.deflink.rx_nss != rx_nss)
                        changed |= IEEE80211_RC_NSS_CHANGED;
 
                drv_sta_rc_update(local, sdata, &sta->sta, changed);
 
        /* make sure mandatory rates are always added */
        sband = local->hw.wiphy->bands[band];
-       sta->sta.supp_rates[band] = supp_rates |
+       sta->sta.deflink.supp_rates[band] = supp_rates |
                        ieee80211_mandatory_rates(sband, scan_width);
 
        spin_lock(&ifibss->incomplete_lock);
 
                            !(new->conf.flags & IEEE80211_KEY_FLAG_NO_AUTO_TX))
                                _ieee80211_set_tx_key(new, true);
                } else {
-                       rcu_assign_pointer(sta->gtk[idx], new);
+                       rcu_assign_pointer(sta->deflink.gtk[idx], new);
                }
                /* Only needed for transition from no key -> key.
                 * Still triggers unnecessary when using Extended Key ID
                    (old_key && old_key->conf.cipher != key->conf.cipher))
                        goto out;
        } else if (sta) {
-               old_key = key_mtx_dereference(sdata->local, sta->gtk[idx]);
+               old_key = key_mtx_dereference(sdata->local,
+                                             sta->deflink.gtk[idx]);
        } else {
                old_key = key_mtx_dereference(sdata->local, sdata->keys[idx]);
        }
        int i;
 
        mutex_lock(&local->key_mtx);
-       for (i = 0; i < ARRAY_SIZE(sta->gtk); i++) {
-               key = key_mtx_dereference(local, sta->gtk[i]);
+       for (i = 0; i < ARRAY_SIZE(sta->deflink.gtk); i++) {
+               key = key_mtx_dereference(local, sta->deflink.gtk[i]);
                if (!key)
                        continue;
                ieee80211_key_replace(key->sdata, key->sta,
 
                        LINK_FAIL_THRESH)
                mesh_plink_broken(sta);
 
-       sta_set_rate_info_tx(sta, &sta->tx_stats.last_rate, &rinfo);
+       sta_set_rate_info_tx(sta, &sta->deflink.tx_stats.last_rate, &rinfo);
        ewma_mesh_tx_rate_avg_add(&sta->mesh->tx_rate_avg,
                                  cfg80211_calculate_bitrate(&rinfo));
 }
 
        s32 rssi_threshold = sdata->u.mesh.mshcfg.rssi_threshold;
        return rssi_threshold == 0 ||
               (sta &&
-               (s8)-ewma_signal_read(&sta->rx_stats_avg.signal) >
-                                               rssi_threshold);
+               (s8)-ewma_signal_read(&sta->deflink.rx_stats_avg.signal) >
+               rssi_threshold);
 }
 
 /**
                        continue;
 
                short_slot = false;
-               if (erp_rates & sta->sta.supp_rates[sband->band])
+               if (erp_rates & sta->sta.deflink.supp_rates[sband->band])
                        short_slot = true;
                 else
                        break;
                    sta->mesh->plink_state != NL80211_PLINK_ESTAB)
                        continue;
 
-               if (sta->sta.bandwidth > IEEE80211_STA_RX_BW_20)
+               if (sta->sta.deflink.bandwidth > IEEE80211_STA_RX_BW_20)
                        continue;
 
-               if (!sta->sta.ht_cap.ht_supported) {
+               if (!sta->sta.deflink.ht_cap.ht_supported) {
                        mpl_dbg(sdata, "nonHT sta (%pM) is present\n",
                                       sta->sta.addr);
                        non_ht_sta = true;
        struct ieee80211_local *local = sdata->local;
        struct ieee80211_supported_band *sband;
        u32 rates, basic_rates = 0, changed = 0;
-       enum ieee80211_sta_rx_bandwidth bw = sta->sta.bandwidth;
+       enum ieee80211_sta_rx_bandwidth bw = sta->sta.deflink.bandwidth;
 
        sband = ieee80211_get_sband(sdata);
        if (!sband)
                                        &basic_rates);
 
        spin_lock_bh(&sta->mesh->plink_lock);
-       sta->rx_stats.last_rx = jiffies;
+       sta->deflink.rx_stats.last_rx = jiffies;
 
        /* rates and capabilities don't change during peering */
        if (sta->mesh->plink_state == NL80211_PLINK_ESTAB &&
                goto out;
        sta->mesh->processed_beacon = true;
 
-       if (sta->sta.supp_rates[sband->band] != rates)
+       if (sta->sta.deflink.supp_rates[sband->band] != rates)
                changed |= IEEE80211_RC_SUPP_RATES_CHANGED;
-       sta->sta.supp_rates[sband->band] = rates;
+       sta->sta.deflink.supp_rates[sband->band] = rates;
 
        if (ieee80211_ht_cap_ie_to_sta_ht_cap(sdata, sband,
                                              elems->ht_cap_elem, sta))
                                          elems->he_6ghz_capa,
                                          sta);
 
-       if (bw != sta->sta.bandwidth)
+       if (bw != sta->sta.deflink.bandwidth)
                changed |= IEEE80211_RC_BW_CHANGED;
 
        /* HT peer is operating 20MHz-only */
        if (elems->ht_operation &&
            !(elems->ht_operation->ht_param &
              IEEE80211_HT_PARAM_CHAN_WIDTH_ANY)) {
-               if (sta->sta.bandwidth != IEEE80211_STA_RX_BW_20)
+               if (sta->sta.deflink.bandwidth != IEEE80211_STA_RX_BW_20)
                        changed |= IEEE80211_RC_BW_CHANGED;
-               sta->sta.bandwidth = IEEE80211_STA_RX_BW_20;
+               sta->sta.deflink.bandwidth = IEEE80211_STA_RX_BW_20;
        }
 
        if (!test_sta_flag(sta, WLAN_STA_RATE_CONTROL))
 
        if (!(elems->ext_capab[9] & WLAN_EXT_CAPA10_TWT_RESPONDER_SUPPORT))
                return false;
 
-       return sta->sta.he_cap.he_cap_elem.mac_cap_info[0] &
+       return sta->sta.deflink.he_cap.he_cap_elem.mac_cap_info[0] &
                IEEE80211_HE_MAC_CAP0_TWT_RES;
 }
 
                                            ieee80211_vif_type_p2p(&sdata->vif));
 
        return bss_conf->he_support &&
-               (sta->sta.he_cap.he_cap_elem.mac_cap_info[2] &
+               (sta->sta.deflink.he_cap.he_cap_elem.mac_cap_info[2] &
                        IEEE80211_HE_MAC_CAP2_BCAST_TWT) &&
                own_he_cap &&
                (own_he_cap->he_cap_elem.mac_cap_info[2] &
                                                  elems->he_6ghz_capa,
                                                  sta);
 
-               bss_conf->he_support = sta->sta.he_cap.has_he;
+               bss_conf->he_support = sta->sta.deflink.he_cap.has_he;
                if (elems->rsnx && elems->rsnx_len &&
                    (elems->rsnx[0] & WLAN_RSNX_CAPA_PROTECTED_TWT) &&
                    wiphy_ext_feature_isset(local->hw.wiphy,
                                                            elems->eht_cap_len,
                                                            sta);
 
-                       bss_conf->eht_support = sta->sta.eht_cap.has_eht;
+                       bss_conf->eht_support = sta->sta.deflink.eht_cap.has_eht;
                } else {
                        bss_conf->eht_support = false;
                }
                nss = *elems->opmode_notif & IEEE80211_OPMODE_NOTIF_RX_NSS_MASK;
                nss >>= IEEE80211_OPMODE_NOTIF_RX_NSS_SHIFT;
                nss += 1;
-               sta->sta.rx_nss = nss;
+               sta->sta.deflink.rx_nss = nss;
        }
 
        rate_control_rate_init(sta);
        if (!sta)
                return;
 
-       timeout = sta->status_stats.last_ack;
-       if (time_before(sta->status_stats.last_ack, sta->rx_stats.last_rx))
-               timeout = sta->rx_stats.last_rx;
+       timeout = sta->deflink.status_stats.last_ack;
+       if (time_before(sta->deflink.status_stats.last_ack, sta->deflink.rx_stats.last_rx))
+               timeout = sta->deflink.rx_stats.last_rx;
        timeout += IEEE80211_CONNECTION_IDLE_TIME;
 
        /* If timeout is after now, then update timer to fire at
                }
 
                if (rates)
-                       new_sta->sta.supp_rates[cbss->channel->band] = rates;
+                       new_sta->sta.deflink.supp_rates[cbss->channel->band] = rates;
                else
                        sdata_info(sdata,
                                   "No rates found, keeping mandatory only\n");
 
 
        /* Add only mandatory rates for now */
        sband = local->hw.wiphy->bands[band];
-       sta->sta.supp_rates[band] =
+       sta->sta.deflink.supp_rates[band] =
                ieee80211_mandatory_rates(sband, scan_width);
 
        spin_lock(&ifocb->incomplete_lock);
 
        WARN_ONCE(i == sband->n_bitrates,
                  "no supported rates for sta %pM (0x%x, band %d) in rate_mask 0x%x with flags 0x%x\n",
                  sta ? sta->addr : NULL,
-                 sta ? sta->supp_rates[sband->band] : -1,
+                 sta ? sta->deflink.supp_rates[sband->band] : -1,
                  sband->band,
                  rate_mask, rate_flags);
 
                u16 sta_vht_mask[NL80211_VHT_NSS_MAX];
 
                /* Filter out rates that the STA does not support */
-               *mask &= sta->supp_rates[sband->band];
+               *mask &= sta->deflink.supp_rates[sband->band];
                for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++)
-                       mcs_mask[i] &= sta->ht_cap.mcs.rx_mask[i];
+                       mcs_mask[i] &= sta->deflink.ht_cap.mcs.rx_mask[i];
 
-               sta_vht_cap = sta->vht_cap.vht_mcs.rx_mcs_map;
+               sta_vht_cap = sta->deflink.vht_cap.vht_mcs.rx_mcs_map;
                ieee80211_get_vht_mask_from_cap(sta_vht_cap, sta_vht_mask);
                for (i = 0; i < NL80211_VHT_NSS_MAX; i++)
                        vht_mask[i] &= sta_vht_mask[i];
 
        int tmp_max_streams, group, tmp_idx, tmp_prob;
        int tmp_tp = 0;
 
-       if (!mi->sta->ht_cap.ht_supported)
+       if (!mi->sta->deflink.ht_cap.ht_supported)
                return;
 
        group = MI_RATE_GROUP(mi->max_tp_rate[0]);
        u16 tmp_mcs_tp_rate[MAX_THR_RATES], tmp_group_tp_rate[MAX_THR_RATES];
        u16 tmp_legacy_tp_rate[MAX_THR_RATES], tmp_max_prob_rate;
        u16 index;
-       bool ht_supported = mi->sta->ht_cap.ht_supported;
+       bool ht_supported = mi->sta->deflink.ht_cap.ht_supported;
 
        if (mi->ampdu_packets > 0) {
                if (!ieee80211_hw_check(mp->hw, TX_STATUS_NO_AMPDU_LEN))
         * the limit here to avoid the complexity of having to de-aggregate
         * packets in the queue.
         */
-       if (!mi->sta->vht_cap.vht_supported)
+       if (!mi->sta->deflink.vht_cap.vht_supported)
                return IEEE80211_MAX_MPDU_LEN_HT_BA;
 
        /* unlimited */
        if (sband->band != NL80211_BAND_2GHZ)
                return;
 
-       if (sta->ht_cap.ht_supported &&
+       if (sta->deflink.ht_cap.ht_supported &&
            !ieee80211_hw_check(mp->hw, SUPPORTS_HT_CCK_RATES))
                return;
 
        const u8 *rates;
        int i;
 
-       if (sta->ht_cap.ht_supported)
+       if (sta->deflink.ht_cap.ht_supported)
                return;
 
        rates = mp->ofdm_rates[sband->band];
 {
        struct minstrel_priv *mp = priv;
        struct minstrel_ht_sta *mi = priv_sta;
-       struct ieee80211_mcs_info *mcs = &sta->ht_cap.mcs;
-       u16 ht_cap = sta->ht_cap.cap;
-       struct ieee80211_sta_vht_cap *vht_cap = &sta->vht_cap;
+       struct ieee80211_mcs_info *mcs = &sta->deflink.ht_cap.mcs;
+       u16 ht_cap = sta->deflink.ht_cap.cap;
+       struct ieee80211_sta_vht_cap *vht_cap = &sta->deflink.vht_cap;
        const struct ieee80211_rate *ctl_rate;
        bool ldpc, erp;
        int use_vht;
                }
 
                if (gflags & IEEE80211_TX_RC_40_MHZ_WIDTH &&
-                   sta->bandwidth < IEEE80211_STA_RX_BW_40)
+                   sta->deflink.bandwidth < IEEE80211_STA_RX_BW_40)
                        continue;
 
                nss = minstrel_mcs_groups[i].streams;
                        continue;
 
                if (gflags & IEEE80211_TX_RC_80_MHZ_WIDTH) {
-                       if (sta->bandwidth < IEEE80211_STA_RX_BW_80 ||
+                       if (sta->deflink.bandwidth < IEEE80211_STA_RX_BW_80 ||
                            ((gflags & IEEE80211_TX_RC_SHORT_GI) &&
                             !(vht_cap->cap & IEEE80211_VHT_CAP_SHORT_GI_80))) {
                                continue;
 
        skb_queue_tail(&sdata->skb_queue, skb);
        ieee80211_queue_work(&sdata->local->hw, &sdata->work);
        if (sta)
-               sta->rx_stats.packets++;
+               sta->deflink.rx_stats.packets++;
 }
 
 static void ieee80211_queue_skb_to_iface(struct ieee80211_sub_if_data *sdata,
        if (unlikely(ieee80211_has_retry(hdr->frame_control) &&
                     rx->sta->last_seq_ctrl[rx->seqno_idx] == hdr->seq_ctrl)) {
                I802_DEBUG_INC(rx->local->dot11FrameDuplicateCount);
-               rx->sta->rx_stats.num_duplicates++;
+               rx->sta->deflink.rx_stats.num_duplicates++;
                return RX_DROP_UNUSABLE;
        } else if (!(status->flag & RX_FLAG_AMSDU_MORE)) {
                rx->sta->last_seq_ctrl[rx->seqno_idx] = hdr->seq_ctrl;
                                                NL80211_IFTYPE_ADHOC);
                if (ether_addr_equal(bssid, rx->sdata->u.ibss.bssid) &&
                    test_sta_flag(sta, WLAN_STA_AUTHORIZED)) {
-                       sta->rx_stats.last_rx = jiffies;
+                       sta->deflink.rx_stats.last_rx = jiffies;
                        if (ieee80211_is_data(hdr->frame_control) &&
                            !is_multicast_ether_addr(hdr->addr1))
-                               sta->rx_stats.last_rate =
+                               sta->deflink.rx_stats.last_rate =
                                        sta_stats_encode_rate(status);
                }
        } else if (rx->sdata->vif.type == NL80211_IFTYPE_OCB) {
-               sta->rx_stats.last_rx = jiffies;
+               sta->deflink.rx_stats.last_rx = jiffies;
        } else if (!ieee80211_is_s1g_beacon(hdr->frame_control) &&
                   !is_multicast_ether_addr(hdr->addr1)) {
                /*
                 * Mesh beacons will update last_rx when if they are found to
                 * match the current local configuration when processed.
                 */
-               sta->rx_stats.last_rx = jiffies;
+               sta->deflink.rx_stats.last_rx = jiffies;
                if (ieee80211_is_data(hdr->frame_control))
-                       sta->rx_stats.last_rate = sta_stats_encode_rate(status);
+                       sta->deflink.rx_stats.last_rate = sta_stats_encode_rate(status);
        }
 
-       sta->rx_stats.fragments++;
+       sta->deflink.rx_stats.fragments++;
 
-       u64_stats_update_begin(&rx->sta->rx_stats.syncp);
-       sta->rx_stats.bytes += rx->skb->len;
-       u64_stats_update_end(&rx->sta->rx_stats.syncp);
+       u64_stats_update_begin(&rx->sta->deflink.rx_stats.syncp);
+       sta->deflink.rx_stats.bytes += rx->skb->len;
+       u64_stats_update_end(&rx->sta->deflink.rx_stats.syncp);
 
        if (!(status->flag & RX_FLAG_NO_SIGNAL_VAL)) {
-               sta->rx_stats.last_signal = status->signal;
-               ewma_signal_add(&sta->rx_stats_avg.signal, -status->signal);
+               sta->deflink.rx_stats.last_signal = status->signal;
+               ewma_signal_add(&sta->deflink.rx_stats_avg.signal,
+                               -status->signal);
        }
 
        if (status->chains) {
-               sta->rx_stats.chains = status->chains;
+               sta->deflink.rx_stats.chains = status->chains;
                for (i = 0; i < ARRAY_SIZE(status->chain_signal); i++) {
                        int signal = status->chain_signal[i];
 
                        if (!(status->chains & BIT(i)))
                                continue;
 
-                       sta->rx_stats.chain_signal_last[i] = signal;
-                       ewma_signal_add(&sta->rx_stats_avg.chain_signal[i],
+                       sta->deflink.rx_stats.chain_signal_last[i] = signal;
+                       ewma_signal_add(&sta->deflink.rx_stats_avg.chain_signal[i],
                                        -signal);
                }
        }
                 * Update counter and free packet here to avoid
                 * counting this as a dropped packed.
                 */
-               sta->rx_stats.packets++;
+               sta->deflink.rx_stats.packets++;
                dev_kfree_skb(rx->skb);
                return RX_QUEUED;
        }
        }
 
        if (rx->sta)
-               key = rcu_dereference(rx->sta->gtk[idx]);
+               key = rcu_dereference(rx->sta->deflink.gtk[idx]);
        if (!key)
                key = rcu_dereference(sdata->keys[idx]);
        if (!key && rx->sta)
-               key = rcu_dereference(rx->sta->gtk[idx2]);
+               key = rcu_dereference(rx->sta->deflink.gtk[idx2]);
        if (!key)
                key = rcu_dereference(sdata->keys[idx2]);
 
                            test_sta_flag(rx->sta, WLAN_STA_MFP))
                                return RX_DROP_MONITOR;
 
-                       rx->key = rcu_dereference(rx->sta->gtk[mmie_keyidx]);
+                       rx->key = rcu_dereference(rx->sta->deflink.gtk[mmie_keyidx]);
                }
                if (!rx->key)
                        rx->key = rcu_dereference(rx->sdata->keys[mmie_keyidx]);
                } else {
                        if (rx->sta) {
                                for (i = 0; i < NUM_DEFAULT_KEYS; i++) {
-                                       key = rcu_dereference(rx->sta->gtk[i]);
+                                       key = rcu_dereference(rx->sta->deflink.gtk[i]);
                                        if (key)
                                                break;
                                }
 
                /* check per-station GTK first, if multicast packet */
                if (is_multicast_ether_addr(hdr->addr1) && rx->sta)
-                       rx->key = rcu_dereference(rx->sta->gtk[keyidx]);
+                       rx->key = rcu_dereference(rx->sta->deflink.gtk[keyidx]);
 
                /* if not found, try default key */
                if (!rx->key) {
  out:
        ieee80211_led_rx(rx->local);
        if (rx->sta)
-               rx->sta->rx_stats.packets++;
+               rx->sta->deflink.rx_stats.packets++;
        return RX_CONTINUE;
 }
 
                 * for non-QoS-data frames. Here we know it's a data
                 * frame, so count MSDUs.
                 */
-               u64_stats_update_begin(&rx->sta->rx_stats.syncp);
-               rx->sta->rx_stats.msdu[rx->seqno_idx]++;
-               u64_stats_update_end(&rx->sta->rx_stats.syncp);
+               u64_stats_update_begin(&rx->sta->deflink.rx_stats.syncp);
+               rx->sta->deflink.rx_stats.msdu[rx->seqno_idx]++;
+               u64_stats_update_end(&rx->sta->deflink.rx_stats.syncp);
        }
 
        if ((sdata->vif.type == NL80211_IFTYPE_AP ||
        switch (mgmt->u.action.category) {
        case WLAN_CATEGORY_HT:
                /* reject HT action frames from stations not supporting HT */
-               if (!rx->sta->sta.ht_cap.ht_supported)
+               if (!rx->sta->sta.deflink.ht_cap.ht_supported)
                        goto invalid;
 
                if (sdata->vif.type != NL80211_IFTYPE_STATION &&
                        struct sta_opmode_info sta_opmode = {};
 
                        /* If it doesn't support 40 MHz it can't change ... */
-                       if (!(rx->sta->sta.ht_cap.cap &
+                       if (!(rx->sta->sta.deflink.ht_cap.cap &
                                        IEEE80211_HT_CAP_SUP_WIDTH_20_40))
                                goto handled;
 
                                max_bw = ieee80211_sta_cap_rx_bw(rx->sta);
 
                        /* set cur_max_bandwidth and recalc sta bw */
-                       rx->sta->cur_max_bandwidth = max_bw;
+                       rx->sta->deflink.cur_max_bandwidth = max_bw;
                        new_bw = ieee80211_sta_cur_vht_bw(rx->sta);
 
-                       if (rx->sta->sta.bandwidth == new_bw)
+                       if (rx->sta->sta.deflink.bandwidth == new_bw)
                                goto handled;
 
-                       rx->sta->sta.bandwidth = new_bw;
+                       rx->sta->sta.deflink.bandwidth = new_bw;
                        sband = rx->local->hw.wiphy->bands[status->band];
                        sta_opmode.bw =
                                ieee80211_sta_rx_bw_to_chan_width(rx->sta);
 
  handled:
        if (rx->sta)
-               rx->sta->rx_stats.packets++;
+               rx->sta->deflink.rx_stats.packets++;
        dev_kfree_skb(rx->skb);
        return RX_QUEUED;
 
                                 ieee80211_rx_status_to_khz(status), sig,
                                 rx->skb->data, rx->skb->len, 0)) {
                if (rx->sta)
-                       rx->sta->rx_stats.packets++;
+                       rx->sta->deflink.rx_stats.packets++;
                dev_kfree_skb(rx->skb);
                return RX_QUEUED;
        }
 
  handled:
        if (rx->sta)
-               rx->sta->rx_stats.packets++;
+               rx->sta->deflink.rx_stats.packets++;
        dev_kfree_skb(rx->skb);
        return RX_QUEUED;
 }
        case RX_DROP_MONITOR:
                I802_DEBUG_INC(rx->sdata->local->rx_handlers_drop);
                if (rx->sta)
-                       rx->sta->rx_stats.dropped++;
+                       rx->sta->deflink.rx_stats.dropped++;
                fallthrough;
        case RX_CONTINUE: {
                struct ieee80211_rate *rate = NULL;
        case RX_DROP_UNUSABLE:
                I802_DEBUG_INC(rx->sdata->local->rx_handlers_drop);
                if (rx->sta)
-                       rx->sta->rx_stats.dropped++;
+                       rx->sta->deflink.rx_stats.dropped++;
                dev_kfree_skb(rx->skb);
                break;
        case RX_QUEUED:
        void *sa = skb->data + ETH_ALEN;
        void *da = skb->data;
 
-       stats = &sta->rx_stats;
+       stats = &sta->deflink.rx_stats;
        if (fast_rx->uses_rss)
-               stats = this_cpu_ptr(sta->pcpu_rx_stats);
+               stats = this_cpu_ptr(sta->deflink.pcpu_rx_stats);
 
        /* statistics part of ieee80211_rx_h_sta_process() */
        if (!(status->flag & RX_FLAG_NO_SIGNAL_VAL)) {
                stats->last_signal = status->signal;
                if (!fast_rx->uses_rss)
-                       ewma_signal_add(&sta->rx_stats_avg.signal,
+                       ewma_signal_add(&sta->deflink.rx_stats_avg.signal,
                                        -status->signal);
        }
 
 
                        stats->chain_signal_last[i] = signal;
                        if (!fast_rx->uses_rss)
-                               ewma_signal_add(&sta->rx_stats_avg.chain_signal[i],
+                               ewma_signal_add(&sta->deflink.rx_stats_avg.chain_signal[i],
                                                -signal);
                }
        }
                u8 da[ETH_ALEN];
                u8 sa[ETH_ALEN];
        } addrs __aligned(2);
-       struct ieee80211_sta_rx_stats *stats = &sta->rx_stats;
+       struct ieee80211_sta_rx_stats *stats = &sta->deflink.rx_stats;
 
        /* for parallel-rx, we need to have DUP_VALIDATED, otherwise we write
         * to a common data structure; drivers can implement that per queue
  drop:
        dev_kfree_skb(skb);
        if (fast_rx->uses_rss)
-               stats = this_cpu_ptr(sta->pcpu_rx_stats);
+               stats = this_cpu_ptr(sta->deflink.pcpu_rx_stats);
 
        stats->dropped++;
        return true;
 
 void ieee80211_s1g_sta_rate_init(struct sta_info *sta)
 {
        /* avoid indicating legacy bitrates for S1G STAs */
-       sta->tx_stats.last_rate.flags |= IEEE80211_TX_RC_S1G_MCS;
-       sta->rx_stats.last_rate =
+       sta->deflink.tx_stats.last_rate.flags |= IEEE80211_TX_RC_S1G_MCS;
+       sta->deflink.rx_stats.last_rate =
                        STA_STATS_FIELD(TYPE, STA_STATS_RATE_TYPE_S1G);
 }
 
 
 #ifdef CONFIG_MAC80211_MESH
        kfree(sta->mesh);
 #endif
-       free_percpu(sta->pcpu_rx_stats);
+       free_percpu(sta->deflink.pcpu_rx_stats);
        kfree(sta);
 }
 
                return NULL;
 
        if (ieee80211_hw_check(hw, USES_RSS)) {
-               sta->pcpu_rx_stats =
+               sta->deflink.pcpu_rx_stats =
                        alloc_percpu_gfp(struct ieee80211_sta_rx_stats, gfp);
-               if (!sta->pcpu_rx_stats)
+               if (!sta->deflink.pcpu_rx_stats)
                        goto free;
        }
 
        sta->sta.max_rx_aggregation_subframes =
                local->hw.max_rx_aggregation_subframes;
 
+       /* TODO link specific alloc and assignments for MLO Link STA */
+
+       /* For non MLO STA, link info can be accessed either via deflink
+        * or link[0]
+        */
+       sta->link[0] = &sta->deflink;
+       sta->sta.link[0] = &sta->sta.deflink;
+
        /* Extended Key ID needs to install keys for keyid 0 and 1 Rx-only.
         * The Tx path starts to use a key as soon as the key slot ptk_idx
         * references to is not NULL. To not use the initial Rx-only key
 
        sta->local = local;
        sta->sdata = sdata;
-       sta->rx_stats.last_rx = jiffies;
+       sta->deflink.rx_stats.last_rx = jiffies;
 
-       u64_stats_init(&sta->rx_stats.syncp);
+       u64_stats_init(&sta->deflink.rx_stats.syncp);
 
        ieee80211_init_frag_cache(&sta->frags);
 
        sta->reserved_tid = IEEE80211_TID_UNRESERVED;
 
        sta->last_connected = ktime_get_seconds();
-       ewma_signal_init(&sta->rx_stats_avg.signal);
-       ewma_avg_signal_init(&sta->status_stats.avg_ack_signal);
-       for (i = 0; i < ARRAY_SIZE(sta->rx_stats_avg.chain_signal); i++)
-               ewma_signal_init(&sta->rx_stats_avg.chain_signal[i]);
+       ewma_signal_init(&sta->deflink.rx_stats_avg.signal);
+       ewma_avg_signal_init(&sta->deflink.status_stats.avg_ack_signal);
+       for (i = 0; i < ARRAY_SIZE(sta->deflink.rx_stats_avg.chain_signal); i++)
+               ewma_signal_init(&sta->deflink.rx_stats_avg.chain_signal[i]);
 
        if (local->ops->wake_tx_queue) {
                void *txq_data;
 
                        if (!(rate->flags & mandatory))
                                continue;
-                       sta->sta.supp_rates[i] |= BIT(r);
+                       sta->sta.deflink.supp_rates[i] |= BIT(r);
                }
        }
 
        if (sta->sta.txq[0])
                kfree(to_txq_info(sta->sta.txq[0]));
 free:
-       free_percpu(sta->pcpu_rx_stats);
+       free_percpu(sta->deflink.pcpu_rx_stats);
 #ifdef CONFIG_MAC80211_MESH
        kfree(sta->mesh);
 #endif
 
 u8 sta_info_tx_streams(struct sta_info *sta)
 {
-       struct ieee80211_sta_ht_cap *ht_cap = &sta->sta.ht_cap;
+       struct ieee80211_sta_ht_cap *ht_cap = &sta->sta.deflink.ht_cap;
        u8 rx_streams;
 
-       if (!sta->sta.ht_cap.ht_supported)
+       if (!sta->sta.deflink.ht_cap.ht_supported)
                return 1;
 
-       if (sta->sta.vht_cap.vht_supported) {
+       if (sta->sta.deflink.vht_cap.vht_supported) {
                int i;
                u16 tx_mcs_map =
-                       le16_to_cpu(sta->sta.vht_cap.vht_mcs.tx_mcs_map);
+                       le16_to_cpu(sta->sta.deflink.vht_cap.vht_mcs.tx_mcs_map);
 
                for (i = 7; i >= 0; i--)
                        if ((tx_mcs_map & (0x3 << (i * 2))) !=
 static struct ieee80211_sta_rx_stats *
 sta_get_last_rx_stats(struct sta_info *sta)
 {
-       struct ieee80211_sta_rx_stats *stats = &sta->rx_stats;
+       struct ieee80211_sta_rx_stats *stats = &sta->deflink.rx_stats;
        int cpu;
 
-       if (!sta->pcpu_rx_stats)
+       if (!sta->deflink.pcpu_rx_stats)
                return stats;
 
        for_each_possible_cpu(cpu) {
                struct ieee80211_sta_rx_stats *cpustats;
 
-               cpustats = per_cpu_ptr(sta->pcpu_rx_stats, cpu);
+               cpustats = per_cpu_ptr(sta->deflink.pcpu_rx_stats, cpu);
 
                if (time_after(cpustats->last_rx, stats->last_rx))
                        stats = cpustats;
        int cpu;
 
        if (!(tidstats->filled & BIT(NL80211_TID_STATS_RX_MSDU))) {
-               tidstats->rx_msdu += sta_get_tidstats_msdu(&sta->rx_stats, tid);
+               tidstats->rx_msdu += sta_get_tidstats_msdu(&sta->deflink.rx_stats,
+                                                          tid);
 
-               if (sta->pcpu_rx_stats) {
+               if (sta->deflink.pcpu_rx_stats) {
                        for_each_possible_cpu(cpu) {
                                struct ieee80211_sta_rx_stats *cpurxs;
 
-                               cpurxs = per_cpu_ptr(sta->pcpu_rx_stats, cpu);
+                               cpurxs = per_cpu_ptr(sta->deflink.pcpu_rx_stats,
+                                                    cpu);
                                tidstats->rx_msdu +=
                                        sta_get_tidstats_msdu(cpurxs, tid);
                        }
 
        if (!(tidstats->filled & BIT(NL80211_TID_STATS_TX_MSDU))) {
                tidstats->filled |= BIT(NL80211_TID_STATS_TX_MSDU);
-               tidstats->tx_msdu = sta->tx_stats.msdu[tid];
+               tidstats->tx_msdu = sta->deflink.tx_stats.msdu[tid];
        }
 
        if (!(tidstats->filled & BIT(NL80211_TID_STATS_TX_MSDU_RETRIES)) &&
            ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS)) {
                tidstats->filled |= BIT(NL80211_TID_STATS_TX_MSDU_RETRIES);
-               tidstats->tx_msdu_retries = sta->status_stats.msdu_retries[tid];
+               tidstats->tx_msdu_retries = sta->deflink.status_stats.msdu_retries[tid];
        }
 
        if (!(tidstats->filled & BIT(NL80211_TID_STATS_TX_MSDU_FAILED)) &&
            ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS)) {
                tidstats->filled |= BIT(NL80211_TID_STATS_TX_MSDU_FAILED);
-               tidstats->tx_msdu_failed = sta->status_stats.msdu_failed[tid];
+               tidstats->tx_msdu_failed = sta->deflink.status_stats.msdu_failed[tid];
        }
 
        if (local->ops->wake_tx_queue && tid < IEEE80211_NUM_TIDS) {
                               BIT_ULL(NL80211_STA_INFO_TX_BYTES)))) {
                sinfo->tx_bytes = 0;
                for (ac = 0; ac < IEEE80211_NUM_ACS; ac++)
-                       sinfo->tx_bytes += sta->tx_stats.bytes[ac];
+                       sinfo->tx_bytes += sta->deflink.tx_stats.bytes[ac];
                sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BYTES64);
        }
 
        if (!(sinfo->filled & BIT_ULL(NL80211_STA_INFO_TX_PACKETS))) {
                sinfo->tx_packets = 0;
                for (ac = 0; ac < IEEE80211_NUM_ACS; ac++)
-                       sinfo->tx_packets += sta->tx_stats.packets[ac];
+                       sinfo->tx_packets += sta->deflink.tx_stats.packets[ac];
                sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_PACKETS);
        }
 
        if (!(sinfo->filled & (BIT_ULL(NL80211_STA_INFO_RX_BYTES64) |
                               BIT_ULL(NL80211_STA_INFO_RX_BYTES)))) {
-               sinfo->rx_bytes += sta_get_stats_bytes(&sta->rx_stats);
+               sinfo->rx_bytes += sta_get_stats_bytes(&sta->deflink.rx_stats);
 
-               if (sta->pcpu_rx_stats) {
+               if (sta->deflink.pcpu_rx_stats) {
                        for_each_possible_cpu(cpu) {
                                struct ieee80211_sta_rx_stats *cpurxs;
 
-                               cpurxs = per_cpu_ptr(sta->pcpu_rx_stats, cpu);
+                               cpurxs = per_cpu_ptr(sta->deflink.pcpu_rx_stats,
+                                                    cpu);
                                sinfo->rx_bytes += sta_get_stats_bytes(cpurxs);
                        }
                }
        }
 
        if (!(sinfo->filled & BIT_ULL(NL80211_STA_INFO_RX_PACKETS))) {
-               sinfo->rx_packets = sta->rx_stats.packets;
-               if (sta->pcpu_rx_stats) {
+               sinfo->rx_packets = sta->deflink.rx_stats.packets;
+               if (sta->deflink.pcpu_rx_stats) {
                        for_each_possible_cpu(cpu) {
                                struct ieee80211_sta_rx_stats *cpurxs;
 
-                               cpurxs = per_cpu_ptr(sta->pcpu_rx_stats, cpu);
+                               cpurxs = per_cpu_ptr(sta->deflink.pcpu_rx_stats,
+                                                    cpu);
                                sinfo->rx_packets += cpurxs->packets;
                        }
                }
        }
 
        if (!(sinfo->filled & BIT_ULL(NL80211_STA_INFO_TX_RETRIES))) {
-               sinfo->tx_retries = sta->status_stats.retry_count;
+               sinfo->tx_retries = sta->deflink.status_stats.retry_count;
                sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_RETRIES);
        }
 
        if (!(sinfo->filled & BIT_ULL(NL80211_STA_INFO_TX_FAILED))) {
-               sinfo->tx_failed = sta->status_stats.retry_failed;
+               sinfo->tx_failed = sta->deflink.status_stats.retry_failed;
                sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_FAILED);
        }
 
                sinfo->filled |= BIT_ULL(NL80211_STA_INFO_AIRTIME_WEIGHT);
        }
 
-       sinfo->rx_dropped_misc = sta->rx_stats.dropped;
-       if (sta->pcpu_rx_stats) {
+       sinfo->rx_dropped_misc = sta->deflink.rx_stats.dropped;
+       if (sta->deflink.pcpu_rx_stats) {
                for_each_possible_cpu(cpu) {
                        struct ieee80211_sta_rx_stats *cpurxs;
 
-                       cpurxs = per_cpu_ptr(sta->pcpu_rx_stats, cpu);
+                       cpurxs = per_cpu_ptr(sta->deflink.pcpu_rx_stats, cpu);
                        sinfo->rx_dropped_misc += cpurxs->dropped;
                }
        }
                        sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL);
                }
 
-               if (!sta->pcpu_rx_stats &&
+               if (!sta->deflink.pcpu_rx_stats &&
                    !(sinfo->filled & BIT_ULL(NL80211_STA_INFO_SIGNAL_AVG))) {
                        sinfo->signal_avg =
-                               -ewma_signal_read(&sta->rx_stats_avg.signal);
+                               -ewma_signal_read(&sta->deflink.rx_stats_avg.signal);
                        sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL_AVG);
                }
        }
            !(sinfo->filled & (BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL) |
                               BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL_AVG)))) {
                sinfo->filled |= BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL);
-               if (!sta->pcpu_rx_stats)
+               if (!sta->deflink.pcpu_rx_stats)
                        sinfo->filled |= BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL_AVG);
 
                sinfo->chains = last_rxstats->chains;
                        sinfo->chain_signal[i] =
                                last_rxstats->chain_signal_last[i];
                        sinfo->chain_signal_avg[i] =
-                               -ewma_signal_read(&sta->rx_stats_avg.chain_signal[i]);
+                               -ewma_signal_read(&sta->deflink.rx_stats_avg.chain_signal[i]);
                }
        }
 
        if (!(sinfo->filled & BIT_ULL(NL80211_STA_INFO_TX_BITRATE))) {
-               sta_set_rate_info_tx(sta, &sta->tx_stats.last_rate,
+               sta_set_rate_info_tx(sta, &sta->deflink.tx_stats.last_rate,
                                     &sinfo->txrate);
                sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE);
        }
        }
 
        if (!(sinfo->filled & BIT_ULL(NL80211_STA_INFO_ACK_SIGNAL)) &&
-           sta->status_stats.ack_signal_filled) {
-               sinfo->ack_signal = sta->status_stats.last_ack_signal;
+           sta->deflink.status_stats.ack_signal_filled) {
+               sinfo->ack_signal = sta->deflink.status_stats.last_ack_signal;
                sinfo->filled |= BIT_ULL(NL80211_STA_INFO_ACK_SIGNAL);
        }
 
        if (!(sinfo->filled & BIT_ULL(NL80211_STA_INFO_ACK_SIGNAL_AVG)) &&
-           sta->status_stats.ack_signal_filled) {
+           sta->deflink.status_stats.ack_signal_filled) {
                sinfo->avg_ack_signal =
                        -(s8)ewma_avg_signal_read(
-                               &sta->status_stats.avg_ack_signal);
+                               &sta->deflink.status_stats.avg_ack_signal);
                sinfo->filled |=
                        BIT_ULL(NL80211_STA_INFO_ACK_SIGNAL_AVG);
        }
 {
        struct ieee80211_sta_rx_stats *stats = sta_get_last_rx_stats(sta);
 
-       if (!sta->status_stats.last_ack ||
-           time_after(stats->last_rx, sta->status_stats.last_ack))
+       if (!sta->deflink.status_stats.last_ack ||
+           time_after(stats->last_rx, sta->deflink.status_stats.last_ack))
                return stats->last_rx;
-       return sta->status_stats.last_ack;
+       return sta->deflink.status_stats.last_ack;
 }
 
 static void sta_update_codel_params(struct sta_info *sta, u32 thr)
 
  */
 #define STA_SLOW_THRESHOLD 6000 /* 6 Mbps */
 
+/**
+ * struct link_sta_info - Link STA information
+ * All link specific sta info are stored here for reference. This can be
+ * a single entry for non-MLD STA or multiple entries for MLD STA
+ * @addr: Link MAC address - Can be same as MLD STA mac address and is always
+ *     same for non-MLD STA. This is used as key for searching link STA
+ * @link_id: Link ID uniquely identifying the link STA. This is 0 for non-MLD
+ *     and set to the corresponding vif LinkId for MLD STA
+ * @sta: Points to the STA info
+ * @gtk: group keys negotiated with this station, if any
+ * @tx_stats: TX statistics
+ * @tx_stats.packets: # of packets transmitted
+ * @tx_stats.bytes: # of bytes in all packets transmitted
+ * @tx_stats.last_rate: last TX rate
+ * @tx_stats.msdu: # of transmitted MSDUs per TID
+ * @rx_stats: RX statistics
+ * @rx_stats_avg: averaged RX statistics
+ * @rx_stats_avg.signal: averaged signal
+ * @rx_stats_avg.chain_signal: averaged per-chain signal
+ * @pcpu_rx_stats: per-CPU RX statistics, assigned only if the driver needs
+ *     this (by advertising the USES_RSS hw flag)
+ * @status_stats: TX status statistics
+ * @status_stats.filtered: # of filtered frames
+ * @status_stats.retry_failed: # of frames that failed after retry
+ * @status_stats.retry_count: # of retries attempted
+ * @status_stats.lost_packets: # of lost packets
+ * @status_stats.last_pkt_time: timestamp of last ACKed packet
+ * @status_stats.msdu_retries: # of MSDU retries
+ * @status_stats.msdu_failed: # of failed MSDUs
+ * @status_stats.last_ack: last ack timestamp (jiffies)
+ * @status_stats.last_ack_signal: last ACK signal
+ * @status_stats.ack_signal_filled: last ACK signal validity
+ * @status_stats.avg_ack_signal: average ACK signal
+ * TODO Move other link params from sta_info as required for MLD operation
+ */
+struct link_sta_info {
+       u8 addr[ETH_ALEN];
+       u8 link_id;
+
+       /* TODO rhash head/node for finding link_sta based on addr */
+
+       struct sta_info *sta;
+       struct ieee80211_key __rcu *gtk[NUM_DEFAULT_KEYS +
+                                       NUM_DEFAULT_MGMT_KEYS +
+                                       NUM_DEFAULT_BEACON_KEYS];
+       struct ieee80211_sta_rx_stats __percpu *pcpu_rx_stats;
+
+       /* Updated from RX path only, no locking requirements */
+       struct ieee80211_sta_rx_stats rx_stats;
+       struct {
+               struct ewma_signal signal;
+               struct ewma_signal chain_signal[IEEE80211_MAX_CHAINS];
+       } rx_stats_avg;
+
+       /* Updated from TX status path only, no locking requirements */
+       struct {
+               unsigned long filtered;
+               unsigned long retry_failed, retry_count;
+               unsigned int lost_packets;
+               unsigned long last_pkt_time;
+               u64 msdu_retries[IEEE80211_NUM_TIDS + 1];
+               u64 msdu_failed[IEEE80211_NUM_TIDS + 1];
+               unsigned long last_ack;
+               s8 last_ack_signal;
+               bool ack_signal_filled;
+               struct ewma_avg_signal avg_ack_signal;
+       } status_stats;
+
+       /* Updated from TX path only, no locking requirements */
+       struct {
+               u64 packets[IEEE80211_NUM_ACS];
+               u64 bytes[IEEE80211_NUM_ACS];
+               struct ieee80211_tx_rate last_rate;
+               struct rate_info last_rate_info;
+               u64 msdu[IEEE80211_NUM_TIDS + 1];
+       } tx_stats;
+
+       enum ieee80211_sta_rx_bandwidth cur_max_bandwidth;
+};
+
 /**
  * struct sta_info - STA information
  *
  * @sdata: virtual interface this station belongs to
  * @ptk: peer keys negotiated with this station, if any
  * @ptk_idx: last installed peer key index
- * @gtk: group keys negotiated with this station, if any
  * @rate_ctrl: rate control algorithm reference
  * @rate_ctrl_lock: spinlock used to protect rate control data
  *     (data inside the algorithm, so serializes calls there)
  * @fast_rx: RX fastpath information
  * @tdls_chandef: a TDLS peer can have a wider chandef that is compatible to
  *     the BSS one.
- * @tx_stats: TX statistics
- * @tx_stats.packets: # of packets transmitted
- * @tx_stats.bytes: # of bytes in all packets transmitted
- * @tx_stats.last_rate: last TX rate
- * @tx_stats.msdu: # of transmitted MSDUs per TID
- * @rx_stats: RX statistics
- * @rx_stats_avg: averaged RX statistics
- * @rx_stats_avg.signal: averaged signal
- * @rx_stats_avg.chain_signal: averaged per-chain signal
- * @pcpu_rx_stats: per-CPU RX statistics, assigned only if the driver needs
- *     this (by advertising the USES_RSS hw flag)
- * @status_stats: TX status statistics
- * @status_stats.filtered: # of filtered frames
- * @status_stats.retry_failed: # of frames that failed after retry
- * @status_stats.retry_count: # of retries attempted
- * @status_stats.lost_packets: # of lost packets
- * @status_stats.last_pkt_time: timestamp of last ACKed packet
- * @status_stats.msdu_retries: # of MSDU retries
- * @status_stats.msdu_failed: # of failed MSDUs
- * @status_stats.last_ack: last ack timestamp (jiffies)
- * @status_stats.last_ack_signal: last ACK signal
- * @status_stats.ack_signal_filled: last ACK signal validity
- * @status_stats.avg_ack_signal: average ACK signal
  * @frags: fragment cache
+ * @multi_link_sta: Identifies if this sta is a MLD STA or regular STA
+ * @deflink: This is the default link STA information, for non MLO STA all link
+ *     specific STA information is accessed through @deflink or through
+ *     link[0] which points to address of @deflink. For MLO Link STA
+ *     the first added link STA will point to deflink.
+ * @link: reference to Link Sta entries. For Non MLO STA, except 1st link,
+ *     i.e link[0] all links would be assigned to NULL by default and
+ *     would access link information via @deflink or link[0]. For MLO
+ *     STA, first link STA being added will point its link pointer to
+ *     @deflink address and remaining would be allocated and the address
+ *     would be assigned to link[link_id] where link_id is the id assigned
+ *     by the AP.
  */
 struct sta_info {
        /* General information, mostly static */
        u8 addr[ETH_ALEN];
        struct ieee80211_local *local;
        struct ieee80211_sub_if_data *sdata;
-       struct ieee80211_key __rcu *gtk[NUM_DEFAULT_KEYS +
-                                       NUM_DEFAULT_MGMT_KEYS +
-                                       NUM_DEFAULT_BEACON_KEYS];
        struct ieee80211_key __rcu *ptk[NUM_DEFAULT_KEYS];
        u8 ptk_idx;
        struct rate_control_ref *rate_ctrl;
 
        struct ieee80211_fast_tx __rcu *fast_tx;
        struct ieee80211_fast_rx __rcu *fast_rx;
-       struct ieee80211_sta_rx_stats __percpu *pcpu_rx_stats;
 
 #ifdef CONFIG_MAC80211_MESH
        struct mesh_sta *mesh;
        u64 assoc_at;
        long last_connected;
 
-       /* Updated from RX path only, no locking requirements */
-       struct ieee80211_sta_rx_stats rx_stats;
-       struct {
-               struct ewma_signal signal;
-               struct ewma_signal chain_signal[IEEE80211_MAX_CHAINS];
-       } rx_stats_avg;
-
        /* Plus 1 for non-QoS frames */
        __le16 last_seq_ctrl[IEEE80211_NUM_TIDS + 1];
 
-       /* Updated from TX status path only, no locking requirements */
-       struct {
-               unsigned long filtered;
-               unsigned long retry_failed, retry_count;
-               unsigned int lost_packets;
-               unsigned long last_pkt_time;
-               u64 msdu_retries[IEEE80211_NUM_TIDS + 1];
-               u64 msdu_failed[IEEE80211_NUM_TIDS + 1];
-               unsigned long last_ack;
-               s8 last_ack_signal;
-               bool ack_signal_filled;
-               struct ewma_avg_signal avg_ack_signal;
-       } status_stats;
-
-       /* Updated from TX path only, no locking requirements */
-       struct {
-               u64 packets[IEEE80211_NUM_ACS];
-               u64 bytes[IEEE80211_NUM_ACS];
-               struct ieee80211_tx_rate last_rate;
-               struct rate_info last_rate_info;
-               u64 msdu[IEEE80211_NUM_TIDS + 1];
-       } tx_stats;
        u16 tid_seq[IEEE80211_QOS_CTL_TID_MASK + 1];
 
        struct airtime_info airtime[IEEE80211_NUM_ACS];
        struct dentry *debugfs_dir;
 #endif
 
-       enum ieee80211_sta_rx_bandwidth cur_max_bandwidth;
-
        enum ieee80211_smps_mode known_smps_mode;
        const struct ieee80211_cipher_scheme *cipher_scheme;
 
 
        struct ieee80211_fragment_cache frags;
 
+       bool multi_link_sta;
+       struct link_sta_info deflink;
+       struct link_sta_info *link[MAX_STA_LINKS];
+
        /* keep last! */
        struct ieee80211_sta sta;
 };
 
        info->flags |= IEEE80211_TX_INTFL_RETRANSMISSION;
        info->flags &= ~IEEE80211_TX_TEMPORARY_FLAGS;
 
-       sta->status_stats.filtered++;
+       sta->deflink.status_stats.filtered++;
 
        /*
         * Clear more-data bit on filtered frames, it might be set
            !(info->flags & IEEE80211_TX_STAT_AMPDU))
                return;
 
-       sta->status_stats.lost_packets++;
+       sta->deflink.status_stats.lost_packets++;
        if (sta->sta.tdls) {
                pkt_time = STA_LOST_TDLS_PKT_TIME;
                pkt_thr = STA_LOST_PKT_THRESHOLD;
         * mechanism.
         * For non-TDLS, use STA_LOST_PKT_THRESHOLD and STA_LOST_PKT_TIME
         */
-       if (sta->status_stats.lost_packets < pkt_thr ||
-           !time_after(jiffies, sta->status_stats.last_pkt_time + pkt_time))
+       if (sta->deflink.status_stats.lost_packets < pkt_thr ||
+           !time_after(jiffies, sta->deflink.status_stats.last_pkt_time + pkt_time))
                return;
 
        cfg80211_cqm_pktloss_notify(sta->sdata->dev, sta->sta.addr,
-                                   sta->status_stats.lost_packets, GFP_ATOMIC);
-       sta->status_stats.lost_packets = 0;
+                                   sta->deflink.status_stats.lost_packets,
+                                   GFP_ATOMIC);
+       sta->deflink.status_stats.lost_packets = 0;
 }
 
 static int ieee80211_tx_get_rates(struct ieee80211_hw *hw,
                if (ieee80211_hw_check(&local->hw, HAS_RATE_CONTROL) &&
                    (ieee80211_is_data(hdr->frame_control)) &&
                    (rates_idx != -1))
-                       sta->tx_stats.last_rate =
+                       sta->deflink.tx_stats.last_rate =
                                info->status.rates[rates_idx];
 
                if ((info->flags & IEEE80211_TX_STAT_AMPDU_NO_BACK) &&
                        return;
                } else if (ieee80211_is_data_present(fc)) {
                        if (!acked && !noack_success)
-                               sta->status_stats.msdu_failed[tid]++;
+                               sta->deflink.status_stats.msdu_failed[tid]++;
 
-                       sta->status_stats.msdu_retries[tid] +=
+                       sta->deflink.status_stats.msdu_retries[tid] +=
                                retry_count;
                }
 
                sta = container_of(pubsta, struct sta_info, sta);
 
                if (status->rate)
-                       sta->tx_stats.last_rate_info = *status->rate;
+                       sta->deflink.tx_stats.last_rate_info = *status->rate;
        }
 
        if (skb && (tx_time_est =
                struct ieee80211_sub_if_data *sdata = sta->sdata;
 
                if (!acked && !noack_success)
-                       sta->status_stats.retry_failed++;
-               sta->status_stats.retry_count += retry_count;
+                       sta->deflink.status_stats.retry_failed++;
+               sta->deflink.status_stats.retry_count += retry_count;
 
                if (ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS)) {
                        if (sdata->vif.type == NL80211_IFTYPE_STATION &&
                                                        acked, info->status.tx_time);
 
                        if (acked) {
-                               sta->status_stats.last_ack = jiffies;
+                               sta->deflink.status_stats.last_ack = jiffies;
 
-                               if (sta->status_stats.lost_packets)
-                                       sta->status_stats.lost_packets = 0;
+                               if (sta->deflink.status_stats.lost_packets)
+                                       sta->deflink.status_stats.lost_packets = 0;
 
                                /* Track when last packet was ACKed */
-                               sta->status_stats.last_pkt_time = jiffies;
+                               sta->deflink.status_stats.last_pkt_time = jiffies;
 
                                /* Reset connection monitor */
                                if (sdata->vif.type == NL80211_IFTYPE_STATION &&
                                        sdata->u.mgd.probe_send_count = 0;
 
                                if (ack_signal_valid) {
-                                       sta->status_stats.last_ack_signal =
+                                       sta->deflink.status_stats.last_ack_signal =
                                                         (s8)info->status.ack_signal;
-                                       sta->status_stats.ack_signal_filled = true;
-                                       ewma_avg_signal_add(&sta->status_stats.avg_ack_signal,
+                                       sta->deflink.status_stats.ack_signal_filled = true;
+                                       ewma_avg_signal_add(&sta->deflink.status_stats.avg_ack_signal,
                                                            -info->status.ack_signal);
                                }
                        } else if (test_sta_flag(sta, WLAN_STA_PS_STA)) {
        rate_control_tx_status(local, sband, &status);
 
        if (ieee80211_hw_check(&local->hw, HAS_RATE_CONTROL))
-               sta->tx_stats.last_rate = info->status.rates[0];
+               sta->deflink.tx_stats.last_rate = info->status.rates[0];
 }
 EXPORT_SYMBOL(ieee80211_tx_rate_update);
 
 
                pos = skb_put(skb, sizeof(struct ieee80211_ht_cap) + 2);
                ieee80211_ie_build_ht_cap(pos, &ht_cap, ht_cap.cap);
        } else if (action_code == WLAN_TDLS_SETUP_RESPONSE &&
-                  ht_cap.ht_supported && sta->sta.ht_cap.ht_supported) {
+                  ht_cap.ht_supported && sta->sta.deflink.ht_cap.ht_supported) {
                /* the peer caps are already intersected with our own */
-               memcpy(&ht_cap, &sta->sta.ht_cap, sizeof(ht_cap));
+               memcpy(&ht_cap, &sta->sta.deflink.ht_cap, sizeof(ht_cap));
 
                pos = skb_put(skb, sizeof(struct ieee80211_ht_cap) + 2);
                ieee80211_ie_build_ht_cap(pos, &ht_cap, ht_cap.cap);
                pos = skb_put(skb, sizeof(struct ieee80211_vht_cap) + 2);
                ieee80211_ie_build_vht_cap(pos, &vht_cap, vht_cap.cap);
        } else if (action_code == WLAN_TDLS_SETUP_RESPONSE &&
-                  vht_cap.vht_supported && sta->sta.vht_cap.vht_supported) {
+                  vht_cap.vht_supported && sta->sta.deflink.vht_cap.vht_supported) {
                /* the peer caps are already intersected with our own */
-               memcpy(&vht_cap, &sta->sta.vht_cap, sizeof(vht_cap));
+               memcpy(&vht_cap, &sta->sta.deflink.vht_cap, sizeof(vht_cap));
 
                /* the AID is present only when VHT is implemented */
                ieee80211_tdls_add_aid(sdata, skb);
         * if HT support is only added in TDLS, we need an HT-operation IE.
         * add the IE as required by IEEE802.11-2012 9.23.3.2.
         */
-       if (!ap_sta->sta.ht_cap.ht_supported && sta->sta.ht_cap.ht_supported) {
+       if (!ap_sta->sta.deflink.ht_cap.ht_supported && sta->sta.deflink.ht_cap.ht_supported) {
                u16 prot = IEEE80211_HT_OP_MODE_PROTECTION_NONHT_MIXED |
                           IEEE80211_HT_OP_MODE_NON_GF_STA_PRSNT |
                           IEEE80211_HT_OP_MODE_NON_HT_STA_PRSNT;
 
                pos = skb_put(skb, 2 + sizeof(struct ieee80211_ht_operation));
-               ieee80211_ie_build_ht_oper(pos, &sta->sta.ht_cap,
+               ieee80211_ie_build_ht_oper(pos, &sta->sta.deflink.ht_cap,
                                           &sdata->vif.bss_conf.chandef, prot,
                                           true);
        }
 
        /* only include VHT-operation if not on the 2.4GHz band */
        if (sband->band != NL80211_BAND_2GHZ &&
-           sta->sta.vht_cap.vht_supported) {
+           sta->sta.deflink.vht_cap.vht_supported) {
                /*
                 * if both peers support WIDER_BW, we can expand the chandef to
                 * a wider compatible one, up to 80MHz
                        ieee80211_tdls_chandef_vht_upgrade(sdata, sta);
 
                pos = skb_put(skb, 2 + sizeof(struct ieee80211_vht_operation));
-               ieee80211_ie_build_vht_oper(pos, &sta->sta.vht_cap,
+               ieee80211_ie_build_vht_oper(pos, &sta->sta.deflink.vht_cap,
                                            &sta->tdls_chandef);
        }
 
 
                        bw = ieee80211_chan_width_to_rx_bw(conf->def.width);
                        bw = min(bw, ieee80211_sta_cap_rx_bw(sta));
-                       if (bw != sta->sta.bandwidth) {
-                               sta->sta.bandwidth = bw;
+                       if (bw != sta->sta.deflink.bandwidth) {
+                               sta->sta.deflink.bandwidth = bw;
                                rate_control_rate_update(local, sband, sta,
                                                         IEEE80211_RC_BW_CHANGED);
                                /*
                if (!sta->sta.tdls || sta->sdata != sdata || !sta->uploaded ||
                    !test_sta_flag(sta, WLAN_STA_AUTHORIZED) ||
                    !test_sta_flag(sta, WLAN_STA_TDLS_PEER_AUTH) ||
-                   !sta->sta.ht_cap.ht_supported)
+                   !sta->sta.deflink.ht_cap.ht_supported)
                        continue;
                result = true;
                break;
        if (!(ifmgd->flags & IEEE80211_STA_DISABLE_HT))
                return;
 
-       tdls_ht = (sta && sta->sta.ht_cap.ht_supported) ||
+       tdls_ht = (sta && sta->sta.deflink.ht_cap.ht_supported) ||
                  iee80211_tdls_have_ht_peers(sdata);
 
        opmode = sdata->vif.bss_conf.ht_operation_mode;
        }
 
        /* peer should have known better */
-       if (!sta->sta.ht_cap.ht_supported && elems->sec_chan_offs &&
+       if (!sta->sta.deflink.ht_cap.ht_supported && elems->sec_chan_offs &&
            elems->sec_chan_offs->sec_chan_offs) {
                tdls_dbg(sdata, "TDLS chan switch - wide chan unsupported\n");
                ret = -ENOTSUPP;
 
                LOCAL_ASSIGN;
                VIF_ASSIGN;
                STA_ASSIGN;
-               __entry->txpwr = sta->txpwr.power;
-               __entry->type = sta->txpwr.type;
+               __entry->txpwr = sta->deflink.txpwr.power;
+               __entry->type = sta->deflink.txpwr.type;
        ),
 
        TP_printk(
 
        if (txrc.reported_rate.idx < 0) {
                txrc.reported_rate = tx->rate;
                if (tx->sta && ieee80211_is_tx_data(tx->skb))
-                       tx->sta->tx_stats.last_rate = txrc.reported_rate;
+                       tx->sta->deflink.tx_stats.last_rate = txrc.reported_rate;
        } else if (tx->sta)
-               tx->sta->tx_stats.last_rate = txrc.reported_rate;
+               tx->sta->deflink.tx_stats.last_rate = txrc.reported_rate;
 
        if (ratetbl)
                return TX_CONTINUE;
                hdr->seq_ctrl = cpu_to_le16(tx->sdata->sequence_number);
                tx->sdata->sequence_number += 0x10;
                if (tx->sta)
-                       tx->sta->tx_stats.msdu[IEEE80211_NUM_TIDS]++;
+                       tx->sta->deflink.tx_stats.msdu[IEEE80211_NUM_TIDS]++;
                return TX_CONTINUE;
        }
 
 
        /* include per-STA, per-TID sequence counter */
        tid = ieee80211_get_tid(hdr);
-       tx->sta->tx_stats.msdu[tid]++;
+       tx->sta->deflink.tx_stats.msdu[tid]++;
 
        hdr->seq_ctrl = ieee80211_tx_next_seq(tx->sta, tid);
 
 
        skb_queue_walk(&tx->skbs, skb) {
                ac = skb_get_queue_mapping(skb);
-               tx->sta->tx_stats.bytes[ac] += skb->len;
+               tx->sta->deflink.tx_stats.bytes[ac] += skb->len;
        }
        if (ac >= 0)
-               tx->sta->tx_stats.packets[ac]++;
+               tx->sta->deflink.tx_stats.packets[ac]++;
 
        return TX_CONTINUE;
 }
        if (!ref || !(ref->ops->capa & RATE_CTRL_CAPA_AMPDU_TRIGGER))
                return;
 
-       if (!sta || !sta->sta.ht_cap.ht_supported ||
+       if (!sta || !sta->sta.deflink.ht_cap.ht_supported ||
            !sta->sta.wme || skb_get_queue_mapping(skb) == IEEE80211_AC_VO ||
            skb->protocol == sdata->control_port_protocol)
                return;
        }
 
        if (skb_shinfo(skb)->gso_size)
-               sta->tx_stats.msdu[tid] +=
+               sta->deflink.tx_stats.msdu[tid] +=
                        DIV_ROUND_UP(skb->len, skb_shinfo(skb)->gso_size);
        else
-               sta->tx_stats.msdu[tid]++;
+               sta->deflink.tx_stats.msdu[tid]++;
 
        info->hw_queue = sdata->vif.hw_queue[skb_get_queue_mapping(skb)];
 
        /* statistics normally done by ieee80211_tx_h_stats (but that
         * has to consider fragmentation, so is more complex)
         */
-       sta->tx_stats.bytes[skb_get_queue_mapping(skb)] += skb->len;
-       sta->tx_stats.packets[skb_get_queue_mapping(skb)]++;
+       sta->deflink.tx_stats.bytes[skb_get_queue_mapping(skb)] += skb->len;
+       sta->deflink.tx_stats.packets[skb_get_queue_mapping(skb)]++;
 
        if (pn_offs) {
                u64 pn;
 
        dev_sw_netstats_tx_add(dev, 1, skb->len);
 
-       sta->tx_stats.bytes[skb_get_queue_mapping(skb)] += skb->len;
-       sta->tx_stats.packets[skb_get_queue_mapping(skb)]++;
+       sta->deflink.tx_stats.bytes[skb_get_queue_mapping(skb)] += skb->len;
+       sta->deflink.tx_stats.packets[skb_get_queue_mapping(skb)]++;
 
        if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN)
                sdata = container_of(sdata->bss,
 
                                    const struct ieee80211_vht_cap *vht_cap_ie,
                                    struct sta_info *sta)
 {
-       struct ieee80211_sta_vht_cap *vht_cap = &sta->sta.vht_cap;
+       struct ieee80211_sta_vht_cap *vht_cap = &sta->sta.deflink.vht_cap;
        struct ieee80211_sta_vht_cap own_cap;
        u32 cap_info, i;
        bool have_80mhz;
 
        memset(vht_cap, 0, sizeof(*vht_cap));
 
-       if (!sta->sta.ht_cap.ht_supported)
+       if (!sta->sta.deflink.ht_cap.ht_supported)
                return;
 
        if (!vht_cap_ie || !sband->vht_cap.vht_supported)
        switch (vht_cap->cap & IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK) {
        case IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ:
        case IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ:
-               sta->cur_max_bandwidth = IEEE80211_STA_RX_BW_160;
+               sta->deflink.cur_max_bandwidth = IEEE80211_STA_RX_BW_160;
                break;
        default:
-               sta->cur_max_bandwidth = IEEE80211_STA_RX_BW_80;
+               sta->deflink.cur_max_bandwidth = IEEE80211_STA_RX_BW_80;
 
                if (!(vht_cap->vht_mcs.tx_highest &
                                cpu_to_le16(IEEE80211_VHT_EXT_NSS_BW_CAPABLE)))
                 * above) between 160 and 80+80 yet.
                 */
                if (cap_info & IEEE80211_VHT_CAP_EXT_NSS_BW_MASK)
-                       sta->cur_max_bandwidth = IEEE80211_STA_RX_BW_160;
+                       sta->deflink.cur_max_bandwidth = IEEE80211_STA_RX_BW_160;
        }
 
-       sta->sta.bandwidth = ieee80211_sta_cur_vht_bw(sta);
+       sta->sta.deflink.bandwidth = ieee80211_sta_cur_vht_bw(sta);
 
        switch (vht_cap->cap & IEEE80211_VHT_CAP_MAX_MPDU_MASK) {
        case IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_11454:
 /* FIXME: move this to some better location - parses HE/EHT now */
 enum ieee80211_sta_rx_bandwidth ieee80211_sta_cap_rx_bw(struct sta_info *sta)
 {
-       struct ieee80211_sta_vht_cap *vht_cap = &sta->sta.vht_cap;
-       struct ieee80211_sta_he_cap *he_cap = &sta->sta.he_cap;
-       struct ieee80211_sta_eht_cap *eht_cap = &sta->sta.eht_cap;
+       struct ieee80211_sta_vht_cap *vht_cap = &sta->sta.deflink.vht_cap;
+       struct ieee80211_sta_he_cap *he_cap = &sta->sta.deflink.he_cap;
+       struct ieee80211_sta_eht_cap *eht_cap = &sta->sta.deflink.eht_cap;
        u32 cap_width;
 
        if (he_cap->has_he) {
        }
 
        if (!vht_cap->vht_supported)
-               return sta->sta.ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40 ?
+               return sta->sta.deflink.ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40 ?
                                IEEE80211_STA_RX_BW_40 :
                                IEEE80211_STA_RX_BW_20;
 
 
 enum nl80211_chan_width ieee80211_sta_cap_chan_bw(struct sta_info *sta)
 {
-       struct ieee80211_sta_vht_cap *vht_cap = &sta->sta.vht_cap;
+       struct ieee80211_sta_vht_cap *vht_cap = &sta->sta.deflink.vht_cap;
        u32 cap_width;
 
        if (!vht_cap->vht_supported) {
-               if (!sta->sta.ht_cap.ht_supported)
+               if (!sta->sta.deflink.ht_cap.ht_supported)
                        return NL80211_CHAN_WIDTH_20_NOHT;
 
-               return sta->sta.ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40 ?
+               return sta->sta.deflink.ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40 ?
                                NL80211_CHAN_WIDTH_40 : NL80211_CHAN_WIDTH_20;
        }
 
 enum nl80211_chan_width
 ieee80211_sta_rx_bw_to_chan_width(struct sta_info *sta)
 {
-       enum ieee80211_sta_rx_bandwidth cur_bw = sta->sta.bandwidth;
-       struct ieee80211_sta_vht_cap *vht_cap = &sta->sta.vht_cap;
+       enum ieee80211_sta_rx_bandwidth cur_bw = sta->sta.deflink.bandwidth;
+       struct ieee80211_sta_vht_cap *vht_cap = &sta->sta.deflink.vht_cap;
        u32 cap_width;
 
        switch (cur_bw) {
        case IEEE80211_STA_RX_BW_20:
-               if (!sta->sta.ht_cap.ht_supported)
+               if (!sta->sta.deflink.ht_cap.ht_supported)
                        return NL80211_CHAN_WIDTH_20_NOHT;
                else
                        return NL80211_CHAN_WIDTH_20;
        enum nl80211_chan_width bss_width = sdata->vif.bss_conf.chandef.width;
 
        bw = ieee80211_sta_cap_rx_bw(sta);
-       bw = min(bw, sta->cur_max_bandwidth);
+       bw = min(bw, sta->deflink.cur_max_bandwidth);
 
        /* Don't consider AP's bandwidth for TDLS peers, section 11.23.1 of
         * IEEE80211-2016 specification makes higher bandwidth operation
        bool support_160;
 
        /* if we received a notification already don't overwrite it */
-       if (sta->sta.rx_nss)
+       if (sta->sta.deflink.rx_nss)
                return;
 
-       if (sta->sta.eht_cap.has_eht) {
+       if (sta->sta.deflink.eht_cap.has_eht) {
                int i;
-               const u8 *rx_nss_mcs = (void *)&sta->sta.eht_cap.eht_mcs_nss_supp;
+               const u8 *rx_nss_mcs = (void *)&sta->sta.deflink.eht_cap.eht_mcs_nss_supp;
 
                /* get the max nss for EHT over all possible bandwidths and mcs */
                for (i = 0; i < sizeof(struct ieee80211_eht_mcs_nss_supp); i++)
                                                       IEEE80211_EHT_MCS_NSS_RX));
        }
 
-       if (sta->sta.he_cap.has_he) {
+       if (sta->sta.deflink.he_cap.has_he) {
                int i;
                u8 rx_mcs_80 = 0, rx_mcs_160 = 0;
-               const struct ieee80211_sta_he_cap *he_cap = &sta->sta.he_cap;
+               const struct ieee80211_sta_he_cap *he_cap = &sta->sta.deflink.he_cap;
                u16 mcs_160_map =
                        le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_160);
                u16 mcs_80_map = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_80);
                        he_rx_nss = rx_mcs_80;
        }
 
-       if (sta->sta.ht_cap.ht_supported) {
-               if (sta->sta.ht_cap.mcs.rx_mask[0])
+       if (sta->sta.deflink.ht_cap.ht_supported) {
+               if (sta->sta.deflink.ht_cap.mcs.rx_mask[0])
                        ht_rx_nss++;
-               if (sta->sta.ht_cap.mcs.rx_mask[1])
+               if (sta->sta.deflink.ht_cap.mcs.rx_mask[1])
                        ht_rx_nss++;
-               if (sta->sta.ht_cap.mcs.rx_mask[2])
+               if (sta->sta.deflink.ht_cap.mcs.rx_mask[2])
                        ht_rx_nss++;
-               if (sta->sta.ht_cap.mcs.rx_mask[3])
+               if (sta->sta.deflink.ht_cap.mcs.rx_mask[3])
                        ht_rx_nss++;
                /* FIXME: consider rx_highest? */
        }
 
-       if (sta->sta.vht_cap.vht_supported) {
+       if (sta->sta.deflink.vht_cap.vht_supported) {
                int i;
                u16 rx_mcs_map;
 
-               rx_mcs_map = le16_to_cpu(sta->sta.vht_cap.vht_mcs.rx_mcs_map);
+               rx_mcs_map = le16_to_cpu(sta->sta.deflink.vht_cap.vht_mcs.rx_mcs_map);
 
                for (i = 7; i >= 0; i--) {
                        u8 mcs = (rx_mcs_map >> (2 * i)) & 3;
        rx_nss = max(vht_rx_nss, ht_rx_nss);
        rx_nss = max(he_rx_nss, rx_nss);
        rx_nss = max(eht_rx_nss, rx_nss);
-       sta->sta.rx_nss = max_t(u8, 1, rx_nss);
+       sta->sta.deflink.rx_nss = max_t(u8, 1, rx_nss);
 }
 
 u32 __ieee80211_vht_handle_opmode(struct ieee80211_sub_if_data *sdata,
        nss >>= IEEE80211_OPMODE_NOTIF_RX_NSS_SHIFT;
        nss += 1;
 
-       if (sta->sta.rx_nss != nss) {
-               sta->sta.rx_nss = nss;
+       if (sta->sta.deflink.rx_nss != nss) {
+               sta->sta.deflink.rx_nss = nss;
                sta_opmode.rx_nss = nss;
                changed |= IEEE80211_RC_NSS_CHANGED;
                sta_opmode.changed |= STA_OPMODE_N_SS_CHANGED;
        switch (opmode & IEEE80211_OPMODE_NOTIF_CHANWIDTH_MASK) {
        case IEEE80211_OPMODE_NOTIF_CHANWIDTH_20MHZ:
                /* ignore IEEE80211_OPMODE_NOTIF_BW_160_80P80 must not be set */
-               sta->cur_max_bandwidth = IEEE80211_STA_RX_BW_20;
+               sta->deflink.cur_max_bandwidth = IEEE80211_STA_RX_BW_20;
                break;
        case IEEE80211_OPMODE_NOTIF_CHANWIDTH_40MHZ:
                /* ignore IEEE80211_OPMODE_NOTIF_BW_160_80P80 must not be set */
-               sta->cur_max_bandwidth = IEEE80211_STA_RX_BW_40;
+               sta->deflink.cur_max_bandwidth = IEEE80211_STA_RX_BW_40;
                break;
        case IEEE80211_OPMODE_NOTIF_CHANWIDTH_80MHZ:
                if (opmode & IEEE80211_OPMODE_NOTIF_BW_160_80P80)
-                       sta->cur_max_bandwidth = IEEE80211_STA_RX_BW_160;
+                       sta->deflink.cur_max_bandwidth = IEEE80211_STA_RX_BW_160;
                else
-                       sta->cur_max_bandwidth = IEEE80211_STA_RX_BW_80;
+                       sta->deflink.cur_max_bandwidth = IEEE80211_STA_RX_BW_80;
                break;
        case IEEE80211_OPMODE_NOTIF_CHANWIDTH_160MHZ:
                /* legacy only, no longer used by newer spec */
-               sta->cur_max_bandwidth = IEEE80211_STA_RX_BW_160;
+               sta->deflink.cur_max_bandwidth = IEEE80211_STA_RX_BW_160;
                break;
        }
 
        new_bw = ieee80211_sta_cur_vht_bw(sta);
-       if (new_bw != sta->sta.bandwidth) {
-               sta->sta.bandwidth = new_bw;
+       if (new_bw != sta->sta.deflink.bandwidth) {
+               sta->sta.deflink.bandwidth = new_bw;
                sta_opmode.bw = ieee80211_sta_rx_bw_to_chan_width(sta);
                changed |= IEEE80211_RC_BW_CHANGED;
                sta_opmode.changed |= STA_OPMODE_MAX_BW_CHANGED;