diff options
author | Felix Fietkau <nbd@openwrt.org> | 2010-12-10 15:16:46 -0500 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2010-12-13 15:23:30 -0500 |
commit | 248a38d0ed754bf9f002e66f3d607e12ae6a673c (patch) | |
tree | fa4d6499eddaa54b74c5ba604ebafced34d364b2 /drivers | |
parent | 207aba6018a7b1757b5248ced2b280d20790c498 (diff) |
ath9k: fix sequence number assigment for non-AMPDU QoS data frames
wireless-testing commit 04caf863750bc7e042d1e8d57e5ce9d6326ab435
('ath9k: more tx setup cleanups') merged tx path code for HT vs
non-HT frames, however it did not pass the tid pointer to
ath_tx_send_normal, causing an inconsistency between AMPDU vs
non-AMPDU sequence number handling.
Fix this by always passing in the tid pointer for all QoS data frames.
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/net/wireless/ath/ath9k/xmit.c | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/drivers/net/wireless/ath/ath9k/xmit.c b/drivers/net/wireless/ath/ath9k/xmit.c index 43c0109f202c..966236953e77 100644 --- a/drivers/net/wireless/ath/ath9k/xmit.c +++ b/drivers/net/wireless/ath/ath9k/xmit.c | |||
@@ -1685,17 +1685,20 @@ static void ath_tx_start_dma(struct ath_softc *sc, struct ath_buf *bf, | |||
1685 | struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb); | 1685 | struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb); |
1686 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; | 1686 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; |
1687 | struct list_head bf_head; | 1687 | struct list_head bf_head; |
1688 | struct ath_atx_tid *tid; | 1688 | struct ath_atx_tid *tid = NULL; |
1689 | u8 tidno; | 1689 | u8 tidno; |
1690 | 1690 | ||
1691 | spin_lock_bh(&txctl->txq->axq_lock); | 1691 | spin_lock_bh(&txctl->txq->axq_lock); |
1692 | 1692 | ||
1693 | if ((tx_info->flags & IEEE80211_TX_CTL_AMPDU) && txctl->an) { | 1693 | if (ieee80211_is_data_qos(hdr->frame_control) && txctl->an) { |
1694 | tidno = ieee80211_get_qos_ctl(hdr)[0] & | 1694 | tidno = ieee80211_get_qos_ctl(hdr)[0] & |
1695 | IEEE80211_QOS_CTL_TID_MASK; | 1695 | IEEE80211_QOS_CTL_TID_MASK; |
1696 | tid = ATH_AN_2_TID(txctl->an, tidno); | 1696 | tid = ATH_AN_2_TID(txctl->an, tidno); |
1697 | 1697 | ||
1698 | WARN_ON(tid->ac->txq != txctl->txq); | 1698 | WARN_ON(tid->ac->txq != txctl->txq); |
1699 | } | ||
1700 | |||
1701 | if ((tx_info->flags & IEEE80211_TX_CTL_AMPDU) && tid) { | ||
1699 | /* | 1702 | /* |
1700 | * Try aggregation if it's a unicast data frame | 1703 | * Try aggregation if it's a unicast data frame |
1701 | * and the destination is HT capable. | 1704 | * and the destination is HT capable. |
@@ -1712,7 +1715,7 @@ static void ath_tx_start_dma(struct ath_softc *sc, struct ath_buf *bf, | |||
1712 | ar9003_hw_set_paprd_txdesc(sc->sc_ah, bf->bf_desc, | 1715 | ar9003_hw_set_paprd_txdesc(sc->sc_ah, bf->bf_desc, |
1713 | bf->bf_state.bfs_paprd); | 1716 | bf->bf_state.bfs_paprd); |
1714 | 1717 | ||
1715 | ath_tx_send_normal(sc, txctl->txq, NULL, &bf_head); | 1718 | ath_tx_send_normal(sc, txctl->txq, tid, &bf_head); |
1716 | } | 1719 | } |
1717 | 1720 | ||
1718 | spin_unlock_bh(&txctl->txq->axq_lock); | 1721 | spin_unlock_bh(&txctl->txq->axq_lock); |