wifi.h 72.4 KB
Newer Older
1 2
/* SPDX-License-Identifier: GPL-2.0 */
/* Copyright(c) 2009-2012  Realtek Corporation.*/
L
Larry Finger 已提交
3 4 5 6

#ifndef __RTL_WIFI_H__
#define __RTL_WIFI_H__

7 8
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt

L
Larry Finger 已提交
9 10 11
#include <linux/sched.h>
#include <linux/firmware.h>
#include <linux/etherdevice.h>
12
#include <linux/vmalloc.h>
L
Larry Finger 已提交
13
#include <linux/usb.h>
L
Larry Finger 已提交
14
#include <net/mac80211.h>
15
#include <linux/completion.h>
16
#include <linux/bitfield.h>
L
Larry Finger 已提交
17 18
#include "debug.h"

19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
#define	MASKBYTE0				0xff
#define	MASKBYTE1				0xff00
#define	MASKBYTE2				0xff0000
#define	MASKBYTE3				0xff000000
#define	MASKHWORD				0xffff0000
#define	MASKLWORD				0x0000ffff
#define	MASKDWORD				0xffffffff
#define	MASK12BITS				0xfff
#define	MASKH4BITS				0xf0000000
#define MASKOFDM_D				0xffc00000
#define	MASKCCK					0x3f3f3f3f

#define	MASK4BITS				0x0f
#define	MASK20BITS				0xfffff
#define RFREG_OFFSET_MASK			0xfffff

35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
#define	MASKBYTE0				0xff
#define	MASKBYTE1				0xff00
#define	MASKBYTE2				0xff0000
#define	MASKBYTE3				0xff000000
#define	MASKHWORD				0xffff0000
#define	MASKLWORD				0x0000ffff
#define	MASKDWORD				0xffffffff
#define	MASK12BITS				0xfff
#define	MASKH4BITS				0xf0000000
#define MASKOFDM_D				0xffc00000
#define	MASKCCK					0x3f3f3f3f

#define	MASK4BITS				0x0f
#define	MASK20BITS				0xfffff
#define RFREG_OFFSET_MASK			0xfffff

L
Larry Finger 已提交
51 52 53 54 55 56 57 58
#define RF_CHANGE_BY_INIT			0
#define RF_CHANGE_BY_IPS			BIT(28)
#define RF_CHANGE_BY_PS				BIT(29)
#define RF_CHANGE_BY_HW				BIT(30)
#define RF_CHANGE_BY_SW				BIT(31)

#define IQK_ADDA_REG_NUM			16
#define IQK_MAC_REG_NUM				4
59
#define IQK_THRESHOLD				8
L
Larry Finger 已提交
60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76

#define MAX_KEY_LEN				61
#define KEY_BUF_SIZE				5

/* QoS related. */
/*aci: 0x00	Best Effort*/
/*aci: 0x01	Background*/
/*aci: 0x10	Video*/
/*aci: 0x11	Voice*/
/*Max: define total number.*/
#define AC0_BE					0
#define AC1_BK					1
#define AC2_VI					2
#define AC3_VO					3
#define AC_MAX					4
#define QOS_QUEUE_NUM				4
#define RTL_MAC80211_NUM_QUEUE			5
77
#define REALTEK_USB_VENQT_MAX_BUF_SIZE		254
78
#define RTL_USB_MAX_RX_COUNT			100
L
Larry Finger 已提交
79 80
#define QBSS_LOAD_SIZE				5
#define MAX_WMMELE_LENGTH			64
81
#define ASPM_L1_LATENCY				7
L
Larry Finger 已提交
82

83 84
#define TOTAL_CAM_ENTRY				32

L
Larry Finger 已提交
85 86 87 88
/*slot time for 11g. */
#define RTL_SLOT_TIME_9				9
#define RTL_SLOT_TIME_20			20

89
/*related to tcp/ip. */
L
Larry Finger 已提交
90 91 92 93 94 95 96
#define SNAP_SIZE		6
#define PROTOC_TYPE_SIZE	2

/*related with 802.11 frame*/
#define MAC80211_3ADDR_LEN			24
#define MAC80211_4ADDR_LEN			30

97
#define CHANNEL_MAX_NUMBER	(14 + 24 + 21)	/* 14 is the max channel no */
98
#define CHANNEL_MAX_NUMBER_2G		14
99
#define CHANNEL_MAX_NUMBER_5G		49 /* Please refer to
100 101 102 103
					    *"phy_GetChnlGroup8812A" and
					    * "Hal_ReadTxPowerInfo8812A"
					    */
#define CHANNEL_MAX_NUMBER_5G_80M	7
104 105 106 107 108 109 110 111 112
#define CHANNEL_GROUP_MAX	(3 + 9)	/*  ch1~3, 4~9, 10~14 = three groups */
#define MAX_PG_GROUP			13
#define	CHANNEL_GROUP_MAX_2G		3
#define	CHANNEL_GROUP_IDX_5GL		3
#define	CHANNEL_GROUP_IDX_5GM		6
#define	CHANNEL_GROUP_IDX_5GH		9
#define	CHANNEL_GROUP_MAX_5G		9
#define CHANNEL_MAX_NUMBER_2G		14
#define AVG_THERMAL_NUM			8
113
#define AVG_THERMAL_NUM_88E		4
114
#define AVG_THERMAL_NUM_8723BE		4
115
#define MAX_TID_COUNT			9
116 117

/* for early mode */
118
#define FCS_LEN				4
119
#define EM_HDR_LEN			8
120

121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
enum rtl8192c_h2c_cmd {
	H2C_AP_OFFLOAD = 0,
	H2C_SETPWRMODE = 1,
	H2C_JOINBSSRPT = 2,
	H2C_RSVDPAGE = 3,
	H2C_RSSI_REPORT = 5,
	H2C_RA_MASK = 6,
	H2C_MACID_PS_MODE = 7,
	H2C_P2P_PS_OFFLOAD = 8,
	H2C_MAC_MODE_SEL = 9,
	H2C_PWRM = 15,
	H2C_P2P_PS_CTW_CMD = 24,
	MAX_H2CCMD
};

136 137 138 139
enum {
	H2C_BT_PORT_ID = 0x71,
};

140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158
enum rtl_c2h_evt_v1 {
	C2H_DBG = 0,
	C2H_LB = 1,
	C2H_TXBF = 2,
	C2H_TX_REPORT = 3,
	C2H_BT_INFO = 9,
	C2H_BT_MP = 11,
	C2H_RA_RPT = 12,

	C2H_FW_SWCHNL = 0x10,
	C2H_IQK_FINISH = 0x11,

	C2H_EXT_V2 = 0xFF,
};

enum rtl_c2h_evt_v2 {
	C2H_V2_CCX_RPT = 0x0F,
};

159 160 161 162 163
#define GET_C2H_CMD_ID(c2h)	({u8 *__c2h = c2h; __c2h[0]; })
#define GET_C2H_SEQ(c2h)	({u8 *__c2h = c2h; __c2h[1]; })
#define C2H_DATA_OFFSET		2
#define GET_C2H_DATA_PTR(c2h)	({u8 *__c2h = c2h; &__c2h[C2H_DATA_OFFSET]; })

164 165 166 167 168 169 170
#define GET_TX_REPORT_SN_V1(c2h)	(c2h[6])
#define GET_TX_REPORT_ST_V1(c2h)	(c2h[0] & 0xC0)
#define GET_TX_REPORT_RETRY_V1(c2h)	(c2h[2] & 0x3F)
#define GET_TX_REPORT_SN_V2(c2h)	(c2h[6])
#define GET_TX_REPORT_ST_V2(c2h)	(c2h[7] & 0xC0)
#define GET_TX_REPORT_RETRY_V2(c2h)	(c2h[8] & 0x3F)

171
#define MAX_TX_COUNT			4
172 173
#define MAX_REGULATION_NUM		4
#define MAX_RF_PATH_NUM			4
174
#define MAX_RATE_SECTION_NUM		6	/* = MAX_RATE_SECTION */
175 176
#define MAX_2_4G_BANDWIDTH_NUM		4
#define MAX_5G_BANDWIDTH_NUM		4
177 178 179 180
#define	MAX_RF_PATH			4
#define	MAX_CHNL_GROUP_24G		6
#define	MAX_CHNL_GROUP_5G		14

181 182 183
#define TX_PWR_BY_RATE_NUM_BAND		2
#define TX_PWR_BY_RATE_NUM_RF		4
#define TX_PWR_BY_RATE_NUM_SECTION	12
184
#define TX_PWR_BY_RATE_NUM_RATE		84 /* >= TX_PWR_BY_RATE_NUM_SECTION */
185 186
#define MAX_BASE_NUM_IN_PHY_REG_PG_24G	6  /* MAX_RATE_SECTION */
#define MAX_BASE_NUM_IN_PHY_REG_PG_5G	5  /* MAX_RATE_SECTION -1 */
187

188
#define BUFDESC_SEG_NUM		1 /* 0:2 seg, 1: 4 seg, 2: 8 seg */
189 190 191

#define DEL_SW_IDX_SZ		30

192 193 194
/* For now, it's just for 8192ee
 * but not OK yet, keep it 0
 */
195
#define RTL8192EE_SEG_NUM		BUFDESC_SEG_NUM
196

197 198 199 200 201 202 203
enum rf_tx_num {
	RF_1TX = 0,
	RF_2TX,
	RF_MAX_TX_NUM,
	RF_TX_NUM_NONIMPLEMENT,
};

204 205 206 207 208
#define PACKET_NORMAL			0
#define PACKET_DHCP			1
#define PACKET_ARP			2
#define PACKET_EAPOL			3

209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233
#define	MAX_SUPPORT_WOL_PATTERN_NUM	16
#define	RSVD_WOL_PATTERN_NUM		1
#define	WKFMCAM_ADDR_NUM		6
#define	WKFMCAM_SIZE			24

#define	MAX_WOL_BIT_MASK_SIZE		16
/* MIN LEN keeps 13 here */
#define	MIN_WOL_PATTERN_SIZE		13
#define	MAX_WOL_PATTERN_SIZE		128

#define	WAKE_ON_MAGIC_PACKET		BIT(0)
#define	WAKE_ON_PATTERN_MATCH		BIT(1)

#define	WOL_REASON_PTK_UPDATE		BIT(0)
#define	WOL_REASON_GTK_UPDATE		BIT(1)
#define	WOL_REASON_DISASSOC		BIT(2)
#define	WOL_REASON_DEAUTH		BIT(3)
#define	WOL_REASON_AP_LOST		BIT(4)
#define	WOL_REASON_MAGIC_PKT		BIT(5)
#define	WOL_REASON_UNICAST_PKT		BIT(6)
#define	WOL_REASON_PATTERN_PKT		BIT(7)
#define	WOL_REASON_RTD3_SSID_MATCH	BIT(8)
#define	WOL_REASON_REALWOW_V2_WAKEUPPKT	BIT(9)
#define	WOL_REASON_REALWOW_V2_ACKLOST	BIT(10)

234 235 236 237 238 239 240 241 242 243 244
struct rtlwifi_firmware_header {
	__le16 signature;
	u8 category;
	u8 function;
	__le16 version;
	u8 subversion;
	u8 rsvd1;
	u8 month;
	u8 date;
	u8 hour;
	u8 minute;
245
	__le16 ramcodesize;
246 247 248 249 250 251 252
	__le16 rsvd2;
	__le32 svnindex;
	__le32 rsvd3;
	__le32 rsvd4;
	__le32 rsvd5;
};

253 254 255 256 257 258 259 260
struct txpower_info_2g {
	u8 index_cck_base[MAX_RF_PATH][MAX_CHNL_GROUP_24G];
	u8 index_bw40_base[MAX_RF_PATH][MAX_CHNL_GROUP_24G];
	/*If only one tx, only BW20 and OFDM are used.*/
	u8 cck_diff[MAX_RF_PATH][MAX_TX_COUNT];
	u8 ofdm_diff[MAX_RF_PATH][MAX_TX_COUNT];
	u8 bw20_diff[MAX_RF_PATH][MAX_TX_COUNT];
	u8 bw40_diff[MAX_RF_PATH][MAX_TX_COUNT];
261 262
	u8 bw80_diff[MAX_RF_PATH][MAX_TX_COUNT];
	u8 bw160_diff[MAX_RF_PATH][MAX_TX_COUNT];
263 264 265 266 267 268 269 270
};

struct txpower_info_5g {
	u8 index_bw40_base[MAX_RF_PATH][MAX_CHNL_GROUP_5G];
	/*If only one tx, only BW20, OFDM, BW80 and BW160 are used.*/
	u8 ofdm_diff[MAX_RF_PATH][MAX_TX_COUNT];
	u8 bw20_diff[MAX_RF_PATH][MAX_TX_COUNT];
	u8 bw40_diff[MAX_RF_PATH][MAX_TX_COUNT];
271 272
	u8 bw80_diff[MAX_RF_PATH][MAX_TX_COUNT];
	u8 bw160_diff[MAX_RF_PATH][MAX_TX_COUNT];
273 274
};

275 276 277 278 279 280 281
enum rate_section {
	CCK = 0,
	OFDM,
	HT_MCS0_MCS7,
	HT_MCS8_MCS15,
	VHT_1SSMCS0_1SSMCS9,
	VHT_2SSMCS0_2SSMCS9,
282
	MAX_RATE_SECTION,
283 284
};

L
Larry Finger 已提交
285 286 287 288 289 290 291 292 293 294 295 296
enum intf_type {
	INTF_PCI = 0,
	INTF_USB = 1,
};

enum radio_path {
	RF90_PATH_A = 0,
	RF90_PATH_B = 1,
	RF90_PATH_C = 2,
	RF90_PATH_D = 3,
};

297 298 299 300 301 302 303
enum radio_mask {
	RF_MASK_A = BIT(0),
	RF_MASK_B = BIT(1),
	RF_MASK_C = BIT(2),
	RF_MASK_D = BIT(3),
};

304 305 306 307 308 309 310 311 312
enum regulation_txpwr_lmt {
	TXPWR_LMT_FCC = 0,
	TXPWR_LMT_MKK = 1,
	TXPWR_LMT_ETSI = 2,
	TXPWR_LMT_WW = 3,

	TXPWR_LMT_MAX_REGULATION_NUM = 4
};

L
Larry Finger 已提交
313 314 315 316 317 318
enum rt_eeprom_type {
	EEPROM_93C46,
	EEPROM_93C56,
	EEPROM_BOOT_EFUSE,
};

319
enum ttl_status {
L
Larry Finger 已提交
320 321 322 323 324 325 326 327 328 329 330 331
	RTL_STATUS_INTERFACE_START = 0,
};

enum hardware_type {
	HARDWARE_TYPE_RTL8192E,
	HARDWARE_TYPE_RTL8192U,
	HARDWARE_TYPE_RTL8192SE,
	HARDWARE_TYPE_RTL8192SU,
	HARDWARE_TYPE_RTL8192CE,
	HARDWARE_TYPE_RTL8192CU,
	HARDWARE_TYPE_RTL8192DE,
	HARDWARE_TYPE_RTL8192DU,
L
Larry Finger 已提交
332
	HARDWARE_TYPE_RTL8723AE,
G
George 已提交
333
	HARDWARE_TYPE_RTL8723U,
334
	HARDWARE_TYPE_RTL8188EE,
335 336
	HARDWARE_TYPE_RTL8723BE,
	HARDWARE_TYPE_RTL8192EE,
337 338
	HARDWARE_TYPE_RTL8821AE,
	HARDWARE_TYPE_RTL8812AE,
339
	HARDWARE_TYPE_RTL8822BE,
L
Larry Finger 已提交
340

341
	/* keep it last */
L
Larry Finger 已提交
342 343 344
	HARDWARE_TYPE_NUM
};

345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361
#define RTL_HW_TYPE(rtlpriv)	(rtl_hal((struct rtl_priv *)rtlpriv)->hw_type)
#define IS_NEW_GENERATION_IC(rtlpriv)			\
			(RTL_HW_TYPE(rtlpriv) >= HARDWARE_TYPE_RTL8192EE)
#define IS_HARDWARE_TYPE_8192CE(rtlpriv)		\
			(RTL_HW_TYPE(rtlpriv) == HARDWARE_TYPE_RTL8192CE)
#define IS_HARDWARE_TYPE_8812(rtlpriv)			\
			(RTL_HW_TYPE(rtlpriv) == HARDWARE_TYPE_RTL8812AE)
#define IS_HARDWARE_TYPE_8821(rtlpriv)			\
			(RTL_HW_TYPE(rtlpriv) == HARDWARE_TYPE_RTL8821AE)
#define IS_HARDWARE_TYPE_8723A(rtlpriv)			\
			(RTL_HW_TYPE(rtlpriv) == HARDWARE_TYPE_RTL8723AE)
#define IS_HARDWARE_TYPE_8723B(rtlpriv)			\
			(RTL_HW_TYPE(rtlpriv) == HARDWARE_TYPE_RTL8723BE)
#define IS_HARDWARE_TYPE_8192E(rtlpriv)			\
			(RTL_HW_TYPE(rtlpriv) == HARDWARE_TYPE_RTL8192EE)
#define IS_HARDWARE_TYPE_8822B(rtlpriv)			\
			(RTL_HW_TYPE(rtlpriv) == HARDWARE_TYPE_RTL8822BE)
L
Larry Finger 已提交
362

363
#define RX_HAL_IS_CCK_RATE(rxmcs)			\
364 365 366 367
	((rxmcs) == DESC_RATE1M ||			\
	 (rxmcs) == DESC_RATE2M ||			\
	 (rxmcs) == DESC_RATE5_5M ||			\
	 (rxmcs) == DESC_RATE11M)
368

L
Larry Finger 已提交
369 370
enum scan_operation_backup_opt {
	SCAN_OPT_BACKUP = 0,
371 372
	SCAN_OPT_BACKUP_BAND0 = 0,
	SCAN_OPT_BACKUP_BAND1,
L
Larry Finger 已提交
373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393
	SCAN_OPT_RESTORE,
	SCAN_OPT_MAX
};

/*RF state.*/
enum rf_pwrstate {
	ERFON,
	ERFSLEEP,
	ERFOFF
};

struct bb_reg_def {
	u32 rfintfs;
	u32 rfintfi;
	u32 rfintfo;
	u32 rfintfe;
	u32 rf3wire_offset;
	u32 rflssi_select;
	u32 rftxgain_stage;
	u32 rfhssi_para1;
	u32 rfhssi_para2;
394
	u32 rfsw_ctrl;
L
Larry Finger 已提交
395 396
	u32 rfagc_control1;
	u32 rfagc_control2;
397
	u32 rfrxiq_imbal;
L
Larry Finger 已提交
398
	u32 rfrx_afe;
399
	u32 rftxiq_imbal;
L
Larry Finger 已提交
400
	u32 rftx_afe;
401 402
	u32 rf_rb;		/* rflssi_readback */
	u32 rf_rbpi;		/* rflssi_readbackpi */
L
Larry Finger 已提交
403 404 405 406
};

enum io_type {
	IO_CMD_PAUSE_DM_BY_SCAN = 0,
407 408 409
	IO_CMD_PAUSE_BAND0_DM_BY_SCAN = 0,
	IO_CMD_PAUSE_BAND1_DM_BY_SCAN = 1,
	IO_CMD_RESUME_DM_BY_SCAN = 2,
L
Larry Finger 已提交
410 411 412
};

enum hw_variables {
413 414 415 416
	HW_VAR_ETHER_ADDR = 0x0,
	HW_VAR_MULTICAST_REG = 0x1,
	HW_VAR_BASIC_RATE = 0x2,
	HW_VAR_BSSID = 0x3,
417 418
	HW_VAR_MEDIA_STATUS = 0x4,
	HW_VAR_SECURITY_CONF = 0x5,
419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434
	HW_VAR_BEACON_INTERVAL = 0x6,
	HW_VAR_ATIM_WINDOW = 0x7,
	HW_VAR_LISTEN_INTERVAL = 0x8,
	HW_VAR_CS_COUNTER = 0x9,
	HW_VAR_DEFAULTKEY0 = 0xa,
	HW_VAR_DEFAULTKEY1 = 0xb,
	HW_VAR_DEFAULTKEY2 = 0xc,
	HW_VAR_DEFAULTKEY3 = 0xd,
	HW_VAR_SIFS = 0xe,
	HW_VAR_R2T_SIFS = 0xf,
	HW_VAR_DIFS = 0x10,
	HW_VAR_EIFS = 0x11,
	HW_VAR_SLOT_TIME = 0x12,
	HW_VAR_ACK_PREAMBLE = 0x13,
	HW_VAR_CW_CONFIG = 0x14,
	HW_VAR_CW_VALUES = 0x15,
435
	HW_VAR_RATE_FALLBACK_CONTROL = 0x16,
436 437 438 439 440 441 442 443 444 445 446
	HW_VAR_CONTENTION_WINDOW = 0x17,
	HW_VAR_RETRY_COUNT = 0x18,
	HW_VAR_TR_SWITCH = 0x19,
	HW_VAR_COMMAND = 0x1a,
	HW_VAR_WPA_CONFIG = 0x1b,
	HW_VAR_AMPDU_MIN_SPACE = 0x1c,
	HW_VAR_SHORTGI_DENSITY = 0x1d,
	HW_VAR_AMPDU_FACTOR = 0x1e,
	HW_VAR_MCS_RATE_AVAILABLE = 0x1f,
	HW_VAR_AC_PARAM = 0x20,
	HW_VAR_ACM_CTRL = 0x21,
447
	HW_VAR_DIS_REQ_QSIZE = 0x22,
448 449 450
	HW_VAR_CCX_CHNL_LOAD = 0x23,
	HW_VAR_CCX_NOISE_HISTOGRAM = 0x24,
	HW_VAR_CCX_CLM_NHM = 0x25,
451
	HW_VAR_TXOPLIMIT = 0x26,
452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503
	HW_VAR_TURBO_MODE = 0x27,
	HW_VAR_RF_STATE = 0x28,
	HW_VAR_RF_OFF_BY_HW = 0x29,
	HW_VAR_BUS_SPEED = 0x2a,
	HW_VAR_SET_DEV_POWER = 0x2b,

	HW_VAR_RCR = 0x2c,
	HW_VAR_RATR_0 = 0x2d,
	HW_VAR_RRSR = 0x2e,
	HW_VAR_CPU_RST = 0x2f,
	HW_VAR_CHECK_BSSID = 0x30,
	HW_VAR_LBK_MODE = 0x31,
	HW_VAR_AES_11N_FIX = 0x32,
	HW_VAR_USB_RX_AGGR = 0x33,
	HW_VAR_USER_CONTROL_TURBO_MODE = 0x34,
	HW_VAR_RETRY_LIMIT = 0x35,
	HW_VAR_INIT_TX_RATE = 0x36,
	HW_VAR_TX_RATE_REG = 0x37,
	HW_VAR_EFUSE_USAGE = 0x38,
	HW_VAR_EFUSE_BYTES = 0x39,
	HW_VAR_AUTOLOAD_STATUS = 0x3a,
	HW_VAR_RF_2R_DISABLE = 0x3b,
	HW_VAR_SET_RPWM = 0x3c,
	HW_VAR_H2C_FW_PWRMODE = 0x3d,
	HW_VAR_H2C_FW_JOINBSSRPT = 0x3e,
	HW_VAR_H2C_FW_MEDIASTATUSRPT = 0x3f,
	HW_VAR_H2C_FW_P2P_PS_OFFLOAD = 0x40,
	HW_VAR_FW_PSMODE_STATUS = 0x41,
	HW_VAR_INIT_RTS_RATE = 0x42,
	HW_VAR_RESUME_CLK_ON = 0x43,
	HW_VAR_FW_LPS_ACTION = 0x44,
	HW_VAR_1X1_RECV_COMBINE = 0x45,
	HW_VAR_STOP_SEND_BEACON = 0x46,
	HW_VAR_TSF_TIMER = 0x47,
	HW_VAR_IO_CMD = 0x48,

	HW_VAR_RF_RECOVERY = 0x49,
	HW_VAR_H2C_FW_UPDATE_GTK = 0x4a,
	HW_VAR_WF_MASK = 0x4b,
	HW_VAR_WF_CRC = 0x4c,
	HW_VAR_WF_IS_MAC_ADDR = 0x4d,
	HW_VAR_H2C_FW_OFFLOAD = 0x4e,
	HW_VAR_RESET_WFCRC = 0x4f,

	HW_VAR_HANDLE_FW_C2H = 0x50,
	HW_VAR_DL_FW_RSVD_PAGE = 0x51,
	HW_VAR_AID = 0x52,
	HW_VAR_HW_SEQ_ENABLE = 0x53,
	HW_VAR_CORRECT_TSF = 0x54,
	HW_VAR_BCN_VALID = 0x55,
	HW_VAR_FWLPS_RF_ON = 0x56,
	HW_VAR_DUAL_TSF_RST = 0x57,
504
	HW_VAR_SWITCH_EPHY_WOWLAN = 0x58,
505 506 507 508 509 510 511 512 513 514 515 516
	HW_VAR_INT_MIGRATION = 0x59,
	HW_VAR_INT_AC = 0x5a,
	HW_VAR_RF_TIMING = 0x5b,

	HAL_DEF_WOWLAN = 0x5c,
	HW_VAR_MRC = 0x5d,
	HW_VAR_KEEP_ALIVE = 0x5e,
	HW_VAR_NAV_UPPER = 0x5f,

	HW_VAR_MGT_FILTER = 0x60,
	HW_VAR_CTRL_FILTER = 0x61,
	HW_VAR_DATA_FILTER = 0x62,
L
Larry Finger 已提交
517 518
};

519
enum rt_media_status {
L
Larry Finger 已提交
520 521 522 523 524 525 526 527 528 529 530
	RT_MEDIA_DISCONNECT = 0,
	RT_MEDIA_CONNECT = 1
};

enum rt_oem_id {
	RT_CID_DEFAULT = 0,
	RT_CID_8187_ALPHA0 = 1,
	RT_CID_8187_SERCOMM_PS = 2,
	RT_CID_8187_HW_LED = 3,
	RT_CID_8187_NETGEAR = 4,
	RT_CID_WHQL = 5,
531 532 533
	RT_CID_819X_CAMEO = 6,
	RT_CID_819X_RUNTOP = 7,
	RT_CID_819X_SENAO = 8,
L
Larry Finger 已提交
534
	RT_CID_TOSHIBA = 9,
535 536
	RT_CID_819X_NETCORE = 10,
	RT_CID_NETTRONIX = 11,
L
Larry Finger 已提交
537 538 539
	RT_CID_DLINK = 12,
	RT_CID_PRONET = 13,
	RT_CID_COREGA = 14,
540 541
	RT_CID_819X_ALPHA = 15,
	RT_CID_819X_SITECOM = 16,
L
Larry Finger 已提交
542
	RT_CID_CCX = 17,
543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558
	RT_CID_819X_LENOVO = 18,
	RT_CID_819X_QMI = 19,
	RT_CID_819X_EDIMAX_BELKIN = 20,
	RT_CID_819X_SERCOMM_BELKIN = 21,
	RT_CID_819X_CAMEO1 = 22,
	RT_CID_819X_MSI = 23,
	RT_CID_819X_ACER = 24,
	RT_CID_819X_HP = 27,
	RT_CID_819X_CLEVO = 28,
	RT_CID_819X_ARCADYAN_BELKIN = 29,
	RT_CID_819X_SAMSUNG = 30,
	RT_CID_819X_WNC_COREGA = 31,
	RT_CID_819X_FOXCOON = 32,
	RT_CID_819X_DELL = 33,
	RT_CID_819X_PRONETS = 34,
	RT_CID_819X_EDIMAX_ASUS = 35,
559 560 561
	RT_CID_NETGEAR = 36,
	RT_CID_PLANEX = 37,
	RT_CID_CC_C = 38,
562
	RT_CID_LENOVO_CHINA = 40,
L
Larry Finger 已提交
563 564 565 566 567 568 569 570 571 572
};

enum hw_descs {
	HW_DESC_OWN,
	HW_DESC_RXOWN,
	HW_DESC_TX_NEXTDESC_ADDR,
	HW_DESC_TXBUFF_ADDR,
	HW_DESC_RXBUFF_ADDR,
	HW_DESC_RXPKT_LEN,
	HW_DESC_RXERO,
573
	HW_DESC_RX_PREPARE,
L
Larry Finger 已提交
574 575 576 577 578 579 580 581 582 583 584 585
};

enum prime_sc {
	PRIME_CHNL_OFFSET_DONT_CARE = 0,
	PRIME_CHNL_OFFSET_LOWER = 1,
	PRIME_CHNL_OFFSET_UPPER = 2,
};

enum rf_type {
	RF_1T1R = 0,
	RF_1T2R = 1,
	RF_2T2R = 2,
586
	RF_2T2R_GREEN = 3,
587 588 589 590 591
	RF_2T3R = 4,
	RF_2T4R = 5,
	RF_3T3R = 6,
	RF_3T4R = 7,
	RF_4T4R = 8,
L
Larry Finger 已提交
592 593 594 595 596
};

enum ht_channel_width {
	HT_CHANNEL_WIDTH_20 = 0,
	HT_CHANNEL_WIDTH_20_40 = 1,
597
	HT_CHANNEL_WIDTH_80 = 2,
598
	HT_CHANNEL_WIDTH_MAX,
L
Larry Finger 已提交
599 600
};

601
/* Ref: 802.11i spec D10.0 7.3.2.25.1
602 603
 * Cipher Suites Encryption Algorithms
 */
L
Larry Finger 已提交
604 605 606 607 608 609 610
enum rt_enc_alg {
	NO_ENCRYPTION = 0,
	WEP40_ENCRYPTION = 1,
	TKIP_ENCRYPTION = 2,
	RSERVED_ENCRYPTION = 3,
	AESCCMP_ENCRYPTION = 4,
	WEP104_ENCRYPTION = 5,
L
Larry Finger 已提交
611
	AESCMAC_ENCRYPTION = 6,	/*IEEE802.11w */
L
Larry Finger 已提交
612 613 614 615 616 617 618
};

enum rtl_hal_state {
	_HAL_STATE_STOP = 0,
	_HAL_STATE_START = 1,
};

619
enum rtl_desc_rate {
620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651
	DESC_RATE1M = 0x00,
	DESC_RATE2M = 0x01,
	DESC_RATE5_5M = 0x02,
	DESC_RATE11M = 0x03,

	DESC_RATE6M = 0x04,
	DESC_RATE9M = 0x05,
	DESC_RATE12M = 0x06,
	DESC_RATE18M = 0x07,
	DESC_RATE24M = 0x08,
	DESC_RATE36M = 0x09,
	DESC_RATE48M = 0x0a,
	DESC_RATE54M = 0x0b,

	DESC_RATEMCS0 = 0x0c,
	DESC_RATEMCS1 = 0x0d,
	DESC_RATEMCS2 = 0x0e,
	DESC_RATEMCS3 = 0x0f,
	DESC_RATEMCS4 = 0x10,
	DESC_RATEMCS5 = 0x11,
	DESC_RATEMCS6 = 0x12,
	DESC_RATEMCS7 = 0x13,
	DESC_RATEMCS8 = 0x14,
	DESC_RATEMCS9 = 0x15,
	DESC_RATEMCS10 = 0x16,
	DESC_RATEMCS11 = 0x17,
	DESC_RATEMCS12 = 0x18,
	DESC_RATEMCS13 = 0x19,
	DESC_RATEMCS14 = 0x1a,
	DESC_RATEMCS15 = 0x1b,
	DESC_RATEMCS15_SG = 0x1c,
	DESC_RATEMCS32 = 0x20,
652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672

	DESC_RATEVHT1SS_MCS0 = 0x2c,
	DESC_RATEVHT1SS_MCS1 = 0x2d,
	DESC_RATEVHT1SS_MCS2 = 0x2e,
	DESC_RATEVHT1SS_MCS3 = 0x2f,
	DESC_RATEVHT1SS_MCS4 = 0x30,
	DESC_RATEVHT1SS_MCS5 = 0x31,
	DESC_RATEVHT1SS_MCS6 = 0x32,
	DESC_RATEVHT1SS_MCS7 = 0x33,
	DESC_RATEVHT1SS_MCS8 = 0x34,
	DESC_RATEVHT1SS_MCS9 = 0x35,
	DESC_RATEVHT2SS_MCS0 = 0x36,
	DESC_RATEVHT2SS_MCS1 = 0x37,
	DESC_RATEVHT2SS_MCS2 = 0x38,
	DESC_RATEVHT2SS_MCS3 = 0x39,
	DESC_RATEVHT2SS_MCS4 = 0x3a,
	DESC_RATEVHT2SS_MCS5 = 0x3b,
	DESC_RATEVHT2SS_MCS6 = 0x3c,
	DESC_RATEVHT2SS_MCS7 = 0x3d,
	DESC_RATEVHT2SS_MCS8 = 0x3e,
	DESC_RATEVHT2SS_MCS9 = 0x3f,
673 674
};

L
Larry Finger 已提交
675 676 677 678 679 680 681 682 683 684
enum rtl_var_map {
	/*reg map */
	SYS_ISO_CTRL = 0,
	SYS_FUNC_EN,
	SYS_CLK,
	MAC_RCR_AM,
	MAC_RCR_AB,
	MAC_RCR_ACRC32,
	MAC_RCR_ACF,
	MAC_RCR_AAP,
685 686 687
	MAC_HIMR,
	MAC_HIMRE,
	MAC_HSISR,
L
Larry Finger 已提交
688 689 690 691 692 693 694 695 696 697 698

	/*efuse map */
	EFUSE_TEST,
	EFUSE_CTRL,
	EFUSE_CLK,
	EFUSE_CLK_CTRL,
	EFUSE_PWC_EV12V,
	EFUSE_FEN_ELDR,
	EFUSE_LOADER_CLK_EN,
	EFUSE_ANA8M,
	EFUSE_HWSET_MAX_SIZE,
G
George 已提交
699 700
	EFUSE_MAX_SECTION_MAP,
	EFUSE_REAL_CONTENT_SIZE,
701
	EFUSE_OOB_PROTECT_BYTES_LEN,
702
	EFUSE_ACCESS,
L
Larry Finger 已提交
703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734

	/*CAM map */
	RWCAM,
	WCAMI,
	RCAMO,
	CAMDBG,
	SECR,
	SEC_CAM_NONE,
	SEC_CAM_WEP40,
	SEC_CAM_TKIP,
	SEC_CAM_AES,
	SEC_CAM_WEP104,

	/*IMR map */
	RTL_IMR_BCNDMAINT6,	/*Beacon DMA Interrupt 6 */
	RTL_IMR_BCNDMAINT5,	/*Beacon DMA Interrupt 5 */
	RTL_IMR_BCNDMAINT4,	/*Beacon DMA Interrupt 4 */
	RTL_IMR_BCNDMAINT3,	/*Beacon DMA Interrupt 3 */
	RTL_IMR_BCNDMAINT2,	/*Beacon DMA Interrupt 2 */
	RTL_IMR_BCNDMAINT1,	/*Beacon DMA Interrupt 1 */
	RTL_IMR_BCNDOK8,	/*Beacon Queue DMA OK Interrup 8 */
	RTL_IMR_BCNDOK7,	/*Beacon Queue DMA OK Interrup 7 */
	RTL_IMR_BCNDOK6,	/*Beacon Queue DMA OK Interrup 6 */
	RTL_IMR_BCNDOK5,	/*Beacon Queue DMA OK Interrup 5 */
	RTL_IMR_BCNDOK4,	/*Beacon Queue DMA OK Interrup 4 */
	RTL_IMR_BCNDOK3,	/*Beacon Queue DMA OK Interrup 3 */
	RTL_IMR_BCNDOK2,	/*Beacon Queue DMA OK Interrup 2 */
	RTL_IMR_BCNDOK1,	/*Beacon Queue DMA OK Interrup 1 */
	RTL_IMR_TIMEOUT2,	/*Timeout interrupt 2 */
	RTL_IMR_TIMEOUT1,	/*Timeout interrupt 1 */
	RTL_IMR_TXFOVW,		/*Transmit FIFO Overflow */
	RTL_IMR_PSTIMEOUT,	/*Power save time out interrupt */
735
	RTL_IMR_BCNINT,		/*Beacon DMA Interrupt 0 */
L
Larry Finger 已提交
736 737 738
	RTL_IMR_RXFOVW,		/*Receive FIFO Overflow */
	RTL_IMR_RDU,		/*Receive Descriptor Unavailable */
	RTL_IMR_ATIMEND,	/*For 92C,ATIM Window End Interrupt */
739
	RTL_IMR_H2CDOK,		/*H2C Queue DMA OK Interrupt */
L
Larry Finger 已提交
740 741
	RTL_IMR_BDOK,		/*Beacon Queue DMA OK Interrup */
	RTL_IMR_HIGHDOK,	/*High Queue DMA OK Interrupt */
742
	RTL_IMR_COMDOK,		/*Command Queue DMA OK Interrupt*/
L
Larry Finger 已提交
743 744 745 746 747 748 749 750
	RTL_IMR_TBDOK,		/*Transmit Beacon OK interrup */
	RTL_IMR_MGNTDOK,	/*Management Queue DMA OK Interrupt */
	RTL_IMR_TBDER,		/*For 92C,Transmit Beacon Error Interrupt */
	RTL_IMR_BKDOK,		/*AC_BK DMA OK Interrupt */
	RTL_IMR_BEDOK,		/*AC_BE DMA OK Interrupt */
	RTL_IMR_VIDOK,		/*AC_VI DMA OK Interrupt */
	RTL_IMR_VODOK,		/*AC_VO DMA Interrupt */
	RTL_IMR_ROK,		/*Receive DMA OK Interrupt */
751
	RTL_IMR_HSISR_IND,	/*HSISR Interrupt*/
752
	RTL_IBSS_INT_MASKS,	/*(RTL_IMR_BCNINT | RTL_IMR_TBDOK |
753 754
				 * RTL_IMR_TBDER)
				 */
755
	RTL_IMR_C2HCMD,		/*fw interrupt*/
L
Larry Finger 已提交
756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775

	/*CCK Rates, TxHT = 0 */
	RTL_RC_CCK_RATE1M,
	RTL_RC_CCK_RATE2M,
	RTL_RC_CCK_RATE5_5M,
	RTL_RC_CCK_RATE11M,

	/*OFDM Rates, TxHT = 0 */
	RTL_RC_OFDM_RATE6M,
	RTL_RC_OFDM_RATE9M,
	RTL_RC_OFDM_RATE12M,
	RTL_RC_OFDM_RATE18M,
	RTL_RC_OFDM_RATE24M,
	RTL_RC_OFDM_RATE36M,
	RTL_RC_OFDM_RATE48M,
	RTL_RC_OFDM_RATE54M,

	RTL_RC_HT_RATEMCS7,
	RTL_RC_HT_RATEMCS15,

776 777 778 779 780 781 782
	RTL_RC_VHT_RATE_1SS_MCS7,
	RTL_RC_VHT_RATE_1SS_MCS8,
	RTL_RC_VHT_RATE_1SS_MCS9,
	RTL_RC_VHT_RATE_2SS_MCS7,
	RTL_RC_VHT_RATE_2SS_MCS8,
	RTL_RC_VHT_RATE_2SS_MCS9,

L
Larry Finger 已提交
783 784 785 786 787 788 789 790 791 792 793 794 795 796 797
	/*keep it last */
	RTL_VAR_MAP_MAX,
};

/*Firmware PS mode for control LPS.*/
enum _fw_ps_mode {
	FW_PS_ACTIVE_MODE = 0,
	FW_PS_MIN_MODE = 1,
	FW_PS_MAX_MODE = 2,
	FW_PS_DTIM_MODE = 3,
	FW_PS_VOIP_MODE = 4,
	FW_PS_UAPSD_WMM_MODE = 5,
	FW_PS_UAPSD_MODE = 6,
	FW_PS_IBSS_MODE = 7,
	FW_PS_WWLAN_MODE = 8,
798 799
	FW_PS_PM_RADIO_OFF = 9,
	FW_PS_PM_CARD_DISABLE = 10,
L
Larry Finger 已提交
800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832
};

enum rt_psmode {
	EACTIVE,		/*Active/Continuous access. */
	EMAXPS,			/*Max power save mode. */
	EFASTPS,		/*Fast power save mode. */
	EAUTOPS,		/*Auto power save mode. */
};

/*LED related.*/
enum led_ctl_mode {
	LED_CTL_POWER_ON = 1,
	LED_CTL_LINK = 2,
	LED_CTL_NO_LINK = 3,
	LED_CTL_TX = 4,
	LED_CTL_RX = 5,
	LED_CTL_SITE_SURVEY = 6,
	LED_CTL_POWER_OFF = 7,
	LED_CTL_START_TO_LINK = 8,
	LED_CTL_START_WPS = 9,
	LED_CTL_STOP_WPS = 10,
};

enum rtl_led_pin {
	LED_PIN_GPIO0,
	LED_PIN_LED0,
	LED_PIN_LED1,
	LED_PIN_LED2
};

/*QoS related.*/
/*acm implementation method.*/
enum acm_method {
833 834
	EACMWAY0_SWANDHW = 0,
	EACMWAY1_HW = 1,
835
	EACMWAY2_SW = 2,
L
Larry Finger 已提交
836 837
};

838 839 840 841 842 843 844 845 846 847 848 849 850
enum macphy_mode {
	SINGLEMAC_SINGLEPHY = 0,
	DUALMAC_DUALPHY,
	DUALMAC_SINGLEPHY,
};

enum band_type {
	BAND_ON_2_4G = 0,
	BAND_ON_5G,
	BAND_ON_BOTH,
	BANDMAX
};

851 852 853
/* aci/aifsn Field.
 * Ref: WMM spec 2.2.2: WME Parameter Element, p.12.
 */
L
Larry Finger 已提交
854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872
union aci_aifsn {
	u8 char_data;

	struct {
		u8 aifsn:4;
		u8 acm:1;
		u8 aci:2;
		u8 reserved:1;
	} f;			/* Field */
};

/*mlme related.*/
enum wireless_mode {
	WIRELESS_MODE_UNKNOWN = 0x00,
	WIRELESS_MODE_A = 0x01,
	WIRELESS_MODE_B = 0x02,
	WIRELESS_MODE_G = 0x04,
	WIRELESS_MODE_AUTO = 0x08,
	WIRELESS_MODE_N_24G = 0x10,
873 874
	WIRELESS_MODE_N_5G = 0x20,
	WIRELESS_MODE_AC_5G = 0x40,
875 876 877
	WIRELESS_MODE_AC_24G  = 0x80,
	WIRELESS_MODE_AC_ONLY = 0x100,
	WIRELESS_MODE_MAX = 0x800
L
Larry Finger 已提交
878 879
};

G
George 已提交
880 881 882 883 884 885 886 887 888 889 890
#define IS_WIRELESS_MODE_A(wirelessmode)	\
	(wirelessmode == WIRELESS_MODE_A)
#define IS_WIRELESS_MODE_B(wirelessmode)	\
	(wirelessmode == WIRELESS_MODE_B)
#define IS_WIRELESS_MODE_G(wirelessmode)	\
	(wirelessmode == WIRELESS_MODE_G)
#define IS_WIRELESS_MODE_N_24G(wirelessmode)	\
	(wirelessmode == WIRELESS_MODE_N_24G)
#define IS_WIRELESS_MODE_N_5G(wirelessmode)	\
	(wirelessmode == WIRELESS_MODE_N_5G)

L
Larry Finger 已提交
891 892 893 894 895 896 897 898 899 900
enum ratr_table_mode {
	RATR_INX_WIRELESS_NGB = 0,
	RATR_INX_WIRELESS_NG = 1,
	RATR_INX_WIRELESS_NB = 2,
	RATR_INX_WIRELESS_N = 3,
	RATR_INX_WIRELESS_GB = 4,
	RATR_INX_WIRELESS_G = 5,
	RATR_INX_WIRELESS_B = 6,
	RATR_INX_WIRELESS_MC = 7,
	RATR_INX_WIRELESS_A = 8,
901 902
	RATR_INX_WIRELESS_AC_5N = 8,
	RATR_INX_WIRELESS_AC_24N = 9,
L
Larry Finger 已提交
903 904
};

905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922
enum ratr_table_mode_new {
	RATEID_IDX_BGN_40M_2SS = 0,
	RATEID_IDX_BGN_40M_1SS = 1,
	RATEID_IDX_BGN_20M_2SS_BN = 2,
	RATEID_IDX_BGN_20M_1SS_BN = 3,
	RATEID_IDX_GN_N2SS = 4,
	RATEID_IDX_GN_N1SS = 5,
	RATEID_IDX_BG = 6,
	RATEID_IDX_G = 7,
	RATEID_IDX_B = 8,
	RATEID_IDX_VHT_2SS = 9,
	RATEID_IDX_VHT_1SS = 10,
	RATEID_IDX_MIX1 = 11,
	RATEID_IDX_MIX2 = 12,
	RATEID_IDX_VHT_3SS = 13,
	RATEID_IDX_BGN_3SS = 14,
};

L
Larry Finger 已提交
923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943
enum rtl_link_state {
	MAC80211_NOLINK = 0,
	MAC80211_LINKING = 1,
	MAC80211_LINKED = 2,
	MAC80211_LINKED_SCANNING = 3,
};

enum act_category {
	ACT_CAT_QOS = 1,
	ACT_CAT_DLS = 2,
	ACT_CAT_BA = 3,
	ACT_CAT_HT = 7,
	ACT_CAT_WMM = 17,
};

enum ba_action {
	ACT_ADDBAREQ = 0,
	ACT_ADDBARSP = 1,
	ACT_DELBA = 2,
};

944 945 946 947 948
enum rt_polarity_ctl {
	RT_POLARITY_LOW_ACT = 0,
	RT_POLARITY_HIGH_ACT = 1,
};

949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964
/* After 8188E, we use V2 reason define. 88C/8723A use V1 reason. */
enum fw_wow_reason_v2 {
	FW_WOW_V2_PTK_UPDATE_EVENT = 0x01,
	FW_WOW_V2_GTK_UPDATE_EVENT = 0x02,
	FW_WOW_V2_DISASSOC_EVENT = 0x04,
	FW_WOW_V2_DEAUTH_EVENT = 0x08,
	FW_WOW_V2_FW_DISCONNECT_EVENT = 0x10,
	FW_WOW_V2_MAGIC_PKT_EVENT = 0x21,
	FW_WOW_V2_UNICAST_PKT_EVENT = 0x22,
	FW_WOW_V2_PATTERN_PKT_EVENT = 0x23,
	FW_WOW_V2_RTD3_SSID_MATCH_EVENT = 0x24,
	FW_WOW_V2_REALWOW_V2_WAKEUPPKT = 0x30,
	FW_WOW_V2_REALWOW_V2_ACKLOST = 0x31,
	FW_WOW_V2_REASON_MAX = 0xff,
};

965 966 967 968 969 970 971 972
enum wolpattern_type {
	UNICAST_PATTERN = 0,
	MULTICAST_PATTERN = 1,
	BROADCAST_PATTERN = 2,
	DONT_CARE_DA = 3,
	UNKNOWN_TYPE = 4,
};

973 974 975 976 977 978 979 980
enum package_type {
	PACKAGE_DEFAULT,
	PACKAGE_QFN68,
	PACKAGE_TFBGA90,
	PACKAGE_TFBGA80,
	PACKAGE_TFBGA79
};

981 982
enum rtl_spec_ver {
	RTL_SPEC_NEW_RATEID = BIT(0),	/* use ratr_table_mode_new */
983
	RTL_SPEC_SUPPORT_VHT = BIT(1),	/* support VHT */
984
	RTL_SPEC_EXT_C2H = BIT(2),	/* extend FW C2H (e.g. TX REPORT) */
985 986
};

987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018
enum dm_info_query {
	DM_INFO_FA_OFDM,
	DM_INFO_FA_CCK,
	DM_INFO_FA_TOTAL,
	DM_INFO_CCA_OFDM,
	DM_INFO_CCA_CCK,
	DM_INFO_CCA_ALL,
	DM_INFO_CRC32_OK_VHT,
	DM_INFO_CRC32_OK_HT,
	DM_INFO_CRC32_OK_LEGACY,
	DM_INFO_CRC32_OK_CCK,
	DM_INFO_CRC32_ERROR_VHT,
	DM_INFO_CRC32_ERROR_HT,
	DM_INFO_CRC32_ERROR_LEGACY,
	DM_INFO_CRC32_ERROR_CCK,
	DM_INFO_EDCCA_FLAG,
	DM_INFO_OFDM_ENABLE,
	DM_INFO_CCK_ENABLE,
	DM_INFO_CRC32_OK_HT_AGG,
	DM_INFO_CRC32_ERROR_HT_AGG,
	DM_INFO_DBG_PORT_0,
	DM_INFO_CURR_IGI,
	DM_INFO_RSSI_MIN,
	DM_INFO_RSSI_MAX,
	DM_INFO_CLM_RATIO,
	DM_INFO_NHM_RATIO,
	DM_INFO_IQK_ALL,
	DM_INFO_IQK_OK,
	DM_INFO_IQK_NG,
	DM_INFO_SIZE,
};

1019 1020 1021 1022 1023 1024 1025 1026
enum rx_packet_type {
	NORMAL_RX,
	TX_REPORT1,
	TX_REPORT2,
	HIS_REPORT,
	C2H_PACKET,
};

1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041
struct rtlwifi_tx_info {
	int sn;
	unsigned long send_time;
};

static inline struct rtlwifi_tx_info *rtl_tx_skb_cb_info(struct sk_buff *skb)
{
	struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);

	BUILD_BUG_ON(sizeof(struct rtlwifi_tx_info) >
		     sizeof(info->status.status_driver_data));

	return (struct rtlwifi_tx_info *)(info->status.status_driver_data);
}

L
Larry Finger 已提交
1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053
struct octet_string {
	u8 *octet;
	u16 length;
};

struct rtl_hdr_3addr {
	__le16 frame_ctl;
	__le16 duration_id;
	u8 addr1[ETH_ALEN];
	u8 addr2[ETH_ALEN];
	u8 addr3[ETH_ALEN];
	__le16 seq_ctl;
1054
	u8 payload[];
1055
} __packed;
L
Larry Finger 已提交
1056 1057 1058 1059

struct rtl_info_element {
	u8 id;
	u8 len;
1060
	u8 data[];
1061
} __packed;
L
Larry Finger 已提交
1062 1063 1064 1065 1066 1067 1068

struct rtl_probe_rsp {
	struct rtl_hdr_3addr header;
	u32 time_stamp[2];
	__le16 beacon_interval;
	__le16 capability;
	/*SSID, supported rates, FH params, DS params,
1069 1070
	 * CF params, IBSS params, TIM (if beacon), RSN
	 */
1071
	struct rtl_info_element info_element[];
1072
} __packed;
L
Larry Finger 已提交
1073 1074 1075 1076 1077 1078

/*LED related.*/
/*ledpin Identify how to implement this SW led.*/
struct rtl_led {
	void *hw;
	enum rtl_led_pin ledpin;
1079
	bool ledon;
L
Larry Finger 已提交
1080 1081 1082
};

struct rtl_led_ctl {
1083
	bool led_opendrain;
L
Larry Finger 已提交
1084 1085 1086 1087 1088 1089 1090 1091 1092 1093
	struct rtl_led sw_led0;
	struct rtl_led sw_led1;
};

struct rtl_qos_parameters {
	__le16 cw_min;
	__le16 cw_max;
	u8 aifs;
	u8 flag;
	__le16 tx_op;
1094
} __packed;
L
Larry Finger 已提交
1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107

struct rt_smooth_data {
	u32 elements[100];	/*array to store values */
	u32 index;		/*index to current array to store */
	u32 total_num;		/*num of valid elements */
	u32 total_val;		/*sum of valid elements */
};

struct false_alarm_statistics {
	u32 cnt_parity_fail;
	u32 cnt_rate_illegal;
	u32 cnt_crc8_fail;
	u32 cnt_mcs_fail;
1108 1109
	u32 cnt_fast_fsync_fail;
	u32 cnt_sb_search_fail;
L
Larry Finger 已提交
1110 1111 1112
	u32 cnt_ofdm_fail;
	u32 cnt_cck_fail;
	u32 cnt_all;
1113 1114 1115 1116 1117
	u32 cnt_ofdm_cca;
	u32 cnt_cck_cca;
	u32 cnt_cca_all;
	u32 cnt_bw_usc;
	u32 cnt_bw_lsc;
L
Larry Finger 已提交
1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129
};

struct init_gain {
	u8 xaagccore1;
	u8 xbagccore1;
	u8 xcagccore1;
	u8 xdagccore1;
	u8 cca;

};

struct wireless_stats {
1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140
	u64 txbytesunicast;
	u64 txbytesmulticast;
	u64 txbytesbroadcast;
	u64 rxbytesunicast;

	u64 txbytesunicast_inperiod;
	u64 rxbytesunicast_inperiod;
	u32 txbytesunicast_inperiod_tp;
	u32 rxbytesunicast_inperiod_tp;
	u64 txbytesunicast_last;
	u64 rxbytesunicast_last;
L
Larry Finger 已提交
1141 1142 1143

	long rx_snr_db[4];
	/*Correct smoothed ss in Dbm, only used
1144 1145
	 * in driver to report real power now.
	 */
L
Larry Finger 已提交
1146 1147 1148 1149 1150
	long recv_signal_power;
	long signal_quality;
	long last_sigstrength_inpercent;

	u32 rssi_calculate_cnt;
1151
	u32 pwdb_all_cnt;
L
Larry Finger 已提交
1152

1153 1154 1155
	/* Transformed, in dbm. Beautified signal
	 * strength for UI, not correct.
	 */
L
Larry Finger 已提交
1156 1157 1158
	long signal_strength;

	u8 rx_rssi_percentage[4];
1159
	u8 rx_evm_dbm[4];
L
Larry Finger 已提交
1160 1161
	u8 rx_evm_percentage[2];

1162 1163 1164
	u16 rx_cfo_short[4];
	u16 rx_cfo_tail[4];

L
Larry Finger 已提交
1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176
	struct rt_smooth_data ui_rssi;
	struct rt_smooth_data ui_link_quality;
};

struct rate_adaptive {
	u8 rate_adaptive_disabled;
	u8 ratr_state;
	u16 reserve;

	u32 high_rssi_thresh_for_ra;
	u32 high2low_rssi_thresh_for_ra;
	u8 low2high_rssi_thresh_for_ra40m;
1177
	u32 low_rssi_thresh_for_ra40m;
L
Larry Finger 已提交
1178
	u8 low2high_rssi_thresh_for_ra20m;
1179
	u32 low_rssi_thresh_for_ra20m;
L
Larry Finger 已提交
1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192
	u32 upper_rssi_threshold_ratr;
	u32 middleupper_rssi_threshold_ratr;
	u32 middle_rssi_threshold_ratr;
	u32 middlelow_rssi_threshold_ratr;
	u32 low_rssi_threshold_ratr;
	u32 ultralow_rssi_threshold_ratr;
	u32 low_rssi_threshold_ratr_40m;
	u32 low_rssi_threshold_ratr_20m;
	u8 ping_rssi_enable;
	u32 ping_rssi_ratr;
	u32 ping_rssi_thresh_for_ra;
	u32 last_ratr;
	u8 pre_ratr_state;
1193 1194 1195 1196
	u8 ldpc_thres;
	bool use_ldpc;
	bool lower_rts_rate;
	bool is_special_data;
L
Larry Finger 已提交
1197 1198 1199 1200 1201 1202 1203 1204
};

struct regd_pair_mapping {
	u16 reg_dmnenum;
	u16 reg_5ghz_ctl;
	u16 reg_2ghz_ctl;
};

1205 1206 1207 1208 1209 1210 1211 1212 1213 1214
struct dynamic_primary_cca {
	u8 pricca_flag;
	u8 intf_flag;
	u8 intf_type;
	u8 dup_rts_flag;
	u8 monitor_flag;
	u8 ch_offset;
	u8 mf_state;
};

L
Larry Finger 已提交
1215
struct rtl_regulatory {
A
Arnd Bergmann 已提交
1216
	s8 alpha2[2];
L
Larry Finger 已提交
1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229
	u16 country_code;
	u16 max_power_level;
	u32 tp_scale;
	u16 current_rd;
	u16 current_rd_ext;
	int16_t power_limit;
	struct regd_pair_mapping *regpair;
};

struct rtl_rfkill {
	bool rfkill_state;	/*0 is off, 1 is on */
};

1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287
/*for P2P PS**/
#define	P2P_MAX_NOA_NUM		2

enum p2p_role {
	P2P_ROLE_DISABLE = 0,
	P2P_ROLE_DEVICE = 1,
	P2P_ROLE_CLIENT = 2,
	P2P_ROLE_GO = 3
};

enum p2p_ps_state {
	P2P_PS_DISABLE = 0,
	P2P_PS_ENABLE = 1,
	P2P_PS_SCAN = 2,
	P2P_PS_SCAN_DONE = 3,
	P2P_PS_ALLSTASLEEP = 4, /* for P2P GO */
};

enum p2p_ps_mode {
	P2P_PS_NONE = 0,
	P2P_PS_CTWINDOW = 1,
	P2P_PS_NOA	 = 2,
	P2P_PS_MIX = 3, /* CTWindow and NoA */
};

struct rtl_p2p_ps_info {
	enum p2p_ps_mode p2p_ps_mode; /* indicate p2p ps mode */
	enum p2p_ps_state p2p_ps_state; /*  indicate p2p ps state */
	u8 noa_index; /*  Identifies instance of Notice of Absence timing. */
	/*  Client traffic window. A period of time in TU after TBTT. */
	u8 ctwindow;
	u8 opp_ps; /*  opportunistic power save. */
	u8 noa_num; /*  number of NoA descriptor in P2P IE. */
	/*  Count for owner, Type of client. */
	u8 noa_count_type[P2P_MAX_NOA_NUM];
	/*  Max duration for owner, preferred or min acceptable duration
	 * for client.
	 */
	u32 noa_duration[P2P_MAX_NOA_NUM];
	/*  Length of interval for owner, preferred or max acceptable intervali
	 * of client.
	 */
	u32 noa_interval[P2P_MAX_NOA_NUM];
	/*  schedule in terms of the lower 4 bytes of the TSF timer. */
	u32 noa_start_time[P2P_MAX_NOA_NUM];
};

struct p2p_ps_offload_t {
	u8 offload_en:1;
	u8 role:1; /* 1: Owner, 0: Client */
	u8 ctwindow_en:1;
	u8 noa0_en:1;
	u8 noa1_en:1;
	u8 allstasleep:1;
	u8 discovery:1;
	u8 reserved:1;
};

1288 1289
#define IQK_MATRIX_REG_NUM	8
#define IQK_MATRIX_SETTINGS_NUM	(1 + 24 + 21)
1290

1291
struct iqk_matrix_regs {
1292
	bool iqk_done;
1293 1294 1295
	long value[1][IQK_MATRIX_REG_NUM];
};

G
George 已提交
1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314
struct phy_parameters {
	u16 length;
	u32 *pdata;
};

enum hw_param_tab_index {
	PHY_REG_2T,
	PHY_REG_1T,
	PHY_REG_PG,
	RADIOA_2T,
	RADIOB_2T,
	RADIOA_1T,
	RADIOB_1T,
	MAC_REG,
	AGCTAB_2T,
	AGCTAB_1T,
	MAX_TAB
};

L
Larry Finger 已提交
1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329
struct rtl_phy {
	struct bb_reg_def phyreg_def[4];	/*Radio A/B/C/D */
	struct init_gain initgain_backup;
	enum io_type current_io_type;

	u8 rf_mode;
	u8 rf_type;
	u8 current_chan_bw;
	u8 set_bwmode_inprogress;
	u8 sw_chnl_inprogress;
	u8 sw_chnl_stage;
	u8 sw_chnl_step;
	u8 current_channel;
	u8 h2c_box_num;
	u8 set_io_inprogress;
1330
	u8 lck_inprogress;
L
Larry Finger 已提交
1331

1332
	/* record for power tracking */
L
Larry Finger 已提交
1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347
	s32 reg_e94;
	s32 reg_e9c;
	s32 reg_ea4;
	s32 reg_eac;
	s32 reg_eb4;
	s32 reg_ebc;
	s32 reg_ec4;
	s32 reg_ecc;
	u8 rfpienable;
	u8 reserve_0;
	u16 reserve_1;
	u32 reg_c04, reg_c08, reg_874;
	u32 adda_backup[16];
	u32 iqk_mac_backup[IQK_MAC_REG_NUM];
	u32 iqk_bb_backup[10];
L
Larry Finger 已提交
1348
	bool iqk_initialized;
L
Larry Finger 已提交
1349

1350 1351
	bool rfpath_rx_enable[MAX_RF_PATH];
	u8 reg_837;
1352 1353
	/* Dual mac */
	bool need_iqk;
1354
	struct iqk_matrix_regs iqk_matrix[IQK_MATRIX_SETTINGS_NUM];
1355

1356
	bool rfpi_enable;
1357
	bool iqk_in_progress;
L
Larry Finger 已提交
1358 1359

	u8 pwrgroup_cnt;
1360
	u8 cck_high_power;
1361 1362
	/* this is for 88E & 8723A */
	u32 mcs_txpwrlevel_origoffset[MAX_PG_GROUP][16];
1363
	/* MAX_PG_GROUP groups of pwr diff by rates */
1364
	u32 mcs_offset[MAX_PG_GROUP][16];
1365 1366 1367
	u32 tx_power_by_rate_offset[TX_PWR_BY_RATE_NUM_BAND]
				   [TX_PWR_BY_RATE_NUM_RF]
				   [TX_PWR_BY_RATE_NUM_RF]
1368
				   [TX_PWR_BY_RATE_NUM_RATE];
1369 1370 1371
	u8 txpwr_by_rate_base_24g[TX_PWR_BY_RATE_NUM_RF]
				 [TX_PWR_BY_RATE_NUM_RF]
				 [MAX_BASE_NUM_IN_PHY_REG_PG_24G];
1372 1373 1374
	u8 txpwr_by_rate_base_5g[TX_PWR_BY_RATE_NUM_RF]
				[TX_PWR_BY_RATE_NUM_RF]
				[MAX_BASE_NUM_IN_PHY_REG_PG_5G];
L
Larry Finger 已提交
1375 1376
	u8 default_initialgain[4];

1377
	/* the current Tx power level */
L
Larry Finger 已提交
1378 1379
	u8 cur_cck_txpwridx;
	u8 cur_ofdm24g_txpwridx;
1380 1381
	u8 cur_bw20_txpwridx;
	u8 cur_bw40_txpwridx;
L
Larry Finger 已提交
1382

A
Arnd Bergmann 已提交
1383
	s8 txpwr_limit_2_4g[MAX_REGULATION_NUM]
1384
			   [MAX_2_4G_BANDWIDTH_NUM]
1385
			   [MAX_RATE_SECTION_NUM]
A
Arnd Bergmann 已提交
1386
			   [CHANNEL_MAX_NUMBER_2G]
1387
			   [MAX_RF_PATH_NUM];
A
Arnd Bergmann 已提交
1388
	s8 txpwr_limit_5g[MAX_REGULATION_NUM]
1389
			 [MAX_5G_BANDWIDTH_NUM]
A
Arnd Bergmann 已提交
1390 1391 1392
			 [MAX_RATE_SECTION_NUM]
			 [CHANNEL_MAX_NUMBER_5G]
			 [MAX_RF_PATH_NUM];
1393

L
Larry Finger 已提交
1394
	u32 rfreg_chnlval[2];
1395
	bool apk_done;
1396
	u32 reg_rf3c[2];	/* pathA / pathB  */
L
Larry Finger 已提交
1397

1398
	u32 backup_rf_0x1a;/*92ee*/
1399
	/* bfsync */
L
Larry Finger 已提交
1400 1401 1402 1403
	u8 framesync;
	u32 framesync_c34;

	u8 num_total_rfpath;
G
George 已提交
1404
	struct phy_parameters hwparam_tables[MAX_TAB];
1405
	u16 rf_pathmap;
1406

1407
	u8 hw_rof_enable; /*Enable GPIO[9] as WL RF HW PDn source*/
1408
	enum rt_polarity_ctl polarity_ctl;
L
Larry Finger 已提交
1409 1410 1411
};

#define MAX_TID_COUNT				9
1412 1413 1414 1415
#define RTL_AGG_STOP				0
#define RTL_AGG_PROGRESS			1
#define RTL_AGG_START				2
#define RTL_AGG_OPERATIONAL			3
L
Larry Finger 已提交
1416 1417
#define RTL_AGG_OFF				0
#define RTL_AGG_ON				1
L
Larry Finger 已提交
1418 1419
#define RTL_RX_AGG_START			1
#define RTL_RX_AGG_STOP				0
L
Larry Finger 已提交
1420 1421 1422 1423 1424 1425 1426 1427 1428 1429
#define RTL_AGG_EMPTYING_HW_QUEUE_ADDBA		2
#define RTL_AGG_EMPTYING_HW_QUEUE_DELBA		3

struct rtl_ht_agg {
	u16 txq_id;
	u16 wait_for_ba;
	u16 start_idx;
	u64 bitmap;
	u32 rate_n_flags;
	u8 agg_state;
L
Larry Finger 已提交
1430
	u8 rx_agg_state;
L
Larry Finger 已提交
1431 1432
};

1433 1434
struct rssi_sta {
	long undec_sm_pwdb;
1435
	long undec_sm_cck;
1436 1437
};

L
Larry Finger 已提交
1438 1439 1440 1441
struct rtl_tid_data {
	struct rtl_ht_agg agg;
};

1442
struct rtl_sta_info {
L
Larry Finger 已提交
1443
	struct list_head list;
1444
	struct rtl_tid_data tids[MAX_TID_COUNT];
L
Larry Finger 已提交
1445 1446
	/* just used for ap adhoc or mesh*/
	struct rssi_sta rssi_stat;
1447
	u8 rssi_level;
1448 1449 1450 1451
	u16 wireless_mode;
	u8 ratr_index;
	u8 mimo_ps;
	u8 mac_addr[ETH_ALEN];
1452 1453
} __packed;

L
Larry Finger 已提交
1454 1455 1456
struct rtl_priv;
struct rtl_io {
	struct device *dev;
L
Larry Finger 已提交
1457
	struct mutex bb_mutex;
L
Larry Finger 已提交
1458 1459 1460 1461 1462 1463 1464 1465

	/*PCI MEM map */
	unsigned long pci_mem_end;	/*shared mem end        */
	unsigned long pci_mem_start;	/*shared mem start */

	/*PCI IO map */
	unsigned long pci_base_addr;	/*device I/O address */

1466 1467 1468
	void (*write8_async)(struct rtl_priv *rtlpriv, u32 addr, u8 val);
	void (*write16_async)(struct rtl_priv *rtlpriv, u32 addr, u16 val);
	void (*write32_async)(struct rtl_priv *rtlpriv, u32 addr, u32 val);
1469
	void (*writen_sync)(struct rtl_priv *rtlpriv, u32 addr, void *buf,
1470
			    u16 len);
L
Larry Finger 已提交
1471

1472 1473 1474
	u8 (*read8_sync)(struct rtl_priv *rtlpriv, u32 addr);
	u16 (*read16_sync)(struct rtl_priv *rtlpriv, u32 addr);
	u32 (*read32_sync)(struct rtl_priv *rtlpriv, u32 addr);
1475

L
Larry Finger 已提交
1476 1477 1478 1479 1480 1481 1482 1483 1484 1485
};

struct rtl_mac {
	u8 mac_addr[ETH_ALEN];
	u8 mac80211_registered;
	u8 beacon_enabled;

	u32 tx_ss_num;
	u32 rx_ss_num;

1486
	struct ieee80211_supported_band bands[NUM_NL80211_BANDS];
L
Larry Finger 已提交
1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497
	struct ieee80211_hw *hw;
	struct ieee80211_vif *vif;
	enum nl80211_iftype opmode;

	/*Probe Beacon management */
	struct rtl_tid_data tids[MAX_TID_COUNT];
	enum rtl_link_state link_state;

	int n_channels;
	int n_bitrates;

1498
	bool offchan_delay;
1499 1500
	u8 p2p;	/*using p2p role*/
	bool p2p_in_use;
1501

L
Larry Finger 已提交
1502 1503 1504 1505 1506 1507 1508 1509
	/*filters */
	u32 rx_conf;
	u16 rx_mgt_filter;
	u16 rx_ctrl_filter;
	u16 rx_data_filter;

	bool act_scanning;
	u8 cnt_after_linked;
1510
	bool skip_scan;
L
Larry Finger 已提交
1511

1512 1513 1514 1515
	/* early mode */
	/* skb wait queue */
	struct sk_buff_head skb_waitq[MAX_TID_COUNT];

1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526
	u8 ht_stbc_cap;
	u8 ht_cur_stbc;

	/*vht support*/
	u8 vht_enable;
	u8 bw_80;
	u8 vht_cur_ldpc;
	u8 vht_cur_stbc;
	u8 vht_stbc_cap;
	u8 vht_ldpc_cap;

1527 1528
	/*RDG*/
	bool rdg_en;
L
Larry Finger 已提交
1529

1530
	/*AP*/
1531
	u8 bssid[ETH_ALEN] __aligned(2);
1532 1533 1534
	u32 vendor;
	u8 mcs[16];	/* 16 bytes mcs for HT rates. */
	u32 basic_rates; /* b/g rates */
L
Larry Finger 已提交
1535 1536 1537 1538
	u8 ht_enable;
	u8 sgi_40;
	u8 sgi_20;
	u8 bw_40;
1539
	u16 mode;		/* wireless mode */
L
Larry Finger 已提交
1540 1541 1542 1543 1544
	u8 slot_time;
	u8 short_preamble;
	u8 use_cts_protect;
	u8 cur_40_prime_sc;
	u8 cur_40_prime_sc_bk;
1545
	u8 cur_80_prime_sc;
L
Larry Finger 已提交
1546 1547 1548 1549
	u64 tsf;
	u8 retry_short;
	u8 retry_long;
	u16 assoc_id;
1550
	bool hiddenssid;
L
Larry Finger 已提交
1551

1552 1553
	/*IBSS*/
	int beacon_interval;
L
Larry Finger 已提交
1554

1555 1556
	/*AMPDU*/
	u8 min_space_cfg;	/*For Min spacing configurations */
L
Larry Finger 已提交
1557 1558 1559 1560 1561 1562 1563
	u8 max_mss_density;
	u8 current_ampdu_factor;
	u8 current_ampdu_density;

	/*QOS & EDCA */
	struct ieee80211_tx_queue_params edca_param[RTL_MAC80211_NUM_QUEUE];
	struct rtl_qos_parameters ac[AC_MAX];
1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615

	/* counters */
	u64 last_txok_cnt;
	u64 last_rxok_cnt;
	u32 last_bt_edca_ul;
	u32 last_bt_edca_dl;
};

struct btdm_8723 {
	bool all_off;
	bool agc_table_en;
	bool adc_back_off_on;
	bool b2_ant_hid_en;
	bool low_penalty_rate_adaptive;
	bool rf_rx_lpf_shrink;
	bool reject_aggre_pkt;
	bool tra_tdma_on;
	u8 tra_tdma_nav;
	u8 tra_tdma_ant;
	bool tdma_on;
	u8 tdma_ant;
	u8 tdma_nav;
	u8 tdma_dac_swing;
	u8 fw_dac_swing_lvl;
	bool ps_tdma_on;
	u8 ps_tdma_byte[5];
	bool pta_on;
	u32 val_0x6c0;
	u32 val_0x6c8;
	u32 val_0x6cc;
	bool sw_dac_swing_on;
	u32 sw_dac_swing_lvl;
	u32 wlan_act_hi;
	u32 wlan_act_lo;
	u32 bt_retry_index;
	bool dec_bt_pwr;
	bool ignore_wlan_act;
};

struct bt_coexist_8723 {
	u32 high_priority_tx;
	u32 high_priority_rx;
	u32 low_priority_tx;
	u32 low_priority_rx;
	u8 c2h_bt_info;
	bool c2h_bt_info_req_sent;
	bool c2h_bt_inquiry_page;
	u32 bt_inq_page_start_time;
	u8 bt_retry_cnt;
	u8 c2h_bt_info_original;
	u8 bt_inquiry_page_cnt;
	struct btdm_8723 btdm;
L
Larry Finger 已提交
1616 1617 1618 1619
};

struct rtl_hal {
	struct ieee80211_hw *hw;
1620
	bool driver_is_goingto_unload;
L
Larry Finger 已提交
1621
	bool up_first_time;
1622
	bool first_init;
L
Larry Finger 已提交
1623 1624
	bool being_init_adapter;
	bool bbrf_ready;
1625
	bool mac_func_enable;
1626
	bool pre_edcca_enable;
1627
	struct bt_coexist_8723 hal_coex_8723;
L
Larry Finger 已提交
1628

L
Larry Finger 已提交
1629 1630
	enum intf_type interface;
	u16 hw_type;		/*92c or 92d or 92s and so on */
1631
	u8 ic_class;
L
Larry Finger 已提交
1632
	u8 oem_id;
G
George 已提交
1633
	u32 version;		/*version of chip */
L
Larry Finger 已提交
1634
	u8 state;		/*stop 0, start 1 */
1635
	u8 board_type;
1636
	u8 package_type;
1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647
	u8 external_pa;

	u8 pa_mode;
	u8 pa_type_2g;
	u8 pa_type_5g;
	u8 lna_type_2g;
	u8 lna_type_5g;
	u8 external_pa_2g;
	u8 external_lna_2g;
	u8 external_pa_5g;
	u8 external_lna_5g;
1648 1649 1650 1651
	u8 type_glna;
	u8 type_gpa;
	u8 type_alna;
	u8 type_apa;
1652
	u8 rfe_type;
L
Larry Finger 已提交
1653 1654

	/*firmware */
1655
	u32 fwsize;
L
Larry Finger 已提交
1656
	u8 *pfirmware;
G
George 已提交
1657 1658
	u16 fw_version;
	u16 fw_subversion;
1659
	bool h2c_setinprogress;
L
Larry Finger 已提交
1660
	u8 last_hmeboxnum;
L
Larry Finger 已提交
1661
	bool fw_ready;
L
Larry Finger 已提交
1662 1663
	/*Reserve page start offset except beacon in TxQ. */
	u8 fw_rsvdpage_startoffset;
1664
	u8 h2c_txcmd_seq;
1665
	u8 current_ra_rate;
1666 1667 1668 1669 1670 1671 1672

	/* FW Cmd IO related */
	u16 fwcmd_iomap;
	u32 fwcmd_ioparam;
	bool set_fwcmd_inprogress;
	u8 current_fwcmd_io;

1673
	struct p2p_ps_offload_t p2p_ps_offload;
1674 1675 1676
	bool fw_clk_change_in_progress;
	bool allow_sw_to_change_hwclc;
	u8 fw_ps_state;
1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692
	/**/
	bool driver_going2unload;

	/*AMPDU init min space*/
	u8 minspace_cfg;	/*For Min spacing configurations */

	/* Dual mac */
	enum macphy_mode macphymode;
	enum band_type current_bandtype;	/* 0:2.4G, 1:5G */
	enum band_type current_bandtypebackup;
	enum band_type bandset;
	/* dual MAC 0--Mac0 1--Mac1 */
	u32 interfaceindex;
	/* just for DualMac S3S4 */
	u8 macphyctl_reg;
	bool earlymode_enable;
1693
	u8 max_earlymode_num;
1694 1695 1696 1697 1698
	/* Dual mac*/
	bool during_mac0init_radiob;
	bool during_mac1init_radioa;
	bool reloadtxpowerindex;
	/* True if IMR or IQK  have done
1699 1700
	 * for 2.4G in scan progress
	 */
1701 1702 1703
	bool load_imrandiqk_setting_for2g;

	bool disable_amsdu_8k;
L
Larry Finger 已提交
1704 1705
	bool master_of_dmsp;
	bool slave_of_dmsp;
1706 1707 1708

	u16 rx_tag;/*for 92ee*/
	u8 rts_en;
1709 1710 1711 1712 1713 1714

	/*for wowlan*/
	bool wow_enable;
	bool enter_pnp_sleep;
	bool wake_from_pnp_sleep;
	bool wow_enabled;
1715
	time64_t last_suspend_sec;
1716 1717 1718 1719 1720 1721 1722
	u32 wowlan_fwsize;
	u8 *wowlan_firmware;

	u8 hw_rof_enable; /*Enable GPIO[9] as WL RF HW PDn source*/

	bool real_wow_v2_enable;
	bool re_init_llt_table;
L
Larry Finger 已提交
1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734
};

struct rtl_security {
	/*default 0 */
	bool use_sw_sec;

	bool being_setkey;
	bool use_defaultkey;
	/*Encryption Algorithm for Unicast Packet */
	enum rt_enc_alg pairwise_enc_algorithm;
	/*Encryption Algorithm for Brocast/Multicast */
	enum rt_enc_alg group_enc_algorithm;
1735 1736 1737
	/*Cam Entry Bitmap */
	u32 hwsec_cam_bitmap;
	u8 hwsec_cam_sta_addr[TOTAL_CAM_ENTRY][ETH_ALEN];
L
Larry Finger 已提交
1738
	/*local Key buffer, indx 0 is for
1739 1740
	 * pairwise key 1-4 is for agoup key.
	 */
L
Larry Finger 已提交
1741 1742 1743 1744
	u8 key_buf[KEY_BUF_SIZE][MAX_KEY_LEN];
	u8 key_len[KEY_BUF_SIZE];

	/*The pointer of Pairwise Key,
1745 1746
	 * it always points to KeyBuf[4]
	 */
L
Larry Finger 已提交
1747 1748 1749
	u8 *pairwise_key;
};

1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772
#define ASSOCIATE_ENTRY_NUM	33

struct fast_ant_training {
	u8	bssid[6];
	u8	antsel_rx_keep_0;
	u8	antsel_rx_keep_1;
	u8	antsel_rx_keep_2;
	u32	ant_sum[7];
	u32	ant_cnt[7];
	u32	ant_ave[7];
	u8	fat_state;
	u32	train_idx;
	u8	antsel_a[ASSOCIATE_ENTRY_NUM];
	u8	antsel_b[ASSOCIATE_ENTRY_NUM];
	u8	antsel_c[ASSOCIATE_ENTRY_NUM];
	u32	main_ant_sum[ASSOCIATE_ENTRY_NUM];
	u32	aux_ant_sum[ASSOCIATE_ENTRY_NUM];
	u32	main_ant_cnt[ASSOCIATE_ENTRY_NUM];
	u32	aux_ant_cnt[ASSOCIATE_ENTRY_NUM];
	u8	rx_idle_ant;
	bool	becomelinked;
};

1773
struct dm_phy_dbg_info {
A
Arnd Bergmann 已提交
1774
	s8 rx_snrdb[4];
1775 1776 1777 1778 1779 1780 1781 1782
	u64 num_qry_phy_status;
	u64 num_qry_phy_status_cck;
	u64 num_qry_phy_status_ofdm;
	u16 num_qry_beacon_pkt;
	u16 num_non_be_pkt;
	s32 rx_evm[4];
};

L
Larry Finger 已提交
1783
struct rtl_dm {
1784
	/*PHY status for Dynamic Management */
1785
	long entry_min_undec_sm_pwdb;
1786
	long undec_sm_cck;
1787 1788
	long undec_sm_pwdb;	/*out dm */
	long entry_max_undec_sm_pwdb;
1789
	s32 ofdm_pkt_cnt;
1790 1791 1792 1793 1794
	bool dm_initialgain_enable;
	bool dynamic_txpower_enable;
	bool current_turbo_edca;
	bool is_any_nonbepkts;	/*out dm */
	bool is_cur_rdlstate;
1795
	bool txpower_trackinginit;
1796 1797 1798 1799 1800
	bool disable_framebursting;
	bool cck_inch14;
	bool txpower_tracking;
	bool useramask;
	bool rfpath_rxenable[4];
1801 1802 1803
	bool inform_fw_driverctrldm;
	bool current_mrc_switch;
	u8 txpowercount;
1804
	u8 powerindex_backup[6];
L
Larry Finger 已提交
1805

1806
	u8 thermalvalue_rxgain;
L
Larry Finger 已提交
1807 1808 1809 1810
	u8 thermalvalue_iqk;
	u8 thermalvalue_lck;
	u8 thermalvalue;
	u8 last_dtp_lvl;
1811 1812
	u8 thermalvalue_avg[AVG_THERMAL_NUM];
	u8 thermalvalue_avg_index;
H
Hans Ulli Kroll 已提交
1813
	u8 tm_trigger;
1814
	bool done_txpower;
L
Larry Finger 已提交
1815
	u8 dynamic_txhighpower_lvl;	/*Tx high power level */
1816
	u8 dm_flag;		/*Indicate each dynamic mechanism's status. */
1817
	u8 dm_flag_tmp;
L
Larry Finger 已提交
1818
	u8 dm_type;
1819
	u8 dm_rssi_sel;
L
Larry Finger 已提交
1820
	u8 txpower_track_control;
1821 1822
	bool interrupt_migration;
	bool disable_tx_int;
A
Arnd Bergmann 已提交
1823
	s8 ofdm_index[MAX_RF_PATH];
1824 1825
	u8 default_ofdm_index;
	u8 default_cck_index;
A
Arnd Bergmann 已提交
1826 1827 1828 1829 1830 1831 1832
	s8 cck_index;
	s8 delta_power_index[MAX_RF_PATH];
	s8 delta_power_index_last[MAX_RF_PATH];
	s8 power_index_offset[MAX_RF_PATH];
	s8 absolute_ofdm_swing_idx[MAX_RF_PATH];
	s8 remnant_ofdm_swing_idx[MAX_RF_PATH];
	s8 remnant_cck_idx;
1833 1834
	bool modify_txagc_flag_path_a;
	bool modify_txagc_flag_path_b;
1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848

	bool one_entry_only;
	struct dm_phy_dbg_info dbginfo;

	/* Dynamic ATC switch */
	bool atc_status;
	bool large_cfo_hit;
	bool is_freeze;
	int cfo_tail[2];
	int cfo_ave_pre;
	int crystal_cap;
	u8 cfo_threshold;
	u32 packet_count;
	u32 packet_count_pre;
1849
	u8 tx_rate;
1850 1851

	/*88e tx power tracking*/
1852
	u8	swing_idx_ofdm[MAX_RF_PATH];
1853
	u8	swing_idx_ofdm_cur;
1854
	u8	swing_idx_ofdm_base[MAX_RF_PATH];
1855 1856 1857 1858 1859
	bool	swing_flag_ofdm;
	u8	swing_idx_cck;
	u8	swing_idx_cck_cur;
	u8	swing_idx_cck_base;
	bool	swing_flag_cck;
L
Larry Finger 已提交
1860

A
Arnd Bergmann 已提交
1861 1862
	s8	swing_diff_2g;
	s8	swing_diff_5g;
1863

L
Larry Finger 已提交
1864 1865
	/* DMSP */
	bool supp_phymode_switch;
1866

1867
	/* DulMac */
1868
	struct fast_ant_training fat_table;
1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882

	u8	resp_tx_path;
	u8	path_sel;
	u32	patha_sum;
	u32	pathb_sum;
	u32	patha_cnt;
	u32	pathb_cnt;

	u8 pre_channel;
	u8 *p_channel;
	u8 linked_interval;

	u64 last_tx_ok_cnt;
	u64 last_rx_ok_cnt;
L
Larry Finger 已提交
1883 1884
};

1885
#define	EFUSE_MAX_LOGICAL_SIZE			512
L
Larry Finger 已提交
1886 1887

struct rtl_efuse {
1888
	const struct rtl_efuse_ops *efuse_ops;
1889
	bool autoload_ok;
L
Larry Finger 已提交
1890 1891 1892 1893 1894 1895 1896 1897
	bool bootfromefuse;
	u16 max_physical_size;

	u8 efuse_map[2][EFUSE_MAX_LOGICAL_SIZE];
	u16 efuse_usedbytes;
	u8 efuse_usedpercentage;

	u8 autoload_failflag;
1898
	u8 autoload_status;
L
Larry Finger 已提交
1899 1900 1901 1902 1903 1904 1905 1906 1907

	short epromtype;
	u16 eeprom_vid;
	u16 eeprom_did;
	u16 eeprom_svid;
	u16 eeprom_smid;
	u8 eeprom_oemid;
	u16 eeprom_channelplan;
	u8 eeprom_version;
G
George 已提交
1908 1909
	u8 board_type;
	u8 external_pa;
L
Larry Finger 已提交
1910 1911

	u8 dev_addr[6];
1912 1913 1914
	u8 wowlan_enable;
	u8 antenna_div_cfg;
	u8 antenna_div_type;
L
Larry Finger 已提交
1915

1916
	bool txpwr_fromeprom;
1917
	u8 eeprom_crystalcap;
L
Larry Finger 已提交
1918
	u8 eeprom_tssi[2];
1919 1920 1921
	u8 eeprom_tssi_5g[3][2]; /* for 5GL/5GM/5GH band. */
	u8 eeprom_pwrlimit_ht20[CHANNEL_GROUP_MAX];
	u8 eeprom_pwrlimit_ht40[CHANNEL_GROUP_MAX];
1922 1923 1924
	u8 eeprom_chnlarea_txpwr_cck[MAX_RF_PATH][CHANNEL_GROUP_MAX_2G];
	u8 eeprom_chnlarea_txpwr_ht40_1s[MAX_RF_PATH][CHANNEL_GROUP_MAX];
	u8 eprom_chnl_txpwr_ht40_2sdf[MAX_RF_PATH][CHANNEL_GROUP_MAX];
1925 1926 1927 1928

	u8 internal_pa_5g[2];	/* pathA / pathB */
	u8 eeprom_c9;
	u8 eeprom_cc;
L
Larry Finger 已提交
1929 1930

	/*For power group */
1931 1932 1933 1934
	u8 eeprom_pwrgroup[2][3];
	u8 pwrgroup_ht20[2][CHANNEL_MAX_NUMBER];
	u8 pwrgroup_ht40[2][CHANNEL_MAX_NUMBER];

1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954
	u8 txpwrlevel_cck[MAX_RF_PATH][CHANNEL_MAX_NUMBER_2G];
	/*For HT 40MHZ pwr */
	u8 txpwrlevel_ht40_1s[MAX_RF_PATH][CHANNEL_MAX_NUMBER];
	/*For HT 40MHZ pwr */
	u8 txpwrlevel_ht40_2s[MAX_RF_PATH][CHANNEL_MAX_NUMBER];

	/*--------------------------------------------------------*
	 * 8192CE\8192SE\8192DE\8723AE use the following 4 arrays,
	 * other ICs (8188EE\8723BE\8192EE\8812AE...)
	 * define new arrays in Windows code.
	 * BUT, in linux code, we use the same array for all ICs.
	 *
	 * The Correspondance relation between two arrays is:
	 * txpwr_cckdiff[][] == CCK_24G_Diff[][]
	 * txpwr_ht20diff[][] == BW20_24G_Diff[][]
	 * txpwr_ht40diff[][] == BW40_24G_Diff[][]
	 * txpwr_legacyhtdiff[][] == OFDM_24G_Diff[][]
	 *
	 * Sizes of these arrays are decided by the larger ones.
	 */
A
Arnd Bergmann 已提交
1955 1956 1957 1958
	s8 txpwr_cckdiff[MAX_RF_PATH][CHANNEL_MAX_NUMBER];
	s8 txpwr_ht20diff[MAX_RF_PATH][CHANNEL_MAX_NUMBER];
	s8 txpwr_ht40diff[MAX_RF_PATH][CHANNEL_MAX_NUMBER];
	s8 txpwr_legacyhtdiff[MAX_RF_PATH][CHANNEL_MAX_NUMBER];
1959 1960 1961

	u8 txpwr_5g_bw40base[MAX_RF_PATH][CHANNEL_MAX_NUMBER];
	u8 txpwr_5g_bw80base[MAX_RF_PATH][CHANNEL_MAX_NUMBER_5G_80M];
A
Arnd Bergmann 已提交
1962 1963 1964 1965
	s8 txpwr_5g_ofdmdiff[MAX_RF_PATH][MAX_TX_COUNT];
	s8 txpwr_5g_bw20diff[MAX_RF_PATH][MAX_TX_COUNT];
	s8 txpwr_5g_bw40diff[MAX_RF_PATH][MAX_TX_COUNT];
	s8 txpwr_5g_bw80diff[MAX_RF_PATH][MAX_TX_COUNT];
1966

1967 1968 1969
	u8 txpwr_safetyflag;			/* Band edge enable flag */
	u16 eeprom_txpowerdiff;
	u8 antenna_txpwdiff[3];
L
Larry Finger 已提交
1970 1971 1972

	u8 eeprom_regulatory;
	u8 eeprom_thermalmeter;
1973 1974 1975 1976 1977
	u8 thermalmeter[2]; /*ThermalMeter, index 0 for RFIC0, 1 for RFIC1 */
	u16 tssi_13dbm;
	u8 crystalcap;		/* CrystalCap. */
	u8 delta_iqk;
	u8 delta_lck;
L
Larry Finger 已提交
1978 1979

	u8 legacy_ht_txpowerdiff;	/*Legacy to HT rate power diff */
1980
	bool apk_thermalmeterignore;
1981 1982 1983 1984 1985 1986

	bool b1x1_recvcombine;
	bool b1ss_support;

	/*channel plan */
	u8 channel_plan;
L
Larry Finger 已提交
1987 1988
};

1989 1990 1991 1992 1993 1994
struct rtl_efuse_ops {
	int (*efuse_onebyte_read)(struct ieee80211_hw *hw, u16 addr, u8 *data);
	void (*efuse_logical_map_read)(struct ieee80211_hw *hw, u8 type,
				       u16 offset, u32 *value);
};

1995 1996 1997 1998 1999
struct rtl_tx_report {
	atomic_t sn;
	u16 last_sent_sn;
	unsigned long last_sent_time;
	u16 last_recv_sn;
2000
	struct sk_buff_head queue;
2001 2002
};

L
Larry Finger 已提交
2003
struct rtl_ps_ctl {
2004
	bool pwrdomain_protect;
2005
	bool in_powersavemode;
L
Larry Finger 已提交
2006
	bool rfchange_inprogress;
2007 2008
	bool swrf_processing;
	bool hwradiooff;
2009
	/* just for PCIE ASPM
L
Larry Finger 已提交
2010 2011
	 * If it supports ASPM, Offset[560h] = 0x40,
	 * otherwise Offset[560h] = 0x00.
2012
	 */
2013 2014
	bool support_aspm;
	bool support_backdoor;
L
Larry Finger 已提交
2015 2016 2017

	/*for LPS */
	enum rt_psmode dot11_psmode;	/*Power save mode configured. */
2018
	bool swctrl_lps;
2019 2020
	bool leisure_ps;
	bool fwctrl_lps;
L
Larry Finger 已提交
2021 2022
	u8 fwctrl_psmode;
	/*For Fw control LPS mode */
2023
	u8 reg_fwctrl_lps;
L
Larry Finger 已提交
2024
	/*Record Fw PS mode status. */
2025
	bool fw_current_inpsmode;
L
Larry Finger 已提交
2026 2027
	u8 reg_max_lps_awakeintvl;
	bool report_linked;
2028
	bool low_power_enable;/*for 32k*/
L
Larry Finger 已提交
2029 2030

	/*for IPS */
2031
	bool inactiveps;
L
Larry Finger 已提交
2032 2033 2034 2035 2036 2037 2038 2039 2040

	u32 rfoff_reason;

	/*RF OFF Level */
	u32 cur_ps_level;
	u32 reg_rfps_level;

	/*just for PCIE ASPM */
	u8 const_amdpci_aspm;
G
George 已提交
2041
	bool pwrdown_mode;
2042

L
Larry Finger 已提交
2043 2044
	enum rf_pwrstate inactive_pwrstate;
	enum rf_pwrstate rfpwr_state;	/*cur power state */
2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060

	/* for SW LPS*/
	bool sw_ps_enabled;
	bool state;
	bool state_inap;
	bool multi_buffered;
	u16 nullfunc_seq;
	unsigned int dtim_counter;
	unsigned int sleep_ms;
	unsigned long last_sleep_jiffies;
	unsigned long last_awake_jiffies;
	unsigned long last_delaylps_stamp_jiffies;
	unsigned long last_dtim;
	unsigned long last_beacon;
	unsigned long last_action;
	unsigned long last_slept;
2061 2062 2063 2064 2065

	/*For P2P PS */
	struct rtl_p2p_ps_info p2p_ps_info;
	u8 pwr_mode;
	u8 smart_ps;
2066 2067 2068 2069 2070 2071 2072

	/* wake up on line */
	u8 wo_wlan_mode;
	u8 arp_offload_enable;
	u8 gtk_offload_enable;
	/* Used for WOL, indicates the reason for waking event.*/
	u32 wakeup_reason;
L
Larry Finger 已提交
2073 2074 2075
};

struct rtl_stats {
2076
	u8 psaddr[ETH_ALEN];
L
Larry Finger 已提交
2077 2078 2079 2080
	u32 mac_time[2];
	s8 rssi;
	u8 signal;
	u8 noise;
2081
	u8 rate;		/* hw desc rate */
L
Larry Finger 已提交
2082 2083 2084 2085 2086 2087 2088 2089 2090 2091
	u8 received_channel;
	u8 control;
	u8 mask;
	u8 freq;
	u16 len;
	u64 tsf;
	u32 beacon_time;
	u8 nic_type;
	u16 length;
	u8 signalquality;	/*in 0-100 index. */
2092
	/* Real power in dBm for this packet,
L
Larry Finger 已提交
2093
	 * no beautification and aggregation.
2094
	 */
L
Larry Finger 已提交
2095 2096 2097
	s32 recvsignalpower;
	s8 rxpower;		/*in dBm Translate from PWdB */
	u8 signalstrength;	/*in 0-100 index. */
2098 2099 2100 2101
	u16 hwerror:1;
	u16 crc:1;
	u16 icv:1;
	u16 shortpreamble:1;
L
Larry Finger 已提交
2102 2103 2104 2105 2106
	u16 antenna:1;
	u16 decrypted:1;
	u16 wakeup:1;
	u32 timestamp_low;
	u32 timestamp_high;
2107
	bool shift;
L
Larry Finger 已提交
2108 2109 2110

	u8 rx_drvinfo_size;
	u8 rx_bufshift;
2111
	bool isampdu;
2112
	bool isfirst_ampdu;
2113
	bool rx_is40mhzpacket;
2114
	u8 rx_packet_bw;
L
Larry Finger 已提交
2115 2116
	u32 rx_pwdb_all;
	u8 rx_mimo_signalstrength[4];	/*in 0~100 index */
2117
	s8 rx_mimo_signalquality[4];
2118 2119 2120 2121
	u8 rx_mimo_evm_dbm[4];
	u16 cfo_short[4];		/* per-path's Cfo_short */
	u16 cfo_tail[4];

2122 2123 2124
	s8 rx_mimo_sig_qual[4];
	u8 rx_pwr[4]; /* per-path's pwdb */
	u8 rx_snr[4]; /* per-path's SNR */
2125 2126
	u8 bandwidth;
	u8 bt_coex_pwr_adjust;
2127 2128
	bool packet_matchbssid;
	bool is_cck;
2129
	bool is_ht;
2130 2131
	bool packet_toself;
	bool packet_beacon;	/*for rssi */
A
Arnd Bergmann 已提交
2132
	s8 cck_adc_pwdb[4];	/*for rx path selection */
2133

2134 2135 2136 2137
	bool is_vht;
	bool is_short_gi;
	u8 vht_nss;

2138 2139 2140 2141 2142
	u8 packet_report_type;

	u32 macid;
	u32 bt_rx_rssi_percentage;
	u32 macid_valid_entry[2];
L
Larry Finger 已提交
2143 2144 2145
};

struct rt_link_detect {
L
Larry Finger 已提交
2146 2147 2148 2149
	/* count for roaming */
	u32 bcn_rx_inperiod;
	u32 roam_times;

L
Larry Finger 已提交
2150 2151 2152 2153 2154 2155
	u32 num_tx_in4period[4];
	u32 num_rx_in4period[4];

	u32 num_tx_inperiod;
	u32 num_rx_inperiod;

2156
	bool busytraffic;
L
Larry Finger 已提交
2157 2158
	bool tx_busy_traffic;
	bool rx_busy_traffic;
2159 2160
	bool higher_busytraffic;
	bool higher_busyrxtraffic;
2161 2162 2163 2164

	u32 tidtx_in4period[MAX_TID_COUNT][4];
	u32 tidtx_inperiod[MAX_TID_COUNT];
	bool higher_busytxtraffic[MAX_TID_COUNT];
L
Larry Finger 已提交
2165 2166 2167
};

struct rtl_tcb_desc {
2168
	u8 packet_bw:2;
2169 2170 2171 2172 2173 2174 2175 2176
	u8 multicast:1;
	u8 broadcast:1;

	u8 rts_stbc:1;
	u8 rts_enable:1;
	u8 cts_enable:1;
	u8 rts_use_shortpreamble:1;
	u8 rts_use_shortgi:1;
L
Larry Finger 已提交
2177
	u8 rts_sc:1;
2178
	u8 rts_bw:1;
L
Larry Finger 已提交
2179 2180 2181 2182 2183 2184 2185
	u8 rts_rate;

	u8 use_shortgi:1;
	u8 use_shortpreamble:1;
	u8 use_driver_rate:1;
	u8 disable_ratefallback:1;

2186 2187
	u8 use_spe_rpt:1;

L
Larry Finger 已提交
2188 2189 2190
	u8 ratr_index;
	u8 mac_id;
	u8 hw_rate;
2191 2192 2193 2194 2195 2196 2197 2198

	u8 last_inipkt:1;
	u8 cmd_or_init:1;
	u8 queue_index;

	/* early mode */
	u8 empkt_num;
	/* The max value by HW */
2199
	u32 empkt_len[10];
2200
	bool tx_enable_sw_calc_duration;
L
Larry Finger 已提交
2201 2202
};

2203 2204 2205 2206 2207 2208
struct rtl_wow_pattern {
	u8 type;
	u16 crc;
	u32 mask[4];
};

2209 2210 2211 2212 2213 2214 2215 2216
/* struct to store contents of interrupt vectors */
struct rtl_int {
	u32 inta;
	u32 intb;
	u32 intc;
	u32 intd;
};

L
Larry Finger 已提交
2217
struct rtl_hal_ops {
2218 2219
	int (*init_sw_vars)(struct ieee80211_hw *hw);
	void (*deinit_sw_vars)(struct ieee80211_hw *hw);
L
Larry Finger 已提交
2220
	void (*read_chip_version)(struct ieee80211_hw *hw);
2221 2222
	void (*read_eeprom_info)(struct ieee80211_hw *hw);
	void (*interrupt_recognized)(struct ieee80211_hw *hw,
2223
				     struct rtl_int *intvec);
2224 2225 2226 2227 2228 2229 2230
	int (*hw_init)(struct ieee80211_hw *hw);
	void (*hw_disable)(struct ieee80211_hw *hw);
	void (*hw_suspend)(struct ieee80211_hw *hw);
	void (*hw_resume)(struct ieee80211_hw *hw);
	void (*enable_interrupt)(struct ieee80211_hw *hw);
	void (*disable_interrupt)(struct ieee80211_hw *hw);
	int (*set_network_type)(struct ieee80211_hw *hw,
2231
				enum nl80211_iftype type);
G
George 已提交
2232
	void (*set_chk_bssid)(struct ieee80211_hw *hw,
2233
			      bool check_bssid);
2234
	void (*set_bw_mode)(struct ieee80211_hw *hw,
2235
			    enum nl80211_channel_type ch_type);
2236 2237 2238 2239 2240
	 u8 (*switch_channel)(struct ieee80211_hw *hw);
	void (*set_qos)(struct ieee80211_hw *hw, int aci);
	void (*set_bcn_reg)(struct ieee80211_hw *hw);
	void (*set_bcn_intv)(struct ieee80211_hw *hw);
	void (*update_interrupt_mask)(struct ieee80211_hw *hw,
2241
				      u32 add_msr, u32 rm_msr);
2242 2243 2244
	void (*get_hw_reg)(struct ieee80211_hw *hw, u8 variable, u8 *val);
	void (*set_hw_reg)(struct ieee80211_hw *hw, u8 variable, u8 *val);
	void (*update_rate_tbl)(struct ieee80211_hw *hw,
2245 2246
				struct ieee80211_sta *sta, u8 rssi_leve,
				bool update_bw);
2247 2248 2249
	void (*pre_fill_tx_bd_desc)(struct ieee80211_hw *hw, u8 *tx_bd_desc,
				    u8 *desc, u8 queue_index,
				    struct sk_buff *skb, dma_addr_t addr);
2250
	void (*update_rate_mask)(struct ieee80211_hw *hw, u8 rssi_level);
2251 2252 2253 2254
	u16 (*rx_desc_buff_remained_cnt)(struct ieee80211_hw *hw,
					 u8 queue_index);
	void (*rx_check_dma_ok)(struct ieee80211_hw *hw, u8 *header_desc,
				u8 queue_index);
2255
	void (*fill_tx_desc)(struct ieee80211_hw *hw,
2256 2257 2258 2259 2260 2261
			     struct ieee80211_hdr *hdr, u8 *pdesc_tx,
			     u8 *pbd_desc_tx,
			     struct ieee80211_tx_info *info,
			     struct ieee80211_sta *sta,
			     struct sk_buff *skb, u8 hw_queue,
			     struct rtl_tcb_desc *ptcb_desc);
2262 2263
	void (*fill_fake_txdesc)(struct ieee80211_hw *hw, u8 *pdesc,
				 u32 buffer_len, bool bsspspoll);
2264
	void (*fill_tx_cmddesc)(struct ieee80211_hw *hw, u8 *pdesc,
2265 2266
				bool firstseg, bool lastseg,
				struct sk_buff *skb);
2267 2268 2269
	void (*fill_tx_special_desc)(struct ieee80211_hw *hw,
				     u8 *pdesc, u8 *pbd_desc,
				     struct sk_buff *skb, u8 hw_queue);
2270
	bool (*query_rx_desc)(struct ieee80211_hw *hw,
2271 2272 2273
			      struct rtl_stats *stats,
			      struct ieee80211_rx_status *rx_status,
			      u8 *pdesc, struct sk_buff *skb);
2274 2275 2276 2277 2278
	void (*set_channel_access)(struct ieee80211_hw *hw);
	bool (*radio_onoff_checking)(struct ieee80211_hw *hw, u8 *valid);
	void (*dm_watchdog)(struct ieee80211_hw *hw);
	void (*scan_operation_backup)(struct ieee80211_hw *hw, u8 operation);
	bool (*set_rf_power_state)(struct ieee80211_hw *hw,
2279
				   enum rf_pwrstate rfpwr_state);
2280
	void (*led_control)(struct ieee80211_hw *hw,
2281
			    enum led_ctl_mode ledaction);
2282 2283
	void (*set_desc)(struct ieee80211_hw *hw, u8 *pdesc, bool istx,
			 u8 desc_name, u8 *val);
2284 2285
	u64 (*get_desc)(struct ieee80211_hw *hw, u8 *pdesc, bool istx,
			u8 desc_name);
2286
	bool (*is_tx_desc_closed)(struct ieee80211_hw *hw,
2287
				  u8 hw_queue, u16 index);
2288 2289 2290
	void (*tx_polling)(struct ieee80211_hw *hw, u8 hw_queue);
	void (*enable_hw_sec)(struct ieee80211_hw *hw);
	void (*set_key)(struct ieee80211_hw *hw, u32 key_index,
2291 2292
			u8 *macaddr, bool is_group, u8 enc_algo,
			bool is_wepkey, bool clear_all);
2293 2294 2295 2296
	void (*init_sw_leds)(struct ieee80211_hw *hw);
	void (*deinit_sw_leds)(struct ieee80211_hw *hw);
	u32 (*get_bbreg)(struct ieee80211_hw *hw, u32 regaddr, u32 bitmask);
	void (*set_bbreg)(struct ieee80211_hw *hw, u32 regaddr, u32 bitmask,
2297
			  u32 data);
2298
	u32 (*get_rfreg)(struct ieee80211_hw *hw, enum radio_path rfpath,
2299
			 u32 regaddr, u32 bitmask);
2300
	void (*set_rfreg)(struct ieee80211_hw *hw, enum radio_path rfpath,
2301
			  u32 regaddr, u32 bitmask, u32 data);
2302 2303 2304 2305 2306 2307
	void (*linked_set_reg)(struct ieee80211_hw *hw);
	void (*chk_switch_dmdp)(struct ieee80211_hw *hw);
	void (*dualmac_easy_concurrent)(struct ieee80211_hw *hw);
	void (*dualmac_switch_to_dmdp)(struct ieee80211_hw *hw);
	bool (*phy_rf6052_config)(struct ieee80211_hw *hw);
	void (*phy_rf6052_set_cck_txpower)(struct ieee80211_hw *hw,
2308
					   u8 *powerlevel);
2309
	void (*phy_rf6052_set_ofdm_txpower)(struct ieee80211_hw *hw,
2310
					    u8 *ppowerlevel, u8 channel);
2311
	bool (*config_bb_with_headerfile)(struct ieee80211_hw *hw,
2312
					  u8 configtype);
2313
	bool (*config_bb_with_pgheaderfile)(struct ieee80211_hw *hw,
2314
					    u8 configtype);
2315 2316 2317 2318 2319
	void (*phy_lc_calibrate)(struct ieee80211_hw *hw, bool is2t);
	void (*phy_set_bw_mode_callback)(struct ieee80211_hw *hw);
	void (*dm_dynamic_txpower)(struct ieee80211_hw *hw);
	void (*c2h_command_handle)(struct ieee80211_hw *hw);
	void (*bt_wifi_media_status_notify)(struct ieee80211_hw *hw,
2320
					    bool mstate);
2321 2322
	void (*bt_coex_off_before_lps)(struct ieee80211_hw *hw);
	void (*fill_h2c_cmd)(struct ieee80211_hw *hw, u8 element_id,
2323
			     u32 cmd_len, u8 *p_cmdbuffer);
2324
	void (*set_default_port_id_cmd)(struct ieee80211_hw *hw);
2325
	bool (*get_btc_status)(void);
2326
	bool (*is_fw_header)(struct rtlwifi_firmware_header *hdr);
2327 2328 2329
	void (*add_wowlan_pattern)(struct ieee80211_hw *hw,
				   struct rtl_wow_pattern *rtl_pattern,
				   u8 index);
2330
	u16 (*get_available_desc)(struct ieee80211_hw *hw, u8 q_idx);
2331 2332
	void (*c2h_ra_report_handler)(struct ieee80211_hw *hw,
				      u8 *cmd_buf, u8 cmd_len);
L
Larry Finger 已提交
2333 2334 2335 2336
};

struct rtl_intf_ops {
	/*com */
2337
	void (*read_efuse_byte)(struct ieee80211_hw *hw, u16 _offset, u8 *pbuf);
2338 2339
	int (*adapter_start)(struct ieee80211_hw *hw);
	void (*adapter_stop)(struct ieee80211_hw *hw);
L
Larry Finger 已提交
2340 2341
	bool (*check_buddy_priv)(struct ieee80211_hw *hw,
				 struct rtl_priv **buddy_priv);
L
Larry Finger 已提交
2342

2343
	int (*adapter_tx)(struct ieee80211_hw *hw,
2344 2345 2346
			  struct ieee80211_sta *sta,
			  struct sk_buff *skb,
			  struct rtl_tcb_desc *ptcb_desc);
2347
	void (*flush)(struct ieee80211_hw *hw, u32 queues, bool drop);
2348 2349
	int (*reset_trx_ring)(struct ieee80211_hw *hw);
	bool (*waitq_insert)(struct ieee80211_hw *hw,
2350 2351
			     struct ieee80211_sta *sta,
			     struct sk_buff *skb);
L
Larry Finger 已提交
2352 2353

	/*pci */
2354 2355
	void (*disable_aspm)(struct ieee80211_hw *hw);
	void (*enable_aspm)(struct ieee80211_hw *hw);
L
Larry Finger 已提交
2356 2357 2358 2359 2360

	/*usb */
};

struct rtl_mod_params {
2361 2362
	/* default: 0,0 */
	u64 debug_mask;
L
Larry Finger 已提交
2363
	/* default: 0 = using hardware encryption */
2364
	bool sw_crypto;
2365

2366
	/* default: 0 = DBG_EMERG (0)*/
2367
	int debug_level;
2368

2369 2370 2371 2372 2373 2374 2375 2376
	/* default: 1 = using no linked power save */
	bool inactiveps;

	/* default: 1 = using linked sw power save */
	bool swctrl_lps;

	/* default: 1 = using linked fw power save */
	bool fwctrl_lps;
2377

2378 2379 2380
	/* default: 0 = not using MSI interrupts mode
	 * submodules should set their own default value
	 */
2381
	bool msi_support;
2382

2383 2384 2385
	/* default: 0 = dma 32 */
	bool dma64;

P
Ping-Ke Shih 已提交
2386 2387 2388
	/* default: 1 = enable aspm */
	int aspm_support;

2389 2390
	/* default 0: 1 means disable */
	bool disable_watchdog;
2391 2392 2393

	/* default 0: 1 means do not disable interrupts */
	bool int_clear;
2394 2395 2396

	/* select antenna */
	int ant_sel;
L
Larry Finger 已提交
2397 2398
};

L
Larry Finger 已提交
2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418
struct rtl_hal_usbint_cfg {
	/* data - rx */
	u32 in_ep_num;
	u32 rx_urb_num;
	u32 rx_max_size;

	/* op - rx */
	void (*usb_rx_hdl)(struct ieee80211_hw *, struct sk_buff *);
	void (*usb_rx_segregate_hdl)(struct ieee80211_hw *, struct sk_buff *,
				     struct sk_buff_head *);

	/* tx */
	void (*usb_tx_cleanup)(struct ieee80211_hw *, struct sk_buff *);
	int (*usb_tx_post_hdl)(struct ieee80211_hw *, struct urb *,
			       struct sk_buff *);
	struct sk_buff *(*usb_tx_aggregate_hdl)(struct ieee80211_hw *,
						struct sk_buff_head *);

	/* endpoint mapping */
	int (*usb_endpoint_mapping)(struct ieee80211_hw *hw);
2419
	u16 (*usb_mq_to_hwq)(__le16 fc, u16 mac80211_queue_index);
L
Larry Finger 已提交
2420 2421
};

L
Larry Finger 已提交
2422
struct rtl_hal_cfg {
2423
	u8 bar_id;
2424
	bool write_readback;
L
Larry Finger 已提交
2425
	char *name;
2426
	char *alt_fw_name;
L
Larry Finger 已提交
2427 2428
	struct rtl_hal_ops *ops;
	struct rtl_mod_params *mod_params;
L
Larry Finger 已提交
2429
	struct rtl_hal_usbint_cfg *usb_interface_cfg;
2430
	enum rtl_spec_ver spec_ver;
L
Larry Finger 已提交
2431 2432

	/*this map used for some registers or vars
2433 2434
	 * defined int HAL but used in MAIN
	 */
L
Larry Finger 已提交
2435 2436 2437 2438 2439
	u32 maps[RTL_VAR_MAP_MAX];

};

struct rtl_locks {
2440
	/* mutex */
2441
	struct mutex conf_mutex;
2442 2443
	struct mutex ips_mutex;	/* mutex for enter/leave IPS */
	struct mutex lps_mutex;	/* mutex for enter/leave LPS */
L
Larry Finger 已提交
2444 2445 2446 2447 2448 2449

	/*spin lock */
	spinlock_t irq_th_lock;
	spinlock_t h2c_lock;
	spinlock_t rf_ps_lock;
	spinlock_t rf_lock;
2450
	spinlock_t waitq_lock;
L
Larry Finger 已提交
2451
	spinlock_t entry_list_lock;
2452
	spinlock_t usb_lock;
2453
	spinlock_t scan_list_lock; /* lock for the scan list */
2454

2455 2456 2457
	/*FW clock change */
	spinlock_t fw_ps_lock;

2458 2459
	/*Dual mac*/
	spinlock_t cck_and_rw_pagea_lock;
L
Larry Finger 已提交
2460

2461
	spinlock_t iqk_lock;
L
Larry Finger 已提交
2462 2463 2464 2465 2466 2467 2468
};

struct rtl_works {
	struct ieee80211_hw *hw;

	/*timer */
	struct timer_list watchdog_timer;
L
Larry Finger 已提交
2469
	struct timer_list dualmac_easyconcurrent_retrytimer;
2470 2471
	struct timer_list fw_clockoff_timer;
	struct timer_list fast_antenna_training_timer;
L
Larry Finger 已提交
2472 2473 2474 2475 2476 2477 2478 2479
	/*task */
	struct tasklet_struct irq_tasklet;
	struct tasklet_struct irq_prepare_bcn_tasklet;

	/*work queue */
	struct workqueue_struct *rtl_wq;
	struct delayed_work watchdog_wq;
	struct delayed_work ips_nic_off_wq;
2480
	struct delayed_work c2hcmd_wq;
2481 2482 2483 2484

	/* For SW LPS */
	struct delayed_work ps_work;
	struct delayed_work ps_rfon_wq;
2485
	struct delayed_work fwevt_wq;
S
Stanislaw Gruszka 已提交
2486

2487
	struct work_struct lps_change_work;
2488
	struct work_struct fill_h2c_cmd;
L
Larry Finger 已提交
2489 2490
};

2491 2492 2493 2494 2495 2496
struct rtl_debug {
	/* add for debug */
	struct dentry *debugfs_dir;
	char debugfs_name[20];
};

L
Larry Finger 已提交
2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521
#define MIMO_PS_STATIC			0
#define MIMO_PS_DYNAMIC			1
#define MIMO_PS_NOLIMIT			3

struct rtl_dualmac_easy_concurrent_ctl {
	enum band_type currentbandtype_backfordmdp;
	bool close_bbandrf_for_dmsp;
	bool change_to_dmdp;
	bool change_to_dmsp;
	bool switch_in_process;
};

struct rtl_dmsp_ctl {
	bool activescan_for_slaveofdmsp;
	bool scan_for_anothermac_fordmsp;
	bool scan_for_itself_fordmsp;
	bool writedig_for_anothermacofdmsp;
	u32 curdigvalue_for_anothermacofdmsp;
	bool changecckpdstate_for_anothermacofdmsp;
	u8 curcckpdstate_for_anothermacofdmsp;
	bool changetxhighpowerlvl_for_anothermacofdmsp;
	u8 curtxhighlvl_for_anothermacofdmsp;
	long rssivalmin_for_anothermacofdmsp;
};

2522 2523 2524 2525 2526
struct ps_t {
	u8 pre_ccastate;
	u8 cur_ccasate;
	u8 pre_rfstate;
	u8 cur_rfstate;
2527
	u8 initialize;
2528 2529 2530 2531 2532 2533 2534 2535
	long rssi_val_min;
};

struct dig_t {
	u32 rssi_lowthresh;
	u32 rssi_highthresh;
	u32 fa_lowthresh;
	u32 fa_highthresh;
2536
	long last_min_undec_pwdb_for_dm;
2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548
	long rssi_highpower_lowthresh;
	long rssi_highpower_highthresh;
	u32 recover_cnt;
	u32 pre_igvalue;
	u32 cur_igvalue;
	long rssi_val;
	u8 dig_enable_flag;
	u8 dig_ext_port_stage;
	u8 dig_algorithm;
	u8 dig_twoport_algorithm;
	u8 dig_dbgmode;
	u8 dig_slgorithm_switch;
2549 2550 2551
	u8 cursta_cstate;
	u8 presta_cstate;
	u8 curmultista_cstate;
2552
	u8 stop_dig;
A
Arnd Bergmann 已提交
2553 2554 2555
	s8 back_val;
	s8 back_range_max;
	s8 back_range_min;
2556 2557
	u8 rx_gain_max;
	u8 rx_gain_min;
2558
	u8 min_undec_pwdb_for_dm;
2559
	u8 rssi_val_min;
2560 2561
	u8 pre_cck_cca_thres;
	u8 cur_cck_cca_thres;
2562 2563 2564 2565 2566 2567 2568 2569 2570 2571
	u8 pre_cck_pd_state;
	u8 cur_cck_pd_state;
	u8 pre_cck_fa_state;
	u8 cur_cck_fa_state;
	u8 pre_ccastate;
	u8 cur_ccasate;
	u8 large_fa_hit;
	u8 forbidden_igi;
	u8 dig_state;
	u8 dig_highpwrstate;
2572 2573 2574 2575
	u8 cur_sta_cstate;
	u8 pre_sta_cstate;
	u8 cur_ap_cstate;
	u8 pre_ap_cstate;
2576 2577 2578 2579 2580
	u8 cur_pd_thstate;
	u8 pre_pd_thstate;
	u8 cur_cs_ratiostate;
	u8 pre_cs_ratiostate;
	u8 backoff_enable_flag;
A
Arnd Bergmann 已提交
2581 2582
	s8 backoffval_range_max;
	s8 backoffval_range_min;
2583 2584
	u8 dig_min_0;
	u8 dig_min_1;
2585
	u8 bt30_cur_igi;
2586 2587 2588 2589 2590
	bool media_connect_0;
	bool media_connect_1;

	u32 antdiv_rssi_max;
	u32 rssi_max;
2591 2592
};

L
Larry Finger 已提交
2593 2594
struct rtl_global_var {
	/* from this list we can get
2595 2596
	 * other adapter's rtl_priv
	 */
L
Larry Finger 已提交
2597 2598 2599 2600
	struct list_head glb_priv_list;
	spinlock_t glb_list_lock;
};

2601 2602
#define IN_4WAY_TIMEOUT_TIME	(30 * MSEC_PER_SEC)	/* 30 seconds */

2603 2604 2605 2606
struct rtl_btc_info {
	u8 bt_type;
	u8 btcoexist;
	u8 ant_num;
2607
	u8 single_ant_path;
2608 2609

	u8 ap_num;
2610
	bool in_4way;
2611
	unsigned long in_4way_ts;
2612 2613
};

2614
struct bt_coexist_info {
2615 2616
	struct rtl_btc_ops *btc_ops;
	struct rtl_btc_info btc_info;
2617 2618
	/* btc context */
	void *btc_context;
2619
	void *wifi_only_context;
2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671
	/* EEPROM BT info. */
	u8 eeprom_bt_coexist;
	u8 eeprom_bt_type;
	u8 eeprom_bt_ant_num;
	u8 eeprom_bt_ant_isol;
	u8 eeprom_bt_radio_shared;

	u8 bt_coexistence;
	u8 bt_ant_num;
	u8 bt_coexist_type;
	u8 bt_state;
	u8 bt_cur_state;	/* 0:on, 1:off */
	u8 bt_ant_isolation;	/* 0:good, 1:bad */
	u8 bt_pape_ctrl;	/* 0:SW, 1:SW/HW dynamic */
	u8 bt_service;
	u8 bt_radio_shared_type;
	u8 bt_rfreg_origin_1e;
	u8 bt_rfreg_origin_1f;
	u8 bt_rssi_state;
	u32 ratio_tx;
	u32 ratio_pri;
	u32 bt_edca_ul;
	u32 bt_edca_dl;

	bool init_set;
	bool bt_busy_traffic;
	bool bt_traffic_mode_set;
	bool bt_non_traffic_mode_set;

	bool fw_coexist_all_off;
	bool sw_coexist_all_off;
	bool hw_coexist_all_off;
	u32 cstate;
	u32 previous_state;
	u32 cstate_h;
	u32 previous_state_h;

	u8 bt_pre_rssi_state;
	u8 bt_pre_rssi_state1;

	u8 reg_bt_iso;
	u8 reg_bt_sco;
	bool balance_on;
	u8 bt_active_zero_cnt;
	bool cur_bt_disabled;
	bool pre_bt_disabled;

	u8 bt_profile_case;
	u8 bt_profile_action;
	bool bt_busy;
	bool hold_for_bt_operation;
	u8 lps_counter;
2672 2673 2674
};

struct rtl_btc_ops {
2675
	void (*btc_init_variables)(struct rtl_priv *rtlpriv);
2676
	void (*btc_init_variables_wifi_only)(struct rtl_priv *rtlpriv);
2677
	void (*btc_deinit_variables)(struct rtl_priv *rtlpriv);
2678
	void (*btc_init_hal_vars)(struct rtl_priv *rtlpriv);
2679
	void (*btc_power_on_setting)(struct rtl_priv *rtlpriv);
2680
	void (*btc_init_hw_config)(struct rtl_priv *rtlpriv);
2681
	void (*btc_init_hw_config_wifi_only)(struct rtl_priv *rtlpriv);
2682
	void (*btc_ips_notify)(struct rtl_priv *rtlpriv, u8 type);
2683
	void (*btc_lps_notify)(struct rtl_priv *rtlpriv, u8 type);
2684
	void (*btc_scan_notify)(struct rtl_priv *rtlpriv, u8 scantype);
2685 2686
	void (*btc_scan_notify_wifi_only)(struct rtl_priv *rtlpriv,
					  u8 scantype);
2687 2688
	void (*btc_connect_notify)(struct rtl_priv *rtlpriv, u8 action);
	void (*btc_mediastatus_notify)(struct rtl_priv *rtlpriv,
2689
				       enum rt_media_status mstatus);
2690
	void (*btc_periodical)(struct rtl_priv *rtlpriv);
2691
	void (*btc_halt_notify)(struct rtl_priv *rtlpriv);
2692
	void (*btc_btinfo_notify)(struct rtl_priv *rtlpriv,
2693
				  u8 *tmp_buf, u8 length);
2694 2695
	void (*btc_btmpinfo_notify)(struct rtl_priv *rtlpriv,
				    u8 *tmp_buf, u8 length);
2696 2697 2698
	bool (*btc_is_limited_dig)(struct rtl_priv *rtlpriv);
	bool (*btc_is_disable_edca_turbo)(struct rtl_priv *rtlpriv);
	bool (*btc_is_bt_disabled)(struct rtl_priv *rtlpriv);
2699 2700
	void (*btc_special_packet_notify)(struct rtl_priv *rtlpriv,
					  u8 pkt_type);
2701 2702
	void (*btc_switch_band_notify)(struct rtl_priv *rtlpriv, u8 type,
				       bool scanning);
2703 2704
	void (*btc_switch_band_notify_wifi_only)(struct rtl_priv *rtlpriv,
						 u8 type, bool scanning);
2705 2706
	void (*btc_display_bt_coex_info)(struct rtl_priv *rtlpriv,
					 struct seq_file *m);
2707
	void (*btc_record_pwr_mode)(struct rtl_priv *rtlpriv, u8 *buf, u8 len);
2708 2709 2710
	u8   (*btc_get_lps_val)(struct rtl_priv *rtlpriv);
	u8   (*btc_get_rpwm_val)(struct rtl_priv *rtlpriv);
	bool (*btc_is_bt_ctrl_lps)(struct rtl_priv *rtlpriv);
2711 2712
	void (*btc_get_ampdu_cfg)(struct rtl_priv *rtlpriv, u8 *reject_agg,
				  u8 *ctrl_agg_size, u8 *agg_size);
2713
	bool (*btc_is_bt_lps_on)(struct rtl_priv *rtlpriv);
2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724
};

struct proxim {
	bool proxim_on;

	void *proximity_priv;
	int (*proxim_rx)(struct ieee80211_hw *hw, struct rtl_stats *status,
			 struct sk_buff *skb);
	u8  (*proxim_get_var)(struct ieee80211_hw *hw, u8 type);
};

2725 2726 2727 2728 2729 2730 2731
struct rtl_c2hcmd {
	struct list_head list;
	u8 tag;
	u8 len;
	u8 *val;
};

2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742
struct rtl_bssid_entry {
	struct list_head list;
	u8 bssid[ETH_ALEN];
	u32 age;
};

struct rtl_scan_list {
	int num;
	struct list_head list;	/* sort by age */
};

L
Larry Finger 已提交
2743
struct rtl_priv {
2744
	struct ieee80211_hw *hw;
2745
	struct completion firmware_loading_complete;
L
Larry Finger 已提交
2746 2747 2748 2749 2750
	struct list_head list;
	struct rtl_priv *buddy_priv;
	struct rtl_global_var *glb_var;
	struct rtl_dualmac_easy_concurrent_ctl easy_concurrent_ctl;
	struct rtl_dmsp_ctl dmsp_ctl;
L
Larry Finger 已提交
2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761
	struct rtl_locks locks;
	struct rtl_works works;
	struct rtl_mac mac80211;
	struct rtl_hal rtlhal;
	struct rtl_regulatory regd;
	struct rtl_rfkill rfkill;
	struct rtl_io io;
	struct rtl_phy phy;
	struct rtl_dm dm;
	struct rtl_security sec;
	struct rtl_efuse efuse;
2762
	struct rtl_led_ctl ledctl;
2763
	struct rtl_tx_report tx_report;
2764
	struct rtl_scan_list scan_list;
L
Larry Finger 已提交
2765 2766 2767

	struct rtl_ps_ctl psc;
	struct rate_adaptive ra;
2768
	struct dynamic_primary_cca primarycca;
L
Larry Finger 已提交
2769 2770 2771 2772 2773 2774
	struct wireless_stats stats;
	struct rt_link_detect link_info;
	struct false_alarm_statistics falsealm_cnt;

	struct rtl_rate_priv *rate_priv;

L
Larry Finger 已提交
2775 2776 2777
	/* sta entry list for ap adhoc or mesh */
	struct list_head entry_list;

2778
	/* c2hcmd list for kthread level access */
2779
	struct sk_buff_head c2hcmd_queue;
2780

2781
	struct rtl_debug dbg;
2782
	int max_fw_size;
L
Larry Finger 已提交
2783

2784 2785
	/* hal_cfg : for diff cards
	 * intf_ops : for diff interrface usb/pcie
L
Larry Finger 已提交
2786 2787
	 */
	struct rtl_hal_cfg *cfg;
2788
	const struct rtl_intf_ops *intf_ops;
L
Larry Finger 已提交
2789

2790 2791 2792 2793
	/* this var will be set by set_bit,
	 * and was used to indicate status of
	 * interface or hardware
	 */
L
Larry Finger 已提交
2794 2795
	unsigned long status;

2796 2797 2798 2799
	/* tables for dm */
	struct dig_t dm_digtable;
	struct ps_t dm_pstable;

2800 2801 2802 2803 2804 2805 2806 2807 2808
	u32 reg_874;
	u32 reg_c70;
	u32 reg_85c;
	u32 reg_a74;
	bool reg_init;	/* true if regs saved */
	bool bt_operation_on;
	__le32 *usb_data;
	int usb_data_index;
	bool initialized;
2809
	bool enter_ps;	/* true when entering PS */
2810
	u8 rate_mask[5];
2811

2812 2813 2814 2815 2816 2817 2818
	/* intel Proximity, should be alloc mem
	 * in intel Proximity module and can only
	 * be used in intel Proximity mode
	 */
	struct proxim proximity;

	/*for bt coexist use*/
2819
	struct bt_coexist_info btcoexist;
2820 2821 2822 2823 2824 2825

	/* separate 92ee from other ICs,
	 * 92ee use new trx flow.
	 */
	bool use_new_trx_flow;

2826 2827 2828
#ifdef CONFIG_PM
	struct wiphy_wowlan_support wowlan;
#endif
2829 2830 2831 2832 2833
	/* This must be the last item so
	 * that it points to the data allocated
	 * beyond  this structure like:
	 * rtl_pci_priv or rtl_usb_priv
	 */
2834
	u8 priv[0] __aligned(sizeof(void *));
L
Larry Finger 已提交
2835 2836 2837 2838 2839 2840 2841 2842
};

#define rtl_priv(hw)		(((struct rtl_priv *)(hw)->priv))
#define rtl_mac(rtlpriv)	(&((rtlpriv)->mac80211))
#define rtl_hal(rtlpriv)	(&((rtlpriv)->rtlhal))
#define rtl_efuse(rtlpriv)	(&((rtlpriv)->efuse))
#define rtl_psc(rtlpriv)	(&((rtlpriv)->psc))

2843
/* Bluetooth Co-existence Related */
G
George 已提交
2844 2845 2846 2847 2848 2849

enum bt_ant_num {
	ANT_X2 = 0,
	ANT_X1 = 1,
};

2850 2851 2852 2853 2854
enum bt_ant_path {
	ANT_MAIN = 0,
	ANT_AUX = 1,
};

G
George 已提交
2855 2856 2857 2858 2859 2860 2861
enum bt_co_type {
	BT_2WIRE = 0,
	BT_ISSC_3WIRE = 1,
	BT_ACCEL = 2,
	BT_CSR_BC4 = 3,
	BT_CSR_BC8 = 4,
	BT_RTL8756 = 5,
2862
	BT_RTL8723A = 6,
2863
	BT_RTL8821A = 7,
2864 2865
	BT_RTL8723B = 8,
	BT_RTL8192E = 9,
2866 2867 2868
	BT_RTL8812A = 11,
};

G
George 已提交
2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891
enum bt_cur_state {
	BT_OFF = 0,
	BT_ON = 1,
};

enum bt_service_type {
	BT_SCO = 0,
	BT_A2DP = 1,
	BT_HID = 2,
	BT_HID_IDLE = 3,
	BT_SCAN = 4,
	BT_IDLE = 5,
	BT_OTHER_ACTION = 6,
	BT_BUSY = 7,
	BT_OTHERBUSY = 8,
	BT_PAN = 9,
};

enum bt_radio_shared {
	BT_RADIO_SHARED = 0,
	BT_RADIO_INDIVIDUAL = 1,
};

L
Larry Finger 已提交
2892
/****************************************
2893 2894 2895 2896 2897 2898
 *	mem access macro define start
 *	Call endian free function when
 *	1. Read/write packet content.
 *	2. Before write integer to IO.
 *	3. After read integer from IO.
 ****************************************/
L
Larry Finger 已提交
2899

2900 2901 2902
#define	N_BYTE_ALIGMENT(__value, __aligment) ((__aligment == 1) ? \
	(__value) : (((__value + __aligment - 1) / __aligment) * __aligment))

2903
/* mem access macro define end */
L
Larry Finger 已提交
2904

2905 2906
#define byte(x, n) ((x >> (8 * n)) & 0xff)

2907
#define packet_get_type(_packet) (EF1BYTE((_packet).octet[0]) & 0xFC)
L
Larry Finger 已提交
2908 2909
#define RTL_WATCH_DOG_TIME	2000
#define MSECS(t)		msecs_to_jiffies(t)
2910 2911 2912 2913
#define WLAN_FC_GET_VERS(fc)	(le16_to_cpu(fc) & IEEE80211_FCTL_VERS)
#define WLAN_FC_GET_TYPE(fc)	(le16_to_cpu(fc) & IEEE80211_FCTL_FTYPE)
#define WLAN_FC_GET_STYPE(fc)	(le16_to_cpu(fc) & IEEE80211_FCTL_STYPE)
#define WLAN_FC_MORE_DATA(fc)	(le16_to_cpu(fc) & IEEE80211_FCTL_MOREDATA)
2914
#define rtl_dm(rtlpriv)		(&((rtlpriv)->dm))
L
Larry Finger 已提交
2915 2916 2917 2918 2919 2920 2921 2922 2923 2924

#define	RT_RF_OFF_LEVL_ASPM		BIT(0)	/*PCI ASPM */
#define	RT_RF_OFF_LEVL_CLK_REQ		BIT(1)	/*PCI clock request */
#define	RT_RF_OFF_LEVL_PCI_D3		BIT(2)	/*PCI D3 mode */
/*NIC halt, re-initialize hw parameters*/
#define	RT_RF_OFF_LEVL_HALT_NIC		BIT(3)
#define	RT_RF_OFF_LEVL_FREE_FW		BIT(4)	/*FW free, re-download the FW */
#define	RT_RF_OFF_LEVL_FW_32K		BIT(5)	/*FW in 32k */
/*Always enable ASPM and Clock Req in initialization.*/
#define	RT_RF_PS_LEVEL_ALWAYS_ASPM	BIT(6)
2925 2926
/* no matter RFOFF or SLEEP we set PS_ASPM_LEVL*/
#define	RT_PS_LEVEL_ASPM		BIT(7)
L
Larry Finger 已提交
2927 2928 2929 2930 2931 2932 2933 2934 2935 2936
/*When LPS is on, disable 2R if no packet is received or transmittd.*/
#define	RT_RF_LPS_DISALBE_2R		BIT(30)
#define	RT_RF_LPS_LEVEL_ASPM		BIT(31)	/*LPS with ASPM */
#define	RT_IN_PS_LEVEL(ppsc, _ps_flg)		\
	((ppsc->cur_ps_level & _ps_flg) ? true : false)
#define	RT_CLEAR_PS_LEVEL(ppsc, _ps_flg)	\
	(ppsc->cur_ps_level &= (~(_ps_flg)))
#define	RT_SET_PS_LEVEL(ppsc, _ps_flg)		\
	(ppsc->cur_ps_level |= _ps_flg)

2937 2938 2939 2940 2941 2942 2943 2944 2945
#define FILL_OCTET_STRING(_os, _octet, _len)	\
		(_os).octet = (u8 *)(_octet);		\
		(_os).length = (_len);

#define CP_MACADDR(des, src)	\
	((des)[0] = (src)[0], (des)[1] = (src)[1],\
	(des)[2] = (src)[2], (des)[3] = (src)[3],\
	(des)[4] = (src)[4], (des)[5] = (src)[5])

2946 2947 2948 2949 2950 2951 2952 2953 2954 2955 2956 2957 2958 2959 2960 2961 2962 2963 2964 2965
#define	LDPC_HT_ENABLE_RX			BIT(0)
#define	LDPC_HT_ENABLE_TX			BIT(1)
#define	LDPC_HT_TEST_TX_ENABLE			BIT(2)
#define	LDPC_HT_CAP_TX				BIT(3)

#define	STBC_HT_ENABLE_RX			BIT(0)
#define	STBC_HT_ENABLE_TX			BIT(1)
#define	STBC_HT_TEST_TX_ENABLE			BIT(2)
#define	STBC_HT_CAP_TX				BIT(3)

#define	LDPC_VHT_ENABLE_RX			BIT(0)
#define	LDPC_VHT_ENABLE_TX			BIT(1)
#define	LDPC_VHT_TEST_TX_ENABLE			BIT(2)
#define	LDPC_VHT_CAP_TX				BIT(3)

#define	STBC_VHT_ENABLE_RX			BIT(0)
#define	STBC_VHT_ENABLE_TX			BIT(1)
#define	STBC_VHT_TEST_TX_ENABLE			BIT(2)
#define	STBC_VHT_CAP_TX				BIT(3)

2966 2967 2968 2969
extern u8 channel5g[CHANNEL_MAX_NUMBER_5G];

extern u8 channel5g_80m[CHANNEL_MAX_NUMBER_5G_80M];

L
Larry Finger 已提交
2970 2971 2972 2973 2974 2975 2976 2977 2978 2979 2980 2981 2982 2983 2984 2985 2986 2987
static inline u8 rtl_read_byte(struct rtl_priv *rtlpriv, u32 addr)
{
	return rtlpriv->io.read8_sync(rtlpriv, addr);
}

static inline u16 rtl_read_word(struct rtl_priv *rtlpriv, u32 addr)
{
	return rtlpriv->io.read16_sync(rtlpriv, addr);
}

static inline u32 rtl_read_dword(struct rtl_priv *rtlpriv, u32 addr)
{
	return rtlpriv->io.read32_sync(rtlpriv, addr);
}

static inline void rtl_write_byte(struct rtl_priv *rtlpriv, u32 addr, u8 val8)
{
	rtlpriv->io.write8_async(rtlpriv, addr, val8);
2988 2989 2990

	if (rtlpriv->cfg->write_readback)
		rtlpriv->io.read8_sync(rtlpriv, addr);
L
Larry Finger 已提交
2991 2992
}

2993 2994 2995 2996 2997 2998 2999 3000
static inline void rtl_write_byte_with_val32(struct ieee80211_hw *hw,
					     u32 addr, u32 val8)
{
	struct rtl_priv *rtlpriv = rtl_priv(hw);

	rtl_write_byte(rtlpriv, addr, (u8)val8);
}

L
Larry Finger 已提交
3001 3002 3003
static inline void rtl_write_word(struct rtl_priv *rtlpriv, u32 addr, u16 val16)
{
	rtlpriv->io.write16_async(rtlpriv, addr, val16);
3004 3005 3006

	if (rtlpriv->cfg->write_readback)
		rtlpriv->io.read16_sync(rtlpriv, addr);
L
Larry Finger 已提交
3007 3008 3009 3010 3011 3012
}

static inline void rtl_write_dword(struct rtl_priv *rtlpriv,
				   u32 addr, u32 val32)
{
	rtlpriv->io.write32_async(rtlpriv, addr, val32);
3013 3014 3015

	if (rtlpriv->cfg->write_readback)
		rtlpriv->io.read32_sync(rtlpriv, addr);
L
Larry Finger 已提交
3016 3017 3018 3019 3020
}

static inline u32 rtl_get_bbreg(struct ieee80211_hw *hw,
				u32 regaddr, u32 bitmask)
{
3021 3022 3023
	struct rtl_priv *rtlpriv = hw->priv;

	return rtlpriv->cfg->ops->get_bbreg(hw, regaddr, bitmask);
L
Larry Finger 已提交
3024 3025 3026 3027 3028
}

static inline void rtl_set_bbreg(struct ieee80211_hw *hw, u32 regaddr,
				 u32 bitmask, u32 data)
{
3029
	struct rtl_priv *rtlpriv = hw->priv;
L
Larry Finger 已提交
3030

3031
	rtlpriv->cfg->ops->set_bbreg(hw, regaddr, bitmask, data);
L
Larry Finger 已提交
3032 3033
}

3034
static inline void rtl_set_bbreg_with_dwmask(struct ieee80211_hw *hw,
3035
					     u32 regaddr, u32 data)
3036 3037 3038 3039
{
	rtl_set_bbreg(hw, regaddr, 0xffffffff, data);
}

L
Larry Finger 已提交
3040 3041 3042 3043
static inline u32 rtl_get_rfreg(struct ieee80211_hw *hw,
				enum radio_path rfpath, u32 regaddr,
				u32 bitmask)
{
3044 3045 3046
	struct rtl_priv *rtlpriv = hw->priv;

	return rtlpriv->cfg->ops->get_rfreg(hw, rfpath, regaddr, bitmask);
L
Larry Finger 已提交
3047 3048 3049 3050 3051 3052
}

static inline void rtl_set_rfreg(struct ieee80211_hw *hw,
				 enum radio_path rfpath, u32 regaddr,
				 u32 bitmask, u32 data)
{
3053 3054 3055
	struct rtl_priv *rtlpriv = hw->priv;

	rtlpriv->cfg->ops->set_rfreg(hw, rfpath, regaddr, bitmask, data);
L
Larry Finger 已提交
3056 3057 3058 3059 3060 3061 3062 3063 3064 3065 3066 3067 3068 3069 3070 3071 3072 3073 3074 3075 3076 3077
}

static inline bool is_hal_stop(struct rtl_hal *rtlhal)
{
	return (_HAL_STATE_STOP == rtlhal->state);
}

static inline void set_hal_start(struct rtl_hal *rtlhal)
{
	rtlhal->state = _HAL_STATE_START;
}

static inline void set_hal_stop(struct rtl_hal *rtlhal)
{
	rtlhal->state = _HAL_STATE_STOP;
}

static inline u8 get_rf_type(struct rtl_phy *rtlphy)
{
	return rtlphy->rf_type;
}

3078 3079 3080 3081 3082
static inline struct ieee80211_hdr *rtl_get_hdr(struct sk_buff *skb)
{
	return (struct ieee80211_hdr *)(skb->data);
}

3083
static inline __le16 rtl_get_fc(struct sk_buff *skb)
3084
{
3085
	return rtl_get_hdr(skb)->frame_control;
3086 3087 3088 3089
}

static inline u16 rtl_get_tid(struct sk_buff *skb)
{
3090
	return ieee80211_get_tid(rtl_get_hdr(skb));
3091 3092 3093 3094
}

static inline struct ieee80211_sta *get_sta(struct ieee80211_hw *hw,
					    struct ieee80211_vif *vif,
3095
					    const u8 *bssid)
3096 3097 3098 3099
{
	return ieee80211_find_sta(vif, bssid);
}

L
Larry Finger 已提交
3100
static inline struct ieee80211_sta *rtl_find_sta(struct ieee80211_hw *hw,
3101
						 u8 *mac_addr)
L
Larry Finger 已提交
3102 3103
{
	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
3104

L
Larry Finger 已提交
3105 3106 3107
	return ieee80211_find_sta(mac->vif, mac_addr);
}

L
Larry Finger 已提交
3108
#endif