rtw_mem.c 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. #include <drv_types.h>
  2. #include <rtw_mem.h>
  3. MODULE_LICENSE("GPL");
  4. MODULE_DESCRIPTION("Realtek Wireless Lan Driver");
  5. MODULE_AUTHOR("Realtek Semiconductor Corp.");
  6. MODULE_VERSION("DRIVERVERSION");
  7. struct sk_buff_head rtk_skb_mem_q;
  8. struct u8 *rtk_buf_mem[NR_RECVBUFF];
  9. struct u8 *rtw_get_buf_premem(int index)
  10. {
  11. printk("%s, rtk_buf_mem index : %d\n", __func__, index);
  12. return rtk_buf_mem[index];
  13. }
  14. u16 rtw_rtkm_get_buff_size(void)
  15. {
  16. return MAX_RTKM_RECVBUF_SZ;
  17. }
  18. EXPORT_SYMBOL(rtw_rtkm_get_buff_size);
  19. u8 rtw_rtkm_get_nr_recv_skb(void)
  20. {
  21. return MAX_RTKM_NR_PREALLOC_RECV_SKB;
  22. }
  23. EXPORT_SYMBOL(rtw_rtkm_get_nr_recv_skb);
  24. struct sk_buff *rtw_alloc_skb_premem(u16 in_size)
  25. {
  26. struct sk_buff *skb = NULL;
  27. if (in_size > MAX_RTKM_RECVBUF_SZ) {
  28. pr_info("warning %s: driver buffer size(%d) > rtkm buffer size(%d)\n", __func__, in_size, MAX_RTKM_RECVBUF_SZ);
  29. WARN_ON(1);
  30. return skb;
  31. }
  32. skb = skb_dequeue(&rtk_skb_mem_q);
  33. printk("%s, rtk_skb_mem_q len : %d\n", __func__, skb_queue_len(&rtk_skb_mem_q));
  34. return skb;
  35. }
  36. EXPORT_SYMBOL(rtw_alloc_skb_premem);
  37. int rtw_free_skb_premem(struct sk_buff *pskb)
  38. {
  39. if (!pskb)
  40. return -1;
  41. if (skb_queue_len(&rtk_skb_mem_q) >= MAX_RTKM_NR_PREALLOC_RECV_SKB)
  42. return -1;
  43. skb_queue_tail(&rtk_skb_mem_q, pskb);
  44. printk("%s, rtk_skb_mem_q len : %d\n", __func__, skb_queue_len(&rtk_skb_mem_q));
  45. return 0;
  46. }
  47. EXPORT_SYMBOL(rtw_free_skb_premem);
  48. static int __init rtw_mem_init(void)
  49. {
  50. int i;
  51. SIZE_PTR tmpaddr = 0;
  52. SIZE_PTR alignment = 0;
  53. struct sk_buff *pskb = NULL;
  54. printk("%s\n", __func__);
  55. pr_info("MAX_RTKM_NR_PREALLOC_RECV_SKB: %d\n", MAX_RTKM_NR_PREALLOC_RECV_SKB);
  56. pr_info("MAX_RTKM_RECVBUF_SZ: %d\n", MAX_RTKM_RECVBUF_SZ);
  57. #ifdef CONFIG_USE_USB_BUFFER_ALLOC_RX
  58. for (i = 0; i < NR_RECVBUFF; i++)
  59. rtk_buf_mem[i] = usb_buffer_alloc(dev, size, (in_interrupt() ? GFP_ATOMIC : GFP_KERNEL), dma);
  60. #endif /* CONFIG_USE_USB_BUFFER_ALLOC_RX */
  61. skb_queue_head_init(&rtk_skb_mem_q);
  62. for (i = 0; i < MAX_RTKM_NR_PREALLOC_RECV_SKB; i++) {
  63. pskb = __dev_alloc_skb(MAX_RTKM_RECVBUF_SZ + RECVBUFF_ALIGN_SZ, in_interrupt() ? GFP_ATOMIC : GFP_KERNEL);
  64. if (pskb) {
  65. tmpaddr = (SIZE_PTR)pskb->data;
  66. alignment = tmpaddr & (RECVBUFF_ALIGN_SZ - 1);
  67. skb_reserve(pskb, (RECVBUFF_ALIGN_SZ - alignment));
  68. skb_queue_tail(&rtk_skb_mem_q, pskb);
  69. } else
  70. printk("%s, alloc skb memory fail!\n", __func__);
  71. pskb = NULL;
  72. }
  73. printk("%s, rtk_skb_mem_q len : %d\n", __func__, skb_queue_len(&rtk_skb_mem_q));
  74. return 0;
  75. }
  76. static void __exit rtw_mem_exit(void)
  77. {
  78. if (skb_queue_len(&rtk_skb_mem_q))
  79. printk("%s, rtk_skb_mem_q len : %d\n", __func__, skb_queue_len(&rtk_skb_mem_q));
  80. skb_queue_purge(&rtk_skb_mem_q);
  81. printk("%s\n", __func__);
  82. }
  83. module_init(rtw_mem_init);
  84. module_exit(rtw_mem_exit);