aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/wireless/ath9k/core.h1
-rw-r--r--drivers/net/wireless/ath9k/main.c3
-rw-r--r--drivers/net/wireless/ath9k/xmit.c19
-rw-r--r--include/net/mac80211.h2
-rw-r--r--net/mac80211/ht.c10
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,
581int ath_tx_aggr_start(struct ath_softc *sc, struct ieee80211_sta *sta, 581int ath_tx_aggr_start(struct ath_softc *sc, struct ieee80211_sta *sta,
582 u16 tid, u16 *ssn); 582 u16 tid, u16 *ssn);
583int ath_tx_aggr_stop(struct ath_softc *sc, struct ieee80211_sta *sta, u16 tid); 583int ath_tx_aggr_stop(struct ath_softc *sc, struct ieee80211_sta *sta, u16 tid);
584void ath_tx_aggr_resume(struct ath_softc *sc, struct ieee80211_sta *sta, u16 tid);
584void ath_newassoc(struct ath_softc *sc, 585void ath_newassoc(struct ath_softc *sc,
585 struct ath_node *node, int isnew, int isuapsd); 586 struct ath_node *node, int isnew, int isuapsd);
586void ath_node_attach(struct ath_softc *sc, struct ieee80211_sta *sta); 587void 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
2376void 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 */
1131enum ieee80211_ampdu_mlme_action { 1132enum 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]++;