Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 040a7278 authored by George's avatar George Committed by John W. Linville
Browse files

rtlwifi: rtl8192cu: Allow retries for USB I/O



The USB driver does not retry reads - allow 10 tries.

Signed-off-by: default avatarGeorge <george0505@realtek.com>
Signed-off-by: default avatarLarry Finger <Larry.Finger@lwfinger.net>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 4745fc09
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -32,7 +32,7 @@

#define FW_8192C_SIZE				0x3000
#define FW_8192C_START_ADDRESS			0x1000
#define FW_8192C_END_ADDRESS			0x3FFF
#define FW_8192C_END_ADDRESS			0x1FFF
#define FW_8192C_PAGE_SIZE			4096
#define FW_8192C_POLLING_DELAY			5
#define FW_8192C_POLLING_TIMEOUT_COUNT		100
+15 −3
Original line number Diff line number Diff line
@@ -33,6 +33,7 @@
#include "usb.h"
#include "base.h"
#include "ps.h"
#include "rtl8192c/fw_common.h"

#define	REALTEK_USB_VENQT_READ			0xC0
#define	REALTEK_USB_VENQT_WRITE			0x40
@@ -40,6 +41,7 @@
#define	REALTEK_USB_VENQT_CMD_IDX		0x00

#define REALTEK_USB_VENQT_MAX_BUF_SIZE		254
#define MAX_USBCTRL_VENDORREQ_TIMES		10

static void usbctrl_async_callback(struct urb *urb)
{
@@ -99,13 +101,23 @@ static int _usbctrl_vendorreq_sync_read(struct usb_device *udev, u8 request,
	unsigned int pipe;
	int status;
	u8 reqtype;
	int vendorreq_times = 0;

	pipe = usb_rcvctrlpipe(udev, 0); /* read_in */
	reqtype =  REALTEK_USB_VENQT_READ;

	status = usb_control_msg(udev, pipe, request, reqtype, value, index,
				 pdata, len, 0); /* max. timeout */

	while (++vendorreq_times <= MAX_USBCTRL_VENDORREQ_TIMES) {
		status = usb_control_msg(udev, pipe, request, reqtype, value,
					 index, pdata, len, 0); /*max. timeout*/
		if (status < 0) {
			/* firmware download is checksumed, don't retry */
			if ((value >= FW_8192C_START_ADDRESS &&
			    value <= FW_8192C_END_ADDRESS))
				break;
		} else {
			break;
		}
	}
	if (status < 0)
		pr_err("reg 0x%x, usbctrl_vendorreq TimeOut! status:0x%x value=0x%x\n",
		       value, status, *(u32 *)pdata);