1 // SPDX-License-Identifier: GPL-2.0
2 /******************************************************************************
4 * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.
6 ******************************************************************************/
9 #define _OSDEP_SERVICE_C_
11 #include <drv_types.h>
12 #include <rtw_debug.h>
15 * Translate the OS dependent @param error_code to OS independent RTW_STATUS_CODE
16 * @return: one of RTW_STATUS_CODE
18 inline int RTW_STATUS_CODE(int error_code)
25 void *_rtw_malloc(u32 sz)
27 return kmalloc(sz, in_interrupt() ? GFP_ATOMIC : GFP_KERNEL);
30 void *_rtw_zmalloc(u32 sz)
32 void *pbuf = _rtw_malloc(sz);
40 inline struct sk_buff *_rtw_skb_alloc(u32 sz)
42 return __dev_alloc_skb(sz, in_interrupt() ? GFP_ATOMIC : GFP_KERNEL);
45 inline struct sk_buff *_rtw_skb_copy(const struct sk_buff *skb)
47 return skb_copy(skb, in_interrupt() ? GFP_ATOMIC : GFP_KERNEL);
50 inline struct sk_buff *_rtw_skb_clone(struct sk_buff *skb)
52 return skb_clone(skb, in_interrupt() ? GFP_ATOMIC : GFP_KERNEL);
55 inline int _rtw_netif_rx(_nic_hdl ndev, struct sk_buff *skb)
61 void _rtw_init_queue(struct __queue *pqueue)
63 INIT_LIST_HEAD(&(pqueue->queue));
65 spin_lock_init(&(pqueue->lock));
68 struct net_device *rtw_alloc_etherdev_with_old_priv(int sizeof_priv, void *old_priv)
70 struct net_device *pnetdev;
71 struct rtw_netdev_priv_indicator *pnpi;
73 pnetdev = alloc_etherdev_mq(sizeof(struct rtw_netdev_priv_indicator), 4);
77 pnpi = netdev_priv(pnetdev);
78 pnpi->priv = old_priv;
79 pnpi->sizeof_priv = sizeof_priv;
85 struct net_device *rtw_alloc_etherdev(int sizeof_priv)
87 struct net_device *pnetdev;
88 struct rtw_netdev_priv_indicator *pnpi;
90 pnetdev = alloc_etherdev_mq(sizeof(struct rtw_netdev_priv_indicator), 4);
94 pnpi = netdev_priv(pnetdev);
96 pnpi->priv = vzalloc(sizeof_priv);
103 pnpi->sizeof_priv = sizeof_priv;
108 void rtw_free_netdev(struct net_device *netdev)
110 struct rtw_netdev_priv_indicator *pnpi;
115 pnpi = netdev_priv(netdev);
127 int rtw_change_ifname(struct adapter *padapter, const char *ifname)
129 struct net_device *pnetdev;
130 struct net_device *cur_pnetdev;
131 struct rereg_nd_name_data *rereg_priv;
137 cur_pnetdev = padapter->pnetdev;
138 rereg_priv = &padapter->rereg_nd_name_priv;
140 /* free the old_pnetdev */
141 if (rereg_priv->old_pnetdev) {
142 free_netdev(rereg_priv->old_pnetdev);
143 rereg_priv->old_pnetdev = NULL;
146 if (!rtnl_is_locked())
147 unregister_netdev(cur_pnetdev);
149 unregister_netdevice(cur_pnetdev);
151 rereg_priv->old_pnetdev = cur_pnetdev;
153 pnetdev = rtw_init_netdev(padapter);
159 SET_NETDEV_DEV(pnetdev, dvobj_to_dev(adapter_to_dvobj(padapter)));
161 rtw_init_netdev_name(pnetdev, ifname);
163 memcpy(pnetdev->dev_addr, padapter->eeprompriv.mac_addr, ETH_ALEN);
165 if (!rtnl_is_locked())
166 ret = register_netdev(pnetdev);
168 ret = register_netdevice(pnetdev);
171 RT_TRACE(_module_hci_intfs_c_, _drv_err_, ("register_netdev() failed\n"));
183 void rtw_buf_free(u8 **buf, u32 *buf_len)
185 if (!buf || !buf_len)
195 void rtw_buf_update(u8 **buf, u32 *buf_len, u8 *src, u32 src_len)
197 u32 ori_len = 0, dup_len = 0;
201 if (!buf || !buf_len)
204 if (!src || !src_len)
208 dup = rtw_malloc(src_len);
211 memcpy(dup, src, dup_len);
218 /* replace buf with dup */
224 if (ori && ori_len > 0)
230 * rtw_cbuf_full - test if cbuf is full
231 * @cbuf: pointer of struct rtw_cbuf
233 * Returns: true if cbuf is full
235 inline bool rtw_cbuf_full(struct rtw_cbuf *cbuf)
237 return (cbuf->write == cbuf->read - 1) ? true : false;
241 * rtw_cbuf_empty - test if cbuf is empty
242 * @cbuf: pointer of struct rtw_cbuf
244 * Returns: true if cbuf is empty
246 inline bool rtw_cbuf_empty(struct rtw_cbuf *cbuf)
248 return (cbuf->write == cbuf->read) ? true : false;
252 * rtw_cbuf_push - push a pointer into cbuf
253 * @cbuf: pointer of struct rtw_cbuf
254 * @buf: pointer to push in
256 * Lock free operation, be careful of the use scheme
257 * Returns: true push success
259 bool rtw_cbuf_push(struct rtw_cbuf *cbuf, void *buf)
261 if (rtw_cbuf_full(cbuf))
264 DBG_871X("%s on %u\n", __func__, cbuf->write);
265 cbuf->bufs[cbuf->write] = buf;
266 cbuf->write = (cbuf->write + 1) % cbuf->size;
272 * rtw_cbuf_pop - pop a pointer from cbuf
273 * @cbuf: pointer of struct rtw_cbuf
275 * Lock free operation, be careful of the use scheme
276 * Returns: pointer popped out
278 void *rtw_cbuf_pop(struct rtw_cbuf *cbuf)
281 if (rtw_cbuf_empty(cbuf))
284 DBG_871X("%s on %u\n", __func__, cbuf->read);
285 buf = cbuf->bufs[cbuf->read];
286 cbuf->read = (cbuf->read + 1) % cbuf->size;
292 * rtw_cbuf_alloc - allocte a rtw_cbuf with given size and do initialization
293 * @size: size of pointer
295 * Returns: pointer of srtuct rtw_cbuf, NULL for allocation failure
297 struct rtw_cbuf *rtw_cbuf_alloc(u32 size)
299 struct rtw_cbuf *cbuf;
301 cbuf = rtw_malloc(sizeof(*cbuf) + sizeof(void *) * size);
304 cbuf->write = cbuf->read = 0;