1 /* 2 * Copyright (c) 2014-2020 The Linux Foundation. All rights reserved. 3 * Copyright (c) 2021-2023 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 69 #define __qdf_must_check __must_check 70 71 typedef struct sg_table __sgtable_t; 72 73 /* 74 * The IDs of the various system clocks 75 */ 76 #define __QDF_CLOCK_REALTIME CLOCK_REALTIME 77 #define __QDF_CLOCK_MONOTONIC CLOCK_MONOTONIC 78 79 /* 80 * Return values for the qdf_hrtimer_data_t callback function 81 */ 82 #define __QDF_HRTIMER_NORESTART HRTIMER_NORESTART 83 #define __QDF_HRTIMER_RESTART HRTIMER_RESTART 84 85 /* 86 * Mode arguments of qdf_hrtimer_data_t related functions 87 */ 88 #define __QDF_HRTIMER_MODE_ABS HRTIMER_MODE_ABS 89 #define __QDF_HRTIMER_MODE_REL HRTIMER_MODE_REL 90 #define __QDF_HRTIMER_MODE_PINNED HRTIMER_MODE_PINNED 91 92 #else 93 94 /* 95 * Hack - coexist with prior defs of dma_addr_t. 96 * Eventually all other defs of dma_addr_t should be removed. 97 * At that point, the "already_defined" wrapper can be removed. 98 */ 99 #ifndef __dma_addr_t_already_defined__ 100 #define __dma_addr_t_already_defined__ 101 typedef unsigned long dma_addr_t; 102 #endif 103 104 typedef unsigned long phys_addr_t; 105 typedef unsigned long __sgtable_t; 106 107 #ifndef SIOCGIWAP 108 #define SIOCGIWAP 0 109 #endif 110 111 #ifndef IWEVCUSTOM 112 #define IWEVCUSTOM 0 113 #endif 114 115 #ifndef IWEVREGISTERED 116 #define IWEVREGISTERED 0 117 #endif 118 119 #ifndef IWEVEXPIRED 120 #define IWEVEXPIRED 0 121 #endif 122 123 #ifndef SIOCGIWSCAN 124 #define SIOCGIWSCAN 0 125 #endif 126 127 #define DMA_TO_DEVICE 0 128 #define DMA_BIDIRECTIONAL 0 129 #define DMA_FROM_DEVICE 0 130 #define __QDF_CLOCK_REALTIME 0 131 #define __QDF_CLOCK_MONOTONIC 0 132 #define __QDF_HRTIMER_MODE_ABS 0 133 #define __QDF_HRTIMER_MODE_REL 0 134 #define __QDF_HRTIMER_MODE_PINNED 0 135 #define __QDF_HRTIMER_NORESTART 0 136 #define __QDF_HRTIMER_RESTART 0 137 #define __iomem 138 #endif /* __KERNEL__ */ 139 140 /* 141 * max sg that we support 142 */ 143 #define __QDF_MAX_SCATTER 1 144 #define __QDF_NSEC_PER_MSEC NSEC_PER_MSEC 145 #define __QDF_NSEC_PER_USEC NSEC_PER_USEC 146 #define __QDF_USEC_PER_MSEC USEC_PER_MSEC 147 #define __QDF_NSEC_PER_SEC NSEC_PER_SEC 148 149 #if defined(__LITTLE_ENDIAN_BITFIELD) 150 #define QDF_LITTLE_ENDIAN_MACHINE 151 #elif defined(__BIG_ENDIAN_BITFIELD) 152 #define QDF_BIG_ENDIAN_MACHINE 153 #else 154 #error "Please fix <asm/byteorder.h>" 155 #endif 156 157 #if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 20) || !defined(__KERNEL__) 158 #ifndef __bool_already_defined__ 159 #define __bool_already_defined__ 160 161 /** 162 * typedef bool - This is an enum for boolean 163 * @false: zero 164 * @true: one 165 */ 166 typedef enum bool { 167 false = 0, 168 true = 1, 169 } bool; 170 #endif /* __bool_already_defined__ */ 171 #endif 172 173 #define __qdf_packed __attribute__((packed)) 174 175 typedef int (*__qdf_os_intr)(void *); 176 /* 177 * Private definitions of general data types 178 */ 179 typedef dma_addr_t __qdf_dma_addr_t; 180 typedef size_t __qdf_dma_size_t; 181 typedef dma_addr_t __qdf_dma_context_t; 182 typedef struct napi_struct __qdf_napi_struct; 183 typedef struct net_device *__qdf_netdev_t; 184 typedef struct net_device_stats __qdf_net_dev_stats; 185 typedef struct cpumask __qdf_cpu_mask; 186 typedef __le16 __qdf_le16_t; 187 typedef __le32 __qdf_le32_t; 188 typedef __le64 __qdf_le64_t; 189 typedef __be16 __qdf_be16_t; 190 typedef __be32 __qdf_be32_t; 191 typedef __be64 __qdf_be64_t; 192 typedef struct net_device __qdf_dummy_netdev_t; 193 194 #if defined(IPA_OFFLOAD) && defined(__KERNEL__) 195 typedef struct ipa_wdi_buffer_info __qdf_mem_info_t; 196 #else 197 /** 198 * struct __qdf_shared_mem_info - shared mem info struct 199 * @pa : physical address 200 * @iova: i/o virtual address 201 * @size: allocated memory size 202 * @result: status 203 */ 204 typedef struct __qdf_shared_mem_info { 205 phys_addr_t pa; 206 unsigned long iova; 207 size_t size; 208 int result; 209 } __qdf_mem_info_t; 210 #endif /* IPA_OFFLOAD */ 211 212 #define qdf_dma_mem_context(context) dma_addr_t context 213 #define qdf_get_dma_mem_context(var, field) ((qdf_dma_context_t)(var->field)) 214 215 /** 216 * typedef __qdf_resource_t - qdf resource type 217 * @paddr: Physical address 218 * @vaddr: Virtual address 219 * @len: Length 220 */ 221 typedef struct __qdf_resource { 222 unsigned long paddr; 223 void __iomem *vaddr; 224 unsigned long len; 225 } __qdf_resource_t; 226 227 struct __qdf_mempool_ctxt; 228 229 #define MAX_MEM_POOLS 64 230 231 /** 232 * enum qdf_bus_type - Supported Bus types 233 * @QDF_BUS_TYPE_NONE: None Bus type for error check 234 * @QDF_BUS_TYPE_PCI: PCI Bus 235 * @QDF_BUS_TYPE_AHB: AHB Bus 236 * @QDF_BUS_TYPE_SNOC: SNOC Bus 237 * @QDF_BUS_TYPE_SIM: Simulator 238 * @QDF_BUS_TYPE_SDIO: SDIO 239 * @QDF_BUS_TYPE_USB: USB Bus 240 * @QDF_BUS_TYPE_IPCI: IPCI Bus 241 */ 242 enum qdf_bus_type { 243 QDF_BUS_TYPE_NONE = -1, 244 QDF_BUS_TYPE_PCI = 0, 245 QDF_BUS_TYPE_AHB, 246 QDF_BUS_TYPE_SNOC, 247 QDF_BUS_TYPE_SIM, 248 QDF_BUS_TYPE_SDIO, 249 QDF_BUS_TYPE_USB, 250 QDF_BUS_TYPE_IPCI 251 }; 252 253 /** 254 * struct __qdf_device - generic qdf device type 255 * @drv: Pointer to driver 256 * @drv_hdl: Pointer to driver handle 257 * @drv_name: Pointer to driver name 258 * @cnss_pdev: Pointer to platform device 259 * @irq: IRQ 260 * @dev: Pointer to device 261 * @res: QDF resource 262 * @func: Interrupt handler 263 * @mem_pool: array of pointers to mem pool context 264 * @bus_type: Bus type 265 * @bid: Bus ID 266 * @smmu_s1_enabled: SMMU S1 enabled or not 267 * @domain: domain type 268 * @iommu_mapping: DMA iommu mapping pointer 269 */ 270 struct __qdf_device { 271 void *drv; 272 void *drv_hdl; 273 char *drv_name; 274 void *cnss_pdev; 275 int irq; 276 struct device *dev; 277 __qdf_resource_t res; 278 __qdf_os_intr func; 279 struct __qdf_mempool_ctxt *mem_pool[MAX_MEM_POOLS]; 280 enum qdf_bus_type bus_type; 281 const struct hif_bus_id *bid; 282 bool smmu_s1_enabled; 283 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 0)) 284 struct iommu_domain *domain; 285 #else 286 #ifdef ENABLE_SMMU_S1_TRANSLATION 287 struct dma_iommu_mapping *iommu_mapping; 288 #endif 289 #endif 290 }; 291 typedef struct __qdf_device *__qdf_device_t; 292 293 typedef size_t __qdf_size_t; 294 typedef off_t __qdf_off_t; 295 typedef void __iomem* __qdf_iomem_t; 296 297 typedef uint32_t ath_dma_addr_t; 298 299 /** 300 * typedef __qdf_segment_t - segment of memory 301 * @daddr: dma address 302 * @len: length of segment 303 */ 304 typedef struct __qdf_segment { 305 dma_addr_t daddr; 306 uint32_t len; 307 } __qdf_segment_t; 308 309 /** 310 * struct __qdf_dma_map: dma map of memory 311 * @mapped: mapped address 312 * @nsegs: number of segments 313 * @coherent: coherency status 314 * @seg: segment of memory 315 */ 316 struct __qdf_dma_map { 317 uint32_t mapped; 318 uint32_t nsegs; 319 uint32_t coherent; 320 __qdf_segment_t seg[__QDF_MAX_SCATTER]; 321 }; 322 typedef struct __qdf_dma_map *__qdf_dma_map_t; 323 324 /** 325 * enum __qdf_net_wireless_evcode: enum for event code 326 * @__QDF_IEEE80211_ASSOC: association event code 327 * @__QDF_IEEE80211_REASSOC: reassociation event code 328 * @__QDF_IEEE80211_DISASSOC: disassociation event code 329 * @__QDF_IEEE80211_JOIN: join event code 330 * @__QDF_IEEE80211_LEAVE: leave event code 331 * @__QDF_IEEE80211_SCAN: scan event code 332 * @__QDF_IEEE80211_REPLAY: replay event code 333 * @__QDF_IEEE80211_MICHAEL:michael event code 334 * @__QDF_IEEE80211_REJOIN: rejoin event code 335 * @__QDF_CUSTOM_PUSH_BUTTON: push button event code 336 */ 337 enum __qdf_net_wireless_evcode { 338 __QDF_IEEE80211_ASSOC = SIOCGIWAP, 339 __QDF_IEEE80211_REASSOC = IWEVCUSTOM, 340 __QDF_IEEE80211_DISASSOC = SIOCGIWAP, 341 __QDF_IEEE80211_JOIN = IWEVREGISTERED, 342 __QDF_IEEE80211_LEAVE = IWEVEXPIRED, 343 __QDF_IEEE80211_SCAN = SIOCGIWSCAN, 344 __QDF_IEEE80211_REPLAY = IWEVCUSTOM, 345 __QDF_IEEE80211_MICHAEL = IWEVCUSTOM, 346 __QDF_IEEE80211_REJOIN = IWEVCUSTOM, 347 __QDF_CUSTOM_PUSH_BUTTON = IWEVCUSTOM, 348 }; 349 350 #define __qdf_snprint snprintf 351 #define __qdf_vsnprint vsnprintf 352 #define __qdf_toupper toupper 353 #define qdf_kstrtoint __qdf_kstrtoint 354 #define qdf_kstrtouint __qdf_kstrtouint 355 356 #define __qdf_kstrtoint kstrtoint 357 #define __qdf_kstrtouint kstrtouint 358 359 #define __QDF_DMA_BIDIRECTIONAL DMA_BIDIRECTIONAL 360 #define __QDF_DMA_TO_DEVICE DMA_TO_DEVICE 361 #ifndef __ubicom32__ 362 #define __QDF_DMA_FROM_DEVICE DMA_FROM_DEVICE 363 #else 364 #define __QDF_DMA_FROM_DEVICE DMA_TO_DEVICE 365 #endif 366 #define __qdf_inline inline 367 368 /* 369 * 1. GNU C/C++ Compiler 370 * 371 * How to detect gcc : __GNUC__ 372 * How to detect gcc version : 373 * major version : __GNUC__ (2 = 2.x, 3 = 3.x, 4 = 4.x) 374 * minor version : __GNUC_MINOR__ 375 * 376 * 2. Microsoft C/C++ Compiler 377 * 378 * How to detect msc : _MSC_VER 379 * How to detect msc version : 380 * _MSC_VER (1200 = MSVC 6.0, 1300 = MSVC 7.0, ...) 381 * 382 */ 383 384 /* 385 * MACROs to help with compiler and OS specifics. May need to get a little 386 * more sophisticated than this and define these to specific 'VERSIONS' of 387 * the compiler and OS. Until we have a need for that, lets go with this 388 */ 389 #if defined(_MSC_VER) 390 391 #define QDF_COMPILER_MSC 392 /* assuming that if we build with MSC, OS is WinMobile */ 393 #define QDF_OS_WINMOBILE 394 395 #elif defined(__GNUC__) 396 397 #define QDF_COMPILER_GNUC 398 #define QDF_OS_LINUX /* assuming if building with GNUC, OS is Linux */ 399 400 #endif 401 402 #if defined(QDF_COMPILER_MSC) 403 404 405 /* 406 * Does nothing on Windows. packing individual structs is not 407 * supported on the Windows compiler 408 */ 409 #define QDF_PACK_STRUCT_1 410 #define QDF_PACK_STRUCT_2 411 #define QDF_PACK_STRUCT_4 412 #define QDF_PACK_STRUCT_8 413 #define QDF_PACK_STRUCT_16 414 415 #elif defined(QDF_COMPILER_GNUC) 416 417 #else 418 #error "Compiling with an unknown compiler!!" 419 #endif 420 421 #ifndef fallthrough 422 423 #define fallthrough do {} while (0) /* fallthrough */ 424 425 #endif 426 427 #endif /* __I_QDF_TYPES_H */ 428