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
iwlagn: fix agn rate scaling
Rate scaling in agn can be broken because of these two problems
1- the LQ command could not sent, we try to call LQ command before
post association will be rejected, this will cause the driver to
break in rs_tx_status reporting initial rate does not match.
2- In rs_rate_init we can get a value of 12, rate 60, for
last_txrate_idx, this rate only valid in SISO/MIMO mode only
Signed-off-by: Mohamed Abbas <mohamed.abbas@intel.com>
Signed-off-by: Reinette Chatre <reinette.chatre@intel.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
committed by
John W. Linville
parent
b8d476c8cb
commit
d5e490362f
@@ -836,6 +836,10 @@ static void rs_tx_status(void *priv_r, struct ieee80211_supported_band *sband,
|
||||
(hw->wiphy->bands[priv->band]->bitrates[rs_index].bitrate !=
|
||||
hw->wiphy->bands[info->band]->bitrates[info->status.rates[0].idx].bitrate)) {
|
||||
IWL_DEBUG_RATE("initial rate does not match 0x%x\n", tx_rate);
|
||||
/* the last LQ command could failed so the LQ in ucode not
|
||||
* the same in driver sync up
|
||||
*/
|
||||
iwl_send_lq_cmd(priv, &lq_sta->lq, CMD_ASYNC);
|
||||
goto out;
|
||||
}
|
||||
|
||||
@@ -2167,6 +2171,7 @@ static void rs_rate_init(void *priv_r, struct ieee80211_supported_band *sband,
|
||||
struct iwl_priv *priv = (struct iwl_priv *)priv_r;
|
||||
struct ieee80211_conf *conf = &priv->hw->conf;
|
||||
struct iwl_lq_sta *lq_sta = priv_sta;
|
||||
u16 mask_bit = 0;
|
||||
|
||||
lq_sta->flush_timer = 0;
|
||||
lq_sta->supp_rates = sta->supp_rates[sband->band];
|
||||
@@ -2200,16 +2205,6 @@ static void rs_rate_init(void *priv_r, struct ieee80211_supported_band *sband,
|
||||
priv->assoc_station_added = 1;
|
||||
}
|
||||
|
||||
/* Find highest tx rate supported by hardware and destination station */
|
||||
lq_sta->last_txrate_idx = 3;
|
||||
for (i = 0; i < sband->n_bitrates; i++)
|
||||
if (sta->supp_rates[sband->band] & BIT(i))
|
||||
lq_sta->last_txrate_idx = i;
|
||||
|
||||
/* For MODE_IEEE80211A, skip over cck rates in global rate table */
|
||||
if (sband->band == IEEE80211_BAND_5GHZ)
|
||||
lq_sta->last_txrate_idx += IWL_FIRST_OFDM_RATE;
|
||||
|
||||
lq_sta->is_dup = 0;
|
||||
lq_sta->is_green = rs_use_green(priv, conf);
|
||||
lq_sta->active_legacy_rate = priv->active_rate & ~(0x1000);
|
||||
@@ -2248,6 +2243,17 @@ static void rs_rate_init(void *priv_r, struct ieee80211_supported_band *sband,
|
||||
lq_sta->tx_agg_tid_en = IWL_AGG_ALL_TID;
|
||||
lq_sta->drv = priv;
|
||||
|
||||
/* Find highest tx rate supported by hardware and destination station */
|
||||
mask_bit = sta->supp_rates[sband->band] & lq_sta->active_legacy_rate;
|
||||
lq_sta->last_txrate_idx = 3;
|
||||
for (i = 0; i < sband->n_bitrates; i++)
|
||||
if (mask_bit & BIT(i))
|
||||
lq_sta->last_txrate_idx = i;
|
||||
|
||||
/* For MODE_IEEE80211A, skip over cck rates in global rate table */
|
||||
if (sband->band == IEEE80211_BAND_5GHZ)
|
||||
lq_sta->last_txrate_idx += IWL_FIRST_OFDM_RATE;
|
||||
|
||||
rs_initialize_lq(priv, conf, sta, lq_sta);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user