blob: e3f1aa42f064b109380f70a95e32693de45b3fc4 [file] [log] [blame]
/*
* Copyright (c) 2014-2019 The Linux Foundation. All rights reserved.
*
* Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the
* above copyright notice and this permission notice appear in all
* copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
* WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
* AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*/
/**
* DOC: i_qdf_types.h
* This file provides OS dependent types API's.
*/
#if !defined(__I_QDF_TYPES_H)
#define __I_QDF_TYPES_H
#ifndef __KERNEL__
#define __iomem
#endif
#include <asm/types.h>
#include <asm/byteorder.h>
#include <linux/version.h>
#ifndef __ahdecl
#ifdef __i386__
#define __ahdecl __attribute__((regparm(0)))
#else
#define __ahdecl
#endif
#endif
#ifdef __KERNEL__
#include <generated/autoconf.h>
#include <linux/list.h>
#include <linux/mutex.h>
#include <linux/types.h>
#include <linux/ctype.h>
#include <linux/sched.h>
#include <linux/completion.h>
#include <linux/string.h>
#include <linux/slab.h>
#include <linux/interrupt.h>
#include <linux/version.h>
#include <asm/div64.h>
#include <linux/compiler.h>
#include <linux/dma-mapping.h>
#include <linux/wireless.h>
#include <linux/if.h>
#ifdef IPA_OFFLOAD
#include <linux/ipa.h>
#endif
#define __qdf_must_check __must_check
typedef struct sg_table __sgtable_t;
/*
* The IDs of the various system clocks
*/
#define __QDF_CLOCK_REALTIME CLOCK_REALTIME
#define __QDF_CLOCK_MONOTONIC CLOCK_MONOTONIC
/*
* Return values for the qdf_hrtimer_data_t callback function
*/
#define __QDF_HRTIMER_NORESTART HRTIMER_NORESTART
#define __QDF_HRTIMER_RESTART HRTIMER_RESTART
/*
* Mode arguments of qdf_hrtimer_data_t related functions
*/
#define __QDF_HRTIMER_MODE_ABS HRTIMER_MODE_ABS
#define __QDF_HRTIMER_MODE_REL HRTIMER_MODE_REL
#define __QDF_HRTIMER_MODE_PINNED HRTIMER_MODE_PINNED
#else
/*
* Hack - coexist with prior defs of dma_addr_t.
* Eventually all other defs of dma_addr_t should be removed.
* At that point, the "already_defined" wrapper can be removed.
*/
#ifndef __dma_addr_t_already_defined__
#define __dma_addr_t_already_defined__
typedef unsigned long dma_addr_t;
#endif
typedef unsigned long phys_addr_t;
typedef unsigned long __sgtable_t;
#ifndef SIOCGIWAP
#define SIOCGIWAP 0
#endif
#ifndef IWEVCUSTOM
#define IWEVCUSTOM 0
#endif
#ifndef IWEVREGISTERED
#define IWEVREGISTERED 0
#endif
#ifndef IWEVEXPIRED
#define IWEVEXPIRED 0
#endif
#ifndef SIOCGIWSCAN
#define SIOCGIWSCAN 0
#endif
#define DMA_TO_DEVICE 0
#define DMA_BIDIRECTIONAL 0
#define DMA_FROM_DEVICE 0
#define __QDF_CLOCK_REALTIME 0
#define __QDF_CLOCK_MONOTONIC 0
#define __QDF_HRTIMER_MODE_ABS 0
#define __QDF_HRTIMER_MODE_REL 0
#define __QDF_HRTIMER_MODE_PINNED 0
#define __QDF_HRTIMER_NORESTART 0
#define __QDF_HRTIMER_RESTART 0
#define __iomem
#endif /* __KERNEL__ */
/*
* max sg that we support
*/
#define __QDF_MAX_SCATTER 1
#define __QDF_NSEC_PER_MSEC NSEC_PER_MSEC
#if defined(__LITTLE_ENDIAN_BITFIELD)
#define QDF_LITTLE_ENDIAN_MACHINE
#elif defined(__BIG_ENDIAN_BITFIELD)
#define QDF_BIG_ENDIAN_MACHINE
#else
#error "Please fix <asm/byteorder.h>"
#endif
#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 20) || !defined(__KERNEL__)
#ifndef __bool_already_defined__
#define __bool_already_defined__
/**
* bool - This is an enum for boolean
* @false: zero
* @true: one
*/
typedef enum bool {
false = 0,
true = 1,
} bool;
#endif /* __bool_already_defined__ */
#endif
#define __qdf_packed __attribute__((packed))
typedef int (*__qdf_os_intr)(void *);
/**
* Private definitions of general data types
*/
typedef dma_addr_t __qdf_dma_addr_t;
typedef size_t __qdf_dma_size_t;
typedef dma_addr_t __qdf_dma_context_t;
typedef struct net_device *__qdf_netdev_t;
typedef struct cpumask __qdf_cpu_mask;
typedef __le16 __qdf_le16_t;
typedef __le32 __qdf_le32_t;
typedef __le64 __qdf_le64_t;
typedef __be16 __qdf_be16_t;
typedef __be32 __qdf_be32_t;
typedef __be64 __qdf_be64_t;
#ifdef IPA_OFFLOAD
typedef struct ipa_wdi_buffer_info __qdf_mem_info_t;
#else
/**
* struct __qdf_shared_mem_info - shared mem info struct
* @pa : physical address
* @iova: i/o virtual address
* @size: allocated memory size
* @result: status
*/
typedef struct __qdf_shared_mem_info {
phys_addr_t pa;
unsigned long iova;
size_t size;
int result;
} __qdf_mem_info_t;
#endif /* IPA_OFFLOAD */
#define qdf_dma_mem_context(context) dma_addr_t context
#define qdf_get_dma_mem_context(var, field) ((qdf_dma_context_t)(var->field))
/**
* typedef struct __qdf_resource_t - qdf resource type
* @paddr: Physical address
* @paddr: Virtual address
* @len: Length
*/
typedef struct __qdf_resource {
unsigned long paddr;
void __iomem *vaddr;
unsigned long len;
} __qdf_resource_t;
struct __qdf_mempool_ctxt;
#define MAX_MEM_POOLS 64
/**
* enum qdf_bus_type - Supported Bus types
* @QDF_BUS_TYPE_NONE: None Bus type for error check
* @QDF_BUS_TYPE_PCI: PCI Bus
* @QDF_BUS_TYPE_AHB: AHB Bus
* @QDF_BUS_TYPE_SNOC: SNOC Bus
* @QDF_BUS_TYPE_SIM: Simulator
* @QDF_BUS_TYPE_USB: USB Bus
*/
enum qdf_bus_type {
QDF_BUS_TYPE_NONE = -1,
QDF_BUS_TYPE_PCI = 0,
QDF_BUS_TYPE_AHB,
QDF_BUS_TYPE_SNOC,
QDF_BUS_TYPE_SIM,
QDF_BUS_TYPE_SDIO,
QDF_BUS_TYPE_USB
};
/**
* struct __qdf_device - generic qdf device type
* @drv: Pointer to driver
* @drv_hdl: Pointer to driver handle
* @drv_name: Pointer to driver name
* @irq: IRQ
* @dev: Pointer to device
* @res: QDF resource
* @func: Interrupt handler
* @mem_pool: array of pointers to mem pool context
* @bus_type: Bus type
* @bid: Bus ID
* @smmu_s1_enabled: SMMU S1 enabled or not
* @iommu_mapping: DMA iommu mapping pointer
*/
struct __qdf_device {
void *drv;
void *drv_hdl;
char *drv_name;
int irq;
struct device *dev;
__qdf_resource_t res;
__qdf_os_intr func;
struct __qdf_mempool_ctxt *mem_pool[MAX_MEM_POOLS];
enum qdf_bus_type bus_type;
const struct hif_bus_id *bid;
bool smmu_s1_enabled;
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 0))
struct iommu_domain *domain;
#else
#ifdef ENABLE_SMMU_S1_TRANSLATION
struct dma_iommu_mapping *iommu_mapping;
#endif
#endif
};
typedef struct __qdf_device *__qdf_device_t;
typedef size_t __qdf_size_t;
typedef off_t __qdf_off_t;
typedef uint8_t __iomem *__qdf_iomem_t;
typedef uint32_t ath_dma_addr_t;
/**
* typedef __qdf_segment_t - segment of memory
* @daddr: dma address
* @len: length of segment
*/
typedef struct __qdf_segment {
dma_addr_t daddr;
uint32_t len;
} __qdf_segment_t;
/**
* __qdf_dma_map - dma map of memory
* @mapped: mapped address
* @nsegs: number of segments
* @coherent: coherency status
* @seg: segment of memory
*/
struct __qdf_dma_map {
uint32_t mapped;
uint32_t nsegs;
uint32_t coherent;
__qdf_segment_t seg[__QDF_MAX_SCATTER];
};
typedef struct __qdf_dma_map *__qdf_dma_map_t;
/**
* __qdf_net_wireless_evcode - enum for event code
* @__QDF_IEEE80211_ASSOC: association event code
* @__QDF_IEEE80211_REASSOC: reassociation event code
* @__QDF_IEEE80211_DISASSOC: disassociation event code
* @__QDF_IEEE80211_JOIN: join event code
* @__QDF_IEEE80211_LEAVE: leave event code
* @__QDF_IEEE80211_SCAN: scan event code
* @__QDF_IEEE80211_REPLAY: replay event code
* @__QDF_IEEE80211_MICHAEL:michael event code
* @__QDF_IEEE80211_REJOIN: rejoin event code
* @__QDF_CUSTOM_PUSH_BUTTON: push button event code
*/
enum __qdf_net_wireless_evcode {
__QDF_IEEE80211_ASSOC = SIOCGIWAP,
__QDF_IEEE80211_REASSOC = IWEVCUSTOM,
__QDF_IEEE80211_DISASSOC = SIOCGIWAP,
__QDF_IEEE80211_JOIN = IWEVREGISTERED,
__QDF_IEEE80211_LEAVE = IWEVEXPIRED,
__QDF_IEEE80211_SCAN = SIOCGIWSCAN,
__QDF_IEEE80211_REPLAY = IWEVCUSTOM,
__QDF_IEEE80211_MICHAEL = IWEVCUSTOM,
__QDF_IEEE80211_REJOIN = IWEVCUSTOM,
__QDF_CUSTOM_PUSH_BUTTON = IWEVCUSTOM,
};
#define __qdf_print printk
#define __qdf_vprint vprintk
#define __qdf_snprint snprintf
#define __qdf_vsnprint vsnprintf
#define __qdf_toupper toupper
#define qdf_kstrtoint __qdf_kstrtoint
#define qdf_kstrtouint __qdf_kstrtouint
#define __qdf_kstrtoint kstrtoint
#define __qdf_kstrtouint kstrtouint
#define __QDF_DMA_BIDIRECTIONAL DMA_BIDIRECTIONAL
#define __QDF_DMA_TO_DEVICE DMA_TO_DEVICE
#ifndef __ubicom32__
#define __QDF_DMA_FROM_DEVICE DMA_FROM_DEVICE
#else
#define __QDF_DMA_FROM_DEVICE DMA_TO_DEVICE
#endif
#define __qdf_inline inline
/*
* 1. GNU C/C++ Compiler
*
* How to detect gcc : __GNUC__
* How to detect gcc version :
* major version : __GNUC__ (2 = 2.x, 3 = 3.x, 4 = 4.x)
* minor version : __GNUC_MINOR__
*
* 2. Microsoft C/C++ Compiler
*
* How to detect msc : _MSC_VER
* How to detect msc version :
* _MSC_VER (1200 = MSVC 6.0, 1300 = MSVC 7.0, ...)
*
*/
/*
* MACROs to help with compiler and OS specifics. May need to get a little
* more sophisticated than this and define these to specific 'VERSIONS' of
* the compiler and OS. Until we have a need for that, lets go with this
*/
#if defined(_MSC_VER)
#define QDF_COMPILER_MSC
/* assuming that if we build with MSC, OS is WinMobile */
#define QDF_OS_WINMOBILE
#elif defined(__GNUC__)
#define QDF_COMPILER_GNUC
#define QDF_OS_LINUX /* assuming if building with GNUC, OS is Linux */
#endif
#if defined(QDF_COMPILER_MSC)
/*
* Does nothing on Windows. packing individual structs is not
* supported on the Windows compiler
*/
#define QDF_PACK_STRUCT_1
#define QDF_PACK_STRUCT_2
#define QDF_PACK_STRUCT_4
#define QDF_PACK_STRUCT_8
#define QDF_PACK_STRUCT_16
#elif defined(QDF_COMPILER_GNUC)
#else
#error "Compiling with an unknown compiler!!"
#endif
#endif /* __I_QDF_TYPES_H */