diff options
Diffstat (limited to 'drivers/staging/rtl8188eu/os_dep/usb_ops_linux.c')
-rw-r--r-- | drivers/staging/rtl8188eu/os_dep/usb_ops_linux.c | 171 |
1 files changed, 58 insertions, 113 deletions
diff --git a/drivers/staging/rtl8188eu/os_dep/usb_ops_linux.c b/drivers/staging/rtl8188eu/os_dep/usb_ops_linux.c index 6926443bba4e..e8222ffb6fea 100644 --- a/drivers/staging/rtl8188eu/os_dep/usb_ops_linux.c +++ b/drivers/staging/rtl8188eu/os_dep/usb_ops_linux.c @@ -10,6 +10,20 @@ #include <recv_osdep.h> #include <rtw_sreset.h> +#define RTW_USB_CONTROL_MSG_TIMEOUT 500 /* ms */ + +#define MAX_USBCTRL_VENDORREQ_TIMES 10 + +#define ALIGNMENT_UNIT 16 +#define MAX_VENDOR_REQ_CMD_SIZE 254 +#define MAX_USB_IO_CTL_SIZE (MAX_VENDOR_REQ_CMD_SIZE + ALIGNMENT_UNIT) + +#define REALTEK_USB_VENQT_READ (USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE) +#define REALTEK_USB_VENQT_WRITE (USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE) + +#define REALTEK_USB_VENQT_CMD_REQ 0x05 +#define REALTEK_USB_VENQT_CMD_IDX 0x00 + static void interrupt_handler_8188eu(struct adapter *adapt, u16 pkt_len, u8 *pbuf) { struct hal_data_8188e *haldata = adapt->HalData; @@ -181,7 +195,7 @@ _exit_recvbuf2recvframe: return _SUCCESS; } -unsigned int ffaddr2pipehdl(struct dvobj_priv *pdvobj, u32 addr) +static unsigned int ffaddr2pipehdl(struct dvobj_priv *pdvobj, u32 addr) { unsigned int pipe = 0, ep_num = 0; struct usb_device *pusbd = pdvobj->pusbdev; @@ -198,13 +212,13 @@ unsigned int ffaddr2pipehdl(struct dvobj_priv *pdvobj, u32 addr) return pipe; } -static int usbctrl_vendorreq(struct adapter *adapt, u8 request, u16 value, u16 index, void *pdata, u16 len, u8 requesttype) +static int +usbctrl_vendorreq(struct adapter *adapt, u16 value, void *pdata, u16 len, u8 reqtype) { struct dvobj_priv *dvobjpriv = adapter_to_dvobj(adapt); struct usb_device *udev = dvobjpriv->pusbdev; unsigned int pipe; int status = 0; - u8 reqtype; u8 *pIo_buf; int vendorreq_times = 0; @@ -235,36 +249,41 @@ static int usbctrl_vendorreq(struct adapter *adapt, u8 request, u16 value, u16 i goto release_mutex; } - while (++vendorreq_times <= MAX_USBCTRL_VENDORREQ_TIMES) { - memset(pIo_buf, 0, len); + if (reqtype == REALTEK_USB_VENQT_READ) { + pipe = usb_rcvctrlpipe(udev, 0); + } else if (reqtype == REALTEK_USB_VENQT_WRITE) { + pipe = usb_sndctrlpipe(udev, 0); + } else { + status = -EINVAL; + goto free_buf; + } - if (requesttype == 0x01) { - pipe = usb_rcvctrlpipe(udev, 0);/* read_in */ - reqtype = REALTEK_USB_VENQT_READ; - } else { - pipe = usb_sndctrlpipe(udev, 0);/* write_out */ - reqtype = REALTEK_USB_VENQT_WRITE; + while (++vendorreq_times <= MAX_USBCTRL_VENDORREQ_TIMES) { + if (reqtype == REALTEK_USB_VENQT_READ) + memset(pIo_buf, 0, len); + else memcpy(pIo_buf, pdata, len); - } - status = usb_control_msg(udev, pipe, request, reqtype, value, index, pIo_buf, len, RTW_USB_CONTROL_MSG_TIMEOUT); + status = usb_control_msg(udev, pipe, REALTEK_USB_VENQT_CMD_REQ, + reqtype, value, REALTEK_USB_VENQT_CMD_IDX, + pIo_buf, len, RTW_USB_CONTROL_MSG_TIMEOUT); if (status == len) { /* Success this control transfer. */ - if (requesttype == 0x01) + if (reqtype == REALTEK_USB_VENQT_READ) memcpy(pdata, pIo_buf, len); } else { /* error cases */ DBG_88E("reg 0x%x, usb %s %u fail, status:%d value=0x%x, vendorreq_times:%d\n", - value, (requesttype == 0x01) ? "read" : "write", + value, (reqtype == REALTEK_USB_VENQT_READ) ? "read" : "write", len, status, *(u32 *)pdata, vendorreq_times); if (status < 0) { - if (status == (-ESHUTDOWN) || status == -ENODEV) + if (status == -ESHUTDOWN || status == -ENODEV) adapt->bSurpriseRemoved = true; else adapt->HalData->srestpriv.wifi_error_status = USB_VEN_REQ_CMD_FAIL; } else { /* status != len && status >= 0 */ if (status > 0) { - if (requesttype == 0x01) { + if (reqtype == REALTEK_USB_VENQT_READ) { /* For Control read transfer, we have to copy the read data from pIo_buf to pdata. */ memcpy(pdata, pIo_buf, len); } @@ -276,8 +295,9 @@ static int usbctrl_vendorreq(struct adapter *adapt, u8 request, u16 value, u16 i if ((value >= FW_8188E_START_ADDRESS && value <= FW_8188E_END_ADDRESS) || status == len) break; } - kfree(pIo_buf); +free_buf: + kfree(pIo_buf); release_mutex: mutex_unlock(&dvobjpriv->usb_vendor_req_mutex); exit: @@ -286,66 +306,35 @@ exit: u8 usb_read8(struct adapter *adapter, u32 addr) { - u8 request; - u8 requesttype; - u16 wvalue; - u16 index; - u16 len; - u8 data = 0; - - request = 0x05; - requesttype = 0x01;/* read_in */ - index = 0;/* n/a */ - - wvalue = (u16)(addr & 0x0000ffff); - len = 1; + u16 wvalue = (u16)(addr & 0xffff); + u8 data; - usbctrl_vendorreq(adapter, request, wvalue, index, &data, len, requesttype); + usbctrl_vendorreq(adapter, wvalue, &data, 1, REALTEK_USB_VENQT_READ); return data; } u16 usb_read16(struct adapter *adapter, u32 addr) { - u8 request; - u8 requesttype; - u16 wvalue; - u16 index; - u16 len; + u16 wvalue = (u16)(addr & 0xffff); __le32 data; - request = 0x05; - requesttype = 0x01;/* read_in */ - index = 0;/* n/a */ - wvalue = (u16)(addr & 0x0000ffff); - len = 2; - usbctrl_vendorreq(adapter, request, wvalue, index, &data, len, requesttype); + usbctrl_vendorreq(adapter, wvalue, &data, 2, REALTEK_USB_VENQT_READ); return (u16)(le32_to_cpu(data) & 0xffff); } u32 usb_read32(struct adapter *adapter, u32 addr) { - u8 request; - u8 requesttype; - u16 wvalue; - u16 index; - u16 len; + u16 wvalue = (u16)(addr & 0xffff); __le32 data; - request = 0x05; - requesttype = 0x01;/* read_in */ - index = 0;/* n/a */ - - wvalue = (u16)(addr & 0x0000ffff); - len = 4; - - usbctrl_vendorreq(adapter, request, wvalue, index, &data, len, requesttype); + usbctrl_vendorreq(adapter, wvalue, &data, 4, REALTEK_USB_VENQT_READ); return le32_to_cpu(data); } -static void usb_read_port_complete(struct urb *purb, struct pt_regs *regs) +static void usb_read_port_complete(struct urb *purb) { struct recv_buf *precvbuf = (struct recv_buf *)purb->context; struct adapter *adapt = (struct adapter *)precvbuf->adapter; @@ -508,67 +497,29 @@ void rtw_hal_inirp_deinit(struct adapter *padapter) int usb_write8(struct adapter *adapter, u32 addr, u8 val) { - u8 request; - u8 requesttype; - u16 wvalue; - u16 index; - u16 len; - u8 data; + u16 wvalue = (u16)(addr & 0xffff); + u8 data = val; - request = 0x05; - requesttype = 0x00;/* write_out */ - index = 0;/* n/a */ - wvalue = (u16)(addr & 0x0000ffff); - len = 1; - data = val; - return usbctrl_vendorreq(adapter, request, wvalue, - index, &data, len, requesttype); + return usbctrl_vendorreq(adapter, wvalue, &data, 1, REALTEK_USB_VENQT_WRITE); } int usb_write16(struct adapter *adapter, u32 addr, u16 val) { - u8 request; - u8 requesttype; - u16 wvalue; - u16 index; - u16 len; - __le32 data; - - request = 0x05; - requesttype = 0x00;/* write_out */ - index = 0;/* n/a */ + u16 wvalue = (u16)(addr & 0xffff); + __le32 data = cpu_to_le32(val & 0xffff); - wvalue = (u16)(addr & 0x0000ffff); - len = 2; - - data = cpu_to_le32(val & 0x0000ffff); - - return usbctrl_vendorreq(adapter, request, wvalue, - index, &data, len, requesttype); + return usbctrl_vendorreq(adapter, wvalue, &data, 2, REALTEK_USB_VENQT_WRITE); } int usb_write32(struct adapter *adapter, u32 addr, u32 val) { - u8 request; - u8 requesttype; - u16 wvalue; - u16 index; - u16 len; - __le32 data; - - request = 0x05; - requesttype = 0x00;/* write_out */ - index = 0;/* n/a */ + u16 wvalue = (u16)(addr & 0xffff); + __le32 data = cpu_to_le32(val); - wvalue = (u16)(addr & 0x0000ffff); - len = 4; - data = cpu_to_le32(val); - - return usbctrl_vendorreq(adapter, request, wvalue, - index, &data, len, requesttype); + return usbctrl_vendorreq(adapter, wvalue, &data, 4, REALTEK_USB_VENQT_WRITE); } -static void usb_write_port_complete(struct urb *purb, struct pt_regs *regs) +static void usb_write_port_complete(struct urb *purb) { struct xmit_buf *pxmitbuf = (struct xmit_buf *)purb->context; struct adapter *padapter = pxmitbuf->padapter; @@ -724,20 +675,14 @@ u32 usb_write_port(struct adapter *padapter, u32 addr, u32 cnt, struct xmit_buf ("%s(): usb_submit_urb, status =%x\n", __func__, status)); - switch (status) { - case -ENODEV: + if (status == -ENODEV) padapter->bDriverStopped = true; - break; - default: - break; - } + goto exit; } ret = _SUCCESS; -/* We add the URB_ZERO_PACKET flag to urb so that the host will send the zero packet automatically. */ - RT_TRACE(_module_hci_ops_os_c_, _drv_err_, ("-%s\n", __func__)); exit: |