You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
mac80211: select and adjust bitrates according to channel mode
The various components accessing the bitrates table must use consider the used channel bandwidth to select only available rates or calculate the bitrate correctly. There are some rates in reduced bandwidth modes which can't be represented as multiples of 500kbps, like 2.25 MBit/s in 5 MHz mode. The standard suggests to round up to the next multiple of 500kbps, just do that in mac80211 as well. Signed-off-by: Simon Wunderlich <siwu@hrz.tu-chemnitz.de> Signed-off-by: Mathias Kretschmer <mathias.kretschmer@fokus.fraunhofer.de> [make rate unsigned in ieee80211_add_tx_radiotap_header(), squash fix] Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
This commit is contained in:
committed by
Johannes Berg
parent
a5e70697d0
commit
2103dec147
+16
-5
@@ -40,12 +40,22 @@ static __le16 ieee80211_duration(struct ieee80211_tx_data *tx,
|
||||
struct sk_buff *skb, int group_addr,
|
||||
int next_frag_len)
|
||||
{
|
||||
int rate, mrate, erp, dur, i, shift;
|
||||
int rate, mrate, erp, dur, i, shift = 0;
|
||||
struct ieee80211_rate *txrate;
|
||||
struct ieee80211_local *local = tx->local;
|
||||
struct ieee80211_supported_band *sband;
|
||||
struct ieee80211_hdr *hdr;
|
||||
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
|
||||
struct ieee80211_chanctx_conf *chanctx_conf;
|
||||
u32 rate_flags = 0;
|
||||
|
||||
rcu_read_lock();
|
||||
chanctx_conf = rcu_dereference(tx->sdata->vif.chanctx_conf);
|
||||
if (chanctx_conf) {
|
||||
shift = ieee80211_chandef_get_shift(&chanctx_conf->def);
|
||||
rate_flags = ieee80211_chandef_rate_flags(&chanctx_conf->def);
|
||||
}
|
||||
rcu_read_unlock();
|
||||
|
||||
/* assume HW handles this */
|
||||
if (tx->rate.flags & IEEE80211_TX_RC_MCS)
|
||||
@@ -122,8 +132,11 @@ static __le16 ieee80211_duration(struct ieee80211_tx_data *tx,
|
||||
if (r->bitrate > txrate->bitrate)
|
||||
break;
|
||||
|
||||
if ((rate_flags & r->flags) != rate_flags)
|
||||
continue;
|
||||
|
||||
if (tx->sdata->vif.bss_conf.basic_rates & BIT(i))
|
||||
rate = r->bitrate;
|
||||
rate = DIV_ROUND_UP(r->bitrate, 1 << shift);
|
||||
|
||||
switch (sband->band) {
|
||||
case IEEE80211_BAND_2GHZ: {
|
||||
@@ -150,11 +163,9 @@ static __le16 ieee80211_duration(struct ieee80211_tx_data *tx,
|
||||
if (rate == -1) {
|
||||
/* No matching basic rate found; use highest suitable mandatory
|
||||
* PHY rate */
|
||||
rate = mrate;
|
||||
rate = DIV_ROUND_UP(mrate, 1 << shift);
|
||||
}
|
||||
|
||||
shift = ieee80211_vif_get_shift(&tx->sdata->vif);
|
||||
|
||||
/* Don't calculate ACKs for QoS Frames with NoAck Policy set */
|
||||
if (ieee80211_is_data_qos(hdr->frame_control) &&
|
||||
*(ieee80211_get_qos_ctl(hdr)) & IEEE80211_QOS_CTL_ACK_POLICY_NOACK)
|
||||
|
||||
Reference in New Issue
Block a user