diff options
-rw-r--r-- | drivers/net/wireless/ath9k/main.c | 2 | ||||
-rw-r--r-- | include/net/mac80211.h | 4 | ||||
-rw-r--r-- | net/mac80211/agg-tx.c | 63 |
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 | */ |
1241 | enum ieee80211_ampdu_mlme_action { | 1241 | enum 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 | } |
405 | EXPORT_SYMBOL(ieee80211_start_tx_ba_session); | 405 | EXPORT_SYMBOL(ieee80211_start_tx_ba_session); |
406 | 406 | ||
407 | static 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 | |||
407 | void ieee80211_start_tx_ba_cb(struct ieee80211_hw *hw, u8 *ra, u16 tid) | 428 | void 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); |