diff options
-rw-r--r-- | drivers/net/wireless/ath9k/core.h | 1 | ||||
-rw-r--r-- | drivers/net/wireless/ath9k/main.c | 3 | ||||
-rw-r--r-- | drivers/net/wireless/ath9k/xmit.c | 19 | ||||
-rw-r--r-- | include/net/mac80211.h | 2 | ||||
-rw-r--r-- | net/mac80211/ht.c | 10 |
5 files changed, 34 insertions, 1 deletions
diff --git a/drivers/net/wireless/ath9k/core.h b/drivers/net/wireless/ath9k/core.h index 5b17e88ab9a9..69e8d3e41131 100644 --- a/drivers/net/wireless/ath9k/core.h +++ b/drivers/net/wireless/ath9k/core.h | |||
@@ -581,6 +581,7 @@ void ath_tx_aggr_teardown(struct ath_softc *sc, | |||
581 | int ath_tx_aggr_start(struct ath_softc *sc, struct ieee80211_sta *sta, | 581 | int ath_tx_aggr_start(struct ath_softc *sc, struct ieee80211_sta *sta, |
582 | u16 tid, u16 *ssn); | 582 | u16 tid, u16 *ssn); |
583 | int ath_tx_aggr_stop(struct ath_softc *sc, struct ieee80211_sta *sta, u16 tid); | 583 | int ath_tx_aggr_stop(struct ath_softc *sc, struct ieee80211_sta *sta, u16 tid); |
584 | void ath_tx_aggr_resume(struct ath_softc *sc, struct ieee80211_sta *sta, u16 tid); | ||
584 | void ath_newassoc(struct ath_softc *sc, | 585 | void ath_newassoc(struct ath_softc *sc, |
585 | struct ath_node *node, int isnew, int isuapsd); | 586 | struct ath_node *node, int isnew, int isuapsd); |
586 | void ath_node_attach(struct ath_softc *sc, struct ieee80211_sta *sta); | 587 | void ath_node_attach(struct ath_softc *sc, struct ieee80211_sta *sta); |
diff --git a/drivers/net/wireless/ath9k/main.c b/drivers/net/wireless/ath9k/main.c index 65a532e08ecd..fb50aa0fc996 100644 --- a/drivers/net/wireless/ath9k/main.c +++ b/drivers/net/wireless/ath9k/main.c | |||
@@ -1482,6 +1482,9 @@ static int ath9k_ampdu_action(struct ieee80211_hw *hw, | |||
1482 | 1482 | ||
1483 | ieee80211_stop_tx_ba_cb_irqsafe(hw, sta->addr, tid); | 1483 | ieee80211_stop_tx_ba_cb_irqsafe(hw, sta->addr, tid); |
1484 | break; | 1484 | break; |
1485 | case IEEE80211_AMPDU_TX_RESUME: | ||
1486 | ath_tx_aggr_resume(sc, sta, tid); | ||
1487 | break; | ||
1485 | default: | 1488 | default: |
1486 | DPRINTF(sc, ATH_DBG_FATAL, | 1489 | DPRINTF(sc, ATH_DBG_FATAL, |
1487 | "%s: Unknown AMPDU action\n", __func__); | 1490 | "%s: Unknown AMPDU action\n", __func__); |
diff --git a/drivers/net/wireless/ath9k/xmit.c b/drivers/net/wireless/ath9k/xmit.c index 7e6f4e59a5d1..fe386b6dadac 100644 --- a/drivers/net/wireless/ath9k/xmit.c +++ b/drivers/net/wireless/ath9k/xmit.c | |||
@@ -2371,6 +2371,25 @@ int ath_tx_aggr_stop(struct ath_softc *sc, struct ieee80211_sta *sta, u16 tid) | |||
2371 | return 0; | 2371 | return 0; |
2372 | } | 2372 | } |
2373 | 2373 | ||
2374 | /* Resume tx aggregation */ | ||
2375 | |||
2376 | void ath_tx_aggr_resume(struct ath_softc *sc, struct ieee80211_sta *sta, u16 tid) | ||
2377 | { | ||
2378 | struct ath_atx_tid *txtid; | ||
2379 | struct ath_node *an; | ||
2380 | |||
2381 | an = (struct ath_node *)sta->drv_priv; | ||
2382 | |||
2383 | if (sc->sc_flags & SC_OP_TXAGGR) { | ||
2384 | txtid = ATH_AN_2_TID(an, tid); | ||
2385 | txtid->baw_size = | ||
2386 | IEEE80211_MIN_AMPDU_BUF << sta->ht_cap.ampdu_factor; | ||
2387 | txtid->state |= AGGR_ADDBA_COMPLETE; | ||
2388 | txtid->state &= ~AGGR_ADDBA_PROGRESS; | ||
2389 | ath_tx_resume_tid(sc, txtid); | ||
2390 | } | ||
2391 | } | ||
2392 | |||
2374 | /* | 2393 | /* |
2375 | * Performs transmit side cleanup when TID changes from aggregated to | 2394 | * Performs transmit side cleanup when TID changes from aggregated to |
2376 | * unaggregated. | 2395 | * unaggregated. |
diff --git a/include/net/mac80211.h b/include/net/mac80211.h index af2ec6f9beb9..53856003aa18 100644 --- a/include/net/mac80211.h +++ b/include/net/mac80211.h | |||
@@ -1127,12 +1127,14 @@ enum ieee80211_filter_flags { | |||
1127 | * @IEEE80211_AMPDU_RX_STOP: stop Rx aggregation | 1127 | * @IEEE80211_AMPDU_RX_STOP: stop Rx aggregation |
1128 | * @IEEE80211_AMPDU_TX_START: start Tx aggregation | 1128 | * @IEEE80211_AMPDU_TX_START: start Tx aggregation |
1129 | * @IEEE80211_AMPDU_TX_STOP: stop Tx aggregation | 1129 | * @IEEE80211_AMPDU_TX_STOP: stop Tx aggregation |
1130 | * @IEEE80211_AMPDU_TX_RESUME: resume TX aggregation | ||
1130 | */ | 1131 | */ |
1131 | enum ieee80211_ampdu_mlme_action { | 1132 | enum ieee80211_ampdu_mlme_action { |
1132 | IEEE80211_AMPDU_RX_START, | 1133 | IEEE80211_AMPDU_RX_START, |
1133 | IEEE80211_AMPDU_RX_STOP, | 1134 | IEEE80211_AMPDU_RX_STOP, |
1134 | IEEE80211_AMPDU_TX_START, | 1135 | IEEE80211_AMPDU_TX_START, |
1135 | IEEE80211_AMPDU_TX_STOP, | 1136 | IEEE80211_AMPDU_TX_STOP, |
1137 | IEEE80211_AMPDU_TX_RESUME, | ||
1136 | }; | 1138 | }; |
1137 | 1139 | ||
1138 | /** | 1140 | /** |
diff --git a/net/mac80211/ht.c b/net/mac80211/ht.c index 08009d4b7d6e..3e231d756776 100644 --- a/net/mac80211/ht.c +++ b/net/mac80211/ht.c | |||
@@ -987,7 +987,7 @@ void ieee80211_process_addba_resp(struct ieee80211_local *local, | |||
987 | { | 987 | { |
988 | struct ieee80211_hw *hw = &local->hw; | 988 | struct ieee80211_hw *hw = &local->hw; |
989 | u16 capab; | 989 | u16 capab; |
990 | u16 tid; | 990 | u16 tid, start_seq_num; |
991 | u8 *state; | 991 | u8 *state; |
992 | 992 | ||
993 | capab = le16_to_cpu(mgmt->u.action.u.addba_resp.capab); | 993 | capab = le16_to_cpu(mgmt->u.action.u.addba_resp.capab); |
@@ -1024,6 +1024,14 @@ void ieee80211_process_addba_resp(struct ieee80211_local *local, | |||
1024 | local->hw.ampdu_queues) | 1024 | local->hw.ampdu_queues) |
1025 | ieee80211_wake_queue(hw, sta->tid_to_tx_q[tid]); | 1025 | ieee80211_wake_queue(hw, sta->tid_to_tx_q[tid]); |
1026 | 1026 | ||
1027 | if (local->ops->ampdu_action) { | ||
1028 | (void)local->ops->ampdu_action(hw, | ||
1029 | IEEE80211_AMPDU_TX_RESUME, | ||
1030 | &sta->sta, tid, &start_seq_num); | ||
1031 | } | ||
1032 | #ifdef CONFIG_MAC80211_HT_DEBUG | ||
1033 | printk(KERN_DEBUG "Resuming TX aggregation for tid %d\n", tid); | ||
1034 | #endif /* CONFIG_MAC80211_HT_DEBUG */ | ||
1027 | spin_unlock_bh(&sta->lock); | 1035 | spin_unlock_bh(&sta->lock); |
1028 | } else { | 1036 | } else { |
1029 | sta->ampdu_mlme.addba_req_num[tid]++; | 1037 | sta->ampdu_mlme.addba_req_num[tid]++; |