| From df71c9cfceea801e7e26e2c74241758ef9c042e5 Mon Sep 17 00:00:00 2001 |
| From: Stanislaw Gruszka <sgruszka@redhat.com> |
| Date: Wed, 10 Aug 2011 15:32:23 +0200 |
| Subject: rt2x00: fix order of entry flags modification |
| |
| From: Stanislaw Gruszka <sgruszka@redhat.com> |
| |
| commit df71c9cfceea801e7e26e2c74241758ef9c042e5 upstream. |
| |
| In rt2800usb_work_txdone we check flags in order: |
| |
| - ENTRY_OWNER_DEVICE_DATA |
| - ENTRY_DATA_STATUS_PENDING |
| - ENTRY_DATA_IO_FAILED |
| |
| Modify flags in separate order in rt2x00usb_interrupt_txdone, to avoid |
| processing entries in _txdone with wrong flags or skip processing |
| ready entries. |
| |
| Reported-by: Justin Piszcz <jpiszcz@lucidpixels.com> |
| Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com> |
| Acked-by: Ivo van Doorn <IvDoorn@gmail.com> |
| Signed-off-by: John W. Linville <linville@tuxdriver.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/net/wireless/rt2x00/rt2x00usb.c | 17 +++++++---------- |
| 1 file changed, 7 insertions(+), 10 deletions(-) |
| |
| --- a/drivers/net/wireless/rt2x00/rt2x00usb.c |
| +++ b/drivers/net/wireless/rt2x00/rt2x00usb.c |
| @@ -262,23 +262,20 @@ static void rt2x00usb_interrupt_txdone(s |
| struct queue_entry *entry = (struct queue_entry *)urb->context; |
| struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev; |
| |
| - if (!test_and_clear_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags)) |
| + if (!test_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags)) |
| return; |
| - |
| - if (rt2x00dev->ops->lib->tx_dma_done) |
| - rt2x00dev->ops->lib->tx_dma_done(entry); |
| - |
| - /* |
| - * Report the frame as DMA done |
| - */ |
| - rt2x00lib_dmadone(entry); |
| - |
| /* |
| * Check if the frame was correctly uploaded |
| */ |
| if (urb->status) |
| set_bit(ENTRY_DATA_IO_FAILED, &entry->flags); |
| + /* |
| + * Report the frame as DMA done |
| + */ |
| + rt2x00lib_dmadone(entry); |
| |
| + if (rt2x00dev->ops->lib->tx_dma_done) |
| + rt2x00dev->ops->lib->tx_dma_done(entry); |
| /* |
| * Schedule the delayed work for reading the TX status |
| * from the device. |