File Index
Files and directories
Sign in
FILE

osdep_service.c

File preview with syntax highlighting.

linux-6.19.14/drivers/staging/rtl8723bs/os_dep/osdep_service.c C
  1// SPDX-License-Identifier: GPL-2.0
  2/******************************************************************************
  3 *
  4 * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.
  5 *
  6 ******************************************************************************/
  7#include <drv_types.h>
  8
  9/*
 10* Translate the OS dependent @param error_code to OS independent RTW_STATUS_CODE
 11* @return: one of RTW_STATUS_CODE
 12*/
 13inline int RTW_STATUS_CODE(int error_code)
 14{
 15	if (error_code >= 0)
 16		return _SUCCESS;
 17	return _FAIL;
 18}
 19
 20void *_rtw_malloc(u32 sz)
 21{
 22	return kmalloc(sz, in_interrupt() ? GFP_ATOMIC : GFP_KERNEL);
 23}
 24
 25void *_rtw_zmalloc(u32 sz)
 26{
 27	void *pbuf = _rtw_malloc(sz);
 28
 29	if (pbuf)
 30		memset(pbuf, 0, sz);
 31
 32	return pbuf;
 33}
 34
 35inline struct sk_buff *_rtw_skb_alloc(u32 sz)
 36{
 37	return __dev_alloc_skb(sz, in_interrupt() ? GFP_ATOMIC : GFP_KERNEL);
 38}
 39
 40inline struct sk_buff *_rtw_skb_copy(const struct sk_buff *skb)
 41{
 42	return skb_copy(skb, in_interrupt() ? GFP_ATOMIC : GFP_KERNEL);
 43}
 44
 45inline int _rtw_netif_rx(struct net_device *ndev, struct sk_buff *skb)
 46{
 47	skb->dev = ndev;
 48	return netif_rx(skb);
 49}
 50
 51struct net_device *rtw_alloc_etherdev_with_old_priv(int sizeof_priv, void *old_priv)
 52{
 53	struct net_device *pnetdev;
 54	struct rtw_netdev_priv_indicator *pnpi;
 55
 56	pnetdev = alloc_etherdev_mq(sizeof(struct rtw_netdev_priv_indicator), 4);
 57	if (!pnetdev)
 58		goto RETURN;
 59
 60	pnpi = netdev_priv(pnetdev);
 61	pnpi->priv = old_priv;
 62	pnpi->sizeof_priv = sizeof_priv;
 63
 64RETURN:
 65	return pnetdev;
 66}
 67
 68struct net_device *rtw_alloc_etherdev(int sizeof_priv)
 69{
 70	struct net_device *pnetdev;
 71	struct rtw_netdev_priv_indicator *pnpi;
 72
 73	pnetdev = alloc_etherdev_mq(sizeof(struct rtw_netdev_priv_indicator), 4);
 74	if (!pnetdev)
 75		goto RETURN;
 76
 77	pnpi = netdev_priv(pnetdev);
 78
 79	pnpi->priv = vzalloc(sizeof_priv);
 80	if (!pnpi->priv) {
 81		free_netdev(pnetdev);
 82		pnetdev = NULL;
 83		goto RETURN;
 84	}
 85
 86	pnpi->sizeof_priv = sizeof_priv;
 87RETURN:
 88	return pnetdev;
 89}
 90
 91void rtw_free_netdev(struct net_device *netdev)
 92{
 93	struct rtw_netdev_priv_indicator *pnpi;
 94
 95	if (!netdev)
 96		goto RETURN;
 97
 98	pnpi = netdev_priv(netdev);
 99
100	if (!pnpi->priv)
101		goto RETURN;
102
103	vfree(pnpi->priv);
104	free_netdev(netdev);
105
106RETURN:
107	return;
108}
109
110void rtw_buf_free(u8 **buf, u32 *buf_len)
111{
112	if (!buf || !buf_len)
113		return;
114
115	if (*buf) {
116		*buf_len = 0;
117		kfree(*buf);
118		*buf = NULL;
119	}
120}
121
122void rtw_buf_update(u8 **buf, u32 *buf_len, u8 *src, u32 src_len)
123{
124	u32 ori_len = 0, dup_len = 0;
125	u8 *ori = NULL;
126	u8 *dup = NULL;
127
128	if (!buf || !buf_len)
129		return;
130
131	if (!src || !src_len)
132		goto keep_ori;
133
134	/* duplicate src */
135	dup = rtw_malloc(src_len);
136	if (dup) {
137		dup_len = src_len;
138		memcpy(dup, src, dup_len);
139	}
140
141keep_ori:
142	ori = *buf;
143	ori_len = *buf_len;
144
145	/* replace buf with dup */
146	*buf_len = 0;
147	*buf = dup;
148	*buf_len = dup_len;
149
150	/* free ori */
151	if (ori && ori_len > 0)
152		kfree(ori);
153}
154
155
156/**
157 * rtw_cbuf_full - test if cbuf is full
158 * @cbuf: pointer of struct rtw_cbuf
159 *
160 * Returns: true if cbuf is full
161 */
162inline bool rtw_cbuf_full(struct rtw_cbuf *cbuf)
163{
164	return (cbuf->write == cbuf->read - 1) ? true : false;
165}
166
167/**
168 * rtw_cbuf_empty - test if cbuf is empty
169 * @cbuf: pointer of struct rtw_cbuf
170 *
171 * Returns: true if cbuf is empty
172 */
173inline bool rtw_cbuf_empty(struct rtw_cbuf *cbuf)
174{
175	return (cbuf->write == cbuf->read) ? true : false;
176}
177
178/**
179 * rtw_cbuf_push - push a pointer into cbuf
180 * @cbuf: pointer of struct rtw_cbuf
181 * @buf: pointer to push in
182 *
183 * Lock free operation, be careful of the use scheme
184 * Returns: true push success
185 */
186bool rtw_cbuf_push(struct rtw_cbuf *cbuf, void *buf)
187{
188	if (rtw_cbuf_full(cbuf))
189		return _FAIL;
190
191	cbuf->bufs[cbuf->write] = buf;
192	cbuf->write = (cbuf->write + 1) % cbuf->size;
193
194	return _SUCCESS;
195}
196
197/**
198 * rtw_cbuf_pop - pop a pointer from cbuf
199 * @cbuf: pointer of struct rtw_cbuf
200 *
201 * Lock free operation, be careful of the use scheme
202 * Returns: pointer popped out
203 */
204void *rtw_cbuf_pop(struct rtw_cbuf *cbuf)
205{
206	void *buf;
207	if (rtw_cbuf_empty(cbuf))
208		return NULL;
209
210	buf = cbuf->bufs[cbuf->read];
211	cbuf->read = (cbuf->read + 1) % cbuf->size;
212
213	return buf;
214}
215
216/**
217 * rtw_cbuf_alloc - allocate a rtw_cbuf with given size and do initialization
218 * @size: size of pointer
219 *
220 * Returns: pointer of srtuct rtw_cbuf, NULL for allocation failure
221 */
222struct rtw_cbuf *rtw_cbuf_alloc(u32 size)
223{
224	struct rtw_cbuf *cbuf;
225
226	cbuf = rtw_malloc(struct_size(cbuf, bufs, size));
227
228	if (cbuf) {
229		cbuf->write = cbuf->read = 0;
230		cbuf->size = size;
231	}
232
233	return cbuf;
234}
~/ Read-only file preview.