diff options
Diffstat (limited to 'drivers/net/wireless/iwlwifi/iwl-agn-rs.c')
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-agn-rs.c | 47 |
1 files changed, 28 insertions, 19 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-rs.c b/drivers/net/wireless/iwlwifi/iwl-agn-rs.c index 3c1cd417bbc5..8f8d5e3e688d 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn-rs.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn-rs.c | |||
@@ -294,11 +294,11 @@ static u32 rs_tl_get_load(struct iwl_lq_sta *lq_data, u8 tid) | |||
294 | return tl->total; | 294 | return tl->total; |
295 | } | 295 | } |
296 | 296 | ||
297 | static void rs_tl_turn_on_agg_for_tid(struct iwl_priv *priv, | 297 | static int rs_tl_turn_on_agg_for_tid(struct iwl_priv *priv, |
298 | struct iwl_lq_sta *lq_data, u8 tid, | 298 | struct iwl_lq_sta *lq_data, u8 tid, |
299 | struct ieee80211_sta *sta) | 299 | struct ieee80211_sta *sta) |
300 | { | 300 | { |
301 | int ret; | 301 | int ret = -EAGAIN; |
302 | 302 | ||
303 | if (rs_tl_get_load(lq_data, tid) > IWL_AGG_LOAD_THRESHOLD) { | 303 | if (rs_tl_get_load(lq_data, tid) > IWL_AGG_LOAD_THRESHOLD) { |
304 | IWL_DEBUG_HT(priv, "Starting Tx agg: STA: %pM tid: %d\n", | 304 | IWL_DEBUG_HT(priv, "Starting Tx agg: STA: %pM tid: %d\n", |
@@ -312,29 +312,29 @@ static void rs_tl_turn_on_agg_for_tid(struct iwl_priv *priv, | |||
312 | */ | 312 | */ |
313 | IWL_DEBUG_HT(priv, "Fail start Tx agg on tid: %d\n", | 313 | IWL_DEBUG_HT(priv, "Fail start Tx agg on tid: %d\n", |
314 | tid); | 314 | tid); |
315 | ret = ieee80211_stop_tx_ba_session(sta, tid, | 315 | ieee80211_stop_tx_ba_session(sta, tid, |
316 | WLAN_BACK_INITIATOR); | 316 | WLAN_BACK_INITIATOR); |
317 | } | 317 | } |
318 | } | 318 | } else |
319 | IWL_ERR(priv, "Fail finding valid aggregation tid: %d\n", tid); | ||
320 | return ret; | ||
319 | } | 321 | } |
320 | 322 | ||
321 | static void rs_tl_turn_on_agg(struct iwl_priv *priv, u8 tid, | 323 | static void rs_tl_turn_on_agg(struct iwl_priv *priv, u8 tid, |
322 | struct iwl_lq_sta *lq_data, | 324 | struct iwl_lq_sta *lq_data, |
323 | struct ieee80211_sta *sta) | 325 | struct ieee80211_sta *sta) |
324 | { | 326 | { |
325 | if ((tid < TID_MAX_LOAD_COUNT)) | 327 | if ((tid < TID_MAX_LOAD_COUNT) && |
326 | rs_tl_turn_on_agg_for_tid(priv, lq_data, tid, sta); | 328 | !rs_tl_turn_on_agg_for_tid(priv, lq_data, tid, sta)) { |
327 | else if (tid == IWL_AGG_ALL_TID) | 329 | if (priv->cfg->use_rts_for_ht) { |
328 | for (tid = 0; tid < TID_MAX_LOAD_COUNT; tid++) | 330 | /* |
329 | rs_tl_turn_on_agg_for_tid(priv, lq_data, tid, sta); | 331 | * switch to RTS/CTS if it is the prefer protection |
330 | if (priv->cfg->use_rts_for_ht) { | 332 | * method for HT traffic |
331 | /* | 333 | */ |
332 | * switch to RTS/CTS if it is the prefer protection method | 334 | IWL_DEBUG_HT(priv, "use RTS/CTS protection for HT\n"); |
333 | * for HT traffic | 335 | priv->staging_rxon.flags &= ~RXON_FLG_SELF_CTS_EN; |
334 | */ | 336 | iwlcore_commit_rxon(priv); |
335 | IWL_DEBUG_HT(priv, "use RTS/CTS protection for HT\n"); | 337 | } |
336 | priv->staging_rxon.flags &= ~RXON_FLG_SELF_CTS_EN; | ||
337 | iwlcore_commit_rxon(priv); | ||
338 | } | 338 | } |
339 | } | 339 | } |
340 | 340 | ||
@@ -2557,8 +2557,17 @@ void iwl_rs_rate_init(struct iwl_priv *priv, struct ieee80211_sta *sta, u8 sta_i | |||
2557 | lq_sta->active_mimo3_rate); | 2557 | lq_sta->active_mimo3_rate); |
2558 | 2558 | ||
2559 | /* These values will be overridden later */ | 2559 | /* These values will be overridden later */ |
2560 | lq_sta->lq.general_params.single_stream_ant_msk = ANT_A; | 2560 | lq_sta->lq.general_params.single_stream_ant_msk = |
2561 | lq_sta->lq.general_params.dual_stream_ant_msk = ANT_AB; | 2561 | first_antenna(priv->hw_params.valid_tx_ant); |
2562 | lq_sta->lq.general_params.dual_stream_ant_msk = | ||
2563 | priv->hw_params.valid_tx_ant & | ||
2564 | ~first_antenna(priv->hw_params.valid_tx_ant); | ||
2565 | if (!lq_sta->lq.general_params.dual_stream_ant_msk) { | ||
2566 | lq_sta->lq.general_params.dual_stream_ant_msk = ANT_AB; | ||
2567 | } else if (num_of_ant(priv->hw_params.valid_tx_ant) == 2) { | ||
2568 | lq_sta->lq.general_params.dual_stream_ant_msk = | ||
2569 | priv->hw_params.valid_tx_ant; | ||
2570 | } | ||
2562 | 2571 | ||
2563 | /* as default allow aggregation for all tids */ | 2572 | /* as default allow aggregation for all tids */ |
2564 | lq_sta->tx_agg_tid_en = IWL_AGG_ALL_TID; | 2573 | lq_sta->tx_agg_tid_en = IWL_AGG_ALL_TID; |