Path: blob/master/ALFA-W1F1/RTL8814AU/core/rtw_mem.c
1307 views
/******************************************************************************1*2* Copyright(c) 2016 - 2017 Realtek Corporation.3*4* This program is free software; you can redistribute it and/or modify it5* under the terms of version 2 of the GNU General Public License as6* published by the Free Software Foundation.7*8* This program is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for11* more details.12*13*****************************************************************************/1415#include <drv_types.h>16#include <rtw_mem.h>1718MODULE_LICENSE("GPL");19MODULE_DESCRIPTION("Realtek Wireless Lan Driver");20MODULE_AUTHOR("Realtek Semiconductor Corp.");21MODULE_VERSION("DRIVERVERSION");2223struct sk_buff_head rtk_skb_mem_q;24struct u8 *rtk_buf_mem[NR_RECVBUFF];2526struct u8 *rtw_get_buf_premem(int index)27{28printk("%s, rtk_buf_mem index : %d\n", __func__, index);29return rtk_buf_mem[index];30}3132u16 rtw_rtkm_get_buff_size(void)33{34return MAX_RTKM_RECVBUF_SZ;35}36EXPORT_SYMBOL(rtw_rtkm_get_buff_size);3738u8 rtw_rtkm_get_nr_recv_skb(void)39{40return MAX_RTKM_NR_PREALLOC_RECV_SKB;41}42EXPORT_SYMBOL(rtw_rtkm_get_nr_recv_skb);4344struct sk_buff *rtw_alloc_skb_premem(u16 in_size)45{46struct sk_buff *skb = NULL;4748if (in_size > MAX_RTKM_RECVBUF_SZ) {49pr_info("warning %s: driver buffer size(%d) > rtkm buffer size(%d)\n", __func__, in_size, MAX_RTKM_RECVBUF_SZ);50WARN_ON(1);51return skb;52}5354skb = skb_dequeue(&rtk_skb_mem_q);5556printk("%s, rtk_skb_mem_q len : %d\n", __func__, skb_queue_len(&rtk_skb_mem_q));5758return skb;59}60EXPORT_SYMBOL(rtw_alloc_skb_premem);6162int rtw_free_skb_premem(struct sk_buff *pskb)63{64if (!pskb)65return -1;6667if (skb_queue_len(&rtk_skb_mem_q) >= MAX_RTKM_NR_PREALLOC_RECV_SKB)68return -1;6970skb_queue_tail(&rtk_skb_mem_q, pskb);7172printk("%s, rtk_skb_mem_q len : %d\n", __func__, skb_queue_len(&rtk_skb_mem_q));7374return 0;75}76EXPORT_SYMBOL(rtw_free_skb_premem);7778static int __init rtw_mem_init(void)79{80int i;81SIZE_PTR tmpaddr = 0;82SIZE_PTR alignment = 0;83struct sk_buff *pskb = NULL;8485printk("%s\n", __func__);86pr_info("MAX_RTKM_NR_PREALLOC_RECV_SKB: %d\n", MAX_RTKM_NR_PREALLOC_RECV_SKB);87pr_info("MAX_RTKM_RECVBUF_SZ: %d\n", MAX_RTKM_RECVBUF_SZ);8889#ifdef CONFIG_USE_USB_BUFFER_ALLOC_RX90for (i = 0; i < NR_RECVBUFF; i++)91rtk_buf_mem[i] = usb_buffer_alloc(dev, size, (in_interrupt() ? GFP_ATOMIC : GFP_KERNEL), dma);92#endif /* CONFIG_USE_USB_BUFFER_ALLOC_RX */9394skb_queue_head_init(&rtk_skb_mem_q);9596for (i = 0; i < MAX_RTKM_NR_PREALLOC_RECV_SKB; i++) {97pskb = __dev_alloc_skb(MAX_RTKM_RECVBUF_SZ + RECVBUFF_ALIGN_SZ, in_interrupt() ? GFP_ATOMIC : GFP_KERNEL);98if (pskb) {99tmpaddr = (SIZE_PTR)pskb->data;100alignment = tmpaddr & (RECVBUFF_ALIGN_SZ - 1);101skb_reserve(pskb, (RECVBUFF_ALIGN_SZ - alignment));102103skb_queue_tail(&rtk_skb_mem_q, pskb);104} else105printk("%s, alloc skb memory fail!\n", __func__);106107pskb = NULL;108}109110printk("%s, rtk_skb_mem_q len : %d\n", __func__, skb_queue_len(&rtk_skb_mem_q));111112return 0;113114}115116static void __exit rtw_mem_exit(void)117{118if (skb_queue_len(&rtk_skb_mem_q))119printk("%s, rtk_skb_mem_q len : %d\n", __func__, skb_queue_len(&rtk_skb_mem_q));120121skb_queue_purge(&rtk_skb_mem_q);122123printk("%s\n", __func__);124}125126module_init(rtw_mem_init);127module_exit(rtw_mem_exit);128129130