Commit | Line | Data |
---|---|---|
71e9bd3f | 1 | // SPDX-License-Identifier: GPL-2.0 |
a2c60d42 LF |
2 | /****************************************************************************** |
3 | * | |
4 | * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. | |
5 | * | |
a2c60d42 | 6 | ******************************************************************************/ |
a2c60d42 LF |
7 | #define _OSDEP_SERVICE_C_ |
8 | ||
9 | #include <osdep_service.h> | |
0a95a7f4 | 10 | #include <osdep_intf.h> |
a2c60d42 LF |
11 | #include <drv_types.h> |
12 | #include <recv_osdep.h> | |
13 | #include <linux/vmalloc.h> | |
14 | #include <rtw_ioctl_set.h> | |
15 | ||
a2c60d42 LF |
16 | u8 *_rtw_malloc(u32 sz) |
17 | { | |
92098c1f | 18 | return kmalloc(sz, in_interrupt() ? GFP_ATOMIC : GFP_KERNEL); |
a2c60d42 LF |
19 | } |
20 | ||
1050394c | 21 | void _rtw_init_queue(struct __queue *pqueue) |
a2c60d42 | 22 | { |
1050394c PYK |
23 | INIT_LIST_HEAD(&pqueue->queue); |
24 | spin_lock_init(&pqueue->lock); | |
a2c60d42 LF |
25 | } |
26 | ||
f8a1a236 | 27 | struct net_device *rtw_alloc_etherdev_with_old_priv(void *old_priv) |
a2c60d42 | 28 | { |
36be4102 | 29 | struct net_device *netdev; |
a2c60d42 LF |
30 | struct rtw_netdev_priv_indicator *pnpi; |
31 | ||
36be4102 MS |
32 | netdev = alloc_etherdev_mq(sizeof(struct rtw_netdev_priv_indicator), 4); |
33 | if (!netdev) | |
226f912a | 34 | return NULL; |
a2c60d42 | 35 | |
36be4102 | 36 | pnpi = netdev_priv(netdev); |
a2c60d42 | 37 | pnpi->priv = old_priv; |
a2c60d42 | 38 | |
36be4102 | 39 | return netdev; |
a2c60d42 LF |
40 | } |
41 | ||
a2c60d42 LF |
42 | void rtw_free_netdev(struct net_device *netdev) |
43 | { | |
44 | struct rtw_netdev_priv_indicator *pnpi; | |
45 | ||
46 | if (!netdev) | |
226f912a | 47 | return; |
a2c60d42 LF |
48 | |
49 | pnpi = netdev_priv(netdev); | |
50 | ||
51 | if (!pnpi->priv) | |
226f912a | 52 | return; |
a2c60d42 | 53 | |
03bd6aea | 54 | vfree(pnpi->priv); |
a2c60d42 | 55 | free_netdev(netdev); |
a2c60d42 LF |
56 | } |
57 | ||
a2c60d42 LF |
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 | { | |
9393d34e | 67 | u32 dup_len = 0; |
a2c60d42 LF |
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; | |
a2c60d42 LF |
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 | } |