aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/iwlwifi/iwl-agn-rs.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireless/iwlwifi/iwl-agn-rs.c')
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-agn-rs.c47
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
297static void rs_tl_turn_on_agg_for_tid(struct iwl_priv *priv, 297static 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
321static void rs_tl_turn_on_agg(struct iwl_priv *priv, u8 tid, 323static 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;