rt2x00: rt2800usb: do not check packedid for aggregated frames
authorStanislaw Gruszka <sgruszka@redhat.com>
Wed, 14 Mar 2012 10:16:20 +0000 (11:16 +0100)
committerJohn W. Linville <linville@tuxdriver.com>
Thu, 15 Mar 2012 17:40:32 +0000 (13:40 -0400)
Tx statuses of aggregated subframes contain packetid of first subframe
in the AMPDU. We can not identify AMPDU subframes based on packedid, so
simply assume that status match first pending frame in the queue. Thats
mostly the same what 2800pci do.

Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
Acked-by: Gertjan van Wingerde <gwingerde@gmail.com>
Acked-by: Helmut Schaa <helmut.schaa@googlemail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/rt2x00/rt2800usb.c

index eacf94b2f3821364bc0c1353d6ae2622eb519f0a..8c1d2c0df85424102e09ec68b3185e6e09eb5f56 100644 (file)
@@ -502,7 +502,7 @@ rt2800usb_txdone_entry_check(struct queue_entry *entry, u32 reg)
        __le32 *txwi;
        u32 word;
        int wcid, ack, pid;
-       int tx_wcid, tx_ack, tx_pid;
+       int tx_wcid, tx_ack, tx_pid, is_agg;
 
        /*
         * This frames has returned with an IO error,
@@ -515,6 +515,7 @@ rt2800usb_txdone_entry_check(struct queue_entry *entry, u32 reg)
        wcid    = rt2x00_get_field32(reg, TX_STA_FIFO_WCID);
        ack     = rt2x00_get_field32(reg, TX_STA_FIFO_TX_ACK_REQUIRED);
        pid     = rt2x00_get_field32(reg, TX_STA_FIFO_PID_TYPE);
+       is_agg  = rt2x00_get_field32(reg, TX_STA_FIFO_TX_AGGRE);
 
        /*
         * Validate if this TX status report is intended for
@@ -527,7 +528,7 @@ rt2800usb_txdone_entry_check(struct queue_entry *entry, u32 reg)
        tx_ack  = rt2x00_get_field32(word, TXWI_W1_ACK);
        tx_pid  = rt2x00_get_field32(word, TXWI_W1_PACKETID);
 
-       if ((wcid != tx_wcid) || (ack != tx_ack) || (pid != tx_pid)) {
+       if (wcid != tx_wcid || ack != tx_ack || (!is_agg && pid != tx_pid)) {
                WARNING(entry->queue->rt2x00dev,
                        "TX status report missed for queue %d entry %d\n",
                        entry->queue->qid, entry->entry_idx);