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