1 /******************************************************************************
3 * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
18 *******************************************************************************/
19 #define _USB_OPS_LINUX_C_
21 #include <drv_types.h>
23 #include <rtw_sreset.h>
25 struct rtw_async_write_data {
26 u8 data[VENDOR_CMD_MAX_DATA_LEN];
27 struct usb_ctrlrequest dr;
30 int usbctrl_vendorreq(struct intf_hdl *pintfhdl, u8 request, u16 value, u16 index, void *pdata, u16 len, u8 requesttype)
32 _adapter *padapter = pintfhdl->padapter;
33 struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter);
34 struct pwrctrl_priv *pwrctl = dvobj_to_pwrctl(pdvobjpriv);
35 struct usb_device *udev=pdvobjpriv->pusbdev;
42 int vendorreq_times = 0;
44 #ifdef CONFIG_USB_VENDOR_REQ_BUFFER_DYNAMIC_ALLOCATE
46 #else // use stack memory
47 u8 tmp_buf[MAX_USB_IO_CTL_SIZE];
50 #ifdef CONFIG_CONCURRENT_MODE
51 if(padapter->adapter_type > PRIMARY_ADAPTER)
53 padapter = padapter->pbuddy_adapter;
54 pdvobjpriv = adapter_to_dvobj(padapter);
55 udev = pdvobjpriv->pusbdev;
59 //DBG_871X("%s %s:%d\n",__FUNCTION__, current->comm, current->pid);
61 if (RTW_CANNOT_IO(padapter)){
62 RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usbctrl_vendorreq:(RTW_CANNOT_IO)!!!\n"));
67 if(len>MAX_VENDOR_REQ_CMD_SIZE){
68 DBG_8192C( "[%s] Buffer len error ,vendor request failed\n", __FUNCTION__ );
73 #ifdef CONFIG_USB_VENDOR_REQ_MUTEX
74 _enter_critical_mutex(&pdvobjpriv->usb_vendor_req_mutex, NULL);
78 // Acquire IO memory for vendorreq
79 #ifdef CONFIG_USB_VENDOR_REQ_BUFFER_PREALLOC
80 pIo_buf = pdvobjpriv->usb_vendor_req_buf;
82 #ifdef CONFIG_USB_VENDOR_REQ_BUFFER_DYNAMIC_ALLOCATE
83 tmp_buf = rtw_malloc( (u32) len + ALIGNMENT_UNIT);
84 tmp_buflen = (u32)len + ALIGNMENT_UNIT;
85 #else // use stack memory
86 tmp_buflen = MAX_USB_IO_CTL_SIZE;
89 // Added by Albert 2010/02/09
90 // For mstar platform, mstar suggests the address for USB IO should be 16 bytes alignment.
91 // Trying to fix it here.
92 pIo_buf = (tmp_buf==NULL)?NULL:tmp_buf + ALIGNMENT_UNIT -((SIZE_PTR)(tmp_buf) & 0x0f );
95 if ( pIo_buf== NULL) {
96 DBG_8192C( "[%s] pIo_buf == NULL \n", __FUNCTION__ );
101 while(++vendorreq_times<= MAX_USBCTRL_VENDORREQ_TIMES)
103 _rtw_memset(pIo_buf, 0, len);
105 if (requesttype == 0x01)
107 pipe = usb_rcvctrlpipe(udev, 0);//read_in
108 reqtype = REALTEK_USB_VENQT_READ;
112 pipe = usb_sndctrlpipe(udev, 0);//write_out
113 reqtype = REALTEK_USB_VENQT_WRITE;
114 _rtw_memcpy( pIo_buf, pdata, len);
117 status = rtw_usb_control_msg(udev, pipe, request, reqtype, value, index, pIo_buf, len, RTW_USB_CONTROL_MSG_TIMEOUT);
119 if ( status == len) // Success this control transfer.
121 rtw_reset_continual_io_error(pdvobjpriv);
122 if ( requesttype == 0x01 )
123 { // For Control read transfer, we have to copy the read data from pIo_buf to pdata.
124 _rtw_memcpy( pdata, pIo_buf, len );
127 else { // error cases
128 DBG_8192C("reg 0x%x, usb %s %u fail, status:%d value=0x%x, vendorreq_times:%d\n"
129 , value,(requesttype == 0x01)?"read":"write" , len, status, *(u32*)pdata, vendorreq_times);
132 if(status == (-ESHUTDOWN) || status == -ENODEV )
134 rtw_set_surprise_removed(padapter);
136 #ifdef DBG_CONFIG_ERROR_DETECT
138 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
139 pHalData->srestpriv.Wifi_Error_Status = USB_VEN_REQ_CMD_FAIL;
144 else // status != len && status >= 0
147 if ( requesttype == 0x01 )
148 { // For Control read transfer, we have to copy the read data from pIo_buf to pdata.
149 _rtw_memcpy( pdata, pIo_buf, len );
154 if(rtw_inc_and_chk_continual_io_error(pdvobjpriv) == _TRUE ){
155 rtw_set_surprise_removed(padapter);
161 // firmware download is checksumed, don't retry
162 if( (value >= FW_START_ADDRESS ) || status == len )
167 // release IO memory used by vendorreq
168 #ifdef CONFIG_USB_VENDOR_REQ_BUFFER_DYNAMIC_ALLOCATE
169 rtw_mfree(tmp_buf, tmp_buflen);
173 #ifdef CONFIG_USB_VENDOR_REQ_MUTEX
174 _exit_critical_mutex(&pdvobjpriv->usb_vendor_req_mutex, NULL);
181 #ifdef CONFIG_USB_SUPPORT_ASYNC_VDN_REQ
182 static void _usbctrl_vendorreq_async_callback(struct urb *urb, struct pt_regs *regs)
186 rtw_mfree(urb->context, sizeof(struct rtw_async_write_data));
192 int _usbctrl_vendorreq_async_write(struct usb_device *udev, u8 request,
193 u16 value, u16 index, void *pdata, u16 len, u8 requesttype)
198 struct usb_ctrlrequest *dr;
200 struct rtw_async_write_data *buf;
203 if (requesttype == VENDOR_READ) {
204 pipe = usb_rcvctrlpipe(udev, 0);//read_in
205 reqtype = REALTEK_USB_VENQT_READ;
208 pipe = usb_sndctrlpipe(udev, 0);//write_out
209 reqtype = REALTEK_USB_VENQT_WRITE;
212 buf = (struct rtl819x_async_write_data *)rtw_zmalloc(sizeof(*buf));
218 urb = usb_alloc_urb(0, GFP_ATOMIC);
220 rtw_mfree((u8*)buf, sizeof(*buf));
227 dr->bRequestType = reqtype;
228 dr->bRequest = request;
229 dr->wValue = cpu_to_le16(value);
230 dr->wIndex = cpu_to_le16(index);
231 dr->wLength = cpu_to_le16(len);
233 _rtw_memcpy(buf, pdata, len);
235 usb_fill_control_urb(urb, udev, pipe, (unsigned char *)dr, buf, len,
236 _usbctrl_vendorreq_async_callback, buf);
238 rc = usb_submit_urb(urb, GFP_ATOMIC);
240 rtw_mfree((u8*)buf, sizeof(*buf));
249 #endif /* CONFIG_USB_SUPPORT_ASYNC_VDN_REQ */
251 unsigned int ffaddr2pipehdl(struct dvobj_priv *pdvobj, u32 addr)
253 unsigned int pipe=0, ep_num=0;
254 struct usb_device *pusbd = pdvobj->pusbdev;
256 if (addr == RECV_BULK_IN_ADDR) {
257 pipe=usb_rcvbulkpipe(pusbd, pdvobj->RtInPipe[0]);
259 } else if (addr == RECV_INT_IN_ADDR) {
260 pipe=usb_rcvintpipe(pusbd, pdvobj->RtInPipe[1]);
262 } else if (addr < HW_QUEUE_ENTRY) {
263 ep_num = pdvobj->Queue2Pipe[addr];
264 pipe = usb_sndbulkpipe(pusbd, ep_num);
270 struct zero_bulkout_context{
277 static void usb_bulkout_zero_complete(struct urb *purb, struct pt_regs *regs)
279 struct zero_bulkout_context *pcontext = (struct zero_bulkout_context *)purb->context;
281 //DBG_8192C("+usb_bulkout_zero_complete\n");
287 rtw_mfree(pcontext->pbuf, sizeof(int));
290 if(pcontext->purb && (pcontext->purb==purb))
292 usb_free_urb(pcontext->purb);
296 rtw_mfree((u8*)pcontext, sizeof(struct zero_bulkout_context));
302 static u32 usb_bulkout_zero(struct intf_hdl *pintfhdl, u32 addr)
304 int pipe, status, len;
307 struct zero_bulkout_context *pcontext;
309 _adapter *padapter = (_adapter *)pintfhdl->padapter;
310 struct dvobj_priv *pdvobj = adapter_to_dvobj(padapter);
311 struct pwrctrl_priv *pwrctl = dvobj_to_pwrctl(pdvobj);
312 struct usb_device *pusbd = pdvobj->pusbdev;
314 //DBG_871X("%s\n", __func__);
317 if (RTW_CANNOT_TX(padapter))
323 pcontext = (struct zero_bulkout_context *)rtw_zmalloc(sizeof(struct zero_bulkout_context));
324 if (pcontext == NULL) {
328 pbuf = (unsigned char *)rtw_zmalloc(sizeof(int));
329 purb = usb_alloc_urb(0, GFP_ATOMIC);
331 //translate DMA FIFO addr to pipehandle
332 pipe = ffaddr2pipehdl(pdvobj, addr);
335 pcontext->pbuf = pbuf;
336 pcontext->purb = purb;
337 pcontext->pirp = NULL;
338 pcontext->padapter = padapter;
341 //translate DMA FIFO addr to pipehandle
342 //pipe = ffaddr2pipehdl(pdvobj, addr);
344 usb_fill_bulk_urb(purb, pusbd, pipe,
347 usb_bulkout_zero_complete,
348 pcontext);//context is pcontext
350 status = usb_submit_urb(purb, GFP_ATOMIC);
366 void usb_read_mem(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *rmem)
371 void usb_write_mem(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *wmem)
377 void usb_read_port_cancel(struct intf_hdl *pintfhdl)
380 struct recv_buf *precvbuf;
381 _adapter *padapter = pintfhdl->padapter;
382 precvbuf = (struct recv_buf *)padapter->recvpriv.precv_buf;
384 DBG_871X("%s\n", __func__);
386 for (i=0; i < NR_RECVBUFF ; i++) {
388 if (precvbuf->purb) {
389 //DBG_8192C("usb_read_port_cancel : usb_kill_urb \n");
390 usb_kill_urb(precvbuf->purb);
395 #ifdef CONFIG_USB_INTERRUPT_IN_PIPE
396 usb_kill_urb(padapter->recvpriv.int_in_urb);
400 static void usb_write_port_complete(struct urb *purb, struct pt_regs *regs)
404 struct xmit_buf *pxmitbuf = (struct xmit_buf *)purb->context;
405 //struct xmit_frame *pxmitframe = (struct xmit_frame *)pxmitbuf->priv_data;
406 //_adapter *padapter = pxmitframe->padapter;
407 _adapter *padapter = pxmitbuf->padapter;
408 struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
409 //struct pkt_attrib *pattrib = &pxmitframe->attrib;
413 switch(pxmitbuf->flags)
416 pxmitpriv->voq_cnt--;
419 pxmitpriv->viq_cnt--;
422 pxmitpriv->beq_cnt--;
425 pxmitpriv->bkq_cnt--;
433 _enter_critical(&pxmitpriv->lock, &irqL);
435 pxmitpriv->txirp_cnt--;
437 switch(pattrib->priority)
441 pxmitpriv->bkq_cnt--;
442 //DBG_8192C("pxmitpriv->bkq_cnt=%d\n", pxmitpriv->bkq_cnt);
446 pxmitpriv->viq_cnt--;
447 //DBG_8192C("pxmitpriv->viq_cnt=%d\n", pxmitpriv->viq_cnt);
451 pxmitpriv->voq_cnt--;
452 //DBG_8192C("pxmitpriv->voq_cnt=%d\n", pxmitpriv->voq_cnt);
457 pxmitpriv->beq_cnt--;
458 //DBG_8192C("pxmitpriv->beq_cnt=%d\n", pxmitpriv->beq_cnt);
463 _exit_critical(&pxmitpriv->lock, &irqL);
466 if(pxmitpriv->txirp_cnt==0)
468 RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port_complete: txirp_cnt== 0, set allrxreturnevt!\n"));
469 _rtw_up_sema(&(pxmitpriv->tx_retevt));
472 //rtw_free_xmitframe(pxmitpriv, pxmitframe);
474 if (RTW_CANNOT_TX(padapter))
476 DBG_8192C("%s(): TX Warning! bDriverStopped(%s) OR bSurpriseRemoved(%s) pxmitbuf->buf_tag(%x)\n"
478 , rtw_is_drv_stopped(padapter)?"True":"False"
479 , rtw_is_surprise_removed(padapter)?"True":"False"
480 , pxmitbuf->buf_tag);
482 goto check_completion;
486 if (purb->status==0) {
489 RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port_complete : purb->status(%d) != 0 \n", purb->status));
490 DBG_871X("###=> urb_write_port_complete status(%d)\n",purb->status);
491 if((purb->status==-EPIPE)||(purb->status==-EPROTO))
493 //usb_clear_halt(pusbdev, purb->pipe);
495 sreset_set_wifi_error_status(padapter, USB_WRITE_PORT_FAIL);
496 } else if (purb->status == -EINPROGRESS) {
497 RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port_complete: EINPROGESS\n"));
498 goto check_completion;
500 } else if (purb->status == -ENOENT) {
501 DBG_871X("%s: -ENOENT\n", __func__);
502 goto check_completion;
504 } else if (purb->status == -ECONNRESET) {
505 DBG_871X("%s: -ECONNRESET\n", __func__);
506 goto check_completion;
508 } else if (purb->status == -ESHUTDOWN) {
509 RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port_complete: ESHUTDOWN\n"));
510 rtw_set_drv_stopped(padapter);
511 RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port_complete:bDriverStopped=TRUE\n"));
513 goto check_completion;
517 rtw_set_surprise_removed(padapter);
518 DBG_8192C("bSurpriseRemoved=TRUE\n");
519 RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port_complete:bSurpriseRemoved=TRUE\n"));
521 goto check_completion;
525 #ifdef DBG_CONFIG_ERROR_DETECT
527 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
528 pHalData->srestpriv.last_tx_complete_time = rtw_get_current_time();
533 _enter_critical(&pxmitpriv->lock_sctx, &irqL);
534 rtw_sctx_done_err(&pxmitbuf->sctx,
535 purb->status ? RTW_SCTX_DONE_WRITE_PORT_ERR : RTW_SCTX_DONE_SUCCESS);
536 _exit_critical(&pxmitpriv->lock_sctx, &irqL);
538 rtw_free_xmitbuf(pxmitpriv, pxmitbuf);
540 //if(rtw_txframes_pending(padapter))
542 tasklet_hi_schedule(&pxmitpriv->xmit_tasklet);
549 u32 usb_write_port(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *wmem)
554 u32 ret = _FAIL, bwritezero = _FALSE;
556 _adapter *padapter = (_adapter *)pintfhdl->padapter;
557 struct dvobj_priv *pdvobj = adapter_to_dvobj(padapter);
558 struct pwrctrl_priv *pwrctl = dvobj_to_pwrctl(pdvobj);
559 struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
560 struct xmit_buf *pxmitbuf = (struct xmit_buf *)wmem;
561 struct xmit_frame *pxmitframe = (struct xmit_frame *)pxmitbuf->priv_data;
562 struct usb_device *pusbd = pdvobj->pusbdev;
563 struct pkt_attrib *pattrib = &pxmitframe->attrib;
567 RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("+usb_write_port\n"));
569 if (RTW_CANNOT_TX(padapter)) {
571 DBG_871X(" DBG_TX %s:%d bDriverStopped%s, bSurpriseRemoved:%s\n", __func__, __LINE__
572 , rtw_is_drv_stopped(padapter)?"True":"False"
573 , rtw_is_surprise_removed(padapter)?"True":"False");
575 RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port:( padapter->bDriverStopped ||padapter->bSurpriseRemoved )!!!\n"));
576 rtw_sctx_done_err(&pxmitbuf->sctx, RTW_SCTX_DONE_TX_DENY);
580 _enter_critical(&pxmitpriv->lock, &irqL);
585 pxmitpriv->voq_cnt++;
586 pxmitbuf->flags = VO_QUEUE_INX;
589 pxmitpriv->viq_cnt++;
590 pxmitbuf->flags = VI_QUEUE_INX;
593 pxmitpriv->beq_cnt++;
594 pxmitbuf->flags = BE_QUEUE_INX;
597 pxmitpriv->bkq_cnt++;
598 pxmitbuf->flags = BK_QUEUE_INX;
601 pxmitbuf->flags = HIGH_QUEUE_INX;
604 pxmitbuf->flags = MGT_QUEUE_INX;
608 _exit_critical(&pxmitpriv->lock, &irqL);
610 purb = pxmitbuf->pxmit_urb[0];
612 //translate DMA FIFO addr to pipehandle
613 pipe = ffaddr2pipehdl(pdvobj, addr);
615 #ifdef CONFIG_REDUCE_USB_TX_INT
616 if ( (pxmitpriv->free_xmitbuf_cnt%NR_XMITBUFF == 0)
617 || (pxmitbuf->buf_tag > XMITBUF_DATA) )
619 purb->transfer_flags &= (~URB_NO_INTERRUPT);
621 purb->transfer_flags |= URB_NO_INTERRUPT;
622 //DBG_8192C("URB_NO_INTERRUPT ");
627 usb_fill_bulk_urb(purb, pusbd, pipe,
628 pxmitframe->buf_addr, //= pxmitbuf->pbuf
630 usb_write_port_complete,
631 pxmitbuf);//context is pxmitbuf
633 #ifdef CONFIG_USE_USB_BUFFER_ALLOC_TX
634 purb->transfer_dma = pxmitbuf->dma_transfer_addr;
635 purb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
636 purb->transfer_flags |= URB_ZERO_PACKET;
637 #endif // CONFIG_USE_USB_BUFFER_ALLOC_TX
639 #ifdef USB_PACKET_OFFSET_SZ
640 #if (USB_PACKET_OFFSET_SZ == 0)
641 purb->transfer_flags |= URB_ZERO_PACKET;
648 purb->transfer_flags |= URB_ZERO_PACKET;
652 status = usb_submit_urb(purb, GFP_ATOMIC);
654 #ifdef DBG_CONFIG_ERROR_DETECT
656 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
657 pHalData->srestpriv.last_tx_time = rtw_get_current_time();
661 rtw_sctx_done_err(&pxmitbuf->sctx, RTW_SCTX_DONE_WRITE_PORT_ERR);
662 DBG_871X("usb_write_port, status=%d\n", status);
663 RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_write_port(): usb_submit_urb, status=%x\n", status));
667 rtw_set_drv_stopped(padapter);
677 // Commented by Albert 2009/10/13
678 // We add the URB_ZERO_PACKET flag to urb so that the host will send the zero packet automatically.
680 if(bwritezero == _TRUE)
682 usb_bulkout_zero(pintfhdl, addr);
686 RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("-usb_write_port\n"));
690 rtw_free_xmitbuf(pxmitpriv, pxmitbuf);
696 void usb_write_port_cancel(struct intf_hdl *pintfhdl)
699 _adapter *padapter = pintfhdl->padapter;
700 struct xmit_buf *pxmitbuf = (struct xmit_buf *)padapter->xmitpriv.pxmitbuf;
702 DBG_871X("%s \n", __func__);
704 for (i=0; i<NR_XMITBUFF; i++) {
705 for (j=0; j<8; j++) {
706 if (pxmitbuf->pxmit_urb[j]) {
707 usb_kill_urb(pxmitbuf->pxmit_urb[j]);
713 pxmitbuf = (struct xmit_buf*)padapter->xmitpriv.pxmit_extbuf;
714 for (i = 0; i < NR_XMIT_EXTBUFF ; i++) {
715 for (j=0; j<8; j++) {
716 if(pxmitbuf->pxmit_urb[j]) {
717 usb_kill_urb(pxmitbuf->pxmit_urb[j]);
724 void usb_init_recvbuf(_adapter *padapter, struct recv_buf *precvbuf)
727 precvbuf->transfer_len = 0;
731 precvbuf->ref_cnt = 0;
735 precvbuf->pdata = precvbuf->phead = precvbuf->ptail = precvbuf->pbuf;
736 precvbuf->pend = precvbuf->pdata + MAX_RECVBUF_SZ;
741 int recvbuf2recvframe(PADAPTER padapter, void *ptr);
743 #ifdef CONFIG_USE_USB_BUFFER_ALLOC_RX
744 void usb_recv_tasklet(void *priv)
746 struct recv_buf *precvbuf = NULL;
747 _adapter *padapter = (_adapter*)priv;
748 struct recv_priv *precvpriv = &padapter->recvpriv;
750 while (NULL != (precvbuf = rtw_dequeue_recvbuf(&precvpriv->recv_buf_pending_queue)))
752 if (RTW_CANNOT_RUN(padapter)) {
753 DBG_8192C("recv_tasklet => bDriverStopped or bSurpriseRemoved\n");
758 recvbuf2recvframe(padapter, precvbuf);
760 rtw_read_port(padapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf);
765 void usb_read_port_complete(struct urb *purb, struct pt_regs *regs)
767 struct recv_buf *precvbuf = (struct recv_buf *)purb->context;
768 _adapter *padapter =(_adapter *)precvbuf->adapter;
769 struct recv_priv *precvpriv = &padapter->recvpriv;
771 RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete!!!\n"));
773 ATOMIC_DEC(&(precvpriv->rx_pending_cnt));
775 if (RTW_CANNOT_RX(padapter))
777 DBG_8192C("%s() RX Warning! bDriverStopped(%s) OR bSurpriseRemoved(%s)\n"
779 , rtw_is_drv_stopped(padapter)?"True":"False"
780 , rtw_is_surprise_removed(padapter)?"True":"False");
784 if(purb->status==0)//SUCCESS
786 if ((purb->actual_length > MAX_RECVBUF_SZ) || (purb->actual_length < RXDESC_SIZE))
788 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"));
790 rtw_read_port(padapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf);
794 rtw_reset_continual_io_error(adapter_to_dvobj(padapter));
796 precvbuf->transfer_len = purb->actual_length;
798 //rtw_enqueue_rx_transfer_buffer(precvpriv, rx_transfer_buf);
799 rtw_enqueue_recvbuf(precvbuf, &precvpriv->recv_buf_pending_queue);
801 tasklet_schedule(&precvpriv->recv_tasklet);
806 RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete : purb->status(%d) != 0 \n", purb->status));
808 DBG_8192C("###=> usb_read_port_complete => urb status(%d)\n", purb->status);
810 if (rtw_inc_and_chk_continual_io_error(adapter_to_dvobj(padapter)) == _TRUE)
811 rtw_set_surprise_removed(padapter);
813 switch(purb->status) {
818 /*rtw_set_surprise_removed(padapter);*/
819 //RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete:bSurpriseRemoved=TRUE\n"));
821 rtw_set_drv_stopped(padapter);
822 RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete:bDriverStopped=TRUE\n"));
829 #ifdef DBG_CONFIG_ERROR_DETECT
831 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
832 pHalData->srestpriv.Wifi_Error_Status = USB_READ_PORT_FAIL;
835 rtw_read_port(padapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf);
838 DBG_8192C("ERROR: URB IS IN PROGRESS!/n");
851 u32 usb_read_port(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *rmem)
857 struct recv_buf *precvbuf = (struct recv_buf *)rmem;
858 _adapter *adapter = pintfhdl->padapter;
859 struct dvobj_priv *pdvobj = adapter_to_dvobj(adapter);
860 struct pwrctrl_priv *pwrctl = dvobj_to_pwrctl(pdvobj);
861 struct recv_priv *precvpriv = &adapter->recvpriv;
862 struct usb_device *pusbd = pdvobj->pusbdev;
866 if (RTW_CANNOT_RX(adapter) || (precvbuf == NULL))
868 RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port:( RTW_CANNOT_RX ) || precvbuf == NULL!!!\n"));
872 usb_init_recvbuf(adapter, precvbuf);
876 ATOMIC_INC(&(precvpriv->rx_pending_cnt));
877 purb = precvbuf->purb;
879 //translate DMA FIFO addr to pipehandle
880 pipe = ffaddr2pipehdl(pdvobj, addr);
882 usb_fill_bulk_urb(purb, pusbd, pipe,
885 usb_read_port_complete,
886 precvbuf);//context is precvbuf
888 purb->transfer_dma = precvbuf->dma_transfer_addr;
889 purb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
891 err = usb_submit_urb(purb, GFP_ATOMIC);
892 if((err) && (err != (-EPERM)))
894 RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("cannot submit rx in-token(err=0x%.8x), URB_STATUS =0x%.8x", err, purb->status));
895 DBG_8192C("cannot submit rx in-token(err = 0x%08x),urb_status = %d\n",err,purb->status);
905 #else // CONFIG_USE_USB_BUFFER_ALLOC_RX
907 void usb_recv_tasklet(void *priv)
910 _adapter *padapter = (_adapter*)priv;
911 struct recv_priv *precvpriv = &padapter->recvpriv;
912 struct recv_buf *precvbuf = NULL;
914 while (NULL != (pskb = skb_dequeue(&precvpriv->rx_skb_queue))) {
916 if (RTW_CANNOT_RUN(padapter)) {
917 DBG_8192C("recv_tasklet => bDriverStopped or bSurpriseRemoved\n");
918 #ifdef CONFIG_PREALLOC_RX_SKB_BUFFER
919 if (rtw_free_skb_premem(pskb) != 0)
920 #endif //CONFIG_PREALLOC_RX_SKB_BUFFER
925 recvbuf2recvframe(padapter, pskb);
927 skb_reset_tail_pointer(pskb);
930 skb_queue_tail(&precvpriv->free_recv_skb_queue, pskb);
932 if (NULL != (precvbuf = rtw_dequeue_recvbuf(&precvpriv->recv_buf_pending_queue))) {
933 precvbuf->pskb = NULL;
934 rtw_read_port(padapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf);
939 void usb_read_port_complete(struct urb *purb, struct pt_regs *regs)
941 struct recv_buf *precvbuf = (struct recv_buf *)purb->context;
942 _adapter *padapter =(_adapter *)precvbuf->adapter;
943 struct recv_priv *precvpriv = &padapter->recvpriv;
945 RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete!!!\n"));
947 ATOMIC_DEC(&(precvpriv->rx_pending_cnt));
949 if(RTW_CANNOT_RX(padapter))
951 DBG_8192C("%s() RX Warning! bDriverStopped(%s) OR bSurpriseRemoved(%s)\n"
953 , rtw_is_drv_stopped(padapter)?"True":"False"
954 , rtw_is_surprise_removed(padapter)?"True":"False");
958 if(purb->status==0)//SUCCESS
960 if ((purb->actual_length > MAX_RECVBUF_SZ) || (purb->actual_length < RXDESC_SIZE))
962 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"));
963 rtw_read_port(padapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf);
964 DBG_8192C("%s()-%d: RX Warning!\n", __FUNCTION__, __LINE__);
968 rtw_reset_continual_io_error(adapter_to_dvobj(padapter));
970 precvbuf->transfer_len = purb->actual_length;
971 skb_put(precvbuf->pskb, purb->actual_length);
972 skb_queue_tail(&precvpriv->rx_skb_queue, precvbuf->pskb);
974 #ifndef CONFIG_FIX_NR_BULKIN_BUFFER
975 if (skb_queue_len(&precvpriv->rx_skb_queue)<=1)
977 tasklet_schedule(&precvpriv->recv_tasklet);
979 precvbuf->pskb = NULL;
980 rtw_read_port(padapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf);
985 RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete : purb->status(%d) != 0 \n", purb->status));
987 DBG_8192C("###=> usb_read_port_complete => urb status(%d)\n", purb->status);
989 if (rtw_inc_and_chk_continual_io_error(adapter_to_dvobj(padapter)) == _TRUE)
990 rtw_set_surprise_removed(padapter);
993 switch(purb->status) {
998 /*rtw_set_surprise_removed(padapter);*/
999 //RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete:bSurpriseRemoved=TRUE\n"));
1001 rtw_set_drv_stopped(padapter);
1002 RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port_complete:bDriverStopped=TRUE\n"));
1009 #ifdef DBG_CONFIG_ERROR_DETECT
1011 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
1012 pHalData->srestpriv.Wifi_Error_Status = USB_READ_PORT_FAIL;
1015 rtw_read_port(padapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf);
1018 DBG_8192C("ERROR: URB IS IN PROGRESS!/n");
1032 u32 usb_read_port(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *rmem)
1038 struct recv_buf *precvbuf = (struct recv_buf *)rmem;
1039 _adapter *adapter = pintfhdl->padapter;
1040 struct dvobj_priv *pdvobj = adapter_to_dvobj(adapter);
1041 struct pwrctrl_priv *pwrctl = dvobj_to_pwrctl(pdvobj);
1042 struct recv_priv *precvpriv = &adapter->recvpriv;
1043 struct usb_device *pusbd = pdvobj->pusbdev;
1047 if (RTW_CANNOT_RX(adapter) || (precvbuf == NULL)) {
1048 RT_TRACE(_module_hci_ops_os_c_,_drv_err_,("usb_read_port:( RTW_CANNOT_RX ) || precvbuf == NULL!!!\n"));
1052 usb_init_recvbuf(adapter, precvbuf);
1054 if (precvbuf->pskb == NULL) {
1055 SIZE_PTR tmpaddr = 0;
1056 SIZE_PTR alignment = 0;
1058 if (NULL != (precvbuf->pskb = skb_dequeue(&precvpriv->free_recv_skb_queue)))
1061 #ifndef CONFIG_FIX_NR_BULKIN_BUFFER
1062 precvbuf->pskb = rtw_skb_alloc(MAX_RECVBUF_SZ + RECVBUFF_ALIGN_SZ);
1065 if (precvbuf->pskb == NULL) {
1067 DBG_871X("usb_read_port() enqueue precvbuf=%p \n", precvbuf);
1068 /* enqueue precvbuf and wait for free skb */
1069 rtw_enqueue_recvbuf(precvbuf, &precvpriv->recv_buf_pending_queue);
1073 tmpaddr = (SIZE_PTR)precvbuf->pskb->data;
1074 alignment = tmpaddr & (RECVBUFF_ALIGN_SZ-1);
1075 skb_reserve(precvbuf->pskb, (RECVBUFF_ALIGN_SZ - alignment));
1079 precvbuf->phead = precvbuf->pskb->head;
1080 precvbuf->pdata = precvbuf->pskb->data;
1081 precvbuf->ptail = skb_tail_pointer(precvbuf->pskb);
1082 precvbuf->pend = skb_end_pointer(precvbuf->pskb);
1083 precvbuf->pbuf = precvbuf->pskb->data;
1085 purb = precvbuf->purb;
1087 /* translate DMA FIFO addr to pipehandle */
1088 pipe = ffaddr2pipehdl(pdvobj, addr);
1090 usb_fill_bulk_urb(purb, pusbd, pipe,
1093 usb_read_port_complete,
1096 err = usb_submit_urb(purb, GFP_ATOMIC);
1097 if (err && err != (-EPERM)) {
1098 DBG_871X("cannot submit rx in-token(err = 0x%08x),urb_status = %d\n"
1099 , err, purb->status);
1103 ATOMIC_INC(&(precvpriv->rx_pending_cnt));
1112 #endif // CONFIG_USE_USB_BUFFER_ALLOC_RX
1114 #ifdef CONFIG_USB_INTERRUPT_IN_PIPE
1115 void usb_read_interrupt_complete(struct urb *purb, struct pt_regs *regs)
1118 _adapter *padapter = (_adapter *)purb->context;
1120 if (RTW_CANNOT_RX(padapter)) {
1121 DBG_8192C("%s() RX Warning! bDriverStopped(%s) OR bSurpriseRemoved(%s)\n"
1123 , rtw_is_drv_stopped(padapter)?"True":"False"
1124 , rtw_is_surprise_removed(padapter)?"True":"False");
1129 if (purb->status == 0) {/*SUCCESS*/
1130 if (purb->actual_length > INTERRUPT_MSG_FORMAT_LEN)
1131 DBG_8192C("usb_read_interrupt_complete: purb->actual_length > INTERRUPT_MSG_FORMAT_LEN(%d)\n", INTERRUPT_MSG_FORMAT_LEN);
1133 rtw_hal_interrupt_handler(padapter, purb->actual_length, purb->transfer_buffer);
1135 err = usb_submit_urb(purb, GFP_ATOMIC);
1136 if ((err) && (err != (-EPERM)))
1137 DBG_8192C("cannot submit interrupt in-token(err = 0x%08x),urb_status = %d\n", err, purb->status);
1139 DBG_8192C("###=> usb_read_interrupt_complete => urb status(%d)\n", purb->status);
1141 switch (purb->status) {
1146 /*rtw_set_surprise_removed(padapter);*/
1147 /*RT_TRACE(_module_hci_ops_os_c_, _drv_err_, ("usb_read_port_complete:bSurpriseRemoved=TRUE\n"));*/
1149 rtw_set_drv_stopped(padapter);
1150 RT_TRACE(_module_hci_ops_os_c_, _drv_err_, ("usb_read_port_complete:bDriverStopped=TRUE\n"));
1155 DBG_8192C("ERROR: URB IS IN PROGRESS!/n");
1163 u32 usb_read_interrupt(struct intf_hdl *pintfhdl, u32 addr)
1168 _adapter *adapter = pintfhdl->padapter;
1169 struct dvobj_priv *pdvobj = adapter_to_dvobj(adapter);
1170 struct recv_priv *precvpriv = &adapter->recvpriv;
1171 struct usb_device *pusbd = pdvobj->pusbdev;
1175 if (RTW_CANNOT_RX(adapter)) {
1176 RT_TRACE(_module_hci_ops_os_c_, _drv_err_, ("usb_read_interrupt:( RTW_CANNOT_RX )!!!\n"));
1180 /*translate DMA FIFO addr to pipehandle*/
1181 pipe = ffaddr2pipehdl(pdvobj, addr);
1183 usb_fill_int_urb(precvpriv->int_in_urb, pusbd, pipe,
1184 precvpriv->int_in_buf,
1185 INTERRUPT_MSG_FORMAT_LEN,
1186 usb_read_interrupt_complete,
1190 err = usb_submit_urb(precvpriv->int_in_urb, GFP_ATOMIC);
1191 if ((err) && (err != (-EPERM))) {
1192 DBG_8192C("cannot submit interrupt in-token(err = 0x%08x), urb_status = %d\n", err, precvpriv->int_in_urb->status);
1199 #endif /* CONFIG_USB_INTERRUPT_IN_PIPE */