@@ -1118,6 +1118,31 @@ static void ieee80211_sdata_init(struct ieee80211_local *local,
* MLD connection, we get a separate allocation for it.
*/
ieee80211_link_init(sdata, -1, &sdata->deflink, &sdata->vif.bss_conf);
+
+ for (int i = 0; i < NUM_NL80211_BANDS; i++) {
+ struct ieee80211_supported_band *sband;
+
+ sband = local->hw.wiphy->bands[i];
+ sdata->rc_rateidx_mask[i] =
+ sband ? (1 << sband->n_bitrates) - 1 : 0;
+ if (sband) {
+ __le16 cap;
+ u16 *vht_rate_mask;
+
+ memcpy(sdata->rc_rateidx_mcs_mask[i],
+ sband->ht_cap.mcs.rx_mask,
+ sizeof(sdata->rc_rateidx_mcs_mask[i]));
+
+ cap = sband->vht_cap.vht_mcs.rx_mcs_map;
+ vht_rate_mask = sdata->rc_rateidx_vht_mcs_mask[i];
+ ieee80211_get_vht_mask_from_cap(cap, vht_rate_mask);
+ } else {
+ memset(sdata->rc_rateidx_mcs_mask[i], 0,
+ sizeof(sdata->rc_rateidx_mcs_mask[i]));
+ memset(sdata->rc_rateidx_vht_mcs_mask[i], 0,
+ sizeof(sdata->rc_rateidx_vht_mcs_mask[i]));
+ }
+ }
}
int ieee80211_add_virtual_monitor(struct ieee80211_local *local)
@@ -2076,7 +2101,7 @@ int ieee80211_if_add(struct ieee80211_local *local, const char *name,
struct net_device *ndev = NULL;
struct ieee80211_sub_if_data *sdata = NULL;
struct txq_info *txqi;
- int ret, i;
+ int ret;
ASSERT_RTNL();
lockdep_assert_wiphy(local->hw.wiphy);
@@ -2165,30 +2190,6 @@ int ieee80211_if_add(struct ieee80211_local *local, const char *name,
wiphy_delayed_work_init(&sdata->dec_tailroom_needed_wk,
ieee80211_delayed_tailroom_dec);
- for (i = 0; i < NUM_NL80211_BANDS; i++) {
- struct ieee80211_supported_band *sband;
- sband = local->hw.wiphy->bands[i];
- sdata->rc_rateidx_mask[i] =
- sband ? (1 << sband->n_bitrates) - 1 : 0;
- if (sband) {
- __le16 cap;
- u16 *vht_rate_mask;
-
- memcpy(sdata->rc_rateidx_mcs_mask[i],
- sband->ht_cap.mcs.rx_mask,
- sizeof(sdata->rc_rateidx_mcs_mask[i]));
-
- cap = sband->vht_cap.vht_mcs.rx_mcs_map;
- vht_rate_mask = sdata->rc_rateidx_vht_mcs_mask[i];
- ieee80211_get_vht_mask_from_cap(cap, vht_rate_mask);
- } else {
- memset(sdata->rc_rateidx_mcs_mask[i], 0,
- sizeof(sdata->rc_rateidx_mcs_mask[i]));
- memset(sdata->rc_rateidx_vht_mcs_mask[i], 0,
- sizeof(sdata->rc_rateidx_vht_mcs_mask[i]));
- }
- }
-
ieee80211_set_default_queues(sdata);
/* setup type-dependent data */
Move setting up the rate control into ieee80211_sdata_init() to ensure rates are also set up for the virtual monitor interface. Signed-off-by: Alexander Wetzel <Alexander@wetzel-home.de> --- net/mac80211/iface.c | 51 ++++++++++++++++++++++---------------------- 1 file changed, 26 insertions(+), 25 deletions(-)