xref: /wlan-dirver/qca-wifi-host-cmn/qdf/inc/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: qdf_types.h
21  * QCA driver framework (QDF) basic type definitions
22  */
23 
24 #if !defined(__QDF_TYPES_H)
25 #define __QDF_TYPES_H
26 
27 #ifndef CONFIG_MCL
28 #if !defined(__printf)
29 #define __printf(a, b)
30 #endif
31 #endif
32 
33 #define qdf_must_check __qdf_must_check
34 
35 /* Include Files */
36 #include <i_qdf_types.h>
37 #include <stdarg.h>
38 #ifdef TSOSEG_DEBUG
39 #include <qdf_atomic.h>
40 #endif
41 #include "qdf_status.h"
42 
43 /* Preprocessor definitions and constants */
44 #define QDF_MAX_SGLIST 4
45 
46 /**
47  * struct qdf_sglist - scatter-gather list
48  * @nsegs: total number of segments
49  * struct __sg_segs - scatter-gather segment list
50  * @vaddr: Virtual address of the segment
51  * @len: Length of the segment
52  */
53 typedef struct qdf_sglist {
54 	uint32_t nsegs;
55 	struct __sg_segs {
56 		uint8_t  *vaddr;
57 		uint32_t len;
58 	} sg_segs[QDF_MAX_SGLIST];
59 } qdf_sglist_t;
60 
61 #define QDF_MAX_SCATTER __QDF_MAX_SCATTER
62 #define QDF_NSEC_PER_MSEC __QDF_NSEC_PER_MSEC
63 
64 /**
65  * QDF_SWAP_U16 - swap input u16 value
66  * @_x: variable to swap
67  */
68 #define QDF_SWAP_U16(_x) \
69 	((((_x) << 8) & 0xFF00) | (((_x) >> 8) & 0x00FF))
70 
71 /**
72  * QDF_SWAP_U32 - swap input u32 value
73  * @_x: variable to swap
74  */
75 #define QDF_SWAP_U32(_x) \
76 	(((((_x) << 24) & 0xFF000000) | (((_x) >> 24) & 0x000000FF)) | \
77 	 ((((_x) << 8) & 0x00FF0000) | (((_x) >> 8) & 0x0000FF00)))
78 
79 /* ticks per second */
80 #define QDF_TICKS_PER_SECOND (1000)
81 
82 /**
83  * QDF_ARRAY_SIZE - get array size
84  * @_arr: array variable name
85  */
86 #define QDF_ARRAY_SIZE(_arr) (sizeof(_arr) / sizeof((_arr)[0]))
87 
88 #define QDF_MAX_SCATTER __QDF_MAX_SCATTER
89 
90 /**
91  * qdf_packed - denotes structure is packed.
92  */
93 #define qdf_packed __qdf_packed
94 
95 /**
96  * qdf_toupper - char lower to upper.
97  */
98 #define qdf_toupper __qdf_toupper
99 
100 typedef void *qdf_net_handle_t;
101 
102 typedef void *qdf_netlink_handle_t;
103 typedef void *qdf_drv_handle_t;
104 typedef void *qdf_os_handle_t;
105 typedef void *qdf_pm_t;
106 
107 
108 /**
109  * typedef qdf_handle_t - handles opaque to each other
110  */
111 typedef void *qdf_handle_t;
112 
113 /**
114  * typedef qdf_device_t - Platform/bus generic handle.
115  * Used for bus specific functions.
116  */
117 typedef __qdf_device_t qdf_device_t;
118 
119 /* Byte order identifiers */
120 typedef __qdf_le16_t qdf_le16_t;
121 typedef __qdf_le32_t qdf_le32_t;
122 typedef __qdf_le64_t qdf_le64_t;
123 typedef __qdf_be16_t qdf_be16_t;
124 typedef __qdf_be32_t qdf_be32_t;
125 typedef __qdf_be64_t qdf_be64_t;
126 
127 /**
128  * typedef qdf_size_t - size of an object
129  */
130 typedef __qdf_size_t qdf_size_t;
131 
132 /**
133  * typedef __qdf_off_t - offset for API's that need them.
134  */
135 typedef __qdf_off_t      qdf_off_t;
136 
137 /**
138  * typedef qdf_dma_map_t - DMA mapping object.
139  */
140 typedef __qdf_dma_map_t qdf_dma_map_t;
141 
142 /**
143  * tyepdef qdf_dma_addr_t - DMA address.
144  */
145 typedef __qdf_dma_addr_t qdf_dma_addr_t;
146 
147 /**
148  * typedef __qdf_dma_size_t - DMA size.
149  */
150 typedef __qdf_dma_size_t     qdf_dma_size_t;
151 
152 /**
153  * tyepdef qdf_dma_context_t - DMA context.
154  */
155 typedef __qdf_dma_context_t qdf_dma_context_t;
156 
157 typedef __qdf_mem_info_t qdf_mem_info_t;
158 typedef __sgtable_t sgtable_t;
159 
160 /**
161  * pointer to net device
162  */
163 typedef __qdf_netdev_t qdf_netdev_t;
164 
165 /**
166  * struct qdf_dma_map_info - Information inside a DMA map.
167  * @nsegs: total number mapped segments
168  * struct __dma_segs - Information of physical address.
169  * @paddr: physical(dam'able) address of the segment
170  * @len: length of the segment
171  */
172 typedef struct qdf_dma_map_info {
173 	uint32_t nsegs;
174 	struct __dma_segs {
175 		qdf_dma_addr_t paddr;
176 		qdf_dma_size_t len;
177 	} dma_segs[QDF_MAX_SCATTER];
178 } qdf_dmamap_info_t;
179 
180 /**
181  * struct qdf_shared_mem - Shared memory resource
182  * @mem_info: memory info struct
183  * @vaddr: virtual address
184  * @sgtable: scatter-gather table
185  * @memctx: dma address
186  */
187 typedef struct qdf_shared_mem {
188 	qdf_mem_info_t mem_info;
189 	void *vaddr;
190 	sgtable_t sgtable;
191 	qdf_dma_mem_context(memctx);
192 } qdf_shared_mem_t;
193 
194 #define qdf_iomem_t __qdf_iomem_t;
195 
196 /**
197  * typedef enum QDF_TIMER_TYPE - QDF timer type
198  * @QDF_TIMER_TYPE_SW: Deferrable SW timer it will not cause CPU to wake up
199  * on expiry
200  * @QDF_TIMER_TYPE_WAKE_APPS: Non deferrable timer which will cause CPU to
201  * wake up on expiry
202  */
203 typedef enum {
204 	QDF_TIMER_TYPE_SW,
205 	QDF_TIMER_TYPE_WAKE_APPS
206 } QDF_TIMER_TYPE;
207 
208 /**
209  * tyepdef qdf_resource_type_t - hw resources
210  * @QDF_RESOURCE_TYPE_MEM: memory resource
211  * @QDF_RESOURCE_TYPE_IO: io resource
212  * Define the hw resources the OS has allocated for the device
213  * Note that start defines a mapped area.
214  */
215 typedef enum {
216 	QDF_RESOURCE_TYPE_MEM,
217 	QDF_RESOURCE_TYPE_IO,
218 } qdf_resource_type_t;
219 
220 /**
221  * tyepdef qdf_resource_t - representation of a h/w resource.
222  * @start: start
223  * @end: end
224  * @type: resource type
225  */
226 typedef struct {
227 	uint64_t start;
228 	uint64_t end;
229 	qdf_resource_type_t type;
230 } qdf_resource_t;
231 
232 /**
233  * typedef qdf_dma_dir_t - DMA directions
234  * @QDF_DMA_BIDIRECTIONAL: bidirectional data
235  * @QDF_DMA_TO_DEVICE: data going from device to memory
236  * @QDF_DMA_FROM_DEVICE: data going from memory to device
237  */
238 typedef enum {
239 	QDF_DMA_BIDIRECTIONAL = __QDF_DMA_BIDIRECTIONAL,
240 	QDF_DMA_TO_DEVICE = __QDF_DMA_TO_DEVICE,
241 	QDF_DMA_FROM_DEVICE = __QDF_DMA_FROM_DEVICE,
242 } qdf_dma_dir_t;
243 
244 /**
245  * enum qdf_driver_type - Indicate the driver type and based on this
246  * do appropriate initialization.
247  *
248  * @QDF_DRIVER_TYPE_PRODUCTION: Driver used in the production
249  * @QDF_DRIVER_TYPE_MFG: Driver used in the Factory
250  * @QDF_DRIVER_TYPE_INVALID: Invalid and unrecognized type
251  *
252  */
253 enum qdf_driver_type {
254 	QDF_DRIVER_TYPE_PRODUCTION = 0,
255 	QDF_DRIVER_TYPE_MFG = 1,
256 	QDF_DRIVER_TYPE_INVALID = 0x7FFFFFFF
257 };
258 
259 /* work queue(kernel thread)/DPC function callback */
260 typedef void (*qdf_defer_fn_t)(void *);
261 
262 /*
263  * Prototype of the critical region function that is to be
264  * executed with spinlock held and interrupt disalbed
265  */
266 typedef bool (*qdf_irqlocked_func_t)(void *);
267 
268 #define qdf_offsetof(type, field) offsetof(type, field)
269 
270 /**
271  * typedef enum QDF_MODULE_ID  - Debug category level
272  * @QDF_MODULE_ID_MIN: The smallest/starting module id
273  * @QDF_MODULE_ID_TDLS: TDLS
274  * @QDF_MODULE_ID_ACS: auto channel selection
275  * @QDF_MODULE_ID_SCAN_SM: scan state machine
276  * @QDF_MODULE_ID_SCANENTRY: scan entry
277  * @QDF_MODULE_ID_WDS: WDS handling
278  * @QDF_MODULE_ID_ACTION: action management frames
279  * @QDF_MODULE_ID_ROAM: sta mode roaming
280  * @QDF_MODULE_ID_INACT: inactivity handling
281  * @QDF_MODULE_ID_DOTH: 11.h
282  * @QDF_MODULE_ID_IQUE: IQUE features
283  * @QDF_MODULE_ID_WME: WME protocol
284  * @QDF_MODULE_ID_ACL: ACL handling
285  * @QDF_MODULE_ID_WPA: WPA/RSN protocol
286  * @QDF_MODULE_ID_RADKEYS: dump 802.1x keys
287  * @QDF_MODULE_ID_RADDUMP: dump 802.1x radius packets
288  * @QDF_MODULE_ID_RADIUS: 802.1x radius client
289  * @QDF_MODULE_ID_DOT1XSM: 802.1x state machine
290  * @QDF_MODULE_ID_DOT1X: 802.1x authenticator
291  * @QDF_MODULE_ID_POWER: power save handling
292  * @QDF_MODULE_ID_STATS: state machine
293  * @QDF_MODULE_ID_OUTPUT: output handling
294  * @QDF_MODULE_ID_SCAN: scanning
295  * @QDF_MODULE_ID_AUTH: authentication handling
296  * @QDF_MODULE_ID_ASSOC: association handling
297  * @QDF_MODULE_ID_NODE: node handling
298  * @QDF_MODULE_ID_ELEMID: element id parsing
299  * @QDF_MODULE_ID_XRATE: rate set handling
300  * @QDF_MODULE_ID_INPUT: input handling
301  * @QDF_MODULE_ID_CRYPTO: crypto work
302  * @QDF_MODULE_ID_DUMPPKTS: IFF_LINK2 equivalant
303  * @QDF_MODULE_ID_DEBUG: IFF_DEBUG equivalent
304  * @QDF_MODULE_ID_MLME: MLME
305  * @QDF_MODULE_ID_RRM: Radio resource measurement
306  * @QDF_MODULE_ID_WNM: Wireless Network Management
307  * @QDF_MODULE_ID_P2P_PROT: P2P Protocol driver
308  * @QDF_MODULE_ID_PROXYARP: 11v Proxy ARP
309  * @QDF_MODULE_ID_L2TIF: Hotspot 2.0 L2 TIF
310  * @QDF_MODULE_ID_WIFIPOS: WifiPositioning Feature
311  * @QDF_MODULE_ID_WRAP: WRAP or Wireless ProxySTA
312  * @QDF_MODULE_ID_DFS: DFS debug mesg
313  * @QDF_MODULE_ID_TLSHIM: TLSHIM module ID
314  * @QDF_MODULE_ID_WMI: WMI module ID
315  * @QDF_MODULE_ID_HTT: HTT module ID
316  * @QDF_MODULE_ID_HDD: HDD module ID
317  * @QDF_MODULE_ID_SME: SME module ID
318  * @QDF_MODULE_ID_PE: PE module ID
319  * @QDF_MODULE_ID_WMA: WMA module ID
320  * @QDF_MODULE_ID_SYS: SYS module ID
321  * @QDF_MODULE_ID_QDF: QDF module ID
322  * @QDF_MODULE_ID_SAP: SAP module ID
323  * @QDF_MODULE_ID_HDD_SOFTAP: HDD SAP module ID
324  * @QDF_MODULE_ID_HDD_DATA: HDD DATA module ID
325  * @QDF_MODULE_ID_HDD_SAP_DATA: HDD SAP DATA module ID
326  * @QDF_MODULE_ID_HIF: HIF module ID
327  * @QDF_MODULE_ID_HTC: HTC module ID
328  * @QDF_MODULE_ID_TXRX: TXRX module ID
329  * @QDF_MODULE_ID_QDF_DEVICE: QDF DEVICE module ID
330  * @QDF_MODULE_ID_CFG: CFG module ID
331  * @QDF_MODULE_ID_BMI: BMI module ID
332  * @QDF_MODULE_ID_EPPING: EPPING module ID
333  * @QDF_MODULE_ID_QVIT: QVIT module ID
334  * @QDF_MODULE_ID_DP: Data-path module ID
335  * @QDF_MODULE_ID_HAL: Hal abstraction module ID
336  * @QDF_MODULE_ID_SOC: SOC module ID
337  * @QDF_MODULE_ID_OS_IF: OS-interface module ID
338  * @QDF_MODULE_ID_TARGET_IF: targer interface module ID
339  * @QDF_MODULE_ID_SCHEDULER: schduler module ID
340  * @QDF_MODULE_ID_MGMT_TXRX: management TX/RX module ID
341  * @QDF_MODULE_ID_SERIALIZATION: serialization module ID
342  * @QDF_MODULE_ID_PMO: PMO (power manager and offloads) Module ID
343  * @QDF_MODULE_ID_P2P: P2P module ID
344  * @QDF_MODULE_ID_POLICY_MGR: Policy Manager module ID
345  * @QDF_MODULE_ID_CONFIG: CFG (configuration) component ID
346  * @QDF_MODULE_ID_REGULATORY: REGULATORY module ID
347  * @QDF_MODULE_ID_NAN: NAN module ID
348  * @QDF_MODULE_ID_SPECTRAL: Spectral module ID
349  * @QDF_MODULE_ID_ROAM_DEBUG: Roam Debug logging
350  * @QDF_MODULE_ID_CDP: Converged Data Path module ID
351  * @QDF_MODULE_ID_DIRECT_BUF_RX: Direct Buffer Receive module ID
352  * @QDF_MODULE_ID_DISA: DISA (encryption test) module ID
353  * @QDF_MODULE_ID_GREEN_AP: Green AP related logging
354  * @QDF_MODULE_ID_FTM: FTM module ID
355  * @QDF_MODULE_ID_EXTAP: Extender AP module ID
356  * @QDF_MODULE_ID_FD: FILS discovery logging
357  * @QDF_MODULE_ID_OCB: OCB module ID
358  * @QDF_MODULE_ID_IPA: IPA module ID
359  * @QDF_MODULE_ID_CP_STATS: Control Plane Statistics ID
360  * @QDF_MODULE_ID_ACTION_OUI: ACTION OUI module ID
361  * @QDF_MODULE_ID_TARGET: Target module ID
362  * @QDF_MODULE_ID_MBSSIE: MBSS IE ID
363  * @QDF_MODULE_ID_FWOL: FW Offload module ID
364  * @QDF_MODULE_ID_SM_ENGINE: SM engine module ID
365  * @QDF_MODULE_ID_CMN_MLME: CMN MLME module ID
366  * @QDF_MODULE_ID_CFR: CFR module ID
367  * @QDF_MODULE_ID_TX_CAPTURE: Tx capture enhancement feature ID
368  * @QDF_MODULE_ID_INTEROP_ISSUES_AP: interop issues ap module ID
369  * @QDF_MODULE_ID_ANY: anything
370  * @QDF_MODULE_ID_MAX: Max place holder module ID
371  */
372 typedef enum {
373 	QDF_MODULE_ID_MIN       = 0,
374 	QDF_MODULE_ID_TDLS      = QDF_MODULE_ID_MIN,
375 	QDF_MODULE_ID_ACS,
376 	QDF_MODULE_ID_SCAN_SM,
377 	QDF_MODULE_ID_SCANENTRY,
378 	QDF_MODULE_ID_WDS,
379 	QDF_MODULE_ID_ACTION,
380 	QDF_MODULE_ID_ROAM,
381 	QDF_MODULE_ID_INACT,
382 	QDF_MODULE_ID_DOTH      = 8,
383 	QDF_MODULE_ID_IQUE,
384 	QDF_MODULE_ID_WME,
385 	QDF_MODULE_ID_ACL,
386 	QDF_MODULE_ID_WPA,
387 	QDF_MODULE_ID_RADKEYS,
388 	QDF_MODULE_ID_RADDUMP,
389 	QDF_MODULE_ID_RADIUS,
390 	QDF_MODULE_ID_DOT1XSM   = 16,
391 	QDF_MODULE_ID_DOT1X,
392 	QDF_MODULE_ID_POWER,
393 	QDF_MODULE_ID_STATE,
394 	QDF_MODULE_ID_OUTPUT,
395 	QDF_MODULE_ID_SCAN,
396 	QDF_MODULE_ID_AUTH,
397 	QDF_MODULE_ID_ASSOC,
398 	QDF_MODULE_ID_NODE      = 24,
399 	QDF_MODULE_ID_ELEMID,
400 	QDF_MODULE_ID_XRATE,
401 	QDF_MODULE_ID_INPUT,
402 	QDF_MODULE_ID_CRYPTO,
403 	QDF_MODULE_ID_DUMPPKTS,
404 	QDF_MODULE_ID_DEBUG,
405 	QDF_MODULE_ID_MLME,
406 	QDF_MODULE_ID_RRM       = 32,
407 	QDF_MODULE_ID_WNM,
408 	QDF_MODULE_ID_P2P_PROT,
409 	QDF_MODULE_ID_PROXYARP,
410 	QDF_MODULE_ID_L2TIF,
411 	QDF_MODULE_ID_WIFIPOS,
412 	QDF_MODULE_ID_WRAP,
413 	QDF_MODULE_ID_DFS,
414 	QDF_MODULE_ID_ATF       = 40,
415 	QDF_MODULE_ID_SPLITMAC,
416 	QDF_MODULE_ID_IOCTL,
417 	QDF_MODULE_ID_NAC,
418 	QDF_MODULE_ID_MESH,
419 	QDF_MODULE_ID_MBO,
420 	QDF_MODULE_ID_EXTIOCTL_CHANSWITCH,
421 	QDF_MODULE_ID_EXTIOCTL_CHANSSCAN,
422 	QDF_MODULE_ID_TLSHIM    = 48,
423 	QDF_MODULE_ID_WMI,
424 	QDF_MODULE_ID_HTT,
425 	QDF_MODULE_ID_HDD,
426 	QDF_MODULE_ID_SME,
427 	QDF_MODULE_ID_PE,
428 	QDF_MODULE_ID_WMA,
429 	QDF_MODULE_ID_SYS,
430 	QDF_MODULE_ID_QDF       = 56,
431 	QDF_MODULE_ID_SAP,
432 	QDF_MODULE_ID_HDD_SOFTAP,
433 	QDF_MODULE_ID_HDD_DATA,
434 	QDF_MODULE_ID_HDD_SAP_DATA,
435 	QDF_MODULE_ID_HIF,
436 	QDF_MODULE_ID_HTC,
437 	QDF_MODULE_ID_TXRX,
438 	QDF_MODULE_ID_QDF_DEVICE = 64,
439 	QDF_MODULE_ID_CFG,
440 	QDF_MODULE_ID_BMI,
441 	QDF_MODULE_ID_EPPING,
442 	QDF_MODULE_ID_QVIT,
443 	QDF_MODULE_ID_DP,
444 	QDF_MODULE_ID_HAL,
445 	QDF_MODULE_ID_SOC,
446 	QDF_MODULE_ID_OS_IF,
447 	QDF_MODULE_ID_TARGET_IF,
448 	QDF_MODULE_ID_SCHEDULER,
449 	QDF_MODULE_ID_MGMT_TXRX,
450 	QDF_MODULE_ID_SERIALIZATION,
451 	QDF_MODULE_ID_PMO,
452 	QDF_MODULE_ID_P2P,
453 	QDF_MODULE_ID_POLICY_MGR,
454 	QDF_MODULE_ID_CONFIG,
455 	QDF_MODULE_ID_REGULATORY,
456 	QDF_MODULE_ID_SA_API,
457 	QDF_MODULE_ID_NAN,
458 	QDF_MODULE_ID_OFFCHAN_TXRX,
459 	QDF_MODULE_ID_SON,
460 	QDF_MODULE_ID_SPECTRAL,
461 	QDF_MODULE_ID_OBJ_MGR,
462 	QDF_MODULE_ID_NSS,
463 	QDF_MODULE_ID_ROAM_DEBUG,
464 	QDF_MODULE_ID_CDP,
465 	QDF_MODULE_ID_DIRECT_BUF_RX,
466 	QDF_MODULE_ID_DISA,
467 	QDF_MODULE_ID_GREEN_AP,
468 	QDF_MODULE_ID_FTM,
469 	QDF_MODULE_ID_EXTAP,
470 	QDF_MODULE_ID_FD,
471 	QDF_MODULE_ID_OCB,
472 	QDF_MODULE_ID_IPA,
473 	QDF_MODULE_ID_CP_STATS,
474 	QDF_MODULE_ID_ACTION_OUI,
475 	QDF_MODULE_ID_TARGET,
476 	QDF_MODULE_ID_MBSSIE,
477 	QDF_MODULE_ID_FWOL,
478 	QDF_MODULE_ID_SM_ENGINE,
479 	QDF_MODULE_ID_CMN_MLME,
480 	QDF_MODULE_ID_BSSCOLOR,
481 	QDF_MODULE_ID_CFR,
482 	QDF_MODULE_ID_TX_CAPTURE,
483 	QDF_MODULE_ID_INTEROP_ISSUES_AP,
484 	QDF_MODULE_ID_ANY,
485 	QDF_MODULE_ID_MAX,
486 } QDF_MODULE_ID;
487 
488 /**
489  * typedef enum QDF_TRACE_LEVEL - Debug verbose level
490  * @QDF_TRACE_LEVEL_NONE: no trace will be logged. This value is in place
491  *			  for the qdf_trace_setlevel() to allow the user
492  *			  to turn off all traces
493  * @QDF_TRACE_LEVEL_FATAL: Indicates fatal error conditions
494  * @QDF_TRACE_LEVEL_ERROR: Indicates error conditions
495  * @QDF_TRACE_LEVEL_WARN: May indicate that an error will occur if action
496  *			  is not taken
497  * @QDF_TRACE_LEVEL_INFO: Normal operational messages that require no action
498  * @QDF_TRACE_LEVEL_INFO_HIGH: High level operational messages that require
499  *			       no action
500  * @QDF_TRACE_LEVEL_INFO_MED: Middle level operational messages that require
501  *			      no action
502  * @QDF_TRACE_LEVEL_INFO_LOW: Low level operational messages that require
503  *			      no action
504  * @QDF_TRACE_LEVEL_DEBUG: Information useful to developers for debugging
505  * @QDF_TRACE_LEVEL_TRACE: Indicates trace level for automation scripts,
506  *			whenever there is a context switch in driver, one
507  *			print using this trace level will be added with
508  *			the help of qdf_trace api.
509  * @QDF_TRACE_LEVEL_ALL: All trace levels
510  * @QDF_TRACE_LEVEL_MAX: Max trace level
511  */
512 typedef enum {
513 	QDF_TRACE_LEVEL_NONE,
514 	QDF_TRACE_LEVEL_FATAL,
515 	QDF_TRACE_LEVEL_ERROR,
516 	QDF_TRACE_LEVEL_WARN,
517 	QDF_TRACE_LEVEL_INFO,
518 	QDF_TRACE_LEVEL_INFO_HIGH,
519 	QDF_TRACE_LEVEL_INFO_MED,
520 	QDF_TRACE_LEVEL_INFO_LOW,
521 	QDF_TRACE_LEVEL_DEBUG,
522 	QDF_TRACE_LEVEL_TRACE,
523 	QDF_TRACE_LEVEL_ALL,
524 	QDF_TRACE_LEVEL_MAX
525 } QDF_TRACE_LEVEL;
526 
527 /**
528  * enum QDF_OPMODE - vdev operating mode
529  * @QDF_STA_MODE: STA mode
530  * @QDF_SAP_MODE: SAP mode
531  * @QDF_P2P_CLIENT_MODE: P2P client mode
532  * @QDF_P2P_GO_MODE: P2P GO mode
533  * @QDF_FTM_MODE: FTM mode
534  * @QDF_IBSS_MODE: IBSS mode
535  * @QDF_MONITOR_MODE: Monitor mode
536  * @QDF_P2P_DEVICE_MODE: P2P device mode
537  * @QDF_OCB_MODE: OCB device mode
538  * @QDF_EPPING_MODE: EPPING device mode
539  * @QDF_QVIT_MODE: QVIT device mode
540  * @QDF_NDI_MODE: NAN datapath mode
541  * @QDF_WDS_MODE: WDS mode
542  * @QDF_BTAMP_MODE: BTAMP mode
543  * @QDF_AHDEMO_MODE: AHDEMO mode
544  * @QDF_TDLS_MODE: TDLS device mode
545  * @QDF_NAN_DISC_MODE: NAN Discovery device mode
546  * @QDF_MAX_NO_OF_MODE: Max place holder
547  *
548  * These are generic IDs that identify the various roles
549  * in the software system
550  */
551 enum QDF_OPMODE {
552 	QDF_STA_MODE,
553 	QDF_SAP_MODE,
554 	QDF_P2P_CLIENT_MODE,
555 	QDF_P2P_GO_MODE,
556 	QDF_FTM_MODE,
557 	QDF_IBSS_MODE,
558 	QDF_MONITOR_MODE,
559 	QDF_P2P_DEVICE_MODE,
560 	QDF_OCB_MODE,
561 	QDF_EPPING_MODE,
562 	QDF_QVIT_MODE,
563 	QDF_NDI_MODE,
564 	QDF_WDS_MODE,
565 	QDF_BTAMP_MODE,
566 	QDF_AHDEMO_MODE,
567 	QDF_TDLS_MODE,
568 	QDF_NAN_DISC_MODE,
569 
570 	/* Add new OP Modes to qdf_opmode_str as well */
571 
572 	QDF_MAX_NO_OF_MODE
573 };
574 
575 /**
576  * qdf_opmode_str() - Return a human readable string representation of @opmode
577  * @opmode: The opmode to convert
578  *
579  * Return: string representation of @opmode
580  */
581 const char *qdf_opmode_str(const enum QDF_OPMODE opmode);
582 
583 /**
584  * enum QDF_GLOBAL_MODE - global mode when driver is loaded.
585  *
586  * @QDF_GLOBAL_MISSION_MODE: mission mode (STA, SAP...)
587  * @QDF_GLOBAL_MONITOR_MODE: Monitor Mode
588  * @QDF_GLOBAL_FTM_MODE: FTM mode
589  * @QDF_GLOBAL_IBSS_MODE: IBSS mode
590  * @QDF_GLOBAL_EPPING_MODE: EPPING mode
591  * @QDF_GLOBAL_QVIT_MODE: QVIT global mode
592  * @QDF_GLOBAL_MAX_MODE: Max place holder
593  */
594 enum QDF_GLOBAL_MODE {
595 	QDF_GLOBAL_MISSION_MODE,
596 	QDF_GLOBAL_WALTEST_MODE = 3,
597 	QDF_GLOBAL_MONITOR_MODE = 4,
598 	QDF_GLOBAL_FTM_MODE = 5,
599 	QDF_GLOBAL_IBSS_MODE = 6,
600 	QDF_GLOBAL_COLDBOOT_CALIB_MODE = 7,
601 	QDF_GLOBAL_EPPING_MODE = 8,
602 	QDF_GLOBAL_QVIT_MODE = 9,
603 	QDF_GLOBAL_MAX_MODE
604 };
605 
606 #define  QDF_IS_EPPING_ENABLED(mode) (mode == QDF_GLOBAL_EPPING_MODE)
607 
608 /**
609  * qdf_trace_msg()- logging API
610  * @module: Module identifier. A member of the QDF_MODULE_ID enumeration that
611  *	    identifies the module issuing the trace message.
612  * @level: Trace level. A member of the QDF_TRACE_LEVEL enumeration indicating
613  *	   the severity of the condition causing the trace message to be issued.
614  *	   More severe conditions are more likely to be logged.
615  * @str_format: Format string. The message to be logged. This format string
616  *	       contains printf-like replacement parameters, which follow this
617  *	       parameter in the variable argument list.
618  *
619  * Users wishing to add tracing information to their code should use
620  * QDF_TRACE.  QDF_TRACE() will compile into a call to qdf_trace_msg() when
621  * tracing is enabled.
622  *
623  * Return: nothing
624  *
625  * implemented in qdf_trace.c
626  */
627 void __printf(3, 4) qdf_trace_msg(QDF_MODULE_ID module, QDF_TRACE_LEVEL level,
628 				  const char *str_format, ...);
629 /**
630  * qdf_vtrace_msg() - the va_list version of qdf_trace_msg
631  * @module: the calling module's Id
632  * @level: the logging level to log using
633  * @str_format: the log format string
634  * @val: the va_list containing the values to format according to str_format
635  *
636  * Return: None
637  */
638 void qdf_vtrace_msg(QDF_MODULE_ID module, QDF_TRACE_LEVEL level,
639 		    const char *str_format, va_list val);
640 
641 #ifdef CONFIG_MCL
642 
643 #define qdf_print(params...) QDF_TRACE_ERROR(QDF_MODULE_ID_QDF, ## params)
644 #define qdf_alert(params...) QDF_TRACE_FATAL(QDF_MODULE_ID_QDF, ## params)
645 #define qdf_err(params...) QDF_TRACE_ERROR(QDF_MODULE_ID_QDF, ## params)
646 #define qdf_warn(params...) QDF_TRACE_WARN(QDF_MODULE_ID_QDF, ## params)
647 #define qdf_info(params...) QDF_TRACE_INFO(QDF_MODULE_ID_QDF, ## params)
648 #define qdf_debug(params...) QDF_TRACE_DEBUG(QDF_MODULE_ID_QDF, ## params)
649 
650 #define qdf_nofl_alert(params...) \
651 	QDF_TRACE_FATAL_NO_FL(QDF_MODULE_ID_QDF, ## params)
652 #define qdf_nofl_err(params...) \
653 	QDF_TRACE_ERROR_NO_FL(QDF_MODULE_ID_QDF, ## params)
654 #define qdf_nofl_warn(params...) \
655 	QDF_TRACE_WARN_NO_FL(QDF_MODULE_ID_QDF, ## params)
656 #define qdf_nofl_info(params...) \
657 	QDF_TRACE_INFO_NO_FL(QDF_MODULE_ID_QDF, ## params)
658 #define qdf_nofl_debug(params...) \
659 	QDF_TRACE_DEBUG_NO_FL(QDF_MODULE_ID_QDF, ## params)
660 
661 #else /* CONFIG_MCL */
662 
663 #define qdf_print(args...) QDF_TRACE_INFO(QDF_MODULE_ID_ANY, ## args)
664 #define qdf_alert(args...) QDF_TRACE_FATAL(QDF_MODULE_ID_ANY, ## args)
665 #define qdf_err(args...)   QDF_TRACE_ERROR(QDF_MODULE_ID_ANY, ## args)
666 #define qdf_warn(args...)  QDF_TRACE_WARN(QDF_MODULE_ID_ANY, ## args)
667 #define qdf_info(args...)  QDF_TRACE_INFO(QDF_MODULE_ID_ANY, ## args)
668 #define qdf_debug(args...) QDF_TRACE_DEBUG(QDF_MODULE_ID_ANY, ## args)
669 
670 #define qdf_nofl_print(params...) \
671 	QDF_TRACE_INFO_NO_FL(QDF_MODULE_ID_ANY, ## params)
672 #define qdf_nofl_alert(params...) \
673 	QDF_TRACE_FATAL_NO_FL(QDF_MODULE_ID_ANY, ## params)
674 #define qdf_nofl_err(params...) \
675 	QDF_TRACE_ERROR_NO_FL(QDF_MODULE_ID_ANY, ## params)
676 #define qdf_nofl_warn(params...) \
677 	QDF_TRACE_WARN_NO_FL(QDF_MODULE_ID_ANY, ## params)
678 #define qdf_nofl_info(params...) \
679 	QDF_TRACE_INFO_NO_FL(QDF_MODULE_ID_ANY, ## params)
680 #define qdf_nofl_debug(params...) \
681 	QDF_TRACE_DEBUG_NO_FL(QDF_MODULE_ID_ANY, ## params)
682 
683 #endif /* CONFIG_MCL */
684 
685 #define qdf_rl_alert(params...) QDF_TRACE_FATAL_RL(QDF_MODULE_ID_QDF, ## params)
686 #define qdf_rl_err(params...) QDF_TRACE_ERROR_RL(QDF_MODULE_ID_QDF, ## params)
687 #define qdf_rl_warn(params...) QDF_TRACE_WARN_RL(QDF_MODULE_ID_QDF, ## params)
688 #define qdf_rl_info(params...) QDF_TRACE_INFO_RL(QDF_MODULE_ID_QDF, ## params)
689 #define qdf_rl_debug(params...) QDF_TRACE_DEBUG_RL(QDF_MODULE_ID_QDF, ## params)
690 
691 #define qdf_rl_nofl_alert(params...) \
692 	QDF_TRACE_FATAL_RL_NO_FL(QDF_MODULE_ID_QDF, ## params)
693 #define qdf_rl_nofl_err(params...) \
694 	QDF_TRACE_ERROR_RL_NO_FL(QDF_MODULE_ID_QDF, ## params)
695 #define qdf_rl_nofl_warn(params...) \
696 	QDF_TRACE_WARN_RL_NO_FL(QDF_MODULE_ID_QDF, ## params)
697 #define qdf_rl_nofl_info(params...) \
698 	QDF_TRACE_INFO_RL_NO_FL(QDF_MODULE_ID_QDF, ## params)
699 #define qdf_rl_nofl_debug(params...) \
700 	QDF_TRACE_DEBUG_RL_NO_FL(QDF_MODULE_ID_QDF, ## params)
701 
702 #define qdf_vprint    __qdf_vprint
703 #define qdf_snprint   __qdf_snprint
704 
705 #define qdf_kstrtoint __qdf_kstrtoint
706 #define qdf_kstrtouint __qdf_kstrtouint
707 
708 #ifdef WLAN_OPEN_P2P_INTERFACE
709 /* This should match with WLAN_MAX_INTERFACES */
710 #define QDF_MAX_CONCURRENCY_PERSONA  (4)
711 #else
712 #define QDF_MAX_CONCURRENCY_PERSONA  (3)
713 #endif
714 
715 #define QDF_STA_MASK (1 << QDF_STA_MODE)
716 #define QDF_SAP_MASK (1 << QDF_SAP_MODE)
717 #define QDF_P2P_CLIENT_MASK (1 << QDF_P2P_CLIENT_MODE)
718 #define QDF_P2P_GO_MASK (1 << QDF_P2P_GO_MODE)
719 
720 #ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH
721 
722 /**
723  * typedef tQDF_MCC_TO_SCC_SWITCH_MODE - MCC to SCC switch mode.
724  * @QDF_MCC_TO_SCC_SWITCH_DISABLE: Disable switch
725  * @QDF_MCC_TO_SCC_SWITCH_FORCE_WITHOUT_DISCONNECTION: Force switch without
726  * restart of SAP
727  * @QDF_MCC_TO_SCC_SWITCH_WITH_FAVORITE_CHANNEL: Switch using fav channel(s)
728  * without SAP restart
729  * @QDF_MCC_TO_SCC_SWITCH_FORCE_PREFERRED_WITHOUT_DISCONNECTION: Force switch
730  * without SAP restart. MCC is allowed only in below exception cases:
731  *	Exception Case-1: When STA is operating on DFS channel.
732  *	Exception Case-2: When STA is operating on LTE-CoEx channel.
733  *	Exception Case-3: When STA is operating on AP disabled channel.
734  * @QDF_MCC_TO_SCC_WITH_PREFERRED_BAND: Force SCC only in user preferred band.
735  * Allow MCC if STA is operating or comes up on other than user preferred band.
736  *
737  * @QDF_MCC_TO_SCC_SWITCH_MAX: max switch
738  */
739 typedef enum {
740 	QDF_MCC_TO_SCC_SWITCH_DISABLE = 0,
741 	QDF_MCC_TO_SCC_SWITCH_FORCE_WITHOUT_DISCONNECTION = 3,
742 	QDF_MCC_TO_SCC_SWITCH_WITH_FAVORITE_CHANNEL,
743 	QDF_MCC_TO_SCC_SWITCH_FORCE_PREFERRED_WITHOUT_DISCONNECTION,
744 	QDF_MCC_TO_SCC_WITH_PREFERRED_BAND,
745 	QDF_MCC_TO_SCC_SWITCH_MAX
746 } tQDF_MCC_TO_SCC_SWITCH_MODE;
747 #endif
748 
749 #if !defined(NULL)
750 #ifdef __cplusplus
751 #define NULL   0
752 #else
753 #define NULL   ((void *)0)
754 #endif
755 #endif
756 
757 /**
758  * qdf_bool_parse() - parse the given string as a boolean value
759  * @bool_str: the input boolean string to parse
760  * @out_bool: the output boolean value, populated on success
761  *
762  * 1, y, Y are mapped to true, 0, n, N are mapped to false.
763  * Leading/trailing whitespace is ignored.
764  *
765  * Return: QDF_STATUS
766  */
767 QDF_STATUS qdf_bool_parse(const char *bool_str, bool *out_bool);
768 
769 /**
770  * qdf_int32_parse() - parse the given string as a 32-bit signed integer
771  * @int_str: the input integer string to parse
772  * @out_int: the output integer value, populated on success
773  *
774  * Supports binary (0b), octal (0o), decimal (no prefix), and hexadecimal (0x)
775  * encodings via typical prefix notation. Leading/trailing whitespace is
776  * ignored.
777  *
778  * Return: QDF_STATUS
779  */
780 QDF_STATUS qdf_int32_parse(const char *int_str, int32_t *out_int);
781 
782 /**
783  * qdf_uint32_parse() - parse the given string as a 32-bit unsigned integer
784  * @int_str: the input integer string to parse
785  * @out_int: the output integer value, populated on success
786  *
787  * Supports binary (0b), octal (0o), decimal (no prefix), and hexadecimal (0x)
788  * encodings via typical prefix notation. Leading/trailing whitespace is
789  * ignored.
790  *
791  * Return: QDF_STATUS
792  */
793 QDF_STATUS qdf_uint32_parse(const char *int_str, uint32_t *out_int);
794 
795 /**
796  * qdf_int64_parse() - parse the given string as a 64-bit signed integer
797  * @int_str: the input integer string to parse
798  * @out_int: the output integer value, populated on success
799  *
800  * Supports binary (0b), octal (0o), decimal (no prefix), and hexadecimal (0x)
801  * encodings via typical prefix notation. Leading/trailing whitespace is
802  * ignored.
803  *
804  * Return: QDF_STATUS
805  */
806 QDF_STATUS qdf_int64_parse(const char *int_str, int64_t *out_int);
807 
808 /**
809  * qdf_uint64_parse() - parse the given string as a 64-bit unsigned integer
810  * @int_str: the input integer string to parse
811  * @out_int: the output integer value, populated on success
812  *
813  * Supports binary (0b), octal (0o), decimal (no prefix), and hexadecimal (0x)
814  * encodings via typical prefix notation. Leading/trailing whitespace is
815  * ignored.
816  *
817  * Return: QDF_STATUS
818  */
819 QDF_STATUS qdf_uint64_parse(const char *int_str, uint64_t *out_int);
820 
821 #define QDF_MAC_ADDR_SIZE 6
822 #define QDF_MAC_ADDR_STR "%02x:%02x:%02x:%02x:%02x:%02x"
823 #define QDF_MAC_ADDR_ARRAY(a) (a)[0], (a)[1], (a)[2], (a)[3], (a)[4], (a)[5]
824 #define QDF_MAC_ADDR_BCAST_INIT { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff } }
825 #define QDF_MAC_ADDR_ZERO_INIT { { 0, 0, 0, 0, 0, 0 } }
826 
827 /**
828  * struct qdf_mac_addr - A MAC address
829  * @bytes: the raw address bytes array
830  */
831 struct qdf_mac_addr {
832 	uint8_t bytes[QDF_MAC_ADDR_SIZE];
833 };
834 
835 /**
836  * qdf_mac_parse() - parse the given string as a MAC address
837  * @mac_str: the input MAC address string to parse
838  * @out_addr: the output MAC address value, populated on success
839  *
840  * A MAC address is a set of 6, colon-delimited, hexadecimal encoded octets.
841  *
842  * E.g.
843  *	00:00:00:00:00:00 (zero address)
844  *	ff:ff:ff:ff:ff:ff (broadcast address)
845  *	12:34:56:78:90:ab (an arbitrary address)
846  *
847  * This implementation also accepts MAC addresses without colons. Historically,
848  * other delimiters and groupings have been used to represent MAC addresses, but
849  * these are not supported here. Hexadecimal digits may be in either upper or
850  * lower case.
851  *
852  * Return: QDF_STATUS
853  */
854 QDF_STATUS qdf_mac_parse(const char *mac_str, struct qdf_mac_addr *out_addr);
855 
856 #define QDF_IPV4_ADDR_SIZE 4
857 #define QDF_IPV4_ADDR_STR "%d.%d.%d.%d"
858 #define QDF_IPV4_ADDR_ARRAY(a) (a)[0], (a)[1], (a)[2], (a)[3]
859 #define QDF_IPV4_ADDR_ZERO_INIT { { 0, 0, 0, 0 } }
860 
861 /**
862  * struct qdf_ipv4_addr - An IPV4 address
863  * @bytes: the raw address bytes array
864  */
865 struct qdf_ipv4_addr {
866 	uint8_t bytes[QDF_IPV4_ADDR_SIZE];
867 };
868 
869 /**
870  * qdf_ipv4_parse() - parse the given string as an IPV4 address
871  * @ipv4_str: the input IPV4 address string to parse
872  * @out_addr: the output IPV4 address value, populated on success
873  *
874  * An IPV4 address is a set of 4, dot-delimited, decimal encoded octets.
875  *
876  * E.g.
877  *	0.0.0.0 (wildcard address)
878  *	127.0.0.1 (loopback address)
879  *	255.255.255.255 (broadcast address)
880  *	192.168.0.1 (an arbitrary address)
881  *
882  * Historically, non-decimal encodings have also been used to represent IPV4
883  * addresses, but these are not supported here.
884  *
885  * Return: QDF_STATUS
886  */
887 QDF_STATUS qdf_ipv4_parse(const char *ipv4_str, struct qdf_ipv4_addr *out_addr);
888 
889 #define QDF_IPV6_ADDR_SIZE 16
890 #define QDF_IPV6_ADDR_HEXTET_COUNT 8
891 #define QDF_IPV6_ADDR_STR "%x:%x:%x:%x:%x:%x:%x:%x"
892 #define QDF_IPV6_ADDR_ARRAY(a) \
893 	((a)[0] << 8) + (a)[1], ((a)[2] << 8) + (a)[3], \
894 	((a)[4] << 8) + (a)[5], ((a)[6] << 8) + (a)[7], \
895 	((a)[8] << 8) + (a)[9], ((a)[10] << 8) + (a)[11], \
896 	((a)[12] << 8) + (a)[13], ((a)[14] << 8) + (a)[15]
897 #define QDF_IPV6_ADDR_ZERO_INIT \
898 	{ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }
899 
900 /**
901  * struct qdf_ipv6_addr - An IPV6 address
902  * @bytes: the raw address bytes array
903  */
904 struct qdf_ipv6_addr {
905 	uint8_t bytes[QDF_IPV6_ADDR_SIZE];
906 };
907 
908 /**
909  * qdf_ipv6_parse() - parse the given string as an IPV6 address
910  * @ipv6_str: the input IPV6 address string to parse
911  * @out_addr: the output IPV6 address value, populated on success
912  *
913  * A hextet is a pair of octets. An IPV6 address is a set of 8, colon-delimited,
914  * hexadecimal encoded hextets. Each hextet may omit leading zeros. One or more
915  * zero-hextets may be "compressed" using a pair of colons ("::"). Up to one
916  * such zero-compression is allowed per address.
917  *
918  * E.g.
919  *	0:0:0:0:0:0:0:0 (unspecified address)
920  *	:: (also the unspecified address)
921  *	0:0:0:0:0:0:0:1 (loopback address)
922  *	::1 (also the loopback address)
923  *	900a:ae7::6 (an arbitrary address)
924  *	900a:ae7:0:0:0:0:0:6 (the same arbitrary address)
925  *
926  * Hexadecimal digits may be in either upper or lower case.
927  *
928  * Return: QDF_STATUS
929  */
930 QDF_STATUS qdf_ipv6_parse(const char *ipv6_str, struct qdf_ipv6_addr *out_addr);
931 
932 /**
933  * qdf_uint8_array_parse() - parse the given string as uint8 array
934  * @in_str: the input string to parse
935  * @out_array: the output uint8 array, populated on success
936  * @array_size: size of the array
937  * @out_size: size of the populated array
938  *
939  * This API is called to convert string (each byte separated by
940  * a comma) into an u8 array
941  *
942  * Return: QDF_STATUS
943  */
944 QDF_STATUS qdf_uint8_array_parse(const char *in_str, uint8_t *out_array,
945 				 qdf_size_t array_size, qdf_size_t *out_size);
946 
947 #define QDF_MAX_NUM_CHAN   (128)
948 
949 #define QDF_BCAST_MAC_ADDR (0xFF)
950 #define QDF_MCAST_IPV4_MAC_ADDR (0x01)
951 #define QDF_MCAST_IPV6_MAC_ADDR (0x33)
952 
953 /**
954  * struct qdf_tso_frag_t - fragments of a single TCP segment
955  * @paddr_low_32: Lower 32 bits of the buffer pointer
956  * @paddr_upper_16: upper 16 bits of the buffer pointer
957  * @length: length of the buffer
958  * @vaddr: virtual address
959  *
960  * This structure holds the fragments of a single TCP segment of a
961  * given jumbo TSO network buffer
962  */
963 struct qdf_tso_frag_t {
964 	uint16_t length;
965 	unsigned char *vaddr;
966 	qdf_dma_addr_t paddr;
967 };
968 
969 #define FRAG_NUM_MAX 6
970 #define TSO_SEG_MAGIC_COOKIE 0x1EED
971 
972 /**
973  * struct qdf_tso_flags_t - TSO specific flags
974  * @tso_enable: Enable transmit segmentation offload
975  * @tcp_flags_mask: Tcp_flag is inserted into the header based
976  * on the mask
977  * @l2_len: L2 length for the msdu
978  * @ip_len: IP length for the msdu
979  * @tcp_seq_num: TCP sequence number
980  * @ip_id: IP identification number
981  *
982  * This structure holds the TSO specific flags extracted from the TSO network
983  * buffer for a given TCP segment
984  */
985 struct qdf_tso_flags_t {
986 	uint32_t tso_enable:1,
987 			reserved_0a:6,
988 			fin:1,
989 			syn:1,
990 			rst:1,
991 			psh:1,
992 			ack:1,
993 			urg:1,
994 			ece:1,
995 			cwr:1,
996 			ns:1,
997 			tcp_flags_mask:9,
998 			reserved_0b:7;
999 
1000 	uint32_t l2_len:16,
1001 			ip_len:16;
1002 
1003 	uint32_t tcp_seq_num;
1004 
1005 	uint32_t ip_id:16,
1006 			ipv4_checksum_en:1,
1007 			udp_ipv4_checksum_en:1,
1008 			udp_ipv6_checksum_en:1,
1009 			tcp_ipv4_checksum_en:1,
1010 			tcp_ipv6_checksum_en:1,
1011 			partial_checksum_en:1,
1012 			reserved_3a:10;
1013 
1014 	uint32_t checksum_offset:14,
1015 			reserved_4a:2,
1016 			payload_start_offset:14,
1017 			reserved_4b:2;
1018 
1019 	uint32_t payload_end_offset:14,
1020 			reserved_5:18;
1021 };
1022 
1023 /**
1024  * struct qdf_tso_seg_t - single TSO segment
1025  * @tso_flags: TSO flags
1026  * @num_frags: number of fragments
1027  * @total_len: total length of the packet
1028  * @tso_frags: array holding the fragments
1029  *
1030  * This structure holds the information of a single TSO segment of a jumbo
1031  * TSO network buffer
1032  */
1033 struct qdf_tso_seg_t {
1034 	struct qdf_tso_flags_t tso_flags;
1035 	uint32_t num_frags;
1036 	uint32_t total_len;
1037 	struct qdf_tso_frag_t tso_frags[FRAG_NUM_MAX];
1038 };
1039 
1040 /**
1041  * TSO seg elem action caller locations: goes into dbg.history below.
1042  * Needed to be defined outside of the feature so that
1043  * callers can be coded without ifdefs (even if they get
1044  * resolved to nothing)
1045  */
1046 enum tsoseg_dbg_caller_e {
1047 	TSOSEG_LOC_UNDEFINED,
1048 	TSOSEG_LOC_INIT1,
1049 	TSOSEG_LOC_INIT2,
1050 	TSOSEG_LOC_FREE,
1051 	TSOSEG_LOC_ALLOC,
1052 	TSOSEG_LOC_DEINIT,
1053 	TSOSEG_LOC_GETINFO,
1054 	TSOSEG_LOC_FILLHTTSEG,
1055 	TSOSEG_LOC_FILLCMNSEG,
1056 	TSOSEG_LOC_PREPARETSO,
1057 	TSOSEG_LOC_TXPREPLLFAST,
1058 	TSOSEG_LOC_UNMAPTSO,
1059 	TSOSEG_LOC_UNMAPLAST,
1060 	TSOSEG_LOC_FORCE_FREE,
1061 };
1062 #ifdef TSOSEG_DEBUG
1063 
1064 /**
1065  * WARNING: Don't change the history size without changing the wrap
1066  *  code in qdf_tso_seg_dbg_record function
1067  */
1068 #define MAX_TSO_SEG_ACT_HISTORY 16
1069 struct qdf_tso_seg_dbg_history_t {
1070 	uint64_t ts;
1071 	short    id;
1072 };
1073 struct qdf_tso_seg_dbg_t {
1074 	void    *txdesc;  /* owner - (ol_txrx_tx_desc_t *) */
1075 	qdf_atomic_t cur; /* index of last valid entry */
1076 	struct qdf_tso_seg_dbg_history_t h[MAX_TSO_SEG_ACT_HISTORY];
1077 };
1078 #endif /* TSOSEG_DEBUG */
1079 
1080 /**
1081  * qdf_tso_seg_elem_t - tso segment element
1082  * @next: pointer to the next segment
1083  * @seg: instance of segment
1084  */
1085 struct qdf_tso_seg_elem_t {
1086 	struct qdf_tso_seg_elem_t *next;
1087 	struct qdf_tso_seg_t seg;
1088 	uint32_t cookie:13,
1089 		on_freelist:1,
1090 		sent_to_target:1,
1091 		force_free:1;
1092 #ifdef TSOSEG_DEBUG
1093 	struct qdf_tso_seg_dbg_t dbg;
1094 #endif /* TSOSEG_DEBUG */
1095 };
1096 
1097 /**
1098  * struct qdf_tso_num_seg_t - single element to count for num of seg
1099  * @tso_cmn_num_seg: num of seg in a jumbo skb
1100  *
1101  * This structure holds the information of num of segments of a jumbo
1102  * TSO network buffer.
1103  */
1104 struct qdf_tso_num_seg_t {
1105 	uint32_t tso_cmn_num_seg;
1106 };
1107 
1108 /**
1109  * qdf_tso_num_seg_elem_t - num of tso segment element for jumbo skb
1110  * @next: pointer to the next segment
1111  * @num_seg: instance of num of seg
1112  */
1113 struct qdf_tso_num_seg_elem_t {
1114 	struct qdf_tso_num_seg_elem_t *next;
1115 	struct qdf_tso_num_seg_t num_seg;
1116 };
1117 
1118 /**
1119  * struct qdf_tso_info_t - TSO information extracted
1120  * @is_tso: is this is a TSO frame
1121  * @num_segs: number of segments
1122  * @tso_seg_list: list of TSO segments for this jumbo packet
1123  * @curr_seg: segment that is currently being processed
1124  * @tso_num_seg_list: num of tso seg for this jumbo packet
1125  * @msdu_stats_idx: msdu index for tso stats
1126  *
1127  * This structure holds the TSO information extracted after parsing the TSO
1128  * jumbo network buffer. It contains a chain of the TSO segments belonging to
1129  * the jumbo packet
1130  */
1131 struct qdf_tso_info_t {
1132 	uint8_t is_tso;
1133 	uint32_t num_segs;
1134 	struct qdf_tso_seg_elem_t *tso_seg_list;
1135 	struct qdf_tso_seg_elem_t *curr_seg;
1136 	struct qdf_tso_num_seg_elem_t *tso_num_seg_list;
1137 	uint32_t msdu_stats_idx;
1138 };
1139 
1140 /**
1141  * Used to set classify bit in CE desc.
1142  */
1143 #define QDF_CE_TX_CLASSIFY_BIT_S   5
1144 
1145 /**
1146  * QDF_CE_TX_PKT_TYPE_BIT_S - 2 bits starting at bit 6 in CE desc.
1147  */
1148 #define QDF_CE_TX_PKT_TYPE_BIT_S   6
1149 
1150 /**
1151  * QDF_CE_TX_PKT_OFFSET_BIT_S - 12 bits --> 16-27, in the CE desciptor
1152  *  the length of HTT/HTC descriptor
1153  */
1154 #define QDF_CE_TX_PKT_OFFSET_BIT_S  16
1155 
1156 /**
1157  * QDF_CE_TX_PKT_OFFSET_BIT_M - Mask for packet offset in the CE descriptor.
1158  */
1159 #define QDF_CE_TX_PKT_OFFSET_BIT_M   0x0fff0000
1160 
1161 /**
1162  * enum qdf_suspend_type - type of suspend
1163  * @QDF_SYSTEM_SUSPEND: System suspend triggered wlan suspend
1164  * @QDF_RUNTIME_SUSPEND: Runtime pm inactivity timer triggered wlan suspend
1165  */
1166 enum qdf_suspend_type {
1167 	QDF_SYSTEM_SUSPEND,
1168 	QDF_RUNTIME_SUSPEND
1169 };
1170 
1171 /**
1172  * enum qdf_hang_reason - host hang/ssr reason
1173  * @QDF_REASON_UNSPECIFIED: Unspecified reason
1174  * @QDF_RX_HASH_NO_ENTRY_FOUND: No Map for the MAC entry for the received frame
1175  * @QDF_PEER_DELETION_TIMEDOUT: peer deletion timeout happened
1176  * @QDF_PEER_UNMAP_TIMEDOUT: peer unmap timeout
1177  * @QDF_SCAN_REQ_EXPIRED: Scan request timed out
1178  * @QDF_SCAN_ATTEMPT_FAILURES: Consecutive Scan attempt failures
1179  * @QDF_GET_MSG_BUFF_FAILURE: Unable to get the message buffer
1180  * @QDF_ACTIVE_LIST_TIMEOUT: Current command processing is timedout
1181  * @QDF_SUSPEND_TIMEOUT: Timeout for an ACK from FW for suspend request
1182  * @QDF_RESUME_TIMEOUT: Timeout for an ACK from FW for resume request
1183  * @QDF_WMI_EXCEED_MAX_PENDING_CMDS: wmi exceed max pending cmd
1184  */
1185 enum qdf_hang_reason {
1186 	QDF_REASON_UNSPECIFIED = 0,
1187 	QDF_RX_HASH_NO_ENTRY_FOUND = 1,
1188 	QDF_PEER_DELETION_TIMEDOUT = 2,
1189 	QDF_PEER_UNMAP_TIMEDOUT = 3,
1190 	QDF_SCAN_REQ_EXPIRED = 4,
1191 	QDF_SCAN_ATTEMPT_FAILURES = 5,
1192 	QDF_GET_MSG_BUFF_FAILURE = 6,
1193 	QDF_ACTIVE_LIST_TIMEOUT = 7,
1194 	QDF_SUSPEND_TIMEOUT = 8,
1195 	QDF_RESUME_TIMEOUT = 9,
1196 	QDF_WMI_EXCEED_MAX_PENDING_CMDS = 10,
1197 };
1198 
1199 /**
1200  * enum qdf_stats_verbosity_level - Verbosity levels for stats
1201  * for which want to have different levels
1202  * @QDF_STATS_VERBOSITY_LEVEL_LOW: Stats verbosity level low
1203  * @QDF_STATS_VERBOSITY_LEVEL_HIGH: Stats verbosity level high
1204  */
1205 enum qdf_stats_verbosity_level {
1206 	QDF_STATS_VERBOSITY_LEVEL_LOW,
1207 	QDF_STATS_VERBOSITY_LEVEL_HIGH
1208 };
1209 
1210 /**
1211  * enum qdf_clock_id - The clock IDs of the various system clocks
1212  * @QDF_CLOCK_REALTIME: Clock is close to current time of day
1213  * @QDF_CLOCK_MONOTONIC: Clock is absolute elapsed time
1214  */
1215 enum qdf_clock_id {
1216 	QDF_CLOCK_REALTIME = __QDF_CLOCK_REALTIME,
1217 	QDF_CLOCK_MONOTONIC = __QDF_CLOCK_MONOTONIC
1218 };
1219 
1220 /**
1221  * enum qdf_hrtimer_mode - Mode arguments of qdf_hrtimer_data_t
1222  * related functions
1223  * @QDF_HRTIMER_MODE_ABS: Time value is absolute
1224  * @QDF_HRTIMER_MODE_REL: Time value is relative to now
1225  * @QDF_HRTIMER_MODE_PINNED: Timer is bound to CPU
1226  */
1227 enum qdf_hrtimer_mode {
1228 	QDF_HRTIMER_MODE_ABS = __QDF_HRTIMER_MODE_ABS,
1229 	QDF_HRTIMER_MODE_REL = __QDF_HRTIMER_MODE_REL,
1230 	QDF_HRTIMER_MODE_PINNED =  __QDF_HRTIMER_MODE_PINNED,
1231 };
1232 
1233 /**
1234  * enum qdf_hrtimer_restart_status - Return values for the
1235  * qdf_hrtimer_data_t callback function
1236  * @QDF_HRTIMER_NORESTART: Timer is not restarted
1237  * @QDF_HRTIMER_RESTART: Timer must be restarted
1238  */
1239 enum qdf_hrtimer_restart_status {
1240 	QDF_HRTIMER_NORESTART = __QDF_HRTIMER_NORESTART,
1241 	QDF_HRTIMER_RESTART = __QDF_HRTIMER_RESTART,
1242 };
1243 
1244 /**
1245  * enum qdf_context_mode - Values for the
1246  * hrtimer context
1247  * @QDF_CONTEXT_HARDWARE: Runs in hw interrupt context
1248  * @QDF_CONTEXT_TASKLET: Runs in tasklet context
1249  */
1250 enum qdf_context_mode {
1251 	QDF_CONTEXT_HARDWARE = 0,
1252 	QDF_CONTEXT_TASKLET = 1,
1253 };
1254 
1255 #endif /* __QDF_TYPES_H */
1256