1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright(c) 2007 - 2012 Realtek Corporation. */
4 #define _OSDEP_SERVICE_C_
6 #include "../include/osdep_service.h"
7 #include "../include/drv_types.h"
8 #include "../include/recv_osdep.h"
9 #include "../include/rtw_ioctl_set.h"
12 * Translate the OS dependent @param error_code to OS independent RTW_STATUS_CODE
13 * @return: one of RTW_STATUS_CODE
15 inline int RTW_STATUS_CODE(int error_code)
22 void *rtw_malloc2d(int h, int w, int size)
26 void **a = kzalloc(h * sizeof(void *) + h * w * size, GFP_KERNEL);
30 for (j = 0; j < h; j++)
31 a[j] = ((char *)(a + h)) + j * w * size;
37 For the following list_xxx operations,
38 caller must guarantee the atomic context.
39 Otherwise, there will be racing condition.
42 Caller must check if the list is empty before calling rtw_list_delete
45 void rtw_usleep_os(int us)
50 msleep((us / 1000) + 1);
53 static const struct device_type wlan_type = {
57 struct net_device *rtw_alloc_etherdev_with_old_priv(int sizeof_priv,
60 struct net_device *pnetdev;
61 struct rtw_netdev_priv_indicator *pnpi;
63 pnetdev = alloc_etherdev_mq(sizeof(struct rtw_netdev_priv_indicator), 4);
67 pnetdev->dev.type = &wlan_type;
68 pnpi = netdev_priv(pnetdev);
69 pnpi->priv = old_priv;
70 pnpi->sizeof_priv = sizeof_priv;
76 struct net_device *rtw_alloc_etherdev(int sizeof_priv)
78 struct net_device *pnetdev;
79 struct rtw_netdev_priv_indicator *pnpi;
81 pnetdev = alloc_etherdev_mq(sizeof(struct rtw_netdev_priv_indicator), 4);
85 pnpi = netdev_priv(pnetdev);
87 pnpi->priv = vzalloc(sizeof_priv);
94 pnpi->sizeof_priv = sizeof_priv;
99 void rtw_free_netdev(struct net_device *netdev)
101 struct rtw_netdev_priv_indicator *pnpi;
103 pnpi = netdev_priv(netdev);
109 int rtw_change_ifname(struct adapter *padapter, const char *ifname)
111 struct net_device *pnetdev;
112 struct net_device *cur_pnetdev;
113 struct rereg_nd_name_data *rereg_priv;
119 cur_pnetdev = padapter->pnetdev;
120 rereg_priv = &padapter->rereg_nd_name_priv;
122 /* free the old_pnetdev */
123 if (rereg_priv->old_pnetdev) {
124 free_netdev(rereg_priv->old_pnetdev);
125 rereg_priv->old_pnetdev = NULL;
128 if (!rtnl_is_locked())
129 unregister_netdev(cur_pnetdev);
131 unregister_netdevice(cur_pnetdev);
133 rereg_priv->old_pnetdev = cur_pnetdev;
135 pnetdev = rtw_init_netdev(padapter);
141 SET_NETDEV_DEV(pnetdev, dvobj_to_dev(adapter_to_dvobj(padapter)));
143 rtw_init_netdev_name(pnetdev, ifname);
145 eth_hw_addr_set(pnetdev, padapter->eeprompriv.mac_addr);
147 if (!rtnl_is_locked())
148 ret = register_netdev(pnetdev);
150 ret = register_netdevice(pnetdev);
159 void rtw_buf_update(u8 **buf, u32 *buf_len, u8 *src, u32 src_len)
165 if (!buf || !buf_len)
168 if (!src || !src_len)
172 dup = kmalloc(src_len, GFP_ATOMIC);
175 memcpy(dup, src, dup_len);
181 /* replace buf with dup */
191 * rtw_cbuf_empty - test if cbuf is empty
192 * @cbuf: pointer of struct rtw_cbuf
194 * Returns: true if cbuf is empty
196 inline bool rtw_cbuf_empty(struct rtw_cbuf *cbuf)
198 return cbuf->write == cbuf->read;
202 * rtw_cbuf_pop - pop a pointer from cbuf
203 * @cbuf: pointer of struct rtw_cbuf
205 * Lock free operation, be careful of the use scheme
206 * Returns: pointer popped out
208 void *rtw_cbuf_pop(struct rtw_cbuf *cbuf)
211 if (rtw_cbuf_empty(cbuf))
214 buf = cbuf->bufs[cbuf->read];
215 cbuf->read = (cbuf->read + 1) % cbuf->size;
221 * rtw_cbuf_alloc - allocate a rtw_cbuf with given size and do initialization
222 * @size: size of pointer
224 * Returns: pointer of srtuct rtw_cbuf, NULL for allocation failure
226 struct rtw_cbuf *rtw_cbuf_alloc(u32 size)
228 struct rtw_cbuf *cbuf;
230 cbuf = kmalloc(struct_size(cbuf, bufs, size), GFP_KERNEL);