aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/wireless/ath/ath9k/ath9k.h4
-rw-r--r--drivers/net/wireless/ath/ath9k/main.c5
-rw-r--r--drivers/net/wireless/ath/ath9k/xmit.c10
3 files changed, 13 insertions, 6 deletions
diff --git a/drivers/net/wireless/ath/ath9k/ath9k.h b/drivers/net/wireless/ath/ath9k/ath9k.h
index 79217c3c92e5..004533d2ca5f 100644
--- a/drivers/net/wireless/ath/ath9k/ath9k.h
+++ b/drivers/net/wireless/ath/ath9k/ath9k.h
@@ -346,8 +346,8 @@ void ath_tx_tasklet(struct ath_softc *sc);
346void ath_tx_edma_tasklet(struct ath_softc *sc); 346void ath_tx_edma_tasklet(struct ath_softc *sc);
347void ath_tx_cabq(struct ieee80211_hw *hw, struct sk_buff *skb); 347void ath_tx_cabq(struct ieee80211_hw *hw, struct sk_buff *skb);
348bool ath_tx_aggr_check(struct ath_softc *sc, struct ath_node *an, u8 tidno); 348bool ath_tx_aggr_check(struct ath_softc *sc, struct ath_node *an, u8 tidno);
349void ath_tx_aggr_start(struct ath_softc *sc, struct ieee80211_sta *sta, 349int ath_tx_aggr_start(struct ath_softc *sc, struct ieee80211_sta *sta,
350 u16 tid, u16 *ssn); 350 u16 tid, u16 *ssn);
351void ath_tx_aggr_stop(struct ath_softc *sc, struct ieee80211_sta *sta, u16 tid); 351void ath_tx_aggr_stop(struct ath_softc *sc, struct ieee80211_sta *sta, u16 tid);
352void ath_tx_aggr_resume(struct ath_softc *sc, struct ieee80211_sta *sta, u16 tid); 352void ath_tx_aggr_resume(struct ath_softc *sc, struct ieee80211_sta *sta, u16 tid);
353void ath9k_enable_ps(struct ath_softc *sc); 353void ath9k_enable_ps(struct ath_softc *sc);
diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c
index 5056733e6f66..8b327bcad695 100644
--- a/drivers/net/wireless/ath/ath9k/main.c
+++ b/drivers/net/wireless/ath/ath9k/main.c
@@ -1970,8 +1970,9 @@ static int ath9k_ampdu_action(struct ieee80211_hw *hw,
1970 break; 1970 break;
1971 case IEEE80211_AMPDU_TX_START: 1971 case IEEE80211_AMPDU_TX_START:
1972 ath9k_ps_wakeup(sc); 1972 ath9k_ps_wakeup(sc);
1973 ath_tx_aggr_start(sc, sta, tid, ssn); 1973 ret = ath_tx_aggr_start(sc, sta, tid, ssn);
1974 ieee80211_start_tx_ba_cb_irqsafe(vif, sta->addr, tid); 1974 if (!ret)
1975 ieee80211_start_tx_ba_cb_irqsafe(vif, sta->addr, tid);
1975 ath9k_ps_restore(sc); 1976 ath9k_ps_restore(sc);
1976 break; 1977 break;
1977 case IEEE80211_AMPDU_TX_STOP: 1978 case IEEE80211_AMPDU_TX_STOP:
diff --git a/drivers/net/wireless/ath/ath9k/xmit.c b/drivers/net/wireless/ath/ath9k/xmit.c
index 5323a4d9ebb8..d629bfbdfab4 100644
--- a/drivers/net/wireless/ath/ath9k/xmit.c
+++ b/drivers/net/wireless/ath/ath9k/xmit.c
@@ -783,17 +783,23 @@ static void ath_tx_sched_aggr(struct ath_softc *sc, struct ath_txq *txq,
783 status != ATH_AGGR_BAW_CLOSED); 783 status != ATH_AGGR_BAW_CLOSED);
784} 784}
785 785
786void ath_tx_aggr_start(struct ath_softc *sc, struct ieee80211_sta *sta, 786int ath_tx_aggr_start(struct ath_softc *sc, struct ieee80211_sta *sta,
787 u16 tid, u16 *ssn) 787 u16 tid, u16 *ssn)
788{ 788{
789 struct ath_atx_tid *txtid; 789 struct ath_atx_tid *txtid;
790 struct ath_node *an; 790 struct ath_node *an;
791 791
792 an = (struct ath_node *)sta->drv_priv; 792 an = (struct ath_node *)sta->drv_priv;
793 txtid = ATH_AN_2_TID(an, tid); 793 txtid = ATH_AN_2_TID(an, tid);
794
795 if (txtid->state & (AGGR_CLEANUP | AGGR_ADDBA_COMPLETE))
796 return -EAGAIN;
797
794 txtid->state |= AGGR_ADDBA_PROGRESS; 798 txtid->state |= AGGR_ADDBA_PROGRESS;
795 txtid->paused = true; 799 txtid->paused = true;
796 *ssn = txtid->seq_start; 800 *ssn = txtid->seq_start;
801
802 return 0;
797} 803}
798 804
799void ath_tx_aggr_stop(struct ath_softc *sc, struct ieee80211_sta *sta, u16 tid) 805void ath_tx_aggr_stop(struct ath_softc *sc, struct ieee80211_sta *sta, u16 tid)