Search Linux Wireless

[PATCH] wifi: rtw88: usb: Make work queues high prio

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



From: Petter Mabacker <petter.mabacker@xxxxxxx>

The rtw8822cu driver have problem to handle high rx or tx rates compared
with high load (such as high I/O) on slower systems, such as for example
i.MX6 SoloX and similar platforms.

The problems are more frequent when having the access point close to the
device. On slower systems it's often enough to download a large file,
combined with generating I/O load to trigger:

[  374.763424] rtw_8822cu 1-1.2:1.2: failed to get tx report from firmware
[  377.771790] rtw_8822cu 1-1.2:1.2: failed to send h2c command
[  407.813460] rtw_8822cu 1-1.2:1.2: firmware failed to report density after scan
[  414.965826] rtw_8822cu 1-1.2:1.2: failed to send h2c command
[  444.993462] rtw_8822cu 1-1.2:1.2: firmware failed to report density after scan
[  452.144551] rtw_8822cu 1-1.2:1.2: failed to send h2c command
[  482.183445] rtw_8822cu 1-1.2:1.2: firmware failed to report density after scan
[  489.426263] rtw_8822cu 1-1.2:1.2: failed to send h2c command

Another way is to simply perform a wifi rescan.

Benchmarking shows that setting a high prio workqueue for tx/rx will
significally improve things. Also compared alloc_workqueue with
alloc_ordered_workqueue, but even thou the later seems to slightly
improve things it's still quite easy to reproduce the above issues. So
that leads to the decision to go for alloc_workqueue.

Thanks to Ping-Ke Shih <pkshih@xxxxxxxxxxx> that came up with the idea
of exploring tweaking of the work queue's within a similar discussion.

Fixes: a82dfd33d1237 ("wifi: rtw88: Add common USB chip support")
Signed-off-by: Petter Mabacker <petter.mabacker@xxxxxxx>
---
 drivers/net/wireless/realtek/rtw88/usb.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/net/wireless/realtek/rtw88/usb.c b/drivers/net/wireless/realtek/rtw88/usb.c
index 44a5fafb9905..bfe0845528ec 100644
--- a/drivers/net/wireless/realtek/rtw88/usb.c
+++ b/drivers/net/wireless/realtek/rtw88/usb.c
@@ -716,7 +716,7 @@ static int rtw_usb_init_rx(struct rtw_dev *rtwdev)
 	struct rtw_usb *rtwusb = rtw_get_usb_priv(rtwdev);
 	int i;
 
-	rtwusb->rxwq = create_singlethread_workqueue("rtw88_usb: rx wq");
+	rtwusb->rxwq = alloc_workqueue("rtw88_usb: rx wq", WQ_UNBOUND | WQ_HIGHPRI, 0);
 	if (!rtwusb->rxwq) {
 		rtw_err(rtwdev, "failed to create RX work queue\n");
 		return -ENOMEM;
@@ -750,7 +750,7 @@ static int rtw_usb_init_tx(struct rtw_dev *rtwdev)
 	struct rtw_usb *rtwusb = rtw_get_usb_priv(rtwdev);
 	int i;
 
-	rtwusb->txwq = create_singlethread_workqueue("rtw88_usb: tx wq");
+	rtwusb->txwq = alloc_workqueue("rtw88_usb: tx wq", WQ_UNBOUND | WQ_HIGHPRI, 0);
 	if (!rtwusb->txwq) {
 		rtw_err(rtwdev, "failed to create TX work queue\n");
 		return -ENOMEM;
-- 
2.39.2




[Index of Archives]     [Linux Host AP]     [ATH6KL]     [Linux Wireless Personal Area Network]     [Linux Bluetooth]     [Wireless Regulations]     [Linux Netdev]     [Kernel Newbies]     [Linux Kernel]     [IDE]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite Hiking]     [MIPS Linux]     [ARM Linux]     [Linux RAID]

  Powered by Linux