On 18/01/2024 02:37, Ping-Ke Shih wrote: > > >> -----Original Message----- >> From: Bitterblue Smith <rtl8821cerfe2@xxxxxxxxx> >> Sent: Thursday, January 18, 2024 4:12 AM >> To: linux-wireless@xxxxxxxxxxxxxxx >> Cc: Ping-Ke Shih <pkshih@xxxxxxxxxxx>; Larry Finger <Larry.Finger@xxxxxxxxxxxx> >> Subject: [PATCH v2] wifi: rtlwifi: Speed up firmware loading for USB >> >> Currently it takes almost 6 seconds to upload the firmware for RTL8192CU >> (and 11 seconds for RTL8192DU). That's because the firmware is uploaded >> one byte at a time. >> >> Also, after plugging the device, the firmware gets uploaded three times >> before a connection to the AP is established. >> >> Maybe this is fine for most users, but when testing changes to the >> driver it's really annoying to wait so long. >> >> Speed up the firmware upload by writing chunks of 64 bytes at a time. >> This way it takes about 110 ms for RTL8192CU (and about 210 ms for >> RTL8192DU). >> >> PCI devices could upload it in chunks of 4 bytes, but I don't have any >> to test and commit 89d32c9071aa ("rtlwifi: Download firmware as bytes >> rather than as dwords") decided otherwise anyway. >> >> Allocate memory for the firmware image with kmalloc instead of vzalloc >> because this memory is passed directly to usb_control_msg(), which >> can't take memory allocated by vmalloc. >> >> Signed-off-by: Bitterblue Smith <rtl8821cerfe2@xxxxxxxxx> > > Acked-by: Ping-Ke Shih <pkshih@xxxxxxxxxxx> > > [...] > >> diff --git a/drivers/net/wireless/realtek/rtlwifi/usb.c b/drivers/net/wireless/realtek/rtlwifi/usb.c >> index 07a7e6fa46af..1fc480fe18ad 100644 >> --- a/drivers/net/wireless/realtek/rtlwifi/usb.c >> +++ b/drivers/net/wireless/realtek/rtlwifi/usb.c >> @@ -125,6 +125,14 @@ static void _usb_write32_sync(struct rtl_priv *rtlpriv, u32 addr, u32 val) >> _usb_write_sync(rtlpriv, addr, val, 4); >> } >> >> +static void _usb_write_chunk_sync(struct rtl_priv *rtlpriv, u32 addr, >> + u32 length, u8 *data) >> +{ >> + struct usb_device *udev = to_usb_device(rtlpriv->io.dev); >> + >> + _usbctrl_vendorreq_sync(udev, REALTEK_USB_VENQT_WRITE, addr, data, length); > > Just curious. Originally, it uses 1/2/4 as length for write8/16/32, and this > patch additionally uses 8/64 as length. Any limitation of argument 'length' of > this function? Is arbitrary number disallowed? > I didn't find anything in the usb_control_msg() documentation. I only found this issue, where some people say 0xffff is fine, but older hardware may have a limit of 4096: https://github.com/libusb/libusb/issues/125 rtl8xxxu uses lengths of 32, 94, 124, 126, 128, 156, 254 bytes. Some other Realtek wifi drivers use 196 bytes.