cfg80211: avoid intersection when applying self-managed reg
[cascardo/linux.git] / net / mac80211 / rate.c
index 6081329..d53355b 100644 (file)
@@ -385,7 +385,7 @@ static void rate_idx_match_mask(struct ieee80211_tx_rate *rate,
                        *rate = alt_rate;
                        return;
                }
-       } else {
+       } else if (!(rate->flags & IEEE80211_TX_RC_VHT_MCS)) {
                /* handle legacy rates */
                if (rate_idx_match_legacy_mask(rate, sband->n_bitrates, mask))
                        return;
@@ -446,7 +446,8 @@ static void rate_fixup_ratelist(struct ieee80211_vif *vif,
         *
         * XXX: Should this check all retry rates?
         */
-       if (!(rates[0].flags & IEEE80211_TX_RC_MCS)) {
+       if (!(rates[0].flags &
+             (IEEE80211_TX_RC_MCS | IEEE80211_TX_RC_VHT_MCS))) {
                u32 basic_rates = vif->bss_conf.basic_rates;
                s8 baserate = basic_rates ? ffs(basic_rates) - 1 : 0;
 
@@ -696,6 +697,7 @@ int rate_control_set_rates(struct ieee80211_hw *hw,
                           struct ieee80211_sta *pubsta,
                           struct ieee80211_sta_rates *rates)
 {
+       struct sta_info *sta = container_of(pubsta, struct sta_info, sta);
        struct ieee80211_sta_rates *old;
 
        /*
@@ -709,6 +711,8 @@ int rate_control_set_rates(struct ieee80211_hw *hw,
        if (old)
                kfree_rcu(old, rcu_head);
 
+       drv_sta_rate_tbl_update(hw_to_local(hw), sta->sdata, pubsta);
+
        return 0;
 }
 EXPORT_SYMBOL(rate_control_set_rates);