xref: /OK3568_Linux_fs/external/rkwifibt/drivers/bcmdhd/linux_osl_priv.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Private header file for Linux OS Independent Layer
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * Copyright (C) 2020, Broadcom.
5*4882a593Smuzhiyun  *
6*4882a593Smuzhiyun  *      Unless you and Broadcom execute a separate written software license
7*4882a593Smuzhiyun  * agreement governing use of this software, this software is licensed to you
8*4882a593Smuzhiyun  * under the terms of the GNU General Public License version 2 (the "GPL"),
9*4882a593Smuzhiyun  * available at http://www.broadcom.com/licenses/GPLv2.php, with the
10*4882a593Smuzhiyun  * following added to such license:
11*4882a593Smuzhiyun  *
12*4882a593Smuzhiyun  *      As a special exception, the copyright holders of this software give you
13*4882a593Smuzhiyun  * permission to link this software with independent modules, and to copy and
14*4882a593Smuzhiyun  * distribute the resulting executable under terms of your choice, provided that
15*4882a593Smuzhiyun  * you also meet, for each linked independent module, the terms and conditions of
16*4882a593Smuzhiyun  * the license of that module.  An independent module is a module which is not
17*4882a593Smuzhiyun  * derived from this software.  The special exception does not apply to any
18*4882a593Smuzhiyun  * modifications of the software.
19*4882a593Smuzhiyun  *
20*4882a593Smuzhiyun  *
21*4882a593Smuzhiyun  * <<Broadcom-WL-IPTag/Dual:>>
22*4882a593Smuzhiyun  */
23*4882a593Smuzhiyun 
24*4882a593Smuzhiyun #ifndef _LINUX_OSL_PRIV_H_
25*4882a593Smuzhiyun #define _LINUX_OSL_PRIV_H_
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun #include <osl.h>
28*4882a593Smuzhiyun 
29*4882a593Smuzhiyun #define OS_HANDLE_MAGIC		0x1234abcd	/* Magic # to recognize osh */
30*4882a593Smuzhiyun #define BCM_MEM_FILENAME_LEN	24		/* Mem. filename length */
31*4882a593Smuzhiyun 
32*4882a593Smuzhiyun /* dependancy check */
33*4882a593Smuzhiyun #if !defined(BCMPCIE) && defined(DHD_USE_STATIC_CTRLBUF)
34*4882a593Smuzhiyun #error "DHD_USE_STATIC_CTRLBUF suppored PCIE target only"
35*4882a593Smuzhiyun #endif /* !BCMPCIE && DHD_USE_STATIC_CTRLBUF */
36*4882a593Smuzhiyun 
37*4882a593Smuzhiyun #define OSL_MEMLIST_LOCK(lock, flags)	(flags) = osl_spin_lock(lock)
38*4882a593Smuzhiyun #define OSL_MEMLIST_UNLOCK(lock, flags)	osl_spin_unlock((lock), (flags))
39*4882a593Smuzhiyun 
40*4882a593Smuzhiyun #define OSL_STATIC_BUF_LOCK(lock, flags)	(flags) = osl_spin_lock(lock)
41*4882a593Smuzhiyun #define OSL_STATIC_BUF_UNLOCK(lock, flags)	osl_spin_unlock((lock), (flags))
42*4882a593Smuzhiyun 
43*4882a593Smuzhiyun #define OSL_STATIC_PKT_LOCK(lock, flags)	(flags) = osl_spin_lock(lock)
44*4882a593Smuzhiyun #define OSL_STATIC_PKT_UNLOCK(lock, flags)	osl_spin_unlock((lock), (flags))
45*4882a593Smuzhiyun 
46*4882a593Smuzhiyun #define OSL_PKTLIST_LOCK(lock, flags)	(flags) = osl_spin_lock(lock)
47*4882a593Smuzhiyun #define OSL_PKTLIST_UNLOCK(lock, flags)	osl_spin_unlock((lock), (flags))
48*4882a593Smuzhiyun 
49*4882a593Smuzhiyun #define OSL_CTRACE_LOCK(lock, flags)	(flags) = osl_spin_lock(lock)
50*4882a593Smuzhiyun #define OSL_CTRACE_UNLOCK(lock, flags)	osl_spin_unlock((lock), (flags))
51*4882a593Smuzhiyun 
52*4882a593Smuzhiyun #ifdef CONFIG_DHD_USE_STATIC_BUF
53*4882a593Smuzhiyun #ifdef DHD_USE_STATIC_CTRLBUF
54*4882a593Smuzhiyun #define DHD_SKB_1PAGE_BUFSIZE	(PAGE_SIZE*1)
55*4882a593Smuzhiyun #define DHD_SKB_2PAGE_BUFSIZE	(PAGE_SIZE*2)
56*4882a593Smuzhiyun #define DHD_SKB_4PAGE_BUFSIZE	(PAGE_SIZE*4)
57*4882a593Smuzhiyun 
58*4882a593Smuzhiyun #define PREALLOC_FREE_MAGIC	0xFEDC
59*4882a593Smuzhiyun #define PREALLOC_USED_MAGIC	0xFCDE
60*4882a593Smuzhiyun #else
61*4882a593Smuzhiyun #define DHD_SKB_HDRSIZE		336
62*4882a593Smuzhiyun #define DHD_SKB_1PAGE_BUFSIZE	((PAGE_SIZE*1)-DHD_SKB_HDRSIZE)
63*4882a593Smuzhiyun #define DHD_SKB_2PAGE_BUFSIZE	((PAGE_SIZE*2)-DHD_SKB_HDRSIZE)
64*4882a593Smuzhiyun #define DHD_SKB_4PAGE_BUFSIZE	((PAGE_SIZE*4)-DHD_SKB_HDRSIZE)
65*4882a593Smuzhiyun #endif /* DHD_USE_STATIC_CTRLBUF */
66*4882a593Smuzhiyun 
67*4882a593Smuzhiyun #define STATIC_BUF_MAX_NUM	16
68*4882a593Smuzhiyun #define STATIC_BUF_SIZE	(PAGE_SIZE*2)
69*4882a593Smuzhiyun #define STATIC_BUF_TOTAL_LEN	(STATIC_BUF_MAX_NUM * STATIC_BUF_SIZE)
70*4882a593Smuzhiyun 
71*4882a593Smuzhiyun typedef struct bcm_static_buf {
72*4882a593Smuzhiyun 	spinlock_t static_lock;
73*4882a593Smuzhiyun 	unsigned char *buf_ptr;
74*4882a593Smuzhiyun 	unsigned char buf_use[STATIC_BUF_MAX_NUM];
75*4882a593Smuzhiyun } bcm_static_buf_t;
76*4882a593Smuzhiyun 
77*4882a593Smuzhiyun extern bcm_static_buf_t *bcm_static_buf;
78*4882a593Smuzhiyun 
79*4882a593Smuzhiyun #ifdef DHD_USE_STATIC_CTRLBUF
80*4882a593Smuzhiyun #define STATIC_PKT_4PAGE_NUM	0
81*4882a593Smuzhiyun #define DHD_SKB_MAX_BUFSIZE	DHD_SKB_2PAGE_BUFSIZE
82*4882a593Smuzhiyun #elif defined(ENHANCED_STATIC_BUF)
83*4882a593Smuzhiyun #define STATIC_PKT_4PAGE_NUM	1
84*4882a593Smuzhiyun #define DHD_SKB_MAX_BUFSIZE	DHD_SKB_4PAGE_BUFSIZE
85*4882a593Smuzhiyun #else
86*4882a593Smuzhiyun #define STATIC_PKT_4PAGE_NUM	0
87*4882a593Smuzhiyun #define DHD_SKB_MAX_BUFSIZE	DHD_SKB_2PAGE_BUFSIZE
88*4882a593Smuzhiyun #endif /* DHD_USE_STATIC_CTRLBUF */
89*4882a593Smuzhiyun 
90*4882a593Smuzhiyun #ifdef DHD_USE_STATIC_CTRLBUF
91*4882a593Smuzhiyun #define STATIC_PKT_1PAGE_NUM	0
92*4882a593Smuzhiyun /* Should match DHD_SKB_2PAGE_BUF_NUM */
93*4882a593Smuzhiyun #define STATIC_PKT_2PAGE_NUM	192
94*4882a593Smuzhiyun #else
95*4882a593Smuzhiyun #define STATIC_PKT_1PAGE_NUM	8
96*4882a593Smuzhiyun #define STATIC_PKT_2PAGE_NUM	8
97*4882a593Smuzhiyun #endif /* DHD_USE_STATIC_CTRLBUF */
98*4882a593Smuzhiyun 
99*4882a593Smuzhiyun #define STATIC_PKT_1_2PAGE_NUM	\
100*4882a593Smuzhiyun 	((STATIC_PKT_1PAGE_NUM) + (STATIC_PKT_2PAGE_NUM))
101*4882a593Smuzhiyun #define STATIC_PKT_MAX_NUM	\
102*4882a593Smuzhiyun 	((STATIC_PKT_1_2PAGE_NUM) + (STATIC_PKT_4PAGE_NUM))
103*4882a593Smuzhiyun 
104*4882a593Smuzhiyun typedef struct bcm_static_pkt {
105*4882a593Smuzhiyun #ifdef DHD_USE_STATIC_CTRLBUF
106*4882a593Smuzhiyun 	struct sk_buff *skb_8k[STATIC_PKT_2PAGE_NUM];
107*4882a593Smuzhiyun 	unsigned char pkt_invalid[STATIC_PKT_2PAGE_NUM];
108*4882a593Smuzhiyun 	spinlock_t osl_pkt_lock;
109*4882a593Smuzhiyun 	uint32 last_allocated_index;
110*4882a593Smuzhiyun #else
111*4882a593Smuzhiyun 	struct sk_buff *skb_4k[STATIC_PKT_1PAGE_NUM];
112*4882a593Smuzhiyun 	struct sk_buff *skb_8k[STATIC_PKT_2PAGE_NUM];
113*4882a593Smuzhiyun #ifdef ENHANCED_STATIC_BUF
114*4882a593Smuzhiyun 	struct sk_buff *skb_16k;
115*4882a593Smuzhiyun #endif /* ENHANCED_STATIC_BUF */
116*4882a593Smuzhiyun 	struct semaphore osl_pkt_sem;
117*4882a593Smuzhiyun #endif /* DHD_USE_STATIC_CTRLBUF */
118*4882a593Smuzhiyun 	unsigned char pkt_use[STATIC_PKT_MAX_NUM];
119*4882a593Smuzhiyun } bcm_static_pkt_t;
120*4882a593Smuzhiyun 
121*4882a593Smuzhiyun extern bcm_static_pkt_t *bcm_static_skb;
122*4882a593Smuzhiyun #endif /* CONFIG_DHD_USE_STATIC_BUF */
123*4882a593Smuzhiyun 
124*4882a593Smuzhiyun typedef struct bcm_mem_link {
125*4882a593Smuzhiyun 	struct bcm_mem_link *prev;
126*4882a593Smuzhiyun 	struct bcm_mem_link *next;
127*4882a593Smuzhiyun 	uint	size;
128*4882a593Smuzhiyun 	int	line;
129*4882a593Smuzhiyun 	void	*osh;
130*4882a593Smuzhiyun 	char	file[BCM_MEM_FILENAME_LEN];
131*4882a593Smuzhiyun } bcm_mem_link_t;
132*4882a593Smuzhiyun 
133*4882a593Smuzhiyun struct osl_cmn_info {
134*4882a593Smuzhiyun 	atomic_t malloced;
135*4882a593Smuzhiyun 	atomic_t pktalloced;    /* Number of allocated packet buffers */
136*4882a593Smuzhiyun 	spinlock_t dbgmem_lock;
137*4882a593Smuzhiyun 	bcm_mem_link_t *dbgmem_list;
138*4882a593Smuzhiyun 	bcm_mem_link_t *dbgvmem_list;
139*4882a593Smuzhiyun #ifdef BCMDBG_PKT    /* pkt logging for debugging */
140*4882a593Smuzhiyun 	spinlock_t pktlist_lock;
141*4882a593Smuzhiyun 	pktlist_info_t pktlist;
142*4882a593Smuzhiyun #endif  /* BCMDBG_PKT */
143*4882a593Smuzhiyun 	spinlock_t pktalloc_lock;
144*4882a593Smuzhiyun 	atomic_t refcount; /* Number of references to this shared structure. */
145*4882a593Smuzhiyun };
146*4882a593Smuzhiyun typedef struct osl_cmn_info osl_cmn_t;
147*4882a593Smuzhiyun 
148*4882a593Smuzhiyun #if defined(AXI_TIMEOUTS_NIC)
149*4882a593Smuzhiyun typedef uint32 (*bpt_cb_fn)(void *ctx, void *addr);
150*4882a593Smuzhiyun #endif	/* AXI_TIMEOUTS_NIC */
151*4882a593Smuzhiyun 
152*4882a593Smuzhiyun struct osl_info {
153*4882a593Smuzhiyun 	osl_pubinfo_t pub;
154*4882a593Smuzhiyun 	uint32  flags;		/* If specific cases to be handled in the OSL */
155*4882a593Smuzhiyun 	uint magic;
156*4882a593Smuzhiyun 	void *pdev;
157*4882a593Smuzhiyun 	uint failed;
158*4882a593Smuzhiyun 	uint bustype;
159*4882a593Smuzhiyun 	osl_cmn_t *cmn; /* Common OSL related data shred between two OSH's */
160*4882a593Smuzhiyun 
161*4882a593Smuzhiyun 	/* for host drivers, a bus handle is needed when reading from and/or writing to dongle
162*4882a593Smuzhiyun 	 * registeres, however ai/si utilities only passes osh handle to R_REG and W_REG. as
163*4882a593Smuzhiyun 	 * a work around, save the bus handle here
164*4882a593Smuzhiyun 	 */
165*4882a593Smuzhiyun 	void *bus_handle;
166*4882a593Smuzhiyun #ifdef BCMDBG_CTRACE
167*4882a593Smuzhiyun 	spinlock_t ctrace_lock;
168*4882a593Smuzhiyun 	struct list_head ctrace_list;
169*4882a593Smuzhiyun 	int ctrace_num;
170*4882a593Smuzhiyun #endif /* BCMDBG_CTRACE */
171*4882a593Smuzhiyun #if defined(AXI_TIMEOUTS_NIC)
172*4882a593Smuzhiyun 	bpt_cb_fn bpt_cb;
173*4882a593Smuzhiyun 	void *sih;
174*4882a593Smuzhiyun #endif	/* AXI_TIMEOUTS_NIC */
175*4882a593Smuzhiyun #ifdef USE_DMA_LOCK
176*4882a593Smuzhiyun 	spinlock_t dma_lock;
177*4882a593Smuzhiyun 	bool dma_lock_bh;
178*4882a593Smuzhiyun #endif /* USE_DMA_LOCK */
179*4882a593Smuzhiyun #ifdef DHD_MAP_LOGGING
180*4882a593Smuzhiyun 	void *dhd_map_log;
181*4882a593Smuzhiyun 	void *dhd_unmap_log;
182*4882a593Smuzhiyun #endif /* DHD_MAP_LOGGING */
183*4882a593Smuzhiyun };
184*4882a593Smuzhiyun 
185*4882a593Smuzhiyun #endif /* _LINUX_OSL_PRIV_H_ */
186