net: wireless: rockchip_wlan: add rtl8188fu support
[firefly-linux-kernel-4.4.55.git] / drivers / net / wireless / rockchip_wlan / rtl8188fu / core / rtw_mem.c
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8188fu/core/rtw_mem.c b/drivers/net/wireless/rockchip_wlan/rtl8188fu/core/rtw_mem.c
new file mode 100644 (file)
index 0000000..d05e3af
--- /dev/null
@@ -0,0 +1,122 @@
+\r
+#include <drv_types.h>\r
+#include <rtw_mem.h>\r
+\r
+MODULE_LICENSE("GPL");\r
+MODULE_DESCRIPTION("Realtek Wireless Lan Driver");\r
+MODULE_AUTHOR("Realtek Semiconductor Corp.");\r
+MODULE_VERSION("DRIVERVERSION");\r
+\r
+struct sk_buff_head rtk_skb_mem_q;\r
+struct u8* rtk_buf_mem[NR_RECVBUFF];\r
+\r
+struct u8      * rtw_get_buf_premem(int index)\r
+{\r
+       printk("%s, rtk_buf_mem index : %d\n", __func__, index);\r
+       return rtk_buf_mem[index];\r
+}\r
+\r
+u16 rtw_rtkm_get_buff_size(void)\r
+{\r
+       return MAX_RTKM_RECVBUF_SZ;\r
+}\r
+EXPORT_SYMBOL(rtw_rtkm_get_buff_size);\r
+\r
+u8 rtw_rtkm_get_nr_recv_skb(void)\r
+{\r
+       return MAX_RTKM_NR_PREALLOC_RECV_SKB;\r
+}\r
+EXPORT_SYMBOL(rtw_rtkm_get_nr_recv_skb);\r
+\r
+struct sk_buff *rtw_alloc_skb_premem(u16 in_size)\r
+{\r
+       struct sk_buff *skb = NULL;\r
+\r
+       if (in_size > MAX_RTKM_RECVBUF_SZ) {\r
+               pr_info("warning %s: driver buffer size(%d) > rtkm buffer size(%d)\n", __func__, in_size, MAX_RTKM_RECVBUF_SZ);\r
+               WARN_ON(1);\r
+               return skb;\r
+       }\r
+\r
+       skb = skb_dequeue(&rtk_skb_mem_q);\r
+\r
+       printk("%s, rtk_skb_mem_q len : %d\n", __func__, skb_queue_len(&rtk_skb_mem_q));\r
+\r
+       return skb;     \r
+}\r
+EXPORT_SYMBOL(rtw_alloc_skb_premem);\r
+\r
+int rtw_free_skb_premem(struct sk_buff *pskb)\r
+{\r
+       if(!pskb)\r
+               return -1;\r
+\r
+       if (skb_queue_len(&rtk_skb_mem_q) >= MAX_RTKM_NR_PREALLOC_RECV_SKB)     \r
+               return -1;\r
+       \r
+       skb_queue_tail(&rtk_skb_mem_q, pskb);\r
+       \r
+       printk("%s, rtk_skb_mem_q len : %d\n", __func__, skb_queue_len(&rtk_skb_mem_q));\r
+\r
+       return 0;\r
+}\r
+EXPORT_SYMBOL(rtw_free_skb_premem);\r
+\r
+static int __init rtw_mem_init(void)\r
+{\r
+       int i;\r
+       SIZE_PTR tmpaddr=0;\r
+       SIZE_PTR alignment=0;\r
+       struct sk_buff *pskb=NULL;\r
+\r
+       printk("%s\n", __func__);\r
+       pr_info("MAX_RTKM_NR_PREALLOC_RECV_SKB: %d\n", MAX_RTKM_NR_PREALLOC_RECV_SKB);\r
+       pr_info("MAX_RTKM_RECVBUF_SZ: %d\n", MAX_RTKM_RECVBUF_SZ);\r
+\r
+#ifdef CONFIG_USE_USB_BUFFER_ALLOC_RX\r
+       for(i=0; i<NR_RECVBUFF; i++)\r\r
+       {\r\r
+               rtk_buf_mem[i] = usb_buffer_alloc(dev, size, (in_interrupt() ? GFP_ATOMIC : GFP_KERNEL), dma);\r
+       }\r
+#endif //CONFIG_USE_USB_BUFFER_ALLOC_RX\r
+\r
+       skb_queue_head_init(&rtk_skb_mem_q);\r
+\r
+       for(i=0; i<MAX_RTKM_NR_PREALLOC_RECV_SKB; i++)\r
+       {\r
+               pskb = __dev_alloc_skb(MAX_RTKM_RECVBUF_SZ + RECVBUFF_ALIGN_SZ, in_interrupt() ? GFP_ATOMIC : GFP_KERNEL);\r
+               if(pskb)\r
+               {               \r
+                       tmpaddr = (SIZE_PTR)pskb->data;\r
+                       alignment = tmpaddr & (RECVBUFF_ALIGN_SZ-1);\r
+                       skb_reserve(pskb, (RECVBUFF_ALIGN_SZ - alignment));\r
+\r
+                       skb_queue_tail(&rtk_skb_mem_q, pskb);\r
+               }\r
+               else\r
+               {\r
+                       printk("%s, alloc skb memory fail!\n", __func__);\r
+               }\r
+\r
+               pskb=NULL;\r
+       }\r
+\r
+       printk("%s, rtk_skb_mem_q len : %d\n", __func__, skb_queue_len(&rtk_skb_mem_q));\r
+\r
+       return 0;\r
+       \r
+}\r
+\r
+static void __exit rtw_mem_exit(void)\r
+{\r
+       if (skb_queue_len(&rtk_skb_mem_q)) {\r
+               printk("%s, rtk_skb_mem_q len : %d\n", __func__, skb_queue_len(&rtk_skb_mem_q));\r
+       }\r
+\r
+       skb_queue_purge(&rtk_skb_mem_q);\r
+\r
+       printk("%s\n", __func__);\r
+}\r
+\r
+module_init(rtw_mem_init);\r
+module_exit(rtw_mem_exit);\r