diff options
Diffstat (limited to 'drivers/net/wireless/rt2x00/rt2800usb.c')
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2800usb.c | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/drivers/net/wireless/rt2x00/rt2800usb.c b/drivers/net/wireless/rt2x00/rt2800usb.c index 0d4e8fa3e1f8..0eb44cf2f44a 100644 --- a/drivers/net/wireless/rt2x00/rt2800usb.c +++ b/drivers/net/wireless/rt2x00/rt2800usb.c | |||
@@ -114,12 +114,12 @@ static bool rt2800usb_txstatus_pending(struct rt2x00_dev *rt2x00dev) | |||
114 | return false; | 114 | return false; |
115 | } | 115 | } |
116 | 116 | ||
117 | static void rt2800usb_tx_sta_fifo_read_completed(struct rt2x00_dev *rt2x00dev, | 117 | static bool rt2800usb_tx_sta_fifo_read_completed(struct rt2x00_dev *rt2x00dev, |
118 | int urb_status, u32 tx_status) | 118 | int urb_status, u32 tx_status) |
119 | { | 119 | { |
120 | if (urb_status) { | 120 | if (urb_status) { |
121 | WARNING(rt2x00dev, "rt2x00usb_register_read_async failed: %d\n", urb_status); | 121 | WARNING(rt2x00dev, "rt2x00usb_register_read_async failed: %d\n", urb_status); |
122 | return; | 122 | return false; |
123 | } | 123 | } |
124 | 124 | ||
125 | /* try to read all TX_STA_FIFO entries before scheduling txdone_work */ | 125 | /* try to read all TX_STA_FIFO entries before scheduling txdone_work */ |
@@ -129,13 +129,14 @@ static void rt2800usb_tx_sta_fifo_read_completed(struct rt2x00_dev *rt2x00dev, | |||
129 | "drop tx status report.\n"); | 129 | "drop tx status report.\n"); |
130 | queue_work(rt2x00dev->workqueue, &rt2x00dev->txdone_work); | 130 | queue_work(rt2x00dev->workqueue, &rt2x00dev->txdone_work); |
131 | } else | 131 | } else |
132 | rt2x00usb_register_read_async(rt2x00dev, TX_STA_FIFO, | 132 | return true; |
133 | rt2800usb_tx_sta_fifo_read_completed); | ||
134 | } else if (!kfifo_is_empty(&rt2x00dev->txstatus_fifo)) { | 133 | } else if (!kfifo_is_empty(&rt2x00dev->txstatus_fifo)) { |
135 | queue_work(rt2x00dev->workqueue, &rt2x00dev->txdone_work); | 134 | queue_work(rt2x00dev->workqueue, &rt2x00dev->txdone_work); |
136 | } else if (rt2800usb_txstatus_pending(rt2x00dev)) { | 135 | } else if (rt2800usb_txstatus_pending(rt2x00dev)) { |
137 | mod_timer(&rt2x00dev->txstatus_timer, jiffies + msecs_to_jiffies(20)); | 136 | mod_timer(&rt2x00dev->txstatus_timer, jiffies + msecs_to_jiffies(2)); |
138 | } | 137 | } |
138 | |||
139 | return false; | ||
139 | } | 140 | } |
140 | 141 | ||
141 | static void rt2800usb_tx_dma_done(struct queue_entry *entry) | 142 | static void rt2800usb_tx_dma_done(struct queue_entry *entry) |
@@ -493,7 +494,7 @@ static void rt2800usb_work_txdone(struct work_struct *work) | |||
493 | * also delayed -> use a timer to retrieve it. | 494 | * also delayed -> use a timer to retrieve it. |
494 | */ | 495 | */ |
495 | if (rt2800usb_txstatus_pending(rt2x00dev)) | 496 | if (rt2800usb_txstatus_pending(rt2x00dev)) |
496 | mod_timer(&rt2x00dev->txstatus_timer, jiffies + msecs_to_jiffies(20)); | 497 | mod_timer(&rt2x00dev->txstatus_timer, jiffies + msecs_to_jiffies(2)); |
497 | } | 498 | } |
498 | 499 | ||
499 | /* | 500 | /* |
@@ -633,6 +634,7 @@ static int rt2800usb_probe_hw(struct rt2x00_dev *rt2x00dev) | |||
633 | __set_bit(CAPABILITY_LINK_TUNING, &rt2x00dev->cap_flags); | 634 | __set_bit(CAPABILITY_LINK_TUNING, &rt2x00dev->cap_flags); |
634 | __set_bit(REQUIRE_HT_TX_DESC, &rt2x00dev->cap_flags); | 635 | __set_bit(REQUIRE_HT_TX_DESC, &rt2x00dev->cap_flags); |
635 | __set_bit(REQUIRE_TXSTATUS_FIFO, &rt2x00dev->cap_flags); | 636 | __set_bit(REQUIRE_TXSTATUS_FIFO, &rt2x00dev->cap_flags); |
637 | __set_bit(REQUIRE_PS_AUTOWAKE, &rt2x00dev->cap_flags); | ||
636 | 638 | ||
637 | setup_timer(&rt2x00dev->txstatus_timer, | 639 | setup_timer(&rt2x00dev->txstatus_timer, |
638 | rt2800usb_tx_sta_fifo_timeout, | 640 | rt2800usb_tx_sta_fifo_timeout, |