1*4882a593Smuzhiyun /******************************************************************************
2*4882a593Smuzhiyun *
3*4882a593Smuzhiyun * Copyright(c) 2019 - 2020 Realtek Corporation.
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * This program is free software; you can redistribute it and/or modify it
6*4882a593Smuzhiyun * under the terms of version 2 of the GNU General Public License as
7*4882a593Smuzhiyun * published by the Free Software Foundation.
8*4882a593Smuzhiyun *
9*4882a593Smuzhiyun * This program is distributed in the hope that it will be useful, but WITHOUT
10*4882a593Smuzhiyun * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11*4882a593Smuzhiyun * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12*4882a593Smuzhiyun * more details.
13*4882a593Smuzhiyun *
14*4882a593Smuzhiyun *****************************************************************************/
15*4882a593Smuzhiyun #ifndef _PLTFM_OPS_LINUX_H_
16*4882a593Smuzhiyun #define _PLTFM_OPS_LINUX_H_
17*4882a593Smuzhiyun #include "drv_types.h"
18*4882a593Smuzhiyun
19*4882a593Smuzhiyun #ifdef CONFIG_PLATFORM_AML_S905
20*4882a593Smuzhiyun extern struct device * g_pcie_reserved_mem_dev;
21*4882a593Smuzhiyun #endif
22*4882a593Smuzhiyun
_os_strpbrk(const char * s,const char * ct)23*4882a593Smuzhiyun static inline char *_os_strpbrk(const char *s, const char *ct)
24*4882a593Smuzhiyun {
25*4882a593Smuzhiyun return strpbrk(s, ct);
26*4882a593Smuzhiyun }
27*4882a593Smuzhiyun
_os_strsep(char ** s,const char * ct)28*4882a593Smuzhiyun static inline char *_os_strsep(char **s, const char *ct)
29*4882a593Smuzhiyun {
30*4882a593Smuzhiyun return strsep(s, ct);
31*4882a593Smuzhiyun }
32*4882a593Smuzhiyun
33*4882a593Smuzhiyun #if 1
34*4882a593Smuzhiyun #define _os_sscanf(buf, fmt, ...) sscanf(buf, fmt, ##__VA_ARGS__)
35*4882a593Smuzhiyun #else
_os_sscanf(const char * buf,const char * fmt,...)36*4882a593Smuzhiyun static inline int _os_sscanf(const char *buf, const char *fmt, ...)
37*4882a593Smuzhiyun {
38*4882a593Smuzhiyun va_list args;
39*4882a593Smuzhiyun int i;
40*4882a593Smuzhiyun
41*4882a593Smuzhiyun va_start(args, fmt);
42*4882a593Smuzhiyun i = vsscanf(buf, fmt, args);
43*4882a593Smuzhiyun va_end(args);
44*4882a593Smuzhiyun return i;
45*4882a593Smuzhiyun }
46*4882a593Smuzhiyun #endif
_os_strcmp(const char * s1,const char * s2)47*4882a593Smuzhiyun static inline int _os_strcmp(const char *s1, const char *s2)
48*4882a593Smuzhiyun {
49*4882a593Smuzhiyun return strcmp(s1, s2);
50*4882a593Smuzhiyun }
_os_strncmp(const char * s1,const char * s2,size_t n)51*4882a593Smuzhiyun static inline int _os_strncmp(const char *s1, const char *s2, size_t n)
52*4882a593Smuzhiyun {
53*4882a593Smuzhiyun return strncmp(s1, s2, n);
54*4882a593Smuzhiyun }
_os_strcpy(char * dest,const char * src)55*4882a593Smuzhiyun static inline char *_os_strcpy(char *dest, const char *src)
56*4882a593Smuzhiyun {
57*4882a593Smuzhiyun return strcpy(dest, src);
58*4882a593Smuzhiyun }
_os_strncpy(char * dest,const char * src,size_t n)59*4882a593Smuzhiyun static inline char *_os_strncpy(char *dest, const char *src, size_t n)
60*4882a593Smuzhiyun {
61*4882a593Smuzhiyun return strncpy(dest, src, n);
62*4882a593Smuzhiyun }
63*4882a593Smuzhiyun #if 1
64*4882a593Smuzhiyun #define _os_strchr(s, c) strchr(s, c)
65*4882a593Smuzhiyun #else
_os_strchr(const char * s,int c)66*4882a593Smuzhiyun static inline char*_os_strchr(const char *s, int c)
67*4882a593Smuzhiyun {
68*4882a593Smuzhiyun return strchr(s, c);
69*4882a593Smuzhiyun }
70*4882a593Smuzhiyun #endif
71*4882a593Smuzhiyun
72*4882a593Smuzhiyun #if 1
73*4882a593Smuzhiyun #define _os_snprintf(s, sz, fmt, ...) snprintf(s, sz, fmt, ##__VA_ARGS__)
74*4882a593Smuzhiyun #define _os_vsnprintf(str, size, fmt, args) vsnprintf(str, size, fmt, args)
75*4882a593Smuzhiyun #else
_os_snprintf(char * str,size_t size,const char * fmt,...)76*4882a593Smuzhiyun static int _os_snprintf(char *str, size_t size, const char *fmt, ...)
77*4882a593Smuzhiyun {
78*4882a593Smuzhiyun va_list args;
79*4882a593Smuzhiyun int ret;
80*4882a593Smuzhiyun
81*4882a593Smuzhiyun va_start(args, fmt);
82*4882a593Smuzhiyun ret = vsnprintf(str, size, fmt, args);
83*4882a593Smuzhiyun va_end(args);
84*4882a593Smuzhiyun if (size > 0)
85*4882a593Smuzhiyun str[size - 1] = '\0';
86*4882a593Smuzhiyun return ret;
87*4882a593Smuzhiyun }
88*4882a593Smuzhiyun #endif
89*4882a593Smuzhiyun
_os_strlen(u8 * buf)90*4882a593Smuzhiyun static inline u32 _os_strlen(u8 *buf)
91*4882a593Smuzhiyun {
92*4882a593Smuzhiyun return strlen(buf);
93*4882a593Smuzhiyun }
_os_delay_ms(void * d,u32 ms)94*4882a593Smuzhiyun static inline void _os_delay_ms(void *d, u32 ms)
95*4882a593Smuzhiyun {
96*4882a593Smuzhiyun rtw_mdelay_os(ms);
97*4882a593Smuzhiyun }
_os_delay_us(void * d,u32 us)98*4882a593Smuzhiyun static inline void _os_delay_us(void *d, u32 us)
99*4882a593Smuzhiyun {
100*4882a593Smuzhiyun rtw_udelay_os(us);
101*4882a593Smuzhiyun }
_os_sleep_ms(void * d,u32 ms)102*4882a593Smuzhiyun static inline void _os_sleep_ms(void *d, u32 ms)
103*4882a593Smuzhiyun {
104*4882a593Smuzhiyun rtw_msleep_os(ms);
105*4882a593Smuzhiyun }
_os_sleep_us(void * d,u32 us)106*4882a593Smuzhiyun static inline void _os_sleep_us(void *d, u32 us)
107*4882a593Smuzhiyun {
108*4882a593Smuzhiyun rtw_usleep_os(us);
109*4882a593Smuzhiyun }
_os_get_cur_time_us(void)110*4882a593Smuzhiyun static inline u32 _os_get_cur_time_us(void)
111*4882a593Smuzhiyun {
112*4882a593Smuzhiyun return rtw_systime_to_us(rtw_get_current_time());
113*4882a593Smuzhiyun }
_os_get_cur_time_ms(void)114*4882a593Smuzhiyun static inline u32 _os_get_cur_time_ms(void)
115*4882a593Smuzhiyun {
116*4882a593Smuzhiyun return rtw_systime_to_ms(rtw_get_current_time());
117*4882a593Smuzhiyun }
118*4882a593Smuzhiyun
_os_modular64(u64 x,u64 y)119*4882a593Smuzhiyun static inline u64 _os_modular64(u64 x, u64 y)
120*4882a593Smuzhiyun {
121*4882a593Smuzhiyun /*return do_div(x, y);*/
122*4882a593Smuzhiyun return rtw_modular64(x, y);
123*4882a593Smuzhiyun }
_os_division64(u64 x,u64 y)124*4882a593Smuzhiyun static inline u64 _os_division64(u64 x, u64 y)
125*4882a593Smuzhiyun {
126*4882a593Smuzhiyun /*return do_div(x, y);*/
127*4882a593Smuzhiyun return rtw_division64(x, y);
128*4882a593Smuzhiyun }
_os_div_round_up(u32 x,u32 y)129*4882a593Smuzhiyun static inline u32 _os_div_round_up(u32 x, u32 y)
130*4882a593Smuzhiyun {
131*4882a593Smuzhiyun return RTW_DIV_ROUND_UP(x, y);
132*4882a593Smuzhiyun }
133*4882a593Smuzhiyun
134*4882a593Smuzhiyun #ifdef CONFIG_PCI_HCI
_os_cache_inv(void * d,_dma * bus_addr_l,_dma * bus_addr_h,u32 buf_sz,u8 direction)135*4882a593Smuzhiyun static inline void _os_cache_inv(void *d, _dma *bus_addr_l,
136*4882a593Smuzhiyun _dma *bus_addr_h, u32 buf_sz, u8 direction)
137*4882a593Smuzhiyun {
138*4882a593Smuzhiyun struct dvobj_priv *pobj = (struct dvobj_priv *)d;
139*4882a593Smuzhiyun PPCI_DATA pci_data = dvobj_to_pci(pobj);
140*4882a593Smuzhiyun struct pci_dev *pdev = pci_data->ppcidev;
141*4882a593Smuzhiyun
142*4882a593Smuzhiyun pci_cache_inv(pdev, bus_addr_l, buf_sz, direction);
143*4882a593Smuzhiyun }
144*4882a593Smuzhiyun
_os_cache_wback(void * d,_dma * bus_addr_l,_dma * bus_addr_h,u32 buf_sz,u8 direction)145*4882a593Smuzhiyun static inline void _os_cache_wback(void *d, _dma *bus_addr_l,
146*4882a593Smuzhiyun _dma *bus_addr_h, u32 buf_sz, u8 direction)
147*4882a593Smuzhiyun {
148*4882a593Smuzhiyun struct dvobj_priv *pobj = (struct dvobj_priv *)d;
149*4882a593Smuzhiyun PPCI_DATA pci_data = dvobj_to_pci(pobj);
150*4882a593Smuzhiyun struct pci_dev *pdev = pci_data->ppcidev;
151*4882a593Smuzhiyun
152*4882a593Smuzhiyun pci_cache_wback(pdev, bus_addr_l, buf_sz, direction);
153*4882a593Smuzhiyun }
154*4882a593Smuzhiyun
_os_dma_pool_create(void * d,char * name,u32 wd_page_sz)155*4882a593Smuzhiyun static inline void *_os_dma_pool_create(void *d, char *name, u32 wd_page_sz)
156*4882a593Smuzhiyun {
157*4882a593Smuzhiyun struct dvobj_priv *dvobj = (struct dvobj_priv *)d;
158*4882a593Smuzhiyun
159*4882a593Smuzhiyun return pci_create_dma_pool(dvobj->pci_data.ppcidev, name, wd_page_sz);
160*4882a593Smuzhiyun }
161*4882a593Smuzhiyun
_os_dma_pool_destory(void * d,void * pool)162*4882a593Smuzhiyun static inline void _os_dma_pool_destory(void *d, void *pool)
163*4882a593Smuzhiyun {
164*4882a593Smuzhiyun struct dvobj_priv *dvobj = (struct dvobj_priv *)d;
165*4882a593Smuzhiyun
166*4882a593Smuzhiyun pci_destory_dma_pool(dvobj->pci_data.ppcidev, (struct dma_pool *)pool);
167*4882a593Smuzhiyun }
168*4882a593Smuzhiyun
169*4882a593Smuzhiyun /* txbd, rxbd, wd */
_os_shmem_alloc(void * d,void * pool,_dma * bus_addr_l,_dma * bus_addr_h,u32 buf_sz,u8 cache,u8 direction,void ** os_rsvd)170*4882a593Smuzhiyun static inline void *_os_shmem_alloc(void *d, void *pool, _dma *bus_addr_l,
171*4882a593Smuzhiyun _dma *bus_addr_h, u32 buf_sz,
172*4882a593Smuzhiyun u8 cache, u8 direction, void **os_rsvd)
173*4882a593Smuzhiyun {
174*4882a593Smuzhiyun struct dvobj_priv *pobj = (struct dvobj_priv *)d;
175*4882a593Smuzhiyun PPCI_DATA pci_data = dvobj_to_pci(pobj);
176*4882a593Smuzhiyun struct pci_dev *pdev = pci_data->ppcidev;
177*4882a593Smuzhiyun
178*4882a593Smuzhiyun if (cache == DMA_ADDR)
179*4882a593Smuzhiyun return pci_alloc_noncache_mem(pdev, bus_addr_l, buf_sz);
180*4882a593Smuzhiyun else if (cache == POOL_ADDR) {
181*4882a593Smuzhiyun return pci_zalloc_pool_mem(pdev, (struct dma_pool *)pool, bus_addr_l);
182*4882a593Smuzhiyun } else
183*4882a593Smuzhiyun return pci_alloc_cache_mem(pdev, bus_addr_l, buf_sz, direction);
184*4882a593Smuzhiyun
185*4882a593Smuzhiyun return NULL;
186*4882a593Smuzhiyun }
187*4882a593Smuzhiyun
_os_shmem_free(void * d,void * pool,u8 * vir_addr,_dma * bus_addr_l,_dma * bus_addr_h,u32 buf_sz,u8 cache,u8 direction,void * os_rsvd)188*4882a593Smuzhiyun static inline void _os_shmem_free(void *d, void *pool, u8 *vir_addr, _dma *bus_addr_l,
189*4882a593Smuzhiyun _dma *bus_addr_h, u32 buf_sz,
190*4882a593Smuzhiyun u8 cache, u8 direction, void *os_rsvd)
191*4882a593Smuzhiyun {
192*4882a593Smuzhiyun struct dvobj_priv *pobj = (struct dvobj_priv *)d;
193*4882a593Smuzhiyun PPCI_DATA pci_data = dvobj_to_pci(pobj);
194*4882a593Smuzhiyun struct pci_dev *pdev = pci_data->ppcidev;
195*4882a593Smuzhiyun
196*4882a593Smuzhiyun if (cache == DMA_ADDR)
197*4882a593Smuzhiyun return pci_free_noncache_mem(pdev, vir_addr, bus_addr_l, buf_sz);
198*4882a593Smuzhiyun else if (cache == POOL_ADDR)
199*4882a593Smuzhiyun return pci_free_pool_mem(pdev, (struct dma_pool *)pool, vir_addr, bus_addr_l);
200*4882a593Smuzhiyun else
201*4882a593Smuzhiyun return pci_free_cache_mem(pdev, vir_addr, bus_addr_l, buf_sz, direction);
202*4882a593Smuzhiyun }
203*4882a593Smuzhiyun #endif /*CONFIG_PCI_HCI*/
204*4882a593Smuzhiyun
_os_pkt_buf_unmap_rx(void * d,_dma bus_addr_l,_dma bus_addr_h,u32 buf_sz)205*4882a593Smuzhiyun static inline void *_os_pkt_buf_unmap_rx(void *d, _dma bus_addr_l, _dma bus_addr_h, u32 buf_sz)
206*4882a593Smuzhiyun {
207*4882a593Smuzhiyun struct dvobj_priv *pobj = (struct dvobj_priv *)d;
208*4882a593Smuzhiyun #ifdef CONFIG_PCI_HCI
209*4882a593Smuzhiyun PPCI_DATA pci_data = dvobj_to_pci(pobj);
210*4882a593Smuzhiyun struct pci_dev *pdev = pci_data->ppcidev;
211*4882a593Smuzhiyun #endif /*CONFIG_PCI_HCI*/
212*4882a593Smuzhiyun
213*4882a593Smuzhiyun #ifdef CONFIG_PCI_HCI
214*4882a593Smuzhiyun #ifdef CONFIG_PLATFORM_AML_S905
215*4882a593Smuzhiyun if (g_pcie_reserved_mem_dev)
216*4882a593Smuzhiyun pdev->dev.dma_mask = NULL;
217*4882a593Smuzhiyun #endif
218*4882a593Smuzhiyun pci_unmap_single(pdev, bus_addr_l, buf_sz, PCI_DMA_FROMDEVICE);
219*4882a593Smuzhiyun #endif
220*4882a593Smuzhiyun
221*4882a593Smuzhiyun #ifdef RTW_CORE_RECORD
222*4882a593Smuzhiyun phl_add_record(d, REC_RX_UNMAP, bus_addr_l, buf_sz);
223*4882a593Smuzhiyun #endif
224*4882a593Smuzhiyun return NULL;
225*4882a593Smuzhiyun }
226*4882a593Smuzhiyun
_os_pkt_buf_map_rx(void * d,_dma * bus_addr_l,_dma * bus_addr_h,u32 buf_sz,void * os_priv)227*4882a593Smuzhiyun static inline void *_os_pkt_buf_map_rx(void *d, _dma *bus_addr_l, _dma *bus_addr_h,
228*4882a593Smuzhiyun u32 buf_sz, void *os_priv)
229*4882a593Smuzhiyun {
230*4882a593Smuzhiyun struct dvobj_priv *pobj = (struct dvobj_priv *)d;
231*4882a593Smuzhiyun #ifdef CONFIG_PCI_HCI
232*4882a593Smuzhiyun PPCI_DATA pci_data = dvobj_to_pci(pobj);
233*4882a593Smuzhiyun struct pci_dev *pdev = pci_data->ppcidev;
234*4882a593Smuzhiyun struct sk_buff *skb = os_priv;
235*4882a593Smuzhiyun
236*4882a593Smuzhiyun #ifdef CONFIG_PLATFORM_AML_S905
237*4882a593Smuzhiyun if (g_pcie_reserved_mem_dev)
238*4882a593Smuzhiyun pdev->dev.dma_mask = NULL;
239*4882a593Smuzhiyun #endif
240*4882a593Smuzhiyun *bus_addr_l = pci_map_single(pdev, skb->data, buf_sz, PCI_DMA_FROMDEVICE);
241*4882a593Smuzhiyun /* *bus_addr_h = NULL;*/
242*4882a593Smuzhiyun #endif /*CONFIG_PCI_HCI*/
243*4882a593Smuzhiyun
244*4882a593Smuzhiyun return NULL;
245*4882a593Smuzhiyun }
246*4882a593Smuzhiyun
247*4882a593Smuzhiyun #ifdef CONFIG_PCI_HCI
_os_alloc_noncashe_skb(struct pci_dev * pdev,u32 buf_sz)248*4882a593Smuzhiyun static inline struct sk_buff *_os_alloc_noncashe_skb(struct pci_dev *pdev, u32 buf_sz)
249*4882a593Smuzhiyun {
250*4882a593Smuzhiyun struct sk_buff *skb = NULL;
251*4882a593Smuzhiyun unsigned char *data = NULL;
252*4882a593Smuzhiyun
253*4882a593Smuzhiyun skb = rtw_zmalloc(sizeof(struct sk_buff));
254*4882a593Smuzhiyun if (!skb)
255*4882a593Smuzhiyun goto out;
256*4882a593Smuzhiyun
257*4882a593Smuzhiyun data = pci_alloc_noncache_mem(pdev, (dma_addr_t *)&skb->cb, buf_sz);
258*4882a593Smuzhiyun
259*4882a593Smuzhiyun if (!data)
260*4882a593Smuzhiyun goto nodata;
261*4882a593Smuzhiyun
262*4882a593Smuzhiyun skb->head = data;
263*4882a593Smuzhiyun skb->data = data;
264*4882a593Smuzhiyun skb_reset_tail_pointer(skb);
265*4882a593Smuzhiyun skb->end = skb->tail + buf_sz;
266*4882a593Smuzhiyun skb->len = buf_sz;
267*4882a593Smuzhiyun out:
268*4882a593Smuzhiyun return skb;
269*4882a593Smuzhiyun nodata:
270*4882a593Smuzhiyun _rtw_mfree(skb, sizeof(struct sk_buff));
271*4882a593Smuzhiyun skb = NULL;
272*4882a593Smuzhiyun goto out;
273*4882a593Smuzhiyun }
274*4882a593Smuzhiyun
_os_free_noncashe_skb(struct pci_dev * pdev,struct sk_buff * skb,u32 buf_sz)275*4882a593Smuzhiyun static inline void _os_free_noncashe_skb(struct pci_dev *pdev,
276*4882a593Smuzhiyun struct sk_buff *skb, u32 buf_sz)
277*4882a593Smuzhiyun {
278*4882a593Smuzhiyun /* skb buffer */
279*4882a593Smuzhiyun pci_free_noncache_mem(pdev, skb->data, (dma_addr_t *)skb->cb, buf_sz);
280*4882a593Smuzhiyun
281*4882a593Smuzhiyun /* skb */
282*4882a593Smuzhiyun rtw_mfree(skb, sizeof(struct sk_buff));
283*4882a593Smuzhiyun }
284*4882a593Smuzhiyun #endif /*CONFIG_PCI_HCI*/
285*4882a593Smuzhiyun
286*4882a593Smuzhiyun /* rxbuf */
287*4882a593Smuzhiyun #define PHL_RX_HEADROOM 0
_os_pkt_buf_alloc_rx(void * d,_dma * bus_addr_l,_dma * bus_addr_h,u32 buf_sz,u8 cache,void ** os_priv)288*4882a593Smuzhiyun static inline void *_os_pkt_buf_alloc_rx(void *d, _dma *bus_addr_l,
289*4882a593Smuzhiyun _dma *bus_addr_h, u32 buf_sz, u8 cache, void **os_priv)
290*4882a593Smuzhiyun {
291*4882a593Smuzhiyun struct dvobj_priv *pobj = (struct dvobj_priv *)d;
292*4882a593Smuzhiyun #ifdef CONFIG_PCI_HCI
293*4882a593Smuzhiyun PPCI_DATA pci_data = dvobj_to_pci(pobj);
294*4882a593Smuzhiyun struct pci_dev *pdev = pci_data->ppcidev;
295*4882a593Smuzhiyun #endif /*CONFIG_PCI_HCI*/
296*4882a593Smuzhiyun struct sk_buff *skb = NULL;
297*4882a593Smuzhiyun u32 rxbuf_size = buf_sz + PHL_RX_HEADROOM;
298*4882a593Smuzhiyun
299*4882a593Smuzhiyun if (cache)
300*4882a593Smuzhiyun skb = rtw_skb_alloc(rxbuf_size);
301*4882a593Smuzhiyun #ifdef CONFIG_PCI_HCI
302*4882a593Smuzhiyun else
303*4882a593Smuzhiyun skb = _os_alloc_noncashe_skb(pdev, rxbuf_size);
304*4882a593Smuzhiyun #endif
305*4882a593Smuzhiyun if (!skb)
306*4882a593Smuzhiyun return NULL;
307*4882a593Smuzhiyun
308*4882a593Smuzhiyun //skb_pull(skb, PHL_RX_HEADROOM);
309*4882a593Smuzhiyun #ifdef CONFIG_PCI_HCI
310*4882a593Smuzhiyun #ifdef CONFIG_PLATFORM_AML_S905
311*4882a593Smuzhiyun if (g_pcie_reserved_mem_dev)
312*4882a593Smuzhiyun pdev->dev.dma_mask = NULL;
313*4882a593Smuzhiyun #endif
314*4882a593Smuzhiyun if (cache)
315*4882a593Smuzhiyun *bus_addr_l = pci_map_single(pdev, skb->data,
316*4882a593Smuzhiyun rxbuf_size, PCI_DMA_FROMDEVICE);
317*4882a593Smuzhiyun else
318*4882a593Smuzhiyun *bus_addr_l = *(dma_addr_t *)skb->cb;
319*4882a593Smuzhiyun /* *bus_addr_h = NULL;*/
320*4882a593Smuzhiyun #endif /*CONFIG_PCI_HCI*/
321*4882a593Smuzhiyun *os_priv = skb;
322*4882a593Smuzhiyun
323*4882a593Smuzhiyun return skb->data;
324*4882a593Smuzhiyun }
325*4882a593Smuzhiyun
_os_pkt_buf_free_rx(void * d,u8 * vir_addr,_dma bus_addr_l,_dma bus_addr_h,u32 buf_sz,u8 cache,void * os_priv)326*4882a593Smuzhiyun static inline void _os_pkt_buf_free_rx(void *d, u8 *vir_addr, _dma bus_addr_l,
327*4882a593Smuzhiyun _dma bus_addr_h, u32 buf_sz, u8 cache, void *os_priv)
328*4882a593Smuzhiyun {
329*4882a593Smuzhiyun struct dvobj_priv *pobj = (struct dvobj_priv *)d;
330*4882a593Smuzhiyun #ifdef CONFIG_PCI_HCI
331*4882a593Smuzhiyun PPCI_DATA pci_data = dvobj_to_pci(pobj);
332*4882a593Smuzhiyun struct pci_dev *pdev = pci_data->ppcidev;
333*4882a593Smuzhiyun #endif /*CONFIG_PCI_HCI*/
334*4882a593Smuzhiyun struct sk_buff *skb = (struct sk_buff *)os_priv;
335*4882a593Smuzhiyun
336*4882a593Smuzhiyun #ifdef CONFIG_PCI_HCI
337*4882a593Smuzhiyun #ifdef CONFIG_PLATFORM_AML_S905
338*4882a593Smuzhiyun if (g_pcie_reserved_mem_dev)
339*4882a593Smuzhiyun pdev->dev.dma_mask = NULL;
340*4882a593Smuzhiyun #endif
341*4882a593Smuzhiyun if (cache)
342*4882a593Smuzhiyun pci_unmap_single(pdev, bus_addr_l, buf_sz, PCI_DMA_FROMDEVICE);
343*4882a593Smuzhiyun
344*4882a593Smuzhiyun if (!cache)
345*4882a593Smuzhiyun _os_free_noncashe_skb(pdev, skb, buf_sz);
346*4882a593Smuzhiyun else
347*4882a593Smuzhiyun #endif /*CONFIG_PCI_HCI*/
348*4882a593Smuzhiyun rtw_skb_free(skb);
349*4882a593Smuzhiyun }
350*4882a593Smuzhiyun
351*4882a593Smuzhiyun /* phl pre-alloc network layer buffer */
_os_alloc_netbuf(void * d,u32 buf_sz,void ** os_priv)352*4882a593Smuzhiyun static inline void * _os_alloc_netbuf(void *d, u32 buf_sz, void **os_priv)
353*4882a593Smuzhiyun {
354*4882a593Smuzhiyun return _os_pkt_buf_alloc_rx(d, NULL, NULL, buf_sz, true, os_priv);
355*4882a593Smuzhiyun }
356*4882a593Smuzhiyun
357*4882a593Smuzhiyun /* Free netbuf for error case. (ex. drop rx-reorder packet) */
_os_free_netbuf(void * d,u8 * vir_addr,u32 buf_sz,void * os_priv)358*4882a593Smuzhiyun static inline void _os_free_netbuf(void *d, u8 *vir_addr, u32 buf_sz, void *os_priv)
359*4882a593Smuzhiyun {
360*4882a593Smuzhiyun _os_pkt_buf_free_rx(d, vir_addr, 0,0, buf_sz, true, os_priv);
361*4882a593Smuzhiyun }
362*4882a593Smuzhiyun
363*4882a593Smuzhiyun
364*4882a593Smuzhiyun /*virtually contiguous memory*/
_os_mem_alloc(void * d,u32 buf_sz)365*4882a593Smuzhiyun static inline void *_os_mem_alloc(void *d, u32 buf_sz)
366*4882a593Smuzhiyun {
367*4882a593Smuzhiyun #ifdef DBG_PHL_MEM_ALLOC
368*4882a593Smuzhiyun struct dvobj_priv *obj = (struct dvobj_priv *)d;
369*4882a593Smuzhiyun
370*4882a593Smuzhiyun ATOMIC_ADD_RETURN(&obj->phl_mem, buf_sz);
371*4882a593Smuzhiyun #endif
372*4882a593Smuzhiyun
373*4882a593Smuzhiyun #ifdef CONFIG_PHL_USE_KMEM_ALLOC
374*4882a593Smuzhiyun return rtw_zmalloc(buf_sz);
375*4882a593Smuzhiyun #else
376*4882a593Smuzhiyun if (in_atomic()) {
377*4882a593Smuzhiyun RTW_ERR("Call rtw_zvmalloc in atomic @%s:%u\n",
378*4882a593Smuzhiyun __FUNCTION__, __LINE__);
379*4882a593Smuzhiyun dump_stack();
380*4882a593Smuzhiyun }
381*4882a593Smuzhiyun return rtw_zvmalloc(buf_sz);
382*4882a593Smuzhiyun #endif
383*4882a593Smuzhiyun }
384*4882a593Smuzhiyun
385*4882a593Smuzhiyun /*virtually contiguous memory*/
_os_mem_free(void * d,void * buf,u32 buf_sz)386*4882a593Smuzhiyun static inline void _os_mem_free(void *d, void *buf, u32 buf_sz)
387*4882a593Smuzhiyun {
388*4882a593Smuzhiyun #ifdef DBG_PHL_MEM_ALLOC
389*4882a593Smuzhiyun struct dvobj_priv *obj = (struct dvobj_priv *)d;
390*4882a593Smuzhiyun
391*4882a593Smuzhiyun ATOMIC_SUB(&obj->phl_mem, buf_sz);
392*4882a593Smuzhiyun #endif
393*4882a593Smuzhiyun
394*4882a593Smuzhiyun #ifdef CONFIG_PHL_USE_KMEM_ALLOC
395*4882a593Smuzhiyun rtw_mfree(buf, buf_sz);
396*4882a593Smuzhiyun #else
397*4882a593Smuzhiyun if (in_atomic()) {
398*4882a593Smuzhiyun RTW_ERR("Call rtw_vmfree in atomic @%s:%u\n",
399*4882a593Smuzhiyun __FUNCTION__, __LINE__);
400*4882a593Smuzhiyun dump_stack();
401*4882a593Smuzhiyun }
402*4882a593Smuzhiyun rtw_vmfree(buf, buf_sz);
403*4882a593Smuzhiyun #endif
404*4882a593Smuzhiyun }
405*4882a593Smuzhiyun
406*4882a593Smuzhiyun /*physically contiguous memory if the buffer will be accessed by a DMA device*/
_os_kmem_alloc(void * d,u32 buf_sz)407*4882a593Smuzhiyun static inline void *_os_kmem_alloc(void *d, u32 buf_sz)
408*4882a593Smuzhiyun {
409*4882a593Smuzhiyun #ifdef DBG_PHL_MEM_ALLOC
410*4882a593Smuzhiyun struct dvobj_priv *obj = (struct dvobj_priv *)d;
411*4882a593Smuzhiyun ATOMIC_ADD_RETURN(&obj->phl_mem, buf_sz);
412*4882a593Smuzhiyun #endif
413*4882a593Smuzhiyun return rtw_zmalloc(buf_sz);
414*4882a593Smuzhiyun }
415*4882a593Smuzhiyun
416*4882a593Smuzhiyun /*physically contiguous memory if the buffer will be accessed by a DMA device*/
_os_kmem_free(void * d,void * buf,u32 buf_sz)417*4882a593Smuzhiyun static inline void _os_kmem_free(void *d, void *buf, u32 buf_sz)
418*4882a593Smuzhiyun {
419*4882a593Smuzhiyun #ifdef DBG_PHL_MEM_ALLOC
420*4882a593Smuzhiyun struct dvobj_priv *obj = (struct dvobj_priv *)d;
421*4882a593Smuzhiyun ATOMIC_SUB(&obj->phl_mem, buf_sz);
422*4882a593Smuzhiyun #endif
423*4882a593Smuzhiyun
424*4882a593Smuzhiyun rtw_mfree(buf, buf_sz);
425*4882a593Smuzhiyun }
_os_mem_set(void * d,void * buf,s8 value,u32 size)426*4882a593Smuzhiyun static inline void _os_mem_set(void *d, void *buf, s8 value, u32 size)
427*4882a593Smuzhiyun {
428*4882a593Smuzhiyun _rtw_memset(buf, value, size);
429*4882a593Smuzhiyun }
_os_mem_cpy(void * d,void * dest,void * src,u32 size)430*4882a593Smuzhiyun static inline void _os_mem_cpy(void *d, void *dest, void *src, u32 size)
431*4882a593Smuzhiyun {
432*4882a593Smuzhiyun _rtw_memcpy(dest, src, size);
433*4882a593Smuzhiyun }
434*4882a593Smuzhiyun /*Return Value
435*4882a593Smuzhiyun * <0 :the first byte that does not match in both memory blocks has a lower value in ptr1 than in ptr2 (if evaluated as unsigned char values)
436*4882a593Smuzhiyun * 0 :the contents of both memory blocks are equal
437*4882a593Smuzhiyun * >0 :the first byte that does not match in both memory blocks has a greater value in ptr1 than in ptr2 (if evaluated as unsigned char values)
438*4882a593Smuzhiyun */
_os_mem_cmp(void * d,const void * dest,const void * src,size_t size)439*4882a593Smuzhiyun static inline int _os_mem_cmp(void *d, const void *dest, const void *src, size_t size)
440*4882a593Smuzhiyun {
441*4882a593Smuzhiyun
442*4882a593Smuzhiyun return memcmp(dest, src, size);
443*4882a593Smuzhiyun }
_os_init_timer(void * d,_os_timer * timer,void (* call_back_func)(void * context),void * context,const char * sz_id)444*4882a593Smuzhiyun static inline void _os_init_timer(void *d, _os_timer *timer,
445*4882a593Smuzhiyun void (*call_back_func)(void *context), void *context,
446*4882a593Smuzhiyun const char *sz_id)
447*4882a593Smuzhiyun {
448*4882a593Smuzhiyun _init_timer(timer, call_back_func, context);
449*4882a593Smuzhiyun }
450*4882a593Smuzhiyun
_os_set_timer(void * d,_os_timer * timer,u32 ms_delay)451*4882a593Smuzhiyun static inline void _os_set_timer(void *d, _os_timer *timer, u32 ms_delay)
452*4882a593Smuzhiyun {
453*4882a593Smuzhiyun _set_timer(timer, ms_delay);
454*4882a593Smuzhiyun }
455*4882a593Smuzhiyun
_os_cancel_timer(void * d,_os_timer * timer)456*4882a593Smuzhiyun static inline void _os_cancel_timer(void *d, _os_timer *timer)
457*4882a593Smuzhiyun {
458*4882a593Smuzhiyun _cancel_timer_ex(timer);
459*4882a593Smuzhiyun }
460*4882a593Smuzhiyun
_os_cancel_timer_async(void * d,_os_timer * timer)461*4882a593Smuzhiyun static inline void _os_cancel_timer_async(void *d, _os_timer *timer)
462*4882a593Smuzhiyun {
463*4882a593Smuzhiyun _cancel_timer_async(timer);
464*4882a593Smuzhiyun }
465*4882a593Smuzhiyun
_os_release_timer(void * d,_os_timer * timer)466*4882a593Smuzhiyun static inline void _os_release_timer(void *d, _os_timer *timer)
467*4882a593Smuzhiyun {
468*4882a593Smuzhiyun
469*4882a593Smuzhiyun }
_os_mutex_init(void * d,_os_mutex * mutex)470*4882a593Smuzhiyun static inline void _os_mutex_init(void *d, _os_mutex *mutex)
471*4882a593Smuzhiyun {
472*4882a593Smuzhiyun _rtw_mutex_init(mutex);
473*4882a593Smuzhiyun }
474*4882a593Smuzhiyun
_os_mutex_deinit(void * d,_os_mutex * mutex)475*4882a593Smuzhiyun static inline void _os_mutex_deinit(void *d, _os_mutex *mutex)
476*4882a593Smuzhiyun {
477*4882a593Smuzhiyun _rtw_mutex_free(mutex);
478*4882a593Smuzhiyun }
479*4882a593Smuzhiyun
_os_mutex_lock(void * d,_os_mutex * mutex)480*4882a593Smuzhiyun static inline void _os_mutex_lock(void *d, _os_mutex *mutex)
481*4882a593Smuzhiyun {
482*4882a593Smuzhiyun _rtw_mutex_lock_interruptible(mutex);
483*4882a593Smuzhiyun }
484*4882a593Smuzhiyun
_os_mutex_unlock(void * d,_os_mutex * mutex)485*4882a593Smuzhiyun static inline void _os_mutex_unlock(void *d, _os_mutex *mutex)
486*4882a593Smuzhiyun {
487*4882a593Smuzhiyun _rtw_mutex_unlock(mutex);
488*4882a593Smuzhiyun }
489*4882a593Smuzhiyun
_os_sema_init(void * d,_os_sema * sema,int int_cnt)490*4882a593Smuzhiyun static inline void _os_sema_init(void *d, _os_sema *sema, int int_cnt)
491*4882a593Smuzhiyun {
492*4882a593Smuzhiyun _rtw_init_sema(sema, int_cnt);
493*4882a593Smuzhiyun }
494*4882a593Smuzhiyun
_os_sema_free(void * d,_os_sema * sema)495*4882a593Smuzhiyun static inline void _os_sema_free(void *d, _os_sema *sema)
496*4882a593Smuzhiyun {
497*4882a593Smuzhiyun _rtw_free_sema(sema);
498*4882a593Smuzhiyun }
499*4882a593Smuzhiyun
_os_sema_up(void * d,_os_sema * sema)500*4882a593Smuzhiyun static inline void _os_sema_up(void *d, _os_sema *sema)
501*4882a593Smuzhiyun {
502*4882a593Smuzhiyun _rtw_up_sema(sema);
503*4882a593Smuzhiyun }
504*4882a593Smuzhiyun
_os_sema_down(void * d,_os_sema * sema)505*4882a593Smuzhiyun static inline u8 _os_sema_down(void *d, _os_sema *sema)
506*4882a593Smuzhiyun {
507*4882a593Smuzhiyun _rtw_down_sema(sema);
508*4882a593Smuzhiyun return 0; //success
509*4882a593Smuzhiyun }
510*4882a593Smuzhiyun
511*4882a593Smuzhiyun /* event */
_os_event_init(void * h,_os_event * event)512*4882a593Smuzhiyun static __inline void _os_event_init(void *h, _os_event *event)
513*4882a593Smuzhiyun {
514*4882a593Smuzhiyun init_completion(event);
515*4882a593Smuzhiyun }
516*4882a593Smuzhiyun
_os_event_free(void * h,_os_event * event)517*4882a593Smuzhiyun static __inline void _os_event_free(void *h, _os_event *event)
518*4882a593Smuzhiyun {
519*4882a593Smuzhiyun }
520*4882a593Smuzhiyun
_os_event_reset(void * h,_os_event * event)521*4882a593Smuzhiyun static __inline void _os_event_reset(void *h, _os_event *event)
522*4882a593Smuzhiyun {
523*4882a593Smuzhiyun /* TODO */
524*4882a593Smuzhiyun }
525*4882a593Smuzhiyun
_os_event_set(void * h,_os_event * event)526*4882a593Smuzhiyun static __inline void _os_event_set(void *h, _os_event *event)
527*4882a593Smuzhiyun {
528*4882a593Smuzhiyun complete(event);
529*4882a593Smuzhiyun }
530*4882a593Smuzhiyun
531*4882a593Smuzhiyun /*
532*4882a593Smuzhiyun * m_sec
533*4882a593Smuzhiyun * == 0 : wait for completion
534*4882a593Smuzhiyun * > 0 : wait for timeout or completion
535*4882a593Smuzhiyun * return value
536*4882a593Smuzhiyun * 0:timeout
537*4882a593Smuzhiyun * otherwise:success
538*4882a593Smuzhiyun */
_os_event_wait(void * h,_os_event * event,u32 m_sec)539*4882a593Smuzhiyun static __inline int _os_event_wait(void *h, _os_event *event, u32 m_sec)
540*4882a593Smuzhiyun {
541*4882a593Smuzhiyun unsigned long expire;
542*4882a593Smuzhiyun
543*4882a593Smuzhiyun if (m_sec) {
544*4882a593Smuzhiyun expire = msecs_to_jiffies(m_sec);
545*4882a593Smuzhiyun
546*4882a593Smuzhiyun if (expire > MAX_SCHEDULE_TIMEOUT)
547*4882a593Smuzhiyun expire = MAX_SCHEDULE_TIMEOUT;
548*4882a593Smuzhiyun }
549*4882a593Smuzhiyun else {
550*4882a593Smuzhiyun expire = MAX_SCHEDULE_TIMEOUT;
551*4882a593Smuzhiyun }
552*4882a593Smuzhiyun
553*4882a593Smuzhiyun expire = wait_for_completion_timeout(event, expire);
554*4882a593Smuzhiyun
555*4882a593Smuzhiyun if (expire == 0)
556*4882a593Smuzhiyun return 0; /* timeout */
557*4882a593Smuzhiyun
558*4882a593Smuzhiyun return jiffies_to_msecs(expire); /* success */
559*4882a593Smuzhiyun }
560*4882a593Smuzhiyun
561*4882a593Smuzhiyun /* spinlock */
562*4882a593Smuzhiyun
_os_spinlock_init(void * d,_os_lock * plock)563*4882a593Smuzhiyun static inline void _os_spinlock_init(void *d, _os_lock *plock)
564*4882a593Smuzhiyun {
565*4882a593Smuzhiyun _rtw_spinlock_init(plock);
566*4882a593Smuzhiyun }
_os_spinlock_free(void * d,_os_lock * plock)567*4882a593Smuzhiyun static inline void _os_spinlock_free(void *d, _os_lock *plock)
568*4882a593Smuzhiyun {
569*4882a593Smuzhiyun _rtw_spinlock_free(plock);
570*4882a593Smuzhiyun }
571*4882a593Smuzhiyun
_os_spinlock(void * d,_os_lock * plock,enum lock_type type,_os_spinlockfg * flags)572*4882a593Smuzhiyun static inline void _os_spinlock(void *d, _os_lock *plock,
573*4882a593Smuzhiyun enum lock_type type, _os_spinlockfg *flags
574*4882a593Smuzhiyun )
575*4882a593Smuzhiyun {
576*4882a593Smuzhiyun if(type == _irq)
577*4882a593Smuzhiyun {
578*4882a593Smuzhiyun if(flags==NULL)
579*4882a593Smuzhiyun RTW_ERR("_os_spinlock_irq: flags=NULL @%s:%u\n",
580*4882a593Smuzhiyun __FUNCTION__, __LINE__);
581*4882a593Smuzhiyun _rtw_spinlock_irq(plock, flags);
582*4882a593Smuzhiyun }
583*4882a593Smuzhiyun else if(type == _bh)
584*4882a593Smuzhiyun _rtw_spinlock_bh(plock);
585*4882a593Smuzhiyun else if(type == _ps)
586*4882a593Smuzhiyun _rtw_spinlock(plock);
587*4882a593Smuzhiyun }
_os_spinunlock(void * d,_os_lock * plock,enum lock_type type,_os_spinlockfg * flags)588*4882a593Smuzhiyun static inline void _os_spinunlock(void *d, _os_lock *plock,
589*4882a593Smuzhiyun enum lock_type type, _os_spinlockfg *flags
590*4882a593Smuzhiyun )
591*4882a593Smuzhiyun {
592*4882a593Smuzhiyun if(type == _irq)
593*4882a593Smuzhiyun {
594*4882a593Smuzhiyun if(flags==NULL)
595*4882a593Smuzhiyun RTW_ERR("_os_spinunlock_irq: flags=NULL @%s:%u\n",
596*4882a593Smuzhiyun __FUNCTION__, __LINE__);
597*4882a593Smuzhiyun _rtw_spinunlock_irq(plock, flags);
598*4882a593Smuzhiyun }
599*4882a593Smuzhiyun else if(type == _bh)
600*4882a593Smuzhiyun _rtw_spinunlock_bh(plock);
601*4882a593Smuzhiyun else if(type == _ps)
602*4882a593Smuzhiyun _rtw_spinunlock(plock);
603*4882a593Smuzhiyun }
_os_test_and_clear_bit(int nr,unsigned long * addr)604*4882a593Smuzhiyun static inline int _os_test_and_clear_bit(int nr, unsigned long *addr)
605*4882a593Smuzhiyun {
606*4882a593Smuzhiyun return rtw_test_and_clear_bit(nr, addr);
607*4882a593Smuzhiyun }
_os_test_and_set_bit(int nr,unsigned long * addr)608*4882a593Smuzhiyun static inline int _os_test_and_set_bit(int nr, unsigned long *addr)
609*4882a593Smuzhiyun {
610*4882a593Smuzhiyun return rtw_test_and_set_bit(nr, addr);
611*4882a593Smuzhiyun }
612*4882a593Smuzhiyun /* Atomic integer operations */
_os_atomic_set(void * d,_os_atomic * v,int i)613*4882a593Smuzhiyun static inline void _os_atomic_set(void *d, _os_atomic *v, int i)
614*4882a593Smuzhiyun {
615*4882a593Smuzhiyun ATOMIC_SET(v, i);
616*4882a593Smuzhiyun }
617*4882a593Smuzhiyun
_os_atomic_read(void * d,_os_atomic * v)618*4882a593Smuzhiyun static inline int _os_atomic_read(void *d, _os_atomic *v)
619*4882a593Smuzhiyun {
620*4882a593Smuzhiyun return ATOMIC_READ(v);
621*4882a593Smuzhiyun }
622*4882a593Smuzhiyun
_os_atomic_add(void * d,_os_atomic * v,int i)623*4882a593Smuzhiyun static inline void _os_atomic_add(void *d, _os_atomic *v, int i)
624*4882a593Smuzhiyun {
625*4882a593Smuzhiyun ATOMIC_ADD(v, i);
626*4882a593Smuzhiyun }
_os_atomic_sub(void * d,_os_atomic * v,int i)627*4882a593Smuzhiyun static inline void _os_atomic_sub(void *d, _os_atomic *v, int i)
628*4882a593Smuzhiyun {
629*4882a593Smuzhiyun ATOMIC_SUB(v, i);
630*4882a593Smuzhiyun }
631*4882a593Smuzhiyun
_os_atomic_inc(void * d,_os_atomic * v)632*4882a593Smuzhiyun static inline void _os_atomic_inc(void *d, _os_atomic *v)
633*4882a593Smuzhiyun {
634*4882a593Smuzhiyun ATOMIC_INC(v);
635*4882a593Smuzhiyun }
636*4882a593Smuzhiyun
_os_atomic_dec(void * d,_os_atomic * v)637*4882a593Smuzhiyun static inline void _os_atomic_dec(void *d, _os_atomic *v)
638*4882a593Smuzhiyun {
639*4882a593Smuzhiyun ATOMIC_DEC(v);
640*4882a593Smuzhiyun }
641*4882a593Smuzhiyun
_os_atomic_add_return(void * d,_os_atomic * v,int i)642*4882a593Smuzhiyun static inline int _os_atomic_add_return(void *d, _os_atomic *v, int i)
643*4882a593Smuzhiyun {
644*4882a593Smuzhiyun return ATOMIC_ADD_RETURN(v, i);
645*4882a593Smuzhiyun }
646*4882a593Smuzhiyun
_os_atomic_sub_return(void * d,_os_atomic * v,int i)647*4882a593Smuzhiyun static inline int _os_atomic_sub_return(void *d, _os_atomic *v, int i)
648*4882a593Smuzhiyun {
649*4882a593Smuzhiyun return ATOMIC_SUB_RETURN(v, i);
650*4882a593Smuzhiyun }
651*4882a593Smuzhiyun
_os_atomic_inc_return(void * d,_os_atomic * v)652*4882a593Smuzhiyun static inline int _os_atomic_inc_return(void *d, _os_atomic *v)
653*4882a593Smuzhiyun {
654*4882a593Smuzhiyun return ATOMIC_INC_RETURN(v);
655*4882a593Smuzhiyun }
656*4882a593Smuzhiyun
_os_atomic_dec_return(void * d,_os_atomic * v)657*4882a593Smuzhiyun static inline int _os_atomic_dec_return(void *d, _os_atomic *v)
658*4882a593Smuzhiyun {
659*4882a593Smuzhiyun return ATOMIC_DEC_RETURN(v);
660*4882a593Smuzhiyun }
661*4882a593Smuzhiyun /*
662*4882a593Smuzhiyun static inline bool _os_atomic_inc_unless(void *d, _os_atomic *v, int u)
663*4882a593Smuzhiyun {
664*4882a593Smuzhiyun return ATOMIC_INC_UNLESS(v, 1, u);
665*4882a593Smuzhiyun }
666*4882a593Smuzhiyun */
667*4882a593Smuzhiyun
_os_tasklet_init(void * drv_priv,_os_tasklet * task,void (* call_back_func)(void * context),void * context)668*4882a593Smuzhiyun static inline u8 _os_tasklet_init(void *drv_priv, _os_tasklet *task,
669*4882a593Smuzhiyun void (*call_back_func)(void* context), void *context)
670*4882a593Smuzhiyun {
671*4882a593Smuzhiyun rtw_tasklet_init(task,
672*4882a593Smuzhiyun (void(*)(unsigned long))call_back_func,
673*4882a593Smuzhiyun (unsigned long)task);
674*4882a593Smuzhiyun return 0;
675*4882a593Smuzhiyun }
_os_tasklet_deinit(void * drv_priv,_os_tasklet * task)676*4882a593Smuzhiyun static inline u8 _os_tasklet_deinit(void *drv_priv, _os_tasklet *task)
677*4882a593Smuzhiyun {
678*4882a593Smuzhiyun rtw_tasklet_kill(task);
679*4882a593Smuzhiyun return 0;
680*4882a593Smuzhiyun }
_os_tasklet_schedule(void * drv_priv,_os_tasklet * task)681*4882a593Smuzhiyun static inline u8 _os_tasklet_schedule(void *drv_priv, _os_tasklet *task)
682*4882a593Smuzhiyun {
683*4882a593Smuzhiyun #if 1
684*4882a593Smuzhiyun rtw_tasklet_hi_schedule(task);
685*4882a593Smuzhiyun #else
686*4882a593Smuzhiyun rtw_tasklet_schedule(task);
687*4882a593Smuzhiyun #endif
688*4882a593Smuzhiyun return 0;
689*4882a593Smuzhiyun }
690*4882a593Smuzhiyun
_os_thread_init(void * drv_priv,_os_thread * thread,int (* call_back_func)(void * context),void * context,const char namefmt[])691*4882a593Smuzhiyun static __inline u8 _os_thread_init( void *drv_priv, _os_thread *thread,
692*4882a593Smuzhiyun int (*call_back_func)(void * context),
693*4882a593Smuzhiyun void *context,
694*4882a593Smuzhiyun const char namefmt[])
695*4882a593Smuzhiyun {
696*4882a593Smuzhiyun thread->thread_handler = rtw_thread_start((int(*)(void*))call_back_func, context, namefmt);
697*4882a593Smuzhiyun if (thread->thread_handler) {
698*4882a593Smuzhiyun RST_THREAD_STATUS(thread);
699*4882a593Smuzhiyun SET_THREAD_STATUS(thread, THREAD_STATUS_STARTED);
700*4882a593Smuzhiyun return RTW_PHL_STATUS_SUCCESS;
701*4882a593Smuzhiyun }
702*4882a593Smuzhiyun
703*4882a593Smuzhiyun return RTW_PHL_STATUS_FAILURE;
704*4882a593Smuzhiyun }
_os_thread_deinit(void * drv_priv,_os_thread * thread)705*4882a593Smuzhiyun static __inline u8 _os_thread_deinit(void *drv_priv, _os_thread *thread)
706*4882a593Smuzhiyun {
707*4882a593Smuzhiyun if (CHK_THREAD_STATUS(thread, THREAD_STATUS_STARTED)) {
708*4882a593Smuzhiyun CLR_THREAD_STATUS(thread, THREAD_STATUS_STARTED);
709*4882a593Smuzhiyun return rtw_thread_stop(thread->thread_handler);
710*4882a593Smuzhiyun }
711*4882a593Smuzhiyun
712*4882a593Smuzhiyun return RTW_PHL_STATUS_SUCCESS;
713*4882a593Smuzhiyun }
_os_thread_schedule(void * drv_priv,_os_thread * thread)714*4882a593Smuzhiyun static __inline enum rtw_phl_status _os_thread_schedule(void *drv_priv, _os_thread *thread)
715*4882a593Smuzhiyun {
716*4882a593Smuzhiyun return RTW_PHL_STATUS_SUCCESS;
717*4882a593Smuzhiyun }
_os_thread_stop(void * drv_priv,_os_thread * thread)718*4882a593Smuzhiyun static inline void _os_thread_stop(void *drv_priv, _os_thread *thread)
719*4882a593Smuzhiyun {
720*4882a593Smuzhiyun SET_THREAD_STATUS(thread, THREAD_STATUS_STOPPED);
721*4882a593Smuzhiyun }
_os_thread_check_stop(void * drv_priv,_os_thread * thread)722*4882a593Smuzhiyun static inline int _os_thread_check_stop(void *drv_priv, _os_thread *thread)
723*4882a593Smuzhiyun {
724*4882a593Smuzhiyun return CHK_THREAD_STATUS(thread, THREAD_STATUS_STOPPED);
725*4882a593Smuzhiyun }
726*4882a593Smuzhiyun
_os_thread_wait_stop(void * drv_priv,_os_thread * thread)727*4882a593Smuzhiyun static inline int _os_thread_wait_stop(void *drv_priv, _os_thread *thread)
728*4882a593Smuzhiyun {
729*4882a593Smuzhiyun rtw_thread_wait_stop();
730*4882a593Smuzhiyun return RTW_PHL_STATUS_SUCCESS;
731*4882a593Smuzhiyun }
732*4882a593Smuzhiyun
733*4882a593Smuzhiyun #if 0
734*4882a593Smuzhiyun static inline _os_thread _os_thread_start(int (*threadfn)(void *data),
735*4882a593Smuzhiyun void *data, const char namefmt[])
736*4882a593Smuzhiyun {
737*4882a593Smuzhiyun return rtw_thread_start(threadfn, data, namefmt);
738*4882a593Smuzhiyun }
739*4882a593Smuzhiyun static inline bool _os_thread_stop(_os_thread th)
740*4882a593Smuzhiyun {
741*4882a593Smuzhiyun
742*4882a593Smuzhiyun return rtw_thread_stop(th);
743*4882a593Smuzhiyun }
744*4882a593Smuzhiyun static inline void _os_thread_wait_stop(void)
745*4882a593Smuzhiyun {
746*4882a593Smuzhiyun rtw_thread_wait_stop();
747*4882a593Smuzhiyun }
748*4882a593Smuzhiyun static inline int _os_thread_should_stop(void)
749*4882a593Smuzhiyun {
750*4882a593Smuzhiyun return kthread_should_stop();
751*4882a593Smuzhiyun }
752*4882a593Smuzhiyun #endif
753*4882a593Smuzhiyun
754*4882a593Smuzhiyun #ifdef CONFIG_PHL_CPU_BALANCE
_os_workitem_config_cpu(void * drv_priv,_os_workitem * workitem,char * work_name,u8 cpu_id)755*4882a593Smuzhiyun static inline u8 _os_workitem_config_cpu(void *drv_priv, _os_workitem *workitem,
756*4882a593Smuzhiyun char *work_name, u8 cpu_id)
757*4882a593Smuzhiyun {
758*4882a593Smuzhiyun _config_workitem_cpu(workitem, work_name, cpu_id);
759*4882a593Smuzhiyun return 0;
760*4882a593Smuzhiyun }
761*4882a593Smuzhiyun #endif
762*4882a593Smuzhiyun
763*4882a593Smuzhiyun
_os_workitem_init(void * drv_priv,_os_workitem * workitem,void (* call_back_func)(void * context),void * context)764*4882a593Smuzhiyun static inline u8 _os_workitem_init(void *drv_priv, _os_workitem *workitem,
765*4882a593Smuzhiyun void (*call_back_func)(void* context), void *context)
766*4882a593Smuzhiyun {
767*4882a593Smuzhiyun #ifdef CONFIG_PHL_CPU_BALANCE
768*4882a593Smuzhiyun _init_workitem_cpu(workitem, call_back_func, context);
769*4882a593Smuzhiyun #else
770*4882a593Smuzhiyun _init_workitem(workitem, call_back_func, context);
771*4882a593Smuzhiyun #endif
772*4882a593Smuzhiyun return 0;
773*4882a593Smuzhiyun }
_os_workitem_schedule(void * drv_priv,_os_workitem * workitem)774*4882a593Smuzhiyun static inline u8 _os_workitem_schedule(void *drv_priv, _os_workitem *workitem)
775*4882a593Smuzhiyun {
776*4882a593Smuzhiyun #ifdef CONFIG_PHL_CPU_BALANCE
777*4882a593Smuzhiyun _set_workitem_cpu(workitem);
778*4882a593Smuzhiyun #else
779*4882a593Smuzhiyun _set_workitem(workitem);
780*4882a593Smuzhiyun #endif
781*4882a593Smuzhiyun return 0;
782*4882a593Smuzhiyun }
_os_workitem_deinit(void * drv_priv,_os_workitem * workitem)783*4882a593Smuzhiyun static inline u8 _os_workitem_deinit(void *drv_priv, _os_workitem *workitem)
784*4882a593Smuzhiyun {
785*4882a593Smuzhiyun #ifdef CONFIG_PHL_CPU_BALANCE
786*4882a593Smuzhiyun _cancel_workitem_sync_cpu(workitem);
787*4882a593Smuzhiyun #else
788*4882a593Smuzhiyun _cancel_workitem_sync(workitem);
789*4882a593Smuzhiyun #endif
790*4882a593Smuzhiyun return 0;
791*4882a593Smuzhiyun }
792*4882a593Smuzhiyun
793*4882a593Smuzhiyun /* File Operation */
_os_read_file(const char * path,u8 * buf,u32 sz)794*4882a593Smuzhiyun static inline u32 _os_read_file(const char *path, u8 *buf, u32 sz)
795*4882a593Smuzhiyun {
796*4882a593Smuzhiyun return (u32)rtw_retrieve_from_file(path, buf, sz);
797*4882a593Smuzhiyun }
798*4882a593Smuzhiyun
799*4882a593Smuzhiyun /*BUS*/
800*4882a593Smuzhiyun #ifdef CONFIG_PCI_HCI
801*4882a593Smuzhiyun #include <pci_ops_linux.h>
_os_read8_pcie(void * d,u32 addr)802*4882a593Smuzhiyun static inline u8 _os_read8_pcie(void *d, u32 addr)
803*4882a593Smuzhiyun {
804*4882a593Smuzhiyun return os_pci_read8((struct dvobj_priv *)d, addr);
805*4882a593Smuzhiyun }
_os_read16_pcie(void * d,u32 addr)806*4882a593Smuzhiyun static inline u16 _os_read16_pcie(void *d, u32 addr)
807*4882a593Smuzhiyun {
808*4882a593Smuzhiyun return os_pci_read16((struct dvobj_priv *)d, addr);
809*4882a593Smuzhiyun
810*4882a593Smuzhiyun }
_os_read32_pcie(void * d,u32 addr)811*4882a593Smuzhiyun static inline u32 _os_read32_pcie(void *d, u32 addr)
812*4882a593Smuzhiyun {
813*4882a593Smuzhiyun return os_pci_read32((struct dvobj_priv *)d, addr);
814*4882a593Smuzhiyun }
815*4882a593Smuzhiyun
_os_write8_pcie(void * d,u32 addr,u8 val)816*4882a593Smuzhiyun static inline int _os_write8_pcie(void *d, u32 addr, u8 val)
817*4882a593Smuzhiyun {
818*4882a593Smuzhiyun return os_pci_write8((struct dvobj_priv *)d, addr, val);
819*4882a593Smuzhiyun }
_os_write16_pcie(void * d,u32 addr,u16 val)820*4882a593Smuzhiyun static inline int _os_write16_pcie(void *d, u32 addr, u16 val)
821*4882a593Smuzhiyun {
822*4882a593Smuzhiyun return os_pci_write16((struct dvobj_priv *)d, addr, val);
823*4882a593Smuzhiyun }
_os_write32_pcie(void * d,u32 addr,u32 val)824*4882a593Smuzhiyun static inline int _os_write32_pcie(void *d, u32 addr, u32 val)
825*4882a593Smuzhiyun {
826*4882a593Smuzhiyun return os_pci_write32((struct dvobj_priv *)d, addr, val);
827*4882a593Smuzhiyun }
828*4882a593Smuzhiyun #endif/*#ifdef CONFIG_PCI_HCI*/
829*4882a593Smuzhiyun
830*4882a593Smuzhiyun #ifdef CONFIG_USB_HCI
831*4882a593Smuzhiyun #include <usb_ops_linux.h>
_os_usbctrl_vendorreq(void * d,u8 request,u16 value,u16 index,void * pdata,u16 len,u8 requesttype)832*4882a593Smuzhiyun static inline int _os_usbctrl_vendorreq(void *d, u8 request, u16 value,
833*4882a593Smuzhiyun u16 index, void *pdata, u16 len, u8 requesttype)
834*4882a593Smuzhiyun {
835*4882a593Smuzhiyun return usbctrl_vendorreq((struct dvobj_priv *)d, request, value,
836*4882a593Smuzhiyun index, pdata, len, requesttype);
837*4882a593Smuzhiyun }
os_out_token_alloc(void * drv_priv)838*4882a593Smuzhiyun static __inline u8 os_out_token_alloc(void *drv_priv)
839*4882a593Smuzhiyun {
840*4882a593Smuzhiyun return 0; // RTW_PHL_STATUS_SUCCESS
841*4882a593Smuzhiyun }
842*4882a593Smuzhiyun
os_out_token_free(void * drv_priv)843*4882a593Smuzhiyun static __inline void os_out_token_free(void *drv_priv)
844*4882a593Smuzhiyun {
845*4882a593Smuzhiyun }
846*4882a593Smuzhiyun
os_usb_tx(void * d,u8 * tx_buf_ptr,u8 bulk_id,u32 len,u8 * pkt_data_buf)847*4882a593Smuzhiyun static inline int os_usb_tx(void *d, u8 *tx_buf_ptr,
848*4882a593Smuzhiyun u8 bulk_id, u32 len, u8 *pkt_data_buf)
849*4882a593Smuzhiyun {
850*4882a593Smuzhiyun return rtw_usb_write_port((struct dvobj_priv *)d, tx_buf_ptr,
851*4882a593Smuzhiyun bulk_id, len, pkt_data_buf);
852*4882a593Smuzhiyun }
853*4882a593Smuzhiyun
os_enable_usb_out_pipes(void * drv_priv)854*4882a593Smuzhiyun static __inline void os_enable_usb_out_pipes(void *drv_priv)
855*4882a593Smuzhiyun {
856*4882a593Smuzhiyun }
857*4882a593Smuzhiyun
os_disable_usb_out_pipes(void * drv_priv)858*4882a593Smuzhiyun static __inline void os_disable_usb_out_pipes(void *drv_priv)
859*4882a593Smuzhiyun {
860*4882a593Smuzhiyun /* Free bulkout urb */
861*4882a593Smuzhiyun rtw_usb_write_port_cancel(drv_priv);
862*4882a593Smuzhiyun }
863*4882a593Smuzhiyun
os_in_token_alloc(void * drv_priv)864*4882a593Smuzhiyun static __inline u8 os_in_token_alloc(void *drv_priv)
865*4882a593Smuzhiyun {
866*4882a593Smuzhiyun // Allocate in token (pUrb) list
867*4882a593Smuzhiyun return 0;
868*4882a593Smuzhiyun }
869*4882a593Smuzhiyun
os_in_token_free(void * drv_priv)870*4882a593Smuzhiyun static __inline void os_in_token_free(void *drv_priv)
871*4882a593Smuzhiyun {
872*4882a593Smuzhiyun // free in token memory
873*4882a593Smuzhiyun /*rtw_usb_read_port_free(drv_priv);*/
874*4882a593Smuzhiyun }
875*4882a593Smuzhiyun
876*4882a593Smuzhiyun
os_send_usb_in_token(void * drv_priv,void * rxobj,u8 * inbuf,u32 inbuf_len,u8 pipe_idx,u8 minLen)877*4882a593Smuzhiyun static __inline u8 os_send_usb_in_token(void *drv_priv, void *rxobj, u8 *inbuf, u32 inbuf_len, u8 pipe_idx, u8 minLen)
878*4882a593Smuzhiyun {
879*4882a593Smuzhiyun return rtw_usb_read_port(drv_priv, rxobj, inbuf, inbuf_len, pipe_idx, minLen);
880*4882a593Smuzhiyun }
881*4882a593Smuzhiyun
os_enable_usb_in_pipes(void * drv_priv)882*4882a593Smuzhiyun static __inline void os_enable_usb_in_pipes(void *drv_priv)
883*4882a593Smuzhiyun {
884*4882a593Smuzhiyun }
885*4882a593Smuzhiyun
os_disable_usb_in_pipes(void * drv_priv)886*4882a593Smuzhiyun static __inline void os_disable_usb_in_pipes(void *drv_priv)
887*4882a593Smuzhiyun {
888*4882a593Smuzhiyun // Cancel Pending IN IRPs.
889*4882a593Smuzhiyun rtw_usb_read_port_cancel(drv_priv);
890*4882a593Smuzhiyun }
891*4882a593Smuzhiyun
892*4882a593Smuzhiyun
893*4882a593Smuzhiyun #endif /*CONFIG_USB_HCI*/
894*4882a593Smuzhiyun
895*4882a593Smuzhiyun #ifdef CONFIG_SDIO_HCI
896*4882a593Smuzhiyun #include <rtw_sdio.h>
897*4882a593Smuzhiyun #include <sdio_ops_linux.h>
898*4882a593Smuzhiyun #include <rtw_debug.h>
899*4882a593Smuzhiyun
_os_sdio_cmd52_r8(void * d,u32 offset)900*4882a593Smuzhiyun static inline u8 _os_sdio_cmd52_r8(void *d, u32 offset)
901*4882a593Smuzhiyun {
902*4882a593Smuzhiyun u8 val = SDIO_ERR_VAL8;
903*4882a593Smuzhiyun
904*4882a593Smuzhiyun if (rtw_sdio_read_cmd52((struct dvobj_priv *)d, offset, &val, 1) == _FAIL)
905*4882a593Smuzhiyun RTW_ERR("%s: I/O FAIL!\n", __FUNCTION__);
906*4882a593Smuzhiyun
907*4882a593Smuzhiyun return val;
908*4882a593Smuzhiyun }
909*4882a593Smuzhiyun
_os_sdio_cmd53_r8(void * d,u32 offset)910*4882a593Smuzhiyun static inline u8 _os_sdio_cmd53_r8(void *d, u32 offset)
911*4882a593Smuzhiyun {
912*4882a593Smuzhiyun u8 val = SDIO_ERR_VAL8;
913*4882a593Smuzhiyun
914*4882a593Smuzhiyun
915*4882a593Smuzhiyun if (rtw_sdio_read_cmd53((struct dvobj_priv *)d, offset, &val, 1) == _FAIL)
916*4882a593Smuzhiyun RTW_ERR("%s: I/O FAIL!\n", __FUNCTION__);
917*4882a593Smuzhiyun
918*4882a593Smuzhiyun return val;
919*4882a593Smuzhiyun }
920*4882a593Smuzhiyun
_os_sdio_cmd53_r16(void * d,u32 offset)921*4882a593Smuzhiyun static inline u16 _os_sdio_cmd53_r16(void *d, u32 offset)
922*4882a593Smuzhiyun {
923*4882a593Smuzhiyun u16 val = SDIO_ERR_VAL16;
924*4882a593Smuzhiyun
925*4882a593Smuzhiyun
926*4882a593Smuzhiyun if (rtw_sdio_read_cmd53((struct dvobj_priv *)d, offset, &val, 2) == _FAIL) {
927*4882a593Smuzhiyun RTW_ERR("%s: I/O FAIL!\n", __FUNCTION__);
928*4882a593Smuzhiyun goto exit;
929*4882a593Smuzhiyun }
930*4882a593Smuzhiyun val = le16_to_cpu(val);
931*4882a593Smuzhiyun
932*4882a593Smuzhiyun exit:
933*4882a593Smuzhiyun return val;
934*4882a593Smuzhiyun }
935*4882a593Smuzhiyun
_os_sdio_cmd53_r32(void * d,u32 offset)936*4882a593Smuzhiyun static inline u32 _os_sdio_cmd53_r32(void *d, u32 offset)
937*4882a593Smuzhiyun {
938*4882a593Smuzhiyun u32 val = SDIO_ERR_VAL32;
939*4882a593Smuzhiyun
940*4882a593Smuzhiyun
941*4882a593Smuzhiyun if (rtw_sdio_read_cmd53((struct dvobj_priv *)d, offset, &val, 4) == _FAIL) {
942*4882a593Smuzhiyun RTW_ERR("%s: I/O FAIL!\n", __FUNCTION__);
943*4882a593Smuzhiyun goto exit;
944*4882a593Smuzhiyun }
945*4882a593Smuzhiyun val = le32_to_cpu(val);
946*4882a593Smuzhiyun
947*4882a593Smuzhiyun exit:
948*4882a593Smuzhiyun return val;
949*4882a593Smuzhiyun }
950*4882a593Smuzhiyun
_os_sdio_cmd53_rn(void * d,u32 offset,u32 size,u8 * data)951*4882a593Smuzhiyun static inline u8 _os_sdio_cmd53_rn(void *d, u32 offset, u32 size, u8 *data)
952*4882a593Smuzhiyun {
953*4882a593Smuzhiyun struct dvobj_priv *dv = d;
954*4882a593Smuzhiyun struct sdio_data *sdio = dvobj_to_sdio(dv);
955*4882a593Smuzhiyun u8 *pbuf = data;
956*4882a593Smuzhiyun u32 sdio_read_size;
957*4882a593Smuzhiyun
958*4882a593Smuzhiyun if (!data)
959*4882a593Smuzhiyun return _FAIL;
960*4882a593Smuzhiyun
961*4882a593Smuzhiyun sdio_read_size = RND4(size);
962*4882a593Smuzhiyun sdio_read_size = rtw_sdio_cmd53_align_size(dv, sdio_read_size);
963*4882a593Smuzhiyun
964*4882a593Smuzhiyun if (sdio_read_size > sdio->tmpbuf_sz) {
965*4882a593Smuzhiyun pbuf = rtw_malloc(sdio_read_size);
966*4882a593Smuzhiyun if (!pbuf)
967*4882a593Smuzhiyun return _FAIL;
968*4882a593Smuzhiyun }
969*4882a593Smuzhiyun
970*4882a593Smuzhiyun if (rtw_sdio_read_cmd53(dv, offset, pbuf, sdio_read_size) == _FAIL) {
971*4882a593Smuzhiyun RTW_ERR("%s: I/O FAIL!\n", __FUNCTION__);
972*4882a593Smuzhiyun goto exit;
973*4882a593Smuzhiyun }
974*4882a593Smuzhiyun
975*4882a593Smuzhiyun if (pbuf != data)
976*4882a593Smuzhiyun _rtw_memcpy(data, pbuf, size);
977*4882a593Smuzhiyun
978*4882a593Smuzhiyun exit:
979*4882a593Smuzhiyun if (pbuf != data)
980*4882a593Smuzhiyun rtw_mfree(pbuf, sdio_read_size);
981*4882a593Smuzhiyun
982*4882a593Smuzhiyun return _SUCCESS;
983*4882a593Smuzhiyun }
984*4882a593Smuzhiyun
_os_sdio_cmd53_r(void * d,u32 offset,u32 size,u8 * data)985*4882a593Smuzhiyun static inline u8 _os_sdio_cmd53_r(void *d, u32 offset, u32 size, u8 *data)
986*4882a593Smuzhiyun {
987*4882a593Smuzhiyun u8 ret;
988*4882a593Smuzhiyun
989*4882a593Smuzhiyun ret = rtw_sdio_read_cmd53((struct dvobj_priv *)d, offset, data, size);
990*4882a593Smuzhiyun if (ret == _FAIL) {
991*4882a593Smuzhiyun RTW_ERR("%s: I/O FAIL!\n", __FUNCTION__);
992*4882a593Smuzhiyun return _FAIL;
993*4882a593Smuzhiyun }
994*4882a593Smuzhiyun
995*4882a593Smuzhiyun return _SUCCESS;
996*4882a593Smuzhiyun }
997*4882a593Smuzhiyun
_os_sdio_cmd52_w8(void * d,u32 offset,u8 val)998*4882a593Smuzhiyun static inline void _os_sdio_cmd52_w8(void *d, u32 offset, u8 val)
999*4882a593Smuzhiyun {
1000*4882a593Smuzhiyun if (rtw_sdio_write_cmd52((struct dvobj_priv *)d, offset, &val, 1) == _FAIL)
1001*4882a593Smuzhiyun RTW_ERR("%s: I/O FAIL!\n", __FUNCTION__);
1002*4882a593Smuzhiyun }
1003*4882a593Smuzhiyun
_os_sdio_cmd53_w8(void * d,u32 offset,u8 val)1004*4882a593Smuzhiyun static inline void _os_sdio_cmd53_w8(void *d, u32 offset, u8 val)
1005*4882a593Smuzhiyun {
1006*4882a593Smuzhiyun if (rtw_sdio_write_cmd53((struct dvobj_priv *)d, offset, &val, 1) == _FAIL)
1007*4882a593Smuzhiyun RTW_ERR("%s: I/O FAIL!\n", __FUNCTION__);
1008*4882a593Smuzhiyun }
1009*4882a593Smuzhiyun
_os_sdio_cmd53_w16(void * d,u32 offset,u16 val)1010*4882a593Smuzhiyun static inline void _os_sdio_cmd53_w16(void *d, u32 offset, u16 val)
1011*4882a593Smuzhiyun {
1012*4882a593Smuzhiyun val = cpu_to_le16(val);
1013*4882a593Smuzhiyun if (rtw_sdio_write_cmd53((struct dvobj_priv *)d, offset, &val, 2) == _FAIL)
1014*4882a593Smuzhiyun RTW_ERR("%s: I/O FAIL!\n", __FUNCTION__);
1015*4882a593Smuzhiyun }
1016*4882a593Smuzhiyun
_os_sdio_cmd53_w32(void * d,u32 offset,u32 val)1017*4882a593Smuzhiyun static inline void _os_sdio_cmd53_w32(void *d, u32 offset, u32 val)
1018*4882a593Smuzhiyun {
1019*4882a593Smuzhiyun val = cpu_to_le32(val);
1020*4882a593Smuzhiyun if (rtw_sdio_write_cmd53((struct dvobj_priv *)d, offset, &val, 4) == _FAIL)
1021*4882a593Smuzhiyun RTW_ERR("%s: I/O FAIL!\n", __FUNCTION__);
1022*4882a593Smuzhiyun }
1023*4882a593Smuzhiyun
_os_sdio_cmd53_wn(void * d,u32 offset,u32 size,u8 * data)1024*4882a593Smuzhiyun static inline void _os_sdio_cmd53_wn(void *d, u32 offset, u32 size, u8 *data)
1025*4882a593Smuzhiyun {
1026*4882a593Smuzhiyun struct dvobj_priv *dv = d;
1027*4882a593Smuzhiyun struct sdio_data *sdio = dvobj_to_sdio(dv);
1028*4882a593Smuzhiyun u8 *pbuf = data;
1029*4882a593Smuzhiyun
1030*4882a593Smuzhiyun
1031*4882a593Smuzhiyun if (size > sdio->tmpbuf_sz) {
1032*4882a593Smuzhiyun pbuf = rtw_malloc(size);
1033*4882a593Smuzhiyun if (!pbuf)
1034*4882a593Smuzhiyun return;
1035*4882a593Smuzhiyun _rtw_memcpy(pbuf, data, size);
1036*4882a593Smuzhiyun }
1037*4882a593Smuzhiyun
1038*4882a593Smuzhiyun if (rtw_sdio_write_cmd53(dv, offset, pbuf, size) == _FAIL)
1039*4882a593Smuzhiyun RTW_ERR("%s: I/O FAIL!\n", __FUNCTION__);
1040*4882a593Smuzhiyun
1041*4882a593Smuzhiyun if (pbuf != data)
1042*4882a593Smuzhiyun rtw_mfree(pbuf, size);
1043*4882a593Smuzhiyun }
1044*4882a593Smuzhiyun
_os_sdio_cmd53_w(void * d,u32 offset,u32 size,u8 * data)1045*4882a593Smuzhiyun static inline void _os_sdio_cmd53_w(void *d, u32 offset, u32 size, u8 *data)
1046*4882a593Smuzhiyun {
1047*4882a593Smuzhiyun u8 ret;
1048*4882a593Smuzhiyun
1049*4882a593Smuzhiyun ret = rtw_sdio_write_cmd53((struct dvobj_priv *)d, offset, data, size);
1050*4882a593Smuzhiyun if (ret == _FAIL)
1051*4882a593Smuzhiyun RTW_ERR("%s: I/O FAIL!\n", __FUNCTION__);
1052*4882a593Smuzhiyun }
1053*4882a593Smuzhiyun
_os_sdio_f0_read(void * d,u32 addr,void * buf,size_t len)1054*4882a593Smuzhiyun static inline u8 _os_sdio_f0_read(void *d, u32 addr, void *buf, size_t len)
1055*4882a593Smuzhiyun {
1056*4882a593Smuzhiyun return rtw_sdio_f0_read((struct dvobj_priv *)d, addr, buf, len);
1057*4882a593Smuzhiyun }
1058*4882a593Smuzhiyun
_os_sdio_read_cia_r8(void * d,u32 addr)1059*4882a593Smuzhiyun static inline u8 _os_sdio_read_cia_r8(void *d, u32 addr)
1060*4882a593Smuzhiyun {
1061*4882a593Smuzhiyun u8 data = 0;
1062*4882a593Smuzhiyun
1063*4882a593Smuzhiyun if (rtw_sdio_f0_read((struct dvobj_priv *)d, addr, &data, 1) == _FAIL)
1064*4882a593Smuzhiyun RTW_ERR("%s: read sdio cia FAIL!\n", __FUNCTION__);
1065*4882a593Smuzhiyun
1066*4882a593Smuzhiyun return data;
1067*4882a593Smuzhiyun }
1068*4882a593Smuzhiyun
1069*4882a593Smuzhiyun #endif /*CONFIG_SDIO_HCI*/
1070*4882a593Smuzhiyun #endif /*_PLTFM_OPS_LINUX_H_*/
1071