/** @file mlan_main.h
 *
 *  @brief This file defines the private and adapter data
 *  structures and declares global function prototypes used
 *  in MLAN module.
 *
 *
 *  Copyright 2008-2022 NXP
 *
 *  NXP CONFIDENTIAL
 *  The source code contained or described herein and all documents related to
 *  the source code (Materials) are owned by NXP, its
 *  suppliers and/or its licensors. Title to the Materials remains with NXP,
 *  its suppliers and/or its licensors. The Materials contain
 *  trade secrets and proprietary and confidential information of NXP, its
 *  suppliers and/or its licensors. The Materials are protected by worldwide
 *  copyright and trade secret laws and treaty provisions. No part of the
 *  Materials may be used, copied, reproduced, modified, published, uploaded,
 *  posted, transmitted, distributed, or disclosed in any way without NXP's
 *  prior express written permission.
 *
 *  No license under any patent, copyright, trade secret or other intellectual
 *  property right is granted to or conferred upon you by disclosure or delivery
 *  of the Materials, either expressly, by implication, inducement, estoppel or
 *  otherwise. Any license under such intellectual property rights must be
 *  express and approved by NXP in writing.
 *
 *  Alternatively, this software may be distributed under the terms of GPL v2.
 *  SPDX-License-Identifier:    GPL-2.0
 *
 *
 */

/******************************************************
Change log:
    10/13/2008: initial version
******************************************************/

#ifndef _MLAN_MAIN_H_
#define _MLAN_MAIN_H_

#ifdef DEBUG_LEVEL1
extern t_void (*print_callback)(t_pvoid pmoal_handle, t_u32 level,
				char *pformat, IN...);

extern mlan_status (*get_sys_time_callback)(t_void *pmoal_handle, t_u32 *psec,
					    t_u32 *pusec);

extern t_u32 mlan_drvdbg;

#ifdef DEBUG_LEVEL2
#define PRINTM_MINFO(msg...)                                                   \
	do {                                                                   \
		if ((mlan_drvdbg & MINFO) && (print_callback))                 \
			print_callback(MNULL, MINFO, msg);                     \
	} while (0)
#define PRINTM_MWARN(msg...)                                                   \
	do {                                                                   \
		if ((mlan_drvdbg & MWARN) && (print_callback))                 \
			print_callback(MNULL, MWARN, msg);                     \
	} while (0)
#define PRINTM_MENTRY(msg...)                                                  \
	do {                                                                   \
		if ((mlan_drvdbg & MENTRY) && (print_callback))                \
			print_callback(MNULL, MENTRY, msg);                    \
	} while (0)
#define PRINTM_GET_SYS_TIME(level, psec, pusec)                                \
	do {                                                                   \
		if ((level & mlan_drvdbg) && (get_sys_time_callback))          \
			get_sys_time_callback(MNULL, psec, pusec);             \
	} while (0)

/** Hexdump for level-2 debugging */
#define HEXDUMP(x, y, z)                                                       \
	do {                                                                   \
		if ((mlan_drvdbg & (MHEX_DUMP | MINFO)) && (print_callback))   \
			print_callback(MNULL, MHEX_DUMP | MINFO, x, y, z);     \
	} while (0)

#else

#define PRINTM_MINFO(msg...)                                                   \
	do {                                                                   \
	} while (0)
#define PRINTM_MWARN(msg...)                                                   \
	do {                                                                   \
	} while (0)
#define PRINTM_MENTRY(msg...)                                                  \
	do {                                                                   \
	} while (0)

#define PRINTM_GET_SYS_TIME(level, psec, pusec)                                \
	do {                                                                   \
		if ((level & mlan_drvdbg) && (get_sys_time_callback) &&        \
		    (level != MINFO) && (level != MWARN))                      \
			get_sys_time_callback(MNULL, psec, pusec);             \
	} while (0)

/** Hexdump for debugging */
#define HEXDUMP(x, y, z)                                                       \
	do {                                                                   \
	} while (0)

#endif /* DEBUG_LEVEL2 */

#define PRINTM_MFW_D(msg...)                                                   \
	do {                                                                   \
		if ((mlan_drvdbg & MFW_D) && (print_callback))                 \
			print_callback(MNULL, MFW_D, msg);                     \
	} while (0)
#define PRINTM_MCMD_D(msg...)                                                  \
	do {                                                                   \
		if ((mlan_drvdbg & MCMD_D) && (print_callback))                \
			print_callback(MNULL, MCMD_D, msg);                    \
	} while (0)
#define PRINTM_MDAT_D(msg...)                                                  \
	do {                                                                   \
		if ((mlan_drvdbg & MDAT_D) && (print_callback))                \
			print_callback(MNULL, MDAT_D, msg);                    \
	} while (0)
#define PRINTM_MIF_D(msg...)                                                   \
	do {                                                                   \
		if ((mlan_drvdbg & MIF_D) && (print_callback))                 \
			print_callback(MNULL, MIF_D, msg);                     \
	} while (0)

#define PRINTM_MIOCTL(msg...)                                                  \
	do {                                                                   \
		if ((mlan_drvdbg & MIOCTL) && (print_callback))                \
			print_callback(MNULL, MIOCTL, msg);                    \
	} while (0)
#define PRINTM_MINTR(msg...)                                                   \
	do {                                                                   \
		if ((mlan_drvdbg & MINTR) && (print_callback))                 \
			print_callback(MNULL, MINTR, msg);                     \
	} while (0)
#define PRINTM_MEVENT(msg...)                                                  \
	do {                                                                   \
		if ((mlan_drvdbg & MEVENT) && (print_callback))                \
			print_callback(MNULL, MEVENT, msg);                    \
	} while (0)
#define PRINTM_MCMND(msg...)                                                   \
	do {                                                                   \
		if ((mlan_drvdbg & MCMND) && (print_callback))                 \
			print_callback(MNULL, MCMND, msg);                     \
	} while (0)
#define PRINTM_MDATA(msg...)                                                   \
	do {                                                                   \
		if ((mlan_drvdbg & MDATA) && (print_callback))                 \
			print_callback(MNULL, MDATA, msg);                     \
	} while (0)
#define PRINTM_MERROR(msg...)                                                  \
	do {                                                                   \
		if ((mlan_drvdbg & MERROR) && (print_callback))                \
			print_callback(MNULL, MERROR, msg);                    \
	} while (0)
#define PRINTM_MFATAL(msg...)                                                  \
	do {                                                                   \
		if ((mlan_drvdbg & MFATAL) && (print_callback))                \
			print_callback(MNULL, MFATAL, msg);                    \
	} while (0)
#define PRINTM_MMSG(msg...)                                                    \
	do {                                                                   \
		if ((mlan_drvdbg & MMSG) && (print_callback))                  \
			print_callback(MNULL, MMSG, msg);                      \
	} while (0)

#define PRINTM(level, msg...) PRINTM_##level((char *)msg)

/** Log debug message */
#ifdef __GNUC__
#define PRINTM_NETINTF(level, pmpriv)                                          \
	do {                                                                   \
		if ((mlan_drvdbg & level) && pmpriv &&                         \
		    pmpriv->adapter->callbacks.moal_print_netintf)             \
			pmpriv->adapter->callbacks.moal_print_netintf(         \
				pmpriv->adapter->pmoal_handle,                 \
				pmpriv->bss_index, level);                     \
	} while (0)
#endif /* __GNUC__ */

/** Max hex dump data length */
#define MAX_DATA_DUMP_LEN 64

/** Debug hexdump for level-1 debugging */
#define DBG_HEXDUMP(level, x, y, z)                                            \
	do {                                                                   \
		if ((mlan_drvdbg & level) && print_callback)                   \
			print_callback(MNULL, MHEX_DUMP | level, x, y, z);     \
	} while (0)

#else /* DEBUG_LEVEL1 */

#define PRINTM(level, msg...)                                                  \
	do {                                                                   \
	} while (0)

#define PRINTM_NETINTF(level, pmpriv)                                          \
	do {                                                                   \
	} while (0)

/** Debug hexdump for level-1 debugging */
#define DBG_HEXDUMP(level, x, y, z)                                            \
	do {                                                                   \
	} while (0)

/** Hexdump for debugging */
#define HEXDUMP(x, y, z)                                                       \
	do {                                                                   \
	} while (0)

#define PRINTM_GET_SYS_TIME(level, psec, pusec)                                \
	do {                                                                   \
	} while (0)

#endif /* DEBUG_LEVEL1 */

/* Reason Code 3: STA is leaving (or has left) IBSS or ESS */
#define DEF_DEAUTH_REASON_CODE (0x3)

/** Log entry point for debugging */
#define ENTER()                                                                \
	do {                                                                   \
		PRINTM(MENTRY, "Enter: %s\n", __func__);                       \
	} while (0)

/** Log exit point for debugging */
#define LEAVE()                                                                \
	do {                                                                   \
		PRINTM(MENTRY, "Leave: %s\n", __func__);                       \
	} while (0)

/** Find minimum */
#ifndef MIN
#define MIN(a, b) ((a) < (b) ? (a) : (b))
#endif

/** Find maximum */
#ifndef MAX
#define MAX(a, b) ((a) > (b) ? (a) : (b))
#endif

#ifdef memset
#undef memset
#endif
/** Memset routine */
#define memset(adapter, s, c, len)                                             \
	(adapter->callbacks.moal_memset(adapter->pmoal_handle, s, c, len))

#ifdef memmove
#undef memmove
#endif
/** Memmove routine */
#define memmove(adapter, dest, src, len)                                       \
	(adapter->callbacks.moal_memmove(adapter->pmoal_handle, dest, src, len))

#ifdef memcpy
#undef memcpy
#endif
/** Memcpy routine */
#define memcpy(adapter, to, from, len)                                         \
	(adapter->callbacks.moal_memcpy(adapter->pmoal_handle, to, from, len))
/* memcpy_ext rountine */
#define memcpy_ext(adapter, to, from, len, size)                               \
	(adapter->callbacks.moal_memcpy_ext(adapter->pmoal_handle, to, from,   \
					    len, size))

#ifdef memcmp
#undef memcmp
#endif
/** Memcmp routine */
#define memcmp(adapter, s1, s2, len)                                           \
	(adapter->callbacks.moal_memcmp(adapter->pmoal_handle, s1, s2, len))

/** Find number of elements */
#ifndef NELEMENTS
#define NELEMENTS(x) (sizeof(x) / sizeof(x[0]))
#endif

/** SWAP: swap t_u8 */
#define SWAP_U8(a, b)                                                          \
	{                                                                      \
		t_u8 t;                                                        \
		t = a;                                                         \
		a = b;                                                         \
		b = t;                                                         \
	}

/** SWAP: swap t_u8 */
#define SWAP_U16(a, b)                                                         \
	{                                                                      \
		t_u16 t;                                                       \
		t = a;                                                         \
		a = b;                                                         \
		b = t;                                                         \
	}

/** 16 bits byte swap */
#define swap_byte_16(x)                                                        \
	((t_u16)((((t_u16)(x)&0x00ffU) << 8) | (((t_u16)(x)&0xff00U) >> 8)))

/** 32 bits byte swap */
#define swap_byte_32(x)                                                        \
	((t_u32)((((t_u32)(x)&0x000000ffUL) << 24) |                           \
		 (((t_u32)(x)&0x0000ff00UL) << 8) |                            \
		 (((t_u32)(x)&0x00ff0000UL) >> 8) |                            \
		 (((t_u32)(x)&0xff000000UL) >> 24)))

/** 64 bits byte swap */
#define swap_byte_64(x)                                                        \
	((t_u64)((t_u64)(((t_u64)(x)&0x00000000000000ffULL) << 56) |           \
		 (t_u64)(((t_u64)(x)&0x000000000000ff00ULL) << 40) |           \
		 (t_u64)(((t_u64)(x)&0x0000000000ff0000ULL) << 24) |           \
		 (t_u64)(((t_u64)(x)&0x00000000ff000000ULL) << 8) |            \
		 (t_u64)(((t_u64)(x)&0x000000ff00000000ULL) >> 8) |            \
		 (t_u64)(((t_u64)(x)&0x0000ff0000000000ULL) >> 24) |           \
		 (t_u64)(((t_u64)(x)&0x00ff000000000000ULL) >> 40) |           \
		 (t_u64)(((t_u64)(x)&0xff00000000000000ULL) >> 56)))

#ifdef BIG_ENDIAN_SUPPORT
/** Convert ulong n/w to host */
#define mlan_ntohl(x) x
/** Convert host ulong to n/w */
#define mlan_htonl(x) x
/** Convert n/w to host */
#define mlan_ntohs(x) x
/** Convert host to n/w */
#define mlan_htons(x) x
/** Convert from 16 bit little endian format to CPU format */
#define wlan_le16_to_cpu(x) swap_byte_16(x)
/** Convert from 32 bit little endian format to CPU format */
#define wlan_le32_to_cpu(x) swap_byte_32(x)
/** Convert from 64 bit little endian format to CPU format */
#define wlan_le64_to_cpu(x) swap_byte_64(x)
/** Convert to 16 bit little endian format from CPU format */
#define wlan_cpu_to_le16(x) swap_byte_16(x)
/** Convert to 32 bit little endian format from CPU format */
#define wlan_cpu_to_le32(x) swap_byte_32(x)
/** Convert to 64 bit little endian format from CPU format */
#define wlan_cpu_to_le64(x) swap_byte_64(x)

/** Convert TxPD to little endian format from CPU format */
#define endian_convert_TxPD(x)                                                 \
	{                                                                      \
		(x)->tx_pkt_length = wlan_cpu_to_le16((x)->tx_pkt_length);     \
		(x)->tx_pkt_offset = wlan_cpu_to_le16((x)->tx_pkt_offset);     \
		(x)->tx_pkt_type = wlan_cpu_to_le16((x)->tx_pkt_type);         \
		(x)->tx_control = wlan_cpu_to_le32((x)->tx_control);           \
		(x)->tx_control_1 = wlan_cpu_to_le32((x)->tx_control_1);       \
	}
/** Convert RxPD from little endian format to CPU format */
#define endian_convert_RxPD(x)                                                 \
	{                                                                      \
		(x)->rx_pkt_length = wlan_le16_to_cpu((x)->rx_pkt_length);     \
		(x)->rx_pkt_offset = wlan_le16_to_cpu((x)->rx_pkt_offset);     \
		(x)->rx_pkt_type = wlan_le16_to_cpu((x)->rx_pkt_type);         \
		(x)->seq_num = wlan_le16_to_cpu((x)->seq_num);                 \
		(x)->rx_info = wlan_le32_to_cpu((x)->rx_info);
}

/** Convert RxPD extra header from little endian format to CPU format */
#define endian_convert_RxPD_extra_header(x)                                    \
	do {                                                                   \
		(x)->channel_flags = wlan_le16_to_cpu((x)->channel_flags);     \
		(x)->vht_he_sig1 = wlan_le32_to_cpu((x)->vht_he_sig1);         \
		(x)->vht_he_sig2 = wlan_le32_to_cpu((x)->vht_he_sig2);         \
		(x)->user_idx = wlan_le32_to_cpu((x)->user_idx);               \
	} while (0)
#else
/** Convert ulong n/w to host */
#define mlan_ntohl(x) swap_byte_32(x)
/** Convert host ulong to n/w */
#define mlan_htonl(x) swap_byte_32(x)
/** Convert n/w to host */
#define mlan_ntohs(x) swap_byte_16(x)
/** Convert host to n/w */
#define mlan_htons(x) swap_byte_16(x)
/** Do nothing */
#define wlan_le16_to_cpu(x) x
/** Do nothing */
#define wlan_le32_to_cpu(x) x
/** Do nothing */
#define wlan_le64_to_cpu(x) x
/** Do nothing */
#define wlan_cpu_to_le16(x) x
/** Do nothing */
#define wlan_cpu_to_le32(x) x
/** Do nothing */
#define wlan_cpu_to_le64(x) x

/** Convert TxPD to little endian format from CPU format */
#define endian_convert_TxPD(x)                                                 \
	do {                                                                   \
	} while (0)
/** Convert RxPD from little endian format to CPU format */
#define endian_convert_RxPD(x)                                                 \
	do {                                                                   \
	} while (0)
/** Convert RxPD extra header from little endian format to CPU format */
#define endian_convert_RxPD_extra_header(x)                                    \
	do {                                                                   \
	} while (0)
#endif /* BIG_ENDIAN_SUPPORT */

/** Global moal_assert_callback */
extern t_void (*assert_callback)(t_void *pmoal_handle, t_u32 cond);

/** Assertion */
#define MASSERT(cond)                                                          \
	do {                                                                   \
		if (!(cond)) {                                                 \
			PRINTM(MFATAL, "ASSERT: %s: %i\n", __func__,           \
			       __LINE__);                                      \
			if (assert_callback) {                                 \
				assert_callback(MNULL, (t_ptr)(cond));         \
			} else {                                               \
				do {                                           \
				} while (1);                                   \
			}                                                      \
		}                                                              \
	} while (0)

/** Maximum event buffer size */
#define MAX_EVENT_SIZE (3 * 1024)

#ifdef STA_SUPPORT
/** Maximum buffer size for ARP filter */
#define ARP_FILTER_MAX_BUF_SIZE 68
#endif /* STA_SUPPORT */

/** 60 seconds */
#define MRVDRV_TIMER_60S 60000
/** 10 seconds */
#define MRVDRV_TIMER_10S 10000
/** 5 seconds */
#define MRVDRV_TIMER_5S 5000
/** 3 seconds */
#define MRVDRV_TIMER_3S 3000
/** 1 second */
#define MRVDRV_TIMER_1S 1000

/** Maximum size of multicast list */
#define MRVDRV_MAX_MULTICAST_LIST_SIZE 32
/** Maximum size of channel */
#define MRVDRV_MAX_CHANNEL_SIZE 14
/** Maximum length of SSID */
#define MRVDRV_MAX_SSID_LENGTH 32
/** WEP list macros & data structures */
/** Size of key buffer in bytes */
#define MRVL_KEY_BUFFER_SIZE_IN_BYTE 16
/** Maximum length of WPA key */
#define MRVL_MAX_KEY_WPA_KEY_LENGTH 32

/** Default listen interval */
#define MLAN_DEFAULT_LISTEN_INTERVAL 20

/** Maximum number of region codes */
#define MRVDRV_MAX_REGION_CODE 9

/** Maximum number of CFP codes for BG */
#define MRVDRV_MAX_CFP_CODE_BG 0
/** Maximum number of CFP codes for A */
#define MRVDRV_MAX_CFP_CODE_A 5

/** high rx pending packets */
#define HIGH_RX_PENDING 1000
/** low rx pending packets */
#define LOW_RX_PENDING 800

/** Default region code */
#define MRVDRV_DEFAULT_REGION_CODE 0x10
/** Default country code */
#define MRVDRV_DEFAULT_COUNTRY_CODE "US"

/** Japan country code */
#define COUNTRY_CODE_JP_40 0x40
/** Japan special country code */
#define COUNTRY_CODE_JP_FF 0xFF

/** Default factor for calculating beacon average */
#define DEFAULT_BCN_AVG_FACTOR 8
/** Default factor for calculating data average */
#define DEFAULT_DATA_AVG_FACTOR 8

/** The first valid channel for use */
#define FIRST_VALID_CHANNEL 0xff
/** Default Ad-Hoc channel */
#define DEFAULT_AD_HOC_CHANNEL 6
/** Default Ad-Hoc channel A */
#define DEFAULT_AD_HOC_CHANNEL_A 36

/** Number of WEP keys */
#define MRVL_NUM_WEP_KEY (4)

/** Default multiple DTIM */
#define MRVDRV_DEFAULT_MULTIPLE_DTIM 1

/** Default beacon missing timeout */
#define DEFAULT_BCN_MISS_TIMEOUT 10

/** Maximum buffer space for beacons retrieved from scan responses */
#define MAX_SCAN_BEACON_BUFFER 102400
/** Default buffer space for beacons retrieved from scan responses */
#define DEFAULT_SCAN_BEACON_BUFFER 4096

/**
 * @brief Buffer pad space for newly allocated beacons/probe responses
 *
 * Beacons are typically 6 bytes longer than an equivalent probe response.
 *  For each scan response stored, allocate an extra byte pad at the end to
 *  allow easy expansion to store a beacon in the same memory a probe response
 *  previously contained
 */
#define SCAN_BEACON_ENTRY_PAD 6

/** Scan time specified in the channel TLV
 *  for each channel for passive scans
 */
#define MRVDRV_PASSIVE_SCAN_CHAN_TIME 200

/** Scan time specified in the channel TLV
 *  for each channel for active scans
 */
#define MRVDRV_ACTIVE_SCAN_CHAN_TIME 200

/** Scan time specified in the channel TLV
 *  for each channel for specific scans
 */
#define MRVDRV_SPECIFIC_SCAN_CHAN_TIME 110

/**
 * Max total scan time in milliseconds
 * The total scan time should be less than scan command timeout value (20s)
 */
#define MRVDRV_MAX_TOTAL_SCAN_TIME (MRVDRV_TIMER_10S * 2 - MRVDRV_TIMER_1S)

/** Offset for GTK as it has version to skip past for GTK */
#define RSN_GTK_OUI_OFFSET 2

/** If OUI is not found */
#define MLAN_OUI_NOT_PRESENT 0
/** If OUI is found */
#define MLAN_OUI_PRESENT 1

/** Is cmd_resp, event or data packet received? */
#define IS_CARD_RX_RCVD(adapter)                                               \
	(adapter->cmd_resp_received || adapter->event_received ||              \
	 adapter->data_received)
#ifdef USB
/** Type length */
#define MLAN_TYPE_LEN 4
/** Type Command */
#define MLAN_USB_TYPE_CMD 0xF00DFACE
/** Type VDLL */
#define MLAN_USB_TYPE_VDLL 0xF00DC0DE
/** Type Data */
#define MLAN_USB_TYPE_DATA 0xBEADC0DE
/** Type Event */
#define MLAN_USB_TYPE_EVENT 0xBEEFFACE
#endif /* USB */
/** Type command */
#define MLAN_TYPE_CMD 1
/** Type data */
#define MLAN_TYPE_DATA 0
/** Type event */
#define MLAN_TYPE_EVENT 3
/** Type vdll */
#define MLAN_TYPE_VDLL 4
#ifdef SDIO
/** Type single port aggr data */
#define MLAN_TYPE_SPA_DATA 10
/** OFFSET of 512 block number */
#define OFFSET_OF_BLOCK_NUMBER 15
/** OFFSET of SDIO Header */
#define OFFSET_OF_SDIO_HEADER 28
/** sdio max rx size for cmd53, 255 * 256, reserve 1 block for DMA alignment */
#define SDIO_CMD53_MAX_SIZE 65280
#define MAX_SUPPORT_AMSDU_SIZE 4096
/** Maximum numbfer of registers to read for multiple port */
#define MAX_MP_REGS 196
/** Maximum port */
#define MAX_PORT 32
/** Maximum port 16 */
#define MAX_PORT_16 (16)

/** max MP REGS */
#define MAX_MP_REGS_MAX (196)

/** Multi port TX aggregation buffer size */
#define SDIO_MP_TX_AGGR_DEF_BUF_SIZE (65280) /* 64K - 256 */

/** Multi port RX aggregation buffer size */
#define SDIO_MP_RX_AGGR_DEF_BUF_SIZE (65280) /* 64K - 256 */

#endif /* SDIO */

/** Minimum BA threshold */
#define MIN_BA_THRESHOLD 16

/** High threshold at which to start drop packets */
#define RX_HIGH_THRESHOLD 1024
/** Low threshold to allow Rx BA */
#define RX_LOW_THRESHOLD 128

#define MFG_CMD_SET_TEST_MODE 1
#define MFG_CMD_UNSET_TEST_MODE 0
#define MFG_CMD_TX_ANT 0x1004
#define MFG_CMD_RX_ANT 0x1005
#define MFG_CMD_TX_CONT 0x1009
#define MFG_CMD_RF_CHAN 0x100A
#define MFG_CMD_CLR_RX_ERR 0x1010
#define MFG_CMD_TX_FRAME 0x1021
#define MFG_CMD_RF_BAND_AG 0x1034
#define MFG_CMD_RF_CHANNELBW 0x1044
#define MFG_CMD_RADIO_MODE_CFG 0x1211
#define MFG_CMD_CONFIG_MAC_HE_TB_TX 0x110A
#define MFG_CMD_CONFIG_TRIGGER_FRAME 0x110C

/** Debug command number */
#define DBG_CMD_NUM 10

/** scan GAP value is optional */
#define GAP_FLAG_OPTIONAL MBIT(15)

/** Info for debug purpose */
typedef struct _wlan_dbg {
	/** Number of host to card command failures */
	t_u32 num_cmd_host_to_card_failure;
	/** Number of host to card sleep confirm failures */
	t_u32 num_cmd_sleep_cfm_host_to_card_failure;
	/** Number of host to card Tx failures */
	t_u32 num_tx_host_to_card_failure;
	/** Number of card to host command/event failures */
	t_u32 num_cmdevt_card_to_host_failure;
	/** Number of card to host Rx failures */
	t_u32 num_rx_card_to_host_failure;
	/** Number of interrupt read failures */
	t_u32 num_int_read_failure;
	/** Last interrupt status */
	t_u32 last_int_status;
	/** Number of allocate buffer failure */
	t_u32 num_alloc_buffer_failure;
	/** Number of pkt dropped */
	t_u32 num_pkt_dropped;
	/** Number of deauthentication events */
	t_u32 num_event_deauth;
	/** Number of disassosiation events */
	t_u32 num_event_disassoc;
	/** Number of link lost events */
	t_u32 num_event_link_lost;
	/** Number of deauthentication commands */
	t_u32 num_cmd_deauth;
	/** Number of association comamnd successes */
	t_u32 num_cmd_assoc_success;
	/** Number of association command failures */
	t_u32 num_cmd_assoc_failure;
	/** Number of consecutive association command failures */
	t_u32 num_cons_assoc_failure;

	/** Timeout command ID */
	t_u16 timeout_cmd_id;
	/** Timeout command action */
	t_u16 timeout_cmd_act;
	/** List of last command IDs */
	t_u16 last_cmd_id[DBG_CMD_NUM];
	/** List of last command actions */
	t_u16 last_cmd_act[DBG_CMD_NUM];
	/** Last command index */
	t_u16 last_cmd_index;
	/** List of last command response IDs */
	t_u16 last_cmd_resp_id[DBG_CMD_NUM];
	/** Last command response index */
	t_u16 last_cmd_resp_index;
	/** List of last events */
	t_u16 last_event[DBG_CMD_NUM];
	/** Last event index */
	t_u16 last_event_index;
	/** Number of no free command node */
	t_u16 num_no_cmd_node;
} wlan_dbg;

/** Hardware status codes */
typedef enum _WLAN_HARDWARE_STATUS {
	WlanHardwareStatusReady,
	WlanHardwareStatusGetHwSpec,
	WlanHardwareStatusGetHwSpecdone,
	WlanHardwareStatusInitializing,
	WlanHardwareStatusInitdone,
	WlanHardwareStatusReset,
	WlanHardwareStatusClosing,
	WlanHardwareStatusNotReady
} WLAN_HARDWARE_STATUS;

/** WLAN_802_11_POWER_MODE */
typedef enum _WLAN_802_11_POWER_MODE {
	Wlan802_11PowerModeCAM,
	Wlan802_11PowerModePSP
} WLAN_802_11_POWER_MODE;

/** tx param */
typedef struct _mlan_tx_param {
	/** next packet length */
	t_u32 next_pkt_len;
} mlan_tx_param;

/** PS_STATE */
typedef enum _PS_STATE {
	PS_STATE_AWAKE,
	PS_STATE_PRE_SLEEP,
	PS_STATE_SLEEP_CFM,
	PS_STATE_SLEEP
} PS_STATE;

/** Tx BA stream table */
typedef struct _TxBAStreamTbl TxBAStreamTbl;

/** Add BA parameter data structure */
typedef struct {
	/** Window size for initiator */
	t_u32 tx_win_size;
	/** Window size for receiver */
	t_u32 rx_win_size;
	/** Block ack timeout */
	t_u32 timeout;
	/** amsdu support for ADDBA request */
	t_u8 tx_amsdu;
	/** amsdu support for ADDBA response */
	t_u8 rx_amsdu;
} add_ba_param_t;

/** Tx aggregation data structure */
typedef struct _txAggr_t {
	/** AMPDU user */
	t_u8 ampdu_user;
	/** AMPDU AP */
	t_u8 ampdu_ap;
	/** AMSDU */
	t_u8 amsdu;
} tx_aggr_t;

/** del ba threshold */
#define DEL_BA_THRESHOLD 10
/** BA stream status */
typedef enum _baStatus_e {
	BA_STREAM_NOT_SETUP = 0,
	BA_STREAM_SETUP_INPROGRESS,
	BA_STREAM_SETUP_SENT_ADDBA,
	BA_STREAM_SETUP_COMPLETE,
	BA_STREAM_SENT_DELBA,
} baStatus_e;

/** RA list table */
typedef struct _raListTbl raListTbl, *praListTbl;

/** RA list table */
struct _raListTbl {
	/** Pointer to previous node */
	raListTbl *pprev;
	/** Pointer to next node */
	raListTbl *pnext;
	/** Buffer list head */
	mlan_list_head buf_head;
	/** RA list buffer */
	t_u8 ra[MLAN_MAC_ADDR_LENGTH];
	/** total packets in RA list */
	t_u16 total_pkts;
	/** packets received */
	t_u16 packet_count;
	/** packet count threshold to setup BA */
	t_u8 ba_packet_threshold;
	/** is 11n enabled */
	t_u8 is_wmm_enabled;
	/** max amsdu size */
	t_u16 max_amsdu;
	/** BA stream status */
	baStatus_e ba_status;
	/** del ba count */
	t_u8 del_ba_count;
	/** amsdu in ampdu flag */
	t_u8 amsdu_in_ampdu;
	/** tdls flag */
	t_u8 is_tdls_link;
	/** tx_pause flag */
	t_u8 tx_pause;
};

/** TID table */
typedef struct _tidTbl {
	/** RA list head */
	mlan_list_head ra_list;
	/** Current RA list */
	raListTbl *ra_list_curr;
} tid_tbl_t;

/** Highest priority setting for a packet (uses voice AC) */
#define WMM_HIGHEST_PRIORITY 7
/** Highest priority TID  */
#define HIGH_PRIO_TID 7
/** Lowest priority TID  */
#define LOW_PRIO_TID 0
/** No packet priority (< lowest) */
#define NO_PKT_PRIO_TID -1

/** Max driver packet delay in msec */
#define WMM_DRV_DELAY_MAX 510

/** Struct of WMM DESC */
typedef struct _wmm_desc {
	/** TID table */
	tid_tbl_t tid_tbl_ptr[MAX_NUM_TID];
	/** Packets out */
	t_u32 packets_out[MAX_NUM_TID];
	/** Packets queued */
	t_u32 pkts_queued[MAX_NUM_TID];
	/** Packets paused */
	t_u32 pkts_paused[MAX_NUM_TID];
	/** Spin lock to protect ra_list */
	t_void *ra_list_spinlock;

	/** AC status */
	WmmAcStatus_t ac_status[MAX_AC_QUEUES];
	/** AC downgraded values */
	mlan_wmm_ac_e ac_down_graded_vals[MAX_AC_QUEUES];

	/** Max driver packet delay sent to the firmware for expiry eval */
	t_u32 drv_pkt_delay_max;

	/** WMM queue priority table */
	t_u8 queue_priority[MAX_AC_QUEUES];
	/** User priority packet transmission control */
	t_u32 user_pri_pkt_tx_ctrl[WMM_HIGHEST_PRIORITY + 1]; /* UP: 0 to 7 */

	/** Number of transmit packets queued */
	mlan_scalar tx_pkts_queued;
	/** Tracks highest priority with a packet queued */
	mlan_scalar highest_queued_prio;
} wmm_desc_t;

/** Security structure */
typedef struct _wlan_802_11_security_t {
	/** WPA enabled flag */
	t_u8 wpa_enabled;
	/** E-Supplicant enabled flag */
	t_u8 ewpa_enabled;
	/** WPA2 enabled flag */
	t_u8 wpa2_enabled;
	/** WAPI enabled flag */
	t_u8 wapi_enabled;
	/** WAPI key on flag */
	t_u8 wapi_key_on;
	/** WEP status */
	WLAN_802_11_WEP_STATUS wep_status;
	/** Authentication mode */
	t_u32 authentication_mode;
	/** Encryption mode */
	t_u32 encryption_mode;
	/** Hotspot OSEN enabled */
	t_u8 osen_enabled;
	/** Group Encryption mode */
	t_u32 group_encryption_mode;
} wlan_802_11_security_t;

/** Current Basic Service Set State Structure */
typedef struct {
	/** BSS descriptor */
	BSSDescriptor_t bss_descriptor;
	/** WMM enable? */
	t_u8 wmm_enabled;
	/** Uapsd enable?*/
	t_u8 wmm_uapsd_enabled;
	/** Band */
	t_u16 band;
	/** Number of rates supported */
	t_u32 num_of_rates;
	/** Supported rates*/
	t_u8 data_rates[WLAN_SUPPORTED_RATES];
	/** Host MLME flag*/
	t_u8 host_mlme;
	mlan_802_11_mac_addr prev_bssid;
	t_u8 use_mfp;
} current_bss_params_t;

/** Sleep_params */
typedef struct _sleep_params_t {
	/** Sleep parameter error */
	t_u16 sp_error;
	/** Sleep parameter offset */
	t_u16 sp_offset;
	/** Sleep parameter stable time */
	t_u16 sp_stable_time;
	/** Sleep parameter calibration control */
	t_u8 sp_cal_control;
	/** Sleep parameter external sleep clock */
	t_u8 sp_ext_sleep_clk;
	/** Sleep parameter reserved */
	t_u16 sp_reserved;
} sleep_params_t;

/** Sleep_period */
typedef struct sleep_period_t {
	/** Sleep period */
	t_u16 period;
	/** Reserved */
	t_u16 reserved;
} sleep_period_t;

/** mrvl_wep_key_t */
typedef struct _mrvl_wep_key_t {
	/** Length */
	t_u32 length;
	/** WEP key index */
	t_u32 key_index;
	/** WEP key length */
	t_u32 key_length;
	/** WEP keys */
	t_u8 key_material[MRVL_KEY_BUFFER_SIZE_IN_BYTE];
} mrvl_wep_key_t;

/** Maximum number of region channel */
#define MAX_REGION_CHANNEL_NUM 2

/** Region-band mapping table */
typedef struct _region_chan_t {
	/** TRUE if this entry is valid */
	t_u8 valid;
	/** Region code for US, Japan ... */
	t_u8 region;
	/** Band B/G/A, used for BAND_CONFIG cmd */
	t_u16 band;
	/** Actual No. of elements in the array below */
	t_u8 num_cfp;
	/** chan-freq-txpower mapping table */
	chan_freq_power_t *pcfp;
} region_chan_t;

/** State of 11d */
typedef enum _state_11d_t {
	DISABLE_11D = 0,
	ENABLE_11D = 1,
} state_11d_t;

#define DEFAULT_11D_STATE DISABLE_11D

/** Domain regulatory information */
typedef struct _wlan_802_11d_domain_reg {
	/** dfs_region */
	t_u8 dfs_region;
	/** Country Code */
	t_u8 country_code[COUNTRY_CODE_LEN];
	/** band that channels in sub_band belong to */
	t_u16 band;
	/** No. of subband in below */
	t_u8 no_of_sub_band;
	/** Subband data to send/last sent */
	IEEEtypes_SubbandSet_t sub_band[MRVDRV_MAX_SUBBAND_802_11D];
} wlan_802_11d_domain_reg_t;

/** Data for state machine */
typedef struct _wlan_802_11d_state {
	/** True for enabling 11D */
	state_11d_t enable_11d;
	/** True for user enabling 11D */
	state_11d_t user_enable_11d;
} wlan_802_11d_state_t;

/** 802.11h State information kept in the 'mlan_private' driver structure */
typedef struct {
	/** Indicate 11h is enabled from host */
	t_bool is_11h_host;
	/** Indicates whether 11h is enabled in the driver */
	t_bool is_11h_enabled;
	/** Indicates whether 11h is active in the firmware */
	t_bool is_11h_active;
	/** Master device using automatic channel select */
	t_bool adhoc_auto_sel_chan;
	/** Set when driver receives a STOP TX event from fw */
	t_bool tx_disabled;
	/** Channel that ChanSwAnn was received for, non-zero = active */
	t_u8 dfs_slave_csa_chan;
	/** Expiry for above variable, seconds in system time */
	t_u32 dfs_slave_csa_expire_at_sec;
} wlan_11h_interface_state_t;

#if defined(UAP_SUPPORT)
/** UAP get info callback state kept in the 'mlan_private' driver structure */
typedef struct {
	/** UAP internal callback after wlan_uap_get_channel */
	/**  (parameter is really pointer to mlan_private)   */
	mlan_status (*get_chan_callback)(t_void *);
	/** current ioctl_req (to be completed in callback) */
	pmlan_ioctl_req pioctl_req_curr;
	/** band config from MrvlIEtypes_channel_band_t */
	Band_Config_t bandcfg;
	/** channel from MrvlIEtypes_channel_band_t */
	t_u8 channel;
	/** beacon period (in msec) from MrvlIEtypes_beacon_period_t */
	t_u16 beacon_period;
	/** dtim period (no unit) from MrvlIEtypes_dtim_period_t */
	t_u8 dtim_period;
} wlan_uap_get_info_cb_t;
#endif

/** Data structure for WPS information */
typedef struct {
	/** WPS IE */
	IEEEtypes_VendorSpecific_t wps_ie;
	/** Session enable flag */
	t_u8 session_enable;
} wps_t;

/** mlan_operations data structure */
typedef struct _mlan_operations {
	/** cmd init handler */
	mlan_status (*init_cmd)(t_void *priv, t_u8 first_bss);
	/** ioctl handler */
	mlan_status (*ioctl)(t_void *adapter, pmlan_ioctl_req pioctl_req);
	/** cmd handler */
	mlan_status (*prepare_cmd)(t_void *priv, t_u16 cmd_no, t_u16 cmd_action,
				   t_u32 cmd_oid, t_void *pioctl_buf,
				   t_void *pdata_buf, t_void *pcmd_buf);
	/** cmdresp handler */
	mlan_status (*process_cmdresp)(t_void *priv, t_u16 cmdresp_no,
				       t_void *pcmd_buf, t_void *pioctl);
	/** rx handler */
	mlan_status (*process_rx_packet)(t_void *adapter, pmlan_buffer pmbuf);
	/** event handler */
	mlan_status (*process_event)(t_void *priv);
	/** txpd handler */
	t_void *(*process_txpd)(t_void *priv, pmlan_buffer pmbuf);
	/** BSS role */
	mlan_bss_role bss_role;
} mlan_operations, *pmlan_operations;

/** Private structure for MLAN */
typedef struct _mlan_private {
	/** Pointer to mlan_adapter */
	struct _mlan_adapter *adapter;
	/** BSS index */
	t_u8 bss_index;
	/** BSS type */
	t_u8 bss_type;
	/** BSS role */
	t_u8 bss_role;
	/** BSS virtual flag */
	t_u8 bss_virtual;
	/** BSS Priority */
	t_u8 bss_priority;
	/** BSS number */
	t_u8 bss_num;
	/** Frame type */
	t_u8 frame_type;
	/** MAC address information */
	t_u8 curr_addr[MLAN_MAC_ADDR_LENGTH];
	/** Media connection status */
	t_bool media_connected;

	/** Current packet filter */
	t_u32 curr_pkt_filter;
	/** Infrastructure mode */
	t_u32 bss_mode;

	/** Tx packet control */
	t_u32 pkt_tx_ctrl;

	/** Tx power level */
	t_s16 tx_power_level;
	/** Maximum Tx power level */
	t_s8 max_tx_power_level;
	/** Minimum Tx power level */
	t_s8 min_tx_power_level;
	/** Tx rate */
	t_u8 tx_rate;
	t_u8 tx_rate_info;
	/*HE tx tone mode and DCM info*/
	t_u8 ext_tx_rate_info;
	/*HE rx tone mode and DCM info*/
	t_u8 rxpd_rx_info;
	/** rxpd_htinfo */
	t_u8 rxpd_rate_info;
	/** max amsdu size */
	t_u16 max_amsdu;
	/** amsdu disable flag */
	t_u8 amsdu_disable;
	/** 802.11n Device Capabilities for 2.4GHz */
	t_u32 usr_dot_11n_dev_cap_bg;
	/** 802.11n Device Capabilities for 5GHz */
	t_u32 usr_dot_11n_dev_cap_a;
	/** MIMO abstraction of MCSs supported by device */
	t_u8 usr_dev_mcs_support;
#ifdef UAP_SUPPORT
	/** UAP 11n flag */
	t_u8 is_11n_enabled;
#endif /* UAP_SUPPORT */
	/** UAP 11ac flag */
	t_u8 is_11ac_enabled;
	/** UAP 11ax flag */
	t_u8 is_11ax_enabled;
	/** tx vht_info */
	t_u8 tx_vhtinfo;
	/** rxpd_vhtinfo */
	t_u8 rxpd_vhtinfo;
	/** 802.11ac Device Capabilities for 2.4GHz */
	t_u32 usr_dot_11ac_dev_cap_bg;
	/** 802.11ac Device Capabilities for 5GHz */
	t_u32 usr_dot_11ac_dev_cap_a;
	/** MIMO abstraction of MCSs supported by device */
	t_u32 usr_dot_11ac_mcs_support;
	/** user dot 11ac_BW */
	t_u8 usr_dot_11ac_bw;
	/** user dot 11ac_opermode_BW */
	t_u8 usr_dot_11ac_opermode_bw;
	/** user dot 11ac_opermode_nss */
	t_u8 usr_dot_11ac_opermode_nss;
	/** length of hw he capability */
	t_u8 user_hecap_len;
	/** user configured 802.11ax HE capability */
	t_u8 user_he_cap[54];
	/** length of hw he capability */
	t_u8 user_2g_hecap_len;
	/** user configured 802.11ax HE capability */
	t_u8 user_2g_he_cap[54];
	/**  dropped pkts */
	t_u32 num_drop_pkts;
#ifdef UAP_SUPPORT
	/** packet forward control */
	t_u8 pkt_fwd;
#endif
	/** TX beamforming capability */
	t_u32 tx_bf_cap;
	/** Rx PD rate */
	t_u8 rxpd_rate;
	/** Bitmap rates */
	t_u16 bitmap_rates[MAX_BITMAP_RATES_SIZE];
	/** Data rate */
	t_u32 data_rate;
	/** Automatic data rate flag */
	t_u8 is_data_rate_auto;
	/** Factor for calculating beacon average */
	t_u16 bcn_avg_factor;
	/** Factor for calculating data average */
	t_u16 data_avg_factor;
	/** SNR */
	t_s8 snr;
	/** Noise Floor */
	t_s8 nf;
	/** Last data RSSI */
	t_s16 data_rssi_last;
	/** Last data Noise Floor */
	t_s16 data_nf_last;
	/** Average data RSSI */
	t_s16 data_rssi_avg;
	/** Averag data Noise Floor */
	t_s16 data_nf_avg;
	/** Last beacon RSSI */
	t_s16 bcn_rssi_last;
	/** Last beacon Noise Floor */
	t_s16 bcn_nf_last;
	/** Average beacon RSSI */
	t_s16 bcn_rssi_avg;
	/** Average beacon Noise Floor */
	t_s16 bcn_nf_avg;
	/** Attempted BSS descriptor */
	BSSDescriptor_t *pattempted_bss_desc;

	/** GTK rekey data*/
	mlan_ds_misc_gtk_rekey_data gtk_rekey;

	/** Current SSID/BSSID related parameters*/
	current_bss_params_t curr_bss_params;
	/** current channel flags */
	t_u32 curr_chan_flags;
	/** User selected bands */
	t_u16 config_bands;

	/** Beacon period */
	t_u16 beacon_period;
	/** Listen interval */
	t_u16 listen_interval;
	/** ATIM window */
	t_u16 atim_window;

	/** AdHoc channel */
	t_u8 adhoc_channel;
	/** AdHoc link sensed flag */
	t_u8 adhoc_is_link_sensed;
	/** AdHoc operating state */
	t_u8 adhoc_state;
#if defined(STA_SUPPORT)
	/** AdHoc operating state backup */
	t_u8 adhoc_state_prev;
	/** AdHoc previous ssid used for Start */
	mlan_802_11_ssid adhoc_last_start_ssid;
#endif
	mlan_ds_11h_chan_rep_req chan_rep_req;
	/** FSM variable for 11d support */
	wlan_802_11d_state_t state_11d;
	/** FSM variable for 11h support */
	wlan_11h_interface_state_t intf_state_11h;
#ifdef UAP_SUPPORT
	/** Whether UAP interface has started */
	t_bool uap_bss_started;
	/** Whether UAP interface start from hostapd */
	t_bool uap_host_based;
	/**UAP operating channel*/
	t_u8 uap_channel;
	/**UAP bandwidth*/
	t_u8 uap_bandwidth;
	/** state variable for UAP Get Info callback */
	wlan_uap_get_info_cb_t uap_state_chan_cb;
#endif /* UAP_SUPPORT */

	/** Security related */
	/** Encryption parameter */
	wlan_802_11_security_t sec_info;
	/** WEP keys */
	mrvl_wep_key_t wep_key[MRVL_NUM_WEP_KEY];
	/** Current WEP key index */
	t_u16 wep_key_curr_index;
	/** EWPA query 0: disable, 1: enable */
	t_u8 ewpa_query;
	/** Encryption Key*/
	t_u8 wpa_ie[256];
	/** WPA IE length */
	t_u8 wpa_ie_len;
	/** GTK set flag */
	t_u8 wpa_is_gtk_set;
	/** AES key material */
	mlan_ds_encrypt_key aes_key;
#if defined(STA_SUPPORT)
	/* Mgmt Frame Protection config */
	mlan_ds_misc_pmfcfg pmfcfg;
#endif
	/** WAPI IE */
	t_u8 wapi_ie[256];
	/** WAPI IE length */
	t_u8 wapi_ie_len;
	/** OSEN IE */
	t_u8 osen_ie[256];
	/** OSEN IE length */
	t_u8 osen_ie_len;
	/** Pointer to the station table */
	mlan_list_head sta_list;
	/** tdls pending queue */
	mlan_list_head tdls_pending_txq;
	t_u16 tdls_idle_time;

	/** MGMT IE */
	custom_ie mgmt_ie[MAX_MGMT_IE_INDEX];
	/** mgmt frame passthru mask */
	t_u32 mgmt_frame_passthru_mask;
	/** WMM required */
	t_u8 wmm_required;
	/** WMM enabled */
	t_u8 wmm_enabled;
	/** WMM qos info */
	t_u8 wmm_qosinfo;
	/** saved WMM qos info */
	t_u8 saved_wmm_qosinfo;
	/**host tdls uapsd support*/
	t_u8 host_tdls_uapsd_support;
	/**host tdls channel switch support*/
	t_u8 host_tdls_cs_support;
	/**supported channel IE len*/
	t_u8 chan_supp_len;
	/**save channel support IE*/
	t_u8 chan_supp[MAX_IE_SIZE];
	/**supported regulatory classl IE len*/
	t_u8 supp_regulatory_class_len;
	/**save support channel regulatory class IE*/
	t_u8 supp_regulatory_class[MAX_IE_SIZE];
	/**tdls cs off channel*/
	t_u8 tdls_cs_channel;
	/** WMM related variable*/
	wmm_desc_t wmm;

	/** Pointer to the Transmit BA stream table*/
	mlan_list_head tx_ba_stream_tbl_ptr;
	/** Pointer to the priorities for AMSDU/AMPDU table*/
	tx_aggr_t aggr_prio_tbl[MAX_NUM_TID];
	/** Pointer to the priorities for AMSDU/AMPDU table*/
	t_u8 addba_reject[MAX_NUM_TID];
	/** Pointer to the priorities for AMSDU/AMPDU table*/
	t_u8 ibss_ampdu[MAX_NUM_TID];
	/** Pointer to the priorities for AMSDU/AMPDU table*/
	t_u8 ibss_addba_reject[MAX_NUM_TID];
	/** Struct to store ADDBA parameters */
	add_ba_param_t add_ba_param;
	/**  user rx_win_size */
	t_u32 user_rxwinsize;
	/** last rx_seq */
	t_u16 rx_seq[MAX_NUM_TID];
	/** Pointer to the Receive Reordering table*/
	mlan_list_head rx_reorder_tbl_ptr;
	/** Lock for Rx packets */
	t_void *rx_pkt_lock;

#ifdef STA_SUPPORT
	/** Buffer to store the association response for application retrieval
	 */
	t_u8 assoc_rsp_buf[MRVDRV_ASSOC_RSP_BUF_SIZE];
	/** Length of the data stored in assoc_rsp_buf */
	t_u32 assoc_rsp_size;
	/** Buffer to store the association req IEs */
	t_u8 assoc_req_buf[MRVDRV_ASSOC_RSP_BUF_SIZE];
	/** Length of the data stored in assoc_rsp_buf */
	t_u32 assoc_req_size;
	/** Generic IEEE IEs passed from the application to be inserted into the
	 *    association request to firmware
	 */
	t_u8 gen_ie_buf[MRVDRV_GENIE_BUF_SIZE];
	/** Length of the data stored in gen_ie_buf */
	t_u8 gen_ie_buf_len;

	/** disconnect reason code*/
	t_u16 disconnect_reason_code;
	t_u8 *pcurr_bcn_buf;
	t_u32 curr_bcn_size;
	t_void *curr_bcn_buf_lock;

	/** WPS */
	wps_t wps;
#endif /* STA_SUPPORT */

	/** function table */
	mlan_operations ops;
	/** tx pause flag */
	t_u8 tx_pause;
	/** Port Control mode */
	t_u8 port_ctrl_mode;

	/** Port open flag */
	t_u8 port_open;

	/** Port open flag state at time of association attempt */
	t_u8 prior_port_status;
	/** Bypass TX queue */
	mlan_list_head bypass_txq;
	/** IP address operation */
	t_u32 op_code;
	/** IP address */
	t_u8 ip_addr[IPADDR_LEN];
	t_u32 hotspot_cfg;
#ifdef STA_SUPPORT
	ExtCap_t ext_cap;
	ExtCap_t def_ext_cap;
#endif
	/** interface header len */
	t_u8 intf_hr_len;
#ifdef USB
	/** USB data port */
	t_u32 port;
	/** port Index */
	t_u32 port_index;
#endif
	/** Control TX AMPDU on infra link */
	t_u8 txaggrctrl;
#if defined(DRV_EMBEDDED_AUTHENTICATOR) || defined(DRV_EMBEDDED_SUPPLICANT)
	t_void *psapriv;
#endif
	/** rx per packet info */
	t_u8 rx_pkt_info;
	/** received amsdu count*/
	t_u32 amsdu_rx_cnt;
	/** received msdu count in amsdu*/
	t_u32 msdu_in_rx_amsdu_cnt;
	/** tx amsdu count*/
	t_u32 amsdu_tx_cnt;
	/** tx msdu count in amsdu*/
	t_u32 msdu_in_tx_amsdu_cnt;
	/** channel load info for current channel */
	t_u16 ch_load_param;
	/** Noise floor value for current channel */
	t_s16 noise;
	/** rx quality info */
	t_u16 rx_quality;
} mlan_private, *pmlan_private;

typedef struct _assoc_logger {
	/** vendor specific */
	t_u8 oui[3];
	t_u8 bssid[MLAN_MAC_ADDR_LENGTH];
	t_u8 ssid[MLAN_MAX_SSID_LENGTH];
	t_s32 rssi;
	t_u32 channel;
} assoc_logger_data;

/** Tx BA stream table */
struct _TxBAStreamTbl {
	/** TxBAStreamTbl previous node */
	TxBAStreamTbl *pprev;
	/** TxBAStreamTbl next node */
	TxBAStreamTbl *pnext;
	/** TID */
	int tid;
	/** RA */
	t_u8 ra[MLAN_MAC_ADDR_LENGTH];
	/** BA stream status */
	baStatus_e ba_status;
	t_u8 amsdu;
};

/** RX reorder table */
typedef struct _RxReorderTbl RxReorderTbl;

typedef struct {
	/** Timer for flushing */
	t_void *timer;
	/** Timer set flag */
	t_u8 timer_is_set;
	/** RxReorderTbl ptr */
	RxReorderTbl *ptr;
	/** Priv pointer */
	mlan_private *priv;
} reorder_tmr_cnxt_t;

#define MLAN_SET_BIT(x, val) ((x) |= (1U << (val)))
#define MLAN_CLEAR_BIT(x, val) ((x) &= ~(1U << (val)))
/** default RX reorder table flush time 128 ms for AC_VI, AC_VO*/
#define DEF_FLUSH_TIME_AC_VI_VO 128
/** default RX reorder table flush time 512 ms for AC_BE, AC_BK*/
#define DEF_FLUSH_TIME_AC_BE_BK 512
/** minimal AMPDU flush time */
#define MIN_FLUSH_TIME 100
/** RX reorder table */
struct _RxReorderTbl {
	/** RxReorderTbl previous node */
	RxReorderTbl *pprev;
	/** RxReorderTbl next node */
	RxReorderTbl *pnext;
	/** TID */
	int tid;
	/** TA */
	t_u8 ta[MLAN_MAC_ADDR_LENGTH];
	/** Start window */
	int start_win;
	/** last_seq */
	int last_seq;
	/** Window size */
	int win_size;
	/** Pointer to pointer to RxReorderTbl */
	t_void **rx_reorder_ptr;
	/** Timer context */
	reorder_tmr_cnxt_t timer_context;
	/** BA stream status */
	baStatus_e ba_status;
	t_u8 amsdu;
	/** no packet drop flag for rx_reorder_tbl */
	t_u8 force_no_drop;
	/** flag for check start win */
	t_u8 check_start_win;
	/** pkt receive after BA setup */
	t_u8 pkt_count;
	/** flush data flag */
	t_u8 flush_data;
	/** BA window bitmap */
	t_u64 bitmap;
};

/** BSS priority node */
typedef struct _mlan_bssprio_node mlan_bssprio_node;

/** BSS priority node */
struct _mlan_bssprio_node {
	/** Pointer to previous node */
	mlan_bssprio_node *pprev;
	/** Pointer to next node */
	mlan_bssprio_node *pnext;
	/** Pointer to priv */
	pmlan_private priv;
};

/** BSS priority table */
typedef struct _mlan_bssprio_tbl mlan_bssprio_tbl;

/** BSS priority table */
struct _mlan_bssprio_tbl {
	/** BSS priority list head */
	mlan_list_head bssprio_head;
	/** Current priority node */
	mlan_bssprio_node *bssprio_cur;
};

/** cmd_ctrl_node */
typedef struct _cmd_ctrl_node cmd_ctrl_node;

/** _cmd_ctrl_node */
struct _cmd_ctrl_node {
	/** Pointer to previous node */
	cmd_ctrl_node *pprev;
	/** Pointer to next node */
	cmd_ctrl_node *pnext;
	/** Pointer to priv */
	pmlan_private priv;
	/** Command number */
	t_u32 cmd_no;
	/** Command flag */
	t_u32 cmd_flag;
	/** Pointer to mlan_buffer */
	mlan_buffer *cmdbuf;
	/** Pointer to mlan_buffer */
	mlan_buffer *respbuf;
	/** Command parameter */
	t_void *pdata_buf;
	/** Pointer to mlan_ioctl_req if command is from IOCTL */
	t_void *pioctl_buf;
#if defined(PCIE) || defined(SDIO)
	/** pre_allocated mlan_buffer for cmd */
	mlan_buffer *pmbuf;
#endif
};

/** default tdls wmm qosinfo */
#define DEFAULT_TDLS_WMM_QOS_INFO 15
/** default tdls sleep period */
#define DEFAULT_TDLS_SLEEP_PERIOD 30

/** TDLS status */
typedef enum _tdlsStatus_e {
	TDLS_NOT_SETUP = 0,
	TDLS_SETUP_INPROGRESS,
	TDLS_SETUP_COMPLETE,
	TDLS_SETUP_FAILURE,
	TDLS_TEAR_DOWN,
	TDLS_SWITCHING_CHANNEL,
	TDLS_IN_BASE_CHANNEL,
	TDLS_IN_OFF_CHANNEL,
} tdlsStatus_e;
/** station node */
typedef struct _sta_node sta_node, *psta_node;

/** station node*/
struct _sta_node {
	/** previous node */
	sta_node *pprev;
	/** next node */
	sta_node *pnext;
	/** station mac address */
	t_u8 mac_addr[MLAN_MAC_ADDR_LENGTH];
	/** wmm flag */
	t_u8 is_wmm_enabled;
	/** 11n flag */
	t_u8 is_11n_enabled;
	/** AMPDU STA */
	t_u8 ampdu_sta[MAX_NUM_TID];
	/** last rx_seq */
	t_u16 rx_seq[MAX_NUM_TID];
	/** max amsdu size */
	t_u16 max_amsdu;
	/** HT cap */
	IEEEtypes_HTCap_t HTcap;
	/** 11ac flag */
	t_u8 is_11ac_enabled;
	/** UAP 11ax flag */
	t_u8 is_11ax_enabled;
	IEEEtypes_HECap_t he_cap;
	/** SNR */
	t_s8 snr;
	/** Noise Floor */
	t_s8 nf;
	/** peer capability */
	t_u16 capability;
	/** tdls status */
	tdlsStatus_e status;
	/** flag for host based tdls */
	t_u8 external_tdls;
	/** peer support rates */
	t_u8 support_rate[32];
	/** rate size */
	t_u8 rate_len;
	/*Qos capability info*/
	t_u8 qos_info;
	/** HT info in TDLS setup confirm*/
	IEEEtypes_HTInfo_t HTInfo;
	/** peer BSSCO_20_40*/
	IEEEtypes_2040BSSCo_t BSSCO_20_40;
	/*Extended capability*/
	IEEEtypes_ExtCap_t ExtCap;
	/*RSN IE*/
	IEEEtypes_Generic_t rsn_ie;
	/**Link ID*/
	IEEEtypes_LinkIDElement_t link_ie;
	/** AID info */
	IEEEtypes_AID_t aid_info;
	/** VHT Capabilities IE */
	IEEEtypes_VHTCap_t vht_cap;
	/** VHT Operations IE */
	IEEEtypes_VHTOprat_t vht_oprat;
	/** HE Capabilities IE */
	IEEEtypes_HECap_t tdls_he_cap;
	/** HE Operations IE */
	IEEEtypes_HeOp_t he_op;
	/** wapi key on off flag */
	t_u8 wapi_key_on;
	/** tx pause status */
	t_u8 tx_pause;
	/** station band mode */
	t_u16 bandmode;
#if defined(DRV_EMBEDDED_AUTHENTICATOR) || defined(DRV_EMBEDDED_SUPPLICANT)
	t_void *cm_connectioninfo;
#endif
	sta_stats stats;
};

/** 802.11h State information kept in the 'mlan_adapter' driver structure */
typedef struct {
	/** Min TX Power capability sent to FW for 11h use and fw power control
	 */
	t_s8 min_tx_power_capability;
	/** Max TX Power capability sent to FW for 11h use and fw power control
	 */
	t_s8 max_tx_power_capability;
	/** User provisioned local power constraint sent in association requests
	 */
	t_s8 usr_def_power_constraint;
	/** Received CHANNEL_SWITCH_ANN event */
	t_bool recvd_chanswann_event;
	/** Indicates an interface wants to enable master radar detection */
	t_bool master_radar_det_enable_pending;
	/** Indicates an interface wants to enable slave radar detection */
	t_bool slave_radar_det_enable_pending;
	/** Indicates whether master radar detection active in the firmware */
	t_bool is_master_radar_det_active;
	/** Indicates whether slave radar detection active in the firmware */
	t_bool is_slave_radar_det_active;
	/** Quiet IE */
	IEEEtypes_Quiet_t quiet_ie;
} wlan_11h_device_state_t;

/** Enumeration for DFS Timestamp represents field */
enum _dfs_timestamp_repr_e {
	/** Ignore entry */
	DFS_TS_REPR_NOT_IN_USE = 0,
	/** NOP (Non-Occupancy Period) start time */
	DFS_TS_REPR_NOP_START = 1,
	/** CAC (Channel Availability Check) completion time */
	DFS_TS_REPR_CAC_COMPLETION
};

/** DFS Timestamp type used for marking NOP/CAC events */
typedef struct _wlan_dfs_timestamp_t wlan_dfs_timestamp_t;

/** DFS Timestamp type used for marking NOP/CAC events */
struct _wlan_dfs_timestamp_t {
	/** Pointer to previous node */
	wlan_dfs_timestamp_t *pprev;
	/** Pointer to next node */
	wlan_dfs_timestamp_t *pnext;
	/** WLAN Channel number */
	t_u8 channel;
	/** What this timestamp represents */
	t_u8 represents;
	/** reserved field */
	t_u16 reserved;
	/** timestamp - seconds */
	t_u32 ts_sec;
	/** timestamp - microseconds */
	t_u32 ts_usec;
};

/** DFS State information kept in the 'mlan_adapter' driver structure */
typedef struct {
	/** Indicates whether DFS channel check is occurring in firmware */
	t_bool dfs_check_pending;
	/** Indicates whether DFS channel check found radar */
	t_bool dfs_radar_found;
	/** Channel radar is being checked on.  BAND_A is assumed. */
	t_u8 dfs_check_channel;
	/** Channel radar is being checked on bandwidth*/
	t_u8 dfs_check_bandwidth;
	/** point to the priv which start the DFS check */
	t_void *dfs_check_priv;
	/** Timestamp when we got last report,
	 * to determine if data is old or not.
	 */
	t_u32 dfs_report_time_sec;
	/** List for holding dfs_timestamps for NOP/CAC events */
	mlan_list_head dfs_ts_head;
} wlan_dfs_device_state_t;

/** Enumeration for mlan_ds_11h_radar_det_hndlg stages */
enum _mlan_ds_11h_rdh_stages {
	RDH_OFF = 0,
	RDH_CHK_INTFS = 1,
	RDH_STOP_TRAFFIC,
	RDH_GET_INFO_CHANNEL,
	RDH_GET_INFO_BEACON_DTIM,
	RDH_SET_CUSTOM_IE,
	RDH_REM_CUSTOM_IE,
	RDH_STOP_INTFS,
	RDH_SET_NEW_CHANNEL,
	RDH_RESTART_INTFS,
	RDH_RESTART_TRAFFIC
};

/** State info for Radar Detected Handling kept in 'mlan_adapter' */
typedef struct {
	/** Stage (of Operation) */
	t_u8 stage;
	/** Number of interfaces to handle */
	t_u8 priv_list_count;
	/** Index of interface in process (used by some stages) */
	t_u8 priv_curr_idx;
	/** Current Channel (to leave) */
	t_u8 curr_channel;
	/** New Channel (to switch to) */
	t_u8 new_channel;
	/** UAP band_config */
	Band_Config_t uap_band_cfg;
	/** BEACON*DTIM period (in msec; max of STA/UAP) */
	t_u16 max_bcn_dtim_ms;
	/** tx block flag */
	t_u8 tx_block;
	/** List of interfaces to handle */
	mlan_private *priv_list[MLAN_MAX_BSS_NUM];
} wlan_radar_det_hndlg_state_t;

/** DFS/RDH testing exception settings kept in 'mlan_adapter' */
typedef struct {
	/** user-configured CAC period (in msec) */
	t_u32 user_cac_period_msec;
	/** user-configured NOP period (in sec) */
	t_u16 user_nop_period_sec;
	/** user-configured skip channel change on radar */
	t_bool no_channel_change_on_radar;
	/** user-configured new channel to change to on radar */
	t_u8 fixed_new_channel_on_radar;
	/** user-configured cac restart */
	t_u8 cac_restart;
	/**  cac channel */
	t_u8 chan;
	/** band cfg */
	Band_Config_t bandcfg;
	/** cac time */
	t_u32 millisec_dwell_time;
} wlan_dfs_testing_settings_t;

/**
 * @brief Driver measurement state held in 'mlan_adapter' structure
 *
 *  Used to record a measurement request that the driver is pending on
 *    the result (received measurement report).
 */
typedef struct {
	/**
	 * Dialog token of a pending measurement request/report.  Used to
	 *   block execution while waiting for the specific dialog token
	 */
	t_u8 meas_rpt_pend_on;

	/**
	 * Measurement report received from the firmware that we were pending on
	 */
	HostCmd_DS_MEASUREMENT_REPORT meas_rpt_returned;

} wlan_meas_state_t;

#ifdef SDIO
/**
 *  @brief Link buffer into aggregate head buffer
 *
 *  @param pmbuf_aggr	Pointer to aggregation buffer
 *  @param pmbuf		Pointer to buffer to copy
 */
static inline t_void wlan_link_buf_to_aggr(pmlan_buffer pmbuf_aggr,
					   pmlan_buffer pmbuf)
{
	/* link new buf at end of list */
	pmbuf->pnext = pmbuf_aggr;
	pmbuf->pprev = pmbuf_aggr->pprev;
	pmbuf->pparent = pmbuf_aggr;
	pmbuf_aggr->pprev->pnext = pmbuf;
	pmbuf_aggr->pprev = pmbuf;
	pmbuf_aggr->use_count++;
}

/** data structure for SDIO MPA TX */
typedef struct _sdio_mpa_tx {
	/** allocated buf for tx aggreation */
	t_u8 *head_ptr;
	/** multiport tx aggregation buffer pointer */
	t_u8 *buf;
	/** multiport tx aggregation buffer length */
	t_u32 buf_len;
	/** multiport tx aggregation packet count */
	t_u32 pkt_cnt;
	/** multiport tx aggregation ports */
	t_u32 ports;
	/** multiport tx aggregation starting port */
	t_u16 start_port;
	/** multiport tx aggregation enable/disable flag */
	t_u8 enabled;
	/** multiport tx aggregation buffer size */
	t_u32 buf_size;
	/** multiport tx aggregation pkt aggr limit */
	t_u32 pkt_aggr_limit;
	/** multiport write info */
	t_u16 mp_wr_info[SDIO_MP_AGGR_DEF_PKT_LIMIT_MAX];
	/** multiport rx aggregation mbuf array */
	pmlan_buffer mbuf_arr[SDIO_MP_AGGR_DEF_PKT_LIMIT_MAX];
} sdio_mpa_tx;

/** data structure for SDIO MPA RX */
typedef struct _sdio_mpa_rx {
	/** allocated buf for rx aggreation */
	t_u8 *head_ptr;
	/** multiport rx aggregation buffer pointer */
	t_u8 *buf;
	/** multiport rx aggregation buffer length */
	t_u32 buf_len;
	/** multiport rx aggregation packet count */
	t_u32 pkt_cnt;
	/** multiport rx aggregation ports */
	t_u32 ports;
	/** multiport rx aggregation starting port */
	t_u16 start_port;

	/** multiport rx aggregation mbuf array */
	pmlan_buffer mbuf_arr[SDIO_MP_AGGR_DEF_PKT_LIMIT_MAX];
	/** multiport rx aggregation pkt len array */
	t_u32 len_arr[SDIO_MP_AGGR_DEF_PKT_LIMIT_MAX];

	/** multiport rx aggregation enable/disable flag */
	t_u8 enabled;
	/** multiport rx aggregation buffer size */
	t_u32 buf_size;
	/** multiport rx aggregation pkt aggr limit */
	t_u32 pkt_aggr_limit;
} sdio_mpa_rx;
#endif

#ifdef USB
/** data structure for USB Rx Deaggregation */
typedef struct _usb_rx_deaggr_params {
	/** Rx aggregation control */
	usb_aggr_ctrl_cfg aggr_ctrl;
} usb_rx_deaggr_params;

#define MAX_USB_TX_PORT_NUM 2
/** data structure for USB Tx Aggregation */
typedef struct _usb_tx_aggr_params {
	/** Tx aggregation control */
	usb_aggr_ctrl_cfg aggr_ctrl;
	/** allocated pmbuf for tx aggreation */
	pmlan_buffer pmbuf_aggr;
	/** packet len used in pmbuf_aggr */
	t_u32 aggr_len;
	/** usb_tx_aggr timer */
	t_void *paggr_hold_timer;
	/** usb_tx_aggr timer set flag */
	t_u8 aggr_hold_timer_is_set;
	/** Timeout duration in milliseconds to wait for aggregation */
	t_u32 hold_timeout_msec;
	/** lock for transmission */
	t_void *paggr_lock;
	/** port for data transmission */
	t_u32 port;
	/** pointer to moal_adatper structure */
	t_void *phandle;
} usb_tx_aggr_params, *pusb_tx_aggr_params;
#endif

/** Type definition of mef_entry*/
typedef struct _mef_cfg_data {
	/** criteria*/
	t_u32 criteria;
	/** entry num*/
	t_u16 entry_num;
	/** entry pointer*/
	mef_entry_t *pentry;
} mef_cfg_data;

/** Type definition of mef_entry*/
typedef struct _mef_entry {
	/** Flag for auto arp entry*/
	int enable_autoarp_entry;
	/** Num for wowlan entry*/
	int num_wowlan_entry;
	/** Num for IPv6 neighbor solicitation message offload */
	int num_ipv6_ns_offload;
	int clear_mef_entry;
	/** criteria*/
	t_u32 criteria;
	/** MEF CFG Array to store etted_entry_bitmap;
	 *  Caution: 0-3 is for NVIDIA WHITE/BLACK list entries
	 *  Caution: 4   is for NVIDIA ping entry
	 *  Caution: 5   is for Auto Arp Entry
	 *  Caution: 6   is for wowlan Entry
	 *  Caution: 7   is for IPv6 Neighbor Solicitation offload Entry
	 */
	mef_entry_t entry[MAX_NUM_ENTRIES];
} mef_entry;

/** vdll_dnld_ctrl structure */
typedef struct _vdll_dnld_ctrl {
	/**  pending  VDLL block */
	t_u8 *pending_block;
	/* pending VDLL block len */
	t_u16 pending_block_len;
	/** memory for VDLL fw image */
	t_u8 *vdll_mem;
	/**  VDLL fw image len */
	t_u32 vdll_len;
#if defined(SDIO) || defined(PCIE)
	/** mlan_buffer for VDLL download */
	mlan_buffer *cmd_buf;
#endif
} vdll_dnld_ctrl, *pvdll_dnld_ctrl;

/** mlan_init_para structure */
typedef struct _mlan_init_para {
#ifdef MFG_CMD_SUPPORT
	/** MFG mode */
	t_u32 mfg_mode;
#endif
#ifdef SDIO
	/** SDIO interrupt mode (0: INT_MODE_SDIO, 1: INT_MODE_GPIO) */
	t_u32 int_mode;
	/** GPIO interrupt pin number */
	t_u32 gpio_pin;
	/** SDIO MPA Tx */
	t_u32 mpa_tx_cfg;
	/** SDIO MPA Rx */
	t_u32 mpa_rx_cfg;
#endif
	/** Auto deep sleep */
	t_u32 auto_ds;
	/** IEEE PS mode */
	t_u32 ps_mode;
	/** Max Tx buffer size */
	t_u32 max_tx_buf;
	/** 802.11d configuration */
	t_u32 cfg_11d;
	/** 802.11H DFS Master Radar Detect */
	t_u32 dfs_master_radar_det_en;
	/** 802.11H DFS Slave Radar Detect */
	t_u32 dfs_slave_radar_det_en;
	/** dev cap mask */
	t_u32 dev_cap_mask;
	/** oob independent reset mode */
	t_u32 indrstcfg;
	/** drcs channel time mode */
	t_u32 drcs_chantime_mode;
	/** passive to active scan */
	t_u8 passive_to_active_scan;
	/** uap max sta */
	t_u8 uap_max_sta;
	/** dfs w53 cfg */
	t_u8 dfs53cfg;
	/** dfs_offload */
	t_u8 dfs_offload;
#ifdef PCIE
	/** adma ring size */
	t_u16 ring_size;
#endif
	t_u8 ext_scan;
	t_u8 mcs32;
} mlan_init_para, *pmlan_init_para;

#ifdef SDIO
typedef struct _mlan_sdio_card_reg {
	t_u8 start_rd_port;
	t_u8 start_wr_port;
	t_u8 base_0_reg;
	t_u8 base_1_reg;
	t_u8 poll_reg;
	t_u8 host_int_enable;
	t_u8 host_int_status;
	t_u8 status_reg_0;
	t_u8 status_reg_1;
	t_u8 sdio_int_mask;
	t_u32 data_port_mask;
	t_u8 max_mp_regs;
	t_u8 rd_bitmap_l;
	t_u8 rd_bitmap_u;
	t_u8 rd_bitmap_1l;
	t_u8 rd_bitmap_1u;
	t_u8 wr_bitmap_l;
	t_u8 wr_bitmap_u;
	t_u8 wr_bitmap_1l;
	t_u8 wr_bitmap_1u;
	t_u8 rd_len_p0_l;
	t_u8 rd_len_p0_u;
	t_u8 card_config_2_1_reg;
	t_u8 cmd_config_0;
	t_u8 cmd_config_1;
	t_u8 cmd_config_2;
	t_u8 cmd_config_3;
	t_u8 cmd_rd_len_0;
	t_u8 cmd_rd_len_1;
	t_u8 cmd_rd_len_2;
	t_u8 cmd_rd_len_3;
	t_u8 io_port_0_reg;
	t_u8 io_port_1_reg;
	t_u8 io_port_2_reg;
	t_u8 host_int_rsr_reg;
	t_u8 host_int_mask_reg;
	t_u8 host_int_status_reg;
	t_u8 host_restart_reg;
	t_u8 card_to_host_event_reg;
	t_u8 host_interrupt_mask_reg;
	t_u8 card_interrupt_status_reg;
	t_u8 card_interrupt_rsr_reg;
	t_u8 card_revision_reg;
	t_u8 card_ocr_0_reg;
	t_u8 card_ocr_1_reg;
	t_u8 card_ocr_3_reg;
	t_u8 card_config_reg;
	t_u8 card_misc_cfg_reg;
	t_u8 debug_0_reg;
	t_u8 debug_1_reg;
	t_u8 debug_2_reg;
	t_u8 debug_3_reg;
	t_u32 fw_reset_reg;
	t_u8 fw_reset_val;
	t_u8 fw_dnld_offset_0_reg;
	t_u8 fw_dnld_offset_1_reg;
	t_u8 fw_dnld_offset_2_reg;
	t_u8 fw_dnld_offset_3_reg;
	t_u8 fw_dnld_status_0_reg;
	t_u8 fw_dnld_status_1_reg;
	t_u8 winner_check_reg;
} mlan_sdio_card_reg, *pmlan_sdio_card_reg;

typedef struct _mlan_sdio_card {
	const mlan_sdio_card_reg *reg;
	/** maximum ports */
	t_u8 max_ports;
	/** mp aggregation packet limit */
	t_u8 mp_aggr_pkt_limit;
	/** sdio new mode support */
	t_bool supports_sdio_new_mode;
	/** max tx aggr buf size */
	t_u32 mp_tx_aggr_buf_size;
	/** max rx aggr buf size */
	t_u32 mp_rx_aggr_buf_size;
	/** IO port */
	t_u32 ioport;
	/** number of interrupt receive */
	t_u32 num_of_irq;
	/** max SDIO single port tx size */
	t_u16 max_sp_tx_size;
	/** max SDIO single port rx size */
	t_u16 max_sp_rx_size;
	/** SDIO multiple port read bitmap */
	t_u32 mp_rd_bitmap;
	/** SDIO multiple port write bitmap */
	t_u32 mp_wr_bitmap;
	/** SDIO end port from txbufcfg */
	t_u16 mp_end_port;
	/** SDIO port mask calculated based on txbufcfg end port */
	t_u32 mp_data_port_mask;
	/** Current available port for read */
	t_u8 curr_rd_port;
	/** Current available port for write */
	t_u8 curr_wr_port;
	/** FW update port number */
	t_u32 mp_update[SDIO_MP_AGGR_DEF_PKT_LIMIT_MAX * 2];
	/** Invalid port update count */
	t_u32 mp_invalid_update;
	/** Array to store values of SDIO multiple port group registers */
	t_u8 *mp_regs;
	/** allocated buf to read SDIO multiple port group registers */
	t_u8 *mp_regs_buf;
	/** buffer to handle receive packet */
	t_u8 *rx_buf;
	/** allocated buf for receive */
	t_u8 *rx_buffer;
	/* see blk_queue_max_segment_size */
	t_u32 max_seg_size;
	/* see blk_queue_max_segments */
	t_u16 max_segs;

	/** data structure for SDIO MPA TX */
	sdio_mpa_tx mpa_tx;
	/** packet number for tx aggr */
	t_u32 mpa_tx_count[SDIO_MP_AGGR_DEF_PKT_LIMIT_MAX];
	/** no more packets count*/
	t_u32 mpa_sent_last_pkt;
	/** no write_ports count */
	t_u32 mpa_sent_no_ports;
	/** last wr_bitmap from FW */
	t_u32 last_recv_wr_bitmap;
	/** last wr_bitmap from FW */
	t_u32 last_recv_rd_bitmap;
	/** last mp_wr_bitmap */
	t_u32 last_mp_wr_bitmap[SDIO_MP_DBG_NUM];
	/** last ports for cmd53 write data */
	t_u32 last_mp_wr_ports[SDIO_MP_DBG_NUM];
	/** last length for cmd53 write data */
	t_u32 last_mp_wr_len[SDIO_MP_DBG_NUM];
	/** length info for cmd53 write data */
	t_u16 last_mp_wr_info[SDIO_MP_DBG_NUM * SDIO_MP_AGGR_DEF_PKT_LIMIT_MAX];
	/** last curr_wr_port */
	t_u8 last_curr_wr_port[SDIO_MP_DBG_NUM];

	/** buffer for mp debug */
	t_u8 *mpa_buf;
	/** length info for mp buf size */
	t_u32 mpa_buf_size;

	/** last mp_index */
	t_u8 last_mp_index;

	/** data structure for SDIO MPA RX */
	sdio_mpa_rx mpa_rx;
	/** packet number for tx aggr */
	t_u32 mpa_rx_count[SDIO_MP_AGGR_DEF_PKT_LIMIT_MAX];

	/** SDIO interrupt mode (0: INT_MODE_SDIO, 1: INT_MODE_GPIO) */
	t_u32 int_mode;
	/** GPIO interrupt pin number */
	t_u32 gpio_pin;

	/** flag for sdio rx aggr */
	t_bool sdio_rx_aggr_enable;
	/** fw rx block size */
	t_u16 sdio_rx_block_size;
} mlan_sdio_card, *pmlan_sdio_card;
#endif

#ifdef PCIE
#define MAX_TXRX_BD 32
#define ADMA_MAX_TXRX_BD 512
#define ADMA_DEF_TXRX_BD 128
/** 128 entry will mapping to 7*/
#define TXRX_DEF_NUM_DESC 7
/** 8 entry will mapping to 3 */
#define EVT_NUM_DESC 3
#define MLAN_MAX_TXRX_BD MAX(ADMA_MAX_TXRX_BD, MAX_TXRX_BD)
/** 8 Event buffer ring */
#define MLAN_MAX_EVT_BD 0x08
typedef struct _mlan_pcie_card_reg {
	/* TX buffer description rd pointer */
	t_u32 reg_txbd_rdptr;
	/* TX buffer description wr pointer */
	t_u32 reg_txbd_wrptr;
	/* RX buffer description rd pointer */
	t_u32 reg_rxbd_rdptr;
	/* RX buffer description wr pointer */
	t_u32 reg_rxbd_wrptr;
	/** evtbd rdptr register */
	t_u32 reg_evtbd_rdptr;
	/** evtbd wrptr register */
	t_u32 reg_evtbd_wrptr;
	/** host int mask register */
	t_u16 reg_host_int_mask;
	/** host int status mask register*/
	t_u16 reg_host_int_status_mask;
	/** host int status register */
	t_u16 reg_host_int_status;
	/** host int status clr selection */
	t_u32 reg_host_int_clr_sel;
	/** cpu int event register */
	t_u16 reg_cpu_int_event;
	/** ip revision register */
	t_u16 reg_ip_rev;
	/** revision id register */
	t_u32 reg_rev_id;
	/** driver ready register */
	t_u16 reg_drv_ready;
	/** cpu int status register */
	t_u16 reg_cpu_int_status;
	/** scratch 0 register */
	t_u16 reg_scratch_0;
	/** scratch 1 register */
	t_u16 reg_scratch_1;
	/** scratch 2 register */
	t_u16 reg_scratch_2;
	/** scratch 3 register */
	t_u16 reg_scratch_3;
	/** scratch 6 register */
	t_u16 reg_scratch_6;
	/** scratch 7 register */
	t_u16 reg_scratch_7;
	/** host interrupt mask*/
	t_u32 host_intr_mask;
	/** data send interrupt for host*/
	t_u32 host_intr_dnld_done;
	/** Data receive interrupt for host */
	t_u32 host_intr_upld_rdy;
	/** Command sent interrupt for host */
	t_u32 host_intr_cmd_done;
	/** Event ready interrupt for host */
	t_u32 host_intr_event_rdy;
	/** cmd dnld interrupt for host */
	t_u32 host_intr_cmd_dnld;
	/** adma align size */
	t_u8 adma_align_size;
	/** adma min pkt size */
	t_u8 adma_min_pkt_size;
	/* TX/RX buffer description mask */
	t_u32 txrx_rw_ptr_mask;
	/* TX/RX buffer description wrap mask */
	t_u32 txrx_rw_ptr_wrap_mask;
	/* TX/RX buffer description indication */
	t_u32 txrx_rw_ptr_rollover_ind;
	/** ADMA feature */
	t_u8 use_adma;
	/** write to clear interrupt status flag */
	t_u8 msi_int_wr_clr;
} mlan_pcie_card_reg, *pmlan_pcie_card_reg;

typedef struct _mlan_pcie_card {
	const mlan_pcie_card_reg *reg;
	/** PCIE interrupt modes 0: Legacy, 1: MSI, 2:MSI-X */
	t_u32 pcie_int_mode;
	/** PCIE function number */
	t_u8 func_num;
	/** pending num of tx ring buffer in firmware */
	t_u8 txbd_pending;
	/** Write pointer for TXBD ring */
	t_u32 txbd_wrptr;
	/** Shadow copy of TXBD read pointer */
	t_u32 txbd_rdptr;
	/** TXBD ring size */
	t_u32 txbd_ring_size;
	/** Lock for protecting the TX ring */
	t_void *tx_ring_lock;
	/** Virtual base address of txbd_ring */
	t_u8 *txbd_ring_vbase;
	/** Physical base address of txbd_ring */
	t_u64 txbd_ring_pbase;
	/** Ring of buffer descriptors for TX */
	t_void *txbd_ring[MLAN_MAX_TXRX_BD];
	/** A list of mlan_buffer objects used for data tx */
	mlan_buffer *tx_buf_list[MLAN_MAX_TXRX_BD];
	/** Flush indicator for txbd_ring */
	t_bool txbd_flush;
	/** txrx data dma ring size */
	t_u16 txrx_bd_size;
	/** txrx num desc */
	t_u16 txrx_num_desc;

	/** Shadow copy of RXBD write pointer */
	t_u32 rxbd_wrptr;
	/** RxBD read pointer */
	t_u32 rxbd_rdptr;
	/** RXBD ring size */
	t_u32 rxbd_ring_size;
	/** A spinlock for rxbd_ring */
	t_void *rx_ring_lock;
	/** Virtual base address of rxbd_ring */
	t_u8 *rxbd_ring_vbase;
	/** Physical base address of rxbd_ring */
	t_u64 rxbd_ring_pbase;
	/** Ring of buffer descriptors for RX */
	t_void *rxbd_ring[MLAN_MAX_TXRX_BD];
	/** A list of mlan_buffer objects used for data rx */
	mlan_buffer *rx_buf_list[MLAN_MAX_TXRX_BD];

	/** Shadow copy of cmdrsp/evt write pointer */
	t_u32 evtbd_wrptr;
	/** Read pointer for cmdrsp/evt ring */
	t_u32 evtbd_rdptr;
	/** Size of the cmdrsp/evt ring */
	t_u32 evtbd_ring_size;
	/** Virtual base address of evtbd_bd_ring */
	t_u8 *evtbd_ring_vbase;
	/** Physical base address of evtbd_bd_ring */
	t_u64 evtbd_ring_pbase;
	/** Ring of buffer descriptors for EVENT */
	t_void *evtbd_ring[MLAN_MAX_EVT_BD];
	/** A list of mlan_buffer objects used for EVENT */
	mlan_buffer *evt_buf_list[MLAN_MAX_EVT_BD];

	/** Command buffer */
	mlan_buffer *cmd_buf;
	/** Command response buffer */
	mlan_buffer *cmdrsp_buf;
	/** Command buffer */
	mlan_buffer *vdll_cmd_buf;
	/** last tx_pkt_size  */
	t_u32 last_tx_pkt_size[MLAN_MAX_TXRX_BD];
} mlan_pcie_card, *pmlan_pcie_card;
#endif

#ifdef USB
typedef struct _mlan_usb_card {
	/** data structure for USB Rx Deaggregation */
	usb_rx_deaggr_params usb_rx_deaggr;
	/** data structure for USB Tx Aggregation */
	usb_tx_aggr_params usb_tx_aggr[MAX_USB_TX_PORT_NUM];
	/** USB sggregation supported by FW */
	t_u8 fw_usb_aggr;

	/** port status: MFALSE-port available MTRUE--port busy*/
	t_u8 usb_port_status[MAX_USB_TX_PORT_NUM];
} mlan_usb_card, *pmlan_usb_card;

#endif

typedef struct _mlan_card_info {
	/** Max Tx buffer size */
	t_u32 max_tx_buf_size;
	/** support V14_FW_API */
	t_u8 v14_fw_api;
	/** support V16_FW_API */
	t_u8 v16_fw_api;
	/** support V17_FW_API */
	t_u8 v17_fw_api;
	/** suppress PS handshake */
	t_u8 supp_ps_handshake;
	/** DEFAULT_11N_TX_BF_CAP */
	t_u32 default_11n_tx_bf_cap;
	t_u8 support_11mc;
} mlan_card_info, *pmlan_card_info;

typedef struct _mlan_adapter mlan_adapter, *pmlan_adapter;

/**Adapter_operations data structure*/
typedef struct _adapter_operations {
	/**firmware download handler*/
	mlan_status (*dnld_fw)(pmlan_adapter pmadapter, pmlan_fw_image pmfw);
	/**interrupt handler*/
	mlan_status (*interrupt)(t_u16 msg_id, pmlan_adapter pmadapter);
	/**INT process handler*/
	mlan_status (*process_int_status)(pmlan_adapter pmadapter);
	/**host to card handler*/
	mlan_status (*host_to_card)(pmlan_private pmpriv, t_u8 type,
				    mlan_buffer *pmbuf,
				    mlan_tx_param *tx_param);
	/*wakeup card*/
	mlan_status (*wakeup_card)(pmlan_adapter pmadapter, t_u8 timeout);
	/*reset the PM setting of card*/
	mlan_status (*reset_card)(pmlan_adapter adapter);
	/** Handle event/cmd complete*/
	mlan_status (*event_complete)(mlan_adapter *pmlan_adapter,
				      pmlan_buffer pmbuf, mlan_status status);
	/** Handle complete receiving data */
	mlan_status (*data_complete)(mlan_adapter *pmlan_adapter,
				     pmlan_buffer pmbuf, mlan_status status);
	/** Handle command response complete */
	mlan_status (*cmdrsp_complete)(mlan_adapter *pmlan_adapter,
				       pmlan_buffer pmbuf, mlan_status status);
	/** Handle rx packet */
	mlan_status (*handle_rx_packet)(mlan_adapter *pmadapter,
					pmlan_buffer pmbuf);
	/** handle dump interface specific info */
	mlan_status (*debug_dump)(mlan_adapter *pmadapter);
	/** disable host interrupt */
	mlan_status (*disable_host_int)(mlan_adapter *pmadapter);
	/** enable host interrupt */
	mlan_status (*enable_host_int)(mlan_adapter *pmadapter);
	/**Interface header length*/
	t_u32 intf_header_len;
} mlan_adapter_operations;

/** Adapter data structure for MLAN */
struct _mlan_adapter {
	/** MOAL handle structure */
	t_void *pmoal_handle;
	/** BSS Attributes */
	mlan_bss_attr bss_attr[MLAN_MAX_BSS_NUM];
	/** Private pointer */
	pmlan_private priv[MLAN_MAX_BSS_NUM];
	/** Total number of Priv number */
	t_u8 priv_num;
	/** Priority table for bss */
	mlan_bssprio_tbl bssprio_tbl[MLAN_MAX_BSS_NUM];
	/** Callback table */
	mlan_callbacks callbacks;
	/** Init parameters */
	mlan_init_para init_para;
	/** mlan_lock for init/shutdown */
	t_void *pmlan_lock;
	/** main_proc_lock for main_process */
	t_void *pmain_proc_lock;
	/** mlan_processing */
	t_u32 mlan_processing;
	/** main_process_cnt */
	t_u32 main_process_cnt;
	/** mlan_rx_processing */
	t_u32 mlan_rx_processing;
	/** rx_proc_lock for main_rx_process */
	t_void *prx_proc_lock;
	/** more_rx_task_flag */
	t_u32 more_rx_task_flag;
	/** rx work enable flag */
	t_u8 rx_work_flag;
	/* number of rx pkts queued */
	t_u16 rx_pkts_queued;
	/** more task flag */
	t_u32 more_task_flag;
	/** delay task flag */
	t_u32 delay_task_flag;
	/** Max tx buf size */
	t_u16 max_tx_buf_size;
	/** Tx buf size */
	t_u16 tx_buf_size;
	/** current tx buf size in fw */
	t_u16 curr_tx_buf_size;
	/** flush data flag */
	t_u8 flush_data;
	/** STATUS variables */
	WLAN_HARDWARE_STATUS hw_status;
	/** PnP SUPPORT */
	t_u8 surprise_removed;
	/** FW hang report */
	t_u8 fw_hang_report;

	/** ECSA support */
	t_u8 ecsa_enable;

	/** Get log support */
	t_u8 getlog_enable;

	/** Radio on flag */
	t_u16 radio_on;

	/** Firmware release number */
	t_u32 fw_release_number;
	/** firmware version */
	t_u8 fw_ver;
	/** firmware minor version */
	t_u8 fw_min_ver;
	/** firmare hotfix version */
	t_u8 fw_hotfix_ver;
	/** uap firmware version */
	t_u8 uap_fw_ver;
	/** mac address retrun from get_hw_spec */
	t_u8 permanent_addr[MLAN_MAC_ADDR_LENGTH];
	/** Number of antenna used */
	t_u16 number_of_antenna;
	/** antenna info */
	t_u8 antinfo;
	/** Firmware capability information */
	t_u32 fw_cap_info;
	/** Extended firmware capability information */
	t_u32 fw_cap_ext;
	/** High byte for 5G, low byte for 2G, like 0x2211 0x22 for 5G, 0x11 for
	 * 2G */
	t_u16 user_htstream;
	/** vdll ctrl */
	vdll_dnld_ctrl vdll_ctrl;
#if defined(SDIO) || defined(PCIE)
	/** pint_lock for interrupt handling */
	t_void *pint_lock;
	/** Interrupt status */
	t_u32 ireg;
#endif
	/** card type */
	t_u16 card_type;
	/** card rev */
	t_u8 card_rev;
	const mlan_card_info *pcard_info;
#ifdef SDIO
	pmlan_sdio_card pcard_sd;
#endif
#ifdef PCIE
	pmlan_pcie_card pcard_pcie;
#endif
#ifdef USB
	pmlan_usb_card pcard_usb;
#endif

	/** Event cause */
	t_u32 event_cause;
	/** Event buffer */
	pmlan_buffer pmlan_buffer_event;
	/** Upload length */
	t_u32 upld_len;
	/** Upload buffer*/
	t_u8 upld_buf[WLAN_UPLD_SIZE];
	/** Data sent:
	 *       TRUE - Data is sent to fw, no Tx Done received
	 *       FALSE - Tx done received for previous Tx
	 */
	t_u8 data_sent;
	/** Data sent cnt */
	t_u32 data_sent_cnt;
	/** CMD sent:
	 *       TRUE - CMD is sent to fw, no CMD Done received
	 *       FALSE - CMD done received for previous CMD
	 */
	t_u8 cmd_sent;
	/** CMD Response received:
	 *       TRUE - CMD is response is received from fw, and yet to process
	 *       FALSE - No cmd response to process
	 */
	t_u8 cmd_resp_received;
	/** Event received:
	 *       TRUE - Event received from fw, and yet to process
	 *       FALSE - No events to process
	 */
	t_u8 event_received;

	/** Data received:
	 *       TRUE - Data received from fw
	 *       FALSE - No Data received
	 */
	t_u8 data_received;

	/** Command-related variables */
	/** Command sequence number */
	t_u16 seq_num;
	/** Command controller nodes */
	cmd_ctrl_node *cmd_pool;
	/** Current Command */
	cmd_ctrl_node *curr_cmd;
	/** mlan_lock for command */
	t_void *pmlan_cmd_lock;
	/** Number of command timeouts */
	t_u32 num_cmd_timeout;
	/** Last init fw command id */
	t_u16 last_init_cmd;
	/** Command timer */
	t_void *pmlan_cmd_timer;
	/** Command timer set flag */
	t_u8 cmd_timer_is_set;
	/** time stamp for command dnld */
	t_u32 dnld_cmd_in_secs;

	/** Command Queues */
	/** Free command buffers */
	mlan_list_head cmd_free_q;
	/** Pending command buffers */
	mlan_list_head cmd_pending_q;
	/** Command queue for scanning */
	mlan_list_head scan_pending_q;
	/** Command pending queue while scanning */
	mlan_list_head ext_cmd_pending_q;
	/** ioctl pending queue */
	mlan_list_head ioctl_pending_q;
	/** pending_ioctl flag */
	t_u8 pending_ioctl;
	pmlan_private pending_disconnect_priv;
	/** mlan_processing */
	t_u32 scan_processing;
	/** scan state */
	t_u32 scan_state;
	/** firmware support for roaming*/
	t_u8 fw_roaming;
	/** User set passphrase*/
	t_u8 userset_passphrase;
	/** ext_scan enh support flag */
	t_u8 ext_scan_enh;
	/** scan type: 0 legacy, 1: enhance scan*/
	t_u8 ext_scan_type;
	/** ext scan timeout */
	t_u8 ext_scan_timeout;
	/** coex scan flag */
	t_u8 coex_scan;
	/** coex min scan time */
	t_u8 coex_min_scan_time;
	/** coex max scan time */
	t_u8 coex_max_scan_time;
	/** coex win size flag */
	t_u8 coex_win_size;
	/** coex amdpdu tx win size */
	t_u8 coex_tx_win_size;
	/** coex ampdu rx win size */
	t_u8 coex_rx_win_size;
	/** Region code */
	t_u16 region_code;
	/** Region Channel data */
	region_chan_t region_channel[MAX_REGION_CHANNEL_NUM];
	/** CFP table code for 2.4GHz */
	t_u8 cfp_code_bg;
	/** CFP table code for 5GHz */
	t_u8 cfp_code_a;
	wmm_ac_parameters_t ac_params[MAX_AC_QUEUES];
	/** Minimum BA Threshold */
	t_u8 min_ba_threshold;
#ifdef STA_SUPPORT
	/** Universal Channel data */
	region_chan_t universal_channel[MAX_REGION_CHANNEL_NUM];
	/** Parsed region channel */
	parsed_region_chan_11d_t parsed_region_chan;
#endif /* STA_SUPPORT */
	/** 11D and Domain Regulatory Data */
	wlan_802_11d_domain_reg_t domain_reg;
	/** Country Code */
	t_u8 country_code[COUNTRY_CODE_LEN];
	/** FSM variable for 11h support */
	wlan_11h_device_state_t state_11h;
	/** FSM variable for DFS support */
	wlan_dfs_device_state_t state_dfs;
	/** FSM variable for RDH support */
	wlan_radar_det_hndlg_state_t state_rdh;
	/** variable to configure dfs channel switch count */
	t_s8 dfs_cs_count;
	/** User configured settings for DFS testing */
	wlan_dfs_testing_settings_t dfs_test_params;
	/**  dfs w53 cfg */
	t_u8 dfs53cfg;
	/**  dfs_mode */
	t_u8 dfs_mode;
	/** FSM variable for MEAS support */
	wlan_meas_state_t state_meas;
	/** Scan table */
	BSSDescriptor_t *pscan_table;
	/** scan age in secs */
	t_u32 age_in_secs;
	/** Active scan for hidden ssid triggered */
	t_u8 active_scan_triggered;
	/** channel statstics */
	ChanStatistics_t *pchan_stats;
	/** Number of records in the chan_stats */
	t_u32 num_in_chan_stats;
	/** index of chan stats */
	t_u32 idx_chan_stats;
	ChanStatistics_t *pold_chan_stats;
	/** index of chan stats */
	t_u32 old_idx_chan_stats;
	t_u8 bgscan_reported;

	/** Number of records in the scan table */
	t_u32 num_in_scan_table;
	/** Scan probes */
	t_u16 scan_probes;

	/** Scan type */
	t_u8 scan_type;
	/** Scan mode */
	t_u32 scan_mode;
	/** Specific scan time */
	t_u16 specific_scan_time;
	/** Active scan time */
	t_u16 active_scan_time;
	/** Passive scan time */
	t_u16 passive_scan_time;
	/** Passive scan to active scan */
	t_u8 passive_to_active_scan;
	/** scan channel gap time */
	t_u16 scan_chan_gap;
	/** Scan block flag */
	t_u8 scan_block;
	/** Extended scan or legacy scan */
	t_u8 ext_scan;
	t_u32 bcn_buf_size;
	/** Beacon buffer */
	t_u8 *bcn_buf;
	/** Pointer to valid beacon buffer end */
	t_u8 *pbcn_buf_end;
	/** allocate fixed scan beacon buffer size*/
	t_u32 fixed_beacon_buffer;

	/** F/W supported bands */
	t_u16 fw_bands;
	/** User selected band to start adhoc network */
	t_u16 adhoc_start_band;
	/** User selected bands */
	t_u16 config_bands;
	/** Pointer to channel list last sent to the firmware for scanning */
	ChanScanParamSet_t *pscan_channels;

	/** Tx lock flag */
	t_u8 tx_lock_flag;
	/** Rx lock flag */
	t_u8 rx_lock_flag;
	/** main lock flag */
	t_u8 main_lock_flag;
#ifdef USB
	/** Tx CMD endpoint address */
	t_u8 tx_cmd_ep;
	/** Rx CMD/EVT endpoint address */
	t_u8 rx_cmd_ep;
	/** Rx data endpoint address */
	t_u8 rx_data_ep;
	/** Tx data endpoint address */
	t_u8 tx_data_ep;
#endif
	/** Multi channel status */
	t_u8 mc_status;
#ifdef USB
	/** port status: MFALSE-port available MTRUE--port busy*/
	t_u8 usb_port_status[MAX_USB_TX_PORT_NUM];
	/** usb tx ports */
	t_u8 usb_tx_ports[MAX_USB_TX_PORT_NUM];
#endif

	/** sleep_params_t */
	sleep_params_t sleep_params;
	/** sleep_period_t (Enhanced Power Save) */
	sleep_period_t sleep_period;
	/** saved sleep_period_t (Enhanced Power Save) */
	sleep_period_t saved_sleep_period;

	/** Power Save mode */
	/**
	 * Wlan802_11PowerModeCAM = disable
	 * Wlan802_11PowerModePSP = enable
	 */
	t_u16 ps_mode;
	/** Power Save state */
	t_u32 ps_state;
	/** Need to wakeup flag */
	t_u8 need_to_wakeup;
	/** keep_wakeup */
	t_u8 keep_wakeup;

	/** Multiple DTIM */
	t_u16 multiple_dtim;
	/** Local listen interval */
	t_u16 local_listen_interval;
	/** Null packet interval */
	t_u16 null_pkt_interval;

	/** IEEE ps inactivity timout value */
	t_u16 inact_tmo;
	/** Power save confirm sleep command buffer */
	pmlan_buffer psleep_cfm;
	/** Beacon miss timeout */
	t_u16 bcn_miss_time_out;

	/** Deep Sleep flag */
	t_u8 is_deep_sleep;
	/** Idle time */
	t_u16 idle_time;
	/** Auto Deep Sleep enabled at init time */
	t_u8 init_auto_ds;

	/** delay null pkt flag */
	t_u8 delay_null_pkt;
	/** Delay to PS in milliseconds */
	t_u16 delay_to_ps;
	/** Enhanced PS mode */
	t_u16 enhanced_ps_mode;
	/** Device wakeup required flag */
	t_u8 pm_wakeup_card_req;

	/** Gen NULL pkg */
	t_u16 gen_null_pkt;

	/** PPS/UAPSD mode flag */
	t_u16 pps_uapsd_mode;
	/** Number of wakeup tries */
	t_u32 pm_wakeup_fw_try;
	/** time stamp when host try to wake up firmware */
	t_u32 pm_wakeup_in_secs;
	/** Card wakeup timer */
	t_void *pwakeup_fw_timer;
	/** Card wakeup timer */
	t_u8 wakeup_fw_timer_is_set;
	/** Number of wake up timeouts */
	t_u32 pm_wakeup_timeout;

	/** Host Sleep configured flag */
	t_u8 is_hs_configured;
	/** Host Sleep configuration */
	hs_config_param hs_cfg;
	/** Host Sleep activated flag */
	t_u8 hs_activated;
	/** mef_flt_cfg_mef configuration */
	mef_entry entry_cfg;
	/** Event body */
	t_u8 event_body[MAX_EVENT_SIZE];
	/** 802.11n device capabilities */
	t_u32 hw_dot_11n_dev_cap;
	/** Device support for MIMO abstraction of MCSs */
	t_u8 hw_dev_mcs_support;
	/** mpdu density */
	t_u8 hw_mpdu_density;
#ifdef STA_SUPPORT
	/** Adhoc Secondary Channel Bandwidth */
	t_u8 chan_bandwidth;
#endif /* STA_SUPPORT */

	/** 802.11ac device capabilities */
	t_u32 hw_dot_11ac_dev_cap;
	/** 802.11ac device support for MIMO abstraction of MCSs */
	t_u32 hw_dot_11ac_mcs_support;
	/** length of hw he capability */
	t_u8 hw_hecap_len;
	/** 802.11ax HE capability */
	t_u8 hw_he_cap[54];
	/** length of hw 2.4G he capability */
	t_u8 hw_2g_hecap_len;
	/** 802.11ax 2.4G HE capability */
	t_u8 hw_2g_he_cap[54];
	/** max mgmt IE index in device */
	t_u16 max_mgmt_ie_index;
	/** Head of Rx data queue */
	mlan_list_head rx_data_queue;
#ifdef MFG_CMD_SUPPORT
	t_u32 mfg_mode;
#endif
	/** Debug */
	wlan_dbg dbg;

	/** RX pending for forwarding packets */
	mlan_scalar pending_bridge_pkts;

#ifdef STA_SUPPORT
	/** ARP filter buffer */
	t_u8 arp_filter[ARP_FILTER_MAX_BUF_SIZE];
	/** ARP filter buffer size */
	t_u32 arp_filter_size;
#endif /* STA_SUPPORT */
	/** Minimum delay between HsActive and HostWake (in msec) */
	t_u16 min_wake_holdoff;
	/** Host sleep wake interval(in msec) */
	t_u32 hs_wake_interval;
	/** Host sleep inactivity timeout (in msec) */
	t_u32 hs_inactivity_timeout;
	/** Parameter type for indication gpio*/
	t_u8 param_type_ind;
	/** GPIO pin for indication wakeup source */
	t_u32 ind_gpio;
	/** Level on ind_gpio pin for indication normal wakeup source */
	t_u32 level;
	/** Parameter type for extend hscfg*/
	t_u8 param_type_ext;
	/** Events that will be forced ignore */
	t_u32 event_force_ignore;
	/** Events that will use extend gap to inform host*/
	t_u32 event_use_ext_gap;
	/** Extend gap*/
	t_u8 ext_gap;
	/** GPIO wave level for extend hscfg */
	t_u8 gpio_wave;
	/** Dynamic MIMO-SISO switch for hscfg*/
	t_u8 hs_mimo_switch;
	/** management frame wakeup filter config */
	mlan_mgmt_frame_wakeup mgmt_filter[MAX_MGMT_FRAME_FILTER];
	/** Bypass TX queue pkt count  */
	t_u32 bypass_pkt_count;
#ifdef STA_SUPPORT
	/** warm-reset IOCTL request buffer pointer */
	pmlan_ioctl_req pwarm_reset_ioctl_req;
#endif
	/** SCAN IOCTL request buffer pointer */
	pmlan_ioctl_req pscan_ioctl_req;
	/** DPD data pointer */
	t_u8 *pdpd_data;
	/** DPD data length  */
	t_u32 dpd_data_len;
	/** region txpowerlimit cfg data buf pointer */
	t_u8 *ptxpwr_data;
	/** region txpowerlimit cfg data len */
	t_u32 txpwr_data_len;
	/** Cal data pointer */
	t_u8 *pcal_data;
	/** Cal data length  */
	t_u32 cal_data_len;
	/** tdls status */
	/* TDLS_NOT_SETUP|TDLS_SWITCHING_CHANNEL|TDLS_IN_BASE_CHANNEL|TDLS_IN_SWITCH_CHANNEL*/
	tdlsStatus_e tdls_status;
	/** NetMon enabled */
	t_u32 enable_net_mon;
	/** Feature control bitmask */
	t_u32 feature_control;

	/** Control coex RX window size configuration */
	t_u8 coex_rx_winsize;
	t_bool dfs_repeater;
	t_u32 dfsr_channel;
	t_bool mc_policy;
	t_u8 chanrpt_param_bandcfg;
#if defined(PCIE)
	mlan_buffer *ssu_buf;
#endif
	t_u8 csi_enabled;
	/** maximum sta connection */
	t_u8 max_sta_conn;
	otp_region_info_t *otp_region;
	chan_freq_power_t *cfp_otp_bg;
	t_u8 *tx_power_table_bg;
	t_u32 tx_power_table_bg_size;
	t_u8 tx_power_table_bg_rows;
	t_u8 tx_power_table_bg_cols;
	chan_freq_power_t *cfp_otp_a;
	t_u8 *tx_power_table_a;
	t_u32 tx_power_table_a_size;
	t_u8 tx_power_table_a_rows;
	t_u8 tx_power_table_a_cols;
	/**mlan adapter operations*/
	mlan_adapter_operations ops;
#ifdef DRV_EMBEDDED_AUTHENTICATOR
	/** authenticator_priv */
	pmlan_private authenticator_priv;
#endif
	/** TP accounting mode 1-enable 0-disable */
	t_u32 tp_state_on;
	/** Packet drop point */
	t_u32 tp_state_drop_point;
	/** second mac flag */
	t_u8 second_mac;
	/* lower 8 bytes of uuid */
	t_u64 uuid_lo;

	/* higher 8 bytes of uuid */
	t_u64 uuid_hi;
	/** AC BK/BE_flush time*/
	t_u16 flush_time_ac_be_bk;
	/** AC VI/VO flush time */
	t_u16 flush_time_ac_vi_vo;
};

/** Check if stream 2X2 enabled */
#define IS_STREAM_2X2(x) ((x)&FEATURE_CTRL_STREAM_2X2)
/** Check if DFS support enabled */
#define IS_DFS_SUPPORT(x) ((x)&FEATURE_CTRL_DFS_SUPPORT)
#ifdef USB
/** Check if winner check & not wait for FW ready event */
#define IS_USB_NEW_INIT(x) ((x)&FEATURE_CTRL_USB_NEW_INIT)
#endif

/** Ethernet packet type for EAPOL */
#define MLAN_ETHER_PKT_TYPE_EAPOL (0x888E)
#define MLAN_ETHER_PKT_TYPE_ARP (0x0806)
/** Ethernet packet type for WAPI */
#define MLAN_ETHER_PKT_TYPE_WAPI (0x88B4)
/** Ethernet packet type offset */
#define MLAN_ETHER_PKT_TYPE_OFFSET (12)

/** Rx packet Sniffer Operation Mode
 *
 * MODE1 : Can be enabled only in disconnected state.
 *
 * MODE3 : Can be enabled irrespective of active connection state.
 *         Both 802.11 and rtap headers are attached to all destined
 *         unicast data frames in the FW and uploaded to the host driver.
 *         Such frame will be duplicated in mlan, one for monitor interface
 *         and other for data interface, by reconstructing the 802.3 header.
 */
#define NET_MON_MODE_DISABLED 0
#define NET_MON_MODE1 1
#define NET_MON_MODE3 3
mlan_status wlan_cmd_net_monitor(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
				 t_u16 cmd_action, t_void *pdata_buf);

mlan_status wlan_ret_net_monitor(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
				 mlan_ioctl_req *pioctl_buf);

mlan_status wlan_misc_ioctl_net_monitor(pmlan_adapter pmadapter,
					pmlan_ioctl_req pioctl_req);

void wlan_rxpdinfo_to_radiotapinfo(pmlan_private priv, RxPD *prx_pd,
				   radiotap_info *prt_info);

mlan_status wlan_init_lock_list(pmlan_adapter pmadapter);
mlan_status wlan_init_priv_lock_list(pmlan_adapter pmadapter, t_u8 start_index);
t_void wlan_free_lock_list(pmlan_adapter pmadapter);
mlan_status wlan_init_timer(pmlan_adapter pmadapter);
t_void wlan_free_timer(pmlan_adapter pmadapter);

/* Function prototype */
/** Initialize firmware */
mlan_status wlan_init_fw(pmlan_adapter pmadapter);

/** get hw spec complete */
mlan_status wlan_get_hw_spec_complete(pmlan_adapter pmadapter);

/** Initialize firmware complete */
mlan_status wlan_init_fw_complete(pmlan_adapter pmadapter);

/** Shutdown firmware complete */
mlan_status wlan_shutdown_fw_complete(pmlan_adapter pmadapter);

/** Receive event */
mlan_status wlan_recv_event(pmlan_private priv, mlan_event_id event_id,
			    t_void *pmevent);

/** Initialize mlan_adapter structure */
t_void wlan_init_adapter(pmlan_adapter pmadapter);

/** Initialize mlan_private structure */
mlan_status wlan_init_priv(pmlan_private priv);
#ifdef USB
/** get pcie device from card type */
mlan_status wlan_get_usb_device(pmlan_adapter pmadapter);
#endif
mlan_status wlan_download_vdll_block(mlan_adapter *pmadapter, t_u8 *block,
				     t_u16 block_len);
mlan_status wlan_process_vdll_event(pmlan_private pmpriv, pmlan_buffer pevent);
/** Process event */
mlan_status wlan_process_event(pmlan_adapter pmadapter);

/** Prepare command */
mlan_status wlan_prepare_cmd(pmlan_private priv, t_u16 cmd_no, t_u16 cmd_action,
			     t_u32 cmd_oid, t_void *pioctl_buf,
			     t_void *pdata_buf);

/** cmd timeout handler */
t_void wlan_cmd_timeout_func(t_void *function_context);

/**
 *  @brief check if Tx pending
 *
 *  @param pmadapter	Pointer to mlan_adapter
 *  @return  MTRUE/MFALSE;
 */
static inline t_u8 wlan_is_tx_pending(mlan_adapter *pmadapter)
{
#ifdef PCIE
	if (IS_PCIE(pmadapter->card_type) &&
	    pmadapter->pcard_pcie->txbd_pending)
		return MTRUE;
#endif
	return MFALSE;
}

/** process host cmd */
mlan_status wlan_misc_ioctl_host_cmd(pmlan_adapter pmadapter,
				     pmlan_ioctl_req pioctl_req);
/** process init/shutdown cmd*/
mlan_status wlan_misc_ioctl_init_shutdown(pmlan_adapter pmadapter,
					  pmlan_ioctl_req pioctl_req);
/** process debug info */
mlan_status wlan_get_info_debug_info(pmlan_adapter pmadapter,
				     pmlan_ioctl_req pioctl_req);

#if defined(STA_SUPPORT) || defined(UAP_SUPPORT)
extern pmlan_operations mlan_ops[];
/** Set/Get BSS role */
mlan_status wlan_bss_ioctl_bss_role(pmlan_adapter pmadapter,
				    pmlan_ioctl_req pioctl_req);
#endif

#if defined(PCIE)
mlan_status wlan_misc_ssu(pmlan_adapter pmadapter, pmlan_ioctl_req pioctl_req);
#endif

mlan_status wlan_misc_csi(pmlan_adapter pmadapter, pmlan_ioctl_req pioctl_req);
mlan_status wlan_process_csi_event(pmlan_private pmpriv);

mlan_status wlan_misc_hal_phy_cfg(pmlan_adapter pmadapter,
				  pmlan_ioctl_req pioctl_req);

mlan_status wlan_set_ewpa_mode(mlan_private *priv, pmlan_ds_passphrase psec_pp);
mlan_status wlan_find_bss(mlan_private *pmpriv, pmlan_ioctl_req pioctl_req);

/* block main process */
void mlan_block_main_process(mlan_adapter *pmadapter, t_u8 block);
/* block rx process */
void mlan_block_rx_process(mlan_adapter *pmadapter, t_u8 block);
/** check pending command */
int wlan_check_pending_cmd(mlan_adapter *pmadapter);
/** Allocate memory for adapter structure members */
mlan_status wlan_allocate_adapter(pmlan_adapter pmadapter);
/** Free adapter */
t_void wlan_free_adapter(pmlan_adapter pmadapter);
/** Free priv */
t_void wlan_free_priv(mlan_private *pmpriv);
/** Allocate command buffer */
mlan_status wlan_alloc_cmd_buffer(mlan_adapter *pmadapter);
/** Free command buffer */
mlan_status wlan_free_cmd_buffer(mlan_adapter *pmadapter);
/** Request command lock */
t_void wlan_request_cmd_lock(mlan_adapter *pmadapter);
/** Release command lock */
t_void wlan_release_cmd_lock(mlan_adapter *pmadapter);
#ifdef STA_SUPPORT
/** Flush the scan pending queue */
t_void wlan_flush_scan_queue(pmlan_adapter pmadapter);
t_void wlan_move_cmd_to_cmd_pending_q(pmlan_adapter pmadapter);
mlan_status wlan_cancel_pending_scan_cmd(pmlan_adapter pmadapter,
					 pmlan_ioctl_req pioctl_req);
#endif
/**Cancel pending command */
t_void wlan_cancel_all_pending_cmd(pmlan_adapter pmadapter, t_u8 flag);
/**Cancel pending ioctl */
t_void wlan_cancel_pending_ioctl(pmlan_adapter pmadapter,
				 pmlan_ioctl_req pioctl_req);
/**Cancel bss pending ioctl */
t_void wlan_cancel_bss_pending_cmd(pmlan_adapter pmadapter, t_u32 bss_index);

/** Insert command to free queue */
t_void wlan_insert_cmd_to_free_q(mlan_adapter *pmadapter,
				 cmd_ctrl_node *pcmd_node);

/** Insert command to pending queue */
t_void wlan_insert_cmd_to_pending_q(mlan_adapter *pmadapter,
				    cmd_ctrl_node *pcmd_node, t_u32 addtail);

/** Execute next command */
mlan_status wlan_exec_next_cmd(mlan_adapter *pmadapter);
/** Proecess command response */
mlan_status wlan_process_cmdresp(mlan_adapter *pmadapter);
/** Handle received packet, has extra handling for aggregate packets */
mlan_status wlan_handle_rx_packet(pmlan_adapter pmadapter, pmlan_buffer pmbuf);
/** Process transmission */
mlan_status wlan_process_tx(pmlan_private priv, pmlan_buffer pmbuf,
			    mlan_tx_param *tx_param);
/** Transmit a null data packet */
mlan_status wlan_send_null_packet(pmlan_private priv, t_u8 flags);

#ifdef SDIO
mlan_status wlan_alloc_sdio_mpa_buffers(mlan_adapter *pmadapter,
					t_u32 mpa_tx_buf_size,
					t_u32 mpa_rx_buf_size);

mlan_status wlan_free_sdio_mpa_buffers(mlan_adapter *pmadapter);
#endif

/** Process write data complete */
mlan_status wlan_write_data_complete(pmlan_adapter pmlan_adapter,
				     pmlan_buffer pmbuf, mlan_status status);

#ifdef USB
mlan_status wlan_usb_deaggr_rx_pkt(pmlan_adapter pmadapter, pmlan_buffer pmbuf);

/**
 *  @brief  This function resets USB Tx Aggregation buffers
 *
 *  @param pmadapter	A pointer to mlan_adapter
 *
 *  @return 	N/A
 */
static INLINE t_void wlan_reset_usb_tx_aggr(pmlan_adapter pmadapter)
{
	t_s32 i = 0;
	pmlan_callbacks pcb = &pmadapter->callbacks;
	ENTER();
	for (i = 0; i < MAX_USB_TX_PORT_NUM; i++) {
		pcb->moal_spin_lock(
			pmadapter->pmoal_handle,
			pmadapter->pcard_usb->usb_tx_aggr[i].paggr_lock);
		if (pmadapter->pcard_usb->usb_tx_aggr[i].aggr_hold_timer_is_set) {
			pcb->moal_stop_timer(pmadapter->pmoal_handle,
					     pmadapter->pcard_usb
						     ->usb_tx_aggr[i]
						     .paggr_hold_timer);
			pmadapter->pcard_usb->usb_tx_aggr[i]
				.aggr_hold_timer_is_set = MFALSE;
		}
		if (pmadapter->pcard_usb->usb_tx_aggr[i].aggr_ctrl.enable &&
		    pmadapter->pcard_usb->usb_tx_aggr[i].pmbuf_aggr != MNULL) {
			wlan_write_data_complete(
				pmadapter,
				pmadapter->pcard_usb->usb_tx_aggr[i].pmbuf_aggr,
				MLAN_STATUS_FAILURE); /* did not get sent */
			pmadapter->pcard_usb->usb_tx_aggr[i].pmbuf_aggr = MNULL;
			pmadapter->pcard_usb->usb_tx_aggr[i].aggr_len = 0;
		}
		pcb->moal_spin_unlock(
			pmadapter->pmoal_handle,
			pmadapter->pcard_usb->usb_tx_aggr[i].paggr_lock);
	}
	LEAVE();
}

/**
 *  @brief  This function get usb_tx_aggr_params
 *
 *  @param pmadapter	A pointer to mlan_adapter
 *  @param port		    port for TX
 *
 *  @return	            A pointer to usb_tx_aggr_params
 */
static INLINE usb_tx_aggr_params *
wlan_get_usb_tx_aggr_params(pmlan_adapter pmadapter, t_u32 port)
{
	int i;
	ENTER();
	for (i = 0; i < MAX_USB_TX_PORT_NUM; i++) {
		if (pmadapter->pcard_usb->usb_tx_aggr[i].aggr_ctrl.enable &&
		    pmadapter->pcard_usb->usb_tx_aggr[i].port == port)
			return &pmadapter->pcard_usb->usb_tx_aggr[i];
	}
	LEAVE();
	return MNULL;
}

t_void wlan_usb_tx_aggr_timeout_func(t_void *function_context);
mlan_status wlan_usb_host_to_card_aggr(pmlan_adapter pmadapter,
				       pmlan_buffer pmbuf,
				       mlan_tx_param *tx_param,
				       usb_tx_aggr_params *aggr_params);
#endif

/** Process receive packet complete */
mlan_status wlan_recv_packet_complete(pmlan_adapter pmadapter,
				      pmlan_buffer pmbuf, mlan_status status);
/** Clean Tx Rx queues */
t_void wlan_clean_txrx(pmlan_private priv);

t_void wlan_add_buf_bypass_txqueue(mlan_adapter *pmadapter, pmlan_buffer pmbuf);
t_void wlan_process_bypass_tx(mlan_adapter *pmadapter);
t_void wlan_cleanup_bypass_txq(pmlan_private priv);
t_u8 wlan_bypass_tx_list_empty(mlan_adapter *pmadapter);

/** Check if this is the last packet */
t_u8 wlan_check_last_packet_indication(pmlan_private priv);

#define MOAL_ALLOC_MLAN_BUFFER MBIT(0)
#define MOAL_MALLOC_BUFFER MBIT(1)
#define MOAL_MEM_FLAG_ATOMIC MBIT(2)

#ifdef PCIE
/* This defines the direction arg to the DMA mapping routines. */
#define PCI_DMA_BIDIRECTIONAL 0
#define PCI_DMA_TODEVICE 1
#define PCI_DMA_FROMDEVICE 2
#define PCI_DMA_NONE 3
#endif

/** function to allocate a mlan_buffer */
pmlan_buffer wlan_alloc_mlan_buffer(mlan_adapter *pmadapter, t_u32 data_len,
				    t_u32 head_room, t_u32 malloc_flag);
/** function to free a mlan_buffer */
t_void wlan_free_mlan_buffer(mlan_adapter *pmadapter, pmlan_buffer pmbuf);

/** command resp handler for version ext */
mlan_status wlan_ret_ver_ext(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
			     mlan_ioctl_req *pioctl_buf);

/** command resp handler for rx mgmt forward registration */
mlan_status wlan_ret_rx_mgmt_ind(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
				 mlan_ioctl_req *pioctl_buf);

/** Check Power Save condition */
t_void wlan_check_ps_cond(mlan_adapter *pmadapter);

/** handle command for enhanced power save mode */
mlan_status wlan_cmd_enh_power_mode(pmlan_private pmpriv,
				    HostCmd_DS_COMMAND *cmd, t_u16 cmd_action,
				    t_u16 ps_bitmap, t_void *pdata_buf);
/** handle command resp for enhanced power save mode */
mlan_status wlan_ret_enh_power_mode(pmlan_private pmpriv,
				    HostCmd_DS_COMMAND *resp,
				    mlan_ioctl_req *pioctl_buf);

/** handle commnand for cfg data */
mlan_status wlan_cmd_cfg_data(pmlan_private pmpriv, HostCmd_DS_COMMAND *pcmd,
			      t_u16 cmd_action, t_u32 cmd_oid,
			      t_void *pdata_buf);
/** handle command resp for cfg data */
mlan_status wlan_ret_cfg_data(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
			      t_void *pioctl_buf);

/** Process sleep confirm command response */
void wlan_process_sleep_confirm_resp(pmlan_adapter pmadapter, t_u8 *pbuf,
				     t_u32 len);

/** Perform hs related activities on receving the power up interrupt */
void wlan_process_hs_config(pmlan_adapter pmadapter);

t_void wlan_wakeup_card_timeout_func(void *function_context);

mlan_status wlan_process_802dot11_mgmt_pkt(mlan_private *priv, t_u8 *payload,
					   t_u32 payload_len, RxPD *prx_pd);

mlan_status wlan_pm_ioctl_hscfg(pmlan_adapter pmadapter,
				pmlan_ioctl_req pioctl_req);

mlan_status wlan_radio_ioctl_remain_chan_cfg(pmlan_adapter pmadapter,
					     pmlan_ioctl_req pioctl_req);
mlan_status wlan_cmd_remain_on_channel(pmlan_private pmpriv,
				       HostCmd_DS_COMMAND *cmd,
				       t_u16 cmd_action, t_void *pdata_buf);
mlan_status wlan_ret_remain_on_channel(pmlan_private pmpriv,
				       HostCmd_DS_COMMAND *resp,
				       mlan_ioctl_req *pioctl_buf);

#ifdef WIFI_DIRECT_SUPPORT
mlan_status wlan_bss_ioctl_wifi_direct_mode(pmlan_adapter pmadapter,
					    pmlan_ioctl_req pioctl_req);

mlan_status wlan_cmd_wifi_direct_mode(pmlan_private pmpriv,
				      HostCmd_DS_COMMAND *cmd, t_u16 cmd_action,
				      t_void *pdata_buf);
mlan_status wlan_ret_wifi_direct_mode(pmlan_private pmpriv,
				      HostCmd_DS_COMMAND *resp,
				      mlan_ioctl_req *pioctl_buf);
mlan_status wlan_cmd_p2p_params_config(pmlan_private pmpriv,
				       HostCmd_DS_COMMAND *cmd,
				       t_u16 cmd_action, t_void *pdata_buf);
mlan_status wlan_ret_p2p_params_config(pmlan_private pmpriv,
				       HostCmd_DS_COMMAND *resp,
				       mlan_ioctl_req *pioctl_buf);
mlan_status wlan_misc_p2p_config(pmlan_adapter pmadapter,
				 pmlan_ioctl_req pioctl_req);
#endif
mlan_status wlan_cmd_gpio_tsf_latch(pmlan_private pmpriv,
				    HostCmd_DS_COMMAND *cmd, t_u16 cmd_action,
				    mlan_ioctl_req *pioctl_buf,
				    t_void *pdata_buf);
mlan_status wlan_ret_gpio_tsf_latch(pmlan_private pmpriv,
				    HostCmd_DS_COMMAND *resp,
				    mlan_ioctl_req *pioctl_buf);
mlan_status wlan_misc_gpio_tsf_latch_config(pmlan_adapter pmadapter,
					    pmlan_ioctl_req pioctl_req);
mlan_status wlan_misc_get_tsf_info(pmlan_adapter pmadapter,
				   pmlan_ioctl_req pioctl_req);
mlan_status wlan_cmd_cross_chip_synch(pmlan_private pmpriv,
				      HostCmd_DS_COMMAND *cmd, t_u16 cmd_action,
				      t_void *pdata_buf);
mlan_status wlan_ret_cross_chip_synch(pmlan_private pmpriv,
				      HostCmd_DS_COMMAND *resp,
				      mlan_ioctl_req *pioctl_buf);
mlan_status wlan_misc_ioctl_cross_chip_synch(pmlan_adapter pmadapter,
					     pmlan_ioctl_req pioctl_req);
/** get ralist info */
int wlan_get_ralist_info(mlan_private *priv, pralist_info buf);
/** dump ralist */
void wlan_dump_ralist(mlan_private *priv);

/** get pm info */
mlan_status wlan_get_pm_info(pmlan_adapter pmadapter,
			     pmlan_ioctl_req pioctl_req);

mlan_status wlan_bss_ioctl_bss_remove(pmlan_adapter pmadapter,
				      pmlan_ioctl_req pioctl_req);

mlan_status wlan_radio_ioctl_mimo_switch_cfg(pmlan_adapter pmadapter,
					     pmlan_ioctl_req pioctl_req);
mlan_status wlan_cmd_802_11_mimo_switch(pmlan_private pmpriv,
					HostCmd_DS_COMMAND *cmd,
					t_void *pdata_buf);

mlan_status wlan_misc_per_pkt_cfg(pmlan_adapter pmadapter,
				  pmlan_ioctl_req pioctl_req);

mlan_status wlan_config_mgmt_filter(pmlan_adapter pmadapter,
				    pmlan_ioctl_req pioctl_req);
mlan_status wlan_get_hs_wakeup_reason(pmlan_adapter pmadapter,
				      pmlan_ioctl_req pioctl_req);

mlan_status wlan_cmd_hs_wakeup_reason(pmlan_private pmpriv,
				      HostCmd_DS_COMMAND *cmd,
				      t_void *pdata_buf);

mlan_status wlan_ret_hs_wakeup_reason(pmlan_private pmpriv,
				      HostCmd_DS_COMMAND *resp,
				      mlan_ioctl_req *pioctl_buf);

mlan_status wlan_get_tx_rx_histogram(pmlan_adapter pmadapter,
				     pmlan_ioctl_req pioctl_req);
mlan_status wlan_cmd_tx_rx_pkt_stats(pmlan_private pmpriv,
				     HostCmd_DS_COMMAND *cmd,
				     pmlan_ioctl_req pioctl_buf,
				     t_void *pdata_buf);
mlan_status wlan_ret_tx_rx_pkt_stats(pmlan_private pmpriv,
				     HostCmd_DS_COMMAND *resp,
				     mlan_ioctl_req *pioctl_buf);

mlan_status wlan_radio_ioctl_radio_ctl(pmlan_adapter pmadapter,
				       pmlan_ioctl_req pioctl_req);

mlan_status wlan_radio_ioctl_ant_cfg(pmlan_adapter pmadapter,
				     pmlan_ioctl_req pioctl_req);

mlan_status wlan_cmd_tx_rate_cfg(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
				 t_u16 cmd_action, t_void *pdata_buf,
				 mlan_ioctl_req *pioctl_buf);
mlan_status wlan_ret_tx_rate_cfg(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
				 mlan_ioctl_req *pioctl_buf);

mlan_status wlan_rate_ioctl_cfg(pmlan_adapter pmadapter,
				pmlan_ioctl_req pioctl_req);
mlan_status wlan_ret_802_11_tx_rate_query(pmlan_private pmpriv,
					  HostCmd_DS_COMMAND *resp,
					  mlan_ioctl_req *pioctl_buf);

mlan_status wlan_rate_ioctl_get_data_rate(pmlan_adapter pmadapter,
					  pmlan_ioctl_req pioctl_req);

t_void wlan_host_sleep_activated_event(pmlan_private priv, t_u8 activated);
/** Handles the command response of hs_cfg */
mlan_status wlan_ret_802_11_hs_cfg(pmlan_private pmpriv,
				   HostCmd_DS_COMMAND *resp,
				   mlan_ioctl_req *pioctl_buf);
/** Sends HS_WAKEUP event to applications */
t_void wlan_host_sleep_wakeup_event(pmlan_private priv);

/** Prepares command of robustcoex */
mlan_status wlan_cmd_robustcoex(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
				t_u16 cmd_action, t_u16 *pdata_buf);
/** Set Robustcoex gpiocfg */
mlan_status wlan_misc_robustcoex(pmlan_adapter pmadapter,
				 pmlan_ioctl_req pioctl_req);

/** Set mapping policy/get DMCS status */
mlan_status wlan_misc_dmcs_config(pmlan_adapter pmadapter,
				  pmlan_ioctl_req pioctl_req);
/** Prepares command of DMCS config */
mlan_status wlan_cmd_dmcs_config(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
				 t_u16 cmd_action, t_void *pdata_buf);
/** Handles command response of DMCS config */
mlan_status wlan_ret_dmcs_config(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
				 mlan_ioctl_req *pioctl_buf);

#if defined(PCIE)
mlan_status wlan_cmd_ssu(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
			 t_u16 cmd_action, t_u16 *pdata_buf);
#endif

/** send get hw spec command to firmware */
mlan_status wlan_adapter_get_hw_spec(pmlan_adapter pmadapter);
/** send adapter specific init cmd to firmware */
mlan_status wlan_adapter_init_cmd(pmlan_adapter pmadapter);
/** get/set bandcfg */
mlan_status wlan_radio_ioctl_band_cfg(pmlan_adapter pmadapter,
				      pmlan_ioctl_req pioctl_req);

mlan_status wlan_handle_event_multi_chan_info(pmlan_private pmpriv,
					      pmlan_buffer pevent);
#ifdef USB

/**
 *  @brief  This function update the port status
 *
 *  @param pmadapter	A pointer to mlan_adapter
 *  @param port         USB port
 *  @param status       port status
 *
 *  @return		N/A
 */
static INLINE void wlan_update_port_status(pmlan_adapter pmadapter, t_u32 port,
					   t_u8 status)
{
	int i;
	for (i = 0; i < MAX_USB_TX_PORT_NUM; i++) {
		if (port == pmadapter->usb_tx_ports[i]) {
			pmadapter->pcard_usb->usb_port_status[i] = status;
			break;
		}
	}
	return;
}

inline t_u8 wlan_usb_data_sent(pmlan_adapter pmadapter);
void wlan_resync_usb_port(pmlan_adapter pmadapter);

/**
 *  @brief  This function return port index
 *
 *  @param pmadapter	A pointer to mlan_adapter
 *  @param port         USB port
 *  @return		port index
 *
 */
static INLINE t_u8 wlan_get_port_index(pmlan_adapter pmadapter, t_u32 port)
{
	t_u8 i;
	for (i = 0; i < MAX_USB_TX_PORT_NUM; i++) {
		if (port == pmadapter->usb_tx_ports[i]) {
			return i;
		}
	}
	return 0;
}

#endif

/** warm reset */
mlan_status wlan_misc_ioctl_warm_reset(pmlan_adapter pmadapter,
				       pmlan_ioctl_req pioctl_req);

#ifdef STA_SUPPORT
/** Process received packet */
mlan_status wlan_process_rx_packet(pmlan_adapter pmadapter, pmlan_buffer pmbuf);
/** ioctl handler for station mode */
mlan_status wlan_ops_sta_ioctl(t_void *adapter, pmlan_ioctl_req pioctl_req);

/** cmd handler for station mode */
mlan_status wlan_ops_sta_prepare_cmd(t_void *priv, t_u16 cmd_no,
				     t_u16 cmd_action, t_u32 cmd_oid,
				     t_void *pioctl_buf, t_void *pdata_buf,
				     t_void *pcmd_buf);

/** cmdresp handler for station mode */
mlan_status wlan_ops_sta_process_cmdresp(t_void *priv, t_u16 cmdresp_no,
					 t_void *pcmd_buf, t_void *pioctl);

/** rx handler for station mode */
mlan_status wlan_ops_sta_process_rx_packet(t_void *adapter, pmlan_buffer pmbuf);

/** event handler for station mode */
mlan_status wlan_ops_sta_process_event(t_void *priv);

/** fill txpd for station mode */
t_void *wlan_ops_sta_process_txpd(t_void *priv, pmlan_buffer pmbuf);

/** send init cmd to firmware for station mode */
mlan_status wlan_ops_sta_init_cmd(t_void *priv, t_u8 first_bss);

/** Flush the scan table */
mlan_status wlan_flush_scan_table(pmlan_adapter pmadapter);

/** Scan for networks */
mlan_status wlan_scan_networks(mlan_private *pmpriv, t_void *pioctl_buf,
			       wlan_user_scan_cfg *puser_scan_in);

/** Scan for specific SSID */
mlan_status wlan_scan_specific_ssid(mlan_private *pmpriv, t_void *pioctl_buf,
				    mlan_802_11_ssid *preq_ssid);

/** Scan command handler */
mlan_status wlan_cmd_802_11_scan(pmlan_private pmpriv, HostCmd_DS_COMMAND *pcmd,
				 t_void *pdata_buf);

/** Handler for scan command response */
mlan_status wlan_ret_802_11_scan(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
				 t_void *pioctl_buf);

mlan_status wlan_scan_ioctl(pmlan_adapter pmadapter,
			    pmlan_ioctl_req pioctl_req);

t_u8 wlan_get_ext_scan_state(HostCmd_DS_COMMAND *pcmd);
/** Extended scan command handler */
mlan_status wlan_cmd_802_11_scan_ext(pmlan_private pmpriv,
				     HostCmd_DS_COMMAND *pcmd,
				     t_void *pdata_buf);
/** Handler for extended scan command response */
mlan_status wlan_ret_802_11_scan_ext(pmlan_private pmpriv,
				     HostCmd_DS_COMMAND *resp,
				     t_void *pioctl_buf);
/** Handler event for extended scan report */
mlan_status wlan_handle_event_ext_scan_report(mlan_private *pmpriv,
					      mlan_buffer *pmbuf);
mlan_status wlan_handle_event_ext_scan_status(mlan_private *pmpriv,
					      mlan_buffer *pmbuf);

/** check network compatibility */
t_s32 wlan_is_network_compatible(mlan_private *pmpriv, t_u32 index, t_u32 mode);

/** Find an SSID in a list */
t_s32 wlan_find_ssid_in_list(pmlan_private pmpriv, mlan_802_11_ssid *ssid,
			     t_u8 *bssid, t_u32 mode);

/** Find a BSSID in a list */
t_s32 wlan_find_bssid_in_list(mlan_private *pmpriv, t_u8 *bssid, t_u32 mode);

/** Find best network */
mlan_status wlan_find_best_network(mlan_private *pmpriv,
				   mlan_ssid_bssid *preq_ssid_bssid);

/** Compare two SSIDs */
t_s32 wlan_ssid_cmp(pmlan_adapter pmadapter, mlan_802_11_ssid *ssid1,
		    mlan_802_11_ssid *ssid2);

/** Associate */
mlan_status wlan_associate(mlan_private *pmpriv, IN t_void *pioctl_buf,
			   IN BSSDescriptor_t *pBSSDesc);

/** Associate command handler */
mlan_status wlan_cmd_802_11_associate(mlan_private *pmpriv,
				      HostCmd_DS_COMMAND *cmd,
				      t_void *pdata_buf);

/** Handler for association command response */
mlan_status wlan_ret_802_11_associate(mlan_private *pmpriv,
				      HostCmd_DS_COMMAND *resp,
				      t_void *pioctl_buf);

/** Reset connected state */
t_void wlan_reset_connect_state(pmlan_private priv, t_u8 drv_disconnect);

t_void wlan_2040_coex_event(pmlan_private pmpriv);

/** convert band to radio type */
t_u8 wlan_band_to_radio_type(t_u16 band);
/** convert radio_type to band */
t_u16 radio_type_to_band(t_u8 chanBand);

/** Disconnect */
mlan_status wlan_disconnect(mlan_private *pmpriv, mlan_ioctl_req *pioctl_req,
			    mlan_deauth_param *deauth_param);

/** Ad-Hoc start */
mlan_status wlan_adhoc_start(mlan_private *pmpriv, t_void *pioctl_buf,
			     mlan_802_11_ssid *padhoc_ssid);

/** Ad-Hoc join */
mlan_status wlan_adhoc_join(mlan_private *pmpriv, t_void *pioctl_buf,
			    BSSDescriptor_t *pBSSDesc);

/** Ad-Hoc start command handler */
mlan_status wlan_cmd_802_11_ad_hoc_start(mlan_private *pmpriv,
					 HostCmd_DS_COMMAND *cmd,
					 t_void *pdata_buf);

/** Ad-Hoc command handler */
mlan_status wlan_cmd_802_11_ad_hoc_join(mlan_private *pmpriv,
					HostCmd_DS_COMMAND *cmd,
					t_void *pdata_buf);

/** Handler for Ad-Hoc commands */
mlan_status wlan_ret_802_11_ad_hoc(mlan_private *pmpriv,
				   HostCmd_DS_COMMAND *resp,
				   t_void *pioctl_buf);

/** Handler for bgscan query commands */
mlan_status wlan_cmd_802_11_bg_scan_query(mlan_private *pmpriv,
					  HostCmd_DS_COMMAND *pcmd,
					  t_void *pdata_buf);
/** Handler for bgscan config command */
mlan_status wlan_cmd_bgscan_config(mlan_private *pmpriv,
				   HostCmd_DS_COMMAND *pcmd, t_void *pdata_buf);
/** Hander for bgscan config command response */
mlan_status wlan_ret_bgscan_config(mlan_private *pmpriv,
				   HostCmd_DS_COMMAND *resp,
				   mlan_ioctl_req *pioctl_buf);
mlan_status wlan_ret_802_11_bgscan_query(mlan_private *pmpriv,
					 HostCmd_DS_COMMAND *resp,
					 mlan_ioctl_req *pioctl_buf);

/** Get Channel-Frequency-Power by band and channel */
chan_freq_power_t *
wlan_get_cfp_by_band_and_channel(pmlan_adapter pmadapter, t_u16 band,
				 t_u16 channel, region_chan_t *region_channel);
/** Find Channel-Frequency-Power by band and channel */
chan_freq_power_t *wlan_find_cfp_by_band_and_channel(mlan_adapter *pmadapter,
						     t_u16 band, t_u16 channel);
/** Find Channel-Frequency-Power by band and frequency */
chan_freq_power_t *wlan_find_cfp_by_band_and_freq(mlan_adapter *pmadapter,
						  t_u16 band, t_u32 freq);
/** Get Tx power of channel from Channel-Frequency-Power */
t_u8 wlan_get_txpwr_of_chan_from_cfp(mlan_private *pmpriv, t_u16 band,
				     t_u8 channel);
/** find frequency from band and channel */
t_u32 wlan_find_freq_from_band_chan(t_u16 band, t_u8 chan);

/*  Save a beacon buffer of the current bss descriptor */
t_void wlan_save_curr_bcn(mlan_private *pmpriv);
/*  Free a beacon buffer of the current bss descriptor */
t_void wlan_free_curr_bcn(mlan_private *pmpriv);

#endif /* STA_SUPPORT */

/* Rate related functions */
t_u8 wlan_convert_v14_tx_rate_info(pmlan_private pmpriv, t_u8 v14_rate_info);
t_u8 wlan_convert_v14_rx_rate_info(pmlan_private pmpriv, t_u8 v14_rate_info);
/** Convert index into data rate */
t_u32 wlan_index_to_data_rate(pmlan_adapter pmadapter, t_u8 index,
			      t_u8 rate_info, t_u8 ext_rate_info);
/** Get active data rates */
t_u32 wlan_get_active_data_rates(mlan_private *pmpriv, t_u32 bss_mode,
				 t_u16 config_bands, WLAN_802_11_RATES rates);
/** Get supported data rates */
t_u32 wlan_get_supported_rates(mlan_private *pmpriv, t_u32 bss_mode,
			       t_u16 config_bands, WLAN_802_11_RATES rates);
/** Convert data rate to index */
t_u8 wlan_data_rate_to_index(pmlan_adapter pmadapter, t_u32 rate);
/** Check if rate is auto */
t_u8 wlan_is_rate_auto(mlan_private *pmpriv);
/** Get rate index */
int wlan_get_rate_index(pmlan_adapter pmadapter, t_u16 *rateBitmap, int size);
mlan_status wlan_cmd_rxabortcfg(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
				t_u16 cmd_action, t_void *pdata_buf);
mlan_status wlan_ret_rxabortcfg(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
				mlan_ioctl_req *pioctl_buf);
mlan_status wlan_cmd_ofdmdesense_cfg(pmlan_private pmpriv,
				     HostCmd_DS_COMMAND *cmd, t_u16 cmd_action,
				     t_void *pdata_buf);
mlan_status wlan_ret_ofdmdesense_cfg(pmlan_private pmpriv,
				     HostCmd_DS_COMMAND *resp,
				     mlan_ioctl_req *pioctl_buf);
mlan_status wlan_cmd_rxabortcfg_ext(pmlan_private pmpriv,
				    HostCmd_DS_COMMAND *cmd, t_u16 cmd_action,
				    t_void *pdata_buf);
mlan_status wlan_cmd_nav_mitigation(pmlan_private pmpriv,
				    HostCmd_DS_COMMAND *cmd, t_u16 cmd_action,
				    t_void *pdata_buf);
mlan_status wlan_ret_rxabortcfg_ext(pmlan_private pmpriv,
				    HostCmd_DS_COMMAND *resp,
				    mlan_ioctl_req *pioctl_buf);
mlan_status wlan_ret_nav_mitigation(pmlan_private pmpriv,
				    HostCmd_DS_COMMAND *resp,
				    mlan_ioctl_req *pioctl_buf);
mlan_status wlan_cmd_tx_ampdu_prot_mode(pmlan_private pmpriv,
					HostCmd_DS_COMMAND *cmd,
					t_u16 cmd_action, t_void *pdata_buf);
mlan_status wlan_ret_tx_ampdu_prot_mode(pmlan_private pmpriv,
					HostCmd_DS_COMMAND *resp,
					mlan_ioctl_req *pioctl_buf);
mlan_status wlan_cmd_dot11mc_unassoc_ftm_cfg(pmlan_private pmpriv,
					     HostCmd_DS_COMMAND *cmd,
					     t_u16 cmd_action,
					     t_void *pdata_buf);
mlan_status wlan_ret_dot11mc_unassoc_ftm_cfg(pmlan_private pmpriv,
					     HostCmd_DS_COMMAND *resp,
					     mlan_ioctl_req *pioctl_buf);
mlan_status wlan_cmd_hal_phy_cfg(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
				 t_u16 cmd_action, t_u16 *pdata_buf);
mlan_status wlan_ret_hal_phy_cfg(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
				 mlan_ioctl_req *pioctl_buf);
mlan_status wlan_cmd_ips_config(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
				t_u16 cmd_action, t_void *pdata_buf);
mlan_status wlan_ret_ips_cfg(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
			     mlan_ioctl_req *pioctl_buf);
mlan_status wlan_cmd_rate_adapt_cfg(pmlan_private pmpriv,
				    HostCmd_DS_COMMAND *cmd, t_u16 cmd_action,
				    t_void *pdata_buf);
mlan_status wlan_ret_rate_adapt_cfg(pmlan_private pmpriv,
				    HostCmd_DS_COMMAND *resp,
				    mlan_ioctl_req *pioctl_buf);
mlan_status wlan_cmd_cck_desense_cfg(pmlan_private pmpriv,
				     HostCmd_DS_COMMAND *cmd, t_u16 cmd_action,
				     t_void *pdata_buf);

mlan_status wlan_ret_cck_desense_cfg(pmlan_private pmpriv,
				     HostCmd_DS_COMMAND *resp,
				     mlan_ioctl_req *pioctl_buf);

mlan_status wlan_cmd_arb_cfg(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
			     t_u16 cmd_action, t_void *pdata_buf);
mlan_status wlan_ret_arb_cfg(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
			     mlan_ioctl_req *pioctl_buf);

mlan_status wlan_misc_ioctl_rxabortcfg(pmlan_adapter pmadapter,
				       pmlan_ioctl_req pioctl_req);
mlan_status wlan_misc_ioctl_ofdmdesense_cfg(pmlan_adapter pmadapter,
					    pmlan_ioctl_req pioctl_req);
mlan_status wlan_misc_ioctl_rxabortcfg_ext(pmlan_adapter pmadapter,
					   pmlan_ioctl_req pioctl_req);
mlan_status wlan_misc_ioctl_nav_mitigation(pmlan_adapter pmadapter,
					   pmlan_ioctl_req pioctl_req);
mlan_status wlan_misc_ioctl_tx_ampdu_prot_mode(pmlan_adapter pmadapter,
					       pmlan_ioctl_req pioctl_req);
mlan_status wlan_misc_ioctl_dot11mc_unassoc_ftm_cfg(pmlan_adapter pmadapter,
						    pmlan_ioctl_req pioctl_req);
mlan_status wlan_misc_ioctl_rate_adapt_cfg(pmlan_adapter pmadapter,
					   pmlan_ioctl_req pioctl_req);
mlan_status wlan_misc_ioctl_cck_desense_cfg(pmlan_adapter pmadapter,
					    pmlan_ioctl_req pioctl_req);
mlan_status wlan_cmd_mfg(pmlan_private pmpriv, pHostCmd_DS_COMMAND cmd,
			 t_u16 cmd_action, t_pvoid pdata_buf);
mlan_status wlan_ret_mfg(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
			 mlan_ioctl_req *pioctl_buf);
mlan_status wlan_misc_ioctl_rf_test_cfg(pmlan_adapter pmadapter,
					pmlan_ioctl_req pioctl_req);
mlan_status wlan_misc_ioctl_range_ext(pmlan_adapter pmadapter,
				      pmlan_ioctl_req pioctl_req);
mlan_status wlan_misc_ioctl_twt_report(pmlan_adapter pmadapter,
				       pmlan_ioctl_req pioctl_req);
mlan_status wlan_ret_twt_report(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
				mlan_ioctl_req *pioctl_buf);
mlan_status wlan_misc_ioctl_arb_cfg(pmlan_adapter pmadapter,
				    pmlan_ioctl_req pioctl_req);
mlan_status wlan_misc_ioctl_tp_state(pmlan_adapter pmadapter,
				     pmlan_ioctl_req pioctl_req);
/* CFP related functions */
/** Region code index table */
extern t_u16 region_code_index[MRVDRV_MAX_REGION_CODE];
/** The table to keep CFP code for A */
extern t_u16 cfp_code_index_a[MRVDRV_MAX_CFP_CODE_A];

/** Set region table */
mlan_status wlan_set_regiontable(mlan_private *pmpriv, t_u8 region, t_u16 band);
/** Get radar detection requirements*/
t_bool wlan_get_cfp_radar_detect(mlan_private *priv, t_u8 chnl);
/** check if scan type is passive for b/g band*/
t_bool wlan_bg_scan_type_is_passive(mlan_private *priv, t_u8 chnl);
/** check if channel is NO_IR (passive) */
t_bool wlan_is_chan_passive(mlan_private *priv, t_u16 band, t_u8 chan);
/** check if channel is disabled */
t_bool wlan_is_chan_disabled(mlan_private *priv, t_u16 band, t_u8 chan);
/** check if channel is blacklisted */
t_bool wlan_is_chan_blacklisted(mlan_private *priv, t_u16 band, t_u8 chan);
/** set blacklist setting for a channel */
t_bool wlan_set_chan_blacklist(mlan_private *priv, t_u16 band, t_u8 chan,
			       t_bool bl);

dfs_state_t wlan_get_chan_dfs_state(mlan_private *priv, t_u16 band, t_u8 chan);
t_void wlan_set_chan_dfs_state(mlan_private *priv, t_u16 band, t_u8 chan,
			       dfs_state_t dfs_state);
t_void wlan_reset_all_chan_dfs_state(mlan_private *priv, t_u16 band,
				     dfs_state_t dfs_state);
/* 802.11D related functions */
/** Initialize 11D */
t_void wlan_11d_priv_init(mlan_private *pmpriv);
/** Initialize 11D */
t_void wlan_11d_init(mlan_adapter *pmadapter);
/** Enable 11D */
mlan_status wlan_11d_enable(mlan_private *pmpriv, t_void *pioctl_buf,
			    state_11d_t flag);
/** Get if 11D is enabled */
t_bool wlan_11d_is_enabled(mlan_private *pmpriv);
/** Get if FW 11D is enabled */
t_bool wlan_fw_11d_is_enabled(mlan_private *pmpriv);
/** Get if priv is station */
t_bool wlan_is_station(mlan_private *pmpriv);
/** Command handler for 11D country info */
mlan_status wlan_cmd_802_11d_domain_info(mlan_private *pmpriv,
					 HostCmd_DS_COMMAND *pcmd,
					 t_u16 cmd_action);
/** Handler for 11D country info command response */
mlan_status wlan_ret_802_11d_domain_info(mlan_private *pmpriv,
					 HostCmd_DS_COMMAND *resp);
/** Convert channel to frequency */
t_u32 wlan_11d_chan_2_freq(pmlan_adapter pmadapter, t_u8 chan, t_u16 band);
#ifdef STA_SUPPORT
/** Set 11D universal table */
mlan_status wlan_11d_set_universaltable(mlan_private *pmpriv, t_u16 band);
/** Clear 11D region table */
mlan_status wlan_11d_clear_parsedtable(mlan_private *pmpriv);
/** Create 11D country information for downloading */
mlan_status wlan_11d_create_dnld_countryinfo(mlan_private *pmpriv, t_u16 band);
/** Get scan type from 11D info */
t_u8 wlan_11d_get_scan_type(pmlan_adapter pmadapter, t_u16 band, t_u8 chan,
			    parsed_region_chan_11d_t *parsed_region_chan);
/** Parse 11D country info */
mlan_status wlan_11d_parse_dnld_countryinfo(mlan_private *pmpriv,
					    BSSDescriptor_t *pBSSDesc);
/** Prepare 11D domain information for download */
mlan_status wlan_11d_prepare_dnld_domain_info_cmd(mlan_private *pmpriv);
/** Parse 11D country information into domain info */
mlan_status wlan_11d_parse_domain_info(
	pmlan_adapter pmadapter, IEEEtypes_CountryInfoFullSet_t *country_info,
	t_u16 band, parsed_region_chan_11d_t *parsed_region_chan);
#endif /* STA_SUPPORT */
#ifdef UAP_SUPPORT
/** Handle 11D domain information from UAP */
mlan_status wlan_11d_handle_uap_domain_info(mlan_private *pmpriv, t_u16 band,
					    t_u8 *domain_tlv,
					    t_void *pioctl_buf);
#endif
/** Configure 11D domain info command */
mlan_status wlan_11d_cfg_domain_info(pmlan_adapter pmadapter,
				     mlan_ioctl_req *pioctl_req);

/** This functionn set/get reorder flush time */
mlan_status wlan_misc_ioctl_reorder_flush_time(pmlan_adapter pmadapter,
					       mlan_ioctl_req *pioctl_req);

/** This function converts region string to CFP table code */
mlan_status wlan_misc_country_2_cfp_table_code(pmlan_adapter pmadapter,
					       t_u8 *country_code, t_u8 *cfp_bg,
					       t_u8 *cfp_a);

/** This function finds if given country code is in EU table */
t_bool wlan_is_etsi_country(pmlan_adapter pmadapter, t_u8 *country_code);

/** check if station list is empty */
t_u8 wlan_is_station_list_empty(mlan_private *priv);
/** get station node */
sta_node *wlan_get_station_entry(mlan_private *priv, t_u8 *mac);
/** delete station list */
t_void wlan_delete_station_list(pmlan_private priv);
/** delete station entry */
t_void wlan_delete_station_entry(mlan_private *priv, t_u8 *mac);
/** add station entry */
sta_node *wlan_add_station_entry(mlan_private *priv, t_u8 *mac);
/** process uap rx packet */

void wlan_check_sta_capability(pmlan_private priv, pmlan_buffer pevent,
			       sta_node *sta_ptr);
/** find specific ie */
t_u8 *wlan_get_specific_ie(pmlan_private priv, t_u8 *ie_buf, t_u16 ie_len,
			   IEEEtypes_ElementId_e id, t_u8 ext_id);
t_u8 wlan_is_wmm_ie_present(pmlan_adapter pmadapter, t_u8 *pbuf, t_u16 buf_len);
/** Ethernet II header */
typedef struct {
	/** Ethernet II header destination address */
	t_u8 dest_addr[MLAN_MAC_ADDR_LENGTH];
	/** Ethernet II header source address */
	t_u8 src_addr[MLAN_MAC_ADDR_LENGTH];
	/** Ethernet II header length */
	t_u16 ethertype;
} EthII_Hdr_t;

/**
 *  @brief This function checks whether a station TDLS link is enabled or not
 *
 *  @param priv     A pointer to mlan_private
 *  @param mac      station mac address
 *  @return
 * TDLS_NOT_SETUP/TDLS_SETUP_INPROGRESS/TDLS_SETUP_COMPLETE/TDLS_SETUP_FAILURE/TDLS_TEAR_DOWN
 */
static INLINE tdlsStatus_e wlan_get_tdls_link_status(mlan_private *priv,
						     t_u8 *mac)
{
	sta_node *sta_ptr = MNULL;
	sta_ptr = wlan_get_station_entry(priv, mac);
	if (sta_ptr)
		return sta_ptr->status;
	return TDLS_NOT_SETUP;
}

/**
 *  @brief This function checks if TDLS link is in channel switching
 *
 *  @param status     tdls link status
 *  @return         MTRUE/MFALSE
 */
static INLINE int wlan_is_tdls_link_chan_switching(tdlsStatus_e status)
{
	return (status == TDLS_SWITCHING_CHANNEL) ? MTRUE : MFALSE;
}

/**
 *  @brief This function checks if send command to firmware is allowed
 *
 *  @param status     tdls link status
 *  @return         MTRUE/MFALSE
 */
static INLINE int wlan_is_send_cmd_allowed(tdlsStatus_e status)
{
	int ret = MTRUE;
	switch (status) {
	case TDLS_SWITCHING_CHANNEL:
	case TDLS_IN_OFF_CHANNEL:
		ret = MFALSE;
		break;
	default:
		break;
	}
	return ret;
}

/**
 *  @brief This function checks if TDLS link is setup
 *
 *  @param status     tdls link status
 *  @return         MTRUE/MFALSE
 */
static INLINE int wlan_is_tdls_link_setup(tdlsStatus_e status)
{
	int ret = MFALSE;
	switch (status) {
	case TDLS_SWITCHING_CHANNEL:
	case TDLS_IN_OFF_CHANNEL:
	case TDLS_IN_BASE_CHANNEL:
	case TDLS_SETUP_COMPLETE:
		ret = MTRUE;
		break;
	default:
		break;
	}
	return ret;
}

/**
 *  @brief This function checks tx_pause flag for peer
 *
 *  @param priv     A pointer to mlan_private
 *  @param ra       Address of the receiver STA
 *
 *  @return         MTRUE or MFALSE
 */
static INLINE int wlan_is_tx_pause(mlan_private *priv, t_u8 *ra)
{
	sta_node *sta_ptr = MNULL;
	sta_ptr = wlan_get_station_entry(priv, ra);
	if (sta_ptr)
		return sta_ptr->tx_pause;
	return MFALSE;
}
t_u16 wlan_update_ralist_tx_pause(pmlan_private priv, t_u8 *mac, t_u8 tx_pause);

#if defined(USB)
/**
 *  @brief  This function used to check if specific port is ready
 *
 *  @param pmadapter	A pointer to mlan_adapter
 *  @param port_index   port index;
 *
 *  @return		MTRUE -- port is ready.
 *              MFALSE -- port is busy.
 */
static inline t_u8 wlan_is_port_ready(pmlan_adapter pmadapter, t_u32 port_index)
{
	if (IS_USB(pmadapter->card_type))
		return (pmadapter->pcard_usb->usb_port_status[port_index]) ?
			       MFALSE :
			       MTRUE;
	else
		return MTRUE;
}
#endif

#ifdef UAP_SUPPORT
mlan_status wlan_process_uap_rx_packet(mlan_private *priv, pmlan_buffer pmbuf);
t_void wlan_drop_tx_pkts(pmlan_private priv);
#endif /* UAP_SUPPORT */

#ifdef UAP_SUPPORT
/* process the recevied packet and bridge the packet */
mlan_status wlan_uap_recv_packet(mlan_private *priv, pmlan_buffer pmbuf);
#endif /* UAP_SUPPORT */

mlan_status wlan_misc_ioctl_custom_ie_list(pmlan_adapter pmadapter,
					   pmlan_ioctl_req pioctl_req,
					   t_bool send_ioctl);

mlan_status wlan_cmd_get_hw_spec(pmlan_private pmpriv,
				 HostCmd_DS_COMMAND *pcmd);
mlan_status wlan_ret_get_hw_spec(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
				 t_void *pioctl_buf);
#ifdef SDIO
mlan_status wlan_cmd_sdio_rx_aggr_cfg(HostCmd_DS_COMMAND *pcmd,
				      t_u16 cmd_action, t_void *pdata_buf);
mlan_status wlan_ret_sdio_rx_aggr_cfg(pmlan_private pmpriv,
				      HostCmd_DS_COMMAND *resp);
#endif

mlan_status wlan_misc_ioctl_mac_control(pmlan_adapter pmadapter,
					pmlan_ioctl_req pioctl_req);
mlan_status wlan_cmd_mac_control(pmlan_private pmpriv, HostCmd_DS_COMMAND *pcmd,
				 t_u16 cmd_action, t_void *pdata_buf);
mlan_status wlan_ret_mac_control(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
				 mlan_ioctl_req *pioctl_buf);

mlan_status wlan_cmd_cw_mode_ctrl(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
				  t_u16 cmd_action, t_void *pdata_buf);
mlan_status wlan_ret_cw_mode_ctrl(pmlan_private pmpriv,
				  HostCmd_DS_COMMAND *resp,
				  mlan_ioctl_req *pioctl_buf);

mlan_status wlan_cmd_802_11_radio_control(pmlan_private pmpriv,
					  HostCmd_DS_COMMAND *cmd,
					  t_u16 cmd_action, t_void *pdata_buf);
mlan_status wlan_ret_802_11_radio_control(pmlan_private pmpriv,
					  HostCmd_DS_COMMAND *resp,
					  mlan_ioctl_req *pioctl_buf);

mlan_status wlan_cmd_802_11_rf_antenna(pmlan_private pmpriv,
				       HostCmd_DS_COMMAND *cmd,
				       t_u16 cmd_action, t_void *pdata_buf);
mlan_status wlan_ret_802_11_rf_antenna(pmlan_private pmpriv,
				       HostCmd_DS_COMMAND *resp,
				       mlan_ioctl_req *pioctl_buf);

mlan_status wlan_ret_reg_access(mlan_adapter *pmadapter, t_u16 type,
				HostCmd_DS_COMMAND *resp,
				mlan_ioctl_req *pioctl_buf);
mlan_status wlan_ret_mem_access(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
				mlan_ioctl_req *pioctl_buf);

mlan_status wlan_reg_mem_ioctl_reg_rw(pmlan_adapter pmadapter,
				      pmlan_ioctl_req pioctl_req);
mlan_status wlan_reg_mem_ioctl_read_eeprom(pmlan_adapter pmadapter,
					   pmlan_ioctl_req pioctl_req);
mlan_status wlan_reg_mem_ioctl_mem_rw(pmlan_adapter pmadapter,
				      pmlan_ioctl_req pioctl_req);
mlan_status wlan_cmd_reg_access(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
				t_u16 cmd_action, t_void *pdata_buf);
mlan_status wlan_cmd_mem_access(HostCmd_DS_COMMAND *cmd, t_u16 cmd_action,
				t_void *pdata_buf);
mlan_status wlan_cmd_802_11_mac_address(pmlan_private pmpriv,
					HostCmd_DS_COMMAND *cmd,
					t_u16 cmd_action);
mlan_status wlan_ret_802_11_mac_address(pmlan_private pmpriv,
					HostCmd_DS_COMMAND *resp,
					mlan_ioctl_req *pioctl_buf);

int wlan_get_tdls_list(mlan_private *priv, tdls_peer_info *buf);
t_void wlan_hold_tdls_packets(pmlan_private priv, t_u8 *mac);
t_void wlan_restore_tdls_packets(pmlan_private priv, t_u8 *mac,
				 tdlsStatus_e status);
t_void wlan_update_non_tdls_ralist(mlan_private *priv, t_u8 *mac,
				   t_u8 tx_pause);
mlan_status wlan_misc_ioctl_tdls_config(pmlan_adapter pmadapter,
					pmlan_ioctl_req pioctl_req);
void wlan_11n_send_delba_to_peer(mlan_private *priv, t_u8 *ra);
void wlan_process_tdls_action_frame(pmlan_private priv, t_u8 *pbuf, t_u32 len);
mlan_status wlan_misc_ioctl_tdls_oper(pmlan_adapter pmadapter,
				      pmlan_ioctl_req pioctl_req);

mlan_status wlan_misc_ioctl_tdls_get_ies(pmlan_adapter pmadapter,
					 pmlan_ioctl_req pioctl_req);
mlan_status wlan_misc_ioctl_tdls_idle_time(pmlan_adapter pmadapter,
					   pmlan_ioctl_req pioctl_req);

t_void wlan_tdls_config(pmlan_private pmpriv, t_u8 enable);
mlan_status wlan_misc_ioctl_tdls_cs_channel(pmlan_adapter pmadapter,
					    pmlan_ioctl_req pioctl_req);

mlan_status wlan_config_rtt(pmlan_adapter pmadapter,
			    pmlan_ioctl_req pioctl_req);
mlan_status wlan_cancel_rtt(pmlan_adapter pmadapter,
			    pmlan_ioctl_req pioctl_req);
mlan_status wlan_rtt_responder_cfg(pmlan_adapter pmadapter,
				   pmlan_ioctl_req pioctl_req);
mlan_status wlan_cmd_802_11_ftm_config_session_params(pmlan_private pmpriv,
						      HostCmd_DS_COMMAND *cmd,
						      t_u16 cmd_action,
						      t_u32 cmd_oid,
						      t_void *pdata_buf);
mlan_status
wlan_ret_802_11_ftm_config_session_params(pmlan_private pmpriv,
					  HostCmd_DS_COMMAND *resp,
					  mlan_ioctl_req *pioctl_buf);
mlan_status wlan_fill_hal_rtt_results(pmlan_private pmpriv,
				      Event_WLS_FTM_t *event_ftm,
				      t_u32 event_ftm_len, mlan_event *pevent);
mlan_status wlan_cmd_802_11_ftm_config_responder(pmlan_private pmpriv,
						 HostCmd_DS_COMMAND *cmd,
						 t_u16 cmd_action,
						 t_u32 cmd_oid,
						 t_void *pdata_buf);
mlan_status wlan_ret_802_11_ftm_config_responder(pmlan_private pmpriv,
						 HostCmd_DS_COMMAND *resp,
						 mlan_ioctl_req *pioctl_buf);

mlan_status wlan_get_info_ver_ext(pmlan_adapter pmadapter,
				  pmlan_ioctl_req pioctl_req);

mlan_status wlan_ioctl_link_statistic(mlan_private *pmpriv,
				      pmlan_ioctl_req pioctl_req);

mlan_status wlan_cmd_802_11_link_statistic(pmlan_private pmpriv,
					   HostCmd_DS_COMMAND *cmd,
					   t_u16 cmd_action,
					   mlan_ioctl_req *pioctl_buf);

mlan_status wlan_ret_get_link_statistic(pmlan_private pmpriv,
					HostCmd_DS_COMMAND *resp,
					mlan_ioctl_req *pioctl_buf);

mlan_status wlan_reg_rx_mgmt_ind(pmlan_adapter pmadapter,
				 pmlan_ioctl_req pioctl_req);

#ifdef DEBUG_LEVEL1
mlan_status wlan_set_drvdbg(pmlan_adapter pmadapter,
			    pmlan_ioctl_req pioctl_req);
#endif

mlan_status wlan_misc_hotspot_cfg(pmlan_adapter pmadapter,
				  pmlan_ioctl_req pioctl_req);

mlan_status wlan_misc_ext_capa_cfg(pmlan_adapter pmadapter,
				   pmlan_ioctl_req pioctl_req);

t_u32 wlan_is_ext_capa_support(mlan_private *pmpriv);

#ifdef STA_SUPPORT
void wlan_add_ext_capa_info_ie(mlan_private *pmpriv, BSSDescriptor_t *pbss_desc,
			       t_u8 **pptlv_out);
#endif

mlan_status wlan_cmd_boot_sleep(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
				t_u16 cmd_action, t_void *pdata_buf);

mlan_status wlan_ret_boot_sleep(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
				mlan_ioctl_req *pioctl_buf);

#if defined(DRV_EMBEDDED_AUTHENTICATOR) || defined(DRV_EMBEDDED_SUPPLICANT)
mlan_status wlan_cmd_crypto(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
			    t_u16 cmd_action, t_u16 *pdata_buf);

mlan_status wlan_ret_crypto(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
			    mlan_ioctl_req *pioctl_buf);
#endif

#define BW_20MHZ 0
#define BW_40MHZ 1
#define BW_80MHZ 2
#define BW_160MHZ 3
int wlan_add_supported_oper_class_ie(mlan_private *pmpriv, t_u8 **pptlv_out,
				     t_u8 curr_oper_class);
mlan_status wlan_get_curr_oper_class(mlan_private *pmpriv, t_u8 channel,
				     t_u8 bw, t_u8 *oper_class);
mlan_status wlan_check_operclass_validation(mlan_private *pmpriv, t_u8 channel,
					    t_u8 oper_class, t_u8 bandwidth);
mlan_status wlan_misc_ioctl_operclass_validation(pmlan_adapter pmadapter,
						 mlan_ioctl_req *pioctl_req);
mlan_status wlan_misc_ioctl_oper_class(pmlan_adapter pmadapter,
				       mlan_ioctl_req *pioctl_req);

t_u16 wlan_adjust_data_rate(mlan_private *priv, t_u8 rx_rate, t_u8 rate_info);
t_u8 wlan_adjust_antenna(pmlan_private priv, RxPD *prx_pd);

mlan_status wlan_misc_otp_user_data(pmlan_adapter pmadapter,
				    pmlan_ioctl_req pioctl_req);

#ifdef USB
extern mlan_adapter_operations mlan_usb_ops;

mlan_status wlan_misc_ioctl_usb_aggr_ctrl(pmlan_adapter pmadapter,
					  pmlan_ioctl_req pioctl_req);
#endif

mlan_status wlan_misc_ioctl_aggr_ctrl(pmlan_adapter pmadapter,
				      pmlan_ioctl_req pioctl_req);
mlan_status wlan_cmd_packet_aggr_ctrl(pmlan_private pmpriv,
				      HostCmd_DS_COMMAND *cmd, t_u16 cmd_action,
				      t_void *pdata_buf);
mlan_status wlan_ret_packet_aggr_ctrl(pmlan_private pmpriv,
				      HostCmd_DS_COMMAND *resp,
				      mlan_ioctl_req *pioctl_buf);
mlan_status wlan_misc_ioctl_txcontrol(pmlan_adapter pmadapter,
				      pmlan_ioctl_req pioctl_req);

mlan_status wlan_misc_ioctl_region(pmlan_adapter pmadapter,
				   pmlan_ioctl_req pioctl_req);

mlan_status wlan_misc_ioctl_multi_chan_config(pmlan_adapter pmadapter,
					      pmlan_ioctl_req pioctl_req);

mlan_status wlan_cmd_multi_chan_cfg(pmlan_private pmpriv,
				    HostCmd_DS_COMMAND *cmd, t_u16 cmd_action,
				    t_void *pdata_buf);

mlan_status wlan_ret_multi_chan_cfg(pmlan_private pmpriv,
				    const HostCmd_DS_COMMAND *resp,
				    mlan_ioctl_req *pioctl_buf);

mlan_status wlan_misc_ioctl_multi_chan_policy(pmlan_adapter pmadapter,
					      pmlan_ioctl_req pioctl_req);

mlan_status wlan_cmd_multi_chan_policy(pmlan_private pmpriv,
				       HostCmd_DS_COMMAND *cmd,
				       t_u16 cmd_action, t_void *pdata_buf);

mlan_status wlan_ret_multi_chan_policy(pmlan_private pmpriv,
				       const HostCmd_DS_COMMAND *resp,
				       mlan_ioctl_req *pioctl_buf);

mlan_status wlan_misc_ioctl_drcs_config(pmlan_adapter pmadapter,
					pmlan_ioctl_req pioctl_req);

mlan_status wlan_cmd_drcs_cfg(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
			      t_u16 cmd_action, t_void *pdata_buf);

mlan_status wlan_ret_drcs_cfg(pmlan_private pmpriv,
			      const HostCmd_DS_COMMAND *resp,
			      mlan_ioctl_req *pioctl_buf);

void wlan_bt_coex_wlan_param_update_event(pmlan_private priv,
					  pmlan_buffer pevent);

mlan_status wlan_misc_ioctl_dfs_repeater_cfg(pmlan_adapter pmadapter,
					     pmlan_ioctl_req pioctl_req);

t_bool wlan_check_interface_active(mlan_adapter *pmadapter);

mlan_status wlan_misc_ioctl_coalesce_cfg(pmlan_adapter pmadapter,
					 pmlan_ioctl_req pioctl_req);

mlan_status wlan_misc_ioctl_low_pwr_mode(pmlan_adapter pmadapter,
					 pmlan_ioctl_req pioctl_req);

mlan_status wlan_misc_ioctl_pmic_configure(pmlan_adapter pmadapter,
					   pmlan_ioctl_req pioctl_req);

mlan_status wlan_misc_ioctl_cwmode_ctrl(pmlan_adapter pmadapter,
					pmlan_ioctl_req pioctl_req);

mlan_status wlan_set_mef_entry(mlan_private *pmpriv, pmlan_adapter pmadapter,
			       mef_cfg_data *pmef);
mlan_status wlan_process_mef_cfg_cmd(mlan_private *pmpriv,
				     pmlan_adapter pmadapter);
mlan_status wlan_misc_ioctl_mef_flt_cfg(pmlan_adapter pmadapter,
					pmlan_ioctl_req pioctl_req);

mlan_status wlan_misc_ioctl_ind_rst_cfg(pmlan_adapter pmadapter,
					pmlan_ioctl_req pioctl_req);
mlan_status wlan_cmd_ind_rst_cfg(HostCmd_DS_COMMAND *cmd, t_u16 cmd_action,
				 t_void *pdata_buf);
mlan_status wlan_ret_ind_rst_cfg(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
				 mlan_ioctl_req *pioctl_buf);

mlan_status wlan_cmd_802_11_supplicant_pmk(pmlan_private pmpriv,
					   HostCmd_DS_COMMAND *cmd,
					   t_u16 cmd_action, t_void *pdata_buf);

mlan_status wlan_ret_802_11_supplicant_pmk(pmlan_private pmpriv,
					   HostCmd_DS_COMMAND *resp,
					   mlan_ioctl_req *pioctl_buf);

mlan_status wlan_sec_ioctl_passphrase(pmlan_adapter pmadapter,
				      pmlan_ioctl_req pioctl_req);

mlan_status wlan_cmd_mc_aggr_cfg(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
				 t_u16 cmd_action, t_void *pdata_buf);
mlan_status wlan_ret_mc_aggr_cfg(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
				 mlan_ioctl_req *pioctl_buf);
mlan_status wlan_misc_ioctl_mc_aggr_cfg(pmlan_adapter pmadapter,
					mlan_ioctl_req *pioctl_req);
mlan_status wlan_misc_ioctl_ch_load(pmlan_adapter pmadapter,
				    mlan_ioctl_req *pioctl_req);
mlan_status wlan_misc_ioctl_ch_load_results(pmlan_adapter pmadapter,
					    mlan_ioctl_req *pioctl_req);
mlan_status wlan_cmd_get_ch_load(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
				 t_u16 cmd_action, t_void *pdata_buf);
mlan_status wlan_ret_ch_load(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
			     mlan_ioctl_req *pioctl_buf);

mlan_status wlan_misc_ioctl_get_tsf(pmlan_adapter pmadapter,
				    pmlan_ioctl_req pioctl_req);
void wlan_add_fw_cfp_tables(pmlan_private pmpriv, t_u8 *buf, t_u16 buf_left);

void wlan_free_fw_cfp_tables(mlan_adapter *pmadapter);

mlan_status wlan_misc_chan_reg_cfg(pmlan_adapter pmadapter,
				   pmlan_ioctl_req pioctl_req);

mlan_status wlan_get_cfp_table(pmlan_adapter pmadapter,
			       pmlan_ioctl_req pioctl_req);
mlan_status wlan_get_cfpinfo(pmlan_adapter pmadapter,
			     pmlan_ioctl_req pioctl_req);

mlan_status wlan_cmd_get_tsf(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
			     t_u16 cmd_action);
mlan_status wlan_ret_get_tsf(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
			     mlan_ioctl_req *pioctl_buf);

t_u8 wlan_ft_akm_is_used(mlan_private *pmpriv, t_u8 *rsn_ie);

mlan_status wlan_clear_fw_roaming_pmk(pmlan_private pmpriv);

mlan_status wlan_get_rgchnpwr_cfg(pmlan_adapter pmadapter,
				  mlan_ioctl_req *pioctl_req);
mlan_status wlan_get_chan_trpc_cfg(pmlan_adapter pmadapter,
				   mlan_ioctl_req *pioctl_req);
mlan_status wlan_cmd_get_chan_trpc_config(pmlan_private pmpriv,
					  HostCmd_DS_COMMAND *cmd,
					  t_u16 cmd_action, t_void *pdata_buf);
mlan_status wlan_ret_get_chan_trpc_config(pmlan_private pmpriv,
					  HostCmd_DS_COMMAND *resp,
					  mlan_ioctl_req *pioctl_buf);

mlan_status wlan_cmd_ps_inactivity_timeout(pmlan_private pmpriv,
					   HostCmd_DS_COMMAND *cmd,
					   t_u16 cmd_action, t_void *pdata_buf);

t_u8 wlan_ieee_rateid_to_mrvl_rateid(mlan_private *priv, t_u16 IeeeMacRate,
				     t_u8 *dst_mac);
t_u8 wlan_mrvl_rateid_to_ieee_rateid(t_u8 rate);

t_u8 wlan_get_center_freq_idx(mlan_private *pmpriv, t_u16 band, t_u32 pri_chan,
			      t_u8 chan_bw);

mlan_status wlan_ret_chan_region_cfg(pmlan_private pmpriv,
				     HostCmd_DS_COMMAND *resp,
				     mlan_ioctl_req *pioctl_buf);

mlan_status wlan_misc_ioctl_fw_dump_event(pmlan_adapter pmadapter,
					  mlan_ioctl_req *pioctl_req);
mlan_status wlan_cmd_fw_dump_event(pmlan_private pmpriv,
				   HostCmd_DS_COMMAND *cmd, t_u16 cmd_action,
				   t_void *pdata_buf);

mlan_status wlan_misc_bootsleep(pmlan_adapter pmadapter,
				pmlan_ioctl_req pioctl_req);

mlan_status wlan_misc_ioctl_dyn_bw(pmlan_adapter pmadapter,
				   mlan_ioctl_req *pioctl_req);
mlan_status wlan_cmd_config_dyn_bw(pmlan_private pmpriv,
				   HostCmd_DS_COMMAND *cmd, t_u16 cmd_action,
				   t_void *pdata_buf);
mlan_status wlan_ret_dyn_bw(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
			    mlan_ioctl_req *pioctl_buf);

#ifdef UAP_SUPPORT
/** wacp mode misc ioctl */
mlan_status wlan_misc_ioctl_wacp_mode(pmlan_adapter pmadapter,
				      mlan_ioctl_req *pioctl_req);
#endif

mlan_status wlan_power_ioctl_set_get_lpm(pmlan_adapter pmadapter,
					 pmlan_ioctl_req pioctl_req);
mlan_status wlan_cmd_set_get_low_power_mode_cfg(pmlan_private pmpriv,
						HostCmd_DS_COMMAND *cmd,
						t_u16 cmd_action,
						t_void *pdata_buf);
mlan_status wlan_ret_set_get_low_power_mode_cfg(pmlan_private pmpriv,
						HostCmd_DS_COMMAND *resp,
						mlan_ioctl_req *pioctl_buf);

mlan_status wlan_cmd_range_ext(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
			       t_u16 cmd_action, t_void *pdata_buf);
mlan_status wlan_ret_range_ext(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
			       mlan_ioctl_req *pioctl_buf);

mlan_status wlan_misc_ioctl_get_sensor_temp(pmlan_adapter pmadapter,
					    pmlan_ioctl_req pioctl_req);
mlan_status wlan_cmd_get_sensor_temp(pmlan_private pmpriv,
				     HostCmd_DS_COMMAND *cmd, t_u16 cmd_action);
mlan_status wlan_ret_get_sensor_temp(pmlan_private pmpriv,
				     HostCmd_DS_COMMAND *resp,
				     mlan_ioctl_req *pioctl_buf);

/** Set/Get Country code */
mlan_status wlan_misc_ioctl_country_code(pmlan_adapter pmadapter,
					 mlan_ioctl_req *pioctl_req);

/**
 *  @brief RA based queueing
 *
 *  @param priv             A pointer to mlan_private structure
 *
 *  @return                 MTRUE or MFALSE
 */
static INLINE t_u8 queuing_ra_based(pmlan_private priv)
{
	/*
	 * Currently we assume if we are in Infra, then DA=RA. This might not be
	 * true in the future
	 */
	if ((priv->bss_mode == MLAN_BSS_MODE_INFRA) &&
	    (GET_BSS_ROLE(priv) == MLAN_BSS_ROLE_STA))
		return MFALSE;

	return MTRUE;
}

/**
 *  @brief Copy Rates
 *
 *  @param dest             A pointer to Dest Buf
 *  @param pos		        The position for copy
 *  @param src		        A pointer to Src Buf
 *  @param len              The len of Src Buf
 *
 *  @return                 Number of Rates copied
 */
static INLINE t_u32 wlan_copy_rates(t_u8 *dest, t_u32 pos, t_u8 *src, int len)
{
	int i;

	for (i = 0; i < len && src[i]; i++, pos++) {
		if (pos >= sizeof(WLAN_802_11_RATES))
			break;
		dest[pos] = src[i];
	}

	return pos;
}

/**
 *  @brief strlen
 *
 *  @param str		        A pointer to string
 *
 *  @return                 Length of string
 */
static INLINE t_u32 wlan_strlen(const char *str)
{
	t_u32 i;

	for (i = 0; str[i] != 0; i++)
		;

	return i;
}

/**
 *  @brief iscdigit
 *
 *  @param chr                  A char
 *
 *  @return                     Non zero if chr is a hex, else 0
 */
static INLINE t_u32 wlan_isxdigit(t_u8 chr)
{
	return (chr <= 'f' && chr >= 'a') || (chr <= 'F' && chr >= 'A') ||
	       (chr <= '9' && chr >= '0');
}

/**
 *  @brief isspace
 *
 *  @param                       A chr
 *
 *  @return                      Non zero if chr is space etc, else 0
 */
static INLINE t_u32 wlan_isspace(t_u8 chr)
{
	return chr <= ' ' && (chr == ' ' || (chr <= 13 && chr >= 9));
}

static INLINE const char *wlan_str_skip_prefix(const char *str,
					       const char *prefix)
{
	const char *substr = str;

	while (*substr && *substr == *prefix) {
		substr++;
		prefix++;
	}

	if (*substr && !*prefix) {
		str = substr;
	}

	return str;
}

/** delay unit */
typedef enum _delay_unit {
	USEC,
	MSEC,
	SEC,
} t_delay_unit;

/** delay function */
t_void wlan_delay_func(mlan_adapter *pmadapter, t_u32 delay, t_delay_unit u);

/** delay function wrapper */
#define wlan_delay(p, n) wlan_delay_func(p, n, SEC)
/** delay function wrapper */
#define wlan_mdelay(p, n) wlan_delay_func(p, n, MSEC)
/** delay function wrapper */
#define wlan_udelay(p, n) wlan_delay_func(p, n, USEC)

/**
 *  @brief This function check if there are pending cmd
 *         in cmd pending Q
 *
 *  @param pmadapter  A pointer to mlan_adapter structure
 *
 *  @return  MTRUE -- cmd pending
 *           MFALSE -- no pending cmd
 */
static INLINE int wlan_is_cmd_pending(mlan_adapter *pmadapter)
{
	int ret;
	cmd_ctrl_node *pcmd_node = MNULL;
	wlan_request_cmd_lock(pmadapter);
	pcmd_node = (cmd_ctrl_node *)util_peek_list(pmadapter->pmoal_handle,
						    &pmadapter->cmd_pending_q,
						    MNULL, MNULL);
	if (pcmd_node)
		ret = MTRUE;
	else
		ret = MFALSE;
	wlan_release_cmd_lock(pmadapter);
	return ret;
}

/** Get BSS number from priv */
#define GET_BSS_NUM(priv) ((priv)->bss_num)

/**
 *  @brief This function returns priv based on the BSS num and BSS type
 *
 *  @param pmadapter A pointer to mlan_adapter
 *  @param bss_num   BSS number
 *  @param bss_type  BSS type
 *
 *  @return          Pointer to mlan_private
 */
static INLINE mlan_private *wlan_get_priv_by_id(mlan_adapter *pmadapter,
						t_u32 bss_num, t_u32 bss_type)
{
	int i;

	for (i = 0; i < MIN(pmadapter->priv_num, MLAN_MAX_BSS_NUM); i++) {
		if (pmadapter->priv[i]) {
			if ((pmadapter->priv[i]->bss_num == bss_num) &&
			    (pmadapter->priv[i]->bss_type == bss_type))
				return pmadapter->priv[i];
		}
	}
	return MNULL;
}

/**
 *  @brief This function returns first available priv
 *  based on the BSS role
 *
 *  @param pmadapter A pointer to mlan_adapter
 *  @param bss_role  BSS role or MLAN_BSS_ROLE_ANY
 *
 *  @return          Pointer to mlan_private
 */
static INLINE mlan_private *wlan_get_priv(mlan_adapter *pmadapter,
					  mlan_bss_role bss_role)
{
	int i;

	for (i = 0; i < MIN(pmadapter->priv_num, MLAN_MAX_BSS_NUM); i++) {
		if (pmadapter->priv[i]) {
			if (bss_role == MLAN_BSS_ROLE_ANY ||
			    GET_BSS_ROLE(pmadapter->priv[i]) == bss_role)
				return pmadapter->priv[i];
		}
	}
	return MNULL;
}

/**
 *  @brief This function counts the number of occurences for a certain
 *  condition among privs.  Which privs are checked can be configured
 *  via a second condition.
 *
 *  @param pmadapter  A pointer to mlan_adapter
 *  @param count_cond Function pointer to condition to count on privs
 *  @param check_cond Function pointer to condition to decide whether priv
 *                    should be counted or not.  Use MNULL to check all privs.
 *
 *  @return          Count of privs where count_cond returned MTRUE.
 */
static INLINE int
wlan_count_priv_cond(mlan_adapter *pmadapter,
		     t_bool (*count_cond)(pmlan_private pmpriv),
		     t_bool (*check_cond)(pmlan_private pmpriv))
{
	pmlan_private pmpriv;
	int count = 0;
	int i;

	if (pmadapter == MNULL || count_cond == MNULL)
		return 0;

	for (i = 0; i < pmadapter->priv_num; i++) {
		pmpriv = pmadapter->priv[i];
		if (pmpriv) {
			if ((check_cond == MNULL) ||
			    (check_cond && check_cond(pmpriv))) {
				if (count_cond(pmpriv))
					count++;
			}
		}
	}

	return count;
}

/**
 *  @brief This function runs a procedure on each priv.
 *  Which privs it is run on can be configured via a condition.
 *
 *  @param pmadapter  A pointer to mlan_adapter
 *  @param operation  Function pointer to produedure to operate on priv
 *  @param check_cond Function pointer to condition to decide whether priv
 *                    operated on or not.  Use MNULL to run on all privs.
 *
 *  @return           Number of privs that operation was run on.
 */
static INLINE int
wlan_do_task_on_privs(mlan_adapter *pmadapter,
		      t_void (*operation)(pmlan_private pmpriv),
		      t_bool (*check_cond)(pmlan_private pmpriv))
{
	pmlan_private pmpriv;
	int count = 0;
	int i;

	if (pmadapter == MNULL || operation == MNULL)
		return 0;

	for (i = 0; i < pmadapter->priv_num; i++) {
		pmpriv = pmadapter->priv[i];
		if (pmpriv) {
			if ((check_cond == MNULL) ||
			    (check_cond && check_cond(pmpriv))) {
				operation(pmpriv);
				count++;
			}
		}
	}

	return count;
}

/**
 *  @brief This function builds a list of privs that test for a condition
 *  This is useful if you need to do a number of operations on the same set
 *  of privs.  For one-off tasks, the above two functions might be better.
 *
 *  @param pmadapter  A pointer to mlan_adapter
 *  @param check_cond Function pointer to condition to decide whether priv
 *                    should be placed in the list.
 *  @param ppriv_list Output param.  Externally supplied array of mlan_private*
 *                    to hold priv's that test positive with check_cond.
 *                    Array size should be at least pmadapter->priv_num.
 *
 *  @return          Number of privs in ppriv_list
 *
 *  @sa              wlan_count_priv_cond
 */
static INLINE int
wlan_get_privs_by_cond(mlan_adapter *pmadapter,
		       t_bool (*check_cond)(pmlan_private pmpriv),
		       mlan_private **ppriv_list)
{
	pmlan_private pmpriv;
	int count = 0;
	int i;

	if (pmadapter == MNULL || check_cond == MNULL || ppriv_list == MNULL)
		return 0;

	for (i = 0; i < pmadapter->priv_num; i++) {
		pmpriv = pmadapter->priv[i];
		if (pmpriv) {
			if (check_cond(pmpriv))
				ppriv_list[count++] = pmpriv;
		}
	}

	return count;
}

/**
 *  @brief This function builds a list of privs that test against two conditions
 *  This is useful if you need to do a number of operations on the same set
 *  of privs.  Can choose whether both conditions (AND) or either condition (OR)
 *  is required.
 *
 *  @param pmadapter      A pointer to mlan_adapter
 *  @param check_cond     Function pointer to condition to decide whether priv
 *                        should be placed in the list.
 *  @param check_cond_2   Function pointer to second condition to check.
 *  @param and_conditions If MTRUE, both conditions must be met (AND),
 *                        else either condition can be met (OR).
 *  @param ppriv_list     Output param.  Externally supplied array of
 * mlan_private* to hold priv's that test positive with check_cond. Array size
 * should be at least pmadapter->priv_num.
 *
 *  @return          Number of privs in ppriv_list
 *
 *  @sa              wlan_count_priv_cond, wlan_get_privs_by_cond
 */
static INLINE int
wlan_get_privs_by_two_cond(mlan_adapter *pmadapter,
			   t_bool (*check_cond)(pmlan_private pmpriv),
			   t_bool (*check_cond_2)(pmlan_private pmpriv),
			   t_bool and_conditions, mlan_private **ppriv_list)
{
	pmlan_private pmpriv;
	int count = 0;
	int i;

	if (pmadapter == MNULL || check_cond == MNULL ||
	    check_cond_2 == MNULL || ppriv_list == MNULL)
		return 0;

	for (i = 0; i < pmadapter->priv_num; i++) {
		pmpriv = pmadapter->priv[i];
		if (pmpriv) {
			if (and_conditions) {
				if (check_cond(pmpriv) && check_cond_2(pmpriv))
					ppriv_list[count++] = pmpriv;
			} else {
				if (check_cond(pmpriv) || check_cond_2(pmpriv))
					ppriv_list[count++] = pmpriv;
			}
		}
	}

	return count;
}
#endif /* !_MLAN_MAIN_H_ */
