GNU Linux-libre 4.19.264-gnu1
[releases.git] / drivers / staging / rtl8188eu / os_dep / osdep_service.c
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
16 u8 *_rtw_malloc(u32 sz)
17 {
18         return kmalloc(sz, in_interrupt() ? GFP_ATOMIC : GFP_KERNEL);
19 }
20
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
35 void _rtw_init_queue(struct __queue *pqueue)
36 {
37         INIT_LIST_HEAD(&pqueue->queue);
38         spin_lock_init(&pqueue->lock);
39 }
40
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
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
76 u64 rtw_modular64(u64 x, u64 y)
77 {
78         return do_div(x, y);
79 }
80
81 void rtw_buf_free(u8 **buf, u32 *buf_len)
82 {
83         *buf_len = 0;
84         kfree(*buf);
85         *buf = NULL;
86 }
87
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 }