u8 *pwr_constr_elem;
        u8 *quiet_elem; /* first quite element */
        u8 *timeout_int;
+       u8 *opmode_notif;
 
        /* length of them, respectively */
        u8 ssid_len;
 void ieee80211_sta_set_rx_nss(struct sta_info *sta);
 void ieee80211_vht_handle_opmode(struct ieee80211_sub_if_data *sdata,
                                 struct sta_info *sta, u8 opmode,
-                                enum ieee80211_band band);
+                                enum ieee80211_band band, bool nss_only);
 
 /* Spectrum management */
 void ieee80211_process_measurement_req(struct ieee80211_sub_if_data *sdata,
 
                                                  elems.ht_operation,
                                                  cbss->bssid, false);
 
+       /*
+        * If an operating mode notification IE is present, override the
+        * NSS calculation (that would be done in rate_control_rate_init())
+        * and use the # of streams from that element.
+        */
+       if (elems.opmode_notif &&
+           !(*elems.opmode_notif & IEEE80211_OPMODE_NOTIF_RX_NSS_TYPE_BF)) {
+               u8 nss;
+
+               nss = *elems.opmode_notif & IEEE80211_OPMODE_NOTIF_RX_NSS_MASK;
+               nss >>= IEEE80211_OPMODE_NOTIF_RX_NSS_SHIFT;
+               nss += 1;
+               sta->sta.rx_nss = nss;
+       }
+
        rate_control_rate_init(sta);
 
        if (ifmgd->flags & IEEE80211_STA_MFP_ENABLED)
        struct ieee80211_local *local = sdata->local;
        struct ieee80211_chanctx_conf *chanctx_conf;
        struct ieee80211_channel *chan;
+       struct sta_info *sta;
        u32 changed = 0;
        bool erp_valid;
        u8 erp_value = 0;
                        le16_to_cpu(mgmt->u.beacon.capab_info),
                        erp_valid, erp_value);
 
-
        mutex_lock(&local->sta_mtx);
+       sta = sta_info_get(sdata, bssid);
+
        if (elems.ht_cap_elem && elems.ht_operation && elems.wmm_param &&
            !(ifmgd->flags & IEEE80211_STA_DISABLE_HT))
-               changed |= ieee80211_config_ht_tx(sdata,
-                                                 sta_info_get(sdata, bssid),
+               changed |= ieee80211_config_ht_tx(sdata, sta,
                                                  elems.ht_operation,
                                                  bssid, true);
+
+       if (sta && elems.opmode_notif)
+               ieee80211_vht_handle_opmode(sdata, sta, *elems.opmode_notif,
+                                           rx_status->band, true);
        mutex_unlock(&local->sta_mtx);
 
        if (elems.country_elem && elems.pwr_constr_elem &&
 
                        opmode = mgmt->u.action.u.vht_opmode_notif.operating_mode;
 
                        ieee80211_vht_handle_opmode(rx->sdata, rx->sta,
-                                                   opmode, status->band);
+                                                   opmode, status->band,
+                                                   false);
                        goto handled;
                }
                default:
 
                        else
                                elem_parse_failed = true;
                        break;
+               case WLAN_EID_OPMODE_NOTIF:
+                       if (elen > 0)
+                               elems->opmode_notif = pos;
+                       else
+                               elem_parse_failed = true;
+                       break;
                case WLAN_EID_MESH_ID:
                        elems->mesh_id = pos;
                        elems->mesh_id_len = elen;
 
 
 void ieee80211_vht_handle_opmode(struct ieee80211_sub_if_data *sdata,
                                 struct sta_info *sta, u8 opmode,
-                                enum ieee80211_band band)
+                                enum ieee80211_band band, bool nss_only)
 {
        struct ieee80211_local *local = sdata->local;
        struct ieee80211_supported_band *sband;
                changed |= IEEE80211_RC_NSS_CHANGED;
        }
 
+       if (nss_only)
+               goto change;
+
        switch (opmode & IEEE80211_OPMODE_NOTIF_CHANWIDTH_MASK) {
        case IEEE80211_OPMODE_NOTIF_CHANWIDTH_20MHZ:
                sta->cur_max_bandwidth = IEEE80211_STA_RX_BW_20;
                changed |= IEEE80211_RC_NSS_CHANGED;
        }
 
+ change:
        if (changed)
                rate_control_rate_update(local, sband, sta, changed);
 }