aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless
diff options
context:
space:
mode:
authorSenthil Balasubramanian <senthilkumar@atheros.com>2008-12-22 06:01:58 -0500
committerJohn W. Linville <linville@tuxdriver.com>2009-01-12 14:24:55 -0500
commitd3a1db1c67735063921d9186145fc86164cf9781 (patch)
tree59b961f7110af3d00717dba282f042121a87b366 /drivers/net/wireless
parentf3d340c1d536fd3e5a104c99ac9c3f8694270d72 (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.c38
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
288static int setup_tx_flags(struct ath_softc *sc, struct sk_buff *skb, 285static 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,