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