struct cfg80211_bss *cbss)
 {
        struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
-       const u8 *ht_cap_ie, *vht_cap_ie;
+       const struct element *ht_cap_elem, *vht_cap_elem;
        const struct ieee80211_ht_cap *ht_cap;
        const struct ieee80211_vht_cap *vht_cap;
        u8 chains = 1;
        if (ifmgd->flags & IEEE80211_STA_DISABLE_HT)
                return chains;
 
-       ht_cap_ie = ieee80211_bss_get_ie(cbss, WLAN_EID_HT_CAPABILITY);
-       if (ht_cap_ie && ht_cap_ie[1] >= sizeof(*ht_cap)) {
-               ht_cap = (void *)(ht_cap_ie + 2);
+       ht_cap_elem = ieee80211_bss_get_elem(cbss, WLAN_EID_HT_CAPABILITY);
+       if (ht_cap_elem && ht_cap_elem->datalen >= sizeof(*ht_cap)) {
+               ht_cap = (void *)ht_cap_elem->data;
                chains = ieee80211_mcs_to_chains(&ht_cap->mcs);
                /*
                 * TODO: use "Tx Maximum Number Spatial Streams Supported" and
        if (ifmgd->flags & IEEE80211_STA_DISABLE_VHT)
                return chains;
 
-       vht_cap_ie = ieee80211_bss_get_ie(cbss, WLAN_EID_VHT_CAPABILITY);
-       if (vht_cap_ie && vht_cap_ie[1] >= sizeof(*vht_cap)) {
+       vht_cap_elem = ieee80211_bss_get_elem(cbss, WLAN_EID_VHT_CAPABILITY);
+       if (vht_cap_elem && vht_cap_elem->datalen >= sizeof(*vht_cap)) {
                u8 nss;
                u16 tx_mcs_map;
 
-               vht_cap = (void *)(vht_cap_ie + 2);
+               vht_cap = (void *)vht_cap_elem->data;
                tx_mcs_map = le16_to_cpu(vht_cap->supp_mcs.tx_mcs_map);
                for (nss = 8; nss > 0; nss--) {
                        if (((tx_mcs_map >> (2 * (nss - 1))) & 3) !=