aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/rt2x00
diff options
context:
space:
mode:
authorStanislaw Gruszka <sgruszka@redhat.com>2013-10-18 05:36:54 -0400
committerJohn W. Linville <linville@tuxdriver.com>2013-10-18 13:41:11 -0400
commit36165fd5b00bf8163f89c21bb16a3e9834555b10 (patch)
tree666b0e1b64584cd684e0e8c3d06f32c380cc4a69 /drivers/net/wireless/rt2x00
parent5671ab05cf2a579218985ef56595387932d78ee4 (diff)
rt2800usb: slow down TX status polling
Polling TX statuses too frequently has two negative effects. First is randomly peek CPU usage, causing overall system functioning delays. Second bad effect is that device is not able to fill TX statuses in H/W register on some workloads and we get lot of timeouts like below: ieee80211 phy4: rt2800usb_entry_txstatus_timeout: Warning - TX status timeout for entry 7 in queue 2 ieee80211 phy4: rt2800usb_entry_txstatus_timeout: Warning - TX status timeout for entry 7 in queue 2 ieee80211 phy4: rt2800usb_txdone: Warning - Got TX status for an empty queue 2, dropping This not only cause flood of messages in dmesg, but also bad throughput, since rate scaling algorithm can not work optimally. In the future, we should probably make polling interval be adjusted automatically, but for now just increase values, this make mentioned problems gone. Resolve: https://bugzilla.kernel.org/show_bug.cgi?id=62781 Cc: stable@vger.kernel.org Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/rt2x00')
-rw-r--r--drivers/net/wireless/rt2x00/rt2800usb.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/drivers/net/wireless/rt2x00/rt2800usb.c b/drivers/net/wireless/rt2x00/rt2800usb.c
index 96961b9a395c..4feb35aef990 100644
--- a/drivers/net/wireless/rt2x00/rt2800usb.c
+++ b/drivers/net/wireless/rt2x00/rt2800usb.c
@@ -148,6 +148,8 @@ static bool rt2800usb_txstatus_timeout(struct rt2x00_dev *rt2x00dev)
148 return false; 148 return false;
149} 149}
150 150
151#define TXSTATUS_READ_INTERVAL 1000000
152
151static bool rt2800usb_tx_sta_fifo_read_completed(struct rt2x00_dev *rt2x00dev, 153static bool rt2800usb_tx_sta_fifo_read_completed(struct rt2x00_dev *rt2x00dev,
152 int urb_status, u32 tx_status) 154 int urb_status, u32 tx_status)
153{ 155{
@@ -176,8 +178,9 @@ static bool rt2800usb_tx_sta_fifo_read_completed(struct rt2x00_dev *rt2x00dev,
176 queue_work(rt2x00dev->workqueue, &rt2x00dev->txdone_work); 178 queue_work(rt2x00dev->workqueue, &rt2x00dev->txdone_work);
177 179
178 if (rt2800usb_txstatus_pending(rt2x00dev)) { 180 if (rt2800usb_txstatus_pending(rt2x00dev)) {
179 /* Read register after 250 us */ 181 /* Read register after 1 ms */
180 hrtimer_start(&rt2x00dev->txstatus_timer, ktime_set(0, 250000), 182 hrtimer_start(&rt2x00dev->txstatus_timer,
183 ktime_set(0, TXSTATUS_READ_INTERVAL),
181 HRTIMER_MODE_REL); 184 HRTIMER_MODE_REL);
182 return false; 185 return false;
183 } 186 }
@@ -202,8 +205,9 @@ static void rt2800usb_async_read_tx_status(struct rt2x00_dev *rt2x00dev)
202 if (test_and_set_bit(TX_STATUS_READING, &rt2x00dev->flags)) 205 if (test_and_set_bit(TX_STATUS_READING, &rt2x00dev->flags))
203 return; 206 return;
204 207
205 /* Read TX_STA_FIFO register after 500 us */ 208 /* Read TX_STA_FIFO register after 2 ms */
206 hrtimer_start(&rt2x00dev->txstatus_timer, ktime_set(0, 500000), 209 hrtimer_start(&rt2x00dev->txstatus_timer,
210 ktime_set(0, 2*TXSTATUS_READ_INTERVAL),
207 HRTIMER_MODE_REL); 211 HRTIMER_MODE_REL);
208} 212}
209 213