diff options
author | Senthil Balasubramanian <senthilkumar@atheros.com> | 2008-12-22 06:01:58 -0500 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2009-01-12 14:24:55 -0500 |
commit | d3a1db1c67735063921d9186145fc86164cf9781 (patch) | |
tree | 59b961f7110af3d00717dba282f042121a87b366 /drivers/net/wireless | |
parent | f3d340c1d536fd3e5a104c99ac9c3f8694270d72 (diff) |
ath9k: Fix incorrect sequence numbering for unaggregated QoS Frame.
This patch fixes an issue with the sequence numbers of unaggregated
QoS frames, because of which the frames are handled in a different order
at the AP and resulted in MLME REPLAYFAILURE.
Signed-off-by: Senthil Balasubramanian <senthilkumar@atheros.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless')
-rw-r--r-- | drivers/net/wireless/ath9k/xmit.c | 38 |
1 files changed, 17 insertions, 21 deletions
diff --git a/drivers/net/wireless/ath9k/xmit.c b/drivers/net/wireless/ath9k/xmit.c index 3bfc3b90f256..1ea9428c0cd2 100644 --- a/drivers/net/wireless/ath9k/xmit.c +++ b/drivers/net/wireless/ath9k/xmit.c | |||
@@ -264,25 +264,22 @@ static void assign_aggr_tid_seqno(struct sk_buff *skb, | |||
264 | } | 264 | } |
265 | 265 | ||
266 | /* Get seqno */ | 266 | /* Get seqno */ |
267 | 267 | /* For HT capable stations, we save tidno for later use. | |
268 | if (ieee80211_is_data(fc) && !is_pae(skb)) { | 268 | * We also override seqno set by upper layer with the one |
269 | /* For HT capable stations, we save tidno for later use. | 269 | * in tx aggregation state. |
270 | * We also override seqno set by upper layer with the one | 270 | * |
271 | * in tx aggregation state. | 271 | * If fragmentation is on, the sequence number is |
272 | * | 272 | * not overridden, since it has been |
273 | * If fragmentation is on, the sequence number is | 273 | * incremented by the fragmentation routine. |
274 | * not overridden, since it has been | 274 | * |
275 | * incremented by the fragmentation routine. | 275 | * FIXME: check if the fragmentation threshold exceeds |
276 | * | 276 | * IEEE80211 max. |
277 | * FIXME: check if the fragmentation threshold exceeds | 277 | */ |
278 | * IEEE80211 max. | 278 | tid = ATH_AN_2_TID(an, bf->bf_tidno); |
279 | */ | 279 | hdr->seq_ctrl = cpu_to_le16(tid->seq_next << |
280 | tid = ATH_AN_2_TID(an, bf->bf_tidno); | 280 | IEEE80211_SEQ_SEQ_SHIFT); |
281 | hdr->seq_ctrl = cpu_to_le16(tid->seq_next << | 281 | bf->bf_seqno = tid->seq_next; |
282 | IEEE80211_SEQ_SEQ_SHIFT); | 282 | INCR(tid->seq_next, IEEE80211_SEQ_MAX); |
283 | bf->bf_seqno = tid->seq_next; | ||
284 | INCR(tid->seq_next, IEEE80211_SEQ_MAX); | ||
285 | } | ||
286 | } | 283 | } |
287 | 284 | ||
288 | static int setup_tx_flags(struct ath_softc *sc, struct sk_buff *skb, | 285 | static int setup_tx_flags(struct ath_softc *sc, struct sk_buff *skb, |
@@ -1718,11 +1715,10 @@ static int ath_tx_setup_buffer(struct ath_softc *sc, struct ath_buf *bf, | |||
1718 | 1715 | ||
1719 | /* Assign seqno, tidno */ | 1716 | /* Assign seqno, tidno */ |
1720 | 1717 | ||
1721 | if (bf_isht(bf) && (sc->sc_flags & SC_OP_TXAGGR)) | 1718 | if (ieee80211_is_data_qos(fc) && (sc->sc_flags & SC_OP_TXAGGR)) |
1722 | assign_aggr_tid_seqno(skb, bf); | 1719 | assign_aggr_tid_seqno(skb, bf); |
1723 | 1720 | ||
1724 | /* DMA setup */ | 1721 | /* DMA setup */ |
1725 | |||
1726 | bf->bf_mpdu = skb; | 1722 | bf->bf_mpdu = skb; |
1727 | 1723 | ||
1728 | bf->bf_dmacontext = pci_map_single(sc->pdev, skb->data, | 1724 | bf->bf_dmacontext = pci_map_single(sc->pdev, skb->data, |