xref: /wlan-dirver/qca-wifi-host-cmn/qdf/linux/src/i_qdf_types.h (revision dd4dc88b837a295134aa9869114a2efee0f4894b)
1 /*
2  * Copyright (c) 2014-2019 The Linux Foundation. All rights reserved.
3  *
4  * Permission to use, copy, modify, and/or distribute this software for
5  * any purpose with or without fee is hereby granted, provided that the
6  * above copyright notice and this permission notice appear in all
7  * copies.
8  *
9  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
10  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
11  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
12  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
13  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
14  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
15  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
16  * PERFORMANCE OF THIS SOFTWARE.
17  */
18 
19 /**
20  * DOC: i_qdf_types.h
21  * This file provides OS dependent types API's.
22  */
23 
24 #if !defined(__I_QDF_TYPES_H)
25 #define __I_QDF_TYPES_H
26 
27 #ifndef __KERNEL__
28 #define __iomem
29 #endif
30 #include <asm/types.h>
31 #include <asm/byteorder.h>
32 #include <linux/version.h>
33 
34 #ifndef __ahdecl
35 #ifdef __i386__
36 #define __ahdecl   __attribute__((regparm(0)))
37 #else
38 #define __ahdecl
39 #endif
40 #endif
41 
42 #ifdef __KERNEL__
43 #include <generated/autoconf.h>
44 #include <linux/list.h>
45 #include <linux/mutex.h>
46 #include <linux/types.h>
47 #include <linux/ctype.h>
48 #include <linux/sched.h>
49 #include <linux/completion.h>
50 #include <linux/string.h>
51 #include <linux/slab.h>
52 #include <linux/interrupt.h>
53 #include <linux/version.h>
54 #include <asm/div64.h>
55 #include <linux/compiler.h>
56 #include <linux/dma-mapping.h>
57 #include <linux/wireless.h>
58 #include <linux/if.h>
59 #ifdef IPA_OFFLOAD
60 #include <linux/ipa.h>
61 #endif
62 
63 #define __qdf_must_check __must_check
64 
65 typedef struct sg_table __sgtable_t;
66 
67 /*
68  * The IDs of the various system clocks
69  */
70 #define __QDF_CLOCK_REALTIME CLOCK_REALTIME
71 #define __QDF_CLOCK_MONOTONIC CLOCK_MONOTONIC
72 
73 /*
74  * Return values for the qdf_hrtimer_data_t callback function
75  */
76 #define __QDF_HRTIMER_NORESTART HRTIMER_NORESTART
77 #define __QDF_HRTIMER_RESTART HRTIMER_RESTART
78 
79 /*
80  * Mode arguments of qdf_hrtimer_data_t related functions
81  */
82 #define __QDF_HRTIMER_MODE_ABS HRTIMER_MODE_ABS
83 #define __QDF_HRTIMER_MODE_REL HRTIMER_MODE_REL
84 #define __QDF_HRTIMER_MODE_PINNED HRTIMER_MODE_PINNED
85 
86 #else
87 
88 /*
89  * Hack - coexist with prior defs of dma_addr_t.
90  * Eventually all other defs of dma_addr_t should be removed.
91  * At that point, the "already_defined" wrapper can be removed.
92  */
93 #ifndef __dma_addr_t_already_defined__
94 #define __dma_addr_t_already_defined__
95 typedef unsigned long dma_addr_t;
96 #endif
97 
98 typedef unsigned long phys_addr_t;
99 typedef unsigned long __sgtable_t;
100 
101 #define SIOCGIWAP       0
102 #define IWEVCUSTOM      0
103 #define IWEVREGISTERED  0
104 #define IWEVEXPIRED     0
105 #define SIOCGIWSCAN     0
106 #define DMA_TO_DEVICE   0
107 #define DMA_BIDIRECTIONAL 0
108 #define DMA_FROM_DEVICE 0
109 #define __QDF_CLOCK_REALTIME 0
110 #define __QDF_CLOCK_MONOTONIC 0
111 #define __QDF_HRTIMER_MODE_ABS 0
112 #define __QDF_HRTIMER_MODE_REL 0
113 #define __QDF_HRTIMER_MODE_PINNED 0
114 #define __QDF_HRTIMER_NORESTART 0
115 #define __QDF_HRTIMER_RESTART 0
116 #define __iomem
117 #endif /* __KERNEL__ */
118 
119 /*
120  * max sg that we support
121  */
122 #define __QDF_MAX_SCATTER        1
123 #define __QDF_NSEC_PER_MSEC NSEC_PER_MSEC
124 
125 #if defined(__LITTLE_ENDIAN_BITFIELD)
126 #define QDF_LITTLE_ENDIAN_MACHINE
127 #elif defined(__BIG_ENDIAN_BITFIELD)
128 #define QDF_BIG_ENDIAN_MACHINE
129 #else
130 #error  "Please fix <asm/byteorder.h>"
131 #endif
132 
133 #if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 20) || !defined(__KERNEL__)
134 #ifndef __bool_already_defined__
135 #define __bool_already_defined__
136 
137 /**
138  * bool - This is an enum for boolean
139  * @false: zero
140  * @true: one
141  */
142 typedef enum bool {
143 	false = 0,
144 	true  = 1,
145 } bool;
146 #endif /* __bool_already_defined__ */
147 #endif
148 
149 #define __qdf_packed    __attribute__((packed))
150 
151 typedef int (*__qdf_os_intr)(void *);
152 /**
153  * Private definitions of general data types
154  */
155 typedef dma_addr_t __qdf_dma_addr_t;
156 typedef size_t __qdf_dma_size_t;
157 typedef dma_addr_t __qdf_dma_context_t;
158 typedef struct net_device *__qdf_netdev_t;
159 typedef __le16 __qdf_le16_t;
160 typedef __le32 __qdf_le32_t;
161 typedef __le64 __qdf_le64_t;
162 typedef __be16 __qdf_be16_t;
163 typedef __be32 __qdf_be32_t;
164 typedef __be64 __qdf_be64_t;
165 
166 #ifdef IPA_OFFLOAD
167 typedef struct ipa_wdi_buffer_info __qdf_mem_info_t;
168 #else
169 /**
170  * struct __qdf_shared_mem_info - shared mem info struct
171  * @pa : physical address
172  * @iova: i/o virtual address
173  * @size: allocated memory size
174  * @result: status
175  */
176 typedef struct __qdf_shared_mem_info {
177 	phys_addr_t pa;
178 	unsigned long iova;
179 	size_t size;
180 	int result;
181 } __qdf_mem_info_t;
182 #endif /* IPA_OFFLOAD */
183 
184 #define qdf_dma_mem_context(context) dma_addr_t context
185 #define qdf_get_dma_mem_context(var, field)   ((qdf_dma_context_t)(var->field))
186 
187 /**
188  * typedef struct __qdf_resource_t - qdf resource type
189  * @paddr: Physical address
190  * @paddr: Virtual address
191  * @len: Length
192  */
193 typedef struct __qdf_resource {
194 	unsigned long paddr;
195 	void __iomem *vaddr;
196 	unsigned long len;
197 } __qdf_resource_t;
198 
199 struct __qdf_mempool_ctxt;
200 
201 #define MAX_MEM_POOLS 64
202 
203 /**
204  * enum qdf_bus_type - Supported Bus types
205  * @QDF_BUS_TYPE_NONE: None Bus type for error check
206  * @QDF_BUS_TYPE_PCI: PCI Bus
207  * @QDF_BUS_TYPE_AHB: AHB Bus
208  * @QDF_BUS_TYPE_SNOC: SNOC Bus
209  * @QDF_BUS_TYPE_SIM: Simulator
210  * @QDF_BUS_TYPE_USB: USB Bus
211  */
212 enum qdf_bus_type {
213 	QDF_BUS_TYPE_NONE = -1,
214 	QDF_BUS_TYPE_PCI = 0,
215 	QDF_BUS_TYPE_AHB,
216 	QDF_BUS_TYPE_SNOC,
217 	QDF_BUS_TYPE_SIM,
218 	QDF_BUS_TYPE_SDIO,
219 	QDF_BUS_TYPE_USB
220 };
221 
222 /**
223  * struct __qdf_device - generic qdf device type
224  * @drv: Pointer to driver
225  * @drv_hdl: Pointer to driver handle
226  * @drv_name: Pointer to driver name
227  * @irq: IRQ
228  * @dev: Pointer to device
229  * @res: QDF resource
230  * @func: Interrupt handler
231  * @mem_pool: array of pointers to mem pool context
232  * @bus_type: Bus type
233  * @bid: Bus ID
234  * @smmu_s1_enabled: SMMU S1 enabled or not
235  * @iommu_mapping: DMA iommu mapping pointer
236  */
237 struct __qdf_device {
238 	void *drv;
239 	void *drv_hdl;
240 	char *drv_name;
241 	int irq;
242 	struct device *dev;
243 	__qdf_resource_t res;
244 	__qdf_os_intr func;
245 	struct __qdf_mempool_ctxt *mem_pool[MAX_MEM_POOLS];
246 	enum qdf_bus_type bus_type;
247 	const struct hif_bus_id *bid;
248 	bool smmu_s1_enabled;
249 	struct dma_iommu_mapping *iommu_mapping;
250 };
251 typedef struct __qdf_device *__qdf_device_t;
252 
253 typedef size_t __qdf_size_t;
254 typedef off_t __qdf_off_t;
255 typedef uint8_t __iomem *__qdf_iomem_t;
256 
257 typedef uint32_t ath_dma_addr_t;
258 
259 /**
260  * typedef __qdf_segment_t - segment of memory
261  * @daddr: dma address
262  * @len: length of segment
263  */
264 typedef struct __qdf_segment {
265 	dma_addr_t  daddr;
266 	uint32_t    len;
267 } __qdf_segment_t;
268 
269 /**
270  * __qdf_dma_map - dma map of memory
271  * @mapped: mapped address
272  * @nsegs: number of segments
273  * @coherent: coherency status
274  * @seg: segment of memory
275  */
276 struct __qdf_dma_map {
277 	uint32_t                mapped;
278 	uint32_t                nsegs;
279 	uint32_t                coherent;
280 	__qdf_segment_t      seg[__QDF_MAX_SCATTER];
281 };
282 typedef struct  __qdf_dma_map  *__qdf_dma_map_t;
283 
284 /**
285  * __qdf_net_wireless_evcode - enum for event code
286  * @__QDF_IEEE80211_ASSOC: association event code
287  * @__QDF_IEEE80211_REASSOC: reassociation event code
288  * @__QDF_IEEE80211_DISASSOC: disassociation event code
289  * @__QDF_IEEE80211_JOIN: join event code
290  * @__QDF_IEEE80211_LEAVE: leave event code
291  * @__QDF_IEEE80211_SCAN: scan event code
292  * @__QDF_IEEE80211_REPLAY: replay event code
293  * @__QDF_IEEE80211_MICHAEL:michael event code
294  * @__QDF_IEEE80211_REJOIN: rejoin event code
295  * @__QDF_CUSTOM_PUSH_BUTTON: push button event code
296  */
297 enum __qdf_net_wireless_evcode {
298 	__QDF_IEEE80211_ASSOC = SIOCGIWAP,
299 	__QDF_IEEE80211_REASSOC = IWEVCUSTOM,
300 	__QDF_IEEE80211_DISASSOC = SIOCGIWAP,
301 	__QDF_IEEE80211_JOIN = IWEVREGISTERED,
302 	__QDF_IEEE80211_LEAVE = IWEVEXPIRED,
303 	__QDF_IEEE80211_SCAN = SIOCGIWSCAN,
304 	__QDF_IEEE80211_REPLAY = IWEVCUSTOM,
305 	__QDF_IEEE80211_MICHAEL = IWEVCUSTOM,
306 	__QDF_IEEE80211_REJOIN = IWEVCUSTOM,
307 	__QDF_CUSTOM_PUSH_BUTTON = IWEVCUSTOM,
308 };
309 
310 #define __qdf_print               printk
311 #define __qdf_vprint              vprintk
312 #define __qdf_snprint             snprintf
313 #define __qdf_vsnprint            vsnprintf
314 #define __qdf_toupper            toupper
315 #define qdf_kstrtoint            __qdf_kstrtoint
316 #define qdf_kstrtouint            __qdf_kstrtouint
317 
318 #define __qdf_kstrtoint          kstrtoint
319 #define __qdf_kstrtouint          kstrtouint
320 
321 #define __QDF_DMA_BIDIRECTIONAL  DMA_BIDIRECTIONAL
322 #define __QDF_DMA_TO_DEVICE      DMA_TO_DEVICE
323 #ifndef __ubicom32__
324 #define __QDF_DMA_FROM_DEVICE    DMA_FROM_DEVICE
325 #else
326 #define __QDF_DMA_FROM_DEVICE    DMA_TO_DEVICE
327 #endif
328 #define __qdf_inline             inline
329 
330 /*
331  * 1. GNU C/C++ Compiler
332  *
333  * How to detect gcc : __GNUC__
334  * How to detect gcc version :
335  *   major version : __GNUC__ (2 = 2.x, 3 = 3.x, 4 = 4.x)
336  *   minor version : __GNUC_MINOR__
337  *
338  * 2. Microsoft C/C++ Compiler
339  *
340  * How to detect msc : _MSC_VER
341  * How to detect msc version :
342  *   _MSC_VER (1200 = MSVC 6.0, 1300 = MSVC 7.0, ...)
343  *
344  */
345 
346 /*
347  * MACROs to help with compiler and OS specifics. May need to get a little
348  * more sophisticated than this and define these to specific 'VERSIONS' of
349  * the compiler and OS.  Until we have a need for that, lets go with this
350  */
351 #if defined(_MSC_VER)
352 
353 #define QDF_COMPILER_MSC
354 /* assuming that if we build with MSC, OS is WinMobile */
355 #define QDF_OS_WINMOBILE
356 
357 #elif defined(__GNUC__)
358 
359 #define QDF_COMPILER_GNUC
360 #define QDF_OS_LINUX /* assuming if building with GNUC, OS is Linux */
361 
362 #endif
363 
364 #if defined(QDF_COMPILER_MSC)
365 
366 
367 /*
368  * Does nothing on Windows.  packing individual structs is not
369  * supported on the Windows compiler
370  */
371 #define QDF_PACK_STRUCT_1
372 #define QDF_PACK_STRUCT_2
373 #define QDF_PACK_STRUCT_4
374 #define QDF_PACK_STRUCT_8
375 #define QDF_PACK_STRUCT_16
376 
377 #elif defined(QDF_COMPILER_GNUC)
378 
379 #else
380 #error "Compiling with an unknown compiler!!"
381 #endif
382 
383 #endif /* __I_QDF_TYPES_H */
384