1 // SPDX-License-Identifier: GPL-2.0
2 /******************************************************************************
3  *
4  * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.
5  *
6  ******************************************************************************/
7 #define _OSDEP_SERVICE_C_
8 
9 #include <osdep_service.h>
10 #include <osdep_intf.h>
11 #include <drv_types.h>
12 #include <recv_osdep.h>
13 #include <linux/vmalloc.h>
14 #include <rtw_ioctl_set.h>
15 
_rtw_malloc(u32 sz)16 u8 *_rtw_malloc(u32 sz)
17 {
18 	return kmalloc(sz, in_interrupt() ? GFP_ATOMIC : GFP_KERNEL);
19 }
20 
rtw_malloc2d(int h,int w,int size)21 void *rtw_malloc2d(int h, int w, int size)
22 {
23 	int j;
24 	void **a = kzalloc(h * sizeof(void *) + h * w * size, GFP_KERNEL);
25 
26 	if (!a)
27 		goto out;
28 
29 	for (j = 0; j < h; j++)
30 		a[j] = ((char *)(a + h)) + j * w * size;
31 out:
32 	return a;
33 }
34 
_rtw_init_queue(struct __queue * pqueue)35 void _rtw_init_queue(struct __queue *pqueue)
36 {
37 	INIT_LIST_HEAD(&pqueue->queue);
38 	spin_lock_init(&pqueue->lock);
39 }
40 
rtw_alloc_etherdev_with_old_priv(void * old_priv)41 struct net_device *rtw_alloc_etherdev_with_old_priv(void *old_priv)
42 {
43 	struct net_device *pnetdev;
44 	struct rtw_netdev_priv_indicator *pnpi;
45 
46 	pnetdev = alloc_etherdev_mq(sizeof(struct rtw_netdev_priv_indicator), 4);
47 	if (!pnetdev)
48 		goto RETURN;
49 
50 	pnpi = netdev_priv(pnetdev);
51 	pnpi->priv = old_priv;
52 
53 RETURN:
54 	return pnetdev;
55 }
56 
rtw_free_netdev(struct net_device * netdev)57 void rtw_free_netdev(struct net_device *netdev)
58 {
59 	struct rtw_netdev_priv_indicator *pnpi;
60 
61 	if (!netdev)
62 		goto RETURN;
63 
64 	pnpi = netdev_priv(netdev);
65 
66 	if (!pnpi->priv)
67 		goto RETURN;
68 
69 	vfree(pnpi->priv);
70 	free_netdev(netdev);
71 
72 RETURN:
73 	return;
74 }
75 
rtw_modular64(u64 x,u64 y)76 u64 rtw_modular64(u64 x, u64 y)
77 {
78 	return do_div(x, y);
79 }
80 
rtw_buf_free(u8 ** buf,u32 * buf_len)81 void rtw_buf_free(u8 **buf, u32 *buf_len)
82 {
83 	*buf_len = 0;
84 	kfree(*buf);
85 	*buf = NULL;
86 }
87 
rtw_buf_update(u8 ** buf,u32 * buf_len,u8 * src,u32 src_len)88 void rtw_buf_update(u8 **buf, u32 *buf_len, u8 *src, u32 src_len)
89 {
90 	u32 dup_len = 0;
91 	u8 *ori = NULL;
92 	u8 *dup = NULL;
93 
94 	if (!buf || !buf_len)
95 		return;
96 
97 	if (!src || !src_len)
98 		goto keep_ori;
99 
100 	/* duplicate src */
101 	dup = rtw_malloc(src_len);
102 	if (dup) {
103 		dup_len = src_len;
104 		memcpy(dup, src, dup_len);
105 	}
106 
107 keep_ori:
108 	ori = *buf;
109 
110 	/* replace buf with dup */
111 	*buf_len = 0;
112 	*buf = dup;
113 	*buf_len = dup_len;
114 
115 	/* free ori */
116 	kfree(ori);
117 }
118