diff options
| -rw-r--r-- | drivers/net/wireless/ath/ath9k/ath9k.h | 4 | ||||
| -rw-r--r-- | drivers/net/wireless/ath/ath9k/main.c | 5 | ||||
| -rw-r--r-- | drivers/net/wireless/ath/ath9k/xmit.c | 10 |
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); | |||
| 346 | void ath_tx_edma_tasklet(struct ath_softc *sc); | 346 | void ath_tx_edma_tasklet(struct ath_softc *sc); |
| 347 | void ath_tx_cabq(struct ieee80211_hw *hw, struct sk_buff *skb); | 347 | void ath_tx_cabq(struct ieee80211_hw *hw, struct sk_buff *skb); |
| 348 | bool ath_tx_aggr_check(struct ath_softc *sc, struct ath_node *an, u8 tidno); | 348 | bool ath_tx_aggr_check(struct ath_softc *sc, struct ath_node *an, u8 tidno); |
| 349 | void ath_tx_aggr_start(struct ath_softc *sc, struct ieee80211_sta *sta, | 349 | int ath_tx_aggr_start(struct ath_softc *sc, struct ieee80211_sta *sta, |
| 350 | u16 tid, u16 *ssn); | 350 | u16 tid, u16 *ssn); |
| 351 | void ath_tx_aggr_stop(struct ath_softc *sc, struct ieee80211_sta *sta, u16 tid); | 351 | void ath_tx_aggr_stop(struct ath_softc *sc, struct ieee80211_sta *sta, u16 tid); |
| 352 | void ath_tx_aggr_resume(struct ath_softc *sc, struct ieee80211_sta *sta, u16 tid); | 352 | void ath_tx_aggr_resume(struct ath_softc *sc, struct ieee80211_sta *sta, u16 tid); |
| 353 | void ath9k_enable_ps(struct ath_softc *sc); | 353 | void 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 | ||
| 786 | void ath_tx_aggr_start(struct ath_softc *sc, struct ieee80211_sta *sta, | 786 | int 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 | ||
| 799 | void ath_tx_aggr_stop(struct ath_softc *sc, struct ieee80211_sta *sta, u16 tid) | 805 | void ath_tx_aggr_stop(struct ath_softc *sc, struct ieee80211_sta *sta, u16 tid) |
