1 // SPDX-License-Identifier: GPL-2.0
2 /******************************************************************************
4 * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.
6 ******************************************************************************/
11 * Translate the OS dependent @param error_code to OS independent RTW_STATUS_CODE
12 * @return: one of RTW_STATUS_CODE
14 inline int RTW_STATUS_CODE(int error_code)
21 void *_rtw_malloc(u32 sz)
23 return kmalloc(sz, in_interrupt() ? GFP_ATOMIC : GFP_KERNEL);
26 void *_rtw_zmalloc(u32 sz)
28 void *pbuf = _rtw_malloc(sz);
36 inline struct sk_buff *_rtw_skb_alloc(u32 sz)
38 return __dev_alloc_skb(sz, in_interrupt() ? GFP_ATOMIC : GFP_KERNEL);
41 inline struct sk_buff *_rtw_skb_copy(const struct sk_buff *skb)
43 return skb_copy(skb, in_interrupt() ? GFP_ATOMIC : GFP_KERNEL);
46 inline int _rtw_netif_rx(struct net_device *ndev, struct sk_buff *skb)
52 struct net_device *rtw_alloc_etherdev_with_old_priv(int sizeof_priv, void *old_priv)
54 struct net_device *pnetdev;
55 struct rtw_netdev_priv_indicator *pnpi;
57 pnetdev = alloc_etherdev_mq(sizeof(struct rtw_netdev_priv_indicator), 4);
61 pnpi = netdev_priv(pnetdev);
62 pnpi->priv = old_priv;
63 pnpi->sizeof_priv = sizeof_priv;
69 struct net_device *rtw_alloc_etherdev(int sizeof_priv)
71 struct net_device *pnetdev;
72 struct rtw_netdev_priv_indicator *pnpi;
74 pnetdev = alloc_etherdev_mq(sizeof(struct rtw_netdev_priv_indicator), 4);
78 pnpi = netdev_priv(pnetdev);
80 pnpi->priv = vzalloc(sizeof_priv);
87 pnpi->sizeof_priv = sizeof_priv;
92 void rtw_free_netdev(struct net_device *netdev)
94 struct rtw_netdev_priv_indicator *pnpi;
99 pnpi = netdev_priv(netdev);
111 void rtw_buf_free(u8 **buf, u32 *buf_len)
113 if (!buf || !buf_len)
123 void rtw_buf_update(u8 **buf, u32 *buf_len, u8 *src, u32 src_len)
125 u32 ori_len = 0, dup_len = 0;
129 if (!buf || !buf_len)
132 if (!src || !src_len)
136 dup = rtw_malloc(src_len);
139 memcpy(dup, src, dup_len);
146 /* replace buf with dup */
152 if (ori && ori_len > 0)
158 * rtw_cbuf_full - test if cbuf is full
159 * @cbuf: pointer of struct rtw_cbuf
161 * Returns: true if cbuf is full
163 inline bool rtw_cbuf_full(struct rtw_cbuf *cbuf)
165 return (cbuf->write == cbuf->read - 1) ? true : false;
169 * rtw_cbuf_empty - test if cbuf is empty
170 * @cbuf: pointer of struct rtw_cbuf
172 * Returns: true if cbuf is empty
174 inline bool rtw_cbuf_empty(struct rtw_cbuf *cbuf)
176 return (cbuf->write == cbuf->read) ? true : false;
180 * rtw_cbuf_push - push a pointer into cbuf
181 * @cbuf: pointer of struct rtw_cbuf
182 * @buf: pointer to push in
184 * Lock free operation, be careful of the use scheme
185 * Returns: true push success
187 bool rtw_cbuf_push(struct rtw_cbuf *cbuf, void *buf)
189 if (rtw_cbuf_full(cbuf))
192 cbuf->bufs[cbuf->write] = buf;
193 cbuf->write = (cbuf->write + 1) % cbuf->size;
199 * rtw_cbuf_pop - pop a pointer from cbuf
200 * @cbuf: pointer of struct rtw_cbuf
202 * Lock free operation, be careful of the use scheme
203 * Returns: pointer popped out
205 void *rtw_cbuf_pop(struct rtw_cbuf *cbuf)
208 if (rtw_cbuf_empty(cbuf))
211 buf = cbuf->bufs[cbuf->read];
212 cbuf->read = (cbuf->read + 1) % cbuf->size;
218 * rtw_cbuf_alloc - allocate a rtw_cbuf with given size and do initialization
219 * @size: size of pointer
221 * Returns: pointer of srtuct rtw_cbuf, NULL for allocation failure
223 struct rtw_cbuf *rtw_cbuf_alloc(u32 size)
225 struct rtw_cbuf *cbuf;
227 cbuf = rtw_malloc(struct_size(cbuf, bufs, size));
230 cbuf->write = cbuf->read = 0;