162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * NXP Wireless LAN device driver: generic data structures and APIs
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright 2011-2020 NXP
662306a36Sopenharmony_ci */
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#ifndef _MWIFIEX_DECL_H_
962306a36Sopenharmony_ci#define _MWIFIEX_DECL_H_
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci#undef pr_fmt
1262306a36Sopenharmony_ci#define pr_fmt(fmt)	KBUILD_MODNAME ": " fmt
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci#include <linux/wait.h>
1562306a36Sopenharmony_ci#include <linux/timer.h>
1662306a36Sopenharmony_ci#include <linux/ieee80211.h>
1762306a36Sopenharmony_ci#include <uapi/linux/if_arp.h>
1862306a36Sopenharmony_ci#include <net/cfg80211.h>
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci#define MWIFIEX_BSS_COEX_COUNT	     2
2162306a36Sopenharmony_ci#define MWIFIEX_MAX_BSS_NUM         (3)
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ci#define MWIFIEX_DMA_ALIGN_SZ	    64
2462306a36Sopenharmony_ci#define MWIFIEX_RX_HEADROOM	    64
2562306a36Sopenharmony_ci#define MAX_TXPD_SZ		    32
2662306a36Sopenharmony_ci#define INTF_HDR_ALIGN		     4
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_ci#define MWIFIEX_MIN_DATA_HEADER_LEN (MWIFIEX_DMA_ALIGN_SZ + INTF_HDR_ALIGN + \
2962306a36Sopenharmony_ci				     MAX_TXPD_SZ)
3062306a36Sopenharmony_ci#define MWIFIEX_MGMT_FRAME_HEADER_SIZE	8	/* sizeof(pkt_type)
3162306a36Sopenharmony_ci						 *   + sizeof(tx_control)
3262306a36Sopenharmony_ci						 */
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci#define MWIFIEX_MAX_TX_BASTREAM_SUPPORTED	2
3562306a36Sopenharmony_ci#define MWIFIEX_MAX_RX_BASTREAM_SUPPORTED	16
3662306a36Sopenharmony_ci#define MWIFIEX_MAX_TDLS_PEER_SUPPORTED 8
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ci#define MWIFIEX_STA_AMPDU_DEF_TXWINSIZE        64
3962306a36Sopenharmony_ci#define MWIFIEX_STA_AMPDU_DEF_RXWINSIZE        64
4062306a36Sopenharmony_ci#define MWIFIEX_STA_COEX_AMPDU_DEF_RXWINSIZE   16
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ci#define MWIFIEX_UAP_AMPDU_DEF_TXWINSIZE        32
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_ci#define MWIFIEX_UAP_COEX_AMPDU_DEF_RXWINSIZE   16
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ci#define MWIFIEX_UAP_AMPDU_DEF_RXWINSIZE        16
4762306a36Sopenharmony_ci#define MWIFIEX_11AC_STA_AMPDU_DEF_TXWINSIZE   64
4862306a36Sopenharmony_ci#define MWIFIEX_11AC_STA_AMPDU_DEF_RXWINSIZE   64
4962306a36Sopenharmony_ci#define MWIFIEX_11AC_UAP_AMPDU_DEF_TXWINSIZE   64
5062306a36Sopenharmony_ci#define MWIFIEX_11AC_UAP_AMPDU_DEF_RXWINSIZE   64
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_ci#define MWIFIEX_DEFAULT_BLOCK_ACK_TIMEOUT  0xffff
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_ci#define MWIFIEX_RATE_BITMAP_MCS0   32
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_ci#define MWIFIEX_RX_DATA_BUF_SIZE     (4 * 1024)
5762306a36Sopenharmony_ci#define MWIFIEX_RX_CMD_BUF_SIZE	     (2 * 1024)
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ci#define MAX_BEACON_PERIOD                  (4000)
6062306a36Sopenharmony_ci#define MIN_BEACON_PERIOD                  (50)
6162306a36Sopenharmony_ci#define MAX_DTIM_PERIOD                    (100)
6262306a36Sopenharmony_ci#define MIN_DTIM_PERIOD                    (1)
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_ci#define MWIFIEX_RTS_MIN_VALUE              (0)
6562306a36Sopenharmony_ci#define MWIFIEX_RTS_MAX_VALUE              (2347)
6662306a36Sopenharmony_ci#define MWIFIEX_FRAG_MIN_VALUE             (256)
6762306a36Sopenharmony_ci#define MWIFIEX_FRAG_MAX_VALUE             (2346)
6862306a36Sopenharmony_ci#define MWIFIEX_WMM_VERSION                0x01
6962306a36Sopenharmony_ci#define MWIFIEX_WMM_SUBTYPE                0x01
7062306a36Sopenharmony_ci
7162306a36Sopenharmony_ci#define MWIFIEX_RETRY_LIMIT                14
7262306a36Sopenharmony_ci#define MWIFIEX_SDIO_BLOCK_SIZE            256
7362306a36Sopenharmony_ci
7462306a36Sopenharmony_ci#define MWIFIEX_BUF_FLAG_REQUEUED_PKT      BIT(0)
7562306a36Sopenharmony_ci#define MWIFIEX_BUF_FLAG_BRIDGED_PKT	   BIT(1)
7662306a36Sopenharmony_ci#define MWIFIEX_BUF_FLAG_TDLS_PKT	   BIT(2)
7762306a36Sopenharmony_ci#define MWIFIEX_BUF_FLAG_EAPOL_TX_STATUS   BIT(3)
7862306a36Sopenharmony_ci#define MWIFIEX_BUF_FLAG_ACTION_TX_STATUS  BIT(4)
7962306a36Sopenharmony_ci#define MWIFIEX_BUF_FLAG_AGGR_PKT          BIT(5)
8062306a36Sopenharmony_ci
8162306a36Sopenharmony_ci#define MWIFIEX_BRIDGED_PKTS_THR_HIGH      1024
8262306a36Sopenharmony_ci#define MWIFIEX_BRIDGED_PKTS_THR_LOW        128
8362306a36Sopenharmony_ci
8462306a36Sopenharmony_ci#define MWIFIEX_TDLS_DISABLE_LINK             0x00
8562306a36Sopenharmony_ci#define MWIFIEX_TDLS_ENABLE_LINK              0x01
8662306a36Sopenharmony_ci#define MWIFIEX_TDLS_CREATE_LINK              0x02
8762306a36Sopenharmony_ci#define MWIFIEX_TDLS_CONFIG_LINK              0x03
8862306a36Sopenharmony_ci
8962306a36Sopenharmony_ci#define MWIFIEX_TDLS_RSSI_HIGH		50
9062306a36Sopenharmony_ci#define MWIFIEX_TDLS_RSSI_LOW		55
9162306a36Sopenharmony_ci#define MWIFIEX_TDLS_MAX_FAIL_COUNT      4
9262306a36Sopenharmony_ci#define MWIFIEX_AUTO_TDLS_IDLE_TIME     10
9362306a36Sopenharmony_ci
9462306a36Sopenharmony_ci/* 54M rates, index from 0 to 11 */
9562306a36Sopenharmony_ci#define MWIFIEX_RATE_INDEX_MCS0 12
9662306a36Sopenharmony_ci/* 12-27=MCS0-15(BW20) */
9762306a36Sopenharmony_ci#define MWIFIEX_BW20_MCS_NUM 15
9862306a36Sopenharmony_ci
9962306a36Sopenharmony_ci/* Rate index for OFDM 0 */
10062306a36Sopenharmony_ci#define MWIFIEX_RATE_INDEX_OFDM0   4
10162306a36Sopenharmony_ci
10262306a36Sopenharmony_ci#define MWIFIEX_MAX_STA_NUM		3
10362306a36Sopenharmony_ci#define MWIFIEX_MAX_UAP_NUM		3
10462306a36Sopenharmony_ci#define MWIFIEX_MAX_P2P_NUM		3
10562306a36Sopenharmony_ci
10662306a36Sopenharmony_ci#define MWIFIEX_A_BAND_START_FREQ	5000
10762306a36Sopenharmony_ci
10862306a36Sopenharmony_ci/* SDIO Aggr data packet special info */
10962306a36Sopenharmony_ci#define SDIO_MAX_AGGR_BUF_SIZE		(256 * 255)
11062306a36Sopenharmony_ci#define BLOCK_NUMBER_OFFSET		15
11162306a36Sopenharmony_ci#define SDIO_HEADER_OFFSET		28
11262306a36Sopenharmony_ci
11362306a36Sopenharmony_ci#define MWIFIEX_SIZE_4K 0x4000
11462306a36Sopenharmony_ci
11562306a36Sopenharmony_cienum mwifiex_bss_type {
11662306a36Sopenharmony_ci	MWIFIEX_BSS_TYPE_STA = 0,
11762306a36Sopenharmony_ci	MWIFIEX_BSS_TYPE_UAP = 1,
11862306a36Sopenharmony_ci	MWIFIEX_BSS_TYPE_P2P = 2,
11962306a36Sopenharmony_ci	MWIFIEX_BSS_TYPE_ANY = 0xff,
12062306a36Sopenharmony_ci};
12162306a36Sopenharmony_ci
12262306a36Sopenharmony_cienum mwifiex_bss_role {
12362306a36Sopenharmony_ci	MWIFIEX_BSS_ROLE_STA = 0,
12462306a36Sopenharmony_ci	MWIFIEX_BSS_ROLE_UAP = 1,
12562306a36Sopenharmony_ci	MWIFIEX_BSS_ROLE_ANY = 0xff,
12662306a36Sopenharmony_ci};
12762306a36Sopenharmony_ci
12862306a36Sopenharmony_cienum mwifiex_tdls_status {
12962306a36Sopenharmony_ci	TDLS_NOT_SETUP = 0,
13062306a36Sopenharmony_ci	TDLS_SETUP_INPROGRESS,
13162306a36Sopenharmony_ci	TDLS_SETUP_COMPLETE,
13262306a36Sopenharmony_ci	TDLS_SETUP_FAILURE,
13362306a36Sopenharmony_ci	TDLS_LINK_TEARDOWN,
13462306a36Sopenharmony_ci	TDLS_CHAN_SWITCHING,
13562306a36Sopenharmony_ci	TDLS_IN_BASE_CHAN,
13662306a36Sopenharmony_ci	TDLS_IN_OFF_CHAN,
13762306a36Sopenharmony_ci};
13862306a36Sopenharmony_ci
13962306a36Sopenharmony_cienum mwifiex_tdls_error_code {
14062306a36Sopenharmony_ci	TDLS_ERR_NO_ERROR = 0,
14162306a36Sopenharmony_ci	TDLS_ERR_INTERNAL_ERROR,
14262306a36Sopenharmony_ci	TDLS_ERR_MAX_LINKS_EST,
14362306a36Sopenharmony_ci	TDLS_ERR_LINK_EXISTS,
14462306a36Sopenharmony_ci	TDLS_ERR_LINK_NONEXISTENT,
14562306a36Sopenharmony_ci	TDLS_ERR_PEER_STA_UNREACHABLE = 25,
14662306a36Sopenharmony_ci};
14762306a36Sopenharmony_ci
14862306a36Sopenharmony_ci#define BSS_ROLE_BIT_MASK    BIT(0)
14962306a36Sopenharmony_ci
15062306a36Sopenharmony_ci#define GET_BSS_ROLE(priv)   ((priv)->bss_role & BSS_ROLE_BIT_MASK)
15162306a36Sopenharmony_ci
15262306a36Sopenharmony_cienum mwifiex_data_frame_type {
15362306a36Sopenharmony_ci	MWIFIEX_DATA_FRAME_TYPE_ETH_II = 0,
15462306a36Sopenharmony_ci	MWIFIEX_DATA_FRAME_TYPE_802_11,
15562306a36Sopenharmony_ci};
15662306a36Sopenharmony_ci
15762306a36Sopenharmony_cistruct mwifiex_fw_image {
15862306a36Sopenharmony_ci	u8 *helper_buf;
15962306a36Sopenharmony_ci	u32 helper_len;
16062306a36Sopenharmony_ci	u8 *fw_buf;
16162306a36Sopenharmony_ci	u32 fw_len;
16262306a36Sopenharmony_ci};
16362306a36Sopenharmony_ci
16462306a36Sopenharmony_cistruct mwifiex_802_11_ssid {
16562306a36Sopenharmony_ci	u32 ssid_len;
16662306a36Sopenharmony_ci	u8 ssid[IEEE80211_MAX_SSID_LEN];
16762306a36Sopenharmony_ci};
16862306a36Sopenharmony_ci
16962306a36Sopenharmony_cistruct mwifiex_wait_queue {
17062306a36Sopenharmony_ci	wait_queue_head_t wait;
17162306a36Sopenharmony_ci	int status;
17262306a36Sopenharmony_ci};
17362306a36Sopenharmony_ci
17462306a36Sopenharmony_cistruct mwifiex_rxinfo {
17562306a36Sopenharmony_ci	struct sk_buff *parent;
17662306a36Sopenharmony_ci	u8 bss_num;
17762306a36Sopenharmony_ci	u8 bss_type;
17862306a36Sopenharmony_ci	u8 use_count;
17962306a36Sopenharmony_ci	u8 buf_type;
18062306a36Sopenharmony_ci};
18162306a36Sopenharmony_ci
18262306a36Sopenharmony_cistruct mwifiex_txinfo {
18362306a36Sopenharmony_ci	u8 flags;
18462306a36Sopenharmony_ci	u8 bss_num;
18562306a36Sopenharmony_ci	u8 bss_type;
18662306a36Sopenharmony_ci	u8 aggr_num;
18762306a36Sopenharmony_ci	u32 pkt_len;
18862306a36Sopenharmony_ci	u8 ack_frame_id;
18962306a36Sopenharmony_ci	u64 cookie;
19062306a36Sopenharmony_ci};
19162306a36Sopenharmony_ci
19262306a36Sopenharmony_cienum mwifiex_wmm_ac_e {
19362306a36Sopenharmony_ci	WMM_AC_BK,
19462306a36Sopenharmony_ci	WMM_AC_BE,
19562306a36Sopenharmony_ci	WMM_AC_VI,
19662306a36Sopenharmony_ci	WMM_AC_VO
19762306a36Sopenharmony_ci} __packed;
19862306a36Sopenharmony_ci
19962306a36Sopenharmony_cistruct ieee_types_wmm_ac_parameters {
20062306a36Sopenharmony_ci	u8 aci_aifsn_bitmap;
20162306a36Sopenharmony_ci	u8 ecw_bitmap;
20262306a36Sopenharmony_ci	__le16 tx_op_limit;
20362306a36Sopenharmony_ci} __packed;
20462306a36Sopenharmony_ci
20562306a36Sopenharmony_cistruct mwifiex_types_wmm_info {
20662306a36Sopenharmony_ci	u8 oui[4];
20762306a36Sopenharmony_ci	u8 subtype;
20862306a36Sopenharmony_ci	u8 version;
20962306a36Sopenharmony_ci	u8 qos_info;
21062306a36Sopenharmony_ci	u8 reserved;
21162306a36Sopenharmony_ci	struct ieee_types_wmm_ac_parameters ac_params[IEEE80211_NUM_ACS];
21262306a36Sopenharmony_ci} __packed;
21362306a36Sopenharmony_ci
21462306a36Sopenharmony_cistruct mwifiex_arp_eth_header {
21562306a36Sopenharmony_ci	struct arphdr hdr;
21662306a36Sopenharmony_ci	u8 ar_sha[ETH_ALEN];
21762306a36Sopenharmony_ci	u8 ar_sip[4];
21862306a36Sopenharmony_ci	u8 ar_tha[ETH_ALEN];
21962306a36Sopenharmony_ci	u8 ar_tip[4];
22062306a36Sopenharmony_ci} __packed;
22162306a36Sopenharmony_ci
22262306a36Sopenharmony_cistruct mwifiex_chan_stats {
22362306a36Sopenharmony_ci	u8 chan_num;
22462306a36Sopenharmony_ci	u8 bandcfg;
22562306a36Sopenharmony_ci	u8 flags;
22662306a36Sopenharmony_ci	s8 noise;
22762306a36Sopenharmony_ci	u16 total_bss;
22862306a36Sopenharmony_ci	u16 cca_scan_dur;
22962306a36Sopenharmony_ci	u16 cca_busy_dur;
23062306a36Sopenharmony_ci} __packed;
23162306a36Sopenharmony_ci
23262306a36Sopenharmony_ci#define MWIFIEX_HIST_MAX_SAMPLES	1048576
23362306a36Sopenharmony_ci#define MWIFIEX_MAX_RX_RATES		     44
23462306a36Sopenharmony_ci#define MWIFIEX_MAX_AC_RX_RATES		     74
23562306a36Sopenharmony_ci#define MWIFIEX_MAX_SNR			    256
23662306a36Sopenharmony_ci#define MWIFIEX_MAX_NOISE_FLR		    256
23762306a36Sopenharmony_ci#define MWIFIEX_MAX_SIG_STRENGTH	    256
23862306a36Sopenharmony_ci
23962306a36Sopenharmony_cistruct mwifiex_histogram_data {
24062306a36Sopenharmony_ci	atomic_t rx_rate[MWIFIEX_MAX_AC_RX_RATES];
24162306a36Sopenharmony_ci	atomic_t snr[MWIFIEX_MAX_SNR];
24262306a36Sopenharmony_ci	atomic_t noise_flr[MWIFIEX_MAX_NOISE_FLR];
24362306a36Sopenharmony_ci	atomic_t sig_str[MWIFIEX_MAX_SIG_STRENGTH];
24462306a36Sopenharmony_ci	atomic_t num_samples;
24562306a36Sopenharmony_ci};
24662306a36Sopenharmony_ci
24762306a36Sopenharmony_cistruct mwifiex_iface_comb {
24862306a36Sopenharmony_ci	u8 sta_intf;
24962306a36Sopenharmony_ci	u8 uap_intf;
25062306a36Sopenharmony_ci	u8 p2p_intf;
25162306a36Sopenharmony_ci};
25262306a36Sopenharmony_ci
25362306a36Sopenharmony_cistruct mwifiex_radar_params {
25462306a36Sopenharmony_ci	struct cfg80211_chan_def *chandef;
25562306a36Sopenharmony_ci	u32 cac_time_ms;
25662306a36Sopenharmony_ci} __packed;
25762306a36Sopenharmony_ci
25862306a36Sopenharmony_cistruct mwifiex_11h_intf_state {
25962306a36Sopenharmony_ci	bool is_11h_enabled;
26062306a36Sopenharmony_ci	bool is_11h_active;
26162306a36Sopenharmony_ci} __packed;
26262306a36Sopenharmony_ci
26362306a36Sopenharmony_ci#define MWIFIEX_FW_DUMP_IDX		0xff
26462306a36Sopenharmony_ci#define MWIFIEX_FW_DUMP_MAX_MEMSIZE     0x160000
26562306a36Sopenharmony_ci#define MWIFIEX_DRV_INFO_IDX		20
26662306a36Sopenharmony_ci#define FW_DUMP_MAX_NAME_LEN		8
26762306a36Sopenharmony_ci#define FW_DUMP_HOST_READY      0xEE
26862306a36Sopenharmony_ci#define FW_DUMP_DONE			0xFF
26962306a36Sopenharmony_ci#define FW_DUMP_READ_DONE		0xFE
27062306a36Sopenharmony_ci
27162306a36Sopenharmony_cistruct memory_type_mapping {
27262306a36Sopenharmony_ci	u8 mem_name[FW_DUMP_MAX_NAME_LEN];
27362306a36Sopenharmony_ci	u8 *mem_ptr;
27462306a36Sopenharmony_ci	u32 mem_size;
27562306a36Sopenharmony_ci	u8 done_flag;
27662306a36Sopenharmony_ci};
27762306a36Sopenharmony_ci
27862306a36Sopenharmony_cienum rdwr_status {
27962306a36Sopenharmony_ci	RDWR_STATUS_SUCCESS = 0,
28062306a36Sopenharmony_ci	RDWR_STATUS_FAILURE = 1,
28162306a36Sopenharmony_ci	RDWR_STATUS_DONE = 2
28262306a36Sopenharmony_ci};
28362306a36Sopenharmony_ci
28462306a36Sopenharmony_cienum mwifiex_chan_width {
28562306a36Sopenharmony_ci	CHAN_BW_20MHZ = 0,
28662306a36Sopenharmony_ci	CHAN_BW_10MHZ,
28762306a36Sopenharmony_ci	CHAN_BW_40MHZ,
28862306a36Sopenharmony_ci	CHAN_BW_80MHZ,
28962306a36Sopenharmony_ci	CHAN_BW_8080MHZ,
29062306a36Sopenharmony_ci	CHAN_BW_160MHZ,
29162306a36Sopenharmony_ci	CHAN_BW_5MHZ,
29262306a36Sopenharmony_ci};
29362306a36Sopenharmony_ci
29462306a36Sopenharmony_cienum mwifiex_chan_offset {
29562306a36Sopenharmony_ci	SEC_CHAN_NONE = 0,
29662306a36Sopenharmony_ci	SEC_CHAN_ABOVE = 1,
29762306a36Sopenharmony_ci	SEC_CHAN_5MHZ = 2,
29862306a36Sopenharmony_ci	SEC_CHAN_BELOW = 3
29962306a36Sopenharmony_ci};
30062306a36Sopenharmony_ci
30162306a36Sopenharmony_ci#endif /* !_MWIFIEX_DECL_H_ */
302