diff options
Diffstat (limited to 'drivers/staging/rtl8723au/os_dep/osdep_service.c')
-rw-r--r-- | drivers/staging/rtl8723au/os_dep/osdep_service.c | 175 |
1 files changed, 175 insertions, 0 deletions
diff --git a/drivers/staging/rtl8723au/os_dep/osdep_service.c b/drivers/staging/rtl8723au/os_dep/osdep_service.c new file mode 100644 index 00000000000..97fc27dce19 --- /dev/null +++ b/drivers/staging/rtl8723au/os_dep/osdep_service.c @@ -0,0 +1,175 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + ******************************************************************************/ + + +#define _OSDEP_SERVICE_C_ + +#include <osdep_service.h> +#include <drv_types.h> +#include <recv_osdep.h> +#include <linux/vmalloc.h> + +#define RT_TAG ('1178') + +/* +* Translate the OS dependent @param error_code to OS independent RTW_STATUS_CODE23a +* @return: one of RTW_STATUS_CODE23a +*/ +inline int RTW_STATUS_CODE23a(int error_code) +{ + if (error_code >= 0) + return _SUCCESS; + return _FAIL; +} + +inline u8 *_rtw_vmalloc(u32 sz) +{ + u8 *pbuf; + pbuf = vmalloc(sz); + + return pbuf; +} + +inline u8 *_rtw_zvmalloc(u32 sz) +{ + u8 *pbuf; + pbuf = _rtw_vmalloc(sz); + if (pbuf != NULL) + memset(pbuf, 0, sz); + + return pbuf; +} + +inline void _rtw_vmfree(u8 *pbuf, u32 sz) +{ + vfree(pbuf); +} + +void _rtw_init_queue23a(struct rtw_queue *pqueue) +{ + INIT_LIST_HEAD(&pqueue->queue); + spin_lock_init(&pqueue->lock); +} + +u32 _rtw_queue_empty23a(struct rtw_queue *pqueue) +{ + if (list_empty(&pqueue->queue)) + return true; + else + return false; +} + +u64 rtw_modular6423a(u64 x, u64 y) +{ + return do_div(x, y); +} + +u64 rtw_division6423a(u64 x, u64 y) +{ + do_div(x, y); + return x; +} + +/* rtw_cbuf_full23a - test if cbuf is full + * @cbuf: pointer of struct rtw_cbuf + * + * Returns: true if cbuf is full + */ +inline bool rtw_cbuf_full23a(struct rtw_cbuf *cbuf) +{ + return (cbuf->write == cbuf->read-1) ? true : false; +} + +/* rtw_cbuf_empty23a - test if cbuf is empty + * @cbuf: pointer of struct rtw_cbuf + * + * Returns: true if cbuf is empty + */ +inline bool rtw_cbuf_empty23a(struct rtw_cbuf *cbuf) +{ + return (cbuf->write == cbuf->read) ? true : false; +} + +/** + * rtw_cbuf_push23a - push a pointer into cbuf + * @cbuf: pointer of struct rtw_cbuf + * @buf: pointer to push in + * + * Lock free operation, be careful of the use scheme + * Returns: true push success + */ +bool rtw_cbuf_push23a(struct rtw_cbuf *cbuf, void *buf) +{ + if (rtw_cbuf_full23a(cbuf)) + return _FAIL; + + if (0) + DBG_8723A("%s on %u\n", __func__, cbuf->write); + cbuf->bufs[cbuf->write] = buf; + cbuf->write = (cbuf->write+1)%cbuf->size; + + return _SUCCESS; +} + +/** + * rtw_cbuf_pop23a - pop a pointer from cbuf + * @cbuf: pointer of struct rtw_cbuf + * + * Lock free operation, be careful of the use scheme + * Returns: pointer popped out + */ +void *rtw_cbuf_pop23a(struct rtw_cbuf *cbuf) +{ + void *buf; + if (rtw_cbuf_empty23a(cbuf)) + return NULL; + + if (0) + DBG_8723A("%s on %u\n", __func__, cbuf->read); + buf = cbuf->bufs[cbuf->read]; + cbuf->read = (cbuf->read+1)%cbuf->size; + + return buf; +} + +/** + * rtw_cbuf_alloc23a - allocte a rtw_cbuf with given size and do initialization + * @size: size of pointer + * + * Returns: pointer of srtuct rtw_cbuf, NULL for allocation failure + */ +struct rtw_cbuf *rtw_cbuf_alloc23a(u32 size) +{ + struct rtw_cbuf *cbuf; + + cbuf = kmalloc(sizeof(*cbuf) + sizeof(void *)*size, GFP_KERNEL); + + if (cbuf) { + cbuf->write = 0; + cbuf->read = 0; + cbuf->size = size; + } + + return cbuf; +} + +/** + * rtw_cbuf_free - free the given rtw_cbuf + * @cbuf: pointer of struct rtw_cbuf to free + */ +void rtw_cbuf_free(struct rtw_cbuf *cbuf) +{ + kfree(cbuf); +} |