wifi: mac80211: remove shifted rate support
We really cannot even get into this as we can't have a BSS with a 5/10 MHz (scan) width, and therefore all the code handling shifted rates cannot happen. Remove it all, since it's broken anyway, at least with MLO. Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
parent
5add321c32
commit
2400dfe23f
@ -632,7 +632,7 @@ u32 ieee80211_calc_expected_tx_airtime(struct ieee80211_hw *hw,
|
|||||||
{
|
{
|
||||||
struct ieee80211_supported_band *sband;
|
struct ieee80211_supported_band *sband;
|
||||||
struct ieee80211_chanctx_conf *conf;
|
struct ieee80211_chanctx_conf *conf;
|
||||||
int rateidx, shift = 0;
|
int rateidx;
|
||||||
bool cck, short_pream;
|
bool cck, short_pream;
|
||||||
u32 basic_rates;
|
u32 basic_rates;
|
||||||
u8 band = 0;
|
u8 band = 0;
|
||||||
@ -641,10 +641,8 @@ u32 ieee80211_calc_expected_tx_airtime(struct ieee80211_hw *hw,
|
|||||||
len += 38; /* Ethernet header length */
|
len += 38; /* Ethernet header length */
|
||||||
|
|
||||||
conf = rcu_dereference(vif->bss_conf.chanctx_conf);
|
conf = rcu_dereference(vif->bss_conf.chanctx_conf);
|
||||||
if (conf) {
|
if (conf)
|
||||||
band = conf->def.chan->band;
|
band = conf->def.chan->band;
|
||||||
shift = ieee80211_chandef_get_shift(&conf->def);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pubsta) {
|
if (pubsta) {
|
||||||
struct sta_info *sta = container_of(pubsta, struct sta_info,
|
struct sta_info *sta = container_of(pubsta, struct sta_info,
|
||||||
@ -704,7 +702,7 @@ u32 ieee80211_calc_expected_tx_airtime(struct ieee80211_hw *hw,
|
|||||||
short_pream = vif->bss_conf.use_short_preamble;
|
short_pream = vif->bss_conf.use_short_preamble;
|
||||||
|
|
||||||
rateidx = basic_rates ? ffs(basic_rates) - 1 : 0;
|
rateidx = basic_rates ? ffs(basic_rates) - 1 : 0;
|
||||||
rate = sband->bitrates[rateidx].bitrate << shift;
|
rate = sband->bitrates[rateidx].bitrate;
|
||||||
cck = sband->bitrates[rateidx].flags & IEEE80211_RATE_MANDATORY_B;
|
cck = sband->bitrates[rateidx].flags & IEEE80211_RATE_MANDATORY_B;
|
||||||
|
|
||||||
return ieee80211_calc_legacy_rate_duration(rate, short_pream, cck, len);
|
return ieee80211_calc_legacy_rate_duration(rate, short_pream, cck, len);
|
||||||
|
@ -810,15 +810,11 @@ void sta_set_rate_info_tx(struct sta_info *sta,
|
|||||||
rinfo->nss = ieee80211_rate_get_vht_nss(rate);
|
rinfo->nss = ieee80211_rate_get_vht_nss(rate);
|
||||||
} else {
|
} else {
|
||||||
struct ieee80211_supported_band *sband;
|
struct ieee80211_supported_band *sband;
|
||||||
int shift = ieee80211_vif_get_shift(&sta->sdata->vif);
|
|
||||||
u16 brate;
|
|
||||||
|
|
||||||
sband = ieee80211_get_sband(sta->sdata);
|
sband = ieee80211_get_sband(sta->sdata);
|
||||||
WARN_ON_ONCE(sband && !sband->bitrates);
|
WARN_ON_ONCE(sband && !sband->bitrates);
|
||||||
if (sband && sband->bitrates) {
|
if (sband && sband->bitrates)
|
||||||
brate = sband->bitrates[rate->idx].bitrate;
|
rinfo->legacy = sband->bitrates[rate->idx].bitrate;
|
||||||
rinfo->legacy = DIV_ROUND_UP(brate, 1 << shift);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (rate->flags & IEEE80211_TX_RC_40_MHZ_WIDTH)
|
if (rate->flags & IEEE80211_TX_RC_40_MHZ_WIDTH)
|
||||||
rinfo->bw = RATE_INFO_BW_40;
|
rinfo->bw = RATE_INFO_BW_40;
|
||||||
|
@ -51,7 +51,6 @@ ieee80211_ibss_build_presp(struct ieee80211_sub_if_data *sdata,
|
|||||||
u32 rate_flags, rates = 0, rates_added = 0;
|
u32 rate_flags, rates = 0, rates_added = 0;
|
||||||
struct beacon_data *presp;
|
struct beacon_data *presp;
|
||||||
int frame_len;
|
int frame_len;
|
||||||
int shift;
|
|
||||||
|
|
||||||
/* Build IBSS probe response */
|
/* Build IBSS probe response */
|
||||||
frame_len = sizeof(struct ieee80211_hdr_3addr) +
|
frame_len = sizeof(struct ieee80211_hdr_3addr) +
|
||||||
@ -92,7 +91,6 @@ ieee80211_ibss_build_presp(struct ieee80211_sub_if_data *sdata,
|
|||||||
|
|
||||||
sband = local->hw.wiphy->bands[chandef->chan->band];
|
sband = local->hw.wiphy->bands[chandef->chan->band];
|
||||||
rate_flags = ieee80211_chandef_rate_flags(chandef);
|
rate_flags = ieee80211_chandef_rate_flags(chandef);
|
||||||
shift = ieee80211_chandef_get_shift(chandef);
|
|
||||||
rates_n = 0;
|
rates_n = 0;
|
||||||
if (have_higher_than_11mbit)
|
if (have_higher_than_11mbit)
|
||||||
*have_higher_than_11mbit = false;
|
*have_higher_than_11mbit = false;
|
||||||
@ -111,8 +109,7 @@ ieee80211_ibss_build_presp(struct ieee80211_sub_if_data *sdata,
|
|||||||
*pos++ = WLAN_EID_SUPP_RATES;
|
*pos++ = WLAN_EID_SUPP_RATES;
|
||||||
*pos++ = min_t(int, 8, rates_n);
|
*pos++ = min_t(int, 8, rates_n);
|
||||||
for (ri = 0; ri < sband->n_bitrates; ri++) {
|
for (ri = 0; ri < sband->n_bitrates; ri++) {
|
||||||
int rate = DIV_ROUND_UP(sband->bitrates[ri].bitrate,
|
int rate = DIV_ROUND_UP(sband->bitrates[ri].bitrate, 5);
|
||||||
5 * (1 << shift));
|
|
||||||
u8 basic = 0;
|
u8 basic = 0;
|
||||||
if (!(rates & BIT(ri)))
|
if (!(rates & BIT(ri)))
|
||||||
continue;
|
continue;
|
||||||
@ -155,8 +152,7 @@ ieee80211_ibss_build_presp(struct ieee80211_sub_if_data *sdata,
|
|||||||
*pos++ = WLAN_EID_EXT_SUPP_RATES;
|
*pos++ = WLAN_EID_EXT_SUPP_RATES;
|
||||||
*pos++ = rates_n - 8;
|
*pos++ = rates_n - 8;
|
||||||
for (; ri < sband->n_bitrates; ri++) {
|
for (; ri < sband->n_bitrates; ri++) {
|
||||||
int rate = DIV_ROUND_UP(sband->bitrates[ri].bitrate,
|
int rate = DIV_ROUND_UP(sband->bitrates[ri].bitrate, 5);
|
||||||
5 * (1 << shift));
|
|
||||||
u8 basic = 0;
|
u8 basic = 0;
|
||||||
if (!(rates & BIT(ri)))
|
if (!(rates & BIT(ri)))
|
||||||
continue;
|
continue;
|
||||||
@ -399,7 +395,6 @@ static void ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata,
|
|||||||
enum nl80211_channel_type chan_type;
|
enum nl80211_channel_type chan_type;
|
||||||
u64 tsf;
|
u64 tsf;
|
||||||
u32 rate_flags;
|
u32 rate_flags;
|
||||||
int shift;
|
|
||||||
|
|
||||||
lockdep_assert_wiphy(sdata->local->hw.wiphy);
|
lockdep_assert_wiphy(sdata->local->hw.wiphy);
|
||||||
|
|
||||||
@ -434,7 +429,6 @@ static void ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata,
|
|||||||
|
|
||||||
sband = sdata->local->hw.wiphy->bands[cbss->channel->band];
|
sband = sdata->local->hw.wiphy->bands[cbss->channel->band];
|
||||||
rate_flags = ieee80211_chandef_rate_flags(&sdata->u.ibss.chandef);
|
rate_flags = ieee80211_chandef_rate_flags(&sdata->u.ibss.chandef);
|
||||||
shift = ieee80211_vif_get_shift(&sdata->vif);
|
|
||||||
|
|
||||||
basic_rates = 0;
|
basic_rates = 0;
|
||||||
|
|
||||||
@ -448,8 +442,7 @@ static void ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata,
|
|||||||
!= rate_flags)
|
!= rate_flags)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
brate = DIV_ROUND_UP(sband->bitrates[j].bitrate,
|
brate = DIV_ROUND_UP(sband->bitrates[j].bitrate, 5);
|
||||||
5 * (1 << shift));
|
|
||||||
if (brate == rate) {
|
if (brate == rate) {
|
||||||
if (is_basic)
|
if (is_basic)
|
||||||
basic_rates |= BIT(j);
|
basic_rates |= BIT(j);
|
||||||
|
@ -1141,40 +1141,6 @@ struct ieee80211_sub_if_data *vif_to_sdata(struct ieee80211_vif *p)
|
|||||||
#define sdata_dereference(p, sdata) \
|
#define sdata_dereference(p, sdata) \
|
||||||
wiphy_dereference(sdata->local->hw.wiphy, p)
|
wiphy_dereference(sdata->local->hw.wiphy, p)
|
||||||
|
|
||||||
static inline int
|
|
||||||
ieee80211_chanwidth_get_shift(enum nl80211_chan_width width)
|
|
||||||
{
|
|
||||||
switch (width) {
|
|
||||||
case NL80211_CHAN_WIDTH_5:
|
|
||||||
return 2;
|
|
||||||
case NL80211_CHAN_WIDTH_10:
|
|
||||||
return 1;
|
|
||||||
default:
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int
|
|
||||||
ieee80211_chandef_get_shift(struct cfg80211_chan_def *chandef)
|
|
||||||
{
|
|
||||||
return ieee80211_chanwidth_get_shift(chandef->width);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int
|
|
||||||
ieee80211_vif_get_shift(struct ieee80211_vif *vif)
|
|
||||||
{
|
|
||||||
struct ieee80211_chanctx_conf *chanctx_conf;
|
|
||||||
int shift = 0;
|
|
||||||
|
|
||||||
rcu_read_lock();
|
|
||||||
chanctx_conf = rcu_dereference(vif->bss_conf.chanctx_conf);
|
|
||||||
if (chanctx_conf)
|
|
||||||
shift = ieee80211_chandef_get_shift(&chanctx_conf->def);
|
|
||||||
rcu_read_unlock();
|
|
||||||
|
|
||||||
return shift;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int
|
static inline int
|
||||||
ieee80211_get_mbssid_beacon_len(struct cfg80211_mbssid_elems *elems,
|
ieee80211_get_mbssid_beacon_len(struct cfg80211_mbssid_elems *elems,
|
||||||
struct cfg80211_rnr_elems *rnr_elems,
|
struct cfg80211_rnr_elems *rnr_elems,
|
||||||
@ -2041,7 +2007,7 @@ struct sk_buff *
|
|||||||
ieee80211_build_data_template(struct ieee80211_sub_if_data *sdata,
|
ieee80211_build_data_template(struct ieee80211_sub_if_data *sdata,
|
||||||
struct sk_buff *skb, u32 info_flags);
|
struct sk_buff *skb, u32 info_flags);
|
||||||
void ieee80211_tx_monitor(struct ieee80211_local *local, struct sk_buff *skb,
|
void ieee80211_tx_monitor(struct ieee80211_local *local, struct sk_buff *skb,
|
||||||
int retry_count, int shift, bool send_to_cooked,
|
int retry_count, bool send_to_cooked,
|
||||||
struct ieee80211_tx_status *status);
|
struct ieee80211_tx_status *status);
|
||||||
|
|
||||||
void ieee80211_check_fast_xmit(struct sta_info *sta);
|
void ieee80211_check_fast_xmit(struct sta_info *sta);
|
||||||
@ -2214,8 +2180,7 @@ static inline int __ieee80211_resume(struct ieee80211_hw *hw)
|
|||||||
/* utility functions/constants */
|
/* utility functions/constants */
|
||||||
extern const void *const mac80211_wiphy_privid; /* for wiphy privid */
|
extern const void *const mac80211_wiphy_privid; /* for wiphy privid */
|
||||||
int ieee80211_frame_duration(enum nl80211_band band, size_t len,
|
int ieee80211_frame_duration(enum nl80211_band band, size_t len,
|
||||||
int rate, int erp, int short_preamble,
|
int rate, int erp, int short_preamble);
|
||||||
int shift);
|
|
||||||
void ieee80211_regulatory_limit_wmm_params(struct ieee80211_sub_if_data *sdata,
|
void ieee80211_regulatory_limit_wmm_params(struct ieee80211_sub_if_data *sdata,
|
||||||
struct ieee80211_tx_queue_params *qparam,
|
struct ieee80211_tx_queue_params *qparam,
|
||||||
int ac);
|
int ac);
|
||||||
|
@ -829,7 +829,6 @@ static void ieee80211_assoc_add_rates(struct sk_buff *skb,
|
|||||||
struct ieee80211_supported_band *sband,
|
struct ieee80211_supported_band *sband,
|
||||||
struct ieee80211_mgd_assoc_data *assoc_data)
|
struct ieee80211_mgd_assoc_data *assoc_data)
|
||||||
{
|
{
|
||||||
unsigned int shift = ieee80211_chanwidth_get_shift(width);
|
|
||||||
unsigned int rates_len, supp_rates_len;
|
unsigned int rates_len, supp_rates_len;
|
||||||
u32 rates = 0;
|
u32 rates = 0;
|
||||||
int i, count;
|
int i, count;
|
||||||
@ -868,8 +867,7 @@ static void ieee80211_assoc_add_rates(struct sk_buff *skb,
|
|||||||
count = 0;
|
count = 0;
|
||||||
for (i = 0; i < sband->n_bitrates; i++) {
|
for (i = 0; i < sband->n_bitrates; i++) {
|
||||||
if (BIT(i) & rates) {
|
if (BIT(i) & rates) {
|
||||||
int rate = DIV_ROUND_UP(sband->bitrates[i].bitrate,
|
int rate = DIV_ROUND_UP(sband->bitrates[i].bitrate, 5);
|
||||||
5 * (1 << shift));
|
|
||||||
*pos++ = (u8)rate;
|
*pos++ = (u8)rate;
|
||||||
if (++count == 8)
|
if (++count == 8)
|
||||||
break;
|
break;
|
||||||
@ -885,8 +883,7 @@ static void ieee80211_assoc_add_rates(struct sk_buff *skb,
|
|||||||
if (BIT(i) & rates) {
|
if (BIT(i) & rates) {
|
||||||
int rate;
|
int rate;
|
||||||
|
|
||||||
rate = DIV_ROUND_UP(sband->bitrates[i].bitrate,
|
rate = DIV_ROUND_UP(sband->bitrates[i].bitrate, 5);
|
||||||
5 * (1 << shift));
|
|
||||||
*pos++ = (u8)rate;
|
*pos++ = (u8)rate;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -3857,8 +3854,7 @@ static void ieee80211_get_rates(struct ieee80211_supported_band *sband,
|
|||||||
u8 *supp_rates, unsigned int supp_rates_len,
|
u8 *supp_rates, unsigned int supp_rates_len,
|
||||||
u32 *rates, u32 *basic_rates,
|
u32 *rates, u32 *basic_rates,
|
||||||
bool *have_higher_than_11mbit,
|
bool *have_higher_than_11mbit,
|
||||||
int *min_rate, int *min_rate_index,
|
int *min_rate, int *min_rate_index)
|
||||||
int shift)
|
|
||||||
{
|
{
|
||||||
int i, j;
|
int i, j;
|
||||||
|
|
||||||
@ -3866,7 +3862,7 @@ static void ieee80211_get_rates(struct ieee80211_supported_band *sband,
|
|||||||
int rate = supp_rates[i] & 0x7f;
|
int rate = supp_rates[i] & 0x7f;
|
||||||
bool is_basic = !!(supp_rates[i] & 0x80);
|
bool is_basic = !!(supp_rates[i] & 0x80);
|
||||||
|
|
||||||
if ((rate * 5 * (1 << shift)) > 110)
|
if ((rate * 5) > 110)
|
||||||
*have_higher_than_11mbit = true;
|
*have_higher_than_11mbit = true;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -3890,7 +3886,7 @@ static void ieee80211_get_rates(struct ieee80211_supported_band *sband,
|
|||||||
|
|
||||||
br = &sband->bitrates[j];
|
br = &sband->bitrates[j];
|
||||||
|
|
||||||
brate = DIV_ROUND_UP(br->bitrate, (1 << shift) * 5);
|
brate = DIV_ROUND_UP(br->bitrate, 5);
|
||||||
if (brate == rate) {
|
if (brate == rate) {
|
||||||
*rates |= BIT(j);
|
*rates |= BIT(j);
|
||||||
if (is_basic)
|
if (is_basic)
|
||||||
@ -4334,8 +4330,6 @@ static int ieee80211_mgd_setup_link_sta(struct ieee80211_link_data *link,
|
|||||||
u32 rates = 0, basic_rates = 0;
|
u32 rates = 0, basic_rates = 0;
|
||||||
bool have_higher_than_11mbit = false;
|
bool have_higher_than_11mbit = false;
|
||||||
int min_rate = INT_MAX, min_rate_index = -1;
|
int min_rate = INT_MAX, min_rate_index = -1;
|
||||||
/* this is clearly wrong for MLO but we'll just remove it later */
|
|
||||||
int shift = ieee80211_vif_get_shift(&sdata->vif);
|
|
||||||
struct ieee80211_supported_band *sband;
|
struct ieee80211_supported_band *sband;
|
||||||
|
|
||||||
memcpy(link_sta->addr, cbss->bssid, ETH_ALEN);
|
memcpy(link_sta->addr, cbss->bssid, ETH_ALEN);
|
||||||
@ -4351,7 +4345,7 @@ static int ieee80211_mgd_setup_link_sta(struct ieee80211_link_data *link,
|
|||||||
|
|
||||||
ieee80211_get_rates(sband, bss->supp_rates, bss->supp_rates_len,
|
ieee80211_get_rates(sband, bss->supp_rates, bss->supp_rates_len,
|
||||||
&rates, &basic_rates, &have_higher_than_11mbit,
|
&rates, &basic_rates, &have_higher_than_11mbit,
|
||||||
&min_rate, &min_rate_index, shift);
|
&min_rate, &min_rate_index);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This used to be a workaround for basic rates missing
|
* This used to be a workaround for basic rates missing
|
||||||
|
@ -1725,16 +1725,15 @@ minstrel_ht_update_caps(void *priv, struct ieee80211_supported_band *sband,
|
|||||||
mi->band = sband->band;
|
mi->band = sband->band;
|
||||||
mi->last_stats_update = jiffies;
|
mi->last_stats_update = jiffies;
|
||||||
|
|
||||||
ack_dur = ieee80211_frame_duration(sband->band, 10, 60, 1, 1, 0);
|
ack_dur = ieee80211_frame_duration(sband->band, 10, 60, 1, 1);
|
||||||
mi->overhead = ieee80211_frame_duration(sband->band, 0, 60, 1, 1, 0);
|
mi->overhead = ieee80211_frame_duration(sband->band, 0, 60, 1, 1);
|
||||||
mi->overhead += ack_dur;
|
mi->overhead += ack_dur;
|
||||||
mi->overhead_rtscts = mi->overhead + 2 * ack_dur;
|
mi->overhead_rtscts = mi->overhead + 2 * ack_dur;
|
||||||
|
|
||||||
ctl_rate = &sband->bitrates[rate_lowest_index(sband, sta)];
|
ctl_rate = &sband->bitrates[rate_lowest_index(sband, sta)];
|
||||||
erp = ctl_rate->flags & IEEE80211_RATE_ERP_G;
|
erp = ctl_rate->flags & IEEE80211_RATE_ERP_G;
|
||||||
ack_dur = ieee80211_frame_duration(sband->band, 10,
|
ack_dur = ieee80211_frame_duration(sband->band, 10,
|
||||||
ctl_rate->bitrate, erp, 1,
|
ctl_rate->bitrate, erp, 1);
|
||||||
ieee80211_chandef_get_shift(chandef));
|
|
||||||
mi->overhead_legacy = ack_dur;
|
mi->overhead_legacy = ack_dur;
|
||||||
mi->overhead_legacy_rtscts = mi->overhead_legacy + 2 * ack_dur;
|
mi->overhead_legacy_rtscts = mi->overhead_legacy + 2 * ack_dur;
|
||||||
|
|
||||||
|
@ -256,7 +256,7 @@ static int ieee80211_tx_radiotap_len(struct ieee80211_tx_info *info,
|
|||||||
static void
|
static void
|
||||||
ieee80211_add_tx_radiotap_header(struct ieee80211_local *local,
|
ieee80211_add_tx_radiotap_header(struct ieee80211_local *local,
|
||||||
struct sk_buff *skb, int retry_count,
|
struct sk_buff *skb, int retry_count,
|
||||||
int rtap_len, int shift,
|
int rtap_len,
|
||||||
struct ieee80211_tx_status *status)
|
struct ieee80211_tx_status *status)
|
||||||
{
|
{
|
||||||
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
|
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
|
||||||
@ -307,7 +307,7 @@ ieee80211_add_tx_radiotap_header(struct ieee80211_local *local,
|
|||||||
|
|
||||||
if (legacy_rate) {
|
if (legacy_rate) {
|
||||||
rthdr->it_present |= cpu_to_le32(BIT(IEEE80211_RADIOTAP_RATE));
|
rthdr->it_present |= cpu_to_le32(BIT(IEEE80211_RADIOTAP_RATE));
|
||||||
*pos = DIV_ROUND_UP(legacy_rate, 5 * (1 << shift));
|
*pos = DIV_ROUND_UP(legacy_rate, 5);
|
||||||
/* padding for tx flags */
|
/* padding for tx flags */
|
||||||
pos += 2;
|
pos += 2;
|
||||||
}
|
}
|
||||||
@ -878,7 +878,7 @@ static int ieee80211_tx_get_rates(struct ieee80211_hw *hw,
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ieee80211_tx_monitor(struct ieee80211_local *local, struct sk_buff *skb,
|
void ieee80211_tx_monitor(struct ieee80211_local *local, struct sk_buff *skb,
|
||||||
int retry_count, int shift, bool send_to_cooked,
|
int retry_count, bool send_to_cooked,
|
||||||
struct ieee80211_tx_status *status)
|
struct ieee80211_tx_status *status)
|
||||||
{
|
{
|
||||||
struct sk_buff *skb2;
|
struct sk_buff *skb2;
|
||||||
@ -895,7 +895,7 @@ void ieee80211_tx_monitor(struct ieee80211_local *local, struct sk_buff *skb,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
ieee80211_add_tx_radiotap_header(local, skb, retry_count,
|
ieee80211_add_tx_radiotap_header(local, skb, retry_count,
|
||||||
rtap_len, shift, status);
|
rtap_len, status);
|
||||||
|
|
||||||
/* XXX: is this sufficient for BPF? */
|
/* XXX: is this sufficient for BPF? */
|
||||||
skb_reset_mac_header(skb);
|
skb_reset_mac_header(skb);
|
||||||
@ -948,14 +948,12 @@ static void __ieee80211_tx_status(struct ieee80211_hw *hw,
|
|||||||
bool acked;
|
bool acked;
|
||||||
bool noack_success;
|
bool noack_success;
|
||||||
struct ieee80211_bar *bar;
|
struct ieee80211_bar *bar;
|
||||||
int shift = 0;
|
|
||||||
int tid = IEEE80211_NUM_TIDS;
|
int tid = IEEE80211_NUM_TIDS;
|
||||||
|
|
||||||
fc = hdr->frame_control;
|
fc = hdr->frame_control;
|
||||||
|
|
||||||
if (status->sta) {
|
if (status->sta) {
|
||||||
sta = container_of(status->sta, struct sta_info, sta);
|
sta = container_of(status->sta, struct sta_info, sta);
|
||||||
shift = ieee80211_vif_get_shift(&sta->sdata->vif);
|
|
||||||
|
|
||||||
if (info->flags & IEEE80211_TX_STATUS_EOSP)
|
if (info->flags & IEEE80211_TX_STATUS_EOSP)
|
||||||
clear_sta_flag(sta, WLAN_STA_SP);
|
clear_sta_flag(sta, WLAN_STA_SP);
|
||||||
@ -1093,7 +1091,7 @@ static void __ieee80211_tx_status(struct ieee80211_hw *hw,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* send to monitor interfaces */
|
/* send to monitor interfaces */
|
||||||
ieee80211_tx_monitor(local, skb, retry_count, shift,
|
ieee80211_tx_monitor(local, skb, retry_count,
|
||||||
send_to_cooked, status);
|
send_to_cooked, status);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -43,7 +43,7 @@ static __le16 ieee80211_duration(struct ieee80211_tx_data *tx,
|
|||||||
struct sk_buff *skb, int group_addr,
|
struct sk_buff *skb, int group_addr,
|
||||||
int next_frag_len)
|
int next_frag_len)
|
||||||
{
|
{
|
||||||
int rate, mrate, erp, dur, i, shift = 0;
|
int rate, mrate, erp, dur, i;
|
||||||
struct ieee80211_rate *txrate;
|
struct ieee80211_rate *txrate;
|
||||||
struct ieee80211_local *local = tx->local;
|
struct ieee80211_local *local = tx->local;
|
||||||
struct ieee80211_supported_band *sband;
|
struct ieee80211_supported_band *sband;
|
||||||
@ -58,10 +58,8 @@ static __le16 ieee80211_duration(struct ieee80211_tx_data *tx,
|
|||||||
|
|
||||||
rcu_read_lock();
|
rcu_read_lock();
|
||||||
chanctx_conf = rcu_dereference(tx->sdata->vif.bss_conf.chanctx_conf);
|
chanctx_conf = rcu_dereference(tx->sdata->vif.bss_conf.chanctx_conf);
|
||||||
if (chanctx_conf) {
|
if (chanctx_conf)
|
||||||
shift = ieee80211_chandef_get_shift(&chanctx_conf->def);
|
|
||||||
rate_flags = ieee80211_chandef_rate_flags(&chanctx_conf->def);
|
rate_flags = ieee80211_chandef_rate_flags(&chanctx_conf->def);
|
||||||
}
|
|
||||||
rcu_read_unlock();
|
rcu_read_unlock();
|
||||||
|
|
||||||
/* uh huh? */
|
/* uh huh? */
|
||||||
@ -143,7 +141,7 @@ static __le16 ieee80211_duration(struct ieee80211_tx_data *tx,
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (tx->sdata->vif.bss_conf.basic_rates & BIT(i))
|
if (tx->sdata->vif.bss_conf.basic_rates & BIT(i))
|
||||||
rate = DIV_ROUND_UP(r->bitrate, 1 << shift);
|
rate = r->bitrate;
|
||||||
|
|
||||||
switch (sband->band) {
|
switch (sband->band) {
|
||||||
case NL80211_BAND_2GHZ:
|
case NL80211_BAND_2GHZ:
|
||||||
@ -173,7 +171,7 @@ static __le16 ieee80211_duration(struct ieee80211_tx_data *tx,
|
|||||||
if (rate == -1) {
|
if (rate == -1) {
|
||||||
/* No matching basic rate found; use highest suitable mandatory
|
/* No matching basic rate found; use highest suitable mandatory
|
||||||
* PHY rate */
|
* PHY rate */
|
||||||
rate = DIV_ROUND_UP(mrate, 1 << shift);
|
rate = mrate;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Don't calculate ACKs for QoS Frames with NoAck Policy set */
|
/* Don't calculate ACKs for QoS Frames with NoAck Policy set */
|
||||||
@ -185,8 +183,7 @@ static __le16 ieee80211_duration(struct ieee80211_tx_data *tx,
|
|||||||
* (10 bytes + 4-byte FCS = 112 bits) plus SIFS; rounded up
|
* (10 bytes + 4-byte FCS = 112 bits) plus SIFS; rounded up
|
||||||
* to closest integer */
|
* to closest integer */
|
||||||
dur = ieee80211_frame_duration(sband->band, 10, rate, erp,
|
dur = ieee80211_frame_duration(sband->band, 10, rate, erp,
|
||||||
tx->sdata->vif.bss_conf.use_short_preamble,
|
tx->sdata->vif.bss_conf.use_short_preamble);
|
||||||
shift);
|
|
||||||
|
|
||||||
if (next_frag_len) {
|
if (next_frag_len) {
|
||||||
/* Frame is fragmented: duration increases with time needed to
|
/* Frame is fragmented: duration increases with time needed to
|
||||||
@ -195,8 +192,7 @@ static __le16 ieee80211_duration(struct ieee80211_tx_data *tx,
|
|||||||
/* next fragment */
|
/* next fragment */
|
||||||
dur += ieee80211_frame_duration(sband->band, next_frag_len,
|
dur += ieee80211_frame_duration(sband->band, next_frag_len,
|
||||||
txrate->bitrate, erp,
|
txrate->bitrate, erp,
|
||||||
tx->sdata->vif.bss_conf.use_short_preamble,
|
tx->sdata->vif.bss_conf.use_short_preamble);
|
||||||
shift);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return cpu_to_le16(dur);
|
return cpu_to_le16(dur);
|
||||||
@ -5556,7 +5552,6 @@ struct sk_buff *ieee80211_beacon_get_tim(struct ieee80211_hw *hw,
|
|||||||
IEEE80211_INCLUDE_ALL_MBSSID_ELEMS,
|
IEEE80211_INCLUDE_ALL_MBSSID_ELEMS,
|
||||||
NULL);
|
NULL);
|
||||||
struct sk_buff *copy;
|
struct sk_buff *copy;
|
||||||
int shift;
|
|
||||||
|
|
||||||
if (!bcn)
|
if (!bcn)
|
||||||
return bcn;
|
return bcn;
|
||||||
@ -5576,8 +5571,7 @@ struct sk_buff *ieee80211_beacon_get_tim(struct ieee80211_hw *hw,
|
|||||||
if (!copy)
|
if (!copy)
|
||||||
return bcn;
|
return bcn;
|
||||||
|
|
||||||
shift = ieee80211_vif_get_shift(vif);
|
ieee80211_tx_monitor(hw_to_local(hw), copy, 1, false, NULL);
|
||||||
ieee80211_tx_monitor(hw_to_local(hw), copy, 1, shift, false, NULL);
|
|
||||||
|
|
||||||
return bcn;
|
return bcn;
|
||||||
}
|
}
|
||||||
|
@ -110,8 +110,7 @@ void ieee80211_tx_set_protected(struct ieee80211_tx_data *tx)
|
|||||||
}
|
}
|
||||||
|
|
||||||
int ieee80211_frame_duration(enum nl80211_band band, size_t len,
|
int ieee80211_frame_duration(enum nl80211_band band, size_t len,
|
||||||
int rate, int erp, int short_preamble,
|
int rate, int erp, int short_preamble)
|
||||||
int shift)
|
|
||||||
{
|
{
|
||||||
int dur;
|
int dur;
|
||||||
|
|
||||||
@ -122,9 +121,6 @@ int ieee80211_frame_duration(enum nl80211_band band, size_t len,
|
|||||||
*
|
*
|
||||||
* rate is in 100 kbps, so divident is multiplied by 10 in the
|
* rate is in 100 kbps, so divident is multiplied by 10 in the
|
||||||
* DIV_ROUND_UP() operations.
|
* DIV_ROUND_UP() operations.
|
||||||
*
|
|
||||||
* shift may be 2 for 5 MHz channels or 1 for 10 MHz channels, and
|
|
||||||
* is assumed to be 0 otherwise.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (band == NL80211_BAND_5GHZ || erp) {
|
if (band == NL80211_BAND_5GHZ || erp) {
|
||||||
@ -145,12 +141,6 @@ int ieee80211_frame_duration(enum nl80211_band band, size_t len,
|
|||||||
dur += 16; /* IEEE 802.11-2012 18.3.2.4: T_PREAMBLE = 16 usec */
|
dur += 16; /* IEEE 802.11-2012 18.3.2.4: T_PREAMBLE = 16 usec */
|
||||||
dur += 4; /* IEEE 802.11-2012 18.3.2.4: T_SIGNAL = 4 usec */
|
dur += 4; /* IEEE 802.11-2012 18.3.2.4: T_SIGNAL = 4 usec */
|
||||||
|
|
||||||
/* IEEE 802.11-2012 18.3.2.4: all values above are:
|
|
||||||
* * times 4 for 5 MHz
|
|
||||||
* * times 2 for 10 MHz
|
|
||||||
*/
|
|
||||||
dur *= 1 << shift;
|
|
||||||
|
|
||||||
/* rates should already consider the channel bandwidth,
|
/* rates should already consider the channel bandwidth,
|
||||||
* don't apply divisor again.
|
* don't apply divisor again.
|
||||||
*/
|
*/
|
||||||
@ -185,7 +175,7 @@ __le16 ieee80211_generic_frame_duration(struct ieee80211_hw *hw,
|
|||||||
{
|
{
|
||||||
struct ieee80211_sub_if_data *sdata;
|
struct ieee80211_sub_if_data *sdata;
|
||||||
u16 dur;
|
u16 dur;
|
||||||
int erp, shift = 0;
|
int erp;
|
||||||
bool short_preamble = false;
|
bool short_preamble = false;
|
||||||
|
|
||||||
erp = 0;
|
erp = 0;
|
||||||
@ -194,11 +184,10 @@ __le16 ieee80211_generic_frame_duration(struct ieee80211_hw *hw,
|
|||||||
short_preamble = sdata->vif.bss_conf.use_short_preamble;
|
short_preamble = sdata->vif.bss_conf.use_short_preamble;
|
||||||
if (sdata->deflink.operating_11g_mode)
|
if (sdata->deflink.operating_11g_mode)
|
||||||
erp = rate->flags & IEEE80211_RATE_ERP_G;
|
erp = rate->flags & IEEE80211_RATE_ERP_G;
|
||||||
shift = ieee80211_vif_get_shift(vif);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
dur = ieee80211_frame_duration(band, frame_len, rate->bitrate, erp,
|
dur = ieee80211_frame_duration(band, frame_len, rate->bitrate, erp,
|
||||||
short_preamble, shift);
|
short_preamble);
|
||||||
|
|
||||||
return cpu_to_le16(dur);
|
return cpu_to_le16(dur);
|
||||||
}
|
}
|
||||||
@ -212,7 +201,7 @@ __le16 ieee80211_rts_duration(struct ieee80211_hw *hw,
|
|||||||
struct ieee80211_rate *rate;
|
struct ieee80211_rate *rate;
|
||||||
struct ieee80211_sub_if_data *sdata;
|
struct ieee80211_sub_if_data *sdata;
|
||||||
bool short_preamble;
|
bool short_preamble;
|
||||||
int erp, shift = 0, bitrate;
|
int erp, bitrate;
|
||||||
u16 dur;
|
u16 dur;
|
||||||
struct ieee80211_supported_band *sband;
|
struct ieee80211_supported_band *sband;
|
||||||
|
|
||||||
@ -228,20 +217,19 @@ __le16 ieee80211_rts_duration(struct ieee80211_hw *hw,
|
|||||||
short_preamble = sdata->vif.bss_conf.use_short_preamble;
|
short_preamble = sdata->vif.bss_conf.use_short_preamble;
|
||||||
if (sdata->deflink.operating_11g_mode)
|
if (sdata->deflink.operating_11g_mode)
|
||||||
erp = rate->flags & IEEE80211_RATE_ERP_G;
|
erp = rate->flags & IEEE80211_RATE_ERP_G;
|
||||||
shift = ieee80211_vif_get_shift(vif);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bitrate = DIV_ROUND_UP(rate->bitrate, 1 << shift);
|
bitrate = rate->bitrate;
|
||||||
|
|
||||||
/* CTS duration */
|
/* CTS duration */
|
||||||
dur = ieee80211_frame_duration(sband->band, 10, bitrate,
|
dur = ieee80211_frame_duration(sband->band, 10, bitrate,
|
||||||
erp, short_preamble, shift);
|
erp, short_preamble);
|
||||||
/* Data frame duration */
|
/* Data frame duration */
|
||||||
dur += ieee80211_frame_duration(sband->band, frame_len, bitrate,
|
dur += ieee80211_frame_duration(sband->band, frame_len, bitrate,
|
||||||
erp, short_preamble, shift);
|
erp, short_preamble);
|
||||||
/* ACK duration */
|
/* ACK duration */
|
||||||
dur += ieee80211_frame_duration(sband->band, 10, bitrate,
|
dur += ieee80211_frame_duration(sband->band, 10, bitrate,
|
||||||
erp, short_preamble, shift);
|
erp, short_preamble);
|
||||||
|
|
||||||
return cpu_to_le16(dur);
|
return cpu_to_le16(dur);
|
||||||
}
|
}
|
||||||
@ -256,7 +244,7 @@ __le16 ieee80211_ctstoself_duration(struct ieee80211_hw *hw,
|
|||||||
struct ieee80211_rate *rate;
|
struct ieee80211_rate *rate;
|
||||||
struct ieee80211_sub_if_data *sdata;
|
struct ieee80211_sub_if_data *sdata;
|
||||||
bool short_preamble;
|
bool short_preamble;
|
||||||
int erp, shift = 0, bitrate;
|
int erp, bitrate;
|
||||||
u16 dur;
|
u16 dur;
|
||||||
struct ieee80211_supported_band *sband;
|
struct ieee80211_supported_band *sband;
|
||||||
|
|
||||||
@ -271,18 +259,17 @@ __le16 ieee80211_ctstoself_duration(struct ieee80211_hw *hw,
|
|||||||
short_preamble = sdata->vif.bss_conf.use_short_preamble;
|
short_preamble = sdata->vif.bss_conf.use_short_preamble;
|
||||||
if (sdata->deflink.operating_11g_mode)
|
if (sdata->deflink.operating_11g_mode)
|
||||||
erp = rate->flags & IEEE80211_RATE_ERP_G;
|
erp = rate->flags & IEEE80211_RATE_ERP_G;
|
||||||
shift = ieee80211_vif_get_shift(vif);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bitrate = DIV_ROUND_UP(rate->bitrate, 1 << shift);
|
bitrate = rate->bitrate;
|
||||||
|
|
||||||
/* Data frame duration */
|
/* Data frame duration */
|
||||||
dur = ieee80211_frame_duration(sband->band, frame_len, bitrate,
|
dur = ieee80211_frame_duration(sband->band, frame_len, bitrate,
|
||||||
erp, short_preamble, shift);
|
erp, short_preamble);
|
||||||
if (!(frame_txctl->flags & IEEE80211_TX_CTL_NO_ACK)) {
|
if (!(frame_txctl->flags & IEEE80211_TX_CTL_NO_ACK)) {
|
||||||
/* ACK duration */
|
/* ACK duration */
|
||||||
dur += ieee80211_frame_duration(sband->band, 10, bitrate,
|
dur += ieee80211_frame_duration(sband->band, 10, bitrate,
|
||||||
erp, short_preamble, shift);
|
erp, short_preamble);
|
||||||
}
|
}
|
||||||
|
|
||||||
return cpu_to_le16(dur);
|
return cpu_to_le16(dur);
|
||||||
@ -1944,7 +1931,6 @@ static int ieee80211_build_preq_ies_band(struct ieee80211_sub_if_data *sdata,
|
|||||||
u8 rates[32];
|
u8 rates[32];
|
||||||
int num_rates;
|
int num_rates;
|
||||||
int ext_rates_len;
|
int ext_rates_len;
|
||||||
int shift;
|
|
||||||
u32 rate_flags;
|
u32 rate_flags;
|
||||||
bool have_80mhz = false;
|
bool have_80mhz = false;
|
||||||
|
|
||||||
@ -1955,7 +1941,6 @@ static int ieee80211_build_preq_ies_band(struct ieee80211_sub_if_data *sdata,
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
rate_flags = ieee80211_chandef_rate_flags(chandef);
|
rate_flags = ieee80211_chandef_rate_flags(chandef);
|
||||||
shift = ieee80211_chandef_get_shift(chandef);
|
|
||||||
|
|
||||||
/* For direct scan add S1G IE and consider its override bits */
|
/* For direct scan add S1G IE and consider its override bits */
|
||||||
if (band == NL80211_BAND_S1GHZ) {
|
if (band == NL80211_BAND_S1GHZ) {
|
||||||
@ -1973,8 +1958,7 @@ static int ieee80211_build_preq_ies_band(struct ieee80211_sub_if_data *sdata,
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
rates[num_rates++] =
|
rates[num_rates++] =
|
||||||
(u8) DIV_ROUND_UP(sband->bitrates[i].bitrate,
|
(u8) DIV_ROUND_UP(sband->bitrates[i].bitrate, 5);
|
||||||
(1 << shift) * 5);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
supp_rates_len = min_t(int, num_rates, 8);
|
supp_rates_len = min_t(int, num_rates, 8);
|
||||||
@ -2267,14 +2251,13 @@ u32 ieee80211_sta_get_rates(struct ieee80211_sub_if_data *sdata,
|
|||||||
struct ieee80211_supported_band *sband;
|
struct ieee80211_supported_band *sband;
|
||||||
size_t num_rates;
|
size_t num_rates;
|
||||||
u32 supp_rates, rate_flags;
|
u32 supp_rates, rate_flags;
|
||||||
int i, j, shift;
|
int i, j;
|
||||||
|
|
||||||
sband = sdata->local->hw.wiphy->bands[band];
|
sband = sdata->local->hw.wiphy->bands[band];
|
||||||
if (WARN_ON(!sband))
|
if (WARN_ON(!sband))
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
rate_flags = ieee80211_chandef_rate_flags(&sdata->vif.bss_conf.chandef);
|
rate_flags = ieee80211_chandef_rate_flags(&sdata->vif.bss_conf.chandef);
|
||||||
shift = ieee80211_vif_get_shift(&sdata->vif);
|
|
||||||
|
|
||||||
num_rates = sband->n_bitrates;
|
num_rates = sband->n_bitrates;
|
||||||
supp_rates = 0;
|
supp_rates = 0;
|
||||||
@ -2300,8 +2283,7 @@ u32 ieee80211_sta_get_rates(struct ieee80211_sub_if_data *sdata,
|
|||||||
!= rate_flags)
|
!= rate_flags)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
brate = DIV_ROUND_UP(sband->bitrates[j].bitrate,
|
brate = sband->bitrates[j].bitrate;
|
||||||
1 << shift);
|
|
||||||
|
|
||||||
if (brate == own_rate) {
|
if (brate == own_rate) {
|
||||||
supp_rates |= BIT(j);
|
supp_rates |= BIT(j);
|
||||||
@ -3998,7 +3980,6 @@ int ieee80211_parse_bitrates(enum nl80211_chan_width width,
|
|||||||
const u8 *srates, int srates_len, u32 *rates)
|
const u8 *srates, int srates_len, u32 *rates)
|
||||||
{
|
{
|
||||||
u32 rate_flags = ieee80211_chanwidth_rate_flags(width);
|
u32 rate_flags = ieee80211_chanwidth_rate_flags(width);
|
||||||
int shift = ieee80211_chanwidth_get_shift(width);
|
|
||||||
struct ieee80211_rate *br;
|
struct ieee80211_rate *br;
|
||||||
int brate, rate, i, j, count = 0;
|
int brate, rate, i, j, count = 0;
|
||||||
|
|
||||||
@ -4012,7 +3993,7 @@ int ieee80211_parse_bitrates(enum nl80211_chan_width width,
|
|||||||
if ((rate_flags & br->flags) != rate_flags)
|
if ((rate_flags & br->flags) != rate_flags)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
brate = DIV_ROUND_UP(br->bitrate, (1 << shift) * 5);
|
brate = DIV_ROUND_UP(br->bitrate, 5);
|
||||||
if (brate == rate) {
|
if (brate == rate) {
|
||||||
*rates |= BIT(j);
|
*rates |= BIT(j);
|
||||||
count++;
|
count++;
|
||||||
@ -4029,12 +4010,11 @@ int ieee80211_add_srates_ie(struct ieee80211_sub_if_data *sdata,
|
|||||||
{
|
{
|
||||||
struct ieee80211_local *local = sdata->local;
|
struct ieee80211_local *local = sdata->local;
|
||||||
struct ieee80211_supported_band *sband;
|
struct ieee80211_supported_band *sband;
|
||||||
int rate, shift;
|
int rate;
|
||||||
u8 i, rates, *pos;
|
u8 i, rates, *pos;
|
||||||
u32 basic_rates = sdata->vif.bss_conf.basic_rates;
|
u32 basic_rates = sdata->vif.bss_conf.basic_rates;
|
||||||
u32 rate_flags;
|
u32 rate_flags;
|
||||||
|
|
||||||
shift = ieee80211_vif_get_shift(&sdata->vif);
|
|
||||||
rate_flags = ieee80211_chandef_rate_flags(&sdata->vif.bss_conf.chandef);
|
rate_flags = ieee80211_chandef_rate_flags(&sdata->vif.bss_conf.chandef);
|
||||||
sband = local->hw.wiphy->bands[band];
|
sband = local->hw.wiphy->bands[band];
|
||||||
rates = 0;
|
rates = 0;
|
||||||
@ -4059,8 +4039,7 @@ int ieee80211_add_srates_ie(struct ieee80211_sub_if_data *sdata,
|
|||||||
|
|
||||||
if (need_basic && basic_rates & BIT(i))
|
if (need_basic && basic_rates & BIT(i))
|
||||||
basic = 0x80;
|
basic = 0x80;
|
||||||
rate = DIV_ROUND_UP(sband->bitrates[i].bitrate,
|
rate = DIV_ROUND_UP(sband->bitrates[i].bitrate, 5);
|
||||||
5 * (1 << shift));
|
|
||||||
*pos++ = basic | (u8) rate;
|
*pos++ = basic | (u8) rate;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4073,13 +4052,12 @@ int ieee80211_add_ext_srates_ie(struct ieee80211_sub_if_data *sdata,
|
|||||||
{
|
{
|
||||||
struct ieee80211_local *local = sdata->local;
|
struct ieee80211_local *local = sdata->local;
|
||||||
struct ieee80211_supported_band *sband;
|
struct ieee80211_supported_band *sband;
|
||||||
int rate, shift;
|
int rate;
|
||||||
u8 i, exrates, *pos;
|
u8 i, exrates, *pos;
|
||||||
u32 basic_rates = sdata->vif.bss_conf.basic_rates;
|
u32 basic_rates = sdata->vif.bss_conf.basic_rates;
|
||||||
u32 rate_flags;
|
u32 rate_flags;
|
||||||
|
|
||||||
rate_flags = ieee80211_chandef_rate_flags(&sdata->vif.bss_conf.chandef);
|
rate_flags = ieee80211_chandef_rate_flags(&sdata->vif.bss_conf.chandef);
|
||||||
shift = ieee80211_vif_get_shift(&sdata->vif);
|
|
||||||
|
|
||||||
sband = local->hw.wiphy->bands[band];
|
sband = local->hw.wiphy->bands[band];
|
||||||
exrates = 0;
|
exrates = 0;
|
||||||
@ -4108,8 +4086,7 @@ int ieee80211_add_ext_srates_ie(struct ieee80211_sub_if_data *sdata,
|
|||||||
continue;
|
continue;
|
||||||
if (need_basic && basic_rates & BIT(i))
|
if (need_basic && basic_rates & BIT(i))
|
||||||
basic = 0x80;
|
basic = 0x80;
|
||||||
rate = DIV_ROUND_UP(sband->bitrates[i].bitrate,
|
rate = DIV_ROUND_UP(sband->bitrates[i].bitrate, 5);
|
||||||
5 * (1 << shift));
|
|
||||||
*pos++ = basic | (u8) rate;
|
*pos++ = basic | (u8) rate;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -4268,25 +4245,13 @@ u64 ieee80211_calculate_rx_timestamp(struct ieee80211_local *local,
|
|||||||
fallthrough;
|
fallthrough;
|
||||||
case RX_ENC_LEGACY: {
|
case RX_ENC_LEGACY: {
|
||||||
struct ieee80211_supported_band *sband;
|
struct ieee80211_supported_band *sband;
|
||||||
int shift = 0;
|
|
||||||
int bitrate;
|
|
||||||
|
|
||||||
switch (status->bw) {
|
|
||||||
case RATE_INFO_BW_10:
|
|
||||||
shift = 1;
|
|
||||||
break;
|
|
||||||
case RATE_INFO_BW_5:
|
|
||||||
shift = 2;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
sband = local->hw.wiphy->bands[status->band];
|
sband = local->hw.wiphy->bands[status->band];
|
||||||
bitrate = sband->bitrates[status->rate_idx].bitrate;
|
ri.legacy = sband->bitrates[status->rate_idx].bitrate;
|
||||||
ri.legacy = DIV_ROUND_UP(bitrate, (1 << shift));
|
|
||||||
|
|
||||||
if (status->flag & RX_FLAG_MACTIME_PLCP_START) {
|
if (status->flag & RX_FLAG_MACTIME_PLCP_START) {
|
||||||
if (status->band == NL80211_BAND_5GHZ) {
|
if (status->band == NL80211_BAND_5GHZ) {
|
||||||
ts += 20 << shift;
|
ts += 20;
|
||||||
mpdu_offset += 2;
|
mpdu_offset += 2;
|
||||||
} else if (status->enc_flags & RX_ENC_FLAG_SHORTPRE) {
|
} else if (status->enc_flags & RX_ENC_FLAG_SHORTPRE) {
|
||||||
ts += 96;
|
ts += 96;
|
||||||
|
Loading…
Reference in New Issue
Block a user