12c7ac7
Polling TX statuses too frequently has two negative effects. First is
12c7ac7
randomly peek CPU usage, causing overall system functioning delays.
12c7ac7
Second bad effect is that device is not able to fill TX statuses in
12c7ac7
H/W register on some workloads and we get lot of timeouts like below:
12c7ac7
12c7ac7
ieee80211 phy4: rt2800usb_entry_txstatus_timeout: Warning - TX status timeout for entry 7 in queue 2
12c7ac7
ieee80211 phy4: rt2800usb_entry_txstatus_timeout: Warning - TX status timeout for entry 7 in queue 2
12c7ac7
ieee80211 phy4: rt2800usb_txdone: Warning - Got TX status for an empty queue 2, dropping
12c7ac7
12c7ac7
This not only cause flood of messages in dmesg, but also bad throughput,
12c7ac7
since rate scaling algorithm can not work optimally.
12c7ac7
12c7ac7
In the future, we should probably make polling interval be adjusted
12c7ac7
automatically, but for now just increase values, this make mentioned
12c7ac7
problems gone.
12c7ac7
12c7ac7
Resolve:
12c7ac7
https://bugzilla.kernel.org/show_bug.cgi?id=62781
12c7ac7
12c7ac7
Cc: stable@vger.kernel.org
12c7ac7
Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
12c7ac7
---
12c7ac7
 drivers/net/wireless/rt2x00/rt2800usb.c | 8 ++++----
12c7ac7
 1 file changed, 4 insertions(+), 4 deletions(-)
12c7ac7
12c7ac7
diff --git a/drivers/net/wireless/rt2x00/rt2800usb.c b/drivers/net/wireless/rt2x00/rt2800usb.c
12c7ac7
index 96677ce5..e095e61 100644
12c7ac7
--- a/drivers/net/wireless/rt2x00/rt2800usb.c
12c7ac7
+++ b/drivers/net/wireless/rt2x00/rt2800usb.c
12c7ac7
@@ -176,8 +176,8 @@ static bool rt2800usb_tx_sta_fifo_read_completed(struct rt2x00_dev *rt2x00dev,
12c7ac7
 		queue_work(rt2x00dev->workqueue, &rt2x00dev->txdone_work);
12c7ac7
 
12c7ac7
 	if (rt2800usb_txstatus_pending(rt2x00dev)) {
12c7ac7
-		/* Read register after 250 us */
12c7ac7
-		hrtimer_start(&rt2x00dev->txstatus_timer, ktime_set(0, 250000),
12c7ac7
+		/* Read register after 1 ms */
12c7ac7
+		hrtimer_start(&rt2x00dev->txstatus_timer, ktime_set(0, 1000000),
12c7ac7
 			      HRTIMER_MODE_REL);
12c7ac7
 		return false;
12c7ac7
 	}
12c7ac7
@@ -202,8 +202,8 @@ static void rt2800usb_async_read_tx_status(struct rt2x00_dev *rt2x00dev)
12c7ac7
 	if (test_and_set_bit(TX_STATUS_READING, &rt2x00dev->flags))
12c7ac7
 		return;
12c7ac7
 
12c7ac7
-	/* Read TX_STA_FIFO register after 500 us */
12c7ac7
-	hrtimer_start(&rt2x00dev->txstatus_timer, ktime_set(0, 500000),
12c7ac7
+	/* Read TX_STA_FIFO register after 2 ms */
12c7ac7
+	hrtimer_start(&rt2x00dev->txstatus_timer, ktime_set(0, 2000000),
12c7ac7
 		      HRTIMER_MODE_REL);
12c7ac7
 }
12c7ac7
 
12c7ac7
-- 
12c7ac7
1.8.3.1