cfg80211: change bandwidth reporting to explicit field
For some reason, we made the bandwidth separate flags, which is rather confusing - a single rate cannot have different bandwidths at the same time. Change this to no longer be flags but use a separate field for the bandwidth ('bw') instead. While at it, add support for 5 and 10 MHz rates - these are reported as regular legacy rates with their real bitrate, but tagged as 5/10 now to make it easier to distinguish them. In the nl80211 API, the flags are preserved, but the code now can also clearly only set a single one of the flags. Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
parent
97d910d0aa
commit
b51f3beecf
8 changed files with 125 additions and 50 deletions
|
@ -428,11 +428,13 @@ void sta_set_rate_info_tx(struct sta_info *sta,
|
|||
rinfo->legacy = DIV_ROUND_UP(brate, 1 << shift);
|
||||
}
|
||||
if (rate->flags & IEEE80211_TX_RC_40_MHZ_WIDTH)
|
||||
rinfo->flags |= RATE_INFO_FLAGS_40_MHZ_WIDTH;
|
||||
if (rate->flags & IEEE80211_TX_RC_80_MHZ_WIDTH)
|
||||
rinfo->flags |= RATE_INFO_FLAGS_80_MHZ_WIDTH;
|
||||
if (rate->flags & IEEE80211_TX_RC_160_MHZ_WIDTH)
|
||||
rinfo->flags |= RATE_INFO_FLAGS_160_MHZ_WIDTH;
|
||||
rinfo->bw = RATE_INFO_BW_40;
|
||||
else if (rate->flags & IEEE80211_TX_RC_80_MHZ_WIDTH)
|
||||
rinfo->bw = RATE_INFO_BW_80;
|
||||
else if (rate->flags & IEEE80211_TX_RC_160_MHZ_WIDTH)
|
||||
rinfo->bw = RATE_INFO_BW_160;
|
||||
else
|
||||
rinfo->bw = RATE_INFO_BW_20;
|
||||
if (rate->flags & IEEE80211_TX_RC_SHORT_GI)
|
||||
rinfo->flags |= RATE_INFO_FLAGS_SHORT_GI;
|
||||
}
|
||||
|
@ -459,14 +461,21 @@ void sta_set_rate_info_rx(struct sta_info *sta, struct rate_info *rinfo)
|
|||
rinfo->legacy = DIV_ROUND_UP(brate, 1 << shift);
|
||||
}
|
||||
|
||||
if (sta->last_rx_rate_flag & RX_FLAG_40MHZ)
|
||||
rinfo->flags |= RATE_INFO_FLAGS_40_MHZ_WIDTH;
|
||||
if (sta->last_rx_rate_flag & RX_FLAG_SHORT_GI)
|
||||
rinfo->flags |= RATE_INFO_FLAGS_SHORT_GI;
|
||||
if (sta->last_rx_rate_vht_flag & RX_VHT_FLAG_80MHZ)
|
||||
rinfo->flags |= RATE_INFO_FLAGS_80_MHZ_WIDTH;
|
||||
if (sta->last_rx_rate_vht_flag & RX_VHT_FLAG_160MHZ)
|
||||
rinfo->flags |= RATE_INFO_FLAGS_160_MHZ_WIDTH;
|
||||
|
||||
if (sta->last_rx_rate_flag & RX_FLAG_5MHZ)
|
||||
rinfo->bw = RATE_INFO_BW_5;
|
||||
else if (sta->last_rx_rate_flag & RX_FLAG_10MHZ)
|
||||
rinfo->bw = RATE_INFO_BW_10;
|
||||
else if (sta->last_rx_rate_flag & RX_FLAG_40MHZ)
|
||||
rinfo->bw = RATE_INFO_BW_40;
|
||||
else if (sta->last_rx_rate_vht_flag & RX_VHT_FLAG_80MHZ)
|
||||
rinfo->bw = RATE_INFO_BW_80;
|
||||
else if (sta->last_rx_rate_vht_flag & RX_VHT_FLAG_160MHZ)
|
||||
rinfo->bw = RATE_INFO_BW_160;
|
||||
else
|
||||
rinfo->bw = RATE_INFO_BW_20;
|
||||
}
|
||||
|
||||
static int ieee80211_dump_station(struct wiphy *wiphy, struct net_device *dev,
|
||||
|
|
|
@ -2541,7 +2541,9 @@ u64 ieee80211_calculate_rx_timestamp(struct ieee80211_local *local,
|
|||
ri.mcs = status->rate_idx;
|
||||
ri.flags |= RATE_INFO_FLAGS_MCS;
|
||||
if (status->flag & RX_FLAG_40MHZ)
|
||||
ri.flags |= RATE_INFO_FLAGS_40_MHZ_WIDTH;
|
||||
ri.bw = RATE_INFO_BW_40;
|
||||
else
|
||||
ri.bw = RATE_INFO_BW_20;
|
||||
if (status->flag & RX_FLAG_SHORT_GI)
|
||||
ri.flags |= RATE_INFO_FLAGS_SHORT_GI;
|
||||
} else if (status->flag & RX_FLAG_VHT) {
|
||||
|
@ -2549,11 +2551,13 @@ u64 ieee80211_calculate_rx_timestamp(struct ieee80211_local *local,
|
|||
ri.mcs = status->rate_idx;
|
||||
ri.nss = status->vht_nss;
|
||||
if (status->flag & RX_FLAG_40MHZ)
|
||||
ri.flags |= RATE_INFO_FLAGS_40_MHZ_WIDTH;
|
||||
if (status->vht_flag & RX_VHT_FLAG_80MHZ)
|
||||
ri.flags |= RATE_INFO_FLAGS_80_MHZ_WIDTH;
|
||||
if (status->vht_flag & RX_VHT_FLAG_160MHZ)
|
||||
ri.flags |= RATE_INFO_FLAGS_160_MHZ_WIDTH;
|
||||
ri.bw = RATE_INFO_BW_40;
|
||||
else if (status->vht_flag & RX_VHT_FLAG_80MHZ)
|
||||
ri.bw = RATE_INFO_BW_80;
|
||||
else if (status->vht_flag & RX_VHT_FLAG_160MHZ)
|
||||
ri.bw = RATE_INFO_BW_160;
|
||||
else
|
||||
ri.bw = RATE_INFO_BW_20;
|
||||
if (status->flag & RX_FLAG_SHORT_GI)
|
||||
ri.flags |= RATE_INFO_FLAGS_SHORT_GI;
|
||||
} else {
|
||||
|
@ -2561,10 +2565,15 @@ u64 ieee80211_calculate_rx_timestamp(struct ieee80211_local *local,
|
|||
int shift = 0;
|
||||
int bitrate;
|
||||
|
||||
if (status->flag & RX_FLAG_10MHZ)
|
||||
if (status->flag & RX_FLAG_10MHZ) {
|
||||
shift = 1;
|
||||
if (status->flag & RX_FLAG_5MHZ)
|
||||
ri.bw = RATE_INFO_BW_10;
|
||||
} else if (status->flag & RX_FLAG_5MHZ) {
|
||||
shift = 2;
|
||||
ri.bw = RATE_INFO_BW_5;
|
||||
} else {
|
||||
ri.bw = RATE_INFO_BW_20;
|
||||
}
|
||||
|
||||
sband = local->hw.wiphy->bands[status->band];
|
||||
bitrate = sband->bitrates[status->rate_idx].bitrate;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue