* Copyright 2006-2010 Johannes Berg <johannes@sipsolutions.net>
  * Copyright 2013-2015  Intel Mobile Communications GmbH
  * Copyright (C) 2015-2017 Intel Deutschland GmbH
- * Copyright (C) 2018 Intel Corporation
+ * Copyright (C) 2018-2019 Intel Corporation
  *
  * This file is GPLv2 as found in COPYING.
  */
                        return ret;
        }
 
-       if (params->supported_rates) {
+       if (params->supported_rates && params->supported_rates_len) {
                ieee80211_parse_bitrates(&sdata->vif.bss_conf.chandef,
                                         sband, params->supported_rates,
                                         params->supported_rates_len,
 
                        basic_rates = BIT(min_rate_index);
                }
 
-               new_sta->sta.supp_rates[cbss->channel->band] = rates;
+               if (rates)
+                       new_sta->sta.supp_rates[cbss->channel->band] = rates;
+               else
+                       sdata_info(sdata,
+                                  "No rates found, keeping mandatory only\n");
+
                sdata->vif.bss_conf.basic_rates = basic_rates;
 
                /* cf. IEEE 802.11 9.2.12 */
 
        struct ieee80211_tx_info *info = IEEE80211_SKB_CB(txrc->skb);
        int i;
 
-       if (sta && test_sta_flag(sta, WLAN_STA_RATE_CONTROL)) {
-               ista = &sta->sta;
-               priv_sta = sta->rate_ctrl_priv;
-       }
-
        for (i = 0; i < IEEE80211_TX_MAX_RATES; i++) {
                info->control.rates[i].idx = -1;
                info->control.rates[i].flags = 0;
        if (ieee80211_hw_check(&sdata->local->hw, HAS_RATE_CONTROL))
                return;
 
-       if (rate_control_send_low(ista, txrc))
+       if (rate_control_send_low(sta ? &sta->sta : NULL, txrc))
                return;
 
+       if (sta && test_sta_flag(sta, WLAN_STA_RATE_CONTROL)) {
+               ista = &sta->sta;
+               priv_sta = sta->rate_ctrl_priv;
+       }
+
        if (ista) {
                spin_lock_bh(&sta->rate_ctrl_lock);
                ref->ops->get_rate(ref->priv, ista, priv_sta, txrc);
 
  * Copyright 2006-2007 Jiri Benc <jbenc@suse.cz>
  * Copyright 2013-2014  Intel Mobile Communications GmbH
  * Copyright (C) 2015 - 2017 Intel Deutschland GmbH
- * Copyright (C) 2018 Intel Corporation
+ * Copyright (C) 2018-2019 Intel Corporation
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 as
        for (i = 0; i < IEEE80211_NUM_TIDS; i++)
                sta->last_seq_ctrl[i] = cpu_to_le16(USHRT_MAX);
 
+       for (i = 0; i < NUM_NL80211_BANDS; i++) {
+               u32 mandatory = 0;
+               int r;
+
+               if (!hw->wiphy->bands[i])
+                       continue;
+
+               switch (i) {
+               case NL80211_BAND_2GHZ:
+                       /*
+                        * We use both here, even if we cannot really know for
+                        * sure the station will support both, but the only use
+                        * for this is when we don't know anything yet and send
+                        * management frames, and then we'll pick the lowest
+                        * possible rate anyway.
+                        * If we don't include _G here, we cannot find a rate
+                        * in P2P, and thus trigger the WARN_ONCE() in rate.c
+                        */
+                       mandatory = IEEE80211_RATE_MANDATORY_B |
+                                   IEEE80211_RATE_MANDATORY_G;
+                       break;
+               case NL80211_BAND_5GHZ:
+                       mandatory = IEEE80211_RATE_MANDATORY_A;
+                       break;
+               case NL80211_BAND_60GHZ:
+                       WARN_ON(1);
+                       mandatory = 0;
+                       break;
+               }
+
+               for (r = 0; r < hw->wiphy->bands[i]->n_bitrates; r++) {
+                       struct ieee80211_rate *rate;
+
+                       rate = &hw->wiphy->bands[i]->bitrates[r];
+
+                       if (!(rate->flags & mandatory))
+                               continue;
+                       sta->sta.supp_rates[i] |= BIT(r);
+               }
+       }
+
        sta->sta.smps_mode = IEEE80211_SMPS_OFF;
        if (sdata->vif.type == NL80211_IFTYPE_AP ||
            sdata->vif.type == NL80211_IFTYPE_AP_VLAN) {