void usb_recv_tasklet(void *priv) { _pkt *pskb; _adapter *padapter = (_adapter*)priv; struct recv_priv *precvpriv = &padapter->recvpriv; struct recv_buf *precvbuf = NULL; while (NULL != (pskb = skb_dequeue(&precvpriv->rx_skb_queue))) { if ((padapter->bDriverStopped == _TRUE)||(padapter->bSurpriseRemoved== _TRUE)) { DBG_8192C("recv_tasklet => bDriverStopped or bSurpriseRemoved \n"); #ifdef CONFIG_PREALLOC_RX_SKB_BUFFER if (rtw_free_skb_premem(pskb) != 0) #endif //CONFIG_PREALLOC_RX_SKB_BUFFER rtw_skb_free(pskb); break; } recvbuf2recvframe(padapter, pskb); skb_reset_tail_pointer(pskb); pskb->len = 0; skb_queue_tail(&precvpriv->free_recv_skb_queue, pskb); if (NULL != (precvbuf = rtw_dequeue_recvbuf(&precvpriv->recv_buf_pending_queue))) { precvbuf->pskb = NULL; rtw_read_port(padapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf); } } }
void usb_recv_tasklet(void *priv) { _pkt *pskb; _adapter *padapter = (_adapter *)priv; struct recv_priv *precvpriv = &padapter->recvpriv; struct recv_buf *precvbuf = NULL; while (NULL != (pskb = skb_dequeue(&precvpriv->rx_skb_queue))) { if (RTW_CANNOT_RUN(padapter)) { RTW_INFO("recv_tasklet => bDriverStopped(%s) OR bSurpriseRemoved(%s)\n" , rtw_is_drv_stopped(padapter) ? "True" : "False" , rtw_is_surprise_removed(padapter) ? "True" : "False"); #ifdef CONFIG_PREALLOC_RX_SKB_BUFFER if (rtw_free_skb_premem(pskb) != 0) #endif /* CONFIG_PREALLOC_RX_SKB_BUFFER */ rtw_skb_free(pskb); break; } recvbuf2recvframe(padapter, pskb); skb_reset_tail_pointer(pskb); pskb->len = 0; skb_queue_tail(&precvpriv->free_recv_skb_queue, pskb); precvbuf = rtw_dequeue_recvbuf(&precvpriv->recv_buf_pending_queue); if (NULL != precvbuf) { precvbuf->pskb = NULL; rtw_read_port(padapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf); } } }
//free os related resource in struct recv_buf int rtw_os_recvbuf_resource_free(_adapter *padapter, struct recv_buf *precvbuf) { int ret = _SUCCESS; #ifdef CONFIG_USE_USB_BUFFER_ALLOC_RX struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter); struct usb_device *pusbd = pdvobjpriv->pusbdev; rtw_usb_buffer_free(pusbd, (size_t)precvbuf->alloc_sz, precvbuf->pallocated_buf, precvbuf->dma_transfer_addr); precvbuf->pallocated_buf = NULL; precvbuf->dma_transfer_addr = 0; #endif //CONFIG_USE_USB_BUFFER_ALLOC_RX if(precvbuf->purb) { //usb_kill_urb(precvbuf->purb); usb_free_urb(precvbuf->purb); } if(precvbuf->pskb) { #ifdef CONFIG_PREALLOC_RX_SKB_BUFFER if(rtw_free_skb_premem(precvbuf->pskb)!=0) #endif rtw_skb_free(precvbuf->pskb); } return ret; }
void usb_free_recv_priv (_adapter *padapter, u16 ini_in_buf_sz) { int i; struct recv_buf *precvbuf; struct recv_priv *precvpriv = &padapter->recvpriv; precvbuf = (struct recv_buf *)precvpriv->precv_buf; for(i=0; i < NR_RECVBUFF ; i++) { rtw_os_recvbuf_resource_free(padapter, precvbuf); precvbuf++; } if(precvpriv->pallocated_recv_buf) rtw_mfree(precvpriv->pallocated_recv_buf, NR_RECVBUFF *sizeof(struct recv_buf) + 4); #ifdef CONFIG_USB_INTERRUPT_IN_PIPE #ifdef PLATFORM_LINUX if(precvpriv->int_in_urb) { usb_free_urb(precvpriv->int_in_urb); } #endif if(precvpriv->int_in_buf) rtw_mfree(precvpriv->int_in_buf, ini_in_buf_sz); #endif /* CONFIG_USB_INTERRUPT_IN_PIPE */ #ifdef PLATFORM_LINUX if (skb_queue_len(&precvpriv->rx_skb_queue)) { DBG_8192C(KERN_WARNING "rx_skb_queue not empty\n"); } rtw_skb_queue_purge(&precvpriv->rx_skb_queue); if (skb_queue_len(&precvpriv->free_recv_skb_queue)) { DBG_8192C(KERN_WARNING "free_recv_skb_queue not empty, %d\n", skb_queue_len(&precvpriv->free_recv_skb_queue)); } #if !defined(CONFIG_USE_USB_BUFFER_ALLOC_RX) #if defined(CONFIG_PREALLOC_RECV_SKB) && defined(CONFIG_PREALLOC_RX_SKB_BUFFER) { struct sk_buff *skb; while ((skb = skb_dequeue(&precvpriv->free_recv_skb_queue)) != NULL) { if (rtw_free_skb_premem(skb) != 0) rtw_skb_free(skb); } } #else rtw_skb_queue_purge(&precvpriv->free_recv_skb_queue); #endif /* defined(CONFIG_PREALLOC_RX_SKB_BUFFER) && defined(CONFIG_PREALLOC_RECV_SKB) */ #endif /* !defined(CONFIG_USE_USB_BUFFER_ALLOC_RX) */ #endif /* PLATFORM_LINUX */ #ifdef PLATFORM_FREEBSD struct sk_buff *pskb; while (NULL != (pskb = skb_dequeue(&precvpriv->rx_skb_queue))) { rtw_skb_free(pskb); } #if !defined(CONFIG_USE_USB_BUFFER_ALLOC_RX) rtw_skb_queue_purge(&precvpriv->free_recv_skb_queue); #endif #ifdef CONFIG_RX_INDICATE_QUEUE struct mbuf *m; for (;;) { IF_DEQUEUE(&precvpriv->rx_indicate_queue, m); if (m == NULL) break; m_freem(m); } mtx_destroy(&precvpriv->rx_indicate_queue.ifq_mtx); #endif /* CONFIG_RX_INDICATE_QUEUE */ #endif /* PLATFORM_FREEBSD */ }