|
@@ -1928,43 +1928,47 @@ u8 sta_info_tx_streams(struct sta_info *sta)
|
|
|
>> IEEE80211_HT_MCS_TX_MAX_STREAMS_SHIFT) + 1;
|
|
|
}
|
|
|
|
|
|
-static void sta_set_rate_info_rx(struct sta_info *sta, struct rate_info *rinfo)
|
|
|
+static void sta_stats_decode_rate(struct ieee80211_local *local, u16 rate,
|
|
|
+ struct rate_info *rinfo)
|
|
|
{
|
|
|
- rinfo->flags = 0;
|
|
|
-
|
|
|
- if (sta->rx_stats.last_rate_flag & RX_FLAG_HT) {
|
|
|
- rinfo->flags |= RATE_INFO_FLAGS_MCS;
|
|
|
- rinfo->mcs = sta->rx_stats.last_rate_idx;
|
|
|
- } else if (sta->rx_stats.last_rate_flag & RX_FLAG_VHT) {
|
|
|
- rinfo->flags |= RATE_INFO_FLAGS_VHT_MCS;
|
|
|
- rinfo->nss = sta->rx_stats.last_rate_vht_nss;
|
|
|
- rinfo->mcs = sta->rx_stats.last_rate_idx;
|
|
|
- } else {
|
|
|
+ rinfo->bw = (rate & STA_STATS_RATE_BW_MASK) >>
|
|
|
+ STA_STATS_RATE_BW_SHIFT;
|
|
|
+
|
|
|
+ if (rate & STA_STATS_RATE_VHT) {
|
|
|
+ rinfo->flags = RATE_INFO_FLAGS_VHT_MCS;
|
|
|
+ rinfo->mcs = rate & 0xf;
|
|
|
+ rinfo->nss = (rate & 0xf0) >> 4;
|
|
|
+ } else if (rate & STA_STATS_RATE_HT) {
|
|
|
+ rinfo->flags = RATE_INFO_FLAGS_MCS;
|
|
|
+ rinfo->mcs = rate & 0xff;
|
|
|
+ } else if (rate & STA_STATS_RATE_LEGACY) {
|
|
|
struct ieee80211_supported_band *sband;
|
|
|
- int shift = ieee80211_vif_get_shift(&sta->sdata->vif);
|
|
|
u16 brate;
|
|
|
-
|
|
|
- sband = sta->local->hw.wiphy->bands[
|
|
|
- ieee80211_get_sdata_band(sta->sdata)];
|
|
|
- brate = sband->bitrates[sta->rx_stats.last_rate_idx].bitrate;
|
|
|
+ unsigned int shift;
|
|
|
+
|
|
|
+ sband = local->hw.wiphy->bands[(rate >> 4) & 0xf];
|
|
|
+ brate = sband->bitrates[rate & 0xf].bitrate;
|
|
|
+ if (rinfo->bw == RATE_INFO_BW_5)
|
|
|
+ shift = 2;
|
|
|
+ else if (rinfo->bw == RATE_INFO_BW_10)
|
|
|
+ shift = 1;
|
|
|
+ else
|
|
|
+ shift = 0;
|
|
|
rinfo->legacy = DIV_ROUND_UP(brate, 1 << shift);
|
|
|
}
|
|
|
|
|
|
- if (sta->rx_stats.last_rate_flag & RX_FLAG_SHORT_GI)
|
|
|
+ if (rate & STA_STATS_RATE_SGI)
|
|
|
rinfo->flags |= RATE_INFO_FLAGS_SHORT_GI;
|
|
|
+}
|
|
|
+
|
|
|
+static void sta_set_rate_info_rx(struct sta_info *sta, struct rate_info *rinfo)
|
|
|
+{
|
|
|
+ u16 rate = ACCESS_ONCE(sta->rx_stats.last_rate);
|
|
|
|
|
|
- if (sta->rx_stats.last_rate_flag & RX_FLAG_5MHZ)
|
|
|
- rinfo->bw = RATE_INFO_BW_5;
|
|
|
- else if (sta->rx_stats.last_rate_flag & RX_FLAG_10MHZ)
|
|
|
- rinfo->bw = RATE_INFO_BW_10;
|
|
|
- else if (sta->rx_stats.last_rate_flag & RX_FLAG_40MHZ)
|
|
|
- rinfo->bw = RATE_INFO_BW_40;
|
|
|
- else if (sta->rx_stats.last_rate_vht_flag & RX_VHT_FLAG_80MHZ)
|
|
|
- rinfo->bw = RATE_INFO_BW_80;
|
|
|
- else if (sta->rx_stats.last_rate_vht_flag & RX_VHT_FLAG_160MHZ)
|
|
|
- rinfo->bw = RATE_INFO_BW_160;
|
|
|
+ if (rate == STA_STATS_RATE_INVALID)
|
|
|
+ rinfo->flags = 0;
|
|
|
else
|
|
|
- rinfo->bw = RATE_INFO_BW_20;
|
|
|
+ sta_stats_decode_rate(sta->local, rate, rinfo);
|
|
|
}
|
|
|
|
|
|
void sta_set_sinfo(struct sta_info *sta, struct station_info *sinfo)
|