hc
2023-10-16 def2367077573b56f9fc4f824e5c0377a3a4175a
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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
// SPDX-License-Identifier: GPL-2.0
/******************************************************************************
 *
 * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.
 *
 ******************************************************************************/
#define _OSDEP_SERVICE_C_
 
#include <osdep_service.h>
#include <osdep_intf.h>
#include <drv_types.h>
#include <recv_osdep.h>
#include <linux/vmalloc.h>
#include <rtw_ioctl_set.h>
 
u8 *_rtw_malloc(u32 sz)
{
   return kmalloc(sz, in_interrupt() ? GFP_ATOMIC : GFP_KERNEL);
}
 
void *rtw_malloc2d(int h, int w, int size)
{
   int j;
   void **a = kzalloc(h * sizeof(void *) + h * w * size, GFP_KERNEL);
 
   if (!a)
       goto out;
 
   for (j = 0; j < h; j++)
       a[j] = ((char *)(a + h)) + j * w * size;
out:
   return a;
}
 
void _rtw_init_queue(struct __queue *pqueue)
{
   INIT_LIST_HEAD(&pqueue->queue);
   spin_lock_init(&pqueue->lock);
}
 
struct net_device *rtw_alloc_etherdev_with_old_priv(void *old_priv)
{
   struct net_device *pnetdev;
   struct rtw_netdev_priv_indicator *pnpi;
 
   pnetdev = alloc_etherdev_mq(sizeof(struct rtw_netdev_priv_indicator), 4);
   if (!pnetdev)
       goto RETURN;
 
   pnpi = netdev_priv(pnetdev);
   pnpi->priv = old_priv;
 
RETURN:
   return pnetdev;
}
 
void rtw_free_netdev(struct net_device *netdev)
{
   struct rtw_netdev_priv_indicator *pnpi;
 
   if (!netdev)
       goto RETURN;
 
   pnpi = netdev_priv(netdev);
 
   if (!pnpi->priv)
       goto RETURN;
 
   vfree(pnpi->priv);
   free_netdev(netdev);
 
RETURN:
   return;
}
 
u64 rtw_modular64(u64 x, u64 y)
{
   return do_div(x, y);
}
 
void rtw_buf_free(u8 **buf, u32 *buf_len)
{
   *buf_len = 0;
   kfree(*buf);
   *buf = NULL;
}
 
void rtw_buf_update(u8 **buf, u32 *buf_len, u8 *src, u32 src_len)
{
   u32 dup_len = 0;
   u8 *ori = NULL;
   u8 *dup = NULL;
 
   if (!buf || !buf_len)
       return;
 
   if (!src || !src_len)
       goto keep_ori;
 
   /* duplicate src */
   dup = rtw_malloc(src_len);
   if (dup) {
       dup_len = src_len;
       memcpy(dup, src, dup_len);
   }
 
keep_ori:
   ori = *buf;
 
   /* replace buf with dup */
   *buf_len = 0;
   *buf = dup;
   *buf_len = dup_len;
 
   /* free ori */
   kfree(ori);
}