diff options
Diffstat (limited to 'net/mac80211/cfg.c')
-rw-r--r-- | net/mac80211/cfg.c | 77 |
1 files changed, 48 insertions, 29 deletions
diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c index 4965aa6424ec..5c61677487cf 100644 --- a/net/mac80211/cfg.c +++ b/net/mac80211/cfg.c | |||
@@ -398,6 +398,38 @@ void sta_set_rate_info_tx(struct sta_info *sta, | |||
398 | rinfo->flags |= RATE_INFO_FLAGS_SHORT_GI; | 398 | rinfo->flags |= RATE_INFO_FLAGS_SHORT_GI; |
399 | } | 399 | } |
400 | 400 | ||
401 | void sta_set_rate_info_rx(struct sta_info *sta, struct rate_info *rinfo) | ||
402 | { | ||
403 | rinfo->flags = 0; | ||
404 | |||
405 | if (sta->last_rx_rate_flag & RX_FLAG_HT) { | ||
406 | rinfo->flags |= RATE_INFO_FLAGS_MCS; | ||
407 | rinfo->mcs = sta->last_rx_rate_idx; | ||
408 | } else if (sta->last_rx_rate_flag & RX_FLAG_VHT) { | ||
409 | rinfo->flags |= RATE_INFO_FLAGS_VHT_MCS; | ||
410 | rinfo->nss = sta->last_rx_rate_vht_nss; | ||
411 | rinfo->mcs = sta->last_rx_rate_idx; | ||
412 | } else { | ||
413 | struct ieee80211_supported_band *sband; | ||
414 | |||
415 | sband = sta->local->hw.wiphy->bands[ | ||
416 | ieee80211_get_sdata_band(sta->sdata)]; | ||
417 | rinfo->legacy = | ||
418 | sband->bitrates[sta->last_rx_rate_idx].bitrate; | ||
419 | } | ||
420 | |||
421 | if (sta->last_rx_rate_flag & RX_FLAG_40MHZ) | ||
422 | rinfo->flags |= RATE_INFO_FLAGS_40_MHZ_WIDTH; | ||
423 | if (sta->last_rx_rate_flag & RX_FLAG_SHORT_GI) | ||
424 | rinfo->flags |= RATE_INFO_FLAGS_SHORT_GI; | ||
425 | if (sta->last_rx_rate_flag & RX_FLAG_80MHZ) | ||
426 | rinfo->flags |= RATE_INFO_FLAGS_80_MHZ_WIDTH; | ||
427 | if (sta->last_rx_rate_flag & RX_FLAG_80P80MHZ) | ||
428 | rinfo->flags |= RATE_INFO_FLAGS_80P80_MHZ_WIDTH; | ||
429 | if (sta->last_rx_rate_flag & RX_FLAG_160MHZ) | ||
430 | rinfo->flags |= RATE_INFO_FLAGS_160_MHZ_WIDTH; | ||
431 | } | ||
432 | |||
401 | static void sta_set_sinfo(struct sta_info *sta, struct station_info *sinfo) | 433 | static void sta_set_sinfo(struct sta_info *sta, struct station_info *sinfo) |
402 | { | 434 | { |
403 | struct ieee80211_sub_if_data *sdata = sta->sdata; | 435 | struct ieee80211_sub_if_data *sdata = sta->sdata; |
@@ -444,34 +476,7 @@ static void sta_set_sinfo(struct sta_info *sta, struct station_info *sinfo) | |||
444 | } | 476 | } |
445 | 477 | ||
446 | sta_set_rate_info_tx(sta, &sta->last_tx_rate, &sinfo->txrate); | 478 | sta_set_rate_info_tx(sta, &sta->last_tx_rate, &sinfo->txrate); |
447 | 479 | sta_set_rate_info_rx(sta, &sinfo->rxrate); | |
448 | sinfo->rxrate.flags = 0; | ||
449 | if (sta->last_rx_rate_flag & RX_FLAG_HT) { | ||
450 | sinfo->rxrate.flags |= RATE_INFO_FLAGS_MCS; | ||
451 | sinfo->rxrate.mcs = sta->last_rx_rate_idx; | ||
452 | } else if (sta->last_rx_rate_flag & RX_FLAG_VHT) { | ||
453 | sinfo->rxrate.flags |= RATE_INFO_FLAGS_VHT_MCS; | ||
454 | sinfo->rxrate.nss = sta->last_rx_rate_vht_nss; | ||
455 | sinfo->rxrate.mcs = sta->last_rx_rate_idx; | ||
456 | } else { | ||
457 | struct ieee80211_supported_band *sband; | ||
458 | |||
459 | sband = sta->local->hw.wiphy->bands[ | ||
460 | ieee80211_get_sdata_band(sta->sdata)]; | ||
461 | sinfo->rxrate.legacy = | ||
462 | sband->bitrates[sta->last_rx_rate_idx].bitrate; | ||
463 | } | ||
464 | |||
465 | if (sta->last_rx_rate_flag & RX_FLAG_40MHZ) | ||
466 | sinfo->rxrate.flags |= RATE_INFO_FLAGS_40_MHZ_WIDTH; | ||
467 | if (sta->last_rx_rate_flag & RX_FLAG_SHORT_GI) | ||
468 | sinfo->rxrate.flags |= RATE_INFO_FLAGS_SHORT_GI; | ||
469 | if (sta->last_rx_rate_flag & RX_FLAG_80MHZ) | ||
470 | sinfo->rxrate.flags |= RATE_INFO_FLAGS_80_MHZ_WIDTH; | ||
471 | if (sta->last_rx_rate_flag & RX_FLAG_80P80MHZ) | ||
472 | sinfo->rxrate.flags |= RATE_INFO_FLAGS_80P80_MHZ_WIDTH; | ||
473 | if (sta->last_rx_rate_flag & RX_FLAG_160MHZ) | ||
474 | sinfo->rxrate.flags |= RATE_INFO_FLAGS_160_MHZ_WIDTH; | ||
475 | 480 | ||
476 | if (ieee80211_vif_is_mesh(&sdata->vif)) { | 481 | if (ieee80211_vif_is_mesh(&sdata->vif)) { |
477 | #ifdef CONFIG_MAC80211_MESH | 482 | #ifdef CONFIG_MAC80211_MESH |
@@ -893,7 +898,8 @@ static int ieee80211_start_ap(struct wiphy *wiphy, struct net_device *dev, | |||
893 | u32 changed = BSS_CHANGED_BEACON_INT | | 898 | u32 changed = BSS_CHANGED_BEACON_INT | |
894 | BSS_CHANGED_BEACON_ENABLED | | 899 | BSS_CHANGED_BEACON_ENABLED | |
895 | BSS_CHANGED_BEACON | | 900 | BSS_CHANGED_BEACON | |
896 | BSS_CHANGED_SSID; | 901 | BSS_CHANGED_SSID | |
902 | BSS_CHANGED_P2P_PS; | ||
897 | int err; | 903 | int err; |
898 | 904 | ||
899 | old = rtnl_dereference(sdata->u.ap.beacon); | 905 | old = rtnl_dereference(sdata->u.ap.beacon); |
@@ -932,6 +938,9 @@ static int ieee80211_start_ap(struct wiphy *wiphy, struct net_device *dev, | |||
932 | sdata->vif.bss_conf.hidden_ssid = | 938 | sdata->vif.bss_conf.hidden_ssid = |
933 | (params->hidden_ssid != NL80211_HIDDEN_SSID_NOT_IN_USE); | 939 | (params->hidden_ssid != NL80211_HIDDEN_SSID_NOT_IN_USE); |
934 | 940 | ||
941 | sdata->vif.bss_conf.p2p_ctwindow = params->p2p_ctwindow; | ||
942 | sdata->vif.bss_conf.p2p_oppps = params->p2p_opp_ps; | ||
943 | |||
935 | err = ieee80211_assign_beacon(sdata, ¶ms->beacon); | 944 | err = ieee80211_assign_beacon(sdata, ¶ms->beacon); |
936 | if (err < 0) | 945 | if (err < 0) |
937 | return err; | 946 | return err; |
@@ -1807,6 +1816,16 @@ static int ieee80211_change_bss(struct wiphy *wiphy, | |||
1807 | changed |= BSS_CHANGED_HT; | 1816 | changed |= BSS_CHANGED_HT; |
1808 | } | 1817 | } |
1809 | 1818 | ||
1819 | if (params->p2p_ctwindow >= 0) { | ||
1820 | sdata->vif.bss_conf.p2p_ctwindow = params->p2p_ctwindow; | ||
1821 | changed |= BSS_CHANGED_P2P_PS; | ||
1822 | } | ||
1823 | |||
1824 | if (params->p2p_opp_ps >= 0) { | ||
1825 | sdata->vif.bss_conf.p2p_oppps = params->p2p_opp_ps; | ||
1826 | changed |= BSS_CHANGED_P2P_PS; | ||
1827 | } | ||
1828 | |||
1810 | ieee80211_bss_info_change_notify(sdata, changed); | 1829 | ieee80211_bss_info_change_notify(sdata, changed); |
1811 | 1830 | ||
1812 | return 0; | 1831 | return 0; |