root/drivers/staging/rtl8188eu/hal/rtl8188eu_recv.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. rtw_hal_init_recv_priv
  2. rtw_hal_free_recv_priv

   1 // SPDX-License-Identifier: GPL-2.0
   2 /******************************************************************************
   3  *
   4  * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
   5  *
   6  ******************************************************************************/
   7 #define _RTL8188EU_RECV_C_
   8 #include <linux/kmemleak.h>
   9 #include <osdep_service.h>
  10 #include <drv_types.h>
  11 #include <recv_osdep.h>
  12 #include <mlme_osdep.h>
  13 
  14 #include <usb_ops_linux.h>
  15 #include <wifi.h>
  16 
  17 #include <rtl8188e_hal.h>
  18 
  19 int     rtw_hal_init_recv_priv(struct adapter *padapter)
  20 {
  21         struct recv_priv        *precvpriv = &padapter->recvpriv;
  22         int     i, res = _SUCCESS;
  23         struct recv_buf *precvbuf;
  24 
  25         tasklet_init(&precvpriv->recv_tasklet,
  26                      (void(*)(unsigned long))rtl8188eu_recv_tasklet,
  27                      (unsigned long)padapter);
  28 
  29         /* init recv_buf */
  30         _rtw_init_queue(&precvpriv->free_recv_buf_queue);
  31 
  32         precvpriv->precv_buf =
  33                 kcalloc(NR_RECVBUFF, sizeof(struct recv_buf), GFP_KERNEL);
  34         if (!precvpriv->precv_buf) {
  35                 res = _FAIL;
  36                 RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
  37                                 ("alloc recv_buf fail!\n"));
  38                 goto exit;
  39         }
  40         precvbuf = precvpriv->precv_buf;
  41 
  42         for (i = 0; i < NR_RECVBUFF; i++) {
  43                 res = rtw_os_recvbuf_resource_alloc(padapter, precvbuf);
  44                 if (res == _FAIL)
  45                         break;
  46                 precvbuf->adapter = padapter;
  47                 precvbuf++;
  48         }
  49         skb_queue_head_init(&precvpriv->rx_skb_queue);
  50         {
  51                 int i;
  52                 struct sk_buff *pskb = NULL;
  53 
  54                 skb_queue_head_init(&precvpriv->free_recv_skb_queue);
  55 
  56                 for (i = 0; i < NR_PREALLOC_RECV_SKB; i++) {
  57                         pskb = __netdev_alloc_skb(padapter->pnetdev,
  58                                         MAX_RECVBUF_SZ, GFP_KERNEL);
  59                         if (pskb) {
  60                                 kmemleak_not_leak(pskb);
  61                                 skb_queue_tail(&precvpriv->free_recv_skb_queue,
  62                                                 pskb);
  63                         }
  64                         pskb = NULL;
  65                 }
  66         }
  67 exit:
  68         return res;
  69 }
  70 
  71 void rtw_hal_free_recv_priv(struct adapter *padapter)
  72 {
  73         int     i;
  74         struct recv_buf *precvbuf;
  75         struct recv_priv        *precvpriv = &padapter->recvpriv;
  76 
  77         precvbuf = precvpriv->precv_buf;
  78 
  79         for (i = 0; i < NR_RECVBUFF; i++) {
  80                 usb_free_urb(precvbuf->purb);
  81                 precvbuf++;
  82         }
  83 
  84         kfree(precvpriv->precv_buf);
  85 
  86         if (skb_queue_len(&precvpriv->rx_skb_queue))
  87                 DBG_88E(KERN_WARNING "rx_skb_queue not empty\n");
  88         skb_queue_purge(&precvpriv->rx_skb_queue);
  89 
  90         if (skb_queue_len(&precvpriv->free_recv_skb_queue))
  91                 DBG_88E(KERN_WARNING "free_recv_skb_queue not empty, %d\n",
  92                                 skb_queue_len(&precvpriv->free_recv_skb_queue));
  93 
  94         skb_queue_purge(&precvpriv->free_recv_skb_queue);
  95 }

/* [<][>][^][v][top][bottom][index][help] */