/******************************************************************************
 *
 * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of version 2 of the GNU General Public License as
 * published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
 * more details.
 *
 ******************************************************************************/
#define _HCI_OPS_OS_C_

#include <osdep_service.h>
#include <drv_types.h>
#include <osdep_intf.h>
#include <usb_ops.h>
#include <recv_osdep.h>
#include <rtl8723a_hal.h>
#include <rtl8723a_recv.h>

static int usbctrl_vendorreq(struct intf_hdl *pintfhdl, u8 request, u16 value, u16 index, void *pdata, u16 len, u8 requesttype)
{
	struct rtw_adapter		*padapter = pintfhdl->padapter ;
	struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter);
	struct usb_device *udev = pdvobjpriv->pusbdev;

	unsigned int pipe;
	int status = 0;
	u8 reqtype;
	u8 *pIo_buf;
	int vendorreq_times = 0;

	if ((padapter->bSurpriseRemoved) || (padapter->pwrctrlpriv.pnp_bstop_trx)) {
		RT_TRACE(_module_hci_ops_os_c_, _drv_err_,
			 ("usbctrl_vendorreq:(padapter->bSurpriseRemoved||adapter->pwrctrlpriv.pnp_bstop_trx)!!!\n"));
		status = -EPERM;
		goto exit;
	}

	if (len > MAX_VENDOR_REQ_CMD_SIZE) {
		DBG_8723A("[%s] Buffer len error , vendor request failed\n", __FUNCTION__);
		status = -EINVAL;
		goto exit;
	}

	mutex_lock(&pdvobjpriv->usb_vendor_req_mutex);

	/*  Acquire IO memory for vendorreq */
	pIo_buf = pdvobjpriv->usb_vendor_req_buf;

	if (pIo_buf == NULL) {
		DBG_8723A("[%s] pIo_buf == NULL \n", __FUNCTION__);
		status = -ENOMEM;
		goto release_mutex;
	}

	while (++vendorreq_times <= MAX_USBCTRL_VENDORREQ_TIMES) {
		memset(pIo_buf, 0, len);

		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;
			memcpy(pIo_buf, pdata, len);
		}

		status = rtw_usb_control_msg(udev, pipe, request, reqtype,
					     value, index, pIo_buf, len,
					     RTW_USB_CONTROL_MSG_TIMEOUT);

		if (status == len) {   /*  Success this control transfer. */
			rtw_reset_continual_urb_error(pdvobjpriv);
			if (requesttype == 0x01) {
				/* For Control read transfer, we have to copy
				 * the read data from pIo_buf to pdata.
				 */
				memcpy(pdata, pIo_buf,  len);
			}
		} else { /*  error cases */
			DBG_8723A("reg 0x%x, usb %s %u fail, status:%d value ="
				  " 0x%x, vendorreq_times:%d\n",
				  value, (requesttype == 0x01) ? "read" : "write",
				  len, status, *(u32 *)pdata, vendorreq_times);

			if (status < 0) {
				if (status == (-ESHUTDOWN) || status == -ENODEV) {
					padapter->bSurpriseRemoved = true;
				} else {
					struct hal_data_8723a	*pHalData = GET_HAL_DATA(padapter);
					pHalData->srestpriv.Wifi_Error_Status = USB_VEN_REQ_CMD_FAIL;
				}
			} else { /*  status != len && status >= 0 */
				if (status > 0) {
					if (requesttype == 0x01) {
						/*  For Control read transfer, we have to copy
						 * the read data from pIo_buf to pdata.
						 */
						memcpy(pdata, pIo_buf,  len);
					}
				}
			}

			if (rtw_inc_and_chk_continual_urb_error(pdvobjpriv)) {
				padapter->bSurpriseRemoved = true;
				break;
			}

		}

		/*  firmware download is checksumed, don't retry */
		if ((value >= FW_8723A_START_ADDRESS && value <= FW_8723A_END_ADDRESS) || status == len)
			break;
	}

release_mutex:
	mutex_unlock(&pdvobjpriv->usb_vendor_req_mutex);
exit:
	return status;
}

static u8 usb_read8(struct intf_hdl *pintfhdl, 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;

	usbctrl_vendorreq(pintfhdl, request, wvalue, index, &data, len, requesttype);

	return data;
}

static u16 usb_read16(struct intf_hdl *pintfhdl, u32 addr)
{
	u8 request;
	u8 requesttype;
	u16 wvalue;
	u16 index;
	u16 len;
	u16 data = 0;

	request = 0x05;
	requesttype = 0x01;/* read_in */
	index = 0;/* n/a */

	wvalue = (u16)(addr&0x0000ffff);
	len = 2;

	usbctrl_vendorreq(pintfhdl, request, wvalue, index, &data, len, requesttype);

	return data;
}

static u32 usb_read32(struct intf_hdl *pintfhdl, u32 addr)
{
	u8 request;
	u8 requesttype;
	u16 wvalue;
	u16 index;
	u16 len;
	u32 data = 0;

	request = 0x05;
	requesttype = 0x01;/* read_in */
	index = 0;/* n/a */

	wvalue = (u16)(addr&0x0000ffff);
	len = 4;

	usbctrl_vendorreq(pintfhdl, request, wvalue, index, &data, len, requesttype);

	return data;
}

static int usb_write8(struct intf_hdl *pintfhdl, u32 addr, u8 val)
{
	u8 request;
	u8 requesttype;
	u16 wvalue;
	u16 index;
	u16 len;
	u8 data;
	int ret;

	request = 0x05;
	requesttype = 0x00;/* write_out */
	index = 0;/* n/a */

	wvalue = (u16)(addr&0x0000ffff);
	len = 1;

	data = val;

	ret = usbctrl_vendorreq(pintfhdl, request, wvalue, index, &data, len, requesttype);

	return ret;
}

static int usb_write16(struct intf_hdl *pintfhdl, u32 addr, u16 val)
{
	u8 request;
	u8 requesttype;
	u16 wvalue;
	u16 index;
	u16 len;
	u16 data;
	int ret;

	request = 0x05;
	requesttype = 0x00;/* write_out */
	index = 0;/* n/a */

	wvalue = (u16)(addr&0x0000ffff);
	len = 2;

	data = val;

	ret = usbctrl_vendorreq(pintfhdl, request, wvalue, index, &data, len, requesttype);
	return ret;
}

static int usb_write32(struct intf_hdl *pintfhdl, u32 addr, u32 val)
{
	u8 request;
	u8 requesttype;
	u16 wvalue;
	u16 index;
	u16 len;
	u32 data;
	int ret;

	request = 0x05;
	requesttype = 0x00;/* write_out */
	index = 0;/* n/a */

	wvalue = (u16)(addr&0x0000ffff);
	len = 4;
	data = val;

	ret = usbctrl_vendorreq(pintfhdl, request, wvalue, index, &data, len, requesttype);

	return ret;
}

static int usb_writeN(struct intf_hdl *pintfhdl, u32 addr, u32 length, u8 *pdata)
{
	u8 request;
	u8 requesttype;
	u16 wvalue;
	u16 index;
	u16 len;
	u8 buf[VENDOR_CMD_MAX_DATA_LEN] = {0};
	int ret;

	request = 0x05;
	requesttype = 0x00;/* write_out */
	index = 0;/* n/a */

	wvalue = (u16)(addr&0x0000ffff);
	len = length;
	 memcpy(buf, pdata, len);

	ret = usbctrl_vendorreq(pintfhdl, request, wvalue, index, buf, len, requesttype);

	return ret;
}

/*
 * Description:
 *	Recognize the interrupt content by reading the interrupt
 *	register or content and masking interrupt mask (IMR)
 *	if it is our NIC's interrupt. After recognizing, we may clear
 *	the all interrupts (ISR).
 * Arguments:
 *	[in] Adapter -
 *		The adapter context.
 *	[in] pContent -
 *		Under PCI interface, this field is ignord.
 *		Under USB interface, the content is the interrupt
 *		content pointer.
 *		Under SDIO interface, this is the interrupt type which
 *		is Local interrupt or system interrupt.
 *	[in] ContentLen -
 *		The length in byte of pContent.
 * Return:
 *	If any interrupt matches the mask (IMR), return true, and
 *	return false otherwise.
 */
static bool
InterruptRecognized8723AU(struct rtw_adapter *Adapter, void *pContent,
			  u32 ContentLen)
{
	struct hal_data_8723a	*pHalData = GET_HAL_DATA(Adapter);
	u8 *buffer = (u8 *)pContent;
	struct reportpwrstate_parm report;

	memcpy(&pHalData->IntArray[0], &buffer[USB_INTR_CONTENT_HISR_OFFSET],
	       4);
	pHalData->IntArray[0] &= pHalData->IntrMask[0];

	/* For HISR extension. Added by tynli. 2009.10.07. */
	memcpy(&pHalData->IntArray[1],
	       &buffer[USB_INTR_CONTENT_HISRE_OFFSET], 4);
	pHalData->IntArray[1] &= pHalData->IntrMask[1];

	/* We sholud remove this function later because DDK suggest
	 * not to executing too many operations in MPISR  */

	memcpy(&report.state, &buffer[USB_INTR_CPWM_OFFSET], 1);

	return ((pHalData->IntArray[0])&pHalData->IntrMask[0]) != 0 ||
		((pHalData->IntArray[1])&pHalData->IntrMask[1]) != 0;
}

static void usb_read_interrupt_complete(struct urb *purb, struct pt_regs *regs)
{
	int err;
	struct rtw_adapter *padapter = (struct rtw_adapter *)purb->context;

	if (padapter->bSurpriseRemoved || padapter->bDriverStopped ||
	    padapter->bReadPortCancel) {
		DBG_8723A("%s() RX Warning! bDriverStopped(%d) OR "
			  "bSurpriseRemoved(%d) bReadPortCancel(%d)\n",
			  __FUNCTION__, padapter->bDriverStopped,
			  padapter->bSurpriseRemoved,
			  padapter->bReadPortCancel);
		return;
	}

	if (purb->status == 0) {
		struct c2h_evt_hdr *c2h_evt;

		c2h_evt = (struct c2h_evt_hdr *)purb->transfer_buffer;

		if (purb->actual_length > USB_INTR_CONTENT_LENGTH) {
			DBG_8723A("usb_read_interrupt_complete: purb->actual_"
				  "length > USB_INTR_CONTENT_LENGTH\n");
			goto urb_submit;
		}

		InterruptRecognized8723AU(padapter, purb->transfer_buffer,
					  purb->actual_length);

		if (c2h_evt_exist(c2h_evt)) {
			if (c2h_id_filter_ccx_8723a(c2h_evt->id)) {
				/* Handle CCX report here */
				handle_txrpt_ccx_8723a(padapter, (void *)(c2h_evt->payload));
				/* Replace with special pointer to
				   trigger c2h_evt_clear23a */
				if (rtw_cbuf_push23a(padapter->evtpriv.c2h_queue,
						  (void *)&padapter->evtpriv) !=
				    _SUCCESS)
					DBG_8723A("%s rtw_cbuf_push23a fail\n",
						  __func__);
				schedule_work(&padapter->evtpriv.c2h_wk);
			} else if ((c2h_evt = (struct c2h_evt_hdr *)
				    kmalloc(16, GFP_ATOMIC))) {
				memcpy(c2h_evt, purb->transfer_buffer, 16);
				if (rtw_cbuf_push23a(padapter->evtpriv.c2h_queue,
						  (void *)c2h_evt) != _SUCCESS)
					DBG_8723A("%s rtw_cbuf_push23a fail\n",
						  __func__);
				schedule_work(&padapter->evtpriv.c2h_wk);
			} else {
				/* Error handling for malloc fail */
				if (rtw_cbuf_push23a(padapter->evtpriv.c2h_queue,
						  (void *)NULL) != _SUCCESS)
					DBG_8723A("%s rtw_cbuf_push23a fail\n",
						  __func__);
				schedule_work(&padapter->evtpriv.c2h_wk);
			}
		}

urb_submit:
		err = usb_submit_urb(purb, GFP_ATOMIC);
		if (err && (err != -EPERM)) {
			DBG_8723A("cannot submit interrupt in-token(err = "
				  "0x%08x), urb_status = %d\n",
				  err, purb->status);
		}
	} else {
		DBG_8723A("###=> usb_read_interrupt_complete => urb "
			  "status(%d)\n", purb->status);

		switch (purb->status) {
		case -EINVAL:
		case -EPIPE:
		case -ENODEV:
		case -ESHUTDOWN:
			RT_TRACE(_module_hci_ops_os_c_, _drv_err_,
				 ("usb_read_port_complete:bSurpriseRemoved ="
				  "true\n"));
			/* Fall Through here */
		case -ENOENT:
			padapter->bDriverStopped = true;
			RT_TRACE(_module_hci_ops_os_c_, _drv_err_,
				 ("usb_read_port_complete:bDriverStopped ="
				  "true\n"));
			break;
		case -EPROTO:
			break;
		case -EINPROGRESS:
			DBG_8723A("ERROR: URB IS IN PROGRESS!/n");
			break;
		default:
			break;
		}
	}
}

static u32 usb_read_interrupt(struct intf_hdl *pintfhdl, u32 addr)
{
	int err;
	unsigned int pipe;
	u32 ret = _SUCCESS;
	struct rtw_adapter *adapter = pintfhdl->padapter;
	struct dvobj_priv *pdvobj = adapter_to_dvobj(adapter);
	struct recv_priv *precvpriv = &adapter->recvpriv;
	struct usb_device *pusbd = pdvobj->pusbdev;

	/* translate DMA FIFO addr to pipehandle */
	pipe = ffaddr2pipehdl23a(pdvobj, addr);

	usb_fill_int_urb(precvpriv->int_in_urb, pusbd, pipe,
			 precvpriv->int_in_buf, USB_INTR_CONTENT_LENGTH,
			 usb_read_interrupt_complete, adapter, 1);

	err = usb_submit_urb(precvpriv->int_in_urb, GFP_ATOMIC);
	if (err && (err != -EPERM)) {
		DBG_8723A("cannot submit interrupt in-token(err = 0x%08x),"
			  "urb_status = %d\n", err,
			  precvpriv->int_in_urb->status);
		ret = _FAIL;
	}

	return ret;
}

static int recvbuf2recvframe(struct rtw_adapter *padapter, struct sk_buff *pskb)
{
	u8	*pbuf;
	u8	shift_sz = 0;
	u16	pkt_cnt;
	u32	pkt_offset, skb_len, alloc_sz;
	s32	transfer_len;
	struct recv_stat	*prxstat;
	struct phy_stat	*pphy_info = NULL;
	struct sk_buff		*pkt_copy = NULL;
	struct recv_frame	*precvframe = NULL;
	struct rx_pkt_attrib	*pattrib = NULL;
	struct recv_priv	*precvpriv = &padapter->recvpriv;
	struct rtw_queue	*pfree_recv_queue = &precvpriv->free_recv_queue;

	transfer_len = (s32)pskb->len;
	pbuf = pskb->data;

	prxstat = (struct recv_stat *)pbuf;
	pkt_cnt = (le32_to_cpu(prxstat->rxdw2) >> 16) & 0xff;

	do {
		RT_TRACE(_module_rtl871x_recv_c_, _drv_info_,
			 ("recvbuf2recvframe: rxdesc = offsset 0:0x%08x, "
			  "4:0x%08x, 8:0x%08x, C:0x%08x\n", prxstat->rxdw0,
			  prxstat->rxdw1, prxstat->rxdw2, prxstat->rxdw4));

		prxstat = (struct recv_stat *)pbuf;

		precvframe = rtw_alloc_recvframe23a(pfree_recv_queue);
		if (!precvframe) {
			RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
				 ("recvbuf2recvframe: precvframe == NULL\n"));
			DBG_8723A("%s()-%d: rtw_alloc_recvframe23a() failed! RX "
				  "Drop!\n", __FUNCTION__, __LINE__);
			goto _exit_recvbuf2recvframe;
		}

		INIT_LIST_HEAD(&precvframe->list);

		update_recvframe_attrib(precvframe, prxstat);

		pattrib = &precvframe->attrib;

		if (pattrib->crc_err) {
			DBG_8723A("%s()-%d: RX Warning! rx CRC ERROR !!\n",
				  __FUNCTION__, __LINE__);
			rtw_free_recvframe23a(precvframe, pfree_recv_queue);
			goto _exit_recvbuf2recvframe;
		}

		pkt_offset = RXDESC_SIZE + pattrib->drvinfo_sz +
			pattrib->shift_sz + pattrib->pkt_len;

		if ((pattrib->pkt_len <= 0) || (pkt_offset > transfer_len)) {
			RT_TRACE(_module_rtl871x_recv_c_, _drv_info_,
				 ("recvbuf2recvframe: pkt_len<= 0\n"));
			DBG_8723A("%s()-%d: RX Warning!\n",
				  __FUNCTION__, __LINE__);
			rtw_free_recvframe23a(precvframe, pfree_recv_queue);
			goto _exit_recvbuf2recvframe;
		}

		/*	Modified by Albert 20101213 */
		/*	For 8 bytes IP header alignment. */
		/*	Qos data, wireless lan header length is 26 */
		if (pattrib->qos) {
			shift_sz = 6;
		} else {
			shift_sz = 0;
		}

		skb_len = pattrib->pkt_len;

		/* for first fragment packet, driver need allocate
		 * 1536+drvinfo_sz+RXDESC_SIZE to defrag packet.
		 * modify alloc_sz for recvive crc error packet
		 * by thomas 2011-06-02 */
		if ((pattrib->mfrag == 1) && (pattrib->frag_num == 0)) {
			/* alloc_sz = 1664;	1664 is 128 alignment. */
			if (skb_len <= 1650)
				alloc_sz = 1664;
			else
				alloc_sz = skb_len + 14;
		} else {
			alloc_sz = skb_len;
		/*  6 is for IP header 8 bytes alignment in QoS packet case. */
		/*  8 is for skb->data 4 bytes alignment. */
			alloc_sz += 14;
		}

		pkt_copy = netdev_alloc_skb(padapter->pnetdev, alloc_sz);
		if (pkt_copy) {
			pkt_copy->dev = padapter->pnetdev;
			precvframe->pkt = pkt_copy;
			skb_reserve(pkt_copy, 8 - ((unsigned long)(pkt_copy->data) & 7));/* force pkt_copy->data at 8-byte alignment address */
	/*force ip_hdr at 8-byte alignment address according to shift_sz. */
			skb_reserve(pkt_copy, shift_sz);
			memcpy(pkt_copy->data, (pbuf + pattrib->shift_sz + pattrib->drvinfo_sz + RXDESC_SIZE), skb_len);
			skb_put(pkt_copy, skb_len);
		} else {
			if ((pattrib->mfrag == 1) && (pattrib->frag_num == 0)) {
				DBG_8723A("recvbuf2recvframe: alloc_skb fail, "
					  "drop frag frame \n");
				rtw_free_recvframe23a(precvframe,
						   pfree_recv_queue);
				goto _exit_recvbuf2recvframe;
			}

			precvframe->pkt = skb_clone(pskb, GFP_ATOMIC);
			if (!precvframe->pkt) {
				DBG_8723A("recvbuf2recvframe: skb_clone "
					  "fail\n");
				rtw_free_recvframe23a(precvframe,
						   pfree_recv_queue);
				goto _exit_recvbuf2recvframe;
			}
		}

		if (pattrib->physt) {
			pphy_info = (struct phy_stat *)(pbuf + RXDESC_OFFSET);
			update_recvframe_phyinfo(precvframe, pphy_info);
		}

		if (rtw_recv_entry23a(precvframe) != _SUCCESS)
			RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
				 ("recvbuf2recvframe: rtw_recv_entry23a"
				  "(precvframe) != _SUCCESS\n"));

		pkt_cnt--;
		transfer_len -= pkt_offset;
		pbuf += pkt_offset;
		precvframe = NULL;
		pkt_copy = NULL;

		if (transfer_len > 0 && pkt_cnt == 0)
			pkt_cnt = (le32_to_cpu(prxstat->rxdw2)>>16) & 0xff;

	} while ((transfer_len > 0) && (pkt_cnt > 0));

_exit_recvbuf2recvframe:

	return _SUCCESS;
}

void rtl8723au_recv_tasklet(void *priv)
{
	struct sk_buff *pskb;
	struct rtw_adapter *padapter = (struct rtw_adapter *)priv;
	struct recv_priv *precvpriv = &padapter->recvpriv;

	while (NULL != (pskb = skb_dequeue(&precvpriv->rx_skb_queue))) {
		if ((padapter->bDriverStopped) ||
		    (padapter->bSurpriseRemoved)) {
			DBG_8723A("recv_tasklet => bDriverStopped or "
				  "bSurpriseRemoved \n");
			dev_kfree_skb_any(pskb);
			break;
		}

		recvbuf2recvframe(padapter, pskb);
		skb_reset_tail_pointer(pskb);

		pskb->len = 0;

		skb_queue_tail(&precvpriv->free_recv_skb_queue, pskb);
	}
}

static void usb_read_port_complete(struct urb *purb, struct pt_regs *regs)
{
	struct recv_buf *precvbuf = (struct recv_buf *)purb->context;
	struct rtw_adapter *padapter = (struct rtw_adapter *)precvbuf->adapter;
	struct recv_priv *precvpriv = &padapter->recvpriv;
	struct hal_data_8723a *pHalData;

	RT_TRACE(_module_hci_ops_os_c_, _drv_err_,
		 ("usb_read_port_complete!!!\n"));

	precvpriv->rx_pending_cnt--;

	if (padapter->bSurpriseRemoved || padapter->bDriverStopped ||
	    padapter->bReadPortCancel) {
		RT_TRACE(_module_hci_ops_os_c_, _drv_err_,
			 ("usb_read_port_complete:bDriverStopped(%d) OR "
			  "bSurpriseRemoved(%d)\n", padapter->bDriverStopped,
			  padapter->bSurpriseRemoved));

		DBG_8723A("%s()-%d: RX Warning! bDriverStopped(%d) OR "
			  "bSurpriseRemoved(%d) bReadPortCancel(%d)\n",
			  __FUNCTION__, __LINE__, padapter->bDriverStopped,
			  padapter->bSurpriseRemoved, padapter->bReadPortCancel);
		return;
	}

	if (purb->status == 0) {
		if ((purb->actual_length > MAX_RECVBUF_SZ) ||
		    (purb->actual_length < RXDESC_SIZE)) {
			RT_TRACE(_module_hci_ops_os_c_, _drv_err_,
				 ("usb_read_port_complete: (purb->actual_"
				  "length > MAX_RECVBUF_SZ) || (purb->actual_"
				  "length < RXDESC_SIZE)\n"));
			rtw_read_port(padapter, precvpriv->ff_hwaddr, 0,
				      precvbuf);
			DBG_8723A("%s()-%d: RX Warning!\n",
				  __FUNCTION__, __LINE__);
		} else {
			rtw_reset_continual_urb_error(
				adapter_to_dvobj(padapter));

			skb_put(precvbuf->pskb, purb->actual_length);
			skb_queue_tail(&precvpriv->rx_skb_queue,
				       precvbuf->pskb);

			if (skb_queue_len(&precvpriv->rx_skb_queue) <= 1)
				tasklet_schedule(&precvpriv->recv_tasklet);

			precvbuf->pskb = NULL;
			rtw_read_port(padapter, precvpriv->ff_hwaddr, 0,
				      precvbuf);
		}
	} else {
		RT_TRACE(_module_hci_ops_os_c_, _drv_err_,
			 ("usb_read_port_complete : purb->status(%d) != 0 \n",
			  purb->status));
		skb_put(precvbuf->pskb, purb->actual_length);
		precvbuf->pskb = NULL;

		DBG_8723A("###=> usb_read_port_complete => urb status(%d)\n",
			  purb->status);

		if (rtw_inc_and_chk_continual_urb_error(
			    adapter_to_dvobj(padapter))) {
			padapter->bSurpriseRemoved = true;
		}

		switch (purb->status) {
		case -EINVAL:
		case -EPIPE:
		case -ENODEV:
		case -ESHUTDOWN:
			RT_TRACE(_module_hci_ops_os_c_, _drv_err_,
				 ("usb_read_port_complete:bSurprise"
				  "Removed = true\n"));
			/* Intentional fall through here */
		case -ENOENT:
			padapter->bDriverStopped = true;
			RT_TRACE(_module_hci_ops_os_c_, _drv_err_,
				 ("usb_read_port_complete:"
				  "bDriverStopped = true\n"));
			break;
		case -EPROTO:
		case -EOVERFLOW:
			pHalData = GET_HAL_DATA(padapter);
			pHalData->srestpriv.Wifi_Error_Status =
				USB_READ_PORT_FAIL;
			rtw_read_port(padapter, precvpriv->ff_hwaddr,
				      0, precvbuf);
			break;
		case -EINPROGRESS:
			DBG_8723A("ERROR: URB IS IN PROGRESS!/n");
			break;
		default:
			break;
		}

	}
}

static u32 usb_read_port(struct intf_hdl *pintfhdl, u32 addr, u32 cnt,
			 struct recv_buf *precvbuf)
{
	int err;
	unsigned int pipe;
	unsigned long tmpaddr = 0;
	unsigned long alignment = 0;
	u32 ret = _SUCCESS;
	struct urb *purb = NULL;
	struct rtw_adapter		*adapter = pintfhdl->padapter;
	struct dvobj_priv	*pdvobj = adapter_to_dvobj(adapter);
	struct recv_priv	*precvpriv = &adapter->recvpriv;
	struct usb_device	*pusbd = pdvobj->pusbdev;

	if (adapter->bDriverStopped || adapter->bSurpriseRemoved ||
	    adapter->pwrctrlpriv.pnp_bstop_trx) {
		RT_TRACE(_module_hci_ops_os_c_, _drv_err_,
			 ("usb_read_port:(padapter->bDriverStopped ||"
			  "padapter->bSurpriseRemoved ||adapter->"
			  "pwrctrlpriv.pnp_bstop_trx)!!!\n"));
		return _FAIL;
	}

	if (!precvbuf) {
		RT_TRACE(_module_hci_ops_os_c_, _drv_err_,
			 ("usb_read_port:precvbuf == NULL\n"));
		return _FAIL;
	}

	if (!precvbuf->pskb)
		precvbuf->pskb = skb_dequeue(&precvpriv->free_recv_skb_queue);

	rtl8723au_init_recvbuf(adapter, precvbuf);

	/* re-assign for linux based on skb */
	if (!precvbuf->pskb) {
		precvbuf->pskb = netdev_alloc_skb(adapter->pnetdev, MAX_RECVBUF_SZ + RECVBUFF_ALIGN_SZ);
		if (precvbuf->pskb == NULL) {
			RT_TRACE(_module_hci_ops_os_c_, _drv_err_, ("init_recvbuf(): alloc_skb fail!\n"));
			return _FAIL;
		}

		tmpaddr = (unsigned long)precvbuf->pskb->data;
		alignment = tmpaddr & (RECVBUFF_ALIGN_SZ-1);
		skb_reserve(precvbuf->pskb, (RECVBUFF_ALIGN_SZ - alignment));
	}

	precvpriv->rx_pending_cnt++;

	purb = precvbuf->purb;

	/* translate DMA FIFO addr to pipehandle */
	pipe = ffaddr2pipehdl23a(pdvobj, addr);

	usb_fill_bulk_urb(purb, pusbd, pipe, precvbuf->pskb->data,
			  MAX_RECVBUF_SZ, usb_read_port_complete,
			  precvbuf);/* context is precvbuf */

	err = usb_submit_urb(purb, GFP_ATOMIC);
	if ((err) && (err != -EPERM)) {
		RT_TRACE(_module_hci_ops_os_c_, _drv_err_,
			 ("cannot submit rx in-token(err = 0x%.8x), URB_STATUS "
			  "= 0x%.8x", err, purb->status));
		DBG_8723A("cannot submit rx in-token(err = 0x%08x), urb_status "
			  "= %d\n", err, purb->status);
		ret = _FAIL;
	}
	return ret;
}

void rtl8723au_xmit_tasklet(void *priv)
{
	int ret = false;
	struct rtw_adapter *padapter = (struct rtw_adapter *)priv;
	struct xmit_priv *pxmitpriv = &padapter->xmitpriv;

	if (check_fwstate(&padapter->mlmepriv, _FW_UNDER_SURVEY))
		return;

	while (1) {
		if ((padapter->bDriverStopped) ||
		    (padapter->bSurpriseRemoved) ||
		    (padapter->bWritePortCancel)) {
			DBG_8723A("xmit_tasklet => bDriverStopped or "
				  "bSurpriseRemoved or bWritePortCancel\n");
			break;
		}

		ret = rtl8723au_xmitframe_complete(padapter, pxmitpriv, NULL);

		if (!ret)
			break;
	}
}

void rtl8723au_set_intf_ops(struct _io_ops *pops)
{

	memset((u8 *)pops, 0, sizeof(struct _io_ops));

	pops->_read8 = &usb_read8;
	pops->_read16 = &usb_read16;
	pops->_read32 = &usb_read32;
	pops->_read_mem = &usb_read_mem23a;
	pops->_read_port = &usb_read_port;

	pops->_write8 = &usb_write8;
	pops->_write16 = &usb_write16;
	pops->_write32 = &usb_write32;
	pops->_writeN = &usb_writeN;

	pops->_write_mem = &usb_write_mem23a;
	pops->_write_port = &usb_write_port23a;

	pops->_read_port_cancel = &usb_read_port_cancel23a;
	pops->_write_port_cancel = &usb_write_port23a_cancel;

	pops->_read_interrupt = &usb_read_interrupt;
}

void rtl8723au_set_hw_type(struct rtw_adapter *padapter)
{
	padapter->chip_type = RTL8723A;
	padapter->HardwareType = HARDWARE_TYPE_RTL8723AU;
	DBG_8723A("CHIP TYPE: RTL8723A\n");
}
