This series addresses issues for the recently added RTW88 USB support
reported by Andreas Henriksson and also our customer.
The hardware can't handle urbs that have a size of multiple of the
bulkout_size (usually 512 bytes). The symptom is that the hardware
stalls completely. The issue can be reproduced by sending a suitably
sized ping packet from the device:
ping -s 394 <somehost>
(It's 394 bytes here on a RTL8822CU and RTL8821CU, the actual size may
differ on other chips, it was 402 bytes on a RTL8723DU)
Other than that qsel was not set correctly. The sympton here is that
only one of multiple bulk endpoints was used to send data.
Changes since v1:
- Use URB_ZERO_PACKET to let the USB host controller handle it automatically
rather than working around the issue.
Sascha Hauer (3):
wifi: rtw88: usb: Set qsel correctly
wifi: rtw88: usb: send Zero length packets if necessary
wifi: rtw88: usb: drop now unnecessary URB size check
drivers/net/wireless/realtek/rtw88/usb.c | 18 +++---------------
1 file changed, 3 insertions(+), 15 deletions(-)
--
2.30.2
Zero length packets are necessary when sending URBs with size
multiple of bulkout_size, otherwise the hardware just stalls.
Fixes: a82dfd33d1237 ("wifi: rtw88: Add common USB chip support")
Signed-off-by: Sascha Hauer <[email protected]>
---
drivers/net/wireless/realtek/rtw88/usb.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/drivers/net/wireless/realtek/rtw88/usb.c b/drivers/net/wireless/realtek/rtw88/usb.c
index d9e995544e405..1a09c9288198a 100644
--- a/drivers/net/wireless/realtek/rtw88/usb.c
+++ b/drivers/net/wireless/realtek/rtw88/usb.c
@@ -271,6 +271,7 @@ static int rtw_usb_write_port(struct rtw_dev *rtwdev, u8 qsel, struct sk_buff *s
return -ENOMEM;
usb_fill_bulk_urb(urb, usbd, pipe, skb->data, skb->len, cb, context);
+ urb->transfer_flags |= URB_ZERO_PACKET;
ret = usb_submit_urb(urb, GFP_ATOMIC);
usb_free_urb(urb);
--
2.30.2
Hello Sacha Hauer,
Thanks alot for fixing this!
On Fri, Feb 10, 2023 at 12:16:29PM +0100, Sascha Hauer wrote:
> This series addresses issues for the recently added RTW88 USB support
> reported by Andreas Henriksson and also our customer.
>
> The hardware can't handle urbs that have a size of multiple of the
> bulkout_size (usually 512 bytes). The symptom is that the hardware
> stalls completely. The issue can be reproduced by sending a suitably
> sized ping packet from the device:
>
> ping -s 394 <somehost>
>
> (It's 394 bytes here on a RTL8822CU and RTL8821CU, the actual size may
> differ on other chips, it was 402 bytes on a RTL8723DU)
I can confirm that with these patches applied that my LM842 dongle
now works reliably on my imx6sx board. On the same board the traffic
would previously usually stall after 80-130MB when downloading.
With patches applied I succesfully completed:
wget -O /dev/null http://speedtest.tele2.net/10GB.zip
Uploading did not seem to trigger the problem before but I still
tested and uploading a gigabyte was no problem using:
curl -T /dev/urandom http://speedtest.tele2.net/upload.php -O /dev/null
Did not attempt the suggested ping method of reproducing on the old
system, but on the new kernel I could do
$ for a in $(seq 128 512); do ping -n -c 3 -s $a ping.sunet.se ; done
without any stalls.
Feel free to add either or both of:
Reported-by: Andreas Henriksson <[email protected]>
Tested-by: Andreas Henriksson <[email protected]>
>
> Other than that qsel was not set correctly. The sympton here is that
> only one of multiple bulk endpoints was used to send data.
>
> Changes since v1:
> - Use URB_ZERO_PACKET to let the USB host controller handle it automatically
> rather than working around the issue.
>
> Sascha Hauer (3):
> wifi: rtw88: usb: Set qsel correctly
> wifi: rtw88: usb: send Zero length packets if necessary
> wifi: rtw88: usb: drop now unnecessary URB size check
>
> drivers/net/wireless/realtek/rtw88/usb.c | 18 +++---------------
> 1 file changed, 3 insertions(+), 15 deletions(-)
>
> --
> 2.30.2
>
Regards,
Andreas Henriksson
> -----Original Message-----
> From: Sascha Hauer <[email protected]>
> Sent: Friday, February 10, 2023 7:17 PM
> To: [email protected]
> Cc: Neo Jou <[email protected]>; Hans Ulli Kroll <[email protected]>; Ping-Ke Shih <[email protected]>;
> Yan-Hsuan Chuang <[email protected]>; Kalle Valo <[email protected]>; [email protected];
> [email protected]; Martin Blumenstingl <[email protected]>;
> [email protected]; Alexander Hochbaum <[email protected]>; Da Xue <[email protected]>; Bernie Huang
> <[email protected]>; Andreas Henriksson <[email protected]>; Viktor Petrenko <[email protected]>; Sascha
> Hauer <[email protected]>
> Subject: [PATCH v2 2/3] wifi: rtw88: usb: send Zero length packets if necessary
>
> Zero length packets are necessary when sending URBs with size
> multiple of bulkout_size, otherwise the hardware just stalls.
>
> Fixes: a82dfd33d1237 ("wifi: rtw88: Add common USB chip support")
> Signed-off-by: Sascha Hauer <[email protected]>
Reviewed-by: Ping-Ke Shih <[email protected]>
> ---
> drivers/net/wireless/realtek/rtw88/usb.c | 1 +
> 1 file changed, 1 insertion(+)
>
> diff --git a/drivers/net/wireless/realtek/rtw88/usb.c b/drivers/net/wireless/realtek/rtw88/usb.c
> index d9e995544e405..1a09c9288198a 100644
> --- a/drivers/net/wireless/realtek/rtw88/usb.c
> +++ b/drivers/net/wireless/realtek/rtw88/usb.c
> @@ -271,6 +271,7 @@ static int rtw_usb_write_port(struct rtw_dev *rtwdev, u8 qsel, struct sk_buff *s
> return -ENOMEM;
>
> usb_fill_bulk_urb(urb, usbd, pipe, skb->data, skb->len, cb, context);
> + urb->transfer_flags |= URB_ZERO_PACKET;
> ret = usb_submit_urb(urb, GFP_ATOMIC);
>
> usb_free_urb(urb);
> --
> 2.30.2