aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/rt2x00/rt2800usb.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireless/rt2x00/rt2800usb.c')
-rw-r--r--drivers/net/wireless/rt2x00/rt2800usb.c14
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
117static void rt2800usb_tx_sta_fifo_read_completed(struct rt2x00_dev *rt2x00dev, 117static 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
141static void rt2800usb_tx_dma_done(struct queue_entry *entry) 142static 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,