GNU Linux-libre 5.10.153-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_init_queue(struct __queue *pqueue)
22 {
23         INIT_LIST_HEAD(&pqueue->queue);
24         spin_lock_init(&pqueue->lock);
25 }
26
27 struct net_device *rtw_alloc_etherdev_with_old_priv(void *old_priv)
28 {
29         struct net_device *netdev;
30         struct rtw_netdev_priv_indicator *pnpi;
31
32         netdev = alloc_etherdev_mq(sizeof(struct rtw_netdev_priv_indicator), 4);
33         if (!netdev)
34                 return NULL;
35
36         pnpi = netdev_priv(netdev);
37         pnpi->priv = old_priv;
38
39         return netdev;
40 }
41
42 void rtw_free_netdev(struct net_device *netdev)
43 {
44         struct rtw_netdev_priv_indicator *pnpi;
45
46         if (!netdev)
47                 return;
48
49         pnpi = netdev_priv(netdev);
50
51         if (!pnpi->priv)
52                 return;
53
54         vfree(pnpi->priv);
55         free_netdev(netdev);
56 }
57
58 void rtw_buf_free(u8 **buf, u32 *buf_len)
59 {
60         *buf_len = 0;
61         kfree(*buf);
62         *buf = NULL;
63 }
64
65 void rtw_buf_update(u8 **buf, u32 *buf_len, u8 *src, u32 src_len)
66 {
67         u32 dup_len = 0;
68         u8 *ori = NULL;
69         u8 *dup = NULL;
70
71         if (!buf || !buf_len)
72                 return;
73
74         if (!src || !src_len)
75                 goto keep_ori;
76
77         /* duplicate src */
78         dup = rtw_malloc(src_len);
79         if (dup) {
80                 dup_len = src_len;
81                 memcpy(dup, src, dup_len);
82         }
83
84 keep_ori:
85         ori = *buf;
86
87         /* replace buf with dup */
88         *buf_len = 0;
89         *buf = dup;
90         *buf_len = dup_len;
91
92         /* free ori */
93         kfree(ori);
94 }