aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/staging/wilc1000/wilc_exported_buf.c
blob: 529457816f655ce17cb41448c6055075b4b92bf3 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/slab.h>

#define LINUX_RX_SIZE	(96 * 1024)
#define LINUX_TX_SIZE	(64 * 1024)
#define WILC1000_FW_SIZE (4 * 1024)

#define DECLARE_WILC_BUFFER(name)	\
	void *exported_ ## name = NULL;

#define MALLOC_WILC_BUFFER(name, size)	\
	exported_ ## name = kmalloc(size, GFP_KERNEL);	  \
	if (!exported_ ## name) {   \
		printk("fail to alloc: %s memory\n", exported_ ## name);  \
		return -ENOBUFS;	\
	}

#define FREE_WILC_BUFFER(name)	\
	kfree(exported_ ## name);

/*
 * Add necessary buffer pointers
 */
DECLARE_WILC_BUFFER(g_tx_buf)
DECLARE_WILC_BUFFER(g_rx_buf)
DECLARE_WILC_BUFFER(g_fw_buf)

void *get_tx_buffer(void)
{
	return exported_g_tx_buf;
}
EXPORT_SYMBOL(get_tx_buffer);

void *get_rx_buffer(void)
{
	return exported_g_rx_buf;
}
EXPORT_SYMBOL(get_rx_buffer);

void *get_fw_buffer(void)
{
	return exported_g_fw_buf;
}
EXPORT_SYMBOL(get_fw_buffer);

static int __init wilc_module_init(void)
{
	printk("wilc_module_init\n");
	/*
	 * alloc necessary memory
	 */
	MALLOC_WILC_BUFFER(g_tx_buf, LINUX_TX_SIZE)
	MALLOC_WILC_BUFFER(g_rx_buf, LINUX_RX_SIZE)
	MALLOC_WILC_BUFFER(g_fw_buf, WILC1000_FW_SIZE)

	return 0;
}

static void __exit wilc_module_deinit(void)
{
	printk("wilc_module_deinit\n");
	FREE_WILC_BUFFER(g_tx_buf)
	FREE_WILC_BUFFER(g_rx_buf)
	FREE_WILC_BUFFER(g_fw_buf)

	return;
}

MODULE_LICENSE("Dual BSD/GPL");
MODULE_AUTHOR("Tony Cho");
MODULE_DESCRIPTION("WILC1xxx Memory Manager");
pure_initcall(wilc_module_init);
module_exit(wilc_module_deinit);