162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
262306a36Sopenharmony_ci/* Copyright(c) 2018-2019  Realtek Corporation
362306a36Sopenharmony_ci */
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci#ifndef __RTK_MAIN_H_
662306a36Sopenharmony_ci#define __RTK_MAIN_H_
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#include <net/mac80211.h>
962306a36Sopenharmony_ci#include <linux/vmalloc.h>
1062306a36Sopenharmony_ci#include <linux/firmware.h>
1162306a36Sopenharmony_ci#include <linux/average.h>
1262306a36Sopenharmony_ci#include <linux/bitops.h>
1362306a36Sopenharmony_ci#include <linux/bitfield.h>
1462306a36Sopenharmony_ci#include <linux/iopoll.h>
1562306a36Sopenharmony_ci#include <linux/interrupt.h>
1662306a36Sopenharmony_ci#include <linux/workqueue.h>
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci#include "util.h"
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci#define RTW_MAX_MAC_ID_NUM		32
2162306a36Sopenharmony_ci#define RTW_MAX_SEC_CAM_NUM		32
2262306a36Sopenharmony_ci#define MAX_PG_CAM_BACKUP_NUM		8
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ci#define RTW_SCAN_MAX_SSIDS		4
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ci#define RTW_MAX_PATTERN_NUM		12
2762306a36Sopenharmony_ci#define RTW_MAX_PATTERN_MASK_SIZE	16
2862306a36Sopenharmony_ci#define RTW_MAX_PATTERN_SIZE		128
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ci#define RTW_WATCH_DOG_DELAY_TIME	round_jiffies_relative(HZ * 2)
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ci#define RFREG_MASK			0xfffff
3362306a36Sopenharmony_ci#define INV_RF_DATA			0xffffffff
3462306a36Sopenharmony_ci#define TX_PAGE_SIZE_SHIFT		7
3562306a36Sopenharmony_ci#define TX_PAGE_SIZE			(1 << TX_PAGE_SIZE_SHIFT)
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_ci#define RTW_CHANNEL_WIDTH_MAX		3
3862306a36Sopenharmony_ci#define RTW_RF_PATH_MAX			4
3962306a36Sopenharmony_ci#define HW_FEATURE_LEN			13
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_ci#define RTW_TP_SHIFT			18 /* bytes/2s --> Mbps */
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_ciextern bool rtw_bf_support;
4462306a36Sopenharmony_ciextern bool rtw_disable_lps_deep_mode;
4562306a36Sopenharmony_ciextern unsigned int rtw_debug_mask;
4662306a36Sopenharmony_ciextern bool rtw_edcca_enabled;
4762306a36Sopenharmony_ciextern const struct ieee80211_ops rtw_ops;
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_ci#define RTW_MAX_CHANNEL_NUM_2G 14
5062306a36Sopenharmony_ci#define RTW_MAX_CHANNEL_NUM_5G 49
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_cistruct rtw_dev;
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_cienum rtw_hci_type {
5562306a36Sopenharmony_ci	RTW_HCI_TYPE_PCIE,
5662306a36Sopenharmony_ci	RTW_HCI_TYPE_USB,
5762306a36Sopenharmony_ci	RTW_HCI_TYPE_SDIO,
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ci	RTW_HCI_TYPE_UNDEFINE,
6062306a36Sopenharmony_ci};
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_cistruct rtw_hci {
6362306a36Sopenharmony_ci	struct rtw_hci_ops *ops;
6462306a36Sopenharmony_ci	enum rtw_hci_type type;
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_ci	u32 rpwm_addr;
6762306a36Sopenharmony_ci	u32 cpwm_addr;
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_ci	u8 bulkout_num;
7062306a36Sopenharmony_ci};
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_ci#define IS_CH_5G_BAND_1(channel) ((channel) >= 36 && (channel <= 48))
7362306a36Sopenharmony_ci#define IS_CH_5G_BAND_2(channel) ((channel) >= 52 && (channel <= 64))
7462306a36Sopenharmony_ci#define IS_CH_5G_BAND_3(channel) ((channel) >= 100 && (channel <= 144))
7562306a36Sopenharmony_ci#define IS_CH_5G_BAND_4(channel) ((channel) >= 149 && (channel <= 177))
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_ci#define IS_CH_5G_BAND_MID(channel) \
7862306a36Sopenharmony_ci	(IS_CH_5G_BAND_2(channel) || IS_CH_5G_BAND_3(channel))
7962306a36Sopenharmony_ci
8062306a36Sopenharmony_ci#define IS_CH_2G_BAND(channel) ((channel) <= 14)
8162306a36Sopenharmony_ci#define IS_CH_5G_BAND(channel) \
8262306a36Sopenharmony_ci	(IS_CH_5G_BAND_1(channel) || IS_CH_5G_BAND_2(channel) || \
8362306a36Sopenharmony_ci	 IS_CH_5G_BAND_3(channel) || IS_CH_5G_BAND_4(channel))
8462306a36Sopenharmony_ci
8562306a36Sopenharmony_cienum rtw_supported_band {
8662306a36Sopenharmony_ci	RTW_BAND_2G = BIT(NL80211_BAND_2GHZ),
8762306a36Sopenharmony_ci	RTW_BAND_5G = BIT(NL80211_BAND_5GHZ),
8862306a36Sopenharmony_ci	RTW_BAND_60G = BIT(NL80211_BAND_60GHZ),
8962306a36Sopenharmony_ci};
9062306a36Sopenharmony_ci
9162306a36Sopenharmony_ci/* now, support up to 80M bw */
9262306a36Sopenharmony_ci#define RTW_MAX_CHANNEL_WIDTH RTW_CHANNEL_WIDTH_80
9362306a36Sopenharmony_ci
9462306a36Sopenharmony_cienum rtw_bandwidth {
9562306a36Sopenharmony_ci	RTW_CHANNEL_WIDTH_20	= 0,
9662306a36Sopenharmony_ci	RTW_CHANNEL_WIDTH_40	= 1,
9762306a36Sopenharmony_ci	RTW_CHANNEL_WIDTH_80	= 2,
9862306a36Sopenharmony_ci	RTW_CHANNEL_WIDTH_160	= 3,
9962306a36Sopenharmony_ci	RTW_CHANNEL_WIDTH_80_80	= 4,
10062306a36Sopenharmony_ci	RTW_CHANNEL_WIDTH_5	= 5,
10162306a36Sopenharmony_ci	RTW_CHANNEL_WIDTH_10	= 6,
10262306a36Sopenharmony_ci};
10362306a36Sopenharmony_ci
10462306a36Sopenharmony_cienum rtw_sc_offset {
10562306a36Sopenharmony_ci	RTW_SC_DONT_CARE	= 0,
10662306a36Sopenharmony_ci	RTW_SC_20_UPPER		= 1,
10762306a36Sopenharmony_ci	RTW_SC_20_LOWER		= 2,
10862306a36Sopenharmony_ci	RTW_SC_20_UPMOST	= 3,
10962306a36Sopenharmony_ci	RTW_SC_20_LOWEST	= 4,
11062306a36Sopenharmony_ci	RTW_SC_40_UPPER		= 9,
11162306a36Sopenharmony_ci	RTW_SC_40_LOWER		= 10,
11262306a36Sopenharmony_ci};
11362306a36Sopenharmony_ci
11462306a36Sopenharmony_cienum rtw_net_type {
11562306a36Sopenharmony_ci	RTW_NET_NO_LINK		= 0,
11662306a36Sopenharmony_ci	RTW_NET_AD_HOC		= 1,
11762306a36Sopenharmony_ci	RTW_NET_MGD_LINKED	= 2,
11862306a36Sopenharmony_ci	RTW_NET_AP_MODE		= 3,
11962306a36Sopenharmony_ci};
12062306a36Sopenharmony_ci
12162306a36Sopenharmony_cienum rtw_rf_type {
12262306a36Sopenharmony_ci	RF_1T1R			= 0,
12362306a36Sopenharmony_ci	RF_1T2R			= 1,
12462306a36Sopenharmony_ci	RF_2T2R			= 2,
12562306a36Sopenharmony_ci	RF_2T3R			= 3,
12662306a36Sopenharmony_ci	RF_2T4R			= 4,
12762306a36Sopenharmony_ci	RF_3T3R			= 5,
12862306a36Sopenharmony_ci	RF_3T4R			= 6,
12962306a36Sopenharmony_ci	RF_4T4R			= 7,
13062306a36Sopenharmony_ci	RF_TYPE_MAX,
13162306a36Sopenharmony_ci};
13262306a36Sopenharmony_ci
13362306a36Sopenharmony_cienum rtw_rf_path {
13462306a36Sopenharmony_ci	RF_PATH_A = 0,
13562306a36Sopenharmony_ci	RF_PATH_B = 1,
13662306a36Sopenharmony_ci	RF_PATH_C = 2,
13762306a36Sopenharmony_ci	RF_PATH_D = 3,
13862306a36Sopenharmony_ci};
13962306a36Sopenharmony_ci
14062306a36Sopenharmony_cienum rtw_bb_path {
14162306a36Sopenharmony_ci	BB_PATH_A = BIT(0),
14262306a36Sopenharmony_ci	BB_PATH_B = BIT(1),
14362306a36Sopenharmony_ci	BB_PATH_C = BIT(2),
14462306a36Sopenharmony_ci	BB_PATH_D = BIT(3),
14562306a36Sopenharmony_ci
14662306a36Sopenharmony_ci	BB_PATH_AB = (BB_PATH_A | BB_PATH_B),
14762306a36Sopenharmony_ci	BB_PATH_AC = (BB_PATH_A | BB_PATH_C),
14862306a36Sopenharmony_ci	BB_PATH_AD = (BB_PATH_A | BB_PATH_D),
14962306a36Sopenharmony_ci	BB_PATH_BC = (BB_PATH_B | BB_PATH_C),
15062306a36Sopenharmony_ci	BB_PATH_BD = (BB_PATH_B | BB_PATH_D),
15162306a36Sopenharmony_ci	BB_PATH_CD = (BB_PATH_C | BB_PATH_D),
15262306a36Sopenharmony_ci
15362306a36Sopenharmony_ci	BB_PATH_ABC = (BB_PATH_A | BB_PATH_B | BB_PATH_C),
15462306a36Sopenharmony_ci	BB_PATH_ABD = (BB_PATH_A | BB_PATH_B | BB_PATH_D),
15562306a36Sopenharmony_ci	BB_PATH_ACD = (BB_PATH_A | BB_PATH_C | BB_PATH_D),
15662306a36Sopenharmony_ci	BB_PATH_BCD = (BB_PATH_B | BB_PATH_C | BB_PATH_D),
15762306a36Sopenharmony_ci
15862306a36Sopenharmony_ci	BB_PATH_ABCD = (BB_PATH_A | BB_PATH_B | BB_PATH_C | BB_PATH_D),
15962306a36Sopenharmony_ci};
16062306a36Sopenharmony_ci
16162306a36Sopenharmony_cienum rtw_rate_section {
16262306a36Sopenharmony_ci	RTW_RATE_SECTION_CCK = 0,
16362306a36Sopenharmony_ci	RTW_RATE_SECTION_OFDM,
16462306a36Sopenharmony_ci	RTW_RATE_SECTION_HT_1S,
16562306a36Sopenharmony_ci	RTW_RATE_SECTION_HT_2S,
16662306a36Sopenharmony_ci	RTW_RATE_SECTION_VHT_1S,
16762306a36Sopenharmony_ci	RTW_RATE_SECTION_VHT_2S,
16862306a36Sopenharmony_ci
16962306a36Sopenharmony_ci	/* keep last */
17062306a36Sopenharmony_ci	RTW_RATE_SECTION_MAX,
17162306a36Sopenharmony_ci};
17262306a36Sopenharmony_ci
17362306a36Sopenharmony_cienum rtw_wireless_set {
17462306a36Sopenharmony_ci	WIRELESS_CCK	= 0x00000001,
17562306a36Sopenharmony_ci	WIRELESS_OFDM	= 0x00000002,
17662306a36Sopenharmony_ci	WIRELESS_HT	= 0x00000004,
17762306a36Sopenharmony_ci	WIRELESS_VHT	= 0x00000008,
17862306a36Sopenharmony_ci};
17962306a36Sopenharmony_ci
18062306a36Sopenharmony_ci#define HT_STBC_EN	BIT(0)
18162306a36Sopenharmony_ci#define VHT_STBC_EN	BIT(1)
18262306a36Sopenharmony_ci#define HT_LDPC_EN	BIT(0)
18362306a36Sopenharmony_ci#define VHT_LDPC_EN	BIT(1)
18462306a36Sopenharmony_ci
18562306a36Sopenharmony_cienum rtw_chip_type {
18662306a36Sopenharmony_ci	RTW_CHIP_TYPE_8822B,
18762306a36Sopenharmony_ci	RTW_CHIP_TYPE_8822C,
18862306a36Sopenharmony_ci	RTW_CHIP_TYPE_8723D,
18962306a36Sopenharmony_ci	RTW_CHIP_TYPE_8821C,
19062306a36Sopenharmony_ci};
19162306a36Sopenharmony_ci
19262306a36Sopenharmony_cienum rtw_tx_queue_type {
19362306a36Sopenharmony_ci	/* the order of AC queues matters */
19462306a36Sopenharmony_ci	RTW_TX_QUEUE_BK = 0x0,
19562306a36Sopenharmony_ci	RTW_TX_QUEUE_BE = 0x1,
19662306a36Sopenharmony_ci	RTW_TX_QUEUE_VI = 0x2,
19762306a36Sopenharmony_ci	RTW_TX_QUEUE_VO = 0x3,
19862306a36Sopenharmony_ci
19962306a36Sopenharmony_ci	RTW_TX_QUEUE_BCN = 0x4,
20062306a36Sopenharmony_ci	RTW_TX_QUEUE_MGMT = 0x5,
20162306a36Sopenharmony_ci	RTW_TX_QUEUE_HI0 = 0x6,
20262306a36Sopenharmony_ci	RTW_TX_QUEUE_H2C = 0x7,
20362306a36Sopenharmony_ci	/* keep it last */
20462306a36Sopenharmony_ci	RTK_MAX_TX_QUEUE_NUM
20562306a36Sopenharmony_ci};
20662306a36Sopenharmony_ci
20762306a36Sopenharmony_cienum rtw_rx_queue_type {
20862306a36Sopenharmony_ci	RTW_RX_QUEUE_MPDU = 0x0,
20962306a36Sopenharmony_ci	RTW_RX_QUEUE_C2H = 0x1,
21062306a36Sopenharmony_ci	/* keep it last */
21162306a36Sopenharmony_ci	RTK_MAX_RX_QUEUE_NUM
21262306a36Sopenharmony_ci};
21362306a36Sopenharmony_ci
21462306a36Sopenharmony_cienum rtw_fw_type {
21562306a36Sopenharmony_ci	RTW_NORMAL_FW = 0x0,
21662306a36Sopenharmony_ci	RTW_WOWLAN_FW = 0x1,
21762306a36Sopenharmony_ci};
21862306a36Sopenharmony_ci
21962306a36Sopenharmony_cienum rtw_rate_index {
22062306a36Sopenharmony_ci	RTW_RATEID_BGN_40M_2SS	= 0,
22162306a36Sopenharmony_ci	RTW_RATEID_BGN_40M_1SS	= 1,
22262306a36Sopenharmony_ci	RTW_RATEID_BGN_20M_2SS	= 2,
22362306a36Sopenharmony_ci	RTW_RATEID_BGN_20M_1SS	= 3,
22462306a36Sopenharmony_ci	RTW_RATEID_GN_N2SS	= 4,
22562306a36Sopenharmony_ci	RTW_RATEID_GN_N1SS	= 5,
22662306a36Sopenharmony_ci	RTW_RATEID_BG		= 6,
22762306a36Sopenharmony_ci	RTW_RATEID_G		= 7,
22862306a36Sopenharmony_ci	RTW_RATEID_B_20M	= 8,
22962306a36Sopenharmony_ci	RTW_RATEID_ARFR0_AC_2SS	= 9,
23062306a36Sopenharmony_ci	RTW_RATEID_ARFR1_AC_1SS	= 10,
23162306a36Sopenharmony_ci	RTW_RATEID_ARFR2_AC_2G_1SS = 11,
23262306a36Sopenharmony_ci	RTW_RATEID_ARFR3_AC_2G_2SS = 12,
23362306a36Sopenharmony_ci	RTW_RATEID_ARFR4_AC_3SS	= 13,
23462306a36Sopenharmony_ci	RTW_RATEID_ARFR5_N_3SS	= 14,
23562306a36Sopenharmony_ci	RTW_RATEID_ARFR7_N_4SS	= 15,
23662306a36Sopenharmony_ci	RTW_RATEID_ARFR6_AC_4SS	= 16
23762306a36Sopenharmony_ci};
23862306a36Sopenharmony_ci
23962306a36Sopenharmony_cienum rtw_trx_desc_rate {
24062306a36Sopenharmony_ci	DESC_RATE1M	= 0x00,
24162306a36Sopenharmony_ci	DESC_RATE2M	= 0x01,
24262306a36Sopenharmony_ci	DESC_RATE5_5M	= 0x02,
24362306a36Sopenharmony_ci	DESC_RATE11M	= 0x03,
24462306a36Sopenharmony_ci
24562306a36Sopenharmony_ci	DESC_RATE6M	= 0x04,
24662306a36Sopenharmony_ci	DESC_RATE9M	= 0x05,
24762306a36Sopenharmony_ci	DESC_RATE12M	= 0x06,
24862306a36Sopenharmony_ci	DESC_RATE18M	= 0x07,
24962306a36Sopenharmony_ci	DESC_RATE24M	= 0x08,
25062306a36Sopenharmony_ci	DESC_RATE36M	= 0x09,
25162306a36Sopenharmony_ci	DESC_RATE48M	= 0x0a,
25262306a36Sopenharmony_ci	DESC_RATE54M	= 0x0b,
25362306a36Sopenharmony_ci
25462306a36Sopenharmony_ci	DESC_RATEMCS0	= 0x0c,
25562306a36Sopenharmony_ci	DESC_RATEMCS1	= 0x0d,
25662306a36Sopenharmony_ci	DESC_RATEMCS2	= 0x0e,
25762306a36Sopenharmony_ci	DESC_RATEMCS3	= 0x0f,
25862306a36Sopenharmony_ci	DESC_RATEMCS4	= 0x10,
25962306a36Sopenharmony_ci	DESC_RATEMCS5	= 0x11,
26062306a36Sopenharmony_ci	DESC_RATEMCS6	= 0x12,
26162306a36Sopenharmony_ci	DESC_RATEMCS7	= 0x13,
26262306a36Sopenharmony_ci	DESC_RATEMCS8	= 0x14,
26362306a36Sopenharmony_ci	DESC_RATEMCS9	= 0x15,
26462306a36Sopenharmony_ci	DESC_RATEMCS10	= 0x16,
26562306a36Sopenharmony_ci	DESC_RATEMCS11	= 0x17,
26662306a36Sopenharmony_ci	DESC_RATEMCS12	= 0x18,
26762306a36Sopenharmony_ci	DESC_RATEMCS13	= 0x19,
26862306a36Sopenharmony_ci	DESC_RATEMCS14	= 0x1a,
26962306a36Sopenharmony_ci	DESC_RATEMCS15	= 0x1b,
27062306a36Sopenharmony_ci	DESC_RATEMCS16	= 0x1c,
27162306a36Sopenharmony_ci	DESC_RATEMCS17	= 0x1d,
27262306a36Sopenharmony_ci	DESC_RATEMCS18	= 0x1e,
27362306a36Sopenharmony_ci	DESC_RATEMCS19	= 0x1f,
27462306a36Sopenharmony_ci	DESC_RATEMCS20	= 0x20,
27562306a36Sopenharmony_ci	DESC_RATEMCS21	= 0x21,
27662306a36Sopenharmony_ci	DESC_RATEMCS22	= 0x22,
27762306a36Sopenharmony_ci	DESC_RATEMCS23	= 0x23,
27862306a36Sopenharmony_ci	DESC_RATEMCS24	= 0x24,
27962306a36Sopenharmony_ci	DESC_RATEMCS25	= 0x25,
28062306a36Sopenharmony_ci	DESC_RATEMCS26	= 0x26,
28162306a36Sopenharmony_ci	DESC_RATEMCS27	= 0x27,
28262306a36Sopenharmony_ci	DESC_RATEMCS28	= 0x28,
28362306a36Sopenharmony_ci	DESC_RATEMCS29	= 0x29,
28462306a36Sopenharmony_ci	DESC_RATEMCS30	= 0x2a,
28562306a36Sopenharmony_ci	DESC_RATEMCS31	= 0x2b,
28662306a36Sopenharmony_ci
28762306a36Sopenharmony_ci	DESC_RATEVHT1SS_MCS0	= 0x2c,
28862306a36Sopenharmony_ci	DESC_RATEVHT1SS_MCS1	= 0x2d,
28962306a36Sopenharmony_ci	DESC_RATEVHT1SS_MCS2	= 0x2e,
29062306a36Sopenharmony_ci	DESC_RATEVHT1SS_MCS3	= 0x2f,
29162306a36Sopenharmony_ci	DESC_RATEVHT1SS_MCS4	= 0x30,
29262306a36Sopenharmony_ci	DESC_RATEVHT1SS_MCS5	= 0x31,
29362306a36Sopenharmony_ci	DESC_RATEVHT1SS_MCS6	= 0x32,
29462306a36Sopenharmony_ci	DESC_RATEVHT1SS_MCS7	= 0x33,
29562306a36Sopenharmony_ci	DESC_RATEVHT1SS_MCS8	= 0x34,
29662306a36Sopenharmony_ci	DESC_RATEVHT1SS_MCS9	= 0x35,
29762306a36Sopenharmony_ci
29862306a36Sopenharmony_ci	DESC_RATEVHT2SS_MCS0	= 0x36,
29962306a36Sopenharmony_ci	DESC_RATEVHT2SS_MCS1	= 0x37,
30062306a36Sopenharmony_ci	DESC_RATEVHT2SS_MCS2	= 0x38,
30162306a36Sopenharmony_ci	DESC_RATEVHT2SS_MCS3	= 0x39,
30262306a36Sopenharmony_ci	DESC_RATEVHT2SS_MCS4	= 0x3a,
30362306a36Sopenharmony_ci	DESC_RATEVHT2SS_MCS5	= 0x3b,
30462306a36Sopenharmony_ci	DESC_RATEVHT2SS_MCS6	= 0x3c,
30562306a36Sopenharmony_ci	DESC_RATEVHT2SS_MCS7	= 0x3d,
30662306a36Sopenharmony_ci	DESC_RATEVHT2SS_MCS8	= 0x3e,
30762306a36Sopenharmony_ci	DESC_RATEVHT2SS_MCS9	= 0x3f,
30862306a36Sopenharmony_ci
30962306a36Sopenharmony_ci	DESC_RATEVHT3SS_MCS0	= 0x40,
31062306a36Sopenharmony_ci	DESC_RATEVHT3SS_MCS1	= 0x41,
31162306a36Sopenharmony_ci	DESC_RATEVHT3SS_MCS2	= 0x42,
31262306a36Sopenharmony_ci	DESC_RATEVHT3SS_MCS3	= 0x43,
31362306a36Sopenharmony_ci	DESC_RATEVHT3SS_MCS4	= 0x44,
31462306a36Sopenharmony_ci	DESC_RATEVHT3SS_MCS5	= 0x45,
31562306a36Sopenharmony_ci	DESC_RATEVHT3SS_MCS6	= 0x46,
31662306a36Sopenharmony_ci	DESC_RATEVHT3SS_MCS7	= 0x47,
31762306a36Sopenharmony_ci	DESC_RATEVHT3SS_MCS8	= 0x48,
31862306a36Sopenharmony_ci	DESC_RATEVHT3SS_MCS9	= 0x49,
31962306a36Sopenharmony_ci
32062306a36Sopenharmony_ci	DESC_RATEVHT4SS_MCS0	= 0x4a,
32162306a36Sopenharmony_ci	DESC_RATEVHT4SS_MCS1	= 0x4b,
32262306a36Sopenharmony_ci	DESC_RATEVHT4SS_MCS2	= 0x4c,
32362306a36Sopenharmony_ci	DESC_RATEVHT4SS_MCS3	= 0x4d,
32462306a36Sopenharmony_ci	DESC_RATEVHT4SS_MCS4	= 0x4e,
32562306a36Sopenharmony_ci	DESC_RATEVHT4SS_MCS5	= 0x4f,
32662306a36Sopenharmony_ci	DESC_RATEVHT4SS_MCS6	= 0x50,
32762306a36Sopenharmony_ci	DESC_RATEVHT4SS_MCS7	= 0x51,
32862306a36Sopenharmony_ci	DESC_RATEVHT4SS_MCS8	= 0x52,
32962306a36Sopenharmony_ci	DESC_RATEVHT4SS_MCS9	= 0x53,
33062306a36Sopenharmony_ci
33162306a36Sopenharmony_ci	DESC_RATE_MAX,
33262306a36Sopenharmony_ci};
33362306a36Sopenharmony_ci
33462306a36Sopenharmony_cienum rtw_regulatory_domains {
33562306a36Sopenharmony_ci	RTW_REGD_FCC		= 0,
33662306a36Sopenharmony_ci	RTW_REGD_MKK		= 1,
33762306a36Sopenharmony_ci	RTW_REGD_ETSI		= 2,
33862306a36Sopenharmony_ci	RTW_REGD_IC		= 3,
33962306a36Sopenharmony_ci	RTW_REGD_KCC		= 4,
34062306a36Sopenharmony_ci	RTW_REGD_ACMA		= 5,
34162306a36Sopenharmony_ci	RTW_REGD_CHILE		= 6,
34262306a36Sopenharmony_ci	RTW_REGD_UKRAINE	= 7,
34362306a36Sopenharmony_ci	RTW_REGD_MEXICO		= 8,
34462306a36Sopenharmony_ci	RTW_REGD_CN		= 9,
34562306a36Sopenharmony_ci	RTW_REGD_WW,
34662306a36Sopenharmony_ci
34762306a36Sopenharmony_ci	RTW_REGD_MAX
34862306a36Sopenharmony_ci};
34962306a36Sopenharmony_ci
35062306a36Sopenharmony_cienum rtw_txq_flags {
35162306a36Sopenharmony_ci	RTW_TXQ_AMPDU,
35262306a36Sopenharmony_ci	RTW_TXQ_BLOCK_BA,
35362306a36Sopenharmony_ci};
35462306a36Sopenharmony_ci
35562306a36Sopenharmony_cienum rtw_flags {
35662306a36Sopenharmony_ci	RTW_FLAG_RUNNING,
35762306a36Sopenharmony_ci	RTW_FLAG_FW_RUNNING,
35862306a36Sopenharmony_ci	RTW_FLAG_SCANNING,
35962306a36Sopenharmony_ci	RTW_FLAG_POWERON,
36062306a36Sopenharmony_ci	RTW_FLAG_LEISURE_PS,
36162306a36Sopenharmony_ci	RTW_FLAG_LEISURE_PS_DEEP,
36262306a36Sopenharmony_ci	RTW_FLAG_DIG_DISABLE,
36362306a36Sopenharmony_ci	RTW_FLAG_BUSY_TRAFFIC,
36462306a36Sopenharmony_ci	RTW_FLAG_WOWLAN,
36562306a36Sopenharmony_ci	RTW_FLAG_RESTARTING,
36662306a36Sopenharmony_ci	RTW_FLAG_RESTART_TRIGGERING,
36762306a36Sopenharmony_ci	RTW_FLAG_FORCE_LOWEST_RATE,
36862306a36Sopenharmony_ci
36962306a36Sopenharmony_ci	NUM_OF_RTW_FLAGS,
37062306a36Sopenharmony_ci};
37162306a36Sopenharmony_ci
37262306a36Sopenharmony_cienum rtw_evm {
37362306a36Sopenharmony_ci	RTW_EVM_OFDM = 0,
37462306a36Sopenharmony_ci	RTW_EVM_1SS,
37562306a36Sopenharmony_ci	RTW_EVM_2SS_A,
37662306a36Sopenharmony_ci	RTW_EVM_2SS_B,
37762306a36Sopenharmony_ci	/* keep it last */
37862306a36Sopenharmony_ci	RTW_EVM_NUM
37962306a36Sopenharmony_ci};
38062306a36Sopenharmony_ci
38162306a36Sopenharmony_cienum rtw_snr {
38262306a36Sopenharmony_ci	RTW_SNR_OFDM_A = 0,
38362306a36Sopenharmony_ci	RTW_SNR_OFDM_B,
38462306a36Sopenharmony_ci	RTW_SNR_OFDM_C,
38562306a36Sopenharmony_ci	RTW_SNR_OFDM_D,
38662306a36Sopenharmony_ci	RTW_SNR_1SS_A,
38762306a36Sopenharmony_ci	RTW_SNR_1SS_B,
38862306a36Sopenharmony_ci	RTW_SNR_1SS_C,
38962306a36Sopenharmony_ci	RTW_SNR_1SS_D,
39062306a36Sopenharmony_ci	RTW_SNR_2SS_A,
39162306a36Sopenharmony_ci	RTW_SNR_2SS_B,
39262306a36Sopenharmony_ci	RTW_SNR_2SS_C,
39362306a36Sopenharmony_ci	RTW_SNR_2SS_D,
39462306a36Sopenharmony_ci	/* keep it last */
39562306a36Sopenharmony_ci	RTW_SNR_NUM
39662306a36Sopenharmony_ci};
39762306a36Sopenharmony_ci
39862306a36Sopenharmony_cienum rtw_port {
39962306a36Sopenharmony_ci	RTW_PORT_0 = 0,
40062306a36Sopenharmony_ci	RTW_PORT_1 = 1,
40162306a36Sopenharmony_ci	RTW_PORT_2 = 2,
40262306a36Sopenharmony_ci	RTW_PORT_3 = 3,
40362306a36Sopenharmony_ci	RTW_PORT_4 = 4,
40462306a36Sopenharmony_ci	RTW_PORT_NUM
40562306a36Sopenharmony_ci};
40662306a36Sopenharmony_ci
40762306a36Sopenharmony_cienum rtw_wow_flags {
40862306a36Sopenharmony_ci	RTW_WOW_FLAG_EN_MAGIC_PKT,
40962306a36Sopenharmony_ci	RTW_WOW_FLAG_EN_REKEY_PKT,
41062306a36Sopenharmony_ci	RTW_WOW_FLAG_EN_DISCONNECT,
41162306a36Sopenharmony_ci
41262306a36Sopenharmony_ci	/* keep it last */
41362306a36Sopenharmony_ci	RTW_WOW_FLAG_MAX,
41462306a36Sopenharmony_ci};
41562306a36Sopenharmony_ci
41662306a36Sopenharmony_ci/* the power index is represented by differences, which cck-1s & ht40-1s are
41762306a36Sopenharmony_ci * the base values, so for 1s's differences, there are only ht20 & ofdm
41862306a36Sopenharmony_ci */
41962306a36Sopenharmony_cistruct rtw_2g_1s_pwr_idx_diff {
42062306a36Sopenharmony_ci#ifdef __LITTLE_ENDIAN
42162306a36Sopenharmony_ci	s8 ofdm:4;
42262306a36Sopenharmony_ci	s8 bw20:4;
42362306a36Sopenharmony_ci#else
42462306a36Sopenharmony_ci	s8 bw20:4;
42562306a36Sopenharmony_ci	s8 ofdm:4;
42662306a36Sopenharmony_ci#endif
42762306a36Sopenharmony_ci} __packed;
42862306a36Sopenharmony_ci
42962306a36Sopenharmony_cistruct rtw_2g_ns_pwr_idx_diff {
43062306a36Sopenharmony_ci#ifdef __LITTLE_ENDIAN
43162306a36Sopenharmony_ci	s8 bw20:4;
43262306a36Sopenharmony_ci	s8 bw40:4;
43362306a36Sopenharmony_ci	s8 cck:4;
43462306a36Sopenharmony_ci	s8 ofdm:4;
43562306a36Sopenharmony_ci#else
43662306a36Sopenharmony_ci	s8 ofdm:4;
43762306a36Sopenharmony_ci	s8 cck:4;
43862306a36Sopenharmony_ci	s8 bw40:4;
43962306a36Sopenharmony_ci	s8 bw20:4;
44062306a36Sopenharmony_ci#endif
44162306a36Sopenharmony_ci} __packed;
44262306a36Sopenharmony_ci
44362306a36Sopenharmony_cistruct rtw_2g_txpwr_idx {
44462306a36Sopenharmony_ci	u8 cck_base[6];
44562306a36Sopenharmony_ci	u8 bw40_base[5];
44662306a36Sopenharmony_ci	struct rtw_2g_1s_pwr_idx_diff ht_1s_diff;
44762306a36Sopenharmony_ci	struct rtw_2g_ns_pwr_idx_diff ht_2s_diff;
44862306a36Sopenharmony_ci	struct rtw_2g_ns_pwr_idx_diff ht_3s_diff;
44962306a36Sopenharmony_ci	struct rtw_2g_ns_pwr_idx_diff ht_4s_diff;
45062306a36Sopenharmony_ci};
45162306a36Sopenharmony_ci
45262306a36Sopenharmony_cistruct rtw_5g_ht_1s_pwr_idx_diff {
45362306a36Sopenharmony_ci#ifdef __LITTLE_ENDIAN
45462306a36Sopenharmony_ci	s8 ofdm:4;
45562306a36Sopenharmony_ci	s8 bw20:4;
45662306a36Sopenharmony_ci#else
45762306a36Sopenharmony_ci	s8 bw20:4;
45862306a36Sopenharmony_ci	s8 ofdm:4;
45962306a36Sopenharmony_ci#endif
46062306a36Sopenharmony_ci} __packed;
46162306a36Sopenharmony_ci
46262306a36Sopenharmony_cistruct rtw_5g_ht_ns_pwr_idx_diff {
46362306a36Sopenharmony_ci#ifdef __LITTLE_ENDIAN
46462306a36Sopenharmony_ci	s8 bw20:4;
46562306a36Sopenharmony_ci	s8 bw40:4;
46662306a36Sopenharmony_ci#else
46762306a36Sopenharmony_ci	s8 bw40:4;
46862306a36Sopenharmony_ci	s8 bw20:4;
46962306a36Sopenharmony_ci#endif
47062306a36Sopenharmony_ci} __packed;
47162306a36Sopenharmony_ci
47262306a36Sopenharmony_cistruct rtw_5g_ofdm_ns_pwr_idx_diff {
47362306a36Sopenharmony_ci#ifdef __LITTLE_ENDIAN
47462306a36Sopenharmony_ci	s8 ofdm_3s:4;
47562306a36Sopenharmony_ci	s8 ofdm_2s:4;
47662306a36Sopenharmony_ci	s8 ofdm_4s:4;
47762306a36Sopenharmony_ci	s8 res:4;
47862306a36Sopenharmony_ci#else
47962306a36Sopenharmony_ci	s8 res:4;
48062306a36Sopenharmony_ci	s8 ofdm_4s:4;
48162306a36Sopenharmony_ci	s8 ofdm_2s:4;
48262306a36Sopenharmony_ci	s8 ofdm_3s:4;
48362306a36Sopenharmony_ci#endif
48462306a36Sopenharmony_ci} __packed;
48562306a36Sopenharmony_ci
48662306a36Sopenharmony_cistruct rtw_5g_vht_ns_pwr_idx_diff {
48762306a36Sopenharmony_ci#ifdef __LITTLE_ENDIAN
48862306a36Sopenharmony_ci	s8 bw160:4;
48962306a36Sopenharmony_ci	s8 bw80:4;
49062306a36Sopenharmony_ci#else
49162306a36Sopenharmony_ci	s8 bw80:4;
49262306a36Sopenharmony_ci	s8 bw160:4;
49362306a36Sopenharmony_ci#endif
49462306a36Sopenharmony_ci} __packed;
49562306a36Sopenharmony_ci
49662306a36Sopenharmony_cistruct rtw_5g_txpwr_idx {
49762306a36Sopenharmony_ci	u8 bw40_base[14];
49862306a36Sopenharmony_ci	struct rtw_5g_ht_1s_pwr_idx_diff ht_1s_diff;
49962306a36Sopenharmony_ci	struct rtw_5g_ht_ns_pwr_idx_diff ht_2s_diff;
50062306a36Sopenharmony_ci	struct rtw_5g_ht_ns_pwr_idx_diff ht_3s_diff;
50162306a36Sopenharmony_ci	struct rtw_5g_ht_ns_pwr_idx_diff ht_4s_diff;
50262306a36Sopenharmony_ci	struct rtw_5g_ofdm_ns_pwr_idx_diff ofdm_diff;
50362306a36Sopenharmony_ci	struct rtw_5g_vht_ns_pwr_idx_diff vht_1s_diff;
50462306a36Sopenharmony_ci	struct rtw_5g_vht_ns_pwr_idx_diff vht_2s_diff;
50562306a36Sopenharmony_ci	struct rtw_5g_vht_ns_pwr_idx_diff vht_3s_diff;
50662306a36Sopenharmony_ci	struct rtw_5g_vht_ns_pwr_idx_diff vht_4s_diff;
50762306a36Sopenharmony_ci};
50862306a36Sopenharmony_ci
50962306a36Sopenharmony_cistruct rtw_txpwr_idx {
51062306a36Sopenharmony_ci	struct rtw_2g_txpwr_idx pwr_idx_2g;
51162306a36Sopenharmony_ci	struct rtw_5g_txpwr_idx pwr_idx_5g;
51262306a36Sopenharmony_ci};
51362306a36Sopenharmony_ci
51462306a36Sopenharmony_cistruct rtw_channel_params {
51562306a36Sopenharmony_ci	u8 center_chan;
51662306a36Sopenharmony_ci	u8 primary_chan;
51762306a36Sopenharmony_ci	u8 bandwidth;
51862306a36Sopenharmony_ci};
51962306a36Sopenharmony_ci
52062306a36Sopenharmony_cistruct rtw_hw_reg {
52162306a36Sopenharmony_ci	u32 addr;
52262306a36Sopenharmony_ci	u32 mask;
52362306a36Sopenharmony_ci};
52462306a36Sopenharmony_ci
52562306a36Sopenharmony_cistruct rtw_ltecoex_addr {
52662306a36Sopenharmony_ci	u32 ctrl;
52762306a36Sopenharmony_ci	u32 wdata;
52862306a36Sopenharmony_ci	u32 rdata;
52962306a36Sopenharmony_ci};
53062306a36Sopenharmony_ci
53162306a36Sopenharmony_cistruct rtw_reg_domain {
53262306a36Sopenharmony_ci	u32 addr;
53362306a36Sopenharmony_ci	u32 mask;
53462306a36Sopenharmony_ci#define RTW_REG_DOMAIN_MAC32	0
53562306a36Sopenharmony_ci#define RTW_REG_DOMAIN_MAC16	1
53662306a36Sopenharmony_ci#define RTW_REG_DOMAIN_MAC8	2
53762306a36Sopenharmony_ci#define RTW_REG_DOMAIN_RF_A	3
53862306a36Sopenharmony_ci#define RTW_REG_DOMAIN_RF_B	4
53962306a36Sopenharmony_ci#define RTW_REG_DOMAIN_NL	0xFF
54062306a36Sopenharmony_ci	u8 domain;
54162306a36Sopenharmony_ci};
54262306a36Sopenharmony_ci
54362306a36Sopenharmony_cistruct rtw_rf_sipi_addr {
54462306a36Sopenharmony_ci	u32 hssi_1;
54562306a36Sopenharmony_ci	u32 hssi_2;
54662306a36Sopenharmony_ci	u32 lssi_read;
54762306a36Sopenharmony_ci	u32 lssi_read_pi;
54862306a36Sopenharmony_ci};
54962306a36Sopenharmony_ci
55062306a36Sopenharmony_cistruct rtw_hw_reg_offset {
55162306a36Sopenharmony_ci	struct rtw_hw_reg hw_reg;
55262306a36Sopenharmony_ci	u8 offset;
55362306a36Sopenharmony_ci};
55462306a36Sopenharmony_ci
55562306a36Sopenharmony_cistruct rtw_backup_info {
55662306a36Sopenharmony_ci	u8 len;
55762306a36Sopenharmony_ci	u32 reg;
55862306a36Sopenharmony_ci	u32 val;
55962306a36Sopenharmony_ci};
56062306a36Sopenharmony_ci
56162306a36Sopenharmony_cienum rtw_vif_port_set {
56262306a36Sopenharmony_ci	PORT_SET_MAC_ADDR	= BIT(0),
56362306a36Sopenharmony_ci	PORT_SET_BSSID		= BIT(1),
56462306a36Sopenharmony_ci	PORT_SET_NET_TYPE	= BIT(2),
56562306a36Sopenharmony_ci	PORT_SET_AID		= BIT(3),
56662306a36Sopenharmony_ci	PORT_SET_BCN_CTRL	= BIT(4),
56762306a36Sopenharmony_ci};
56862306a36Sopenharmony_ci
56962306a36Sopenharmony_cistruct rtw_vif_port {
57062306a36Sopenharmony_ci	struct rtw_hw_reg mac_addr;
57162306a36Sopenharmony_ci	struct rtw_hw_reg bssid;
57262306a36Sopenharmony_ci	struct rtw_hw_reg net_type;
57362306a36Sopenharmony_ci	struct rtw_hw_reg aid;
57462306a36Sopenharmony_ci	struct rtw_hw_reg bcn_ctrl;
57562306a36Sopenharmony_ci};
57662306a36Sopenharmony_ci
57762306a36Sopenharmony_cistruct rtw_tx_pkt_info {
57862306a36Sopenharmony_ci	u32 tx_pkt_size;
57962306a36Sopenharmony_ci	u8 offset;
58062306a36Sopenharmony_ci	u8 pkt_offset;
58162306a36Sopenharmony_ci	u8 tim_offset;
58262306a36Sopenharmony_ci	u8 mac_id;
58362306a36Sopenharmony_ci	u8 rate_id;
58462306a36Sopenharmony_ci	u8 rate;
58562306a36Sopenharmony_ci	u8 qsel;
58662306a36Sopenharmony_ci	u8 bw;
58762306a36Sopenharmony_ci	u8 sec_type;
58862306a36Sopenharmony_ci	u8 sn;
58962306a36Sopenharmony_ci	bool ampdu_en;
59062306a36Sopenharmony_ci	u8 ampdu_factor;
59162306a36Sopenharmony_ci	u8 ampdu_density;
59262306a36Sopenharmony_ci	u16 seq;
59362306a36Sopenharmony_ci	bool stbc;
59462306a36Sopenharmony_ci	bool ldpc;
59562306a36Sopenharmony_ci	bool dis_rate_fallback;
59662306a36Sopenharmony_ci	bool bmc;
59762306a36Sopenharmony_ci	bool use_rate;
59862306a36Sopenharmony_ci	bool ls;
59962306a36Sopenharmony_ci	bool fs;
60062306a36Sopenharmony_ci	bool short_gi;
60162306a36Sopenharmony_ci	bool report;
60262306a36Sopenharmony_ci	bool rts;
60362306a36Sopenharmony_ci	bool dis_qselseq;
60462306a36Sopenharmony_ci	bool en_hwseq;
60562306a36Sopenharmony_ci	u8 hw_ssn_sel;
60662306a36Sopenharmony_ci	bool nav_use_hdr;
60762306a36Sopenharmony_ci	bool bt_null;
60862306a36Sopenharmony_ci};
60962306a36Sopenharmony_ci
61062306a36Sopenharmony_cistruct rtw_rx_pkt_stat {
61162306a36Sopenharmony_ci	bool phy_status;
61262306a36Sopenharmony_ci	bool icv_err;
61362306a36Sopenharmony_ci	bool crc_err;
61462306a36Sopenharmony_ci	bool decrypted;
61562306a36Sopenharmony_ci	bool is_c2h;
61662306a36Sopenharmony_ci
61762306a36Sopenharmony_ci	s32 signal_power;
61862306a36Sopenharmony_ci	u16 pkt_len;
61962306a36Sopenharmony_ci	u8 bw;
62062306a36Sopenharmony_ci	u8 drv_info_sz;
62162306a36Sopenharmony_ci	u8 shift;
62262306a36Sopenharmony_ci	u8 rate;
62362306a36Sopenharmony_ci	u8 mac_id;
62462306a36Sopenharmony_ci	u8 cam_id;
62562306a36Sopenharmony_ci	u8 ppdu_cnt;
62662306a36Sopenharmony_ci	u32 tsf_low;
62762306a36Sopenharmony_ci	s8 rx_power[RTW_RF_PATH_MAX];
62862306a36Sopenharmony_ci	u8 rssi;
62962306a36Sopenharmony_ci	u8 rxsc;
63062306a36Sopenharmony_ci	s8 rx_snr[RTW_RF_PATH_MAX];
63162306a36Sopenharmony_ci	u8 rx_evm[RTW_RF_PATH_MAX];
63262306a36Sopenharmony_ci	s8 cfo_tail[RTW_RF_PATH_MAX];
63362306a36Sopenharmony_ci	u16 freq;
63462306a36Sopenharmony_ci	u8 band;
63562306a36Sopenharmony_ci
63662306a36Sopenharmony_ci	struct rtw_sta_info *si;
63762306a36Sopenharmony_ci	struct ieee80211_vif *vif;
63862306a36Sopenharmony_ci	struct ieee80211_hdr *hdr;
63962306a36Sopenharmony_ci};
64062306a36Sopenharmony_ci
64162306a36Sopenharmony_ciDECLARE_EWMA(tp, 10, 2);
64262306a36Sopenharmony_ci
64362306a36Sopenharmony_cistruct rtw_traffic_stats {
64462306a36Sopenharmony_ci	/* units in bytes */
64562306a36Sopenharmony_ci	u64 tx_unicast;
64662306a36Sopenharmony_ci	u64 rx_unicast;
64762306a36Sopenharmony_ci
64862306a36Sopenharmony_ci	/* count for packets */
64962306a36Sopenharmony_ci	u64 tx_cnt;
65062306a36Sopenharmony_ci	u64 rx_cnt;
65162306a36Sopenharmony_ci
65262306a36Sopenharmony_ci	/* units in Mbps */
65362306a36Sopenharmony_ci	u32 tx_throughput;
65462306a36Sopenharmony_ci	u32 rx_throughput;
65562306a36Sopenharmony_ci	struct ewma_tp tx_ewma_tp;
65662306a36Sopenharmony_ci	struct ewma_tp rx_ewma_tp;
65762306a36Sopenharmony_ci};
65862306a36Sopenharmony_ci
65962306a36Sopenharmony_cienum rtw_lps_mode {
66062306a36Sopenharmony_ci	RTW_MODE_ACTIVE	= 0,
66162306a36Sopenharmony_ci	RTW_MODE_LPS	= 1,
66262306a36Sopenharmony_ci	RTW_MODE_WMM_PS	= 2,
66362306a36Sopenharmony_ci};
66462306a36Sopenharmony_ci
66562306a36Sopenharmony_cienum rtw_lps_deep_mode {
66662306a36Sopenharmony_ci	LPS_DEEP_MODE_NONE	= 0,
66762306a36Sopenharmony_ci	LPS_DEEP_MODE_LCLK	= 1,
66862306a36Sopenharmony_ci	LPS_DEEP_MODE_PG	= 2,
66962306a36Sopenharmony_ci};
67062306a36Sopenharmony_ci
67162306a36Sopenharmony_cienum rtw_pwr_state {
67262306a36Sopenharmony_ci	RTW_RF_OFF	= 0x0,
67362306a36Sopenharmony_ci	RTW_RF_ON	= 0x4,
67462306a36Sopenharmony_ci	RTW_ALL_ON	= 0xc,
67562306a36Sopenharmony_ci};
67662306a36Sopenharmony_ci
67762306a36Sopenharmony_cistruct rtw_lps_conf {
67862306a36Sopenharmony_ci	enum rtw_lps_mode mode;
67962306a36Sopenharmony_ci	enum rtw_lps_deep_mode deep_mode;
68062306a36Sopenharmony_ci	enum rtw_lps_deep_mode wow_deep_mode;
68162306a36Sopenharmony_ci	enum rtw_pwr_state state;
68262306a36Sopenharmony_ci	u8 awake_interval;
68362306a36Sopenharmony_ci	u8 rlbm;
68462306a36Sopenharmony_ci	u8 smart_ps;
68562306a36Sopenharmony_ci	u8 port_id;
68662306a36Sopenharmony_ci	bool sec_cam_backup;
68762306a36Sopenharmony_ci	bool pattern_cam_backup;
68862306a36Sopenharmony_ci};
68962306a36Sopenharmony_ci
69062306a36Sopenharmony_cienum rtw_hw_key_type {
69162306a36Sopenharmony_ci	RTW_CAM_NONE	= 0,
69262306a36Sopenharmony_ci	RTW_CAM_WEP40	= 1,
69362306a36Sopenharmony_ci	RTW_CAM_TKIP	= 2,
69462306a36Sopenharmony_ci	RTW_CAM_AES	= 4,
69562306a36Sopenharmony_ci	RTW_CAM_WEP104	= 5,
69662306a36Sopenharmony_ci};
69762306a36Sopenharmony_ci
69862306a36Sopenharmony_cistruct rtw_cam_entry {
69962306a36Sopenharmony_ci	bool valid;
70062306a36Sopenharmony_ci	bool group;
70162306a36Sopenharmony_ci	u8 addr[ETH_ALEN];
70262306a36Sopenharmony_ci	u8 hw_key_type;
70362306a36Sopenharmony_ci	struct ieee80211_key_conf *key;
70462306a36Sopenharmony_ci};
70562306a36Sopenharmony_ci
70662306a36Sopenharmony_cistruct rtw_sec_desc {
70762306a36Sopenharmony_ci	/* search strategy */
70862306a36Sopenharmony_ci	bool default_key_search;
70962306a36Sopenharmony_ci
71062306a36Sopenharmony_ci	u32 total_cam_num;
71162306a36Sopenharmony_ci	struct rtw_cam_entry cam_table[RTW_MAX_SEC_CAM_NUM];
71262306a36Sopenharmony_ci	DECLARE_BITMAP(cam_map, RTW_MAX_SEC_CAM_NUM);
71362306a36Sopenharmony_ci};
71462306a36Sopenharmony_ci
71562306a36Sopenharmony_cistruct rtw_tx_report {
71662306a36Sopenharmony_ci	/* protect the tx report queue */
71762306a36Sopenharmony_ci	spinlock_t q_lock;
71862306a36Sopenharmony_ci	struct sk_buff_head queue;
71962306a36Sopenharmony_ci	atomic_t sn;
72062306a36Sopenharmony_ci	struct timer_list purge_timer;
72162306a36Sopenharmony_ci};
72262306a36Sopenharmony_ci
72362306a36Sopenharmony_cistruct rtw_ra_report {
72462306a36Sopenharmony_ci	struct rate_info txrate;
72562306a36Sopenharmony_ci	u32 bit_rate;
72662306a36Sopenharmony_ci	u8 desc_rate;
72762306a36Sopenharmony_ci};
72862306a36Sopenharmony_ci
72962306a36Sopenharmony_cistruct rtw_txq {
73062306a36Sopenharmony_ci	struct list_head list;
73162306a36Sopenharmony_ci	unsigned long flags;
73262306a36Sopenharmony_ci};
73362306a36Sopenharmony_ci
73462306a36Sopenharmony_ci#define RTW_BC_MC_MACID 1
73562306a36Sopenharmony_ciDECLARE_EWMA(rssi, 10, 16);
73662306a36Sopenharmony_ci
73762306a36Sopenharmony_cistruct rtw_sta_info {
73862306a36Sopenharmony_ci	struct rtw_dev *rtwdev;
73962306a36Sopenharmony_ci	struct ieee80211_sta *sta;
74062306a36Sopenharmony_ci	struct ieee80211_vif *vif;
74162306a36Sopenharmony_ci
74262306a36Sopenharmony_ci	struct ewma_rssi avg_rssi;
74362306a36Sopenharmony_ci	u8 rssi_level;
74462306a36Sopenharmony_ci
74562306a36Sopenharmony_ci	u8 mac_id;
74662306a36Sopenharmony_ci	u8 rate_id;
74762306a36Sopenharmony_ci	enum rtw_bandwidth bw_mode;
74862306a36Sopenharmony_ci	enum rtw_rf_type rf_type;
74962306a36Sopenharmony_ci	u8 stbc_en:2;
75062306a36Sopenharmony_ci	u8 ldpc_en:2;
75162306a36Sopenharmony_ci	bool sgi_enable;
75262306a36Sopenharmony_ci	bool vht_enable;
75362306a36Sopenharmony_ci	u8 init_ra_lv;
75462306a36Sopenharmony_ci	u64 ra_mask;
75562306a36Sopenharmony_ci
75662306a36Sopenharmony_ci	DECLARE_BITMAP(tid_ba, IEEE80211_NUM_TIDS);
75762306a36Sopenharmony_ci
75862306a36Sopenharmony_ci	struct rtw_ra_report ra_report;
75962306a36Sopenharmony_ci
76062306a36Sopenharmony_ci	bool use_cfg_mask;
76162306a36Sopenharmony_ci	struct cfg80211_bitrate_mask *mask;
76262306a36Sopenharmony_ci
76362306a36Sopenharmony_ci	struct work_struct rc_work;
76462306a36Sopenharmony_ci};
76562306a36Sopenharmony_ci
76662306a36Sopenharmony_cienum rtw_bfee_role {
76762306a36Sopenharmony_ci	RTW_BFEE_NONE,
76862306a36Sopenharmony_ci	RTW_BFEE_SU,
76962306a36Sopenharmony_ci	RTW_BFEE_MU
77062306a36Sopenharmony_ci};
77162306a36Sopenharmony_ci
77262306a36Sopenharmony_cistruct rtw_bfee {
77362306a36Sopenharmony_ci	enum rtw_bfee_role role;
77462306a36Sopenharmony_ci
77562306a36Sopenharmony_ci	u16 p_aid;
77662306a36Sopenharmony_ci	u8 g_id;
77762306a36Sopenharmony_ci	u8 mac_addr[ETH_ALEN];
77862306a36Sopenharmony_ci	u8 sound_dim;
77962306a36Sopenharmony_ci
78062306a36Sopenharmony_ci	/* SU-MIMO */
78162306a36Sopenharmony_ci	u8 su_reg_index;
78262306a36Sopenharmony_ci
78362306a36Sopenharmony_ci	/* MU-MIMO */
78462306a36Sopenharmony_ci	u16 aid;
78562306a36Sopenharmony_ci};
78662306a36Sopenharmony_ci
78762306a36Sopenharmony_cistruct rtw_bf_info {
78862306a36Sopenharmony_ci	u8 bfer_mu_cnt;
78962306a36Sopenharmony_ci	u8 bfer_su_cnt;
79062306a36Sopenharmony_ci	DECLARE_BITMAP(bfer_su_reg_maping, 2);
79162306a36Sopenharmony_ci	u8 cur_csi_rpt_rate;
79262306a36Sopenharmony_ci};
79362306a36Sopenharmony_ci
79462306a36Sopenharmony_cistruct rtw_vif {
79562306a36Sopenharmony_ci	enum rtw_net_type net_type;
79662306a36Sopenharmony_ci	u16 aid;
79762306a36Sopenharmony_ci	u8 mac_id; /* for STA mode only */
79862306a36Sopenharmony_ci	u8 mac_addr[ETH_ALEN];
79962306a36Sopenharmony_ci	u8 bssid[ETH_ALEN];
80062306a36Sopenharmony_ci	u8 port;
80162306a36Sopenharmony_ci	u8 bcn_ctrl;
80262306a36Sopenharmony_ci	struct list_head rsvd_page_list;
80362306a36Sopenharmony_ci	struct ieee80211_tx_queue_params tx_params[IEEE80211_NUM_ACS];
80462306a36Sopenharmony_ci	const struct rtw_vif_port *conf;
80562306a36Sopenharmony_ci	struct cfg80211_scan_request *scan_req;
80662306a36Sopenharmony_ci	struct ieee80211_scan_ies *scan_ies;
80762306a36Sopenharmony_ci
80862306a36Sopenharmony_ci	struct rtw_traffic_stats stats;
80962306a36Sopenharmony_ci
81062306a36Sopenharmony_ci	struct rtw_bfee bfee;
81162306a36Sopenharmony_ci};
81262306a36Sopenharmony_ci
81362306a36Sopenharmony_cistruct rtw_regulatory {
81462306a36Sopenharmony_ci	char alpha2[2];
81562306a36Sopenharmony_ci	u8 txpwr_regd_2g;
81662306a36Sopenharmony_ci	u8 txpwr_regd_5g;
81762306a36Sopenharmony_ci};
81862306a36Sopenharmony_ci
81962306a36Sopenharmony_cienum rtw_regd_state {
82062306a36Sopenharmony_ci	RTW_REGD_STATE_WORLDWIDE,
82162306a36Sopenharmony_ci	RTW_REGD_STATE_PROGRAMMED,
82262306a36Sopenharmony_ci	RTW_REGD_STATE_SETTING,
82362306a36Sopenharmony_ci
82462306a36Sopenharmony_ci	RTW_REGD_STATE_NR,
82562306a36Sopenharmony_ci};
82662306a36Sopenharmony_ci
82762306a36Sopenharmony_cistruct rtw_regd {
82862306a36Sopenharmony_ci	enum rtw_regd_state state;
82962306a36Sopenharmony_ci	const struct rtw_regulatory *regulatory;
83062306a36Sopenharmony_ci	enum nl80211_dfs_regions dfs_region;
83162306a36Sopenharmony_ci};
83262306a36Sopenharmony_ci
83362306a36Sopenharmony_cistruct rtw_chip_ops {
83462306a36Sopenharmony_ci	int (*mac_init)(struct rtw_dev *rtwdev);
83562306a36Sopenharmony_ci	int (*dump_fw_crash)(struct rtw_dev *rtwdev);
83662306a36Sopenharmony_ci	void (*shutdown)(struct rtw_dev *rtwdev);
83762306a36Sopenharmony_ci	int (*read_efuse)(struct rtw_dev *rtwdev, u8 *map);
83862306a36Sopenharmony_ci	void (*phy_set_param)(struct rtw_dev *rtwdev);
83962306a36Sopenharmony_ci	void (*set_channel)(struct rtw_dev *rtwdev, u8 channel,
84062306a36Sopenharmony_ci			    u8 bandwidth, u8 primary_chan_idx);
84162306a36Sopenharmony_ci	void (*query_rx_desc)(struct rtw_dev *rtwdev, u8 *rx_desc,
84262306a36Sopenharmony_ci			      struct rtw_rx_pkt_stat *pkt_stat,
84362306a36Sopenharmony_ci			      struct ieee80211_rx_status *rx_status);
84462306a36Sopenharmony_ci	u32 (*read_rf)(struct rtw_dev *rtwdev, enum rtw_rf_path rf_path,
84562306a36Sopenharmony_ci		       u32 addr, u32 mask);
84662306a36Sopenharmony_ci	bool (*write_rf)(struct rtw_dev *rtwdev, enum rtw_rf_path rf_path,
84762306a36Sopenharmony_ci			 u32 addr, u32 mask, u32 data);
84862306a36Sopenharmony_ci	void (*set_tx_power_index)(struct rtw_dev *rtwdev);
84962306a36Sopenharmony_ci	int (*rsvd_page_dump)(struct rtw_dev *rtwdev, u8 *buf, u32 offset,
85062306a36Sopenharmony_ci			      u32 size);
85162306a36Sopenharmony_ci	int (*set_antenna)(struct rtw_dev *rtwdev,
85262306a36Sopenharmony_ci			   u32 antenna_tx,
85362306a36Sopenharmony_ci			   u32 antenna_rx);
85462306a36Sopenharmony_ci	void (*cfg_ldo25)(struct rtw_dev *rtwdev, bool enable);
85562306a36Sopenharmony_ci	void (*efuse_grant)(struct rtw_dev *rtwdev, bool enable);
85662306a36Sopenharmony_ci	void (*false_alarm_statistics)(struct rtw_dev *rtwdev);
85762306a36Sopenharmony_ci	void (*phy_calibration)(struct rtw_dev *rtwdev);
85862306a36Sopenharmony_ci	void (*dpk_track)(struct rtw_dev *rtwdev);
85962306a36Sopenharmony_ci	void (*cck_pd_set)(struct rtw_dev *rtwdev, u8 level);
86062306a36Sopenharmony_ci	void (*pwr_track)(struct rtw_dev *rtwdev);
86162306a36Sopenharmony_ci	void (*config_bfee)(struct rtw_dev *rtwdev, struct rtw_vif *vif,
86262306a36Sopenharmony_ci			    struct rtw_bfee *bfee, bool enable);
86362306a36Sopenharmony_ci	void (*set_gid_table)(struct rtw_dev *rtwdev,
86462306a36Sopenharmony_ci			      struct ieee80211_vif *vif,
86562306a36Sopenharmony_ci			      struct ieee80211_bss_conf *conf);
86662306a36Sopenharmony_ci	void (*cfg_csi_rate)(struct rtw_dev *rtwdev, u8 rssi, u8 cur_rate,
86762306a36Sopenharmony_ci			     u8 fixrate_en, u8 *new_rate);
86862306a36Sopenharmony_ci	void (*adaptivity_init)(struct rtw_dev *rtwdev);
86962306a36Sopenharmony_ci	void (*adaptivity)(struct rtw_dev *rtwdev);
87062306a36Sopenharmony_ci	void (*cfo_init)(struct rtw_dev *rtwdev);
87162306a36Sopenharmony_ci	void (*cfo_track)(struct rtw_dev *rtwdev);
87262306a36Sopenharmony_ci	void (*config_tx_path)(struct rtw_dev *rtwdev, u8 tx_path,
87362306a36Sopenharmony_ci			       enum rtw_bb_path tx_path_1ss,
87462306a36Sopenharmony_ci			       enum rtw_bb_path tx_path_cck,
87562306a36Sopenharmony_ci			       bool is_tx2_path);
87662306a36Sopenharmony_ci	void (*config_txrx_mode)(struct rtw_dev *rtwdev, u8 tx_path,
87762306a36Sopenharmony_ci				 u8 rx_path, bool is_tx2_path);
87862306a36Sopenharmony_ci	/* for USB/SDIO only */
87962306a36Sopenharmony_ci	void (*fill_txdesc_checksum)(struct rtw_dev *rtwdev,
88062306a36Sopenharmony_ci				     struct rtw_tx_pkt_info *pkt_info,
88162306a36Sopenharmony_ci				     u8 *txdesc);
88262306a36Sopenharmony_ci
88362306a36Sopenharmony_ci	/* for coex */
88462306a36Sopenharmony_ci	void (*coex_set_init)(struct rtw_dev *rtwdev);
88562306a36Sopenharmony_ci	void (*coex_set_ant_switch)(struct rtw_dev *rtwdev,
88662306a36Sopenharmony_ci				    u8 ctrl_type, u8 pos_type);
88762306a36Sopenharmony_ci	void (*coex_set_gnt_fix)(struct rtw_dev *rtwdev);
88862306a36Sopenharmony_ci	void (*coex_set_gnt_debug)(struct rtw_dev *rtwdev);
88962306a36Sopenharmony_ci	void (*coex_set_rfe_type)(struct rtw_dev *rtwdev);
89062306a36Sopenharmony_ci	void (*coex_set_wl_tx_power)(struct rtw_dev *rtwdev, u8 wl_pwr);
89162306a36Sopenharmony_ci	void (*coex_set_wl_rx_gain)(struct rtw_dev *rtwdev, bool low_gain);
89262306a36Sopenharmony_ci};
89362306a36Sopenharmony_ci
89462306a36Sopenharmony_ci#define RTW_PWR_POLLING_CNT	20000
89562306a36Sopenharmony_ci
89662306a36Sopenharmony_ci#define RTW_PWR_CMD_READ	0x00
89762306a36Sopenharmony_ci#define RTW_PWR_CMD_WRITE	0x01
89862306a36Sopenharmony_ci#define RTW_PWR_CMD_POLLING	0x02
89962306a36Sopenharmony_ci#define RTW_PWR_CMD_DELAY	0x03
90062306a36Sopenharmony_ci#define RTW_PWR_CMD_END		0x04
90162306a36Sopenharmony_ci
90262306a36Sopenharmony_ci/* define the base address of each block */
90362306a36Sopenharmony_ci#define RTW_PWR_ADDR_MAC	0x00
90462306a36Sopenharmony_ci#define RTW_PWR_ADDR_USB	0x01
90562306a36Sopenharmony_ci#define RTW_PWR_ADDR_PCIE	0x02
90662306a36Sopenharmony_ci#define RTW_PWR_ADDR_SDIO	0x03
90762306a36Sopenharmony_ci
90862306a36Sopenharmony_ci#define RTW_PWR_INTF_SDIO_MSK	BIT(0)
90962306a36Sopenharmony_ci#define RTW_PWR_INTF_USB_MSK	BIT(1)
91062306a36Sopenharmony_ci#define RTW_PWR_INTF_PCI_MSK	BIT(2)
91162306a36Sopenharmony_ci#define RTW_PWR_INTF_ALL_MSK	(BIT(0) | BIT(1) | BIT(2) | BIT(3))
91262306a36Sopenharmony_ci
91362306a36Sopenharmony_ci#define RTW_PWR_CUT_TEST_MSK	BIT(0)
91462306a36Sopenharmony_ci#define RTW_PWR_CUT_A_MSK	BIT(1)
91562306a36Sopenharmony_ci#define RTW_PWR_CUT_B_MSK	BIT(2)
91662306a36Sopenharmony_ci#define RTW_PWR_CUT_C_MSK	BIT(3)
91762306a36Sopenharmony_ci#define RTW_PWR_CUT_D_MSK	BIT(4)
91862306a36Sopenharmony_ci#define RTW_PWR_CUT_E_MSK	BIT(5)
91962306a36Sopenharmony_ci#define RTW_PWR_CUT_F_MSK	BIT(6)
92062306a36Sopenharmony_ci#define RTW_PWR_CUT_G_MSK	BIT(7)
92162306a36Sopenharmony_ci#define RTW_PWR_CUT_ALL_MSK	0xFF
92262306a36Sopenharmony_ci
92362306a36Sopenharmony_cienum rtw_pwr_seq_cmd_delay_unit {
92462306a36Sopenharmony_ci	RTW_PWR_DELAY_US,
92562306a36Sopenharmony_ci	RTW_PWR_DELAY_MS,
92662306a36Sopenharmony_ci};
92762306a36Sopenharmony_ci
92862306a36Sopenharmony_cistruct rtw_pwr_seq_cmd {
92962306a36Sopenharmony_ci	u16 offset;
93062306a36Sopenharmony_ci	u8 cut_mask;
93162306a36Sopenharmony_ci	u8 intf_mask;
93262306a36Sopenharmony_ci	u8 base:4;
93362306a36Sopenharmony_ci	u8 cmd:4;
93462306a36Sopenharmony_ci	u8 mask;
93562306a36Sopenharmony_ci	u8 value;
93662306a36Sopenharmony_ci};
93762306a36Sopenharmony_ci
93862306a36Sopenharmony_cienum rtw_chip_ver {
93962306a36Sopenharmony_ci	RTW_CHIP_VER_CUT_A = 0x00,
94062306a36Sopenharmony_ci	RTW_CHIP_VER_CUT_B = 0x01,
94162306a36Sopenharmony_ci	RTW_CHIP_VER_CUT_C = 0x02,
94262306a36Sopenharmony_ci	RTW_CHIP_VER_CUT_D = 0x03,
94362306a36Sopenharmony_ci	RTW_CHIP_VER_CUT_E = 0x04,
94462306a36Sopenharmony_ci	RTW_CHIP_VER_CUT_F = 0x05,
94562306a36Sopenharmony_ci	RTW_CHIP_VER_CUT_G = 0x06,
94662306a36Sopenharmony_ci};
94762306a36Sopenharmony_ci
94862306a36Sopenharmony_ci#define RTW_INTF_PHY_PLATFORM_ALL 0
94962306a36Sopenharmony_ci
95062306a36Sopenharmony_cienum rtw_intf_phy_cut {
95162306a36Sopenharmony_ci	RTW_INTF_PHY_CUT_A = BIT(0),
95262306a36Sopenharmony_ci	RTW_INTF_PHY_CUT_B = BIT(1),
95362306a36Sopenharmony_ci	RTW_INTF_PHY_CUT_C = BIT(2),
95462306a36Sopenharmony_ci	RTW_INTF_PHY_CUT_D = BIT(3),
95562306a36Sopenharmony_ci	RTW_INTF_PHY_CUT_E = BIT(4),
95662306a36Sopenharmony_ci	RTW_INTF_PHY_CUT_F = BIT(5),
95762306a36Sopenharmony_ci	RTW_INTF_PHY_CUT_G = BIT(6),
95862306a36Sopenharmony_ci	RTW_INTF_PHY_CUT_ALL = 0xFFFF,
95962306a36Sopenharmony_ci};
96062306a36Sopenharmony_ci
96162306a36Sopenharmony_cienum rtw_ip_sel {
96262306a36Sopenharmony_ci	RTW_IP_SEL_PHY = 0,
96362306a36Sopenharmony_ci	RTW_IP_SEL_MAC = 1,
96462306a36Sopenharmony_ci	RTW_IP_SEL_DBI = 2,
96562306a36Sopenharmony_ci
96662306a36Sopenharmony_ci	RTW_IP_SEL_UNDEF = 0xFFFF
96762306a36Sopenharmony_ci};
96862306a36Sopenharmony_ci
96962306a36Sopenharmony_cienum rtw_pq_map_id {
97062306a36Sopenharmony_ci	RTW_PQ_MAP_VO = 0x0,
97162306a36Sopenharmony_ci	RTW_PQ_MAP_VI = 0x1,
97262306a36Sopenharmony_ci	RTW_PQ_MAP_BE = 0x2,
97362306a36Sopenharmony_ci	RTW_PQ_MAP_BK = 0x3,
97462306a36Sopenharmony_ci	RTW_PQ_MAP_MG = 0x4,
97562306a36Sopenharmony_ci	RTW_PQ_MAP_HI = 0x5,
97662306a36Sopenharmony_ci	RTW_PQ_MAP_NUM = 0x6,
97762306a36Sopenharmony_ci
97862306a36Sopenharmony_ci	RTW_PQ_MAP_UNDEF,
97962306a36Sopenharmony_ci};
98062306a36Sopenharmony_ci
98162306a36Sopenharmony_cienum rtw_dma_mapping {
98262306a36Sopenharmony_ci	RTW_DMA_MAPPING_EXTRA	= 0,
98362306a36Sopenharmony_ci	RTW_DMA_MAPPING_LOW	= 1,
98462306a36Sopenharmony_ci	RTW_DMA_MAPPING_NORMAL	= 2,
98562306a36Sopenharmony_ci	RTW_DMA_MAPPING_HIGH	= 3,
98662306a36Sopenharmony_ci
98762306a36Sopenharmony_ci	RTW_DMA_MAPPING_MAX,
98862306a36Sopenharmony_ci	RTW_DMA_MAPPING_UNDEF,
98962306a36Sopenharmony_ci};
99062306a36Sopenharmony_ci
99162306a36Sopenharmony_cistruct rtw_rqpn {
99262306a36Sopenharmony_ci	enum rtw_dma_mapping dma_map_vo;
99362306a36Sopenharmony_ci	enum rtw_dma_mapping dma_map_vi;
99462306a36Sopenharmony_ci	enum rtw_dma_mapping dma_map_be;
99562306a36Sopenharmony_ci	enum rtw_dma_mapping dma_map_bk;
99662306a36Sopenharmony_ci	enum rtw_dma_mapping dma_map_mg;
99762306a36Sopenharmony_ci	enum rtw_dma_mapping dma_map_hi;
99862306a36Sopenharmony_ci};
99962306a36Sopenharmony_ci
100062306a36Sopenharmony_cistruct rtw_prioq_addr {
100162306a36Sopenharmony_ci	u32 rsvd;
100262306a36Sopenharmony_ci	u32 avail;
100362306a36Sopenharmony_ci};
100462306a36Sopenharmony_ci
100562306a36Sopenharmony_cistruct rtw_prioq_addrs {
100662306a36Sopenharmony_ci	struct rtw_prioq_addr prio[RTW_DMA_MAPPING_MAX];
100762306a36Sopenharmony_ci	bool wsize;
100862306a36Sopenharmony_ci};
100962306a36Sopenharmony_ci
101062306a36Sopenharmony_cistruct rtw_page_table {
101162306a36Sopenharmony_ci	u16 hq_num;
101262306a36Sopenharmony_ci	u16 nq_num;
101362306a36Sopenharmony_ci	u16 lq_num;
101462306a36Sopenharmony_ci	u16 exq_num;
101562306a36Sopenharmony_ci	u16 gapq_num;
101662306a36Sopenharmony_ci};
101762306a36Sopenharmony_ci
101862306a36Sopenharmony_cistruct rtw_intf_phy_para {
101962306a36Sopenharmony_ci	u16 offset;
102062306a36Sopenharmony_ci	u16 value;
102162306a36Sopenharmony_ci	u16 ip_sel;
102262306a36Sopenharmony_ci	u16 cut_mask;
102362306a36Sopenharmony_ci	u16 platform;
102462306a36Sopenharmony_ci};
102562306a36Sopenharmony_ci
102662306a36Sopenharmony_cistruct rtw_wow_pattern {
102762306a36Sopenharmony_ci	u16 crc;
102862306a36Sopenharmony_ci	u8 type;
102962306a36Sopenharmony_ci	u8 valid;
103062306a36Sopenharmony_ci	u8 mask[RTW_MAX_PATTERN_MASK_SIZE];
103162306a36Sopenharmony_ci};
103262306a36Sopenharmony_ci
103362306a36Sopenharmony_cistruct rtw_pno_request {
103462306a36Sopenharmony_ci	bool inited;
103562306a36Sopenharmony_ci	u32 match_set_cnt;
103662306a36Sopenharmony_ci	struct cfg80211_match_set *match_sets;
103762306a36Sopenharmony_ci	u8 channel_cnt;
103862306a36Sopenharmony_ci	struct ieee80211_channel *channels;
103962306a36Sopenharmony_ci	struct cfg80211_sched_scan_plan scan_plan;
104062306a36Sopenharmony_ci};
104162306a36Sopenharmony_ci
104262306a36Sopenharmony_cistruct rtw_wow_param {
104362306a36Sopenharmony_ci	struct ieee80211_vif *wow_vif;
104462306a36Sopenharmony_ci	DECLARE_BITMAP(flags, RTW_WOW_FLAG_MAX);
104562306a36Sopenharmony_ci	u8 txpause;
104662306a36Sopenharmony_ci	u8 pattern_cnt;
104762306a36Sopenharmony_ci	struct rtw_wow_pattern patterns[RTW_MAX_PATTERN_NUM];
104862306a36Sopenharmony_ci
104962306a36Sopenharmony_ci	bool ips_enabled;
105062306a36Sopenharmony_ci	struct rtw_pno_request pno_req;
105162306a36Sopenharmony_ci};
105262306a36Sopenharmony_ci
105362306a36Sopenharmony_cistruct rtw_intf_phy_para_table {
105462306a36Sopenharmony_ci	const struct rtw_intf_phy_para *usb2_para;
105562306a36Sopenharmony_ci	const struct rtw_intf_phy_para *usb3_para;
105662306a36Sopenharmony_ci	const struct rtw_intf_phy_para *gen1_para;
105762306a36Sopenharmony_ci	const struct rtw_intf_phy_para *gen2_para;
105862306a36Sopenharmony_ci	u8 n_usb2_para;
105962306a36Sopenharmony_ci	u8 n_usb3_para;
106062306a36Sopenharmony_ci	u8 n_gen1_para;
106162306a36Sopenharmony_ci	u8 n_gen2_para;
106262306a36Sopenharmony_ci};
106362306a36Sopenharmony_ci
106462306a36Sopenharmony_cistruct rtw_table {
106562306a36Sopenharmony_ci	const void *data;
106662306a36Sopenharmony_ci	const u32 size;
106762306a36Sopenharmony_ci	void (*parse)(struct rtw_dev *rtwdev, const struct rtw_table *tbl);
106862306a36Sopenharmony_ci	void (*do_cfg)(struct rtw_dev *rtwdev, const struct rtw_table *tbl,
106962306a36Sopenharmony_ci		       u32 addr, u32 data);
107062306a36Sopenharmony_ci	enum rtw_rf_path rf_path;
107162306a36Sopenharmony_ci};
107262306a36Sopenharmony_ci
107362306a36Sopenharmony_cistatic inline void rtw_load_table(struct rtw_dev *rtwdev,
107462306a36Sopenharmony_ci				  const struct rtw_table *tbl)
107562306a36Sopenharmony_ci{
107662306a36Sopenharmony_ci	(*tbl->parse)(rtwdev, tbl);
107762306a36Sopenharmony_ci}
107862306a36Sopenharmony_ci
107962306a36Sopenharmony_cienum rtw_rfe_fem {
108062306a36Sopenharmony_ci	RTW_RFE_IFEM,
108162306a36Sopenharmony_ci	RTW_RFE_EFEM,
108262306a36Sopenharmony_ci	RTW_RFE_IFEM2G_EFEM5G,
108362306a36Sopenharmony_ci	RTW_RFE_NUM,
108462306a36Sopenharmony_ci};
108562306a36Sopenharmony_ci
108662306a36Sopenharmony_cistruct rtw_rfe_def {
108762306a36Sopenharmony_ci	const struct rtw_table *phy_pg_tbl;
108862306a36Sopenharmony_ci	const struct rtw_table *txpwr_lmt_tbl;
108962306a36Sopenharmony_ci	const struct rtw_table *agc_btg_tbl;
109062306a36Sopenharmony_ci};
109162306a36Sopenharmony_ci
109262306a36Sopenharmony_ci#define RTW_DEF_RFE(chip, bb_pg, pwrlmt) {				  \
109362306a36Sopenharmony_ci	.phy_pg_tbl = &rtw ## chip ## _bb_pg_type ## bb_pg ## _tbl,	  \
109462306a36Sopenharmony_ci	.txpwr_lmt_tbl = &rtw ## chip ## _txpwr_lmt_type ## pwrlmt ## _tbl, \
109562306a36Sopenharmony_ci	}
109662306a36Sopenharmony_ci
109762306a36Sopenharmony_ci#define RTW_DEF_RFE_EXT(chip, bb_pg, pwrlmt, btg) {			  \
109862306a36Sopenharmony_ci	.phy_pg_tbl = &rtw ## chip ## _bb_pg_type ## bb_pg ## _tbl,	  \
109962306a36Sopenharmony_ci	.txpwr_lmt_tbl = &rtw ## chip ## _txpwr_lmt_type ## pwrlmt ## _tbl, \
110062306a36Sopenharmony_ci	.agc_btg_tbl = &rtw ## chip ## _agc_btg_type ## btg ## _tbl, \
110162306a36Sopenharmony_ci	}
110262306a36Sopenharmony_ci
110362306a36Sopenharmony_ci#define RTW_PWR_TRK_5G_1		0
110462306a36Sopenharmony_ci#define RTW_PWR_TRK_5G_2		1
110562306a36Sopenharmony_ci#define RTW_PWR_TRK_5G_3		2
110662306a36Sopenharmony_ci#define RTW_PWR_TRK_5G_NUM		3
110762306a36Sopenharmony_ci
110862306a36Sopenharmony_ci#define RTW_PWR_TRK_TBL_SZ		30
110962306a36Sopenharmony_ci
111062306a36Sopenharmony_ci/* This table stores the values of TX power that will be adjusted by power
111162306a36Sopenharmony_ci * tracking.
111262306a36Sopenharmony_ci *
111362306a36Sopenharmony_ci * For 5G bands, there are 3 different settings.
111462306a36Sopenharmony_ci * For 2G there are cck rate and ofdm rate with different settings.
111562306a36Sopenharmony_ci */
111662306a36Sopenharmony_cistruct rtw_pwr_track_tbl {
111762306a36Sopenharmony_ci	const u8 *pwrtrk_5gb_n[RTW_PWR_TRK_5G_NUM];
111862306a36Sopenharmony_ci	const u8 *pwrtrk_5gb_p[RTW_PWR_TRK_5G_NUM];
111962306a36Sopenharmony_ci	const u8 *pwrtrk_5ga_n[RTW_PWR_TRK_5G_NUM];
112062306a36Sopenharmony_ci	const u8 *pwrtrk_5ga_p[RTW_PWR_TRK_5G_NUM];
112162306a36Sopenharmony_ci	const u8 *pwrtrk_2gb_n;
112262306a36Sopenharmony_ci	const u8 *pwrtrk_2gb_p;
112362306a36Sopenharmony_ci	const u8 *pwrtrk_2ga_n;
112462306a36Sopenharmony_ci	const u8 *pwrtrk_2ga_p;
112562306a36Sopenharmony_ci	const u8 *pwrtrk_2g_cckb_n;
112662306a36Sopenharmony_ci	const u8 *pwrtrk_2g_cckb_p;
112762306a36Sopenharmony_ci	const u8 *pwrtrk_2g_ccka_n;
112862306a36Sopenharmony_ci	const u8 *pwrtrk_2g_ccka_p;
112962306a36Sopenharmony_ci	const s8 *pwrtrk_xtal_n;
113062306a36Sopenharmony_ci	const s8 *pwrtrk_xtal_p;
113162306a36Sopenharmony_ci};
113262306a36Sopenharmony_ci
113362306a36Sopenharmony_cienum rtw_wlan_cpu {
113462306a36Sopenharmony_ci	RTW_WCPU_11AC,
113562306a36Sopenharmony_ci	RTW_WCPU_11N,
113662306a36Sopenharmony_ci};
113762306a36Sopenharmony_ci
113862306a36Sopenharmony_cienum rtw_fw_fifo_sel {
113962306a36Sopenharmony_ci	RTW_FW_FIFO_SEL_TX,
114062306a36Sopenharmony_ci	RTW_FW_FIFO_SEL_RX,
114162306a36Sopenharmony_ci	RTW_FW_FIFO_SEL_RSVD_PAGE,
114262306a36Sopenharmony_ci	RTW_FW_FIFO_SEL_REPORT,
114362306a36Sopenharmony_ci	RTW_FW_FIFO_SEL_LLT,
114462306a36Sopenharmony_ci	RTW_FW_FIFO_SEL_RXBUF_FW,
114562306a36Sopenharmony_ci
114662306a36Sopenharmony_ci	RTW_FW_FIFO_MAX,
114762306a36Sopenharmony_ci};
114862306a36Sopenharmony_ci
114962306a36Sopenharmony_cienum rtw_fwcd_item {
115062306a36Sopenharmony_ci	RTW_FWCD_TLV,
115162306a36Sopenharmony_ci	RTW_FWCD_REG,
115262306a36Sopenharmony_ci	RTW_FWCD_ROM,
115362306a36Sopenharmony_ci	RTW_FWCD_IMEM,
115462306a36Sopenharmony_ci	RTW_FWCD_DMEM,
115562306a36Sopenharmony_ci	RTW_FWCD_EMEM,
115662306a36Sopenharmony_ci};
115762306a36Sopenharmony_ci
115862306a36Sopenharmony_ci/* hardware configuration for each IC */
115962306a36Sopenharmony_cistruct rtw_chip_info {
116062306a36Sopenharmony_ci	struct rtw_chip_ops *ops;
116162306a36Sopenharmony_ci	u8 id;
116262306a36Sopenharmony_ci
116362306a36Sopenharmony_ci	const char *fw_name;
116462306a36Sopenharmony_ci	enum rtw_wlan_cpu wlan_cpu;
116562306a36Sopenharmony_ci	u8 tx_pkt_desc_sz;
116662306a36Sopenharmony_ci	u8 tx_buf_desc_sz;
116762306a36Sopenharmony_ci	u8 rx_pkt_desc_sz;
116862306a36Sopenharmony_ci	u8 rx_buf_desc_sz;
116962306a36Sopenharmony_ci	u32 phy_efuse_size;
117062306a36Sopenharmony_ci	u32 log_efuse_size;
117162306a36Sopenharmony_ci	u32 ptct_efuse_size;
117262306a36Sopenharmony_ci	u32 txff_size;
117362306a36Sopenharmony_ci	u32 rxff_size;
117462306a36Sopenharmony_ci	u32 fw_rxff_size;
117562306a36Sopenharmony_ci	u16 rsvd_drv_pg_num;
117662306a36Sopenharmony_ci	u8 band;
117762306a36Sopenharmony_ci	u8 page_size;
117862306a36Sopenharmony_ci	u8 csi_buf_pg_num;
117962306a36Sopenharmony_ci	u8 dig_max;
118062306a36Sopenharmony_ci	u8 dig_min;
118162306a36Sopenharmony_ci	u8 txgi_factor;
118262306a36Sopenharmony_ci	bool is_pwr_by_rate_dec;
118362306a36Sopenharmony_ci	bool rx_ldpc;
118462306a36Sopenharmony_ci	bool tx_stbc;
118562306a36Sopenharmony_ci	u8 max_power_index;
118662306a36Sopenharmony_ci	u8 ampdu_density;
118762306a36Sopenharmony_ci
118862306a36Sopenharmony_ci	u16 fw_fifo_addr[RTW_FW_FIFO_MAX];
118962306a36Sopenharmony_ci	const struct rtw_fwcd_segs *fwcd_segs;
119062306a36Sopenharmony_ci
119162306a36Sopenharmony_ci	u8 default_1ss_tx_path;
119262306a36Sopenharmony_ci
119362306a36Sopenharmony_ci	bool path_div_supported;
119462306a36Sopenharmony_ci	bool ht_supported;
119562306a36Sopenharmony_ci	bool vht_supported;
119662306a36Sopenharmony_ci	u8 lps_deep_mode_supported;
119762306a36Sopenharmony_ci
119862306a36Sopenharmony_ci	/* init values */
119962306a36Sopenharmony_ci	u8 sys_func_en;
120062306a36Sopenharmony_ci	const struct rtw_pwr_seq_cmd **pwr_on_seq;
120162306a36Sopenharmony_ci	const struct rtw_pwr_seq_cmd **pwr_off_seq;
120262306a36Sopenharmony_ci	const struct rtw_rqpn *rqpn_table;
120362306a36Sopenharmony_ci	const struct rtw_prioq_addrs *prioq_addrs;
120462306a36Sopenharmony_ci	const struct rtw_page_table *page_table;
120562306a36Sopenharmony_ci	const struct rtw_intf_phy_para_table *intf_table;
120662306a36Sopenharmony_ci
120762306a36Sopenharmony_ci	const struct rtw_hw_reg *dig;
120862306a36Sopenharmony_ci	const struct rtw_hw_reg *dig_cck;
120962306a36Sopenharmony_ci	u32 rf_base_addr[2];
121062306a36Sopenharmony_ci	u32 rf_sipi_addr[2];
121162306a36Sopenharmony_ci	const struct rtw_rf_sipi_addr *rf_sipi_read_addr;
121262306a36Sopenharmony_ci	u8 fix_rf_phy_num;
121362306a36Sopenharmony_ci	const struct rtw_ltecoex_addr *ltecoex_addr;
121462306a36Sopenharmony_ci
121562306a36Sopenharmony_ci	const struct rtw_table *mac_tbl;
121662306a36Sopenharmony_ci	const struct rtw_table *agc_tbl;
121762306a36Sopenharmony_ci	const struct rtw_table *bb_tbl;
121862306a36Sopenharmony_ci	const struct rtw_table *rf_tbl[RTW_RF_PATH_MAX];
121962306a36Sopenharmony_ci	const struct rtw_table *rfk_init_tbl;
122062306a36Sopenharmony_ci
122162306a36Sopenharmony_ci	const struct rtw_rfe_def *rfe_defs;
122262306a36Sopenharmony_ci	u32 rfe_defs_size;
122362306a36Sopenharmony_ci
122462306a36Sopenharmony_ci	bool en_dis_dpd;
122562306a36Sopenharmony_ci	u16 dpd_ratemask;
122662306a36Sopenharmony_ci	u8 iqk_threshold;
122762306a36Sopenharmony_ci	u8 lck_threshold;
122862306a36Sopenharmony_ci	const struct rtw_pwr_track_tbl *pwr_track_tbl;
122962306a36Sopenharmony_ci
123062306a36Sopenharmony_ci	u8 bfer_su_max_num;
123162306a36Sopenharmony_ci	u8 bfer_mu_max_num;
123262306a36Sopenharmony_ci
123362306a36Sopenharmony_ci	struct rtw_hw_reg_offset *edcca_th;
123462306a36Sopenharmony_ci	s8 l2h_th_ini_cs;
123562306a36Sopenharmony_ci	s8 l2h_th_ini_ad;
123662306a36Sopenharmony_ci
123762306a36Sopenharmony_ci	const char *wow_fw_name;
123862306a36Sopenharmony_ci	const struct wiphy_wowlan_support *wowlan_stub;
123962306a36Sopenharmony_ci	const u8 max_sched_scan_ssids;
124062306a36Sopenharmony_ci	const u16 max_scan_ie_len;
124162306a36Sopenharmony_ci
124262306a36Sopenharmony_ci	/* coex paras */
124362306a36Sopenharmony_ci	u32 coex_para_ver;
124462306a36Sopenharmony_ci	u8 bt_desired_ver;
124562306a36Sopenharmony_ci	bool scbd_support;
124662306a36Sopenharmony_ci	bool new_scbd10_def; /* true: fix 2M(8822c) */
124762306a36Sopenharmony_ci	bool ble_hid_profile_support;
124862306a36Sopenharmony_ci	bool wl_mimo_ps_support;
124962306a36Sopenharmony_ci	u8 pstdma_type; /* 0: LPSoff, 1:LPSon */
125062306a36Sopenharmony_ci	u8 bt_rssi_type;
125162306a36Sopenharmony_ci	u8 ant_isolation;
125262306a36Sopenharmony_ci	u8 rssi_tolerance;
125362306a36Sopenharmony_ci	u8 table_sant_num;
125462306a36Sopenharmony_ci	u8 table_nsant_num;
125562306a36Sopenharmony_ci	u8 tdma_sant_num;
125662306a36Sopenharmony_ci	u8 tdma_nsant_num;
125762306a36Sopenharmony_ci	u8 bt_afh_span_bw20;
125862306a36Sopenharmony_ci	u8 bt_afh_span_bw40;
125962306a36Sopenharmony_ci	u8 afh_5g_num;
126062306a36Sopenharmony_ci	u8 wl_rf_para_num;
126162306a36Sopenharmony_ci	u8 coex_info_hw_regs_num;
126262306a36Sopenharmony_ci	const u8 *bt_rssi_step;
126362306a36Sopenharmony_ci	const u8 *wl_rssi_step;
126462306a36Sopenharmony_ci	const struct coex_table_para *table_nsant;
126562306a36Sopenharmony_ci	const struct coex_table_para *table_sant;
126662306a36Sopenharmony_ci	const struct coex_tdma_para *tdma_sant;
126762306a36Sopenharmony_ci	const struct coex_tdma_para *tdma_nsant;
126862306a36Sopenharmony_ci	const struct coex_rf_para *wl_rf_para_tx;
126962306a36Sopenharmony_ci	const struct coex_rf_para *wl_rf_para_rx;
127062306a36Sopenharmony_ci	const struct coex_5g_afh_map *afh_5g;
127162306a36Sopenharmony_ci	const struct rtw_hw_reg *btg_reg;
127262306a36Sopenharmony_ci	const struct rtw_reg_domain *coex_info_hw_regs;
127362306a36Sopenharmony_ci	u32 wl_fw_desired_ver;
127462306a36Sopenharmony_ci};
127562306a36Sopenharmony_ci
127662306a36Sopenharmony_cienum rtw_coex_bt_state_cnt {
127762306a36Sopenharmony_ci	COEX_CNT_BT_RETRY,
127862306a36Sopenharmony_ci	COEX_CNT_BT_REINIT,
127962306a36Sopenharmony_ci	COEX_CNT_BT_REENABLE,
128062306a36Sopenharmony_ci	COEX_CNT_BT_POPEVENT,
128162306a36Sopenharmony_ci	COEX_CNT_BT_SETUPLINK,
128262306a36Sopenharmony_ci	COEX_CNT_BT_IGNWLANACT,
128362306a36Sopenharmony_ci	COEX_CNT_BT_INQ,
128462306a36Sopenharmony_ci	COEX_CNT_BT_PAGE,
128562306a36Sopenharmony_ci	COEX_CNT_BT_ROLESWITCH,
128662306a36Sopenharmony_ci	COEX_CNT_BT_AFHUPDATE,
128762306a36Sopenharmony_ci	COEX_CNT_BT_INFOUPDATE,
128862306a36Sopenharmony_ci	COEX_CNT_BT_IQK,
128962306a36Sopenharmony_ci	COEX_CNT_BT_IQKFAIL,
129062306a36Sopenharmony_ci
129162306a36Sopenharmony_ci	COEX_CNT_BT_MAX
129262306a36Sopenharmony_ci};
129362306a36Sopenharmony_ci
129462306a36Sopenharmony_cienum rtw_coex_wl_state_cnt {
129562306a36Sopenharmony_ci	COEX_CNT_WL_SCANAP,
129662306a36Sopenharmony_ci	COEX_CNT_WL_CONNPKT,
129762306a36Sopenharmony_ci	COEX_CNT_WL_COEXRUN,
129862306a36Sopenharmony_ci	COEX_CNT_WL_NOISY0,
129962306a36Sopenharmony_ci	COEX_CNT_WL_NOISY1,
130062306a36Sopenharmony_ci	COEX_CNT_WL_NOISY2,
130162306a36Sopenharmony_ci	COEX_CNT_WL_5MS_NOEXTEND,
130262306a36Sopenharmony_ci	COEX_CNT_WL_FW_NOTIFY,
130362306a36Sopenharmony_ci
130462306a36Sopenharmony_ci	COEX_CNT_WL_MAX
130562306a36Sopenharmony_ci};
130662306a36Sopenharmony_ci
130762306a36Sopenharmony_cistruct rtw_coex_rfe {
130862306a36Sopenharmony_ci	bool ant_switch_exist;
130962306a36Sopenharmony_ci	bool ant_switch_diversity;
131062306a36Sopenharmony_ci	bool ant_switch_with_bt;
131162306a36Sopenharmony_ci	u8 rfe_module_type;
131262306a36Sopenharmony_ci	u8 ant_switch_polarity;
131362306a36Sopenharmony_ci
131462306a36Sopenharmony_ci	/* true if WLG at BTG, else at WLAG */
131562306a36Sopenharmony_ci	bool wlg_at_btg;
131662306a36Sopenharmony_ci};
131762306a36Sopenharmony_ci
131862306a36Sopenharmony_ci#define COEX_WL_TDMA_PARA_LENGTH	5
131962306a36Sopenharmony_ci
132062306a36Sopenharmony_cistruct rtw_coex_dm {
132162306a36Sopenharmony_ci	bool cur_ps_tdma_on;
132262306a36Sopenharmony_ci	bool cur_wl_rx_low_gain_en;
132362306a36Sopenharmony_ci	bool ignore_wl_act;
132462306a36Sopenharmony_ci
132562306a36Sopenharmony_ci	u8 reason;
132662306a36Sopenharmony_ci	u8 bt_rssi_state[4];
132762306a36Sopenharmony_ci	u8 wl_rssi_state[4];
132862306a36Sopenharmony_ci	u8 wl_ch_info[3];
132962306a36Sopenharmony_ci	u8 cur_ps_tdma;
133062306a36Sopenharmony_ci	u8 cur_table;
133162306a36Sopenharmony_ci	u8 ps_tdma_para[5];
133262306a36Sopenharmony_ci	u8 cur_bt_pwr_lvl;
133362306a36Sopenharmony_ci	u8 cur_bt_lna_lvl;
133462306a36Sopenharmony_ci	u8 cur_wl_pwr_lvl;
133562306a36Sopenharmony_ci	u8 bt_status;
133662306a36Sopenharmony_ci	u32 cur_ant_pos_type;
133762306a36Sopenharmony_ci	u32 cur_switch_status;
133862306a36Sopenharmony_ci	u32 setting_tdma;
133962306a36Sopenharmony_ci	u8 fw_tdma_para[COEX_WL_TDMA_PARA_LENGTH];
134062306a36Sopenharmony_ci};
134162306a36Sopenharmony_ci
134262306a36Sopenharmony_ci#define COEX_BTINFO_SRC_WL_FW	0x0
134362306a36Sopenharmony_ci#define COEX_BTINFO_SRC_BT_RSP	0x1
134462306a36Sopenharmony_ci#define COEX_BTINFO_SRC_BT_ACT	0x2
134562306a36Sopenharmony_ci#define COEX_BTINFO_SRC_BT_IQK	0x3
134662306a36Sopenharmony_ci#define COEX_BTINFO_SRC_BT_SCBD	0x4
134762306a36Sopenharmony_ci#define COEX_BTINFO_SRC_H2C60	0x5
134862306a36Sopenharmony_ci#define COEX_BTINFO_SRC_MAX	0x6
134962306a36Sopenharmony_ci
135062306a36Sopenharmony_ci#define COEX_INFO_FTP		BIT(7)
135162306a36Sopenharmony_ci#define COEX_INFO_A2DP		BIT(6)
135262306a36Sopenharmony_ci#define COEX_INFO_HID		BIT(5)
135362306a36Sopenharmony_ci#define COEX_INFO_SCO_BUSY	BIT(4)
135462306a36Sopenharmony_ci#define COEX_INFO_ACL_BUSY	BIT(3)
135562306a36Sopenharmony_ci#define COEX_INFO_INQ_PAGE	BIT(2)
135662306a36Sopenharmony_ci#define COEX_INFO_SCO_ESCO	BIT(1)
135762306a36Sopenharmony_ci#define COEX_INFO_CONNECTION	BIT(0)
135862306a36Sopenharmony_ci#define COEX_BTINFO_LENGTH_MAX	10
135962306a36Sopenharmony_ci#define COEX_BTINFO_LENGTH	7
136062306a36Sopenharmony_ci
136162306a36Sopenharmony_ci#define COEX_BT_HIDINFO_LIST	0x0
136262306a36Sopenharmony_ci#define COEX_BT_HIDINFO_A	0x1
136362306a36Sopenharmony_ci#define COEX_BT_HIDINFO_NAME	3
136462306a36Sopenharmony_ci
136562306a36Sopenharmony_ci#define COEX_BT_HIDINFO_LENGTH	6
136662306a36Sopenharmony_ci#define COEX_BT_HIDINFO_HANDLE_NUM	4
136762306a36Sopenharmony_ci#define COEX_BT_HIDINFO_C2H_HANDLE	0
136862306a36Sopenharmony_ci#define COEX_BT_HIDINFO_C2H_VENDOR	1
136962306a36Sopenharmony_ci#define COEX_BT_BLE_HANDLE_THRS	0x10
137062306a36Sopenharmony_ci#define COEX_BT_HIDINFO_NOTCON	0xff
137162306a36Sopenharmony_ci
137262306a36Sopenharmony_cistruct rtw_coex_hid {
137362306a36Sopenharmony_ci	u8 hid_handle;
137462306a36Sopenharmony_ci	u8 hid_vendor;
137562306a36Sopenharmony_ci	u8 hid_name[COEX_BT_HIDINFO_NAME];
137662306a36Sopenharmony_ci	bool hid_info_completed;
137762306a36Sopenharmony_ci	bool is_game_hid;
137862306a36Sopenharmony_ci};
137962306a36Sopenharmony_ci
138062306a36Sopenharmony_cistruct rtw_coex_hid_handle_list {
138162306a36Sopenharmony_ci	u8 cmd_id;
138262306a36Sopenharmony_ci	u8 len;
138362306a36Sopenharmony_ci	u8 subid;
138462306a36Sopenharmony_ci	u8 handle_cnt;
138562306a36Sopenharmony_ci	u8 handle[COEX_BT_HIDINFO_HANDLE_NUM];
138662306a36Sopenharmony_ci} __packed;
138762306a36Sopenharmony_ci
138862306a36Sopenharmony_cistruct rtw_coex_hid_info_a {
138962306a36Sopenharmony_ci	u8 cmd_id;
139062306a36Sopenharmony_ci	u8 len;
139162306a36Sopenharmony_ci	u8 subid;
139262306a36Sopenharmony_ci	u8 handle;
139362306a36Sopenharmony_ci	u8 vendor;
139462306a36Sopenharmony_ci	u8 name[COEX_BT_HIDINFO_NAME];
139562306a36Sopenharmony_ci} __packed;
139662306a36Sopenharmony_ci
139762306a36Sopenharmony_cistruct rtw_coex_stat {
139862306a36Sopenharmony_ci	bool bt_disabled;
139962306a36Sopenharmony_ci	bool bt_disabled_pre;
140062306a36Sopenharmony_ci	bool bt_link_exist;
140162306a36Sopenharmony_ci	bool bt_whck_test;
140262306a36Sopenharmony_ci	bool bt_inq_page;
140362306a36Sopenharmony_ci	bool bt_inq_remain;
140462306a36Sopenharmony_ci	bool bt_inq;
140562306a36Sopenharmony_ci	bool bt_page;
140662306a36Sopenharmony_ci	bool bt_ble_voice;
140762306a36Sopenharmony_ci	bool bt_ble_exist;
140862306a36Sopenharmony_ci	bool bt_hfp_exist;
140962306a36Sopenharmony_ci	bool bt_a2dp_exist;
141062306a36Sopenharmony_ci	bool bt_hid_exist;
141162306a36Sopenharmony_ci	bool bt_pan_exist; /* PAN or OPP */
141262306a36Sopenharmony_ci	bool bt_opp_exist; /* OPP only */
141362306a36Sopenharmony_ci	bool bt_acl_busy;
141462306a36Sopenharmony_ci	bool bt_fix_2M;
141562306a36Sopenharmony_ci	bool bt_setup_link;
141662306a36Sopenharmony_ci	bool bt_multi_link;
141762306a36Sopenharmony_ci	bool bt_multi_link_pre;
141862306a36Sopenharmony_ci	bool bt_multi_link_remain;
141962306a36Sopenharmony_ci	bool bt_a2dp_sink;
142062306a36Sopenharmony_ci	bool bt_a2dp_active;
142162306a36Sopenharmony_ci	bool bt_reenable;
142262306a36Sopenharmony_ci	bool bt_ble_scan_en;
142362306a36Sopenharmony_ci	bool bt_init_scan;
142462306a36Sopenharmony_ci	bool bt_slave;
142562306a36Sopenharmony_ci	bool bt_418_hid_exist;
142662306a36Sopenharmony_ci	bool bt_ble_hid_exist;
142762306a36Sopenharmony_ci	bool bt_game_hid_exist;
142862306a36Sopenharmony_ci	bool bt_hid_handle_cnt;
142962306a36Sopenharmony_ci	bool bt_mailbox_reply;
143062306a36Sopenharmony_ci
143162306a36Sopenharmony_ci	bool wl_under_lps;
143262306a36Sopenharmony_ci	bool wl_under_ips;
143362306a36Sopenharmony_ci	bool wl_hi_pri_task1;
143462306a36Sopenharmony_ci	bool wl_hi_pri_task2;
143562306a36Sopenharmony_ci	bool wl_force_lps_ctrl;
143662306a36Sopenharmony_ci	bool wl_gl_busy;
143762306a36Sopenharmony_ci	bool wl_linkscan_proc;
143862306a36Sopenharmony_ci	bool wl_ps_state_fail;
143962306a36Sopenharmony_ci	bool wl_tx_limit_en;
144062306a36Sopenharmony_ci	bool wl_ampdu_limit_en;
144162306a36Sopenharmony_ci	bool wl_connected;
144262306a36Sopenharmony_ci	bool wl_slot_extend;
144362306a36Sopenharmony_ci	bool wl_cck_lock;
144462306a36Sopenharmony_ci	bool wl_cck_lock_pre;
144562306a36Sopenharmony_ci	bool wl_cck_lock_ever;
144662306a36Sopenharmony_ci	bool wl_connecting;
144762306a36Sopenharmony_ci	bool wl_slot_toggle;
144862306a36Sopenharmony_ci	bool wl_slot_toggle_change; /* if toggle to no-toggle */
144962306a36Sopenharmony_ci	bool wl_mimo_ps;
145062306a36Sopenharmony_ci
145162306a36Sopenharmony_ci	u32 bt_supported_version;
145262306a36Sopenharmony_ci	u32 bt_supported_feature;
145362306a36Sopenharmony_ci	u32 hi_pri_tx;
145462306a36Sopenharmony_ci	u32 hi_pri_rx;
145562306a36Sopenharmony_ci	u32 lo_pri_tx;
145662306a36Sopenharmony_ci	u32 lo_pri_rx;
145762306a36Sopenharmony_ci	u32 patch_ver;
145862306a36Sopenharmony_ci	u16 bt_reg_vendor_ae;
145962306a36Sopenharmony_ci	u16 bt_reg_vendor_ac;
146062306a36Sopenharmony_ci	s8 bt_rssi;
146162306a36Sopenharmony_ci	u8 kt_ver;
146262306a36Sopenharmony_ci	u8 gnt_workaround_state;
146362306a36Sopenharmony_ci	u8 tdma_timer_base;
146462306a36Sopenharmony_ci	u8 bt_profile_num;
146562306a36Sopenharmony_ci	u8 bt_info_c2h[COEX_BTINFO_SRC_MAX][COEX_BTINFO_LENGTH_MAX];
146662306a36Sopenharmony_ci	u8 bt_info_lb2;
146762306a36Sopenharmony_ci	u8 bt_info_lb3;
146862306a36Sopenharmony_ci	u8 bt_info_hb0;
146962306a36Sopenharmony_ci	u8 bt_info_hb1;
147062306a36Sopenharmony_ci	u8 bt_info_hb2;
147162306a36Sopenharmony_ci	u8 bt_info_hb3;
147262306a36Sopenharmony_ci	u8 bt_ble_scan_type;
147362306a36Sopenharmony_ci	u8 bt_hid_pair_num;
147462306a36Sopenharmony_ci	u8 bt_hid_slot;
147562306a36Sopenharmony_ci	u8 bt_a2dp_bitpool;
147662306a36Sopenharmony_ci	u8 bt_iqk_state;
147762306a36Sopenharmony_ci
147862306a36Sopenharmony_ci	u16 wl_beacon_interval;
147962306a36Sopenharmony_ci	u8 wl_noisy_level;
148062306a36Sopenharmony_ci	u8 wl_fw_dbg_info[10];
148162306a36Sopenharmony_ci	u8 wl_fw_dbg_info_pre[10];
148262306a36Sopenharmony_ci	u8 wl_rx_rate;
148362306a36Sopenharmony_ci	u8 wl_tx_rate;
148462306a36Sopenharmony_ci	u8 wl_rts_rx_rate;
148562306a36Sopenharmony_ci	u8 wl_coex_mode;
148662306a36Sopenharmony_ci	u8 wl_iot_peer;
148762306a36Sopenharmony_ci	u8 ampdu_max_time;
148862306a36Sopenharmony_ci	u8 wl_tput_dir;
148962306a36Sopenharmony_ci
149062306a36Sopenharmony_ci	u8 wl_toggle_para[6];
149162306a36Sopenharmony_ci	u8 wl_toggle_interval;
149262306a36Sopenharmony_ci
149362306a36Sopenharmony_ci	u16 score_board;
149462306a36Sopenharmony_ci	u16 retry_limit;
149562306a36Sopenharmony_ci
149662306a36Sopenharmony_ci	/* counters to record bt states */
149762306a36Sopenharmony_ci	u32 cnt_bt[COEX_CNT_BT_MAX];
149862306a36Sopenharmony_ci
149962306a36Sopenharmony_ci	/* counters to record wifi states */
150062306a36Sopenharmony_ci	u32 cnt_wl[COEX_CNT_WL_MAX];
150162306a36Sopenharmony_ci
150262306a36Sopenharmony_ci	/* counters to record bt c2h data */
150362306a36Sopenharmony_ci	u32 cnt_bt_info_c2h[COEX_BTINFO_SRC_MAX];
150462306a36Sopenharmony_ci
150562306a36Sopenharmony_ci	u32 darfrc;
150662306a36Sopenharmony_ci	u32 darfrch;
150762306a36Sopenharmony_ci
150862306a36Sopenharmony_ci	struct rtw_coex_hid hid_info[COEX_BT_HIDINFO_HANDLE_NUM];
150962306a36Sopenharmony_ci	struct rtw_coex_hid_handle_list hid_handle_list;
151062306a36Sopenharmony_ci};
151162306a36Sopenharmony_ci
151262306a36Sopenharmony_cistruct rtw_coex {
151362306a36Sopenharmony_ci	struct sk_buff_head queue;
151462306a36Sopenharmony_ci	wait_queue_head_t wait;
151562306a36Sopenharmony_ci
151662306a36Sopenharmony_ci	bool under_5g;
151762306a36Sopenharmony_ci	bool stop_dm;
151862306a36Sopenharmony_ci	bool freeze;
151962306a36Sopenharmony_ci	bool freerun;
152062306a36Sopenharmony_ci	bool wl_rf_off;
152162306a36Sopenharmony_ci	bool manual_control;
152262306a36Sopenharmony_ci
152362306a36Sopenharmony_ci	struct rtw_coex_stat stat;
152462306a36Sopenharmony_ci	struct rtw_coex_dm dm;
152562306a36Sopenharmony_ci	struct rtw_coex_rfe rfe;
152662306a36Sopenharmony_ci
152762306a36Sopenharmony_ci	struct delayed_work bt_relink_work;
152862306a36Sopenharmony_ci	struct delayed_work bt_reenable_work;
152962306a36Sopenharmony_ci	struct delayed_work defreeze_work;
153062306a36Sopenharmony_ci	struct delayed_work wl_remain_work;
153162306a36Sopenharmony_ci	struct delayed_work bt_remain_work;
153262306a36Sopenharmony_ci	struct delayed_work wl_connecting_work;
153362306a36Sopenharmony_ci	struct delayed_work bt_multi_link_remain_work;
153462306a36Sopenharmony_ci	struct delayed_work wl_ccklock_work;
153562306a36Sopenharmony_ci
153662306a36Sopenharmony_ci};
153762306a36Sopenharmony_ci
153862306a36Sopenharmony_ci#define DPK_RF_REG_NUM 7
153962306a36Sopenharmony_ci#define DPK_RF_PATH_NUM 2
154062306a36Sopenharmony_ci#define DPK_BB_REG_NUM 18
154162306a36Sopenharmony_ci#define DPK_CHANNEL_WIDTH_80 1
154262306a36Sopenharmony_ci
154362306a36Sopenharmony_ciDECLARE_EWMA(thermal, 10, 4);
154462306a36Sopenharmony_ci
154562306a36Sopenharmony_cistruct rtw_dpk_info {
154662306a36Sopenharmony_ci	bool is_dpk_pwr_on;
154762306a36Sopenharmony_ci	bool is_reload;
154862306a36Sopenharmony_ci
154962306a36Sopenharmony_ci	DECLARE_BITMAP(dpk_path_ok, DPK_RF_PATH_NUM);
155062306a36Sopenharmony_ci
155162306a36Sopenharmony_ci	u8 thermal_dpk[DPK_RF_PATH_NUM];
155262306a36Sopenharmony_ci	struct ewma_thermal avg_thermal[DPK_RF_PATH_NUM];
155362306a36Sopenharmony_ci
155462306a36Sopenharmony_ci	u32 gnt_control;
155562306a36Sopenharmony_ci	u32 gnt_value;
155662306a36Sopenharmony_ci
155762306a36Sopenharmony_ci	u8 result[RTW_RF_PATH_MAX];
155862306a36Sopenharmony_ci	u8 dpk_txagc[RTW_RF_PATH_MAX];
155962306a36Sopenharmony_ci	u32 coef[RTW_RF_PATH_MAX][20];
156062306a36Sopenharmony_ci	u16 dpk_gs[RTW_RF_PATH_MAX];
156162306a36Sopenharmony_ci	u8 thermal_dpk_delta[RTW_RF_PATH_MAX];
156262306a36Sopenharmony_ci	u8 pre_pwsf[RTW_RF_PATH_MAX];
156362306a36Sopenharmony_ci
156462306a36Sopenharmony_ci	u8 dpk_band;
156562306a36Sopenharmony_ci	u8 dpk_ch;
156662306a36Sopenharmony_ci	u8 dpk_bw;
156762306a36Sopenharmony_ci};
156862306a36Sopenharmony_ci
156962306a36Sopenharmony_cistruct rtw_phy_cck_pd_reg {
157062306a36Sopenharmony_ci	u32 reg_pd;
157162306a36Sopenharmony_ci	u32 mask_pd;
157262306a36Sopenharmony_ci	u32 reg_cs;
157362306a36Sopenharmony_ci	u32 mask_cs;
157462306a36Sopenharmony_ci};
157562306a36Sopenharmony_ci
157662306a36Sopenharmony_ci#define DACK_MSBK_BACKUP_NUM	0xf
157762306a36Sopenharmony_ci#define DACK_DCK_BACKUP_NUM	0x2
157862306a36Sopenharmony_ci
157962306a36Sopenharmony_cistruct rtw_swing_table {
158062306a36Sopenharmony_ci	const u8 *p[RTW_RF_PATH_MAX];
158162306a36Sopenharmony_ci	const u8 *n[RTW_RF_PATH_MAX];
158262306a36Sopenharmony_ci};
158362306a36Sopenharmony_ci
158462306a36Sopenharmony_cistruct rtw_pkt_count {
158562306a36Sopenharmony_ci	u16 num_bcn_pkt;
158662306a36Sopenharmony_ci	u16 num_qry_pkt[DESC_RATE_MAX];
158762306a36Sopenharmony_ci};
158862306a36Sopenharmony_ci
158962306a36Sopenharmony_ciDECLARE_EWMA(evm, 10, 4);
159062306a36Sopenharmony_ciDECLARE_EWMA(snr, 10, 4);
159162306a36Sopenharmony_ci
159262306a36Sopenharmony_cistruct rtw_iqk_info {
159362306a36Sopenharmony_ci	bool done;
159462306a36Sopenharmony_ci	struct {
159562306a36Sopenharmony_ci		u32 s1_x;
159662306a36Sopenharmony_ci		u32 s1_y;
159762306a36Sopenharmony_ci		u32 s0_x;
159862306a36Sopenharmony_ci		u32 s0_y;
159962306a36Sopenharmony_ci	} result;
160062306a36Sopenharmony_ci};
160162306a36Sopenharmony_ci
160262306a36Sopenharmony_cienum rtw_rf_band {
160362306a36Sopenharmony_ci	RF_BAND_2G_CCK,
160462306a36Sopenharmony_ci	RF_BAND_2G_OFDM,
160562306a36Sopenharmony_ci	RF_BAND_5G_L,
160662306a36Sopenharmony_ci	RF_BAND_5G_M,
160762306a36Sopenharmony_ci	RF_BAND_5G_H,
160862306a36Sopenharmony_ci	RF_BAND_MAX
160962306a36Sopenharmony_ci};
161062306a36Sopenharmony_ci
161162306a36Sopenharmony_ci#define RF_GAIN_NUM 11
161262306a36Sopenharmony_ci#define RF_HW_OFFSET_NUM 10
161362306a36Sopenharmony_ci
161462306a36Sopenharmony_cistruct rtw_gapk_info {
161562306a36Sopenharmony_ci	u32 rf3f_bp[RF_BAND_MAX][RF_GAIN_NUM][RTW_RF_PATH_MAX];
161662306a36Sopenharmony_ci	u32 rf3f_fs[RTW_RF_PATH_MAX][RF_GAIN_NUM];
161762306a36Sopenharmony_ci	bool txgapk_bp_done;
161862306a36Sopenharmony_ci	s8 offset[RF_GAIN_NUM][RTW_RF_PATH_MAX];
161962306a36Sopenharmony_ci	s8 fianl_offset[RF_GAIN_NUM][RTW_RF_PATH_MAX];
162062306a36Sopenharmony_ci	u8 read_txgain;
162162306a36Sopenharmony_ci	u8 channel;
162262306a36Sopenharmony_ci};
162362306a36Sopenharmony_ci
162462306a36Sopenharmony_ci#define EDCCA_TH_L2H_IDX 0
162562306a36Sopenharmony_ci#define EDCCA_TH_H2L_IDX 1
162662306a36Sopenharmony_ci#define EDCCA_TH_L2H_LB 48
162762306a36Sopenharmony_ci#define EDCCA_ADC_BACKOFF 12
162862306a36Sopenharmony_ci#define EDCCA_IGI_BASE 50
162962306a36Sopenharmony_ci#define EDCCA_IGI_L2H_DIFF 8
163062306a36Sopenharmony_ci#define EDCCA_L2H_H2L_DIFF 7
163162306a36Sopenharmony_ci#define EDCCA_L2H_H2L_DIFF_NORMAL 8
163262306a36Sopenharmony_ci
163362306a36Sopenharmony_cienum rtw_edcca_mode {
163462306a36Sopenharmony_ci	RTW_EDCCA_NORMAL	= 0,
163562306a36Sopenharmony_ci	RTW_EDCCA_ADAPTIVITY	= 1,
163662306a36Sopenharmony_ci};
163762306a36Sopenharmony_ci
163862306a36Sopenharmony_cistruct rtw_cfo_track {
163962306a36Sopenharmony_ci	bool is_adjust;
164062306a36Sopenharmony_ci	u8 crystal_cap;
164162306a36Sopenharmony_ci	s32 cfo_tail[RTW_RF_PATH_MAX];
164262306a36Sopenharmony_ci	s32 cfo_cnt[RTW_RF_PATH_MAX];
164362306a36Sopenharmony_ci	u32 packet_count;
164462306a36Sopenharmony_ci	u32 packet_count_pre;
164562306a36Sopenharmony_ci};
164662306a36Sopenharmony_ci
164762306a36Sopenharmony_ci#define RRSR_INIT_2G 0x15f
164862306a36Sopenharmony_ci#define RRSR_INIT_5G 0x150
164962306a36Sopenharmony_ci
165062306a36Sopenharmony_cienum rtw_dm_cap {
165162306a36Sopenharmony_ci	RTW_DM_CAP_NA,
165262306a36Sopenharmony_ci	RTW_DM_CAP_TXGAPK,
165362306a36Sopenharmony_ci	RTW_DM_CAP_NUM
165462306a36Sopenharmony_ci};
165562306a36Sopenharmony_ci
165662306a36Sopenharmony_cistruct rtw_dm_info {
165762306a36Sopenharmony_ci	u32 cck_fa_cnt;
165862306a36Sopenharmony_ci	u32 ofdm_fa_cnt;
165962306a36Sopenharmony_ci	u32 total_fa_cnt;
166062306a36Sopenharmony_ci	u32 cck_cca_cnt;
166162306a36Sopenharmony_ci	u32 ofdm_cca_cnt;
166262306a36Sopenharmony_ci	u32 total_cca_cnt;
166362306a36Sopenharmony_ci
166462306a36Sopenharmony_ci	u32 cck_ok_cnt;
166562306a36Sopenharmony_ci	u32 cck_err_cnt;
166662306a36Sopenharmony_ci	u32 ofdm_ok_cnt;
166762306a36Sopenharmony_ci	u32 ofdm_err_cnt;
166862306a36Sopenharmony_ci	u32 ht_ok_cnt;
166962306a36Sopenharmony_ci	u32 ht_err_cnt;
167062306a36Sopenharmony_ci	u32 vht_ok_cnt;
167162306a36Sopenharmony_ci	u32 vht_err_cnt;
167262306a36Sopenharmony_ci
167362306a36Sopenharmony_ci	u8 min_rssi;
167462306a36Sopenharmony_ci	u8 pre_min_rssi;
167562306a36Sopenharmony_ci	u16 fa_history[4];
167662306a36Sopenharmony_ci	u8 igi_history[4];
167762306a36Sopenharmony_ci	u8 igi_bitmap;
167862306a36Sopenharmony_ci	bool damping;
167962306a36Sopenharmony_ci	u8 damping_cnt;
168062306a36Sopenharmony_ci	u8 damping_rssi;
168162306a36Sopenharmony_ci
168262306a36Sopenharmony_ci	u8 cck_gi_u_bnd;
168362306a36Sopenharmony_ci	u8 cck_gi_l_bnd;
168462306a36Sopenharmony_ci
168562306a36Sopenharmony_ci	u8 fix_rate;
168662306a36Sopenharmony_ci	u8 tx_rate;
168762306a36Sopenharmony_ci	u32 rrsr_val_init;
168862306a36Sopenharmony_ci	u32 rrsr_mask_min;
168962306a36Sopenharmony_ci	u8 thermal_avg[RTW_RF_PATH_MAX];
169062306a36Sopenharmony_ci	u8 thermal_meter_k;
169162306a36Sopenharmony_ci	u8 thermal_meter_lck;
169262306a36Sopenharmony_ci	s8 delta_power_index[RTW_RF_PATH_MAX];
169362306a36Sopenharmony_ci	s8 delta_power_index_last[RTW_RF_PATH_MAX];
169462306a36Sopenharmony_ci	u8 default_ofdm_index;
169562306a36Sopenharmony_ci	bool pwr_trk_triggered;
169662306a36Sopenharmony_ci	bool pwr_trk_init_trigger;
169762306a36Sopenharmony_ci	struct ewma_thermal avg_thermal[RTW_RF_PATH_MAX];
169862306a36Sopenharmony_ci	s8 txagc_remnant_cck;
169962306a36Sopenharmony_ci	s8 txagc_remnant_ofdm;
170062306a36Sopenharmony_ci
170162306a36Sopenharmony_ci	/* backup dack results for each path and I/Q */
170262306a36Sopenharmony_ci	u32 dack_adck[RTW_RF_PATH_MAX];
170362306a36Sopenharmony_ci	u16 dack_msbk[RTW_RF_PATH_MAX][2][DACK_MSBK_BACKUP_NUM];
170462306a36Sopenharmony_ci	u8 dack_dck[RTW_RF_PATH_MAX][2][DACK_DCK_BACKUP_NUM];
170562306a36Sopenharmony_ci
170662306a36Sopenharmony_ci	struct rtw_dpk_info dpk_info;
170762306a36Sopenharmony_ci	struct rtw_cfo_track cfo_track;
170862306a36Sopenharmony_ci
170962306a36Sopenharmony_ci	/* [bandwidth 0:20M/1:40M][number of path] */
171062306a36Sopenharmony_ci	u8 cck_pd_lv[2][RTW_RF_PATH_MAX];
171162306a36Sopenharmony_ci	u32 cck_fa_avg;
171262306a36Sopenharmony_ci	u8 cck_pd_default;
171362306a36Sopenharmony_ci
171462306a36Sopenharmony_ci	/* save the last rx phy status for debug */
171562306a36Sopenharmony_ci	s8 rx_snr[RTW_RF_PATH_MAX];
171662306a36Sopenharmony_ci	u8 rx_evm_dbm[RTW_RF_PATH_MAX];
171762306a36Sopenharmony_ci	s16 cfo_tail[RTW_RF_PATH_MAX];
171862306a36Sopenharmony_ci	u8 rssi[RTW_RF_PATH_MAX];
171962306a36Sopenharmony_ci	u8 curr_rx_rate;
172062306a36Sopenharmony_ci	struct rtw_pkt_count cur_pkt_count;
172162306a36Sopenharmony_ci	struct rtw_pkt_count last_pkt_count;
172262306a36Sopenharmony_ci	struct ewma_evm ewma_evm[RTW_EVM_NUM];
172362306a36Sopenharmony_ci	struct ewma_snr ewma_snr[RTW_SNR_NUM];
172462306a36Sopenharmony_ci
172562306a36Sopenharmony_ci	u32 dm_flags; /* enum rtw_dm_cap */
172662306a36Sopenharmony_ci	struct rtw_iqk_info iqk;
172762306a36Sopenharmony_ci	struct rtw_gapk_info gapk;
172862306a36Sopenharmony_ci	bool is_bt_iqk_timeout;
172962306a36Sopenharmony_ci
173062306a36Sopenharmony_ci	s8 l2h_th_ini;
173162306a36Sopenharmony_ci	enum rtw_edcca_mode edcca_mode;
173262306a36Sopenharmony_ci	u8 scan_density;
173362306a36Sopenharmony_ci};
173462306a36Sopenharmony_ci
173562306a36Sopenharmony_cistruct rtw_efuse {
173662306a36Sopenharmony_ci	u32 size;
173762306a36Sopenharmony_ci	u32 physical_size;
173862306a36Sopenharmony_ci	u32 logical_size;
173962306a36Sopenharmony_ci	u32 protect_size;
174062306a36Sopenharmony_ci
174162306a36Sopenharmony_ci	u8 addr[ETH_ALEN];
174262306a36Sopenharmony_ci	u8 channel_plan;
174362306a36Sopenharmony_ci	u8 country_code[2];
174462306a36Sopenharmony_ci	u8 rf_board_option;
174562306a36Sopenharmony_ci	u8 rfe_option;
174662306a36Sopenharmony_ci	u8 power_track_type;
174762306a36Sopenharmony_ci	u8 thermal_meter[RTW_RF_PATH_MAX];
174862306a36Sopenharmony_ci	u8 thermal_meter_k;
174962306a36Sopenharmony_ci	u8 crystal_cap;
175062306a36Sopenharmony_ci	u8 ant_div_cfg;
175162306a36Sopenharmony_ci	u8 ant_div_type;
175262306a36Sopenharmony_ci	u8 regd;
175362306a36Sopenharmony_ci	u8 afe;
175462306a36Sopenharmony_ci
175562306a36Sopenharmony_ci	u8 lna_type_2g;
175662306a36Sopenharmony_ci	u8 lna_type_5g;
175762306a36Sopenharmony_ci	u8 glna_type;
175862306a36Sopenharmony_ci	u8 alna_type;
175962306a36Sopenharmony_ci	bool ext_lna_2g;
176062306a36Sopenharmony_ci	bool ext_lna_5g;
176162306a36Sopenharmony_ci	u8 pa_type_2g;
176262306a36Sopenharmony_ci	u8 pa_type_5g;
176362306a36Sopenharmony_ci	u8 gpa_type;
176462306a36Sopenharmony_ci	u8 apa_type;
176562306a36Sopenharmony_ci	bool ext_pa_2g;
176662306a36Sopenharmony_ci	bool ext_pa_5g;
176762306a36Sopenharmony_ci	u8 tx_bb_swing_setting_2g;
176862306a36Sopenharmony_ci	u8 tx_bb_swing_setting_5g;
176962306a36Sopenharmony_ci
177062306a36Sopenharmony_ci	bool btcoex;
177162306a36Sopenharmony_ci	/* bt share antenna with wifi */
177262306a36Sopenharmony_ci	bool share_ant;
177362306a36Sopenharmony_ci	u8 bt_setting;
177462306a36Sopenharmony_ci
177562306a36Sopenharmony_ci	struct {
177662306a36Sopenharmony_ci		u8 hci;
177762306a36Sopenharmony_ci		u8 bw;
177862306a36Sopenharmony_ci		u8 ptcl;
177962306a36Sopenharmony_ci		u8 nss;
178062306a36Sopenharmony_ci		u8 ant_num;
178162306a36Sopenharmony_ci	} hw_cap;
178262306a36Sopenharmony_ci
178362306a36Sopenharmony_ci	struct rtw_txpwr_idx txpwr_idx_table[4];
178462306a36Sopenharmony_ci};
178562306a36Sopenharmony_ci
178662306a36Sopenharmony_cistruct rtw_phy_cond {
178762306a36Sopenharmony_ci#ifdef __LITTLE_ENDIAN
178862306a36Sopenharmony_ci	u32 rfe:8;
178962306a36Sopenharmony_ci	u32 intf:4;
179062306a36Sopenharmony_ci	u32 pkg:4;
179162306a36Sopenharmony_ci	u32 plat:4;
179262306a36Sopenharmony_ci	u32 intf_rsvd:4;
179362306a36Sopenharmony_ci	u32 cut:4;
179462306a36Sopenharmony_ci	u32 branch:2;
179562306a36Sopenharmony_ci	u32 neg:1;
179662306a36Sopenharmony_ci	u32 pos:1;
179762306a36Sopenharmony_ci#else
179862306a36Sopenharmony_ci	u32 pos:1;
179962306a36Sopenharmony_ci	u32 neg:1;
180062306a36Sopenharmony_ci	u32 branch:2;
180162306a36Sopenharmony_ci	u32 cut:4;
180262306a36Sopenharmony_ci	u32 intf_rsvd:4;
180362306a36Sopenharmony_ci	u32 plat:4;
180462306a36Sopenharmony_ci	u32 pkg:4;
180562306a36Sopenharmony_ci	u32 intf:4;
180662306a36Sopenharmony_ci	u32 rfe:8;
180762306a36Sopenharmony_ci#endif
180862306a36Sopenharmony_ci	/* for intf:4 */
180962306a36Sopenharmony_ci	#define INTF_PCIE	BIT(0)
181062306a36Sopenharmony_ci	#define INTF_USB	BIT(1)
181162306a36Sopenharmony_ci	#define INTF_SDIO	BIT(2)
181262306a36Sopenharmony_ci	/* for branch:2 */
181362306a36Sopenharmony_ci	#define BRANCH_IF	0
181462306a36Sopenharmony_ci	#define BRANCH_ELIF	1
181562306a36Sopenharmony_ci	#define BRANCH_ELSE	2
181662306a36Sopenharmony_ci	#define BRANCH_ENDIF	3
181762306a36Sopenharmony_ci};
181862306a36Sopenharmony_ci
181962306a36Sopenharmony_cistruct rtw_fifo_conf {
182062306a36Sopenharmony_ci	/* tx fifo information */
182162306a36Sopenharmony_ci	u16 rsvd_boundary;
182262306a36Sopenharmony_ci	u16 rsvd_pg_num;
182362306a36Sopenharmony_ci	u16 rsvd_drv_pg_num;
182462306a36Sopenharmony_ci	u16 txff_pg_num;
182562306a36Sopenharmony_ci	u16 acq_pg_num;
182662306a36Sopenharmony_ci	u16 rsvd_drv_addr;
182762306a36Sopenharmony_ci	u16 rsvd_h2c_info_addr;
182862306a36Sopenharmony_ci	u16 rsvd_h2c_sta_info_addr;
182962306a36Sopenharmony_ci	u16 rsvd_h2cq_addr;
183062306a36Sopenharmony_ci	u16 rsvd_cpu_instr_addr;
183162306a36Sopenharmony_ci	u16 rsvd_fw_txbuf_addr;
183262306a36Sopenharmony_ci	u16 rsvd_csibuf_addr;
183362306a36Sopenharmony_ci	const struct rtw_rqpn *rqpn;
183462306a36Sopenharmony_ci};
183562306a36Sopenharmony_ci
183662306a36Sopenharmony_cistruct rtw_fwcd_desc {
183762306a36Sopenharmony_ci	u32 size;
183862306a36Sopenharmony_ci	u8 *next;
183962306a36Sopenharmony_ci	u8 *data;
184062306a36Sopenharmony_ci};
184162306a36Sopenharmony_ci
184262306a36Sopenharmony_cistruct rtw_fwcd_segs {
184362306a36Sopenharmony_ci	const u32 *segs;
184462306a36Sopenharmony_ci	u8 num;
184562306a36Sopenharmony_ci};
184662306a36Sopenharmony_ci
184762306a36Sopenharmony_ci#define FW_CD_TYPE 0xffff
184862306a36Sopenharmony_ci#define FW_CD_LEN 4
184962306a36Sopenharmony_ci#define FW_CD_VAL 0xaabbccdd
185062306a36Sopenharmony_cistruct rtw_fw_state {
185162306a36Sopenharmony_ci	const struct firmware *firmware;
185262306a36Sopenharmony_ci	struct rtw_dev *rtwdev;
185362306a36Sopenharmony_ci	struct completion completion;
185462306a36Sopenharmony_ci	struct rtw_fwcd_desc fwcd_desc;
185562306a36Sopenharmony_ci	u16 version;
185662306a36Sopenharmony_ci	u8 sub_version;
185762306a36Sopenharmony_ci	u8 sub_index;
185862306a36Sopenharmony_ci	u16 h2c_version;
185962306a36Sopenharmony_ci	u32 feature;
186062306a36Sopenharmony_ci	u32 feature_ext;
186162306a36Sopenharmony_ci	enum rtw_fw_type type;
186262306a36Sopenharmony_ci};
186362306a36Sopenharmony_ci
186462306a36Sopenharmony_cienum rtw_sar_sources {
186562306a36Sopenharmony_ci	RTW_SAR_SOURCE_NONE,
186662306a36Sopenharmony_ci	RTW_SAR_SOURCE_COMMON,
186762306a36Sopenharmony_ci};
186862306a36Sopenharmony_ci
186962306a36Sopenharmony_cienum rtw_sar_bands {
187062306a36Sopenharmony_ci	RTW_SAR_BAND_0,
187162306a36Sopenharmony_ci	RTW_SAR_BAND_1,
187262306a36Sopenharmony_ci	/* RTW_SAR_BAND_2, not used now */
187362306a36Sopenharmony_ci	RTW_SAR_BAND_3,
187462306a36Sopenharmony_ci	RTW_SAR_BAND_4,
187562306a36Sopenharmony_ci
187662306a36Sopenharmony_ci	RTW_SAR_BAND_NR,
187762306a36Sopenharmony_ci};
187862306a36Sopenharmony_ci
187962306a36Sopenharmony_ci/* the union is reserved for other kinds of SAR sources
188062306a36Sopenharmony_ci * which might not re-use same format with array common.
188162306a36Sopenharmony_ci */
188262306a36Sopenharmony_ciunion rtw_sar_cfg {
188362306a36Sopenharmony_ci	s8 common[RTW_SAR_BAND_NR];
188462306a36Sopenharmony_ci};
188562306a36Sopenharmony_ci
188662306a36Sopenharmony_cistruct rtw_sar {
188762306a36Sopenharmony_ci	enum rtw_sar_sources src;
188862306a36Sopenharmony_ci	union rtw_sar_cfg cfg[RTW_RF_PATH_MAX][RTW_RATE_SECTION_MAX];
188962306a36Sopenharmony_ci};
189062306a36Sopenharmony_ci
189162306a36Sopenharmony_cistruct rtw_hal {
189262306a36Sopenharmony_ci	u32 rcr;
189362306a36Sopenharmony_ci
189462306a36Sopenharmony_ci	u32 chip_version;
189562306a36Sopenharmony_ci	u8 cut_version;
189662306a36Sopenharmony_ci	u8 mp_chip;
189762306a36Sopenharmony_ci	u8 oem_id;
189862306a36Sopenharmony_ci	u8 pkg_type;
189962306a36Sopenharmony_ci	struct rtw_phy_cond phy_cond;
190062306a36Sopenharmony_ci	bool rfe_btg;
190162306a36Sopenharmony_ci
190262306a36Sopenharmony_ci	u8 ps_mode;
190362306a36Sopenharmony_ci	u8 current_channel;
190462306a36Sopenharmony_ci	u8 current_primary_channel_index;
190562306a36Sopenharmony_ci	u8 current_band_width;
190662306a36Sopenharmony_ci	u8 current_band_type;
190762306a36Sopenharmony_ci	u8 primary_channel;
190862306a36Sopenharmony_ci
190962306a36Sopenharmony_ci	/* center channel for different available bandwidth,
191062306a36Sopenharmony_ci	 * val of (bw > current_band_width) is invalid
191162306a36Sopenharmony_ci	 */
191262306a36Sopenharmony_ci	u8 cch_by_bw[RTW_MAX_CHANNEL_WIDTH + 1];
191362306a36Sopenharmony_ci
191462306a36Sopenharmony_ci	u8 sec_ch_offset;
191562306a36Sopenharmony_ci	u8 rf_type;
191662306a36Sopenharmony_ci	u8 rf_path_num;
191762306a36Sopenharmony_ci	u8 rf_phy_num;
191862306a36Sopenharmony_ci	u32 antenna_tx;
191962306a36Sopenharmony_ci	u32 antenna_rx;
192062306a36Sopenharmony_ci	u8 bfee_sts_cap;
192162306a36Sopenharmony_ci	bool txrx_1ss;
192262306a36Sopenharmony_ci
192362306a36Sopenharmony_ci	/* protect tx power section */
192462306a36Sopenharmony_ci	struct mutex tx_power_mutex;
192562306a36Sopenharmony_ci	s8 tx_pwr_by_rate_offset_2g[RTW_RF_PATH_MAX]
192662306a36Sopenharmony_ci				   [DESC_RATE_MAX];
192762306a36Sopenharmony_ci	s8 tx_pwr_by_rate_offset_5g[RTW_RF_PATH_MAX]
192862306a36Sopenharmony_ci				   [DESC_RATE_MAX];
192962306a36Sopenharmony_ci	s8 tx_pwr_by_rate_base_2g[RTW_RF_PATH_MAX]
193062306a36Sopenharmony_ci				 [RTW_RATE_SECTION_MAX];
193162306a36Sopenharmony_ci	s8 tx_pwr_by_rate_base_5g[RTW_RF_PATH_MAX]
193262306a36Sopenharmony_ci				 [RTW_RATE_SECTION_MAX];
193362306a36Sopenharmony_ci	s8 tx_pwr_limit_2g[RTW_REGD_MAX]
193462306a36Sopenharmony_ci			  [RTW_CHANNEL_WIDTH_MAX]
193562306a36Sopenharmony_ci			  [RTW_RATE_SECTION_MAX]
193662306a36Sopenharmony_ci			  [RTW_MAX_CHANNEL_NUM_2G];
193762306a36Sopenharmony_ci	s8 tx_pwr_limit_5g[RTW_REGD_MAX]
193862306a36Sopenharmony_ci			  [RTW_CHANNEL_WIDTH_MAX]
193962306a36Sopenharmony_ci			  [RTW_RATE_SECTION_MAX]
194062306a36Sopenharmony_ci			  [RTW_MAX_CHANNEL_NUM_5G];
194162306a36Sopenharmony_ci	s8 tx_pwr_tbl[RTW_RF_PATH_MAX]
194262306a36Sopenharmony_ci		     [DESC_RATE_MAX];
194362306a36Sopenharmony_ci
194462306a36Sopenharmony_ci	enum rtw_sar_bands sar_band;
194562306a36Sopenharmony_ci	struct rtw_sar sar;
194662306a36Sopenharmony_ci
194762306a36Sopenharmony_ci	/* for 8821c set channel */
194862306a36Sopenharmony_ci	u32 ch_param[3];
194962306a36Sopenharmony_ci};
195062306a36Sopenharmony_ci
195162306a36Sopenharmony_cistruct rtw_path_div {
195262306a36Sopenharmony_ci	enum rtw_bb_path current_tx_path;
195362306a36Sopenharmony_ci	u32 path_a_sum;
195462306a36Sopenharmony_ci	u32 path_b_sum;
195562306a36Sopenharmony_ci	u16 path_a_cnt;
195662306a36Sopenharmony_ci	u16 path_b_cnt;
195762306a36Sopenharmony_ci};
195862306a36Sopenharmony_ci
195962306a36Sopenharmony_cistruct rtw_chan_info {
196062306a36Sopenharmony_ci	int pri_ch_idx;
196162306a36Sopenharmony_ci	int action_id;
196262306a36Sopenharmony_ci	int bw;
196362306a36Sopenharmony_ci	u8 extra_info;
196462306a36Sopenharmony_ci	u8 channel;
196562306a36Sopenharmony_ci	u16 timeout;
196662306a36Sopenharmony_ci};
196762306a36Sopenharmony_ci
196862306a36Sopenharmony_cistruct rtw_chan_list {
196962306a36Sopenharmony_ci	u32 buf_size;
197062306a36Sopenharmony_ci	u32 ch_num;
197162306a36Sopenharmony_ci	u32 size;
197262306a36Sopenharmony_ci	u16 addr;
197362306a36Sopenharmony_ci};
197462306a36Sopenharmony_ci
197562306a36Sopenharmony_cistruct rtw_hw_scan_info {
197662306a36Sopenharmony_ci	struct ieee80211_vif *scanning_vif;
197762306a36Sopenharmony_ci	u8 probe_pg_size;
197862306a36Sopenharmony_ci	u8 op_pri_ch_idx;
197962306a36Sopenharmony_ci	u8 op_pri_ch;
198062306a36Sopenharmony_ci	u8 op_chan;
198162306a36Sopenharmony_ci	u8 op_bw;
198262306a36Sopenharmony_ci};
198362306a36Sopenharmony_ci
198462306a36Sopenharmony_cistruct rtw_dev {
198562306a36Sopenharmony_ci	struct ieee80211_hw *hw;
198662306a36Sopenharmony_ci	struct device *dev;
198762306a36Sopenharmony_ci
198862306a36Sopenharmony_ci	struct rtw_hci hci;
198962306a36Sopenharmony_ci
199062306a36Sopenharmony_ci	struct rtw_hw_scan_info scan_info;
199162306a36Sopenharmony_ci	const struct rtw_chip_info *chip;
199262306a36Sopenharmony_ci	struct rtw_hal hal;
199362306a36Sopenharmony_ci	struct rtw_fifo_conf fifo;
199462306a36Sopenharmony_ci	struct rtw_fw_state fw;
199562306a36Sopenharmony_ci	struct rtw_efuse efuse;
199662306a36Sopenharmony_ci	struct rtw_sec_desc sec;
199762306a36Sopenharmony_ci	struct rtw_traffic_stats stats;
199862306a36Sopenharmony_ci	struct rtw_regd regd;
199962306a36Sopenharmony_ci	struct rtw_bf_info bf_info;
200062306a36Sopenharmony_ci
200162306a36Sopenharmony_ci	struct rtw_dm_info dm_info;
200262306a36Sopenharmony_ci	struct rtw_coex coex;
200362306a36Sopenharmony_ci
200462306a36Sopenharmony_ci	/* ensures exclusive access from mac80211 callbacks */
200562306a36Sopenharmony_ci	struct mutex mutex;
200662306a36Sopenharmony_ci
200762306a36Sopenharmony_ci	/* watch dog every 2 sec */
200862306a36Sopenharmony_ci	struct delayed_work watch_dog_work;
200962306a36Sopenharmony_ci	u32 watch_dog_cnt;
201062306a36Sopenharmony_ci
201162306a36Sopenharmony_ci	struct list_head rsvd_page_list;
201262306a36Sopenharmony_ci
201362306a36Sopenharmony_ci	/* c2h cmd queue & handler work */
201462306a36Sopenharmony_ci	struct sk_buff_head c2h_queue;
201562306a36Sopenharmony_ci	struct work_struct c2h_work;
201662306a36Sopenharmony_ci	struct work_struct ips_work;
201762306a36Sopenharmony_ci	struct work_struct fw_recovery_work;
201862306a36Sopenharmony_ci	struct work_struct update_beacon_work;
201962306a36Sopenharmony_ci
202062306a36Sopenharmony_ci	/* used to protect txqs list */
202162306a36Sopenharmony_ci	spinlock_t txq_lock;
202262306a36Sopenharmony_ci	struct list_head txqs;
202362306a36Sopenharmony_ci	struct workqueue_struct *tx_wq;
202462306a36Sopenharmony_ci	struct work_struct tx_work;
202562306a36Sopenharmony_ci	struct work_struct ba_work;
202662306a36Sopenharmony_ci
202762306a36Sopenharmony_ci	struct rtw_tx_report tx_report;
202862306a36Sopenharmony_ci
202962306a36Sopenharmony_ci	struct {
203062306a36Sopenharmony_ci		/* indicate the mail box to use with fw */
203162306a36Sopenharmony_ci		u8 last_box_num;
203262306a36Sopenharmony_ci		u32 seq;
203362306a36Sopenharmony_ci	} h2c;
203462306a36Sopenharmony_ci
203562306a36Sopenharmony_ci	/* lps power state & handler work */
203662306a36Sopenharmony_ci	struct rtw_lps_conf lps_conf;
203762306a36Sopenharmony_ci	bool ps_enabled;
203862306a36Sopenharmony_ci	bool beacon_loss;
203962306a36Sopenharmony_ci	struct completion lps_leave_check;
204062306a36Sopenharmony_ci
204162306a36Sopenharmony_ci	struct dentry *debugfs;
204262306a36Sopenharmony_ci
204362306a36Sopenharmony_ci	u8 sta_cnt;
204462306a36Sopenharmony_ci	u32 rts_threshold;
204562306a36Sopenharmony_ci
204662306a36Sopenharmony_ci	DECLARE_BITMAP(hw_port, RTW_PORT_NUM);
204762306a36Sopenharmony_ci	DECLARE_BITMAP(mac_id_map, RTW_MAX_MAC_ID_NUM);
204862306a36Sopenharmony_ci	DECLARE_BITMAP(flags, NUM_OF_RTW_FLAGS);
204962306a36Sopenharmony_ci
205062306a36Sopenharmony_ci	u8 mp_mode;
205162306a36Sopenharmony_ci	struct rtw_path_div dm_path_div;
205262306a36Sopenharmony_ci
205362306a36Sopenharmony_ci	struct rtw_fw_state wow_fw;
205462306a36Sopenharmony_ci	struct rtw_wow_param wow;
205562306a36Sopenharmony_ci
205662306a36Sopenharmony_ci	bool need_rfk;
205762306a36Sopenharmony_ci	struct completion fw_scan_density;
205862306a36Sopenharmony_ci	bool ap_active;
205962306a36Sopenharmony_ci
206062306a36Sopenharmony_ci	/* hci related data, must be last */
206162306a36Sopenharmony_ci	u8 priv[] __aligned(sizeof(void *));
206262306a36Sopenharmony_ci};
206362306a36Sopenharmony_ci
206462306a36Sopenharmony_ci#include "hci.h"
206562306a36Sopenharmony_ci
206662306a36Sopenharmony_cistatic inline bool rtw_is_assoc(struct rtw_dev *rtwdev)
206762306a36Sopenharmony_ci{
206862306a36Sopenharmony_ci	return !!rtwdev->sta_cnt;
206962306a36Sopenharmony_ci}
207062306a36Sopenharmony_ci
207162306a36Sopenharmony_cistatic inline struct ieee80211_txq *rtwtxq_to_txq(struct rtw_txq *rtwtxq)
207262306a36Sopenharmony_ci{
207362306a36Sopenharmony_ci	void *p = rtwtxq;
207462306a36Sopenharmony_ci
207562306a36Sopenharmony_ci	return container_of(p, struct ieee80211_txq, drv_priv);
207662306a36Sopenharmony_ci}
207762306a36Sopenharmony_ci
207862306a36Sopenharmony_cistatic inline struct ieee80211_vif *rtwvif_to_vif(struct rtw_vif *rtwvif)
207962306a36Sopenharmony_ci{
208062306a36Sopenharmony_ci	void *p = rtwvif;
208162306a36Sopenharmony_ci
208262306a36Sopenharmony_ci	return container_of(p, struct ieee80211_vif, drv_priv);
208362306a36Sopenharmony_ci}
208462306a36Sopenharmony_ci
208562306a36Sopenharmony_cistatic inline bool rtw_ssid_equal(struct cfg80211_ssid *a,
208662306a36Sopenharmony_ci				  struct cfg80211_ssid *b)
208762306a36Sopenharmony_ci{
208862306a36Sopenharmony_ci	if (!a || !b || a->ssid_len != b->ssid_len)
208962306a36Sopenharmony_ci		return false;
209062306a36Sopenharmony_ci
209162306a36Sopenharmony_ci	if (memcmp(a->ssid, b->ssid, a->ssid_len))
209262306a36Sopenharmony_ci		return false;
209362306a36Sopenharmony_ci
209462306a36Sopenharmony_ci	return true;
209562306a36Sopenharmony_ci}
209662306a36Sopenharmony_ci
209762306a36Sopenharmony_cistatic inline void rtw_chip_efuse_grant_on(struct rtw_dev *rtwdev)
209862306a36Sopenharmony_ci{
209962306a36Sopenharmony_ci	if (rtwdev->chip->ops->efuse_grant)
210062306a36Sopenharmony_ci		rtwdev->chip->ops->efuse_grant(rtwdev, true);
210162306a36Sopenharmony_ci}
210262306a36Sopenharmony_ci
210362306a36Sopenharmony_cistatic inline void rtw_chip_efuse_grant_off(struct rtw_dev *rtwdev)
210462306a36Sopenharmony_ci{
210562306a36Sopenharmony_ci	if (rtwdev->chip->ops->efuse_grant)
210662306a36Sopenharmony_ci		rtwdev->chip->ops->efuse_grant(rtwdev, false);
210762306a36Sopenharmony_ci}
210862306a36Sopenharmony_ci
210962306a36Sopenharmony_cistatic inline bool rtw_chip_wcpu_11n(struct rtw_dev *rtwdev)
211062306a36Sopenharmony_ci{
211162306a36Sopenharmony_ci	return rtwdev->chip->wlan_cpu == RTW_WCPU_11N;
211262306a36Sopenharmony_ci}
211362306a36Sopenharmony_ci
211462306a36Sopenharmony_cistatic inline bool rtw_chip_wcpu_11ac(struct rtw_dev *rtwdev)
211562306a36Sopenharmony_ci{
211662306a36Sopenharmony_ci	return rtwdev->chip->wlan_cpu == RTW_WCPU_11AC;
211762306a36Sopenharmony_ci}
211862306a36Sopenharmony_ci
211962306a36Sopenharmony_cistatic inline bool rtw_chip_has_rx_ldpc(struct rtw_dev *rtwdev)
212062306a36Sopenharmony_ci{
212162306a36Sopenharmony_ci	return rtwdev->chip->rx_ldpc;
212262306a36Sopenharmony_ci}
212362306a36Sopenharmony_ci
212462306a36Sopenharmony_cistatic inline bool rtw_chip_has_tx_stbc(struct rtw_dev *rtwdev)
212562306a36Sopenharmony_ci{
212662306a36Sopenharmony_ci	return rtwdev->chip->tx_stbc;
212762306a36Sopenharmony_ci}
212862306a36Sopenharmony_ci
212962306a36Sopenharmony_cistatic inline void rtw_release_macid(struct rtw_dev *rtwdev, u8 mac_id)
213062306a36Sopenharmony_ci{
213162306a36Sopenharmony_ci	clear_bit(mac_id, rtwdev->mac_id_map);
213262306a36Sopenharmony_ci}
213362306a36Sopenharmony_ci
213462306a36Sopenharmony_cistatic inline int rtw_chip_dump_fw_crash(struct rtw_dev *rtwdev)
213562306a36Sopenharmony_ci{
213662306a36Sopenharmony_ci	if (rtwdev->chip->ops->dump_fw_crash)
213762306a36Sopenharmony_ci		return rtwdev->chip->ops->dump_fw_crash(rtwdev);
213862306a36Sopenharmony_ci
213962306a36Sopenharmony_ci	return 0;
214062306a36Sopenharmony_ci}
214162306a36Sopenharmony_ci
214262306a36Sopenharmony_cistatic inline
214362306a36Sopenharmony_cienum nl80211_band rtw_hw_to_nl80211_band(enum rtw_supported_band hw_band)
214462306a36Sopenharmony_ci{
214562306a36Sopenharmony_ci	switch (hw_band) {
214662306a36Sopenharmony_ci	default:
214762306a36Sopenharmony_ci	case RTW_BAND_2G:
214862306a36Sopenharmony_ci		return NL80211_BAND_2GHZ;
214962306a36Sopenharmony_ci	case RTW_BAND_5G:
215062306a36Sopenharmony_ci		return NL80211_BAND_5GHZ;
215162306a36Sopenharmony_ci	case RTW_BAND_60G:
215262306a36Sopenharmony_ci		return NL80211_BAND_60GHZ;
215362306a36Sopenharmony_ci	}
215462306a36Sopenharmony_ci}
215562306a36Sopenharmony_ci
215662306a36Sopenharmony_civoid rtw_set_rx_freq_band(struct rtw_rx_pkt_stat *pkt_stat, u8 channel);
215762306a36Sopenharmony_civoid rtw_set_dtim_period(struct rtw_dev *rtwdev, int dtim_period);
215862306a36Sopenharmony_civoid rtw_get_channel_params(struct cfg80211_chan_def *chandef,
215962306a36Sopenharmony_ci			    struct rtw_channel_params *ch_param);
216062306a36Sopenharmony_cibool check_hw_ready(struct rtw_dev *rtwdev, u32 addr, u32 mask, u32 target);
216162306a36Sopenharmony_cibool ltecoex_read_reg(struct rtw_dev *rtwdev, u16 offset, u32 *val);
216262306a36Sopenharmony_cibool ltecoex_reg_write(struct rtw_dev *rtwdev, u16 offset, u32 value);
216362306a36Sopenharmony_civoid rtw_restore_reg(struct rtw_dev *rtwdev,
216462306a36Sopenharmony_ci		     struct rtw_backup_info *bckp, u32 num);
216562306a36Sopenharmony_civoid rtw_desc_to_mcsrate(u16 rate, u8 *mcs, u8 *nss);
216662306a36Sopenharmony_civoid rtw_set_channel(struct rtw_dev *rtwdev);
216762306a36Sopenharmony_civoid rtw_chip_prepare_tx(struct rtw_dev *rtwdev);
216862306a36Sopenharmony_civoid rtw_vif_port_config(struct rtw_dev *rtwdev, struct rtw_vif *rtwvif,
216962306a36Sopenharmony_ci			 u32 config);
217062306a36Sopenharmony_civoid rtw_tx_report_purge_timer(struct timer_list *t);
217162306a36Sopenharmony_civoid rtw_update_sta_info(struct rtw_dev *rtwdev, struct rtw_sta_info *si,
217262306a36Sopenharmony_ci			 bool reset_ra_mask);
217362306a36Sopenharmony_civoid rtw_core_scan_start(struct rtw_dev *rtwdev, struct rtw_vif *rtwvif,
217462306a36Sopenharmony_ci			 const u8 *mac_addr, bool hw_scan);
217562306a36Sopenharmony_civoid rtw_core_scan_complete(struct rtw_dev *rtwdev, struct ieee80211_vif *vif,
217662306a36Sopenharmony_ci			    bool hw_scan);
217762306a36Sopenharmony_ciint rtw_core_start(struct rtw_dev *rtwdev);
217862306a36Sopenharmony_civoid rtw_core_stop(struct rtw_dev *rtwdev);
217962306a36Sopenharmony_ciint rtw_chip_info_setup(struct rtw_dev *rtwdev);
218062306a36Sopenharmony_ciint rtw_core_init(struct rtw_dev *rtwdev);
218162306a36Sopenharmony_civoid rtw_core_deinit(struct rtw_dev *rtwdev);
218262306a36Sopenharmony_ciint rtw_register_hw(struct rtw_dev *rtwdev, struct ieee80211_hw *hw);
218362306a36Sopenharmony_civoid rtw_unregister_hw(struct rtw_dev *rtwdev, struct ieee80211_hw *hw);
218462306a36Sopenharmony_ciu16 rtw_desc_to_bitrate(u8 desc_rate);
218562306a36Sopenharmony_civoid rtw_vif_assoc_changed(struct rtw_vif *rtwvif,
218662306a36Sopenharmony_ci			   struct ieee80211_bss_conf *conf);
218762306a36Sopenharmony_ciint rtw_sta_add(struct rtw_dev *rtwdev, struct ieee80211_sta *sta,
218862306a36Sopenharmony_ci		struct ieee80211_vif *vif);
218962306a36Sopenharmony_civoid rtw_sta_remove(struct rtw_dev *rtwdev, struct ieee80211_sta *sta,
219062306a36Sopenharmony_ci		    bool fw_exist);
219162306a36Sopenharmony_civoid rtw_fw_recovery(struct rtw_dev *rtwdev);
219262306a36Sopenharmony_civoid rtw_core_fw_scan_notify(struct rtw_dev *rtwdev, bool start);
219362306a36Sopenharmony_ciint rtw_dump_fw(struct rtw_dev *rtwdev, const u32 ocp_src, u32 size,
219462306a36Sopenharmony_ci		u32 fwcd_item);
219562306a36Sopenharmony_ciint rtw_dump_reg(struct rtw_dev *rtwdev, const u32 addr, const u32 size);
219662306a36Sopenharmony_civoid rtw_set_txrx_1ss(struct rtw_dev *rtwdev, bool config_1ss);
219762306a36Sopenharmony_civoid rtw_update_channel(struct rtw_dev *rtwdev, u8 center_channel,
219862306a36Sopenharmony_ci			u8 primary_channel, enum rtw_supported_band band,
219962306a36Sopenharmony_ci			enum rtw_bandwidth bandwidth);
220062306a36Sopenharmony_civoid rtw_core_port_switch(struct rtw_dev *rtwdev, struct ieee80211_vif *vif);
220162306a36Sopenharmony_cibool rtw_core_check_sta_active(struct rtw_dev *rtwdev);
220262306a36Sopenharmony_civoid rtw_core_enable_beacon(struct rtw_dev *rtwdev, bool enable);
220362306a36Sopenharmony_ci#endif
2204