aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/wireless/ath9k/main.c2
-rw-r--r--include/net/mac80211.h4
-rw-r--r--net/mac80211/agg-tx.c63
3 files changed, 30 insertions, 39 deletions
diff --git a/drivers/net/wireless/ath9k/main.c b/drivers/net/wireless/ath9k/main.c
index c13e4e536341..13d4e6756c99 100644
--- a/drivers/net/wireless/ath9k/main.c
+++ b/drivers/net/wireless/ath9k/main.c
@@ -2730,7 +2730,7 @@ static int ath9k_ampdu_action(struct ieee80211_hw *hw,
2730 2730
2731 ieee80211_stop_tx_ba_cb_irqsafe(hw, sta->addr, tid); 2731 ieee80211_stop_tx_ba_cb_irqsafe(hw, sta->addr, tid);
2732 break; 2732 break;
2733 case IEEE80211_AMPDU_TX_RESUME: 2733 case IEEE80211_AMPDU_TX_OPERATIONAL:
2734 ath_tx_aggr_resume(sc, sta, tid); 2734 ath_tx_aggr_resume(sc, sta, tid);
2735 break; 2735 break;
2736 default: 2736 default:
diff --git a/include/net/mac80211.h b/include/net/mac80211.h
index 6f3bc4cc53e5..07fe9875506e 100644
--- a/include/net/mac80211.h
+++ b/include/net/mac80211.h
@@ -1236,14 +1236,14 @@ enum ieee80211_filter_flags {
1236 * @IEEE80211_AMPDU_RX_STOP: stop Rx aggregation 1236 * @IEEE80211_AMPDU_RX_STOP: stop Rx aggregation
1237 * @IEEE80211_AMPDU_TX_START: start Tx aggregation 1237 * @IEEE80211_AMPDU_TX_START: start Tx aggregation
1238 * @IEEE80211_AMPDU_TX_STOP: stop Tx aggregation 1238 * @IEEE80211_AMPDU_TX_STOP: stop Tx aggregation
1239 * @IEEE80211_AMPDU_TX_RESUME: resume TX aggregation 1239 * @IEEE80211_AMPDU_TX_OPERATIONAL: TX aggregation has become operational
1240 */ 1240 */
1241enum ieee80211_ampdu_mlme_action { 1241enum ieee80211_ampdu_mlme_action {
1242 IEEE80211_AMPDU_RX_START, 1242 IEEE80211_AMPDU_RX_START,
1243 IEEE80211_AMPDU_RX_STOP, 1243 IEEE80211_AMPDU_RX_STOP,
1244 IEEE80211_AMPDU_TX_START, 1244 IEEE80211_AMPDU_TX_START,
1245 IEEE80211_AMPDU_TX_STOP, 1245 IEEE80211_AMPDU_TX_STOP,
1246 IEEE80211_AMPDU_TX_RESUME, 1246 IEEE80211_AMPDU_TX_OPERATIONAL,
1247}; 1247};
1248 1248
1249/** 1249/**
diff --git a/net/mac80211/agg-tx.c b/net/mac80211/agg-tx.c
index e5776ef1717a..fd718e2b29f7 100644
--- a/net/mac80211/agg-tx.c
+++ b/net/mac80211/agg-tx.c
@@ -404,6 +404,27 @@ int ieee80211_start_tx_ba_session(struct ieee80211_hw *hw, u8 *ra, u16 tid)
404} 404}
405EXPORT_SYMBOL(ieee80211_start_tx_ba_session); 405EXPORT_SYMBOL(ieee80211_start_tx_ba_session);
406 406
407static void ieee80211_agg_tx_operational(struct ieee80211_local *local,
408 struct sta_info *sta, u16 tid)
409{
410#ifdef CONFIG_MAC80211_HT_DEBUG
411 printk(KERN_DEBUG "Aggregation is on for tid %d \n", tid);
412#endif
413
414 if (local->hw.ampdu_queues) {
415 /*
416 * Wake up the A-MPDU queue, we stopped it earlier,
417 * this will in turn wake the entire AC.
418 */
419 ieee80211_wake_queue_by_reason(&local->hw,
420 local->hw.queues + sta->tid_to_tx_q[tid],
421 IEEE80211_QUEUE_STOP_REASON_AGGREGATION);
422 }
423
424 local->ops->ampdu_action(&local->hw, IEEE80211_AMPDU_TX_OPERATIONAL,
425 &sta->sta, tid, NULL);
426}
427
407void ieee80211_start_tx_ba_cb(struct ieee80211_hw *hw, u8 *ra, u16 tid) 428void ieee80211_start_tx_ba_cb(struct ieee80211_hw *hw, u8 *ra, u16 tid)
408{ 429{
409 struct ieee80211_local *local = hw_to_local(hw); 430 struct ieee80211_local *local = hw_to_local(hw);
@@ -446,20 +467,8 @@ void ieee80211_start_tx_ba_cb(struct ieee80211_hw *hw, u8 *ra, u16 tid)
446 467
447 *state |= HT_ADDBA_DRV_READY_MSK; 468 *state |= HT_ADDBA_DRV_READY_MSK;
448 469
449 if (*state == HT_AGG_STATE_OPERATIONAL) { 470 if (*state == HT_AGG_STATE_OPERATIONAL)
450#ifdef CONFIG_MAC80211_HT_DEBUG 471 ieee80211_agg_tx_operational(local, sta, tid);
451 printk(KERN_DEBUG "Aggregation is on for tid %d \n", tid);
452#endif
453 if (hw->ampdu_queues) {
454 /*
455 * Wake up this queue, we stopped it earlier,
456 * this will in turn wake the entire AC.
457 */
458 ieee80211_wake_queue_by_reason(hw,
459 hw->queues + sta->tid_to_tx_q[tid],
460 IEEE80211_QUEUE_STOP_REASON_AGGREGATION);
461 }
462 }
463 472
464 out: 473 out:
465 spin_unlock_bh(&sta->lock); 474 spin_unlock_bh(&sta->lock);
@@ -646,9 +655,7 @@ void ieee80211_process_addba_resp(struct ieee80211_local *local,
646 struct ieee80211_mgmt *mgmt, 655 struct ieee80211_mgmt *mgmt,
647 size_t len) 656 size_t len)
648{ 657{
649 struct ieee80211_hw *hw = &local->hw; 658 u16 capab, tid;
650 u16 capab;
651 u16 tid, start_seq_num;
652 u8 *state; 659 u8 *state;
653 660
654 capab = le16_to_cpu(mgmt->u.action.u.addba_resp.capab); 661 capab = le16_to_cpu(mgmt->u.action.u.addba_resp.capab);
@@ -682,26 +689,10 @@ void ieee80211_process_addba_resp(struct ieee80211_local *local,
682 689
683 *state |= HT_ADDBA_RECEIVED_MSK; 690 *state |= HT_ADDBA_RECEIVED_MSK;
684 691
685 if (hw->ampdu_queues && *state != curstate && 692 if (*state != curstate && *state == HT_AGG_STATE_OPERATIONAL)
686 *state == HT_AGG_STATE_OPERATIONAL) { 693 ieee80211_agg_tx_operational(local, sta, tid);
687 /*
688 * Wake up this queue, we stopped it earlier,
689 * this will in turn wake the entire AC.
690 */
691 ieee80211_wake_queue_by_reason(hw,
692 hw->queues + sta->tid_to_tx_q[tid],
693 IEEE80211_QUEUE_STOP_REASON_AGGREGATION);
694 }
695 sta->ampdu_mlme.addba_req_num[tid] = 0;
696 694
697 if (local->ops->ampdu_action) { 695 sta->ampdu_mlme.addba_req_num[tid] = 0;
698 (void)local->ops->ampdu_action(hw,
699 IEEE80211_AMPDU_TX_RESUME,
700 &sta->sta, tid, &start_seq_num);
701 }
702#ifdef CONFIG_MAC80211_HT_DEBUG
703 printk(KERN_DEBUG "Resuming TX aggregation for tid %d\n", tid);
704#endif /* CONFIG_MAC80211_HT_DEBUG */
705 } else { 696 } else {
706 sta->ampdu_mlme.addba_req_num[tid]++; 697 sta->ampdu_mlme.addba_req_num[tid]++;
707 ___ieee80211_stop_tx_ba_session(sta, tid, WLAN_BACK_INITIATOR); 698 ___ieee80211_stop_tx_ba_session(sta, tid, WLAN_BACK_INITIATOR);