aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSujith Manoharan <Sujith.Manoharan@atheros.com>2010-12-14 21:17:10 -0500
committerJohn W. Linville <linville@tuxdriver.com>2010-12-15 17:03:59 -0500
commitbd2ce6e43f65127bc723e7fcc044758cf8113260 (patch)
tree46eeb3f454619549d563addd8eff3b4d5475179f
parenta293911d4fd5e8593dbf478399a77f990d466269 (diff)
mac80211: Add timeout to BA session start API
Allow drivers or rate control algorithms to specify BlockAck session timeout when initiating an ADDBA transaction. This is useful in cases where maintaining persistent BA sessions does not incur any overhead. The current timeout value of 5000 TUs is retained for all non ath9k/ath9k_htc drivers. Signed-off-by: Sujith Manoharan <Sujith.Manoharan@atheros.com> Reviewed-by: Johannes Berg <johannes@sipsolutions.net> Signed-off-by: John W. Linville <linville@tuxdriver.com>
-rw-r--r--drivers/net/wireless/ath/ath9k/htc_drv_txrx.c2
-rw-r--r--drivers/net/wireless/ath/ath9k/rc.c2
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-agn-rs.c2
-rw-r--r--drivers/net/wireless/rtlwifi/rc.c2
-rw-r--r--include/net/mac80211.h4
-rw-r--r--net/mac80211/agg-tx.c7
-rw-r--r--net/mac80211/debugfs_sta.c2
-rw-r--r--net/mac80211/rc80211_minstrel_ht.c2
-rw-r--r--net/mac80211/sta_info.h2
9 files changed, 16 insertions, 9 deletions
diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c b/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c
index 31fad82239b..33f36029fa4 100644
--- a/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c
+++ b/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c
@@ -251,7 +251,7 @@ void ath9k_tx_tasklet(unsigned long data)
251 ista = (struct ath9k_htc_sta *)sta->drv_priv; 251 ista = (struct ath9k_htc_sta *)sta->drv_priv;
252 252
253 if (ath9k_htc_check_tx_aggr(priv, ista, tid)) { 253 if (ath9k_htc_check_tx_aggr(priv, ista, tid)) {
254 ieee80211_start_tx_ba_session(sta, tid); 254 ieee80211_start_tx_ba_session(sta, tid, 0);
255 spin_lock_bh(&priv->tx_lock); 255 spin_lock_bh(&priv->tx_lock);
256 ista->tid_state[tid] = AGGR_PROGRESS; 256 ista->tid_state[tid] = AGGR_PROGRESS;
257 spin_unlock_bh(&priv->tx_lock); 257 spin_unlock_bh(&priv->tx_lock);
diff --git a/drivers/net/wireless/ath/ath9k/rc.c b/drivers/net/wireless/ath/ath9k/rc.c
index 2061a755a02..896d12986b1 100644
--- a/drivers/net/wireless/ath/ath9k/rc.c
+++ b/drivers/net/wireless/ath/ath9k/rc.c
@@ -1373,7 +1373,7 @@ static void ath_tx_status(void *priv, struct ieee80211_supported_band *sband,
1373 an = (struct ath_node *)sta->drv_priv; 1373 an = (struct ath_node *)sta->drv_priv;
1374 1374
1375 if(ath_tx_aggr_check(sc, an, tid)) 1375 if(ath_tx_aggr_check(sc, an, tid))
1376 ieee80211_start_tx_ba_session(sta, tid); 1376 ieee80211_start_tx_ba_session(sta, tid, 0);
1377 } 1377 }
1378 } 1378 }
1379 1379
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-rs.c b/drivers/net/wireless/iwlwifi/iwl-agn-rs.c
index ee123482e1d..5083dba122c 100644
--- a/drivers/net/wireless/iwlwifi/iwl-agn-rs.c
+++ b/drivers/net/wireless/iwlwifi/iwl-agn-rs.c
@@ -387,7 +387,7 @@ static int rs_tl_turn_on_agg_for_tid(struct iwl_priv *priv,
387 if (load > IWL_AGG_LOAD_THRESHOLD) { 387 if (load > IWL_AGG_LOAD_THRESHOLD) {
388 IWL_DEBUG_HT(priv, "Starting Tx agg: STA: %pM tid: %d\n", 388 IWL_DEBUG_HT(priv, "Starting Tx agg: STA: %pM tid: %d\n",
389 sta->addr, tid); 389 sta->addr, tid);
390 ret = ieee80211_start_tx_ba_session(sta, tid); 390 ret = ieee80211_start_tx_ba_session(sta, tid, 5000);
391 if (ret == -EAGAIN) { 391 if (ret == -EAGAIN) {
392 /* 392 /*
393 * driver and mac80211 is out of sync 393 * driver and mac80211 is out of sync
diff --git a/drivers/net/wireless/rtlwifi/rc.c b/drivers/net/wireless/rtlwifi/rc.c
index 904b8fd01f6..91634107434 100644
--- a/drivers/net/wireless/rtlwifi/rc.c
+++ b/drivers/net/wireless/rtlwifi/rc.c
@@ -169,7 +169,7 @@ static void rtl_tx_status(void *ppriv,
169 tid = qc[0] & 0xf; 169 tid = qc[0] & 0xf;
170 170
171 if (_rtl_tx_aggr_check(rtlpriv, tid)) 171 if (_rtl_tx_aggr_check(rtlpriv, tid))
172 ieee80211_start_tx_ba_session(sta, tid); 172 ieee80211_start_tx_ba_session(sta, tid, 5000);
173 } 173 }
174 } 174 }
175} 175}
diff --git a/include/net/mac80211.h b/include/net/mac80211.h
index e411cf87fb4..69ded1ee49c 100644
--- a/include/net/mac80211.h
+++ b/include/net/mac80211.h
@@ -2435,6 +2435,7 @@ void ieee80211_queue_delayed_work(struct ieee80211_hw *hw,
2435 * ieee80211_start_tx_ba_session - Start a tx Block Ack session. 2435 * ieee80211_start_tx_ba_session - Start a tx Block Ack session.
2436 * @sta: the station for which to start a BA session 2436 * @sta: the station for which to start a BA session
2437 * @tid: the TID to BA on. 2437 * @tid: the TID to BA on.
2438 * @timeout: session timeout value (in TUs)
2438 * 2439 *
2439 * Return: success if addBA request was sent, failure otherwise 2440 * Return: success if addBA request was sent, failure otherwise
2440 * 2441 *
@@ -2442,7 +2443,8 @@ void ieee80211_queue_delayed_work(struct ieee80211_hw *hw,
2442 * the need to start aggregation on a certain RA/TID, the session level 2443 * the need to start aggregation on a certain RA/TID, the session level
2443 * will be managed by the mac80211. 2444 * will be managed by the mac80211.
2444 */ 2445 */
2445int ieee80211_start_tx_ba_session(struct ieee80211_sta *sta, u16 tid); 2446int ieee80211_start_tx_ba_session(struct ieee80211_sta *sta, u16 tid,
2447 u16 timeout);
2446 2448
2447/** 2449/**
2448 * ieee80211_start_tx_ba_cb_irqsafe - low level driver ready to aggregate. 2450 * ieee80211_start_tx_ba_cb_irqsafe - low level driver ready to aggregate.
diff --git a/net/mac80211/agg-tx.c b/net/mac80211/agg-tx.c
index d4679b265ba..9cc472c6a6a 100644
--- a/net/mac80211/agg-tx.c
+++ b/net/mac80211/agg-tx.c
@@ -342,10 +342,11 @@ void ieee80211_tx_ba_session_handle_start(struct sta_info *sta, int tid)
342 /* send AddBA request */ 342 /* send AddBA request */
343 ieee80211_send_addba_request(sdata, sta->sta.addr, tid, 343 ieee80211_send_addba_request(sdata, sta->sta.addr, tid,
344 tid_tx->dialog_token, start_seq_num, 344 tid_tx->dialog_token, start_seq_num,
345 0x40, 5000); 345 0x40, tid_tx->timeout);
346} 346}
347 347
348int ieee80211_start_tx_ba_session(struct ieee80211_sta *pubsta, u16 tid) 348int ieee80211_start_tx_ba_session(struct ieee80211_sta *pubsta, u16 tid,
349 u16 timeout)
349{ 350{
350 struct sta_info *sta = container_of(pubsta, struct sta_info, sta); 351 struct sta_info *sta = container_of(pubsta, struct sta_info, sta);
351 struct ieee80211_sub_if_data *sdata = sta->sdata; 352 struct ieee80211_sub_if_data *sdata = sta->sdata;
@@ -420,6 +421,8 @@ int ieee80211_start_tx_ba_session(struct ieee80211_sta *pubsta, u16 tid)
420 skb_queue_head_init(&tid_tx->pending); 421 skb_queue_head_init(&tid_tx->pending);
421 __set_bit(HT_AGG_STATE_WANT_START, &tid_tx->state); 422 __set_bit(HT_AGG_STATE_WANT_START, &tid_tx->state);
422 423
424 tid_tx->timeout = timeout;
425
423 /* Tx timer */ 426 /* Tx timer */
424 tid_tx->addba_resp_timer.function = sta_addba_resp_timer_expired; 427 tid_tx->addba_resp_timer.function = sta_addba_resp_timer_expired;
425 tid_tx->addba_resp_timer.data = (unsigned long)&sta->timer_to_tid[tid]; 428 tid_tx->addba_resp_timer.data = (unsigned long)&sta->timer_to_tid[tid];
diff --git a/net/mac80211/debugfs_sta.c b/net/mac80211/debugfs_sta.c
index 8bb5af85f46..c04a1396cf8 100644
--- a/net/mac80211/debugfs_sta.c
+++ b/net/mac80211/debugfs_sta.c
@@ -189,7 +189,7 @@ static ssize_t sta_agg_status_write(struct file *file, const char __user *userbu
189 189
190 if (tx) { 190 if (tx) {
191 if (start) 191 if (start)
192 ret = ieee80211_start_tx_ba_session(&sta->sta, tid); 192 ret = ieee80211_start_tx_ba_session(&sta->sta, tid, 5000);
193 else 193 else
194 ret = ieee80211_stop_tx_ba_session(&sta->sta, tid); 194 ret = ieee80211_stop_tx_ba_session(&sta->sta, tid);
195 } else { 195 } else {
diff --git a/net/mac80211/rc80211_minstrel_ht.c b/net/mac80211/rc80211_minstrel_ht.c
index 4ad7a362fcc..165a4518bb4 100644
--- a/net/mac80211/rc80211_minstrel_ht.c
+++ b/net/mac80211/rc80211_minstrel_ht.c
@@ -374,7 +374,7 @@ minstrel_aggr_check(struct minstrel_priv *mp, struct ieee80211_sta *pubsta, stru
374 if (skb_get_queue_mapping(skb) == IEEE80211_AC_VO) 374 if (skb_get_queue_mapping(skb) == IEEE80211_AC_VO)
375 return; 375 return;
376 376
377 ieee80211_start_tx_ba_session(pubsta, tid); 377 ieee80211_start_tx_ba_session(pubsta, tid, 5000);
378} 378}
379 379
380static void 380static void
diff --git a/net/mac80211/sta_info.h b/net/mac80211/sta_info.h
index fdca52cf88d..bbdd2a86a94 100644
--- a/net/mac80211/sta_info.h
+++ b/net/mac80211/sta_info.h
@@ -78,6 +78,7 @@ enum ieee80211_sta_info_flags {
78 * @addba_resp_timer: timer for peer's response to addba request 78 * @addba_resp_timer: timer for peer's response to addba request
79 * @pending: pending frames queue -- use sta's spinlock to protect 79 * @pending: pending frames queue -- use sta's spinlock to protect
80 * @dialog_token: dialog token for aggregation session 80 * @dialog_token: dialog token for aggregation session
81 * @timeout: session timeout value to be filled in ADDBA requests
81 * @state: session state (see above) 82 * @state: session state (see above)
82 * @stop_initiator: initiator of a session stop 83 * @stop_initiator: initiator of a session stop
83 * @tx_stop: TX DelBA frame when stopping 84 * @tx_stop: TX DelBA frame when stopping
@@ -96,6 +97,7 @@ struct tid_ampdu_tx {
96 struct timer_list addba_resp_timer; 97 struct timer_list addba_resp_timer;
97 struct sk_buff_head pending; 98 struct sk_buff_head pending;
98 unsigned long state; 99 unsigned long state;
100 u16 timeout;
99 u8 dialog_token; 101 u8 dialog_token;
100 u8 stop_initiator; 102 u8 stop_initiator;
101 bool tx_stop; 103 bool tx_stop;