ath9k: fix mac80211 queue lookup for waking up queues
authorFelix Fietkau <nbd@openwrt.org>
Sat, 12 Jun 2010 04:33:49 +0000 (00:33 -0400)
committerJohn W. Linville <linville@tuxdriver.com>
Mon, 14 Jun 2010 19:39:30 +0000 (15:39 -0400)
ath_get_mac80211_qnum() expects the queue 'subtype'
(internal ID for the WMM AC) as argument when looking up
the mac80211 queue, however ath_wake_mac80211_queue provides
txq->axq_qnum instead, which contains the hardware queue
number. Fix this by keeping track of the WMM class ID in
the txq data structure.

Signed-off-by: Felix Fietkau <nbd@openwrt.org>
Cc: stable@kernel.org
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/ath/ath9k/ath9k.h
drivers/net/wireless/ath/ath9k/xmit.c

index c00946d..c5c6629 100644 (file)
@@ -194,6 +194,7 @@ enum ATH_AGGR_STATUS {
 
 #define ATH_TXFIFO_DEPTH 8
 struct ath_txq {
+       int axq_class;
        u32 axq_qnum;
        u32 *axq_link;
        struct list_head axq_q;
index 7547c8f..ec124fb 100644 (file)
@@ -941,6 +941,7 @@ struct ath_txq *ath_txq_setup(struct ath_softc *sc, int qtype, int subtype)
        if (!ATH_TXQ_SETUP(sc, qnum)) {
                struct ath_txq *txq = &sc->tx.txq[qnum];
 
+               txq->axq_class = subtype;
                txq->axq_qnum = qnum;
                txq->axq_link = NULL;
                INIT_LIST_HEAD(&txq->axq_q);
@@ -2047,7 +2048,7 @@ static void ath_wake_mac80211_queue(struct ath_softc *sc, struct ath_txq *txq)
 
        spin_lock_bh(&txq->axq_lock);
        if (txq->stopped && txq->pending_frames < ATH_MAX_QDEPTH) {
-               qnum = ath_get_mac80211_qnum(txq->axq_qnum, sc);
+               qnum = ath_get_mac80211_qnum(txq->axq_class, sc);
                if (qnum != -1) {
                        ath_mac80211_start_queue(sc, qnum);
                        txq->stopped = 0;