aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/rtlwifi/rtl8821ae
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2014-10-05 21:34:39 -0400
committerDavid S. Miller <davem@davemloft.net>2014-10-05 21:34:39 -0400
commita4b4a2b7f98a45c71a906b1126cabea6446a9905 (patch)
tree0d501e78aeb9df90172a9435d673f31bf89290eb /drivers/net/wireless/rtlwifi/rtl8821ae
parent61b37d2f54961b336a47a501e797a05df20c3b30 (diff)
parent3f08e47291879fb047d7d4464d2beaedfea4eb63 (diff)
Merge tag 'master-2014-10-02' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-next
John W. Linville says: ==================== pull request: wireless-next 2014-10-03 Please pull tihs batch of updates intended for the 3.18 stream! For the iwlwifi bits, Emmanuel says: "I have here a few things that depend on the latest mac80211's changes: RRM, TPC, Quiet Period etc... Eyal keeps improving our rate control and we have a new device ID. This last patch should probably have gone to wireless.git, but at that stage, I preferred to send it to -next and CC stable." For (most of) the Atheros bits, Kalle says: "The only new feature is testmode support from me. Ben added a new method to crash the firmware with an assert for debug purposes. As usual, we have lots of smaller fixes from Michal. Matteo fixed a Kconfig dependency with debugfs. I fixed some warnings recently added to checkpatch." For the NFC bits, Samuel says: "We've had major updates for TI and ST Microelectronics drivers, and a few NCI related changes. For TI's trf7970a driver: - Target mode support for trf7970a - Suspend/resume support for trf7970a - DT properties additions to handle different quirks - A bunch of fixes for smartphone IOP related issues For ST Microelectronics' ST21NFCA and ST21NFCB drivers: - ISO15693 support for st21nfcb - checkpatch and sparse related warning fixes - Code cleanups and a few minor fixes Finally, Marvell added ISO15693 support to the NCI stack, together with a couple of NCI fixes." For the Bluetooth bits, Johan says: "This 3.18 pull request replaces the one I did on Monday ("bluetooth-next 2014-09-22", which hasn't been pulled yet). The additions since the last request are: - SCO connection fix for devices not supporting eSCO - Cleanups regarding the SCO establishment logic - Remove unnecessary return value from logging functions - Header compression fix for 6lowpan - Cleanups to the ieee802154/mrf24j40 driver Here's a copy from previous request that this one replaces: ' Here are some more patches for 3.18. They include various fixes to the btusb HCI driver, a fix for LE SMP, as well as adding Jukka to the MAINTAINERS file for generic 6LoWPAN (as requested by Alexander Aring). I've held on to this pull request a bit since we were waiting for a SCO related fix to get sorted out first. However, since the merge window is getting closer I decided not to wait for it. If we do get the fix sorted out there'll probably be a second small pull request later this week. '" And, "Unless 3.17 gets delayed this will probably be our last -next pull request for 3.18. We've got: - New Marvell hardware supportr - Multicast support for 6lowpan - Several of 6lowpan fixes & cleanups - Fix for a (false-positive) lockdep warning in L2CAP - Minor btusb cleanup" On top of all that comes the usual sort of updates to ath5k, ath9k, ath10k, brcmfmac, mwifiex, and wil6210. This time around there are also a number of rtlwifi updates to enable some new hardware and to reconcile the in-kernel drivers with some newer releases of the Realtek vendor drivers. Also of note is some device tree work for the bcma bus. Please let me know if there are problems! ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/wireless/rtlwifi/rtl8821ae')
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8821ae/Makefile19
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8821ae/def.h450
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8821ae/dm.c3019
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8821ae/dm.h356
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8821ae/fw.c1857
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8821ae/fw.h351
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8821ae/hw.c4218
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8821ae/hw.h70
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8821ae/led.c237
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8821ae/led.h37
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8821ae/phy.c4855
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8821ae/phy.h259
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8821ae/pwrseq.c182
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8821ae/pwrseq.h738
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8821ae/reg.h2464
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8821ae/rf.c465
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8821ae/rf.h43
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8821ae/sw.c484
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8821ae/sw.h34
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8821ae/table.c4572
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8821ae/table.h60
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8821ae/trx.c1236
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8821ae/trx.h620
23 files changed, 26626 insertions, 0 deletions
diff --git a/drivers/net/wireless/rtlwifi/rtl8821ae/Makefile b/drivers/net/wireless/rtlwifi/rtl8821ae/Makefile
new file mode 100644
index 000000000000..87ad604a1eb3
--- /dev/null
+++ b/drivers/net/wireless/rtlwifi/rtl8821ae/Makefile
@@ -0,0 +1,19 @@
1obj-m := rtl8821ae.o
2
3
4rtl8821ae-objs := \
5 dm.o \
6 fw.o \
7 hw.o \
8 led.o \
9 phy.o \
10 pwrseq.o \
11 rf.o \
12 sw.o \
13 table.o \
14 trx.o \
15
16
17obj-$(CONFIG_RTL8821AE) += rtl8821ae.o
18
19ccflags-y += -D__CHECK_ENDIAN__
diff --git a/drivers/net/wireless/rtlwifi/rtl8821ae/def.h b/drivers/net/wireless/rtlwifi/rtl8821ae/def.h
new file mode 100644
index 000000000000..a730985ae81d
--- /dev/null
+++ b/drivers/net/wireless/rtlwifi/rtl8821ae/def.h
@@ -0,0 +1,450 @@
1/******************************************************************************
2 *
3 * Copyright(c) 2009-2010 Realtek Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * The full GNU General Public License is included in this distribution in the
15 * file called LICENSE.
16 *
17 * Contact Information:
18 * wlanfae <wlanfae@realtek.com>
19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20 * Hsinchu 300, Taiwan.
21 *
22 * Larry Finger <Larry.Finger@lwfinger.net>
23 *
24 *****************************************************************************/
25
26#ifndef __RTL8821AE_DEF_H__
27#define __RTL8821AE_DEF_H__
28
29/*--------------------------Define -------------------------------------------*/
30#define USE_SPECIFIC_FW_TO_SUPPORT_WOWLAN 1
31
32/* BIT 7 HT Rate*/
33/*TxHT = 0*/
34#define MGN_1M 0x02
35#define MGN_2M 0x04
36#define MGN_5_5M 0x0b
37#define MGN_11M 0x16
38
39#define MGN_6M 0x0c
40#define MGN_9M 0x12
41#define MGN_12M 0x18
42#define MGN_18M 0x24
43#define MGN_24M 0x30
44#define MGN_36M 0x48
45#define MGN_48M 0x60
46#define MGN_54M 0x6c
47
48/* TxHT = 1 */
49#define MGN_MCS0 0x80
50#define MGN_MCS1 0x81
51#define MGN_MCS2 0x82
52#define MGN_MCS3 0x83
53#define MGN_MCS4 0x84
54#define MGN_MCS5 0x85
55#define MGN_MCS6 0x86
56#define MGN_MCS7 0x87
57#define MGN_MCS8 0x88
58#define MGN_MCS9 0x89
59#define MGN_MCS10 0x8a
60#define MGN_MCS11 0x8b
61#define MGN_MCS12 0x8c
62#define MGN_MCS13 0x8d
63#define MGN_MCS14 0x8e
64#define MGN_MCS15 0x8f
65/* VHT rate */
66#define MGN_VHT1SS_MCS0 0x90
67#define MGN_VHT1SS_MCS1 0x91
68#define MGN_VHT1SS_MCS2 0x92
69#define MGN_VHT1SS_MCS3 0x93
70#define MGN_VHT1SS_MCS4 0x94
71#define MGN_VHT1SS_MCS5 0x95
72#define MGN_VHT1SS_MCS6 0x96
73#define MGN_VHT1SS_MCS7 0x97
74#define MGN_VHT1SS_MCS8 0x98
75#define MGN_VHT1SS_MCS9 0x99
76#define MGN_VHT2SS_MCS0 0x9a
77#define MGN_VHT2SS_MCS1 0x9b
78#define MGN_VHT2SS_MCS2 0x9c
79#define MGN_VHT2SS_MCS3 0x9d
80#define MGN_VHT2SS_MCS4 0x9e
81#define MGN_VHT2SS_MCS5 0x9f
82#define MGN_VHT2SS_MCS6 0xa0
83#define MGN_VHT2SS_MCS7 0xa1
84#define MGN_VHT2SS_MCS8 0xa2
85#define MGN_VHT2SS_MCS9 0xa3
86
87#define MGN_VHT3SS_MCS0 0xa4
88#define MGN_VHT3SS_MCS1 0xa5
89#define MGN_VHT3SS_MCS2 0xa6
90#define MGN_VHT3SS_MCS3 0xa7
91#define MGN_VHT3SS_MCS4 0xa8
92#define MGN_VHT3SS_MCS5 0xa9
93#define MGN_VHT3SS_MCS6 0xaa
94#define MGN_VHT3SS_MCS7 0xab
95#define MGN_VHT3SS_MCS8 0xac
96#define MGN_VHT3SS_MCS9 0xad
97
98#define MGN_MCS0_SG 0xc0
99#define MGN_MCS1_SG 0xc1
100#define MGN_MCS2_SG 0xc2
101#define MGN_MCS3_SG 0xc3
102#define MGN_MCS4_SG 0xc4
103#define MGN_MCS5_SG 0xc5
104#define MGN_MCS6_SG 0xc6
105#define MGN_MCS7_SG 0xc7
106#define MGN_MCS8_SG 0xc8
107#define MGN_MCS9_SG 0xc9
108#define MGN_MCS10_SG 0xca
109#define MGN_MCS11_SG 0xcb
110#define MGN_MCS12_SG 0xcc
111#define MGN_MCS13_SG 0xcd
112#define MGN_MCS14_SG 0xce
113#define MGN_MCS15_SG 0xcf
114
115#define MGN_UNKNOWN 0xff
116
117/* 30 ms */
118#define WIFI_NAV_UPPER_US 30000
119#define HAL_92C_NAV_UPPER_UNIT 128
120
121#define HAL_RETRY_LIMIT_INFRA 48
122#define HAL_RETRY_LIMIT_AP_ADHOC 7
123
124#define RESET_DELAY_8185 20
125
126#define RT_IBSS_INT_MASKS (IMR_BCNINT | IMR_TBDOK | IMR_TBDER)
127#define RT_AC_INT_MASKS (IMR_VIDOK | IMR_VODOK | IMR_BEDOK|IMR_BKDOK)
128
129#define NUM_OF_FIRMWARE_QUEUE 10
130#define NUM_OF_PAGES_IN_FW 0x100
131#define NUM_OF_PAGE_IN_FW_QUEUE_BK 0x07
132#define NUM_OF_PAGE_IN_FW_QUEUE_BE 0x07
133#define NUM_OF_PAGE_IN_FW_QUEUE_VI 0x07
134#define NUM_OF_PAGE_IN_FW_QUEUE_VO 0x07
135#define NUM_OF_PAGE_IN_FW_QUEUE_HCCA 0x0
136#define NUM_OF_PAGE_IN_FW_QUEUE_CMD 0x0
137#define NUM_OF_PAGE_IN_FW_QUEUE_MGNT 0x02
138#define NUM_OF_PAGE_IN_FW_QUEUE_HIGH 0x02
139#define NUM_OF_PAGE_IN_FW_QUEUE_BCN 0x2
140#define NUM_OF_PAGE_IN_FW_QUEUE_PUB 0xA1
141
142#define NUM_OF_PAGE_IN_FW_QUEUE_BK_DTM 0x026
143#define NUM_OF_PAGE_IN_FW_QUEUE_BE_DTM 0x048
144#define NUM_OF_PAGE_IN_FW_QUEUE_VI_DTM 0x048
145#define NUM_OF_PAGE_IN_FW_QUEUE_VO_DTM 0x026
146#define NUM_OF_PAGE_IN_FW_QUEUE_PUB_DTM 0x00
147
148#define MAX_RX_DMA_BUFFER_SIZE 0x3E80
149
150#define MAX_LINES_HWCONFIG_TXT 1000
151#define MAX_BYTES_LINE_HWCONFIG_TXT 256
152
153#define SW_THREE_WIRE 0
154#define HW_THREE_WIRE 2
155
156#define BT_DEMO_BOARD 0
157#define BT_QA_BOARD 1
158#define BT_FPGA 2
159
160#define HAL_PRIME_CHNL_OFFSET_DONT_CARE 0
161#define HAL_PRIME_CHNL_OFFSET_LOWER 1
162#define HAL_PRIME_CHNL_OFFSET_UPPER 2
163
164#define MAX_H2C_QUEUE_NUM 10
165
166#define RX_MPDU_QUEUE 0
167#define RX_CMD_QUEUE 1
168#define RX_MAX_QUEUE 2
169#define AC2QUEUEID(_AC) (_AC)
170
171#define MAX_RX_DMA_BUFFER_SIZE_8812 0x3E80
172
173#define C2H_RX_CMD_HDR_LEN 8
174#define GET_C2H_CMD_CMD_LEN(__prxhdr) \
175 LE_BITS_TO_4BYTE((__prxhdr), 0, 16)
176#define GET_C2H_CMD_ELEMENT_ID(__prxhdr) \
177 LE_BITS_TO_4BYTE((__prxhdr), 16, 8)
178#define GET_C2H_CMD_CMD_SEQ(__prxhdr) \
179 LE_BITS_TO_4BYTE((__prxhdr), 24, 7)
180#define GET_C2H_CMD_CONTINUE(__prxhdr) \
181 LE_BITS_TO_4BYTE((__prxhdr), 31, 1)
182#define GET_C2H_CMD_CONTENT(__prxhdr) \
183 ((u8 *)(__prxhdr) + C2H_RX_CMD_HDR_LEN)
184
185#define GET_C2H_CMD_FEEDBACK_ELEMENT_ID(__pcmdfbhdr) \
186 LE_BITS_TO_4BYTE((__pcmdfbhdr), 0, 8)
187#define GET_C2H_CMD_FEEDBACK_CCX_LEN(__pcmdfbhdr) \
188 LE_BITS_TO_4BYTE((__pcmdfbhdr), 8, 8)
189#define GET_C2H_CMD_FEEDBACK_CCX_CMD_CNT(__pcmdfbhdr) \
190 LE_BITS_TO_4BYTE((__pcmdfbhdr), 16, 16)
191#define GET_C2H_CMD_FEEDBACK_CCX_MAC_ID(__pcmdfbhdr) \
192 LE_BITS_TO_4BYTE(((__pcmdfbhdr) + 4), 0, 5)
193#define GET_C2H_CMD_FEEDBACK_CCX_VALID(__pcmdfbhdr) \
194 LE_BITS_TO_4BYTE(((__pcmdfbhdr) + 4), 7, 1)
195#define GET_C2H_CMD_FEEDBACK_CCX_RETRY_CNT(__pcmdfbhdr) \
196 LE_BITS_TO_4BYTE(((__pcmdfbhdr) + 4), 8, 5)
197#define GET_C2H_CMD_FEEDBACK_CCX_TOK(__pcmdfbhdr) \
198 LE_BITS_TO_4BYTE(((__pcmdfbhdr) + 4), 15, 1)
199#define GET_C2H_CMD_FEEDBACK_CCX_QSEL(__pcmdfbhdr) \
200 LE_BITS_TO_4BYTE(((__pcmdfbhdr) + 4), 16, 4)
201#define GET_C2H_CMD_FEEDBACK_CCX_SEQ(__pcmdfbhdr) \
202 LE_BITS_TO_4BYTE(((__pcmdfbhdr) + 4), 20, 12)
203
204#define CHIP_BONDING_IDENTIFIER(_value) (((_value)>>22)&0x3)
205
206#define CHIP_8812 BIT(2)
207#define CHIP_8821 (BIT(0)|BIT(2))
208
209#define CHIP_8821A (BIT(0)|BIT(2))
210#define NORMAL_CHIP BIT(3)
211#define RF_TYPE_1T1R (~(BIT(4)|BIT(5)|BIT(6)))
212#define RF_TYPE_1T2R BIT(4)
213#define RF_TYPE_2T2R BIT(5)
214#define CHIP_VENDOR_UMC BIT(7)
215#define B_CUT_VERSION BIT(12)
216#define C_CUT_VERSION BIT(13)
217#define D_CUT_VERSION ((BIT(12)|BIT(13)))
218#define E_CUT_VERSION BIT(14)
219#define RF_RL_ID (BIT(31)|BIT(30)|BIT(29)|BIT(28))
220
221enum version_8821ae {
222 VERSION_TEST_CHIP_1T1R_8812 = 0x0004,
223 VERSION_TEST_CHIP_2T2R_8812 = 0x0024,
224 VERSION_NORMAL_TSMC_CHIP_1T1R_8812 = 0x100c,
225 VERSION_NORMAL_TSMC_CHIP_2T2R_8812 = 0x102c,
226 VERSION_NORMAL_TSMC_CHIP_1T1R_8812_C_CUT = 0x200c,
227 VERSION_NORMAL_TSMC_CHIP_2T2R_8812_C_CUT = 0x202c,
228 VERSION_TEST_CHIP_8821 = 0x0005,
229 VERSION_NORMAL_TSMC_CHIP_8821 = 0x000d,
230 VERSION_NORMAL_TSMC_CHIP_8821_B_CUT = 0x100d,
231 VERSION_UNKNOWN = 0xFF,
232};
233
234enum vht_data_sc {
235 VHT_DATA_SC_DONOT_CARE = 0,
236 VHT_DATA_SC_20_UPPER_OF_80MHZ = 1,
237 VHT_DATA_SC_20_LOWER_OF_80MHZ = 2,
238 VHT_DATA_SC_20_UPPERST_OF_80MHZ = 3,
239 VHT_DATA_SC_20_LOWEST_OF_80MHZ = 4,
240 VHT_DATA_SC_20_RECV1 = 5,
241 VHT_DATA_SC_20_RECV2 = 6,
242 VHT_DATA_SC_20_RECV3 = 7,
243 VHT_DATA_SC_20_RECV4 = 8,
244 VHT_DATA_SC_40_UPPER_OF_80MHZ = 9,
245 VHT_DATA_SC_40_LOWER_OF_80MHZ = 10,
246};
247
248/* MASK */
249#define IC_TYPE_MASK (BIT(0)|BIT(1)|BIT(2))
250#define CHIP_TYPE_MASK BIT(3)
251#define RF_TYPE_MASK (BIT(4)|BIT(5)|BIT(6))
252#define MANUFACTUER_MASK BIT(7)
253#define ROM_VERSION_MASK (BIT(11)|BIT(10)|BIT(9)|BIT(8))
254#define CUT_VERSION_MASK (BIT(15)|BIT(14)|BIT(13)|BIT(12))
255
256/* Get element */
257#define GET_CVID_IC_TYPE(version) ((version) & IC_TYPE_MASK)
258#define GET_CVID_CHIP_TYPE(version) ((version) & CHIP_TYPE_MASK)
259#define GET_CVID_RF_TYPE(version) ((version) & RF_TYPE_MASK)
260#define GET_CVID_MANUFACTUER(version) ((version) & MANUFACTUER_MASK)
261#define GET_CVID_ROM_VERSION(version) ((version) & ROM_VERSION_MASK)
262#define GET_CVID_CUT_VERSION(version) ((version) & CUT_VERSION_MASK)
263
264#define IS_1T1R(version) ((GET_CVID_RF_TYPE(version)) ? false : true)
265#define IS_1T2R(version) ((GET_CVID_RF_TYPE(version) == RF_TYPE_1T2R)\
266 ? true : false)
267#define IS_2T2R(version) ((GET_CVID_RF_TYPE(version) == RF_TYPE_2T2R)\
268 ? true : false)
269
270#define IS_8812_SERIES(version) ((GET_CVID_IC_TYPE(version) == CHIP_8812) ? \
271 true : false)
272#define IS_8821_SERIES(version) ((GET_CVID_IC_TYPE(version) == CHIP_8821) ? \
273 true : false)
274
275#define IS_VENDOR_8812A_TEST_CHIP(version) ((IS_8812_SERIES(version)) ? \
276 ((IS_NORMAL_CHIP(version)) ? \
277 false : true) : false)
278#define IS_VENDOR_8812A_MP_CHIP(version) ((IS_8812_SERIES(version)) ? \
279 ((IS_NORMAL_CHIP(version)) ? \
280 true : false) : false)
281#define IS_VENDOR_8812A_C_CUT(version) ((IS_8812_SERIES(version)) ? \
282 ((GET_CVID_CUT_VERSION(version) == \
283 C_CUT_VERSION) ? \
284 true : false) : false)
285
286#define IS_VENDOR_8821A_TEST_CHIP(version) ((IS_8821_SERIES(version)) ? \
287 ((IS_NORMAL_CHIP(version)) ? \
288 false : true) : false)
289#define IS_VENDOR_8821A_MP_CHIP(version) ((IS_8821_SERIES(version)) ? \
290 ((IS_NORMAL_CHIP(version)) ? \
291 true : false) : false)
292#define IS_VENDOR_8821A_B_CUT(version) ((IS_8821_SERIES(version)) ? \
293 ((GET_CVID_CUT_VERSION(version) == \
294 B_CUT_VERSION) ? \
295 true : false) : false)
296enum board_type {
297 ODM_BOARD_DEFAULT = 0, /* The DEFAULT case. */
298 ODM_BOARD_MINICARD = BIT(0), /* 0 = non-mini card, 1 = mini card. */
299 ODM_BOARD_SLIM = BIT(1), /* 0 = non-slim card, 1 = slim card */
300 ODM_BOARD_BT = BIT(2), /* 0 = without BT card, 1 = with BT */
301 ODM_BOARD_EXT_PA = BIT(3), /* 1 = existing 2G ext-PA */
302 ODM_BOARD_EXT_LNA = BIT(4), /* 1 = existing 2G ext-LNA */
303 ODM_BOARD_EXT_TRSW = BIT(5), /* 1 = existing ext-TRSW */
304 ODM_BOARD_EXT_PA_5G = BIT(6), /* 1 = existing 5G ext-PA */
305 ODM_BOARD_EXT_LNA_5G = BIT(7), /* 1 = existing 5G ext-LNA */
306};
307
308enum rf_optype {
309 RF_OP_BY_SW_3WIRE = 0,
310 RF_OP_BY_FW,
311 RF_OP_MAX
312};
313
314enum rf_power_state {
315 RF_ON,
316 RF_OFF,
317 RF_SLEEP,
318 RF_SHUT_DOWN,
319};
320
321enum power_save_mode {
322 POWER_SAVE_MODE_ACTIVE,
323 POWER_SAVE_MODE_SAVE,
324};
325
326enum power_polocy_config {
327 POWERCFG_MAX_POWER_SAVINGS,
328 POWERCFG_GLOBAL_POWER_SAVINGS,
329 POWERCFG_LOCAL_POWER_SAVINGS,
330 POWERCFG_LENOVO,
331};
332
333enum interface_select_pci {
334 INTF_SEL1_MINICARD = 0,
335 INTF_SEL0_PCIE = 1,
336 INTF_SEL2_RSV = 2,
337 INTF_SEL3_RSV = 3,
338};
339
340enum hal_fw_c2h_cmd_id {
341 HAL_FW_C2H_CMD_READ_MACREG = 0,
342 HAL_FW_C2H_CMD_READ_BBREG = 1,
343 HAL_FW_C2H_CMD_READ_RFREG = 2,
344 HAL_FW_C2H_CMD_READ_EEPROM = 3,
345 HAL_FW_C2H_CMD_READ_EFUSE = 4,
346 HAL_FW_C2H_CMD_READ_CAM = 5,
347 HAL_FW_C2H_CMD_GET_BASICRATE = 6,
348 HAL_FW_C2H_CMD_GET_DATARATE = 7,
349 HAL_FW_C2H_CMD_SURVEY = 8,
350 HAL_FW_C2H_CMD_SURVEYDONE = 9,
351 HAL_FW_C2H_CMD_JOINBSS = 10,
352 HAL_FW_C2H_CMD_ADDSTA = 11,
353 HAL_FW_C2H_CMD_DELSTA = 12,
354 HAL_FW_C2H_CMD_ATIMDONE = 13,
355 HAL_FW_C2H_CMD_TX_REPORT = 14,
356 HAL_FW_C2H_CMD_CCX_REPORT = 15,
357 HAL_FW_C2H_CMD_DTM_REPORT = 16,
358 HAL_FW_C2H_CMD_TX_RATE_STATISTICS = 17,
359 HAL_FW_C2H_CMD_C2HLBK = 18,
360 HAL_FW_C2H_CMD_C2HDBG = 19,
361 HAL_FW_C2H_CMD_C2HFEEDBACK = 20,
362 HAL_FW_C2H_CMD_MAX
363};
364
365enum rtl_desc_qsel {
366 QSLT_BK = 0x2,
367 QSLT_BE = 0x0,
368 QSLT_VI = 0x5,
369 QSLT_VO = 0x7,
370 QSLT_BEACON = 0x10,
371 QSLT_HIGH = 0x11,
372 QSLT_MGNT = 0x12,
373 QSLT_CMD = 0x13,
374};
375
376enum rtl_desc8821ae_rate {
377 DESC_RATE1M = 0x00,
378 DESC_RATE2M = 0x01,
379 DESC_RATE5_5M = 0x02,
380 DESC_RATE11M = 0x03,
381
382 DESC_RATE6M = 0x04,
383 DESC_RATE9M = 0x05,
384 DESC_RATE12M = 0x06,
385 DESC_RATE18M = 0x07,
386 DESC_RATE24M = 0x08,
387 DESC_RATE36M = 0x09,
388 DESC_RATE48M = 0x0a,
389 DESC_RATE54M = 0x0b,
390
391 DESC_RATEMCS0 = 0x0c,
392 DESC_RATEMCS1 = 0x0d,
393 DESC_RATEMCS2 = 0x0e,
394 DESC_RATEMCS3 = 0x0f,
395 DESC_RATEMCS4 = 0x10,
396 DESC_RATEMCS5 = 0x11,
397 DESC_RATEMCS6 = 0x12,
398 DESC_RATEMCS7 = 0x13,
399 DESC_RATEMCS8 = 0x14,
400 DESC_RATEMCS9 = 0x15,
401 DESC_RATEMCS10 = 0x16,
402 DESC_RATEMCS11 = 0x17,
403 DESC_RATEMCS12 = 0x18,
404 DESC_RATEMCS13 = 0x19,
405 DESC_RATEMCS14 = 0x1a,
406 DESC_RATEMCS15 = 0x1b,
407
408 DESC_RATEVHT1SS_MCS0 = 0x2c,
409 DESC_RATEVHT1SS_MCS1 = 0x2d,
410 DESC_RATEVHT1SS_MCS2 = 0x2e,
411 DESC_RATEVHT1SS_MCS3 = 0x2f,
412 DESC_RATEVHT1SS_MCS4 = 0x30,
413 DESC_RATEVHT1SS_MCS5 = 0x31,
414 DESC_RATEVHT1SS_MCS6 = 0x32,
415 DESC_RATEVHT1SS_MCS7 = 0x33,
416 DESC_RATEVHT1SS_MCS8 = 0x34,
417 DESC_RATEVHT1SS_MCS9 = 0x35,
418 DESC_RATEVHT2SS_MCS0 = 0x36,
419 DESC_RATEVHT2SS_MCS1 = 0x37,
420 DESC_RATEVHT2SS_MCS2 = 0x38,
421 DESC_RATEVHT2SS_MCS3 = 0x39,
422 DESC_RATEVHT2SS_MCS4 = 0x3a,
423 DESC_RATEVHT2SS_MCS5 = 0x3b,
424 DESC_RATEVHT2SS_MCS6 = 0x3c,
425 DESC_RATEVHT2SS_MCS7 = 0x3d,
426 DESC_RATEVHT2SS_MCS8 = 0x3e,
427 DESC_RATEVHT2SS_MCS9 = 0x3f,
428};
429
430enum rx_packet_type {
431 NORMAL_RX,
432 TX_REPORT1,
433 TX_REPORT2,
434 HIS_REPORT,
435 C2H_PACKET,
436};
437
438struct phy_sts_cck_8821ae_t {
439 u8 adc_pwdb_X[4];
440 u8 sq_rpt;
441 u8 cck_agc_rpt;
442};
443
444struct h2c_cmd_8821ae {
445 u8 element_id;
446 u32 cmd_len;
447 u8 *p_cmdbuffer;
448};
449
450#endif
diff --git a/drivers/net/wireless/rtlwifi/rtl8821ae/dm.c b/drivers/net/wireless/rtlwifi/rtl8821ae/dm.c
new file mode 100644
index 000000000000..9be106109921
--- /dev/null
+++ b/drivers/net/wireless/rtlwifi/rtl8821ae/dm.c
@@ -0,0 +1,3019 @@
1/******************************************************************************
2 *
3 * Copyright(c) 2009-2010 Realtek Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * The full GNU General Public License is included in this distribution in the
15 * file called LICENSE.
16 *
17 * Contact Information:
18 * wlanfae <wlanfae@realtek.com>
19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20 * Hsinchu 300, Taiwan.
21 *
22 * Larry Finger <Larry.Finger@lwfinger.net>
23 *
24 *****************************************************************************/
25
26#include "../wifi.h"
27#include "../base.h"
28#include "../pci.h"
29#include "reg.h"
30#include "def.h"
31#include "phy.h"
32#include "dm.h"
33#include "fw.h"
34#include "trx.h"
35#include "../btcoexist/rtl_btc.h"
36
37static const u32 txscaling_tbl[TXSCALE_TABLE_SIZE] = {
38 0x081, /* 0, -12.0dB */
39 0x088, /* 1, -11.5dB */
40 0x090, /* 2, -11.0dB */
41 0x099, /* 3, -10.5dB */
42 0x0A2, /* 4, -10.0dB */
43 0x0AC, /* 5, -9.5dB */
44 0x0B6, /* 6, -9.0dB */
45 0x0C0, /* 7, -8.5dB */
46 0x0CC, /* 8, -8.0dB */
47 0x0D8, /* 9, -7.5dB */
48 0x0E5, /* 10, -7.0dB */
49 0x0F2, /* 11, -6.5dB */
50 0x101, /* 12, -6.0dB */
51 0x110, /* 13, -5.5dB */
52 0x120, /* 14, -5.0dB */
53 0x131, /* 15, -4.5dB */
54 0x143, /* 16, -4.0dB */
55 0x156, /* 17, -3.5dB */
56 0x16A, /* 18, -3.0dB */
57 0x180, /* 19, -2.5dB */
58 0x197, /* 20, -2.0dB */
59 0x1AF, /* 21, -1.5dB */
60 0x1C8, /* 22, -1.0dB */
61 0x1E3, /* 23, -0.5dB */
62 0x200, /* 24, +0 dB */
63 0x21E, /* 25, +0.5dB */
64 0x23E, /* 26, +1.0dB */
65 0x261, /* 27, +1.5dB */
66 0x285, /* 28, +2.0dB */
67 0x2AB, /* 29, +2.5dB */
68 0x2D3, /* 30, +3.0dB */
69 0x2FE, /* 31, +3.5dB */
70 0x32B, /* 32, +4.0dB */
71 0x35C, /* 33, +4.5dB */
72 0x38E, /* 34, +5.0dB */
73 0x3C4, /* 35, +5.5dB */
74 0x3FE /* 36, +6.0dB */
75};
76
77static const u32 rtl8821ae_txscaling_table[TXSCALE_TABLE_SIZE] = {
78 0x081, /* 0, -12.0dB */
79 0x088, /* 1, -11.5dB */
80 0x090, /* 2, -11.0dB */
81 0x099, /* 3, -10.5dB */
82 0x0A2, /* 4, -10.0dB */
83 0x0AC, /* 5, -9.5dB */
84 0x0B6, /* 6, -9.0dB */
85 0x0C0, /* 7, -8.5dB */
86 0x0CC, /* 8, -8.0dB */
87 0x0D8, /* 9, -7.5dB */
88 0x0E5, /* 10, -7.0dB */
89 0x0F2, /* 11, -6.5dB */
90 0x101, /* 12, -6.0dB */
91 0x110, /* 13, -5.5dB */
92 0x120, /* 14, -5.0dB */
93 0x131, /* 15, -4.5dB */
94 0x143, /* 16, -4.0dB */
95 0x156, /* 17, -3.5dB */
96 0x16A, /* 18, -3.0dB */
97 0x180, /* 19, -2.5dB */
98 0x197, /* 20, -2.0dB */
99 0x1AF, /* 21, -1.5dB */
100 0x1C8, /* 22, -1.0dB */
101 0x1E3, /* 23, -0.5dB */
102 0x200, /* 24, +0 dB */
103 0x21E, /* 25, +0.5dB */
104 0x23E, /* 26, +1.0dB */
105 0x261, /* 27, +1.5dB */
106 0x285, /* 28, +2.0dB */
107 0x2AB, /* 29, +2.5dB */
108 0x2D3, /* 30, +3.0dB */
109 0x2FE, /* 31, +3.5dB */
110 0x32B, /* 32, +4.0dB */
111 0x35C, /* 33, +4.5dB */
112 0x38E, /* 34, +5.0dB */
113 0x3C4, /* 35, +5.5dB */
114 0x3FE /* 36, +6.0dB */
115};
116
117static const u32 ofdmswing_table[] = {
118 0x0b40002d, /* 0, -15.0dB */
119 0x0c000030, /* 1, -14.5dB */
120 0x0cc00033, /* 2, -14.0dB */
121 0x0d800036, /* 3, -13.5dB */
122 0x0e400039, /* 4, -13.0dB */
123 0x0f00003c, /* 5, -12.5dB */
124 0x10000040, /* 6, -12.0dB */
125 0x11000044, /* 7, -11.5dB */
126 0x12000048, /* 8, -11.0dB */
127 0x1300004c, /* 9, -10.5dB */
128 0x14400051, /* 10, -10.0dB */
129 0x15800056, /* 11, -9.5dB */
130 0x16c0005b, /* 12, -9.0dB */
131 0x18000060, /* 13, -8.5dB */
132 0x19800066, /* 14, -8.0dB */
133 0x1b00006c, /* 15, -7.5dB */
134 0x1c800072, /* 16, -7.0dB */
135 0x1e400079, /* 17, -6.5dB */
136 0x20000080, /* 18, -6.0dB */
137 0x22000088, /* 19, -5.5dB */
138 0x24000090, /* 20, -5.0dB */
139 0x26000098, /* 21, -4.5dB */
140 0x288000a2, /* 22, -4.0dB */
141 0x2ac000ab, /* 23, -3.5dB */
142 0x2d4000b5, /* 24, -3.0dB */
143 0x300000c0, /* 25, -2.5dB */
144 0x32c000cb, /* 26, -2.0dB */
145 0x35c000d7, /* 27, -1.5dB */
146 0x390000e4, /* 28, -1.0dB */
147 0x3c8000f2, /* 29, -0.5dB */
148 0x40000100, /* 30, +0dB */
149 0x43c0010f, /* 31, +0.5dB */
150 0x47c0011f, /* 32, +1.0dB */
151 0x4c000130, /* 33, +1.5dB */
152 0x50800142, /* 34, +2.0dB */
153 0x55400155, /* 35, +2.5dB */
154 0x5a400169, /* 36, +3.0dB */
155 0x5fc0017f, /* 37, +3.5dB */
156 0x65400195, /* 38, +4.0dB */
157 0x6b8001ae, /* 39, +4.5dB */
158 0x71c001c7, /* 40, +5.0dB */
159 0x788001e2, /* 41, +5.5dB */
160 0x7f8001fe /* 42, +6.0dB */
161};
162
163static const u8 cckswing_table_ch1ch13[CCK_TABLE_SIZE][8] = {
164 {0x09, 0x08, 0x07, 0x06, 0x04, 0x03, 0x01, 0x01}, /* 0, -16.0dB */
165 {0x09, 0x09, 0x08, 0x06, 0x05, 0x03, 0x01, 0x01}, /* 1, -15.5dB */
166 {0x0a, 0x09, 0x08, 0x07, 0x05, 0x03, 0x02, 0x01}, /* 2, -15.0dB */
167 {0x0a, 0x0a, 0x09, 0x07, 0x05, 0x03, 0x02, 0x01}, /* 3, -14.5dB */
168 {0x0b, 0x0a, 0x09, 0x08, 0x06, 0x04, 0x02, 0x01}, /* 4, -14.0dB */
169 {0x0b, 0x0b, 0x0a, 0x08, 0x06, 0x04, 0x02, 0x01}, /* 5, -13.5dB */
170 {0x0c, 0x0c, 0x0a, 0x09, 0x06, 0x04, 0x02, 0x01}, /* 6, -13.0dB */
171 {0x0d, 0x0c, 0x0b, 0x09, 0x07, 0x04, 0x02, 0x01}, /* 7, -12.5dB */
172 {0x0d, 0x0d, 0x0c, 0x0a, 0x07, 0x05, 0x02, 0x01}, /* 8, -12.0dB */
173 {0x0e, 0x0e, 0x0c, 0x0a, 0x08, 0x05, 0x02, 0x01}, /* 9, -11.5dB */
174 {0x0f, 0x0f, 0x0d, 0x0b, 0x08, 0x05, 0x03, 0x01}, /* 10, -11.0dB */
175 {0x10, 0x10, 0x0e, 0x0b, 0x08, 0x05, 0x03, 0x01}, /* 11, -10.5dB */
176 {0x11, 0x11, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01}, /* 12, -10.0dB */
177 {0x12, 0x12, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01}, /* 13, -9.5dB */
178 {0x13, 0x13, 0x10, 0x0d, 0x0a, 0x06, 0x03, 0x01}, /* 14, -9.0dB */
179 {0x14, 0x14, 0x11, 0x0e, 0x0b, 0x07, 0x03, 0x02}, /* 15, -8.5dB */
180 {0x16, 0x15, 0x12, 0x0f, 0x0b, 0x07, 0x04, 0x01}, /* 16, -8.0dB */
181 {0x17, 0x16, 0x13, 0x10, 0x0c, 0x08, 0x04, 0x02}, /* 17, -7.5dB */
182 {0x18, 0x17, 0x15, 0x11, 0x0c, 0x08, 0x04, 0x02}, /* 18, -7.0dB */
183 {0x1a, 0x19, 0x16, 0x12, 0x0d, 0x09, 0x04, 0x02}, /* 19, -6.5dB */
184 {0x1b, 0x1a, 0x17, 0x13, 0x0e, 0x09, 0x04, 0x02}, /* 20, -6.0dB */
185 {0x1d, 0x1c, 0x18, 0x14, 0x0f, 0x0a, 0x05, 0x02}, /* 21, -5.5dB */
186 {0x1f, 0x1e, 0x1a, 0x15, 0x10, 0x0a, 0x05, 0x02}, /* 22, -5.0dB */
187 {0x20, 0x20, 0x1b, 0x16, 0x11, 0x08, 0x05, 0x02}, /* 23, -4.5dB */
188 {0x22, 0x21, 0x1d, 0x18, 0x11, 0x0b, 0x06, 0x02}, /* 24, -4.0dB */
189 {0x24, 0x23, 0x1f, 0x19, 0x13, 0x0c, 0x06, 0x03}, /* 25, -3.5dB */
190 {0x26, 0x25, 0x21, 0x1b, 0x14, 0x0d, 0x06, 0x03}, /* 26, -3.0dB */
191 {0x28, 0x28, 0x22, 0x1c, 0x15, 0x0d, 0x07, 0x03}, /* 27, -2.5dB */
192 {0x2b, 0x2a, 0x25, 0x1e, 0x16, 0x0e, 0x07, 0x03}, /* 28, -2.0dB */
193 {0x2d, 0x2d, 0x27, 0x1f, 0x18, 0x0f, 0x08, 0x03}, /* 29, -1.5dB */
194 {0x30, 0x2f, 0x29, 0x21, 0x19, 0x10, 0x08, 0x03}, /* 30, -1.0dB */
195 {0x33, 0x32, 0x2b, 0x23, 0x1a, 0x11, 0x08, 0x04}, /* 31, -0.5dB */
196 {0x36, 0x35, 0x2e, 0x25, 0x1c, 0x12, 0x09, 0x04} /* 32, +0dB */
197};
198
199static const u8 cckswing_table_ch14[CCK_TABLE_SIZE][8] = {
200 {0x09, 0x08, 0x07, 0x04, 0x00, 0x00, 0x00, 0x00}, /* 0, -16.0dB */
201 {0x09, 0x09, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00}, /* 1, -15.5dB */
202 {0x0a, 0x09, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00}, /* 2, -15.0dB */
203 {0x0a, 0x0a, 0x09, 0x05, 0x00, 0x00, 0x00, 0x00}, /* 3, -14.5dB */
204 {0x0b, 0x0a, 0x09, 0x05, 0x00, 0x00, 0x00, 0x00}, /* 4, -14.0dB */
205 {0x0b, 0x0b, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00}, /* 5, -13.5dB */
206 {0x0c, 0x0c, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00}, /* 6, -13.0dB */
207 {0x0d, 0x0c, 0x0b, 0x06, 0x00, 0x00, 0x00, 0x00}, /* 7, -12.5dB */
208 {0x0d, 0x0d, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x00}, /* 8, -12.0dB */
209 {0x0e, 0x0e, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x00}, /* 9, -11.5dB */
210 {0x0f, 0x0f, 0x0d, 0x08, 0x00, 0x00, 0x00, 0x00}, /* 10, -11.0dB */
211 {0x10, 0x10, 0x0e, 0x08, 0x00, 0x00, 0x00, 0x00}, /* 11, -10.5dB */
212 {0x11, 0x11, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00}, /* 12, -10.0dB */
213 {0x12, 0x12, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00}, /* 13, -9.5dB */
214 {0x13, 0x13, 0x10, 0x0a, 0x00, 0x00, 0x00, 0x00}, /* 14, -9.0dB */
215 {0x14, 0x14, 0x11, 0x0a, 0x00, 0x00, 0x00, 0x00}, /* 15, -8.5dB */
216 {0x16, 0x15, 0x12, 0x0b, 0x00, 0x00, 0x00, 0x00}, /* 16, -8.0dB */
217 {0x17, 0x16, 0x13, 0x0b, 0x00, 0x00, 0x00, 0x00}, /* 17, -7.5dB */
218 {0x18, 0x17, 0x15, 0x0c, 0x00, 0x00, 0x00, 0x00}, /* 18, -7.0dB */
219 {0x1a, 0x19, 0x16, 0x0d, 0x00, 0x00, 0x00, 0x00}, /* 19, -6.5dB */
220 {0x1b, 0x1a, 0x17, 0x0e, 0x00, 0x00, 0x00, 0x00}, /* 20, -6.0dB */
221 {0x1d, 0x1c, 0x18, 0x0e, 0x00, 0x00, 0x00, 0x00}, /* 21, -5.5dB */
222 {0x1f, 0x1e, 0x1a, 0x0f, 0x00, 0x00, 0x00, 0x00}, /* 22, -5.0dB */
223 {0x20, 0x20, 0x1b, 0x10, 0x00, 0x00, 0x00, 0x00}, /* 23, -4.5dB */
224 {0x22, 0x21, 0x1d, 0x11, 0x00, 0x00, 0x00, 0x00}, /* 24, -4.0dB */
225 {0x24, 0x23, 0x1f, 0x12, 0x00, 0x00, 0x00, 0x00}, /* 25, -3.5dB */
226 {0x26, 0x25, 0x21, 0x13, 0x00, 0x00, 0x00, 0x00}, /* 26, -3.0dB */
227 {0x28, 0x28, 0x24, 0x14, 0x00, 0x00, 0x00, 0x00}, /* 27, -2.5dB */
228 {0x2b, 0x2a, 0x25, 0x15, 0x00, 0x00, 0x00, 0x00}, /* 28, -2.0dB */
229 {0x2d, 0x2d, 0x17, 0x17, 0x00, 0x00, 0x00, 0x00}, /* 29, -1.5dB */
230 {0x30, 0x2f, 0x29, 0x18, 0x00, 0x00, 0x00, 0x00}, /* 30, -1.0dB */
231 {0x33, 0x32, 0x2b, 0x19, 0x00, 0x00, 0x00, 0x00}, /* 31, -0.5dB */
232 {0x36, 0x35, 0x2e, 0x1b, 0x00, 0x00, 0x00, 0x00} /* 32, +0dB */
233};
234
235static const u32 edca_setting_dl[PEER_MAX] = {
236 0xa44f, /* 0 UNKNOWN */
237 0x5ea44f, /* 1 REALTEK_90 */
238 0x5e4322, /* 2 REALTEK_92SE */
239 0x5ea42b, /* 3 BROAD */
240 0xa44f, /* 4 RAL */
241 0xa630, /* 5 ATH */
242 0x5ea630, /* 6 CISCO */
243 0x5ea42b, /* 7 MARVELL */
244};
245
246static const u32 edca_setting_ul[PEER_MAX] = {
247 0x5e4322, /* 0 UNKNOWN */
248 0xa44f, /* 1 REALTEK_90 */
249 0x5ea44f, /* 2 REALTEK_92SE */
250 0x5ea32b, /* 3 BROAD */
251 0x5ea422, /* 4 RAL */
252 0x5ea322, /* 5 ATH */
253 0x3ea430, /* 6 CISCO */
254 0x5ea44f, /* 7 MARV */
255};
256
257static u8 rtl8818e_delta_swing_table_idx_24gb_p[] = {
258 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 4, 4,
259 4, 4, 4, 5, 5, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9};
260
261static u8 rtl8818e_delta_swing_table_idx_24gb_n[] = {
262 0, 0, 0, 2, 2, 3, 3, 4, 4, 4, 4, 5, 5, 6, 6,
263 7, 7, 7, 7, 8, 8, 9, 9, 10, 10, 10, 11, 11, 11, 11};
264
265static u8 rtl8812ae_delta_swing_table_idx_24gb_n[] = {
266 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6,
267 6, 6, 7, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11};
268
269static u8 rtl8812ae_delta_swing_table_idx_24gb_p[] = {
270 0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6,
271 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9};
272
273static u8 rtl8812ae_delta_swing_table_idx_24ga_n[] = {
274 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6,
275 6, 6, 7, 8, 8, 9, 9, 9, 10, 10, 10, 10, 11, 11};
276
277static u8 rtl8812ae_delta_swing_table_idx_24ga_p[] = {
278 0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6,
279 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9};
280
281static u8 rtl8812ae_delta_swing_table_idx_24gcckb_n[] = {
282 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6,
283 6, 6, 7, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11};
284
285static u8 rtl8812ae_delta_swing_table_idx_24gcckb_p[] = {
286 0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6,
287 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9};
288
289static u8 rtl8812ae_delta_swing_table_idx_24gccka_n[] = {
290 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6,
291 6, 6, 7, 8, 8, 9, 9, 9, 10, 10, 10, 10, 11, 11};
292
293static u8 rtl8812ae_delta_swing_table_idx_24gccka_p[] = {
294 0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6,
295 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9};
296
297static u8 rtl8812ae_delta_swing_table_idx_5gb_n[][DEL_SW_IDX_SZ] = {
298 {0, 1, 1, 2, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7,
299 7, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 13},
300 {0, 1, 1, 2, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7,
301 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 13, 13},
302 {0, 1, 1, 2, 3, 3, 4, 4, 5, 6, 6, 7, 8, 9, 10, 11,
303 12, 12, 13, 14, 14, 14, 15, 16, 17, 17, 17, 18, 18, 18},
304};
305
306static u8 rtl8812ae_delta_swing_table_idx_5gb_p[][DEL_SW_IDX_SZ] = {
307 {0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 8,
308 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11},
309 {0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 7, 8,
310 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11},
311 {0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 7, 7, 8, 8, 9,
312 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11},
313};
314
315static u8 rtl8812ae_delta_swing_table_idx_5ga_n[][DEL_SW_IDX_SZ] = {
316 {0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 7, 8,
317 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 13, 13, 13},
318 {0, 1, 1, 2, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 8, 9,
319 9, 10, 10, 11, 11, 11, 12, 12, 12, 12, 12, 13, 13},
320 {0, 1, 1, 2, 2, 3, 3, 4, 5, 6, 7, 8, 8, 9, 10, 11,
321 12, 13, 14, 14, 15, 15, 15, 16, 16, 16, 17, 17, 18, 18},
322};
323
324static u8 rtl8812ae_delta_swing_table_idx_5ga_p[][DEL_SW_IDX_SZ] = {
325 {0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 4, 5, 5, 6, 7, 7, 8,
326 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11},
327 {0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 7, 8,
328 9, 9, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11},
329 {0, 1, 1, 2, 3, 3, 4, 4, 5, 6, 6, 7, 7, 8, 9, 9,
330 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11},
331};
332
333static u8 rtl8821ae_delta_swing_table_idx_24gb_n[] = {
334 0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6,
335 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10};
336
337static u8 rtl8821ae_delta_swing_table_idx_24gb_p[] = {
338 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8,
339 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 12, 12, 12};
340
341static u8 rtl8821ae_delta_swing_table_idx_24ga_n[] = {
342 0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6,
343 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10};
344
345static u8 rtl8821ae_delta_swing_table_idx_24ga_p[] = {
346 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8,
347 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 12, 12, 12};
348
349static u8 rtl8821ae_delta_swing_table_idx_24gcckb_n[] = {
350 0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6,
351 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10};
352
353static u8 rtl8821ae_delta_swing_table_idx_24gcckb_p[] = {
354 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8,
355 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 12, 12, 12};
356
357static u8 rtl8821ae_delta_swing_table_idx_24gccka_n[] = {
358 0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6,
359 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10};
360
361static u8 rtl8821ae_delta_swing_table_idx_24gccka_p[] = {
362 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8,
363 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 12, 12, 12};
364
365static u8 rtl8821ae_delta_swing_table_idx_5gb_n[][DEL_SW_IDX_SZ] = {
366 {0, 0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11,
367 12, 12, 13, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16},
368 {0, 0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11,
369 12, 12, 13, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16},
370 {0, 0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11,
371 12, 12, 13, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16},
372};
373
374static u8 rtl8821ae_delta_swing_table_idx_5gb_p[][DEL_SW_IDX_SZ] = {
375 {0, 0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11,
376 12, 12, 13, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16},
377 {0, 0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11,
378 12, 12, 13, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16},
379 {0, 0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11,
380 12, 12, 13, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16},
381};
382
383static u8 rtl8821ae_delta_swing_table_idx_5ga_n[][DEL_SW_IDX_SZ] = {
384 {0, 0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11,
385 12, 12, 13, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16},
386 {0, 0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11,
387 12, 12, 13, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16},
388 {0, 0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11,
389 12, 12, 13, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16},
390};
391
392static u8 rtl8821ae_delta_swing_table_idx_5ga_p[][DEL_SW_IDX_SZ] = {
393 {0, 0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11,
394 12, 12, 13, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16},
395 {0, 0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11,
396 12, 12, 13, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16},
397 {0, 0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11,
398 12, 12, 13, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16},
399};
400
401void rtl8821ae_dm_txpower_track_adjust(struct ieee80211_hw *hw,
402 u8 type, u8 *pdirection,
403 u32 *poutwrite_val)
404{
405 struct rtl_priv *rtlpriv = rtl_priv(hw);
406 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
407 u8 pwr_val = 0;
408
409 if (type == 0) {
410 if (rtlpriv->dm.swing_idx_ofdm[RF90_PATH_A] <=
411 rtlpriv->dm.swing_idx_ofdm_base[RF90_PATH_A]) {
412 *pdirection = 1;
413 pwr_val = rtldm->swing_idx_ofdm_base[RF90_PATH_A] -
414 rtldm->swing_idx_ofdm[RF90_PATH_A];
415 } else {
416 *pdirection = 2;
417 pwr_val = rtldm->swing_idx_ofdm[RF90_PATH_A] -
418 rtldm->swing_idx_ofdm_base[RF90_PATH_A];
419 }
420 } else if (type == 1) {
421 if (rtldm->swing_idx_cck <= rtldm->swing_idx_cck_base) {
422 *pdirection = 1;
423 pwr_val = rtldm->swing_idx_cck_base -
424 rtldm->swing_idx_cck;
425 } else {
426 *pdirection = 2;
427 pwr_val = rtldm->swing_idx_cck -
428 rtldm->swing_idx_cck_base;
429 }
430 }
431
432 if (pwr_val >= TXPWRTRACK_MAX_IDX && (*pdirection == 1))
433 pwr_val = TXPWRTRACK_MAX_IDX;
434
435 *poutwrite_val = pwr_val | (pwr_val << 8)|
436 (pwr_val << 16)|
437 (pwr_val << 24);
438}
439
440void rtl8821ae_dm_clear_txpower_tracking_state(struct ieee80211_hw *hw)
441{
442 struct rtl_priv *rtlpriv = rtl_priv(hw);
443 struct rtl_dm *rtldm = rtl_dm(rtlpriv);
444 struct rtl_efuse *rtlefuse = rtl_efuse(rtlpriv);
445 u8 p = 0;
446
447 rtldm->swing_idx_cck_base = rtldm->default_cck_index;
448 rtldm->swing_idx_cck = rtldm->default_cck_index;
449 rtldm->cck_index = 0;
450
451 for (p = RF90_PATH_A; p <= RF90_PATH_B; ++p) {
452 rtldm->swing_idx_ofdm_base[p] = rtldm->default_ofdm_index;
453 rtldm->swing_idx_ofdm[p] = rtldm->default_ofdm_index;
454 rtldm->ofdm_index[p] = rtldm->default_ofdm_index;
455
456 rtldm->power_index_offset[p] = 0;
457 rtldm->delta_power_index[p] = 0;
458 rtldm->delta_power_index_last[p] = 0;
459 /*Initial Mix mode power tracking*/
460 rtldm->absolute_ofdm_swing_idx[p] = 0;
461 rtldm->remnant_ofdm_swing_idx[p] = 0;
462 }
463 /*Initial at Modify Tx Scaling Mode*/
464 rtldm->modify_txagc_flag_path_a = false;
465 /*Initial at Modify Tx Scaling Mode*/
466 rtldm->modify_txagc_flag_path_b = false;
467 rtldm->remnant_cck_idx = 0;
468 rtldm->thermalvalue = rtlefuse->eeprom_thermalmeter;
469 rtldm->thermalvalue_iqk = rtlefuse->eeprom_thermalmeter;
470 rtldm->thermalvalue_lck = rtlefuse->eeprom_thermalmeter;
471}
472
473static u8 rtl8821ae_dm_get_swing_index(struct ieee80211_hw *hw)
474{
475 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
476 u8 i = 0;
477 u32 bb_swing;
478
479 bb_swing = phy_get_tx_swing_8812A(hw, rtlhal->current_bandtype,
480 RF90_PATH_A);
481
482 for (i = 0; i < TXSCALE_TABLE_SIZE; ++i)
483 if (bb_swing == rtl8821ae_txscaling_table[i])
484 break;
485
486 return i;
487}
488
489void rtl8821ae_dm_initialize_txpower_tracking_thermalmeter(
490 struct ieee80211_hw *hw)
491{
492 struct rtl_priv *rtlpriv = rtl_priv(hw);
493 struct rtl_dm *rtldm = rtl_dm(rtlpriv);
494 struct rtl_efuse *rtlefuse = rtl_efuse(rtlpriv);
495 u8 default_swing_index = 0;
496 u8 p = 0;
497
498 rtlpriv->dm.txpower_track_control = true;
499 rtldm->thermalvalue = rtlefuse->eeprom_thermalmeter;
500 rtldm->thermalvalue_iqk = rtlefuse->eeprom_thermalmeter;
501 rtldm->thermalvalue_lck = rtlefuse->eeprom_thermalmeter;
502 default_swing_index = rtl8821ae_dm_get_swing_index(hw);
503
504 rtldm->default_ofdm_index =
505 (default_swing_index == TXSCALE_TABLE_SIZE) ?
506 24 : default_swing_index;
507 rtldm->default_cck_index = 24;
508
509 rtldm->swing_idx_cck_base = rtldm->default_cck_index;
510 rtldm->cck_index = rtldm->default_cck_index;
511
512 for (p = RF90_PATH_A; p < MAX_RF_PATH; ++p) {
513 rtldm->swing_idx_ofdm_base[p] =
514 rtldm->default_ofdm_index;
515 rtldm->ofdm_index[p] = rtldm->default_ofdm_index;
516 rtldm->delta_power_index[p] = 0;
517 rtldm->power_index_offset[p] = 0;
518 rtldm->delta_power_index_last[p] = 0;
519 }
520}
521
522static void rtl8821ae_dm_diginit(struct ieee80211_hw *hw)
523{
524 struct rtl_priv *rtlpriv = rtl_priv(hw);
525 struct dig_t *dm_digtable = &rtlpriv->dm_digtable;
526
527 dm_digtable->cur_igvalue = rtl_get_bbreg(hw, ROFDM0_XAAGCCORE1, 0x7f);
528 dm_digtable->rssi_lowthresh = DM_DIG_THRESH_LOW;
529 dm_digtable->rssi_highthresh = DM_DIG_THRESH_HIGH;
530 dm_digtable->fa_lowthresh = DM_FALSEALARM_THRESH_LOW;
531 dm_digtable->fa_highthresh = DM_FALSEALARM_THRESH_HIGH;
532 dm_digtable->rx_gain_max = DM_DIG_MAX;
533 dm_digtable->rx_gain_min = DM_DIG_MIN;
534 dm_digtable->back_val = DM_DIG_BACKOFF_DEFAULT;
535 dm_digtable->back_range_max = DM_DIG_BACKOFF_MAX;
536 dm_digtable->back_range_min = DM_DIG_BACKOFF_MIN;
537 dm_digtable->pre_cck_cca_thres = 0xff;
538 dm_digtable->cur_cck_cca_thres = 0x83;
539 dm_digtable->forbidden_igi = DM_DIG_MIN;
540 dm_digtable->large_fa_hit = 0;
541 dm_digtable->recover_cnt = 0;
542 dm_digtable->dig_dynamic_min = DM_DIG_MIN;
543 dm_digtable->dig_dynamic_min_1 = DM_DIG_MIN;
544 dm_digtable->media_connect_0 = false;
545 dm_digtable->media_connect_1 = false;
546 rtlpriv->dm.dm_initialgain_enable = true;
547 dm_digtable->bt30_cur_igi = 0x32;
548}
549
550void rtl8821ae_dm_init_edca_turbo(struct ieee80211_hw *hw)
551{
552 struct rtl_priv *rtlpriv = rtl_priv(hw);
553
554 rtlpriv->dm.current_turbo_edca = false;
555 rtlpriv->dm.is_any_nonbepkts = false;
556 rtlpriv->dm.is_cur_rdlstate = false;
557}
558
559void rtl8821ae_dm_init_rate_adaptive_mask(struct ieee80211_hw *hw)
560{
561 struct rtl_priv *rtlpriv = rtl_priv(hw);
562 struct rate_adaptive *p_ra = &rtlpriv->ra;
563
564 p_ra->ratr_state = DM_RATR_STA_INIT;
565 p_ra->pre_ratr_state = DM_RATR_STA_INIT;
566
567 rtlpriv->dm.dm_type = DM_TYPE_BYDRIVER;
568 if (rtlpriv->dm.dm_type == DM_TYPE_BYDRIVER)
569 rtlpriv->dm.useramask = true;
570 else
571 rtlpriv->dm.useramask = false;
572
573 p_ra->high_rssi_thresh_for_ra = 50;
574 p_ra->low_rssi_thresh_for_ra40m = 20;
575}
576
577static void rtl8821ae_dm_init_dynamic_atc_switch(struct ieee80211_hw *hw)
578{
579 struct rtl_priv *rtlpriv = rtl_priv(hw);
580
581 rtlpriv->dm.crystal_cap = rtlpriv->efuse.crystalcap;
582
583 rtlpriv->dm.atc_status = rtl_get_bbreg(hw, ROFDM1_CFOTRACKING, BIT(11));
584 rtlpriv->dm.cfo_threshold = CFO_THRESHOLD_XTAL;
585}
586
587static void rtl8821ae_dm_common_info_self_init(struct ieee80211_hw *hw)
588{
589 struct rtl_priv *rtlpriv = rtl_priv(hw);
590 struct rtl_phy *rtlphy = &rtlpriv->phy;
591 u8 tmp;
592
593 rtlphy->cck_high_power =
594 (bool)rtl_get_bbreg(hw, ODM_REG_CCK_RPT_FORMAT_11AC,
595 ODM_BIT_CCK_RPT_FORMAT_11AC);
596
597 tmp = (u8)rtl_get_bbreg(hw, ODM_REG_BB_RX_PATH_11AC,
598 ODM_BIT_BB_RX_PATH_11AC);
599 if (tmp & BIT(0))
600 rtlpriv->dm.rfpath_rxenable[0] = true;
601 if (tmp & BIT(1))
602 rtlpriv->dm.rfpath_rxenable[1] = true;
603}
604
605void rtl8821ae_dm_init(struct ieee80211_hw *hw)
606{
607 struct rtl_priv *rtlpriv = rtl_priv(hw);
608 struct rtl_phy *rtlphy = &rtlpriv->phy;
609
610 spin_lock(&rtlpriv->locks.iqk_lock);
611 rtlphy->lck_inprogress = false;
612 spin_unlock(&rtlpriv->locks.iqk_lock);
613
614 rtlpriv->dm.dm_type = DM_TYPE_BYDRIVER;
615 rtl8821ae_dm_common_info_self_init(hw);
616 rtl8821ae_dm_diginit(hw);
617 rtl8821ae_dm_init_rate_adaptive_mask(hw);
618 rtl8821ae_dm_init_edca_turbo(hw);
619 rtl8821ae_dm_initialize_txpower_tracking_thermalmeter(hw);
620 rtl8821ae_dm_init_dynamic_atc_switch(hw);
621}
622
623static void rtl8821ae_dm_find_minimum_rssi(struct ieee80211_hw *hw)
624{
625 struct rtl_priv *rtlpriv = rtl_priv(hw);
626 struct dig_t *rtl_dm_dig = &rtlpriv->dm_digtable;
627 struct rtl_mac *mac = rtl_mac(rtlpriv);
628
629 /* Determine the minimum RSSI */
630 if ((mac->link_state < MAC80211_LINKED) &&
631 (rtlpriv->dm.entry_min_undec_sm_pwdb == 0)) {
632 rtl_dm_dig->min_undec_pwdb_for_dm = 0;
633 RT_TRACE(rtlpriv, COMP_BB_POWERSAVING, DBG_LOUD,
634 "Not connected to any\n");
635 }
636 if (mac->link_state >= MAC80211_LINKED) {
637 if (mac->opmode == NL80211_IFTYPE_AP ||
638 mac->opmode == NL80211_IFTYPE_ADHOC) {
639 rtl_dm_dig->min_undec_pwdb_for_dm =
640 rtlpriv->dm.entry_min_undec_sm_pwdb;
641 RT_TRACE(rtlpriv, COMP_BB_POWERSAVING, DBG_LOUD,
642 "AP Client PWDB = 0x%lx\n",
643 rtlpriv->dm.entry_min_undec_sm_pwdb);
644 } else {
645 rtl_dm_dig->min_undec_pwdb_for_dm =
646 rtlpriv->dm.undec_sm_pwdb;
647 RT_TRACE(rtlpriv, COMP_BB_POWERSAVING, DBG_LOUD,
648 "STA Default Port PWDB = 0x%x\n",
649 rtl_dm_dig->min_undec_pwdb_for_dm);
650 }
651 } else {
652 rtl_dm_dig->min_undec_pwdb_for_dm =
653 rtlpriv->dm.entry_min_undec_sm_pwdb;
654 RT_TRACE(rtlpriv, COMP_BB_POWERSAVING, DBG_LOUD,
655 "AP Ext Port or disconnet PWDB = 0x%x\n",
656 rtl_dm_dig->min_undec_pwdb_for_dm);
657 }
658 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
659 "MinUndecoratedPWDBForDM =%d\n",
660 rtl_dm_dig->min_undec_pwdb_for_dm);
661}
662
663static void rtl8812ae_dm_rssi_dump_to_register(struct ieee80211_hw *hw)
664{
665 struct rtl_priv *rtlpriv = rtl_priv(hw);
666
667 rtl_write_byte(rtlpriv, RA_RSSI_DUMP,
668 rtlpriv->stats.rx_rssi_percentage[0]);
669 rtl_write_byte(rtlpriv, RB_RSSI_DUMP,
670 rtlpriv->stats.rx_rssi_percentage[1]);
671
672 /* Rx EVM*/
673 rtl_write_byte(rtlpriv, RS1_RX_EVM_DUMP,
674 rtlpriv->stats.rx_evm_dbm[0]);
675 rtl_write_byte(rtlpriv, RS2_RX_EVM_DUMP,
676 rtlpriv->stats.rx_evm_dbm[1]);
677
678 /*Rx SNR*/
679 rtl_write_byte(rtlpriv, RA_RX_SNR_DUMP,
680 (u8)(rtlpriv->stats.rx_snr_db[0]));
681 rtl_write_byte(rtlpriv, RB_RX_SNR_DUMP,
682 (u8)(rtlpriv->stats.rx_snr_db[1]));
683
684 /*Rx Cfo_Short*/
685 rtl_write_word(rtlpriv, RA_CFO_SHORT_DUMP,
686 rtlpriv->stats.rx_cfo_short[0]);
687 rtl_write_word(rtlpriv, RB_CFO_SHORT_DUMP,
688 rtlpriv->stats.rx_cfo_short[1]);
689
690 /*Rx Cfo_Tail*/
691 rtl_write_word(rtlpriv, RA_CFO_LONG_DUMP,
692 rtlpriv->stats.rx_cfo_tail[0]);
693 rtl_write_word(rtlpriv, RB_CFO_LONG_DUMP,
694 rtlpriv->stats.rx_cfo_tail[1]);
695}
696
697static void rtl8821ae_dm_check_rssi_monitor(struct ieee80211_hw *hw)
698{
699 struct rtl_priv *rtlpriv = rtl_priv(hw);
700 struct dig_t *dm_digtable = &rtlpriv->dm_digtable;
701 struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
702 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
703 struct rtl_sta_info *drv_priv;
704 u8 h2c_parameter[4] = { 0 };
705 long tmp_entry_max_pwdb = 0, tmp_entry_min_pwdb = 0xff;
706 u8 stbc_tx = 0;
707 u64 cur_txokcnt = 0, cur_rxokcnt = 0;
708 static u64 last_txokcnt = 0, last_rxokcnt;
709
710 cur_txokcnt = rtlpriv->stats.txbytesunicast - last_txokcnt;
711 cur_rxokcnt = rtlpriv->stats.rxbytesunicast - last_rxokcnt;
712 last_txokcnt = rtlpriv->stats.txbytesunicast;
713 last_rxokcnt = rtlpriv->stats.rxbytesunicast;
714 if (cur_rxokcnt > (last_txokcnt * 6))
715 h2c_parameter[3] = 0x01;
716 else
717 h2c_parameter[3] = 0x00;
718
719 /* AP & ADHOC & MESH */
720 if (mac->opmode == NL80211_IFTYPE_AP ||
721 mac->opmode == NL80211_IFTYPE_ADHOC ||
722 mac->opmode == NL80211_IFTYPE_MESH_POINT) {
723 spin_lock_bh(&rtlpriv->locks.entry_list_lock);
724 list_for_each_entry(drv_priv, &rtlpriv->entry_list, list) {
725 if (drv_priv->rssi_stat.undec_sm_pwdb <
726 tmp_entry_min_pwdb)
727 tmp_entry_min_pwdb =
728 drv_priv->rssi_stat.undec_sm_pwdb;
729 if (drv_priv->rssi_stat.undec_sm_pwdb >
730 tmp_entry_max_pwdb)
731 tmp_entry_max_pwdb =
732 drv_priv->rssi_stat.undec_sm_pwdb;
733 }
734 spin_unlock_bh(&rtlpriv->locks.entry_list_lock);
735
736 /* If associated entry is found */
737 if (tmp_entry_max_pwdb != 0) {
738 rtlpriv->dm.entry_max_undec_sm_pwdb =
739 tmp_entry_max_pwdb;
740 RTPRINT(rtlpriv, FDM, DM_PWDB,
741 "EntryMaxPWDB = 0x%lx(%ld)\n",
742 tmp_entry_max_pwdb, tmp_entry_max_pwdb);
743 } else {
744 rtlpriv->dm.entry_max_undec_sm_pwdb = 0;
745 }
746 /* If associated entry is found */
747 if (tmp_entry_min_pwdb != 0xff) {
748 rtlpriv->dm.entry_min_undec_sm_pwdb =
749 tmp_entry_min_pwdb;
750 RTPRINT(rtlpriv, FDM, DM_PWDB,
751 "EntryMinPWDB = 0x%lx(%ld)\n",
752 tmp_entry_min_pwdb, tmp_entry_min_pwdb);
753 } else {
754 rtlpriv->dm.entry_min_undec_sm_pwdb = 0;
755 }
756 }
757 /* Indicate Rx signal strength to FW. */
758 if (rtlpriv->dm.useramask) {
759 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
760 if (mac->mode == WIRELESS_MODE_AC_24G ||
761 mac->mode == WIRELESS_MODE_AC_5G ||
762 mac->mode == WIRELESS_MODE_AC_ONLY)
763 stbc_tx = (mac->vht_cur_stbc &
764 STBC_VHT_ENABLE_TX) ? 1 : 0;
765 else
766 stbc_tx = (mac->ht_cur_stbc &
767 STBC_HT_ENABLE_TX) ? 1 : 0;
768 h2c_parameter[3] |= stbc_tx << 1;
769 }
770 h2c_parameter[2] =
771 (u8)(rtlpriv->dm.undec_sm_pwdb & 0xFF);
772 h2c_parameter[1] = 0x20;
773 h2c_parameter[0] = 0;
774 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE)
775 rtl8821ae_fill_h2c_cmd(hw, H2C_RSSI_21AE_REPORT, 4,
776 h2c_parameter);
777 else
778 rtl8821ae_fill_h2c_cmd(hw, H2C_RSSI_21AE_REPORT, 3,
779 h2c_parameter);
780 } else {
781 rtl_write_byte(rtlpriv, 0x4fe, rtlpriv->dm.undec_sm_pwdb);
782 }
783 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE)
784 rtl8812ae_dm_rssi_dump_to_register(hw);
785 rtl8821ae_dm_find_minimum_rssi(hw);
786 dm_digtable->rssi_val_min = rtlpriv->dm_digtable.min_undec_pwdb_for_dm;
787}
788
789void rtl8821ae_dm_write_cck_cca_thres(struct ieee80211_hw *hw, u8 current_cca)
790{
791 struct rtl_priv *rtlpriv = rtl_priv(hw);
792 struct dig_t *dm_digtable = &rtlpriv->dm_digtable;
793
794 if (dm_digtable->cur_cck_cca_thres != current_cca)
795 rtl_write_byte(rtlpriv, DM_REG_CCK_CCA_11AC, current_cca);
796
797 dm_digtable->pre_cck_cca_thres = dm_digtable->cur_cck_cca_thres;
798 dm_digtable->cur_cck_cca_thres = current_cca;
799}
800
801void rtl8821ae_dm_write_dig(struct ieee80211_hw *hw, u8 current_igi)
802{
803 struct rtl_priv *rtlpriv = rtl_priv(hw);
804 struct dig_t *dm_digtable = &rtlpriv->dm_digtable;
805
806 if (dm_digtable->stop_dig)
807 return;
808
809 if (dm_digtable->cur_igvalue != current_igi) {
810 rtl_set_bbreg(hw, DM_REG_IGI_A_11AC,
811 DM_BIT_IGI_11AC, current_igi);
812 if (rtlpriv->phy.rf_type != RF_1T1R)
813 rtl_set_bbreg(hw, DM_REG_IGI_B_11AC,
814 DM_BIT_IGI_11AC, current_igi);
815 }
816 dm_digtable->cur_igvalue = current_igi;
817}
818
819static void rtl8821ae_dm_dig(struct ieee80211_hw *hw)
820{
821 struct rtl_priv *rtlpriv = rtl_priv(hw);
822 struct dig_t *dm_digtable = &rtlpriv->dm_digtable;
823 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
824 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
825 u8 dig_dynamic_min;
826 u8 dig_max_of_min;
827 bool first_connect, first_disconnect;
828 u8 dm_dig_max, dm_dig_min, offset;
829 u8 current_igi = dm_digtable->cur_igvalue;
830
831 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, "\n");
832
833 if (mac->act_scanning) {
834 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
835 "Return: In Scan Progress\n");
836 return;
837 }
838
839 /*add by Neil Chen to avoid PSD is processing*/
840 dig_dynamic_min = dm_digtable->dig_dynamic_min;
841 first_connect = (mac->link_state >= MAC80211_LINKED) &&
842 (!dm_digtable->media_connect_0);
843 first_disconnect = (mac->link_state < MAC80211_LINKED) &&
844 (dm_digtable->media_connect_0);
845
846 /*1 Boundary Decision*/
847
848 dm_dig_max = 0x5A;
849
850 if (rtlhal->hw_type != HARDWARE_TYPE_RTL8821AE)
851 dm_dig_min = DM_DIG_MIN;
852 else
853 dm_dig_min = 0x1C;
854
855 dig_max_of_min = DM_DIG_MAX_AP;
856
857 if (mac->link_state >= MAC80211_LINKED) {
858 if (rtlhal->hw_type != HARDWARE_TYPE_RTL8821AE)
859 offset = 20;
860 else
861 offset = 10;
862
863 if ((dm_digtable->rssi_val_min + offset) > dm_dig_max)
864 dm_digtable->rx_gain_max = dm_dig_max;
865 else if ((dm_digtable->rssi_val_min + offset) < dm_dig_min)
866 dm_digtable->rx_gain_max = dm_dig_min;
867 else
868 dm_digtable->rx_gain_max =
869 dm_digtable->rssi_val_min + offset;
870
871 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
872 "dm_digtable->rssi_val_min=0x%x,dm_digtable->rx_gain_max = 0x%x",
873 dm_digtable->rssi_val_min,
874 dm_digtable->rx_gain_max);
875 if (rtlpriv->dm.one_entry_only) {
876 offset = 0;
877
878 if (dm_digtable->rssi_val_min - offset < dm_dig_min)
879 dig_dynamic_min = dm_dig_min;
880 else if (dm_digtable->rssi_val_min -
881 offset > dig_max_of_min)
882 dig_dynamic_min = dig_max_of_min;
883 else
884 dig_dynamic_min =
885 dm_digtable->rssi_val_min - offset;
886
887 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
888 "bOneEntryOnly=TRUE, dig_dynamic_min=0x%x\n",
889 dig_dynamic_min);
890 } else {
891 dig_dynamic_min = dm_dig_min;
892 }
893 } else {
894 dm_digtable->rx_gain_max = dm_dig_max;
895 dig_dynamic_min = dm_dig_min;
896 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
897 "No Link\n");
898 }
899
900 if (rtlpriv->falsealm_cnt.cnt_all > 10000) {
901 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
902 "Abnornally false alarm case.\n");
903
904 if (dm_digtable->large_fa_hit != 3)
905 dm_digtable->large_fa_hit++;
906 if (dm_digtable->forbidden_igi < current_igi) {
907 dm_digtable->forbidden_igi = current_igi;
908 dm_digtable->large_fa_hit = 1;
909 }
910
911 if (dm_digtable->large_fa_hit >= 3) {
912 if ((dm_digtable->forbidden_igi + 1) >
913 dm_digtable->rx_gain_max)
914 dm_digtable->rx_gain_min =
915 dm_digtable->rx_gain_max;
916 else
917 dm_digtable->rx_gain_min =
918 (dm_digtable->forbidden_igi + 1);
919 dm_digtable->recover_cnt = 3600;
920 }
921 } else {
922 /*Recovery mechanism for IGI lower bound*/
923 if (dm_digtable->recover_cnt != 0) {
924 dm_digtable->recover_cnt--;
925 } else {
926 if (dm_digtable->large_fa_hit < 3) {
927 if ((dm_digtable->forbidden_igi - 1) <
928 dig_dynamic_min) {
929 dm_digtable->forbidden_igi =
930 dig_dynamic_min;
931 dm_digtable->rx_gain_min =
932 dig_dynamic_min;
933 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
934 "Normal Case: At Lower Bound\n");
935 } else {
936 dm_digtable->forbidden_igi--;
937 dm_digtable->rx_gain_min =
938 (dm_digtable->forbidden_igi + 1);
939 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
940 "Normal Case: Approach Lower Bound\n");
941 }
942 } else {
943 dm_digtable->large_fa_hit = 0;
944 }
945 }
946 }
947 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
948 "pDM_DigTable->LargeFAHit=%d\n",
949 dm_digtable->large_fa_hit);
950
951 if (rtlpriv->dm.dbginfo.num_qry_beacon_pkt < 10)
952 dm_digtable->rx_gain_min = dm_dig_min;
953
954 if (dm_digtable->rx_gain_min > dm_digtable->rx_gain_max)
955 dm_digtable->rx_gain_min = dm_digtable->rx_gain_max;
956
957 /*Adjust initial gain by false alarm*/
958 if (mac->link_state >= MAC80211_LINKED) {
959 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
960 "DIG AfterLink\n");
961 if (first_connect) {
962 if (dm_digtable->rssi_val_min <= dig_max_of_min)
963 current_igi = dm_digtable->rssi_val_min;
964 else
965 current_igi = dig_max_of_min;
966 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
967 "First Connect\n");
968 } else {
969 if (rtlpriv->falsealm_cnt.cnt_all > DM_DIG_FA_TH2)
970 current_igi = current_igi + 4;
971 else if (rtlpriv->falsealm_cnt.cnt_all > DM_DIG_FA_TH1)
972 current_igi = current_igi + 2;
973 else if (rtlpriv->falsealm_cnt.cnt_all < DM_DIG_FA_TH0)
974 current_igi = current_igi - 2;
975
976 if ((rtlpriv->dm.dbginfo.num_qry_beacon_pkt < 10) &&
977 (rtlpriv->falsealm_cnt.cnt_all < DM_DIG_FA_TH1)) {
978 current_igi = dm_digtable->rx_gain_min;
979 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
980 "Beacon is less than 10 and FA is less than 768, IGI GOES TO 0x1E!!!!!!!!!!!!\n");
981 }
982 }
983 } else {
984 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
985 "DIG BeforeLink\n");
986 if (first_disconnect) {
987 current_igi = dm_digtable->rx_gain_min;
988 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
989 "First DisConnect\n");
990 } else {
991 /* 2012.03.30 LukeLee: enable DIG before
992 * link but with very high thresholds
993 */
994 if (rtlpriv->falsealm_cnt.cnt_all > 2000)
995 current_igi = current_igi + 4;
996 else if (rtlpriv->falsealm_cnt.cnt_all > 600)
997 current_igi = current_igi + 2;
998 else if (rtlpriv->falsealm_cnt.cnt_all < 300)
999 current_igi = current_igi - 2;
1000
1001 if (current_igi >= 0x3e)
1002 current_igi = 0x3e;
1003
1004 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, "England DIG\n");
1005 }
1006 }
1007 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
1008 "DIG End Adjust IGI\n");
1009 /* Check initial gain by upper/lower bound*/
1010
1011 if (current_igi > dm_digtable->rx_gain_max)
1012 current_igi = dm_digtable->rx_gain_max;
1013 if (current_igi < dm_digtable->rx_gain_min)
1014 current_igi = dm_digtable->rx_gain_min;
1015
1016 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
1017 "rx_gain_max=0x%x, rx_gain_min=0x%x\n",
1018 dm_digtable->rx_gain_max, dm_digtable->rx_gain_min);
1019 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
1020 "TotalFA=%d\n", rtlpriv->falsealm_cnt.cnt_all);
1021 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
1022 "CurIGValue=0x%x\n", current_igi);
1023
1024 rtl8821ae_dm_write_dig(hw, current_igi);
1025 dm_digtable->media_connect_0 =
1026 ((mac->link_state >= MAC80211_LINKED) ? true : false);
1027 dm_digtable->dig_dynamic_min = dig_dynamic_min;
1028}
1029
1030static void rtl8821ae_dm_common_info_self_update(struct ieee80211_hw *hw)
1031{
1032 struct rtl_priv *rtlpriv = rtl_priv(hw);
1033 u8 cnt = 0;
1034 struct rtl_sta_info *drv_priv;
1035
1036 rtlpriv->dm.tx_rate = 0xff;
1037
1038 rtlpriv->dm.one_entry_only = false;
1039
1040 if (rtlpriv->mac80211.opmode == NL80211_IFTYPE_STATION &&
1041 rtlpriv->mac80211.link_state >= MAC80211_LINKED) {
1042 rtlpriv->dm.one_entry_only = true;
1043 return;
1044 }
1045
1046 if (rtlpriv->mac80211.opmode == NL80211_IFTYPE_AP ||
1047 rtlpriv->mac80211.opmode == NL80211_IFTYPE_ADHOC ||
1048 rtlpriv->mac80211.opmode == NL80211_IFTYPE_MESH_POINT) {
1049 spin_lock_bh(&rtlpriv->locks.entry_list_lock);
1050 list_for_each_entry(drv_priv, &rtlpriv->entry_list, list)
1051 cnt++;
1052 spin_unlock_bh(&rtlpriv->locks.entry_list_lock);
1053
1054 if (cnt == 1)
1055 rtlpriv->dm.one_entry_only = true;
1056 }
1057}
1058
1059static void rtl8821ae_dm_false_alarm_counter_statistics(struct ieee80211_hw *hw)
1060{
1061 struct rtl_priv *rtlpriv = rtl_priv(hw);
1062 struct false_alarm_statistics *falsealm_cnt = &rtlpriv->falsealm_cnt;
1063 u32 cck_enable = 0;
1064
1065 /*read OFDM FA counter*/
1066 falsealm_cnt->cnt_ofdm_fail =
1067 rtl_get_bbreg(hw, ODM_REG_OFDM_FA_11AC, BMASKLWORD);
1068 falsealm_cnt->cnt_cck_fail =
1069 rtl_get_bbreg(hw, ODM_REG_CCK_FA_11AC, BMASKLWORD);
1070
1071 cck_enable = rtl_get_bbreg(hw, ODM_REG_BB_RX_PATH_11AC, BIT(28));
1072 if (cck_enable) /*if(pDM_Odm->pBandType == ODM_BAND_2_4G)*/
1073 falsealm_cnt->cnt_all = falsealm_cnt->cnt_ofdm_fail +
1074 falsealm_cnt->cnt_cck_fail;
1075 else
1076 falsealm_cnt->cnt_all = falsealm_cnt->cnt_ofdm_fail;
1077
1078 /*reset OFDM FA coutner*/
1079 rtl_set_bbreg(hw, ODM_REG_OFDM_FA_RST_11AC, BIT(17), 1);
1080 rtl_set_bbreg(hw, ODM_REG_OFDM_FA_RST_11AC, BIT(17), 0);
1081 /* reset CCK FA counter*/
1082 rtl_set_bbreg(hw, ODM_REG_CCK_FA_RST_11AC, BIT(15), 0);
1083 rtl_set_bbreg(hw, ODM_REG_CCK_FA_RST_11AC, BIT(15), 1);
1084
1085 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, "Cnt_Cck_fail=%d\n",
1086 falsealm_cnt->cnt_cck_fail);
1087 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, "cnt_ofdm_fail=%d\n",
1088 falsealm_cnt->cnt_ofdm_fail);
1089 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, "Total False Alarm=%d\n",
1090 falsealm_cnt->cnt_all);
1091}
1092
1093static void rtl8812ae_dm_check_txpower_tracking_thermalmeter(
1094 struct ieee80211_hw *hw)
1095{
1096 struct rtl_priv *rtlpriv = rtl_priv(hw);
1097 static u8 tm_trigger;
1098
1099 if (!tm_trigger) {
1100 rtl_set_rfreg(hw, RF90_PATH_A, RF_T_METER_88E,
1101 BIT(17) | BIT(16), 0x03);
1102 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1103 "Trigger 8812 Thermal Meter!!\n");
1104 tm_trigger = 1;
1105 return;
1106 }
1107 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1108 "Schedule TxPowerTracking direct call!!\n");
1109 rtl8812ae_dm_txpower_tracking_callback_thermalmeter(hw);
1110 tm_trigger = 0;
1111}
1112
1113static void rtl8821ae_dm_iq_calibrate(struct ieee80211_hw *hw)
1114{
1115 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
1116 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
1117 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1118
1119 if (mac->link_state >= MAC80211_LINKED) {
1120 if (rtldm->linked_interval < 3)
1121 rtldm->linked_interval++;
1122
1123 if (rtldm->linked_interval == 2) {
1124 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE)
1125 rtl8812ae_phy_iq_calibrate(hw, false);
1126 else
1127 rtl8821ae_phy_iq_calibrate(hw, false);
1128 }
1129 } else {
1130 rtldm->linked_interval = 0;
1131 }
1132}
1133
1134static void rtl8812ae_get_delta_swing_table(struct ieee80211_hw *hw,
1135 u8 **up_a, u8 **down_a,
1136 u8 **up_b, u8 **down_b)
1137{
1138 struct rtl_priv *rtlpriv = rtl_priv(hw);
1139 struct rtl_phy *rtlphy = &rtlpriv->phy;
1140 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
1141 u8 channel = rtlphy->current_channel;
1142 u8 rate = rtldm->tx_rate;
1143
1144 if (1 <= channel && channel <= 14) {
1145 if (RTL8821AE_RX_HAL_IS_CCK_RATE(rate)) {
1146 *up_a = rtl8812ae_delta_swing_table_idx_24gccka_p;
1147 *down_a = rtl8812ae_delta_swing_table_idx_24gccka_n;
1148 *up_b = rtl8812ae_delta_swing_table_idx_24gcckb_p;
1149 *down_b = rtl8812ae_delta_swing_table_idx_24gcckb_n;
1150 } else {
1151 *up_a = rtl8812ae_delta_swing_table_idx_24ga_p;
1152 *down_a = rtl8812ae_delta_swing_table_idx_24ga_n;
1153 *up_b = rtl8812ae_delta_swing_table_idx_24gb_p;
1154 *down_b = rtl8812ae_delta_swing_table_idx_24gb_n;
1155 }
1156 } else if (36 <= channel && channel <= 64) {
1157 *up_a = rtl8812ae_delta_swing_table_idx_5ga_p[0];
1158 *down_a = rtl8812ae_delta_swing_table_idx_5ga_n[0];
1159 *up_b = rtl8812ae_delta_swing_table_idx_5gb_p[0];
1160 *down_b = rtl8812ae_delta_swing_table_idx_5gb_n[0];
1161 } else if (100 <= channel && channel <= 140) {
1162 *up_a = rtl8812ae_delta_swing_table_idx_5ga_p[1];
1163 *down_a = rtl8812ae_delta_swing_table_idx_5ga_n[1];
1164 *up_b = rtl8812ae_delta_swing_table_idx_5gb_p[1];
1165 *down_b = rtl8812ae_delta_swing_table_idx_5gb_n[1];
1166 } else if (149 <= channel && channel <= 173) {
1167 *up_a = rtl8812ae_delta_swing_table_idx_5ga_p[2];
1168 *down_a = rtl8812ae_delta_swing_table_idx_5ga_n[2];
1169 *up_b = rtl8812ae_delta_swing_table_idx_5gb_p[2];
1170 *down_b = rtl8812ae_delta_swing_table_idx_5gb_n[2];
1171 } else {
1172 *up_a = (u8 *)rtl8818e_delta_swing_table_idx_24gb_p;
1173 *down_a = (u8 *)rtl8818e_delta_swing_table_idx_24gb_n;
1174 *up_b = (u8 *)rtl8818e_delta_swing_table_idx_24gb_p;
1175 *down_b = (u8 *)rtl8818e_delta_swing_table_idx_24gb_n;
1176 }
1177}
1178
1179void rtl8821ae_dm_update_init_rate(struct ieee80211_hw *hw, u8 rate)
1180{
1181 struct rtl_priv *rtlpriv = rtl_priv(hw);
1182 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
1183 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1184 u8 p = 0;
1185
1186 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1187 "Get C2H Command! Rate=0x%x\n", rate);
1188
1189 rtldm->tx_rate = rate;
1190
1191 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
1192 rtl8821ae_dm_txpwr_track_set_pwr(hw, MIX_MODE, RF90_PATH_A, 0);
1193 } else {
1194 for (p = RF90_PATH_A; p < MAX_PATH_NUM_8812A; p++)
1195 rtl8812ae_dm_txpwr_track_set_pwr(hw, MIX_MODE, p, 0);
1196 }
1197}
1198
1199u8 rtl8821ae_hw_rate_to_mrate(struct ieee80211_hw *hw, u8 rate)
1200{
1201 struct rtl_priv *rtlpriv = rtl_priv(hw);
1202 u8 ret_rate = MGN_1M;
1203
1204 switch (rate) {
1205 case DESC_RATE1M:
1206 ret_rate = MGN_1M;
1207 break;
1208 case DESC_RATE2M:
1209 ret_rate = MGN_2M;
1210 break;
1211 case DESC_RATE5_5M:
1212 ret_rate = MGN_5_5M;
1213 break;
1214 case DESC_RATE11M:
1215 ret_rate = MGN_11M;
1216 break;
1217 case DESC_RATE6M:
1218 ret_rate = MGN_6M;
1219 break;
1220 case DESC_RATE9M:
1221 ret_rate = MGN_9M;
1222 break;
1223 case DESC_RATE12M:
1224 ret_rate = MGN_12M;
1225 break;
1226 case DESC_RATE18M:
1227 ret_rate = MGN_18M;
1228 break;
1229 case DESC_RATE24M:
1230 ret_rate = MGN_24M;
1231 break;
1232 case DESC_RATE36M:
1233 ret_rate = MGN_36M;
1234 break;
1235 case DESC_RATE48M:
1236 ret_rate = MGN_48M;
1237 break;
1238 case DESC_RATE54M:
1239 ret_rate = MGN_54M;
1240 break;
1241 case DESC_RATEMCS0:
1242 ret_rate = MGN_MCS0;
1243 break;
1244 case DESC_RATEMCS1:
1245 ret_rate = MGN_MCS1;
1246 break;
1247 case DESC_RATEMCS2:
1248 ret_rate = MGN_MCS2;
1249 break;
1250 case DESC_RATEMCS3:
1251 ret_rate = MGN_MCS3;
1252 break;
1253 case DESC_RATEMCS4:
1254 ret_rate = MGN_MCS4;
1255 break;
1256 case DESC_RATEMCS5:
1257 ret_rate = MGN_MCS5;
1258 break;
1259 case DESC_RATEMCS6:
1260 ret_rate = MGN_MCS6;
1261 break;
1262 case DESC_RATEMCS7:
1263 ret_rate = MGN_MCS7;
1264 break;
1265 case DESC_RATEMCS8:
1266 ret_rate = MGN_MCS8;
1267 break;
1268 case DESC_RATEMCS9:
1269 ret_rate = MGN_MCS9;
1270 break;
1271 case DESC_RATEMCS10:
1272 ret_rate = MGN_MCS10;
1273 break;
1274 case DESC_RATEMCS11:
1275 ret_rate = MGN_MCS11;
1276 break;
1277 case DESC_RATEMCS12:
1278 ret_rate = MGN_MCS12;
1279 break;
1280 case DESC_RATEMCS13:
1281 ret_rate = MGN_MCS13;
1282 break;
1283 case DESC_RATEMCS14:
1284 ret_rate = MGN_MCS14;
1285 break;
1286 case DESC_RATEMCS15:
1287 ret_rate = MGN_MCS15;
1288 break;
1289 case DESC_RATEVHT1SS_MCS0:
1290 ret_rate = MGN_VHT1SS_MCS0;
1291 break;
1292 case DESC_RATEVHT1SS_MCS1:
1293 ret_rate = MGN_VHT1SS_MCS1;
1294 break;
1295 case DESC_RATEVHT1SS_MCS2:
1296 ret_rate = MGN_VHT1SS_MCS2;
1297 break;
1298 case DESC_RATEVHT1SS_MCS3:
1299 ret_rate = MGN_VHT1SS_MCS3;
1300 break;
1301 case DESC_RATEVHT1SS_MCS4:
1302 ret_rate = MGN_VHT1SS_MCS4;
1303 break;
1304 case DESC_RATEVHT1SS_MCS5:
1305 ret_rate = MGN_VHT1SS_MCS5;
1306 break;
1307 case DESC_RATEVHT1SS_MCS6:
1308 ret_rate = MGN_VHT1SS_MCS6;
1309 break;
1310 case DESC_RATEVHT1SS_MCS7:
1311 ret_rate = MGN_VHT1SS_MCS7;
1312 break;
1313 case DESC_RATEVHT1SS_MCS8:
1314 ret_rate = MGN_VHT1SS_MCS8;
1315 break;
1316 case DESC_RATEVHT1SS_MCS9:
1317 ret_rate = MGN_VHT1SS_MCS9;
1318 break;
1319 case DESC_RATEVHT2SS_MCS0:
1320 ret_rate = MGN_VHT2SS_MCS0;
1321 break;
1322 case DESC_RATEVHT2SS_MCS1:
1323 ret_rate = MGN_VHT2SS_MCS1;
1324 break;
1325 case DESC_RATEVHT2SS_MCS2:
1326 ret_rate = MGN_VHT2SS_MCS2;
1327 break;
1328 case DESC_RATEVHT2SS_MCS3:
1329 ret_rate = MGN_VHT2SS_MCS3;
1330 break;
1331 case DESC_RATEVHT2SS_MCS4:
1332 ret_rate = MGN_VHT2SS_MCS4;
1333 break;
1334 case DESC_RATEVHT2SS_MCS5:
1335 ret_rate = MGN_VHT2SS_MCS5;
1336 break;
1337 case DESC_RATEVHT2SS_MCS6:
1338 ret_rate = MGN_VHT2SS_MCS6;
1339 break;
1340 case DESC_RATEVHT2SS_MCS7:
1341 ret_rate = MGN_VHT2SS_MCS7;
1342 break;
1343 case DESC_RATEVHT2SS_MCS8:
1344 ret_rate = MGN_VHT2SS_MCS8;
1345 break;
1346 case DESC_RATEVHT2SS_MCS9:
1347 ret_rate = MGN_VHT2SS_MCS9;
1348 break;
1349 default:
1350 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1351 "HwRateToMRate8812(): Non supported Rate [%x]!!!\n",
1352 rate);
1353 break;
1354 }
1355 return ret_rate;
1356}
1357
1358/*-----------------------------------------------------------------------------
1359 * Function: odm_TxPwrTrackSetPwr88E()
1360 *
1361 * Overview: 88E change all channel tx power accordign to flag.
1362 * OFDM & CCK are all different.
1363 *
1364 * Input: NONE
1365 *
1366 * Output: NONE
1367 *
1368 * Return: NONE
1369 *
1370 * Revised History:
1371 * When Who Remark
1372 * 04/23/2012 MHC Create Version 0.
1373 *
1374 *---------------------------------------------------------------------------
1375 */
1376void rtl8812ae_dm_txpwr_track_set_pwr(struct ieee80211_hw *hw,
1377 enum pwr_track_control_method method,
1378 u8 rf_path, u8 channel_mapped_index)
1379{
1380 struct rtl_priv *rtlpriv = rtl_priv(hw);
1381 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
1382 struct rtl_phy *rtlphy = &rtlpriv->phy;
1383 u32 final_swing_idx[2];
1384 u8 pwr_tracking_limit = 26; /*+1.0dB*/
1385 u8 tx_rate = 0xFF;
1386 char final_ofdm_swing_index = 0;
1387
1388 if (rtldm->tx_rate != 0xFF)
1389 tx_rate =
1390 rtl8821ae_hw_rate_to_mrate(hw, rtldm->tx_rate);
1391
1392 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1393 "===>rtl8812ae_dm_txpwr_track_set_pwr\n");
1394 /*20130429 Mimic Modify High Rate BBSwing Limit.*/
1395 if (tx_rate != 0xFF) {
1396 /*CCK*/
1397 if ((tx_rate >= MGN_1M) && (tx_rate <= MGN_11M))
1398 pwr_tracking_limit = 32; /*+4dB*/
1399 /*OFDM*/
1400 else if ((tx_rate >= MGN_6M) && (tx_rate <= MGN_48M))
1401 pwr_tracking_limit = 30; /*+3dB*/
1402 else if (tx_rate == MGN_54M)
1403 pwr_tracking_limit = 28; /*+2dB*/
1404 /*HT*/
1405 /*QPSK/BPSK*/
1406 else if ((tx_rate >= MGN_MCS0) && (tx_rate <= MGN_MCS2))
1407 pwr_tracking_limit = 34; /*+5dB*/
1408 /*16QAM*/
1409 else if ((tx_rate >= MGN_MCS3) && (tx_rate <= MGN_MCS4))
1410 pwr_tracking_limit = 30; /*+3dB*/
1411 /*64QAM*/
1412 else if ((tx_rate >= MGN_MCS5) && (tx_rate <= MGN_MCS7))
1413 pwr_tracking_limit = 28; /*+2dB*/
1414 /*QPSK/BPSK*/
1415 else if ((tx_rate >= MGN_MCS8) && (tx_rate <= MGN_MCS10))
1416 pwr_tracking_limit = 34; /*+5dB*/
1417 /*16QAM*/
1418 else if ((tx_rate >= MGN_MCS11) && (tx_rate <= MGN_MCS12))
1419 pwr_tracking_limit = 30; /*+3dB*/
1420 /*64QAM*/
1421 else if ((tx_rate >= MGN_MCS13) && (tx_rate <= MGN_MCS15))
1422 pwr_tracking_limit = 28; /*+2dB*/
1423
1424 /*2 VHT*/
1425 /*QPSK/BPSK*/
1426 else if ((tx_rate >= MGN_VHT1SS_MCS0) &&
1427 (tx_rate <= MGN_VHT1SS_MCS2))
1428 pwr_tracking_limit = 34; /*+5dB*/
1429 /*16QAM*/
1430 else if ((tx_rate >= MGN_VHT1SS_MCS3) &&
1431 (tx_rate <= MGN_VHT1SS_MCS4))
1432 pwr_tracking_limit = 30; /*+3dB*/
1433 /*64QAM*/
1434 else if ((tx_rate >= MGN_VHT1SS_MCS5) &&
1435 (tx_rate <= MGN_VHT1SS_MCS6))
1436 pwr_tracking_limit = 28; /*+2dB*/
1437 else if (tx_rate == MGN_VHT1SS_MCS7) /*64QAM*/
1438 pwr_tracking_limit = 26; /*+1dB*/
1439 else if (tx_rate == MGN_VHT1SS_MCS8) /*256QAM*/
1440 pwr_tracking_limit = 24; /*+0dB*/
1441 else if (tx_rate == MGN_VHT1SS_MCS9) /*256QAM*/
1442 pwr_tracking_limit = 22; /*-1dB*/
1443 /*QPSK/BPSK*/
1444 else if ((tx_rate >= MGN_VHT2SS_MCS0) &&
1445 (tx_rate <= MGN_VHT2SS_MCS2))
1446 pwr_tracking_limit = 34; /*+5dB*/
1447 /*16QAM*/
1448 else if ((tx_rate >= MGN_VHT2SS_MCS3) &&
1449 (tx_rate <= MGN_VHT2SS_MCS4))
1450 pwr_tracking_limit = 30; /*+3dB*/
1451 /*64QAM*/
1452 else if ((tx_rate >= MGN_VHT2SS_MCS5) &&
1453 (tx_rate <= MGN_VHT2SS_MCS6))
1454 pwr_tracking_limit = 28; /*+2dB*/
1455 else if (tx_rate == MGN_VHT2SS_MCS7) /*64QAM*/
1456 pwr_tracking_limit = 26; /*+1dB*/
1457 else if (tx_rate == MGN_VHT2SS_MCS8) /*256QAM*/
1458 pwr_tracking_limit = 24; /*+0dB*/
1459 else if (tx_rate == MGN_VHT2SS_MCS9) /*256QAM*/
1460 pwr_tracking_limit = 22; /*-1dB*/
1461 else
1462 pwr_tracking_limit = 24;
1463 }
1464 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1465 "TxRate=0x%x, PwrTrackingLimit=%d\n",
1466 tx_rate, pwr_tracking_limit);
1467
1468 if (method == BBSWING) {
1469 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1470 "===>rtl8812ae_dm_txpwr_track_set_pwr\n");
1471
1472 if (rf_path == RF90_PATH_A) {
1473 u32 tmp;
1474
1475 final_swing_idx[RF90_PATH_A] =
1476 (rtldm->ofdm_index[RF90_PATH_A] >
1477 pwr_tracking_limit) ?
1478 pwr_tracking_limit :
1479 rtldm->ofdm_index[RF90_PATH_A];
1480 tmp = final_swing_idx[RF90_PATH_A];
1481 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1482 "pDM_Odm->RFCalibrateInfo.OFDM_index[ODM_RF_PATH_A]=%d,pDM_Odm->RealBbSwingIdx[ODM_RF_PATH_A]=%d\n",
1483 rtldm->ofdm_index[RF90_PATH_A],
1484 final_swing_idx[RF90_PATH_A]);
1485
1486 rtl_set_bbreg(hw, RA_TXSCALE, 0xFFE00000,
1487 txscaling_tbl[tmp]);
1488 } else {
1489 u32 tmp;
1490
1491 final_swing_idx[RF90_PATH_B] =
1492 rtldm->ofdm_index[RF90_PATH_B] >
1493 pwr_tracking_limit ?
1494 pwr_tracking_limit :
1495 rtldm->ofdm_index[RF90_PATH_B];
1496 tmp = final_swing_idx[RF90_PATH_B];
1497 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1498 "pDM_Odm->RFCalibrateInfo.OFDM_index[ODM_RF_PATH_B]=%d, pDM_Odm->RealBbSwingIdx[ODM_RF_PATH_B]=%d\n",
1499 rtldm->ofdm_index[RF90_PATH_B],
1500 final_swing_idx[RF90_PATH_B]);
1501
1502 rtl_set_bbreg(hw, RB_TXSCALE, 0xFFE00000,
1503 txscaling_tbl[tmp]);
1504 }
1505 } else if (method == MIX_MODE) {
1506 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1507 "pDM_Odm->DefaultOfdmIndex=%d, pDM_Odm->Aboslute_OFDMSwingIdx[RFPath]=%d, RF_Path = %d\n",
1508 rtldm->default_ofdm_index,
1509 rtldm->absolute_ofdm_swing_idx[rf_path],
1510 rf_path);
1511
1512 final_ofdm_swing_index = rtldm->default_ofdm_index +
1513 rtldm->absolute_ofdm_swing_idx[rf_path];
1514
1515 if (rf_path == RF90_PATH_A) {
1516 /*BBSwing higher then Limit*/
1517 if (final_ofdm_swing_index > pwr_tracking_limit) {
1518 rtldm->remnant_cck_idx =
1519 final_ofdm_swing_index -
1520 pwr_tracking_limit;
1521 /* CCK Follow the same compensation value
1522 * as Path A
1523 */
1524 rtldm->remnant_ofdm_swing_idx[rf_path] =
1525 final_ofdm_swing_index -
1526 pwr_tracking_limit;
1527
1528 rtl_set_bbreg(hw, RA_TXSCALE, 0xFFE00000,
1529 txscaling_tbl[pwr_tracking_limit]);
1530
1531 rtldm->modify_txagc_flag_path_a = true;
1532
1533 /*Set TxAGC Page C{};*/
1534 rtl8821ae_phy_set_txpower_level_by_path(hw,
1535 rtlphy->current_channel,
1536 RF90_PATH_A);
1537
1538 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1539 "******Path_A Over BBSwing Limit ,PwrTrackingLimit = %d ,Remnant TxAGC Value = %d\n",
1540 pwr_tracking_limit,
1541 rtldm->remnant_ofdm_swing_idx[rf_path]);
1542 } else if (final_ofdm_swing_index < 0) {
1543 rtldm->remnant_cck_idx = final_ofdm_swing_index;
1544 /* CCK Follow the same compensate value as Path A*/
1545 rtldm->remnant_ofdm_swing_idx[rf_path] =
1546 final_ofdm_swing_index;
1547
1548 rtl_set_bbreg(hw, RA_TXSCALE, 0xFFE00000,
1549 txscaling_tbl[0]);
1550
1551 rtldm->modify_txagc_flag_path_a = true;
1552
1553 /*Set TxAGC Page C{};*/
1554 rtl8821ae_phy_set_txpower_level_by_path(hw,
1555 rtlphy->current_channel, RF90_PATH_A);
1556
1557 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1558 "******Path_A Lower then BBSwing lower bound 0 , Remnant TxAGC Value = %d\n",
1559 rtldm->remnant_ofdm_swing_idx[rf_path]);
1560 } else {
1561 rtl_set_bbreg(hw, RA_TXSCALE, 0xFFE00000,
1562 txscaling_tbl[(u8)final_ofdm_swing_index]);
1563
1564 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1565 "******Path_A Compensate with BBSwing, Final_OFDM_Swing_Index = %d\n",
1566 final_ofdm_swing_index);
1567 /*If TxAGC has changed, reset TxAGC again*/
1568 if (rtldm->modify_txagc_flag_path_a) {
1569 rtldm->remnant_cck_idx = 0;
1570 rtldm->remnant_ofdm_swing_idx[rf_path] = 0;
1571
1572 /*Set TxAGC Page C{};*/
1573 rtl8821ae_phy_set_txpower_level_by_path(hw,
1574 rtlphy->current_channel, RF90_PATH_A);
1575 rtldm->modify_txagc_flag_path_a = false;
1576
1577 RT_TRACE(rtlpriv, COMP_POWER_TRACKING,
1578 DBG_LOUD,
1579 "******Path_A pDM_Odm->Modify_TxAGC_Flag = FALSE\n");
1580 }
1581 }
1582 }
1583 /*BBSwing higher then Limit*/
1584 if (rf_path == RF90_PATH_B) {
1585 if (final_ofdm_swing_index > pwr_tracking_limit) {
1586 rtldm->remnant_ofdm_swing_idx[rf_path] =
1587 final_ofdm_swing_index -
1588 pwr_tracking_limit;
1589
1590 rtl_set_bbreg(hw, RB_TXSCALE,
1591 0xFFE00000,
1592 txscaling_tbl[pwr_tracking_limit]);
1593
1594 rtldm->modify_txagc_flag_path_b = true;
1595
1596 /*Set TxAGC Page E{};*/
1597 rtl8821ae_phy_set_txpower_level_by_path(hw,
1598 rtlphy->current_channel, RF90_PATH_B);
1599
1600 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1601 "******Path_B Over BBSwing Limit , PwrTrackingLimit = %d , Remnant TxAGC Value = %d\n",
1602 pwr_tracking_limit,
1603 rtldm->remnant_ofdm_swing_idx[rf_path]);
1604 } else if (final_ofdm_swing_index < 0) {
1605 rtldm->remnant_ofdm_swing_idx[rf_path] =
1606 final_ofdm_swing_index;
1607
1608 rtl_set_bbreg(hw, RB_TXSCALE, 0xFFE00000,
1609 txscaling_tbl[0]);
1610
1611 rtldm->modify_txagc_flag_path_b = true;
1612
1613 /*Set TxAGC Page E{};*/
1614 rtl8821ae_phy_set_txpower_level_by_path(hw,
1615 rtlphy->current_channel, RF90_PATH_B);
1616
1617 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1618 "******Path_B Lower then BBSwing lower bound 0 , Remnant TxAGC Value = %d\n",
1619 rtldm->remnant_ofdm_swing_idx[rf_path]);
1620 } else {
1621 rtl_set_bbreg(hw, RB_TXSCALE, 0xFFE00000,
1622 txscaling_tbl[(u8)final_ofdm_swing_index]);
1623
1624 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1625 "******Path_B Compensate with BBSwing ,Final_OFDM_Swing_Index = %d\n",
1626 final_ofdm_swing_index);
1627 /*If TxAGC has changed, reset TxAGC again*/
1628 if (rtldm->modify_txagc_flag_path_b) {
1629 rtldm->remnant_ofdm_swing_idx[rf_path] = 0;
1630
1631 /*Set TxAGC Page E{};*/
1632 rtl8821ae_phy_set_txpower_level_by_path(hw,
1633 rtlphy->current_channel, RF90_PATH_B);
1634
1635 rtldm->modify_txagc_flag_path_b =
1636 false;
1637
1638 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1639 "******Path_B pDM_Odm->Modify_TxAGC_Flag = FALSE\n");
1640 }
1641 }
1642 }
1643 } else {
1644 return;
1645 }
1646}
1647
1648void rtl8812ae_dm_txpower_tracking_callback_thermalmeter(
1649 struct ieee80211_hw *hw)
1650{
1651 struct rtl_priv *rtlpriv = rtl_priv(hw);
1652 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
1653 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
1654 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1655 u8 thermal_value = 0, delta, delta_lck, delta_iqk, p = 0, i = 0;
1656 u8 thermal_value_avg_count = 0;
1657 u32 thermal_value_avg = 0;
1658 /* OFDM BB Swing should be less than +3.0dB, */
1659 u8 ofdm_min_index = 6;
1660 /* GetRightChnlPlaceforIQK(pHalData->CurrentChannel)*/
1661 u8 index_for_channel = 0;
1662 /* 1. The following TWO tables decide
1663 * the final index of OFDM/CCK swing table.
1664 */
1665 u8 *delta_swing_table_idx_tup_a;
1666 u8 *delta_swing_table_idx_tdown_a;
1667 u8 *delta_swing_table_idx_tup_b;
1668 u8 *delta_swing_table_idx_tdown_b;
1669
1670 /*2. Initilization ( 7 steps in total )*/
1671 rtl8812ae_get_delta_swing_table(hw,
1672 (u8 **)&delta_swing_table_idx_tup_a,
1673 (u8 **)&delta_swing_table_idx_tdown_a,
1674 (u8 **)&delta_swing_table_idx_tup_b,
1675 (u8 **)&delta_swing_table_idx_tdown_b);
1676
1677 rtldm->txpower_trackinginit = true;
1678
1679 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1680 "pDM_Odm->BbSwingIdxCckBase: %d, pDM_Odm->BbSwingIdxOfdmBase[A]:%d, pDM_Odm->DefaultOfdmIndex: %d\n",
1681 rtldm->swing_idx_cck_base,
1682 rtldm->swing_idx_ofdm_base[RF90_PATH_A],
1683 rtldm->default_ofdm_index);
1684
1685 thermal_value = (u8)rtl_get_rfreg(hw, RF90_PATH_A,
1686 /*0x42: RF Reg[15:10] 88E*/
1687 RF_T_METER_8812A, 0xfc00);
1688 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1689 "Thermal Meter = 0x%X, EFUSE Thermal Base = 0x%X\n",
1690 thermal_value, rtlefuse->eeprom_thermalmeter);
1691 if (!rtldm->txpower_track_control ||
1692 rtlefuse->eeprom_thermalmeter == 0 ||
1693 rtlefuse->eeprom_thermalmeter == 0xFF)
1694 return;
1695
1696 /* 3. Initialize ThermalValues of RFCalibrateInfo*/
1697
1698 if (rtlhal->reloadtxpowerindex)
1699 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1700 "reload ofdm index for band switch\n");
1701
1702 /*4. Calculate average thermal meter*/
1703 rtldm->thermalvalue_avg[rtldm->thermalvalue_avg_index] = thermal_value;
1704 rtldm->thermalvalue_avg_index++;
1705 if (rtldm->thermalvalue_avg_index == AVG_THERMAL_NUM_8812A)
1706 /*Average times = c.AverageThermalNum*/
1707 rtldm->thermalvalue_avg_index = 0;
1708
1709 for (i = 0; i < AVG_THERMAL_NUM_8812A; i++) {
1710 if (rtldm->thermalvalue_avg[i]) {
1711 thermal_value_avg += rtldm->thermalvalue_avg[i];
1712 thermal_value_avg_count++;
1713 }
1714 }
1715 /*Calculate Average ThermalValue after average enough times*/
1716 if (thermal_value_avg_count) {
1717 thermal_value = (u8)(thermal_value_avg /
1718 thermal_value_avg_count);
1719 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1720 "AVG Thermal Meter = 0x%X, EFUSE Thermal Base = 0x%X\n",
1721 thermal_value, rtlefuse->eeprom_thermalmeter);
1722 }
1723
1724 /*5. Calculate delta, delta_LCK, delta_IQK.
1725 *"delta" here is used to determine whether
1726 *thermal value changes or not.
1727 */
1728 delta = (thermal_value > rtldm->thermalvalue) ?
1729 (thermal_value - rtldm->thermalvalue) :
1730 (rtldm->thermalvalue - thermal_value);
1731 delta_lck = (thermal_value > rtldm->thermalvalue_lck) ?
1732 (thermal_value - rtldm->thermalvalue_lck) :
1733 (rtldm->thermalvalue_lck - thermal_value);
1734 delta_iqk = (thermal_value > rtldm->thermalvalue_iqk) ?
1735 (thermal_value - rtldm->thermalvalue_iqk) :
1736 (rtldm->thermalvalue_iqk - thermal_value);
1737
1738 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1739 "(delta, delta_LCK, delta_IQK) = (%d, %d, %d)\n",
1740 delta, delta_lck, delta_iqk);
1741
1742 /* 6. If necessary, do LCK.
1743 * Delta temperature is equal to or larger than 20 centigrade.
1744 */
1745 if (delta_lck >= IQK_THRESHOLD) {
1746 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1747 "delta_LCK(%d) >= Threshold_IQK(%d)\n",
1748 delta_lck, IQK_THRESHOLD);
1749 rtldm->thermalvalue_lck = thermal_value;
1750 rtl8821ae_phy_lc_calibrate(hw);
1751 }
1752
1753 /*7. If necessary, move the index of swing table to adjust Tx power.*/
1754
1755 if (delta > 0 && rtldm->txpower_track_control) {
1756 /* "delta" here is used to record the
1757 * absolute value of differrence.
1758 */
1759 delta = thermal_value > rtlefuse->eeprom_thermalmeter ?
1760 (thermal_value - rtlefuse->eeprom_thermalmeter) :
1761 (rtlefuse->eeprom_thermalmeter - thermal_value);
1762
1763 if (delta >= TXPWR_TRACK_TABLE_SIZE)
1764 delta = TXPWR_TRACK_TABLE_SIZE - 1;
1765
1766 /*7.1 The Final Power Index = BaseIndex + PowerIndexOffset*/
1767
1768 if (thermal_value > rtlefuse->eeprom_thermalmeter) {
1769 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1770 "delta_swing_table_idx_tup_a[%d] = %d\n",
1771 delta, delta_swing_table_idx_tup_a[delta]);
1772 rtldm->delta_power_index_last[RF90_PATH_A] =
1773 rtldm->delta_power_index[RF90_PATH_A];
1774 rtldm->delta_power_index[RF90_PATH_A] =
1775 delta_swing_table_idx_tup_a[delta];
1776
1777 rtldm->absolute_ofdm_swing_idx[RF90_PATH_A] =
1778 delta_swing_table_idx_tup_a[delta];
1779 /*Record delta swing for mix mode power tracking*/
1780
1781 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1782 "******Temp is higher and pDM_Odm->Aboslute_OFDMSwingIdx[ODM_RF_PATH_A] = %d\n",
1783 rtldm->absolute_ofdm_swing_idx[RF90_PATH_A]);
1784
1785 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1786 "delta_swing_table_idx_tup_b[%d] = %d\n",
1787 delta, delta_swing_table_idx_tup_b[delta]);
1788 rtldm->delta_power_index_last[RF90_PATH_B] =
1789 rtldm->delta_power_index[RF90_PATH_B];
1790 rtldm->delta_power_index[RF90_PATH_B] =
1791 delta_swing_table_idx_tup_b[delta];
1792
1793 rtldm->absolute_ofdm_swing_idx[RF90_PATH_B] =
1794 delta_swing_table_idx_tup_b[delta];
1795 /*Record delta swing for mix mode power tracking*/
1796
1797 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1798 "******Temp is higher and pDM_Odm->Aboslute_OFDMSwingIdx[ODM_RF_PATH_B] = %d\n",
1799 rtldm->absolute_ofdm_swing_idx[RF90_PATH_B]);
1800 } else {
1801 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1802 "delta_swing_table_idx_tdown_a[%d] = %d\n",
1803 delta, delta_swing_table_idx_tdown_a[delta]);
1804
1805 rtldm->delta_power_index_last[RF90_PATH_A] =
1806 rtldm->delta_power_index[RF90_PATH_A];
1807 rtldm->delta_power_index[RF90_PATH_A] =
1808 -1 * delta_swing_table_idx_tdown_a[delta];
1809
1810 rtldm->absolute_ofdm_swing_idx[RF90_PATH_A] =
1811 -1 * delta_swing_table_idx_tdown_a[delta];
1812 /* Record delta swing for mix mode power tracking*/
1813 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1814 "******Temp is lower and pDM_Odm->Aboslute_OFDMSwingIdx[ODM_RF_PATH_A] = %d\n",
1815 rtldm->absolute_ofdm_swing_idx[RF90_PATH_A]);
1816
1817 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1818 "deltaSwingTableIdx_TDOWN_B[%d] = %d\n",
1819 delta, delta_swing_table_idx_tdown_b[delta]);
1820
1821 rtldm->delta_power_index_last[RF90_PATH_B] =
1822 rtldm->delta_power_index[RF90_PATH_B];
1823 rtldm->delta_power_index[RF90_PATH_B] =
1824 -1 * delta_swing_table_idx_tdown_b[delta];
1825
1826 rtldm->absolute_ofdm_swing_idx[RF90_PATH_B] =
1827 -1 * delta_swing_table_idx_tdown_b[delta];
1828 /*Record delta swing for mix mode power tracking*/
1829
1830 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1831 "******Temp is lower and pDM_Odm->Aboslute_OFDMSwingIdx[ODM_RF_PATH_B] = %d\n",
1832 rtldm->absolute_ofdm_swing_idx[RF90_PATH_B]);
1833 }
1834
1835 for (p = RF90_PATH_A; p < MAX_PATH_NUM_8812A; p++) {
1836 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1837 "============================= [Path-%c]Calculating PowerIndexOffset =============================\n",
1838 (p == RF90_PATH_A ? 'A' : 'B'));
1839
1840 if (rtldm->delta_power_index[p] ==
1841 rtldm->delta_power_index_last[p])
1842 /*If Thermal value changes but lookup
1843 table value still the same*/
1844 rtldm->power_index_offset[p] = 0;
1845 else
1846 rtldm->power_index_offset[p] =
1847 rtldm->delta_power_index[p] -
1848 rtldm->delta_power_index_last[p];
1849 /* Power Index Diff between 2
1850 * times Power Tracking
1851 */
1852 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1853 "[Path-%c] PowerIndexOffset(%d) =DeltaPowerIndex(%d) -DeltaPowerIndexLast(%d)\n",
1854 (p == RF90_PATH_A ? 'A' : 'B'),
1855 rtldm->power_index_offset[p],
1856 rtldm->delta_power_index[p] ,
1857 rtldm->delta_power_index_last[p]);
1858
1859 rtldm->ofdm_index[p] =
1860 rtldm->swing_idx_ofdm_base[p] +
1861 rtldm->power_index_offset[p];
1862 rtldm->cck_index =
1863 rtldm->swing_idx_cck_base +
1864 rtldm->power_index_offset[p];
1865
1866 rtldm->swing_idx_cck = rtldm->cck_index;
1867 rtldm->swing_idx_ofdm[p] = rtldm->ofdm_index[p];
1868
1869 /****Print BB Swing Base and Index Offset */
1870
1871 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1872 "The 'CCK' final index(%d) = BaseIndex(%d) + PowerIndexOffset(%d)\n",
1873 rtldm->swing_idx_cck,
1874 rtldm->swing_idx_cck_base,
1875 rtldm->power_index_offset[p]);
1876 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1877 "The 'OFDM' final index(%d) = BaseIndex[%c](%d) + PowerIndexOffset(%d)\n",
1878 rtldm->swing_idx_ofdm[p],
1879 (p == RF90_PATH_A ? 'A' : 'B'),
1880 rtldm->swing_idx_ofdm_base[p],
1881 rtldm->power_index_offset[p]);
1882
1883 /*7.1 Handle boundary conditions of index.*/
1884
1885 if (rtldm->ofdm_index[p] > TXSCALE_TABLE_SIZE - 1)
1886 rtldm->ofdm_index[p] = TXSCALE_TABLE_SIZE - 1;
1887 else if (rtldm->ofdm_index[p] < ofdm_min_index)
1888 rtldm->ofdm_index[p] = ofdm_min_index;
1889 }
1890 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1891 "\n\n====================================================================================\n");
1892 if (rtldm->cck_index > TXSCALE_TABLE_SIZE - 1)
1893 rtldm->cck_index = TXSCALE_TABLE_SIZE - 1;
1894 else if (rtldm->cck_index < 0)
1895 rtldm->cck_index = 0;
1896 } else {
1897 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1898 "The thermal meter is unchanged or TxPowerTracking OFF(%d): ThermalValue: %d , pDM_Odm->RFCalibrateInfo.ThermalValue: %d\n",
1899 rtldm->txpower_track_control,
1900 thermal_value,
1901 rtldm->thermalvalue);
1902
1903 for (p = RF90_PATH_A; p < MAX_PATH_NUM_8812A; p++)
1904 rtldm->power_index_offset[p] = 0;
1905 }
1906 /*Print Swing base & current*/
1907 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1908 "TxPowerTracking: [CCK] Swing Current Index: %d,Swing Base Index: %d\n",
1909 rtldm->cck_index, rtldm->swing_idx_cck_base);
1910 for (p = RF90_PATH_A; p < MAX_PATH_NUM_8812A; p++) {
1911 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1912 "TxPowerTracking: [OFDM] Swing Current Index: %d,Swing Base Index[%c]: %d\n",
1913 rtldm->ofdm_index[p],
1914 (p == RF90_PATH_A ? 'A' : 'B'),
1915 rtldm->swing_idx_ofdm_base[p]);
1916 }
1917
1918 if ((rtldm->power_index_offset[RF90_PATH_A] != 0 ||
1919 rtldm->power_index_offset[RF90_PATH_B] != 0) &&
1920 rtldm->txpower_track_control) {
1921 /*7.2 Configure the Swing Table to adjust Tx Power.
1922 *Always TRUE after Tx Power is adjusted by power tracking.
1923 *
1924 *2012/04/23 MH According to Luke's suggestion,
1925 *we can not write BB digital
1926 *to increase TX power. Otherwise, EVM will be bad.
1927 *
1928 *2012/04/25 MH Add for tx power tracking to set
1929 *tx power in tx agc for 88E.
1930 */
1931 if (thermal_value > rtldm->thermalvalue) {
1932 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1933 "Temperature Increasing(A): delta_pi: %d , delta_t: %d, Now_t: %d,EFUSE_t: %d, Last_t: %d\n",
1934 rtldm->power_index_offset[RF90_PATH_A],
1935 delta, thermal_value,
1936 rtlefuse->eeprom_thermalmeter,
1937 rtldm->thermalvalue);
1938
1939 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1940 "Temperature Increasing(B): delta_pi: %d ,delta_t: %d, Now_t: %d, EFUSE_t: %d, Last_t: %d\n",
1941 rtldm->power_index_offset[RF90_PATH_B],
1942 delta, thermal_value,
1943 rtlefuse->eeprom_thermalmeter,
1944 rtldm->thermalvalue);
1945 } else if (thermal_value < rtldm->thermalvalue) { /*Low temperature*/
1946 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1947 "Temperature Decreasing(A): delta_pi: %d , delta_t: %d, Now_t: %d, EFUSE_t: %d, Last_t: %d\n",
1948 rtldm->power_index_offset[RF90_PATH_A],
1949 delta, thermal_value,
1950 rtlefuse->eeprom_thermalmeter,
1951 rtldm->thermalvalue);
1952
1953 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1954 "Temperature Decreasing(B): delta_pi: %d , delta_t: %d, Now_t: %d, EFUSE_t: %d, Last_t: %d\n",
1955 rtldm->power_index_offset[RF90_PATH_B],
1956 delta, thermal_value,
1957 rtlefuse->eeprom_thermalmeter,
1958 rtldm->thermalvalue);
1959 }
1960
1961 if (thermal_value > rtlefuse->eeprom_thermalmeter) {
1962 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1963 "Temperature(%d) higher than PG value(%d)\n",
1964 thermal_value, rtlefuse->eeprom_thermalmeter);
1965
1966 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1967 "**********Enter POWER Tracking MIX_MODE**********\n");
1968 for (p = RF90_PATH_A; p < MAX_PATH_NUM_8812A; p++)
1969 rtl8812ae_dm_txpwr_track_set_pwr(hw, MIX_MODE,
1970 p, 0);
1971 } else {
1972 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1973 "Temperature(%d) lower than PG value(%d)\n",
1974 thermal_value, rtlefuse->eeprom_thermalmeter);
1975
1976 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1977 "**********Enter POWER Tracking MIX_MODE**********\n");
1978 for (p = RF90_PATH_A; p < MAX_PATH_NUM_8812A; p++)
1979 rtl8812ae_dm_txpwr_track_set_pwr(hw, MIX_MODE,
1980 p, index_for_channel);
1981 }
1982 /*Record last time Power Tracking result as base.*/
1983 rtldm->swing_idx_cck_base = rtldm->swing_idx_cck;
1984 for (p = RF90_PATH_A; p < MAX_PATH_NUM_8812A; p++)
1985 rtldm->swing_idx_ofdm_base[p] =
1986 rtldm->swing_idx_ofdm[p];
1987
1988 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1989 "pDM_Odm->RFCalibrateInfo.ThermalValue =%d ThermalValue= %d\n",
1990 rtldm->thermalvalue, thermal_value);
1991 /*Record last Power Tracking Thermal Value*/
1992 rtldm->thermalvalue = thermal_value;
1993 }
1994 /*Delta temperature is equal to or larger than
1995 20 centigrade (When threshold is 8).*/
1996 if (delta_iqk >= IQK_THRESHOLD)
1997 rtl8812ae_do_iqk(hw, delta_iqk, thermal_value, 8);
1998
1999 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
2000 "<===rtl8812ae_dm_txpower_tracking_callback_thermalmeter\n");
2001}
2002
2003static void rtl8821ae_get_delta_swing_table(struct ieee80211_hw *hw, u8 **up_a,
2004 u8 **down_a, u8 **up_b, u8 **down_b)
2005{
2006 struct rtl_priv *rtlpriv = rtl_priv(hw);
2007 struct rtl_phy *rtlphy = &rtlpriv->phy;
2008 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
2009 u8 channel = rtlphy->current_channel;
2010 u8 rate = rtldm->tx_rate;
2011
2012 if (1 <= channel && channel <= 14) {
2013 if (RTL8821AE_RX_HAL_IS_CCK_RATE(rate)) {
2014 *up_a = rtl8821ae_delta_swing_table_idx_24gccka_p;
2015 *down_a = rtl8821ae_delta_swing_table_idx_24gccka_n;
2016 *up_b = rtl8821ae_delta_swing_table_idx_24gcckb_p;
2017 *down_b = rtl8821ae_delta_swing_table_idx_24gcckb_n;
2018 } else {
2019 *up_a = rtl8821ae_delta_swing_table_idx_24ga_p;
2020 *down_a = rtl8821ae_delta_swing_table_idx_24ga_n;
2021 *up_b = rtl8821ae_delta_swing_table_idx_24gb_p;
2022 *down_b = rtl8821ae_delta_swing_table_idx_24gb_n;
2023 }
2024 } else if (36 <= channel && channel <= 64) {
2025 *up_a = rtl8821ae_delta_swing_table_idx_5ga_p[0];
2026 *down_a = rtl8821ae_delta_swing_table_idx_5ga_n[0];
2027 *up_b = rtl8821ae_delta_swing_table_idx_5gb_p[0];
2028 *down_b = rtl8821ae_delta_swing_table_idx_5gb_n[0];
2029 } else if (100 <= channel && channel <= 140) {
2030 *up_a = rtl8821ae_delta_swing_table_idx_5ga_p[1];
2031 *down_a = rtl8821ae_delta_swing_table_idx_5ga_n[1];
2032 *up_b = rtl8821ae_delta_swing_table_idx_5gb_p[1];
2033 *down_b = rtl8821ae_delta_swing_table_idx_5gb_n[1];
2034 } else if (149 <= channel && channel <= 173) {
2035 *up_a = rtl8821ae_delta_swing_table_idx_5ga_p[2];
2036 *down_a = rtl8821ae_delta_swing_table_idx_5ga_n[2];
2037 *up_b = rtl8821ae_delta_swing_table_idx_5gb_p[2];
2038 *down_b = rtl8821ae_delta_swing_table_idx_5gb_n[2];
2039 } else {
2040 *up_a = (u8 *)rtl8818e_delta_swing_table_idx_24gb_p;
2041 *down_a = (u8 *)rtl8818e_delta_swing_table_idx_24gb_n;
2042 *up_b = (u8 *)rtl8818e_delta_swing_table_idx_24gb_p;
2043 *down_b = (u8 *)rtl8818e_delta_swing_table_idx_24gb_n;
2044 }
2045 return;
2046}
2047
2048/*-----------------------------------------------------------------------------
2049 * Function: odm_TxPwrTrackSetPwr88E()
2050 *
2051 * Overview: 88E change all channel tx power accordign to flag.
2052 * OFDM & CCK are all different.
2053 *
2054 * Input: NONE
2055 *
2056 * Output: NONE
2057 *
2058 * Return: NONE
2059 *
2060 * Revised History:
2061 * When Who Remark
2062 * 04/23/2012 MHC Create Version 0.
2063 *
2064 *---------------------------------------------------------------------------
2065 */
2066void rtl8821ae_dm_txpwr_track_set_pwr(struct ieee80211_hw *hw,
2067 enum pwr_track_control_method method,
2068 u8 rf_path, u8 channel_mapped_index)
2069{
2070 struct rtl_priv *rtlpriv = rtl_priv(hw);
2071 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
2072 struct rtl_phy *rtlphy = &rtlpriv->phy;
2073 u32 final_swing_idx[1];
2074 u8 pwr_tracking_limit = 26; /*+1.0dB*/
2075 u8 tx_rate = 0xFF;
2076 char final_ofdm_swing_index = 0;
2077
2078 if (rtldm->tx_rate != 0xFF)
2079 tx_rate = rtl8821ae_hw_rate_to_mrate(hw, rtldm->tx_rate);
2080
2081 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
2082 "===>rtl8812ae_dm_txpwr_track_set_pwr\n");
2083
2084 if (tx_rate != 0xFF) { /* Mimic Modify High Rate BBSwing Limit.*/
2085 /*CCK*/
2086 if ((tx_rate >= MGN_1M) && (tx_rate <= MGN_11M))
2087 pwr_tracking_limit = 32; /*+4dB*/
2088 /*OFDM*/
2089 else if ((tx_rate >= MGN_6M) && (tx_rate <= MGN_48M))
2090 pwr_tracking_limit = 30; /*+3dB*/
2091 else if (tx_rate == MGN_54M)
2092 pwr_tracking_limit = 28; /*+2dB*/
2093 /*HT*/
2094 /*QPSK/BPSK*/
2095 else if ((tx_rate >= MGN_MCS0) && (tx_rate <= MGN_MCS2))
2096 pwr_tracking_limit = 34; /*+5dB*/
2097 /*16QAM*/
2098 else if ((tx_rate >= MGN_MCS3) && (tx_rate <= MGN_MCS4))
2099 pwr_tracking_limit = 30; /*+3dB*/
2100 /*64QAM*/
2101 else if ((tx_rate >= MGN_MCS5) && (tx_rate <= MGN_MCS7))
2102 pwr_tracking_limit = 28; /*+2dB*/
2103 /*2 VHT*/
2104 /*QPSK/BPSK*/
2105 else if ((tx_rate >= MGN_VHT1SS_MCS0) &&
2106 (tx_rate <= MGN_VHT1SS_MCS2))
2107 pwr_tracking_limit = 34; /*+5dB*/
2108 /*16QAM*/
2109 else if ((tx_rate >= MGN_VHT1SS_MCS3) &&
2110 (tx_rate <= MGN_VHT1SS_MCS4))
2111 pwr_tracking_limit = 30; /*+3dB*/
2112 /*64QAM*/
2113 else if ((tx_rate >= MGN_VHT1SS_MCS5) &&
2114 (tx_rate <= MGN_VHT1SS_MCS6))
2115 pwr_tracking_limit = 28; /*+2dB*/
2116 else if (tx_rate == MGN_VHT1SS_MCS7) /*64QAM*/
2117 pwr_tracking_limit = 26; /*+1dB*/
2118 else if (tx_rate == MGN_VHT1SS_MCS8) /*256QAM*/
2119 pwr_tracking_limit = 24; /*+0dB*/
2120 else if (tx_rate == MGN_VHT1SS_MCS9) /*256QAM*/
2121 pwr_tracking_limit = 22; /*-1dB*/
2122 else
2123 pwr_tracking_limit = 24;
2124 }
2125 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
2126 "TxRate=0x%x, PwrTrackingLimit=%d\n",
2127 tx_rate, pwr_tracking_limit);
2128
2129 if (method == BBSWING) {
2130 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
2131 "===>rtl8812ae_dm_txpwr_track_set_pwr\n");
2132 if (rf_path == RF90_PATH_A) {
2133 final_swing_idx[RF90_PATH_A] =
2134 (rtldm->ofdm_index[RF90_PATH_A] >
2135 pwr_tracking_limit) ?
2136 pwr_tracking_limit :
2137 rtldm->ofdm_index[RF90_PATH_A];
2138 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
2139 "pDM_Odm->RFCalibrateInfo.OFDM_index[ODM_RF_PATH_A]=%d,pDM_Odm->RealBbSwingIdx[ODM_RF_PATH_A]=%d\n",
2140 rtldm->ofdm_index[RF90_PATH_A],
2141 final_swing_idx[RF90_PATH_A]);
2142
2143 rtl_set_bbreg(hw, RA_TXSCALE, 0xFFE00000,
2144 txscaling_tbl[final_swing_idx[RF90_PATH_A]]);
2145 }
2146 } else if (method == MIX_MODE) {
2147 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
2148 "pDM_Odm->DefaultOfdmIndex=%d,pDM_Odm->Aboslute_OFDMSwingIdx[RFPath]=%d, RF_Path = %d\n",
2149 rtldm->default_ofdm_index,
2150 rtldm->absolute_ofdm_swing_idx[rf_path],
2151 rf_path);
2152
2153 final_ofdm_swing_index =
2154 rtldm->default_ofdm_index +
2155 rtldm->absolute_ofdm_swing_idx[rf_path];
2156 /*BBSwing higher then Limit*/
2157 if (rf_path == RF90_PATH_A) {
2158 if (final_ofdm_swing_index > pwr_tracking_limit) {
2159 rtldm->remnant_cck_idx =
2160 final_ofdm_swing_index -
2161 pwr_tracking_limit;
2162 /* CCK Follow the same compensate value as Path A*/
2163 rtldm->remnant_ofdm_swing_idx[rf_path] =
2164 final_ofdm_swing_index -
2165 pwr_tracking_limit;
2166
2167 rtl_set_bbreg(hw, RA_TXSCALE,
2168 0xFFE00000,
2169 txscaling_tbl[pwr_tracking_limit]);
2170
2171 rtldm->modify_txagc_flag_path_a = true;
2172
2173 /*Set TxAGC Page C{};*/
2174 rtl8821ae_phy_set_txpower_level_by_path(hw,
2175 rtlphy->current_channel,
2176 RF90_PATH_A);
2177
2178 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
2179 " ******Path_A Over BBSwing Limit , PwrTrackingLimit = %d , Remnant TxAGC Value = %d\n",
2180 pwr_tracking_limit,
2181 rtldm->remnant_ofdm_swing_idx[rf_path]);
2182 } else if (final_ofdm_swing_index < 0) {
2183 rtldm->remnant_cck_idx = final_ofdm_swing_index;
2184 /* CCK Follow the same compensate value as Path A*/
2185 rtldm->remnant_ofdm_swing_idx[rf_path] =
2186 final_ofdm_swing_index;
2187
2188 rtl_set_bbreg(hw, RA_TXSCALE, 0xFFE00000,
2189 txscaling_tbl[0]);
2190
2191 rtldm->modify_txagc_flag_path_a = true;
2192
2193 /*Set TxAGC Page C{};*/
2194 rtl8821ae_phy_set_txpower_level_by_path(hw,
2195 rtlphy->current_channel, RF90_PATH_A);
2196
2197 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
2198 "******Path_A Lower then BBSwing lower bound 0 , Remnant TxAGC Value = %d\n",
2199 rtldm->remnant_ofdm_swing_idx[rf_path]);
2200 } else {
2201 rtl_set_bbreg(hw, RA_TXSCALE, 0xFFE00000,
2202 txscaling_tbl[(u8)final_ofdm_swing_index]);
2203
2204 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
2205 "******Path_A Compensate with BBSwing ,Final_OFDM_Swing_Index = %d\n",
2206 final_ofdm_swing_index);
2207 /*If TxAGC has changed, reset TxAGC again*/
2208 if (rtldm->modify_txagc_flag_path_a) {
2209 rtldm->remnant_cck_idx = 0;
2210 rtldm->remnant_ofdm_swing_idx[rf_path] = 0;
2211
2212 /*Set TxAGC Page C{};*/
2213 rtl8821ae_phy_set_txpower_level_by_path(hw,
2214 rtlphy->current_channel, RF90_PATH_A);
2215
2216 rtldm->modify_txagc_flag_path_a = false;
2217
2218 RT_TRACE(rtlpriv, COMP_POWER_TRACKING,
2219 DBG_LOUD,
2220 "******Path_A pDM_Odm->Modify_TxAGC_Flag= FALSE\n");
2221 }
2222 }
2223 }
2224 } else {
2225 return;
2226 }
2227}
2228
2229void rtl8821ae_dm_txpower_tracking_callback_thermalmeter(
2230 struct ieee80211_hw *hw)
2231{
2232 struct rtl_priv *rtlpriv = rtl_priv(hw);
2233 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
2234 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
2235 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
2236 struct rtl_phy *rtlphy = &rtlpriv->phy;
2237
2238 u8 thermal_value = 0, delta, delta_lck, delta_iqk, p = 0, i = 0;
2239 u8 thermal_value_avg_count = 0;
2240 u32 thermal_value_avg = 0;
2241
2242 u8 ofdm_min_index = 6; /*OFDM BB Swing should be less than +3.0dB */
2243 /* GetRightChnlPlaceforIQK(pHalData->CurrentChannel)*/
2244 u8 index_for_channel = 0;
2245
2246 /* 1. The following TWO tables decide the final
2247 * index of OFDM/CCK swing table.
2248 */
2249 u8 *delta_swing_table_idx_tup_a;
2250 u8 *delta_swing_table_idx_tdown_a;
2251 u8 *delta_swing_table_idx_tup_b;
2252 u8 *delta_swing_table_idx_tdown_b;
2253
2254 /*2. Initilization ( 7 steps in total )*/
2255 rtl8821ae_get_delta_swing_table(hw, (u8 **)&delta_swing_table_idx_tup_a,
2256 (u8 **)&delta_swing_table_idx_tdown_a,
2257 (u8 **)&delta_swing_table_idx_tup_b,
2258 (u8 **)&delta_swing_table_idx_tdown_b);
2259
2260 rtldm->txpower_trackinginit = true;
2261
2262 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
2263 "===>rtl8812ae_dm_txpower_tracking_callback_thermalmeter,\n pDM_Odm->BbSwingIdxCckBase: %d,pDM_Odm->BbSwingIdxOfdmBase[A]:%d, pDM_Odm->DefaultOfdmIndex: %d\n",
2264 rtldm->swing_idx_cck_base,
2265 rtldm->swing_idx_ofdm_base[RF90_PATH_A],
2266 rtldm->default_ofdm_index);
2267 /*0x42: RF Reg[15:10] 88E*/
2268 thermal_value = (u8)rtl_get_rfreg(hw,
2269 RF90_PATH_A, RF_T_METER_8812A, 0xfc00);
2270 if (!rtldm->txpower_track_control ||
2271 rtlefuse->eeprom_thermalmeter == 0 ||
2272 rtlefuse->eeprom_thermalmeter == 0xFF)
2273 return;
2274
2275 /* 3. Initialize ThermalValues of RFCalibrateInfo*/
2276
2277 if (rtlhal->reloadtxpowerindex) {
2278 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
2279 "reload ofdm index for band switch\n");
2280 }
2281
2282 /*4. Calculate average thermal meter*/
2283 rtldm->thermalvalue_avg[rtldm->thermalvalue_avg_index] = thermal_value;
2284 rtldm->thermalvalue_avg_index++;
2285 if (rtldm->thermalvalue_avg_index == AVG_THERMAL_NUM_8812A)
2286 /*Average times = c.AverageThermalNum*/
2287 rtldm->thermalvalue_avg_index = 0;
2288
2289 for (i = 0; i < AVG_THERMAL_NUM_8812A; i++) {
2290 if (rtldm->thermalvalue_avg[i]) {
2291 thermal_value_avg += rtldm->thermalvalue_avg[i];
2292 thermal_value_avg_count++;
2293 }
2294 }
2295 /*Calculate Average ThermalValue after average enough times*/
2296 if (thermal_value_avg_count) {
2297 thermal_value = (u8)(thermal_value_avg /
2298 thermal_value_avg_count);
2299 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
2300 "AVG Thermal Meter = 0x%X, EFUSE Thermal Base = 0x%X\n",
2301 thermal_value, rtlefuse->eeprom_thermalmeter);
2302 }
2303
2304 /*5. Calculate delta, delta_LCK, delta_IQK.
2305 *"delta" here is used to determine whether
2306 * thermal value changes or not.
2307 */
2308 delta = (thermal_value > rtldm->thermalvalue) ?
2309 (thermal_value - rtldm->thermalvalue) :
2310 (rtldm->thermalvalue - thermal_value);
2311 delta_lck = (thermal_value > rtldm->thermalvalue_lck) ?
2312 (thermal_value - rtldm->thermalvalue_lck) :
2313 (rtldm->thermalvalue_lck - thermal_value);
2314 delta_iqk = (thermal_value > rtldm->thermalvalue_iqk) ?
2315 (thermal_value - rtldm->thermalvalue_iqk) :
2316 (rtldm->thermalvalue_iqk - thermal_value);
2317
2318 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
2319 "(delta, delta_LCK, delta_IQK) = (%d, %d, %d)\n",
2320 delta, delta_lck, delta_iqk);
2321
2322 /* 6. If necessary, do LCK. */
2323 /*Delta temperature is equal to or larger than 20 centigrade.*/
2324 if (delta_lck >= IQK_THRESHOLD) {
2325 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
2326 "delta_LCK(%d) >= Threshold_IQK(%d)\n",
2327 delta_lck, IQK_THRESHOLD);
2328 rtldm->thermalvalue_lck = thermal_value;
2329 rtl8821ae_phy_lc_calibrate(hw);
2330 }
2331
2332 /*7. If necessary, move the index of swing table to adjust Tx power.*/
2333
2334 if (delta > 0 && rtldm->txpower_track_control) {
2335 /*"delta" here is used to record the
2336 * absolute value of differrence.
2337 */
2338 delta = thermal_value > rtlefuse->eeprom_thermalmeter ?
2339 (thermal_value - rtlefuse->eeprom_thermalmeter) :
2340 (rtlefuse->eeprom_thermalmeter - thermal_value);
2341
2342 if (delta >= TXSCALE_TABLE_SIZE)
2343 delta = TXSCALE_TABLE_SIZE - 1;
2344
2345 /*7.1 The Final Power Index = BaseIndex + PowerIndexOffset*/
2346
2347 if (thermal_value > rtlefuse->eeprom_thermalmeter) {
2348 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
2349 "delta_swing_table_idx_tup_a[%d] = %d\n",
2350 delta, delta_swing_table_idx_tup_a[delta]);
2351 rtldm->delta_power_index_last[RF90_PATH_A] =
2352 rtldm->delta_power_index[RF90_PATH_A];
2353 rtldm->delta_power_index[RF90_PATH_A] =
2354 delta_swing_table_idx_tup_a[delta];
2355
2356 rtldm->absolute_ofdm_swing_idx[RF90_PATH_A] =
2357 delta_swing_table_idx_tup_a[delta];
2358 /*Record delta swing for mix mode power tracking*/
2359
2360 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
2361 "******Temp is higher and pDM_Odm->Aboslute_OFDMSwingIdx[ODM_RF_PATH_A] = %d\n",
2362 rtldm->absolute_ofdm_swing_idx[RF90_PATH_A]);
2363 } else {
2364 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
2365 "delta_swing_table_idx_tdown_a[%d] = %d\n",
2366 delta, delta_swing_table_idx_tdown_a[delta]);
2367
2368 rtldm->delta_power_index_last[RF90_PATH_A] =
2369 rtldm->delta_power_index[RF90_PATH_A];
2370 rtldm->delta_power_index[RF90_PATH_A] =
2371 -1 * delta_swing_table_idx_tdown_a[delta];
2372
2373 rtldm->absolute_ofdm_swing_idx[RF90_PATH_A] =
2374 -1 * delta_swing_table_idx_tdown_a[delta];
2375 /* Record delta swing for mix mode power tracking*/
2376 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
2377 "******Temp is lower and pDM_Odm->Aboslute_OFDMSwingIdx[ODM_RF_PATH_A] = %d\n",
2378 rtldm->absolute_ofdm_swing_idx[RF90_PATH_A]);
2379 }
2380
2381 for (p = RF90_PATH_A; p < MAX_PATH_NUM_8821A; p++) {
2382 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
2383 "\n\n================================ [Path-%c]Calculating PowerIndexOffset ================================\n",
2384 (p == RF90_PATH_A ? 'A' : 'B'));
2385 /*If Thermal value changes but lookup table value
2386 * still the same
2387 */
2388 if (rtldm->delta_power_index[p] ==
2389 rtldm->delta_power_index_last[p])
2390
2391 rtldm->power_index_offset[p] = 0;
2392 else
2393 rtldm->power_index_offset[p] =
2394 rtldm->delta_power_index[p] -
2395 rtldm->delta_power_index_last[p];
2396 /*Power Index Diff between 2 times Power Tracking*/
2397
2398 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
2399 "[Path-%c] PowerIndexOffset(%d) = DeltaPowerIndex(%d) - DeltaPowerIndexLast(%d)\n",
2400 (p == RF90_PATH_A ? 'A' : 'B'),
2401 rtldm->power_index_offset[p],
2402 rtldm->delta_power_index[p] ,
2403 rtldm->delta_power_index_last[p]);
2404
2405 rtldm->ofdm_index[p] =
2406 rtldm->swing_idx_ofdm_base[p] +
2407 rtldm->power_index_offset[p];
2408 rtldm->cck_index =
2409 rtldm->swing_idx_cck_base +
2410 rtldm->power_index_offset[p];
2411
2412 rtldm->swing_idx_cck = rtldm->cck_index;
2413 rtldm->swing_idx_ofdm[p] = rtldm->ofdm_index[p];
2414
2415 /*********Print BB Swing Base and Index Offset********/
2416
2417 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
2418 "The 'CCK' final index(%d) = BaseIndex(%d) + PowerIndexOffset(%d)\n",
2419 rtldm->swing_idx_cck,
2420 rtldm->swing_idx_cck_base,
2421 rtldm->power_index_offset[p]);
2422 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
2423 "The 'OFDM' final index(%d) = BaseIndex[%c](%d) + PowerIndexOffset(%d)\n",
2424 rtldm->swing_idx_ofdm[p],
2425 (p == RF90_PATH_A ? 'A' : 'B'),
2426 rtldm->swing_idx_ofdm_base[p],
2427 rtldm->power_index_offset[p]);
2428
2429 /*7.1 Handle boundary conditions of index.*/
2430
2431 if (rtldm->ofdm_index[p] > TXSCALE_TABLE_SIZE - 1)
2432 rtldm->ofdm_index[p] = TXSCALE_TABLE_SIZE - 1;
2433 else if (rtldm->ofdm_index[p] < ofdm_min_index)
2434 rtldm->ofdm_index[p] = ofdm_min_index;
2435 }
2436 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
2437 "\n\n========================================================================================================\n");
2438 if (rtldm->cck_index > TXSCALE_TABLE_SIZE - 1)
2439 rtldm->cck_index = TXSCALE_TABLE_SIZE - 1;
2440 else if (rtldm->cck_index < 0)
2441 rtldm->cck_index = 0;
2442 } else {
2443 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
2444 "The thermal meter is unchanged or TxPowerTracking OFF(%d):ThermalValue: %d , pDM_Odm->RFCalibrateInfo.ThermalValue: %d\n",
2445 rtldm->txpower_track_control,
2446 thermal_value,
2447 rtldm->thermalvalue);
2448
2449 for (p = RF90_PATH_A; p < MAX_PATH_NUM_8821A; p++)
2450 rtldm->power_index_offset[p] = 0;
2451 }
2452 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
2453 "TxPowerTracking: [CCK] Swing Current Index: %d, Swing Base Index: %d\n",
2454 /*Print Swing base & current*/
2455 rtldm->cck_index, rtldm->swing_idx_cck_base);
2456 for (p = RF90_PATH_A; p < MAX_PATH_NUM_8821A; p++) {
2457 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
2458 "TxPowerTracking: [OFDM] Swing Current Index: %d, Swing Base Index[%c]: %d\n",
2459 rtldm->ofdm_index[p],
2460 (p == RF90_PATH_A ? 'A' : 'B'),
2461 rtldm->swing_idx_ofdm_base[p]);
2462 }
2463
2464 if ((rtldm->power_index_offset[RF90_PATH_A] != 0 ||
2465 rtldm->power_index_offset[RF90_PATH_B] != 0) &&
2466 rtldm->txpower_track_control) {
2467 /*7.2 Configure the Swing Table to adjust Tx Power.*/
2468 /*Always TRUE after Tx Power is adjusted by power tracking.*/
2469 /*
2470 * 2012/04/23 MH According to Luke's suggestion,
2471 * we can not write BB digital
2472 * to increase TX power. Otherwise, EVM will be bad.
2473 *
2474 * 2012/04/25 MH Add for tx power tracking to
2475 * set tx power in tx agc for 88E.
2476 */
2477 if (thermal_value > rtldm->thermalvalue) {
2478 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
2479 "Temperature Increasing(A): delta_pi: %d , delta_t: %d,Now_t: %d, EFUSE_t: %d, Last_t: %d\n",
2480 rtldm->power_index_offset[RF90_PATH_A],
2481 delta, thermal_value,
2482 rtlefuse->eeprom_thermalmeter,
2483 rtldm->thermalvalue);
2484 } else if (thermal_value < rtldm->thermalvalue) { /*Low temperature*/
2485 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
2486 "Temperature Decreasing(A): delta_pi: %d , delta_t: %d, Now_t: %d, EFUSE_t: %d, Last_t: %d\n",
2487 rtldm->power_index_offset[RF90_PATH_A],
2488 delta, thermal_value,
2489 rtlefuse->eeprom_thermalmeter,
2490 rtldm->thermalvalue);
2491 }
2492
2493 if (thermal_value > rtlefuse->eeprom_thermalmeter) {
2494 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
2495 "Temperature(%d) higher than PG value(%d)\n",
2496 thermal_value, rtlefuse->eeprom_thermalmeter);
2497
2498 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
2499 "****Enter POWER Tracking MIX_MODE****\n");
2500 for (p = RF90_PATH_A; p < MAX_PATH_NUM_8821A; p++)
2501 rtl8821ae_dm_txpwr_track_set_pwr(hw,
2502 MIX_MODE, p, index_for_channel);
2503 } else {
2504 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
2505 "Temperature(%d) lower than PG value(%d)\n",
2506 thermal_value, rtlefuse->eeprom_thermalmeter);
2507
2508 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
2509 "*****Enter POWER Tracking MIX_MODE*****\n");
2510 for (p = RF90_PATH_A; p < MAX_PATH_NUM_8821A; p++)
2511 rtl8812ae_dm_txpwr_track_set_pwr(hw,
2512 MIX_MODE, p, index_for_channel);
2513 }
2514 /*Record last time Power Tracking result as base.*/
2515 rtldm->swing_idx_cck_base = rtldm->swing_idx_cck;
2516 for (p = RF90_PATH_A; p < MAX_PATH_NUM_8821A; p++)
2517 rtldm->swing_idx_ofdm_base[p] = rtldm->swing_idx_ofdm[p];
2518
2519 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
2520 "pDM_Odm->RFCalibrateInfo.ThermalValue = %d ThermalValue= %d\n",
2521 rtldm->thermalvalue, thermal_value);
2522 /*Record last Power Tracking Thermal Value*/
2523 rtldm->thermalvalue = thermal_value;
2524 }
2525 /* Delta temperature is equal to or larger than
2526 * 20 centigrade (When threshold is 8).
2527 */
2528 if (delta_iqk >= IQK_THRESHOLD) {
2529 if (!rtlphy->lck_inprogress) {
2530 spin_lock(&rtlpriv->locks.iqk_lock);
2531 rtlphy->lck_inprogress = true;
2532 spin_unlock(&rtlpriv->locks.iqk_lock);
2533
2534 rtl8821ae_do_iqk(hw, delta_iqk, thermal_value, 8);
2535
2536 spin_lock(&rtlpriv->locks.iqk_lock);
2537 rtlphy->lck_inprogress = false;
2538 spin_unlock(&rtlpriv->locks.iqk_lock);
2539 }
2540 }
2541
2542 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
2543 "<===rtl8812ae_dm_txpower_tracking_callback_thermalmeter\n");
2544}
2545
2546void rtl8821ae_dm_check_txpower_tracking_thermalmeter(struct ieee80211_hw *hw)
2547{
2548 struct rtl_priv *rtlpriv = rtl_priv(hw);
2549 static u8 tm_trigger;
2550
2551 if (!tm_trigger) {
2552 rtl_set_rfreg(hw, RF90_PATH_A, RF_T_METER_88E, BIT(17)|BIT(16),
2553 0x03);
2554 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
2555 "Trigger 8821ae Thermal Meter!!\n");
2556 tm_trigger = 1;
2557 return;
2558 } else {
2559 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
2560 "Schedule TxPowerTracking !!\n");
2561
2562 rtl8821ae_dm_txpower_tracking_callback_thermalmeter(hw);
2563 tm_trigger = 0;
2564 }
2565}
2566
2567static void rtl8821ae_dm_refresh_rate_adaptive_mask(struct ieee80211_hw *hw)
2568{
2569 struct rtl_priv *rtlpriv = rtl_priv(hw);
2570 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
2571 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
2572 struct rate_adaptive *p_ra = &rtlpriv->ra;
2573 u32 low_rssithresh_for_ra = p_ra->low2high_rssi_thresh_for_ra40m;
2574 u32 high_rssithresh_for_ra = p_ra->high_rssi_thresh_for_ra;
2575 u8 go_up_gap = 5;
2576 struct ieee80211_sta *sta = NULL;
2577
2578 if (is_hal_stop(rtlhal)) {
2579 RT_TRACE(rtlpriv, COMP_RATE, DBG_LOUD,
2580 "driver is going to unload\n");
2581 return;
2582 }
2583
2584 if (!rtlpriv->dm.useramask) {
2585 RT_TRACE(rtlpriv, COMP_RATE, DBG_LOUD,
2586 "driver does not control rate adaptive mask\n");
2587 return;
2588 }
2589
2590 if (mac->link_state == MAC80211_LINKED &&
2591 mac->opmode == NL80211_IFTYPE_STATION) {
2592 switch (p_ra->pre_ratr_state) {
2593 case DM_RATR_STA_MIDDLE:
2594 high_rssithresh_for_ra += go_up_gap;
2595 break;
2596 case DM_RATR_STA_LOW:
2597 high_rssithresh_for_ra += go_up_gap;
2598 low_rssithresh_for_ra += go_up_gap;
2599 break;
2600 default:
2601 break;
2602 }
2603
2604 if (rtlpriv->dm.undec_sm_pwdb >
2605 (long)high_rssithresh_for_ra)
2606 p_ra->ratr_state = DM_RATR_STA_HIGH;
2607 else if (rtlpriv->dm.undec_sm_pwdb >
2608 (long)low_rssithresh_for_ra)
2609 p_ra->ratr_state = DM_RATR_STA_MIDDLE;
2610 else
2611 p_ra->ratr_state = DM_RATR_STA_LOW;
2612
2613 if (p_ra->pre_ratr_state != p_ra->ratr_state) {
2614 RT_TRACE(rtlpriv, COMP_RATE, DBG_LOUD,
2615 "RSSI = %ld\n",
2616 rtlpriv->dm.undec_sm_pwdb);
2617 RT_TRACE(rtlpriv, COMP_RATE, DBG_LOUD,
2618 "RSSI_LEVEL = %d\n", p_ra->ratr_state);
2619 RT_TRACE(rtlpriv, COMP_RATE, DBG_LOUD,
2620 "PreState = %d, CurState = %d\n",
2621 p_ra->pre_ratr_state, p_ra->ratr_state);
2622
2623 rcu_read_lock();
2624 sta = rtl_find_sta(hw, mac->bssid);
2625 if (sta)
2626 rtlpriv->cfg->ops->update_rate_tbl(hw,
2627 sta, p_ra->ratr_state);
2628 rcu_read_unlock();
2629
2630 p_ra->pre_ratr_state = p_ra->ratr_state;
2631 }
2632 }
2633}
2634
2635static void rtl8821ae_dm_refresh_basic_rate_mask(struct ieee80211_hw *hw)
2636{
2637 struct rtl_priv *rtlpriv = rtl_priv(hw);
2638 struct dig_t *dm_digtable = &rtlpriv->dm_digtable;
2639 struct rtl_mac *mac = &rtlpriv->mac80211;
2640 static u8 stage;
2641 u8 cur_stage = 0;
2642 u16 basic_rate = RRSR_1M | RRSR_2M | RRSR_5_5M | RRSR_11M | RRSR_6M;
2643
2644 if (mac->link_state < MAC80211_LINKED)
2645 cur_stage = 0;
2646 else if (dm_digtable->rssi_val_min < 25)
2647 cur_stage = 1;
2648 else if (dm_digtable->rssi_val_min > 30)
2649 cur_stage = 3;
2650 else
2651 cur_stage = 2;
2652
2653 if (cur_stage != stage) {
2654 if (cur_stage == 1) {
2655 basic_rate &= (!(basic_rate ^ mac->basic_rates));
2656 rtlpriv->cfg->ops->set_hw_reg(hw,
2657 HW_VAR_BASIC_RATE, (u8 *)&basic_rate);
2658 } else if (cur_stage == 3 && (stage == 1 || stage == 2)) {
2659 rtlpriv->cfg->ops->set_hw_reg(hw,
2660 HW_VAR_BASIC_RATE, (u8 *)&mac->basic_rates);
2661 }
2662 }
2663 stage = cur_stage;
2664}
2665
2666static void rtl8821ae_dm_edca_choose_traffic_idx(
2667 struct ieee80211_hw *hw, u64 cur_tx_bytes,
2668 u64 cur_rx_bytes, bool b_bias_on_rx,
2669 bool *pb_is_cur_rdl_state)
2670{
2671 struct rtl_priv *rtlpriv = rtl_priv(hw);
2672
2673 if (b_bias_on_rx) {
2674 if (cur_tx_bytes > (cur_rx_bytes*4)) {
2675 *pb_is_cur_rdl_state = false;
2676 RT_TRACE(rtlpriv, COMP_TURBO, DBG_LOUD,
2677 "Uplink Traffic\n ");
2678 } else {
2679 *pb_is_cur_rdl_state = true;
2680 RT_TRACE(rtlpriv, COMP_TURBO, DBG_LOUD,
2681 "Balance Traffic\n");
2682 }
2683 } else {
2684 if (cur_rx_bytes > (cur_tx_bytes*4)) {
2685 *pb_is_cur_rdl_state = true;
2686 RT_TRACE(rtlpriv, COMP_TURBO, DBG_LOUD,
2687 "Downlink Traffic\n");
2688 } else {
2689 *pb_is_cur_rdl_state = false;
2690 RT_TRACE(rtlpriv, COMP_TURBO, DBG_LOUD,
2691 "Balance Traffic\n");
2692 }
2693 }
2694 return;
2695}
2696
2697static void rtl8821ae_dm_check_edca_turbo(struct ieee80211_hw *hw)
2698{
2699 struct rtl_priv *rtlpriv = rtl_priv(hw);
2700 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
2701 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
2702
2703 /*Keep past Tx/Rx packet count for RT-to-RT EDCA turbo.*/
2704 u64 cur_tx_ok_cnt = 0;
2705 u64 cur_rx_ok_cnt = 0;
2706 u32 edca_be_ul = 0x5ea42b;
2707 u32 edca_be_dl = 0x5ea42b;
2708 u32 edca_be = 0x5ea42b;
2709 u8 iot_peer = 0;
2710 bool *pb_is_cur_rdl_state = NULL;
2711 bool b_last_is_cur_rdl_state = false;
2712 bool b_bias_on_rx = false;
2713 bool b_edca_turbo_on = false;
2714
2715 RT_TRACE(rtlpriv, COMP_TURBO, DBG_LOUD,
2716 "rtl8821ae_dm_check_edca_turbo=====>");
2717 RT_TRACE(rtlpriv, COMP_TURBO, DBG_LOUD,
2718 "Orginial BE PARAM: 0x%x\n",
2719 rtl_read_dword(rtlpriv, DM_REG_EDCA_BE_11N));
2720
2721 if (rtlpriv->dm.dbginfo.num_non_be_pkt > 0x100)
2722 rtlpriv->dm.is_any_nonbepkts = true;
2723 rtlpriv->dm.dbginfo.num_non_be_pkt = 0;
2724
2725 /*===============================
2726 * list paramter for different platform
2727 *===============================
2728 */
2729 b_last_is_cur_rdl_state = rtlpriv->dm.is_cur_rdlstate;
2730 pb_is_cur_rdl_state = &rtlpriv->dm.is_cur_rdlstate;
2731
2732 cur_tx_ok_cnt = rtlpriv->stats.txbytesunicast - rtldm->last_tx_ok_cnt;
2733 cur_rx_ok_cnt = rtlpriv->stats.rxbytesunicast - rtldm->last_rx_ok_cnt;
2734
2735 rtldm->last_tx_ok_cnt = rtlpriv->stats.txbytesunicast;
2736 rtldm->last_rx_ok_cnt = rtlpriv->stats.rxbytesunicast;
2737
2738 iot_peer = rtlpriv->mac80211.vendor;
2739 b_bias_on_rx = false;
2740 b_edca_turbo_on = ((!rtlpriv->dm.is_any_nonbepkts) &&
2741 (!rtlpriv->dm.disable_framebursting)) ?
2742 true : false;
2743
2744 if (rtlpriv->rtlhal.hw_type != HARDWARE_TYPE_RTL8812AE) {
2745 if ((iot_peer == PEER_CISCO) &&
2746 (mac->mode == WIRELESS_MODE_N_24G)) {
2747 edca_be_dl = edca_setting_dl[iot_peer];
2748 edca_be_ul = edca_setting_ul[iot_peer];
2749 }
2750 }
2751
2752 RT_TRACE(rtlpriv, COMP_TURBO, DBG_LOUD,
2753 "bIsAnyNonBEPkts : 0x%x bDisableFrameBursting : 0x%x\n",
2754 rtlpriv->dm.is_any_nonbepkts,
2755 rtlpriv->dm.disable_framebursting);
2756
2757 RT_TRACE(rtlpriv, COMP_TURBO, DBG_LOUD,
2758 "bEdcaTurboOn : 0x%x bBiasOnRx : 0x%x\n",
2759 b_edca_turbo_on, b_bias_on_rx);
2760
2761 if (b_edca_turbo_on) {
2762 RT_TRACE(rtlpriv, COMP_TURBO, DBG_LOUD,
2763 "curTxOkCnt : 0x%llx\n", cur_tx_ok_cnt);
2764 RT_TRACE(rtlpriv, COMP_TURBO, DBG_LOUD,
2765 "curRxOkCnt : 0x%llx\n", cur_rx_ok_cnt);
2766 if (b_bias_on_rx)
2767 rtl8821ae_dm_edca_choose_traffic_idx(hw, cur_tx_ok_cnt,
2768 cur_rx_ok_cnt, true, pb_is_cur_rdl_state);
2769 else
2770 rtl8821ae_dm_edca_choose_traffic_idx(hw, cur_tx_ok_cnt,
2771 cur_rx_ok_cnt, false, pb_is_cur_rdl_state);
2772
2773 edca_be = (*pb_is_cur_rdl_state) ? edca_be_dl : edca_be_ul;
2774
2775 rtl_write_dword(rtlpriv, DM_REG_EDCA_BE_11N, edca_be);
2776
2777 RT_TRACE(rtlpriv, COMP_TURBO, DBG_LOUD,
2778 "EDCA Turbo on: EDCA_BE:0x%x\n", edca_be);
2779
2780 rtlpriv->dm.current_turbo_edca = true;
2781
2782 RT_TRACE(rtlpriv, COMP_TURBO, DBG_LOUD,
2783 "EDCA_BE_DL : 0x%x EDCA_BE_UL : 0x%x EDCA_BE : 0x%x\n",
2784 edca_be_dl, edca_be_ul, edca_be);
2785 } else {
2786 if (rtlpriv->dm.current_turbo_edca) {
2787 u8 tmp = AC0_BE;
2788 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_AC_PARAM,
2789 (u8 *)(&tmp));
2790 }
2791 rtlpriv->dm.current_turbo_edca = false;
2792 }
2793
2794 rtlpriv->dm.is_any_nonbepkts = false;
2795 rtldm->last_tx_ok_cnt = rtlpriv->stats.txbytesunicast;
2796 rtldm->last_rx_ok_cnt = rtlpriv->stats.rxbytesunicast;
2797}
2798
2799static void rtl8821ae_dm_cck_packet_detection_thresh(struct ieee80211_hw *hw)
2800{
2801 struct rtl_priv *rtlpriv = rtl_priv(hw);
2802 struct dig_t *dm_digtable = &rtlpriv->dm_digtable;
2803 u8 cur_cck_cca_thresh;
2804
2805 if (rtlpriv->mac80211.link_state >= MAC80211_LINKED) {
2806 if (dm_digtable->rssi_val_min > 25) {
2807 cur_cck_cca_thresh = 0xcd;
2808 } else if ((dm_digtable->rssi_val_min <= 25) &&
2809 (dm_digtable->rssi_val_min > 10)) {
2810 cur_cck_cca_thresh = 0x83;
2811 } else {
2812 if (rtlpriv->falsealm_cnt.cnt_cck_fail > 1000)
2813 cur_cck_cca_thresh = 0x83;
2814 else
2815 cur_cck_cca_thresh = 0x40;
2816 }
2817 } else {
2818 if (rtlpriv->falsealm_cnt.cnt_cck_fail > 1000)
2819 cur_cck_cca_thresh = 0x83;
2820 else
2821 cur_cck_cca_thresh = 0x40;
2822 }
2823
2824 if (dm_digtable->cur_cck_cca_thres != cur_cck_cca_thresh)
2825 rtl_write_byte(rtlpriv, ODM_REG_CCK_CCA_11AC,
2826 cur_cck_cca_thresh);
2827
2828 dm_digtable->pre_cck_cca_thres = dm_digtable->cur_cck_cca_thres;
2829 dm_digtable->cur_cck_cca_thres = cur_cck_cca_thresh;
2830 RT_TRACE(rtlpriv, COMP_DIG, DBG_TRACE,
2831 "CCK cca thresh hold =%x\n", dm_digtable->cur_cck_cca_thres);
2832}
2833
2834static void rtl8821ae_dm_dynamic_atc_switch(struct ieee80211_hw *hw)
2835{
2836 struct rtl_priv *rtlpriv = rtl_priv(hw);
2837 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
2838 u8 crystal_cap;
2839 u32 packet_count;
2840 int cfo_khz_a, cfo_khz_b, cfo_ave = 0, adjust_xtal = 0;
2841 int cfo_ave_diff;
2842
2843 if (rtlpriv->mac80211.link_state < MAC80211_LINKED) {
2844 /*1.Enable ATC*/
2845 if (rtldm->atc_status == ATC_STATUS_OFF) {
2846 rtl_set_bbreg(hw, RFC_AREA, BIT(14), ATC_STATUS_ON);
2847 rtldm->atc_status = ATC_STATUS_ON;
2848 }
2849
2850 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, "No link!!\n");
2851 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
2852 "atc_status = %d\n", rtldm->atc_status);
2853
2854 if (rtldm->crystal_cap != rtlpriv->efuse.crystalcap) {
2855 rtldm->crystal_cap = rtlpriv->efuse.crystalcap;
2856 crystal_cap = rtldm->crystal_cap & 0x3f;
2857 crystal_cap = crystal_cap & 0x3f;
2858 if (rtlpriv->rtlhal.hw_type == HARDWARE_TYPE_RTL8812AE)
2859 rtl_set_bbreg(hw, REG_MAC_PHY_CTRL,
2860 0x7ff80000, (crystal_cap |
2861 (crystal_cap << 6)));
2862 else
2863 rtl_set_bbreg(hw, REG_MAC_PHY_CTRL,
2864 0xfff000, (crystal_cap |
2865 (crystal_cap << 6)));
2866 }
2867 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, "crystal_cap = 0x%x\n",
2868 rtldm->crystal_cap);
2869 } else{
2870 /*1. Calculate CFO for path-A & path-B*/
2871 cfo_khz_a = (int)(rtldm->cfo_tail[0] * 3125) / 1280;
2872 cfo_khz_b = (int)(rtldm->cfo_tail[1] * 3125) / 1280;
2873 packet_count = rtldm->packet_count;
2874
2875 /*2.No new packet*/
2876 if (packet_count == rtldm->packet_count_pre) {
2877 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
2878 "packet counter doesn't change\n");
2879 return;
2880 }
2881
2882 rtldm->packet_count_pre = packet_count;
2883 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
2884 "packet counter = %d\n",
2885 rtldm->packet_count);
2886
2887 /*3.Average CFO*/
2888 if (rtlpriv->phy.rf_type == RF_1T1R)
2889 cfo_ave = cfo_khz_a;
2890 else
2891 cfo_ave = (cfo_khz_a + cfo_khz_b) >> 1;
2892
2893 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
2894 "cfo_khz_a = %dkHz, cfo_khz_b = %dkHz, cfo_ave = %dkHz\n",
2895 cfo_khz_a, cfo_khz_b, cfo_ave);
2896
2897 /*4.Avoid abnormal large CFO*/
2898 cfo_ave_diff = (rtldm->cfo_ave_pre >= cfo_ave) ?
2899 (rtldm->cfo_ave_pre - cfo_ave) :
2900 (cfo_ave - rtldm->cfo_ave_pre);
2901
2902 if (cfo_ave_diff > 20 && rtldm->large_cfo_hit == 0) {
2903 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
2904 "first large CFO hit\n");
2905 rtldm->large_cfo_hit = 1;
2906 return;
2907 } else
2908 rtldm->large_cfo_hit = 0;
2909
2910 rtldm->cfo_ave_pre = cfo_ave;
2911
2912 /*CFO tracking by adjusting Xtal cap.*/
2913
2914 /*1.Dynamic Xtal threshold*/
2915 if (cfo_ave >= -rtldm->cfo_threshold &&
2916 cfo_ave <= rtldm->cfo_threshold &&
2917 rtldm->is_freeze == 0) {
2918 if (rtldm->cfo_threshold == CFO_THRESHOLD_XTAL) {
2919 rtldm->cfo_threshold = CFO_THRESHOLD_XTAL + 10;
2920 rtldm->is_freeze = 1;
2921 } else {
2922 rtldm->cfo_threshold = CFO_THRESHOLD_XTAL;
2923 }
2924 }
2925 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
2926 "Dynamic threshold = %d\n",
2927 rtldm->cfo_threshold);
2928
2929 /* 2.Calculate Xtal offset*/
2930 if (cfo_ave > rtldm->cfo_threshold && rtldm->crystal_cap < 0x3f)
2931 adjust_xtal = ((cfo_ave - CFO_THRESHOLD_XTAL) >> 2) + 1;
2932 else if ((cfo_ave < -rtlpriv->dm.cfo_threshold) &&
2933 rtlpriv->dm.crystal_cap > 0)
2934 adjust_xtal = ((cfo_ave + CFO_THRESHOLD_XTAL) >> 2) - 1;
2935 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
2936 "Crystal cap = 0x%x, Crystal cap offset = %d\n",
2937 rtldm->crystal_cap, adjust_xtal);
2938
2939 /*3.Adjudt Crystal Cap.*/
2940 if (adjust_xtal != 0) {
2941 rtldm->is_freeze = 0;
2942 rtldm->crystal_cap += adjust_xtal;
2943
2944 if (rtldm->crystal_cap > 0x3f)
2945 rtldm->crystal_cap = 0x3f;
2946 else if (rtldm->crystal_cap < 0)
2947 rtldm->crystal_cap = 0;
2948
2949 crystal_cap = rtldm->crystal_cap & 0x3f;
2950 crystal_cap = crystal_cap & 0x3f;
2951 if (rtlpriv->rtlhal.hw_type == HARDWARE_TYPE_RTL8812AE)
2952 rtl_set_bbreg(hw, REG_MAC_PHY_CTRL,
2953 0x7ff80000, (crystal_cap |
2954 (crystal_cap << 6)));
2955 else
2956 rtl_set_bbreg(hw, REG_MAC_PHY_CTRL,
2957 0xfff000, (crystal_cap |
2958 (crystal_cap << 6)));
2959 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
2960 "New crystal cap = 0x%x\n",
2961 rtldm->crystal_cap);
2962 }
2963 }
2964}
2965
2966void rtl8821ae_dm_watchdog(struct ieee80211_hw *hw)
2967{
2968 struct rtl_priv *rtlpriv = rtl_priv(hw);
2969 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
2970 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
2971 bool fw_current_inpsmode = false;
2972 bool fw_ps_awake = true;
2973
2974 rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_FW_PSMODE_STATUS,
2975 (u8 *)(&fw_current_inpsmode));
2976
2977 rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_FWLPS_RF_ON,
2978 (u8 *)(&fw_ps_awake));
2979
2980 if (ppsc->p2p_ps_info.p2p_ps_mode)
2981 fw_ps_awake = false;
2982
2983 if ((ppsc->rfpwr_state == ERFON) &&
2984 ((!fw_current_inpsmode) && fw_ps_awake) &&
2985 (!ppsc->rfchange_inprogress)) {
2986 rtl8821ae_dm_common_info_self_update(hw);
2987 rtl8821ae_dm_false_alarm_counter_statistics(hw);
2988 rtl8821ae_dm_check_rssi_monitor(hw);
2989 rtl8821ae_dm_dig(hw);
2990 rtl8821ae_dm_cck_packet_detection_thresh(hw);
2991 rtl8821ae_dm_refresh_rate_adaptive_mask(hw);
2992 rtl8821ae_dm_refresh_basic_rate_mask(hw);
2993 rtl8821ae_dm_check_edca_turbo(hw);
2994 rtl8821ae_dm_dynamic_atc_switch(hw);
2995 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE)
2996 rtl8812ae_dm_check_txpower_tracking_thermalmeter(hw);
2997 else
2998 rtl8821ae_dm_check_txpower_tracking_thermalmeter(hw);
2999 rtl8821ae_dm_iq_calibrate(hw);
3000 }
3001
3002 rtlpriv->dm.dbginfo.num_qry_beacon_pkt = 0;
3003 RT_TRACE(rtlpriv, COMP_DIG, DBG_DMESG, "\n");
3004}
3005
3006void rtl8821ae_dm_set_tx_ant_by_tx_info(struct ieee80211_hw *hw,
3007 u8 *pdesc, u32 mac_id)
3008{
3009 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
3010 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
3011 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
3012 struct fast_ant_training *pfat_table = &rtldm->fat_table;
3013
3014 if (rtlhal->hw_type != HARDWARE_TYPE_RTL8812AE)
3015 return;
3016
3017 if (rtlefuse->antenna_div_type == CG_TRX_HW_ANTDIV)
3018 SET_TX_DESC_TX_ANT(pdesc, pfat_table->antsel_a[mac_id]);
3019}
diff --git a/drivers/net/wireless/rtlwifi/rtl8821ae/dm.h b/drivers/net/wireless/rtlwifi/rtl8821ae/dm.h
new file mode 100644
index 000000000000..9dd40dd316c1
--- /dev/null
+++ b/drivers/net/wireless/rtlwifi/rtl8821ae/dm.h
@@ -0,0 +1,356 @@
1/******************************************************************************
2 *
3 * Copyright(c) 2009-2010 Realtek Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * The full GNU General Public License is included in this distribution in the
15 * file called LICENSE.
16 *
17 * Contact Information:
18 * wlanfae <wlanfae@realtek.com>
19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20 * Hsinchu 300, Taiwan.
21 *
22 * Larry Finger <Larry.Finger@lwfinger.net>
23 *
24 *****************************************************************************/
25
26#ifndef __RTL8821AE_DM_H__
27#define __RTL8821AE_DM_H__
28
29#define MAIN_ANT 0
30#define AUX_ANT 1
31#define MAIN_ANT_CG_TRX 1
32#define AUX_ANT_CG_TRX 0
33#define MAIN_ANT_CGCS_RX 0
34#define AUX_ANT_CGCS_RX 1
35
36#define TXSCALE_TABLE_SIZE 37
37
38/*RF REG LIST*/
39#define DM_REG_RF_MODE_11N 0x00
40#define DM_REG_RF_0B_11N 0x0B
41#define DM_REG_CHNBW_11N 0x18
42#define DM_REG_T_METER_11N 0x24
43#define DM_REG_RF_25_11N 0x25
44#define DM_REG_RF_26_11N 0x26
45#define DM_REG_RF_27_11N 0x27
46#define DM_REG_RF_2B_11N 0x2B
47#define DM_REG_RF_2C_11N 0x2C
48#define DM_REG_RXRF_A3_11N 0x3C
49#define DM_REG_T_METER_92D_11N 0x42
50#define DM_REG_T_METER_88E_11N 0x42
51
52/*BB REG LIST*/
53/*PAGE 8 */
54#define DM_REG_BB_CTRL_11N 0x800
55#define DM_REG_RF_PIN_11N 0x804
56#define DM_REG_PSD_CTRL_11N 0x808
57#define DM_REG_TX_ANT_CTRL_11N 0x80C
58#define DM_REG_BB_PWR_SAV5_11N 0x818
59#define DM_REG_CCK_RPT_FORMAT_11N 0x824
60#define DM_REG_RX_DEFUALT_A_11N 0x858
61#define DM_REG_RX_DEFUALT_B_11N 0x85A
62#define DM_REG_BB_PWR_SAV3_11N 0x85C
63#define DM_REG_ANTSEL_CTRL_11N 0x860
64#define DM_REG_RX_ANT_CTRL_11N 0x864
65#define DM_REG_PIN_CTRL_11N 0x870
66#define DM_REG_BB_PWR_SAV1_11N 0x874
67#define DM_REG_ANTSEL_PATH_11N 0x878
68#define DM_REG_BB_3WIRE_11N 0x88C
69#define DM_REG_SC_CNT_11N 0x8C4
70#define DM_REG_PSD_DATA_11N 0x8B4
71/*PAGE 9*/
72#define DM_REG_ANT_MAPPING1_11N 0x914
73#define DM_REG_ANT_MAPPING2_11N 0x918
74/*PAGE A*/
75#define DM_REG_CCK_ANTDIV_PARA1_11N 0xA00
76#define DM_REG_CCK_CCA_11N 0xA0A
77#define DM_REG_CCK_CCA_11AC 0xA0A
78#define DM_REG_CCK_ANTDIV_PARA2_11N 0xA0C
79#define DM_REG_CCK_ANTDIV_PARA3_11N 0xA10
80#define DM_REG_CCK_ANTDIV_PARA4_11N 0xA14
81#define DM_REG_CCK_FILTER_PARA1_11N 0xA22
82#define DM_REG_CCK_FILTER_PARA2_11N 0xA23
83#define DM_REG_CCK_FILTER_PARA3_11N 0xA24
84#define DM_REG_CCK_FILTER_PARA4_11N 0xA25
85#define DM_REG_CCK_FILTER_PARA5_11N 0xA26
86#define DM_REG_CCK_FILTER_PARA6_11N 0xA27
87#define DM_REG_CCK_FILTER_PARA7_11N 0xA28
88#define DM_REG_CCK_FILTER_PARA8_11N 0xA29
89#define DM_REG_CCK_FA_RST_11N 0xA2C
90#define DM_REG_CCK_FA_MSB_11N 0xA58
91#define DM_REG_CCK_FA_LSB_11N 0xA5C
92#define DM_REG_CCK_CCA_CNT_11N 0xA60
93#define DM_REG_BB_PWR_SAV4_11N 0xA74
94/*PAGE B */
95#define DM_REG_LNA_SWITCH_11N 0xB2C
96#define DM_REG_PATH_SWITCH_11N 0xB30
97#define DM_REG_RSSI_CTRL_11N 0xB38
98#define DM_REG_CONFIG_ANTA_11N 0xB68
99#define DM_REG_RSSI_BT_11N 0xB9C
100/*PAGE C */
101#define DM_REG_OFDM_FA_HOLDC_11N 0xC00
102#define DM_REG_RX_PATH_11N 0xC04
103#define DM_REG_TRMUX_11N 0xC08
104#define DM_REG_OFDM_FA_RSTC_11N 0xC0C
105#define DM_REG_RXIQI_MATRIX_11N 0xC14
106#define DM_REG_TXIQK_MATRIX_LSB1_11N 0xC4C
107#define DM_REG_IGI_A_11N 0xC50
108#define DM_REG_IGI_A_11AC 0xC50
109#define DM_REG_ANTDIV_PARA2_11N 0xC54
110#define DM_REG_IGI_B_11N 0xC58
111#define DM_REG_IGI_B_11AC 0xE50
112#define DM_REG_ANTDIV_PARA3_11N 0xC5C
113#define DM_REG_BB_PWR_SAV2_11N 0xC70
114#define DM_REG_RX_OFF_11N 0xC7C
115#define DM_REG_TXIQK_MATRIXA_11N 0xC80
116#define DM_REG_TXIQK_MATRIXB_11N 0xC88
117#define DM_REG_TXIQK_MATRIXA_LSB2_11N 0xC94
118#define DM_REG_TXIQK_MATRIXB_LSB2_11N 0xC9C
119#define DM_REG_RXIQK_MATRIX_LSB_11N 0xCA0
120#define DM_REG_ANTDIV_PARA1_11N 0xCA4
121#define DM_REG_OFDM_FA_TYPE1_11N 0xCF0
122/*PAGE D */
123#define DM_REG_OFDM_FA_RSTD_11N 0xD00
124#define DM_REG_OFDM_FA_TYPE2_11N 0xDA0
125#define DM_REG_OFDM_FA_TYPE3_11N 0xDA4
126#define DM_REG_OFDM_FA_TYPE4_11N 0xDA8
127/*PAGE E */
128#define DM_REG_TXAGC_A_6_18_11N 0xE00
129#define DM_REG_TXAGC_A_24_54_11N 0xE04
130#define DM_REG_TXAGC_A_1_MCS32_11N 0xE08
131#define DM_REG_TXAGC_A_MCS0_3_11N 0xE10
132#define DM_REG_TXAGC_A_MCS4_7_11N 0xE14
133#define DM_REG_TXAGC_A_MCS8_11_11N 0xE18
134#define DM_REG_TXAGC_A_MCS12_15_11N 0xE1C
135#define DM_REG_FPGA0_IQK_11N 0xE28
136#define DM_REG_TXIQK_TONE_A_11N 0xE30
137#define DM_REG_RXIQK_TONE_A_11N 0xE34
138#define DM_REG_TXIQK_PI_A_11N 0xE38
139#define DM_REG_RXIQK_PI_A_11N 0xE3C
140#define DM_REG_TXIQK_11N 0xE40
141#define DM_REG_RXIQK_11N 0xE44
142#define DM_REG_IQK_AGC_PTS_11N 0xE48
143#define DM_REG_IQK_AGC_RSP_11N 0xE4C
144#define DM_REG_BLUETOOTH_11N 0xE6C
145#define DM_REG_RX_WAIT_CCA_11N 0xE70
146#define DM_REG_TX_CCK_RFON_11N 0xE74
147#define DM_REG_TX_CCK_BBON_11N 0xE78
148#define DM_REG_OFDM_RFON_11N 0xE7C
149#define DM_REG_OFDM_BBON_11N 0xE80
150#define DM_REG_TX2RX_11N 0xE84
151#define DM_REG_TX2TX_11N 0xE88
152#define DM_REG_RX_CCK_11N 0xE8C
153#define DM_REG_RX_OFDM_11N 0xED0
154#define DM_REG_RX_WAIT_RIFS_11N 0xED4
155#define DM_REG_RX2RX_11N 0xED8
156#define DM_REG_STANDBY_11N 0xEDC
157#define DM_REG_SLEEP_11N 0xEE0
158#define DM_REG_PMPD_ANAEN_11N 0xEEC
159
160/*MAC REG LIST*/
161#define DM_REG_BB_RST_11N 0x02
162#define DM_REG_ANTSEL_PIN_11N 0x4C
163#define DM_REG_EARLY_MODE_11N 0x4D0
164#define DM_REG_RSSI_MONITOR_11N 0x4FE
165#define DM_REG_EDCA_VO_11N 0x500
166#define DM_REG_EDCA_VI_11N 0x504
167#define DM_REG_EDCA_BE_11N 0x508
168#define DM_REG_EDCA_BK_11N 0x50C
169#define DM_REG_TXPAUSE_11N 0x522
170#define DM_REG_RESP_TX_11N 0x6D8
171#define DM_REG_ANT_TRAIN_PARA1_11N 0x7b0
172#define DM_REG_ANT_TRAIN_PARA2_11N 0x7b4
173
174/*DIG Related*/
175#define DM_BIT_IGI_11N 0x0000007F
176#define DM_BIT_IGI_11AC 0xFFFFFFFF
177
178#define HAL_DM_DIG_DISABLE BIT(0)
179#define HAL_DM_HIPWR_DISABLE BIT(1)
180
181#define OFDM_TABLE_LENGTH 43
182#define CCK_TABLE_LENGTH 33
183
184#define OFDM_TABLE_SIZE 37
185#define CCK_TABLE_SIZE 33
186
187#define BW_AUTO_SWITCH_HIGH_LOW 25
188#define BW_AUTO_SWITCH_LOW_HIGH 30
189
190#define DM_DIG_THRESH_HIGH 40
191#define DM_DIG_THRESH_LOW 35
192
193#define DM_FALSEALARM_THRESH_LOW 400
194#define DM_FALSEALARM_THRESH_HIGH 1000
195
196#define DM_DIG_MAX 0x3e
197#define DM_DIG_MIN 0x1e
198
199#define DM_DIG_MAX_AP 0x32
200#define DM_DIG_MIN_AP 0x20
201
202#define DM_DIG_FA_UPPER 0x3e
203#define DM_DIG_FA_LOWER 0x1e
204#define DM_DIG_FA_TH0 200
205#define DM_DIG_FA_TH1 0x300
206#define DM_DIG_FA_TH2 0x400
207
208#define DM_DIG_BACKOFF_MAX 12
209#define DM_DIG_BACKOFF_MIN -4
210#define DM_DIG_BACKOFF_DEFAULT 10
211
212#define RXPATHSELECTION_SS_TH_LOW 30
213#define RXPATHSELECTION_DIFF_TH 18
214
215#define DM_RATR_STA_INIT 0
216#define DM_RATR_STA_HIGH 1
217#define DM_RATR_STA_MIDDLE 2
218#define DM_RATR_STA_LOW 3
219
220#define CTS2SELF_THVAL 30
221#define REGC38_TH 20
222
223#define WAIOTTHVAL 25
224
225#define TXHIGHPWRLEVEL_NORMAL 0
226#define TXHIGHPWRLEVEL_LEVEL1 1
227#define TXHIGHPWRLEVEL_LEVEL2 2
228#define TXHIGHPWRLEVEL_BT1 3
229#define TXHIGHPWRLEVEL_BT2 4
230
231#define DM_TYPE_BYFW 0
232#define DM_TYPE_BYDRIVER 1
233
234#define TX_POWER_NEAR_FIELD_THRESH_LVL2 74
235#define TX_POWER_NEAR_FIELD_THRESH_LVL1 67
236#define TXPWRTRACK_MAX_IDX 6
237
238/* Dynamic ATC switch */
239#define ATC_STATUS_OFF 0x0 /* enable */
240#define ATC_STATUS_ON 0x1 /* disable */
241#define CFO_THRESHOLD_XTAL 10 /* kHz */
242#define CFO_THRESHOLD_ATC 80 /* kHz */
243
244#define AVG_THERMAL_NUM_8812A 4
245#define TXPWR_TRACK_TABLE_SIZE 30
246#define MAX_PATH_NUM_8812A 2
247#define MAX_PATH_NUM_8821A 1
248
249enum FAT_STATE {
250 FAT_NORMAL_STATE = 0,
251 FAT_TRAINING_STATE = 1,
252};
253
254enum tag_dynamic_init_gain_operation_type_definition {
255 DIG_TYPE_THRESH_HIGH = 0,
256 DIG_TYPE_THRESH_LOW = 1,
257 DIG_TYPE_BACKOFF = 2,
258 DIG_TYPE_RX_GAIN_MIN = 3,
259 DIG_TYPE_RX_GAIN_MAX = 4,
260 DIG_TYPE_ENABLE = 5,
261 DIG_TYPE_DISABLE = 6,
262 DIG_OP_TYPE_MAX
263};
264
265enum tag_cck_packet_detection_threshold_type_definition {
266 CCK_PD_STAGE_LOWRSSI = 0,
267 CCK_PD_STAGE_HIGHRSSI = 1,
268 CCK_FA_STAGE_LOW = 2,
269 CCK_FA_STAGE_HIGH = 3,
270 CCK_PD_STAGE_MAX = 4,
271};
272
273enum dm_1r_cca_e {
274 CCA_1R = 0,
275 CCA_2R = 1,
276 CCA_MAX = 2,
277};
278
279enum dm_rf_e {
280 RF_SAVE = 0,
281 RF_NORMAL = 1,
282 RF_MAX = 2,
283};
284
285enum dm_sw_ant_switch_e {
286 ANS_ANTENNA_B = 1,
287 ANS_ANTENNA_A = 2,
288 ANS_ANTENNA_MAX = 3,
289};
290
291enum dm_dig_ext_port_alg_e {
292 DIG_EXT_PORT_STAGE_0 = 0,
293 DIG_EXT_PORT_STAGE_1 = 1,
294 DIG_EXT_PORT_STAGE_2 = 2,
295 DIG_EXT_PORT_STAGE_3 = 3,
296 DIG_EXT_PORT_STAGE_MAX = 4,
297};
298
299enum dm_dig_connect_e {
300 DIG_STA_DISCONNECT = 0,
301 DIG_STA_CONNECT = 1,
302 DIG_STA_BEFORE_CONNECT = 2,
303 DIG_MULTISTA_DISCONNECT = 3,
304 DIG_MULTISTA_CONNECT = 4,
305 DIG_CONNECT_MAX
306};
307
308enum pwr_track_control_method {
309 BBSWING,
310 TXAGC,
311 MIX_MODE
312};
313
314#define BT_RSSI_STATE_NORMAL_POWER BIT_OFFSET_LEN_MASK_32(0, 1)
315#define BT_RSSI_STATE_AMDPU_OFF BIT_OFFSET_LEN_MASK_32(1, 1)
316#define BT_RSSI_STATE_SPECIAL_LOW BIT_OFFSET_LEN_MASK_32(2, 1)
317#define BT_RSSI_STATE_BG_EDCA_LOW BIT_OFFSET_LEN_MASK_32(3, 1)
318#define BT_RSSI_STATE_TXPOWER_LOW BIT_OFFSET_LEN_MASK_32(4, 1)
319#define GET_UNDECORATED_AVERAGE_RSSI(_priv) \
320 ((((struct rtl_priv *)(_priv))->mac80211.opmode == \
321 NL80211_IFTYPE_ADHOC) ? \
322 (((struct rtl_priv *)(_priv))->dm.entry_min_undec_sm_pwdb) : \
323 (((struct rtl_priv *)(_priv))->dm.undec_sm_pwdb))
324
325void rtl8821ae_dm_set_tx_ant_by_tx_info(struct ieee80211_hw *hw,
326 u8 *pdesc, u32 mac_id);
327void rtl8821ae_dm_ant_sel_statistics(struct ieee80211_hw *hw,
328 u8 antsel_tr_mux, u32 mac_id,
329 u32 rx_pwdb_all);
330void rtl8821ae_dm_fast_antenna_training_callback(unsigned long data);
331void rtl8821ae_dm_init(struct ieee80211_hw *hw);
332void rtl8821ae_dm_watchdog(struct ieee80211_hw *hw);
333void rtl8821ae_dm_write_dig(struct ieee80211_hw *hw, u8 current_igi);
334void rtl8821ae_dm_init_edca_turbo(struct ieee80211_hw *hw);
335void rtl8821ae_dm_check_txpower_tracking_thermalmeter(struct ieee80211_hw *hw);
336void rtl8821ae_dm_init_rate_adaptive_mask(struct ieee80211_hw *hw);
337void rtl8821ae_dm_txpower_track_adjust(struct ieee80211_hw *hw,
338 u8 type, u8 *pdirection,
339 u32 *poutwrite_val);
340void rtl8821ae_dm_clear_txpower_tracking_state(struct ieee80211_hw *hw);
341void rtl8821ae_dm_write_cck_cca_thres(struct ieee80211_hw *hw, u8 current_cca);
342void rtl8821ae_dm_initialize_txpower_tracking_thermalmeter(struct ieee80211_hw *hw);
343void rtl8812ae_dm_txpwr_track_set_pwr(struct ieee80211_hw *hw,
344 enum pwr_track_control_method method,
345 u8 rf_path,
346 u8 channel_mapped_index);
347void rtl8821ae_dm_txpwr_track_set_pwr(struct ieee80211_hw *hw,
348 enum pwr_track_control_method method,
349 u8 rf_path, u8 channel_mapped_index);
350
351void rtl8821ae_dm_update_init_rate(struct ieee80211_hw *hw, u8 rate);
352u8 rtl8821ae_hw_rate_to_mrate(struct ieee80211_hw *hw, u8 rate);
353void rtl8812ae_dm_txpower_tracking_callback_thermalmeter(struct ieee80211_hw *hw);
354void rtl8821ae_dm_txpower_tracking_callback_thermalmeter(struct ieee80211_hw *hw);
355
356#endif
diff --git a/drivers/net/wireless/rtlwifi/rtl8821ae/fw.c b/drivers/net/wireless/rtlwifi/rtl8821ae/fw.c
new file mode 100644
index 000000000000..95e95626b632
--- /dev/null
+++ b/drivers/net/wireless/rtlwifi/rtl8821ae/fw.c
@@ -0,0 +1,1857 @@
1/******************************************************************************
2 *
3 * Copyright(c) 2009-2010 Realtek Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * The full GNU General Public License is included in this distribution in the
15 * file called LICENSE.
16 *
17 * Contact Information:
18 * wlanfae <wlanfae@realtek.com>
19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20 * Hsinchu 300, Taiwan.
21 *
22 * Larry Finger <Larry.Finger@lwfinger.net>
23 *
24 *****************************************************************************/
25
26#include "../wifi.h"
27#include "../pci.h"
28#include "../base.h"
29#include "../core.h"
30#include "reg.h"
31#include "def.h"
32#include "fw.h"
33#include "dm.h"
34
35static void _rtl8821ae_enable_fw_download(struct ieee80211_hw *hw, bool enable)
36{
37 struct rtl_priv *rtlpriv = rtl_priv(hw);
38 u8 tmp;
39
40 if (enable) {
41 rtl_write_byte(rtlpriv, REG_MCUFWDL, 0x05);
42
43 tmp = rtl_read_byte(rtlpriv, REG_MCUFWDL + 2);
44 rtl_write_byte(rtlpriv, REG_MCUFWDL + 2, tmp & 0xf7);
45
46 tmp = rtl_read_byte(rtlpriv, REG_MCUFWDL);
47 } else {
48 tmp = rtl_read_byte(rtlpriv, REG_MCUFWDL);
49 rtl_write_byte(rtlpriv, REG_MCUFWDL, tmp & 0xfe);
50 tmp = rtl_read_byte(rtlpriv, REG_MCUFWDL);
51 }
52}
53
54static void _rtl8821ae_fw_block_write(struct ieee80211_hw *hw,
55 const u8 *buffer, u32 size)
56{
57 struct rtl_priv *rtlpriv = rtl_priv(hw);
58 u32 blocksize = sizeof(u32);
59 u8 *bufferptr = (u8 *)buffer;
60 u32 *pu4byteptr = (u32 *)buffer;
61 u32 i, offset, blockcount, remainsize;
62
63 blockcount = size / blocksize;
64 remainsize = size % blocksize;
65
66 for (i = 0; i < blockcount; i++) {
67 offset = i * blocksize;
68 rtl_write_dword(rtlpriv, (FW_8821AE_START_ADDRESS + offset),
69 *(pu4byteptr + i));
70 }
71
72 if (remainsize) {
73 offset = blockcount * blocksize;
74 bufferptr += offset;
75 for (i = 0; i < remainsize; i++) {
76 rtl_write_byte(rtlpriv, (FW_8821AE_START_ADDRESS +
77 offset + i), *(bufferptr + i));
78 }
79 }
80}
81
82static void _rtl8821ae_fw_page_write(struct ieee80211_hw *hw,
83 u32 page, const u8 *buffer, u32 size)
84{
85 struct rtl_priv *rtlpriv = rtl_priv(hw);
86 u8 value8;
87 u8 u8page = (u8)(page & 0x07);
88
89 value8 = (rtl_read_byte(rtlpriv, REG_MCUFWDL + 2) & 0xF8) | u8page;
90
91 rtl_write_byte(rtlpriv, (REG_MCUFWDL + 2), value8);
92 _rtl8821ae_fw_block_write(hw, buffer, size);
93}
94
95static void _rtl8821ae_fill_dummy(u8 *pfwbuf, u32 *pfwlen)
96{
97 u32 fwlen = *pfwlen;
98 u8 remain = (u8)(fwlen % 4);
99
100 remain = (remain == 0) ? 0 : (4 - remain);
101
102 while (remain > 0) {
103 pfwbuf[fwlen] = 0;
104 fwlen++;
105 remain--;
106 }
107
108 *pfwlen = fwlen;
109}
110
111static void _rtl8821ae_write_fw(struct ieee80211_hw *hw,
112 enum version_8821ae version,
113 u8 *buffer, u32 size)
114{
115 struct rtl_priv *rtlpriv = rtl_priv(hw);
116 u8 *bufferptr = (u8 *)buffer;
117 u32 pagenums, remainsize;
118 u32 page, offset;
119
120 RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "FW size is %d bytes,\n", size);
121
122 _rtl8821ae_fill_dummy(bufferptr, &size);
123
124 pagenums = size / FW_8821AE_PAGE_SIZE;
125 remainsize = size % FW_8821AE_PAGE_SIZE;
126
127 if (pagenums > 8) {
128 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
129 "Page numbers should not greater then 8\n");
130 }
131
132 for (page = 0; page < pagenums; page++) {
133 offset = page * FW_8821AE_PAGE_SIZE;
134 _rtl8821ae_fw_page_write(hw, page, (bufferptr + offset),
135 FW_8821AE_PAGE_SIZE);
136 }
137
138 if (remainsize) {
139 offset = pagenums * FW_8821AE_PAGE_SIZE;
140 page = pagenums;
141 _rtl8821ae_fw_page_write(hw, page, (bufferptr + offset),
142 remainsize);
143 }
144}
145
146static int _rtl8821ae_fw_free_to_go(struct ieee80211_hw *hw)
147{
148 struct rtl_priv *rtlpriv = rtl_priv(hw);
149 int err = -EIO;
150 u32 counter = 0;
151 u32 value32;
152
153 do {
154 value32 = rtl_read_dword(rtlpriv, REG_MCUFWDL);
155 } while ((counter++ < FW_8821AE_POLLING_TIMEOUT_COUNT) &&
156 (!(value32 & FWDL_CHKSUM_RPT)));
157
158 if (counter >= FW_8821AE_POLLING_TIMEOUT_COUNT) {
159 RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
160 "chksum report faill ! REG_MCUFWDL:0x%08x .\n",
161 value32);
162 goto exit;
163 }
164
165 RT_TRACE(rtlpriv, COMP_FW, DBG_EMERG,
166 "Checksum report OK ! REG_MCUFWDL:0x%08x .\n", value32);
167
168 value32 = rtl_read_dword(rtlpriv, REG_MCUFWDL);
169 value32 |= MCUFWDL_RDY;
170 value32 &= ~WINTINI_RDY;
171 rtl_write_dword(rtlpriv, REG_MCUFWDL, value32);
172
173 rtl8821ae_firmware_selfreset(hw);
174
175 counter = 0;
176 do {
177 value32 = rtl_read_dword(rtlpriv, REG_MCUFWDL);
178 if (value32 & WINTINI_RDY) {
179 RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD,
180 "Polling FW ready success!! REG_MCUFWDL:0x%08x .\n",
181 value32);
182 err = 0;
183 goto exit;
184 }
185
186 udelay(FW_8821AE_POLLING_DELAY);
187 } while (counter++ < FW_8821AE_POLLING_TIMEOUT_COUNT);
188
189 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
190 "Polling FW ready fail!! REG_MCUFWDL:0x%08x .\n",
191 value32);
192
193exit:
194 return err;
195}
196
197static void _rtl8821ae_wait_for_h2c_cmd_finish(struct rtl_priv *rtlpriv)
198{
199 u8 val;
200 u16 count = 0;
201
202 do {
203 val = rtl_read_byte(rtlpriv, REG_HMETFR);
204 mdelay(1);
205 count++;
206 } while ((val & 0x0F) && (count < 1000));
207}
208
209int rtl8821ae_download_fw(struct ieee80211_hw *hw, bool buse_wake_on_wlan_fw)
210{
211 struct rtl_priv *rtlpriv = rtl_priv(hw);
212 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
213 struct rtl8821a_firmware_header *pfwheader;
214 u8 *pfwdata;
215 u32 fwsize;
216 int err;
217 bool support_remote_wakeup;
218 enum version_8821ae version = rtlhal->version;
219
220 rtlpriv->cfg->ops->get_hw_reg(hw, HAL_DEF_WOWLAN,
221 (u8 *)(&support_remote_wakeup));
222
223 if (support_remote_wakeup)
224 _rtl8821ae_wait_for_h2c_cmd_finish(rtlpriv);
225
226 if (buse_wake_on_wlan_fw) {
227 if (!rtlhal->wowlan_firmware)
228 return 1;
229
230 pfwheader =
231 (struct rtl8821a_firmware_header *)rtlhal->wowlan_firmware;
232 rtlhal->fw_version = pfwheader->version;
233 rtlhal->fw_subversion = pfwheader->subversion;
234 pfwdata = (u8 *)rtlhal->wowlan_firmware;
235 fwsize = rtlhal->wowlan_fwsize;
236 } else {
237 if (!rtlhal->pfirmware)
238 return 1;
239
240 pfwheader =
241 (struct rtl8821a_firmware_header *)rtlhal->pfirmware;
242 rtlhal->fw_version = pfwheader->version;
243 rtlhal->fw_subversion = pfwheader->subversion;
244 pfwdata = (u8 *)rtlhal->pfirmware;
245 fwsize = rtlhal->fwsize;
246 }
247
248 RT_TRACE(rtlpriv, COMP_FW, DBG_DMESG,
249 "%s Firmware SIZE %d\n",
250 buse_wake_on_wlan_fw ? "Wowlan" : "Normal", fwsize);
251
252 if (IS_FW_HEADER_EXIST_8812(pfwheader) ||
253 IS_FW_HEADER_EXIST_8821(pfwheader)) {
254 RT_TRACE(rtlpriv, COMP_FW, DBG_DMESG,
255 "Firmware Version(%d), Signature(%#x)\n",
256 pfwheader->version, pfwheader->signature);
257
258 pfwdata = pfwdata + sizeof(struct rtl8821a_firmware_header);
259 fwsize = fwsize - sizeof(struct rtl8821a_firmware_header);
260 }
261
262 if (rtlhal->mac_func_enable) {
263 if (rtl_read_byte(rtlpriv, REG_MCUFWDL) & BIT(7)) {
264 rtl_write_byte(rtlpriv, REG_MCUFWDL, 0x00);
265 rtl8821ae_firmware_selfreset(hw);
266 }
267 }
268 _rtl8821ae_enable_fw_download(hw, true);
269 _rtl8821ae_write_fw(hw, version, pfwdata, fwsize);
270 _rtl8821ae_enable_fw_download(hw, false);
271
272 err = _rtl8821ae_fw_free_to_go(hw);
273 if (err) {
274 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
275 "Firmware is not ready to run!\n");
276 } else {
277 RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD,
278 "Firmware is ready to run!\n");
279 }
280
281 return 0;
282}
283
284#if (USE_SPECIFIC_FW_TO_SUPPORT_WOWLAN == 1)
285void rtl8821ae_set_fw_related_for_wowlan(struct ieee80211_hw *hw,
286 bool used_wowlan_fw)
287{
288 struct rtl_priv *rtlpriv = rtl_priv(hw);
289 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
290 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
291 /* 1. Before WoWLAN or After WOWLAN we need to re-download Fw. */
292 if (rtl8821ae_download_fw(hw, used_wowlan_fw)) {
293 RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
294 "Re-Download Firmware failed!!\n");
295 rtlhal->fw_ready = false;
296 return;
297 }
298 RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
299 "Re-Download Firmware Success !!\n");
300 rtlhal->fw_ready = true;
301
302 /* 2. Re-Init the variables about Fw related setting. */
303 ppsc->fw_current_inpsmode = false;
304 rtlhal->fw_ps_state = FW_PS_STATE_ALL_ON_8821AE;
305 rtlhal->fw_clk_change_in_progress = false;
306 rtlhal->allow_sw_to_change_hwclc = false;
307 rtlhal->last_hmeboxnum = 0;
308}
309#endif
310
311static bool _rtl8821ae_check_fw_read_last_h2c(struct ieee80211_hw *hw,
312 u8 boxnum)
313{
314 struct rtl_priv *rtlpriv = rtl_priv(hw);
315 u8 val_hmetfr;
316 bool result = false;
317
318 val_hmetfr = rtl_read_byte(rtlpriv, REG_HMETFR);
319 if (((val_hmetfr >> boxnum) & BIT(0)) == 0)
320 result = true;
321 return result;
322}
323
324static void _rtl8821ae_fill_h2c_command(struct ieee80211_hw *hw,
325 u8 element_id, u32 cmd_len,
326 u8 *cmdbuffer)
327{
328 struct rtl_priv *rtlpriv = rtl_priv(hw);
329 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
330 u8 boxnum = 0;
331 u16 box_reg = 0, box_extreg = 0;
332 u8 u1b_tmp = 0;
333 bool isfw_read = false;
334 u8 buf_index = 0;
335 bool bwrite_sucess = false;
336 u8 wait_h2c_limmit = 100;
337 /*u8 wait_writeh2c_limmit = 100;*/
338 u8 boxcontent[4], boxextcontent[4];
339 u32 h2c_waitcounter = 0;
340 unsigned long flag = 0;
341 u8 idx = 0;
342
343 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "come in\n");
344
345 while (true) {
346 spin_lock_irqsave(&rtlpriv->locks.h2c_lock, flag);
347 if (rtlhal->h2c_setinprogress) {
348 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
349 "H2C set in progress! Wait to set..element_id(%d).\n",
350 element_id);
351
352 while (rtlhal->h2c_setinprogress) {
353 spin_unlock_irqrestore(&rtlpriv->locks.h2c_lock,
354 flag);
355 h2c_waitcounter++;
356 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
357 "Wait 100 us (%d times)...\n",
358 h2c_waitcounter);
359 udelay(100);
360
361 if (h2c_waitcounter > 1000)
362 return;
363 spin_lock_irqsave(&rtlpriv->locks.h2c_lock,
364 flag);
365 }
366 spin_unlock_irqrestore(&rtlpriv->locks.h2c_lock, flag);
367 } else {
368 rtlhal->h2c_setinprogress = true;
369 spin_unlock_irqrestore(&rtlpriv->locks.h2c_lock, flag);
370 break;
371 }
372 }
373
374 while (!bwrite_sucess) {
375 boxnum = rtlhal->last_hmeboxnum;
376 switch (boxnum) {
377 case 0:
378 box_reg = REG_HMEBOX_0;
379 box_extreg = REG_HMEBOX_EXT_0;
380 break;
381 case 1:
382 box_reg = REG_HMEBOX_1;
383 box_extreg = REG_HMEBOX_EXT_1;
384 break;
385 case 2:
386 box_reg = REG_HMEBOX_2;
387 box_extreg = REG_HMEBOX_EXT_2;
388 break;
389 case 3:
390 box_reg = REG_HMEBOX_3;
391 box_extreg = REG_HMEBOX_EXT_3;
392 break;
393 default:
394 RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
395 "switch case not process\n");
396 break;
397 }
398
399 isfw_read = false;
400 u1b_tmp = rtl_read_byte(rtlpriv, REG_CR);
401
402 if (u1b_tmp != 0xEA) {
403 isfw_read = true;
404 } else {
405 if (rtl_read_byte(rtlpriv, REG_TXDMA_STATUS) == 0xEA ||
406 rtl_read_byte(rtlpriv, REG_TXPKT_EMPTY) == 0xEA)
407 rtl_write_byte(rtlpriv, REG_SYS_CFG1 + 3, 0xFF);
408 }
409
410 if (isfw_read) {
411 wait_h2c_limmit = 100;
412 isfw_read =
413 _rtl8821ae_check_fw_read_last_h2c(hw, boxnum);
414 while (!isfw_read) {
415 /*wait until Fw read*/
416 wait_h2c_limmit--;
417 if (wait_h2c_limmit == 0) {
418 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
419 "Waiting too long for FW read clear HMEBox(%d)!\n",
420 boxnum);
421 break;
422 }
423
424 udelay(10);
425
426 isfw_read =
427 _rtl8821ae_check_fw_read_last_h2c(hw, boxnum);
428 u1b_tmp = rtl_read_byte(rtlpriv, 0x130);
429 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
430 "Waiting for FW read clear HMEBox(%d)!!! 0x130 = %2x\n",
431 boxnum, u1b_tmp);
432 }
433 }
434
435 if (!isfw_read) {
436 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
437 "Write H2C register BOX[%d] fail!!!!! Fw do not read.\n",
438 boxnum);
439 break;
440 }
441
442 memset(boxcontent, 0, sizeof(boxcontent));
443 memset(boxextcontent, 0, sizeof(boxextcontent));
444 boxcontent[0] = element_id;
445 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
446 "Write element_id box_reg(%4x) = %2x\n",
447 box_reg, element_id);
448
449 switch (cmd_len) {
450 case 1:
451 case 2:
452 case 3:
453 /*boxcontent[0] &= ~(BIT(7));*/
454 memcpy((u8 *)(boxcontent) + 1,
455 cmdbuffer + buf_index, cmd_len);
456
457 for (idx = 0; idx < 4; idx++) {
458 rtl_write_byte(rtlpriv, box_reg + idx,
459 boxcontent[idx]);
460 }
461 break;
462 case 4:
463 case 5:
464 case 6:
465 case 7:
466 /*boxcontent[0] |= (BIT(7));*/
467 memcpy((u8 *)(boxextcontent),
468 cmdbuffer + buf_index+3, cmd_len-3);
469 memcpy((u8 *)(boxcontent) + 1,
470 cmdbuffer + buf_index, 3);
471
472 for (idx = 0; idx < 4; idx++) {
473 rtl_write_byte(rtlpriv, box_extreg + idx,
474 boxextcontent[idx]);
475 }
476
477 for (idx = 0; idx < 4; idx++) {
478 rtl_write_byte(rtlpriv, box_reg + idx,
479 boxcontent[idx]);
480 }
481 break;
482 default:
483 RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
484 "switch case not process\n");
485 break;
486 }
487
488 bwrite_sucess = true;
489
490 rtlhal->last_hmeboxnum = boxnum + 1;
491 if (rtlhal->last_hmeboxnum == 4)
492 rtlhal->last_hmeboxnum = 0;
493
494 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
495 "pHalData->last_hmeboxnum = %d\n",
496 rtlhal->last_hmeboxnum);
497 }
498
499 spin_lock_irqsave(&rtlpriv->locks.h2c_lock, flag);
500 rtlhal->h2c_setinprogress = false;
501 spin_unlock_irqrestore(&rtlpriv->locks.h2c_lock, flag);
502
503 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "go out\n");
504}
505
506void rtl8821ae_fill_h2c_cmd(struct ieee80211_hw *hw,
507 u8 element_id, u32 cmd_len, u8 *cmdbuffer)
508{
509 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
510 u32 tmp_cmdbuf[2];
511
512 if (!rtlhal->fw_ready) {
513 RT_ASSERT(false,
514 "return H2C cmd because of Fw download fail!!!\n");
515 return;
516 }
517
518 memset(tmp_cmdbuf, 0, 8);
519 memcpy(tmp_cmdbuf, cmdbuffer, cmd_len);
520 _rtl8821ae_fill_h2c_command(hw, element_id, cmd_len, (u8 *)&tmp_cmdbuf);
521}
522
523void rtl8821ae_firmware_selfreset(struct ieee80211_hw *hw)
524{
525 struct rtl_priv *rtlpriv = rtl_priv(hw);
526 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
527 u8 u1b_tmp;
528
529 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
530 u1b_tmp = rtl_read_byte(rtlpriv, REG_RSV_CTRL+1);
531 rtl_write_byte(rtlpriv, REG_RSV_CTRL+1, (u1b_tmp & (~BIT(3))));
532 } else {
533 u1b_tmp = rtl_read_byte(rtlpriv, REG_RSV_CTRL+1);
534 rtl_write_byte(rtlpriv, REG_RSV_CTRL+1, (u1b_tmp & (~BIT(0))));
535 }
536
537 u1b_tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN+1);
538 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN+1, (u1b_tmp & (~BIT(2))));
539 udelay(50);
540
541 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
542 u1b_tmp = rtl_read_byte(rtlpriv, REG_RSV_CTRL+1);
543 rtl_write_byte(rtlpriv, REG_RSV_CTRL+1, (u1b_tmp | BIT(3)));
544 } else {
545 u1b_tmp = rtl_read_byte(rtlpriv, REG_RSV_CTRL+1);
546 rtl_write_byte(rtlpriv, REG_RSV_CTRL+1, (u1b_tmp | BIT(0)));
547 }
548
549 u1b_tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN+1);
550 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN+1, (u1b_tmp | BIT(2)));
551
552 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
553 "_8051Reset8812ae(): 8051 reset success .\n");
554}
555
556void rtl8821ae_set_fw_pwrmode_cmd(struct ieee80211_hw *hw, u8 mode)
557{
558 struct rtl_priv *rtlpriv = rtl_priv(hw);
559 u8 u1_h2c_set_pwrmode[H2C_8821AE_PWEMODE_LENGTH] = { 0 };
560 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
561 u8 rlbm, power_state = 0;
562
563 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, "FW LPS mode = %d\n", mode);
564
565 SET_H2CCMD_PWRMODE_PARM_MODE(u1_h2c_set_pwrmode, ((mode) ? 1 : 0));
566 rlbm = 0;/*YJ,temp,120316. FW now not support RLBM=2.*/
567 SET_H2CCMD_PWRMODE_PARM_RLBM(u1_h2c_set_pwrmode, rlbm);
568 SET_H2CCMD_PWRMODE_PARM_SMART_PS(u1_h2c_set_pwrmode,
569 (rtlpriv->mac80211.p2p) ?
570 ppsc->smart_ps : 1);
571 SET_H2CCMD_PWRMODE_PARM_AWAKE_INTERVAL(u1_h2c_set_pwrmode,
572 ppsc->reg_max_lps_awakeintvl);
573 SET_H2CCMD_PWRMODE_PARM_ALL_QUEUE_UAPSD(u1_h2c_set_pwrmode, 0);
574 if (mode == FW_PS_ACTIVE_MODE)
575 power_state |= FW_PWR_STATE_ACTIVE;
576 else
577 power_state |= FW_PWR_STATE_RF_OFF;
578
579 SET_H2CCMD_PWRMODE_PARM_PWR_STATE(u1_h2c_set_pwrmode, power_state);
580
581 RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG,
582 "rtl92c_set_fw_pwrmode(): u1_h2c_set_pwrmode\n",
583 u1_h2c_set_pwrmode, H2C_8821AE_PWEMODE_LENGTH);
584 rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_SETPWRMODE,
585 H2C_8821AE_PWEMODE_LENGTH,
586 u1_h2c_set_pwrmode);
587}
588
589void rtl8821ae_set_fw_media_status_rpt_cmd(struct ieee80211_hw *hw,
590 u8 mstatus)
591{
592 u8 parm[3] = { 0, 0, 0 };
593 /* parm[0]: bit0=0-->Disconnect, bit0=1-->Connect
594 * bit1=0-->update Media Status to MACID
595 * bit1=1-->update Media Status from MACID to MACID_End
596 * parm[1]: MACID, if this is INFRA_STA, MacID = 0
597 * parm[2]: MACID_End
598 */
599
600 SET_H2CCMD_MSRRPT_PARM_OPMODE(parm, mstatus);
601 SET_H2CCMD_MSRRPT_PARM_MACID_IND(parm, 0);
602
603 rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_MSRRPT, 3, parm);
604}
605
606void rtl8821ae_set_fw_ap_off_load_cmd(struct ieee80211_hw *hw,
607 u8 ap_offload_enable)
608{
609 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
610 u8 u1_apoffload_parm[H2C_8821AE_AP_OFFLOAD_LENGTH] = { 0 };
611
612 SET_H2CCMD_AP_OFFLOAD_ON(u1_apoffload_parm, ap_offload_enable);
613 SET_H2CCMD_AP_OFFLOAD_HIDDEN(u1_apoffload_parm, mac->hiddenssid);
614 SET_H2CCMD_AP_OFFLOAD_DENYANY(u1_apoffload_parm, 0);
615
616 rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_AP_OFFLOAD,
617 H2C_8821AE_AP_OFFLOAD_LENGTH,
618 u1_apoffload_parm);
619}
620
621void rtl8821ae_set_fw_wowlan_mode(struct ieee80211_hw *hw, bool func_en)
622{
623 struct rtl_priv *rtlpriv = rtl_priv(hw);
624 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
625 u8 fw_wowlan_info[H2C_8821AE_WOWLAN_LENGTH] = {0};
626
627 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, "enable(%d)\n", func_en);
628
629 SET_8812_H2CCMD_WOWLAN_FUNC_ENABLE(fw_wowlan_info,
630 (func_en ? true : false));
631
632 SET_8812_H2CCMD_WOWLAN_PATTERN_MATCH_ENABLE(fw_wowlan_info,
633 ((ppsc->wo_wlan_mode & WAKE_ON_PATTERN_MATCH) ? 1 : 0));
634 SET_8812_H2CCMD_WOWLAN_MAGIC_PKT_ENABLE(fw_wowlan_info,
635 ((ppsc->wo_wlan_mode & WAKE_ON_MAGIC_PACKET) ? 1 : 0));
636
637 SET_8812_H2CCMD_WOWLAN_UNICAST_PKT_ENABLE(fw_wowlan_info, 0);
638 SET_8812_H2CCMD_WOWLAN_ALL_PKT_DROP(fw_wowlan_info, false);
639 SET_8812_H2CCMD_WOWLAN_GPIO_ACTIVE(fw_wowlan_info, 0);
640 SET_8812_H2CCMD_WOWLAN_DISCONNECT_WAKE_UP(fw_wowlan_info, 1);
641 SET_8812_H2CCMD_WOWLAN_GPIONUM(fw_wowlan_info, 0);
642 SET_8812_H2CCMD_WOWLAN_GPIO_DURATION(fw_wowlan_info, 0);
643
644 RT_PRINT_DATA(rtlpriv, COMP_POWER, DBG_DMESG,
645 "wowlan mode: cmd 0x80: Content:\n",
646 fw_wowlan_info, H2C_8821AE_WOWLAN_LENGTH);
647
648 rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_WO_WLAN,
649 H2C_8821AE_WOWLAN_LENGTH,
650 fw_wowlan_info);
651}
652
653void rtl8821ae_set_fw_remote_wake_ctrl_cmd(struct ieee80211_hw *hw,
654 u8 enable)
655{
656 struct rtl_priv *rtlpriv = rtl_priv(hw);
657 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
658 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
659 u8 remote_wake_ctrl_parm[H2C_8821AE_REMOTE_WAKE_CTRL_LEN] = {0};
660
661 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
662 "enable=%d, ARP offload=%d, GTK offload=%d\n",
663 enable, ppsc->arp_offload_enable, ppsc->gtk_offload_enable);
664
665 SET_8812_H2CCMD_REMOTE_WAKECTRL_ENABLE(remote_wake_ctrl_parm, enable);
666 SET_8812_H2CCMD_REMOTE_WAKE_CTRL_ARP_OFFLOAD_EN(remote_wake_ctrl_parm,
667 (ppsc->arp_offload_enable ? 1 : 0));
668 SET_8812_H2CCMD_REMOTE_WAKE_CTRL_GTK_OFFLOAD_EN(remote_wake_ctrl_parm,
669 (ppsc->gtk_offload_enable ? 1 : 0));
670 SET_8812_H2CCMD_REMOTE_WAKE_CTRL_REALWOWV2_EN(remote_wake_ctrl_parm,
671 (rtlhal->real_wow_v2_enable ? 1 : 0));
672
673 RT_PRINT_DATA(rtlpriv, COMP_POWER, DBG_TRACE,
674 "remote_wake_ctrl: cmd 0x4: Content:\n",
675 remote_wake_ctrl_parm, H2C_8821AE_REMOTE_WAKE_CTRL_LEN);
676
677 rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_REMOTE_WAKE_CTRL,
678 H2C_8821AE_REMOTE_WAKE_CTRL_LEN,
679 remote_wake_ctrl_parm);
680}
681
682void rtl8821ae_set_fw_keep_alive_cmd(struct ieee80211_hw *hw,
683 bool func_en)
684{
685 struct rtl_priv *rtlpriv = rtl_priv(hw);
686 u8 keep_alive_info[H2C_8821AE_KEEP_ALIVE_CTRL_LENGTH] = {0};
687
688 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, "Enable(%d)\n", func_en);
689
690 SET_8812_H2CCMD_KEEP_ALIVE_ENABLE(keep_alive_info, func_en);
691 /* 1: the period is controled by driver, 0: by Fw default */
692 SET_8812_H2CCMD_KEEP_ALIVE_ACCPEPT_USER_DEFINED(keep_alive_info, 1);
693 SET_8812_H2CCMD_KEEP_ALIVE_PERIOD(keep_alive_info, 10); /* 10 sec */
694
695 RT_PRINT_DATA(rtlpriv, COMP_POWER, DBG_TRACE,
696 "keep alive: cmd 0x3: Content:\n",
697 keep_alive_info, H2C_8821AE_KEEP_ALIVE_CTRL);
698 rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_KEEP_ALIVE_CTRL,
699 H2C_8821AE_KEEP_ALIVE_CTRL_LENGTH,
700 keep_alive_info);
701}
702
703void rtl8821ae_set_fw_disconnect_decision_ctrl_cmd(struct ieee80211_hw *hw,
704 bool enabled)
705{
706 struct rtl_priv *rtlpriv = rtl_priv(hw);
707 u8 parm[H2C_8821AE_DISCONNECT_DECISION_CTRL_LEN] = {0};
708
709 SET_8812_H2CCMD_DISCONNECT_DECISION_CTRL_ENABLE(parm, enabled);
710 SET_8812_H2CCMD_DISCONNECT_DECISION_CTRL_USER_SETTING(parm, 1);
711 SET_8812_H2CCMD_DISCONNECT_DECISION_CTRL_CHECK_PERIOD(parm, 30);
712 SET_8812_H2CCMD_DISCONNECT_DECISION_CTRL_TRYPKT_NUM(parm, 3);
713
714 RT_PRINT_DATA(rtlpriv, COMP_POWER, DBG_TRACE,
715 "disconnect_decision_ctrl: cmd 0x4: Content:\n",
716 parm, H2C_8821AE_DISCONNECT_DECISION_CTRL_LEN);
717 rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_DISCONNECT_DECISION,
718 H2C_8821AE_DISCONNECT_DECISION_CTRL_LEN, parm);
719}
720
721void rtl8821ae_set_fw_global_info_cmd(struct ieee80211_hw *hw)
722{
723 struct rtl_priv *rtlpriv = rtl_priv(hw);
724 struct rtl_security *sec = &rtlpriv->sec;
725 u8 remote_wakeup_sec_info[H2C_8821AE_AOAC_GLOBAL_INFO_LEN] = {0};
726
727 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
728 "PairwiseEncAlgorithm=%d, GroupEncAlgorithm=%d\n",
729 sec->pairwise_enc_algorithm, sec->group_enc_algorithm);
730
731 SET_8812_H2CCMD_AOAC_GLOBAL_INFO_PAIRWISE_ENC_ALG(
732 remote_wakeup_sec_info,
733 sec->pairwise_enc_algorithm);
734 SET_8812_H2CCMD_AOAC_GLOBAL_INFO_GROUP_ENC_ALG(remote_wakeup_sec_info,
735 sec->group_enc_algorithm);
736
737 rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_AOAC_GLOBAL_INFO,
738 H2C_8821AE_AOAC_GLOBAL_INFO_LEN,
739 remote_wakeup_sec_info);
740
741 RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_TRACE,
742 "rtl8821ae_set_global_info: cmd 0x82:\n",
743 remote_wakeup_sec_info, H2C_8821AE_AOAC_GLOBAL_INFO_LEN);
744}
745
746#define BEACON_PG 0
747#define PSPOLL_PG 1
748#define NULL_PG 2
749#define QOSNULL_PG 3
750#define ARPRESP_PG 4
751#define REMOTE_PG 5
752#define GTKEXT_PG 6
753
754#define TOTAL_RESERVED_PKT_LEN_8812 3584
755#define TOTAL_RESERVED_PKT_LEN_8821 1792
756
757static u8 reserved_page_packet_8821[TOTAL_RESERVED_PKT_LEN_8821] = {
758 /* page 0: beacon */
759 0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
760 0xff, 0xff, 0x00, 0xe0, 0x4c, 0x02, 0xe2, 0x64,
761 0x40, 0x16, 0x9f, 0x23, 0xd4, 0x46, 0x20, 0x00,
762 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
763 0x64, 0x00, 0x20, 0x04, 0x00, 0x06, 0x64, 0x6c,
764 0x69, 0x6e, 0x6b, 0x31, 0x01, 0x08, 0x82, 0x84,
765 0x8b, 0x96, 0x0c, 0x18, 0x30, 0x48, 0x03, 0x01,
766 0x0b, 0x06, 0x02, 0x00, 0x00, 0x2a, 0x01, 0x8b,
767 0x32, 0x04, 0x12, 0x24, 0x60, 0x6c, 0x00, 0x00,
768 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
769 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
770 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
771 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
772 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
773 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
774 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
775 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
776 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
777 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
778 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
779 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
780 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
781 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
782 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
783 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
784 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
785 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
786 0x10, 0x00, 0x28, 0x8c, 0x00, 0x12, 0x00, 0x00,
787 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x00,
788 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
789 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
790 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
791 /* page 1: ps-poll */
792 0xa4, 0x10, 0x01, 0xc0, 0x40, 0x16, 0x9f, 0x23,
793 0xd4, 0x46, 0x00, 0xe0, 0x4c, 0x02, 0xe2, 0x64,
794 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
795 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
796 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
797 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
798 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
799 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
800 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
801 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
802 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
803 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
804 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
805 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
806 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
807 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
808 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
809 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
810 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
811 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
812 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
813 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
814 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
815 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
816 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
817 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
818 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
819 0x18, 0x00, 0x28, 0x8c, 0x00, 0x12, 0x00, 0x00,
820 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
821 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
822 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
823 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
824 /* page 2: null data */
825 0x48, 0x01, 0x00, 0x00, 0x40, 0x16, 0x9f, 0x23,
826 0xd4, 0x46, 0x00, 0xe0, 0x4c, 0x02, 0xe2, 0x64,
827 0x40, 0x16, 0x9f, 0x23, 0xd4, 0x46, 0x00, 0x00,
828 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
829 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
830 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
831 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
832 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
833 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
834 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
835 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
836 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
837 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
838 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
839 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
840 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
841 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
842 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
843 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
844 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
845 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
846 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
847 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
848 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
849 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
850 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
851 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
852 0x1A, 0x00, 0x28, 0x8C, 0x00, 0x12, 0x00, 0x00,
853 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
854 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
855 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
856 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
857 /* page 3: qos null data */
858 0xC8, 0x01, 0x00, 0x00, 0x84, 0xC9, 0xB2, 0xA7,
859 0xB3, 0x6E, 0x00, 0xE0, 0x4C, 0x02, 0x51, 0x02,
860 0x84, 0xC9, 0xB2, 0xA7, 0xB3, 0x6E, 0x00, 0x00,
861 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
862 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
863 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
864 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
865 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
866 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
867 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
868 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
869 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
870 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
871 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
872 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
873 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
874 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
875 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
876 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
877 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
878 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
879 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
880 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
881 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
882 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
883 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
884 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
885 0x3C, 0x00, 0x28, 0x8C, 0x00, 0x12, 0x00, 0x00,
886 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
887 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
888 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
889 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
890 /* page 4~6 is for wowlan */
891 /* page 4: ARP resp */
892 0x08, 0x01, 0x00, 0x00, 0x84, 0xC9, 0xB2, 0xA7,
893 0xB3, 0x6E, 0x00, 0xE0, 0x4C, 0x02, 0x51, 0x02,
894 0x84, 0xC9, 0xB2, 0xA7, 0xB3, 0x6E, 0x00, 0x00,
895 0xAA, 0xAA, 0x03, 0x00, 0x00, 0x00, 0x08, 0x06,
896 0x00, 0x01, 0x08, 0x00, 0x06, 0x04, 0x00, 0x02,
897 0x00, 0xE0, 0x4C, 0x02, 0x51, 0x02, 0x00, 0x00,
898 0x00, 0x00, 0x00, 0xE0, 0x4C, 0x02, 0x51, 0x02,
899 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
900 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
901 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
902 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
903 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
904 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
905 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
906 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
907 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
908 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
909 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
910 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
911 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
912 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
913 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
914 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
915 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
916 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
917 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
918 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
919 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
920 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
921 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
922 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
923 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
924 /* page 5: H2C_REMOTE_WAKE_CTRL_INFO */
925 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
926 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
927 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
928 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
929 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
930 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
931 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
932 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
933 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
934 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
935 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
936 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
937 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
938 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
939 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
940 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
941 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
942 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
943 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
944 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
945 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
946 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
947 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
948 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
949 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
950 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
951 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
952 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
953 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
954 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
955 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
956 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
957 /* page 6: Rsvd GTK extend memory (zero memory) */
958 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
959 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
960 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
961 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
962 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
963 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
964 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
965 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
966 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
967 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
968 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
969 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
970 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
971 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
972 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
973 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
974 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
975 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
976 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
977 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
978 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
979 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
980 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
981 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
982 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
983 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
984 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
985 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
986 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
987 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
988 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
989 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
990};
991
992static u8 reserved_page_packet_8812[TOTAL_RESERVED_PKT_LEN_8812] = {
993 /* page 0: beacon */
994 0x80, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
995 0xFF, 0xFF, 0x00, 0xE0, 0x4C, 0x02, 0x51, 0x02,
996 0x84, 0xC9, 0xB2, 0xA7, 0xB3, 0x6E, 0x60, 0x00,
997 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
998 0x64, 0x00, 0x20, 0x04, 0x00, 0x03, 0x32, 0x31,
999 0x35, 0x01, 0x08, 0x82, 0x84, 0x8B, 0x96, 0x0C,
1000 0x12, 0x18, 0x24, 0x03, 0x01, 0x01, 0x06, 0x02,
1001 0x00, 0x00, 0x2A, 0x01, 0x02, 0x32, 0x04, 0x30,
1002 0x48, 0x60, 0x6C, 0x2D, 0x1A, 0xED, 0x09, 0x03,
1003 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1004 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1005 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D,
1006 0x00, 0xDD, 0x07, 0x00, 0xE0, 0x4C, 0x02, 0x02,
1007 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1008 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1009 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1010 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1011 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1012 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1013 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1014 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1015 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1016 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1017 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1018 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1019 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1020 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1021 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1022 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1023 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1024 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1025 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1026 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1027 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1028 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1029 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1030 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1031 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1032 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1033 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1034 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1035 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1036 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1037 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1038 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1039 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1040 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1041 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1042 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1043 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1044 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1045 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1046 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1047 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1048 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1049 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1050 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1051 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1052 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1053 0x10, 0x00, 0x28, 0x8C, 0x00, 0x12, 0x00, 0x00,
1054 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x00,
1055 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1056 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1057 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1058 /* page 1: ps-poll */
1059 0xA4, 0x10, 0x09, 0xC0, 0x84, 0xC9, 0xB2, 0xA7,
1060 0xB3, 0x6E, 0x00, 0xE0, 0x4C, 0x02, 0x51, 0x02,
1061 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1062 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1063 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1064 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1065 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1066 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1067 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1068 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1069 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1070 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1071 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1072 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1073 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1074 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1075 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1076 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1077 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1078 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1079 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1080 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1081 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1082 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1083 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1084 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1085 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1086 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1087 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1088 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1089 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1090 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1091 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1092 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1093 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1094 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1095 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1096 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1097 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1098 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1099 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1100 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1101 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1102 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1103 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1104 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1105 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1106 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1107 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1108 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1109 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1110 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1111 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1112 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1113 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1114 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1115 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1116 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1117 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1118 0x18, 0x00, 0x28, 0x8C, 0x00, 0x12, 0x00, 0x00,
1119 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
1120 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1121 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1122 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1123 /* page 2: null data */
1124 0x48, 0x01, 0x00, 0x00, 0x84, 0xC9, 0xB2, 0xA7,
1125 0xB3, 0x6E, 0x00, 0xE0, 0x4C, 0x02, 0x51, 0x02,
1126 0x84, 0xC9, 0xB2, 0xA7, 0xB3, 0x6E, 0x00, 0x00,
1127 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1128 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1129 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1130 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1131 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1132 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1133 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1134 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1135 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1136 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1137 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1138 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1139 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1140 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1141 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1142 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1143 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1144 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1145 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1146 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1147 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1148 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1149 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1150 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1151 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1152 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1153 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1154 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1155 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1156 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1157 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1158 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1159 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1160 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1161 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1162 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1163 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1164 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1165 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1166 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1167 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1168 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1169 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1170 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1171 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1172 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1173 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1174 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1175 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1176 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1177 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1178 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1179 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1180 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1181 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1182 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1183 0x1A, 0x00, 0x28, 0x8C, 0x00, 0x12, 0x00, 0x00,
1184 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
1185 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1186 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1187 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1188 /* page 3: Qos null data */
1189 0xC8, 0x01, 0x00, 0x00, 0x84, 0xC9, 0xB2, 0xA7,
1190 0xB3, 0x6E, 0x00, 0xE0, 0x4C, 0x02, 0x51, 0x02,
1191 0x84, 0xC9, 0xB2, 0xA7, 0xB3, 0x6E, 0x00, 0x00,
1192 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1193 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1194 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1195 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1196 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1197 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1198 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1199 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1200 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1201 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1202 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1203 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1204 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1205 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1206 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1207 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1208 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1209 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1210 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1211 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1212 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1213 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1214 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1215 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1216 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1217 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1218 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1219 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1220 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1221 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1222 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1223 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1224 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1225 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1226 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1227 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1228 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1229 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1230 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1231 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1232 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1233 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1234 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1235 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1236 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1237 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1238 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1239 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1240 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1241 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1242 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1243 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1244 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1245 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1246 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1247 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1248 0x3C, 0x00, 0x28, 0x8C, 0x00, 0x12, 0x00, 0x00,
1249 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
1250 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1251 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1252 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1253 /* page 4~6 is for wowlan */
1254 /* page 4: ARP resp */
1255 0x08, 0x01, 0x00, 0x00, 0x84, 0xC9, 0xB2, 0xA7,
1256 0xB3, 0x6E, 0x00, 0xE0, 0x4C, 0x02, 0x51, 0x02,
1257 0x84, 0xC9, 0xB2, 0xA7, 0xB3, 0x6E, 0x00, 0x00,
1258 0xAA, 0xAA, 0x03, 0x00, 0x00, 0x00, 0x08, 0x06,
1259 0x00, 0x01, 0x08, 0x00, 0x06, 0x04, 0x00, 0x02,
1260 0x00, 0xE0, 0x4C, 0x02, 0x51, 0x02, 0x00, 0x00,
1261 0x00, 0x00, 0x00, 0xE0, 0x4C, 0x02, 0x51, 0x02,
1262 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1263 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1264 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1265 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1266 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1267 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1268 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1269 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1270 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1271 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1272 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1273 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1274 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1275 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1276 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1277 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1278 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1279 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1280 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1281 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1282 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1283 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1284 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1285 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1286 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1287 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1288 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1289 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1290 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1291 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1292 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1293 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1294 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1295 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1296 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1297 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1298 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1299 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1300 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1301 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1302 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1303 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1304 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1305 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1306 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1307 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1308 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1309 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1310 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1311 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1312 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1313 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1314 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1315 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1316 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1317 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1318 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1319 /* page 5: H2C_REMOTE_WAKE_CTRL_INFO */
1320 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1321 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1322 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1323 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1324 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1325 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1326 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1327 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1328 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1329 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1330 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1331 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1332 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1333 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1334 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1335 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1336 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1337 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1338 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1339 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1340 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1341 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1342 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1343 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1344 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1345 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1346 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1347 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1348 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1349 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1350 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1351 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1352 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1353 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1354 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1355 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1356 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1357 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1358 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1359 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1360 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1361 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1362 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1363 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1364 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1365 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1366 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1367 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1368 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1369 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1370 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1371 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1372 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1373 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1374 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1375 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1376 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1377 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1378 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1379 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1380 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1381 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1382 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1383 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1384 /* page 6: Rsvd GTK extend memory (zero memory) */
1385 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1386 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1387 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1388 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1389 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1390 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1391 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1392 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1393 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1394 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1395 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1396 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1397 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1398 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1399 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1400 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1401 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1402 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1403 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1404 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1405 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1406 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1407 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1408 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1409 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1410 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1411 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1412 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1413 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1414 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1415 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1416 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1417 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1418 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1419 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1420 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1421 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1422 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1423 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1424 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1425 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1426 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1427 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1428 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1429 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1430 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1431 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1432 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1433 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1434 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1435 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1436 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1437 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1438 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1439 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1440 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1441 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1442 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1443 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1444 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1445 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1446 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1447 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1448 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1449};
1450
1451void rtl8812ae_set_fw_rsvdpagepkt(struct ieee80211_hw *hw,
1452 bool b_dl_finished, bool dl_whole_packets)
1453{
1454 struct rtl_priv *rtlpriv = rtl_priv(hw);
1455 struct rtl_mac *mac = rtl_mac(rtlpriv);
1456 struct sk_buff *skb = NULL;
1457 u32 totalpacketlen;
1458 bool rtstatus;
1459 u8 u1RsvdPageLoc[5] = { 0 };
1460 u8 u1RsvdPageLoc2[7] = { 0 };
1461 bool b_dlok = false;
1462 u8 *beacon;
1463 u8 *p_pspoll;
1464 u8 *nullfunc;
1465 u8 *qosnull;
1466 u8 *arpresp;
1467
1468 /*---------------------------------------------------------
1469 * (1) beacon
1470 *---------------------------------------------------------
1471 */
1472 beacon = &reserved_page_packet_8812[BEACON_PG * 512];
1473 SET_80211_HDR_ADDRESS2(beacon, mac->mac_addr);
1474 SET_80211_HDR_ADDRESS3(beacon, mac->bssid);
1475
1476 if (b_dl_finished) {
1477 totalpacketlen = 512 - 40;
1478 goto out;
1479 }
1480 /*-------------------------------------------------------
1481 * (2) ps-poll
1482 *--------------------------------------------------------
1483 */
1484 p_pspoll = &reserved_page_packet_8812[PSPOLL_PG * 512];
1485 SET_80211_PS_POLL_AID(p_pspoll, (mac->assoc_id | 0xc000));
1486 SET_80211_PS_POLL_BSSID(p_pspoll, mac->bssid);
1487 SET_80211_PS_POLL_TA(p_pspoll, mac->mac_addr);
1488
1489 SET_H2CCMD_RSVDPAGE_LOC_PSPOLL(u1RsvdPageLoc, PSPOLL_PG);
1490
1491 /*--------------------------------------------------------
1492 * (3) null data
1493 *---------------------------------------------------------
1494 */
1495 nullfunc = &reserved_page_packet_8812[NULL_PG * 512];
1496 SET_80211_HDR_ADDRESS1(nullfunc, mac->bssid);
1497 SET_80211_HDR_ADDRESS2(nullfunc, mac->mac_addr);
1498 SET_80211_HDR_ADDRESS3(nullfunc, mac->bssid);
1499
1500 SET_H2CCMD_RSVDPAGE_LOC_NULL_DATA(u1RsvdPageLoc, NULL_PG);
1501
1502 /*---------------------------------------------------------
1503 * (4) Qos null data
1504 *----------------------------------------------------------
1505 */
1506 qosnull = &reserved_page_packet_8812[QOSNULL_PG * 512];
1507 SET_80211_HDR_ADDRESS1(qosnull, mac->bssid);
1508 SET_80211_HDR_ADDRESS2(qosnull, mac->mac_addr);
1509 SET_80211_HDR_ADDRESS3(qosnull, mac->bssid);
1510
1511 SET_H2CCMD_RSVDPAGE_LOC_QOS_NULL_DATA(u1RsvdPageLoc, QOSNULL_PG);
1512
1513 if (!dl_whole_packets) {
1514 totalpacketlen = 512 * (QOSNULL_PG + 1) - 40;
1515 goto out;
1516 }
1517 /*---------------------------------------------------------
1518 * (5) ARP Resp
1519 *----------------------------------------------------------
1520 */
1521 arpresp = &reserved_page_packet_8812[ARPRESP_PG * 512];
1522 SET_80211_HDR_ADDRESS1(arpresp, mac->bssid);
1523 SET_80211_HDR_ADDRESS2(arpresp, mac->mac_addr);
1524 SET_80211_HDR_ADDRESS3(arpresp, mac->bssid);
1525
1526 SET_8821AE_H2CCMD_AOAC_RSVDPAGE_LOC_ARP_RSP(u1RsvdPageLoc2, ARPRESP_PG);
1527
1528 /*---------------------------------------------------------
1529 * (6) Remote Wake Ctrl
1530 *----------------------------------------------------------
1531 */
1532 SET_8821AE_H2CCMD_AOAC_RSVDPAGE_LOC_REMOTE_WAKE_CTRL_INFO(u1RsvdPageLoc2,
1533 REMOTE_PG);
1534
1535 /*---------------------------------------------------------
1536 * (7) GTK Ext Memory
1537 *----------------------------------------------------------
1538 */
1539 SET_8821AE_H2CCMD_AOAC_RSVDPAGE_LOC_GTK_EXT_MEM(u1RsvdPageLoc2, GTKEXT_PG);
1540
1541 totalpacketlen = TOTAL_RESERVED_PKT_LEN_8812 - 40;
1542
1543out:
1544 RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_LOUD,
1545 "rtl8812ae_set_fw_rsvdpagepkt(): packet data\n",
1546 &reserved_page_packet_8812[0], totalpacketlen);
1547
1548 skb = dev_alloc_skb(totalpacketlen);
1549 memcpy((u8 *)skb_put(skb, totalpacketlen),
1550 &reserved_page_packet_8812, totalpacketlen);
1551
1552 rtstatus = rtl_cmd_send_packet(hw, skb);
1553
1554 if (rtstatus)
1555 b_dlok = true;
1556
1557 if (!b_dl_finished && b_dlok) {
1558 RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG,
1559 "H2C_RSVDPAGE:\n", u1RsvdPageLoc, 5);
1560 rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_RSVDPAGE,
1561 sizeof(u1RsvdPageLoc), u1RsvdPageLoc);
1562 if (dl_whole_packets) {
1563 RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG,
1564 "wowlan H2C_RSVDPAGE:\n", u1RsvdPageLoc2, 7);
1565 rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_AOAC_RSVDPAGE,
1566 sizeof(u1RsvdPageLoc2), u1RsvdPageLoc2);
1567 }
1568 }
1569
1570 if (!b_dlok)
1571 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
1572 "Set RSVD page location to Fw FAIL!!!!!!.\n");
1573}
1574
1575void rtl8821ae_set_fw_rsvdpagepkt(struct ieee80211_hw *hw,
1576 bool b_dl_finished, bool dl_whole_packets)
1577{
1578 struct rtl_priv *rtlpriv = rtl_priv(hw);
1579 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
1580 struct sk_buff *skb = NULL;
1581 u32 totalpacketlen;
1582 bool rtstatus;
1583 u8 u1RsvdPageLoc[5] = { 0 };
1584 u8 u1RsvdPageLoc2[7] = { 0 };
1585 bool b_dlok = false;
1586 u8 *beacon;
1587 u8 *p_pspoll;
1588 u8 *nullfunc;
1589 u8 *qosnull;
1590 u8 *arpresp;
1591
1592 /*---------------------------------------------------------
1593 * (1) beacon
1594 *---------------------------------------------------------
1595 */
1596 beacon = &reserved_page_packet_8821[BEACON_PG * 256];
1597 SET_80211_HDR_ADDRESS2(beacon, mac->mac_addr);
1598 SET_80211_HDR_ADDRESS3(beacon, mac->bssid);
1599
1600 if (b_dl_finished) {
1601 totalpacketlen = 256 - 40;
1602 goto out;
1603 }
1604 /*-------------------------------------------------------
1605 * (2) ps-poll
1606 *--------------------------------------------------------
1607 */
1608 p_pspoll = &reserved_page_packet_8821[PSPOLL_PG * 256];
1609 SET_80211_PS_POLL_AID(p_pspoll, (mac->assoc_id | 0xc000));
1610 SET_80211_PS_POLL_BSSID(p_pspoll, mac->bssid);
1611 SET_80211_PS_POLL_TA(p_pspoll, mac->mac_addr);
1612
1613 SET_H2CCMD_RSVDPAGE_LOC_PSPOLL(u1RsvdPageLoc, PSPOLL_PG);
1614
1615 /*--------------------------------------------------------
1616 * (3) null data
1617 *---------------------------------------------------------i
1618 */
1619 nullfunc = &reserved_page_packet_8821[NULL_PG * 256];
1620 SET_80211_HDR_ADDRESS1(nullfunc, mac->bssid);
1621 SET_80211_HDR_ADDRESS2(nullfunc, mac->mac_addr);
1622 SET_80211_HDR_ADDRESS3(nullfunc, mac->bssid);
1623
1624 SET_H2CCMD_RSVDPAGE_LOC_NULL_DATA(u1RsvdPageLoc, NULL_PG);
1625
1626 /*---------------------------------------------------------
1627 * (4) Qos null data
1628 *----------------------------------------------------------
1629 */
1630 qosnull = &reserved_page_packet_8821[QOSNULL_PG * 256];
1631 SET_80211_HDR_ADDRESS1(qosnull, mac->bssid);
1632 SET_80211_HDR_ADDRESS2(qosnull, mac->mac_addr);
1633 SET_80211_HDR_ADDRESS3(qosnull, mac->bssid);
1634
1635 SET_H2CCMD_RSVDPAGE_LOC_QOS_NULL_DATA(u1RsvdPageLoc, QOSNULL_PG);
1636
1637 if (!dl_whole_packets) {
1638 totalpacketlen = 256 * (QOSNULL_PG + 1) - 40;
1639 goto out;
1640 }
1641 /*---------------------------------------------------------
1642 * (5) ARP Resp
1643 *----------------------------------------------------------
1644 */
1645 arpresp = &reserved_page_packet_8821[ARPRESP_PG * 256];
1646 SET_80211_HDR_ADDRESS1(arpresp, mac->bssid);
1647 SET_80211_HDR_ADDRESS2(arpresp, mac->mac_addr);
1648 SET_80211_HDR_ADDRESS3(arpresp, mac->bssid);
1649
1650 SET_8821AE_H2CCMD_AOAC_RSVDPAGE_LOC_ARP_RSP(u1RsvdPageLoc2, ARPRESP_PG);
1651
1652 /*---------------------------------------------------------
1653 * (6) Remote Wake Ctrl
1654 *----------------------------------------------------------
1655 */
1656 SET_8821AE_H2CCMD_AOAC_RSVDPAGE_LOC_REMOTE_WAKE_CTRL_INFO(u1RsvdPageLoc2,
1657 REMOTE_PG);
1658
1659 /*---------------------------------------------------------
1660 * (7) GTK Ext Memory
1661 *----------------------------------------------------------
1662 */
1663 SET_8821AE_H2CCMD_AOAC_RSVDPAGE_LOC_GTK_EXT_MEM(u1RsvdPageLoc2, GTKEXT_PG);
1664
1665 totalpacketlen = TOTAL_RESERVED_PKT_LEN_8821 - 40;
1666
1667out:
1668
1669 RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_LOUD,
1670 "rtl8821ae_set_fw_rsvdpagepkt(): packet data\n",
1671 &reserved_page_packet_8821[0], totalpacketlen);
1672
1673 skb = dev_alloc_skb(totalpacketlen);
1674 memcpy((u8 *)skb_put(skb, totalpacketlen),
1675 &reserved_page_packet_8821, totalpacketlen);
1676
1677 rtstatus = rtl_cmd_send_packet(hw, skb);
1678
1679 if (rtstatus)
1680 b_dlok = true;
1681
1682 if (!b_dl_finished && b_dlok) {
1683 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
1684 "Set RSVD page location to Fw.\n");
1685 RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG,
1686 "H2C_RSVDPAGE:\n", u1RsvdPageLoc, 5);
1687 rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_RSVDPAGE,
1688 sizeof(u1RsvdPageLoc), u1RsvdPageLoc);
1689 if (dl_whole_packets) {
1690 RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG,
1691 "wowlan H2C_RSVDPAGE:\n",
1692 u1RsvdPageLoc2, 7);
1693 rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_AOAC_RSVDPAGE,
1694 sizeof(u1RsvdPageLoc2),
1695 u1RsvdPageLoc2);
1696 }
1697 }
1698
1699 if (!b_dlok) {
1700 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
1701 "Set RSVD page location to Fw FAIL!!!!!!.\n");
1702 }
1703}
1704
1705/*Should check FW support p2p or not.*/
1706static void rtl8821ae_set_p2p_ctw_period_cmd(struct ieee80211_hw *hw, u8 ctwindow)
1707{
1708 u8 u1_ctwindow_period[1] = { ctwindow};
1709
1710 rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_P2P_PS_CTW_CMD, 1,
1711 u1_ctwindow_period);
1712}
1713
1714void rtl8821ae_set_p2p_ps_offload_cmd(struct ieee80211_hw *hw, u8 p2p_ps_state)
1715{
1716 struct rtl_priv *rtlpriv = rtl_priv(hw);
1717 struct rtl_ps_ctl *rtlps = rtl_psc(rtl_priv(hw));
1718 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1719 struct rtl_p2p_ps_info *p2pinfo = &rtlps->p2p_ps_info;
1720 struct p2p_ps_offload_t *p2p_ps_offload = &rtlhal->p2p_ps_offload;
1721 u8 i;
1722 u16 ctwindow;
1723 u32 start_time, tsf_low;
1724
1725 switch (p2p_ps_state) {
1726 case P2P_PS_DISABLE:
1727 RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "P2P_PS_DISABLE\n");
1728 memset(p2p_ps_offload, 0, sizeof(*p2p_ps_offload));
1729 break;
1730 case P2P_PS_ENABLE:
1731 RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "P2P_PS_ENABLE\n");
1732 /* update CTWindow value. */
1733 if (p2pinfo->ctwindow > 0) {
1734 p2p_ps_offload->ctwindow_en = 1;
1735 ctwindow = p2pinfo->ctwindow;
1736 rtl8821ae_set_p2p_ctw_period_cmd(hw, ctwindow);
1737 }
1738
1739 /* hw only support 2 set of NoA */
1740 for (i = 0 ; i < p2pinfo->noa_num ; i++) {
1741 /* To control the register setting for which NOA*/
1742 rtl_write_byte(rtlpriv, 0x5cf, (i << 4));
1743 if (i == 0)
1744 p2p_ps_offload->noa0_en = 1;
1745 else
1746 p2p_ps_offload->noa1_en = 1;
1747
1748 /* config P2P NoA Descriptor Register */
1749 rtl_write_dword(rtlpriv, 0x5E0, p2pinfo->noa_duration[i]);
1750 rtl_write_dword(rtlpriv, 0x5E4, p2pinfo->noa_interval[i]);
1751
1752 /*Get Current TSF value */
1753 tsf_low = rtl_read_dword(rtlpriv, REG_TSFTR);
1754
1755 start_time = p2pinfo->noa_start_time[i];
1756 if (p2pinfo->noa_count_type[i] != 1) {
1757 while (start_time <= (tsf_low+(50*1024))) {
1758 start_time += p2pinfo->noa_interval[i];
1759 if (p2pinfo->noa_count_type[i] != 255)
1760 p2pinfo->noa_count_type[i]--;
1761 }
1762 }
1763 rtl_write_dword(rtlpriv, 0x5E8, start_time);
1764 rtl_write_dword(rtlpriv, 0x5EC,
1765 p2pinfo->noa_count_type[i]);
1766 }
1767
1768 if ((p2pinfo->opp_ps == 1) || (p2pinfo->noa_num > 0)) {
1769 /* rst p2p circuit */
1770 rtl_write_byte(rtlpriv, REG_DUAL_TSF_RST, BIT(4));
1771
1772 p2p_ps_offload->offload_en = 1;
1773
1774 if (P2P_ROLE_GO == rtlpriv->mac80211.p2p) {
1775 p2p_ps_offload->role = 1;
1776 p2p_ps_offload->allstasleep = 0;
1777 } else {
1778 p2p_ps_offload->role = 0;
1779 }
1780
1781 p2p_ps_offload->discovery = 0;
1782 }
1783 break;
1784 case P2P_PS_SCAN:
1785 RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "P2P_PS_SCAN\n");
1786 p2p_ps_offload->discovery = 1;
1787 break;
1788 case P2P_PS_SCAN_DONE:
1789 RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "P2P_PS_SCAN_DONE\n");
1790 p2p_ps_offload->discovery = 0;
1791 p2pinfo->p2p_ps_state = P2P_PS_ENABLE;
1792 break;
1793 default:
1794 break;
1795 }
1796
1797 rtl8821ae_fill_h2c_cmd(hw,
1798 H2C_8821AE_P2P_PS_OFFLOAD, 1, (u8 *)p2p_ps_offload);
1799}
1800
1801static void rtl8821ae_c2h_ra_report_handler(struct ieee80211_hw *hw,
1802 u8 *cmd_buf, u8 cmd_len)
1803{
1804 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1805 u8 rate = cmd_buf[0] & 0x3F;
1806
1807 rtlhal->current_ra_rate = rtl8821ae_hw_rate_to_mrate(hw, rate);
1808
1809 rtl8821ae_dm_update_init_rate(hw, rate);
1810}
1811
1812static void _rtl8821ae_c2h_content_parsing(struct ieee80211_hw *hw,
1813 u8 c2h_cmd_id, u8 c2h_cmd_len,
1814 u8 *tmp_buf)
1815{
1816 struct rtl_priv *rtlpriv = rtl_priv(hw);
1817
1818 switch (c2h_cmd_id) {
1819 case C2H_8812_DBG:
1820 RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "[C2H], C2H_8812_DBG!!\n");
1821 break;
1822 case C2H_8812_RA_RPT:
1823 rtl8821ae_c2h_ra_report_handler(hw, tmp_buf, c2h_cmd_len);
1824 break;
1825 case C2H_8812_BT_INFO:
1826 RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD,
1827 "[C2H], C2H_8812_BT_INFO!!\n");
1828 if (rtlpriv->cfg->ops->get_btc_status())
1829 rtlpriv->btcoexist.btc_ops->btc_btinfo_notify(rtlpriv,
1830 tmp_buf,
1831 c2h_cmd_len);
1832 break;
1833 default:
1834 break;
1835 }
1836}
1837
1838void rtl8821ae_c2h_packet_handler(struct ieee80211_hw *hw, u8 *buffer,
1839 u8 length)
1840{
1841 struct rtl_priv *rtlpriv = rtl_priv(hw);
1842 u8 c2h_cmd_id = 0, c2h_cmd_seq = 0, c2h_cmd_len = 0;
1843 u8 *tmp_buf = NULL;
1844
1845 c2h_cmd_id = buffer[0];
1846 c2h_cmd_seq = buffer[1];
1847 c2h_cmd_len = length - 2;
1848 tmp_buf = buffer + 2;
1849
1850 RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD,
1851 "[C2H packet], c2hCmdId=0x%x, c2hCmdSeq=0x%x, c2hCmdLen=%d\n",
1852 c2h_cmd_id, c2h_cmd_seq, c2h_cmd_len);
1853
1854 RT_PRINT_DATA(rtlpriv, COMP_FW, DBG_LOUD,
1855 "[C2H packet], Content Hex:\n", tmp_buf, c2h_cmd_len);
1856 _rtl8821ae_c2h_content_parsing(hw, c2h_cmd_id, c2h_cmd_len, tmp_buf);
1857}
diff --git a/drivers/net/wireless/rtlwifi/rtl8821ae/fw.h b/drivers/net/wireless/rtlwifi/rtl8821ae/fw.h
new file mode 100644
index 000000000000..591c14c0b9b5
--- /dev/null
+++ b/drivers/net/wireless/rtlwifi/rtl8821ae/fw.h
@@ -0,0 +1,351 @@
1/******************************************************************************
2 *
3 * Copyright(c) 2009-2010 Realtek Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * The full GNU General Public License is included in this distribution in the
15 * file called LICENSE.
16 *
17 * Contact Information:
18 * wlanfae <wlanfae@realtek.com>
19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20 * Hsinchu 300, Taiwan.
21 * Larry Finger <Larry.Finger@lwfinger.net>
22 *
23 *****************************************************************************/
24
25#ifndef __RTL8821AE__FW__H__
26#define __RTL8821AE__FW__H__
27#include "def.h"
28
29#define FW_8821AE_SIZE 0x8000
30#define FW_8821AE_START_ADDRESS 0x1000
31#define FW_8821AE_END_ADDRESS 0x5FFF
32#define FW_8821AE_PAGE_SIZE 4096
33#define FW_8821AE_POLLING_DELAY 5
34#define FW_8821AE_POLLING_TIMEOUT_COUNT 6000
35
36#define IS_FW_HEADER_EXIST_8812(_pfwhdr) \
37 ((_pfwhdr->signature&0xFFF0) == 0x9500)
38
39#define IS_FW_HEADER_EXIST_8821(_pfwhdr) \
40 ((_pfwhdr->signature&0xFFF0) == 0x2100)
41
42#define USE_OLD_WOWLAN_DEBUG_FW 0
43
44#define H2C_8821AE_RSVDPAGE_LOC_LEN 5
45#define H2C_8821AE_PWEMODE_LENGTH 5
46#define H2C_8821AE_JOINBSSRPT_LENGTH 1
47#define H2C_8821AE_AP_OFFLOAD_LENGTH 3
48#define H2C_8821AE_WOWLAN_LENGTH 3
49#define H2C_8821AE_KEEP_ALIVE_CTRL_LENGTH 3
50#if (USE_OLD_WOWLAN_DEBUG_FW == 0)
51#define H2C_8821AE_REMOTE_WAKE_CTRL_LEN 1
52#else
53#define H2C_8821AE_REMOTE_WAKE_CTRL_LEN 3
54#endif
55#define H2C_8821AE_AOAC_GLOBAL_INFO_LEN 2
56#define H2C_8821AE_AOAC_RSVDPAGE_LOC_LEN 7
57#define H2C_8821AE_DISCONNECT_DECISION_CTRL_LEN 3
58
59/* Fw PS state for RPWM.
60*BIT[2:0] = HW state
61
62*BIT[3] = Protocol PS state,
631: register active state ,
640: register sleep state
65
66*BIT[4] = sub-state
67*/
68#define FW_PS_GO_ON BIT(0)
69#define FW_PS_TX_NULL BIT(1)
70#define FW_PS_RF_ON BIT(2)
71#define FW_PS_REGISTER_ACTIVE BIT(3)
72
73#define FW_PS_DPS BIT(0)
74#define FW_PS_LCLK (FW_PS_DPS)
75#define FW_PS_RF_OFF BIT(1)
76#define FW_PS_ALL_ON BIT(2)
77#define FW_PS_ST_ACTIVE BIT(3)
78#define FW_PS_ISR_ENABLE BIT(4)
79#define FW_PS_IMR_ENABLE BIT(5)
80
81#define FW_PS_ACK BIT(6)
82#define FW_PS_TOGGLE BIT(7)
83
84 /* 8821AE RPWM value*/
85 /* BIT[0] = 1: 32k, 0: 40M*/
86 /* 32k*/
87#define FW_PS_CLOCK_OFF BIT(0)
88/*40M*/
89#define FW_PS_CLOCK_ON 0
90
91#define FW_PS_STATE_MASK (0x0F)
92#define FW_PS_STATE_HW_MASK (0x07)
93/*ISR_ENABLE, IMR_ENABLE, and PS mode should be inherited.*/
94#define FW_PS_STATE_INT_MASK (0x3F)
95
96#define FW_PS_STATE(x) (FW_PS_STATE_MASK & (x))
97#define FW_PS_STATE_HW(x) (FW_PS_STATE_HW_MASK & (x))
98#define FW_PS_STATE_INT(x) (FW_PS_STATE_INT_MASK & (x))
99#define FW_PS_ISR_VAL(x) ((x) & 0x70)
100#define FW_PS_IMR_MASK(x) ((x) & 0xDF)
101#define FW_PS_KEEP_IMR(x) ((x) & 0x20)
102
103#define FW_PS_STATE_S0 (FW_PS_DPS)
104#define FW_PS_STATE_S1 (FW_PS_LCLK)
105#define FW_PS_STATE_S2 (FW_PS_RF_OFF)
106#define FW_PS_STATE_S3 (FW_PS_ALL_ON)
107#define FW_PS_STATE_S4 ((FW_PS_ST_ACTIVE) | (FW_PS_ALL_ON))
108 /* ((FW_PS_RF_ON) | (FW_PS_REGISTER_ACTIVE))*/
109#define FW_PS_STATE_ALL_ON_8821AE (FW_PS_CLOCK_ON)
110 /* (FW_PS_RF_ON)*/
111#define FW_PS_STATE_RF_ON_8821AE (FW_PS_CLOCK_ON)
112 /* 0x0*/
113#define FW_PS_STATE_RF_OFF_8821AE (FW_PS_CLOCK_ON)
114 /* (FW_PS_STATE_RF_OFF)*/
115#define FW_PS_STATE_RF_OFF_LOW_PWR_8821AE (FW_PS_CLOCK_OFF)
116
117#define FW_PS_STATE_ALL_ON_92C (FW_PS_STATE_S4)
118#define FW_PS_STATE_RF_ON_92C (FW_PS_STATE_S3)
119#define FW_PS_STATE_RF_OFF_92C (FW_PS_STATE_S2)
120#define FW_PS_STATE_RF_OFF_LOW_PWR_92C (FW_PS_STATE_S1)
121
122/* For 8821AE H2C PwrMode Cmd ID 5.*/
123#define FW_PWR_STATE_ACTIVE ((FW_PS_RF_ON) | (FW_PS_REGISTER_ACTIVE))
124#define FW_PWR_STATE_RF_OFF 0
125
126#define FW_PS_IS_ACK(x) ((x) & FW_PS_ACK)
127#define FW_PS_IS_CLK_ON(x) ((x) & (FW_PS_RF_OFF | FW_PS_ALL_ON))
128#define FW_PS_IS_RF_ON(x) ((x) & (FW_PS_ALL_ON))
129#define FW_PS_IS_ACTIVE(x) ((x) & (FW_PS_ST_ACTIVE))
130#define FW_PS_IS_CPWM_INT(x) ((x) & 0x40)
131
132#define FW_CLR_PS_STATE(x) ((x) = ((x) & (0xF0)))
133
134#define IS_IN_LOW_POWER_STATE_8821AE(__state) \
135 (FW_PS_STATE(__state) == FW_PS_CLOCK_OFF)
136
137#define FW_PWR_STATE_ACTIVE ((FW_PS_RF_ON) | (FW_PS_REGISTER_ACTIVE))
138#define FW_PWR_STATE_RF_OFF 0
139
140struct rtl8821a_firmware_header {
141 u16 signature;
142 u8 category;
143 u8 function;
144 u16 version;
145 u8 subversion;
146 u8 rsvd1;
147 u8 month;
148 u8 date;
149 u8 hour;
150 u8 minute;
151 u16 ramcodeSize;
152 u16 rsvd2;
153 u32 svnindex;
154 u32 rsvd3;
155 u32 rsvd4;
156 u32 rsvd5;
157};
158
159enum rtl8812_c2h_evt {
160 C2H_8812_DBG = 0,
161 C2H_8812_LB = 1,
162 C2H_8812_TXBF = 2,
163 C2H_8812_TX_REPORT = 3,
164 C2H_8812_BT_INFO = 9,
165 C2H_8812_BT_MP = 11,
166 C2H_8812_RA_RPT = 12,
167
168 C2H_8812_FW_SWCHNL = 0x10,
169 C2H_8812_IQK_FINISH = 0x11,
170 MAX_8812_C2HEVENT
171};
172
173enum rtl8821a_h2c_cmd {
174 H2C_8821AE_RSVDPAGE = 0,
175 H2C_8821AE_MSRRPT = 1,
176 H2C_8821AE_SCAN = 2,
177 H2C_8821AE_KEEP_ALIVE_CTRL = 3,
178 H2C_8821AE_DISCONNECT_DECISION = 4,
179 H2C_8821AE_INIT_OFFLOAD = 6,
180 H2C_8821AE_AP_OFFLOAD = 8,
181 H2C_8821AE_BCN_RSVDPAGE = 9,
182 H2C_8821AE_PROBERSP_RSVDPAGE = 10,
183
184 H2C_8821AE_SETPWRMODE = 0x20,
185 H2C_8821AE_PS_TUNING_PARA = 0x21,
186 H2C_8821AE_PS_TUNING_PARA2 = 0x22,
187 H2C_8821AE_PS_LPS_PARA = 0x23,
188 H2C_8821AE_P2P_PS_OFFLOAD = 024,
189
190 H2C_8821AE_WO_WLAN = 0x80,
191 H2C_8821AE_REMOTE_WAKE_CTRL = 0x81,
192 H2C_8821AE_AOAC_GLOBAL_INFO = 0x82,
193 H2C_8821AE_AOAC_RSVDPAGE = 0x83,
194
195 H2C_RSSI_21AE_REPORT = 0x42,
196 H2C_8821AE_RA_MASK = 0x40,
197 H2C_8821AE_SELECTIVE_SUSPEND_ROF_CMD,
198 H2C_8821AE_P2P_PS_MODE,
199 H2C_8821AE_PSD_RESULT,
200 /*Not defined CTW CMD for P2P yet*/
201 H2C_8821AE_P2P_PS_CTW_CMD,
202 MAX_8821AE_H2CCMD
203};
204
205#define pagenum_128(_len) (u32)(((_len)>>7) + ((_len)&0x7F ? 1 : 0))
206
207#define SET_8812_H2CCMD_WOWLAN_FUNC_ENABLE(__cmd, __value) \
208 SET_BITS_TO_LE_1BYTE(__cmd, 0, 1, __value)
209#define SET_8812_H2CCMD_WOWLAN_PATTERN_MATCH_ENABLE(__cmd, __value) \
210 SET_BITS_TO_LE_1BYTE(__cmd, 1, 1, __value)
211#define SET_8812_H2CCMD_WOWLAN_MAGIC_PKT_ENABLE(__cmd, __value) \
212 SET_BITS_TO_LE_1BYTE(__cmd, 2, 1, __value)
213#define SET_8812_H2CCMD_WOWLAN_UNICAST_PKT_ENABLE(__cmd, __value) \
214 SET_BITS_TO_LE_1BYTE(__cmd, 3, 1, __value)
215#define SET_8812_H2CCMD_WOWLAN_ALL_PKT_DROP(__cmd, __value) \
216 SET_BITS_TO_LE_1BYTE(__cmd, 4, 1, __value)
217#define SET_8812_H2CCMD_WOWLAN_GPIO_ACTIVE(__cmd, __value) \
218 SET_BITS_TO_LE_1BYTE(__cmd, 5, 1, __value)
219#define SET_8812_H2CCMD_WOWLAN_REKEY_WAKE_UP(__cmd, __value) \
220 SET_BITS_TO_LE_1BYTE(__cmd, 6, 1, __value)
221#define SET_8812_H2CCMD_WOWLAN_DISCONNECT_WAKE_UP(__cmd, __value) \
222 SET_BITS_TO_LE_1BYTE(__cmd, 7, 1, __value)
223#define SET_8812_H2CCMD_WOWLAN_GPIONUM(__cmd, __value) \
224 SET_BITS_TO_LE_1BYTE((__cmd) + 1, 0, 8, __value)
225#define SET_8812_H2CCMD_WOWLAN_GPIO_DURATION(__cmd, __value) \
226 SET_BITS_TO_LE_1BYTE((__cmd) + 2, 0, 8, __value)
227
228#define SET_H2CCMD_PWRMODE_PARM_MODE(__ph2ccmd, __val) \
229 SET_BITS_TO_LE_1BYTE(__ph2ccmd, 0, 8, __val)
230#define SET_H2CCMD_PWRMODE_PARM_RLBM(__cmd, __value) \
231 SET_BITS_TO_LE_1BYTE((__cmd)+1, 0, 4, __value)
232#define SET_H2CCMD_PWRMODE_PARM_SMART_PS(__cmd, __value) \
233 SET_BITS_TO_LE_1BYTE((__cmd)+1, 4, 4, __value)
234#define SET_H2CCMD_PWRMODE_PARM_AWAKE_INTERVAL(__cmd, __value) \
235 SET_BITS_TO_LE_1BYTE((__cmd)+2, 0, 8, __value)
236#define SET_H2CCMD_PWRMODE_PARM_ALL_QUEUE_UAPSD(__cmd, __value) \
237 SET_BITS_TO_LE_1BYTE((__cmd)+3, 0, 8, __value)
238#define SET_H2CCMD_PWRMODE_PARM_PWR_STATE(__cmd, __value) \
239 SET_BITS_TO_LE_1BYTE((__cmd)+4, 0, 8, __value)
240#define GET_8821AE_H2CCMD_PWRMODE_PARM_MODE(__cmd) \
241 LE_BITS_TO_1BYTE(__cmd, 0, 8)
242
243#define SET_H2CCMD_JOINBSSRPT_PARM_OPMODE(__ph2ccmd, __val) \
244 SET_BITS_TO_LE_1BYTE(__ph2ccmd, 0, 8, __val)
245#define SET_H2CCMD_RSVDPAGE_LOC_PSPOLL(__ph2ccmd, __val) \
246 SET_BITS_TO_LE_1BYTE((__ph2ccmd)+1, 0, 8, __val)
247#define SET_H2CCMD_RSVDPAGE_LOC_NULL_DATA(__ph2ccmd, __val) \
248 SET_BITS_TO_LE_1BYTE((__ph2ccmd)+2, 0, 8, __val)
249#define SET_H2CCMD_RSVDPAGE_LOC_QOS_NULL_DATA(__ph2ccmd, __val) \
250 SET_BITS_TO_LE_1BYTE((__ph2ccmd)+3, 0, 8, __val)
251
252/* _MEDIA_STATUS_RPT_PARM_CMD1 */
253#define SET_H2CCMD_MSRRPT_PARM_OPMODE(__cmd, __value) \
254 SET_BITS_TO_LE_1BYTE(__cmd, 0, 1, __value)
255#define SET_H2CCMD_MSRRPT_PARM_MACID_IND(__cmd, __value) \
256 SET_BITS_TO_LE_1BYTE(__cmd, 1, 1, __value)
257#define SET_H2CCMD_MSRRPT_PARM_MACID(__cmd, __value) \
258 SET_BITS_TO_LE_1BYTE(__cmd+1, 0, 8, __value)
259#define SET_H2CCMD_MSRRPT_PARM_MACID_END(__cmd, __value) \
260 SET_BITS_TO_LE_1BYTE(__cmd+2, 0, 8, __value)
261
262/* AP_OFFLOAD */
263#define SET_H2CCMD_AP_OFFLOAD_ON(__cmd, __value) \
264 SET_BITS_TO_LE_1BYTE(__cmd, 0, 8, __value)
265#define SET_H2CCMD_AP_OFFLOAD_HIDDEN(__cmd, __value) \
266 SET_BITS_TO_LE_1BYTE((__cmd)+1, 0, 8, __value)
267#define SET_H2CCMD_AP_OFFLOAD_DENYANY(__cmd, __value) \
268 SET_BITS_TO_LE_1BYTE((__cmd)+2, 0, 8, __value)
269#define SET_H2CCMD_AP_OFFLOAD_WAKEUP_EVT_RPT(__cmd, __value) \
270 SET_BITS_TO_LE_1BYTE((__cmd)+3, 0, 8, __value)
271
272/* Keep Alive Control*/
273#define SET_8812_H2CCMD_KEEP_ALIVE_ENABLE(__cmd, __value) \
274 SET_BITS_TO_LE_1BYTE(__cmd, 0, 1, __value)
275#define SET_8812_H2CCMD_KEEP_ALIVE_ACCPEPT_USER_DEFINED(__cmd, __value) \
276 SET_BITS_TO_LE_1BYTE(__cmd, 1, 1, __value)
277#define SET_8812_H2CCMD_KEEP_ALIVE_PERIOD(__cmd, __value) \
278 SET_BITS_TO_LE_1BYTE((__cmd)+1, 0, 8, __value)
279
280/*REMOTE_WAKE_CTRL */
281#define SET_8812_H2CCMD_REMOTE_WAKECTRL_ENABLE(__cmd, __value) \
282 SET_BITS_TO_LE_1BYTE(__cmd, 0, 1, __value)
283#define SET_8812_H2CCMD_REMOTE_WAKE_CTRL_ARP_OFFLOAD_EN(__cmd, __value)\
284 SET_BITS_TO_LE_1BYTE(__cmd, 1, 1, __value)
285#define SET_8812_H2CCMD_REMOTE_WAKE_CTRL_NDP_OFFLOAD_EN(__cmd, __value)\
286 SET_BITS_TO_LE_1BYTE(__cmd, 2, 1, __value)
287#define SET_8812_H2CCMD_REMOTE_WAKE_CTRL_GTK_OFFLOAD_EN(__cmd, __value)\
288 SET_BITS_TO_LE_1BYTE(__cmd, 3, 1, __value)
289#define SET_8812_H2CCMD_REMOTE_WAKE_CTRL_REALWOWV2_EN(__cmd, __value)\
290 SET_BITS_TO_LE_1BYTE(__cmd, 6, 1, __value)
291
292/* GTK_OFFLOAD */
293#define SET_8812_H2CCMD_AOAC_GLOBAL_INFO_PAIRWISE_ENC_ALG(__cmd, __value)\
294 SET_BITS_TO_LE_1BYTE(__cmd, 0, 8, __value)
295#define SET_8812_H2CCMD_AOAC_GLOBAL_INFO_GROUP_ENC_ALG(__cmd, __value) \
296 SET_BITS_TO_LE_1BYTE((__cmd)+1, 0, 8, __value)
297
298/* AOAC_RSVDPAGE_LOC */
299#define SET_8821AE_H2CCMD_AOAC_RSVDPAGE_LOC_REMOTE_WAKE_CTRL_INFO(__cmd, __value) \
300 SET_BITS_TO_LE_1BYTE((__cmd), 0, 8, __value)
301#define SET_8821AE_H2CCMD_AOAC_RSVDPAGE_LOC_ARP_RSP(__cmd, __value) \
302 SET_BITS_TO_LE_1BYTE((__cmd)+1, 0, 8, __value)
303#define SET_8821AE_H2CCMD_AOAC_RSVDPAGE_LOC_NEIGHBOR_ADV(__cmd, __value)\
304 SET_BITS_TO_LE_1BYTE((__cmd)+2, 0, 8, __value)
305#define SET_8821AE_H2CCMD_AOAC_RSVDPAGE_LOC_GTK_RSP(__cmd, __value) \
306 SET_BITS_TO_LE_1BYTE((__cmd)+3, 0, 8, __value)
307#define SET_8821AE_H2CCMD_AOAC_RSVDPAGE_LOC_GTK_INFO(__cmd, __value) \
308 SET_BITS_TO_LE_1BYTE((__cmd)+4, 0, 8, __value)
309#define SET_8821AE_H2CCMD_AOAC_RSVDPAGE_LOC_GTK_EXT_MEM(__cmd, __value) \
310 SET_BITS_TO_LE_1BYTE((__cmd)+5, 0, 8, __value)
311
312/* Disconnect_Decision_Control */
313#define SET_8812_H2CCMD_DISCONNECT_DECISION_CTRL_ENABLE(__cmd, __value) \
314 SET_BITS_TO_LE_1BYTE(__cmd, 0, 1, __value)
315#define SET_8812_H2CCMD_DISCONNECT_DECISION_CTRL_USER_SETTING(__cmd, __value)\
316 SET_BITS_TO_LE_1BYTE(__cmd, 1, 1, __value)
317#define SET_8812_H2CCMD_DISCONNECT_DECISION_CTRL_CHECK_PERIOD(__cmd, __value)\
318 SET_BITS_TO_LE_1BYTE((__cmd)+1, 0, 8, __value) /* unit: beacon period */
319#define SET_8812_H2CCMD_DISCONNECT_DECISION_CTRL_TRYPKT_NUM(__cmd, __value)\
320 SET_BITS_TO_LE_1BYTE((__cmd)+2, 0, 8, __value)
321
322int rtl8821ae_download_fw(struct ieee80211_hw *hw, bool buse_wake_on_wlan_fw);
323#if (USE_SPECIFIC_FW_TO_SUPPORT_WOWLAN == 1)
324void rtl8821ae_set_fw_related_for_wowlan(struct ieee80211_hw *hw,
325 bool used_wowlan_fw);
326
327#endif
328void rtl8821ae_fill_h2c_cmd(struct ieee80211_hw *hw, u8 element_id,
329 u32 cmd_len, u8 *cmdbuffer);
330void rtl8821ae_firmware_selfreset(struct ieee80211_hw *hw);
331void rtl8821ae_set_fw_pwrmode_cmd(struct ieee80211_hw *hw, u8 mode);
332void rtl8821ae_set_fw_media_status_rpt_cmd(struct ieee80211_hw *hw,
333 u8 mstatus);
334void rtl8821ae_set_fw_ap_off_load_cmd(struct ieee80211_hw *hw,
335 u8 ap_offload_enable);
336void rtl8821ae_set_fw_rsvdpagepkt(struct ieee80211_hw *hw,
337 bool b_dl_finished, bool dl_whole_packet);
338void rtl8812ae_set_fw_rsvdpagepkt(struct ieee80211_hw *hw,
339 bool b_dl_finished, bool dl_whole_packet);
340void rtl8821ae_set_p2p_ps_offload_cmd(struct ieee80211_hw *hw,
341 u8 p2p_ps_state);
342void rtl8821ae_set_fw_wowlan_mode(struct ieee80211_hw *hw, bool func_en);
343void rtl8821ae_set_fw_remote_wake_ctrl_cmd(struct ieee80211_hw *hw,
344 u8 enable);
345void rtl8821ae_set_fw_keep_alive_cmd(struct ieee80211_hw *hw, bool func_en);
346void rtl8821ae_set_fw_disconnect_decision_ctrl_cmd(struct ieee80211_hw *hw,
347 bool enabled);
348void rtl8821ae_set_fw_global_info_cmd(struct ieee80211_hw *hw);
349void rtl8821ae_c2h_packet_handler(struct ieee80211_hw *hw,
350 u8 *buffer, u8 length);
351#endif
diff --git a/drivers/net/wireless/rtlwifi/rtl8821ae/hw.c b/drivers/net/wireless/rtlwifi/rtl8821ae/hw.c
new file mode 100644
index 000000000000..310d3163dc5b
--- /dev/null
+++ b/drivers/net/wireless/rtlwifi/rtl8821ae/hw.c
@@ -0,0 +1,4218 @@
1/******************************************************************************
2 *
3 * Copyright(c) 2009-2010 Realtek Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * The full GNU General Public License is included in this distribution in the
15 * file called LICENSE.
16 *
17 * Contact Information:
18 * wlanfae <wlanfae@realtek.com>
19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20 * Hsinchu 300, Taiwan.
21 *
22 * Larry Finger <Larry.Finger@lwfinger.net>
23 *
24 *****************************************************************************/
25
26#include "../wifi.h"
27#include "../efuse.h"
28#include "../base.h"
29#include "../regd.h"
30#include "../cam.h"
31#include "../ps.h"
32#include "../pci.h"
33#include "reg.h"
34#include "def.h"
35#include "phy.h"
36#include "dm.h"
37#include "fw.h"
38#include "led.h"
39#include "hw.h"
40#include "../pwrseqcmd.h"
41#include "pwrseq.h"
42#include "../btcoexist/rtl_btc.h"
43
44#define LLT_CONFIG 5
45
46static void _rtl8821ae_return_beacon_queue_skb(struct ieee80211_hw *hw)
47{
48 struct rtl_priv *rtlpriv = rtl_priv(hw);
49 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
50 struct rtl8192_tx_ring *ring = &rtlpci->tx_ring[BEACON_QUEUE];
51 unsigned long flags;
52
53 spin_lock_irqsave(&rtlpriv->locks.irq_th_lock, flags);
54 while (skb_queue_len(&ring->queue)) {
55 struct rtl_tx_desc *entry = &ring->desc[ring->idx];
56 struct sk_buff *skb = __skb_dequeue(&ring->queue);
57
58 pci_unmap_single(rtlpci->pdev,
59 rtlpriv->cfg->ops->get_desc(
60 (u8 *)entry, true, HW_DESC_TXBUFF_ADDR),
61 skb->len, PCI_DMA_TODEVICE);
62 kfree_skb(skb);
63 ring->idx = (ring->idx + 1) % ring->entries;
64 }
65 spin_unlock_irqrestore(&rtlpriv->locks.irq_th_lock, flags);
66}
67
68static void _rtl8821ae_set_bcn_ctrl_reg(struct ieee80211_hw *hw,
69 u8 set_bits, u8 clear_bits)
70{
71 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
72 struct rtl_priv *rtlpriv = rtl_priv(hw);
73
74 rtlpci->reg_bcn_ctrl_val |= set_bits;
75 rtlpci->reg_bcn_ctrl_val &= ~clear_bits;
76
77 rtl_write_byte(rtlpriv, REG_BCN_CTRL, (u8)rtlpci->reg_bcn_ctrl_val);
78}
79
80void _rtl8821ae_stop_tx_beacon(struct ieee80211_hw *hw)
81{
82 struct rtl_priv *rtlpriv = rtl_priv(hw);
83 u8 tmp1byte;
84
85 tmp1byte = rtl_read_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2);
86 rtl_write_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2, tmp1byte & (~BIT(6)));
87 rtl_write_byte(rtlpriv, REG_TBTT_PROHIBIT + 1, 0x64);
88 tmp1byte = rtl_read_byte(rtlpriv, REG_TBTT_PROHIBIT + 2);
89 tmp1byte &= ~(BIT(0));
90 rtl_write_byte(rtlpriv, REG_TBTT_PROHIBIT + 2, tmp1byte);
91}
92
93void _rtl8821ae_resume_tx_beacon(struct ieee80211_hw *hw)
94{
95 struct rtl_priv *rtlpriv = rtl_priv(hw);
96 u8 tmp1byte;
97
98 tmp1byte = rtl_read_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2);
99 rtl_write_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2, tmp1byte | BIT(6));
100 rtl_write_byte(rtlpriv, REG_TBTT_PROHIBIT + 1, 0xff);
101 tmp1byte = rtl_read_byte(rtlpriv, REG_TBTT_PROHIBIT + 2);
102 tmp1byte |= BIT(0);
103 rtl_write_byte(rtlpriv, REG_TBTT_PROHIBIT + 2, tmp1byte);
104}
105
106static void _rtl8821ae_enable_bcn_sub_func(struct ieee80211_hw *hw)
107{
108 _rtl8821ae_set_bcn_ctrl_reg(hw, 0, BIT(1));
109}
110
111static void _rtl8821ae_disable_bcn_sub_func(struct ieee80211_hw *hw)
112{
113 _rtl8821ae_set_bcn_ctrl_reg(hw, BIT(1), 0);
114}
115
116static void _rtl8821ae_set_fw_clock_on(struct ieee80211_hw *hw,
117 u8 rpwm_val, bool b_need_turn_off_ckk)
118{
119 struct rtl_priv *rtlpriv = rtl_priv(hw);
120 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
121 bool b_support_remote_wake_up;
122 u32 count = 0, isr_regaddr, content;
123 bool b_schedule_timer = b_need_turn_off_ckk;
124
125 rtlpriv->cfg->ops->get_hw_reg(hw, HAL_DEF_WOWLAN,
126 (u8 *)(&b_support_remote_wake_up));
127
128 if (!rtlhal->fw_ready)
129 return;
130 if (!rtlpriv->psc.fw_current_inpsmode)
131 return;
132
133 while (1) {
134 spin_lock_bh(&rtlpriv->locks.fw_ps_lock);
135 if (rtlhal->fw_clk_change_in_progress) {
136 while (rtlhal->fw_clk_change_in_progress) {
137 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
138 count++;
139 udelay(100);
140 if (count > 1000)
141 goto change_done;
142 spin_lock_bh(&rtlpriv->locks.fw_ps_lock);
143 }
144 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
145 } else {
146 rtlhal->fw_clk_change_in_progress = false;
147 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
148 goto change_done;
149 }
150 }
151change_done:
152 if (IS_IN_LOW_POWER_STATE_8821AE(rtlhal->fw_ps_state)) {
153 rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_SET_RPWM,
154 (u8 *)(&rpwm_val));
155 if (FW_PS_IS_ACK(rpwm_val)) {
156 isr_regaddr = REG_HISR;
157 content = rtl_read_dword(rtlpriv, isr_regaddr);
158 while (!(content & IMR_CPWM) && (count < 500)) {
159 udelay(50);
160 count++;
161 content = rtl_read_dword(rtlpriv, isr_regaddr);
162 }
163
164 if (content & IMR_CPWM) {
165 rtl_write_word(rtlpriv, isr_regaddr, 0x0100);
166 rtlhal->fw_ps_state = FW_PS_STATE_RF_ON_8821AE;
167 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
168 "Receive CPWM INT!!! Set rtlhal->FwPSState = %X\n",
169 rtlhal->fw_ps_state);
170 }
171 }
172
173 spin_lock_bh(&rtlpriv->locks.fw_ps_lock);
174 rtlhal->fw_clk_change_in_progress = false;
175 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
176 if (b_schedule_timer)
177 mod_timer(&rtlpriv->works.fw_clockoff_timer,
178 jiffies + MSECS(10));
179 } else {
180 spin_lock_bh(&rtlpriv->locks.fw_ps_lock);
181 rtlhal->fw_clk_change_in_progress = false;
182 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
183 }
184}
185
186static void _rtl8821ae_set_fw_clock_off(struct ieee80211_hw *hw,
187 u8 rpwm_val)
188{
189 struct rtl_priv *rtlpriv = rtl_priv(hw);
190 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
191 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
192 struct rtl8192_tx_ring *ring;
193 enum rf_pwrstate rtstate;
194 bool b_schedule_timer = false;
195 u8 queue;
196
197 if (!rtlhal->fw_ready)
198 return;
199 if (!rtlpriv->psc.fw_current_inpsmode)
200 return;
201 if (!rtlhal->allow_sw_to_change_hwclc)
202 return;
203 rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_RF_STATE, (u8 *)(&rtstate));
204 if (rtstate == ERFOFF || rtlpriv->psc.inactive_pwrstate == ERFOFF)
205 return;
206
207 for (queue = 0; queue < RTL_PCI_MAX_TX_QUEUE_COUNT; queue++) {
208 ring = &rtlpci->tx_ring[queue];
209 if (skb_queue_len(&ring->queue)) {
210 b_schedule_timer = true;
211 break;
212 }
213 }
214
215 if (b_schedule_timer) {
216 mod_timer(&rtlpriv->works.fw_clockoff_timer,
217 jiffies + MSECS(10));
218 return;
219 }
220
221 if (FW_PS_STATE(rtlhal->fw_ps_state) !=
222 FW_PS_STATE_RF_OFF_LOW_PWR_8821AE) {
223 spin_lock_bh(&rtlpriv->locks.fw_ps_lock);
224 if (!rtlhal->fw_clk_change_in_progress) {
225 rtlhal->fw_clk_change_in_progress = true;
226 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
227 rtlhal->fw_ps_state = FW_PS_STATE(rpwm_val);
228 rtl_write_word(rtlpriv, REG_HISR, 0x0100);
229 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SET_RPWM,
230 (u8 *)(&rpwm_val));
231 spin_lock_bh(&rtlpriv->locks.fw_ps_lock);
232 rtlhal->fw_clk_change_in_progress = false;
233 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
234 } else {
235 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
236 mod_timer(&rtlpriv->works.fw_clockoff_timer,
237 jiffies + MSECS(10));
238 }
239 }
240}
241
242static void _rtl8821ae_set_fw_ps_rf_on(struct ieee80211_hw *hw)
243{
244 u8 rpwm_val = 0;
245
246 rpwm_val |= (FW_PS_STATE_RF_OFF_8821AE | FW_PS_ACK);
247 _rtl8821ae_set_fw_clock_on(hw, rpwm_val, true);
248}
249
250static void _rtl8821ae_fwlps_leave(struct ieee80211_hw *hw)
251{
252 struct rtl_priv *rtlpriv = rtl_priv(hw);
253 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
254 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
255 bool fw_current_inps = false;
256 u8 rpwm_val = 0, fw_pwrmode = FW_PS_ACTIVE_MODE;
257
258 if (ppsc->low_power_enable) {
259 rpwm_val = (FW_PS_STATE_ALL_ON_8821AE|FW_PS_ACK);/* RF on */
260 _rtl8821ae_set_fw_clock_on(hw, rpwm_val, false);
261 rtlhal->allow_sw_to_change_hwclc = false;
262 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_H2C_FW_PWRMODE,
263 (u8 *)(&fw_pwrmode));
264 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_FW_PSMODE_STATUS,
265 (u8 *)(&fw_current_inps));
266 } else {
267 rpwm_val = FW_PS_STATE_ALL_ON_8821AE; /* RF on */
268 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SET_RPWM,
269 (u8 *)(&rpwm_val));
270 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_H2C_FW_PWRMODE,
271 (u8 *)(&fw_pwrmode));
272 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_FW_PSMODE_STATUS,
273 (u8 *)(&fw_current_inps));
274 }
275}
276
277static void _rtl8821ae_fwlps_enter(struct ieee80211_hw *hw)
278{
279 struct rtl_priv *rtlpriv = rtl_priv(hw);
280 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
281 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
282 bool fw_current_inps = true;
283 u8 rpwm_val;
284
285 if (ppsc->low_power_enable) {
286 rpwm_val = FW_PS_STATE_RF_OFF_LOW_PWR_8821AE; /* RF off */
287 rtlpriv->cfg->ops->set_hw_reg(hw,
288 HW_VAR_FW_PSMODE_STATUS,
289 (u8 *)(&fw_current_inps));
290 rtlpriv->cfg->ops->set_hw_reg(hw,
291 HW_VAR_H2C_FW_PWRMODE,
292 (u8 *)(&ppsc->fwctrl_psmode));
293 rtlhal->allow_sw_to_change_hwclc = true;
294 _rtl8821ae_set_fw_clock_off(hw, rpwm_val);
295 } else {
296 rpwm_val = FW_PS_STATE_RF_OFF_8821AE; /* RF off */
297 rtlpriv->cfg->ops->set_hw_reg(hw,
298 HW_VAR_FW_PSMODE_STATUS,
299 (u8 *)(&fw_current_inps));
300 rtlpriv->cfg->ops->set_hw_reg(hw,
301 HW_VAR_H2C_FW_PWRMODE,
302 (u8 *)(&ppsc->fwctrl_psmode));
303 rtlpriv->cfg->ops->set_hw_reg(hw,
304 HW_VAR_SET_RPWM,
305 (u8 *)(&rpwm_val));
306 }
307}
308
309static void _rtl8821ae_download_rsvd_page(struct ieee80211_hw *hw,
310 bool dl_whole_packets)
311{
312 struct rtl_priv *rtlpriv = rtl_priv(hw);
313 struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
314 u8 tmp_regcr, tmp_reg422, bcnvalid_reg;
315 u8 count = 0, dlbcn_count = 0;
316 bool send_beacon = false;
317
318 tmp_regcr = rtl_read_byte(rtlpriv, REG_CR + 1);
319 rtl_write_byte(rtlpriv, REG_CR + 1, (tmp_regcr | BIT(0)));
320
321 _rtl8821ae_set_bcn_ctrl_reg(hw, 0, BIT(3));
322 _rtl8821ae_set_bcn_ctrl_reg(hw, BIT(4), 0);
323
324 tmp_reg422 = rtl_read_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2);
325 rtl_write_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2,
326 tmp_reg422 & (~BIT(6)));
327 if (tmp_reg422 & BIT(6))
328 send_beacon = true;
329
330 do {
331 bcnvalid_reg = rtl_read_byte(rtlpriv, REG_TDECTRL + 2);
332 rtl_write_byte(rtlpriv, REG_TDECTRL + 2,
333 (bcnvalid_reg | BIT(0)));
334 _rtl8821ae_return_beacon_queue_skb(hw);
335
336 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE)
337 rtl8812ae_set_fw_rsvdpagepkt(hw, false,
338 dl_whole_packets);
339 else
340 rtl8821ae_set_fw_rsvdpagepkt(hw, false,
341 dl_whole_packets);
342
343 bcnvalid_reg = rtl_read_byte(rtlpriv, REG_TDECTRL + 2);
344 count = 0;
345 while (!(bcnvalid_reg & BIT(0)) && count < 20) {
346 count++;
347 udelay(10);
348 bcnvalid_reg = rtl_read_byte(rtlpriv, REG_TDECTRL + 2);
349 }
350 dlbcn_count++;
351 } while (!(bcnvalid_reg & BIT(0)) && dlbcn_count < 5);
352
353 if (!(bcnvalid_reg & BIT(0)))
354 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
355 "Download RSVD page failed!\n");
356 if (bcnvalid_reg & BIT(0) && rtlhal->enter_pnp_sleep) {
357 rtl_write_byte(rtlpriv, REG_TDECTRL + 2, bcnvalid_reg | BIT(0));
358 _rtl8821ae_return_beacon_queue_skb(hw);
359 if (send_beacon) {
360 dlbcn_count = 0;
361 do {
362 rtl_write_byte(rtlpriv, REG_TDECTRL + 2,
363 bcnvalid_reg | BIT(0));
364
365 _rtl8821ae_return_beacon_queue_skb(hw);
366
367 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE)
368 rtl8812ae_set_fw_rsvdpagepkt(hw, true,
369 false);
370 else
371 rtl8821ae_set_fw_rsvdpagepkt(hw, true,
372 false);
373
374 /* check rsvd page download OK. */
375 bcnvalid_reg = rtl_read_byte(rtlpriv,
376 REG_TDECTRL + 2);
377 count = 0;
378 while (!(bcnvalid_reg & BIT(0)) && count < 20) {
379 count++;
380 udelay(10);
381 bcnvalid_reg =
382 rtl_read_byte(rtlpriv,
383 REG_TDECTRL + 2);
384 }
385 dlbcn_count++;
386 } while (!(bcnvalid_reg & BIT(0)) && dlbcn_count < 5);
387
388 if (!(bcnvalid_reg & BIT(0)))
389 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
390 "2 Download RSVD page failed!\n");
391 }
392 }
393
394 if (bcnvalid_reg & BIT(0))
395 rtl_write_byte(rtlpriv, REG_TDECTRL + 2, BIT(0));
396
397 _rtl8821ae_set_bcn_ctrl_reg(hw, BIT(3), 0);
398 _rtl8821ae_set_bcn_ctrl_reg(hw, 0, BIT(4));
399
400 if (send_beacon)
401 rtl_write_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2, tmp_reg422);
402
403 if (!rtlhal->enter_pnp_sleep) {
404 tmp_regcr = rtl_read_byte(rtlpriv, REG_CR + 1);
405 rtl_write_byte(rtlpriv, REG_CR + 1, (tmp_regcr & ~(BIT(0))));
406 }
407}
408
409void rtl8821ae_get_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
410{
411 struct rtl_priv *rtlpriv = rtl_priv(hw);
412 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
413 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
414 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
415
416 switch (variable) {
417 case HW_VAR_ETHER_ADDR:
418 *((u32 *)(val)) = rtl_read_dword(rtlpriv, REG_MACID);
419 *((u16 *)(val+4)) = rtl_read_word(rtlpriv, REG_MACID + 4);
420 break;
421 case HW_VAR_BSSID:
422 *((u32 *)(val)) = rtl_read_dword(rtlpriv, REG_BSSID);
423 *((u16 *)(val+4)) = rtl_read_word(rtlpriv, REG_BSSID+4);
424 break;
425 case HW_VAR_MEDIA_STATUS:
426 val[0] = rtl_read_byte(rtlpriv, REG_CR+2) & 0x3;
427 break;
428 case HW_VAR_SLOT_TIME:
429 *((u8 *)(val)) = mac->slot_time;
430 break;
431 case HW_VAR_BEACON_INTERVAL:
432 *((u16 *)(val)) = rtl_read_word(rtlpriv, REG_BCN_INTERVAL);
433 break;
434 case HW_VAR_ATIM_WINDOW:
435 *((u16 *)(val)) = rtl_read_word(rtlpriv, REG_ATIMWND);
436 break;
437 case HW_VAR_RCR:
438 *((u32 *)(val)) = rtlpci->receive_config;
439 break;
440 case HW_VAR_RF_STATE:
441 *((enum rf_pwrstate *)(val)) = ppsc->rfpwr_state;
442 break;
443 case HW_VAR_FWLPS_RF_ON:{
444 enum rf_pwrstate rfstate;
445 u32 val_rcr;
446
447 rtlpriv->cfg->ops->get_hw_reg(hw,
448 HW_VAR_RF_STATE,
449 (u8 *)(&rfstate));
450 if (rfstate == ERFOFF) {
451 *((bool *)(val)) = true;
452 } else {
453 val_rcr = rtl_read_dword(rtlpriv, REG_RCR);
454 val_rcr &= 0x00070000;
455 if (val_rcr)
456 *((bool *)(val)) = false;
457 else
458 *((bool *)(val)) = true;
459 }
460 break; }
461 case HW_VAR_FW_PSMODE_STATUS:
462 *((bool *)(val)) = ppsc->fw_current_inpsmode;
463 break;
464 case HW_VAR_CORRECT_TSF:{
465 u64 tsf;
466 u32 *ptsf_low = (u32 *)&tsf;
467 u32 *ptsf_high = ((u32 *)&tsf) + 1;
468
469 *ptsf_high = rtl_read_dword(rtlpriv, (REG_TSFTR + 4));
470 *ptsf_low = rtl_read_dword(rtlpriv, REG_TSFTR);
471
472 *((u64 *)(val)) = tsf;
473
474 break; }
475 case HAL_DEF_WOWLAN:
476 if (ppsc->wo_wlan_mode)
477 *((bool *)(val)) = true;
478 else
479 *((bool *)(val)) = false;
480 break;
481 default:
482 RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
483 "switch case not process %x\n", variable);
484 break;
485 }
486}
487
488void rtl8821ae_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
489{
490 struct rtl_priv *rtlpriv = rtl_priv(hw);
491 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
492 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
493 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
494 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
495 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
496 u8 idx;
497
498 switch (variable) {
499 case HW_VAR_ETHER_ADDR:{
500 for (idx = 0; idx < ETH_ALEN; idx++) {
501 rtl_write_byte(rtlpriv, (REG_MACID + idx),
502 val[idx]);
503 }
504 break;
505 }
506 case HW_VAR_BASIC_RATE:{
507 u16 b_rate_cfg = ((u16 *)val)[0];
508 b_rate_cfg = b_rate_cfg & 0x15f;
509 rtl_write_word(rtlpriv, REG_RRSR, b_rate_cfg);
510 break;
511 }
512 case HW_VAR_BSSID:{
513 for (idx = 0; idx < ETH_ALEN; idx++) {
514 rtl_write_byte(rtlpriv, (REG_BSSID + idx),
515 val[idx]);
516 }
517 break;
518 }
519 case HW_VAR_SIFS:
520 rtl_write_byte(rtlpriv, REG_SIFS_CTX + 1, val[0]);
521 rtl_write_byte(rtlpriv, REG_SIFS_TRX + 1, val[0]);
522
523 rtl_write_byte(rtlpriv, REG_SPEC_SIFS + 1, val[0]);
524 rtl_write_byte(rtlpriv, REG_MAC_SPEC_SIFS + 1, val[0]);
525
526 rtl_write_byte(rtlpriv, REG_RESP_SIFS_OFDM + 1, val[0]);
527 rtl_write_byte(rtlpriv, REG_RESP_SIFS_OFDM, val[0]);
528 break;
529 case HW_VAR_R2T_SIFS:
530 rtl_write_byte(rtlpriv, REG_RESP_SIFS_OFDM + 1, val[0]);
531 break;
532 case HW_VAR_SLOT_TIME:{
533 u8 e_aci;
534
535 RT_TRACE(rtlpriv, COMP_MLME, DBG_LOUD,
536 "HW_VAR_SLOT_TIME %x\n", val[0]);
537
538 rtl_write_byte(rtlpriv, REG_SLOT, val[0]);
539
540 for (e_aci = 0; e_aci < AC_MAX; e_aci++) {
541 rtlpriv->cfg->ops->set_hw_reg(hw,
542 HW_VAR_AC_PARAM,
543 (u8 *)(&e_aci));
544 }
545 break; }
546 case HW_VAR_ACK_PREAMBLE:{
547 u8 reg_tmp;
548 u8 short_preamble = (bool)(*(u8 *)val);
549
550 reg_tmp = rtl_read_byte(rtlpriv, REG_TRXPTCL_CTL+2);
551 if (short_preamble) {
552 reg_tmp |= BIT(1);
553 rtl_write_byte(rtlpriv, REG_TRXPTCL_CTL + 2,
554 reg_tmp);
555 } else {
556 reg_tmp &= (~BIT(1));
557 rtl_write_byte(rtlpriv,
558 REG_TRXPTCL_CTL + 2,
559 reg_tmp);
560 }
561 break; }
562 case HW_VAR_WPA_CONFIG:
563 rtl_write_byte(rtlpriv, REG_SECCFG, *((u8 *)val));
564 break;
565 case HW_VAR_AMPDU_MIN_SPACE:{
566 u8 min_spacing_to_set;
567 u8 sec_min_space;
568
569 min_spacing_to_set = *((u8 *)val);
570 if (min_spacing_to_set <= 7) {
571 sec_min_space = 0;
572
573 if (min_spacing_to_set < sec_min_space)
574 min_spacing_to_set = sec_min_space;
575
576 mac->min_space_cfg = ((mac->min_space_cfg &
577 0xf8) |
578 min_spacing_to_set);
579
580 *val = min_spacing_to_set;
581
582 RT_TRACE(rtlpriv, COMP_MLME, DBG_LOUD,
583 "Set HW_VAR_AMPDU_MIN_SPACE: %#x\n",
584 mac->min_space_cfg);
585
586 rtl_write_byte(rtlpriv, REG_AMPDU_MIN_SPACE,
587 mac->min_space_cfg);
588 }
589 break; }
590 case HW_VAR_SHORTGI_DENSITY:{
591 u8 density_to_set;
592
593 density_to_set = *((u8 *)val);
594 mac->min_space_cfg |= (density_to_set << 3);
595
596 RT_TRACE(rtlpriv, COMP_MLME, DBG_LOUD,
597 "Set HW_VAR_SHORTGI_DENSITY: %#x\n",
598 mac->min_space_cfg);
599
600 rtl_write_byte(rtlpriv, REG_AMPDU_MIN_SPACE,
601 mac->min_space_cfg);
602
603 break; }
604 case HW_VAR_AMPDU_FACTOR:{
605 u32 ampdu_len = (*((u8 *)val));
606
607 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
608 if (ampdu_len < VHT_AGG_SIZE_128K)
609 ampdu_len =
610 (0x2000 << (*((u8 *)val))) - 1;
611 else
612 ampdu_len = 0x1ffff;
613 } else if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
614 if (ampdu_len < HT_AGG_SIZE_64K)
615 ampdu_len =
616 (0x2000 << (*((u8 *)val))) - 1;
617 else
618 ampdu_len = 0xffff;
619 }
620 ampdu_len |= BIT(31);
621
622 rtl_write_dword(rtlpriv,
623 REG_AMPDU_MAX_LENGTH_8812, ampdu_len);
624 break; }
625 case HW_VAR_AC_PARAM:{
626 u8 e_aci = *((u8 *)val);
627
628 rtl8821ae_dm_init_edca_turbo(hw);
629 if (rtlpci->acm_method != EACMWAY2_SW)
630 rtlpriv->cfg->ops->set_hw_reg(hw,
631 HW_VAR_ACM_CTRL,
632 (u8 *)(&e_aci));
633 break; }
634 case HW_VAR_ACM_CTRL:{
635 u8 e_aci = *((u8 *)val);
636 union aci_aifsn *p_aci_aifsn =
637 (union aci_aifsn *)(&mac->ac[0].aifs);
638 u8 acm = p_aci_aifsn->f.acm;
639 u8 acm_ctrl = rtl_read_byte(rtlpriv, REG_ACMHWCTRL);
640
641 acm_ctrl =
642 acm_ctrl | ((rtlpci->acm_method == 2) ? 0x0 : 0x1);
643
644 if (acm) {
645 switch (e_aci) {
646 case AC0_BE:
647 acm_ctrl |= ACMHW_BEQEN;
648 break;
649 case AC2_VI:
650 acm_ctrl |= ACMHW_VIQEN;
651 break;
652 case AC3_VO:
653 acm_ctrl |= ACMHW_VOQEN;
654 break;
655 default:
656 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
657 "HW_VAR_ACM_CTRL acm set failed: eACI is %d\n",
658 acm);
659 break;
660 }
661 } else {
662 switch (e_aci) {
663 case AC0_BE:
664 acm_ctrl &= (~ACMHW_BEQEN);
665 break;
666 case AC2_VI:
667 acm_ctrl &= (~ACMHW_VIQEN);
668 break;
669 case AC3_VO:
670 acm_ctrl &= (~ACMHW_BEQEN);
671 break;
672 default:
673 RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
674 "switch case not process\n");
675 break;
676 }
677 }
678
679 RT_TRACE(rtlpriv, COMP_QOS, DBG_TRACE,
680 "SetHwReg8190pci(): [HW_VAR_ACM_CTRL] Write 0x%X\n",
681 acm_ctrl);
682 rtl_write_byte(rtlpriv, REG_ACMHWCTRL, acm_ctrl);
683 break; }
684 case HW_VAR_RCR:
685 rtl_write_dword(rtlpriv, REG_RCR, ((u32 *)(val))[0]);
686 rtlpci->receive_config = ((u32 *)(val))[0];
687 break;
688 case HW_VAR_RETRY_LIMIT:{
689 u8 retry_limit = ((u8 *)(val))[0];
690
691 rtl_write_word(rtlpriv, REG_RL,
692 retry_limit << RETRY_LIMIT_SHORT_SHIFT |
693 retry_limit << RETRY_LIMIT_LONG_SHIFT);
694 break; }
695 case HW_VAR_DUAL_TSF_RST:
696 rtl_write_byte(rtlpriv, REG_DUAL_TSF_RST, (BIT(0) | BIT(1)));
697 break;
698 case HW_VAR_EFUSE_BYTES:
699 rtlefuse->efuse_usedbytes = *((u16 *)val);
700 break;
701 case HW_VAR_EFUSE_USAGE:
702 rtlefuse->efuse_usedpercentage = *((u8 *)val);
703 break;
704 case HW_VAR_IO_CMD:
705 rtl8821ae_phy_set_io_cmd(hw, (*(enum io_type *)val));
706 break;
707 case HW_VAR_SET_RPWM:{
708 u8 rpwm_val;
709
710 rpwm_val = rtl_read_byte(rtlpriv, REG_PCIE_HRPWM);
711 udelay(1);
712
713 if (rpwm_val & BIT(7)) {
714 rtl_write_byte(rtlpriv, REG_PCIE_HRPWM,
715 (*(u8 *)val));
716 } else {
717 rtl_write_byte(rtlpriv, REG_PCIE_HRPWM,
718 ((*(u8 *)val) | BIT(7)));
719 }
720
721 break; }
722 case HW_VAR_H2C_FW_PWRMODE:
723 rtl8821ae_set_fw_pwrmode_cmd(hw, (*(u8 *)val));
724 break;
725 case HW_VAR_FW_PSMODE_STATUS:
726 ppsc->fw_current_inpsmode = *((bool *)val);
727 break;
728 case HW_VAR_INIT_RTS_RATE:
729 break;
730 case HW_VAR_RESUME_CLK_ON:
731 _rtl8821ae_set_fw_ps_rf_on(hw);
732 break;
733 case HW_VAR_FW_LPS_ACTION:{
734 bool b_enter_fwlps = *((bool *)val);
735
736 if (b_enter_fwlps)
737 _rtl8821ae_fwlps_enter(hw);
738 else
739 _rtl8821ae_fwlps_leave(hw);
740 break; }
741 case HW_VAR_H2C_FW_JOINBSSRPT:{
742 u8 mstatus = (*(u8 *)val);
743
744 if (mstatus == RT_MEDIA_CONNECT) {
745 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_AID,
746 NULL);
747 _rtl8821ae_download_rsvd_page(hw, false);
748 }
749 rtl8821ae_set_fw_media_status_rpt_cmd(hw, mstatus);
750
751 break; }
752 case HW_VAR_H2C_FW_P2P_PS_OFFLOAD:
753 rtl8821ae_set_p2p_ps_offload_cmd(hw, (*(u8 *)val));
754 break;
755 case HW_VAR_AID:{
756 u16 u2btmp;
757 u2btmp = rtl_read_word(rtlpriv, REG_BCN_PSR_RPT);
758 u2btmp &= 0xC000;
759 rtl_write_word(rtlpriv, REG_BCN_PSR_RPT, (u2btmp |
760 mac->assoc_id));
761 break; }
762 case HW_VAR_CORRECT_TSF:{
763 u8 btype_ibss = ((u8 *)(val))[0];
764
765 if (btype_ibss)
766 _rtl8821ae_stop_tx_beacon(hw);
767
768 _rtl8821ae_set_bcn_ctrl_reg(hw, 0, BIT(3));
769
770 rtl_write_dword(rtlpriv, REG_TSFTR,
771 (u32)(mac->tsf & 0xffffffff));
772 rtl_write_dword(rtlpriv, REG_TSFTR + 4,
773 (u32)((mac->tsf >> 32) & 0xffffffff));
774
775 _rtl8821ae_set_bcn_ctrl_reg(hw, BIT(3), 0);
776
777 if (btype_ibss)
778 _rtl8821ae_resume_tx_beacon(hw);
779 break; }
780 case HW_VAR_NAV_UPPER: {
781 u32 us_nav_upper = ((u32)*val);
782
783 if (us_nav_upper > HAL_92C_NAV_UPPER_UNIT * 0xFF) {
784 RT_TRACE(rtlpriv, COMP_INIT , DBG_WARNING,
785 "The setting value (0x%08X us) of NAV_UPPER is larger than (%d * 0xFF)!!!\n",
786 us_nav_upper, HAL_92C_NAV_UPPER_UNIT);
787 break;
788 }
789 rtl_write_byte(rtlpriv, REG_NAV_UPPER,
790 ((u8)((us_nav_upper +
791 HAL_92C_NAV_UPPER_UNIT - 1) /
792 HAL_92C_NAV_UPPER_UNIT)));
793 break; }
794 case HW_VAR_KEEP_ALIVE: {
795 u8 array[2];
796 array[0] = 0xff;
797 array[1] = *((u8 *)val);
798 rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_KEEP_ALIVE_CTRL, 2,
799 array);
800 break; }
801 default:
802 RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
803 "switch case not process %x\n", variable);
804 break;
805 }
806}
807
808static bool _rtl8821ae_llt_write(struct ieee80211_hw *hw, u32 address, u32 data)
809{
810 struct rtl_priv *rtlpriv = rtl_priv(hw);
811 bool status = true;
812 long count = 0;
813 u32 value = _LLT_INIT_ADDR(address) | _LLT_INIT_DATA(data) |
814 _LLT_OP(_LLT_WRITE_ACCESS);
815
816 rtl_write_dword(rtlpriv, REG_LLT_INIT, value);
817
818 do {
819 value = rtl_read_dword(rtlpriv, REG_LLT_INIT);
820 if (_LLT_NO_ACTIVE == _LLT_OP_VALUE(value))
821 break;
822
823 if (count > POLLING_LLT_THRESHOLD) {
824 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
825 "Failed to polling write LLT done at address %d!\n",
826 address);
827 status = false;
828 break;
829 }
830 } while (++count);
831
832 return status;
833}
834
835static bool _rtl8821ae_llt_table_init(struct ieee80211_hw *hw)
836{
837 struct rtl_priv *rtlpriv = rtl_priv(hw);
838 unsigned short i;
839 u8 txpktbuf_bndy;
840 u32 rqpn;
841 u8 maxpage;
842 bool status;
843
844 maxpage = 255;
845 txpktbuf_bndy = 0xF8;
846 rqpn = 0x80e70808;
847 if (rtlpriv->rtlhal.hw_type == HARDWARE_TYPE_RTL8812AE) {
848 txpktbuf_bndy = 0xFA;
849 rqpn = 0x80e90808;
850 }
851
852 rtl_write_byte(rtlpriv, REG_TRXFF_BNDY, txpktbuf_bndy);
853 rtl_write_word(rtlpriv, REG_TRXFF_BNDY + 2, MAX_RX_DMA_BUFFER_SIZE - 1);
854
855 rtl_write_byte(rtlpriv, REG_TDECTRL + 1, txpktbuf_bndy);
856
857 rtl_write_byte(rtlpriv, REG_TXPKTBUF_BCNQ_BDNY, txpktbuf_bndy);
858 rtl_write_byte(rtlpriv, REG_TXPKTBUF_MGQ_BDNY, txpktbuf_bndy);
859
860 rtl_write_byte(rtlpriv, REG_PBP, 0x31);
861 rtl_write_byte(rtlpriv, REG_RX_DRVINFO_SZ, 0x4);
862
863 for (i = 0; i < (txpktbuf_bndy - 1); i++) {
864 status = _rtl8821ae_llt_write(hw, i, i + 1);
865 if (!status)
866 return status;
867 }
868
869 status = _rtl8821ae_llt_write(hw, (txpktbuf_bndy - 1), 0xFF);
870 if (!status)
871 return status;
872
873 for (i = txpktbuf_bndy; i < maxpage; i++) {
874 status = _rtl8821ae_llt_write(hw, i, (i + 1));
875 if (!status)
876 return status;
877 }
878
879 status = _rtl8821ae_llt_write(hw, maxpage, txpktbuf_bndy);
880 if (!status)
881 return status;
882
883 rtl_write_dword(rtlpriv, REG_RQPN, rqpn);
884
885 rtl_write_byte(rtlpriv, REG_RQPN_NPQ, 0x00);
886
887 return true;
888}
889
890static void _rtl8821ae_gen_refresh_led_state(struct ieee80211_hw *hw)
891{
892 struct rtl_priv *rtlpriv = rtl_priv(hw);
893 struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw);
894 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
895 struct rtl_led *pled0 = &pcipriv->ledctl.sw_led0;
896 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
897
898 if (rtlpriv->rtlhal.up_first_time)
899 return;
900
901 if (ppsc->rfoff_reason == RF_CHANGE_BY_IPS)
902 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE)
903 rtl8812ae_sw_led_on(hw, pled0);
904 else
905 rtl8821ae_sw_led_on(hw, pled0);
906 else if (ppsc->rfoff_reason == RF_CHANGE_BY_INIT)
907 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE)
908 rtl8812ae_sw_led_on(hw, pled0);
909 else
910 rtl8821ae_sw_led_on(hw, pled0);
911 else
912 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE)
913 rtl8812ae_sw_led_off(hw, pled0);
914 else
915 rtl8821ae_sw_led_off(hw, pled0);
916}
917
918static bool _rtl8821ae_init_mac(struct ieee80211_hw *hw)
919{
920 struct rtl_priv *rtlpriv = rtl_priv(hw);
921 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
922 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
923
924 u8 bytetmp = 0;
925 u16 wordtmp = 0;
926 bool mac_func_enable = rtlhal->mac_func_enable;
927
928 rtl_write_byte(rtlpriv, REG_RSV_CTRL, 0x00);
929
930 /*Auto Power Down to CHIP-off State*/
931 bytetmp = rtl_read_byte(rtlpriv, REG_APS_FSMCO + 1) & (~BIT(7));
932 rtl_write_byte(rtlpriv, REG_APS_FSMCO + 1, bytetmp);
933
934 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
935 /* HW Power on sequence*/
936 if (!rtl_hal_pwrseqcmdparsing(rtlpriv, PWR_CUT_ALL_MSK,
937 PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,
938 RTL8812_NIC_ENABLE_FLOW)) {
939 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
940 "init 8812 MAC Fail as power on failure\n");
941 return false;
942 }
943 } else {
944 /* HW Power on sequence */
945 if (!rtl_hal_pwrseqcmdparsing(rtlpriv, PWR_CUT_A_MSK,
946 PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,
947 RTL8821A_NIC_ENABLE_FLOW)){
948 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
949 "init 8821 MAC Fail as power on failure\n");
950 return false;
951 }
952 }
953
954 bytetmp = rtl_read_byte(rtlpriv, REG_APS_FSMCO) | BIT(4);
955 rtl_write_byte(rtlpriv, REG_APS_FSMCO, bytetmp);
956
957 bytetmp = rtl_read_byte(rtlpriv, REG_CR);
958 bytetmp = 0xff;
959 rtl_write_byte(rtlpriv, REG_CR, bytetmp);
960 mdelay(2);
961
962 bytetmp = 0xff;
963 rtl_write_byte(rtlpriv, REG_HWSEQ_CTRL, bytetmp);
964 mdelay(2);
965
966 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
967 bytetmp = rtl_read_byte(rtlpriv, REG_SYS_CFG + 3);
968 if (bytetmp & BIT(0)) {
969 bytetmp = rtl_read_byte(rtlpriv, 0x7c);
970 bytetmp |= BIT(6);
971 rtl_write_byte(rtlpriv, 0x7c, bytetmp);
972 }
973 }
974
975 bytetmp = rtl_read_byte(rtlpriv, REG_GPIO_MUXCFG + 1);
976 bytetmp &= ~BIT(4);
977 rtl_write_byte(rtlpriv, REG_GPIO_MUXCFG + 1, bytetmp);
978
979 rtl_write_word(rtlpriv, REG_CR, 0x2ff);
980
981 if (!mac_func_enable) {
982 if (!_rtl8821ae_llt_table_init(hw))
983 return false;
984 }
985
986 rtl_write_dword(rtlpriv, REG_HISR, 0xffffffff);
987 rtl_write_dword(rtlpriv, REG_HISRE, 0xffffffff);
988
989 /* Enable FW Beamformer Interrupt */
990 bytetmp = rtl_read_byte(rtlpriv, REG_FWIMR + 3);
991 rtl_write_byte(rtlpriv, REG_FWIMR + 3, bytetmp | BIT(6));
992
993 wordtmp = rtl_read_word(rtlpriv, REG_TRXDMA_CTRL);
994 wordtmp &= 0xf;
995 wordtmp |= 0xF5B1;
996 rtl_write_word(rtlpriv, REG_TRXDMA_CTRL, wordtmp);
997
998 rtl_write_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 1, 0x1F);
999 rtl_write_dword(rtlpriv, REG_RCR, rtlpci->receive_config);
1000 rtl_write_word(rtlpriv, REG_RXFLTMAP2, 0xFFFF);
1001 /*low address*/
1002 rtl_write_dword(rtlpriv, REG_BCNQ_DESA,
1003 rtlpci->tx_ring[BEACON_QUEUE].dma & DMA_BIT_MASK(32));
1004 rtl_write_dword(rtlpriv, REG_MGQ_DESA,
1005 rtlpci->tx_ring[MGNT_QUEUE].dma & DMA_BIT_MASK(32));
1006 rtl_write_dword(rtlpriv, REG_VOQ_DESA,
1007 rtlpci->tx_ring[VO_QUEUE].dma & DMA_BIT_MASK(32));
1008 rtl_write_dword(rtlpriv, REG_VIQ_DESA,
1009 rtlpci->tx_ring[VI_QUEUE].dma & DMA_BIT_MASK(32));
1010 rtl_write_dword(rtlpriv, REG_BEQ_DESA,
1011 rtlpci->tx_ring[BE_QUEUE].dma & DMA_BIT_MASK(32));
1012 rtl_write_dword(rtlpriv, REG_BKQ_DESA,
1013 rtlpci->tx_ring[BK_QUEUE].dma & DMA_BIT_MASK(32));
1014 rtl_write_dword(rtlpriv, REG_HQ_DESA,
1015 rtlpci->tx_ring[HIGH_QUEUE].dma & DMA_BIT_MASK(32));
1016 rtl_write_dword(rtlpriv, REG_RX_DESA,
1017 rtlpci->rx_ring[RX_MPDU_QUEUE].dma & DMA_BIT_MASK(32));
1018
1019 rtl_write_byte(rtlpriv, REG_PCIE_CTRL_REG + 3, 0x77);
1020
1021 rtl_write_dword(rtlpriv, REG_INT_MIG, 0);
1022
1023 rtl_write_dword(rtlpriv, REG_MCUTST_1, 0);
1024
1025 rtl_write_byte(rtlpriv, REG_SECONDARY_CCA_CTRL, 0x3);
1026 _rtl8821ae_gen_refresh_led_state(hw);
1027
1028 return true;
1029}
1030
1031static void _rtl8821ae_hw_configure(struct ieee80211_hw *hw)
1032{
1033 struct rtl_priv *rtlpriv = rtl_priv(hw);
1034 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1035 u32 reg_rrsr;
1036
1037 reg_rrsr = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
1038
1039 rtl_write_dword(rtlpriv, REG_RRSR, reg_rrsr);
1040 /* ARFB table 9 for 11ac 5G 2SS */
1041 rtl_write_dword(rtlpriv, REG_ARFR0 + 4, 0xfffff000);
1042 /* ARFB table 10 for 11ac 5G 1SS */
1043 rtl_write_dword(rtlpriv, REG_ARFR1 + 4, 0x003ff000);
1044 /* ARFB table 11 for 11ac 24G 1SS */
1045 rtl_write_dword(rtlpriv, REG_ARFR2, 0x00000015);
1046 rtl_write_dword(rtlpriv, REG_ARFR2 + 4, 0x003ff000);
1047 /* ARFB table 12 for 11ac 24G 1SS */
1048 rtl_write_dword(rtlpriv, REG_ARFR3, 0x00000015);
1049 rtl_write_dword(rtlpriv, REG_ARFR3 + 4, 0xffcff000);
1050 /* 0x420[7] = 0 , enable retry AMPDU in new AMPD not singal MPDU. */
1051 rtl_write_word(rtlpriv, REG_FWHW_TXQ_CTRL, 0x1F00);
1052 rtl_write_byte(rtlpriv, REG_AMPDU_MAX_TIME, 0x70);
1053
1054 /*Set retry limit*/
1055 rtl_write_word(rtlpriv, REG_RL, 0x0707);
1056
1057 /* Set Data / Response auto rate fallack retry count*/
1058 rtl_write_dword(rtlpriv, REG_DARFRC, 0x01000000);
1059 rtl_write_dword(rtlpriv, REG_DARFRC + 4, 0x07060504);
1060 rtl_write_dword(rtlpriv, REG_RARFRC, 0x01000000);
1061 rtl_write_dword(rtlpriv, REG_RARFRC + 4, 0x07060504);
1062
1063 rtlpci->reg_bcn_ctrl_val = 0x1d;
1064 rtl_write_byte(rtlpriv, REG_BCN_CTRL, rtlpci->reg_bcn_ctrl_val);
1065
1066 /* TBTT prohibit hold time. Suggested by designer TimChen. */
1067 rtl_write_byte(rtlpriv, REG_TBTT_PROHIBIT + 1, 0xff);
1068
1069 /* AGGR_BK_TIME Reg51A 0x16 */
1070 rtl_write_word(rtlpriv, REG_NAV_PROT_LEN, 0x0040);
1071
1072 /*For Rx TP. Suggested by SD1 Richard. Added by tynli. 2010.04.12.*/
1073 rtl_write_dword(rtlpriv, REG_FAST_EDCA_CTRL, 0x03086666);
1074
1075 rtl_write_byte(rtlpriv, REG_HT_SINGLE_AMPDU, 0x80);
1076 rtl_write_byte(rtlpriv, REG_RX_PKT_LIMIT, 0x20);
1077 rtl_write_word(rtlpriv, REG_MAX_AGGR_NUM, 0x1F1F);
1078}
1079
1080static u16 _rtl8821ae_mdio_read(struct rtl_priv *rtlpriv, u8 addr)
1081{
1082 u16 ret = 0;
1083 u8 tmp = 0, count = 0;
1084
1085 rtl_write_byte(rtlpriv, REG_MDIO_CTL, addr | BIT(6));
1086 tmp = rtl_read_byte(rtlpriv, REG_MDIO_CTL) & BIT(6);
1087 count = 0;
1088 while (tmp && count < 20) {
1089 udelay(10);
1090 tmp = rtl_read_byte(rtlpriv, REG_MDIO_CTL) & BIT(6);
1091 count++;
1092 }
1093 if (0 == tmp)
1094 ret = rtl_read_word(rtlpriv, REG_MDIO_RDATA);
1095
1096 return ret;
1097}
1098
1099static void _rtl8821ae_mdio_write(struct rtl_priv *rtlpriv, u8 addr, u16 data)
1100{
1101 u8 tmp = 0, count = 0;
1102
1103 rtl_write_word(rtlpriv, REG_MDIO_WDATA, data);
1104 rtl_write_byte(rtlpriv, REG_MDIO_CTL, addr | BIT(5));
1105 tmp = rtl_read_byte(rtlpriv, REG_MDIO_CTL) & BIT(5);
1106 count = 0;
1107 while (tmp && count < 20) {
1108 udelay(10);
1109 tmp = rtl_read_byte(rtlpriv, REG_MDIO_CTL) & BIT(5);
1110 count++;
1111 }
1112}
1113
1114static u8 _rtl8821ae_dbi_read(struct rtl_priv *rtlpriv, u16 addr)
1115{
1116 u16 read_addr = addr & 0xfffc;
1117 u8 tmp = 0, count = 0, ret = 0;
1118
1119 rtl_write_word(rtlpriv, REG_DBI_ADDR, read_addr);
1120 rtl_write_byte(rtlpriv, REG_DBI_FLAG, 0x2);
1121 tmp = rtl_read_byte(rtlpriv, REG_DBI_FLAG);
1122 count = 0;
1123 while (tmp && count < 20) {
1124 udelay(10);
1125 tmp = rtl_read_byte(rtlpriv, REG_DBI_FLAG);
1126 count++;
1127 }
1128 if (0 == tmp) {
1129 read_addr = REG_DBI_RDATA + addr % 4;
1130 ret = rtl_read_word(rtlpriv, read_addr);
1131 }
1132 return ret;
1133}
1134
1135static void _rtl8821ae_dbi_write(struct rtl_priv *rtlpriv, u16 addr, u8 data)
1136{
1137 u8 tmp = 0, count = 0;
1138 u16 wrtie_addr, remainder = addr % 4;
1139
1140 wrtie_addr = REG_DBI_WDATA + remainder;
1141 rtl_write_byte(rtlpriv, wrtie_addr, data);
1142
1143 wrtie_addr = (addr & 0xfffc) | (BIT(0) << (remainder + 12));
1144 rtl_write_word(rtlpriv, REG_DBI_ADDR, wrtie_addr);
1145
1146 rtl_write_byte(rtlpriv, REG_DBI_FLAG, 0x1);
1147
1148 tmp = rtl_read_byte(rtlpriv, REG_DBI_FLAG);
1149 count = 0;
1150 while (tmp && count < 20) {
1151 udelay(10);
1152 tmp = rtl_read_byte(rtlpriv, REG_DBI_FLAG);
1153 count++;
1154 }
1155}
1156
1157static void _rtl8821ae_enable_aspm_back_door(struct ieee80211_hw *hw)
1158{
1159 struct rtl_priv *rtlpriv = rtl_priv(hw);
1160 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1161 u8 tmp;
1162
1163 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
1164 if (_rtl8821ae_mdio_read(rtlpriv, 0x04) != 0x8544)
1165 _rtl8821ae_mdio_write(rtlpriv, 0x04, 0x8544);
1166
1167 if (_rtl8821ae_mdio_read(rtlpriv, 0x0b) != 0x0070)
1168 _rtl8821ae_mdio_write(rtlpriv, 0x0b, 0x0070);
1169 }
1170
1171 tmp = _rtl8821ae_dbi_read(rtlpriv, 0x70f);
1172 _rtl8821ae_dbi_write(rtlpriv, 0x70f, tmp | BIT(7));
1173
1174 tmp = _rtl8821ae_dbi_read(rtlpriv, 0x719);
1175 _rtl8821ae_dbi_write(rtlpriv, 0x719, tmp | BIT(3) | BIT(4));
1176
1177 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
1178 tmp = _rtl8821ae_dbi_read(rtlpriv, 0x718);
1179 _rtl8821ae_dbi_write(rtlpriv, 0x718, tmp|BIT(4));
1180 }
1181}
1182
1183void rtl8821ae_enable_hw_security_config(struct ieee80211_hw *hw)
1184{
1185 struct rtl_priv *rtlpriv = rtl_priv(hw);
1186 u8 sec_reg_value;
1187 u8 tmp;
1188
1189 RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
1190 "PairwiseEncAlgorithm = %d GroupEncAlgorithm = %d\n",
1191 rtlpriv->sec.pairwise_enc_algorithm,
1192 rtlpriv->sec.group_enc_algorithm);
1193
1194 if (rtlpriv->cfg->mod_params->sw_crypto || rtlpriv->sec.use_sw_sec) {
1195 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
1196 "not open hw encryption\n");
1197 return;
1198 }
1199
1200 sec_reg_value = SCR_TXENCENABLE | SCR_RXDECENABLE;
1201
1202 if (rtlpriv->sec.use_defaultkey) {
1203 sec_reg_value |= SCR_TXUSEDK;
1204 sec_reg_value |= SCR_RXUSEDK;
1205 }
1206
1207 sec_reg_value |= (SCR_RXBCUSEDK | SCR_TXBCUSEDK);
1208
1209 tmp = rtl_read_byte(rtlpriv, REG_CR + 1);
1210 rtl_write_byte(rtlpriv, REG_CR + 1, tmp | BIT(1));
1211
1212 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
1213 "The SECR-value %x\n", sec_reg_value);
1214
1215 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_WPA_CONFIG, &sec_reg_value);
1216}
1217
1218/* Static MacID Mapping (cf. Used in MacIdDoStaticMapping) ---------- */
1219#define MAC_ID_STATIC_FOR_DEFAULT_PORT 0
1220#define MAC_ID_STATIC_FOR_BROADCAST_MULTICAST 1
1221#define MAC_ID_STATIC_FOR_BT_CLIENT_START 2
1222#define MAC_ID_STATIC_FOR_BT_CLIENT_END 3
1223/* ----------------------------------------------------------- */
1224
1225static void rtl8821ae_macid_initialize_mediastatus(struct ieee80211_hw *hw)
1226{
1227 struct rtl_priv *rtlpriv = rtl_priv(hw);
1228 u8 media_rpt[4] = {RT_MEDIA_CONNECT, 1,
1229 MAC_ID_STATIC_FOR_BROADCAST_MULTICAST,
1230 MAC_ID_STATIC_FOR_BT_CLIENT_END};
1231
1232 rtlpriv->cfg->ops->set_hw_reg(hw,
1233 HW_VAR_H2C_FW_MEDIASTATUSRPT, media_rpt);
1234
1235 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1236 "Initialize MacId media status: from %d to %d\n",
1237 MAC_ID_STATIC_FOR_BROADCAST_MULTICAST,
1238 MAC_ID_STATIC_FOR_BT_CLIENT_END);
1239}
1240
1241static bool _rtl8821ae_check_pcie_dma_hang(struct ieee80211_hw *hw)
1242{
1243 struct rtl_priv *rtlpriv = rtl_priv(hw);
1244 u8 tmp;
1245
1246 /* write reg 0x350 Bit[26]=1. Enable debug port. */
1247 tmp = rtl_read_byte(rtlpriv, REG_DBI_CTRL + 3);
1248 if (!(tmp & BIT(2))) {
1249 rtl_write_byte(rtlpriv, REG_DBI_CTRL + 3, (tmp | BIT(2)));
1250 mdelay(100);
1251 }
1252
1253 /* read reg 0x350 Bit[25] if 1 : RX hang */
1254 /* read reg 0x350 Bit[24] if 1 : TX hang */
1255 tmp = rtl_read_byte(rtlpriv, REG_DBI_CTRL + 3);
1256 if ((tmp & BIT(0)) || (tmp & BIT(1))) {
1257 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1258 "CheckPcieDMAHang8821AE(): true! Reset PCIE DMA!\n");
1259 return true;
1260 } else {
1261 return false;
1262 }
1263}
1264
1265static bool _rtl8821ae_reset_pcie_interface_dma(struct ieee80211_hw *hw,
1266 bool mac_power_on,
1267 bool in_watchdog)
1268{
1269 struct rtl_priv *rtlpriv = rtl_priv(hw);
1270 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1271 u8 tmp;
1272 bool release_mac_rx_pause;
1273 u8 backup_pcie_dma_pause;
1274
1275 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "\n");
1276
1277 /* 1. Disable register write lock. 0x1c[1] = 0 */
1278 tmp = rtl_read_byte(rtlpriv, REG_RSV_CTRL);
1279 tmp &= ~(BIT(1));
1280 rtl_write_byte(rtlpriv, REG_RSV_CTRL, tmp);
1281 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
1282 /* write 0xCC bit[2] = 1'b1 */
1283 tmp = rtl_read_byte(rtlpriv, REG_PMC_DBG_CTRL2);
1284 tmp |= BIT(2);
1285 rtl_write_byte(rtlpriv, REG_PMC_DBG_CTRL2, tmp);
1286 }
1287
1288 /* 2. Check and pause TRX DMA */
1289 /* write 0x284 bit[18] = 1'b1 */
1290 /* write 0x301 = 0xFF */
1291 tmp = rtl_read_byte(rtlpriv, REG_RXDMA_CONTROL);
1292 if (tmp & BIT(2)) {
1293 /* Already pause before the function for another purpose. */
1294 release_mac_rx_pause = false;
1295 } else {
1296 rtl_write_byte(rtlpriv, REG_RXDMA_CONTROL, (tmp | BIT(2)));
1297 release_mac_rx_pause = true;
1298 }
1299 backup_pcie_dma_pause = rtl_read_byte(rtlpriv, REG_PCIE_CTRL_REG + 1);
1300 if (backup_pcie_dma_pause != 0xFF)
1301 rtl_write_byte(rtlpriv, REG_PCIE_CTRL_REG + 1, 0xFF);
1302
1303 if (mac_power_on) {
1304 /* 3. reset TRX function */
1305 /* write 0x100 = 0x00 */
1306 rtl_write_byte(rtlpriv, REG_CR, 0);
1307 }
1308
1309 /* 4. Reset PCIe DMA. 0x3[0] = 0 */
1310 tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN + 1);
1311 tmp &= ~(BIT(0));
1312 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN + 1, tmp);
1313
1314 /* 5. Enable PCIe DMA. 0x3[0] = 1 */
1315 tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN + 1);
1316 tmp |= BIT(0);
1317 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN + 1, tmp);
1318
1319 if (mac_power_on) {
1320 /* 6. enable TRX function */
1321 /* write 0x100 = 0xFF */
1322 rtl_write_byte(rtlpriv, REG_CR, 0xFF);
1323
1324 /* We should init LLT & RQPN and
1325 * prepare Tx/Rx descrptor address later
1326 * because MAC function is reset.*/
1327 }
1328
1329 /* 7. Restore PCIe autoload down bit */
1330 /* 8812AE does not has the defination. */
1331 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
1332 /* write 0xF8 bit[17] = 1'b1 */
1333 tmp = rtl_read_byte(rtlpriv, REG_MAC_PHY_CTRL_NORMAL + 2);
1334 tmp |= BIT(1);
1335 rtl_write_byte(rtlpriv, REG_MAC_PHY_CTRL_NORMAL + 2, tmp);
1336 }
1337
1338 /* In MAC power on state, BB and RF maybe in ON state,
1339 * if we release TRx DMA here.
1340 * it will cause packets to be started to Tx/Rx,
1341 * so we release Tx/Rx DMA later.*/
1342 if (!mac_power_on/* || in_watchdog*/) {
1343 /* 8. release TRX DMA */
1344 /* write 0x284 bit[18] = 1'b0 */
1345 /* write 0x301 = 0x00 */
1346 if (release_mac_rx_pause) {
1347 tmp = rtl_read_byte(rtlpriv, REG_RXDMA_CONTROL);
1348 rtl_write_byte(rtlpriv, REG_RXDMA_CONTROL,
1349 tmp & (~BIT(2)));
1350 }
1351 rtl_write_byte(rtlpriv, REG_PCIE_CTRL_REG + 1,
1352 backup_pcie_dma_pause);
1353 }
1354
1355 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
1356 /* 9. lock system register */
1357 /* write 0xCC bit[2] = 1'b0 */
1358 tmp = rtl_read_byte(rtlpriv, REG_PMC_DBG_CTRL2);
1359 tmp &= ~(BIT(2));
1360 rtl_write_byte(rtlpriv, REG_PMC_DBG_CTRL2, tmp);
1361 }
1362 return true;
1363}
1364
1365static void _rtl8821ae_get_wakeup_reason(struct ieee80211_hw *hw)
1366{
1367 struct rtl_priv *rtlpriv = rtl_priv(hw);
1368 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1369 struct rtl_ps_ctl *ppsc = rtl_psc(rtlpriv);
1370 u8 fw_reason = 0;
1371 struct timeval ts;
1372
1373 fw_reason = rtl_read_byte(rtlpriv, REG_MCUTST_WOWLAN);
1374
1375 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, "WOL Read 0x1c7 = %02X\n",
1376 fw_reason);
1377
1378 ppsc->wakeup_reason = 0;
1379
1380 rtlhal->last_suspend_sec = ts.tv_sec;
1381
1382 switch (fw_reason) {
1383 case FW_WOW_V2_PTK_UPDATE_EVENT:
1384 ppsc->wakeup_reason = WOL_REASON_PTK_UPDATE;
1385 do_gettimeofday(&ts);
1386 ppsc->last_wakeup_time = ts.tv_sec*1000 + ts.tv_usec/1000;
1387 RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG,
1388 "It's a WOL PTK Key update event!\n");
1389 break;
1390 case FW_WOW_V2_GTK_UPDATE_EVENT:
1391 ppsc->wakeup_reason = WOL_REASON_GTK_UPDATE;
1392 do_gettimeofday(&ts);
1393 ppsc->last_wakeup_time = ts.tv_sec*1000 + ts.tv_usec/1000;
1394 RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG,
1395 "It's a WOL GTK Key update event!\n");
1396 break;
1397 case FW_WOW_V2_DISASSOC_EVENT:
1398 ppsc->wakeup_reason = WOL_REASON_DISASSOC;
1399 RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG,
1400 "It's a disassociation event!\n");
1401 break;
1402 case FW_WOW_V2_DEAUTH_EVENT:
1403 ppsc->wakeup_reason = WOL_REASON_DEAUTH;
1404 RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG,
1405 "It's a deauth event!\n");
1406 break;
1407 case FW_WOW_V2_FW_DISCONNECT_EVENT:
1408 ppsc->wakeup_reason = WOL_REASON_AP_LOST;
1409 RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG,
1410 "It's a Fw disconnect decision (AP lost) event!\n");
1411 break;
1412 case FW_WOW_V2_MAGIC_PKT_EVENT:
1413 ppsc->wakeup_reason = WOL_REASON_MAGIC_PKT;
1414 RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG,
1415 "It's a magic packet event!\n");
1416 break;
1417 case FW_WOW_V2_UNICAST_PKT_EVENT:
1418 ppsc->wakeup_reason = WOL_REASON_UNICAST_PKT;
1419 RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG,
1420 "It's an unicast packet event!\n");
1421 break;
1422 case FW_WOW_V2_PATTERN_PKT_EVENT:
1423 ppsc->wakeup_reason = WOL_REASON_PATTERN_PKT;
1424 RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG,
1425 "It's a pattern match event!\n");
1426 break;
1427 case FW_WOW_V2_RTD3_SSID_MATCH_EVENT:
1428 ppsc->wakeup_reason = WOL_REASON_RTD3_SSID_MATCH;
1429 RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG,
1430 "It's an RTD3 Ssid match event!\n");
1431 break;
1432 case FW_WOW_V2_REALWOW_V2_WAKEUPPKT:
1433 ppsc->wakeup_reason = WOL_REASON_REALWOW_V2_WAKEUPPKT;
1434 RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG,
1435 "It's an RealWoW wake packet event!\n");
1436 break;
1437 case FW_WOW_V2_REALWOW_V2_ACKLOST:
1438 ppsc->wakeup_reason = WOL_REASON_REALWOW_V2_ACKLOST;
1439 RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG,
1440 "It's an RealWoW ack lost event!\n");
1441 break;
1442 default:
1443 RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG,
1444 "WOL Read 0x1c7 = %02X, Unknown reason!\n",
1445 fw_reason);
1446 break;
1447 }
1448}
1449
1450static void _rtl8821ae_init_trx_desc_hw_address(struct ieee80211_hw *hw)
1451{
1452 struct rtl_priv *rtlpriv = rtl_priv(hw);
1453 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1454
1455 /*low address*/
1456 rtl_write_dword(rtlpriv, REG_BCNQ_DESA,
1457 rtlpci->tx_ring[BEACON_QUEUE].dma & DMA_BIT_MASK(32));
1458 rtl_write_dword(rtlpriv, REG_MGQ_DESA,
1459 rtlpci->tx_ring[MGNT_QUEUE].dma & DMA_BIT_MASK(32));
1460 rtl_write_dword(rtlpriv, REG_VOQ_DESA,
1461 rtlpci->tx_ring[VO_QUEUE].dma & DMA_BIT_MASK(32));
1462 rtl_write_dword(rtlpriv, REG_VIQ_DESA,
1463 rtlpci->tx_ring[VI_QUEUE].dma & DMA_BIT_MASK(32));
1464 rtl_write_dword(rtlpriv, REG_BEQ_DESA,
1465 rtlpci->tx_ring[BE_QUEUE].dma & DMA_BIT_MASK(32));
1466 rtl_write_dword(rtlpriv, REG_BKQ_DESA,
1467 rtlpci->tx_ring[BK_QUEUE].dma & DMA_BIT_MASK(32));
1468 rtl_write_dword(rtlpriv, REG_HQ_DESA,
1469 rtlpci->tx_ring[HIGH_QUEUE].dma & DMA_BIT_MASK(32));
1470 rtl_write_dword(rtlpriv, REG_RX_DESA,
1471 rtlpci->rx_ring[RX_MPDU_QUEUE].dma & DMA_BIT_MASK(32));
1472}
1473
1474static bool _rtl8821ae_init_llt_table(struct ieee80211_hw *hw, u32 boundary)
1475{
1476 bool status = true;
1477 u32 i;
1478 u32 txpktbuf_bndy = boundary;
1479 u32 last_entry_of_txpktbuf = LAST_ENTRY_OF_TX_PKT_BUFFER;
1480
1481 for (i = 0 ; i < (txpktbuf_bndy - 1) ; i++) {
1482 status = _rtl8821ae_llt_write(hw, i , i + 1);
1483 if (!status)
1484 return status;
1485 }
1486
1487 status = _rtl8821ae_llt_write(hw, (txpktbuf_bndy - 1), 0xFF);
1488 if (!status)
1489 return status;
1490
1491 for (i = txpktbuf_bndy ; i < last_entry_of_txpktbuf ; i++) {
1492 status = _rtl8821ae_llt_write(hw, i, (i + 1));
1493 if (!status)
1494 return status;
1495 }
1496
1497 status = _rtl8821ae_llt_write(hw, last_entry_of_txpktbuf,
1498 txpktbuf_bndy);
1499 if (!status)
1500 return status;
1501
1502 return status;
1503}
1504
1505static bool _rtl8821ae_dynamic_rqpn(struct ieee80211_hw *hw, u32 boundary,
1506 u16 npq_rqpn_value, u32 rqpn_val)
1507{
1508 struct rtl_priv *rtlpriv = rtl_priv(hw);
1509 u8 tmp;
1510 bool ret = true;
1511 u16 count = 0, tmp16;
1512 bool support_remote_wakeup;
1513
1514 rtlpriv->cfg->ops->get_hw_reg(hw, HAL_DEF_WOWLAN,
1515 (u8 *)(&support_remote_wakeup));
1516
1517 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1518 "boundary=0x%#X, NPQ_RQPNValue=0x%#X, RQPNValue=0x%#X\n",
1519 boundary, npq_rqpn_value, rqpn_val);
1520
1521 /* stop PCIe DMA
1522 * 1. 0x301[7:0] = 0xFE */
1523 rtl_write_byte(rtlpriv, REG_PCIE_CTRL_REG + 1, 0xFE);
1524
1525 /* wait TXFF empty
1526 * 2. polling till 0x41A[15:0]=0x07FF */
1527 tmp16 = rtl_read_word(rtlpriv, REG_TXPKT_EMPTY);
1528 while ((tmp16 & 0x07FF) != 0x07FF) {
1529 udelay(100);
1530 tmp16 = rtl_read_word(rtlpriv, REG_TXPKT_EMPTY);
1531 count++;
1532 if ((count % 200) == 0) {
1533 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1534 "Tx queue is not empty for 20ms!\n");
1535 }
1536 if (count >= 1000) {
1537 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1538 "Wait for Tx FIFO empty timeout!\n");
1539 break;
1540 }
1541 }
1542
1543 /* TX pause
1544 * 3. reg 0x522=0xFF */
1545 rtl_write_byte(rtlpriv, REG_TXPAUSE, 0xFF);
1546
1547 /* Wait TX State Machine OK
1548 * 4. polling till reg 0x5FB~0x5F8 = 0x00000000 for 50ms */
1549 count = 0;
1550 while (rtl_read_byte(rtlpriv, REG_SCH_TXCMD) != 0) {
1551 udelay(100);
1552 count++;
1553 if (count >= 500) {
1554 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1555 "Wait for TX State Machine ready timeout !!\n");
1556 break;
1557 }
1558 }
1559
1560 /* stop RX DMA path
1561 * 5. 0x284[18] = 1
1562 * 6. wait till 0x284[17] == 1
1563 * wait RX DMA idle */
1564 count = 0;
1565 tmp = rtl_read_byte(rtlpriv, REG_RXDMA_CONTROL);
1566 rtl_write_byte(rtlpriv, REG_RXDMA_CONTROL, (tmp | BIT(2)));
1567 do {
1568 tmp = rtl_read_byte(rtlpriv, REG_RXDMA_CONTROL);
1569 udelay(10);
1570 count++;
1571 } while (!(tmp & BIT(1)) && count < 100);
1572
1573 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1574 "Wait until Rx DMA Idle. count=%d REG[0x286]=0x%x\n",
1575 count, tmp);
1576
1577 /* reset BB
1578 * 7. 0x02 [0] = 0 */
1579 tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN);
1580 tmp &= ~(BIT(0));
1581 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, tmp);
1582
1583 /* Reset TRX MAC
1584 * 8. 0x100 = 0x00
1585 * Delay (1ms) */
1586 rtl_write_byte(rtlpriv, REG_CR, 0x00);
1587 udelay(1000);
1588
1589 /* Disable MAC Security Engine
1590 * 9. 0x100 bit[9]=0 */
1591 tmp = rtl_read_byte(rtlpriv, REG_CR + 1);
1592 tmp &= ~(BIT(1));
1593 rtl_write_byte(rtlpriv, REG_CR + 1, tmp);
1594
1595 /* To avoid DD-Tim Circuit hang
1596 * 10. 0x553 bit[5]=1 */
1597 tmp = rtl_read_byte(rtlpriv, REG_DUAL_TSF_RST);
1598 rtl_write_byte(rtlpriv, REG_DUAL_TSF_RST, (tmp | BIT(5)));
1599
1600 /* Enable MAC Security Engine
1601 * 11. 0x100 bit[9]=1 */
1602 tmp = rtl_read_byte(rtlpriv, REG_CR + 1);
1603 rtl_write_byte(rtlpriv, REG_CR + 1, (tmp | BIT(1)));
1604
1605 /* Enable TRX MAC
1606 * 12. 0x100 = 0xFF
1607 * Delay (1ms) */
1608 rtl_write_byte(rtlpriv, REG_CR, 0xFF);
1609 udelay(1000);
1610
1611 /* Enable BB
1612 * 13. 0x02 [0] = 1 */
1613 tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN);
1614 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, (tmp | BIT(0)));
1615
1616 /* beacon setting
1617 * 14,15. set beacon head page (reg 0x209 and 0x424) */
1618 rtl_write_byte(rtlpriv, REG_TDECTRL + 1, (u8)boundary);
1619 rtl_write_byte(rtlpriv, REG_TXPKTBUF_BCNQ_BDNY, (u8)boundary);
1620 rtl_write_byte(rtlpriv, REG_TXPKTBUF_MGQ_BDNY, (u8)boundary);
1621
1622 /* 16. WMAC_LBK_BF_HD 0x45D[7:0]
1623 * WMAC_LBK_BF_HD */
1624 rtl_write_byte(rtlpriv, REG_TXPKTBUF_WMAC_LBK_BF_HD,
1625 (u8)boundary);
1626
1627 rtl_write_word(rtlpriv, REG_TRXFF_BNDY, boundary);
1628
1629 /* init LLT
1630 * 17. init LLT */
1631 if (!_rtl8821ae_init_llt_table(hw, boundary)) {
1632 RT_TRACE(rtlpriv, COMP_INIT, DBG_WARNING,
1633 "Failed to init LLT table!\n");
1634 return false;
1635 }
1636
1637 /* reallocate RQPN
1638 * 18. reallocate RQPN and init LLT */
1639 rtl_write_word(rtlpriv, REG_RQPN_NPQ, npq_rqpn_value);
1640 rtl_write_dword(rtlpriv, REG_RQPN, rqpn_val);
1641
1642 /* release Tx pause
1643 * 19. 0x522=0x00 */
1644 rtl_write_byte(rtlpriv, REG_TXPAUSE, 0x00);
1645
1646 /* enable PCIE DMA
1647 * 20. 0x301[7:0] = 0x00
1648 * 21. 0x284[18] = 0 */
1649 rtl_write_byte(rtlpriv, REG_PCIE_CTRL_REG + 1, 0x00);
1650 tmp = rtl_read_byte(rtlpriv, REG_RXDMA_CONTROL);
1651 rtl_write_byte(rtlpriv, REG_RXDMA_CONTROL, (tmp&~BIT(2)));
1652
1653 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "End.\n");
1654 return ret;
1655}
1656
1657static void _rtl8821ae_simple_initialize_adapter(struct ieee80211_hw *hw)
1658{
1659 struct rtl_priv *rtlpriv = rtl_priv(hw);
1660 struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
1661 struct rtl_ps_ctl *ppsc = rtl_psc(rtlpriv);
1662
1663#if (USE_SPECIFIC_FW_TO_SUPPORT_WOWLAN == 1)
1664 /* Re-download normal Fw. */
1665 rtl8821ae_set_fw_related_for_wowlan(hw, false);
1666#endif
1667
1668 /* Re-Initialize LLT table. */
1669 if (rtlhal->re_init_llt_table) {
1670 u32 rqpn = 0x80e70808;
1671 u8 rqpn_npq = 0, boundary = 0xF8;
1672 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
1673 rqpn = 0x80e90808;
1674 boundary = 0xFA;
1675 }
1676 if (_rtl8821ae_dynamic_rqpn(hw, boundary, rqpn_npq, rqpn))
1677 rtlhal->re_init_llt_table = false;
1678 }
1679
1680 ppsc->rfpwr_state = ERFON;
1681}
1682
1683static void _rtl8821ae_enable_l1off(struct ieee80211_hw *hw)
1684{
1685 u8 tmp = 0;
1686 struct rtl_priv *rtlpriv = rtl_priv(hw);
1687
1688 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "--->\n");
1689
1690 tmp = _rtl8821ae_dbi_read(rtlpriv, 0x160);
1691 if (!(tmp & (BIT(2) | BIT(3)))) {
1692 RT_TRACE(rtlpriv, COMP_POWER | COMP_INIT, DBG_LOUD,
1693 "0x160(%#x)return!!\n", tmp);
1694 return;
1695 }
1696
1697 tmp = _rtl8821ae_mdio_read(rtlpriv, 0x1b);
1698 _rtl8821ae_mdio_write(rtlpriv, 0x1b, (tmp | BIT(4)));
1699
1700 tmp = _rtl8821ae_dbi_read(rtlpriv, 0x718);
1701 _rtl8821ae_dbi_write(rtlpriv, 0x718, tmp | BIT(5));
1702
1703 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "<---\n");
1704}
1705
1706static void _rtl8821ae_enable_ltr(struct ieee80211_hw *hw)
1707{
1708 u8 tmp = 0;
1709 struct rtl_priv *rtlpriv = rtl_priv(hw);
1710
1711 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "--->\n");
1712
1713 /* Check 0x98[10] */
1714 tmp = _rtl8821ae_dbi_read(rtlpriv, 0x99);
1715 if (!(tmp & BIT(2))) {
1716 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1717 "<---0x99(%#x) return!!\n", tmp);
1718 return;
1719 }
1720
1721 /* LTR idle latency, 0x90 for 144us */
1722 rtl_write_dword(rtlpriv, 0x798, 0x88908890);
1723
1724 /* LTR active latency, 0x3c for 60us */
1725 rtl_write_dword(rtlpriv, 0x79c, 0x883c883c);
1726
1727 tmp = rtl_read_byte(rtlpriv, 0x7a4);
1728 rtl_write_byte(rtlpriv, 0x7a4, (tmp | BIT(4)));
1729
1730 tmp = rtl_read_byte(rtlpriv, 0x7a4);
1731 rtl_write_byte(rtlpriv, 0x7a4, (tmp & (~BIT(0))));
1732 rtl_write_byte(rtlpriv, 0x7a4, (tmp | BIT(0)));
1733
1734 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "<---\n");
1735}
1736
1737static bool _rtl8821ae_wowlan_initialize_adapter(struct ieee80211_hw *hw)
1738{
1739 struct rtl_priv *rtlpriv = rtl_priv(hw);
1740 struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
1741 bool init_finished = true;
1742 u8 tmp = 0;
1743
1744 /* Get Fw wake up reason. */
1745 _rtl8821ae_get_wakeup_reason(hw);
1746
1747 /* Patch Pcie Rx DMA hang after S3/S4 several times.
1748 * The root cause has not be found. */
1749 if (_rtl8821ae_check_pcie_dma_hang(hw))
1750 _rtl8821ae_reset_pcie_interface_dma(hw, true, false);
1751
1752 /* Prepare Tx/Rx Desc Hw address. */
1753 _rtl8821ae_init_trx_desc_hw_address(hw);
1754
1755 /* Release Pcie Interface Rx DMA to allow wake packet DMA. */
1756 rtl_write_byte(rtlpriv, REG_PCIE_CTRL_REG + 1, 0xFE);
1757 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, "Enable PCIE Rx DMA.\n");
1758
1759 /* Check wake up event.
1760 * We should check wake packet bit before disable wowlan by H2C or
1761 * Fw will clear the bit. */
1762 tmp = rtl_read_byte(rtlpriv, REG_FTISR + 3);
1763 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
1764 "Read REG_FTISR 0x13f = %#X\n", tmp);
1765
1766 /* Set the WoWLAN related function control disable. */
1767 rtl8821ae_set_fw_wowlan_mode(hw, false);
1768 rtl8821ae_set_fw_remote_wake_ctrl_cmd(hw, 0);
1769
1770 if (rtlhal->hw_rof_enable) {
1771 tmp = rtl_read_byte(rtlpriv, REG_HSISR + 3);
1772 if (tmp & BIT(1)) {
1773 /* Clear GPIO9 ISR */
1774 rtl_write_byte(rtlpriv, REG_HSISR + 3, tmp | BIT(1));
1775 init_finished = false;
1776 } else {
1777 init_finished = true;
1778 }
1779 }
1780
1781 if (init_finished) {
1782 _rtl8821ae_simple_initialize_adapter(hw);
1783
1784 /* Release Pcie Interface Tx DMA. */
1785 rtl_write_byte(rtlpriv, REG_PCIE_CTRL_REG + 1, 0x00);
1786 /* Release Pcie RX DMA */
1787 rtl_write_byte(rtlpriv, REG_RXDMA_CONTROL, 0x02);
1788
1789 tmp = rtl_read_byte(rtlpriv, REG_CR + 1);
1790 rtl_write_byte(rtlpriv, REG_CR + 1, (tmp & (~BIT(0))));
1791
1792 _rtl8821ae_enable_l1off(hw);
1793 _rtl8821ae_enable_ltr(hw);
1794 }
1795
1796 return init_finished;
1797}
1798
1799static void _rtl8812ae_bb8812_config_1t(struct ieee80211_hw *hw)
1800{
1801 /* BB OFDM RX Path_A */
1802 rtl_set_bbreg(hw, 0x808, 0xff, 0x11);
1803 /* BB OFDM TX Path_A */
1804 rtl_set_bbreg(hw, 0x80c, MASKLWORD, 0x1111);
1805 /* BB CCK R/Rx Path_A */
1806 rtl_set_bbreg(hw, 0xa04, 0x0c000000, 0x0);
1807 /* MCS support */
1808 rtl_set_bbreg(hw, 0x8bc, 0xc0000060, 0x4);
1809 /* RF Path_B HSSI OFF */
1810 rtl_set_bbreg(hw, 0xe00, 0xf, 0x4);
1811 /* RF Path_B Power Down */
1812 rtl_set_bbreg(hw, 0xe90, MASKDWORD, 0);
1813 /* ADDA Path_B OFF */
1814 rtl_set_bbreg(hw, 0xe60, MASKDWORD, 0);
1815 rtl_set_bbreg(hw, 0xe64, MASKDWORD, 0);
1816}
1817
1818static void _rtl8821ae_poweroff_adapter(struct ieee80211_hw *hw)
1819{
1820 struct rtl_priv *rtlpriv = rtl_priv(hw);
1821 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1822 u8 u1b_tmp;
1823
1824 rtlhal->mac_func_enable = false;
1825
1826 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
1827 /* Combo (PCIe + USB) Card and PCIe-MF Card */
1828 /* 1. Run LPS WL RFOFF flow */
1829 /* RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1830 "=====>CardDisableRTL8812E,RTL8821A_NIC_LPS_ENTER_FLOW\n");
1831 */
1832 rtl_hal_pwrseqcmdparsing(rtlpriv,
1833 PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK,
1834 PWR_INTF_PCI_MSK, RTL8821A_NIC_LPS_ENTER_FLOW);
1835 }
1836 /* 2. 0x1F[7:0] = 0 */
1837 /* turn off RF */
1838 /* rtl_write_byte(rtlpriv, REG_RF_CTRL, 0x00); */
1839 if ((rtl_read_byte(rtlpriv, REG_MCUFWDL) & BIT(7)) &&
1840 rtlhal->fw_ready) {
1841 rtl8821ae_firmware_selfreset(hw);
1842 }
1843
1844 /* Reset MCU. Suggested by Filen. */
1845 u1b_tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN+1);
1846 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN+1, (u1b_tmp & (~BIT(2))));
1847
1848 /* g. MCUFWDL 0x80[1:0]=0 */
1849 /* reset MCU ready status */
1850 rtl_write_byte(rtlpriv, REG_MCUFWDL, 0x00);
1851
1852 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
1853 /* HW card disable configuration. */
1854 rtl_hal_pwrseqcmdparsing(rtlpriv, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK,
1855 PWR_INTF_PCI_MSK, RTL8821A_NIC_DISABLE_FLOW);
1856 } else {
1857 /* HW card disable configuration. */
1858 rtl_hal_pwrseqcmdparsing(rtlpriv, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK,
1859 PWR_INTF_PCI_MSK, RTL8812_NIC_DISABLE_FLOW);
1860 }
1861
1862 /* Reset MCU IO Wrapper */
1863 u1b_tmp = rtl_read_byte(rtlpriv, REG_RSV_CTRL + 1);
1864 rtl_write_byte(rtlpriv, REG_RSV_CTRL + 1, (u1b_tmp & (~BIT(0))));
1865 u1b_tmp = rtl_read_byte(rtlpriv, REG_RSV_CTRL + 1);
1866 rtl_write_byte(rtlpriv, REG_RSV_CTRL + 1, u1b_tmp | BIT(0));
1867
1868 /* 7. RSV_CTRL 0x1C[7:0] = 0x0E */
1869 /* lock ISO/CLK/Power control register */
1870 rtl_write_byte(rtlpriv, REG_RSV_CTRL, 0x0e);
1871}
1872
1873int rtl8821ae_hw_init(struct ieee80211_hw *hw)
1874{
1875 struct rtl_priv *rtlpriv = rtl_priv(hw);
1876 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1877 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
1878 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
1879 bool rtstatus = true;
1880 int err;
1881 u8 tmp_u1b;
1882 bool support_remote_wakeup;
1883 u32 nav_upper = WIFI_NAV_UPPER_US;
1884
1885 rtlhal->being_init_adapter = true;
1886 rtlpriv->cfg->ops->get_hw_reg(hw, HAL_DEF_WOWLAN,
1887 (u8 *)(&support_remote_wakeup));
1888 rtlpriv->intf_ops->disable_aspm(hw);
1889
1890 /*YP wowlan not considered*/
1891
1892 tmp_u1b = rtl_read_byte(rtlpriv, REG_CR);
1893 if (tmp_u1b != 0 && tmp_u1b != 0xEA) {
1894 rtlhal->mac_func_enable = true;
1895 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1896 "MAC has already power on.\n");
1897 } else {
1898 rtlhal->mac_func_enable = false;
1899 rtlhal->fw_ps_state = FW_PS_STATE_ALL_ON_8821AE;
1900 }
1901
1902 if (support_remote_wakeup &&
1903 rtlhal->wake_from_pnp_sleep &&
1904 rtlhal->mac_func_enable) {
1905 if (_rtl8821ae_wowlan_initialize_adapter(hw)) {
1906 rtlhal->being_init_adapter = false;
1907 return 0;
1908 }
1909 }
1910
1911 if (_rtl8821ae_check_pcie_dma_hang(hw)) {
1912 _rtl8821ae_reset_pcie_interface_dma(hw,
1913 rtlhal->mac_func_enable,
1914 false);
1915 rtlhal->mac_func_enable = false;
1916 }
1917
1918 /* Reset MAC/BB/RF status if it is not powered off
1919 * before calling initialize Hw flow to prevent
1920 * from interface and MAC status mismatch.
1921 * 2013.06.21, by tynli. Suggested by SD1 JackieLau. */
1922 if (rtlhal->mac_func_enable) {
1923 _rtl8821ae_poweroff_adapter(hw);
1924 rtlhal->mac_func_enable = false;
1925 }
1926
1927 rtstatus = _rtl8821ae_init_mac(hw);
1928 if (rtstatus != true) {
1929 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "Init MAC failed\n");
1930 err = 1;
1931 return err;
1932 }
1933
1934 tmp_u1b = rtl_read_byte(rtlpriv, REG_SYS_CFG);
1935 tmp_u1b &= 0x7F;
1936 rtl_write_byte(rtlpriv, REG_SYS_CFG, tmp_u1b);
1937
1938 err = rtl8821ae_download_fw(hw, false);
1939 if (err) {
1940 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
1941 "Failed to download FW. Init HW without FW now\n");
1942 err = 1;
1943 rtlhal->fw_ready = false;
1944 return err;
1945 } else {
1946 rtlhal->fw_ready = true;
1947 }
1948 ppsc->fw_current_inpsmode = false;
1949 rtlhal->fw_ps_state = FW_PS_STATE_ALL_ON_8821AE;
1950 rtlhal->fw_clk_change_in_progress = false;
1951 rtlhal->allow_sw_to_change_hwclc = false;
1952 rtlhal->last_hmeboxnum = 0;
1953
1954 /*SIC_Init(Adapter);
1955 if(rtlhal->AMPDUBurstMode)
1956 rtl_write_byte(rtlpriv,REG_AMPDU_BURST_MODE_8812, 0x7F);*/
1957
1958 rtl8821ae_phy_mac_config(hw);
1959 /* because last function modify RCR, so we update
1960 * rcr var here, or TP will unstable for receive_config
1961 * is wrong, RX RCR_ACRC32 will cause TP unstabel & Rx
1962 * RCR_APP_ICV will cause mac80211 unassoc for cisco 1252
1963 rtlpci->receive_config = rtl_read_dword(rtlpriv, REG_RCR);
1964 rtlpci->receive_config &= ~(RCR_ACRC32 | RCR_AICV);
1965 rtl_write_dword(rtlpriv, REG_RCR, rtlpci->receive_config);*/
1966 rtl8821ae_phy_bb_config(hw);
1967
1968 rtl8821ae_phy_rf_config(hw);
1969
1970 if (rtlpriv->phy.rf_type == RF_1T1R &&
1971 rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE)
1972 _rtl8812ae_bb8812_config_1t(hw);
1973
1974 _rtl8821ae_hw_configure(hw);
1975
1976 rtl8821ae_phy_switch_wirelessband(hw, BAND_ON_2_4G);
1977
1978 /*set wireless mode*/
1979
1980 rtlhal->mac_func_enable = true;
1981
1982 rtl_cam_reset_all_entry(hw);
1983
1984 rtl8821ae_enable_hw_security_config(hw);
1985
1986 ppsc->rfpwr_state = ERFON;
1987
1988 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_ETHER_ADDR, mac->mac_addr);
1989 _rtl8821ae_enable_aspm_back_door(hw);
1990 rtlpriv->intf_ops->enable_aspm(hw);
1991
1992 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE &&
1993 (rtlhal->rfe_type == 1 || rtlhal->rfe_type == 5))
1994 rtl_set_bbreg(hw, 0x900, 0x00000303, 0x0302);
1995
1996 rtl8821ae_bt_hw_init(hw);
1997 rtlpriv->rtlhal.being_init_adapter = false;
1998
1999 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_NAV_UPPER, (u8 *)&nav_upper);
2000
2001 /* rtl8821ae_dm_check_txpower_tracking(hw); */
2002 /* rtl8821ae_phy_lc_calibrate(hw); */
2003 if (support_remote_wakeup)
2004 rtl_write_byte(rtlpriv, REG_WOW_CTRL, 0);
2005
2006 /* Release Rx DMA*/
2007 tmp_u1b = rtl_read_byte(rtlpriv, REG_RXDMA_CONTROL);
2008 if (tmp_u1b & BIT(2)) {
2009 /* Release Rx DMA if needed*/
2010 tmp_u1b &= ~BIT(2);
2011 rtl_write_byte(rtlpriv, REG_RXDMA_CONTROL, tmp_u1b);
2012 }
2013
2014 /* Release Tx/Rx PCIE DMA if*/
2015 rtl_write_byte(rtlpriv, REG_PCIE_CTRL_REG + 1, 0);
2016
2017 rtl8821ae_dm_init(hw);
2018 rtl8821ae_macid_initialize_mediastatus(hw);
2019
2020 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "rtl8821ae_hw_init() <====\n");
2021 return err;
2022}
2023
2024static enum version_8821ae _rtl8821ae_read_chip_version(struct ieee80211_hw *hw)
2025{
2026 struct rtl_priv *rtlpriv = rtl_priv(hw);
2027 struct rtl_phy *rtlphy = &rtlpriv->phy;
2028 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
2029 enum version_8821ae version = VERSION_UNKNOWN;
2030 u32 value32;
2031
2032 value32 = rtl_read_dword(rtlpriv, REG_SYS_CFG);
2033 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2034 "ReadChipVersion8812A 0xF0 = 0x%x\n", value32);
2035
2036 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE)
2037 rtlphy->rf_type = RF_2T2R;
2038 else if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE)
2039 rtlphy->rf_type = RF_1T1R;
2040
2041 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2042 "RF_Type is %x!!\n", rtlphy->rf_type);
2043
2044 if (value32 & TRP_VAUX_EN) {
2045 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
2046 if (rtlphy->rf_type == RF_2T2R)
2047 version = VERSION_TEST_CHIP_2T2R_8812;
2048 else
2049 version = VERSION_TEST_CHIP_1T1R_8812;
2050 } else
2051 version = VERSION_TEST_CHIP_8821;
2052 } else {
2053 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
2054 u32 rtl_id = ((value32 & CHIP_VER_RTL_MASK) >> 12) + 1;
2055
2056 if (rtlphy->rf_type == RF_2T2R)
2057 version =
2058 (enum version_8821ae)(CHIP_8812
2059 | NORMAL_CHIP |
2060 RF_TYPE_2T2R);
2061 else
2062 version = (enum version_8821ae)(CHIP_8812
2063 | NORMAL_CHIP);
2064
2065 version = (enum version_8821ae)(version | (rtl_id << 12));
2066 } else if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
2067 u32 rtl_id = value32 & CHIP_VER_RTL_MASK;
2068
2069 version = (enum version_8821ae)(CHIP_8821
2070 | NORMAL_CHIP | rtl_id);
2071 }
2072 }
2073
2074 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
2075 /*WL_HWROF_EN.*/
2076 value32 = rtl_read_dword(rtlpriv, REG_MULTI_FUNC_CTRL);
2077 rtlhal->hw_rof_enable = ((value32 & WL_HWROF_EN) ? 1 : 0);
2078 }
2079
2080 switch (version) {
2081 case VERSION_TEST_CHIP_1T1R_8812:
2082 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2083 "Chip Version ID: VERSION_TEST_CHIP_1T1R_8812\n");
2084 break;
2085 case VERSION_TEST_CHIP_2T2R_8812:
2086 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2087 "Chip Version ID: VERSION_TEST_CHIP_2T2R_8812\n");
2088 break;
2089 case VERSION_NORMAL_TSMC_CHIP_1T1R_8812:
2090 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2091 "Chip Version ID:VERSION_NORMAL_TSMC_CHIP_1T1R_8812\n");
2092 break;
2093 case VERSION_NORMAL_TSMC_CHIP_2T2R_8812:
2094 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2095 "Chip Version ID: VERSION_NORMAL_TSMC_CHIP_2T2R_8812\n");
2096 break;
2097 case VERSION_NORMAL_TSMC_CHIP_1T1R_8812_C_CUT:
2098 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2099 "Chip Version ID: VERSION_NORMAL_TSMC_CHIP_1T1R_8812 C CUT\n");
2100 break;
2101 case VERSION_NORMAL_TSMC_CHIP_2T2R_8812_C_CUT:
2102 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2103 "Chip Version ID: VERSION_NORMAL_TSMC_CHIP_2T2R_8812 C CUT\n");
2104 break;
2105 case VERSION_TEST_CHIP_8821:
2106 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2107 "Chip Version ID: VERSION_TEST_CHIP_8821\n");
2108 break;
2109 case VERSION_NORMAL_TSMC_CHIP_8821:
2110 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2111 "Chip Version ID: VERSION_NORMAL_TSMC_CHIP_8821 A CUT\n");
2112 break;
2113 case VERSION_NORMAL_TSMC_CHIP_8821_B_CUT:
2114 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2115 "Chip Version ID: VERSION_NORMAL_TSMC_CHIP_8821 B CUT\n");
2116 break;
2117 default:
2118 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2119 "Chip Version ID: Unknow (0x%X)\n", version);
2120 break;
2121 }
2122
2123 return version;
2124}
2125
2126static int _rtl8821ae_set_media_status(struct ieee80211_hw *hw,
2127 enum nl80211_iftype type)
2128{
2129 struct rtl_priv *rtlpriv = rtl_priv(hw);
2130 u8 bt_msr = rtl_read_byte(rtlpriv, MSR);
2131 enum led_ctl_mode ledaction = LED_CTL_NO_LINK;
2132 bt_msr &= 0xfc;
2133
2134 rtl_write_dword(rtlpriv, REG_BCN_CTRL, 0);
2135 RT_TRACE(rtlpriv, COMP_BEACON, DBG_LOUD,
2136 "clear 0x550 when set HW_VAR_MEDIA_STATUS\n");
2137
2138 if (type == NL80211_IFTYPE_UNSPECIFIED ||
2139 type == NL80211_IFTYPE_STATION) {
2140 _rtl8821ae_stop_tx_beacon(hw);
2141 _rtl8821ae_enable_bcn_sub_func(hw);
2142 } else if (type == NL80211_IFTYPE_ADHOC ||
2143 type == NL80211_IFTYPE_AP) {
2144 _rtl8821ae_resume_tx_beacon(hw);
2145 _rtl8821ae_disable_bcn_sub_func(hw);
2146 } else {
2147 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
2148 "Set HW_VAR_MEDIA_STATUS: No such media status(%x).\n",
2149 type);
2150 }
2151
2152 switch (type) {
2153 case NL80211_IFTYPE_UNSPECIFIED:
2154 bt_msr |= MSR_NOLINK;
2155 ledaction = LED_CTL_LINK;
2156 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
2157 "Set Network type to NO LINK!\n");
2158 break;
2159 case NL80211_IFTYPE_ADHOC:
2160 bt_msr |= MSR_ADHOC;
2161 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
2162 "Set Network type to Ad Hoc!\n");
2163 break;
2164 case NL80211_IFTYPE_STATION:
2165 bt_msr |= MSR_INFRA;
2166 ledaction = LED_CTL_LINK;
2167 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
2168 "Set Network type to STA!\n");
2169 break;
2170 case NL80211_IFTYPE_AP:
2171 bt_msr |= MSR_AP;
2172 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
2173 "Set Network type to AP!\n");
2174 break;
2175 default:
2176 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
2177 "Network type %d not support!\n", type);
2178 return 1;
2179 }
2180
2181 rtl_write_byte(rtlpriv, (MSR), bt_msr);
2182 rtlpriv->cfg->ops->led_control(hw, ledaction);
2183 if ((bt_msr & 0xfc) == MSR_AP)
2184 rtl_write_byte(rtlpriv, REG_BCNTCFG + 1, 0x00);
2185 else
2186 rtl_write_byte(rtlpriv, REG_BCNTCFG + 1, 0x66);
2187
2188 return 0;
2189}
2190
2191void rtl8821ae_set_check_bssid(struct ieee80211_hw *hw, bool check_bssid)
2192{
2193 struct rtl_priv *rtlpriv = rtl_priv(hw);
2194 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
2195 u32 reg_rcr = rtlpci->receive_config;
2196
2197 if (rtlpriv->psc.rfpwr_state != ERFON)
2198 return;
2199
2200 if (check_bssid) {
2201 reg_rcr |= (RCR_CBSSID_DATA | RCR_CBSSID_BCN);
2202 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_RCR,
2203 (u8 *)(&reg_rcr));
2204 _rtl8821ae_set_bcn_ctrl_reg(hw, 0, BIT(4));
2205 } else if (!check_bssid) {
2206 reg_rcr &= (~(RCR_CBSSID_DATA | RCR_CBSSID_BCN));
2207 _rtl8821ae_set_bcn_ctrl_reg(hw, BIT(4), 0);
2208 rtlpriv->cfg->ops->set_hw_reg(hw,
2209 HW_VAR_RCR, (u8 *)(&reg_rcr));
2210 }
2211}
2212
2213int rtl8821ae_set_network_type(struct ieee80211_hw *hw, enum nl80211_iftype type)
2214{
2215 struct rtl_priv *rtlpriv = rtl_priv(hw);
2216
2217 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "rtl8821ae_set_network_type!\n");
2218
2219 if (_rtl8821ae_set_media_status(hw, type))
2220 return -EOPNOTSUPP;
2221
2222 if (rtlpriv->mac80211.link_state == MAC80211_LINKED) {
2223 if (type != NL80211_IFTYPE_AP)
2224 rtl8821ae_set_check_bssid(hw, true);
2225 } else {
2226 rtl8821ae_set_check_bssid(hw, false);
2227 }
2228
2229 return 0;
2230}
2231
2232/* don't set REG_EDCA_BE_PARAM here because mac80211 will send pkt when scan */
2233void rtl8821ae_set_qos(struct ieee80211_hw *hw, int aci)
2234{
2235 struct rtl_priv *rtlpriv = rtl_priv(hw);
2236 rtl8821ae_dm_init_edca_turbo(hw);
2237 switch (aci) {
2238 case AC1_BK:
2239 rtl_write_dword(rtlpriv, REG_EDCA_BK_PARAM, 0xa44f);
2240 break;
2241 case AC0_BE:
2242 /* rtl_write_dword(rtlpriv, REG_EDCA_BE_PARAM, u4b_ac_param); */
2243 break;
2244 case AC2_VI:
2245 rtl_write_dword(rtlpriv, REG_EDCA_VI_PARAM, 0x5e4322);
2246 break;
2247 case AC3_VO:
2248 rtl_write_dword(rtlpriv, REG_EDCA_VO_PARAM, 0x2f3222);
2249 break;
2250 default:
2251 RT_ASSERT(false, "invalid aci: %d !\n", aci);
2252 break;
2253 }
2254}
2255
2256static void rtl8821ae_clear_interrupt(struct ieee80211_hw *hw)
2257{
2258 struct rtl_priv *rtlpriv = rtl_priv(hw);
2259 u32 tmp;
2260 tmp = rtl_read_dword(rtlpriv, REG_HISR);
2261 /*printk("clear interrupt first:\n");
2262 printk("0x%x = 0x%08x\n",REG_HISR, tmp);*/
2263 rtl_write_dword(rtlpriv, REG_HISR, tmp);
2264
2265 tmp = rtl_read_dword(rtlpriv, REG_HISRE);
2266 /*printk("0x%x = 0x%08x\n",REG_HISRE, tmp);*/
2267 rtl_write_dword(rtlpriv, REG_HISRE, tmp);
2268
2269 tmp = rtl_read_dword(rtlpriv, REG_HSISR);
2270 /*printk("0x%x = 0x%08x\n",REG_HSISR, tmp);*/
2271 rtl_write_dword(rtlpriv, REG_HSISR, tmp);
2272}
2273
2274void rtl8821ae_enable_interrupt(struct ieee80211_hw *hw)
2275{
2276 struct rtl_priv *rtlpriv = rtl_priv(hw);
2277 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
2278
2279 rtl8821ae_clear_interrupt(hw);/*clear it here first*/
2280
2281 rtl_write_dword(rtlpriv, REG_HIMR, rtlpci->irq_mask[0] & 0xFFFFFFFF);
2282 rtl_write_dword(rtlpriv, REG_HIMRE, rtlpci->irq_mask[1] & 0xFFFFFFFF);
2283 rtlpci->irq_enabled = true;
2284 /* there are some C2H CMDs have been sent before
2285 system interrupt is enabled, e.g., C2H, CPWM.
2286 *So we need to clear all C2H events that FW has
2287 notified, otherwise FW won't schedule any commands anymore.
2288 */
2289 /* rtl_write_byte(rtlpriv, REG_C2HEVT_CLEAR, 0); */
2290 /*enable system interrupt*/
2291 rtl_write_dword(rtlpriv, REG_HSIMR, rtlpci->sys_irq_mask & 0xFFFFFFFF);
2292}
2293
2294void rtl8821ae_disable_interrupt(struct ieee80211_hw *hw)
2295{
2296 struct rtl_priv *rtlpriv = rtl_priv(hw);
2297 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
2298
2299 rtl_write_dword(rtlpriv, REG_HIMR, IMR_DISABLED);
2300 rtl_write_dword(rtlpriv, REG_HIMRE, IMR_DISABLED);
2301 rtlpci->irq_enabled = false;
2302 /*synchronize_irq(rtlpci->pdev->irq);*/
2303}
2304
2305static void _rtl8821ae_clear_pci_pme_status(struct ieee80211_hw *hw)
2306{
2307 struct rtl_priv *rtlpriv = rtl_priv(hw);
2308 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
2309 u16 cap_hdr;
2310 u8 cap_pointer;
2311 u8 cap_id = 0xff;
2312 u8 pmcs_reg;
2313 u8 cnt = 0;
2314
2315 /* Get the Capability pointer first,
2316 * the Capability Pointer is located at
2317 * offset 0x34 from the Function Header */
2318
2319 pci_read_config_byte(rtlpci->pdev, 0x34, &cap_pointer);
2320 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2321 "PCI configration 0x34 = 0x%2x\n", cap_pointer);
2322
2323 do {
2324 pci_read_config_word(rtlpci->pdev, cap_pointer, &cap_hdr);
2325 cap_id = cap_hdr & 0xFF;
2326
2327 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2328 "in pci configration, cap_pointer%x = %x\n",
2329 cap_pointer, cap_id);
2330
2331 if (cap_id == 0x01) {
2332 break;
2333 } else {
2334 /* point to next Capability */
2335 cap_pointer = (cap_hdr >> 8) & 0xFF;
2336 /* 0: end of pci capability, 0xff: invalid value */
2337 if (cap_pointer == 0x00 || cap_pointer == 0xff) {
2338 cap_id = 0xff;
2339 break;
2340 }
2341 }
2342 } while (cnt++ < 200);
2343
2344 if (cap_id == 0x01) {
2345 /* Get the PM CSR (Control/Status Register),
2346 * The PME_Status is located at PM Capatibility offset 5, bit 7
2347 */
2348 pci_read_config_byte(rtlpci->pdev, cap_pointer + 5, &pmcs_reg);
2349
2350 if (pmcs_reg & BIT(7)) {
2351 /* PME event occured, clear the PM_Status by write 1 */
2352 pmcs_reg = pmcs_reg | BIT(7);
2353
2354 pci_write_config_byte(rtlpci->pdev, cap_pointer + 5,
2355 pmcs_reg);
2356 /* Read it back to check */
2357 pci_read_config_byte(rtlpci->pdev, cap_pointer + 5,
2358 &pmcs_reg);
2359 RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
2360 "Clear PME status 0x%2x to 0x%2x\n",
2361 cap_pointer + 5, pmcs_reg);
2362 } else {
2363 RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
2364 "PME status(0x%2x) = 0x%2x\n",
2365 cap_pointer + 5, pmcs_reg);
2366 }
2367 } else {
2368 RT_TRACE(rtlpriv, COMP_INIT, DBG_WARNING,
2369 "Cannot find PME Capability\n");
2370 }
2371}
2372
2373void rtl8821ae_card_disable(struct ieee80211_hw *hw)
2374{
2375 struct rtl_priv *rtlpriv = rtl_priv(hw);
2376 struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
2377 struct rtl_ps_ctl *ppsc = rtl_psc(rtlpriv);
2378 struct rtl_mac *mac = rtl_mac(rtlpriv);
2379 enum nl80211_iftype opmode;
2380 bool support_remote_wakeup;
2381 u8 tmp;
2382 u32 count = 0;
2383
2384 rtlpriv->cfg->ops->get_hw_reg(hw, HAL_DEF_WOWLAN,
2385 (u8 *)(&support_remote_wakeup));
2386
2387 RT_SET_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC);
2388
2389 if (!(support_remote_wakeup && mac->opmode == NL80211_IFTYPE_STATION)
2390 || !rtlhal->enter_pnp_sleep) {
2391 RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "Normal Power off\n");
2392 mac->link_state = MAC80211_NOLINK;
2393 opmode = NL80211_IFTYPE_UNSPECIFIED;
2394 _rtl8821ae_set_media_status(hw, opmode);
2395 _rtl8821ae_poweroff_adapter(hw);
2396 } else {
2397 RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "Wowlan Supported.\n");
2398 /* 3 <1> Prepare for configuring wowlan related infomations */
2399 /* Clear Fw WoWLAN event. */
2400 rtl_write_byte(rtlpriv, REG_MCUTST_WOWLAN, 0x0);
2401
2402#if (USE_SPECIFIC_FW_TO_SUPPORT_WOWLAN == 1)
2403 rtl8821ae_set_fw_related_for_wowlan(hw, true);
2404#endif
2405 /* Dynamically adjust Tx packet boundary
2406 * for download reserved page packet.
2407 * reserve 30 pages for rsvd page */
2408 if (_rtl8821ae_dynamic_rqpn(hw, 0xE0, 0x3, 0x80c20d0d))
2409 rtlhal->re_init_llt_table = true;
2410
2411 /* 3 <2> Set Fw releted H2C cmd. */
2412
2413 /* Set WoWLAN related security information. */
2414 rtl8821ae_set_fw_global_info_cmd(hw);
2415
2416 _rtl8821ae_download_rsvd_page(hw, true);
2417
2418 /* Just enable AOAC related functions when we connect to AP. */
2419 printk("mac->link_state = %d\n", mac->link_state);
2420 if (mac->link_state >= MAC80211_LINKED &&
2421 mac->opmode == NL80211_IFTYPE_STATION) {
2422 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_AID, NULL);
2423 rtl8821ae_set_fw_media_status_rpt_cmd(hw,
2424 RT_MEDIA_CONNECT);
2425
2426 rtl8821ae_set_fw_wowlan_mode(hw, true);
2427 /* Enable Fw Keep alive mechanism. */
2428 rtl8821ae_set_fw_keep_alive_cmd(hw, true);
2429
2430 /* Enable disconnect decision control. */
2431 rtl8821ae_set_fw_disconnect_decision_ctrl_cmd(hw, true);
2432 }
2433
2434 /* 3 <3> Hw Configutations */
2435
2436 /* Wait untill Rx DMA Finished before host sleep.
2437 * FW Pause Rx DMA may happens when received packet doing dma.
2438 */
2439 rtl_write_byte(rtlpriv, REG_RXDMA_CONTROL, BIT(2));
2440
2441 tmp = rtl_read_byte(rtlpriv, REG_RXDMA_CONTROL);
2442 count = 0;
2443 while (!(tmp & BIT(1)) && (count++ < 100)) {
2444 udelay(10);
2445 tmp = rtl_read_byte(rtlpriv, REG_RXDMA_CONTROL);
2446 }
2447 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2448 "Wait Rx DMA Finished before host sleep. count=%d\n",
2449 count);
2450
2451 /* reset trx ring */
2452 rtlpriv->intf_ops->reset_trx_ring(hw);
2453
2454 rtl_write_byte(rtlpriv, REG_APS_FSMCO + 1, 0x0);
2455
2456 _rtl8821ae_clear_pci_pme_status(hw);
2457 tmp = rtl_read_byte(rtlpriv, REG_SYS_CLKR);
2458 rtl_write_byte(rtlpriv, REG_SYS_CLKR, tmp | BIT(3));
2459 /* prevent 8051 to be reset by PERST */
2460 rtl_write_byte(rtlpriv, REG_RSV_CTRL, 0x20);
2461 rtl_write_byte(rtlpriv, REG_RSV_CTRL, 0x60);
2462 }
2463
2464 if (rtlpriv->rtlhal.driver_is_goingto_unload ||
2465 ppsc->rfoff_reason > RF_CHANGE_BY_PS)
2466 rtlpriv->cfg->ops->led_control(hw, LED_CTL_POWER_OFF);
2467 /* For wowlan+LPS+32k. */
2468 if (support_remote_wakeup && rtlhal->enter_pnp_sleep) {
2469 /* Set the WoWLAN related function control enable.
2470 * It should be the last H2C cmd in the WoWLAN flow. */
2471 rtl8821ae_set_fw_remote_wake_ctrl_cmd(hw, 1);
2472
2473 /* Stop Pcie Interface Tx DMA. */
2474 rtl_write_byte(rtlpriv, REG_PCIE_CTRL_REG + 1, 0xff);
2475 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, "Stop PCIE Tx DMA.\n");
2476
2477 /* Wait for TxDMA idle. */
2478 count = 0;
2479 do {
2480 tmp = rtl_read_byte(rtlpriv, REG_PCIE_CTRL_REG);
2481 udelay(10);
2482 count++;
2483 } while ((tmp != 0) && (count < 100));
2484 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2485 "Wait Tx DMA Finished before host sleep. count=%d\n",
2486 count);
2487
2488 if (rtlhal->hw_rof_enable) {
2489 printk("hw_rof_enable\n");
2490 tmp = rtl_read_byte(rtlpriv, REG_HSISR + 3);
2491 rtl_write_byte(rtlpriv, REG_HSISR + 3, tmp | BIT(1));
2492 }
2493 }
2494 /* after power off we should do iqk again */
2495 rtlpriv->phy.iqk_initialized = false;
2496}
2497
2498void rtl8821ae_interrupt_recognized(struct ieee80211_hw *hw,
2499 u32 *p_inta, u32 *p_intb)
2500{
2501 struct rtl_priv *rtlpriv = rtl_priv(hw);
2502 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
2503
2504 *p_inta = rtl_read_dword(rtlpriv, ISR) & rtlpci->irq_mask[0];
2505 rtl_write_dword(rtlpriv, ISR, *p_inta);
2506
2507 *p_intb = rtl_read_dword(rtlpriv, REG_HISRE) & rtlpci->irq_mask[1];
2508 rtl_write_dword(rtlpriv, REG_HISRE, *p_intb);
2509}
2510
2511void rtl8821ae_set_beacon_related_registers(struct ieee80211_hw *hw)
2512{
2513 struct rtl_priv *rtlpriv = rtl_priv(hw);
2514 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
2515 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
2516 u16 bcn_interval, atim_window;
2517
2518 bcn_interval = mac->beacon_interval;
2519 atim_window = 2; /*FIX MERGE */
2520 rtl8821ae_disable_interrupt(hw);
2521 rtl_write_word(rtlpriv, REG_ATIMWND, atim_window);
2522 rtl_write_word(rtlpriv, REG_BCN_INTERVAL, bcn_interval);
2523 rtl_write_word(rtlpriv, REG_BCNTCFG, 0x660f);
2524 rtl_write_byte(rtlpriv, REG_RXTSF_OFFSET_CCK, 0x18);
2525 rtl_write_byte(rtlpriv, REG_RXTSF_OFFSET_OFDM, 0x18);
2526 rtl_write_byte(rtlpriv, 0x606, 0x30);
2527 rtlpci->reg_bcn_ctrl_val |= BIT(3);
2528 rtl_write_byte(rtlpriv, REG_BCN_CTRL, (u8)rtlpci->reg_bcn_ctrl_val);
2529 rtl8821ae_enable_interrupt(hw);
2530}
2531
2532void rtl8821ae_set_beacon_interval(struct ieee80211_hw *hw)
2533{
2534 struct rtl_priv *rtlpriv = rtl_priv(hw);
2535 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
2536 u16 bcn_interval = mac->beacon_interval;
2537
2538 RT_TRACE(rtlpriv, COMP_BEACON, DBG_DMESG,
2539 "beacon_interval:%d\n", bcn_interval);
2540 rtl8821ae_disable_interrupt(hw);
2541 rtl_write_word(rtlpriv, REG_BCN_INTERVAL, bcn_interval);
2542 rtl8821ae_enable_interrupt(hw);
2543}
2544
2545void rtl8821ae_update_interrupt_mask(struct ieee80211_hw *hw,
2546 u32 add_msr, u32 rm_msr)
2547{
2548 struct rtl_priv *rtlpriv = rtl_priv(hw);
2549 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
2550
2551 RT_TRACE(rtlpriv, COMP_INTR, DBG_LOUD,
2552 "add_msr:%x, rm_msr:%x\n", add_msr, rm_msr);
2553
2554 if (add_msr)
2555 rtlpci->irq_mask[0] |= add_msr;
2556 if (rm_msr)
2557 rtlpci->irq_mask[0] &= (~rm_msr);
2558 rtl8821ae_disable_interrupt(hw);
2559 rtl8821ae_enable_interrupt(hw);
2560}
2561
2562static u8 _rtl8821ae_get_chnl_group(u8 chnl)
2563{
2564 u8 group = 0;
2565
2566 if (chnl <= 14) {
2567 if (1 <= chnl && chnl <= 2)
2568 group = 0;
2569 else if (3 <= chnl && chnl <= 5)
2570 group = 1;
2571 else if (6 <= chnl && chnl <= 8)
2572 group = 2;
2573 else if (9 <= chnl && chnl <= 11)
2574 group = 3;
2575 else /*if (12 <= chnl && chnl <= 14)*/
2576 group = 4;
2577 } else {
2578 if (36 <= chnl && chnl <= 42)
2579 group = 0;
2580 else if (44 <= chnl && chnl <= 48)
2581 group = 1;
2582 else if (50 <= chnl && chnl <= 58)
2583 group = 2;
2584 else if (60 <= chnl && chnl <= 64)
2585 group = 3;
2586 else if (100 <= chnl && chnl <= 106)
2587 group = 4;
2588 else if (108 <= chnl && chnl <= 114)
2589 group = 5;
2590 else if (116 <= chnl && chnl <= 122)
2591 group = 6;
2592 else if (124 <= chnl && chnl <= 130)
2593 group = 7;
2594 else if (132 <= chnl && chnl <= 138)
2595 group = 8;
2596 else if (140 <= chnl && chnl <= 144)
2597 group = 9;
2598 else if (149 <= chnl && chnl <= 155)
2599 group = 10;
2600 else if (157 <= chnl && chnl <= 161)
2601 group = 11;
2602 else if (165 <= chnl && chnl <= 171)
2603 group = 12;
2604 else if (173 <= chnl && chnl <= 177)
2605 group = 13;
2606 else
2607 /*RT_TRACE(rtlpriv, COMP_EFUSE,DBG_LOUD,
2608 "5G, Channel %d in Group not found\n",chnl);*/
2609 RT_ASSERT(!COMP_EFUSE,
2610 "5G, Channel %d in Group not found\n", chnl);
2611 }
2612 return group;
2613}
2614
2615static void _rtl8821ae_read_power_value_fromprom(struct ieee80211_hw *hw,
2616 struct txpower_info_2g *pwrinfo24g,
2617 struct txpower_info_5g *pwrinfo5g,
2618 bool autoload_fail,
2619 u8 *hwinfo)
2620{
2621 struct rtl_priv *rtlpriv = rtl_priv(hw);
2622 u32 rfPath, eeAddr = EEPROM_TX_PWR_INX, group, TxCount = 0;
2623
2624 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2625 "hal_ReadPowerValueFromPROM8821ae(): hwinfo[0x%x]=0x%x\n",
2626 (eeAddr+1), hwinfo[eeAddr+1]);
2627 if (0xFF == hwinfo[eeAddr+1]) /*YJ,add,120316*/
2628 autoload_fail = true;
2629
2630 if (autoload_fail) {
2631 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2632 "auto load fail : Use Default value!\n");
2633 for (rfPath = 0 ; rfPath < MAX_RF_PATH ; rfPath++) {
2634 /*2.4G default value*/
2635 for (group = 0 ; group < MAX_CHNL_GROUP_24G; group++) {
2636 pwrinfo24g->index_cck_base[rfPath][group] = 0x2D;
2637 pwrinfo24g->index_bw40_base[rfPath][group] = 0x2D;
2638 }
2639 for (TxCount = 0; TxCount < MAX_TX_COUNT; TxCount++) {
2640 if (TxCount == 0) {
2641 pwrinfo24g->bw20_diff[rfPath][0] = 0x02;
2642 pwrinfo24g->ofdm_diff[rfPath][0] = 0x04;
2643 } else {
2644 pwrinfo24g->bw20_diff[rfPath][TxCount] = 0xFE;
2645 pwrinfo24g->bw40_diff[rfPath][TxCount] = 0xFE;
2646 pwrinfo24g->cck_diff[rfPath][TxCount] = 0xFE;
2647 pwrinfo24g->ofdm_diff[rfPath][TxCount] = 0xFE;
2648 }
2649 }
2650 /*5G default value*/
2651 for (group = 0 ; group < MAX_CHNL_GROUP_5G; group++)
2652 pwrinfo5g->index_bw40_base[rfPath][group] = 0x2A;
2653
2654 for (TxCount = 0; TxCount < MAX_TX_COUNT; TxCount++) {
2655 if (TxCount == 0) {
2656 pwrinfo5g->ofdm_diff[rfPath][0] = 0x04;
2657 pwrinfo5g->bw20_diff[rfPath][0] = 0x00;
2658 pwrinfo5g->bw80_diff[rfPath][0] = 0xFE;
2659 pwrinfo5g->bw160_diff[rfPath][0] = 0xFE;
2660 } else {
2661 pwrinfo5g->ofdm_diff[rfPath][0] = 0xFE;
2662 pwrinfo5g->bw20_diff[rfPath][0] = 0xFE;
2663 pwrinfo5g->bw40_diff[rfPath][0] = 0xFE;
2664 pwrinfo5g->bw80_diff[rfPath][0] = 0xFE;
2665 pwrinfo5g->bw160_diff[rfPath][0] = 0xFE;
2666 }
2667 }
2668 }
2669 return;
2670 }
2671
2672 rtl_priv(hw)->efuse.txpwr_fromeprom = true;
2673
2674 for (rfPath = 0 ; rfPath < MAX_RF_PATH ; rfPath++) {
2675 /*2.4G default value*/
2676 for (group = 0 ; group < MAX_CHNL_GROUP_24G; group++) {
2677 pwrinfo24g->index_cck_base[rfPath][group] = hwinfo[eeAddr++];
2678 if (pwrinfo24g->index_cck_base[rfPath][group] == 0xFF)
2679 pwrinfo24g->index_cck_base[rfPath][group] = 0x2D;
2680 }
2681 for (group = 0 ; group < MAX_CHNL_GROUP_24G - 1; group++) {
2682 pwrinfo24g->index_bw40_base[rfPath][group] = hwinfo[eeAddr++];
2683 if (pwrinfo24g->index_bw40_base[rfPath][group] == 0xFF)
2684 pwrinfo24g->index_bw40_base[rfPath][group] = 0x2D;
2685 }
2686 for (TxCount = 0; TxCount < MAX_TX_COUNT; TxCount++) {
2687 if (TxCount == 0) {
2688 pwrinfo24g->bw40_diff[rfPath][TxCount] = 0;
2689 /*bit sign number to 8 bit sign number*/
2690 pwrinfo24g->bw20_diff[rfPath][TxCount] = (hwinfo[eeAddr] & 0xf0) >> 4;
2691 if (pwrinfo24g->bw20_diff[rfPath][TxCount] & BIT(3))
2692 pwrinfo24g->bw20_diff[rfPath][TxCount] |= 0xF0;
2693 /*bit sign number to 8 bit sign number*/
2694 pwrinfo24g->ofdm_diff[rfPath][TxCount] = (hwinfo[eeAddr] & 0x0f);
2695 if (pwrinfo24g->ofdm_diff[rfPath][TxCount] & BIT(3))
2696 pwrinfo24g->ofdm_diff[rfPath][TxCount] |= 0xF0;
2697
2698 pwrinfo24g->cck_diff[rfPath][TxCount] = 0;
2699 eeAddr++;
2700 } else {
2701 pwrinfo24g->bw40_diff[rfPath][TxCount] = (hwinfo[eeAddr]&0xf0) >> 4;
2702 if (pwrinfo24g->bw40_diff[rfPath][TxCount] & BIT(3))
2703 pwrinfo24g->bw40_diff[rfPath][TxCount] |= 0xF0;
2704
2705 pwrinfo24g->bw20_diff[rfPath][TxCount] = (hwinfo[eeAddr] & 0x0f);
2706 if (pwrinfo24g->bw20_diff[rfPath][TxCount] & BIT(3))
2707 pwrinfo24g->bw20_diff[rfPath][TxCount] |= 0xF0;
2708
2709 eeAddr++;
2710
2711 pwrinfo24g->ofdm_diff[rfPath][TxCount] = (hwinfo[eeAddr] & 0xf0) >> 4;
2712 if (pwrinfo24g->ofdm_diff[rfPath][TxCount] & BIT(3))
2713 pwrinfo24g->ofdm_diff[rfPath][TxCount] |= 0xF0;
2714
2715 pwrinfo24g->cck_diff[rfPath][TxCount] = (hwinfo[eeAddr] & 0x0f);
2716 if (pwrinfo24g->cck_diff[rfPath][TxCount] & BIT(3))
2717 pwrinfo24g->cck_diff[rfPath][TxCount] |= 0xF0;
2718
2719 eeAddr++;
2720 }
2721 }
2722
2723 /*5G default value*/
2724 for (group = 0 ; group < MAX_CHNL_GROUP_5G; group++) {
2725 pwrinfo5g->index_bw40_base[rfPath][group] = hwinfo[eeAddr++];
2726 if (pwrinfo5g->index_bw40_base[rfPath][group] == 0xFF)
2727 pwrinfo5g->index_bw40_base[rfPath][group] = 0xFE;
2728 }
2729
2730 for (TxCount = 0; TxCount < MAX_TX_COUNT; TxCount++) {
2731 if (TxCount == 0) {
2732 pwrinfo5g->bw40_diff[rfPath][TxCount] = 0;
2733
2734 pwrinfo5g->bw20_diff[rfPath][0] = (hwinfo[eeAddr] & 0xf0) >> 4;
2735 if (pwrinfo5g->bw20_diff[rfPath][TxCount] & BIT(3))
2736 pwrinfo5g->bw20_diff[rfPath][TxCount] |= 0xF0;
2737
2738 pwrinfo5g->ofdm_diff[rfPath][0] = (hwinfo[eeAddr] & 0x0f);
2739 if (pwrinfo5g->ofdm_diff[rfPath][TxCount] & BIT(3))
2740 pwrinfo5g->ofdm_diff[rfPath][TxCount] |= 0xF0;
2741
2742 eeAddr++;
2743 } else {
2744 pwrinfo5g->bw40_diff[rfPath][TxCount] = (hwinfo[eeAddr] & 0xf0) >> 4;
2745 if (pwrinfo5g->bw40_diff[rfPath][TxCount] & BIT(3))
2746 pwrinfo5g->bw40_diff[rfPath][TxCount] |= 0xF0;
2747
2748 pwrinfo5g->bw20_diff[rfPath][TxCount] = (hwinfo[eeAddr] & 0x0f);
2749 if (pwrinfo5g->bw20_diff[rfPath][TxCount] & BIT(3))
2750 pwrinfo5g->bw20_diff[rfPath][TxCount] |= 0xF0;
2751
2752 eeAddr++;
2753 }
2754 }
2755
2756 pwrinfo5g->ofdm_diff[rfPath][1] = (hwinfo[eeAddr] & 0xf0) >> 4;
2757 pwrinfo5g->ofdm_diff[rfPath][2] = (hwinfo[eeAddr] & 0x0f);
2758
2759 eeAddr++;
2760
2761 pwrinfo5g->ofdm_diff[rfPath][3] = (hwinfo[eeAddr] & 0x0f);
2762
2763 eeAddr++;
2764
2765 for (TxCount = 1; TxCount < MAX_TX_COUNT; TxCount++) {
2766 if (pwrinfo5g->ofdm_diff[rfPath][TxCount] & BIT(3))
2767 pwrinfo5g->ofdm_diff[rfPath][TxCount] |= 0xF0;
2768 }
2769 for (TxCount = 0; TxCount < MAX_TX_COUNT; TxCount++) {
2770 pwrinfo5g->bw80_diff[rfPath][TxCount] = (hwinfo[eeAddr] & 0xf0) >> 4;
2771 /* 4bit sign number to 8 bit sign number */
2772 if (pwrinfo5g->bw80_diff[rfPath][TxCount] & BIT(3))
2773 pwrinfo5g->bw80_diff[rfPath][TxCount] |= 0xF0;
2774 /* 4bit sign number to 8 bit sign number */
2775 pwrinfo5g->bw160_diff[rfPath][TxCount] = (hwinfo[eeAddr] & 0x0f);
2776 if (pwrinfo5g->bw160_diff[rfPath][TxCount] & BIT(3))
2777 pwrinfo5g->bw160_diff[rfPath][TxCount] |= 0xF0;
2778
2779 eeAddr++;
2780 }
2781 }
2782}
2783#if 0
2784static void _rtl8812ae_read_txpower_info_from_hwpg(struct ieee80211_hw *hw,
2785 bool autoload_fail,
2786 u8 *hwinfo)
2787{
2788 struct rtl_priv *rtlpriv = rtl_priv(hw);
2789 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
2790 struct txpower_info_2g pwrinfo24g;
2791 struct txpower_info_5g pwrinfo5g;
2792 u8 channel5g[CHANNEL_MAX_NUMBER_5G] = {
2793 36, 38, 40, 42, 44, 46, 48, 50, 52, 54,
2794 56, 58, 60, 62, 64, 100, 102, 104, 106,
2795 108, 110, 112, 114, 116, 118, 120, 122,
2796 124, 126, 128, 130, 132, 134, 136, 138,
2797 140, 142, 144, 149, 151, 153, 155, 157,
2798 159, 161, 163, 165, 167, 168, 169, 171, 173, 175, 177};
2799 u8 channel5g_80m[CHANNEL_MAX_NUMBER_5G_80M] = {42, 58, 106, 122, 138, 155, 171};
2800 u8 rf_path, index;
2801 u8 i;
2802
2803 _rtl8821ae_read_power_value_fromprom(hw, &pwrinfo24g,
2804 &pwrinfo5g, autoload_fail, hwinfo);
2805
2806 for (rf_path = 0; rf_path < 2; rf_path++) {
2807 for (i = 0; i < CHANNEL_MAX_NUMBER_2G; i++) {
2808 index = _rtl8821ae_get_chnl_group(i + 1);
2809
2810 if (i == CHANNEL_MAX_NUMBER_2G - 1) {
2811 rtlefuse->txpwrlevel_cck[rf_path][i] =
2812 pwrinfo24g.index_cck_base[rf_path][5];
2813 rtlefuse->txpwrlevel_ht40_1s[rf_path][i] =
2814 pwrinfo24g.index_bw40_base[rf_path][index];
2815 } else {
2816 rtlefuse->txpwrlevel_cck[rf_path][i] =
2817 pwrinfo24g.index_cck_base[rf_path][index];
2818 rtlefuse->txpwrlevel_ht40_1s[rf_path][i] =
2819 pwrinfo24g.index_bw40_base[rf_path][index];
2820 }
2821 }
2822
2823 for (i = 0; i < CHANNEL_MAX_NUMBER_5G; i++) {
2824 index = _rtl8821ae_get_chnl_group(channel5g[i]);
2825 rtlefuse->txpwr_5g_bw40base[rf_path][i] =
2826 pwrinfo5g.index_bw40_base[rf_path][index];
2827 }
2828 for (i = 0; i < CHANNEL_MAX_NUMBER_5G_80M; i++) {
2829 u8 upper, lower;
2830 index = _rtl8821ae_get_chnl_group(channel5g_80m[i]);
2831 upper = pwrinfo5g.index_bw40_base[rf_path][index];
2832 lower = pwrinfo5g.index_bw40_base[rf_path][index + 1];
2833
2834 rtlefuse->txpwr_5g_bw80base[rf_path][i] = (upper + lower) / 2;
2835 }
2836 for (i = 0; i < MAX_TX_COUNT; i++) {
2837 rtlefuse->txpwr_cckdiff[rf_path][i] =
2838 pwrinfo24g.cck_diff[rf_path][i];
2839 rtlefuse->txpwr_legacyhtdiff[rf_path][i] =
2840 pwrinfo24g.ofdm_diff[rf_path][i];
2841 rtlefuse->txpwr_ht20diff[rf_path][i] =
2842 pwrinfo24g.bw20_diff[rf_path][i];
2843 rtlefuse->txpwr_ht40diff[rf_path][i] =
2844 pwrinfo24g.bw40_diff[rf_path][i];
2845
2846 rtlefuse->txpwr_5g_ofdmdiff[rf_path][i] =
2847 pwrinfo5g.ofdm_diff[rf_path][i];
2848 rtlefuse->txpwr_5g_bw20diff[rf_path][i] =
2849 pwrinfo5g.bw20_diff[rf_path][i];
2850 rtlefuse->txpwr_5g_bw40diff[rf_path][i] =
2851 pwrinfo5g.bw40_diff[rf_path][i];
2852 rtlefuse->txpwr_5g_bw80diff[rf_path][i] =
2853 pwrinfo5g.bw80_diff[rf_path][i];
2854 }
2855 }
2856
2857 if (!autoload_fail) {
2858 rtlefuse->eeprom_regulatory =
2859 hwinfo[EEPROM_RF_BOARD_OPTION] & 0x07;/*bit0~2*/
2860 if (hwinfo[EEPROM_RF_BOARD_OPTION] == 0xFF)
2861 rtlefuse->eeprom_regulatory = 0;
2862 } else {
2863 rtlefuse->eeprom_regulatory = 0;
2864 }
2865
2866 RTPRINT(rtlpriv, FINIT, INIT_TXPOWER,
2867 "eeprom_regulatory = 0x%x\n", rtlefuse->eeprom_regulatory);
2868}
2869#endif
2870static void _rtl8821ae_read_txpower_info_from_hwpg(struct ieee80211_hw *hw,
2871 bool autoload_fail,
2872 u8 *hwinfo)
2873{
2874 struct rtl_priv *rtlpriv = rtl_priv(hw);
2875 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
2876 struct txpower_info_2g pwrinfo24g;
2877 struct txpower_info_5g pwrinfo5g;
2878 u8 channel5g[CHANNEL_MAX_NUMBER_5G] = {
2879 36, 38, 40, 42, 44, 46, 48, 50, 52, 54,
2880 56, 58, 60, 62, 64, 100, 102, 104, 106,
2881 108, 110, 112, 114, 116, 118, 120, 122,
2882 124, 126, 128, 130, 132, 134, 136, 138,
2883 140, 142, 144, 149, 151, 153, 155, 157,
2884 159, 161, 163, 165, 167, 168, 169, 171,
2885 173, 175, 177};
2886 u8 channel5g_80m[CHANNEL_MAX_NUMBER_5G_80M] = {
2887 42, 58, 106, 122, 138, 155, 171};
2888 u8 rf_path, index;
2889 u8 i;
2890
2891 _rtl8821ae_read_power_value_fromprom(hw, &pwrinfo24g,
2892 &pwrinfo5g, autoload_fail, hwinfo);
2893
2894 for (rf_path = 0; rf_path < 2; rf_path++) {
2895 for (i = 0; i < CHANNEL_MAX_NUMBER_2G; i++) {
2896 index = _rtl8821ae_get_chnl_group(i + 1);
2897
2898 if (i == CHANNEL_MAX_NUMBER_2G - 1) {
2899 rtlefuse->txpwrlevel_cck[rf_path][i] =
2900 pwrinfo24g.index_cck_base[rf_path][5];
2901 rtlefuse->txpwrlevel_ht40_1s[rf_path][i] =
2902 pwrinfo24g.index_bw40_base[rf_path][index];
2903 } else {
2904 rtlefuse->txpwrlevel_cck[rf_path][i] =
2905 pwrinfo24g.index_cck_base[rf_path][index];
2906 rtlefuse->txpwrlevel_ht40_1s[rf_path][i] =
2907 pwrinfo24g.index_bw40_base[rf_path][index];
2908 }
2909 }
2910
2911 for (i = 0; i < CHANNEL_MAX_NUMBER_5G; i++) {
2912 index = _rtl8821ae_get_chnl_group(channel5g[i]);
2913 rtlefuse->txpwr_5g_bw40base[rf_path][i] =
2914 pwrinfo5g.index_bw40_base[rf_path][index];
2915 }
2916 for (i = 0; i < CHANNEL_MAX_NUMBER_5G_80M; i++) {
2917 u8 upper, lower;
2918 index = _rtl8821ae_get_chnl_group(channel5g_80m[i]);
2919 upper = pwrinfo5g.index_bw40_base[rf_path][index];
2920 lower = pwrinfo5g.index_bw40_base[rf_path][index + 1];
2921
2922 rtlefuse->txpwr_5g_bw80base[rf_path][i] = (upper + lower) / 2;
2923 }
2924 for (i = 0; i < MAX_TX_COUNT; i++) {
2925 rtlefuse->txpwr_cckdiff[rf_path][i] =
2926 pwrinfo24g.cck_diff[rf_path][i];
2927 rtlefuse->txpwr_legacyhtdiff[rf_path][i] =
2928 pwrinfo24g.ofdm_diff[rf_path][i];
2929 rtlefuse->txpwr_ht20diff[rf_path][i] =
2930 pwrinfo24g.bw20_diff[rf_path][i];
2931 rtlefuse->txpwr_ht40diff[rf_path][i] =
2932 pwrinfo24g.bw40_diff[rf_path][i];
2933
2934 rtlefuse->txpwr_5g_ofdmdiff[rf_path][i] =
2935 pwrinfo5g.ofdm_diff[rf_path][i];
2936 rtlefuse->txpwr_5g_bw20diff[rf_path][i] =
2937 pwrinfo5g.bw20_diff[rf_path][i];
2938 rtlefuse->txpwr_5g_bw40diff[rf_path][i] =
2939 pwrinfo5g.bw40_diff[rf_path][i];
2940 rtlefuse->txpwr_5g_bw80diff[rf_path][i] =
2941 pwrinfo5g.bw80_diff[rf_path][i];
2942 }
2943 }
2944 /*bit0~2*/
2945 if (!autoload_fail) {
2946 rtlefuse->eeprom_regulatory = hwinfo[EEPROM_RF_BOARD_OPTION] & 0x07;
2947 if (hwinfo[EEPROM_RF_BOARD_OPTION] == 0xFF)
2948 rtlefuse->eeprom_regulatory = 0;
2949 } else {
2950 rtlefuse->eeprom_regulatory = 0;
2951 }
2952
2953 RTPRINT(rtlpriv, FINIT, INIT_TXPOWER,
2954 "eeprom_regulatory = 0x%x\n", rtlefuse->eeprom_regulatory);
2955}
2956
2957static void _rtl8812ae_read_pa_type(struct ieee80211_hw *hw, u8 *hwinfo,
2958 bool autoload_fail)
2959{
2960 struct rtl_priv *rtlpriv = rtl_priv(hw);
2961 struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
2962
2963 if (!autoload_fail) {
2964 rtlhal->pa_type_2g = hwinfo[0xBC];
2965 rtlhal->lna_type_2g = hwinfo[0xBD];
2966 if (rtlhal->pa_type_2g == 0xFF && rtlhal->lna_type_2g == 0xFF) {
2967 rtlhal->pa_type_2g = 0;
2968 rtlhal->lna_type_2g = 0;
2969 }
2970 rtlhal->external_pa_2g = ((rtlhal->pa_type_2g & BIT(5)) &&
2971 (rtlhal->pa_type_2g & BIT(4))) ?
2972 1 : 0;
2973 rtlhal->external_lna_2g = ((rtlhal->lna_type_2g & BIT(7)) &&
2974 (rtlhal->lna_type_2g & BIT(3))) ?
2975 1 : 0;
2976
2977 rtlhal->pa_type_5g = hwinfo[0xBC];
2978 rtlhal->lna_type_5g = hwinfo[0xBF];
2979 if (rtlhal->pa_type_5g == 0xFF && rtlhal->lna_type_5g == 0xFF) {
2980 rtlhal->pa_type_5g = 0;
2981 rtlhal->lna_type_5g = 0;
2982 }
2983 rtlhal->external_pa_5g = ((rtlhal->pa_type_5g & BIT(1)) &&
2984 (rtlhal->pa_type_5g & BIT(0))) ?
2985 1 : 0;
2986 rtlhal->external_lna_5g = ((rtlhal->lna_type_5g & BIT(7)) &&
2987 (rtlhal->lna_type_5g & BIT(3))) ?
2988 1 : 0;
2989 } else {
2990 rtlhal->external_pa_2g = 0;
2991 rtlhal->external_lna_2g = 0;
2992 rtlhal->external_pa_5g = 0;
2993 rtlhal->external_lna_5g = 0;
2994 }
2995}
2996
2997static void _rtl8821ae_read_pa_type(struct ieee80211_hw *hw, u8 *hwinfo,
2998 bool autoload_fail)
2999{
3000 struct rtl_priv *rtlpriv = rtl_priv(hw);
3001 struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
3002
3003 if (!autoload_fail) {
3004 rtlhal->pa_type_2g = hwinfo[0xBC];
3005 rtlhal->lna_type_2g = hwinfo[0xBD];
3006 if (rtlhal->pa_type_2g == 0xFF && rtlhal->lna_type_2g == 0xFF) {
3007 rtlhal->pa_type_2g = 0;
3008 rtlhal->lna_type_2g = 0;
3009 }
3010 rtlhal->external_pa_2g = (rtlhal->pa_type_2g & BIT(5)) ? 1 : 0;
3011 rtlhal->external_lna_2g = (rtlhal->lna_type_2g & BIT(7)) ? 1 : 0;
3012
3013 rtlhal->pa_type_5g = hwinfo[0xBC];
3014 rtlhal->lna_type_5g = hwinfo[0xBF];
3015 if (rtlhal->pa_type_5g == 0xFF && rtlhal->lna_type_5g == 0xFF) {
3016 rtlhal->pa_type_5g = 0;
3017 rtlhal->lna_type_5g = 0;
3018 }
3019 rtlhal->external_pa_5g = (rtlhal->pa_type_5g & BIT(1)) ? 1 : 0;
3020 rtlhal->external_lna_5g = (rtlhal->lna_type_5g & BIT(7)) ? 1 : 0;
3021 } else {
3022 rtlhal->external_pa_2g = 0;
3023 rtlhal->external_lna_2g = 0;
3024 rtlhal->external_pa_5g = 0;
3025 rtlhal->external_lna_5g = 0;
3026 }
3027}
3028
3029static void _rtl8821ae_read_rfe_type(struct ieee80211_hw *hw, u8 *hwinfo,
3030 bool autoload_fail)
3031{
3032 struct rtl_priv *rtlpriv = rtl_priv(hw);
3033 struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
3034
3035 if (!autoload_fail) {
3036 if (hwinfo[EEPROM_RFE_OPTION] & BIT(7)) {
3037 if (rtlhal->external_lna_5g) {
3038 if (rtlhal->external_pa_5g) {
3039 if (rtlhal->external_lna_2g &&
3040 rtlhal->external_pa_2g)
3041 rtlhal->rfe_type = 3;
3042 else
3043 rtlhal->rfe_type = 0;
3044 } else {
3045 rtlhal->rfe_type = 2;
3046 }
3047 } else {
3048 rtlhal->rfe_type = 4;
3049 }
3050 } else {
3051 rtlhal->rfe_type = hwinfo[EEPROM_RFE_OPTION] & 0x3F;
3052
3053 if (rtlhal->rfe_type == 4 &&
3054 (rtlhal->external_pa_5g ||
3055 rtlhal->external_pa_2g ||
3056 rtlhal->external_lna_5g ||
3057 rtlhal->external_lna_2g)) {
3058 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE)
3059 rtlhal->rfe_type = 2;
3060 }
3061 }
3062 } else {
3063 rtlhal->rfe_type = 0x04;
3064 }
3065
3066 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
3067 "RFE Type: 0x%2x\n", rtlhal->rfe_type);
3068}
3069
3070static void _rtl8812ae_read_bt_coexist_info_from_hwpg(struct ieee80211_hw *hw,
3071 bool auto_load_fail, u8 *hwinfo)
3072{
3073 struct rtl_priv *rtlpriv = rtl_priv(hw);
3074 u8 value;
3075
3076 if (!auto_load_fail) {
3077 value = *(u8 *)&hwinfo[EEPROM_RF_BOARD_OPTION];
3078 if (((value & 0xe0) >> 5) == 0x1)
3079 rtlpriv->btcoexist.btc_info.btcoexist = 1;
3080 else
3081 rtlpriv->btcoexist.btc_info.btcoexist = 0;
3082 rtlpriv->btcoexist.btc_info.bt_type = BT_RTL8812A;
3083
3084 value = hwinfo[EEPROM_RF_BT_SETTING];
3085 rtlpriv->btcoexist.btc_info.ant_num = (value & 0x1);
3086 } else {
3087 rtlpriv->btcoexist.btc_info.btcoexist = 0;
3088 rtlpriv->btcoexist.btc_info.bt_type = BT_RTL8812A;
3089 rtlpriv->btcoexist.btc_info.ant_num = ANT_X2;
3090 }
3091 /*move BT_InitHalVars() to init_sw_vars*/
3092}
3093
3094static void _rtl8821ae_read_bt_coexist_info_from_hwpg(struct ieee80211_hw *hw,
3095 bool auto_load_fail, u8 *hwinfo)
3096{
3097 struct rtl_priv *rtlpriv = rtl_priv(hw);
3098 u8 value;
3099 u32 tmpu_32;
3100
3101 if (!auto_load_fail) {
3102 tmpu_32 = rtl_read_dword(rtlpriv, REG_MULTI_FUNC_CTRL);
3103 if (tmpu_32 & BIT(18))
3104 rtlpriv->btcoexist.btc_info.btcoexist = 1;
3105 else
3106 rtlpriv->btcoexist.btc_info.btcoexist = 0;
3107 rtlpriv->btcoexist.btc_info.bt_type = BT_RTL8821A;
3108
3109 value = hwinfo[EEPROM_RF_BT_SETTING];
3110 rtlpriv->btcoexist.btc_info.ant_num = (value & 0x1);
3111 } else {
3112 rtlpriv->btcoexist.btc_info.btcoexist = 0;
3113 rtlpriv->btcoexist.btc_info.bt_type = BT_RTL8821A;
3114 rtlpriv->btcoexist.btc_info.ant_num = ANT_X2;
3115 }
3116 /*move BT_InitHalVars() to init_sw_vars*/
3117}
3118
3119static void _rtl8821ae_read_adapter_info(struct ieee80211_hw *hw, bool b_pseudo_test)
3120{
3121 struct rtl_priv *rtlpriv = rtl_priv(hw);
3122 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
3123 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
3124 struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw);
3125 u16 i, usvalue;
3126 u8 hwinfo[HWSET_MAX_SIZE];
3127 u16 eeprom_id;
3128
3129 if (b_pseudo_test) {
3130 ;/* need add */
3131 }
3132
3133 if (rtlefuse->epromtype == EEPROM_BOOT_EFUSE) {
3134 rtl_efuse_shadow_map_update(hw);
3135 memcpy(hwinfo, &rtlefuse->efuse_map[EFUSE_INIT_MAP][0],
3136 HWSET_MAX_SIZE);
3137 } else if (rtlefuse->epromtype == EEPROM_93C46) {
3138 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
3139 "RTL819X Not boot from eeprom, check it !!");
3140 }
3141
3142 RT_PRINT_DATA(rtlpriv, COMP_INIT, DBG_DMESG, "MAP\n",
3143 hwinfo, HWSET_MAX_SIZE);
3144
3145 eeprom_id = *((u16 *)&hwinfo[0]);
3146 if (eeprom_id != RTL_EEPROM_ID) {
3147 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
3148 "EEPROM ID(%#x) is invalid!!\n", eeprom_id);
3149 rtlefuse->autoload_failflag = true;
3150 } else {
3151 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "Autoload OK\n");
3152 rtlefuse->autoload_failflag = false;
3153 }
3154
3155 if (rtlefuse->autoload_failflag) {
3156 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
3157 "RTL8812AE autoload_failflag, check it !!");
3158 return;
3159 }
3160
3161 rtlefuse->eeprom_version = *(u8 *)&hwinfo[EEPROM_VERSION];
3162 if (rtlefuse->eeprom_version == 0xff)
3163 rtlefuse->eeprom_version = 0;
3164
3165 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
3166 "EEPROM version: 0x%2x\n", rtlefuse->eeprom_version);
3167
3168 rtlefuse->eeprom_vid = *(u16 *)&hwinfo[EEPROM_VID];
3169 rtlefuse->eeprom_did = *(u16 *)&hwinfo[EEPROM_DID];
3170 rtlefuse->eeprom_svid = *(u16 *)&hwinfo[EEPROM_SVID];
3171 rtlefuse->eeprom_smid = *(u16 *)&hwinfo[EEPROM_SMID];
3172 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
3173 "EEPROMId = 0x%4x\n", eeprom_id);
3174 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
3175 "EEPROM VID = 0x%4x\n", rtlefuse->eeprom_vid);
3176 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
3177 "EEPROM DID = 0x%4x\n", rtlefuse->eeprom_did);
3178 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
3179 "EEPROM SVID = 0x%4x\n", rtlefuse->eeprom_svid);
3180 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
3181 "EEPROM SMID = 0x%4x\n", rtlefuse->eeprom_smid);
3182
3183 /*customer ID*/
3184 rtlefuse->eeprom_oemid = *(u8 *)&hwinfo[EEPROM_CUSTOMER_ID];
3185 if (rtlefuse->eeprom_oemid == 0xFF)
3186 rtlefuse->eeprom_oemid = 0;
3187
3188 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
3189 "EEPROM Customer ID: 0x%2x\n", rtlefuse->eeprom_oemid);
3190
3191 for (i = 0; i < 6; i += 2) {
3192 usvalue = *(u16 *)&hwinfo[EEPROM_MAC_ADDR + i];
3193 *((u16 *)(&rtlefuse->dev_addr[i])) = usvalue;
3194 }
3195
3196 RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
3197 "dev_addr: %pM\n", rtlefuse->dev_addr);
3198
3199 _rtl8821ae_read_txpower_info_from_hwpg(hw, rtlefuse->autoload_failflag,
3200 hwinfo);
3201
3202 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
3203 _rtl8812ae_read_pa_type(hw, hwinfo, rtlefuse->autoload_failflag);
3204 _rtl8812ae_read_bt_coexist_info_from_hwpg(hw,
3205 rtlefuse->autoload_failflag, hwinfo);
3206 } else {
3207 _rtl8821ae_read_pa_type(hw, hwinfo, rtlefuse->autoload_failflag);
3208 _rtl8821ae_read_bt_coexist_info_from_hwpg(hw,
3209 rtlefuse->autoload_failflag, hwinfo);
3210 }
3211
3212 _rtl8821ae_read_rfe_type(hw, hwinfo, rtlefuse->autoload_failflag);
3213 /*board type*/
3214 rtlefuse->board_type = ODM_BOARD_DEFAULT;
3215 if (rtlhal->external_lna_2g != 0)
3216 rtlefuse->board_type |= ODM_BOARD_EXT_LNA;
3217 if (rtlhal->external_lna_5g != 0)
3218 rtlefuse->board_type |= ODM_BOARD_EXT_LNA_5G;
3219 if (rtlhal->external_pa_2g != 0)
3220 rtlefuse->board_type |= ODM_BOARD_EXT_PA;
3221 if (rtlhal->external_pa_5g != 0)
3222 rtlefuse->board_type |= ODM_BOARD_EXT_PA_5G;
3223
3224 if (rtlpriv->btcoexist.btc_info.btcoexist == 1)
3225 rtlefuse->board_type |= ODM_BOARD_BT;
3226
3227 rtlhal->board_type = rtlefuse->board_type;
3228 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
3229 "board_type = 0x%x\n", rtlefuse->board_type);
3230
3231 rtlefuse->eeprom_channelplan = *(u8 *)&hwinfo[EEPROM_CHANNELPLAN];
3232 if (rtlefuse->eeprom_channelplan == 0xff)
3233 rtlefuse->eeprom_channelplan = 0x7F;
3234
3235 /* set channel paln to world wide 13 */
3236 /* rtlefuse->channel_plan = (u8)rtlefuse->eeprom_channelplan; */
3237
3238 /*parse xtal*/
3239 rtlefuse->crystalcap = hwinfo[EEPROM_XTAL_8821AE];
3240 if (rtlefuse->crystalcap == 0xFF)
3241 rtlefuse->crystalcap = 0x20;
3242
3243 rtlefuse->eeprom_thermalmeter = *(u8 *)&hwinfo[EEPROM_THERMAL_METER];
3244 if ((rtlefuse->eeprom_thermalmeter == 0xff) ||
3245 rtlefuse->autoload_failflag) {
3246 rtlefuse->apk_thermalmeterignore = true;
3247 rtlefuse->eeprom_thermalmeter = 0xff;
3248 }
3249
3250 rtlefuse->thermalmeter[0] = rtlefuse->eeprom_thermalmeter;
3251 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
3252 "thermalmeter = 0x%x\n", rtlefuse->eeprom_thermalmeter);
3253
3254 if (!rtlefuse->autoload_failflag) {
3255 rtlefuse->antenna_div_cfg =
3256 (hwinfo[EEPROM_RF_BOARD_OPTION] & 0x18) >> 3;
3257 if (hwinfo[EEPROM_RF_BOARD_OPTION] == 0xff)
3258 rtlefuse->antenna_div_cfg = 0;
3259
3260 if (rtlpriv->btcoexist.btc_info.btcoexist == 1 &&
3261 rtlpriv->btcoexist.btc_info.ant_num == ANT_X1)
3262 rtlefuse->antenna_div_cfg = 0;
3263
3264 rtlefuse->antenna_div_type = hwinfo[EEPROM_RF_ANTENNA_OPT_88E];
3265 if (rtlefuse->antenna_div_type == 0xff)
3266 rtlefuse->antenna_div_type = FIXED_HW_ANTDIV;
3267 } else {
3268 rtlefuse->antenna_div_cfg = 0;
3269 rtlefuse->antenna_div_type = 0;
3270 }
3271
3272 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
3273 "SWAS: bHwAntDiv = %x, TRxAntDivType = %x\n",
3274 rtlefuse->antenna_div_cfg, rtlefuse->antenna_div_type);
3275
3276 pcipriv->ledctl.led_opendrain = true;
3277
3278 if (rtlhal->oem_id == RT_CID_DEFAULT) {
3279 switch (rtlefuse->eeprom_oemid) {
3280 case RT_CID_DEFAULT:
3281 break;
3282 case EEPROM_CID_TOSHIBA:
3283 rtlhal->oem_id = RT_CID_TOSHIBA;
3284 break;
3285 case EEPROM_CID_CCX:
3286 rtlhal->oem_id = RT_CID_CCX;
3287 break;
3288 case EEPROM_CID_QMI:
3289 rtlhal->oem_id = RT_CID_819X_QMI;
3290 break;
3291 case EEPROM_CID_WHQL:
3292 break;
3293 default:
3294 break;
3295 }
3296 }
3297}
3298
3299/*static void _rtl8821ae_hal_customized_behavior(struct ieee80211_hw *hw)
3300{
3301 struct rtl_priv *rtlpriv = rtl_priv(hw);
3302 struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw);
3303 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
3304
3305 pcipriv->ledctl.led_opendrain = true;
3306 switch (rtlhal->oem_id) {
3307 case RT_CID_819X_HP:
3308 pcipriv->ledctl.led_opendrain = true;
3309 break;
3310 case RT_CID_819X_LENOVO:
3311 case RT_CID_DEFAULT:
3312 case RT_CID_TOSHIBA:
3313 case RT_CID_CCX:
3314 case RT_CID_819X_ACER:
3315 case RT_CID_WHQL:
3316 default:
3317 break;
3318 }
3319 RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
3320 "RT Customized ID: 0x%02X\n", rtlhal->oem_id);
3321}*/
3322
3323void rtl8821ae_read_eeprom_info(struct ieee80211_hw *hw)
3324{
3325 struct rtl_priv *rtlpriv = rtl_priv(hw);
3326 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
3327 struct rtl_phy *rtlphy = &rtlpriv->phy;
3328 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
3329 u8 tmp_u1b;
3330
3331 rtlhal->version = _rtl8821ae_read_chip_version(hw);
3332 if (get_rf_type(rtlphy) == RF_1T1R)
3333 rtlpriv->dm.rfpath_rxenable[0] = true;
3334 else
3335 rtlpriv->dm.rfpath_rxenable[0] =
3336 rtlpriv->dm.rfpath_rxenable[1] = true;
3337 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "VersionID = 0x%4x\n",
3338 rtlhal->version);
3339
3340 tmp_u1b = rtl_read_byte(rtlpriv, REG_9346CR);
3341 if (tmp_u1b & BIT(4)) {
3342 RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "Boot from EEPROM\n");
3343 rtlefuse->epromtype = EEPROM_93C46;
3344 } else {
3345 RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "Boot from EFUSE\n");
3346 rtlefuse->epromtype = EEPROM_BOOT_EFUSE;
3347 }
3348
3349 if (tmp_u1b & BIT(5)) {
3350 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "Autoload OK\n");
3351 rtlefuse->autoload_failflag = false;
3352 _rtl8821ae_read_adapter_info(hw, false);
3353 } else {
3354 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "Autoload ERR!!\n");
3355 }
3356 /*hal_ReadRFType_8812A()*/
3357 /* _rtl8821ae_hal_customized_behavior(hw); */
3358}
3359
3360static void rtl8821ae_update_hal_rate_table(struct ieee80211_hw *hw,
3361 struct ieee80211_sta *sta)
3362{
3363 struct rtl_priv *rtlpriv = rtl_priv(hw);
3364 struct rtl_phy *rtlphy = &rtlpriv->phy;
3365 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
3366 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
3367 u32 ratr_value;
3368 u8 ratr_index = 0;
3369 u8 b_nmode = mac->ht_enable;
3370 u8 mimo_ps = IEEE80211_SMPS_OFF;
3371 u16 shortgi_rate;
3372 u32 tmp_ratr_value;
3373 u8 curtxbw_40mhz = mac->bw_40;
3374 u8 b_curshortgi_40mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
3375 1 : 0;
3376 u8 b_curshortgi_20mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
3377 1 : 0;
3378 enum wireless_mode wirelessmode = mac->mode;
3379
3380 if (rtlhal->current_bandtype == BAND_ON_5G)
3381 ratr_value = sta->supp_rates[1] << 4;
3382 else
3383 ratr_value = sta->supp_rates[0];
3384 if (mac->opmode == NL80211_IFTYPE_ADHOC)
3385 ratr_value = 0xfff;
3386 ratr_value |= (sta->ht_cap.mcs.rx_mask[1] << 20 |
3387 sta->ht_cap.mcs.rx_mask[0] << 12);
3388 switch (wirelessmode) {
3389 case WIRELESS_MODE_B:
3390 if (ratr_value & 0x0000000c)
3391 ratr_value &= 0x0000000d;
3392 else
3393 ratr_value &= 0x0000000f;
3394 break;
3395 case WIRELESS_MODE_G:
3396 ratr_value &= 0x00000FF5;
3397 break;
3398 case WIRELESS_MODE_N_24G:
3399 case WIRELESS_MODE_N_5G:
3400 b_nmode = 1;
3401 if (mimo_ps == IEEE80211_SMPS_STATIC) {
3402 ratr_value &= 0x0007F005;
3403 } else {
3404 u32 ratr_mask;
3405
3406 if (get_rf_type(rtlphy) == RF_1T2R ||
3407 get_rf_type(rtlphy) == RF_1T1R)
3408 ratr_mask = 0x000ff005;
3409 else
3410 ratr_mask = 0x0f0ff005;
3411
3412 ratr_value &= ratr_mask;
3413 }
3414 break;
3415 default:
3416 if (rtlphy->rf_type == RF_1T2R)
3417 ratr_value &= 0x000ff0ff;
3418 else
3419 ratr_value &= 0x0f0ff0ff;
3420
3421 break;
3422 }
3423
3424 if ((rtlpriv->btcoexist.bt_coexistence) &&
3425 (rtlpriv->btcoexist.bt_coexist_type == BT_CSR_BC4) &&
3426 (rtlpriv->btcoexist.bt_cur_state) &&
3427 (rtlpriv->btcoexist.bt_ant_isolation) &&
3428 ((rtlpriv->btcoexist.bt_service == BT_SCO) ||
3429 (rtlpriv->btcoexist.bt_service == BT_BUSY)))
3430 ratr_value &= 0x0fffcfc0;
3431 else
3432 ratr_value &= 0x0FFFFFFF;
3433
3434 if (b_nmode && ((curtxbw_40mhz &&
3435 b_curshortgi_40mhz) || (!curtxbw_40mhz &&
3436 b_curshortgi_20mhz))) {
3437 ratr_value |= 0x10000000;
3438 tmp_ratr_value = (ratr_value >> 12);
3439
3440 for (shortgi_rate = 15; shortgi_rate > 0; shortgi_rate--) {
3441 if ((1 << shortgi_rate) & tmp_ratr_value)
3442 break;
3443 }
3444
3445 shortgi_rate = (shortgi_rate << 12) | (shortgi_rate << 8) |
3446 (shortgi_rate << 4) | (shortgi_rate);
3447 }
3448
3449 rtl_write_dword(rtlpriv, REG_ARFR0 + ratr_index * 4, ratr_value);
3450
3451 RT_TRACE(rtlpriv, COMP_RATR, DBG_DMESG,
3452 "%x\n", rtl_read_dword(rtlpriv, REG_ARFR0));
3453}
3454
3455static u8 _rtl8821ae_mrate_idx_to_arfr_id(
3456 struct ieee80211_hw *hw, u8 rate_index,
3457 enum wireless_mode wirelessmode)
3458{
3459 struct rtl_priv *rtlpriv = rtl_priv(hw);
3460 struct rtl_phy *rtlphy = &rtlpriv->phy;
3461 u8 ret = 0;
3462 switch (rate_index) {
3463 case RATR_INX_WIRELESS_NGB:
3464 if (rtlphy->rf_type == RF_1T1R)
3465 ret = 1;
3466 else
3467 ret = 0;
3468 ; break;
3469 case RATR_INX_WIRELESS_N:
3470 case RATR_INX_WIRELESS_NG:
3471 if (rtlphy->rf_type == RF_1T1R)
3472 ret = 5;
3473 else
3474 ret = 4;
3475 ; break;
3476 case RATR_INX_WIRELESS_NB:
3477 if (rtlphy->rf_type == RF_1T1R)
3478 ret = 3;
3479 else
3480 ret = 2;
3481 ; break;
3482 case RATR_INX_WIRELESS_GB:
3483 ret = 6;
3484 break;
3485 case RATR_INX_WIRELESS_G:
3486 ret = 7;
3487 break;
3488 case RATR_INX_WIRELESS_B:
3489 ret = 8;
3490 break;
3491 case RATR_INX_WIRELESS_MC:
3492 if ((wirelessmode == WIRELESS_MODE_B)
3493 || (wirelessmode == WIRELESS_MODE_G)
3494 || (wirelessmode == WIRELESS_MODE_N_24G)
3495 || (wirelessmode == WIRELESS_MODE_AC_24G))
3496 ret = 6;
3497 else
3498 ret = 7;
3499 case RATR_INX_WIRELESS_AC_5N:
3500 if (rtlphy->rf_type == RF_1T1R)
3501 ret = 10;
3502 else
3503 ret = 9;
3504 break;
3505 case RATR_INX_WIRELESS_AC_24N:
3506 if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_80) {
3507 if (rtlphy->rf_type == RF_1T1R)
3508 ret = 10;
3509 else
3510 ret = 9;
3511 } else {
3512 if (rtlphy->rf_type == RF_1T1R)
3513 ret = 11;
3514 else
3515 ret = 12;
3516 }
3517 break;
3518 default:
3519 ret = 0; break;
3520 }
3521 return ret;
3522}
3523
3524static u32 _rtl8821ae_rate_to_bitmap_2ssvht(__le16 vht_rate)
3525{
3526 u8 i, j, tmp_rate;
3527 u32 rate_bitmap = 0;
3528
3529 for (i = j = 0; i < 4; i += 2, j += 10) {
3530 tmp_rate = (le16_to_cpu(vht_rate) >> i) & 3;
3531
3532 switch (tmp_rate) {
3533 case 2:
3534 rate_bitmap = rate_bitmap | (0x03ff << j);
3535 break;
3536 case 1:
3537 rate_bitmap = rate_bitmap | (0x01ff << j);
3538 break;
3539 case 0:
3540 rate_bitmap = rate_bitmap | (0x00ff << j);
3541 break;
3542 default:
3543 break;
3544 }
3545 }
3546
3547 return rate_bitmap;
3548}
3549
3550static u32 _rtl8821ae_set_ra_vht_ratr_bitmap(struct ieee80211_hw *hw,
3551 enum wireless_mode wirelessmode,
3552 u32 ratr_bitmap)
3553{
3554 struct rtl_priv *rtlpriv = rtl_priv(hw);
3555 struct rtl_phy *rtlphy = &rtlpriv->phy;
3556 u32 ret_bitmap = ratr_bitmap;
3557
3558 if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20_40
3559 || rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_80)
3560 ret_bitmap = ratr_bitmap;
3561 else if (wirelessmode == WIRELESS_MODE_AC_5G
3562 || wirelessmode == WIRELESS_MODE_AC_24G) {
3563 if (rtlphy->rf_type == RF_1T1R)
3564 ret_bitmap = ratr_bitmap & (~BIT21);
3565 else
3566 ret_bitmap = ratr_bitmap & (~(BIT31|BIT21));
3567 }
3568
3569 return ret_bitmap;
3570}
3571
3572static u8 _rtl8821ae_get_vht_eni(enum wireless_mode wirelessmode,
3573 u32 ratr_bitmap)
3574{
3575 u8 ret = 0;
3576 if (wirelessmode < WIRELESS_MODE_N_24G)
3577 ret = 0;
3578 else if (wirelessmode == WIRELESS_MODE_AC_24G) {
3579 if (ratr_bitmap & 0xfff00000) /* Mix , 2SS */
3580 ret = 3;
3581 else /* Mix, 1SS */
3582 ret = 2;
3583 } else if (wirelessmode == WIRELESS_MODE_AC_5G) {
3584 ret = 1;
3585 } /* VHT */
3586
3587 return ret << 4;
3588}
3589
3590static u8 _rtl8821ae_get_ra_ldpc(struct ieee80211_hw *hw,
3591 u8 mac_id, struct rtl_sta_info *sta_entry,
3592 enum wireless_mode wirelessmode)
3593{
3594 u8 b_ldpc = 0;
3595 /*not support ldpc, do not open*/
3596 return b_ldpc << 2;
3597}
3598
3599static u8 _rtl8821ae_get_ra_rftype(struct ieee80211_hw *hw,
3600 enum wireless_mode wirelessmode,
3601 u32 ratr_bitmap)
3602{
3603 struct rtl_priv *rtlpriv = rtl_priv(hw);
3604 struct rtl_phy *rtlphy = &rtlpriv->phy;
3605 u8 rf_type = RF_1T1R;
3606
3607 if (rtlphy->rf_type == RF_1T1R)
3608 rf_type = RF_1T1R;
3609 else if (wirelessmode == WIRELESS_MODE_AC_5G
3610 || wirelessmode == WIRELESS_MODE_AC_24G
3611 || wirelessmode == WIRELESS_MODE_AC_ONLY) {
3612 if (ratr_bitmap & 0xffc00000)
3613 rf_type = RF_2T2R;
3614 } else if (wirelessmode == WIRELESS_MODE_N_5G
3615 || wirelessmode == WIRELESS_MODE_N_24G) {
3616 if (ratr_bitmap & 0xfff00000)
3617 rf_type = RF_2T2R;
3618 }
3619
3620 return rf_type;
3621}
3622
3623static bool _rtl8821ae_get_ra_shortgi(struct ieee80211_hw *hw, struct ieee80211_sta *sta,
3624 u8 mac_id)
3625{
3626 bool b_short_gi = false;
3627 u8 b_curshortgi_40mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
3628 1 : 0;
3629 u8 b_curshortgi_20mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
3630 1 : 0;
3631 u8 b_curshortgi_80mhz = 0;
3632 b_curshortgi_80mhz = (sta->vht_cap.cap &
3633 IEEE80211_VHT_CAP_SHORT_GI_80) ? 1 : 0;
3634
3635 if (mac_id == MAC_ID_STATIC_FOR_BROADCAST_MULTICAST)
3636 b_short_gi = false;
3637
3638 if (b_curshortgi_40mhz || b_curshortgi_80mhz
3639 || b_curshortgi_20mhz)
3640 b_short_gi = true;
3641
3642 return b_short_gi;
3643}
3644
3645static void rtl8821ae_update_hal_rate_mask(struct ieee80211_hw *hw,
3646 struct ieee80211_sta *sta, u8 rssi_level)
3647{
3648 struct rtl_priv *rtlpriv = rtl_priv(hw);
3649 struct rtl_phy *rtlphy = &rtlpriv->phy;
3650 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
3651 struct rtl_sta_info *sta_entry = NULL;
3652 u32 ratr_bitmap;
3653 u8 ratr_index;
3654 enum wireless_mode wirelessmode = 0;
3655 u8 curtxbw_40mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40)
3656 ? 1 : 0;
3657 bool b_shortgi = false;
3658 u8 rate_mask[7];
3659 u8 macid = 0;
3660 u8 mimo_ps = IEEE80211_SMPS_OFF;
3661 u8 rf_type;
3662
3663 sta_entry = (struct rtl_sta_info *)sta->drv_priv;
3664 wirelessmode = sta_entry->wireless_mode;
3665
3666 RT_TRACE(rtlpriv, COMP_RATR, DBG_LOUD,
3667 "wireless mode = 0x%x\n", wirelessmode);
3668 if (mac->opmode == NL80211_IFTYPE_STATION ||
3669 mac->opmode == NL80211_IFTYPE_MESH_POINT) {
3670 curtxbw_40mhz = mac->bw_40;
3671 } else if (mac->opmode == NL80211_IFTYPE_AP ||
3672 mac->opmode == NL80211_IFTYPE_ADHOC)
3673 macid = sta->aid + 1;
3674 if (wirelessmode == WIRELESS_MODE_N_5G ||
3675 wirelessmode == WIRELESS_MODE_AC_5G)
3676 ratr_bitmap = sta->supp_rates[NL80211_BAND_5GHZ];
3677 else
3678 ratr_bitmap = sta->supp_rates[NL80211_BAND_2GHZ];
3679
3680 if (mac->opmode == NL80211_IFTYPE_ADHOC)
3681 ratr_bitmap = 0xfff;
3682
3683 if (wirelessmode == WIRELESS_MODE_N_24G
3684 || wirelessmode == WIRELESS_MODE_N_5G)
3685 ratr_bitmap |= (sta->ht_cap.mcs.rx_mask[1] << 20 |
3686 sta->ht_cap.mcs.rx_mask[0] << 12);
3687 else if (wirelessmode == WIRELESS_MODE_AC_24G
3688 || wirelessmode == WIRELESS_MODE_AC_5G
3689 || wirelessmode == WIRELESS_MODE_AC_ONLY)
3690 ratr_bitmap |= _rtl8821ae_rate_to_bitmap_2ssvht(
3691 sta->vht_cap.vht_mcs.rx_mcs_map) << 12;
3692
3693 b_shortgi = _rtl8821ae_get_ra_shortgi(hw, sta, macid);
3694 rf_type = _rtl8821ae_get_ra_rftype(hw, wirelessmode, ratr_bitmap);
3695
3696/*mac id owner*/
3697 switch (wirelessmode) {
3698 case WIRELESS_MODE_B:
3699 ratr_index = RATR_INX_WIRELESS_B;
3700 if (ratr_bitmap & 0x0000000c)
3701 ratr_bitmap &= 0x0000000d;
3702 else
3703 ratr_bitmap &= 0x0000000f;
3704 break;
3705 case WIRELESS_MODE_G:
3706 ratr_index = RATR_INX_WIRELESS_GB;
3707
3708 if (rssi_level == 1)
3709 ratr_bitmap &= 0x00000f00;
3710 else if (rssi_level == 2)
3711 ratr_bitmap &= 0x00000ff0;
3712 else
3713 ratr_bitmap &= 0x00000ff5;
3714 break;
3715 case WIRELESS_MODE_A:
3716 ratr_index = RATR_INX_WIRELESS_G;
3717 ratr_bitmap &= 0x00000ff0;
3718 break;
3719 case WIRELESS_MODE_N_24G:
3720 case WIRELESS_MODE_N_5G:
3721 if (wirelessmode == WIRELESS_MODE_N_24G)
3722 ratr_index = RATR_INX_WIRELESS_NGB;
3723 else
3724 ratr_index = RATR_INX_WIRELESS_NG;
3725
3726 if (mimo_ps == IEEE80211_SMPS_STATIC
3727 || mimo_ps == IEEE80211_SMPS_DYNAMIC) {
3728 if (rssi_level == 1)
3729 ratr_bitmap &= 0x000f0000;
3730 else if (rssi_level == 2)
3731 ratr_bitmap &= 0x000ff000;
3732 else
3733 ratr_bitmap &= 0x000ff005;
3734 } else {
3735 if (rf_type == RF_1T1R) {
3736 if (curtxbw_40mhz) {
3737 if (rssi_level == 1)
3738 ratr_bitmap &= 0x000f0000;
3739 else if (rssi_level == 2)
3740 ratr_bitmap &= 0x000ff000;
3741 else
3742 ratr_bitmap &= 0x000ff015;
3743 } else {
3744 if (rssi_level == 1)
3745 ratr_bitmap &= 0x000f0000;
3746 else if (rssi_level == 2)
3747 ratr_bitmap &= 0x000ff000;
3748 else
3749 ratr_bitmap &= 0x000ff005;
3750 }
3751 } else {
3752 if (curtxbw_40mhz) {
3753 if (rssi_level == 1)
3754 ratr_bitmap &= 0x0fff0000;
3755 else if (rssi_level == 2)
3756 ratr_bitmap &= 0x0ffff000;
3757 else
3758 ratr_bitmap &= 0x0ffff015;
3759 } else {
3760 if (rssi_level == 1)
3761 ratr_bitmap &= 0x0fff0000;
3762 else if (rssi_level == 2)
3763 ratr_bitmap &= 0x0ffff000;
3764 else
3765 ratr_bitmap &= 0x0ffff005;
3766 }
3767 }
3768 }
3769 break;
3770
3771 case WIRELESS_MODE_AC_24G:
3772 ratr_index = RATR_INX_WIRELESS_AC_24N;
3773 if (rssi_level == 1)
3774 ratr_bitmap &= 0xfc3f0000;
3775 else if (rssi_level == 2)
3776 ratr_bitmap &= 0xfffff000;
3777 else
3778 ratr_bitmap &= 0xffffffff;
3779 break;
3780
3781 case WIRELESS_MODE_AC_5G:
3782 ratr_index = RATR_INX_WIRELESS_AC_5N;
3783
3784 if (rf_type == RF_1T1R) {
3785 if (rssi_level == 1) /*add by Gary for ac-series*/
3786 ratr_bitmap &= 0x003f8000;
3787 else if (rssi_level == 2)
3788 ratr_bitmap &= 0x003ff000;
3789 else
3790 ratr_bitmap &= 0x003ff010;
3791 } else {
3792 if (rssi_level == 1)
3793 ratr_bitmap &= 0xfe3f8000;
3794 else if (rssi_level == 2)
3795 ratr_bitmap &= 0xfffff000;
3796 else
3797 ratr_bitmap &= 0xfffff010;
3798 }
3799 break;
3800
3801 default:
3802 ratr_index = RATR_INX_WIRELESS_NGB;
3803
3804 if (rf_type == RF_1T2R)
3805 ratr_bitmap &= 0x000ff0ff;
3806 else
3807 ratr_bitmap &= 0x0f8ff0ff;
3808 break;
3809 }
3810
3811 ratr_index = _rtl8821ae_mrate_idx_to_arfr_id(hw, ratr_index, wirelessmode);
3812 sta_entry->ratr_index = ratr_index;
3813 ratr_bitmap = _rtl8821ae_set_ra_vht_ratr_bitmap(hw, wirelessmode,
3814 ratr_bitmap);
3815
3816 RT_TRACE(rtlpriv, COMP_RATR, DBG_LOUD,
3817 "ratr_bitmap :%x\n", ratr_bitmap);
3818
3819 /* *(u32 *)& rate_mask = EF4BYTE((ratr_bitmap & 0x0fffffff) |
3820 (ratr_index << 28)); */
3821
3822 rate_mask[0] = macid;
3823 rate_mask[1] = ratr_index | (b_shortgi ? 0x80 : 0x00);
3824 rate_mask[2] = rtlphy->current_chan_bw
3825 | _rtl8821ae_get_vht_eni(wirelessmode, ratr_bitmap)
3826 | _rtl8821ae_get_ra_ldpc(hw, macid, sta_entry, wirelessmode);
3827
3828 rate_mask[3] = (u8)(ratr_bitmap & 0x000000ff);
3829 rate_mask[4] = (u8)((ratr_bitmap & 0x0000ff00) >> 8);
3830 rate_mask[5] = (u8)((ratr_bitmap & 0x00ff0000) >> 16);
3831 rate_mask[6] = (u8)((ratr_bitmap & 0xff000000) >> 24);
3832
3833 RT_TRACE(rtlpriv, COMP_RATR, DBG_DMESG,
3834 "Rate_index:%x, ratr_val:%x, %x:%x:%x:%x:%x:%x:%x\n",
3835 ratr_index, ratr_bitmap,
3836 rate_mask[0], rate_mask[1],
3837 rate_mask[2], rate_mask[3],
3838 rate_mask[4], rate_mask[5],
3839 rate_mask[6]);
3840 rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_RA_MASK, 7, rate_mask);
3841 _rtl8821ae_set_bcn_ctrl_reg(hw, BIT(3), 0);
3842}
3843
3844void rtl8821ae_update_hal_rate_tbl(struct ieee80211_hw *hw,
3845 struct ieee80211_sta *sta, u8 rssi_level)
3846{
3847 struct rtl_priv *rtlpriv = rtl_priv(hw);
3848 if (rtlpriv->dm.useramask)
3849 rtl8821ae_update_hal_rate_mask(hw, sta, rssi_level);
3850 else
3851 /*RT_TRACE(rtlpriv, COMP_RATR,DBG_LOUD,
3852 "rtl8821ae_update_hal_rate_tbl() Error! 8821ae FW RA Only");*/
3853 rtl8821ae_update_hal_rate_table(hw, sta);
3854}
3855
3856void rtl8821ae_update_channel_access_setting(struct ieee80211_hw *hw)
3857{
3858 struct rtl_priv *rtlpriv = rtl_priv(hw);
3859 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
3860 u8 wireless_mode = mac->mode;
3861 u8 sifs_timer, r2t_sifs;
3862
3863 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SLOT_TIME,
3864 (u8 *)&mac->slot_time);
3865 if (wireless_mode == WIRELESS_MODE_G)
3866 sifs_timer = 0x0a;
3867 else
3868 sifs_timer = 0x0e;
3869 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SIFS, (u8 *)&sifs_timer);
3870
3871 r2t_sifs = 0xa;
3872
3873 if (wireless_mode == WIRELESS_MODE_AC_5G &&
3874 (mac->vht_ldpc_cap & LDPC_VHT_ENABLE_RX) &&
3875 (mac->vht_stbc_cap & STBC_VHT_ENABLE_RX)) {
3876 if (mac->vendor == PEER_ATH)
3877 r2t_sifs = 0x8;
3878 else
3879 r2t_sifs = 0xa;
3880 } else if (wireless_mode == WIRELESS_MODE_AC_5G) {
3881 r2t_sifs = 0xa;
3882 }
3883
3884 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_R2T_SIFS, (u8 *)&r2t_sifs);
3885}
3886
3887bool rtl8821ae_gpio_radio_on_off_checking(struct ieee80211_hw *hw, u8 *valid)
3888{
3889 struct rtl_priv *rtlpriv = rtl_priv(hw);
3890 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
3891 struct rtl_phy *rtlphy = &rtlpriv->phy;
3892 enum rf_pwrstate e_rfpowerstate_toset, cur_rfstate;
3893 u8 u1tmp = 0;
3894 bool b_actuallyset = false;
3895
3896 if (rtlpriv->rtlhal.being_init_adapter)
3897 return false;
3898
3899 if (ppsc->swrf_processing)
3900 return false;
3901
3902 spin_lock(&rtlpriv->locks.rf_ps_lock);
3903 if (ppsc->rfchange_inprogress) {
3904 spin_unlock(&rtlpriv->locks.rf_ps_lock);
3905 return false;
3906 } else {
3907 ppsc->rfchange_inprogress = true;
3908 spin_unlock(&rtlpriv->locks.rf_ps_lock);
3909 }
3910
3911 cur_rfstate = ppsc->rfpwr_state;
3912
3913 rtl_write_byte(rtlpriv, REG_GPIO_IO_SEL_2,
3914 rtl_read_byte(rtlpriv,
3915 REG_GPIO_IO_SEL_2) & ~(BIT(1)));
3916
3917 u1tmp = rtl_read_byte(rtlpriv, REG_GPIO_PIN_CTRL_2);
3918
3919 if (rtlphy->polarity_ctl)
3920 e_rfpowerstate_toset = (u1tmp & BIT(1)) ? ERFOFF : ERFON;
3921 else
3922 e_rfpowerstate_toset = (u1tmp & BIT(1)) ? ERFON : ERFOFF;
3923
3924 if ((ppsc->hwradiooff) && (e_rfpowerstate_toset == ERFON)) {
3925 RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
3926 "GPIOChangeRF - HW Radio ON, RF ON\n");
3927
3928 e_rfpowerstate_toset = ERFON;
3929 ppsc->hwradiooff = false;
3930 b_actuallyset = true;
3931 } else if ((!ppsc->hwradiooff)
3932 && (e_rfpowerstate_toset == ERFOFF)) {
3933 RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
3934 "GPIOChangeRF - HW Radio OFF, RF OFF\n");
3935
3936 e_rfpowerstate_toset = ERFOFF;
3937 ppsc->hwradiooff = true;
3938 b_actuallyset = true;
3939 }
3940
3941 if (b_actuallyset) {
3942 spin_lock(&rtlpriv->locks.rf_ps_lock);
3943 ppsc->rfchange_inprogress = false;
3944 spin_unlock(&rtlpriv->locks.rf_ps_lock);
3945 } else {
3946 if (ppsc->reg_rfps_level & RT_RF_OFF_LEVL_HALT_NIC)
3947 RT_SET_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC);
3948
3949 spin_lock(&rtlpriv->locks.rf_ps_lock);
3950 ppsc->rfchange_inprogress = false;
3951 spin_unlock(&rtlpriv->locks.rf_ps_lock);
3952 }
3953
3954 *valid = 1;
3955 return !ppsc->hwradiooff;
3956}
3957
3958void rtl8821ae_set_key(struct ieee80211_hw *hw, u32 key_index,
3959 u8 *p_macaddr, bool is_group, u8 enc_algo,
3960 bool is_wepkey, bool clear_all)
3961{
3962 struct rtl_priv *rtlpriv = rtl_priv(hw);
3963 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
3964 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
3965 u8 *macaddr = p_macaddr;
3966 u32 entry_id = 0;
3967 bool is_pairwise = false;
3968
3969 static u8 cam_const_addr[4][6] = {
3970 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
3971 {0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
3972 {0x00, 0x00, 0x00, 0x00, 0x00, 0x02},
3973 {0x00, 0x00, 0x00, 0x00, 0x00, 0x03}
3974 };
3975 static u8 cam_const_broad[] = {
3976 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
3977 };
3978
3979 if (clear_all) {
3980 u8 idx = 0;
3981 u8 cam_offset = 0;
3982 u8 clear_number = 5;
3983
3984 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG, "clear_all\n");
3985
3986 for (idx = 0; idx < clear_number; idx++) {
3987 rtl_cam_mark_invalid(hw, cam_offset + idx);
3988 rtl_cam_empty_entry(hw, cam_offset + idx);
3989
3990 if (idx < 5) {
3991 memset(rtlpriv->sec.key_buf[idx], 0,
3992 MAX_KEY_LEN);
3993 rtlpriv->sec.key_len[idx] = 0;
3994 }
3995 }
3996 } else {
3997 switch (enc_algo) {
3998 case WEP40_ENCRYPTION:
3999 enc_algo = CAM_WEP40;
4000 break;
4001 case WEP104_ENCRYPTION:
4002 enc_algo = CAM_WEP104;
4003 break;
4004 case TKIP_ENCRYPTION:
4005 enc_algo = CAM_TKIP;
4006 break;
4007 case AESCCMP_ENCRYPTION:
4008 enc_algo = CAM_AES;
4009 break;
4010 default:
4011 RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
4012 "switch case not process\n");
4013 enc_algo = CAM_TKIP;
4014 break;
4015 }
4016
4017 if (is_wepkey || rtlpriv->sec.use_defaultkey) {
4018 macaddr = cam_const_addr[key_index];
4019 entry_id = key_index;
4020 } else {
4021 if (is_group) {
4022 macaddr = cam_const_broad;
4023 entry_id = key_index;
4024 } else {
4025 if (mac->opmode == NL80211_IFTYPE_AP) {
4026 entry_id = rtl_cam_get_free_entry(hw, p_macaddr);
4027 if (entry_id >= TOTAL_CAM_ENTRY) {
4028 RT_TRACE(rtlpriv, COMP_SEC, DBG_EMERG,
4029 "Can not find free hwsecurity cam entry\n");
4030 return;
4031 }
4032 } else {
4033 entry_id = CAM_PAIRWISE_KEY_POSITION;
4034 }
4035
4036 key_index = PAIRWISE_KEYIDX;
4037 is_pairwise = true;
4038 }
4039 }
4040
4041 if (rtlpriv->sec.key_len[key_index] == 0) {
4042 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
4043 "delete one entry, entry_id is %d\n",
4044 entry_id);
4045 if (mac->opmode == NL80211_IFTYPE_AP)
4046 rtl_cam_del_entry(hw, p_macaddr);
4047 rtl_cam_delete_one_entry(hw, p_macaddr, entry_id);
4048 } else {
4049 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
4050 "add one entry\n");
4051 if (is_pairwise) {
4052 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
4053 "set Pairwise key\n");
4054
4055 rtl_cam_add_one_entry(hw, macaddr, key_index,
4056 entry_id, enc_algo,
4057 CAM_CONFIG_NO_USEDK,
4058 rtlpriv->sec.key_buf[key_index]);
4059 } else {
4060 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
4061 "set group key\n");
4062
4063 if (mac->opmode == NL80211_IFTYPE_ADHOC) {
4064 rtl_cam_add_one_entry(hw,
4065 rtlefuse->dev_addr,
4066 PAIRWISE_KEYIDX,
4067 CAM_PAIRWISE_KEY_POSITION,
4068 enc_algo,
4069 CAM_CONFIG_NO_USEDK,
4070 rtlpriv->sec.key_buf
4071 [entry_id]);
4072 }
4073
4074 rtl_cam_add_one_entry(hw, macaddr, key_index,
4075 entry_id, enc_algo,
4076 CAM_CONFIG_NO_USEDK,
4077 rtlpriv->sec.key_buf[entry_id]);
4078 }
4079 }
4080 }
4081}
4082
4083void rtl8821ae_bt_reg_init(struct ieee80211_hw *hw)
4084{
4085 struct rtl_priv *rtlpriv = rtl_priv(hw);
4086
4087 /* 0:Low, 1:High, 2:From Efuse. */
4088 rtlpriv->btcoexist.reg_bt_iso = 2;
4089 /* 0:Idle, 1:None-SCO, 2:SCO, 3:From Counter. */
4090 rtlpriv->btcoexist.reg_bt_sco = 3;
4091 /* 0:Disable BT control A-MPDU, 1:Enable BT control A-MPDU. */
4092 rtlpriv->btcoexist.reg_bt_sco = 0;
4093}
4094
4095void rtl8821ae_bt_hw_init(struct ieee80211_hw *hw)
4096{
4097 struct rtl_priv *rtlpriv = rtl_priv(hw);
4098
4099 if (rtlpriv->cfg->ops->get_btc_status())
4100 rtlpriv->btcoexist.btc_ops->btc_init_hw_config(rtlpriv);
4101}
4102
4103void rtl8821ae_suspend(struct ieee80211_hw *hw)
4104{
4105}
4106
4107void rtl8821ae_resume(struct ieee80211_hw *hw)
4108{
4109}
4110
4111/* Turn on AAP (RCR:bit 0) for promicuous mode. */
4112void rtl8821ae_allow_all_destaddr(struct ieee80211_hw *hw,
4113 bool allow_all_da, bool write_into_reg)
4114{
4115 struct rtl_priv *rtlpriv = rtl_priv(hw);
4116 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
4117
4118 if (allow_all_da) /* Set BIT0 */
4119 rtlpci->receive_config |= RCR_AAP;
4120 else /* Clear BIT0 */
4121 rtlpci->receive_config &= ~RCR_AAP;
4122
4123 if (write_into_reg)
4124 rtl_write_dword(rtlpriv, REG_RCR, rtlpci->receive_config);
4125
4126 RT_TRACE(rtlpriv, COMP_TURBO | COMP_INIT, DBG_LOUD,
4127 "receive_config=0x%08X, write_into_reg=%d\n",
4128 rtlpci->receive_config, write_into_reg);
4129}
4130
4131/* WKFMCAMAddAllEntry8812 */
4132void rtl8821ae_add_wowlan_pattern(struct ieee80211_hw *hw,
4133 struct rtl_wow_pattern *rtl_pattern,
4134 u8 index)
4135{
4136 struct rtl_priv *rtlpriv = rtl_priv(hw);
4137 u32 cam = 0;
4138 u8 addr = 0;
4139 u16 rxbuf_addr;
4140 u8 tmp, count = 0;
4141 u16 cam_start;
4142 u16 offset;
4143
4144 /* Count the WFCAM entry start offset. */
4145
4146 /* RX page size = 128 byte */
4147 offset = MAX_RX_DMA_BUFFER_SIZE_8812 / 128;
4148 /* We should start from the boundry */
4149 cam_start = offset * 128;
4150
4151 /* Enable Rx packet buffer access. */
4152 rtl_write_byte(rtlpriv, REG_PKT_BUFF_ACCESS_CTRL, RXPKT_BUF_SELECT);
4153 for (addr = 0; addr < WKFMCAM_ADDR_NUM; addr++) {
4154 /* Set Rx packet buffer offset.
4155 * RxBufer pointer increases 1,
4156 * we can access 8 bytes in Rx packet buffer.
4157 * CAM start offset (unit: 1 byte) = index*WKFMCAM_SIZE
4158 * RxBufer addr = (CAM start offset +
4159 * per entry offset of a WKFM CAM)/8
4160 * * index: The index of the wake up frame mask
4161 * * WKFMCAM_SIZE: the total size of one WKFM CAM
4162 * * per entry offset of a WKFM CAM: Addr*4 bytes
4163 */
4164 rxbuf_addr = (cam_start + index * WKFMCAM_SIZE + addr * 4) >> 3;
4165 /* Set R/W start offset */
4166 rtl_write_word(rtlpriv, REG_PKTBUF_DBG_CTRL, rxbuf_addr);
4167
4168 if (addr == 0) {
4169 cam = BIT(31) | rtl_pattern->crc;
4170
4171 if (rtl_pattern->type == UNICAST_PATTERN)
4172 cam |= BIT(24);
4173 else if (rtl_pattern->type == MULTICAST_PATTERN)
4174 cam |= BIT(25);
4175 else if (rtl_pattern->type == BROADCAST_PATTERN)
4176 cam |= BIT(26);
4177
4178 rtl_write_dword(rtlpriv, REG_PKTBUF_DBG_DATA_L, cam);
4179 RT_TRACE(rtlpriv, COMP_POWER, DBG_TRACE,
4180 "WRITE entry[%d] 0x%x: %x\n", addr,
4181 REG_PKTBUF_DBG_DATA_L, cam);
4182
4183 /* Write to Rx packet buffer. */
4184 rtl_write_word(rtlpriv, REG_RXPKTBUF_CTRL, 0x0f01);
4185 } else if (addr == 2 || addr == 4) {/* WKFM[127:0] */
4186 cam = rtl_pattern->mask[addr - 2];
4187
4188 rtl_write_dword(rtlpriv, REG_PKTBUF_DBG_DATA_L, cam);
4189 RT_TRACE(rtlpriv, COMP_POWER, DBG_TRACE,
4190 "WRITE entry[%d] 0x%x: %x\n", addr,
4191 REG_PKTBUF_DBG_DATA_L, cam);
4192
4193 rtl_write_word(rtlpriv, REG_RXPKTBUF_CTRL, 0x0f01);
4194 } else if (addr == 3 || addr == 5) {/* WKFM[127:0] */
4195 cam = rtl_pattern->mask[addr - 2];
4196
4197 rtl_write_dword(rtlpriv, REG_PKTBUF_DBG_DATA_H, cam);
4198 RT_TRACE(rtlpriv, COMP_POWER, DBG_TRACE,
4199 "WRITE entry[%d] 0x%x: %x\n", addr,
4200 REG_PKTBUF_DBG_DATA_H, cam);
4201
4202 rtl_write_word(rtlpriv, REG_RXPKTBUF_CTRL, 0xf001);
4203 }
4204
4205 count = 0;
4206 do {
4207 tmp = rtl_read_byte(rtlpriv, REG_RXPKTBUF_CTRL);
4208 udelay(2);
4209 count++;
4210 } while (tmp && count < 100);
4211
4212 RT_ASSERT((count < 100),
4213 "Write wake up frame mask FAIL %d value!\n", tmp);
4214 }
4215 /* Disable Rx packet buffer access. */
4216 rtl_write_byte(rtlpriv, REG_PKT_BUFF_ACCESS_CTRL,
4217 DISABLE_TRXPKT_BUF_ACCESS);
4218}
diff --git a/drivers/net/wireless/rtlwifi/rtl8821ae/hw.h b/drivers/net/wireless/rtlwifi/rtl8821ae/hw.h
new file mode 100644
index 000000000000..a3553e3abaa1
--- /dev/null
+++ b/drivers/net/wireless/rtlwifi/rtl8821ae/hw.h
@@ -0,0 +1,70 @@
1/******************************************************************************
2 *
3 * Copyright(c) 2009-2010 Realtek Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * The full GNU General Public License is included in this distribution in the
15 * file called LICENSE.
16 *
17 * Contact Information:
18 * wlanfae <wlanfae@realtek.com>
19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20 * Hsinchu 300, Taiwan.
21 *
22 * Larry Finger <Larry.Finger@lwfinger.net>
23 *
24 *****************************************************************************/
25
26#ifndef __RTL8821AE_HW_H__
27#define __RTL8821AE_HW_H__
28
29void rtl8821ae_get_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val);
30void rtl8821ae_read_eeprom_info(struct ieee80211_hw *hw);
31
32void rtl8821ae_interrupt_recognized(struct ieee80211_hw *hw,
33 u32 *p_inta, u32 *p_intb);
34int rtl8821ae_hw_init(struct ieee80211_hw *hw);
35void rtl8821ae_card_disable(struct ieee80211_hw *hw);
36void rtl8821ae_enable_interrupt(struct ieee80211_hw *hw);
37void rtl8821ae_disable_interrupt(struct ieee80211_hw *hw);
38int rtl8821ae_set_network_type(struct ieee80211_hw *hw,
39 enum nl80211_iftype type);
40void rtl8821ae_set_check_bssid(struct ieee80211_hw *hw, bool check_bssid);
41void rtl8821ae_set_qos(struct ieee80211_hw *hw, int aci);
42void rtl8821ae_set_beacon_related_registers(struct ieee80211_hw *hw);
43void rtl8821ae_set_beacon_interval(struct ieee80211_hw *hw);
44void rtl8821ae_update_interrupt_mask(struct ieee80211_hw *hw,
45 u32 add_msr, u32 rm_msr);
46void rtl8821ae_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val);
47void rtl8821ae_update_hal_rate_tbl(struct ieee80211_hw *hw,
48 struct ieee80211_sta *sta,
49 u8 rssi_level);
50void rtl8821ae_update_channel_access_setting(struct ieee80211_hw *hw);
51bool rtl8821ae_gpio_radio_on_off_checking(struct ieee80211_hw *hw, u8 *valid);
52void rtl8821ae_enable_hw_security_config(struct ieee80211_hw *hw);
53void rtl8821ae_set_key(struct ieee80211_hw *hw, u32 key_index,
54 u8 *p_macaddr, bool is_group, u8 enc_algo,
55 bool is_wepkey, bool clear_all);
56
57void rtl8821ae_bt_reg_init(struct ieee80211_hw *hw);
58void rtl8821ae_bt_hw_init(struct ieee80211_hw *hw);
59void rtl8821ae_suspend(struct ieee80211_hw *hw);
60void rtl8821ae_resume(struct ieee80211_hw *hw);
61void rtl8821ae_allow_all_destaddr(struct ieee80211_hw *hw,
62 bool allow_all_da,
63 bool write_into_reg);
64void _rtl8821ae_stop_tx_beacon(struct ieee80211_hw *hw);
65void _rtl8821ae_resume_tx_beacon(struct ieee80211_hw *hw);
66void rtl8821ae_add_wowlan_pattern(struct ieee80211_hw *hw,
67 struct rtl_wow_pattern *rtl_pattern,
68 u8 index);
69
70#endif
diff --git a/drivers/net/wireless/rtlwifi/rtl8821ae/led.c b/drivers/net/wireless/rtlwifi/rtl8821ae/led.c
new file mode 100644
index 000000000000..ba1946a0280e
--- /dev/null
+++ b/drivers/net/wireless/rtlwifi/rtl8821ae/led.c
@@ -0,0 +1,237 @@
1/******************************************************************************
2 *
3 * Copyright(c) 2009-2010 Realtek Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * The full GNU General Public License is included in this distribution in the
15 * file called LICENSE.
16 *
17 * Contact Information:
18 * wlanfae <wlanfae@realtek.com>
19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20 * Hsinchu 300, Taiwan.
21 *
22 * Larry Finger <Larry.Finger@lwfinger.net>
23 *
24 *****************************************************************************/
25
26#include "../wifi.h"
27#include "../pci.h"
28#include "reg.h"
29#include "led.h"
30
31static void _rtl8821ae_init_led(struct ieee80211_hw *hw,
32 struct rtl_led *pled,
33 enum rtl_led_pin ledpin)
34{
35 pled->hw = hw;
36 pled->ledpin = ledpin;
37 pled->ledon = false;
38}
39
40void rtl8821ae_sw_led_on(struct ieee80211_hw *hw, struct rtl_led *pled)
41{
42 u8 ledcfg;
43 struct rtl_priv *rtlpriv = rtl_priv(hw);
44
45 RT_TRACE(rtlpriv, COMP_LED, DBG_LOUD,
46 "LedAddr:%X ledpin=%d\n", REG_LEDCFG2, pled->ledpin);
47
48 switch (pled->ledpin) {
49 case LED_PIN_GPIO0:
50 break;
51 case LED_PIN_LED0:
52 ledcfg = rtl_read_byte(rtlpriv, REG_LEDCFG2);
53 ledcfg &= ~BIT(6);
54 rtl_write_byte(rtlpriv,
55 REG_LEDCFG2, (ledcfg & 0xf0) | BIT(5));
56 break;
57 case LED_PIN_LED1:
58 ledcfg = rtl_read_byte(rtlpriv, REG_LEDCFG1);
59 rtl_write_byte(rtlpriv, REG_LEDCFG1, ledcfg & 0x10);
60 break;
61 default:
62 RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
63 "switch case not process\n");
64 break;
65 }
66 pled->ledon = true;
67}
68
69void rtl8812ae_sw_led_on(struct ieee80211_hw *hw, struct rtl_led *pled)
70{
71 u16 ledreg = REG_LEDCFG1;
72 u8 ledcfg = 0;
73 struct rtl_priv *rtlpriv = rtl_priv(hw);
74
75 switch (pled->ledpin) {
76 case LED_PIN_LED0:
77 ledreg = REG_LEDCFG1;
78 break;
79
80 case LED_PIN_LED1:
81 ledreg = REG_LEDCFG2;
82 break;
83
84 case LED_PIN_GPIO0:
85 default:
86 break;
87 }
88
89 RT_TRACE(rtlpriv, COMP_LED, DBG_LOUD,
90 "In SwLedOn, LedAddr:%X LEDPIN=%d\n",
91 ledreg, pled->ledpin);
92
93 ledcfg = rtl_read_byte(rtlpriv, ledreg);
94 ledcfg |= BIT(5); /*Set 0x4c[21]*/
95 ledcfg &= ~(BIT(7) | BIT(6) | BIT(3) | BIT(2) | BIT(1) | BIT(0));
96 /*Clear 0x4c[23:22] and 0x4c[19:16]*/
97 rtl_write_byte(rtlpriv, ledreg, ledcfg); /*SW control led0 on.*/
98 pled->ledon = true;
99}
100
101void rtl8821ae_sw_led_off(struct ieee80211_hw *hw, struct rtl_led *pled)
102{
103 struct rtl_priv *rtlpriv = rtl_priv(hw);
104 struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw);
105 u8 ledcfg;
106
107 RT_TRACE(rtlpriv, COMP_LED, DBG_LOUD,
108 "LedAddr:%X ledpin=%d\n", REG_LEDCFG2, pled->ledpin);
109
110 ledcfg = rtl_read_byte(rtlpriv, REG_LEDCFG2);
111
112 switch (pled->ledpin) {
113 case LED_PIN_GPIO0:
114 break;
115 case LED_PIN_LED0:
116 ledcfg &= 0xf0;
117 if (pcipriv->ledctl.led_opendrain) {
118 ledcfg &= 0x90; /* Set to software control. */
119 rtl_write_byte(rtlpriv, REG_LEDCFG2, (ledcfg|BIT(3)));
120 ledcfg = rtl_read_byte(rtlpriv, REG_MAC_PINMUX_CFG);
121 ledcfg &= 0xFE;
122 rtl_write_byte(rtlpriv, REG_MAC_PINMUX_CFG, ledcfg);
123 } else {
124 ledcfg &= ~BIT(6);
125 rtl_write_byte(rtlpriv, REG_LEDCFG2,
126 (ledcfg | BIT(3) | BIT(5)));
127 }
128 break;
129 case LED_PIN_LED1:
130 ledcfg = rtl_read_byte(rtlpriv, REG_LEDCFG1);
131 ledcfg &= 0x10; /* Set to software control. */
132 rtl_write_byte(rtlpriv, REG_LEDCFG1, ledcfg|BIT(3));
133 break;
134 default:
135 RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
136 "switch case not process\n");
137 break;
138 }
139 pled->ledon = false;
140}
141
142void rtl8812ae_sw_led_off(struct ieee80211_hw *hw, struct rtl_led *pled)
143{
144 u16 ledreg = REG_LEDCFG1;
145 struct rtl_priv *rtlpriv = rtl_priv(hw);
146 struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw);
147
148 switch (pled->ledpin) {
149 case LED_PIN_LED0:
150 ledreg = REG_LEDCFG1;
151 break;
152
153 case LED_PIN_LED1:
154 ledreg = REG_LEDCFG2;
155 break;
156
157 case LED_PIN_GPIO0:
158 default:
159 break;
160 }
161
162 RT_TRACE(rtlpriv, COMP_LED, DBG_LOUD,
163 "In SwLedOff,LedAddr:%X LEDPIN=%d\n",
164 ledreg, pled->ledpin);
165 /*Open-drain arrangement for controlling the LED*/
166 if (pcipriv->ledctl.led_opendrain) {
167 u8 ledcfg = rtl_read_byte(rtlpriv, ledreg);
168
169 ledreg &= 0xd0; /* Set to software control.*/
170 rtl_write_byte(rtlpriv, ledreg, (ledcfg | BIT(3)));
171
172 /*Open-drain arrangement*/
173 ledcfg = rtl_read_byte(rtlpriv, REG_MAC_PINMUX_CFG);
174 ledcfg &= 0xFE;/*Set GPIO[8] to input mode*/
175 rtl_write_byte(rtlpriv, REG_MAC_PINMUX_CFG, ledcfg);
176 } else {
177 rtl_write_byte(rtlpriv, ledreg, 0x28);
178 }
179
180 pled->ledon = false;
181}
182
183void rtl8821ae_init_sw_leds(struct ieee80211_hw *hw)
184{
185 struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw);
186
187 _rtl8821ae_init_led(hw, &pcipriv->ledctl.sw_led0, LED_PIN_LED0);
188 _rtl8821ae_init_led(hw, &pcipriv->ledctl.sw_led1, LED_PIN_LED1);
189}
190
191static void _rtl8821ae_sw_led_control(struct ieee80211_hw *hw,
192 enum led_ctl_mode ledaction)
193{
194 struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw);
195 struct rtl_led *pLed0 = &pcipriv->ledctl.sw_led0;
196 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
197
198 switch (ledaction) {
199 case LED_CTL_POWER_ON:
200 case LED_CTL_LINK:
201 case LED_CTL_NO_LINK:
202 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE)
203 rtl8812ae_sw_led_on(hw, pLed0);
204 else
205 rtl8821ae_sw_led_on(hw, pLed0);
206 break;
207 case LED_CTL_POWER_OFF:
208 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE)
209 rtl8812ae_sw_led_off(hw, pLed0);
210 else
211 rtl8821ae_sw_led_off(hw, pLed0);
212 break;
213 default:
214 break;
215 }
216}
217
218void rtl8821ae_led_control(struct ieee80211_hw *hw,
219 enum led_ctl_mode ledaction)
220{
221 struct rtl_priv *rtlpriv = rtl_priv(hw);
222 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
223
224 if ((ppsc->rfoff_reason > RF_CHANGE_BY_PS) &&
225 (ledaction == LED_CTL_TX ||
226 ledaction == LED_CTL_RX ||
227 ledaction == LED_CTL_SITE_SURVEY ||
228 ledaction == LED_CTL_LINK ||
229 ledaction == LED_CTL_NO_LINK ||
230 ledaction == LED_CTL_START_TO_LINK ||
231 ledaction == LED_CTL_POWER_ON)) {
232 return;
233 }
234 RT_TRACE(rtlpriv, COMP_LED, DBG_LOUD, "ledaction %d,\n",
235 ledaction);
236 _rtl8821ae_sw_led_control(hw, ledaction);
237}
diff --git a/drivers/net/wireless/rtlwifi/rtl8821ae/led.h b/drivers/net/wireless/rtlwifi/rtl8821ae/led.h
new file mode 100644
index 000000000000..038e64e18ae8
--- /dev/null
+++ b/drivers/net/wireless/rtlwifi/rtl8821ae/led.h
@@ -0,0 +1,37 @@
1/******************************************************************************
2 *
3 * Copyright(c) 2009-2010 Realtek Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * The full GNU General Public License is included in this distribution in the
15 * file called LICENSE.
16 *
17 * Contact Information:
18 * wlanfae <wlanfae@realtek.com>
19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20 * Hsinchu 300, Taiwan.
21 *
22 * Larry Finger <Larry.Finger@lwfinger.net>
23 *
24 *****************************************************************************/
25
26#ifndef __RTL8821AE_LED_H__
27#define __RTL8821AE_LED_H__
28
29void rtl8821ae_init_sw_leds(struct ieee80211_hw *hw);
30void rtl8821ae_sw_led_on(struct ieee80211_hw *hw, struct rtl_led *pled);
31void rtl8812ae_sw_led_on(struct ieee80211_hw *hw, struct rtl_led *pled);
32void rtl8821ae_sw_led_off(struct ieee80211_hw *hw, struct rtl_led *pled);
33void rtl8812ae_sw_led_off(struct ieee80211_hw *hw, struct rtl_led *pled);
34void rtl8821ae_led_control(struct ieee80211_hw *hw,
35 enum led_ctl_mode ledaction);
36
37#endif
diff --git a/drivers/net/wireless/rtlwifi/rtl8821ae/phy.c b/drivers/net/wireless/rtlwifi/rtl8821ae/phy.c
new file mode 100644
index 000000000000..9786313dc62f
--- /dev/null
+++ b/drivers/net/wireless/rtlwifi/rtl8821ae/phy.c
@@ -0,0 +1,4855 @@
1/******************************************************************************
2 *
3 * Copyright(c) 2009-2010 Realtek Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * The full GNU General Public License is included in this distribution in the
15 * file called LICENSE.
16 *
17 * Contact Information:
18 * wlanfae <wlanfae@realtek.com>
19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20 * Hsinchu 300, Taiwan.
21 *
22 * Larry Finger <Larry.Finger@lwfinger.net>
23 *
24 *****************************************************************************/
25
26#include "../wifi.h"
27#include "../pci.h"
28#include "../ps.h"
29#include "reg.h"
30#include "def.h"
31#include "phy.h"
32#include "rf.h"
33#include "dm.h"
34#include "table.h"
35#include "trx.h"
36#include "../btcoexist/halbt_precomp.h"
37#include "hw.h"
38#include "../efuse.h"
39
40#define READ_NEXT_PAIR(array_table, v1, v2, i) \
41 do { \
42 i += 2; \
43 v1 = array_table[i]; \
44 v2 = array_table[i+1]; \
45 } while (0)
46
47static u32 _rtl8821ae_phy_rf_serial_read(struct ieee80211_hw *hw,
48 enum radio_path rfpath, u32 offset);
49static void _rtl8821ae_phy_rf_serial_write(struct ieee80211_hw *hw,
50 enum radio_path rfpath, u32 offset,
51 u32 data);
52static u32 _rtl8821ae_phy_calculate_bit_shift(u32 bitmask);
53static bool _rtl8821ae_phy_bb8821a_config_parafile(struct ieee80211_hw *hw);
54/*static bool _rtl8812ae_phy_config_mac_with_headerfile(struct ieee80211_hw *hw);*/
55static bool _rtl8821ae_phy_config_mac_with_headerfile(struct ieee80211_hw *hw);
56static bool _rtl8821ae_phy_config_bb_with_headerfile(struct ieee80211_hw *hw,
57 u8 configtype);
58static bool _rtl8821ae_phy_config_bb_with_pgheaderfile(struct ieee80211_hw *hw,
59 u8 configtype);
60static void phy_init_bb_rf_register_definition(struct ieee80211_hw *hw);
61
62static long _rtl8821ae_phy_txpwr_idx_to_dbm(struct ieee80211_hw *hw,
63 enum wireless_mode wirelessmode,
64 u8 txpwridx);
65static void rtl8821ae_phy_set_rf_on(struct ieee80211_hw *hw);
66static void rtl8821ae_phy_set_io(struct ieee80211_hw *hw);
67
68static void rtl8812ae_fixspur(struct ieee80211_hw *hw,
69 enum ht_channel_width band_width, u8 channel)
70{
71 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
72
73 /*C cut Item12 ADC FIFO CLOCK*/
74 if (IS_VENDOR_8812A_C_CUT(rtlhal->version)) {
75 if (band_width == HT_CHANNEL_WIDTH_20_40 && channel == 11)
76 rtl_set_bbreg(hw, RRFMOD, 0xC00, 0x3);
77 /* 0x8AC[11:10] = 2'b11*/
78 else
79 rtl_set_bbreg(hw, RRFMOD, 0xC00, 0x2);
80 /* 0x8AC[11:10] = 2'b10*/
81
82 /* <20120914, Kordan> A workarould to resolve
83 * 2480Mhz spur by setting ADC clock as 160M. (Asked by Binson)
84 */
85 if (band_width == HT_CHANNEL_WIDTH_20 &&
86 (channel == 13 || channel == 14)) {
87 rtl_set_bbreg(hw, RRFMOD, 0x300, 0x3);
88 /*0x8AC[9:8] = 2'b11*/
89 rtl_set_bbreg(hw, RADC_BUF_CLK, BIT(30), 1);
90 /* 0x8C4[30] = 1*/
91 } else if (band_width == HT_CHANNEL_WIDTH_20_40 &&
92 channel == 11) {
93 rtl_set_bbreg(hw, RADC_BUF_CLK, BIT(30), 1);
94 /*0x8C4[30] = 1*/
95 } else if (band_width != HT_CHANNEL_WIDTH_80) {
96 rtl_set_bbreg(hw, RRFMOD, 0x300, 0x2);
97 /*0x8AC[9:8] = 2'b10*/
98 rtl_set_bbreg(hw, RADC_BUF_CLK, BIT(30), 0);
99 /*0x8C4[30] = 0*/
100 }
101 } else if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
102 /* <20120914, Kordan> A workarould to resolve
103 * 2480Mhz spur by setting ADC clock as 160M.
104 */
105 if (band_width == HT_CHANNEL_WIDTH_20 &&
106 (channel == 13 || channel == 14))
107 rtl_set_bbreg(hw, RRFMOD, 0x300, 0x3);
108 /*0x8AC[9:8] = 11*/
109 else if (channel <= 14) /*2.4G only*/
110 rtl_set_bbreg(hw, RRFMOD, 0x300, 0x2);
111 /*0x8AC[9:8] = 10*/
112 }
113}
114
115u32 rtl8821ae_phy_query_bb_reg(struct ieee80211_hw *hw, u32 regaddr,
116 u32 bitmask)
117{
118 struct rtl_priv *rtlpriv = rtl_priv(hw);
119 u32 returnvalue, originalvalue, bitshift;
120
121 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
122 "regaddr(%#x), bitmask(%#x)\n",
123 regaddr, bitmask);
124 originalvalue = rtl_read_dword(rtlpriv, regaddr);
125 bitshift = _rtl8821ae_phy_calculate_bit_shift(bitmask);
126 returnvalue = (originalvalue & bitmask) >> bitshift;
127
128 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
129 "BBR MASK=0x%x Addr[0x%x]=0x%x\n",
130 bitmask, regaddr, originalvalue);
131 return returnvalue;
132}
133
134void rtl8821ae_phy_set_bb_reg(struct ieee80211_hw *hw,
135 u32 regaddr, u32 bitmask, u32 data)
136{
137 struct rtl_priv *rtlpriv = rtl_priv(hw);
138 u32 originalvalue, bitshift;
139
140 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
141 "regaddr(%#x), bitmask(%#x), data(%#x)\n",
142 regaddr, bitmask, data);
143
144 if (bitmask != MASKDWORD) {
145 originalvalue = rtl_read_dword(rtlpriv, regaddr);
146 bitshift = _rtl8821ae_phy_calculate_bit_shift(bitmask);
147 data = ((originalvalue & (~bitmask)) |
148 ((data << bitshift) & bitmask));
149 }
150
151 rtl_write_dword(rtlpriv, regaddr, data);
152
153 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
154 "regaddr(%#x), bitmask(%#x), data(%#x)\n",
155 regaddr, bitmask, data);
156}
157
158u32 rtl8821ae_phy_query_rf_reg(struct ieee80211_hw *hw,
159 enum radio_path rfpath, u32 regaddr,
160 u32 bitmask)
161{
162 struct rtl_priv *rtlpriv = rtl_priv(hw);
163 u32 original_value, readback_value, bitshift;
164 unsigned long flags;
165
166 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
167 "regaddr(%#x), rfpath(%#x), bitmask(%#x)\n",
168 regaddr, rfpath, bitmask);
169
170 spin_lock_irqsave(&rtlpriv->locks.rf_lock, flags);
171
172 original_value = _rtl8821ae_phy_rf_serial_read(hw, rfpath, regaddr);
173 bitshift = _rtl8821ae_phy_calculate_bit_shift(bitmask);
174 readback_value = (original_value & bitmask) >> bitshift;
175
176 spin_unlock_irqrestore(&rtlpriv->locks.rf_lock, flags);
177
178 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
179 "regaddr(%#x), rfpath(%#x), bitmask(%#x), original_value(%#x)\n",
180 regaddr, rfpath, bitmask, original_value);
181
182 return readback_value;
183}
184
185void rtl8821ae_phy_set_rf_reg(struct ieee80211_hw *hw,
186 enum radio_path rfpath,
187 u32 regaddr, u32 bitmask, u32 data)
188{
189 struct rtl_priv *rtlpriv = rtl_priv(hw);
190 u32 original_value, bitshift;
191 unsigned long flags;
192
193 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
194 "regaddr(%#x), bitmask(%#x), data(%#x), rfpath(%#x)\n",
195 regaddr, bitmask, data, rfpath);
196
197 spin_lock_irqsave(&rtlpriv->locks.rf_lock, flags);
198
199 if (bitmask != RFREG_OFFSET_MASK) {
200 original_value =
201 _rtl8821ae_phy_rf_serial_read(hw, rfpath, regaddr);
202 bitshift = _rtl8821ae_phy_calculate_bit_shift(bitmask);
203 data = ((original_value & (~bitmask)) | (data << bitshift));
204 }
205
206 _rtl8821ae_phy_rf_serial_write(hw, rfpath, regaddr, data);
207
208 spin_unlock_irqrestore(&rtlpriv->locks.rf_lock, flags);
209
210 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
211 "regaddr(%#x), bitmask(%#x), data(%#x), rfpath(%#x)\n",
212 regaddr, bitmask, data, rfpath);
213}
214
215static u32 _rtl8821ae_phy_rf_serial_read(struct ieee80211_hw *hw,
216 enum radio_path rfpath, u32 offset)
217{
218 struct rtl_priv *rtlpriv = rtl_priv(hw);
219 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
220 bool is_pi_mode = false;
221 u32 retvalue = 0;
222
223 /* 2009/06/17 MH We can not execute IO for power
224 save or other accident mode.*/
225 if (RT_CANNOT_IO(hw)) {
226 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "return all one\n");
227 return 0xFFFFFFFF;
228 }
229 /* <20120809, Kordan> CCA OFF(when entering),
230 asked by James to avoid reading the wrong value.
231 <20120828, Kordan> Toggling CCA would affect RF 0x0, skip it!*/
232 if (offset != 0x0 &&
233 !((rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) ||
234 (IS_VENDOR_8812A_C_CUT(rtlhal->version))))
235 rtl_set_bbreg(hw, RCCAONSEC, 0x8, 1);
236 offset &= 0xff;
237
238 if (rfpath == RF90_PATH_A)
239 is_pi_mode = (bool)rtl_get_bbreg(hw, 0xC00, 0x4);
240 else if (rfpath == RF90_PATH_B)
241 is_pi_mode = (bool)rtl_get_bbreg(hw, 0xE00, 0x4);
242
243 rtl_set_bbreg(hw, RHSSIREAD_8821AE, 0xff, offset);
244
245 if ((rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) ||
246 (IS_VENDOR_8812A_C_CUT(rtlhal->version)))
247 udelay(20);
248
249 if (is_pi_mode) {
250 if (rfpath == RF90_PATH_A)
251 retvalue =
252 rtl_get_bbreg(hw, RA_PIREAD_8821A, BLSSIREADBACKDATA);
253 else if (rfpath == RF90_PATH_B)
254 retvalue =
255 rtl_get_bbreg(hw, RB_PIREAD_8821A, BLSSIREADBACKDATA);
256 } else {
257 if (rfpath == RF90_PATH_A)
258 retvalue =
259 rtl_get_bbreg(hw, RA_SIREAD_8821A, BLSSIREADBACKDATA);
260 else if (rfpath == RF90_PATH_B)
261 retvalue =
262 rtl_get_bbreg(hw, RB_SIREAD_8821A, BLSSIREADBACKDATA);
263 }
264
265 /*<20120809, Kordan> CCA ON(when exiting),
266 * asked by James to avoid reading the wrong value.
267 * <20120828, Kordan> Toggling CCA would affect RF 0x0, skip it!
268 */
269 if (offset != 0x0 &&
270 !((rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) ||
271 (IS_VENDOR_8812A_C_CUT(rtlhal->version))))
272 rtl_set_bbreg(hw, RCCAONSEC, 0x8, 0);
273 return retvalue;
274}
275
276static void _rtl8821ae_phy_rf_serial_write(struct ieee80211_hw *hw,
277 enum radio_path rfpath, u32 offset,
278 u32 data)
279{
280 struct rtl_priv *rtlpriv = rtl_priv(hw);
281 struct rtl_phy *rtlphy = &rtlpriv->phy;
282 struct bb_reg_def *pphyreg = &rtlphy->phyreg_def[rfpath];
283 u32 data_and_addr;
284 u32 newoffset;
285
286 if (RT_CANNOT_IO(hw)) {
287 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "stop\n");
288 return;
289 }
290 offset &= 0xff;
291 newoffset = offset;
292 data_and_addr = ((newoffset << 20) |
293 (data & 0x000fffff)) & 0x0fffffff;
294 rtl_set_bbreg(hw, pphyreg->rf3wire_offset, MASKDWORD, data_and_addr);
295 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
296 "RFW-%d Addr[0x%x]=0x%x\n",
297 rfpath, pphyreg->rf3wire_offset, data_and_addr);
298}
299
300static u32 _rtl8821ae_phy_calculate_bit_shift(u32 bitmask)
301{
302 u32 i;
303
304 for (i = 0; i <= 31; i++) {
305 if (((bitmask >> i) & 0x1) == 1)
306 break;
307 }
308 return i;
309}
310
311bool rtl8821ae_phy_mac_config(struct ieee80211_hw *hw)
312{
313 bool rtstatus = 0;
314
315 rtstatus = _rtl8821ae_phy_config_mac_with_headerfile(hw);
316
317 return rtstatus;
318}
319
320bool rtl8821ae_phy_bb_config(struct ieee80211_hw *hw)
321{
322 bool rtstatus = true;
323 struct rtl_priv *rtlpriv = rtl_priv(hw);
324 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
325 struct rtl_phy *rtlphy = &rtlpriv->phy;
326 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
327 u8 regval;
328 u8 crystal_cap;
329
330 phy_init_bb_rf_register_definition(hw);
331
332 regval = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN);
333 regval |= FEN_PCIEA;
334 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, regval);
335 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN,
336 regval | FEN_BB_GLB_RSTN | FEN_BBRSTB);
337
338 rtl_write_byte(rtlpriv, REG_RF_CTRL, 0x7);
339 rtl_write_byte(rtlpriv, REG_OPT_CTRL + 2, 0x7);
340
341 rtstatus = _rtl8821ae_phy_bb8821a_config_parafile(hw);
342
343 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
344 crystal_cap = rtlefuse->crystalcap & 0x3F;
345 rtl_set_bbreg(hw, REG_MAC_PHY_CTRL, 0x7FF80000,
346 (crystal_cap | (crystal_cap << 6)));
347 } else {
348 crystal_cap = rtlefuse->crystalcap & 0x3F;
349 rtl_set_bbreg(hw, REG_MAC_PHY_CTRL, 0xFFF000,
350 (crystal_cap | (crystal_cap << 6)));
351 }
352 rtlphy->reg_837 = rtl_read_byte(rtlpriv, 0x837);
353
354 return rtstatus;
355}
356
357bool rtl8821ae_phy_rf_config(struct ieee80211_hw *hw)
358{
359 return rtl8821ae_phy_rf6052_config(hw);
360}
361
362u32 phy_get_tx_swing_8812A(struct ieee80211_hw *hw, u8 band,
363 u8 rf_path)
364{
365 struct rtl_priv *rtlpriv = rtl_priv(hw);
366 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
367 struct rtl_dm *rtldm = rtl_dm(rtlpriv);
368 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
369 char reg_swing_2g = -1;/* 0xff; */
370 char reg_swing_5g = -1;/* 0xff; */
371 char swing_2g = -1 * reg_swing_2g;
372 char swing_5g = -1 * reg_swing_5g;
373 u32 out = 0x200;
374 const char auto_temp = -1;
375
376 RT_TRACE(rtlpriv, COMP_SCAN, DBG_LOUD,
377 "===> PHY_GetTxBBSwing_8812A, bbSwing_2G: %d, bbSwing_5G: %d,autoload_failflag=%d.\n",
378 (int)swing_2g, (int)swing_5g,
379 (int)rtlefuse->autoload_failflag);
380
381 if (rtlefuse->autoload_failflag) {
382 if (band == BAND_ON_2_4G) {
383 rtldm->swing_diff_2g = swing_2g;
384 if (swing_2g == 0) {
385 out = 0x200; /* 0 dB */
386 } else if (swing_2g == -3) {
387 out = 0x16A; /* -3 dB */
388 } else if (swing_2g == -6) {
389 out = 0x101; /* -6 dB */
390 } else if (swing_2g == -9) {
391 out = 0x0B6; /* -9 dB */
392 } else {
393 rtldm->swing_diff_2g = 0;
394 out = 0x200;
395 }
396 } else if (band == BAND_ON_5G) {
397 rtldm->swing_diff_5g = swing_5g;
398 if (swing_5g == 0) {
399 out = 0x200; /* 0 dB */
400 } else if (swing_5g == -3) {
401 out = 0x16A; /* -3 dB */
402 } else if (swing_5g == -6) {
403 out = 0x101; /* -6 dB */
404 } else if (swing_5g == -9) {
405 out = 0x0B6; /* -9 dB */
406 } else {
407 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
408 rtldm->swing_diff_5g = -3;
409 out = 0x16A;
410 } else {
411 rtldm->swing_diff_5g = 0;
412 out = 0x200;
413 }
414 }
415 } else {
416 rtldm->swing_diff_2g = -3;
417 rtldm->swing_diff_5g = -3;
418 out = 0x16A; /* -3 dB */
419 }
420 } else {
421 u32 swing = 0, swing_a = 0, swing_b = 0;
422
423 if (band == BAND_ON_2_4G) {
424 if (reg_swing_2g == auto_temp) {
425 efuse_shadow_read(hw, 1, 0xC6, (u32 *)&swing);
426 swing = (swing == 0xFF) ? 0x00 : swing;
427 } else if (swing_2g == 0) {
428 swing = 0x00; /* 0 dB */
429 } else if (swing_2g == -3) {
430 swing = 0x05; /* -3 dB */
431 } else if (swing_2g == -6) {
432 swing = 0x0A; /* -6 dB */
433 } else if (swing_2g == -9) {
434 swing = 0xFF; /* -9 dB */
435 } else {
436 swing = 0x00;
437 }
438 } else {
439 if (reg_swing_5g == auto_temp) {
440 efuse_shadow_read(hw, 1, 0xC7, (u32 *)&swing);
441 swing = (swing == 0xFF) ? 0x00 : swing;
442 } else if (swing_5g == 0) {
443 swing = 0x00; /* 0 dB */
444 } else if (swing_5g == -3) {
445 swing = 0x05; /* -3 dB */
446 } else if (swing_5g == -6) {
447 swing = 0x0A; /* -6 dB */
448 } else if (swing_5g == -9) {
449 swing = 0xFF; /* -9 dB */
450 } else {
451 swing = 0x00;
452 }
453 }
454
455 swing_a = (swing & 0x3) >> 0; /* 0xC6/C7[1:0] */
456 swing_b = (swing & 0xC) >> 2; /* 0xC6/C7[3:2] */
457 RT_TRACE(rtlpriv, COMP_SCAN, DBG_LOUD,
458 "===> PHY_GetTxBBSwing_8812A, swingA: 0x%X, swingB: 0x%X\n",
459 swing_a, swing_b);
460
461 /* 3 Path-A */
462 if (swing_a == 0x0) {
463 if (band == BAND_ON_2_4G)
464 rtldm->swing_diff_2g = 0;
465 else
466 rtldm->swing_diff_5g = 0;
467 out = 0x200; /* 0 dB */
468 } else if (swing_a == 0x1) {
469 if (band == BAND_ON_2_4G)
470 rtldm->swing_diff_2g = -3;
471 else
472 rtldm->swing_diff_5g = -3;
473 out = 0x16A; /* -3 dB */
474 } else if (swing_a == 0x2) {
475 if (band == BAND_ON_2_4G)
476 rtldm->swing_diff_2g = -6;
477 else
478 rtldm->swing_diff_5g = -6;
479 out = 0x101; /* -6 dB */
480 } else if (swing_a == 0x3) {
481 if (band == BAND_ON_2_4G)
482 rtldm->swing_diff_2g = -9;
483 else
484 rtldm->swing_diff_5g = -9;
485 out = 0x0B6; /* -9 dB */
486 }
487 /* 3 Path-B */
488 if (swing_b == 0x0) {
489 if (band == BAND_ON_2_4G)
490 rtldm->swing_diff_2g = 0;
491 else
492 rtldm->swing_diff_5g = 0;
493 out = 0x200; /* 0 dB */
494 } else if (swing_b == 0x1) {
495 if (band == BAND_ON_2_4G)
496 rtldm->swing_diff_2g = -3;
497 else
498 rtldm->swing_diff_5g = -3;
499 out = 0x16A; /* -3 dB */
500 } else if (swing_b == 0x2) {
501 if (band == BAND_ON_2_4G)
502 rtldm->swing_diff_2g = -6;
503 else
504 rtldm->swing_diff_5g = -6;
505 out = 0x101; /* -6 dB */
506 } else if (swing_b == 0x3) {
507 if (band == BAND_ON_2_4G)
508 rtldm->swing_diff_2g = -9;
509 else
510 rtldm->swing_diff_5g = -9;
511 out = 0x0B6; /* -9 dB */
512 }
513 }
514
515 RT_TRACE(rtlpriv, COMP_SCAN, DBG_LOUD,
516 "<=== PHY_GetTxBBSwing_8812A, out = 0x%X\n", out);
517 return out;
518}
519
520void rtl8821ae_phy_switch_wirelessband(struct ieee80211_hw *hw, u8 band)
521{
522 struct rtl_priv *rtlpriv = rtl_priv(hw);
523 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
524 struct rtl_dm *rtldm = rtl_dm(rtlpriv);
525 u8 current_band = rtlhal->current_bandtype;
526 u32 txpath, rxpath;
527 char bb_diff_between_band;
528
529 txpath = rtl8821ae_phy_query_bb_reg(hw, RTXPATH, 0xf0);
530 rxpath = rtl8821ae_phy_query_bb_reg(hw, RCCK_RX, 0x0f000000);
531 rtlhal->current_bandtype = (enum band_type) band;
532 /* reconfig BB/RF according to wireless mode */
533 if (rtlhal->current_bandtype == BAND_ON_2_4G) {
534 /* BB & RF Config */
535 rtl_set_bbreg(hw, ROFDMCCKEN, BOFDMEN|BCCKEN, 0x03);
536
537 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
538 /* 0xCB0[15:12] = 0x7 (LNA_On)*/
539 rtl_set_bbreg(hw, RA_RFE_PINMUX, 0xF000, 0x7);
540 /* 0xCB0[7:4] = 0x7 (PAPE_A)*/
541 rtl_set_bbreg(hw, RA_RFE_PINMUX, 0xF0, 0x7);
542 }
543
544 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
545 /*0x834[1:0] = 0x1*/
546 rtl_set_bbreg(hw, 0x834, 0x3, 0x1);
547 }
548
549 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
550 /* 0xC1C[11:8] = 0 */
551 rtl_set_bbreg(hw, RA_TXSCALE, 0xF00, 0);
552 } else {
553 /* 0x82C[1:0] = 2b'00 */
554 rtl_set_bbreg(hw, 0x82c, 0x3, 0);
555 }
556 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
557 rtl_set_bbreg(hw, RA_RFE_PINMUX, BMASKDWORD,
558 0x77777777);
559 rtl_set_bbreg(hw, RB_RFE_PINMUX, BMASKDWORD,
560 0x77777777);
561 rtl_set_bbreg(hw, RA_RFE_INV, 0x3ff00000, 0x000);
562 rtl_set_bbreg(hw, RB_RFE_INV, 0x3ff00000, 0x000);
563 }
564
565 rtl_set_bbreg(hw, RTXPATH, 0xf0, 0x1);
566 rtl_set_bbreg(hw, RCCK_RX, 0x0f000000, 0x1);
567
568 rtl_write_byte(rtlpriv, REG_CCK_CHECK, 0x0);
569 } else {/* 5G band */
570 u16 count, reg_41a;
571
572 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
573 /*0xCB0[15:12] = 0x5 (LNA_On)*/
574 rtl_set_bbreg(hw, RA_RFE_PINMUX, 0xF000, 0x5);
575 /*0xCB0[7:4] = 0x4 (PAPE_A)*/
576 rtl_set_bbreg(hw, RA_RFE_PINMUX, 0xF0, 0x4);
577 }
578 /*CCK_CHECK_en*/
579 rtl_write_byte(rtlpriv, REG_CCK_CHECK, 0x80);
580
581 count = 0;
582 reg_41a = rtl_read_word(rtlpriv, REG_TXPKT_EMPTY);
583 RT_TRACE(rtlpriv, COMP_SCAN, DBG_LOUD,
584 "Reg41A value %d", reg_41a);
585 reg_41a &= 0x30;
586 while ((reg_41a != 0x30) && (count < 50)) {
587 udelay(50);
588 RT_TRACE(rtlpriv, COMP_SCAN, DBG_LOUD, "Delay 50us\n");
589
590 reg_41a = rtl_read_word(rtlpriv, REG_TXPKT_EMPTY);
591 reg_41a &= 0x30;
592 count++;
593 RT_TRACE(rtlpriv, COMP_SCAN, DBG_LOUD,
594 "Reg41A value %d", reg_41a);
595 }
596 if (count != 0)
597 RT_TRACE(rtlpriv, COMP_MLME, DBG_LOUD,
598 "PHY_SwitchWirelessBand8812(): Switch to 5G Band. Count = %d reg41A=0x%x\n",
599 count, reg_41a);
600
601 /* 2012/02/01, Sinda add registry to switch workaround
602 without long-run verification for scan issue. */
603 rtl_set_bbreg(hw, ROFDMCCKEN, BOFDMEN|BCCKEN, 0x03);
604
605 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
606 /*0x834[1:0] = 0x2*/
607 rtl_set_bbreg(hw, 0x834, 0x3, 0x2);
608 }
609
610 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
611 /* AGC table select */
612 /* 0xC1C[11:8] = 1*/
613 rtl_set_bbreg(hw, RA_TXSCALE, 0xF00, 1);
614 } else
615 /* 0x82C[1:0] = 2'b00 */
616 rtl_set_bbreg(hw, 0x82c, 0x3, 1);
617
618 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
619 rtl_set_bbreg(hw, RA_RFE_PINMUX, BMASKDWORD,
620 0x77337777);
621 rtl_set_bbreg(hw, RB_RFE_PINMUX, BMASKDWORD,
622 0x77337777);
623 rtl_set_bbreg(hw, RA_RFE_INV, 0x3ff00000, 0x010);
624 rtl_set_bbreg(hw, RB_RFE_INV, 0x3ff00000, 0x010);
625 }
626
627 rtl_set_bbreg(hw, RTXPATH, 0xf0, 0);
628 rtl_set_bbreg(hw, RCCK_RX, 0x0f000000, 0xf);
629
630 RT_TRACE(rtlpriv, COMP_SCAN, DBG_LOUD,
631 "==>PHY_SwitchWirelessBand8812() BAND_ON_5G settings OFDM index 0x%x\n",
632 rtlpriv->dm.ofdm_index[RF90_PATH_A]);
633 }
634
635 if ((rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) ||
636 (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE)) {
637 /* 0xC1C[31:21] */
638 rtl_set_bbreg(hw, RA_TXSCALE, 0xFFE00000,
639 phy_get_tx_swing_8812A(hw, band, RF90_PATH_A));
640 /* 0xE1C[31:21] */
641 rtl_set_bbreg(hw, RB_TXSCALE, 0xFFE00000,
642 phy_get_tx_swing_8812A(hw, band, RF90_PATH_B));
643
644 /* <20121005, Kordan> When TxPowerTrack is ON,
645 * we should take care of the change of BB swing.
646 * That is, reset all info to trigger Tx power tracking.
647 */
648 if (band != current_band) {
649 bb_diff_between_band =
650 (rtldm->swing_diff_2g - rtldm->swing_diff_5g);
651 bb_diff_between_band = (band == BAND_ON_2_4G) ?
652 bb_diff_between_band :
653 (-1 * bb_diff_between_band);
654 rtldm->default_ofdm_index += bb_diff_between_band * 2;
655 }
656 rtl8821ae_dm_clear_txpower_tracking_state(hw);
657 }
658
659 RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE,
660 "<==rtl8821ae_phy_switch_wirelessband():Switch Band OK.\n");
661 return;
662}
663
664static bool _rtl8821ae_check_condition(struct ieee80211_hw *hw,
665 const u32 condition)
666{
667 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
668 u32 _board = rtlefuse->board_type; /*need efuse define*/
669 u32 _interface = 0x01; /* ODM_ITRF_PCIE */
670 u32 _platform = 0x08;/* ODM_WIN */
671 u32 cond = condition;
672
673 if (condition == 0xCDCDCDCD)
674 return true;
675
676 cond = condition & 0xFF;
677 if ((_board != cond) && cond != 0xFF)
678 return false;
679
680 cond = condition & 0xFF00;
681 cond = cond >> 8;
682 if ((_interface & cond) == 0 && cond != 0x07)
683 return false;
684
685 cond = condition & 0xFF0000;
686 cond = cond >> 16;
687 if ((_platform & cond) == 0 && cond != 0x0F)
688 return false;
689 return true;
690}
691
692static void _rtl8821ae_config_rf_reg(struct ieee80211_hw *hw,
693 u32 addr, u32 data,
694 enum radio_path rfpath, u32 regaddr)
695{
696 if (addr == 0xfe || addr == 0xffe) {
697 /* In order not to disturb BT music when
698 * wifi init.(1ant NIC only)
699 */
700 mdelay(50);
701 } else {
702 rtl_set_rfreg(hw, rfpath, regaddr, RFREG_OFFSET_MASK, data);
703 udelay(1);
704 }
705}
706
707static void _rtl8821ae_config_rf_radio_a(struct ieee80211_hw *hw,
708 u32 addr, u32 data)
709{
710 u32 content = 0x1000; /*RF Content: radio_a_txt*/
711 u32 maskforphyset = (u32)(content & 0xE000);
712
713 _rtl8821ae_config_rf_reg(hw, addr, data,
714 RF90_PATH_A, addr | maskforphyset);
715}
716
717static void _rtl8821ae_config_rf_radio_b(struct ieee80211_hw *hw,
718 u32 addr, u32 data)
719{
720 u32 content = 0x1001; /*RF Content: radio_b_txt*/
721 u32 maskforphyset = (u32)(content & 0xE000);
722
723 _rtl8821ae_config_rf_reg(hw, addr, data,
724 RF90_PATH_B, addr | maskforphyset);
725}
726
727static void _rtl8821ae_config_bb_reg(struct ieee80211_hw *hw,
728 u32 addr, u32 data)
729{
730 if (addr == 0xfe)
731 mdelay(50);
732 else if (addr == 0xfd)
733 mdelay(5);
734 else if (addr == 0xfc)
735 mdelay(1);
736 else if (addr == 0xfb)
737 udelay(50);
738 else if (addr == 0xfa)
739 udelay(5);
740 else if (addr == 0xf9)
741 udelay(1);
742 else
743 rtl_set_bbreg(hw, addr, MASKDWORD, data);
744
745 udelay(1);
746}
747
748static void _rtl8821ae_phy_init_tx_power_by_rate(struct ieee80211_hw *hw)
749{
750 struct rtl_priv *rtlpriv = rtl_priv(hw);
751 struct rtl_phy *rtlphy = &rtlpriv->phy;
752 u8 band, rfpath, txnum, rate_section;
753
754 for (band = BAND_ON_2_4G; band <= BAND_ON_5G; ++band)
755 for (rfpath = 0; rfpath < TX_PWR_BY_RATE_NUM_RF; ++rfpath)
756 for (txnum = 0; txnum < TX_PWR_BY_RATE_NUM_RF; ++txnum)
757 for (rate_section = 0;
758 rate_section < TX_PWR_BY_RATE_NUM_SECTION;
759 ++rate_section)
760 rtlphy->tx_power_by_rate_offset[band]
761 [rfpath][txnum][rate_section] = 0;
762}
763
764static void _rtl8821ae_phy_set_txpower_by_rate_base(struct ieee80211_hw *hw,
765 u8 band, u8 path,
766 u8 rate_section,
767 u8 txnum, u8 value)
768{
769 struct rtl_priv *rtlpriv = rtl_priv(hw);
770 struct rtl_phy *rtlphy = &rtlpriv->phy;
771
772 if (path > RF90_PATH_D) {
773 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
774 "Invalid Rf Path %d in phy_SetTxPowerByRatBase()\n", path);
775 return;
776 }
777
778 if (band == BAND_ON_2_4G) {
779 switch (rate_section) {
780 case CCK:
781 rtlphy->txpwr_by_rate_base_24g[path][txnum][0] = value;
782 break;
783 case OFDM:
784 rtlphy->txpwr_by_rate_base_24g[path][txnum][1] = value;
785 break;
786 case HT_MCS0_MCS7:
787 rtlphy->txpwr_by_rate_base_24g[path][txnum][2] = value;
788 break;
789 case HT_MCS8_MCS15:
790 rtlphy->txpwr_by_rate_base_24g[path][txnum][3] = value;
791 break;
792 case VHT_1SSMCS0_1SSMCS9:
793 rtlphy->txpwr_by_rate_base_24g[path][txnum][4] = value;
794 break;
795 case VHT_2SSMCS0_2SSMCS9:
796 rtlphy->txpwr_by_rate_base_24g[path][txnum][5] = value;
797 break;
798 default:
799 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
800 "Invalid RateSection %d in Band 2.4G,Rf Path %d, %dTx in PHY_SetTxPowerByRateBase()\n",
801 rate_section, path, txnum);
802 break;
803 };
804 } else if (band == BAND_ON_5G) {
805 switch (rate_section) {
806 case OFDM:
807 rtlphy->txpwr_by_rate_base_5g[path][txnum][0] = value;
808 break;
809 case HT_MCS0_MCS7:
810 rtlphy->txpwr_by_rate_base_5g[path][txnum][1] = value;
811 break;
812 case HT_MCS8_MCS15:
813 rtlphy->txpwr_by_rate_base_5g[path][txnum][2] = value;
814 break;
815 case VHT_1SSMCS0_1SSMCS9:
816 rtlphy->txpwr_by_rate_base_5g[path][txnum][3] = value;
817 break;
818 case VHT_2SSMCS0_2SSMCS9:
819 rtlphy->txpwr_by_rate_base_5g[path][txnum][4] = value;
820 break;
821 default:
822 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
823 "Invalid RateSection %d in Band 5G, Rf Path %d, %dTx in PHY_SetTxPowerByRateBase()\n",
824 rate_section, path, txnum);
825 break;
826 };
827 } else {
828 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
829 "Invalid Band %d in PHY_SetTxPowerByRateBase()\n", band);
830 }
831}
832
833static u8 _rtl8821ae_phy_get_txpower_by_rate_base(struct ieee80211_hw *hw,
834 u8 band, u8 path,
835 u8 txnum, u8 rate_section)
836{
837 struct rtl_priv *rtlpriv = rtl_priv(hw);
838 struct rtl_phy *rtlphy = &rtlpriv->phy;
839 u8 value = 0;
840
841 if (path > RF90_PATH_D) {
842 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
843 "Invalid Rf Path %d in PHY_GetTxPowerByRateBase()\n",
844 path);
845 return 0;
846 }
847
848 if (band == BAND_ON_2_4G) {
849 switch (rate_section) {
850 case CCK:
851 value = rtlphy->txpwr_by_rate_base_24g[path][txnum][0];
852 break;
853 case OFDM:
854 value = rtlphy->txpwr_by_rate_base_24g[path][txnum][1];
855 break;
856 case HT_MCS0_MCS7:
857 value = rtlphy->txpwr_by_rate_base_24g[path][txnum][2];
858 break;
859 case HT_MCS8_MCS15:
860 value = rtlphy->txpwr_by_rate_base_24g[path][txnum][3];
861 break;
862 case VHT_1SSMCS0_1SSMCS9:
863 value = rtlphy->txpwr_by_rate_base_24g[path][txnum][4];
864 break;
865 case VHT_2SSMCS0_2SSMCS9:
866 value = rtlphy->txpwr_by_rate_base_24g[path][txnum][5];
867 break;
868 default:
869 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
870 "Invalid RateSection %d in Band 2.4G, Rf Path %d, %dTx in PHY_GetTxPowerByRateBase()\n",
871 rate_section, path, txnum);
872 break;
873 };
874 } else if (band == BAND_ON_5G) {
875 switch (rate_section) {
876 case OFDM:
877 value = rtlphy->txpwr_by_rate_base_5g[path][txnum][0];
878 break;
879 case HT_MCS0_MCS7:
880 value = rtlphy->txpwr_by_rate_base_5g[path][txnum][1];
881 break;
882 case HT_MCS8_MCS15:
883 value = rtlphy->txpwr_by_rate_base_5g[path][txnum][2];
884 break;
885 case VHT_1SSMCS0_1SSMCS9:
886 value = rtlphy->txpwr_by_rate_base_5g[path][txnum][3];
887 break;
888 case VHT_2SSMCS0_2SSMCS9:
889 value = rtlphy->txpwr_by_rate_base_5g[path][txnum][4];
890 break;
891 default:
892 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
893 "Invalid RateSection %d in Band 5G, Rf Path %d, %dTx in PHY_GetTxPowerByRateBase()\n",
894 rate_section, path, txnum);
895 break;
896 };
897 } else {
898 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
899 "Invalid Band %d in PHY_GetTxPowerByRateBase()\n", band);
900 }
901
902 return value;
903}
904
905static void _rtl8821ae_phy_store_txpower_by_rate_base(struct ieee80211_hw *hw)
906{
907 struct rtl_priv *rtlpriv = rtl_priv(hw);
908 struct rtl_phy *rtlphy = &rtlpriv->phy;
909 u16 rawValue = 0;
910 u8 base = 0, path = 0;
911
912 for (path = RF90_PATH_A; path <= RF90_PATH_B; ++path) {
913 rawValue = (u16)(rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][path][RF_1TX][0] >> 24) & 0xFF;
914 base = (rawValue >> 4) * 10 + (rawValue & 0xF);
915 _rtl8821ae_phy_set_txpower_by_rate_base(hw, BAND_ON_2_4G, path, CCK, RF_1TX, base);
916
917 rawValue = (u16)(rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][path][RF_1TX][2] >> 24) & 0xFF;
918 base = (rawValue >> 4) * 10 + (rawValue & 0xF);
919 _rtl8821ae_phy_set_txpower_by_rate_base(hw, BAND_ON_2_4G, path, OFDM, RF_1TX, base);
920
921 rawValue = (u16)(rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][path][RF_1TX][4] >> 24) & 0xFF;
922 base = (rawValue >> 4) * 10 + (rawValue & 0xF);
923 _rtl8821ae_phy_set_txpower_by_rate_base(hw, BAND_ON_2_4G, path, HT_MCS0_MCS7, RF_1TX, base);
924
925 rawValue = (u16)(rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][path][RF_2TX][6] >> 24) & 0xFF;
926 base = (rawValue >> 4) * 10 + (rawValue & 0xF);
927 _rtl8821ae_phy_set_txpower_by_rate_base(hw, BAND_ON_2_4G, path, HT_MCS8_MCS15, RF_2TX, base);
928
929 rawValue = (u16)(rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][path][RF_1TX][8] >> 24) & 0xFF;
930 base = (rawValue >> 4) * 10 + (rawValue & 0xF);
931 _rtl8821ae_phy_set_txpower_by_rate_base(hw, BAND_ON_2_4G, path, VHT_1SSMCS0_1SSMCS9, RF_1TX, base);
932
933 rawValue = (u16)(rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][path][RF_2TX][11] >> 8) & 0xFF;
934 base = (rawValue >> 4) * 10 + (rawValue & 0xF);
935 _rtl8821ae_phy_set_txpower_by_rate_base(hw, BAND_ON_2_4G, path, VHT_2SSMCS0_2SSMCS9, RF_2TX, base);
936
937 rawValue = (u16)(rtlphy->tx_power_by_rate_offset[BAND_ON_5G][path][RF_1TX][2] >> 24) & 0xFF;
938 base = (rawValue >> 4) * 10 + (rawValue & 0xF);
939 _rtl8821ae_phy_set_txpower_by_rate_base(hw, BAND_ON_5G, path, OFDM, RF_1TX, base);
940
941 rawValue = (u16)(rtlphy->tx_power_by_rate_offset[BAND_ON_5G][path][RF_1TX][4] >> 24) & 0xFF;
942 base = (rawValue >> 4) * 10 + (rawValue & 0xF);
943 _rtl8821ae_phy_set_txpower_by_rate_base(hw, BAND_ON_5G, path, HT_MCS0_MCS7, RF_1TX, base);
944
945 rawValue = (u16)(rtlphy->tx_power_by_rate_offset[BAND_ON_5G][path][RF_2TX][6] >> 24) & 0xFF;
946 base = (rawValue >> 4) * 10 + (rawValue & 0xF);
947 _rtl8821ae_phy_set_txpower_by_rate_base(hw, BAND_ON_5G, path, HT_MCS8_MCS15, RF_2TX, base);
948
949 rawValue = (u16)(rtlphy->tx_power_by_rate_offset[BAND_ON_5G][path][RF_1TX][8] >> 24) & 0xFF;
950 base = (rawValue >> 4) * 10 + (rawValue & 0xF);
951 _rtl8821ae_phy_set_txpower_by_rate_base(hw, BAND_ON_5G, path, VHT_1SSMCS0_1SSMCS9, RF_1TX, base);
952
953 rawValue = (u16)(rtlphy->tx_power_by_rate_offset[BAND_ON_5G][path][RF_2TX][11] >> 8) & 0xFF;
954 base = (rawValue >> 4) * 10 + (rawValue & 0xF);
955 _rtl8821ae_phy_set_txpower_by_rate_base(hw, BAND_ON_5G, path, VHT_2SSMCS0_2SSMCS9, RF_2TX, base);
956 }
957}
958
959static void _phy_convert_txpower_dbm_to_relative_value(u32 *data, u8 start,
960 u8 end, u8 base_val)
961{
962 char i = 0;
963 u8 temp_value = 0;
964 u32 temp_data = 0;
965
966 for (i = 3; i >= 0; --i) {
967 if (i >= start && i <= end) {
968 /* Get the exact value */
969 temp_value = (u8)(*data >> (i * 8)) & 0xF;
970 temp_value += ((u8)((*data >> (i * 8 + 4)) & 0xF)) * 10;
971
972 /* Change the value to a relative value */
973 temp_value = (temp_value > base_val) ? temp_value -
974 base_val : base_val - temp_value;
975 } else {
976 temp_value = (u8)(*data >> (i * 8)) & 0xFF;
977 }
978 temp_data <<= 8;
979 temp_data |= temp_value;
980 }
981 *data = temp_data;
982}
983
984static void _rtl8812ae_phy_cross_reference_ht_and_vht_txpower_limit(struct ieee80211_hw *hw)
985{
986 struct rtl_priv *rtlpriv = rtl_priv(hw);
987 struct rtl_phy *rtlphy = &rtlpriv->phy;
988 u8 regulation, bw, channel, rate_section;
989 char temp_pwrlmt = 0;
990
991 for (regulation = 0; regulation < MAX_REGULATION_NUM; ++regulation) {
992 for (bw = 0; bw < MAX_5G_BANDWITH_NUM; ++bw) {
993 for (channel = 0; channel < CHANNEL_MAX_NUMBER_5G; ++channel) {
994 for (rate_section = 0; rate_section < MAX_RATE_SECTION_NUM; ++rate_section) {
995 temp_pwrlmt = rtlphy->txpwr_limit_5g[regulation]
996 [bw][rate_section][channel][RF90_PATH_A];
997 if (temp_pwrlmt == MAX_POWER_INDEX) {
998 if (bw == 0 || bw == 1) { /*5G 20M 40M VHT and HT can cross reference*/
999 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
1000 "No power limit table of the specified band %d, bandwidth %d, ratesection %d, channel %d, rf path %d\n",
1001 1, bw, rate_section, channel, RF90_PATH_A);
1002 if (rate_section == 2) {
1003 rtlphy->txpwr_limit_5g[regulation][bw][2][channel][RF90_PATH_A] =
1004 rtlphy->txpwr_limit_5g[regulation][bw][4][channel][RF90_PATH_A];
1005 } else if (rate_section == 4) {
1006 rtlphy->txpwr_limit_5g[regulation][bw][4][channel][RF90_PATH_A] =
1007 rtlphy->txpwr_limit_5g[regulation][bw][2][channel][RF90_PATH_A];
1008 } else if (rate_section == 3) {
1009 rtlphy->txpwr_limit_5g[regulation][bw][3][channel][RF90_PATH_A] =
1010 rtlphy->txpwr_limit_5g[regulation][bw][5][channel][RF90_PATH_A];
1011 } else if (rate_section == 5) {
1012 rtlphy->txpwr_limit_5g[regulation][bw][5][channel][RF90_PATH_A] =
1013 rtlphy->txpwr_limit_5g[regulation][bw][3][channel][RF90_PATH_A];
1014 }
1015
1016 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, "use other value %d", temp_pwrlmt);
1017 }
1018 }
1019 }
1020 }
1021 }
1022 }
1023}
1024
1025static u8 _rtl8812ae_phy_get_txpower_by_rate_base_index(struct ieee80211_hw *hw,
1026 enum band_type band, u8 rate)
1027{
1028 struct rtl_priv *rtlpriv = rtl_priv(hw);
1029 u8 index = 0;
1030 if (band == BAND_ON_2_4G) {
1031 switch (rate) {
1032 case MGN_1M:
1033 case MGN_2M:
1034 case MGN_5_5M:
1035 case MGN_11M:
1036 index = 0;
1037 break;
1038
1039 case MGN_6M:
1040 case MGN_9M:
1041 case MGN_12M:
1042 case MGN_18M:
1043 case MGN_24M:
1044 case MGN_36M:
1045 case MGN_48M:
1046 case MGN_54M:
1047 index = 1;
1048 break;
1049
1050 case MGN_MCS0:
1051 case MGN_MCS1:
1052 case MGN_MCS2:
1053 case MGN_MCS3:
1054 case MGN_MCS4:
1055 case MGN_MCS5:
1056 case MGN_MCS6:
1057 case MGN_MCS7:
1058 index = 2;
1059 break;
1060
1061 case MGN_MCS8:
1062 case MGN_MCS9:
1063 case MGN_MCS10:
1064 case MGN_MCS11:
1065 case MGN_MCS12:
1066 case MGN_MCS13:
1067 case MGN_MCS14:
1068 case MGN_MCS15:
1069 index = 3;
1070 break;
1071
1072 default:
1073 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1074 "Wrong rate 0x%x to obtain index in 2.4G in PHY_GetTxPowerByRateBaseIndex()\n",
1075 rate);
1076 break;
1077 }
1078 } else if (band == BAND_ON_5G) {
1079 switch (rate) {
1080 case MGN_6M:
1081 case MGN_9M:
1082 case MGN_12M:
1083 case MGN_18M:
1084 case MGN_24M:
1085 case MGN_36M:
1086 case MGN_48M:
1087 case MGN_54M:
1088 index = 0;
1089 break;
1090
1091 case MGN_MCS0:
1092 case MGN_MCS1:
1093 case MGN_MCS2:
1094 case MGN_MCS3:
1095 case MGN_MCS4:
1096 case MGN_MCS5:
1097 case MGN_MCS6:
1098 case MGN_MCS7:
1099 index = 1;
1100 break;
1101
1102 case MGN_MCS8:
1103 case MGN_MCS9:
1104 case MGN_MCS10:
1105 case MGN_MCS11:
1106 case MGN_MCS12:
1107 case MGN_MCS13:
1108 case MGN_MCS14:
1109 case MGN_MCS15:
1110 index = 2;
1111 break;
1112
1113 case MGN_VHT1SS_MCS0:
1114 case MGN_VHT1SS_MCS1:
1115 case MGN_VHT1SS_MCS2:
1116 case MGN_VHT1SS_MCS3:
1117 case MGN_VHT1SS_MCS4:
1118 case MGN_VHT1SS_MCS5:
1119 case MGN_VHT1SS_MCS6:
1120 case MGN_VHT1SS_MCS7:
1121 case MGN_VHT1SS_MCS8:
1122 case MGN_VHT1SS_MCS9:
1123 index = 3;
1124 break;
1125
1126 case MGN_VHT2SS_MCS0:
1127 case MGN_VHT2SS_MCS1:
1128 case MGN_VHT2SS_MCS2:
1129 case MGN_VHT2SS_MCS3:
1130 case MGN_VHT2SS_MCS4:
1131 case MGN_VHT2SS_MCS5:
1132 case MGN_VHT2SS_MCS6:
1133 case MGN_VHT2SS_MCS7:
1134 case MGN_VHT2SS_MCS8:
1135 case MGN_VHT2SS_MCS9:
1136 index = 4;
1137 break;
1138
1139 default:
1140 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1141 "Wrong rate 0x%x to obtain index in 5G in PHY_GetTxPowerByRateBaseIndex()\n",
1142 rate);
1143 break;
1144 }
1145 }
1146
1147 return index;
1148}
1149
1150static void _rtl8812ae_phy_convert_txpower_limit_to_power_index(struct ieee80211_hw *hw)
1151{
1152 struct rtl_priv *rtlpriv = rtl_priv(hw);
1153 struct rtl_phy *rtlphy = &rtlpriv->phy;
1154 u8 bw40_pwr_base_dbm2_4G, bw40_pwr_base_dbm5G;
1155 u8 regulation, bw, channel, rate_section;
1156 u8 base_index2_4G = 0;
1157 u8 base_index5G = 0;
1158 char temp_value = 0, temp_pwrlmt = 0;
1159 u8 rf_path = 0;
1160
1161 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
1162 "=====> _rtl8812ae_phy_convert_txpower_limit_to_power_index()\n");
1163
1164 _rtl8812ae_phy_cross_reference_ht_and_vht_txpower_limit(hw);
1165
1166 for (regulation = 0; regulation < MAX_REGULATION_NUM; ++regulation) {
1167 for (bw = 0; bw < MAX_2_4G_BANDWITH_NUM; ++bw) {
1168 for (channel = 0; channel < CHANNEL_MAX_NUMBER_2G; ++channel) {
1169 for (rate_section = 0; rate_section < MAX_RATE_SECTION_NUM; ++rate_section) {
1170 /* obtain the base dBm values in 2.4G band
1171 CCK => 11M, OFDM => 54M, HT 1T => MCS7, HT 2T => MCS15*/
1172 if (rate_section == 0) { /*CCK*/
1173 base_index2_4G =
1174 _rtl8812ae_phy_get_txpower_by_rate_base_index(hw,
1175 BAND_ON_2_4G, MGN_11M);
1176 } else if (rate_section == 1) { /*OFDM*/
1177 base_index2_4G =
1178 _rtl8812ae_phy_get_txpower_by_rate_base_index(hw,
1179 BAND_ON_2_4G, MGN_54M);
1180 } else if (rate_section == 2) { /*HT IT*/
1181 base_index2_4G =
1182 _rtl8812ae_phy_get_txpower_by_rate_base_index(hw,
1183 BAND_ON_2_4G, MGN_MCS7);
1184 } else if (rate_section == 3) { /*HT 2T*/
1185 base_index2_4G =
1186 _rtl8812ae_phy_get_txpower_by_rate_base_index(hw,
1187 BAND_ON_2_4G, MGN_MCS15);
1188 }
1189
1190 temp_pwrlmt = rtlphy->txpwr_limit_2_4g[regulation]
1191 [bw][rate_section][channel][RF90_PATH_A];
1192
1193 for (rf_path = RF90_PATH_A;
1194 rf_path < MAX_RF_PATH_NUM;
1195 ++rf_path) {
1196 if (rate_section == 3)
1197 bw40_pwr_base_dbm2_4G =
1198 rtlphy->txpwr_by_rate_base_24g[rf_path][RF_2TX][base_index2_4G];
1199 else
1200 bw40_pwr_base_dbm2_4G =
1201 rtlphy->txpwr_by_rate_base_24g[rf_path][RF_1TX][base_index2_4G];
1202
1203 if (temp_pwrlmt != MAX_POWER_INDEX) {
1204 temp_value = temp_pwrlmt - bw40_pwr_base_dbm2_4G;
1205 rtlphy->txpwr_limit_2_4g[regulation]
1206 [bw][rate_section][channel][rf_path] =
1207 temp_value;
1208 }
1209
1210 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
1211 "TxPwrLimit_2_4G[regulation %d][bw %d][rateSection %d][channel %d] = %d\n(TxPwrLimit in dBm %d - BW40PwrLmt2_4G[channel %d][rfPath %d] %d)\n",
1212 regulation, bw, rate_section, channel,
1213 rtlphy->txpwr_limit_2_4g[regulation][bw]
1214 [rate_section][channel][rf_path], (temp_pwrlmt == 63)
1215 ? 0 : temp_pwrlmt/2, channel, rf_path,
1216 bw40_pwr_base_dbm2_4G);
1217 }
1218 }
1219 }
1220 }
1221 }
1222 for (regulation = 0; regulation < MAX_REGULATION_NUM; ++regulation) {
1223 for (bw = 0; bw < MAX_5G_BANDWITH_NUM; ++bw) {
1224 for (channel = 0; channel < CHANNEL_MAX_NUMBER_5G; ++channel) {
1225 for (rate_section = 0; rate_section < MAX_RATE_SECTION_NUM; ++rate_section) {
1226 /* obtain the base dBm values in 5G band
1227 OFDM => 54M, HT 1T => MCS7, HT 2T => MCS15,
1228 VHT => 1SSMCS7, VHT 2T => 2SSMCS7*/
1229 if (rate_section == 1) { /*OFDM*/
1230 base_index5G =
1231 _rtl8812ae_phy_get_txpower_by_rate_base_index(hw,
1232 BAND_ON_5G, MGN_54M);
1233 } else if (rate_section == 2) { /*HT 1T*/
1234 base_index5G =
1235 _rtl8812ae_phy_get_txpower_by_rate_base_index(hw,
1236 BAND_ON_5G, MGN_MCS7);
1237 } else if (rate_section == 3) { /*HT 2T*/
1238 base_index5G =
1239 _rtl8812ae_phy_get_txpower_by_rate_base_index(hw,
1240 BAND_ON_5G, MGN_MCS15);
1241 } else if (rate_section == 4) { /*VHT 1T*/
1242 base_index5G =
1243 _rtl8812ae_phy_get_txpower_by_rate_base_index(hw,
1244 BAND_ON_5G, MGN_VHT1SS_MCS7);
1245 } else if (rate_section == 5) { /*VHT 2T*/
1246 base_index5G =
1247 _rtl8812ae_phy_get_txpower_by_rate_base_index(hw,
1248 BAND_ON_5G, MGN_VHT2SS_MCS7);
1249 }
1250
1251 temp_pwrlmt = rtlphy->txpwr_limit_5g[regulation]
1252 [bw][rate_section][channel]
1253 [RF90_PATH_A];
1254
1255 for (rf_path = RF90_PATH_A;
1256 rf_path < MAX_RF_PATH_NUM;
1257 ++rf_path) {
1258 if (rate_section == 3 || rate_section == 5)
1259 bw40_pwr_base_dbm5G =
1260 rtlphy->txpwr_by_rate_base_5g[rf_path]
1261 [RF_2TX][base_index5G];
1262 else
1263 bw40_pwr_base_dbm5G =
1264 rtlphy->txpwr_by_rate_base_5g[rf_path]
1265 [RF_1TX][base_index5G];
1266
1267 if (temp_pwrlmt != MAX_POWER_INDEX) {
1268 temp_value =
1269 temp_pwrlmt - bw40_pwr_base_dbm5G;
1270 rtlphy->txpwr_limit_5g[regulation]
1271 [bw][rate_section][channel]
1272 [rf_path] = temp_value;
1273 }
1274
1275 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
1276 "TxPwrLimit_5G[regulation %d][bw %d][rateSection %d][channel %d] =%d\n(TxPwrLimit in dBm %d - BW40PwrLmt5G[chnl group %d][rfPath %d] %d)\n",
1277 regulation, bw, rate_section,
1278 channel, rtlphy->txpwr_limit_5g[regulation]
1279 [bw][rate_section][channel][rf_path],
1280 temp_pwrlmt, channel, rf_path, bw40_pwr_base_dbm5G);
1281 }
1282 }
1283 }
1284 }
1285 }
1286 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
1287 "<===== _rtl8812ae_phy_convert_txpower_limit_to_power_index()\n");
1288}
1289
1290static void _rtl8821ae_phy_init_txpower_limit(struct ieee80211_hw *hw)
1291{
1292 struct rtl_priv *rtlpriv = rtl_priv(hw);
1293 struct rtl_phy *rtlphy = &rtlpriv->phy;
1294 u8 i, j, k, l, m;
1295
1296 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1297 "=====> _rtl8821ae_phy_init_txpower_limit()!\n");
1298
1299 for (i = 0; i < MAX_REGULATION_NUM; ++i) {
1300 for (j = 0; j < MAX_2_4G_BANDWITH_NUM; ++j)
1301 for (k = 0; k < MAX_RATE_SECTION_NUM; ++k)
1302 for (m = 0; m < CHANNEL_MAX_NUMBER_2G; ++m)
1303 for (l = 0; l < MAX_RF_PATH_NUM; ++l)
1304 rtlphy->txpwr_limit_2_4g
1305 [i][j][k][m][l]
1306 = MAX_POWER_INDEX;
1307 }
1308 for (i = 0; i < MAX_REGULATION_NUM; ++i) {
1309 for (j = 0; j < MAX_5G_BANDWITH_NUM; ++j)
1310 for (k = 0; k < MAX_RATE_SECTION_NUM; ++k)
1311 for (m = 0; m < CHANNEL_MAX_NUMBER_5G; ++m)
1312 for (l = 0; l < MAX_RF_PATH_NUM; ++l)
1313 rtlphy->txpwr_limit_5g
1314 [i][j][k][m][l]
1315 = MAX_POWER_INDEX;
1316 }
1317
1318 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1319 "<===== _rtl8821ae_phy_init_txpower_limit()!\n");
1320}
1321
1322static void _rtl8821ae_phy_convert_txpower_dbm_to_relative_value(struct ieee80211_hw *hw)
1323{
1324 struct rtl_priv *rtlpriv = rtl_priv(hw);
1325 struct rtl_phy *rtlphy = &rtlpriv->phy;
1326 u8 base = 0, rfPath = 0;
1327
1328 for (rfPath = RF90_PATH_A; rfPath <= RF90_PATH_B; ++rfPath) {
1329 base = _rtl8821ae_phy_get_txpower_by_rate_base(hw, BAND_ON_2_4G, rfPath, RF_1TX, CCK);
1330 _phy_convert_txpower_dbm_to_relative_value(
1331 &rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfPath][RF_1TX][0],
1332 0, 3, base);
1333
1334 base = _rtl8821ae_phy_get_txpower_by_rate_base(hw, BAND_ON_2_4G, rfPath, RF_1TX, OFDM);
1335 _phy_convert_txpower_dbm_to_relative_value(
1336 &rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfPath][RF_1TX][1],
1337 0, 3, base);
1338 _phy_convert_txpower_dbm_to_relative_value(
1339 &rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfPath][RF_1TX][2],
1340 0, 3, base);
1341
1342 base = _rtl8821ae_phy_get_txpower_by_rate_base(hw, BAND_ON_2_4G, rfPath, RF_1TX, HT_MCS0_MCS7);
1343 _phy_convert_txpower_dbm_to_relative_value(
1344 &rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfPath][RF_1TX][3],
1345 0, 3, base);
1346 _phy_convert_txpower_dbm_to_relative_value(
1347 &rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfPath][RF_1TX][4],
1348 0, 3, base);
1349
1350 base = _rtl8821ae_phy_get_txpower_by_rate_base(hw, BAND_ON_2_4G, rfPath, RF_2TX, HT_MCS8_MCS15);
1351
1352 _phy_convert_txpower_dbm_to_relative_value(
1353 &rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfPath][RF_2TX][5],
1354 0, 3, base);
1355
1356 _phy_convert_txpower_dbm_to_relative_value(
1357 &rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfPath][RF_2TX][6],
1358 0, 3, base);
1359
1360 base = _rtl8821ae_phy_get_txpower_by_rate_base(hw, BAND_ON_2_4G, rfPath, RF_1TX, VHT_1SSMCS0_1SSMCS9);
1361 _phy_convert_txpower_dbm_to_relative_value(
1362 &rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfPath][RF_1TX][7],
1363 0, 3, base);
1364 _phy_convert_txpower_dbm_to_relative_value(
1365 &rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfPath][RF_1TX][8],
1366 0, 3, base);
1367 _phy_convert_txpower_dbm_to_relative_value(
1368 &rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfPath][RF_1TX][9],
1369 0, 1, base);
1370
1371 base = _rtl8821ae_phy_get_txpower_by_rate_base(hw, BAND_ON_2_4G, rfPath, RF_2TX, VHT_2SSMCS0_2SSMCS9);
1372 _phy_convert_txpower_dbm_to_relative_value(
1373 &rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfPath][RF_1TX][9],
1374 2, 3, base);
1375 _phy_convert_txpower_dbm_to_relative_value(
1376 &rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfPath][RF_2TX][10],
1377 0, 3, base);
1378 _phy_convert_txpower_dbm_to_relative_value(
1379 &rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfPath][RF_2TX][11],
1380 0, 3, base);
1381
1382 base = _rtl8821ae_phy_get_txpower_by_rate_base(hw, BAND_ON_5G, rfPath, RF_1TX, OFDM);
1383 _phy_convert_txpower_dbm_to_relative_value(
1384 &rtlphy->tx_power_by_rate_offset[BAND_ON_5G][rfPath][RF_1TX][1],
1385 0, 3, base);
1386 _phy_convert_txpower_dbm_to_relative_value(
1387 &rtlphy->tx_power_by_rate_offset[BAND_ON_5G][rfPath][RF_1TX][2],
1388 0, 3, base);
1389
1390 base = _rtl8821ae_phy_get_txpower_by_rate_base(hw, BAND_ON_5G, rfPath, RF_1TX, HT_MCS0_MCS7);
1391 _phy_convert_txpower_dbm_to_relative_value(
1392 &rtlphy->tx_power_by_rate_offset[BAND_ON_5G][rfPath][RF_1TX][3],
1393 0, 3, base);
1394 _phy_convert_txpower_dbm_to_relative_value(
1395 &rtlphy->tx_power_by_rate_offset[BAND_ON_5G][rfPath][RF_1TX][4],
1396 0, 3, base);
1397
1398 base = _rtl8821ae_phy_get_txpower_by_rate_base(hw, BAND_ON_5G, rfPath, RF_2TX, HT_MCS8_MCS15);
1399 _phy_convert_txpower_dbm_to_relative_value(
1400 &rtlphy->tx_power_by_rate_offset[BAND_ON_5G][rfPath][RF_2TX][5],
1401 0, 3, base);
1402 _phy_convert_txpower_dbm_to_relative_value(
1403 &rtlphy->tx_power_by_rate_offset[BAND_ON_5G][rfPath][RF_2TX][6],
1404 0, 3, base);
1405
1406 base = _rtl8821ae_phy_get_txpower_by_rate_base(hw, BAND_ON_5G, rfPath, RF_1TX, VHT_1SSMCS0_1SSMCS9);
1407 _phy_convert_txpower_dbm_to_relative_value(
1408 &rtlphy->tx_power_by_rate_offset[BAND_ON_5G][rfPath][RF_1TX][7],
1409 0, 3, base);
1410 _phy_convert_txpower_dbm_to_relative_value(
1411 &rtlphy->tx_power_by_rate_offset[BAND_ON_5G][rfPath][RF_1TX][8],
1412 0, 3, base);
1413 _phy_convert_txpower_dbm_to_relative_value(
1414 &rtlphy->tx_power_by_rate_offset[BAND_ON_5G][rfPath][RF_1TX][9],
1415 0, 1, base);
1416
1417 base = _rtl8821ae_phy_get_txpower_by_rate_base(hw, BAND_ON_5G, rfPath, RF_2TX, VHT_2SSMCS0_2SSMCS9);
1418 _phy_convert_txpower_dbm_to_relative_value(
1419 &rtlphy->tx_power_by_rate_offset[BAND_ON_5G][rfPath][RF_1TX][9],
1420 2, 3, base);
1421 _phy_convert_txpower_dbm_to_relative_value(
1422 &rtlphy->tx_power_by_rate_offset[BAND_ON_5G][rfPath][RF_2TX][10],
1423 0, 3, base);
1424 _phy_convert_txpower_dbm_to_relative_value(
1425 &rtlphy->tx_power_by_rate_offset[BAND_ON_5G][rfPath][RF_2TX][11],
1426 0, 3, base);
1427 }
1428
1429 RT_TRACE(rtlpriv, COMP_POWER, DBG_TRACE,
1430 "<===_rtl8821ae_phy_convert_txpower_dbm_to_relative_value()\n");
1431}
1432
1433static void _rtl8821ae_phy_txpower_by_rate_configuration(struct ieee80211_hw *hw)
1434{
1435 _rtl8821ae_phy_store_txpower_by_rate_base(hw);
1436 _rtl8821ae_phy_convert_txpower_dbm_to_relative_value(hw);
1437}
1438
1439/* string is in decimal */
1440static bool _rtl8812ae_get_integer_from_string(char *str, u8 *pint)
1441{
1442 u16 i = 0;
1443 *pint = 0;
1444
1445 while (str[i] != '\0') {
1446 if (str[i] >= '0' && str[i] <= '9') {
1447 *pint *= 10;
1448 *pint += (str[i] - '0');
1449 } else {
1450 return false;
1451 }
1452 ++i;
1453 }
1454
1455 return true;
1456}
1457
1458static bool _rtl8812ae_eq_n_byte(u8 *str1, u8 *str2, u32 num)
1459{
1460 if (num == 0)
1461 return false;
1462 while (num > 0) {
1463 num--;
1464 if (str1[num] != str2[num])
1465 return false;
1466 }
1467 return true;
1468}
1469
1470static char _rtl8812ae_phy_get_chnl_idx_of_txpwr_lmt(struct ieee80211_hw *hw,
1471 u8 band, u8 channel)
1472{
1473 struct rtl_priv *rtlpriv = rtl_priv(hw);
1474 char channel_index = -1;
1475 u8 channel_5g[CHANNEL_MAX_NUMBER_5G] = {
1476 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64,
1477 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122,
1478 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 149,
1479 151, 153, 155, 157, 159, 161, 163, 165, 167, 168, 169, 171,
1480 173, 175, 177};
1481 u8 i = 0;
1482 if (band == BAND_ON_2_4G)
1483 channel_index = channel - 1;
1484 else if (band == BAND_ON_5G) {
1485 for (i = 0; i < sizeof(channel_5g)/sizeof(u8); ++i) {
1486 if (channel_5g[i] == channel)
1487 channel_index = i;
1488 }
1489 } else
1490 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, "Invalid Band %d in %s",
1491 band, __func__);
1492
1493 if (channel_index == -1)
1494 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
1495 "Invalid Channel %d of Band %d in %s", channel,
1496 band, __func__);
1497
1498 return channel_index;
1499}
1500
1501static void _rtl8812ae_phy_set_txpower_limit(struct ieee80211_hw *hw, u8 *pregulation,
1502 u8 *pband, u8 *pbandwidth,
1503 u8 *prate_section, u8 *prf_path,
1504 u8 *pchannel, u8 *ppower_limit)
1505{
1506 struct rtl_priv *rtlpriv = rtl_priv(hw);
1507 struct rtl_phy *rtlphy = &rtlpriv->phy;
1508 u8 regulation = 0, bandwidth = 0, rate_section = 0, channel;
1509 u8 channel_index;
1510 char power_limit = 0, prev_power_limit, ret;
1511
1512 if (!_rtl8812ae_get_integer_from_string((char *)pchannel, &channel) ||
1513 !_rtl8812ae_get_integer_from_string((char *)ppower_limit,
1514 &power_limit)) {
1515 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
1516 "Illegal index of pwr_lmt table [chnl %d][val %d]\n",
1517 channel, power_limit);
1518 }
1519
1520 power_limit = power_limit > MAX_POWER_INDEX ?
1521 MAX_POWER_INDEX : power_limit;
1522
1523 if (_rtl8812ae_eq_n_byte(pregulation, (u8 *)("FCC"), 3))
1524 regulation = 0;
1525 else if (_rtl8812ae_eq_n_byte(pregulation, (u8 *)("MKK"), 3))
1526 regulation = 1;
1527 else if (_rtl8812ae_eq_n_byte(pregulation, (u8 *)("ETSI"), 4))
1528 regulation = 2;
1529 else if (_rtl8812ae_eq_n_byte(pregulation, (u8 *)("WW13"), 4))
1530 regulation = 3;
1531
1532 if (_rtl8812ae_eq_n_byte(prate_section, (u8 *)("CCK"), 3))
1533 rate_section = 0;
1534 else if (_rtl8812ae_eq_n_byte(prate_section, (u8 *)("OFDM"), 4))
1535 rate_section = 1;
1536 else if (_rtl8812ae_eq_n_byte(prate_section, (u8 *)("HT"), 2) &&
1537 _rtl8812ae_eq_n_byte(prf_path, (u8 *)("1T"), 2))
1538 rate_section = 2;
1539 else if (_rtl8812ae_eq_n_byte(prate_section, (u8 *)("HT"), 2) &&
1540 _rtl8812ae_eq_n_byte(prf_path, (u8 *)("2T"), 2))
1541 rate_section = 3;
1542 else if (_rtl8812ae_eq_n_byte(prate_section, (u8 *)("VHT"), 3) &&
1543 _rtl8812ae_eq_n_byte(prf_path, (u8 *)("1T"), 2))
1544 rate_section = 4;
1545 else if (_rtl8812ae_eq_n_byte(prate_section, (u8 *)("VHT"), 3) &&
1546 _rtl8812ae_eq_n_byte(prf_path, (u8 *)("2T"), 2))
1547 rate_section = 5;
1548
1549 if (_rtl8812ae_eq_n_byte(pbandwidth, (u8 *)("20M"), 3))
1550 bandwidth = 0;
1551 else if (_rtl8812ae_eq_n_byte(pbandwidth, (u8 *)("40M"), 3))
1552 bandwidth = 1;
1553 else if (_rtl8812ae_eq_n_byte(pbandwidth, (u8 *)("80M"), 3))
1554 bandwidth = 2;
1555 else if (_rtl8812ae_eq_n_byte(pbandwidth, (u8 *)("160M"), 4))
1556 bandwidth = 3;
1557
1558 if (_rtl8812ae_eq_n_byte(pband, (u8 *)("2.4G"), 4)) {
1559 ret = _rtl8812ae_phy_get_chnl_idx_of_txpwr_lmt(hw,
1560 BAND_ON_2_4G,
1561 channel);
1562
1563 if (ret == -1)
1564 return;
1565
1566 channel_index = ret;
1567
1568 prev_power_limit = rtlphy->txpwr_limit_2_4g[regulation]
1569 [bandwidth][rate_section]
1570 [channel_index][RF90_PATH_A];
1571
1572 if (power_limit < prev_power_limit)
1573 rtlphy->txpwr_limit_2_4g[regulation][bandwidth]
1574 [rate_section][channel_index][RF90_PATH_A] =
1575 power_limit;
1576
1577 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
1578 "2.4G [regula %d][bw %d][sec %d][chnl %d][val %d]\n",
1579 regulation, bandwidth, rate_section, channel_index,
1580 rtlphy->txpwr_limit_2_4g[regulation][bandwidth]
1581 [rate_section][channel_index][RF90_PATH_A]);
1582 } else if (_rtl8812ae_eq_n_byte(pband, (u8 *)("5G"), 2)) {
1583 ret = _rtl8812ae_phy_get_chnl_idx_of_txpwr_lmt(hw,
1584 BAND_ON_5G,
1585 channel);
1586
1587 if (ret == -1)
1588 return;
1589
1590 channel_index = ret;
1591
1592 prev_power_limit = rtlphy->txpwr_limit_5g[regulation][bandwidth]
1593 [rate_section][channel_index]
1594 [RF90_PATH_A];
1595
1596 if (power_limit < prev_power_limit)
1597 rtlphy->txpwr_limit_5g[regulation][bandwidth]
1598 [rate_section][channel_index][RF90_PATH_A] = power_limit;
1599
1600 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
1601 "5G: [regul %d][bw %d][sec %d][chnl %d][val %d]\n",
1602 regulation, bandwidth, rate_section, channel,
1603 rtlphy->txpwr_limit_5g[regulation][bandwidth]
1604 [rate_section][channel_index][RF90_PATH_A]);
1605 } else {
1606 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
1607 "Cannot recognize the band info in %s\n", pband);
1608 return;
1609 }
1610}
1611
1612static void _rtl8812ae_phy_config_bb_txpwr_lmt(struct ieee80211_hw *hw,
1613 u8 *regulation, u8 *band,
1614 u8 *bandwidth, u8 *rate_section,
1615 u8 *rf_path, u8 *channel,
1616 u8 *power_limit)
1617{
1618 _rtl8812ae_phy_set_txpower_limit(hw, regulation, band, bandwidth,
1619 rate_section, rf_path, channel,
1620 power_limit);
1621}
1622
1623static void _rtl8821ae_phy_read_and_config_txpwr_lmt(struct ieee80211_hw *hw)
1624{
1625 struct rtl_priv *rtlpriv = rtl_priv(hw);
1626 struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
1627 u32 i = 0;
1628 u32 array_len;
1629 u8 **array;
1630
1631 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
1632 array_len = RTL8812AE_TXPWR_LMT_ARRAY_LEN;
1633 array = RTL8812AE_TXPWR_LMT;
1634 } else {
1635 array_len = RTL8821AE_TXPWR_LMT_ARRAY_LEN;
1636 array = RTL8821AE_TXPWR_LMT;
1637 }
1638
1639 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
1640 "\n");
1641
1642 for (i = 0; i < array_len; i += 7) {
1643 u8 *regulation = array[i];
1644 u8 *band = array[i+1];
1645 u8 *bandwidth = array[i+2];
1646 u8 *rate = array[i+3];
1647 u8 *rf_path = array[i+4];
1648 u8 *chnl = array[i+5];
1649 u8 *val = array[i+6];
1650
1651 _rtl8812ae_phy_config_bb_txpwr_lmt(hw, regulation, band,
1652 bandwidth, rate, rf_path,
1653 chnl, val);
1654 }
1655}
1656
1657static bool _rtl8821ae_phy_bb8821a_config_parafile(struct ieee80211_hw *hw)
1658{
1659 struct rtl_priv *rtlpriv = rtl_priv(hw);
1660 struct rtl_phy *rtlphy = &rtlpriv->phy;
1661 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
1662 bool rtstatus;
1663
1664 _rtl8821ae_phy_init_txpower_limit(hw);
1665
1666 /* RegEnableTxPowerLimit == 1 for 8812a & 8821a */
1667 if (rtlefuse->eeprom_regulatory != 2)
1668 _rtl8821ae_phy_read_and_config_txpwr_lmt(hw);
1669
1670 rtstatus = _rtl8821ae_phy_config_bb_with_headerfile(hw,
1671 BASEBAND_CONFIG_PHY_REG);
1672 if (rtstatus != true) {
1673 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "Write BB Reg Fail!!");
1674 return false;
1675 }
1676 _rtl8821ae_phy_init_tx_power_by_rate(hw);
1677 if (rtlefuse->autoload_failflag == false) {
1678 rtstatus = _rtl8821ae_phy_config_bb_with_pgheaderfile(hw,
1679 BASEBAND_CONFIG_PHY_REG);
1680 }
1681 if (rtstatus != true) {
1682 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "BB_PG Reg Fail!!");
1683 return false;
1684 }
1685
1686 _rtl8821ae_phy_txpower_by_rate_configuration(hw);
1687
1688 /* RegEnableTxPowerLimit == 1 for 8812a & 8821a */
1689 if (rtlefuse->eeprom_regulatory != 2)
1690 _rtl8812ae_phy_convert_txpower_limit_to_power_index(hw);
1691
1692 rtstatus = _rtl8821ae_phy_config_bb_with_headerfile(hw,
1693 BASEBAND_CONFIG_AGC_TAB);
1694
1695 if (rtstatus != true) {
1696 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "AGC Table Fail\n");
1697 return false;
1698 }
1699 rtlphy->cck_high_power = (bool)(rtl_get_bbreg(hw,
1700 RFPGA0_XA_HSSIPARAMETER2, 0x200));
1701 return true;
1702}
1703
1704static bool _rtl8821ae_phy_config_mac_with_headerfile(struct ieee80211_hw *hw)
1705{
1706 struct rtl_priv *rtlpriv = rtl_priv(hw);
1707 struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
1708 u32 i, v1, v2;
1709 u32 arraylength;
1710 u32 *ptrarray;
1711
1712 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, "Read MAC_REG_Array\n");
1713 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
1714 arraylength = RTL8821AEMAC_1T_ARRAYLEN;
1715 ptrarray = RTL8821AE_MAC_REG_ARRAY;
1716 } else {
1717 arraylength = RTL8812AEMAC_1T_ARRAYLEN;
1718 ptrarray = RTL8812AE_MAC_REG_ARRAY;
1719 }
1720 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1721 "Img: MAC_REG_ARRAY LEN %d\n", arraylength);
1722 for (i = 0; i < arraylength; i += 2) {
1723 v1 = ptrarray[i];
1724 v2 = (u8)ptrarray[i + 1];
1725 if (v1 < 0xCDCDCDCD) {
1726 rtl_write_byte(rtlpriv, v1, (u8)v2);
1727 continue;
1728 } else {
1729 if (!_rtl8821ae_check_condition(hw, v1)) {
1730 /*Discard the following (offset, data) pairs*/
1731 READ_NEXT_PAIR(ptrarray, v1, v2, i);
1732 while (v2 != 0xDEAD &&
1733 v2 != 0xCDEF &&
1734 v2 != 0xCDCD && i < arraylength - 2) {
1735 READ_NEXT_PAIR(ptrarray, v1, v2, i);
1736 }
1737 i -= 2; /* prevent from for-loop += 2*/
1738 } else {/*Configure matched pairs and skip to end of if-else.*/
1739 READ_NEXT_PAIR(ptrarray, v1, v2, i);
1740 while (v2 != 0xDEAD &&
1741 v2 != 0xCDEF &&
1742 v2 != 0xCDCD && i < arraylength - 2) {
1743 rtl_write_byte(rtlpriv, v1, v2);
1744 READ_NEXT_PAIR(ptrarray, v1, v2, i);
1745 }
1746
1747 while (v2 != 0xDEAD && i < arraylength - 2)
1748 READ_NEXT_PAIR(ptrarray, v1, v2, i);
1749 }
1750 }
1751 }
1752 return true;
1753}
1754
1755static bool _rtl8821ae_phy_config_bb_with_headerfile(struct ieee80211_hw *hw,
1756 u8 configtype)
1757{
1758 struct rtl_priv *rtlpriv = rtl_priv(hw);
1759 struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
1760 int i;
1761 u32 *array_table;
1762 u16 arraylen;
1763 u32 v1 = 0, v2 = 0;
1764
1765 if (configtype == BASEBAND_CONFIG_PHY_REG) {
1766 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
1767 arraylen = RTL8812AEPHY_REG_1TARRAYLEN;
1768 array_table = RTL8812AE_PHY_REG_ARRAY;
1769 } else {
1770 arraylen = RTL8821AEPHY_REG_1TARRAYLEN;
1771 array_table = RTL8821AE_PHY_REG_ARRAY;
1772 }
1773
1774 for (i = 0; i < arraylen; i += 2) {
1775 v1 = array_table[i];
1776 v2 = array_table[i + 1];
1777 if (v1 < 0xCDCDCDCD) {
1778 _rtl8821ae_config_bb_reg(hw, v1, v2);
1779 continue;
1780 } else {/*This line is the start line of branch.*/
1781 if (!_rtl8821ae_check_condition(hw, v1)) {
1782 /*Discard the following (offset, data) pairs*/
1783 READ_NEXT_PAIR(array_table, v1, v2, i);
1784 while (v2 != 0xDEAD &&
1785 v2 != 0xCDEF &&
1786 v2 != 0xCDCD &&
1787 i < arraylen - 2) {
1788 READ_NEXT_PAIR(array_table, v1,
1789 v2, i);
1790 }
1791
1792 i -= 2; /* prevent from for-loop += 2*/
1793 } else {/*Configure matched pairs and skip to end of if-else.*/
1794 READ_NEXT_PAIR(array_table, v1, v2, i);
1795 while (v2 != 0xDEAD &&
1796 v2 != 0xCDEF &&
1797 v2 != 0xCDCD &&
1798 i < arraylen - 2) {
1799 _rtl8821ae_config_bb_reg(hw, v1,
1800 v2);
1801 READ_NEXT_PAIR(array_table, v1,
1802 v2, i);
1803 }
1804
1805 while (v2 != 0xDEAD &&
1806 i < arraylen - 2) {
1807 READ_NEXT_PAIR(array_table, v1,
1808 v2, i);
1809 }
1810 }
1811 }
1812 }
1813 } else if (configtype == BASEBAND_CONFIG_AGC_TAB) {
1814 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
1815 arraylen = RTL8812AEAGCTAB_1TARRAYLEN;
1816 array_table = RTL8812AE_AGC_TAB_ARRAY;
1817 } else {
1818 arraylen = RTL8821AEAGCTAB_1TARRAYLEN;
1819 array_table = RTL8821AE_AGC_TAB_ARRAY;
1820 }
1821
1822 for (i = 0; i < arraylen; i = i + 2) {
1823 v1 = array_table[i];
1824 v2 = array_table[i+1];
1825 if (v1 < 0xCDCDCDCD) {
1826 rtl_set_bbreg(hw, v1, MASKDWORD, v2);
1827 udelay(1);
1828 continue;
1829 } else {/*This line is the start line of branch.*/
1830 if (!_rtl8821ae_check_condition(hw, v1)) {
1831 /*Discard the following (offset, data) pairs*/
1832 READ_NEXT_PAIR(array_table, v1, v2, i);
1833 while (v2 != 0xDEAD &&
1834 v2 != 0xCDEF &&
1835 v2 != 0xCDCD &&
1836 i < arraylen - 2) {
1837 READ_NEXT_PAIR(array_table, v1,
1838 v2, i);
1839 }
1840 i -= 2; /* prevent from for-loop += 2*/
1841 } else {/*Configure matched pairs and skip to end of if-else.*/
1842 READ_NEXT_PAIR(array_table, v1, v2, i);
1843 while (v2 != 0xDEAD &&
1844 v2 != 0xCDEF &&
1845 v2 != 0xCDCD &&
1846 i < arraylen - 2) {
1847 rtl_set_bbreg(hw, v1, MASKDWORD,
1848 v2);
1849 udelay(1);
1850 READ_NEXT_PAIR(array_table, v1,
1851 v2, i);
1852 }
1853
1854 while (v2 != 0xDEAD &&
1855 i < arraylen - 2) {
1856 READ_NEXT_PAIR(array_table, v1,
1857 v2, i);
1858 }
1859 }
1860 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
1861 "The agctab_array_table[0] is %x Rtl818EEPHY_REGArray[1] is %x\n",
1862 array_table[i], array_table[i + 1]);
1863 }
1864 }
1865 }
1866 return true;
1867}
1868
1869static u8 _rtl8821ae_get_rate_section_index(u32 regaddr)
1870{
1871 u8 index = 0;
1872 regaddr &= 0xFFF;
1873 if (regaddr >= 0xC20 && regaddr <= 0xC4C)
1874 index = (u8)((regaddr - 0xC20) / 4);
1875 else if (regaddr >= 0xE20 && regaddr <= 0xE4C)
1876 index = (u8)((regaddr - 0xE20) / 4);
1877 else
1878 RT_ASSERT(!COMP_INIT,
1879 "Invalid RegAddr 0x%x\n", regaddr);
1880 return index;
1881}
1882
1883static void _rtl8821ae_store_tx_power_by_rate(struct ieee80211_hw *hw,
1884 u32 band, u32 rfpath,
1885 u32 txnum, u32 regaddr,
1886 u32 bitmask, u32 data)
1887{
1888 struct rtl_priv *rtlpriv = rtl_priv(hw);
1889 struct rtl_phy *rtlphy = &rtlpriv->phy;
1890 u8 rate_section = _rtl8821ae_get_rate_section_index(regaddr);
1891
1892 if (band != BAND_ON_2_4G && band != BAND_ON_5G)
1893 RT_TRACE(rtlpriv, COMP_INIT, DBG_WARNING, "Invalid Band %d\n", band);
1894
1895 if (rfpath >= MAX_RF_PATH)
1896 RT_TRACE(rtlpriv, COMP_INIT, DBG_WARNING, "Invalid RfPath %d\n", rfpath);
1897
1898 if (txnum >= MAX_RF_PATH)
1899 RT_TRACE(rtlpriv, COMP_INIT, DBG_WARNING, "Invalid TxNum %d\n", txnum);
1900
1901 rtlphy->tx_power_by_rate_offset[band][rfpath][txnum][rate_section] = data;
1902 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1903 "TxPwrByRateOffset[Band %d][RfPath %d][TxNum %d][RateSection %d] = 0x%x\n",
1904 band, rfpath, txnum, rate_section,
1905 rtlphy->tx_power_by_rate_offset[band][rfpath][txnum][rate_section]);
1906}
1907
1908static bool _rtl8821ae_phy_config_bb_with_pgheaderfile(struct ieee80211_hw *hw,
1909 u8 configtype)
1910{
1911 struct rtl_priv *rtlpriv = rtl_priv(hw);
1912 struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
1913 int i;
1914 u32 *array;
1915 u16 arraylen;
1916 u32 v1, v2, v3, v4, v5, v6;
1917
1918 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
1919 arraylen = RTL8812AEPHY_REG_ARRAY_PGLEN;
1920 array = RTL8812AE_PHY_REG_ARRAY_PG;
1921 } else {
1922 arraylen = RTL8821AEPHY_REG_ARRAY_PGLEN;
1923 array = RTL8821AE_PHY_REG_ARRAY_PG;
1924 }
1925
1926 if (configtype != BASEBAND_CONFIG_PHY_REG) {
1927 RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE,
1928 "configtype != BaseBand_Config_PHY_REG\n");
1929 return true;
1930 }
1931 for (i = 0; i < arraylen; i += 6) {
1932 v1 = array[i];
1933 v2 = array[i+1];
1934 v3 = array[i+2];
1935 v4 = array[i+3];
1936 v5 = array[i+4];
1937 v6 = array[i+5];
1938
1939 if (v1 < 0xCDCDCDCD) {
1940 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE &&
1941 (v4 == 0xfe || v4 == 0xffe)) {
1942 msleep(50);
1943 continue;
1944 }
1945
1946 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
1947 if (v4 == 0xfe)
1948 msleep(50);
1949 else if (v4 == 0xfd)
1950 mdelay(5);
1951 else if (v4 == 0xfc)
1952 mdelay(1);
1953 else if (v4 == 0xfb)
1954 udelay(50);
1955 else if (v4 == 0xfa)
1956 udelay(5);
1957 else if (v4 == 0xf9)
1958 udelay(1);
1959 }
1960 _rtl8821ae_store_tx_power_by_rate(hw, v1, v2, v3,
1961 v4, v5, v6);
1962 continue;
1963 } else {
1964 /*don't need the hw_body*/
1965 if (!_rtl8821ae_check_condition(hw, v1)) {
1966 i += 2; /* skip the pair of expression*/
1967 v1 = array[i];
1968 v2 = array[i+1];
1969 v3 = array[i+2];
1970 while (v2 != 0xDEAD) {
1971 i += 3;
1972 v1 = array[i];
1973 v2 = array[i+1];
1974 v3 = array[i+2];
1975 }
1976 }
1977 }
1978 }
1979
1980 return true;
1981}
1982
1983bool rtl8812ae_phy_config_rf_with_headerfile(struct ieee80211_hw *hw,
1984 enum radio_path rfpath)
1985{
1986 int i;
1987 bool rtstatus = true;
1988 u32 *radioa_array_table_a, *radioa_array_table_b;
1989 u16 radioa_arraylen_a, radioa_arraylen_b;
1990 struct rtl_priv *rtlpriv = rtl_priv(hw);
1991 u32 v1 = 0, v2 = 0;
1992
1993 radioa_arraylen_a = RTL8812AE_RADIOA_1TARRAYLEN;
1994 radioa_array_table_a = RTL8812AE_RADIOA_ARRAY;
1995 radioa_arraylen_b = RTL8812AE_RADIOB_1TARRAYLEN;
1996 radioa_array_table_b = RTL8812AE_RADIOB_ARRAY;
1997 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1998 "Radio_A:RTL8821AE_RADIOA_ARRAY %d\n", radioa_arraylen_a);
1999 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "Radio No %x\n", rfpath);
2000 rtstatus = true;
2001 switch (rfpath) {
2002 case RF90_PATH_A:
2003 for (i = 0; i < radioa_arraylen_a; i = i + 2) {
2004 v1 = radioa_array_table_a[i];
2005 v2 = radioa_array_table_a[i+1];
2006 if (v1 < 0xcdcdcdcd) {
2007 _rtl8821ae_config_rf_radio_a(hw, v1, v2);
2008 continue;
2009 } else{/*This line is the start line of branch.*/
2010 if (!_rtl8821ae_check_condition(hw, v1)) {
2011 /*Discard the following (offset, data) pairs*/
2012 READ_NEXT_PAIR(radioa_array_table_a, v1, v2, i);
2013 while (v2 != 0xDEAD &&
2014 v2 != 0xCDEF &&
2015 v2 != 0xCDCD && i < radioa_arraylen_a-2)
2016 READ_NEXT_PAIR(radioa_array_table_a, v1, v2, i);
2017
2018 i -= 2; /* prevent from for-loop += 2*/
2019 } else {/*Configure matched pairs and skip to end of if-else.*/
2020 READ_NEXT_PAIR(radioa_array_table_a, v1, v2, i);
2021 while (v2 != 0xDEAD &&
2022 v2 != 0xCDEF &&
2023 v2 != 0xCDCD && i < radioa_arraylen_a - 2) {
2024 _rtl8821ae_config_rf_radio_a(hw, v1, v2);
2025 READ_NEXT_PAIR(radioa_array_table_a, v1, v2, i);
2026 }
2027
2028 while (v2 != 0xDEAD && i < radioa_arraylen_a-2)
2029 READ_NEXT_PAIR(radioa_array_table_a, v1, v2, i);
2030
2031 }
2032 }
2033 }
2034 break;
2035 case RF90_PATH_B:
2036 for (i = 0; i < radioa_arraylen_b; i = i + 2) {
2037 v1 = radioa_array_table_b[i];
2038 v2 = radioa_array_table_b[i+1];
2039 if (v1 < 0xcdcdcdcd) {
2040 _rtl8821ae_config_rf_radio_b(hw, v1, v2);
2041 continue;
2042 } else{/*This line is the start line of branch.*/
2043 if (!_rtl8821ae_check_condition(hw, v1)) {
2044 /*Discard the following (offset, data) pairs*/
2045 READ_NEXT_PAIR(radioa_array_table_b, v1, v2, i);
2046 while (v2 != 0xDEAD &&
2047 v2 != 0xCDEF &&
2048 v2 != 0xCDCD && i < radioa_arraylen_b-2)
2049 READ_NEXT_PAIR(radioa_array_table_b, v1, v2, i);
2050
2051 i -= 2; /* prevent from for-loop += 2*/
2052 } else {/*Configure matched pairs and skip to end of if-else.*/
2053 READ_NEXT_PAIR(radioa_array_table_b, v1, v2, i);
2054 while (v2 != 0xDEAD &&
2055 v2 != 0xCDEF &&
2056 v2 != 0xCDCD && i < radioa_arraylen_b-2) {
2057 _rtl8821ae_config_rf_radio_b(hw, v1, v2);
2058 READ_NEXT_PAIR(radioa_array_table_b, v1, v2, i);
2059 }
2060
2061 while (v2 != 0xDEAD && i < radioa_arraylen_b-2)
2062 READ_NEXT_PAIR(radioa_array_table_b, v1, v2, i);
2063 }
2064 }
2065 }
2066 break;
2067 case RF90_PATH_C:
2068 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
2069 "switch case not process\n");
2070 break;
2071 case RF90_PATH_D:
2072 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
2073 "switch case not process\n");
2074 break;
2075 }
2076 return true;
2077}
2078
2079bool rtl8821ae_phy_config_rf_with_headerfile(struct ieee80211_hw *hw,
2080 enum radio_path rfpath)
2081{
2082 #define READ_NEXT_RF_PAIR(v1, v2, i) \
2083 do { \
2084 i += 2; \
2085 v1 = radioa_array_table[i]; \
2086 v2 = radioa_array_table[i+1]; \
2087 } \
2088 while (0)
2089
2090 int i;
2091 bool rtstatus = true;
2092 u32 *radioa_array_table;
2093 u16 radioa_arraylen;
2094 struct rtl_priv *rtlpriv = rtl_priv(hw);
2095 /* struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); */
2096 u32 v1 = 0, v2 = 0;
2097
2098 radioa_arraylen = RTL8821AE_RADIOA_1TARRAYLEN;
2099 radioa_array_table = RTL8821AE_RADIOA_ARRAY;
2100 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2101 "Radio_A:RTL8821AE_RADIOA_ARRAY %d\n", radioa_arraylen);
2102 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "Radio No %x\n", rfpath);
2103 rtstatus = true;
2104 switch (rfpath) {
2105 case RF90_PATH_A:
2106 for (i = 0; i < radioa_arraylen; i = i + 2) {
2107 v1 = radioa_array_table[i];
2108 v2 = radioa_array_table[i+1];
2109 if (v1 < 0xcdcdcdcd)
2110 _rtl8821ae_config_rf_radio_a(hw, v1, v2);
2111 else{/*This line is the start line of branch.*/
2112 if (!_rtl8821ae_check_condition(hw, v1)) {
2113 /*Discard the following (offset, data) pairs*/
2114 READ_NEXT_RF_PAIR(v1, v2, i);
2115 while (v2 != 0xDEAD &&
2116 v2 != 0xCDEF &&
2117 v2 != 0xCDCD && i < radioa_arraylen - 2)
2118 READ_NEXT_RF_PAIR(v1, v2, i);
2119
2120 i -= 2; /* prevent from for-loop += 2*/
2121 } else {/*Configure matched pairs and skip to end of if-else.*/
2122 READ_NEXT_RF_PAIR(v1, v2, i);
2123 while (v2 != 0xDEAD &&
2124 v2 != 0xCDEF &&
2125 v2 != 0xCDCD && i < radioa_arraylen - 2) {
2126 _rtl8821ae_config_rf_radio_a(hw, v1, v2);
2127 READ_NEXT_RF_PAIR(v1, v2, i);
2128 }
2129
2130 while (v2 != 0xDEAD && i < radioa_arraylen - 2)
2131 READ_NEXT_RF_PAIR(v1, v2, i);
2132 }
2133 }
2134 }
2135 break;
2136
2137 case RF90_PATH_B:
2138 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
2139 "switch case not process\n");
2140 break;
2141 case RF90_PATH_C:
2142 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
2143 "switch case not process\n");
2144 break;
2145 case RF90_PATH_D:
2146 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
2147 "switch case not process\n");
2148 break;
2149 }
2150 return true;
2151}
2152
2153void rtl8821ae_phy_get_hw_reg_originalvalue(struct ieee80211_hw *hw)
2154{
2155 struct rtl_priv *rtlpriv = rtl_priv(hw);
2156 struct rtl_phy *rtlphy = &rtlpriv->phy;
2157
2158 rtlphy->default_initialgain[0] =
2159 (u8)rtl_get_bbreg(hw, ROFDM0_XAAGCCORE1, MASKBYTE0);
2160 rtlphy->default_initialgain[1] =
2161 (u8)rtl_get_bbreg(hw, ROFDM0_XBAGCCORE1, MASKBYTE0);
2162 rtlphy->default_initialgain[2] =
2163 (u8)rtl_get_bbreg(hw, ROFDM0_XCAGCCORE1, MASKBYTE0);
2164 rtlphy->default_initialgain[3] =
2165 (u8)rtl_get_bbreg(hw, ROFDM0_XDAGCCORE1, MASKBYTE0);
2166
2167 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
2168 "Default initial gain (c50=0x%x, c58=0x%x, c60=0x%x, c68=0x%x\n",
2169 rtlphy->default_initialgain[0],
2170 rtlphy->default_initialgain[1],
2171 rtlphy->default_initialgain[2],
2172 rtlphy->default_initialgain[3]);
2173
2174 rtlphy->framesync = (u8)rtl_get_bbreg(hw,
2175 ROFDM0_RXDETECTOR3, MASKBYTE0);
2176 rtlphy->framesync_c34 = rtl_get_bbreg(hw,
2177 ROFDM0_RXDETECTOR2, MASKDWORD);
2178
2179 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
2180 "Default framesync (0x%x) = 0x%x\n",
2181 ROFDM0_RXDETECTOR3, rtlphy->framesync);
2182}
2183
2184static void phy_init_bb_rf_register_definition(struct ieee80211_hw *hw)
2185{
2186 struct rtl_priv *rtlpriv = rtl_priv(hw);
2187 struct rtl_phy *rtlphy = &rtlpriv->phy;
2188
2189 rtlphy->phyreg_def[RF90_PATH_A].rfintfs = RFPGA0_XAB_RFINTERFACESW;
2190 rtlphy->phyreg_def[RF90_PATH_B].rfintfs = RFPGA0_XAB_RFINTERFACESW;
2191
2192 rtlphy->phyreg_def[RF90_PATH_A].rfintfo = RFPGA0_XA_RFINTERFACEOE;
2193 rtlphy->phyreg_def[RF90_PATH_B].rfintfo = RFPGA0_XB_RFINTERFACEOE;
2194
2195 rtlphy->phyreg_def[RF90_PATH_A].rfintfe = RFPGA0_XA_RFINTERFACEOE;
2196 rtlphy->phyreg_def[RF90_PATH_B].rfintfe = RFPGA0_XB_RFINTERFACEOE;
2197
2198 rtlphy->phyreg_def[RF90_PATH_A].rf3wire_offset = RA_LSSIWRITE_8821A;
2199 rtlphy->phyreg_def[RF90_PATH_B].rf3wire_offset = RB_LSSIWRITE_8821A;
2200
2201 rtlphy->phyreg_def[RF90_PATH_A].rfhssi_para2 = RHSSIREAD_8821AE;
2202 rtlphy->phyreg_def[RF90_PATH_B].rfhssi_para2 = RHSSIREAD_8821AE;
2203
2204 rtlphy->phyreg_def[RF90_PATH_A].rf_rb = RA_SIREAD_8821A;
2205 rtlphy->phyreg_def[RF90_PATH_B].rf_rb = RB_SIREAD_8821A;
2206
2207 rtlphy->phyreg_def[RF90_PATH_A].rf_rbpi = RA_PIREAD_8821A;
2208 rtlphy->phyreg_def[RF90_PATH_B].rf_rbpi = RB_PIREAD_8821A;
2209}
2210
2211void rtl8821ae_phy_get_txpower_level(struct ieee80211_hw *hw, long *powerlevel)
2212{
2213 struct rtl_priv *rtlpriv = rtl_priv(hw);
2214 struct rtl_phy *rtlphy = &rtlpriv->phy;
2215 u8 txpwr_level;
2216 long txpwr_dbm;
2217
2218 txpwr_level = rtlphy->cur_cck_txpwridx;
2219 txpwr_dbm = _rtl8821ae_phy_txpwr_idx_to_dbm(hw,
2220 WIRELESS_MODE_B, txpwr_level);
2221 txpwr_level = rtlphy->cur_ofdm24g_txpwridx;
2222 if (_rtl8821ae_phy_txpwr_idx_to_dbm(hw,
2223 WIRELESS_MODE_G,
2224 txpwr_level) > txpwr_dbm)
2225 txpwr_dbm =
2226 _rtl8821ae_phy_txpwr_idx_to_dbm(hw, WIRELESS_MODE_G,
2227 txpwr_level);
2228 txpwr_level = rtlphy->cur_ofdm24g_txpwridx;
2229 if (_rtl8821ae_phy_txpwr_idx_to_dbm(hw,
2230 WIRELESS_MODE_N_24G,
2231 txpwr_level) > txpwr_dbm)
2232 txpwr_dbm =
2233 _rtl8821ae_phy_txpwr_idx_to_dbm(hw, WIRELESS_MODE_N_24G,
2234 txpwr_level);
2235 *powerlevel = txpwr_dbm;
2236}
2237
2238static bool _rtl8821ae_phy_get_chnl_index(u8 channel, u8 *chnl_index)
2239{
2240 u8 channel_5g[CHANNEL_MAX_NUMBER_5G] = {
2241 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62,
2242 64, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118,
2243 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140,
2244 142, 144, 149, 151, 153, 155, 157, 159, 161, 163, 165,
2245 167, 168, 169, 171, 173, 175, 177
2246 };
2247 u8 i = 0;
2248 bool in_24g = true;
2249
2250 if (channel <= 14) {
2251 in_24g = true;
2252 *chnl_index = channel - 1;
2253 } else {
2254 in_24g = false;
2255
2256 for (i = 0; i < CHANNEL_MAX_NUMBER_5G; ++i) {
2257 if (channel_5g[i] == channel) {
2258 *chnl_index = i;
2259 return in_24g;
2260 }
2261 }
2262 }
2263 return in_24g;
2264}
2265
2266static char _rtl8821ae_phy_get_ratesection_intxpower_byrate(u8 path, u8 rate)
2267{
2268 char rate_section = 0;
2269 switch (rate) {
2270 case DESC_RATE1M:
2271 case DESC_RATE2M:
2272 case DESC_RATE5_5M:
2273 case DESC_RATE11M:
2274 rate_section = 0;
2275 break;
2276 case DESC_RATE6M:
2277 case DESC_RATE9M:
2278 case DESC_RATE12M:
2279 case DESC_RATE18M:
2280 rate_section = 1;
2281 break;
2282 case DESC_RATE24M:
2283 case DESC_RATE36M:
2284 case DESC_RATE48M:
2285 case DESC_RATE54M:
2286 rate_section = 2;
2287 break;
2288 case DESC_RATEMCS0:
2289 case DESC_RATEMCS1:
2290 case DESC_RATEMCS2:
2291 case DESC_RATEMCS3:
2292 rate_section = 3;
2293 break;
2294 case DESC_RATEMCS4:
2295 case DESC_RATEMCS5:
2296 case DESC_RATEMCS6:
2297 case DESC_RATEMCS7:
2298 rate_section = 4;
2299 break;
2300 case DESC_RATEMCS8:
2301 case DESC_RATEMCS9:
2302 case DESC_RATEMCS10:
2303 case DESC_RATEMCS11:
2304 rate_section = 5;
2305 break;
2306 case DESC_RATEMCS12:
2307 case DESC_RATEMCS13:
2308 case DESC_RATEMCS14:
2309 case DESC_RATEMCS15:
2310 rate_section = 6;
2311 break;
2312 case DESC_RATEVHT1SS_MCS0:
2313 case DESC_RATEVHT1SS_MCS1:
2314 case DESC_RATEVHT1SS_MCS2:
2315 case DESC_RATEVHT1SS_MCS3:
2316 rate_section = 7;
2317 break;
2318 case DESC_RATEVHT1SS_MCS4:
2319 case DESC_RATEVHT1SS_MCS5:
2320 case DESC_RATEVHT1SS_MCS6:
2321 case DESC_RATEVHT1SS_MCS7:
2322 rate_section = 8;
2323 break;
2324 case DESC_RATEVHT1SS_MCS8:
2325 case DESC_RATEVHT1SS_MCS9:
2326 case DESC_RATEVHT2SS_MCS0:
2327 case DESC_RATEVHT2SS_MCS1:
2328 rate_section = 9;
2329 break;
2330 case DESC_RATEVHT2SS_MCS2:
2331 case DESC_RATEVHT2SS_MCS3:
2332 case DESC_RATEVHT2SS_MCS4:
2333 case DESC_RATEVHT2SS_MCS5:
2334 rate_section = 10;
2335 break;
2336 case DESC_RATEVHT2SS_MCS6:
2337 case DESC_RATEVHT2SS_MCS7:
2338 case DESC_RATEVHT2SS_MCS8:
2339 case DESC_RATEVHT2SS_MCS9:
2340 rate_section = 11;
2341 break;
2342 default:
2343 RT_ASSERT(true, "Rate_Section is Illegal\n");
2344 break;
2345 }
2346
2347 return rate_section;
2348}
2349
2350static char _rtl8812ae_phy_get_world_wide_limit(char *limit_table)
2351{
2352 char min = limit_table[0];
2353 u8 i = 0;
2354
2355 for (i = 0; i < MAX_REGULATION_NUM; ++i) {
2356 if (limit_table[i] < min)
2357 min = limit_table[i];
2358 }
2359 return min;
2360}
2361
2362static char _rtl8812ae_phy_get_txpower_limit(struct ieee80211_hw *hw,
2363 u8 band,
2364 enum ht_channel_width bandwidth,
2365 enum radio_path rf_path,
2366 u8 rate, u8 channel)
2367{
2368 struct rtl_priv *rtlpriv = rtl_priv(hw);
2369 struct rtl_efuse *rtlefuse = rtl_efuse(rtlpriv);
2370 struct rtl_phy *rtlphy = &rtlpriv->phy;
2371 short band_temp = -1, regulation = -1, bandwidth_temp = -1,
2372 rate_section = -1, channel_temp = -1;
2373 u16 bd, regu, bdwidth, sec, chnl;
2374 char power_limit = MAX_POWER_INDEX;
2375
2376 if (rtlefuse->eeprom_regulatory == 2)
2377 return MAX_POWER_INDEX;
2378
2379 regulation = TXPWR_LMT_WW;
2380
2381 if (band == BAND_ON_2_4G)
2382 band_temp = 0;
2383 else if (band == BAND_ON_5G)
2384 band_temp = 1;
2385
2386 if (bandwidth == HT_CHANNEL_WIDTH_20)
2387 bandwidth_temp = 0;
2388 else if (bandwidth == HT_CHANNEL_WIDTH_20_40)
2389 bandwidth_temp = 1;
2390 else if (bandwidth == HT_CHANNEL_WIDTH_80)
2391 bandwidth_temp = 2;
2392
2393 switch (rate) {
2394 case DESC_RATE1M:
2395 case DESC_RATE2M:
2396 case DESC_RATE5_5M:
2397 case DESC_RATE11M:
2398 rate_section = 0;
2399 break;
2400 case DESC_RATE6M:
2401 case DESC_RATE9M:
2402 case DESC_RATE12M:
2403 case DESC_RATE18M:
2404 case DESC_RATE24M:
2405 case DESC_RATE36M:
2406 case DESC_RATE48M:
2407 case DESC_RATE54M:
2408 rate_section = 1;
2409 break;
2410 case DESC_RATEMCS0:
2411 case DESC_RATEMCS1:
2412 case DESC_RATEMCS2:
2413 case DESC_RATEMCS3:
2414 case DESC_RATEMCS4:
2415 case DESC_RATEMCS5:
2416 case DESC_RATEMCS6:
2417 case DESC_RATEMCS7:
2418 rate_section = 2;
2419 break;
2420 case DESC_RATEMCS8:
2421 case DESC_RATEMCS9:
2422 case DESC_RATEMCS10:
2423 case DESC_RATEMCS11:
2424 case DESC_RATEMCS12:
2425 case DESC_RATEMCS13:
2426 case DESC_RATEMCS14:
2427 case DESC_RATEMCS15:
2428 rate_section = 3;
2429 break;
2430 case DESC_RATEVHT1SS_MCS0:
2431 case DESC_RATEVHT1SS_MCS1:
2432 case DESC_RATEVHT1SS_MCS2:
2433 case DESC_RATEVHT1SS_MCS3:
2434 case DESC_RATEVHT1SS_MCS4:
2435 case DESC_RATEVHT1SS_MCS5:
2436 case DESC_RATEVHT1SS_MCS6:
2437 case DESC_RATEVHT1SS_MCS7:
2438 case DESC_RATEVHT1SS_MCS8:
2439 case DESC_RATEVHT1SS_MCS9:
2440 rate_section = 4;
2441 break;
2442 case DESC_RATEVHT2SS_MCS0:
2443 case DESC_RATEVHT2SS_MCS1:
2444 case DESC_RATEVHT2SS_MCS2:
2445 case DESC_RATEVHT2SS_MCS3:
2446 case DESC_RATEVHT2SS_MCS4:
2447 case DESC_RATEVHT2SS_MCS5:
2448 case DESC_RATEVHT2SS_MCS6:
2449 case DESC_RATEVHT2SS_MCS7:
2450 case DESC_RATEVHT2SS_MCS8:
2451 case DESC_RATEVHT2SS_MCS9:
2452 rate_section = 5;
2453 break;
2454 default:
2455 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
2456 "Wrong rate 0x%x\n", rate);
2457 break;
2458 }
2459
2460 if (band_temp == BAND_ON_5G && rate_section == 0)
2461 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
2462 "Wrong rate 0x%x: No CCK in 5G Band\n", rate);
2463
2464 /*workaround for wrong index combination to obtain tx power limit,
2465 OFDM only exists in BW 20M*/
2466 if (rate_section == 1)
2467 bandwidth_temp = 0;
2468
2469 /*workaround for wrong index combination to obtain tx power limit,
2470 *HT on 80M will reference to HT on 40M
2471 */
2472 if ((rate_section == 2 || rate_section == 3) && band == BAND_ON_5G &&
2473 bandwidth_temp == 2)
2474 bandwidth_temp = 1;
2475
2476 if (band == BAND_ON_2_4G)
2477 channel_temp = _rtl8812ae_phy_get_chnl_idx_of_txpwr_lmt(hw,
2478 BAND_ON_2_4G, channel);
2479 else if (band == BAND_ON_5G)
2480 channel_temp = _rtl8812ae_phy_get_chnl_idx_of_txpwr_lmt(hw,
2481 BAND_ON_5G, channel);
2482 else if (band == BAND_ON_BOTH)
2483 ;/* BAND_ON_BOTH don't care temporarily */
2484
2485 if (band_temp == -1 || regulation == -1 || bandwidth_temp == -1 ||
2486 rate_section == -1 || channel_temp == -1) {
2487 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
2488 "Wrong index value to access power limit table [band %d][regulation %d][bandwidth %d][rf_path %d][rate_section %d][chnl %d]\n",
2489 band_temp, regulation, bandwidth_temp, rf_path,
2490 rate_section, channel_temp);
2491 return MAX_POWER_INDEX;
2492 }
2493
2494 bd = band_temp;
2495 regu = regulation;
2496 bdwidth = bandwidth_temp;
2497 sec = rate_section;
2498 chnl = channel_temp;
2499
2500 if (band == BAND_ON_2_4G) {
2501 char limits[10] = {0};
2502 u8 i;
2503
2504 for (i = 0; i < 4; ++i)
2505 limits[i] = rtlphy->txpwr_limit_2_4g[i][bdwidth]
2506 [sec][chnl][rf_path];
2507
2508 power_limit = (regulation == TXPWR_LMT_WW) ?
2509 _rtl8812ae_phy_get_world_wide_limit(limits) :
2510 rtlphy->txpwr_limit_2_4g[regu][bdwidth]
2511 [sec][chnl][rf_path];
2512 } else if (band == BAND_ON_5G) {
2513 char limits[10] = {0};
2514 u8 i;
2515
2516 for (i = 0; i < MAX_REGULATION_NUM; ++i)
2517 limits[i] = rtlphy->txpwr_limit_5g[i][bdwidth]
2518 [sec][chnl][rf_path];
2519
2520 power_limit = (regulation == TXPWR_LMT_WW) ?
2521 _rtl8812ae_phy_get_world_wide_limit(limits) :
2522 rtlphy->txpwr_limit_5g[regu][chnl]
2523 [sec][chnl][rf_path];
2524 } else {
2525 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2526 "No power limit table of the specified band\n");
2527 }
2528 return power_limit;
2529}
2530
2531static char _rtl8821ae_phy_get_txpower_by_rate(struct ieee80211_hw *hw,
2532 u8 band, u8 path, u8 rate)
2533{
2534 struct rtl_priv *rtlpriv = rtl_priv(hw);
2535 struct rtl_phy *rtlphy = &rtlpriv->phy;
2536 u8 shift = 0, rate_section, tx_num;
2537 char tx_pwr_diff = 0;
2538 char limit = 0;
2539
2540 rate_section = _rtl8821ae_phy_get_ratesection_intxpower_byrate(path, rate);
2541 tx_num = RF_TX_NUM_NONIMPLEMENT;
2542
2543 if (tx_num == RF_TX_NUM_NONIMPLEMENT) {
2544 if ((rate >= DESC_RATEMCS8 && rate <= DESC_RATEMCS15) ||
2545 (rate >= DESC_RATEVHT2SS_MCS2 && rate <= DESC_RATEVHT2SS_MCS9))
2546 tx_num = RF_2TX;
2547 else
2548 tx_num = RF_1TX;
2549 }
2550
2551 switch (rate) {
2552 case DESC_RATE1M:
2553 case DESC_RATE6M:
2554 case DESC_RATE24M:
2555 case DESC_RATEMCS0:
2556 case DESC_RATEMCS4:
2557 case DESC_RATEMCS8:
2558 case DESC_RATEMCS12:
2559 case DESC_RATEVHT1SS_MCS0:
2560 case DESC_RATEVHT1SS_MCS4:
2561 case DESC_RATEVHT1SS_MCS8:
2562 case DESC_RATEVHT2SS_MCS2:
2563 case DESC_RATEVHT2SS_MCS6:
2564 shift = 0;
2565 break;
2566 case DESC_RATE2M:
2567 case DESC_RATE9M:
2568 case DESC_RATE36M:
2569 case DESC_RATEMCS1:
2570 case DESC_RATEMCS5:
2571 case DESC_RATEMCS9:
2572 case DESC_RATEMCS13:
2573 case DESC_RATEVHT1SS_MCS1:
2574 case DESC_RATEVHT1SS_MCS5:
2575 case DESC_RATEVHT1SS_MCS9:
2576 case DESC_RATEVHT2SS_MCS3:
2577 case DESC_RATEVHT2SS_MCS7:
2578 shift = 8;
2579 break;
2580 case DESC_RATE5_5M:
2581 case DESC_RATE12M:
2582 case DESC_RATE48M:
2583 case DESC_RATEMCS2:
2584 case DESC_RATEMCS6:
2585 case DESC_RATEMCS10:
2586 case DESC_RATEMCS14:
2587 case DESC_RATEVHT1SS_MCS2:
2588 case DESC_RATEVHT1SS_MCS6:
2589 case DESC_RATEVHT2SS_MCS0:
2590 case DESC_RATEVHT2SS_MCS4:
2591 case DESC_RATEVHT2SS_MCS8:
2592 shift = 16;
2593 break;
2594 case DESC_RATE11M:
2595 case DESC_RATE18M:
2596 case DESC_RATE54M:
2597 case DESC_RATEMCS3:
2598 case DESC_RATEMCS7:
2599 case DESC_RATEMCS11:
2600 case DESC_RATEMCS15:
2601 case DESC_RATEVHT1SS_MCS3:
2602 case DESC_RATEVHT1SS_MCS7:
2603 case DESC_RATEVHT2SS_MCS1:
2604 case DESC_RATEVHT2SS_MCS5:
2605 case DESC_RATEVHT2SS_MCS9:
2606 shift = 24;
2607 break;
2608 default:
2609 RT_ASSERT(true, "Rate_Section is Illegal\n");
2610 break;
2611 }
2612
2613 tx_pwr_diff = (u8)(rtlphy->tx_power_by_rate_offset[band][path]
2614 [tx_num][rate_section] >> shift) & 0xff;
2615
2616 /* RegEnableTxPowerLimit == 1 for 8812a & 8821a */
2617 if (rtlpriv->efuse.eeprom_regulatory != 2) {
2618 limit = _rtl8812ae_phy_get_txpower_limit(hw, band,
2619 rtlphy->current_chan_bw, path, rate,
2620 rtlphy->current_channel);
2621
2622 if (rate == DESC_RATEVHT1SS_MCS8 || rate == DESC_RATEVHT1SS_MCS9 ||
2623 rate == DESC_RATEVHT2SS_MCS8 || rate == DESC_RATEVHT2SS_MCS9) {
2624 if (limit < 0) {
2625 if (tx_pwr_diff < (-limit))
2626 tx_pwr_diff = -limit;
2627 }
2628 } else {
2629 if (limit < 0)
2630 tx_pwr_diff = limit;
2631 else
2632 tx_pwr_diff = tx_pwr_diff > limit ? limit : tx_pwr_diff;
2633 }
2634 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
2635 "Maximum power by rate %d, final power by rate %d\n",
2636 limit, tx_pwr_diff);
2637 }
2638
2639 return tx_pwr_diff;
2640}
2641
2642static u8 _rtl8821ae_get_txpower_index(struct ieee80211_hw *hw, u8 path,
2643 u8 rate, u8 bandwidth, u8 channel)
2644{
2645 struct rtl_priv *rtlpriv = rtl_priv(hw);
2646 struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
2647 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
2648 u8 index = (channel - 1);
2649 u8 txpower = 0;
2650 bool in_24g = false;
2651 char powerdiff_byrate = 0;
2652
2653 if (((rtlhal->current_bandtype == BAND_ON_2_4G) &&
2654 (channel > 14 || channel < 1)) ||
2655 ((rtlhal->current_bandtype == BAND_ON_5G) && (channel <= 14))) {
2656 index = 0;
2657 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
2658 "Illegal channel!!\n");
2659 }
2660
2661 in_24g = _rtl8821ae_phy_get_chnl_index(channel, &index);
2662 if (in_24g) {
2663 if (RTL8821AE_RX_HAL_IS_CCK_RATE(rate))
2664 txpower = rtlefuse->txpwrlevel_cck[path][index];
2665 else if (DESC_RATE6M <= rate)
2666 txpower = rtlefuse->txpwrlevel_ht40_1s[path][index];
2667 else
2668 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD, "invalid rate\n");
2669
2670 if (DESC_RATE6M <= rate && rate <= DESC_RATE54M &&
2671 !RTL8821AE_RX_HAL_IS_CCK_RATE(rate))
2672 txpower += rtlefuse->txpwr_legacyhtdiff[path][TX_1S];
2673
2674 if (bandwidth == HT_CHANNEL_WIDTH_20) {
2675 if ((DESC_RATEMCS0 <= rate && rate <= DESC_RATEMCS15) ||
2676 (DESC_RATEVHT1SS_MCS0 <= rate && rate <= DESC_RATEVHT2SS_MCS9))
2677 txpower += rtlefuse->txpwr_ht20diff[path][TX_1S];
2678 if ((DESC_RATEMCS8 <= rate && rate <= DESC_RATEMCS15) ||
2679 (DESC_RATEVHT2SS_MCS0 <= rate && rate <= DESC_RATEVHT2SS_MCS9))
2680 txpower += rtlefuse->txpwr_ht20diff[path][TX_2S];
2681 } else if (bandwidth == HT_CHANNEL_WIDTH_20_40) {
2682 if ((DESC_RATEMCS0 <= rate && rate <= DESC_RATEMCS15) ||
2683 (DESC_RATEVHT1SS_MCS0 <= rate && rate <= DESC_RATEVHT2SS_MCS9))
2684 txpower += rtlefuse->txpwr_ht40diff[path][TX_1S];
2685 if ((DESC_RATEMCS8 <= rate && rate <= DESC_RATEMCS15) ||
2686 (DESC_RATEVHT2SS_MCS0 <= rate && rate <= DESC_RATEVHT2SS_MCS9))
2687 txpower += rtlefuse->txpwr_ht40diff[path][TX_2S];
2688 } else if (bandwidth == HT_CHANNEL_WIDTH_80) {
2689 if ((DESC_RATEMCS0 <= rate && rate <= DESC_RATEMCS15) ||
2690 (DESC_RATEVHT1SS_MCS0 <= rate &&
2691 rate <= DESC_RATEVHT2SS_MCS9))
2692 txpower += rtlefuse->txpwr_ht40diff[path][TX_1S];
2693 if ((DESC_RATEMCS8 <= rate && rate <= DESC_RATEMCS15) ||
2694 (DESC_RATEVHT2SS_MCS0 <= rate &&
2695 rate <= DESC_RATEVHT2SS_MCS9))
2696 txpower += rtlefuse->txpwr_ht40diff[path][TX_2S];
2697 }
2698 } else {
2699 if (DESC_RATE6M <= rate)
2700 txpower = rtlefuse->txpwr_5g_bw40base[path][index];
2701 else
2702 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_WARNING,
2703 "INVALID Rate.\n");
2704
2705 if (DESC_RATE6M <= rate && rate <= DESC_RATE54M &&
2706 !RTL8821AE_RX_HAL_IS_CCK_RATE(rate))
2707 txpower += rtlefuse->txpwr_5g_ofdmdiff[path][TX_1S];
2708
2709 if (bandwidth == HT_CHANNEL_WIDTH_20) {
2710 if ((DESC_RATEMCS0 <= rate && rate <= DESC_RATEMCS15) ||
2711 (DESC_RATEVHT1SS_MCS0 <= rate &&
2712 rate <= DESC_RATEVHT2SS_MCS9))
2713 txpower += rtlefuse->txpwr_5g_bw20diff[path][TX_1S];
2714 if ((DESC_RATEMCS8 <= rate && rate <= DESC_RATEMCS15) ||
2715 (DESC_RATEVHT2SS_MCS0 <= rate &&
2716 rate <= DESC_RATEVHT2SS_MCS9))
2717 txpower += rtlefuse->txpwr_5g_bw20diff[path][TX_2S];
2718 } else if (bandwidth == HT_CHANNEL_WIDTH_20_40) {
2719 if ((DESC_RATEMCS0 <= rate && rate <= DESC_RATEMCS15) ||
2720 (DESC_RATEVHT1SS_MCS0 <= rate &&
2721 rate <= DESC_RATEVHT2SS_MCS9))
2722 txpower += rtlefuse->txpwr_5g_bw40diff[path][TX_1S];
2723 if ((DESC_RATEMCS8 <= rate && rate <= DESC_RATEMCS15) ||
2724 (DESC_RATEVHT2SS_MCS0 <= rate &&
2725 rate <= DESC_RATEVHT2SS_MCS9))
2726 txpower += rtlefuse->txpwr_5g_bw40diff[path][TX_2S];
2727 } else if (bandwidth == HT_CHANNEL_WIDTH_80) {
2728 u8 channel_5g_80m[CHANNEL_MAX_NUMBER_5G_80M] = {
2729 42, 58, 106, 122, 138, 155, 171
2730 };
2731 u8 i;
2732
2733 for (i = 0; i < sizeof(channel_5g_80m) / sizeof(u8); ++i)
2734 if (channel_5g_80m[i] == channel)
2735 index = i;
2736
2737 if ((DESC_RATEMCS0 <= rate && rate <= DESC_RATEMCS15) ||
2738 (DESC_RATEVHT1SS_MCS0 <= rate &&
2739 rate <= DESC_RATEVHT2SS_MCS9))
2740 txpower = rtlefuse->txpwr_5g_bw80base[path][index]
2741 + rtlefuse->txpwr_5g_bw80diff[path][TX_1S];
2742 if ((DESC_RATEMCS8 <= rate && rate <= DESC_RATEMCS15) ||
2743 (DESC_RATEVHT2SS_MCS0 <= rate &&
2744 rate <= DESC_RATEVHT2SS_MCS9))
2745 txpower = rtlefuse->txpwr_5g_bw80base[path][index]
2746 + rtlefuse->txpwr_5g_bw80diff[path][TX_1S]
2747 + rtlefuse->txpwr_5g_bw80diff[path][TX_2S];
2748 }
2749 }
2750 if (rtlefuse->eeprom_regulatory != 2)
2751 powerdiff_byrate =
2752 _rtl8821ae_phy_get_txpower_by_rate(hw, (u8)(!in_24g),
2753 path, rate);
2754
2755 if (rate == DESC_RATEVHT1SS_MCS8 || rate == DESC_RATEVHT1SS_MCS9 ||
2756 rate == DESC_RATEVHT2SS_MCS8 || rate == DESC_RATEVHT2SS_MCS9)
2757 txpower -= powerdiff_byrate;
2758 else
2759 txpower += powerdiff_byrate;
2760
2761 if (rate > DESC_RATE11M)
2762 txpower += rtlpriv->dm.remnant_ofdm_swing_idx[path];
2763 else
2764 txpower += rtlpriv->dm.remnant_cck_idx;
2765
2766 if (txpower > MAX_POWER_INDEX)
2767 txpower = MAX_POWER_INDEX;
2768
2769 return txpower;
2770}
2771
2772static void _rtl8821ae_phy_set_txpower_index(struct ieee80211_hw *hw,
2773 u8 power_index, u8 path, u8 rate)
2774{
2775 struct rtl_priv *rtlpriv = rtl_priv(hw);
2776
2777 if (path == RF90_PATH_A) {
2778 switch (rate) {
2779 case DESC_RATE1M:
2780 rtl_set_bbreg(hw, RTXAGC_A_CCK11_CCK1,
2781 MASKBYTE0, power_index);
2782 break;
2783 case DESC_RATE2M:
2784 rtl_set_bbreg(hw, RTXAGC_A_CCK11_CCK1,
2785 MASKBYTE1, power_index);
2786 break;
2787 case DESC_RATE5_5M:
2788 rtl_set_bbreg(hw, RTXAGC_A_CCK11_CCK1,
2789 MASKBYTE2, power_index);
2790 break;
2791 case DESC_RATE11M:
2792 rtl_set_bbreg(hw, RTXAGC_A_CCK11_CCK1,
2793 MASKBYTE3, power_index);
2794 break;
2795 case DESC_RATE6M:
2796 rtl_set_bbreg(hw, RTXAGC_A_OFDM18_OFDM6,
2797 MASKBYTE0, power_index);
2798 break;
2799 case DESC_RATE9M:
2800 rtl_set_bbreg(hw, RTXAGC_A_OFDM18_OFDM6,
2801 MASKBYTE1, power_index);
2802 break;
2803 case DESC_RATE12M:
2804 rtl_set_bbreg(hw, RTXAGC_A_OFDM18_OFDM6,
2805 MASKBYTE2, power_index);
2806 break;
2807 case DESC_RATE18M:
2808 rtl_set_bbreg(hw, RTXAGC_A_OFDM18_OFDM6,
2809 MASKBYTE3, power_index);
2810 break;
2811 case DESC_RATE24M:
2812 rtl_set_bbreg(hw, RTXAGC_A_OFDM54_OFDM24,
2813 MASKBYTE0, power_index);
2814 break;
2815 case DESC_RATE36M:
2816 rtl_set_bbreg(hw, RTXAGC_A_OFDM54_OFDM24,
2817 MASKBYTE1, power_index);
2818 break;
2819 case DESC_RATE48M:
2820 rtl_set_bbreg(hw, RTXAGC_A_OFDM54_OFDM24,
2821 MASKBYTE2, power_index);
2822 break;
2823 case DESC_RATE54M:
2824 rtl_set_bbreg(hw, RTXAGC_A_OFDM54_OFDM24,
2825 MASKBYTE3, power_index);
2826 break;
2827 case DESC_RATEMCS0:
2828 rtl_set_bbreg(hw, RTXAGC_A_MCS03_MCS00,
2829 MASKBYTE0, power_index);
2830 break;
2831 case DESC_RATEMCS1:
2832 rtl_set_bbreg(hw, RTXAGC_A_MCS03_MCS00,
2833 MASKBYTE1, power_index);
2834 break;
2835 case DESC_RATEMCS2:
2836 rtl_set_bbreg(hw, RTXAGC_A_MCS03_MCS00,
2837 MASKBYTE2, power_index);
2838 break;
2839 case DESC_RATEMCS3:
2840 rtl_set_bbreg(hw, RTXAGC_A_MCS03_MCS00,
2841 MASKBYTE3, power_index);
2842 break;
2843 case DESC_RATEMCS4:
2844 rtl_set_bbreg(hw, RTXAGC_A_MCS07_MCS04,
2845 MASKBYTE0, power_index);
2846 break;
2847 case DESC_RATEMCS5:
2848 rtl_set_bbreg(hw, RTXAGC_A_MCS07_MCS04,
2849 MASKBYTE1, power_index);
2850 break;
2851 case DESC_RATEMCS6:
2852 rtl_set_bbreg(hw, RTXAGC_A_MCS07_MCS04,
2853 MASKBYTE2, power_index);
2854 break;
2855 case DESC_RATEMCS7:
2856 rtl_set_bbreg(hw, RTXAGC_A_MCS07_MCS04,
2857 MASKBYTE3, power_index);
2858 break;
2859 case DESC_RATEMCS8:
2860 rtl_set_bbreg(hw, RTXAGC_A_MCS11_MCS08,
2861 MASKBYTE0, power_index);
2862 break;
2863 case DESC_RATEMCS9:
2864 rtl_set_bbreg(hw, RTXAGC_A_MCS11_MCS08,
2865 MASKBYTE1, power_index);
2866 break;
2867 case DESC_RATEMCS10:
2868 rtl_set_bbreg(hw, RTXAGC_A_MCS11_MCS08,
2869 MASKBYTE2, power_index);
2870 break;
2871 case DESC_RATEMCS11:
2872 rtl_set_bbreg(hw, RTXAGC_A_MCS11_MCS08,
2873 MASKBYTE3, power_index);
2874 break;
2875 case DESC_RATEMCS12:
2876 rtl_set_bbreg(hw, RTXAGC_A_MCS15_MCS12,
2877 MASKBYTE0, power_index);
2878 break;
2879 case DESC_RATEMCS13:
2880 rtl_set_bbreg(hw, RTXAGC_A_MCS15_MCS12,
2881 MASKBYTE1, power_index);
2882 break;
2883 case DESC_RATEMCS14:
2884 rtl_set_bbreg(hw, RTXAGC_A_MCS15_MCS12,
2885 MASKBYTE2, power_index);
2886 break;
2887 case DESC_RATEMCS15:
2888 rtl_set_bbreg(hw, RTXAGC_A_MCS15_MCS12,
2889 MASKBYTE3, power_index);
2890 break;
2891 case DESC_RATEVHT1SS_MCS0:
2892 rtl_set_bbreg(hw, RTXAGC_A_NSS1INDEX3_NSS1INDEX0,
2893 MASKBYTE0, power_index);
2894 break;
2895 case DESC_RATEVHT1SS_MCS1:
2896 rtl_set_bbreg(hw, RTXAGC_A_NSS1INDEX3_NSS1INDEX0,
2897 MASKBYTE1, power_index);
2898 break;
2899 case DESC_RATEVHT1SS_MCS2:
2900 rtl_set_bbreg(hw, RTXAGC_A_NSS1INDEX3_NSS1INDEX0,
2901 MASKBYTE2, power_index);
2902 break;
2903 case DESC_RATEVHT1SS_MCS3:
2904 rtl_set_bbreg(hw, RTXAGC_A_NSS1INDEX3_NSS1INDEX0,
2905 MASKBYTE3, power_index);
2906 break;
2907 case DESC_RATEVHT1SS_MCS4:
2908 rtl_set_bbreg(hw, RTXAGC_A_NSS1INDEX7_NSS1INDEX4,
2909 MASKBYTE0, power_index);
2910 break;
2911 case DESC_RATEVHT1SS_MCS5:
2912 rtl_set_bbreg(hw, RTXAGC_A_NSS1INDEX7_NSS1INDEX4,
2913 MASKBYTE1, power_index);
2914 break;
2915 case DESC_RATEVHT1SS_MCS6:
2916 rtl_set_bbreg(hw, RTXAGC_A_NSS1INDEX7_NSS1INDEX4,
2917 MASKBYTE2, power_index);
2918 break;
2919 case DESC_RATEVHT1SS_MCS7:
2920 rtl_set_bbreg(hw, RTXAGC_A_NSS1INDEX7_NSS1INDEX4,
2921 MASKBYTE3, power_index);
2922 break;
2923 case DESC_RATEVHT1SS_MCS8:
2924 rtl_set_bbreg(hw, RTXAGC_A_NSS2INDEX1_NSS1INDEX8,
2925 MASKBYTE0, power_index);
2926 break;
2927 case DESC_RATEVHT1SS_MCS9:
2928 rtl_set_bbreg(hw, RTXAGC_A_NSS2INDEX1_NSS1INDEX8,
2929 MASKBYTE1, power_index);
2930 break;
2931 case DESC_RATEVHT2SS_MCS0:
2932 rtl_set_bbreg(hw, RTXAGC_A_NSS2INDEX1_NSS1INDEX8,
2933 MASKBYTE2, power_index);
2934 break;
2935 case DESC_RATEVHT2SS_MCS1:
2936 rtl_set_bbreg(hw, RTXAGC_A_NSS2INDEX1_NSS1INDEX8,
2937 MASKBYTE3, power_index);
2938 break;
2939 case DESC_RATEVHT2SS_MCS2:
2940 rtl_set_bbreg(hw, RTXAGC_A_NSS2INDEX5_NSS2INDEX2,
2941 MASKBYTE0, power_index);
2942 break;
2943 case DESC_RATEVHT2SS_MCS3:
2944 rtl_set_bbreg(hw, RTXAGC_A_NSS2INDEX5_NSS2INDEX2,
2945 MASKBYTE1, power_index);
2946 break;
2947 case DESC_RATEVHT2SS_MCS4:
2948 rtl_set_bbreg(hw, RTXAGC_A_NSS2INDEX5_NSS2INDEX2,
2949 MASKBYTE2, power_index);
2950 break;
2951 case DESC_RATEVHT2SS_MCS5:
2952 rtl_set_bbreg(hw, RTXAGC_A_NSS2INDEX5_NSS2INDEX2,
2953 MASKBYTE3, power_index);
2954 break;
2955 case DESC_RATEVHT2SS_MCS6:
2956 rtl_set_bbreg(hw, RTXAGC_A_NSS2INDEX9_NSS2INDEX6,
2957 MASKBYTE0, power_index);
2958 break;
2959 case DESC_RATEVHT2SS_MCS7:
2960 rtl_set_bbreg(hw, RTXAGC_A_NSS2INDEX9_NSS2INDEX6,
2961 MASKBYTE1, power_index);
2962 break;
2963 case DESC_RATEVHT2SS_MCS8:
2964 rtl_set_bbreg(hw, RTXAGC_A_NSS2INDEX9_NSS2INDEX6,
2965 MASKBYTE2, power_index);
2966 break;
2967 case DESC_RATEVHT2SS_MCS9:
2968 rtl_set_bbreg(hw, RTXAGC_A_NSS2INDEX9_NSS2INDEX6,
2969 MASKBYTE3, power_index);
2970 break;
2971 default:
2972 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
2973 "Invalid Rate!!\n");
2974 break;
2975 }
2976 } else if (path == RF90_PATH_B) {
2977 switch (rate) {
2978 case DESC_RATE1M:
2979 rtl_set_bbreg(hw, RTXAGC_B_CCK11_CCK1,
2980 MASKBYTE0, power_index);
2981 break;
2982 case DESC_RATE2M:
2983 rtl_set_bbreg(hw, RTXAGC_B_CCK11_CCK1,
2984 MASKBYTE1, power_index);
2985 break;
2986 case DESC_RATE5_5M:
2987 rtl_set_bbreg(hw, RTXAGC_B_CCK11_CCK1,
2988 MASKBYTE2, power_index);
2989 break;
2990 case DESC_RATE11M:
2991 rtl_set_bbreg(hw, RTXAGC_B_CCK11_CCK1,
2992 MASKBYTE3, power_index);
2993 break;
2994 case DESC_RATE6M:
2995 rtl_set_bbreg(hw, RTXAGC_B_OFDM18_OFDM6,
2996 MASKBYTE0, power_index);
2997 break;
2998 case DESC_RATE9M:
2999 rtl_set_bbreg(hw, RTXAGC_B_OFDM18_OFDM6,
3000 MASKBYTE1, power_index);
3001 break;
3002 case DESC_RATE12M:
3003 rtl_set_bbreg(hw, RTXAGC_B_OFDM18_OFDM6,
3004 MASKBYTE2, power_index);
3005 break;
3006 case DESC_RATE18M:
3007 rtl_set_bbreg(hw, RTXAGC_B_OFDM18_OFDM6,
3008 MASKBYTE3, power_index);
3009 break;
3010 case DESC_RATE24M:
3011 rtl_set_bbreg(hw, RTXAGC_B_OFDM54_OFDM24,
3012 MASKBYTE0, power_index);
3013 break;
3014 case DESC_RATE36M:
3015 rtl_set_bbreg(hw, RTXAGC_B_OFDM54_OFDM24,
3016 MASKBYTE1, power_index);
3017 break;
3018 case DESC_RATE48M:
3019 rtl_set_bbreg(hw, RTXAGC_B_OFDM54_OFDM24,
3020 MASKBYTE2, power_index);
3021 break;
3022 case DESC_RATE54M:
3023 rtl_set_bbreg(hw, RTXAGC_B_OFDM54_OFDM24,
3024 MASKBYTE3, power_index);
3025 break;
3026 case DESC_RATEMCS0:
3027 rtl_set_bbreg(hw, RTXAGC_B_MCS03_MCS00,
3028 MASKBYTE0, power_index);
3029 break;
3030 case DESC_RATEMCS1:
3031 rtl_set_bbreg(hw, RTXAGC_B_MCS03_MCS00,
3032 MASKBYTE1, power_index);
3033 break;
3034 case DESC_RATEMCS2:
3035 rtl_set_bbreg(hw, RTXAGC_B_MCS03_MCS00,
3036 MASKBYTE2, power_index);
3037 break;
3038 case DESC_RATEMCS3:
3039 rtl_set_bbreg(hw, RTXAGC_B_MCS03_MCS00,
3040 MASKBYTE3, power_index);
3041 break;
3042 case DESC_RATEMCS4:
3043 rtl_set_bbreg(hw, RTXAGC_B_MCS07_MCS04,
3044 MASKBYTE0, power_index);
3045 break;
3046 case DESC_RATEMCS5:
3047 rtl_set_bbreg(hw, RTXAGC_B_MCS07_MCS04,
3048 MASKBYTE1, power_index);
3049 break;
3050 case DESC_RATEMCS6:
3051 rtl_set_bbreg(hw, RTXAGC_B_MCS07_MCS04,
3052 MASKBYTE2, power_index);
3053 break;
3054 case DESC_RATEMCS7:
3055 rtl_set_bbreg(hw, RTXAGC_B_MCS07_MCS04,
3056 MASKBYTE3, power_index);
3057 break;
3058 case DESC_RATEMCS8:
3059 rtl_set_bbreg(hw, RTXAGC_B_MCS11_MCS08,
3060 MASKBYTE0, power_index);
3061 break;
3062 case DESC_RATEMCS9:
3063 rtl_set_bbreg(hw, RTXAGC_B_MCS11_MCS08,
3064 MASKBYTE1, power_index);
3065 break;
3066 case DESC_RATEMCS10:
3067 rtl_set_bbreg(hw, RTXAGC_B_MCS11_MCS08,
3068 MASKBYTE2, power_index);
3069 break;
3070 case DESC_RATEMCS11:
3071 rtl_set_bbreg(hw, RTXAGC_B_MCS11_MCS08,
3072 MASKBYTE3, power_index);
3073 break;
3074 case DESC_RATEMCS12:
3075 rtl_set_bbreg(hw, RTXAGC_B_MCS15_MCS12,
3076 MASKBYTE0, power_index);
3077 break;
3078 case DESC_RATEMCS13:
3079 rtl_set_bbreg(hw, RTXAGC_B_MCS15_MCS12,
3080 MASKBYTE1, power_index);
3081 break;
3082 case DESC_RATEMCS14:
3083 rtl_set_bbreg(hw, RTXAGC_B_MCS15_MCS12,
3084 MASKBYTE2, power_index);
3085 break;
3086 case DESC_RATEMCS15:
3087 rtl_set_bbreg(hw, RTXAGC_B_MCS15_MCS12,
3088 MASKBYTE3, power_index);
3089 break;
3090 case DESC_RATEVHT1SS_MCS0:
3091 rtl_set_bbreg(hw, RTXAGC_B_NSS1INDEX3_NSS1INDEX0,
3092 MASKBYTE0, power_index);
3093 break;
3094 case DESC_RATEVHT1SS_MCS1:
3095 rtl_set_bbreg(hw, RTXAGC_B_NSS1INDEX3_NSS1INDEX0,
3096 MASKBYTE1, power_index);
3097 break;
3098 case DESC_RATEVHT1SS_MCS2:
3099 rtl_set_bbreg(hw, RTXAGC_B_NSS1INDEX3_NSS1INDEX0,
3100 MASKBYTE2, power_index);
3101 break;
3102 case DESC_RATEVHT1SS_MCS3:
3103 rtl_set_bbreg(hw, RTXAGC_B_NSS1INDEX3_NSS1INDEX0,
3104 MASKBYTE3, power_index);
3105 break;
3106 case DESC_RATEVHT1SS_MCS4:
3107 rtl_set_bbreg(hw, RTXAGC_B_NSS1INDEX7_NSS1INDEX4,
3108 MASKBYTE0, power_index);
3109 break;
3110 case DESC_RATEVHT1SS_MCS5:
3111 rtl_set_bbreg(hw, RTXAGC_B_NSS1INDEX7_NSS1INDEX4,
3112 MASKBYTE1, power_index);
3113 break;
3114 case DESC_RATEVHT1SS_MCS6:
3115 rtl_set_bbreg(hw, RTXAGC_B_NSS1INDEX7_NSS1INDEX4,
3116 MASKBYTE2, power_index);
3117 break;
3118 case DESC_RATEVHT1SS_MCS7:
3119 rtl_set_bbreg(hw, RTXAGC_B_NSS1INDEX7_NSS1INDEX4,
3120 MASKBYTE3, power_index);
3121 break;
3122 case DESC_RATEVHT1SS_MCS8:
3123 rtl_set_bbreg(hw, RTXAGC_B_NSS2INDEX1_NSS1INDEX8,
3124 MASKBYTE0, power_index);
3125 break;
3126 case DESC_RATEVHT1SS_MCS9:
3127 rtl_set_bbreg(hw, RTXAGC_B_NSS2INDEX1_NSS1INDEX8,
3128 MASKBYTE1, power_index);
3129 break;
3130 case DESC_RATEVHT2SS_MCS0:
3131 rtl_set_bbreg(hw, RTXAGC_B_NSS2INDEX1_NSS1INDEX8,
3132 MASKBYTE2, power_index);
3133 break;
3134 case DESC_RATEVHT2SS_MCS1:
3135 rtl_set_bbreg(hw, RTXAGC_B_NSS2INDEX1_NSS1INDEX8,
3136 MASKBYTE3, power_index);
3137 break;
3138 case DESC_RATEVHT2SS_MCS2:
3139 rtl_set_bbreg(hw, RTXAGC_B_NSS2INDEX5_NSS2INDEX2,
3140 MASKBYTE0, power_index);
3141 break;
3142 case DESC_RATEVHT2SS_MCS3:
3143 rtl_set_bbreg(hw, RTXAGC_B_NSS2INDEX5_NSS2INDEX2,
3144 MASKBYTE1, power_index);
3145 break;
3146 case DESC_RATEVHT2SS_MCS4:
3147 rtl_set_bbreg(hw, RTXAGC_B_NSS2INDEX5_NSS2INDEX2,
3148 MASKBYTE2, power_index);
3149 break;
3150 case DESC_RATEVHT2SS_MCS5:
3151 rtl_set_bbreg(hw, RTXAGC_B_NSS2INDEX5_NSS2INDEX2,
3152 MASKBYTE3, power_index);
3153 break;
3154 case DESC_RATEVHT2SS_MCS6:
3155 rtl_set_bbreg(hw, RTXAGC_B_NSS2INDEX9_NSS2INDEX6,
3156 MASKBYTE0, power_index);
3157 break;
3158 case DESC_RATEVHT2SS_MCS7:
3159 rtl_set_bbreg(hw, RTXAGC_B_NSS2INDEX9_NSS2INDEX6,
3160 MASKBYTE1, power_index);
3161 break;
3162 case DESC_RATEVHT2SS_MCS8:
3163 rtl_set_bbreg(hw, RTXAGC_B_NSS2INDEX9_NSS2INDEX6,
3164 MASKBYTE2, power_index);
3165 break;
3166 case DESC_RATEVHT2SS_MCS9:
3167 rtl_set_bbreg(hw, RTXAGC_B_NSS2INDEX9_NSS2INDEX6,
3168 MASKBYTE3, power_index);
3169 break;
3170 default:
3171 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
3172 "Invalid Rate!!\n");
3173 break;
3174 }
3175 } else {
3176 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
3177 "Invalid RFPath!!\n");
3178 }
3179}
3180
3181static void _rtl8821ae_phy_set_txpower_level_by_path(struct ieee80211_hw *hw,
3182 u8 *array, u8 path,
3183 u8 channel, u8 size)
3184{
3185 struct rtl_priv *rtlpriv = rtl_priv(hw);
3186 struct rtl_phy *rtlphy = &rtlpriv->phy;
3187 u8 i;
3188 u8 power_index;
3189
3190 for (i = 0; i < size; i++) {
3191 power_index =
3192 _rtl8821ae_get_txpower_index(hw, path, array[i],
3193 rtlphy->current_chan_bw,
3194 channel);
3195 _rtl8821ae_phy_set_txpower_index(hw, power_index, path,
3196 array[i]);
3197 }
3198}
3199
3200static void _rtl8821ae_phy_txpower_training_by_path(struct ieee80211_hw *hw,
3201 u8 bw, u8 channel, u8 path)
3202{
3203 struct rtl_priv *rtlpriv = rtl_priv(hw);
3204 struct rtl_phy *rtlphy = &rtlpriv->phy;
3205
3206 u8 i;
3207 u32 power_level, data, offset;
3208
3209 if (path >= rtlphy->num_total_rfpath)
3210 return;
3211
3212 data = 0;
3213 if (path == RF90_PATH_A) {
3214 power_level =
3215 _rtl8821ae_get_txpower_index(hw, RF90_PATH_A,
3216 DESC_RATEMCS7, bw, channel);
3217 offset = RA_TXPWRTRAING;
3218 } else {
3219 power_level =
3220 _rtl8821ae_get_txpower_index(hw, RF90_PATH_B,
3221 DESC_RATEMCS7, bw, channel);
3222 offset = RB_TXPWRTRAING;
3223 }
3224
3225 for (i = 0; i < 3; i++) {
3226 if (i == 0)
3227 power_level = power_level - 10;
3228 else if (i == 1)
3229 power_level = power_level - 8;
3230 else
3231 power_level = power_level - 6;
3232
3233 data |= (((power_level > 2) ? (power_level) : 2) << (i * 8));
3234 }
3235 rtl_set_bbreg(hw, offset, 0xffffff, data);
3236}
3237
3238void rtl8821ae_phy_set_txpower_level_by_path(struct ieee80211_hw *hw,
3239 u8 channel, u8 path)
3240{
3241 /* struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw)); */
3242 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
3243 struct rtl_priv *rtlpriv = rtl_priv(hw);
3244 struct rtl_phy *rtlphy = &rtlpriv->phy;
3245 u8 cck_rates[] = {DESC_RATE1M, DESC_RATE2M, DESC_RATE5_5M,
3246 DESC_RATE11M};
3247 u8 sizes_of_cck_retes = 4;
3248 u8 ofdm_rates[] = {DESC_RATE6M, DESC_RATE9M, DESC_RATE12M,
3249 DESC_RATE18M, DESC_RATE24M, DESC_RATE36M,
3250 DESC_RATE48M, DESC_RATE54M};
3251 u8 sizes_of_ofdm_retes = 8;
3252 u8 ht_rates_1t[] = {DESC_RATEMCS0, DESC_RATEMCS1, DESC_RATEMCS2,
3253 DESC_RATEMCS3, DESC_RATEMCS4, DESC_RATEMCS5,
3254 DESC_RATEMCS6, DESC_RATEMCS7};
3255 u8 sizes_of_ht_retes_1t = 8;
3256 u8 ht_rates_2t[] = {DESC_RATEMCS8, DESC_RATEMCS9,
3257 DESC_RATEMCS10, DESC_RATEMCS11,
3258 DESC_RATEMCS12, DESC_RATEMCS13,
3259 DESC_RATEMCS14, DESC_RATEMCS15};
3260 u8 sizes_of_ht_retes_2t = 8;
3261 u8 vht_rates_1t[] = {DESC_RATEVHT1SS_MCS0, DESC_RATEVHT1SS_MCS1,
3262 DESC_RATEVHT1SS_MCS2, DESC_RATEVHT1SS_MCS3,
3263 DESC_RATEVHT1SS_MCS4, DESC_RATEVHT1SS_MCS5,
3264 DESC_RATEVHT1SS_MCS6, DESC_RATEVHT1SS_MCS7,
3265 DESC_RATEVHT1SS_MCS8, DESC_RATEVHT1SS_MCS9};
3266 u8 vht_rates_2t[] = {DESC_RATEVHT2SS_MCS0, DESC_RATEVHT2SS_MCS1,
3267 DESC_RATEVHT2SS_MCS2, DESC_RATEVHT2SS_MCS3,
3268 DESC_RATEVHT2SS_MCS4, DESC_RATEVHT2SS_MCS5,
3269 DESC_RATEVHT2SS_MCS6, DESC_RATEVHT2SS_MCS7,
3270 DESC_RATEVHT2SS_MCS8, DESC_RATEVHT2SS_MCS9};
3271 u8 sizes_of_vht_retes = 10;
3272
3273 if (rtlhal->current_bandtype == BAND_ON_2_4G)
3274 _rtl8821ae_phy_set_txpower_level_by_path(hw, cck_rates, path, channel,
3275 sizes_of_cck_retes);
3276
3277 _rtl8821ae_phy_set_txpower_level_by_path(hw, ofdm_rates, path, channel,
3278 sizes_of_ofdm_retes);
3279 _rtl8821ae_phy_set_txpower_level_by_path(hw, ht_rates_1t, path, channel,
3280 sizes_of_ht_retes_1t);
3281 _rtl8821ae_phy_set_txpower_level_by_path(hw, vht_rates_1t, path, channel,
3282 sizes_of_vht_retes);
3283
3284 if (rtlphy->num_total_rfpath >= 2) {
3285 _rtl8821ae_phy_set_txpower_level_by_path(hw, ht_rates_2t, path,
3286 channel,
3287 sizes_of_ht_retes_2t);
3288 _rtl8821ae_phy_set_txpower_level_by_path(hw, vht_rates_2t, path,
3289 channel,
3290 sizes_of_vht_retes);
3291 }
3292
3293 _rtl8821ae_phy_txpower_training_by_path(hw, rtlphy->current_chan_bw,
3294 channel, path);
3295}
3296
3297/*just in case, write txpower in DW, to reduce time*/
3298void rtl8821ae_phy_set_txpower_level(struct ieee80211_hw *hw, u8 channel)
3299{
3300 struct rtl_priv *rtlpriv = rtl_priv(hw);
3301 struct rtl_phy *rtlphy = &rtlpriv->phy;
3302 u8 path = 0;
3303
3304 for (path = RF90_PATH_A; path < rtlphy->num_total_rfpath; ++path)
3305 rtl8821ae_phy_set_txpower_level_by_path(hw, channel, path);
3306}
3307
3308static long _rtl8821ae_phy_txpwr_idx_to_dbm(struct ieee80211_hw *hw,
3309 enum wireless_mode wirelessmode,
3310 u8 txpwridx)
3311{
3312 long offset;
3313 long pwrout_dbm;
3314
3315 switch (wirelessmode) {
3316 case WIRELESS_MODE_B:
3317 offset = -7;
3318 break;
3319 case WIRELESS_MODE_G:
3320 case WIRELESS_MODE_N_24G:
3321 offset = -8;
3322 break;
3323 default:
3324 offset = -8;
3325 break;
3326 }
3327 pwrout_dbm = txpwridx / 2 + offset;
3328 return pwrout_dbm;
3329}
3330
3331void rtl8821ae_phy_scan_operation_backup(struct ieee80211_hw *hw, u8 operation)
3332{
3333 struct rtl_priv *rtlpriv = rtl_priv(hw);
3334 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
3335 enum io_type iotype = IO_CMD_PAUSE_BAND0_DM_BY_SCAN;
3336
3337 if (!is_hal_stop(rtlhal)) {
3338 switch (operation) {
3339 case SCAN_OPT_BACKUP_BAND0:
3340 iotype = IO_CMD_PAUSE_BAND0_DM_BY_SCAN;
3341 rtlpriv->cfg->ops->set_hw_reg(hw,
3342 HW_VAR_IO_CMD,
3343 (u8 *)&iotype);
3344
3345 break;
3346 case SCAN_OPT_BACKUP_BAND1:
3347 iotype = IO_CMD_PAUSE_BAND1_DM_BY_SCAN;
3348 rtlpriv->cfg->ops->set_hw_reg(hw,
3349 HW_VAR_IO_CMD,
3350 (u8 *)&iotype);
3351
3352 break;
3353 case SCAN_OPT_RESTORE:
3354 iotype = IO_CMD_RESUME_DM_BY_SCAN;
3355 rtlpriv->cfg->ops->set_hw_reg(hw,
3356 HW_VAR_IO_CMD,
3357 (u8 *)&iotype);
3358 break;
3359 default:
3360 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
3361 "Unknown Scan Backup operation.\n");
3362 break;
3363 }
3364 }
3365}
3366
3367static void _rtl8821ae_phy_set_reg_bw(struct rtl_priv *rtlpriv, u8 bw)
3368{
3369 u16 reg_rf_mode_bw, tmp = 0;
3370
3371 reg_rf_mode_bw = rtl_read_word(rtlpriv, REG_TRXPTCL_CTL);
3372 switch (bw) {
3373 case HT_CHANNEL_WIDTH_20:
3374 rtl_write_word(rtlpriv, REG_TRXPTCL_CTL, reg_rf_mode_bw & 0xFE7F);
3375 break;
3376 case HT_CHANNEL_WIDTH_20_40:
3377 tmp = reg_rf_mode_bw | BIT(7);
3378 rtl_write_word(rtlpriv, REG_TRXPTCL_CTL, tmp & 0xFEFF);
3379 break;
3380 case HT_CHANNEL_WIDTH_80:
3381 tmp = reg_rf_mode_bw | BIT(8);
3382 rtl_write_word(rtlpriv, REG_TRXPTCL_CTL, tmp & 0xFF7F);
3383 break;
3384 default:
3385 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING, "unknown Bandwidth: 0x%x\n", bw);
3386 break;
3387 }
3388}
3389
3390static u8 _rtl8821ae_phy_get_secondary_chnl(struct rtl_priv *rtlpriv)
3391{
3392 struct rtl_phy *rtlphy = &rtlpriv->phy;
3393 struct rtl_mac *mac = rtl_mac(rtlpriv);
3394 u8 sc_set_40 = 0, sc_set_20 = 0;
3395
3396 if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_80) {
3397 if (mac->cur_80_prime_sc == PRIME_CHNL_OFFSET_LOWER)
3398 sc_set_40 = VHT_DATA_SC_40_LOWER_OF_80MHZ;
3399 else if (mac->cur_80_prime_sc == PRIME_CHNL_OFFSET_UPPER)
3400 sc_set_40 = VHT_DATA_SC_40_UPPER_OF_80MHZ;
3401 else
3402 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
3403 "SCMapping: Not Correct Primary40MHz Setting\n");
3404
3405 if ((mac->cur_40_prime_sc == PRIME_CHNL_OFFSET_LOWER) &&
3406 (mac->cur_80_prime_sc == HAL_PRIME_CHNL_OFFSET_LOWER))
3407 sc_set_20 = VHT_DATA_SC_20_LOWEST_OF_80MHZ;
3408 else if ((mac->cur_40_prime_sc == PRIME_CHNL_OFFSET_UPPER) &&
3409 (mac->cur_80_prime_sc == HAL_PRIME_CHNL_OFFSET_LOWER))
3410 sc_set_20 = VHT_DATA_SC_20_LOWER_OF_80MHZ;
3411 else if ((mac->cur_40_prime_sc == PRIME_CHNL_OFFSET_LOWER) &&
3412 (mac->cur_80_prime_sc == HAL_PRIME_CHNL_OFFSET_UPPER))
3413 sc_set_20 = VHT_DATA_SC_20_UPPER_OF_80MHZ;
3414 else if ((mac->cur_40_prime_sc == PRIME_CHNL_OFFSET_UPPER) &&
3415 (mac->cur_80_prime_sc == HAL_PRIME_CHNL_OFFSET_UPPER))
3416 sc_set_20 = VHT_DATA_SC_20_UPPERST_OF_80MHZ;
3417 else
3418 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
3419 "SCMapping: Not Correct Primary40MHz Setting\n");
3420 } else if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20_40) {
3421 if (mac->cur_40_prime_sc == PRIME_CHNL_OFFSET_UPPER)
3422 sc_set_20 = VHT_DATA_SC_20_UPPER_OF_80MHZ;
3423 else if (mac->cur_40_prime_sc == PRIME_CHNL_OFFSET_LOWER)
3424 sc_set_20 = VHT_DATA_SC_20_LOWER_OF_80MHZ;
3425 else
3426 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
3427 "SCMapping: Not Correct Primary40MHz Setting\n");
3428 }
3429 return (sc_set_40 << 4) | sc_set_20;
3430}
3431
3432void rtl8821ae_phy_set_bw_mode_callback(struct ieee80211_hw *hw)
3433{
3434 struct rtl_priv *rtlpriv = rtl_priv(hw);
3435 struct rtl_phy *rtlphy = &rtlpriv->phy;
3436 u8 sub_chnl = 0;
3437 u8 l1pk_val = 0;
3438
3439 RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE,
3440 "Switch to %s bandwidth\n",
3441 (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20 ?
3442 "20MHz" :
3443 (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20_40 ?
3444 "40MHz" : "80MHz")));
3445
3446 _rtl8821ae_phy_set_reg_bw(rtlpriv, rtlphy->current_chan_bw);
3447 sub_chnl = _rtl8821ae_phy_get_secondary_chnl(rtlpriv);
3448 rtl_write_byte(rtlpriv, 0x0483, sub_chnl);
3449
3450 switch (rtlphy->current_chan_bw) {
3451 case HT_CHANNEL_WIDTH_20:
3452 rtl_set_bbreg(hw, RRFMOD, 0x003003C3, 0x00300200);
3453 rtl_set_bbreg(hw, RADC_BUF_CLK, BIT(30), 0);
3454
3455 if (rtlphy->rf_type == RF_2T2R)
3456 rtl_set_bbreg(hw, RL1PEAKTH, 0x03C00000, 7);
3457 else
3458 rtl_set_bbreg(hw, RL1PEAKTH, 0x03C00000, 8);
3459 break;
3460 case HT_CHANNEL_WIDTH_20_40:
3461 rtl_set_bbreg(hw, RRFMOD, 0x003003C3, 0x00300201);
3462 rtl_set_bbreg(hw, RADC_BUF_CLK, BIT(30), 0);
3463 rtl_set_bbreg(hw, RRFMOD, 0x3C, sub_chnl);
3464 rtl_set_bbreg(hw, RCCAONSEC, 0xf0000000, sub_chnl);
3465
3466 if (rtlphy->reg_837 & BIT(2))
3467 l1pk_val = 6;
3468 else {
3469 if (rtlphy->rf_type == RF_2T2R)
3470 l1pk_val = 7;
3471 else
3472 l1pk_val = 8;
3473 }
3474 /* 0x848[25:22] = 0x6 */
3475 rtl_set_bbreg(hw, RL1PEAKTH, 0x03C00000, l1pk_val);
3476
3477 if (sub_chnl == VHT_DATA_SC_20_UPPER_OF_80MHZ)
3478 rtl_set_bbreg(hw, RCCK_SYSTEM, BCCK_SYSTEM, 1);
3479 else
3480 rtl_set_bbreg(hw, RCCK_SYSTEM, BCCK_SYSTEM, 0);
3481 break;
3482
3483 case HT_CHANNEL_WIDTH_80:
3484 /* 0x8ac[21,20,9:6,1,0]=8'b11100010 */
3485 rtl_set_bbreg(hw, RRFMOD, 0x003003C3, 0x00300202);
3486 /* 0x8c4[30] = 1 */
3487 rtl_set_bbreg(hw, RADC_BUF_CLK, BIT(30), 1);
3488 rtl_set_bbreg(hw, RRFMOD, 0x3C, sub_chnl);
3489 rtl_set_bbreg(hw, RCCAONSEC, 0xf0000000, sub_chnl);
3490
3491 if (rtlphy->reg_837 & BIT(2))
3492 l1pk_val = 5;
3493 else {
3494 if (rtlphy->rf_type == RF_2T2R)
3495 l1pk_val = 6;
3496 else
3497 l1pk_val = 7;
3498 }
3499 rtl_set_bbreg(hw, RL1PEAKTH, 0x03C00000, l1pk_val);
3500
3501 break;
3502 default:
3503 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
3504 "unknown bandwidth: %#X\n", rtlphy->current_chan_bw);
3505 break;
3506 }
3507
3508 rtl8812ae_fixspur(hw, rtlphy->current_chan_bw, rtlphy->current_channel);
3509
3510 rtl8821ae_phy_rf6052_set_bandwidth(hw, rtlphy->current_chan_bw);
3511 rtlphy->set_bwmode_inprogress = false;
3512
3513 RT_TRACE(rtlpriv, COMP_SCAN, DBG_LOUD, "\n");
3514}
3515
3516void rtl8821ae_phy_set_bw_mode(struct ieee80211_hw *hw,
3517 enum nl80211_channel_type ch_type)
3518{
3519 struct rtl_priv *rtlpriv = rtl_priv(hw);
3520 struct rtl_phy *rtlphy = &rtlpriv->phy;
3521 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
3522 u8 tmp_bw = rtlphy->current_chan_bw;
3523
3524 if (rtlphy->set_bwmode_inprogress)
3525 return;
3526 rtlphy->set_bwmode_inprogress = true;
3527 if ((!is_hal_stop(rtlhal)) && !(RT_CANNOT_IO(hw)))
3528 rtl8821ae_phy_set_bw_mode_callback(hw);
3529 else {
3530 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
3531 "FALSE driver sleep or unload\n");
3532 rtlphy->set_bwmode_inprogress = false;
3533 rtlphy->current_chan_bw = tmp_bw;
3534 }
3535}
3536
3537void rtl8821ae_phy_sw_chnl_callback(struct ieee80211_hw *hw)
3538{
3539 struct rtl_priv *rtlpriv = rtl_priv(hw);
3540 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
3541 struct rtl_phy *rtlphy = &rtlpriv->phy;
3542 u8 channel = rtlphy->current_channel;
3543 u8 path;
3544 u32 data;
3545
3546 RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE,
3547 "switch to channel%d\n", rtlphy->current_channel);
3548 if (is_hal_stop(rtlhal))
3549 return;
3550
3551 if (36 <= channel && channel <= 48)
3552 data = 0x494;
3553 else if (50 <= channel && channel <= 64)
3554 data = 0x453;
3555 else if (100 <= channel && channel <= 116)
3556 data = 0x452;
3557 else if (118 <= channel)
3558 data = 0x412;
3559 else
3560 data = 0x96a;
3561 rtl_set_bbreg(hw, RFC_AREA, 0x1ffe0000, data);
3562
3563 for (path = RF90_PATH_A; path < rtlphy->num_total_rfpath; path++) {
3564 if (36 <= channel && channel <= 64)
3565 data = 0x101;
3566 else if (100 <= channel && channel <= 140)
3567 data = 0x301;
3568 else if (140 < channel)
3569 data = 0x501;
3570 else
3571 data = 0x000;
3572 rtl8821ae_phy_set_rf_reg(hw, path, RF_CHNLBW,
3573 BIT(18)|BIT(17)|BIT(16)|BIT(9)|BIT(8), data);
3574
3575 rtl8821ae_phy_set_rf_reg(hw, path, RF_CHNLBW,
3576 BMASKBYTE0, channel);
3577
3578 if (channel > 14) {
3579 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
3580 if (36 <= channel && channel <= 64)
3581 data = 0x114E9;
3582 else if (100 <= channel && channel <= 140)
3583 data = 0x110E9;
3584 else
3585 data = 0x110E9;
3586 rtl8821ae_phy_set_rf_reg(hw, path, RF_APK,
3587 BRFREGOFFSETMASK, data);
3588 }
3589 }
3590 }
3591 RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE, "\n");
3592}
3593
3594u8 rtl8821ae_phy_sw_chnl(struct ieee80211_hw *hw)
3595{
3596 struct rtl_priv *rtlpriv = rtl_priv(hw);
3597 struct rtl_phy *rtlphy = &rtlpriv->phy;
3598 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
3599 u32 timeout = 1000, timecount = 0;
3600 u8 channel = rtlphy->current_channel;
3601
3602 if (rtlphy->sw_chnl_inprogress)
3603 return 0;
3604 if (rtlphy->set_bwmode_inprogress)
3605 return 0;
3606
3607 if ((is_hal_stop(rtlhal)) || (RT_CANNOT_IO(hw))) {
3608 RT_TRACE(rtlpriv, COMP_CHAN, DBG_LOUD,
3609 "sw_chnl_inprogress false driver sleep or unload\n");
3610 return 0;
3611 }
3612 while (rtlphy->lck_inprogress && timecount < timeout) {
3613 mdelay(50);
3614 timecount += 50;
3615 }
3616
3617 if (rtlphy->current_channel > 14 && rtlhal->current_bandtype != BAND_ON_5G)
3618 rtl8821ae_phy_switch_wirelessband(hw, BAND_ON_5G);
3619 else if (rtlphy->current_channel <= 14 && rtlhal->current_bandtype != BAND_ON_2_4G)
3620 rtl8821ae_phy_switch_wirelessband(hw, BAND_ON_2_4G);
3621
3622 rtlphy->sw_chnl_inprogress = true;
3623 if (channel == 0)
3624 channel = 1;
3625
3626 RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE,
3627 "switch to channel%d, band type is %d\n",
3628 rtlphy->current_channel, rtlhal->current_bandtype);
3629
3630 rtl8821ae_phy_sw_chnl_callback(hw);
3631
3632 rtl8821ae_dm_clear_txpower_tracking_state(hw);
3633 rtl8821ae_phy_set_txpower_level(hw, rtlphy->current_channel);
3634
3635 RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE, "\n");
3636 rtlphy->sw_chnl_inprogress = false;
3637 return 1;
3638}
3639
3640u8 _rtl8812ae_get_right_chnl_place_for_iqk(u8 chnl)
3641{
3642 u8 channel_all[TARGET_CHNL_NUM_2G_5G_8812] = {
3643 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
3644 14, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54,
3645 56, 58, 60, 62, 64, 100, 102, 104, 106, 108,
3646 110, 112, 114, 116, 118, 120, 122, 124, 126,
3647 128, 130, 132, 134, 136, 138, 140, 149, 151,
3648 153, 155, 157, 159, 161, 163, 165};
3649 u8 place = chnl;
3650
3651 if (chnl > 14) {
3652 for (place = 14; place < sizeof(channel_all); place++)
3653 if (channel_all[place] == chnl)
3654 return place-13;
3655 }
3656
3657 return 0;
3658}
3659
3660#define MACBB_REG_NUM 10
3661#define AFE_REG_NUM 14
3662#define RF_REG_NUM 3
3663
3664static void _rtl8821ae_iqk_backup_macbb(struct ieee80211_hw *hw,
3665 u32 *macbb_backup,
3666 u32 *backup_macbb_reg, u32 mac_bb_num)
3667{
3668 struct rtl_priv *rtlpriv = rtl_priv(hw);
3669 u32 i;
3670
3671 rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /*[31] = 0 --> Page C*/
3672 /*save MACBB default value*/
3673 for (i = 0; i < mac_bb_num; i++)
3674 macbb_backup[i] = rtl_read_dword(rtlpriv, backup_macbb_reg[i]);
3675
3676 RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD, "BackupMacBB Success!!!!\n");
3677}
3678
3679static void _rtl8821ae_iqk_backup_afe(struct ieee80211_hw *hw, u32 *afe_backup,
3680 u32 *backup_afe_REG, u32 afe_num)
3681{
3682 struct rtl_priv *rtlpriv = rtl_priv(hw);
3683 u32 i;
3684
3685 rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /*[31] = 0 --> Page C*/
3686 /*Save AFE Parameters */
3687 for (i = 0; i < afe_num; i++)
3688 afe_backup[i] = rtl_read_dword(rtlpriv, backup_afe_REG[i]);
3689 RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD, "BackupAFE Success!!!!\n");
3690}
3691
3692static void _rtl8821ae_iqk_backup_rf(struct ieee80211_hw *hw, u32 *rfa_backup,
3693 u32 *rfb_backup, u32 *backup_rf_reg,
3694 u32 rf_num)
3695{
3696 struct rtl_priv *rtlpriv = rtl_priv(hw);
3697 u32 i;
3698
3699 rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /*[31] = 0 --> Page C*/
3700 /*Save RF Parameters*/
3701 for (i = 0; i < rf_num; i++) {
3702 rfa_backup[i] = rtl_get_rfreg(hw, RF90_PATH_A, backup_rf_reg[i],
3703 BMASKDWORD);
3704 rfb_backup[i] = rtl_get_rfreg(hw, RF90_PATH_B, backup_rf_reg[i],
3705 BMASKDWORD);
3706 }
3707 RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD, "BackupRF Success!!!!\n");
3708}
3709
3710static void _rtl8821ae_iqk_configure_mac(
3711 struct ieee80211_hw *hw
3712 )
3713{
3714 struct rtl_priv *rtlpriv = rtl_priv(hw);
3715 /* ========MAC register setting========*/
3716 rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /*[31] = 0 --> Page C*/
3717 rtl_write_byte(rtlpriv, 0x522, 0x3f);
3718 rtl_set_bbreg(hw, 0x550, BIT(11) | BIT(3), 0x0);
3719 rtl_write_byte(rtlpriv, 0x808, 0x00); /*RX ante off*/
3720 rtl_set_bbreg(hw, 0x838, 0xf, 0xc); /*CCA off*/
3721}
3722
3723static void _rtl8821ae_iqk_tx_fill_iqc(struct ieee80211_hw *hw,
3724 enum radio_path path, u32 tx_x, u32 tx_y)
3725{
3726 struct rtl_priv *rtlpriv = rtl_priv(hw);
3727 switch (path) {
3728 case RF90_PATH_A:
3729 /* [31] = 1 --> Page C1 */
3730 rtl_set_bbreg(hw, 0x82c, BIT(31), 0x1);
3731 rtl_write_dword(rtlpriv, 0xc90, 0x00000080);
3732 rtl_write_dword(rtlpriv, 0xcc4, 0x20040000);
3733 rtl_write_dword(rtlpriv, 0xcc8, 0x20000000);
3734 rtl_set_bbreg(hw, 0xccc, 0x000007ff, tx_y);
3735 rtl_set_bbreg(hw, 0xcd4, 0x000007ff, tx_x);
3736 RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD,
3737 "TX_X = %x;;TX_Y = %x =====> fill to IQC\n",
3738 tx_x, tx_y);
3739 RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD,
3740 "0xcd4 = %x;;0xccc = %x ====>fill to IQC\n",
3741 rtl_get_bbreg(hw, 0xcd4, 0x000007ff),
3742 rtl_get_bbreg(hw, 0xccc, 0x000007ff));
3743 break;
3744 default:
3745 break;
3746 };
3747}
3748
3749static void _rtl8821ae_iqk_rx_fill_iqc(struct ieee80211_hw *hw,
3750 enum radio_path path, u32 rx_x, u32 rx_y)
3751{
3752 struct rtl_priv *rtlpriv = rtl_priv(hw);
3753 switch (path) {
3754 case RF90_PATH_A:
3755 rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */
3756 rtl_set_bbreg(hw, 0xc10, 0x000003ff, rx_x>>1);
3757 rtl_set_bbreg(hw, 0xc10, 0x03ff0000, rx_y>>1);
3758 RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD,
3759 "rx_x = %x;;rx_y = %x ====>fill to IQC\n",
3760 rx_x>>1, rx_y>>1);
3761 RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD,
3762 "0xc10 = %x ====>fill to IQC\n",
3763 rtl_read_dword(rtlpriv, 0xc10));
3764 break;
3765 default:
3766 break;
3767 };
3768}
3769
3770#define cal_num 10
3771
3772static void _rtl8821ae_iqk_tx(struct ieee80211_hw *hw, enum radio_path path)
3773{
3774 struct rtl_priv *rtlpriv = rtl_priv(hw);
3775 struct rtl_phy *rtlphy = &rtlpriv->phy;
3776 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
3777
3778 u32 tx_fail, rx_fail, delay_count, iqk_ready, cal_retry, cal = 0, temp_reg65;
3779 int tx_x = 0, tx_y = 0, rx_x = 0, rx_y = 0, tx_average = 0, rx_average = 0;
3780 int tx_x0[cal_num], tx_y0[cal_num], tx_x0_rxk[cal_num],
3781 tx_y0_rxk[cal_num], rx_x0[cal_num], rx_y0[cal_num];
3782 bool tx0iqkok = false, rx0iqkok = false;
3783 bool vdf_enable = false;
3784 int i, k, vdf_y[3], vdf_x[3], tx_dt[3], rx_dt[3],
3785 ii, dx = 0, dy = 0, tx_finish = 0, rx_finish = 0;
3786
3787 RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD,
3788 "BandWidth = %d.\n",
3789 rtlphy->current_chan_bw);
3790 if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_80)
3791 vdf_enable = true;
3792
3793 while (cal < cal_num) {
3794 switch (path) {
3795 case RF90_PATH_A:
3796 temp_reg65 = rtl_get_rfreg(hw, path, 0x65, 0xffffffff);
3797 /* Path-A LOK */
3798 rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /*[31] = 0 --> Page C*/
3799 /*========Path-A AFE all on========*/
3800 /*Port 0 DAC/ADC on*/
3801 rtl_write_dword(rtlpriv, 0xc60, 0x77777777);
3802 rtl_write_dword(rtlpriv, 0xc64, 0x77777777);
3803 rtl_write_dword(rtlpriv, 0xc68, 0x19791979);
3804 rtl_write_dword(rtlpriv, 0xc6c, 0x19791979);
3805 rtl_write_dword(rtlpriv, 0xc70, 0x19791979);
3806 rtl_write_dword(rtlpriv, 0xc74, 0x19791979);
3807 rtl_write_dword(rtlpriv, 0xc78, 0x19791979);
3808 rtl_write_dword(rtlpriv, 0xc7c, 0x19791979);
3809 rtl_write_dword(rtlpriv, 0xc80, 0x19791979);
3810 rtl_write_dword(rtlpriv, 0xc84, 0x19791979);
3811
3812 rtl_set_bbreg(hw, 0xc00, 0xf, 0x4); /*hardware 3-wire off*/
3813
3814 /* LOK Setting */
3815 /* ====== LOK ====== */
3816 /*DAC/ADC sampling rate (160 MHz)*/
3817 rtl_set_bbreg(hw, 0xc5c, BIT(26) | BIT(25) | BIT(24), 0x7);
3818
3819 /* 2. LoK RF Setting (at BW = 20M) */
3820 rtl_set_rfreg(hw, path, 0xef, RFREG_OFFSET_MASK, 0x80002);
3821 rtl_set_rfreg(hw, path, 0x18, 0x00c00, 0x3); /* BW 20M */
3822 rtl_set_rfreg(hw, path, 0x30, RFREG_OFFSET_MASK, 0x20000);
3823 rtl_set_rfreg(hw, path, 0x31, RFREG_OFFSET_MASK, 0x0003f);
3824 rtl_set_rfreg(hw, path, 0x32, RFREG_OFFSET_MASK, 0xf3fc3);
3825 rtl_set_rfreg(hw, path, 0x65, RFREG_OFFSET_MASK, 0x931d5);
3826 rtl_set_rfreg(hw, path, 0x8f, RFREG_OFFSET_MASK, 0x8a001);
3827 rtl_set_bbreg(hw, 0xcb8, 0xf, 0xd);
3828 rtl_write_dword(rtlpriv, 0x90c, 0x00008000);
3829 rtl_write_dword(rtlpriv, 0xb00, 0x03000100);
3830 rtl_set_bbreg(hw, 0xc94, BIT(0), 0x1);
3831 rtl_write_dword(rtlpriv, 0x978, 0x29002000);/* TX (X,Y) */
3832 rtl_write_dword(rtlpriv, 0x97c, 0xa9002000);/* RX (X,Y) */
3833 rtl_write_dword(rtlpriv, 0x984, 0x00462910);/* [0]:AGC_en, [15]:idac_K_Mask */
3834
3835 rtl_set_bbreg(hw, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */
3836 rtl_write_dword(rtlpriv, 0xc88, 0x821403f4);
3837
3838 if (rtlhal->current_bandtype)
3839 rtl_write_dword(rtlpriv, 0xc8c, 0x68163e96);
3840 else
3841 rtl_write_dword(rtlpriv, 0xc8c, 0x28163e96);
3842
3843 rtl_write_dword(rtlpriv, 0xc80, 0x18008c10);/* TX_TONE_idx[9:0], TxK_Mask[29] TX_Tone = 16 */
3844 rtl_write_dword(rtlpriv, 0xc84, 0x38008c10);/* RX_TONE_idx[9:0], RxK_Mask[29] */
3845 rtl_write_dword(rtlpriv, 0xcb8, 0x00100000);/* cb8[20] \B1N SI/PI \A8Ï¥\CE\C5v\A4\C1\B5\B9 iqk_dpk module */
3846 rtl_write_dword(rtlpriv, 0x980, 0xfa000000);
3847 rtl_write_dword(rtlpriv, 0x980, 0xf8000000);
3848
3849 mdelay(10); /* Delay 10ms */
3850 rtl_write_dword(rtlpriv, 0xcb8, 0x00000000);
3851
3852 rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */
3853 rtl_set_rfreg(hw, path, 0x58, 0x7fe00, rtl_get_rfreg(hw, path, 0x8, 0xffc00)); /* Load LOK */
3854
3855 switch (rtlphy->current_chan_bw) {
3856 case 1:
3857 rtl_set_rfreg(hw, path, 0x18, 0x00c00, 0x1);
3858 break;
3859 case 2:
3860 rtl_set_rfreg(hw, path, 0x18, 0x00c00, 0x0);
3861 break;
3862 default:
3863 break;
3864 }
3865
3866 rtl_set_bbreg(hw, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */
3867
3868 /* 3. TX RF Setting */
3869 rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */
3870 rtl_set_rfreg(hw, path, 0xef, RFREG_OFFSET_MASK, 0x80000);
3871 rtl_set_rfreg(hw, path, 0x30, RFREG_OFFSET_MASK, 0x20000);
3872 rtl_set_rfreg(hw, path, 0x31, RFREG_OFFSET_MASK, 0x0003f);
3873 rtl_set_rfreg(hw, path, 0x32, RFREG_OFFSET_MASK, 0xf3fc3);
3874 rtl_set_rfreg(hw, path, 0x65, RFREG_OFFSET_MASK, 0x931d5);
3875 rtl_set_rfreg(hw, path, 0x8f, RFREG_OFFSET_MASK, 0x8a001);
3876 rtl_set_rfreg(hw, path, 0xef, RFREG_OFFSET_MASK, 0x00000);
3877 /* ODM_SetBBReg(pDM_Odm, 0xcb8, 0xf, 0xd); */
3878 rtl_write_dword(rtlpriv, 0x90c, 0x00008000);
3879 rtl_write_dword(rtlpriv, 0xb00, 0x03000100);
3880 rtl_set_bbreg(hw, 0xc94, BIT(0), 0x1);
3881 rtl_write_dword(rtlpriv, 0x978, 0x29002000);/* TX (X,Y) */
3882 rtl_write_dword(rtlpriv, 0x97c, 0xa9002000);/* RX (X,Y) */
3883 rtl_write_dword(rtlpriv, 0x984, 0x0046a910);/* [0]:AGC_en, [15]:idac_K_Mask */
3884
3885 rtl_set_bbreg(hw, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */
3886 rtl_write_dword(rtlpriv, 0xc88, 0x821403f1);
3887 if (rtlhal->current_bandtype)
3888 rtl_write_dword(rtlpriv, 0xc8c, 0x40163e96);
3889 else
3890 rtl_write_dword(rtlpriv, 0xc8c, 0x00163e96);
3891
3892 if (vdf_enable == 1) {
3893 RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD, "VDF_enable\n");
3894 for (k = 0; k <= 2; k++) {
3895 switch (k) {
3896 case 0:
3897 rtl_write_dword(rtlpriv, 0xc80, 0x18008c38);/* TX_TONE_idx[9:0], TxK_Mask[29] TX_Tone = 16 */
3898 rtl_write_dword(rtlpriv, 0xc84, 0x38008c38);/* RX_TONE_idx[9:0], RxK_Mask[29] */
3899 rtl_set_bbreg(hw, 0xce8, BIT(31), 0x0);
3900 break;
3901 case 1:
3902 rtl_set_bbreg(hw, 0xc80, BIT(28), 0x0);
3903 rtl_set_bbreg(hw, 0xc84, BIT(28), 0x0);
3904 rtl_set_bbreg(hw, 0xce8, BIT(31), 0x0);
3905 break;
3906 case 2:
3907 RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD,
3908 "vdf_y[1] = %x;;;vdf_y[0] = %x\n", vdf_y[1]>>21 & 0x00007ff, vdf_y[0]>>21 & 0x00007ff);
3909 RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD,
3910 "vdf_x[1] = %x;;;vdf_x[0] = %x\n", vdf_x[1]>>21 & 0x00007ff, vdf_x[0]>>21 & 0x00007ff);
3911 tx_dt[cal] = (vdf_y[1]>>20)-(vdf_y[0]>>20);
3912 tx_dt[cal] = ((16*tx_dt[cal])*10000/15708);
3913 tx_dt[cal] = (tx_dt[cal] >> 1)+(tx_dt[cal] & BIT(0));
3914 rtl_write_dword(rtlpriv, 0xc80, 0x18008c20);/* TX_TONE_idx[9:0], TxK_Mask[29] TX_Tone = 16 */
3915 rtl_write_dword(rtlpriv, 0xc84, 0x38008c20);/* RX_TONE_idx[9:0], RxK_Mask[29] */
3916 rtl_set_bbreg(hw, 0xce8, BIT(31), 0x1);
3917 rtl_set_bbreg(hw, 0xce8, 0x3fff0000, tx_dt[cal] & 0x00003fff);
3918 break;
3919 default:
3920 break;
3921 }
3922 rtl_write_dword(rtlpriv, 0xcb8, 0x00100000);/* cb8[20] \B1N SI/PI \A8Ï¥\CE\C5v\A4\C1\B5\B9 iqk_dpk module */
3923 cal_retry = 0;
3924 while (1) {
3925 /* one shot */
3926 rtl_write_dword(rtlpriv, 0x980, 0xfa000000);
3927 rtl_write_dword(rtlpriv, 0x980, 0xf8000000);
3928
3929 mdelay(10); /* Delay 10ms */
3930 rtl_write_dword(rtlpriv, 0xcb8, 0x00000000);
3931 delay_count = 0;
3932 while (1) {
3933 iqk_ready = rtl_get_bbreg(hw, 0xd00, BIT(10));
3934 if ((~iqk_ready) || (delay_count > 20))
3935 break;
3936 else{
3937 mdelay(1);
3938 delay_count++;
3939 }
3940 }
3941
3942 if (delay_count < 20) { /* If 20ms No Result, then cal_retry++ */
3943 /* ============TXIQK Check============== */
3944 tx_fail = rtl_get_bbreg(hw, 0xd00, BIT(12));
3945
3946 if (~tx_fail) {
3947 rtl_write_dword(rtlpriv, 0xcb8, 0x02000000);
3948 vdf_x[k] = rtl_get_bbreg(hw, 0xd00, 0x07ff0000)<<21;
3949 rtl_write_dword(rtlpriv, 0xcb8, 0x04000000);
3950 vdf_y[k] = rtl_get_bbreg(hw, 0xd00, 0x07ff0000)<<21;
3951 tx0iqkok = true;
3952 break;
3953 } else {
3954 rtl_set_bbreg(hw, 0xccc, 0x000007ff, 0x0);
3955 rtl_set_bbreg(hw, 0xcd4, 0x000007ff, 0x200);
3956 tx0iqkok = false;
3957 cal_retry++;
3958 if (cal_retry == 10)
3959 break;
3960 }
3961 } else {
3962 tx0iqkok = false;
3963 cal_retry++;
3964 if (cal_retry == 10)
3965 break;
3966 }
3967 }
3968 }
3969 if (k == 3) {
3970 tx_x0[cal] = vdf_x[k-1];
3971 tx_y0[cal] = vdf_y[k-1];
3972 }
3973 } else {
3974 rtl_write_dword(rtlpriv, 0xc80, 0x18008c10);/* TX_TONE_idx[9:0], TxK_Mask[29] TX_Tone = 16 */
3975 rtl_write_dword(rtlpriv, 0xc84, 0x38008c10);/* RX_TONE_idx[9:0], RxK_Mask[29] */
3976 rtl_write_dword(rtlpriv, 0xcb8, 0x00100000);/* cb8[20] \B1N SI/PI \A8Ï¥\CE\C5v\A4\C1\B5\B9 iqk_dpk module */
3977 cal_retry = 0;
3978 while (1) {
3979 /* one shot */
3980 rtl_write_dword(rtlpriv, 0x980, 0xfa000000);
3981 rtl_write_dword(rtlpriv, 0x980, 0xf8000000);
3982
3983 mdelay(10); /* Delay 10ms */
3984 rtl_write_dword(rtlpriv, 0xcb8, 0x00000000);
3985 delay_count = 0;
3986 while (1) {
3987 iqk_ready = rtl_get_bbreg(hw, 0xd00, BIT(10));
3988 if ((~iqk_ready) || (delay_count > 20))
3989 break;
3990 else{
3991 mdelay(1);
3992 delay_count++;
3993 }
3994 }
3995
3996 if (delay_count < 20) { /* If 20ms No Result, then cal_retry++ */
3997 /* ============TXIQK Check============== */
3998 tx_fail = rtl_get_bbreg(hw, 0xd00, BIT(12));
3999
4000 if (~tx_fail) {
4001 rtl_write_dword(rtlpriv, 0xcb8, 0x02000000);
4002 tx_x0[cal] = rtl_get_bbreg(hw, 0xd00, 0x07ff0000)<<21;
4003 rtl_write_dword(rtlpriv, 0xcb8, 0x04000000);
4004 tx_y0[cal] = rtl_get_bbreg(hw, 0xd00, 0x07ff0000)<<21;
4005 tx0iqkok = true;
4006 break;
4007 } else {
4008 rtl_set_bbreg(hw, 0xccc, 0x000007ff, 0x0);
4009 rtl_set_bbreg(hw, 0xcd4, 0x000007ff, 0x200);
4010 tx0iqkok = false;
4011 cal_retry++;
4012 if (cal_retry == 10)
4013 break;
4014 }
4015 } else {
4016 tx0iqkok = false;
4017 cal_retry++;
4018 if (cal_retry == 10)
4019 break;
4020 }
4021 }
4022 }
4023
4024 if (tx0iqkok == false)
4025 break; /* TXK fail, Don't do RXK */
4026
4027 if (vdf_enable == 1) {
4028 rtl_set_bbreg(hw, 0xce8, BIT(31), 0x0); /* TX VDF Disable */
4029 RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD, "RXVDF Start\n");
4030 for (k = 0; k <= 2; k++) {
4031 /* ====== RX mode TXK (RXK Step 1) ====== */
4032 rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */
4033 /* 1. TX RF Setting */
4034 rtl_set_rfreg(hw, path, 0xef, RFREG_OFFSET_MASK, 0x80000);
4035 rtl_set_rfreg(hw, path, 0x30, RFREG_OFFSET_MASK, 0x30000);
4036 rtl_set_rfreg(hw, path, 0x31, RFREG_OFFSET_MASK, 0x00029);
4037 rtl_set_rfreg(hw, path, 0x32, RFREG_OFFSET_MASK, 0xd7ffb);
4038 rtl_set_rfreg(hw, path, 0x65, RFREG_OFFSET_MASK, temp_reg65);
4039 rtl_set_rfreg(hw, path, 0x8f, RFREG_OFFSET_MASK, 0x8a001);
4040 rtl_set_rfreg(hw, path, 0xef, RFREG_OFFSET_MASK, 0x00000);
4041
4042 rtl_set_bbreg(hw, 0xcb8, 0xf, 0xd);
4043 rtl_write_dword(rtlpriv, 0x978, 0x29002000);/* TX (X,Y) */
4044 rtl_write_dword(rtlpriv, 0x97c, 0xa9002000);/* RX (X,Y) */
4045 rtl_write_dword(rtlpriv, 0x984, 0x0046a910);/* [0]:AGC_en, [15]:idac_K_Mask */
4046 rtl_write_dword(rtlpriv, 0x90c, 0x00008000);
4047 rtl_write_dword(rtlpriv, 0xb00, 0x03000100);
4048 rtl_set_bbreg(hw, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */
4049 switch (k) {
4050 case 0:
4051 {
4052 rtl_write_dword(rtlpriv, 0xc80, 0x18008c38);/* TX_TONE_idx[9:0], TxK_Mask[29] TX_Tone = 16 */
4053 rtl_write_dword(rtlpriv, 0xc84, 0x38008c38);/* RX_TONE_idx[9:0], RxK_Mask[29] */
4054 rtl_set_bbreg(hw, 0xce8, BIT(30), 0x0);
4055 }
4056 break;
4057 case 1:
4058 {
4059 rtl_write_dword(rtlpriv, 0xc80, 0x08008c38);/* TX_TONE_idx[9:0], TxK_Mask[29] TX_Tone = 16 */
4060 rtl_write_dword(rtlpriv, 0xc84, 0x28008c38);/* RX_TONE_idx[9:0], RxK_Mask[29] */
4061 rtl_set_bbreg(hw, 0xce8, BIT(30), 0x0);
4062 }
4063 break;
4064 case 2:
4065 {
4066 RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD,
4067 "VDF_Y[1] = %x;;;VDF_Y[0] = %x\n",
4068 vdf_y[1]>>21 & 0x00007ff, vdf_y[0]>>21 & 0x00007ff);
4069 RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD,
4070 "VDF_X[1] = %x;;;VDF_X[0] = %x\n",
4071 vdf_x[1]>>21 & 0x00007ff, vdf_x[0]>>21 & 0x00007ff);
4072 rx_dt[cal] = (vdf_y[1]>>20)-(vdf_y[0]>>20);
4073 RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD, "Rx_dt = %d\n", rx_dt[cal]);
4074 rx_dt[cal] = ((16*rx_dt[cal])*10000/13823);
4075 rx_dt[cal] = (rx_dt[cal] >> 1)+(rx_dt[cal] & BIT(0));
4076 rtl_write_dword(rtlpriv, 0xc80, 0x18008c20);/* TX_TONE_idx[9:0], TxK_Mask[29] TX_Tone = 16 */
4077 rtl_write_dword(rtlpriv, 0xc84, 0x38008c20);/* RX_TONE_idx[9:0], RxK_Mask[29] */
4078 rtl_set_bbreg(hw, 0xce8, 0x00003fff, rx_dt[cal] & 0x00003fff);
4079 }
4080 break;
4081 default:
4082 break;
4083 }
4084 rtl_write_dword(rtlpriv, 0xc88, 0x821603e0);
4085 rtl_write_dword(rtlpriv, 0xc8c, 0x68163e96);
4086 rtl_write_dword(rtlpriv, 0xcb8, 0x00100000);/* cb8[20] \B1N SI/PI \A8Ï¥\CE\C5v\A4\C1\B5\B9 iqk_dpk module */
4087 cal_retry = 0;
4088 while (1) {
4089 /* one shot */
4090 rtl_write_dword(rtlpriv, 0x980, 0xfa000000);
4091 rtl_write_dword(rtlpriv, 0x980, 0xf8000000);
4092
4093 mdelay(10); /* Delay 10ms */
4094 rtl_write_dword(rtlpriv, 0xcb8, 0x00000000);
4095 delay_count = 0;
4096 while (1) {
4097 iqk_ready = rtl_get_bbreg(hw, 0xd00, BIT(10));
4098 if ((~iqk_ready) || (delay_count > 20))
4099 break;
4100 else{
4101 mdelay(1);
4102 delay_count++;
4103 }
4104 }
4105
4106 if (delay_count < 20) { /* If 20ms No Result, then cal_retry++ */
4107 /* ============TXIQK Check============== */
4108 tx_fail = rtl_get_bbreg(hw, 0xd00, BIT(12));
4109
4110 if (~tx_fail) {
4111 rtl_write_dword(rtlpriv, 0xcb8, 0x02000000);
4112 tx_x0_rxk[cal] = rtl_get_bbreg(hw, 0xd00, 0x07ff0000)<<21;
4113 rtl_write_dword(rtlpriv, 0xcb8, 0x04000000);
4114 tx_y0_rxk[cal] = rtl_get_bbreg(hw, 0xd00, 0x07ff0000)<<21;
4115 tx0iqkok = true;
4116 break;
4117 } else{
4118 tx0iqkok = false;
4119 cal_retry++;
4120 if (cal_retry == 10)
4121 break;
4122 }
4123 } else {
4124 tx0iqkok = false;
4125 cal_retry++;
4126 if (cal_retry == 10)
4127 break;
4128 }
4129 }
4130
4131 if (tx0iqkok == false) { /* If RX mode TXK fail, then take TXK Result */
4132 tx_x0_rxk[cal] = tx_x0[cal];
4133 tx_y0_rxk[cal] = tx_y0[cal];
4134 tx0iqkok = true;
4135 RT_TRACE(rtlpriv,
4136 COMP_IQK,
4137 DBG_LOUD,
4138 "RXK Step 1 fail\n");
4139 }
4140
4141 /* ====== RX IQK ====== */
4142 rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */
4143 /* 1. RX RF Setting */
4144 rtl_set_rfreg(hw, path, 0xef, RFREG_OFFSET_MASK, 0x80000);
4145 rtl_set_rfreg(hw, path, 0x30, RFREG_OFFSET_MASK, 0x30000);
4146 rtl_set_rfreg(hw, path, 0x31, RFREG_OFFSET_MASK, 0x0002f);
4147 rtl_set_rfreg(hw, path, 0x32, RFREG_OFFSET_MASK, 0xfffbb);
4148 rtl_set_rfreg(hw, path, 0x8f, RFREG_OFFSET_MASK, 0x88001);
4149 rtl_set_rfreg(hw, path, 0x65, RFREG_OFFSET_MASK, 0x931d8);
4150 rtl_set_rfreg(hw, path, 0xef, RFREG_OFFSET_MASK, 0x00000);
4151
4152 rtl_set_bbreg(hw, 0x978, 0x03FF8000, (tx_x0_rxk[cal])>>21&0x000007ff);
4153 rtl_set_bbreg(hw, 0x978, 0x000007FF, (tx_y0_rxk[cal])>>21&0x000007ff);
4154 rtl_set_bbreg(hw, 0x978, BIT(31), 0x1);
4155 rtl_set_bbreg(hw, 0x97c, BIT(31), 0x0);
4156 rtl_set_bbreg(hw, 0xcb8, 0xF, 0xe);
4157 rtl_write_dword(rtlpriv, 0x90c, 0x00008000);
4158 rtl_write_dword(rtlpriv, 0x984, 0x0046a911);
4159
4160 rtl_set_bbreg(hw, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */
4161 rtl_set_bbreg(hw, 0xc80, BIT(29), 0x1);
4162 rtl_set_bbreg(hw, 0xc84, BIT(29), 0x0);
4163 rtl_write_dword(rtlpriv, 0xc88, 0x02140119);
4164
4165 rtl_write_dword(rtlpriv, 0xc8c, 0x28160d00); /* pDM_Odm->SupportInterface == 1 */
4166
4167 if (k == 2)
4168 rtl_set_bbreg(hw, 0xce8, BIT(30), 0x1); /* RX VDF Enable */
4169 rtl_write_dword(rtlpriv, 0xcb8, 0x00100000);/* cb8[20] \B1N SI/PI \A8Ï¥\CE\C5v\A4\C1\B5\B9 iqk_dpk module */
4170
4171 cal_retry = 0;
4172 while (1) {
4173 /* one shot */
4174 rtl_write_dword(rtlpriv, 0x980, 0xfa000000);
4175 rtl_write_dword(rtlpriv, 0x980, 0xf8000000);
4176
4177 mdelay(10); /* Delay 10ms */
4178 rtl_write_dword(rtlpriv, 0xcb8, 0x00000000);
4179 delay_count = 0;
4180 while (1) {
4181 iqk_ready = rtl_get_bbreg(hw, 0xd00, BIT(10));
4182 if ((~iqk_ready) || (delay_count > 20))
4183 break;
4184 else{
4185 mdelay(1);
4186 delay_count++;
4187 }
4188 }
4189
4190 if (delay_count < 20) { /* If 20ms No Result, then cal_retry++ */
4191 /* ============RXIQK Check============== */
4192 rx_fail = rtl_get_bbreg(hw, 0xd00, BIT(11));
4193 if (rx_fail == 0) {
4194 rtl_write_dword(rtlpriv, 0xcb8, 0x06000000);
4195 vdf_x[k] = rtl_get_bbreg(hw, 0xd00, 0x07ff0000)<<21;
4196 rtl_write_dword(rtlpriv, 0xcb8, 0x08000000);
4197 vdf_y[k] = rtl_get_bbreg(hw, 0xd00, 0x07ff0000)<<21;
4198 rx0iqkok = true;
4199 break;
4200 } else {
4201 rtl_set_bbreg(hw, 0xc10, 0x000003ff, 0x200>>1);
4202 rtl_set_bbreg(hw, 0xc10, 0x03ff0000, 0x0>>1);
4203 rx0iqkok = false;
4204 cal_retry++;
4205 if (cal_retry == 10)
4206 break;
4207
4208 }
4209 } else{
4210 rx0iqkok = false;
4211 cal_retry++;
4212 if (cal_retry == 10)
4213 break;
4214 }
4215 }
4216
4217 }
4218 if (k == 3) {
4219 rx_x0[cal] = vdf_x[k-1];
4220 rx_y0[cal] = vdf_y[k-1];
4221 }
4222 rtl_set_bbreg(hw, 0xce8, BIT(31), 0x1); /* TX VDF Enable */
4223 }
4224
4225 else{
4226 /* ====== RX mode TXK (RXK Step 1) ====== */
4227 rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */
4228 /* 1. TX RF Setting */
4229 rtl_set_rfreg(hw, path, 0xef, RFREG_OFFSET_MASK, 0x80000);
4230 rtl_set_rfreg(hw, path, 0x30, RFREG_OFFSET_MASK, 0x30000);
4231 rtl_set_rfreg(hw, path, 0x31, RFREG_OFFSET_MASK, 0x00029);
4232 rtl_set_rfreg(hw, path, 0x32, RFREG_OFFSET_MASK, 0xd7ffb);
4233 rtl_set_rfreg(hw, path, 0x65, RFREG_OFFSET_MASK, temp_reg65);
4234 rtl_set_rfreg(hw, path, 0x8f, RFREG_OFFSET_MASK, 0x8a001);
4235 rtl_set_rfreg(hw, path, 0xef, RFREG_OFFSET_MASK, 0x00000);
4236 rtl_write_dword(rtlpriv, 0x90c, 0x00008000);
4237 rtl_write_dword(rtlpriv, 0xb00, 0x03000100);
4238 rtl_write_dword(rtlpriv, 0x984, 0x0046a910);/* [0]:AGC_en, [15]:idac_K_Mask */
4239
4240 rtl_set_bbreg(hw, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */
4241 rtl_write_dword(rtlpriv, 0xc80, 0x18008c10);/* TX_TONE_idx[9:0], TxK_Mask[29] TX_Tone = 16 */
4242 rtl_write_dword(rtlpriv, 0xc84, 0x38008c10);/* RX_TONE_idx[9:0], RxK_Mask[29] */
4243 rtl_write_dword(rtlpriv, 0xc88, 0x821603e0);
4244 /* ODM_Write4Byte(pDM_Odm, 0xc8c, 0x68163e96); */
4245 rtl_write_dword(rtlpriv, 0xcb8, 0x00100000);/* cb8[20] \B1N SI/PI \A8Ï¥\CE\C5v\A4\C1\B5\B9 iqk_dpk module */
4246 cal_retry = 0;
4247 while (1) {
4248 /* one shot */
4249 rtl_write_dword(rtlpriv, 0x980, 0xfa000000);
4250 rtl_write_dword(rtlpriv, 0x980, 0xf8000000);
4251
4252 mdelay(10); /* Delay 10ms */
4253 rtl_write_dword(rtlpriv, 0xcb8, 0x00000000);
4254 delay_count = 0;
4255 while (1) {
4256 iqk_ready = rtl_get_bbreg(hw, 0xd00, BIT(10));
4257 if ((~iqk_ready) || (delay_count > 20))
4258 break;
4259 else{
4260 mdelay(1);
4261 delay_count++;
4262 }
4263 }
4264
4265 if (delay_count < 20) { /* If 20ms No Result, then cal_retry++ */
4266 /* ============TXIQK Check============== */
4267 tx_fail = rtl_get_bbreg(hw, 0xd00, BIT(12));
4268
4269 if (~tx_fail) {
4270 rtl_write_dword(rtlpriv, 0xcb8, 0x02000000);
4271 tx_x0_rxk[cal] = rtl_get_bbreg(hw, 0xd00, 0x07ff0000)<<21;
4272 rtl_write_dword(rtlpriv, 0xcb8, 0x04000000);
4273 tx_y0_rxk[cal] = rtl_get_bbreg(hw, 0xd00, 0x07ff0000)<<21;
4274 tx0iqkok = true;
4275 break;
4276 } else {
4277 tx0iqkok = false;
4278 cal_retry++;
4279 if (cal_retry == 10)
4280 break;
4281 }
4282 } else{
4283 tx0iqkok = false;
4284 cal_retry++;
4285 if (cal_retry == 10)
4286 break;
4287 }
4288 }
4289
4290 if (tx0iqkok == false) { /* If RX mode TXK fail, then take TXK Result */
4291 tx_x0_rxk[cal] = tx_x0[cal];
4292 tx_y0_rxk[cal] = tx_y0[cal];
4293 tx0iqkok = true;
4294 RT_TRACE(rtlpriv, COMP_IQK,
4295 DBG_LOUD, "1");
4296 }
4297
4298 /* ====== RX IQK ====== */
4299 rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */
4300 /* 1. RX RF Setting */
4301 rtl_set_rfreg(hw, path, 0xef, RFREG_OFFSET_MASK, 0x80000);
4302 rtl_set_rfreg(hw, path, 0x30, RFREG_OFFSET_MASK, 0x30000);
4303 rtl_set_rfreg(hw, path, 0x31, RFREG_OFFSET_MASK, 0x0002f);
4304 rtl_set_rfreg(hw, path, 0x32, RFREG_OFFSET_MASK, 0xfffbb);
4305 rtl_set_rfreg(hw, path, 0x8f, RFREG_OFFSET_MASK, 0x88001);
4306 rtl_set_rfreg(hw, path, 0x65, RFREG_OFFSET_MASK, 0x931d8);
4307 rtl_set_rfreg(hw, path, 0xef, RFREG_OFFSET_MASK, 0x00000);
4308
4309 rtl_set_bbreg(hw, 0x978, 0x03FF8000, (tx_x0_rxk[cal])>>21&0x000007ff);
4310 rtl_set_bbreg(hw, 0x978, 0x000007FF, (tx_y0_rxk[cal])>>21&0x000007ff);
4311 rtl_set_bbreg(hw, 0x978, BIT(31), 0x1);
4312 rtl_set_bbreg(hw, 0x97c, BIT(31), 0x0);
4313 /* ODM_SetBBReg(pDM_Odm, 0xcb8, 0xF, 0xe); */
4314 rtl_write_dword(rtlpriv, 0x90c, 0x00008000);
4315 rtl_write_dword(rtlpriv, 0x984, 0x0046a911);
4316
4317 rtl_set_bbreg(hw, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */
4318 rtl_write_dword(rtlpriv, 0xc80, 0x38008c10);/* TX_TONE_idx[9:0], TxK_Mask[29] TX_Tone = 16 */
4319 rtl_write_dword(rtlpriv, 0xc84, 0x18008c10);/* RX_TONE_idx[9:0], RxK_Mask[29] */
4320 rtl_write_dword(rtlpriv, 0xc88, 0x02140119);
4321
4322 rtl_write_dword(rtlpriv, 0xc8c, 0x28160d00); /*pDM_Odm->SupportInterface == 1*/
4323
4324 rtl_write_dword(rtlpriv, 0xcb8, 0x00100000);/* cb8[20] \B1N SI/PI \A8Ï¥\CE\C5v\A4\C1\B5\B9 iqk_dpk module */
4325
4326 cal_retry = 0;
4327 while (1) {
4328 /* one shot */
4329 rtl_write_dword(rtlpriv, 0x980, 0xfa000000);
4330 rtl_write_dword(rtlpriv, 0x980, 0xf8000000);
4331
4332 mdelay(10); /* Delay 10ms */
4333 rtl_write_dword(rtlpriv, 0xcb8, 0x00000000);
4334 delay_count = 0;
4335 while (1) {
4336 iqk_ready = rtl_get_bbreg(hw, 0xd00, BIT(10));
4337 if ((~iqk_ready) || (delay_count > 20))
4338 break;
4339 else{
4340 mdelay(1);
4341 delay_count++;
4342 }
4343 }
4344
4345 if (delay_count < 20) { /* If 20ms No Result, then cal_retry++ */
4346 /* ============RXIQK Check============== */
4347 rx_fail = rtl_get_bbreg(hw, 0xd00, BIT(11));
4348 if (rx_fail == 0) {
4349 rtl_write_dword(rtlpriv, 0xcb8, 0x06000000);
4350 rx_x0[cal] = rtl_get_bbreg(hw, 0xd00, 0x07ff0000)<<21;
4351 rtl_write_dword(rtlpriv, 0xcb8, 0x08000000);
4352 rx_y0[cal] = rtl_get_bbreg(hw, 0xd00, 0x07ff0000)<<21;
4353 rx0iqkok = true;
4354 break;
4355 } else{
4356 rtl_set_bbreg(hw, 0xc10, 0x000003ff, 0x200>>1);
4357 rtl_set_bbreg(hw, 0xc10, 0x03ff0000, 0x0>>1);
4358 rx0iqkok = false;
4359 cal_retry++;
4360 if (cal_retry == 10)
4361 break;
4362
4363 }
4364 } else{
4365 rx0iqkok = false;
4366 cal_retry++;
4367 if (cal_retry == 10)
4368 break;
4369 }
4370 }
4371 }
4372
4373 if (tx0iqkok)
4374 tx_average++;
4375 if (rx0iqkok)
4376 rx_average++;
4377 rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */
4378 rtl_set_rfreg(hw, path, 0x65, RFREG_OFFSET_MASK, temp_reg65);
4379 break;
4380 default:
4381 break;
4382 }
4383 cal++;
4384 }
4385
4386 /* FillIQK Result */
4387 switch (path) {
4388 case RF90_PATH_A:
4389 RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD,
4390 "========Path_A =======\n");
4391 if (tx_average == 0)
4392 break;
4393
4394 for (i = 0; i < tx_average; i++) {
4395 RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD,
4396 "TX_X0_RXK[%d] = %x ;; TX_Y0_RXK[%d] = %x\n", i,
4397 (tx_x0_rxk[i])>>21&0x000007ff, i,
4398 (tx_y0_rxk[i])>>21&0x000007ff);
4399 RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD,
4400 "TX_X0[%d] = %x ;; TX_Y0[%d] = %x\n", i,
4401 (tx_x0[i])>>21&0x000007ff, i,
4402 (tx_y0[i])>>21&0x000007ff);
4403 }
4404 for (i = 0; i < tx_average; i++) {
4405 for (ii = i+1; ii < tx_average; ii++) {
4406 dx = (tx_x0[i]>>21) - (tx_x0[ii]>>21);
4407 if (dx < 3 && dx > -3) {
4408 dy = (tx_y0[i]>>21) - (tx_y0[ii]>>21);
4409 if (dy < 3 && dy > -3) {
4410 tx_x = ((tx_x0[i]>>21) + (tx_x0[ii]>>21))/2;
4411 tx_y = ((tx_y0[i]>>21) + (tx_y0[ii]>>21))/2;
4412 tx_finish = 1;
4413 break;
4414 }
4415 }
4416 }
4417 if (tx_finish == 1)
4418 break;
4419 }
4420
4421 if (tx_finish == 1)
4422 _rtl8821ae_iqk_tx_fill_iqc(hw, path, tx_x, tx_y); /* ? */
4423 else
4424 _rtl8821ae_iqk_tx_fill_iqc(hw, path, 0x200, 0x0);
4425
4426 if (rx_average == 0)
4427 break;
4428
4429 for (i = 0; i < rx_average; i++)
4430 RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD,
4431 "RX_X0[%d] = %x ;; RX_Y0[%d] = %x\n", i,
4432 (rx_x0[i])>>21&0x000007ff, i,
4433 (rx_y0[i])>>21&0x000007ff);
4434 for (i = 0; i < rx_average; i++) {
4435 for (ii = i+1; ii < rx_average; ii++) {
4436 dx = (rx_x0[i]>>21) - (rx_x0[ii]>>21);
4437 if (dx < 4 && dx > -4) {
4438 dy = (rx_y0[i]>>21) - (rx_y0[ii]>>21);
4439 if (dy < 4 && dy > -4) {
4440 rx_x = ((rx_x0[i]>>21) + (rx_x0[ii]>>21))/2;
4441 rx_y = ((rx_y0[i]>>21) + (rx_y0[ii]>>21))/2;
4442 rx_finish = 1;
4443 break;
4444 }
4445 }
4446 }
4447 if (rx_finish == 1)
4448 break;
4449 }
4450
4451 if (rx_finish == 1)
4452 _rtl8821ae_iqk_rx_fill_iqc(hw, path, rx_x, rx_y);
4453 else
4454 _rtl8821ae_iqk_rx_fill_iqc(hw, path, 0x200, 0x0);
4455 break;
4456 default:
4457 break;
4458 }
4459}
4460
4461static void _rtl8821ae_iqk_restore_rf(struct ieee80211_hw *hw,
4462 enum radio_path path,
4463 u32 *backup_rf_reg,
4464 u32 *rf_backup, u32 rf_reg_num)
4465{
4466 struct rtl_priv *rtlpriv = rtl_priv(hw);
4467 u32 i;
4468
4469 rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */
4470 for (i = 0; i < RF_REG_NUM; i++)
4471 rtl_set_rfreg(hw, path, backup_rf_reg[i], RFREG_OFFSET_MASK,
4472 rf_backup[i]);
4473
4474 switch (path) {
4475 case RF90_PATH_A:
4476 RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD,
4477 "RestoreRF Path A Success!!!!\n");
4478 break;
4479 default:
4480 break;
4481 }
4482}
4483
4484static void _rtl8821ae_iqk_restore_afe(struct ieee80211_hw *hw,
4485 u32 *afe_backup, u32 *backup_afe_reg,
4486 u32 afe_num)
4487{
4488 u32 i;
4489 struct rtl_priv *rtlpriv = rtl_priv(hw);
4490
4491 rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */
4492 /* Reload AFE Parameters */
4493 for (i = 0; i < afe_num; i++)
4494 rtl_write_dword(rtlpriv, backup_afe_reg[i], afe_backup[i]);
4495 rtl_set_bbreg(hw, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */
4496 rtl_write_dword(rtlpriv, 0xc80, 0x0);
4497 rtl_write_dword(rtlpriv, 0xc84, 0x0);
4498 rtl_write_dword(rtlpriv, 0xc88, 0x0);
4499 rtl_write_dword(rtlpriv, 0xc8c, 0x3c000000);
4500 rtl_write_dword(rtlpriv, 0xc90, 0x00000080);
4501 rtl_write_dword(rtlpriv, 0xc94, 0x00000000);
4502 rtl_write_dword(rtlpriv, 0xcc4, 0x20040000);
4503 rtl_write_dword(rtlpriv, 0xcc8, 0x20000000);
4504 rtl_write_dword(rtlpriv, 0xcb8, 0x0);
4505 RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD, "RestoreAFE Success!!!!\n");
4506}
4507
4508static void _rtl8821ae_iqk_restore_macbb(struct ieee80211_hw *hw,
4509 u32 *macbb_backup,
4510 u32 *backup_macbb_reg,
4511 u32 macbb_num)
4512{
4513 u32 i;
4514 struct rtl_priv *rtlpriv = rtl_priv(hw);
4515
4516 rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */
4517 /* Reload MacBB Parameters */
4518 for (i = 0; i < macbb_num; i++)
4519 rtl_write_dword(rtlpriv, backup_macbb_reg[i], macbb_backup[i]);
4520 RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD, "RestoreMacBB Success!!!!\n");
4521}
4522
4523#undef MACBB_REG_NUM
4524#undef AFE_REG_NUM
4525#undef RF_REG_NUM
4526
4527#define MACBB_REG_NUM 11
4528#define AFE_REG_NUM 12
4529#define RF_REG_NUM 3
4530
4531static void _rtl8821ae_phy_iq_calibrate(struct ieee80211_hw *hw)
4532{
4533 u32 macbb_backup[MACBB_REG_NUM];
4534 u32 afe_backup[AFE_REG_NUM];
4535 u32 rfa_backup[RF_REG_NUM];
4536 u32 rfb_backup[RF_REG_NUM];
4537 u32 backup_macbb_reg[MACBB_REG_NUM] = {
4538 0xb00, 0x520, 0x550, 0x808, 0x90c, 0xc00, 0xc50,
4539 0xe00, 0xe50, 0x838, 0x82c
4540 };
4541 u32 backup_afe_reg[AFE_REG_NUM] = {
4542 0xc5c, 0xc60, 0xc64, 0xc68, 0xc6c, 0xc70, 0xc74,
4543 0xc78, 0xc7c, 0xc80, 0xc84, 0xcb8
4544 };
4545 u32 backup_rf_reg[RF_REG_NUM] = {0x65, 0x8f, 0x0};
4546
4547 _rtl8821ae_iqk_backup_macbb(hw, macbb_backup, backup_macbb_reg,
4548 MACBB_REG_NUM);
4549 _rtl8821ae_iqk_backup_afe(hw, afe_backup, backup_afe_reg, AFE_REG_NUM);
4550 _rtl8821ae_iqk_backup_rf(hw, rfa_backup, rfb_backup, backup_rf_reg,
4551 RF_REG_NUM);
4552
4553 _rtl8821ae_iqk_configure_mac(hw);
4554 _rtl8821ae_iqk_tx(hw, RF90_PATH_A);
4555 _rtl8821ae_iqk_restore_rf(hw, RF90_PATH_A, backup_rf_reg, rfa_backup,
4556 RF_REG_NUM);
4557
4558 _rtl8821ae_iqk_restore_afe(hw, afe_backup, backup_afe_reg, AFE_REG_NUM);
4559 _rtl8821ae_iqk_restore_macbb(hw, macbb_backup, backup_macbb_reg,
4560 MACBB_REG_NUM);
4561}
4562
4563static void _rtl8821ae_phy_set_rfpath_switch(struct ieee80211_hw *hw, bool main)
4564{
4565 struct rtl_priv *rtlpriv = rtl_priv(hw);
4566 /* struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); */
4567 /* struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw)); */
4568 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "\n");
4569
4570 if (main)
4571 rtl_set_bbreg(hw, RA_RFE_PINMUX + 4, BIT(29) | BIT(28), 0x1);
4572 else
4573 rtl_set_bbreg(hw, RA_RFE_PINMUX + 4, BIT(29) | BIT(28), 0x2);
4574}
4575
4576#undef IQK_ADDA_REG_NUM
4577#undef IQK_DELAY_TIME
4578
4579void rtl8812ae_phy_iq_calibrate(struct ieee80211_hw *hw, bool b_recovery)
4580{
4581}
4582
4583void rtl8812ae_do_iqk(struct ieee80211_hw *hw, u8 delta_thermal_index,
4584 u8 thermal_value, u8 threshold)
4585{
4586 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
4587
4588 rtldm->thermalvalue_iqk = thermal_value;
4589 rtl8812ae_phy_iq_calibrate(hw, false);
4590}
4591
4592void rtl8821ae_phy_iq_calibrate(struct ieee80211_hw *hw, bool b_recovery)
4593{
4594 struct rtl_priv *rtlpriv = rtl_priv(hw);
4595 struct rtl_phy *rtlphy = &rtlpriv->phy;
4596
4597 if (!rtlphy->lck_inprogress) {
4598 spin_lock(&rtlpriv->locks.iqk_lock);
4599 rtlphy->lck_inprogress = true;
4600 spin_unlock(&rtlpriv->locks.iqk_lock);
4601
4602 _rtl8821ae_phy_iq_calibrate(hw);
4603
4604 spin_lock(&rtlpriv->locks.iqk_lock);
4605 rtlphy->lck_inprogress = false;
4606 spin_unlock(&rtlpriv->locks.iqk_lock);
4607 }
4608}
4609
4610void rtl8821ae_reset_iqk_result(struct ieee80211_hw *hw)
4611{
4612 struct rtl_priv *rtlpriv = rtl_priv(hw);
4613 struct rtl_phy *rtlphy = &rtlpriv->phy;
4614 u8 i;
4615
4616 RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD,
4617 "rtl8812ae_dm_reset_iqk_result:: settings regs %d default regs %d\n",
4618 (int)(sizeof(rtlphy->iqk_matrix) /
4619 sizeof(struct iqk_matrix_regs)),
4620 IQK_MATRIX_SETTINGS_NUM);
4621
4622 for (i = 0; i < IQK_MATRIX_SETTINGS_NUM; i++) {
4623 rtlphy->iqk_matrix[i].value[0][0] = 0x100;
4624 rtlphy->iqk_matrix[i].value[0][2] = 0x100;
4625 rtlphy->iqk_matrix[i].value[0][4] = 0x100;
4626 rtlphy->iqk_matrix[i].value[0][6] = 0x100;
4627
4628 rtlphy->iqk_matrix[i].value[0][1] = 0x0;
4629 rtlphy->iqk_matrix[i].value[0][3] = 0x0;
4630 rtlphy->iqk_matrix[i].value[0][5] = 0x0;
4631 rtlphy->iqk_matrix[i].value[0][7] = 0x0;
4632
4633 rtlphy->iqk_matrix[i].iqk_done = false;
4634 }
4635}
4636
4637void rtl8821ae_do_iqk(struct ieee80211_hw *hw, u8 delta_thermal_index,
4638 u8 thermal_value, u8 threshold)
4639{
4640 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
4641
4642 rtl8821ae_reset_iqk_result(hw);
4643
4644 rtldm->thermalvalue_iqk = thermal_value;
4645 rtl8821ae_phy_iq_calibrate(hw, false);
4646}
4647
4648void rtl8821ae_phy_lc_calibrate(struct ieee80211_hw *hw)
4649{
4650}
4651
4652void rtl8821ae_phy_ap_calibrate(struct ieee80211_hw *hw, char delta)
4653{
4654}
4655
4656void rtl8821ae_phy_set_rfpath_switch(struct ieee80211_hw *hw, bool bmain)
4657{
4658 _rtl8821ae_phy_set_rfpath_switch(hw, bmain);
4659}
4660
4661bool rtl8821ae_phy_set_io_cmd(struct ieee80211_hw *hw, enum io_type iotype)
4662{
4663 struct rtl_priv *rtlpriv = rtl_priv(hw);
4664 struct rtl_phy *rtlphy = &rtlpriv->phy;
4665 bool postprocessing = false;
4666
4667 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
4668 "-->IO Cmd(%#x), set_io_inprogress(%d)\n",
4669 iotype, rtlphy->set_io_inprogress);
4670 do {
4671 switch (iotype) {
4672 case IO_CMD_RESUME_DM_BY_SCAN:
4673 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
4674 "[IO CMD] Resume DM after scan.\n");
4675 postprocessing = true;
4676 break;
4677 case IO_CMD_PAUSE_BAND0_DM_BY_SCAN:
4678 case IO_CMD_PAUSE_BAND1_DM_BY_SCAN:
4679 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
4680 "[IO CMD] Pause DM before scan.\n");
4681 postprocessing = true;
4682 break;
4683 default:
4684 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
4685 "switch case not process\n");
4686 break;
4687 }
4688 } while (false);
4689 if (postprocessing && !rtlphy->set_io_inprogress) {
4690 rtlphy->set_io_inprogress = true;
4691 rtlphy->current_io_type = iotype;
4692 } else {
4693 return false;
4694 }
4695 rtl8821ae_phy_set_io(hw);
4696 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE, "IO Type(%#x)\n", iotype);
4697 return true;
4698}
4699
4700static void rtl8821ae_phy_set_io(struct ieee80211_hw *hw)
4701{
4702 struct rtl_priv *rtlpriv = rtl_priv(hw);
4703 struct dig_t *dm_digtable = &rtlpriv->dm_digtable;
4704 struct rtl_phy *rtlphy = &rtlpriv->phy;
4705
4706 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
4707 "--->Cmd(%#x), set_io_inprogress(%d)\n",
4708 rtlphy->current_io_type, rtlphy->set_io_inprogress);
4709 switch (rtlphy->current_io_type) {
4710 case IO_CMD_RESUME_DM_BY_SCAN:
4711 if (rtlpriv->mac80211.opmode == NL80211_IFTYPE_ADHOC)
4712 _rtl8821ae_resume_tx_beacon(hw);
4713 rtl8821ae_dm_write_dig(hw, rtlphy->initgain_backup.xaagccore1);
4714 rtl8821ae_dm_write_cck_cca_thres(hw,
4715 rtlphy->initgain_backup.cca);
4716 break;
4717 case IO_CMD_PAUSE_BAND0_DM_BY_SCAN:
4718 if (rtlpriv->mac80211.opmode == NL80211_IFTYPE_ADHOC)
4719 _rtl8821ae_stop_tx_beacon(hw);
4720 rtlphy->initgain_backup.xaagccore1 = dm_digtable->cur_igvalue;
4721 rtl8821ae_dm_write_dig(hw, 0x17);
4722 rtlphy->initgain_backup.cca = dm_digtable->cur_cck_cca_thres;
4723 rtl8821ae_dm_write_cck_cca_thres(hw, 0x40);
4724 break;
4725 case IO_CMD_PAUSE_BAND1_DM_BY_SCAN:
4726 break;
4727 default:
4728 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
4729 "switch case not process\n");
4730 break;
4731 }
4732 rtlphy->set_io_inprogress = false;
4733 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
4734 "(%#x)\n", rtlphy->current_io_type);
4735}
4736
4737static void rtl8821ae_phy_set_rf_on(struct ieee80211_hw *hw)
4738{
4739 struct rtl_priv *rtlpriv = rtl_priv(hw);
4740
4741 rtl_write_byte(rtlpriv, REG_SPS0_CTRL, 0x2b);
4742 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE3);
4743 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE2);
4744 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE3);
4745 rtl_write_byte(rtlpriv, REG_TXPAUSE, 0x00);
4746}
4747
4748static bool _rtl8821ae_phy_set_rf_power_state(struct ieee80211_hw *hw,
4749 enum rf_pwrstate rfpwr_state)
4750{
4751 struct rtl_priv *rtlpriv = rtl_priv(hw);
4752 struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw);
4753 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
4754 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
4755 bool bresult = true;
4756 u8 i, queue_id;
4757 struct rtl8192_tx_ring *ring = NULL;
4758
4759 switch (rfpwr_state) {
4760 case ERFON:
4761 if ((ppsc->rfpwr_state == ERFOFF) &&
4762 RT_IN_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC)) {
4763 bool rtstatus = false;
4764 u32 initializecount = 0;
4765
4766 do {
4767 initializecount++;
4768 RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
4769 "IPS Set eRf nic enable\n");
4770 rtstatus = rtl_ps_enable_nic(hw);
4771 } while (!rtstatus && (initializecount < 10));
4772 RT_CLEAR_PS_LEVEL(ppsc,
4773 RT_RF_OFF_LEVL_HALT_NIC);
4774 } else {
4775 RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
4776 "Set ERFON sleeped:%d ms\n",
4777 jiffies_to_msecs(jiffies -
4778 ppsc->
4779 last_sleep_jiffies));
4780 ppsc->last_awake_jiffies = jiffies;
4781 rtl8821ae_phy_set_rf_on(hw);
4782 }
4783 if (mac->link_state == MAC80211_LINKED) {
4784 rtlpriv->cfg->ops->led_control(hw,
4785 LED_CTL_LINK);
4786 } else {
4787 rtlpriv->cfg->ops->led_control(hw,
4788 LED_CTL_NO_LINK);
4789 }
4790 break;
4791 case ERFOFF:
4792 for (queue_id = 0, i = 0;
4793 queue_id < RTL_PCI_MAX_TX_QUEUE_COUNT;) {
4794 ring = &pcipriv->dev.tx_ring[queue_id];
4795 if (queue_id == BEACON_QUEUE ||
4796 skb_queue_len(&ring->queue) == 0) {
4797 queue_id++;
4798 continue;
4799 } else {
4800 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
4801 "eRf Off/Sleep: %d times TcbBusyQueue[%d] =%d before doze!\n",
4802 (i + 1), queue_id,
4803 skb_queue_len(&ring->queue));
4804
4805 udelay(10);
4806 i++;
4807 }
4808 if (i >= MAX_DOZE_WAITING_TIMES_9x) {
4809 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
4810 "\n ERFSLEEP: %d times TcbBusyQueue[%d] = %d !\n",
4811 MAX_DOZE_WAITING_TIMES_9x,
4812 queue_id,
4813 skb_queue_len(&ring->queue));
4814 break;
4815 }
4816 }
4817
4818 if (ppsc->reg_rfps_level & RT_RF_OFF_LEVL_HALT_NIC) {
4819 RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
4820 "IPS Set eRf nic disable\n");
4821 rtl_ps_disable_nic(hw);
4822 RT_SET_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC);
4823 } else {
4824 if (ppsc->rfoff_reason == RF_CHANGE_BY_IPS) {
4825 rtlpriv->cfg->ops->led_control(hw,
4826 LED_CTL_NO_LINK);
4827 } else {
4828 rtlpriv->cfg->ops->led_control(hw,
4829 LED_CTL_POWER_OFF);
4830 }
4831 }
4832 break;
4833 default:
4834 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
4835 "switch case not process\n");
4836 bresult = false;
4837 break;
4838 }
4839 if (bresult)
4840 ppsc->rfpwr_state = rfpwr_state;
4841 return bresult;
4842}
4843
4844bool rtl8821ae_phy_set_rf_power_state(struct ieee80211_hw *hw,
4845 enum rf_pwrstate rfpwr_state)
4846{
4847 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
4848
4849 bool bresult = false;
4850
4851 if (rfpwr_state == ppsc->rfpwr_state)
4852 return bresult;
4853 bresult = _rtl8821ae_phy_set_rf_power_state(hw, rfpwr_state);
4854 return bresult;
4855}
diff --git a/drivers/net/wireless/rtlwifi/rtl8821ae/phy.h b/drivers/net/wireless/rtlwifi/rtl8821ae/phy.h
new file mode 100644
index 000000000000..c411f0a95cc4
--- /dev/null
+++ b/drivers/net/wireless/rtlwifi/rtl8821ae/phy.h
@@ -0,0 +1,259 @@
1/******************************************************************************
2 *
3 * Copyright(c) 2009-2010 Realtek Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * The full GNU General Public License is included in this distribution in the
15 * file called LICENSE.
16 *
17 * Contact Information:
18 * wlanfae <wlanfae@realtek.com>
19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20 * Hsinchu 300, Taiwan.
21 *
22 * Larry Finger <Larry.Finger@lwfinger.net>
23 *
24 *****************************************************************************/
25
26#ifndef __RTL8821AE_PHY_H__
27#define __RTL8821AE_PHY_H__
28
29/* MAX_TX_COUNT must always be set to 4, otherwise read
30 * efuse table sequence will be wrong.
31 */
32#define MAX_TX_COUNT 4
33#define TX_1S 0
34#define TX_2S 1
35#define TX_3S 2
36#define TX_4S 3
37
38#define MAX_POWER_INDEX 0x3F
39
40#define MAX_PRECMD_CNT 16
41#define MAX_RFDEPENDCMD_CNT 16
42#define MAX_POSTCMD_CNT 16
43
44#define MAX_DOZE_WAITING_TIMES_9x 64
45
46#define RT_CANNOT_IO(hw) false
47#define HIGHPOWER_RADIOA_ARRAYLEN 22
48
49#define IQK_ADDA_REG_NUM 16
50#define IQK_BB_REG_NUM 9
51#define MAX_TOLERANCE 5
52#define IQK_DELAY_TIME 10
53#define index_mapping_NUM 15
54
55#define APK_BB_REG_NUM 5
56#define APK_AFE_REG_NUM 16
57#define APK_CURVE_REG_NUM 4
58#define PATH_NUM 2
59
60#define LOOP_LIMIT 5
61#define MAX_STALL_TIME 50
62#define AntennaDiversityValue 0x80
63#define MAX_TXPWR_IDX_NMODE_92S 63
64#define Reset_Cnt_Limit 3
65
66#define IQK_ADDA_REG_NUM 16
67#define IQK_MAC_REG_NUM 4
68
69#define RF6052_MAX_PATH 2
70
71#define CT_OFFSET_MAC_ADDR 0X16
72
73#define CT_OFFSET_CCK_TX_PWR_IDX 0x5A
74#define CT_OFFSET_HT401S_TX_PWR_IDX 0x60
75#define CT_OFFSET_HT402S_TX_PWR_IDX_DIFF 0x66
76#define CT_OFFSET_HT20_TX_PWR_IDX_DIFF 0x69
77#define CT_OFFSET_OFDM_TX_PWR_IDX_DIFF 0x6C
78
79#define CT_OFFSET_HT40_MAX_PWR_OFFSET 0x6F
80#define CT_OFFSET_HT20_MAX_PWR_OFFSET 0x72
81
82#define CT_OFFSET_CHANNEL_PLAH 0x75
83#define CT_OFFSET_THERMAL_METER 0x78
84#define CT_OFFSET_RF_OPTION 0x79
85#define CT_OFFSET_VERSION 0x7E
86#define CT_OFFSET_CUSTOMER_ID 0x7F
87
88#define RTL8821AE_MAX_PATH_NUM 2
89
90#define TARGET_CHNL_NUM_2G_5G_8812 59
91
92enum swchnlcmd_id {
93 CMDID_END,
94 CMDID_SET_TXPOWEROWER_LEVEL,
95 CMDID_BBREGWRITE10,
96 CMDID_WRITEPORT_ULONG,
97 CMDID_WRITEPORT_USHORT,
98 CMDID_WRITEPORT_UCHAR,
99 CMDID_RF_WRITEREG,
100};
101
102struct swchnlcmd {
103 enum swchnlcmd_id cmdid;
104 u32 para1;
105 u32 para2;
106 u32 msdelay;
107};
108
109enum hw90_block_e {
110 HW90_BLOCK_MAC = 0,
111 HW90_BLOCK_PHY0 = 1,
112 HW90_BLOCK_PHY1 = 2,
113 HW90_BLOCK_RF = 3,
114 HW90_BLOCK_MAXIMUM = 4,
115};
116
117enum baseband_config_type {
118 BASEBAND_CONFIG_PHY_REG = 0,
119 BASEBAND_CONFIG_AGC_TAB = 1,
120};
121
122enum ra_offset_area {
123 RA_OFFSET_LEGACY_OFDM1,
124 RA_OFFSET_LEGACY_OFDM2,
125 RA_OFFSET_HT_OFDM1,
126 RA_OFFSET_HT_OFDM2,
127 RA_OFFSET_HT_OFDM3,
128 RA_OFFSET_HT_OFDM4,
129 RA_OFFSET_HT_CCK,
130};
131
132enum antenna_path {
133 ANTENNA_NONE,
134 ANTENNA_D,
135 ANTENNA_C,
136 ANTENNA_CD,
137 ANTENNA_B,
138 ANTENNA_BD,
139 ANTENNA_BC,
140 ANTENNA_BCD,
141 ANTENNA_A,
142 ANTENNA_AD,
143 ANTENNA_AC,
144 ANTENNA_ACD,
145 ANTENNA_AB,
146 ANTENNA_ABD,
147 ANTENNA_ABC,
148 ANTENNA_ABCD
149};
150
151struct r_antenna_select_ofdm {
152 u32 r_tx_antenna:4;
153 u32 r_ant_l:4;
154 u32 r_ant_non_ht:4;
155 u32 r_ant_ht1:4;
156 u32 r_ant_ht2:4;
157 u32 r_ant_ht_s1:4;
158 u32 r_ant_non_ht_s1:4;
159 u32 ofdm_txsc:2;
160 u32 reserved:2;
161};
162
163struct r_antenna_select_cck {
164 u8 r_cckrx_enable_2:2;
165 u8 r_cckrx_enable:2;
166 u8 r_ccktx_enable:4;
167};
168
169struct efuse_contents {
170 u8 mac_addr[ETH_ALEN];
171 u8 cck_tx_power_idx[6];
172 u8 ht40_1s_tx_power_idx[6];
173 u8 ht40_2s_tx_power_idx_diff[3];
174 u8 ht20_tx_power_idx_diff[3];
175 u8 ofdm_tx_power_idx_diff[3];
176 u8 ht40_max_power_offset[3];
177 u8 ht20_max_power_offset[3];
178 u8 channel_plan;
179 u8 thermal_meter;
180 u8 rf_option[5];
181 u8 version;
182 u8 oem_id;
183 u8 regulatory;
184};
185
186struct tx_power_struct {
187 u8 cck[RTL8821AE_MAX_PATH_NUM][CHANNEL_MAX_NUMBER];
188 u8 ht40_1s[RTL8821AE_MAX_PATH_NUM][CHANNEL_MAX_NUMBER];
189 u8 ht40_2s[RTL8821AE_MAX_PATH_NUM][CHANNEL_MAX_NUMBER];
190 u8 ht20_diff[RTL8821AE_MAX_PATH_NUM][CHANNEL_MAX_NUMBER];
191 u8 legacy_ht_diff[RTL8821AE_MAX_PATH_NUM][CHANNEL_MAX_NUMBER];
192 u8 legacy_ht_txpowerdiff;
193 u8 groupht20[RTL8821AE_MAX_PATH_NUM][CHANNEL_MAX_NUMBER];
194 u8 groupht40[RTL8821AE_MAX_PATH_NUM][CHANNEL_MAX_NUMBER];
195 u8 pwrgroup_cnt;
196 u32 mcs_original_offset[4][16];
197};
198enum _ANT_DIV_TYPE {
199 NO_ANTDIV = 0xFF,
200 CG_TRX_HW_ANTDIV = 0x01,
201 CGCS_RX_HW_ANTDIV = 0x02,
202 FIXED_HW_ANTDIV = 0x03,
203 CG_TRX_SMART_ANTDIV = 0x04,
204 CGCS_RX_SW_ANTDIV = 0x05,
205
206};
207
208u32 rtl8821ae_phy_query_bb_reg(struct ieee80211_hw *hw,
209 u32 regaddr, u32 bitmask);
210void rtl8821ae_phy_set_bb_reg(struct ieee80211_hw *hw,
211 u32 regaddr, u32 bitmask, u32 data);
212u32 rtl8821ae_phy_query_rf_reg(struct ieee80211_hw *hw,
213 enum radio_path rfpath, u32 regaddr,
214 u32 bitmask);
215void rtl8821ae_phy_set_rf_reg(struct ieee80211_hw *hw,
216 enum radio_path rfpath, u32 regaddr,
217 u32 bitmask, u32 data);
218bool rtl8821ae_phy_mac_config(struct ieee80211_hw *hw);
219bool rtl8821ae_phy_bb_config(struct ieee80211_hw *hw);
220bool rtl8821ae_phy_rf_config(struct ieee80211_hw *hw);
221void rtl8821ae_phy_switch_wirelessband(struct ieee80211_hw *hw,
222 u8 band);
223void rtl8821ae_phy_get_hw_reg_originalvalue(struct ieee80211_hw *hw);
224void rtl8821ae_phy_get_txpower_level(struct ieee80211_hw *hw,
225 long *powerlevel);
226void rtl8821ae_phy_set_txpower_level(struct ieee80211_hw *hw,
227 u8 channel);
228void rtl8821ae_phy_scan_operation_backup(struct ieee80211_hw *hw,
229 u8 operation);
230void rtl8821ae_phy_set_bw_mode_callback(struct ieee80211_hw *hw);
231void rtl8821ae_phy_set_bw_mode(struct ieee80211_hw *hw,
232 enum nl80211_channel_type ch_type);
233void rtl8821ae_phy_sw_chnl_callback(struct ieee80211_hw *hw);
234u8 rtl8821ae_phy_sw_chnl(struct ieee80211_hw *hw);
235void rtl8821ae_phy_iq_calibrate(struct ieee80211_hw *hw,
236 bool b_recovery);
237void rtl8812ae_phy_iq_calibrate(struct ieee80211_hw *hw,
238 bool b_recovery);
239void rtl8821ae_phy_ap_calibrate(struct ieee80211_hw *hw, char delta);
240void rtl8821ae_phy_lc_calibrate(struct ieee80211_hw *hw);
241void rtl8821ae_phy_set_rfpath_switch(struct ieee80211_hw *hw, bool bmain);
242bool rtl8812ae_phy_config_rf_with_headerfile(struct ieee80211_hw *hw,
243 enum radio_path rfpath);
244bool rtl8821ae_phy_config_rf_with_headerfile(struct ieee80211_hw *hw,
245 enum radio_path rfpath);
246bool rtl8821ae_phy_set_io_cmd(struct ieee80211_hw *hw, enum io_type iotype);
247bool rtl8821ae_phy_set_rf_power_state(struct ieee80211_hw *hw,
248 enum rf_pwrstate rfpwr_state);
249u8 _rtl8812ae_get_right_chnl_place_for_iqk(u8 chnl);
250void rtl8821ae_phy_set_txpower_level_by_path(struct ieee80211_hw *hw,
251 u8 channel, u8 path);
252void rtl8812ae_do_iqk(struct ieee80211_hw *hw, u8 delta_thermal_index,
253 u8 thermal_value, u8 threshold);
254void rtl8821ae_do_iqk(struct ieee80211_hw *hw, u8 delta_thermal_index,
255 u8 thermal_value, u8 threshold);
256void rtl8821ae_reset_iqk_result(struct ieee80211_hw *hw);
257u32 phy_get_tx_swing_8812A(struct ieee80211_hw *hw, u8 band, u8 rf_path);
258
259#endif
diff --git a/drivers/net/wireless/rtlwifi/rtl8821ae/pwrseq.c b/drivers/net/wireless/rtlwifi/rtl8821ae/pwrseq.c
new file mode 100644
index 000000000000..9ddf78a187dd
--- /dev/null
+++ b/drivers/net/wireless/rtlwifi/rtl8821ae/pwrseq.c
@@ -0,0 +1,182 @@
1/******************************************************************************
2 *
3 * Copyright(c) 2009-2010 Realtek Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * The full GNU General Public License is included in this distribution in the
15 * file called LICENSE.
16 *
17 * Contact Information:
18 * wlanfae <wlanfae@realtek.com>
19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20 * Hsinchu 300, Taiwan.
21 *
22 * Larry Finger <Larry.Finger@lwfinger.net>
23 *
24 *****************************************************************************/
25
26#include "../pwrseqcmd.h"
27#include "pwrseq.h"
28
29/* drivers should parse below arrays and do the corresponding actions */
30/* 3 Power on Array */
31struct wlan_pwr_cfg rtl8812_power_on_flow[RTL8812_TRANS_CARDEMU_TO_ACT_STEPS +
32 RTL8812_TRANS_END_STEPS] = {
33 RTL8812_TRANS_CARDEMU_TO_ACT
34 RTL8812_TRANS_END
35};
36
37/* 3Radio off GPIO Array */
38struct wlan_pwr_cfg rtl8812_radio_off_flow[RTL8812_TRANS_ACT_TO_CARDEMU_STEPS +
39 RTL8812_TRANS_END_STEPS] = {
40 RTL8812_TRANS_ACT_TO_CARDEMU
41 RTL8812_TRANS_END
42};
43
44/* 3Card Disable Array */
45struct wlan_pwr_cfg rtl8812_card_disable_flow[RTL8812_TRANS_ACT_TO_CARDEMU_STEPS
46 + RTL8812_TRANS_CARDEMU_TO_PDN_STEPS
47 + RTL8812_TRANS_END_STEPS] = {
48 RTL8812_TRANS_ACT_TO_CARDEMU
49 RTL8812_TRANS_CARDEMU_TO_CARDDIS
50 RTL8812_TRANS_END
51};
52
53/* 3 Card Enable Array */
54struct wlan_pwr_cfg rtl8812_card_enable_flow[RTL8812_TRANS_ACT_TO_CARDEMU_STEPS
55 + RTL8812_TRANS_CARDEMU_TO_PDN_STEPS
56 + RTL8812_TRANS_END_STEPS] = {
57 RTL8812_TRANS_CARDDIS_TO_CARDEMU
58 RTL8812_TRANS_CARDEMU_TO_ACT
59 RTL8812_TRANS_END
60};
61
62/* 3Suspend Array */
63struct wlan_pwr_cfg rtl8812_suspend_flow[RTL8812_TRANS_ACT_TO_CARDEMU_STEPS +
64 RTL8812_TRANS_CARDEMU_TO_SUS_STEPS +
65 RTL8812_TRANS_END_STEPS] = {
66 RTL8812_TRANS_ACT_TO_CARDEMU
67 RTL8812_TRANS_CARDEMU_TO_SUS
68 RTL8812_TRANS_END
69};
70
71/* 3 Resume Array */
72struct wlan_pwr_cfg rtl8812_resume_flow[RTL8812_TRANS_ACT_TO_CARDEMU_STEPS +
73 RTL8812_TRANS_CARDEMU_TO_SUS_STEPS +
74 RTL8812_TRANS_END_STEPS] = {
75 RTL8812_TRANS_SUS_TO_CARDEMU
76 RTL8812_TRANS_CARDEMU_TO_ACT
77 RTL8812_TRANS_END
78};
79
80/* 3HWPDN Array */
81struct wlan_pwr_cfg rtl8812_hwpdn_flow[RTL8812_TRANS_ACT_TO_CARDEMU_STEPS +
82 RTL8812_TRANS_CARDEMU_TO_PDN_STEPS +
83 RTL8812_TRANS_END_STEPS] = {
84 RTL8812_TRANS_ACT_TO_CARDEMU
85 RTL8812_TRANS_CARDEMU_TO_PDN
86 RTL8812_TRANS_END
87};
88
89/* 3 Enter LPS */
90struct wlan_pwr_cfg rtl8812_enter_lps_flow[RTL8812_TRANS_ACT_TO_LPS_STEPS +
91 RTL8812_TRANS_END_STEPS] = {
92 /* FW behavior */
93 RTL8812_TRANS_ACT_TO_LPS
94 RTL8812_TRANS_END
95};
96
97/* 3 Leave LPS */
98struct wlan_pwr_cfg rtl8812_leave_lps_flow[RTL8812_TRANS_LPS_TO_ACT_STEPS +
99 RTL8812_TRANS_END_STEPS] = {
100 /* FW behavior */
101 RTL8812_TRANS_LPS_TO_ACT
102 RTL8812_TRANS_END
103};
104
105/* drivers should parse below arrays and do the corresponding actions */
106/*3 Power on Array*/
107struct wlan_pwr_cfg rtl8821A_power_on_flow[RTL8821A_TRANS_CARDEMU_TO_ACT_STEPS
108 + RTL8821A_TRANS_END_STEPS] = {
109 RTL8821A_TRANS_CARDEMU_TO_ACT
110 RTL8821A_TRANS_END
111};
112
113/*3Radio off GPIO Array */
114struct wlan_pwr_cfg rtl8821A_radio_off_flow[RTL8821A_TRANS_ACT_TO_CARDEMU_STEPS
115 + RTL8821A_TRANS_END_STEPS] = {
116 RTL8821A_TRANS_ACT_TO_CARDEMU
117 RTL8821A_TRANS_END
118};
119
120/*3Card Disable Array*/
121struct wlan_pwr_cfg rtl8821A_card_disable_flow
122 [RTL8821A_TRANS_ACT_TO_CARDEMU_STEPS
123 + RTL8821A_TRANS_CARDEMU_TO_PDN_STEPS
124 + RTL8821A_TRANS_END_STEPS] = {
125 RTL8821A_TRANS_ACT_TO_CARDEMU
126 RTL8821A_TRANS_CARDEMU_TO_CARDDIS
127 RTL8821A_TRANS_END
128};
129
130/*3 Card Enable Array*/
131/*RTL8821A_TRANS_CARDEMU_TO_PDN_STEPS*/
132struct wlan_pwr_cfg rtl8821A_card_enable_flow
133 [RTL8821A_TRANS_ACT_TO_CARDEMU_STEPS
134 + RTL8821A_TRANS_CARDEMU_TO_ACT_STEPS
135 + RTL8821A_TRANS_END_STEPS] = {
136 RTL8821A_TRANS_CARDDIS_TO_CARDEMU
137 RTL8821A_TRANS_CARDEMU_TO_ACT
138 RTL8821A_TRANS_END
139};
140
141/*3Suspend Array*/
142struct wlan_pwr_cfg rtl8821A_suspend_flow[RTL8821A_TRANS_ACT_TO_CARDEMU_STEPS
143 + RTL8821A_TRANS_CARDEMU_TO_SUS_STEPS
144 + RTL8821A_TRANS_END_STEPS] = {
145 RTL8821A_TRANS_ACT_TO_CARDEMU
146 RTL8821A_TRANS_CARDEMU_TO_SUS
147 RTL8821A_TRANS_END
148};
149
150/*3 Resume Array*/
151struct wlan_pwr_cfg rtl8821A_resume_flow[RTL8821A_TRANS_ACT_TO_CARDEMU_STEPS
152 + RTL8821A_TRANS_CARDEMU_TO_SUS_STEPS
153 + RTL8821A_TRANS_END_STEPS] = {
154 RTL8821A_TRANS_SUS_TO_CARDEMU
155 RTL8821A_TRANS_CARDEMU_TO_ACT
156 RTL8821A_TRANS_END
157};
158
159/*3HWPDN Array*/
160struct wlan_pwr_cfg rtl8821A_hwpdn_flow[RTL8821A_TRANS_ACT_TO_CARDEMU_STEPS
161 + RTL8821A_TRANS_CARDEMU_TO_PDN_STEPS
162 + RTL8821A_TRANS_END_STEPS] = {
163 RTL8821A_TRANS_ACT_TO_CARDEMU
164 RTL8821A_TRANS_CARDEMU_TO_PDN
165 RTL8821A_TRANS_END
166};
167
168/*3 Enter LPS */
169struct wlan_pwr_cfg rtl8821A_enter_lps_flow[RTL8821A_TRANS_ACT_TO_LPS_STEPS
170 + RTL8821A_TRANS_END_STEPS] = {
171 /*FW behavior*/
172 RTL8821A_TRANS_ACT_TO_LPS
173 RTL8821A_TRANS_END
174};
175
176/*3 Leave LPS */
177struct wlan_pwr_cfg rtl8821A_leave_lps_flow[RTL8821A_TRANS_LPS_TO_ACT_STEPS
178 + RTL8821A_TRANS_END_STEPS] = {
179 /*FW behavior*/
180 RTL8821A_TRANS_LPS_TO_ACT
181 RTL8821A_TRANS_END
182};
diff --git a/drivers/net/wireless/rtlwifi/rtl8821ae/pwrseq.h b/drivers/net/wireless/rtlwifi/rtl8821ae/pwrseq.h
new file mode 100644
index 000000000000..bf0b0ce9519c
--- /dev/null
+++ b/drivers/net/wireless/rtlwifi/rtl8821ae/pwrseq.h
@@ -0,0 +1,738 @@
1/******************************************************************************
2 *
3 * Copyright(c) 2009-2010 Realtek Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * The full GNU General Public License is included in this distribution in the
15 * file called LICENSE.
16 *
17 * Contact Information:
18 * wlanfae <wlanfae@realtek.com>
19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20 * Hsinchu 300, Taiwan.
21 *
22 * Larry Finger <Larry.Finger@lwfinger.net>
23 *
24 *****************************************************************************/
25
26#ifndef __RTL8821AE_PWRSEQ_H__
27#define __RTL8821AE_PWRSEQ_H__
28
29#include "../pwrseqcmd.h"
30#include "../btcoexist/halbt_precomp.h"
31
32#define RTL8812_TRANS_CARDEMU_TO_ACT_STEPS 15
33#define RTL8812_TRANS_ACT_TO_CARDEMU_STEPS 15
34#define RTL8812_TRANS_CARDEMU_TO_SUS_STEPS 15
35#define RTL8812_TRANS_SUS_TO_CARDEMU_STEPS 15
36#define RTL8812_TRANS_CARDEMU_TO_PDN_STEPS 25
37#define RTL8812_TRANS_PDN_TO_CARDEMU_STEPS 15
38#define RTL8812_TRANS_ACT_TO_LPS_STEPS 15
39#define RTL8812_TRANS_LPS_TO_ACT_STEPS 15
40#define RTL8812_TRANS_END_STEPS 1
41
42/* The following macros have the following format:
43 * { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value
44 * comments },
45 */
46#define RTL8812_TRANS_CARDEMU_TO_ACT \
47 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
48 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT2, 0 \
49 /* disable SW LPS 0x04[10]=0*/}, \
50 {0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
51 PWR_BASEADDR_MAC, PWR_CMD_POLLING, BIT1, BIT1 \
52 /* wait till 0x04[17] = 1 power ready*/}, \
53 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
54 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT7, 0 \
55 /* disable HWPDN 0x04[15]=0*/}, \
56 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
57 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT3, 0 \
58 /* disable WL suspend*/}, \
59 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
60 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT0, BIT0 \
61 /* polling until return 0*/}, \
62 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
63 PWR_BASEADDR_MAC, PWR_CMD_POLLING, BIT0, 0},
64
65#define RTL8812_TRANS_ACT_TO_CARDEMU \
66 {0x0c00, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
67 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x04 \
68 /* 0xc00[7:0] = 4 turn off 3-wire */}, \
69 {0x0e00, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
70 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x04 \
71 /* 0xe00[7:0] = 4 turn off 3-wire */}, \
72 {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
73 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT0, 0 \
74 /* 0x2[0] = 0 RESET BB, CLOSE RF */}, \
75 {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
76 PWR_BASEADDR_MAC, PWR_CMD_DELAY, 0, PWRSEQ_DELAY_US \
77 /*Delay 1us*/}, \
78 {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,\
79 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT1, 0 \
80 /* Whole BB is reset*/}, \
81 {0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
82 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x2A \
83 /* 0x07[7:0] = 0x28 sps pwm mode 0x2a for BT coex*/}, \
84 {0x0008, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,\
85 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0x02, 0 \
86 /*0x8[1] = 0 ANA clk =500k */}, \
87 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
88 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT1, BIT1 \
89 /*0x04[9] = 1 turn off MAC by HW state machine*/}, \
90 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
91 PWR_BASEADDR_MAC, PWR_CMD_POLLING, BIT1, 0 \
92 /*wait till 0x04[9] = 0 polling until return 0 to disable*/},
93
94#define RTL8812_TRANS_CARDEMU_TO_SUS \
95 {0x0042, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,\
96 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xF0, 0xcc}, \
97 {0x0042, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,\
98 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xF0, 0xEC}, \
99 {0x0043, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
100 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x07 \
101 /* gpio11 input mode, gpio10~8 output mode */}, \
102 {0x0045, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
103 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x00 \
104 /* gpio 0~7 output same value as input ?? */}, \
105 {0x0046, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
106 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0xff \
107 /* gpio0~7 output mode */}, \
108 {0x0047, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
109 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0 \
110 /* 0x47[7:0] = 00 gpio mode */}, \
111 {0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,\
112 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0 \
113 /* suspend option all off */}, \
114 {0x0014, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
115 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0x80, BIT7 \
116 /*0x14[7] = 1 turn on ZCD */}, \
117 {0x0015, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
118 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0x01, BIT0 \
119 /* 0x15[0] =1 trun on ZCD */}, \
120 {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
121 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0x10, BIT4 \
122 /*0x23[4] = 1 hpon LDO sleep mode */}, \
123 {0x0008, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,\
124 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0x02, 0 \
125 /*0x8[1] = 0 ANA clk =500k */}, \
126 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
127 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT3, BIT3 \
128 /*0x04[11] = 2b'11 enable WL suspend for PCIe*/},
129
130#define RTL8812_TRANS_SUS_TO_CARDEMU \
131 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
132 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT3, 0 \
133 /*0x04[11] = 2b'01enable WL suspend*/}, \
134 {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
135 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0x10, 0 \
136 /*0x23[4] = 0 hpon LDO sleep mode leave */}, \
137 {0x0015, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
138 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0x01, 0 \
139 /* 0x15[0] =0 trun off ZCD */}, \
140 {0x0014, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
141 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0x80, 0 \
142 /*0x14[7] = 0 turn off ZCD */}, \
143 {0x0046, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
144 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x00 \
145 /* gpio0~7 input mode */}, \
146 {0x0043, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
147 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x00 \
148 /* gpio11 input mode, gpio10~8 input mode */},
149
150#define RTL8812_TRANS_CARDEMU_TO_CARDDIS \
151 {0x0003, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
152 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT2, 0 \
153 /*0x03[2] = 0, reset 8051*/}, \
154 {0x0080, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
155 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x05 \
156 /*0x80=05h if reload fw, fill the default value of host_CPU handshake field*/}, \
157 {0x0042, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,\
158 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xF0, 0xcc}, \
159 {0x0042, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,\
160 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xF0, 0xEC}, \
161 {0x0043, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
162 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x07 \
163 /* gpio11 input mode, gpio10~8 output mode */}, \
164 {0x0045, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
165 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x00 \
166 /* gpio 0~7 output same value as input ?? */}, \
167 {0x0046, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
168 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0xff \
169 /* gpio0~7 output mode */}, \
170 {0x0047, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
171 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0 \
172 /* 0x47[7:0] = 00 gpio mode */}, \
173 {0x0014, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
174 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0x80, BIT7 \
175 /*0x14[7] = 1 turn on ZCD */}, \
176 {0x0015, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
177 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0x01, BIT0 \
178 /* 0x15[0] =1 trun on ZCD */}, \
179 {0x0012, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
180 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0x01, 0 \
181 /*0x12[0] = 0 force PFM mode */}, \
182 {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
183 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0x10, BIT4 \
184 /*0x23[4] = 1 hpon LDO sleep mode */}, \
185 {0x0008, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,\
186 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0x02, 0 \
187 /*0x8[1] = 0 ANA clk =500k */}, \
188 {0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,\
189 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x20 \
190 /*0x07=0x20 , SOP option to disable BG/MB*/}, \
191 {0x001f, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,\
192 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT1, 0 \
193 /*0x01f[1]=0 , disable RFC_0 control REG_RF_CTRL_8812 */}, \
194 {0x0076, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,\
195 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT1, 0 \
196 /*0x076[1]=0 , disable RFC_1 control REG_OPT_CTRL_8812 +2 */}, \
197 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
198 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT3, BIT3 \
199 /*0x04[11] = 2b'01 enable WL suspend*/},
200
201#define RTL8812_TRANS_CARDDIS_TO_CARDEMU \
202 {0x0012, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
203 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT0, BIT0 \
204 /*0x12[0] = 1 force PWM mode */}, \
205 {0x0014, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
206 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0x80, 0 \
207 /*0x14[7] = 0 turn off ZCD */}, \
208 {0x0015, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
209 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0x01, 0 \
210 /* 0x15[0] =0 trun off ZCD */}, \
211 {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
212 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0x10, 0 \
213 /*0x23[4] = 0 hpon LDO leave sleep mode */}, \
214 {0x0046, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
215 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x00 \
216 /* gpio0~7 input mode */}, \
217 {0x0043, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
218 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x00 \
219 /* gpio11 input mode, gpio10~8 input mode */}, \
220 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,\
221 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT2, 0 \
222 /*0x04[10] = 0, enable SW LPS PCIE only*/}, \
223 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
224 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT3, 0 \
225 /*0x04[11] = 2b'01enable WL suspend*/}, \
226 {0x0003, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
227 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT2, BIT2 \
228 /*0x03[2] = 1, enable 8051*/}, \
229 {0x0301, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,\
230 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0 \
231 /*PCIe DMA start*/},
232
233#define RTL8812_TRANS_CARDEMU_TO_PDN \
234 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
235 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT7, BIT7 \
236 /* 0x04[15] = 1*/},
237
238#define RTL8812_TRANS_PDN_TO_CARDEMU \
239 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
240 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT7, 0 \
241 /* 0x04[15] = 0*/},
242
243#define RTL8812_TRANS_ACT_TO_LPS \
244 {0x0301, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,\
245 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0xFF \
246 /*PCIe DMA stop*/}, \
247 {0x0522, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
248 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x7F \
249 /*Tx Pause*/}, \
250 {0x05F8, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
251 PWR_BASEADDR_MAC, PWR_CMD_POLLING, 0xFF, 0 \
252 /*Should be zero if no packet is transmitting*/}, \
253 {0x05F9, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
254 PWR_BASEADDR_MAC, PWR_CMD_POLLING, 0xFF, 0 \
255 /*Should be zero if no packet is transmitting*/}, \
256 {0x05FA, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
257 PWR_BASEADDR_MAC, PWR_CMD_POLLING, 0xFF, 0 \
258 /*Should be zero if no packet is transmitting*/}, \
259 {0x05FB, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
260 PWR_BASEADDR_MAC, PWR_CMD_POLLING, 0xFF, 0 \
261 /*Should be zero if no packet is transmitting*/}, \
262 {0x0c00, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
263 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x04 \
264 /* 0xc00[7:0] = 4 turn off 3-wire */}, \
265 {0x0e00, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
266 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x04 \
267 /* 0xe00[7:0] = 4 turn off 3-wire */}, \
268 {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
269 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT0, 0 \
270 /*CCK and OFDM are disabled,and clock are gated,and RF closed*/}, \
271 {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
272 PWR_BASEADDR_MAC, PWR_CMD_DELAY, 0, PWRSEQ_DELAY_US \
273 /*Delay 1us*/}, \
274 {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,\
275 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT1, 0 \
276 /* Whole BB is reset*/}, \
277 {0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
278 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x03 \
279 /*Reset MAC TRX*/}, \
280 {0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
281 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT1, 0 \
282 /*check if removed later*/}, \
283 {0x0553, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
284 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT5, BIT5 \
285 /*Respond TxOK to scheduler*/},
286
287#define RTL8812_TRANS_LPS_TO_ACT \
288 {0x0080, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,\
289 PWR_BASEADDR_SDIO, PWR_CMD_WRITE, 0xFF, 0x84 \
290 /*SDIO RPWM*/}, \
291 {0xFE58, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,\
292 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x84 \
293 /*USB RPWM*/}, \
294 {0x0361, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,\
295 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x84 \
296 /*PCIe RPWM*/}, \
297 {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
298 PWR_BASEADDR_MAC, PWR_CMD_DELAY, 0, PWRSEQ_DELAY_MS \
299 /*Delay*/}, \
300 {0x0008, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
301 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT4, 0 \
302 /*. 0x08[4] = 0 switch TSF to 40M*/}, \
303 {0x0109, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
304 PWR_BASEADDR_MAC, PWR_CMD_POLLING, BIT7, 0 \
305 /*Polling 0x109[7]=0 TSF in 40M*/}, \
306 {0x0029, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
307 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT6|BIT7, 0 \
308 /*. 0x29[7:6] = 2b'00 enable BB clock*/}, \
309 {0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
310 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT1, BIT1 \
311 /*. 0x101[1] = 1*/}, \
312 {0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
313 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0xFF \
314 /*. 0x100[7:0] = 0xFF enable WMAC TRX*/}, \
315 {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
316 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT1|BIT0, BIT1|BIT0 \
317 /*. 0x02[1:0] = 2b'11 enable BB macro*/}, \
318 {0x0522, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
319 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0 \
320 /*. 0x522 = 0*/},
321
322#define RTL8812_TRANS_END \
323 {0xFFFF, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
324 0, PWR_CMD_END, 0, 0},
325
326extern struct wlan_pwr_cfg rtl8812_power_on_flow
327 [RTL8812_TRANS_CARDEMU_TO_ACT_STEPS +
328 RTL8812_TRANS_END_STEPS];
329extern struct wlan_pwr_cfg rtl8812_radio_off_flow
330 [RTL8812_TRANS_ACT_TO_CARDEMU_STEPS +
331 RTL8812_TRANS_END_STEPS];
332extern struct wlan_pwr_cfg rtl8812_card_disable_flow
333 [RTL8812_TRANS_ACT_TO_CARDEMU_STEPS +
334 RTL8812_TRANS_CARDEMU_TO_PDN_STEPS +
335 RTL8812_TRANS_END_STEPS];
336extern struct wlan_pwr_cfg rtl8812_card_enable_flow
337 [RTL8812_TRANS_ACT_TO_CARDEMU_STEPS +
338 RTL8812_TRANS_CARDEMU_TO_PDN_STEPS +
339 RTL8812_TRANS_END_STEPS];
340extern struct wlan_pwr_cfg rtl8812_suspend_flow
341 [RTL8812_TRANS_ACT_TO_CARDEMU_STEPS +
342 RTL8812_TRANS_CARDEMU_TO_SUS_STEPS +
343 RTL8812_TRANS_END_STEPS];
344extern struct wlan_pwr_cfg rtl8812_resume_flow
345 [RTL8812_TRANS_ACT_TO_CARDEMU_STEPS +
346 RTL8812_TRANS_CARDEMU_TO_SUS_STEPS +
347 RTL8812_TRANS_END_STEPS];
348extern struct wlan_pwr_cfg rtl8812_hwpdn_flow
349 [RTL8812_TRANS_ACT_TO_CARDEMU_STEPS +
350 RTL8812_TRANS_CARDEMU_TO_PDN_STEPS +
351 RTL8812_TRANS_END_STEPS];
352extern struct wlan_pwr_cfg rtl8812_enter_lps_flow
353 [RTL8812_TRANS_ACT_TO_LPS_STEPS +
354 RTL8812_TRANS_END_STEPS];
355extern struct wlan_pwr_cfg rtl8812_leave_lps_flow
356 [RTL8812_TRANS_LPS_TO_ACT_STEPS +
357 RTL8812_TRANS_END_STEPS];
358
359/* Check document WM-20130516-JackieLau-RTL8821A_Power_Architecture-R10.vsd
360 * There are 6 HW Power States:
361 * 0: POFF--Power Off
362 * 1: PDN--Power Down
363 * 2: CARDEMU--Card Emulation
364 * 3: ACT--Active Mode
365 * 4: LPS--Low Power State
366 * 5: SUS--Suspend
367 *
368 * The transision from different states are defined below
369 * TRANS_CARDEMU_TO_ACT
370 * TRANS_ACT_TO_CARDEMU
371 * TRANS_CARDEMU_TO_SUS
372 * TRANS_SUS_TO_CARDEMU
373 * TRANS_CARDEMU_TO_PDN
374 * TRANS_ACT_TO_LPS
375 * TRANS_LPS_TO_ACT
376 *
377 * TRANS_END
378 */
379#define RTL8821A_TRANS_CARDEMU_TO_ACT_STEPS 25
380#define RTL8821A_TRANS_ACT_TO_CARDEMU_STEPS 15
381#define RTL8821A_TRANS_CARDEMU_TO_SUS_STEPS 15
382#define RTL8821A_TRANS_SUS_TO_CARDEMU_STEPS 15
383#define RTL8821A_TRANS_CARDDIS_TO_CARDEMU_STEPS 15
384#define RTL8821A_TRANS_CARDEMU_TO_PDN_STEPS 15
385#define RTL8821A_TRANS_PDN_TO_CARDEMU_STEPS 15
386#define RTL8821A_TRANS_ACT_TO_LPS_STEPS 15
387#define RTL8821A_TRANS_LPS_TO_ACT_STEPS 15
388#define RTL8821A_TRANS_END_STEPS 1
389
390#define RTL8821A_TRANS_CARDEMU_TO_ACT \
391 {0x0020, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \
392 PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,\
393 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT0, BIT0 \
394 /*0x20[0] = 1b'1 enable LDOA12 MACRO block for all interface*/}, \
395 {0x0067, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \
396 PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,\
397 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT4, 0 \
398 /*0x67[0] = 0 to disable BT_GPS_SEL pins*/}, \
399 {0x0001, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \
400 PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,\
401 PWR_BASEADDR_MAC, PWR_CMD_DELAY, 1, PWRSEQ_DELAY_MS \
402 /*Delay 1ms*/}, \
403 {0x0000, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \
404 PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,\
405 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT5, 0 \
406 /*0x00[5] = 1b'0 release analog Ips to digital ,1:isolation*/}, \
407 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
408 PWR_BASEADDR_MAC, PWR_CMD_WRITE, (BIT4|BIT3|BIT2), 0 \
409 /* disable SW LPS 0x04[10]=0 and WLSUS_EN 0x04[12:11]=0*/}, \
410 {0x0075, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,\
411 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT0 , BIT0 \
412 /* Disable USB suspend */}, \
413 {0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
414 PWR_BASEADDR_MAC, PWR_CMD_POLLING, BIT1, BIT1 \
415 /* wait till 0x04[17] = 1 power ready*/}, \
416 {0x0075, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,\
417 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT0 , 0 \
418 /* Enable USB suspend */}, \
419 {0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
420 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT0, BIT0 \
421 /* release WLON reset 0x04[16]=1*/}, \
422 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
423 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT7, 0 \
424 /* disable HWPDN 0x04[15]=0*/}, \
425 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
426 PWR_BASEADDR_MAC, PWR_CMD_WRITE, (BIT4|BIT3), 0 \
427 /* disable WL suspend*/}, \
428 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
429 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT0, BIT0 \
430 /* polling until return 0*/}, \
431 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
432 PWR_BASEADDR_MAC, PWR_CMD_POLLING, BIT0, 0 \
433 /**/}, \
434 {0x004F, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
435 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT0, BIT0 \
436 /*0x4C[24] = 0x4F[0] = 1, switch DPDT_SEL_P output from WL BB */},\
437 {0x0067, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
438 PWR_BASEADDR_MAC, PWR_CMD_WRITE, (BIT5|BIT4), (BIT5|BIT4) \
439 /*0x66[13] = 0x67[5] = 1, switch for PAPE_G/PAPE_A \
440 from WL BB ; 0x66[12] = 0x67[4] = 1, switch LNAON from WL BB */},\
441 {0x0025, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
442 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT6, 0 \
443 /*anapar_mac<118> , 0x25[6]=0 by wlan single function*/},\
444 {0x0049, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
445 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT1, BIT1 \
446 /*Enable falling edge triggering interrupt*/},\
447 {0x0063, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
448 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT1, BIT1 \
449 /*Enable GPIO9 interrupt mode*/},\
450 {0x0062, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
451 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT1, 0 \
452 /*Enable GPIO9 input mode*/},\
453 {0x0058, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
454 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT0, BIT0 \
455 /*Enable HSISR GPIO[C:0] interrupt*/},\
456 {0x005A, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
457 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT1, BIT1 \
458 /*Enable HSISR GPIO9 interrupt*/},\
459 {0x007A, PWR_CUT_TESTCHIP_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
460 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x3A \
461 /*0x7A = 0x3A start BT*/},\
462 {0x002E, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
463 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF , 0x82 \
464 /* 0x2C[23:12]=0x820 ; XTAL trim */}, \
465 {0x0010, PWR_CUT_A_MSK , PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
466 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT6 , BIT6 \
467 /* 0x10[6]=1 */},
468
469#define RTL8821A_TRANS_ACT_TO_CARDEMU \
470 {0x001F, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
471 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0 \
472 /*0x1F[7:0] = 0 turn off RF*/}, \
473 {0x004F, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
474 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT0, 0 \
475 /*0x4C[24] = 0x4F[0] = 0, switch DPDT_SEL_P output from \
476 register 0x65[2] */},\
477 {0x0049, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
478 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT1, 0 \
479 /*Enable rising edge triggering interrupt*/}, \
480 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
481 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT1, BIT1 \
482 /*0x04[9] = 1 turn off MAC by HW state machine*/}, \
483 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
484 PWR_BASEADDR_MAC, PWR_CMD_POLLING, BIT1, 0 \
485 /*wait till 0x04[9] = 0 polling until return 0 to disable*/}, \
486 {0x0000, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \
487 PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,\
488 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT5, BIT5 \
489 /*0x00[5] = 1b'1 analog Ips to digital ,1:isolation*/}, \
490 {0x0020, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \
491 PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,\
492 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT0, 0 \
493 /*0x20[0] = 1b'0 disable LDOA12 MACRO block*/},
494
495#define RTL8821A_TRANS_CARDEMU_TO_SUS \
496 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,\
497 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT4|BIT3, (BIT4|BIT3) \
498 /*0x04[12:11] = 2b'11 enable WL suspend for PCIe*/}, \
499 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \
500 PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,\
501 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT3|BIT4, BIT3 \
502 /*0x04[12:11] = 2b'01 enable WL suspend*/}, \
503 {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,\
504 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT4, BIT4 \
505 /*0x23[4] = 1b'1 12H LDO enter sleep mode*/}, \
506 {0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,\
507 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x20 \
508 /*0x07[7:0] = 0x20 SDIO SOP option to disable BG/MB/ACK/SWR*/}, \
509 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,\
510 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT3|BIT4, BIT3|BIT4 \
511 /*0x04[12:11] = 2b'11 enable WL suspend for PCIe*/}, \
512 {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,\
513 PWR_BASEADDR_SDIO, PWR_CMD_WRITE, BIT0, BIT0 \
514 /*Set SDIO suspend local register*/}, \
515 {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,\
516 PWR_BASEADDR_SDIO, PWR_CMD_POLLING, BIT1, 0 \
517 /*wait power state to suspend*/},
518
519#define RTL8821A_TRANS_SUS_TO_CARDEMU \
520 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
521 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT3 | BIT7, 0 \
522 /*clear suspend enable and power down enable*/}, \
523 {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,\
524 PWR_BASEADDR_SDIO, PWR_CMD_WRITE, BIT0, 0 \
525 /*Set SDIO suspend local register*/}, \
526 {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,\
527 PWR_BASEADDR_SDIO, PWR_CMD_POLLING, BIT1, BIT1 \
528 /*wait power state to suspend*/},\
529 {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,\
530 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT4, 0 \
531 /*0x23[4] = 1b'0 12H LDO enter normal mode*/}, \
532 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
533 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT3|BIT4, 0 \
534 /*0x04[12:11] = 2b'01enable WL suspend*/},
535
536#define RTL8821A_TRANS_CARDEMU_TO_CARDDIS \
537 {0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,\
538 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x20 \
539 /*0x07=0x20 , SOP option to disable BG/MB*/}, \
540 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \
541 PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,\
542 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT3|BIT4, BIT3 \
543 /*0x04[12:11] = 2b'01 enable WL suspend*/}, \
544 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,\
545 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT2, BIT2 \
546 /*0x04[10] = 1, enable SW LPS*/}, \
547 {0x004A, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,\
548 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT0, 1 \
549 /*0x48[16] = 1 to enable GPIO9 as EXT WAKEUP*/}, \
550 {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,\
551 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT4, BIT4 \
552 /*0x23[4] = 1b'1 12H LDO enter sleep mode*/}, \
553 {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,\
554 PWR_BASEADDR_SDIO, PWR_CMD_WRITE, BIT0, BIT0 \
555 /*Set SDIO suspend local register*/}, \
556 {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,\
557 PWR_BASEADDR_SDIO, PWR_CMD_POLLING, BIT1, 0 \
558 /*wait power state to suspend*/},
559
560#define RTL8821A_TRANS_CARDDIS_TO_CARDEMU \
561 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
562 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT3 | BIT7, 0 \
563 /*clear suspend enable and power down enable*/}, \
564 {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,\
565 PWR_BASEADDR_SDIO, PWR_CMD_WRITE, BIT0, 0 \
566 /*Set SDIO suspend local register*/}, \
567 {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,\
568 PWR_BASEADDR_SDIO, PWR_CMD_POLLING, BIT1, BIT1 \
569 /*wait power state to suspend*/},\
570 {0x004A, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,\
571 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT0, 0 \
572 /*0x48[16] = 0 to disable GPIO9 as EXT WAKEUP*/}, \
573 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
574 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT3|BIT4, 0 \
575 /*0x04[12:11] = 2b'01enable WL suspend*/},\
576 {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,\
577 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT4, 0 \
578 /*0x23[4] = 1b'0 12H LDO enter normal mode*/}, \
579 {0x0301, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,\
580 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0 \
581 /*PCIe DMA start*/},
582
583#define RTL8821A_TRANS_CARDEMU_TO_PDN \
584 {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,\
585 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT4, BIT4 \
586 /*0x23[4] = 1b'1 12H LDO enter sleep mode*/}, \
587 {0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \
588 PWR_INTF_SDIO_MSK|PWR_INTF_USB_MSK,\
589 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x20 \
590 /*0x07[7:0] = 0x20 SOP option to disable BG/MB/ACK/SWR*/}, \
591 {0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
592 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT0, 0 \
593 /* 0x04[16] = 0*/},\
594 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
595 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT7, BIT7 \
596 /* 0x04[15] = 1*/},
597
598#define RTL8821A_TRANS_PDN_TO_CARDEMU \
599 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
600 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT7, 0 \
601 /* 0x04[15] = 0*/},
602
603#define RTL8821A_TRANS_ACT_TO_LPS \
604 {0x0301, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,\
605 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0xFF \
606 /*PCIe DMA stop*/}, \
607 {0x0522, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
608 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0xFF \
609 /*Tx Pause*/}, \
610 {0x05F8, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
611 PWR_BASEADDR_MAC, PWR_CMD_POLLING, 0xFF, 0 \
612 /*Should be zero if no packet is transmitting*/}, \
613 {0x05F9, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
614 PWR_BASEADDR_MAC, PWR_CMD_POLLING, 0xFF, 0 \
615 /*Should be zero if no packet is transmitting*/}, \
616 {0x05FA, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
617 PWR_BASEADDR_MAC, PWR_CMD_POLLING, 0xFF, 0 \
618 /*Should be zero if no packet is transmitting*/}, \
619 {0x05FB, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
620 PWR_BASEADDR_MAC, PWR_CMD_POLLING, 0xFF, 0 \
621 /*Should be zero if no packet is transmitting*/}, \
622 {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
623 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT0, 0 \
624 /*CCK and OFDM are disabled,and clock are gated*/}, \
625 {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
626 PWR_BASEADDR_MAC, PWR_CMD_DELAY, 0, PWRSEQ_DELAY_US \
627 /*Delay 1us*/}, \
628 {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
629 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT1, 0 \
630 /*Whole BB is reset*/}, \
631 {0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
632 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x03 \
633 /*Reset MAC TRX*/}, \
634 {0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
635 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT1, 0 \
636 /*check if removed later*/}, \
637 {0x0093, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,\
638 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x00 \
639 /*When driver enter Sus/ Disable, enable LOP for BT*/}, \
640 {0x0553, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
641 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT5, BIT5 \
642 /*Respond TxOK to scheduler*/},
643
644#define RTL8821A_TRANS_LPS_TO_ACT \
645 {0x0080, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,\
646 PWR_BASEADDR_SDIO, PWR_CMD_WRITE, 0xFF, 0x84 \
647 /*SDIO RPWM*/},\
648 {0xFE58, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,\
649 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x84 \
650 /*USB RPWM*/},\
651 {0x0361, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,\
652 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x84 \
653 /*PCIe RPWM*/},\
654 {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
655 PWR_BASEADDR_MAC, PWR_CMD_DELAY, 0, PWRSEQ_DELAY_MS \
656 /*Delay*/},\
657 {0x0008, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
658 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT4, 0 \
659 /*. 0x08[4] = 0 switch TSF to 40M*/},\
660 {0x0109, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
661 PWR_BASEADDR_MAC, PWR_CMD_POLLING, BIT7, 0 \
662 /*Polling 0x109[7]=0 TSF in 40M*/},\
663 {0x0029, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
664 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT6|BIT7, 0 \
665 /*. 0x29[7:6] = 2b'00 enable BB clock*/},\
666 {0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
667 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT1, BIT1 \
668 /*. 0x101[1] = 1*/},\
669 {0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
670 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0xFF \
671 /*. 0x100[7:0] = 0xFF enable WMAC TRX*/},\
672 {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
673 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT1|BIT0, BIT1|BIT0 \
674 /*. 0x02[1:0] = 2b'11 enable BB macro*/},\
675 {0x0522, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
676 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0 \
677 /*. 0x522 = 0*/},
678
679#define RTL8821A_TRANS_END \
680 {0xFFFF, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
681 0, PWR_CMD_END, 0, 0},
682
683extern struct wlan_pwr_cfg rtl8821A_power_on_flow
684 [RTL8821A_TRANS_CARDEMU_TO_ACT_STEPS +
685 RTL8821A_TRANS_END_STEPS];
686extern struct wlan_pwr_cfg rtl8821A_radio_off_flow
687 [RTL8821A_TRANS_ACT_TO_CARDEMU_STEPS +
688 RTL8821A_TRANS_END_STEPS];
689extern struct wlan_pwr_cfg rtl8821A_card_disable_flow
690 [RTL8821A_TRANS_ACT_TO_CARDEMU_STEPS +
691 RTL8821A_TRANS_CARDEMU_TO_PDN_STEPS +
692 RTL8821A_TRANS_END_STEPS];
693extern struct wlan_pwr_cfg rtl8821A_card_enable_flow
694 [RTL8821A_TRANS_ACT_TO_CARDEMU_STEPS +
695 RTL8821A_TRANS_CARDEMU_TO_ACT_STEPS +
696 RTL8821A_TRANS_END_STEPS];
697extern struct wlan_pwr_cfg rtl8821A_suspend_flow
698 [RTL8821A_TRANS_ACT_TO_CARDEMU_STEPS +
699 RTL8821A_TRANS_CARDEMU_TO_SUS_STEPS +
700 RTL8821A_TRANS_END_STEPS];
701extern struct wlan_pwr_cfg rtl8821A_resume_flow
702 [RTL8821A_TRANS_ACT_TO_CARDEMU_STEPS +
703 RTL8821A_TRANS_CARDEMU_TO_SUS_STEPS +
704 RTL8821A_TRANS_END_STEPS];
705extern struct wlan_pwr_cfg rtl8821A_hwpdn_flow
706 [RTL8821A_TRANS_ACT_TO_CARDEMU_STEPS +
707 RTL8821A_TRANS_CARDEMU_TO_PDN_STEPS +
708 RTL8821A_TRANS_END_STEPS];
709extern struct wlan_pwr_cfg rtl8821A_enter_lps_flow
710 [RTL8821A_TRANS_ACT_TO_LPS_STEPS +
711 RTL8821A_TRANS_END_STEPS];
712extern struct wlan_pwr_cfg rtl8821A_leave_lps_flow
713 [RTL8821A_TRANS_LPS_TO_ACT_STEPS +
714 RTL8821A_TRANS_END_STEPS];
715
716/*RTL8812 Power Configuration CMDs for PCIe interface*/
717#define RTL8812_NIC_PWR_ON_FLOW rtl8812_power_on_flow
718#define RTL8812_NIC_RF_OFF_FLOW rtl8812_radio_off_flow
719#define RTL8812_NIC_DISABLE_FLOW rtl8812_card_disable_flow
720#define RTL8812_NIC_ENABLE_FLOW rtl8812_card_enable_flow
721#define RTL8812_NIC_SUSPEND_FLOW rtl8812_suspend_flow
722#define RTL8812_NIC_RESUME_FLOW rtl8812_resume_flow
723#define RTL8812_NIC_PDN_FLOW rtl8812_hwpdn_flow
724#define RTL8812_NIC_LPS_ENTER_FLOW rtl8812_enter_lps_flow
725#define RTL8812_NIC_LPS_LEAVE_FLOW rtl8812_leave_lps_flow
726
727/* RTL8821 Power Configuration CMDs for PCIe interface */
728#define RTL8821A_NIC_PWR_ON_FLOW rtl8821A_power_on_flow
729#define RTL8821A_NIC_RF_OFF_FLOW rtl8821A_radio_off_flow
730#define RTL8821A_NIC_DISABLE_FLOW rtl8821A_card_disable_flow
731#define RTL8821A_NIC_ENABLE_FLOW rtl8821A_card_enable_flow
732#define RTL8821A_NIC_SUSPEND_FLOW rtl8821A_suspend_flow
733#define RTL8821A_NIC_RESUME_FLOW rtl8821A_resume_flow
734#define RTL8821A_NIC_PDN_FLOW rtl8821A_hwpdn_flow
735#define RTL8821A_NIC_LPS_ENTER_FLOW rtl8821A_enter_lps_flow
736#define RTL8821A_NIC_LPS_LEAVE_FLOW rtl8821A_leave_lps_flow
737
738#endif
diff --git a/drivers/net/wireless/rtlwifi/rtl8821ae/reg.h b/drivers/net/wireless/rtlwifi/rtl8821ae/reg.h
new file mode 100644
index 000000000000..53668fc8f23e
--- /dev/null
+++ b/drivers/net/wireless/rtlwifi/rtl8821ae/reg.h
@@ -0,0 +1,2464 @@
1/******************************************************************************
2 *
3 * Copyright(c) 2009-2010 Realtek Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * The full GNU General Public License is included in this distribution in the
15 * file called LICENSE.
16 *
17 * Contact Information:
18 * wlanfae <wlanfae@realtek.com>
19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20 * Hsinchu 300, Taiwan.
21 *
22 * Larry Finger <Larry.Finger@lwfinger.net>
23 *
24 *****************************************************************************/
25
26#ifndef __RTL8821AE_REG_H__
27#define __RTL8821AE_REG_H__
28
29#define TXPKT_BUF_SELECT 0x69
30#define RXPKT_BUF_SELECT 0xA5
31#define DISABLE_TRXPKT_BUF_ACCESS 0x0
32
33#define REG_SYS_ISO_CTRL 0x0000
34#define REG_SYS_FUNC_EN 0x0002
35#define REG_APS_FSMCO 0x0004
36#define REG_SYS_CLKR 0x0008
37#define REG_9346CR 0x000A
38#define REG_EE_VPD 0x000C
39#define REG_AFE_MISC 0x0010
40#define REG_SPS0_CTRL 0x0011
41#define REG_SPS_OCP_CFG 0x0018
42#define REG_RSV_CTRL 0x001C
43#define REG_RF_CTRL 0x001F
44#define REG_LDOA15_CTRL 0x0020
45#define REG_LDOV12D_CTRL 0x0021
46#define REG_LDOHCI12_CTRL 0x0022
47#define REG_LPLDO_CTRL 0x0023
48#define REG_AFE_XTAL_CTRL 0x0024
49 /* 1.5v for 8188EE test chip, 1.4v for MP chip */
50#define REG_AFE_LDO_CTRL 0x0027
51#define REG_AFE_PLL_CTRL 0x0028
52#define REG_MAC_PHY_CTRL 0x002c
53#define REG_EFUSE_CTRL 0x0030
54#define REG_EFUSE_TEST 0x0034
55#define REG_PWR_DATA 0x0038
56#define REG_CAL_TIMER 0x003C
57#define REG_ACLK_MON 0x003E
58#define REG_GPIO_MUXCFG 0x0040
59#define REG_GPIO_IO_SEL 0x0042
60#define REG_MAC_PINMUX_CFG 0x0043
61#define REG_GPIO_PIN_CTRL 0x0044
62#define REG_GPIO_INTM 0x0048
63#define REG_LEDCFG0 0x004C
64#define REG_LEDCFG1 0x004D
65#define REG_LEDCFG2 0x004E
66#define REG_LEDCFG3 0x004F
67#define REG_FSIMR 0x0050
68#define REG_FSISR 0x0054
69#define REG_HSIMR 0x0058
70#define REG_HSISR 0x005c
71#define REG_GPIO_PIN_CTRL_2 0x0060
72#define REG_GPIO_IO_SEL_2 0x0062
73#define REG_MULTI_FUNC_CTRL 0x0068
74#define REG_GPIO_OUTPUT 0x006c
75#define REG_OPT_CTRL 0x0074
76#define REG_AFE_XTAL_CTRL_EXT 0x0078
77#define REG_XCK_OUT_CTRL 0x007c
78#define REG_MCUFWDL 0x0080
79#define REG_WOL_EVENT 0x0081
80#define REG_MCUTSTCFG 0x0084
81
82#define REG_HIMR 0x00B0
83#define REG_HISR 0x00B4
84#define REG_HIMRE 0x00B8
85#define REG_HISRE 0x00BC
86
87#define REG_PMC_DBG_CTRL2 0x00CC
88
89#define REG_EFUSE_ACCESS 0x00CF
90
91#define REG_BIST_SCAN 0x00D0
92#define REG_BIST_RPT 0x00D4
93#define REG_BIST_ROM_RPT 0x00D8
94#define REG_USB_SIE_INTF 0x00E0
95#define REG_PCIE_MIO_INTF 0x00E4
96#define REG_PCIE_MIO_INTD 0x00E8
97#define REG_HPON_FSM 0x00EC
98#define REG_SYS_CFG 0x00F0
99#define REG_GPIO_OUTSTS 0x00F4
100#define REG_MAC_PHY_CTRL_NORMAL 0x00F8
101#define REG_SYS_CFG1 0x00FC
102#define REG_ROM_VERSION 0x00FD
103
104#define REG_CR 0x0100
105#define REG_PBP 0x0104
106#define REG_PKT_BUFF_ACCESS_CTRL 0x0106
107#define REG_TRXDMA_CTRL 0x010C
108#define REG_TRXFF_BNDY 0x0114
109#define REG_TRXFF_STATUS 0x0118
110#define REG_RXFF_PTR 0x011C
111
112#define REG_CPWM 0x012F
113#define REG_FWIMR 0x0130
114#define REG_FWISR 0x0134
115#define REG_FTISR 0x013C
116#define REG_PKTBUF_DBG_CTRL 0x0140
117#define REG_PKTBUF_DBG_DATA_L 0x0144
118#define REG_PKTBUF_DBG_DATA_H 0x0148
119#define REG_RXPKTBUF_CTRL (REG_PKTBUF_DBG_CTRL+2)
120
121#define REG_TC0_CTRL 0x0150
122#define REG_TC1_CTRL 0x0154
123#define REG_TC2_CTRL 0x0158
124#define REG_TC3_CTRL 0x015C
125#define REG_TC4_CTRL 0x0160
126#define REG_TCUNIT_BASE 0x0164
127#define REG_MBIST_START 0x0174
128#define REG_MBIST_DONE 0x0178
129#define REG_MBIST_FAIL 0x017C
130#define REG_32K_CTRL 0x0194
131#define REG_C2HEVT_MSG_NORMAL 0x01A0
132#define REG_C2HEVT_CLEAR 0x01AF
133#define REG_C2HEVT_MSG_TEST 0x01B8
134#define REG_MCUTST_1 0x01c0
135#define REG_MCUTST_WOWLAN 0x01C7
136#define REG_FMETHR 0x01C8
137#define REG_HMETFR 0x01CC
138#define REG_HMEBOX_0 0x01D0
139#define REG_HMEBOX_1 0x01D4
140#define REG_HMEBOX_2 0x01D8
141#define REG_HMEBOX_3 0x01DC
142
143#define REG_LLT_INIT 0x01E0
144#define REG_BB_ACCEESS_CTRL 0x01E8
145#define REG_BB_ACCESS_DATA 0x01EC
146
147#define REG_HMEBOX_EXT_0 0x01F0
148#define REG_HMEBOX_EXT_1 0x01F4
149#define REG_HMEBOX_EXT_2 0x01F8
150#define REG_HMEBOX_EXT_3 0x01FC
151
152#define REG_RQPN 0x0200
153#define REG_FIFOPAGE 0x0204
154#define REG_TDECTRL 0x0208
155#define REG_TXDMA_OFFSET_CHK 0x020C
156#define REG_TXDMA_STATUS 0x0210
157#define REG_RQPN_NPQ 0x0214
158
159#define REG_RXDMA_AGG_PG_TH 0x0280
160 /* FW shall update this register before FW write RXPKT_RELEASE_POLL to 1 */
161#define REG_FW_UPD_RDPTR 0x0284
162 /* Control the RX DMA.*/
163#define REG_RXDMA_CONTROL 0x0286
164/* The number of packets in RXPKTBUF. */
165#define REG_RXPKT_NUM 0x0287
166
167#define REG_PCIE_CTRL_REG 0x0300
168#define REG_INT_MIG 0x0304
169#define REG_BCNQ_DESA 0x0308
170#define REG_HQ_DESA 0x0310
171#define REG_MGQ_DESA 0x0318
172#define REG_VOQ_DESA 0x0320
173#define REG_VIQ_DESA 0x0328
174#define REG_BEQ_DESA 0x0330
175#define REG_BKQ_DESA 0x0338
176#define REG_RX_DESA 0x0340
177
178#define REG_DBI_WDATA 0x0348
179#define REG_DBI_RDATA 0x034C
180#define REG_DBI_CTRL 0x0350
181#define REG_DBI_ADDR 0x0350
182#define REG_DBI_FLAG 0x0352
183#define REG_MDIO_WDATA 0x0354
184#define REG_MDIO_RDATA 0x0356
185#define REG_MDIO_CTL 0x0358
186#define REG_DBG_SEL 0x0360
187#define REG_PCIE_HRPWM 0x0361
188#define REG_PCIE_HCPWM 0x0363
189#define REG_UART_CTRL 0x0364
190#define REG_WATCH_DOG 0x0368
191#define REG_UART_TX_DESA 0x0370
192#define REG_UART_RX_DESA 0x0378
193
194#define REG_HDAQ_DESA_NODEF 0x0000
195#define REG_CMDQ_DESA_NODEF 0x0000
196
197#define REG_VOQ_INFORMATION 0x0400
198#define REG_VIQ_INFORMATION 0x0404
199#define REG_BEQ_INFORMATION 0x0408
200#define REG_BKQ_INFORMATION 0x040C
201#define REG_MGQ_INFORMATION 0x0410
202#define REG_HGQ_INFORMATION 0x0414
203#define REG_BCNQ_INFORMATION 0x0418
204#define REG_TXPKT_EMPTY 0x041A
205
206#define REG_CPU_MGQ_INFORMATION 0x041C
207#define REG_FWHW_TXQ_CTRL 0x0420
208#define REG_HWSEQ_CTRL 0x0423
209#define REG_TXPKTBUF_BCNQ_BDNY 0x0424
210#define REG_TXPKTBUF_MGQ_BDNY 0x0425
211#define REG_MULTI_BCNQ_EN 0x0426
212#define REG_MULTI_BCNQ_OFFSET 0x0427
213#define REG_SPEC_SIFS 0x0428
214#define REG_RL 0x042A
215#define REG_DARFRC 0x0430
216#define REG_RARFRC 0x0438
217#define REG_RRSR 0x0440
218#define REG_ARFR0 0x0444
219#define REG_ARFR1 0x044C
220#define REG_CCK_CHECK 0x0454
221#define REG_AMPDU_MAX_TIME 0x0456
222#define REG_AGGLEN_LMT 0x0458
223#define REG_AMPDU_MIN_SPACE 0x045C
224#define REG_TXPKTBUF_WMAC_LBK_BF_HD 0x045D
225#define REG_FAST_EDCA_CTRL 0x0460
226#define REG_RD_RESP_PKT_TH 0x0463
227#define REG_INIRTS_RATE_SEL 0x0480
228#define REG_INIDATA_RATE_SEL 0x0484
229#define REG_ARFR2 0x048C
230#define REG_ARFR3 0x0494
231#define REG_POWER_STATUS 0x04A4
232#define REG_POWER_STAGE1 0x04B4
233#define REG_POWER_STAGE2 0x04B8
234#define REG_PKT_LIFE_TIME 0x04C0
235#define REG_STBC_SETTING 0x04C4
236#define REG_HT_SINGLE_AMPDU 0x04C7
237#define REG_PROT_MODE_CTRL 0x04C8
238#define REG_MAX_AGGR_NUM 0x04CA
239#define REG_BAR_MODE_CTRL 0x04CC
240#define REG_RA_TRY_RATE_AGG_LMT 0x04CF
241#define REG_EARLY_MODE_CONTROL 0x04D0
242#define REG_NQOS_SEQ 0x04DC
243#define REG_QOS_SEQ 0x04DE
244#define REG_NEED_CPU_HANDLE 0x04E0
245#define REG_PKT_LOSE_RPT 0x04E1
246#define REG_PTCL_ERR_STATUS 0x04E2
247#define REG_TX_RPT_CTRL 0x04EC
248#define REG_TX_RPT_TIME 0x04F0
249#define REG_DUMMY 0x04FC
250
251#define REG_EDCA_VO_PARAM 0x0500
252#define REG_EDCA_VI_PARAM 0x0504
253#define REG_EDCA_BE_PARAM 0x0508
254#define REG_EDCA_BK_PARAM 0x050C
255#define REG_BCNTCFG 0x0510
256#define REG_PIFS 0x0512
257#define REG_RDG_PIFS 0x0513
258#define REG_SIFS_CTX 0x0514
259#define REG_SIFS_TRX 0x0516
260#define REG_AGGR_BREAK_TIME 0x051A
261#define REG_SLOT 0x051B
262#define REG_TX_PTCL_CTRL 0x0520
263#define REG_TXPAUSE 0x0522
264#define REG_DIS_TXREQ_CLR 0x0523
265#define REG_RD_CTRL 0x0524
266#define REG_TBTT_PROHIBIT 0x0540
267#define REG_RD_NAV_NXT 0x0544
268#define REG_NAV_PROT_LEN 0x0546
269#define REG_BCN_CTRL 0x0550
270#define REG_USTIME_TSF 0x0551
271#define REG_MBID_NUM 0x0552
272#define REG_DUAL_TSF_RST 0x0553
273#define REG_BCN_INTERVAL 0x0554
274#define REG_MBSSID_BCN_SPACE 0x0554
275#define REG_DRVERLYINT 0x0558
276#define REG_BCNDMATIM 0x0559
277#define REG_ATIMWND 0x055A
278#define REG_BCN_MAX_ERR 0x055D
279#define REG_RXTSF_OFFSET_CCK 0x055E
280#define REG_RXTSF_OFFSET_OFDM 0x055F
281#define REG_TSFTR 0x0560
282#define REG_INIT_TSFTR 0x0564
283#define REG_SECONDARY_CCA_CTRL 0x0577
284#define REG_PSTIMER 0x0580
285#define REG_TIMER0 0x0584
286#define REG_TIMER1 0x0588
287#define REG_ACMHWCTRL 0x05C0
288#define REG_ACMRSTCTRL 0x05C1
289#define REG_ACMAVG 0x05C2
290#define REG_VO_ADMTIME 0x05C4
291#define REG_VI_ADMTIME 0x05C6
292#define REG_BE_ADMTIME 0x05C8
293#define REG_EDCA_RANDOM_GEN 0x05CC
294#define REG_NOA_DESC_SEL 0x05CF
295#define REG_NOA_DESC_DURATION 0x05E0
296#define REG_NOA_DESC_INTERVAL 0x05E4
297#define REG_NOA_DESC_START 0x05E8
298#define REG_NOA_DESC_COUNT 0x05EC
299#define REG_SCH_TXCMD 0x05F8
300
301#define REG_APSD_CTRL 0x0600
302#define REG_BWOPMODE 0x0603
303#define REG_TCR 0x0604
304#define REG_RCR 0x0608
305#define REG_RX_PKT_LIMIT 0x060C
306#define REG_RX_DLK_TIME 0x060D
307#define REG_RX_DRVINFO_SZ 0x060F
308
309#define REG_MACID 0x0610
310#define REG_BSSID 0x0618
311#define REG_MAR 0x0620
312#define REG_MBIDCAMCFG 0x0628
313
314#define REG_USTIME_EDCA 0x0638
315#define REG_MAC_SPEC_SIFS 0x063A
316#define REG_RESP_SIFS_CCK 0x063C
317#define REG_RESP_SIFS_OFDM 0x063E
318#define REG_ACKTO 0x0640
319#define REG_CTS2TO 0x0641
320#define REG_EIFS 0x0642
321
322#define REG_NAV_CTRL 0x0650
323#define REG_NAV_UPPER 0x0652
324#define REG_BACAMCMD 0x0654
325#define REG_BACAMCONTENT 0x0658
326#define REG_LBDLY 0x0660
327#define REG_FWDLY 0x0661
328#define REG_RXERR_RPT 0x0664
329#define REG_TRXPTCL_CTL 0x0668
330
331#define REG_CAMCMD 0x0670
332#define REG_CAMWRITE 0x0674
333#define REG_CAMREAD 0x0678
334#define REG_CAMDBG 0x067C
335#define REG_SECCFG 0x0680
336
337#define REG_WOW_CTRL 0x0690
338#define REG_PSSTATUS 0x0691
339#define REG_PS_RX_INFO 0x0692
340#define REG_UAPSD_TID 0x0693
341#define REG_LPNAV_CTRL 0x0694
342#define REG_WKFMCAM_NUM 0x0698
343#define REG_WKFMCAM_RWD 0x069C
344#define REG_RXFLTMAP0 0x06A0
345#define REG_RXFLTMAP1 0x06A2
346#define REG_RXFLTMAP2 0x06A4
347#define REG_BCN_PSR_RPT 0x06A8
348#define REG_CALB32K_CTRL 0x06AC
349#define REG_PKT_MON_CTRL 0x06B4
350#define REG_BT_COEX_TABLE 0x06C0
351#define REG_WMAC_RESP_TXINFO 0x06D8
352
353#define REG_USB_INFO 0xFE17
354#define REG_USB_SPECIAL_OPTION 0xFE55
355#define REG_USB_DMA_AGG_TO 0xFE5B
356#define REG_USB_AGG_TO 0xFE5C
357#define REG_USB_AGG_TH 0xFE5D
358
359#define REG_TEST_USB_TXQS 0xFE48
360#define REG_TEST_SIE_VID 0xFE60
361#define REG_TEST_SIE_PID 0xFE62
362#define REG_TEST_SIE_OPTIONAL 0xFE64
363#define REG_TEST_SIE_CHIRP_K 0xFE65
364#define REG_TEST_SIE_PHY 0xFE66
365#define REG_TEST_SIE_MAC_ADDR 0xFE70
366#define REG_TEST_SIE_STRING 0xFE80
367
368#define REG_NORMAL_SIE_VID 0xFE60
369#define REG_NORMAL_SIE_PID 0xFE62
370#define REG_NORMAL_SIE_OPTIONAL 0xFE64
371#define REG_NORMAL_SIE_EP 0xFE65
372#define REG_NORMAL_SIE_PHY 0xFE68
373#define REG_NORMAL_SIE_MAC_ADDR 0xFE70
374#define REG_NORMAL_SIE_STRING 0xFE80
375
376#define CR9346 REG_9346CR
377#define MSR (REG_CR + 2)
378#define ISR REG_HISR
379#define TSFR REG_TSFTR
380
381#define MACIDR0 REG_MACID
382#define MACIDR4 (REG_MACID + 4)
383
384#define PBP REG_PBP
385
386#define IDR0 MACIDR0
387#define IDR4 MACIDR4
388
389#define UNUSED_REGISTER 0x1BF
390#define DCAM UNUSED_REGISTER
391#define PSR UNUSED_REGISTER
392#define BBADDR UNUSED_REGISTER
393#define PHYDATAR UNUSED_REGISTER
394
395#define INVALID_BBRF_VALUE 0x12345678
396
397#define MAX_MSS_DENSITY_2T 0x13
398#define MAX_MSS_DENSITY_1T 0x0A
399
400#define CMDEEPROM_EN BIT(5)
401#define CMDEEPROM_SEL BIT(4)
402#define CMD9346CR_9356SEL BIT(4)
403#define AUTOLOAD_EEPROM (CMDEEPROM_EN|CMDEEPROM_SEL)
404#define AUTOLOAD_EFUSE CMDEEPROM_EN
405
406#define GPIOSEL_GPIO 0
407#define GPIOSEL_ENBT BIT(5)
408
409#define GPIO_IN REG_GPIO_PIN_CTRL
410#define GPIO_OUT (REG_GPIO_PIN_CTRL+1)
411#define GPIO_IO_SEL (REG_GPIO_PIN_CTRL+2)
412#define GPIO_MOD (REG_GPIO_PIN_CTRL+3)
413
414/* 8723/8188E Host System Interrupt Mask Register (offset 0x58, 32 byte) */
415#define HSIMR_GPIO12_0_INT_EN BIT(0)
416#define HSIMR_SPS_OCP_INT_EN BIT(5)
417#define HSIMR_RON_INT_EN BIT(6)
418#define HSIMR_PDN_INT_EN BIT(7)
419#define HSIMR_GPIO9_INT_EN BIT(25)
420
421/* 8723/8188E Host System Interrupt Status Register (offset 0x5C, 32 byte) */
422#define HSISR_GPIO12_0_INT BIT(0)
423#define HSISR_SPS_OCP_INT BIT(5)
424#define HSISR_RON_INT_EN BIT(6)
425#define HSISR_PDNINT BIT(7)
426#define HSISR_GPIO9_INT BIT(25)
427
428#define MSR_NOLINK 0x00
429#define MSR_ADHOC 0x01
430#define MSR_INFRA 0x02
431#define MSR_AP 0x03
432
433#define RRSR_RSC_OFFSET 21
434#define RRSR_SHORT_OFFSET 23
435#define RRSR_RSC_BW_40M 0x600000
436#define RRSR_RSC_UPSUBCHNL 0x400000
437#define RRSR_RSC_LOWSUBCHNL 0x200000
438#define RRSR_SHORT 0x800000
439#define RRSR_1M BIT(0)
440#define RRSR_2M BIT(1)
441#define RRSR_5_5M BIT(2)
442#define RRSR_11M BIT(3)
443#define RRSR_6M BIT(4)
444#define RRSR_9M BIT(5)
445#define RRSR_12M BIT(6)
446#define RRSR_18M BIT(7)
447#define RRSR_24M BIT(8)
448#define RRSR_36M BIT(9)
449#define RRSR_48M BIT(10)
450#define RRSR_54M BIT(11)
451#define RRSR_MCS0 BIT(12)
452#define RRSR_MCS1 BIT(13)
453#define RRSR_MCS2 BIT(14)
454#define RRSR_MCS3 BIT(15)
455#define RRSR_MCS4 BIT(16)
456#define RRSR_MCS5 BIT(17)
457#define RRSR_MCS6 BIT(18)
458#define RRSR_MCS7 BIT(19)
459#define BRSR_ACKSHORTPMB BIT(23)
460
461#define RATR_1M 0x00000001
462#define RATR_2M 0x00000002
463#define RATR_55M 0x00000004
464#define RATR_11M 0x00000008
465#define RATR_6M 0x00000010
466#define RATR_9M 0x00000020
467#define RATR_12M 0x00000040
468#define RATR_18M 0x00000080
469#define RATR_24M 0x00000100
470#define RATR_36M 0x00000200
471#define RATR_48M 0x00000400
472#define RATR_54M 0x00000800
473#define RATR_MCS0 0x00001000
474#define RATR_MCS1 0x00002000
475#define RATR_MCS2 0x00004000
476#define RATR_MCS3 0x00008000
477#define RATR_MCS4 0x00010000
478#define RATR_MCS5 0x00020000
479#define RATR_MCS6 0x00040000
480#define RATR_MCS7 0x00080000
481#define RATR_MCS8 0x00100000
482#define RATR_MCS9 0x00200000
483#define RATR_MCS10 0x00400000
484#define RATR_MCS11 0x00800000
485#define RATR_MCS12 0x01000000
486#define RATR_MCS13 0x02000000
487#define RATR_MCS14 0x04000000
488#define RATR_MCS15 0x08000000
489
490#define RATE_1M BIT(0)
491#define RATE_2M BIT(1)
492#define RATE_5_5M BIT(2)
493#define RATE_11M BIT(3)
494#define RATE_6M BIT(4)
495#define RATE_9M BIT(5)
496#define RATE_12M BIT(6)
497#define RATE_18M BIT(7)
498#define RATE_24M BIT(8)
499#define RATE_36M BIT(9)
500#define RATE_48M BIT(10)
501#define RATE_54M BIT(11)
502#define RATE_MCS0 BIT(12)
503#define RATE_MCS1 BIT(13)
504#define RATE_MCS2 BIT(14)
505#define RATE_MCS3 BIT(15)
506#define RATE_MCS4 BIT(16)
507#define RATE_MCS5 BIT(17)
508#define RATE_MCS6 BIT(18)
509#define RATE_MCS7 BIT(19)
510#define RATE_MCS8 BIT(20)
511#define RATE_MCS9 BIT(21)
512#define RATE_MCS10 BIT(22)
513#define RATE_MCS11 BIT(23)
514#define RATE_MCS12 BIT(24)
515#define RATE_MCS13 BIT(25)
516#define RATE_MCS14 BIT(26)
517#define RATE_MCS15 BIT(27)
518
519#define RATE_ALL_CCK (RATR_1M | RATR_2M | RATR_55M | RATR_11M)
520#define RATE_ALL_OFDM_AG (RATR_6M | RATR_9M | RATR_12M | RATR_18M |\
521 RATR_24M | RATR_36M | RATR_48M | RATR_54M)
522#define RATE_ALL_OFDM_1SS (RATR_MCS0 | RATR_MCS1 | RATR_MCS2 |\
523 RATR_MCS3 | RATR_MCS4 | RATR_MCS5 |\
524 RATR_MCS6 | RATR_MCS7)
525#define RATE_ALL_OFDM_2SS (RATR_MCS8 | RATR_MCS9 | RATR_MCS10 |\
526 RATR_MCS11 | RATR_MCS12 | RATR_MCS13 |\
527 RATR_MCS14 | RATR_MCS15)
528
529#define BW_OPMODE_20MHZ BIT(2)
530#define BW_OPMODE_5G BIT(1)
531#define BW_OPMODE_11J BIT(0)
532
533#define CAM_VALID BIT(15)
534#define CAM_NOTVALID 0x0000
535#define CAM_USEDK BIT(5)
536
537#define CAM_NONE 0x0
538#define CAM_WEP40 0x01
539#define CAM_TKIP 0x02
540#define CAM_AES 0x04
541#define CAM_WEP104 0x05
542
543#define TOTAL_CAM_ENTRY 32
544#define HALF_CAM_ENTRY 16
545
546#define CAM_WRITE BIT(16)
547#define CAM_READ 0x00000000
548#define CAM_POLLINIG BIT(31)
549
550#define SCR_USEDK 0x01
551#define SCR_TXSEC_ENABLE 0x02
552#define SCR_RXSEC_ENABLE 0x04
553
554#define WOW_PMEN BIT(0)
555#define WOW_WOMEN BIT(1)
556#define WOW_MAGIC BIT(2)
557#define WOW_UWF BIT(3)
558
559/*********************************************
560* 8188 IMR/ISR bits
561**********************************************/
562#define IMR_DISABLED 0x0
563/* IMR DW0(0x0060-0063) Bit 0-31 */
564/* TXRPT interrupt when CCX bit of the packet is set */
565#define IMR_TXCCK BIT(30)
566/* Power Save Time Out Interrupt */
567#define IMR_PSTIMEOUT BIT(29)
568/* When GTIMER4 expires, this bit is set to 1 */
569#define IMR_GTINT4 BIT(28)
570/* When GTIMER3 expires, this bit is set to 1 */
571#define IMR_GTINT3 BIT(27)
572/* Transmit Beacon0 Error */
573#define IMR_TBDER BIT(26)
574/* Transmit Beacon0 OK */
575#define IMR_TBDOK BIT(25)
576/* TSF Timer BIT32 toggle indication interrupt */
577#define IMR_TSF_BIT32_TOGGLE BIT(24)
578/* Beacon DMA Interrupt 0 */
579#define IMR_BCNDMAINT0 BIT(20)
580/* Beacon Queue DMA OK0 */
581#define IMR_BCNDOK0 BIT(16)
582/* HSISR Indicator (HSIMR & HSISR is true, this bit is set to 1) */
583#define IMR_HSISR_IND_ON_INT BIT(15)
584/* Beacon DMA Interrupt Extension for Win7 */
585#define IMR_BCNDMAINT_E BIT(14)
586/* CTWidnow End or ATIM Window End */
587#define IMR_ATIMEND BIT(12)
588/* HISR1 Indicator (HISR1 & HIMR1 is true, this bit is set to 1)*/
589#define IMR_HISR1_IND_INT BIT(11)
590/* CPU to Host Command INT Status, Write 1 clear */
591#define IMR_C2HCMD BIT(10)
592/* CPU power Mode exchange INT Status, Write 1 clear */
593#define IMR_CPWM2 BIT(9)
594/* CPU power Mode exchange INT Status, Write 1 clear */
595#define IMR_CPWM BIT(8)
596/* High Queue DMA OK */
597#define IMR_HIGHDOK BIT(7)
598/* Management Queue DMA OK */
599#define IMR_MGNTDOK BIT(6)
600/* AC_BK DMA OK */
601#define IMR_BKDOK BIT(5)
602/* AC_BE DMA OK */
603#define IMR_BEDOK BIT(4)
604/* AC_VI DMA OK */
605#define IMR_VIDOK BIT(3)
606/* AC_VO DMA OK */
607#define IMR_VODOK BIT(2)
608/* Rx Descriptor Unavailable */
609#define IMR_RDU BIT(1)
610#define IMR_ROK BIT(0) /* Receive DMA OK */
611
612/* IMR DW1(0x00B4-00B7) Bit 0-31 */
613/* Beacon DMA Interrupt 7 */
614#define IMR_BCNDMAINT7 BIT(27)
615/* Beacon DMA Interrupt 6 */
616#define IMR_BCNDMAINT6 BIT(26)
617/* Beacon DMA Interrupt 5 */
618#define IMR_BCNDMAINT5 BIT(25)
619/* Beacon DMA Interrupt 4 */
620#define IMR_BCNDMAINT4 BIT(24)
621/* Beacon DMA Interrupt 3 */
622#define IMR_BCNDMAINT3 BIT(23)
623/* Beacon DMA Interrupt 2 */
624#define IMR_BCNDMAINT2 BIT(22)
625/* Beacon DMA Interrupt 1 */
626#define IMR_BCNDMAINT1 BIT(21)
627/* Beacon Queue DMA OK Interrup 7 */
628#define IMR_BCNDOK7 BIT(20)
629/* Beacon Queue DMA OK Interrup 6 */
630#define IMR_BCNDOK6 BIT(19)
631/* Beacon Queue DMA OK Interrup 5 */
632#define IMR_BCNDOK5 BIT(18)
633/* Beacon Queue DMA OK Interrup 4 */
634#define IMR_BCNDOK4 BIT(17)
635/* Beacon Queue DMA OK Interrup 3 */
636#define IMR_BCNDOK3 BIT(16)
637/* Beacon Queue DMA OK Interrup 2 */
638#define IMR_BCNDOK2 BIT(15)
639/* Beacon Queue DMA OK Interrup 1 */
640#define IMR_BCNDOK1 BIT(14)
641/* ATIM Window End Extension for Win7 */
642#define IMR_ATIMEND_E BIT(13)
643/* Tx Error Flag Interrupt Status, write 1 clear. */
644#define IMR_TXERR BIT(11)
645/* Rx Error Flag INT Status, Write 1 clear */
646#define IMR_RXERR BIT(10)
647/* Transmit FIFO Overflow */
648#define IMR_TXFOVW BIT(9)
649/* Receive FIFO Overflow */
650#define IMR_RXFOVW BIT(8)
651
652#define HWSET_MAX_SIZE 512
653#define EFUSE_MAX_SECTION 64
654#define EFUSE_REAL_CONTENT_LEN 256
655/* PG data exclude header, dummy 7 bytes frome CP test and reserved 1byte.*/
656#define EFUSE_OOB_PROTECT_BYTES 18
657
658#define EEPROM_DEFAULT_TSSI 0x0
659#define EEPROM_DEFAULT_TXPOWERDIFF 0x0
660#define EEPROM_DEFAULT_CRYSTALCAP 0x5
661#define EEPROM_DEFAULT_BOARDTYPE 0x02
662#define EEPROM_DEFAULT_TXPOWER 0x1010
663#define EEPROM_DEFAULT_HT2T_TXPWR 0x10
664
665#define EEPROM_DEFAULT_LEGACYHTTXPOWERDIFF 0x3
666#define EEPROM_DEFAULT_THERMALMETER 0x18
667#define EEPROM_DEFAULT_ANTTXPOWERDIFF 0x0
668#define EEPROM_DEFAULT_TXPWDIFF_CRYSTALCAP 0x5
669#define EEPROM_DEFAULT_TXPOWERLEVEL 0x22
670#define EEPROM_DEFAULT_HT40_2SDIFF 0x0
671#define EEPROM_DEFAULT_HT20_DIFF 2
672#define EEPROM_DEFAULT_LEGACYHTTXPOWERDIFF 0x3
673#define EEPROM_DEFAULT_HT40_PWRMAXOFFSET 0
674#define EEPROM_DEFAULT_HT20_PWRMAXOFFSET 0
675
676#define RF_OPTION1 0x79
677#define RF_OPTION2 0x7A
678#define RF_OPTION3 0x7B
679#define RF_OPTION4 0xC3
680
681#define EEPROM_DEFAULT_PID 0x1234
682#define EEPROM_DEFAULT_VID 0x5678
683#define EEPROM_DEFAULT_CUSTOMERID 0xAB
684#define EEPROM_DEFAULT_SUBCUSTOMERID 0xCD
685#define EEPROM_DEFAULT_VERSION 0
686
687#define EEPROM_CHANNEL_PLAN_FCC 0x0
688#define EEPROM_CHANNEL_PLAN_IC 0x1
689#define EEPROM_CHANNEL_PLAN_ETSI 0x2
690#define EEPROM_CHANNEL_PLAN_SPAIN 0x3
691#define EEPROM_CHANNEL_PLAN_FRANCE 0x4
692#define EEPROM_CHANNEL_PLAN_MKK 0x5
693#define EEPROM_CHANNEL_PLAN_MKK1 0x6
694#define EEPROM_CHANNEL_PLAN_ISRAEL 0x7
695#define EEPROM_CHANNEL_PLAN_TELEC 0x8
696#define EEPROM_CHANNEL_PLAN_GLOBAL_DOMAIN 0x9
697#define EEPROM_CHANNEL_PLAN_WORLD_WIDE_13 0xA
698#define EEPROM_CHANNEL_PLAN_NCC 0xB
699#define EEPROM_CHANNEL_PLAN_BY_HW_MASK 0x80
700
701#define EEPROM_CID_DEFAULT 0x0
702#define EEPROM_CID_TOSHIBA 0x4
703#define EEPROM_CID_CCX 0x10
704#define EEPROM_CID_QMI 0x0D
705#define EEPROM_CID_WHQL 0xFE
706
707#define RTL_EEPROM_ID 0x8129
708
709#define EEPROM_HPON 0x02
710#define EEPROM_CLK 0x06
711#define EEPROM_TESTR 0x08
712
713#define EEPROM_TXPOWERCCK 0x10
714#define EEPROM_TXPOWERHT40_1S 0x16
715#define EEPROM_TXPOWERHT20DIFF 0x1B
716#define EEPROM_TXPOWER_OFDMDIFF 0x1B
717
718#define EEPROM_TX_PWR_INX 0x10
719
720#define EEPROM_CHANNELPLAN 0xB8
721#define EEPROM_XTAL_8821AE 0xB9
722#define EEPROM_THERMAL_METER 0xBA
723#define EEPROM_IQK_LCK_88E 0xBB
724
725#define EEPROM_RF_BOARD_OPTION 0xC1
726#define EEPROM_RF_FEATURE_OPTION_88E 0xC2
727#define EEPROM_RF_BT_SETTING 0xC3
728#define EEPROM_VERSION 0xC4
729#define EEPROM_CUSTOMER_ID 0xC5
730#define EEPROM_RF_ANTENNA_OPT_88E 0xC9
731#define EEPROM_RFE_OPTION 0xCA
732
733#define EEPROM_MAC_ADDR 0xD0
734#define EEPROM_VID 0xD6
735#define EEPROM_DID 0xD8
736#define EEPROM_SVID 0xDA
737#define EEPROM_SMID 0xDC
738
739#define STOPBECON BIT(6)
740#define STOPHIGHT BIT(5)
741#define STOPMGT BIT(4)
742#define STOPVO BIT(3)
743#define STOPVI BIT(2)
744#define STOPBE BIT(1)
745#define STOPBK BIT(0)
746
747#define RCR_APPFCS BIT(31)
748#define RCR_APP_MIC BIT(30)
749#define RCR_APP_ICV BIT(29)
750#define RCR_APP_PHYST_RXFF BIT(28)
751#define RCR_APP_BA_SSN BIT(27)
752#define RCR_NONQOS_VHT BIT(26)
753#define RCR_ENMBID BIT(24)
754#define RCR_LSIGEN BIT(23)
755#define RCR_MFBEN BIT(22)
756#define RCR_HTC_LOC_CTRL BIT(14)
757#define RCR_AMF BIT(13)
758#define RCR_ACF BIT(12)
759#define RCR_ADF BIT(11)
760#define RCR_AICV BIT(9)
761#define RCR_ACRC32 BIT(8)
762#define RCR_CBSSID_BCN BIT(7)
763#define RCR_CBSSID_DATA BIT(6)
764#define RCR_CBSSID RCR_CBSSID_DATA
765#define RCR_APWRMGT BIT(5)
766#define RCR_ADD3 BIT(4)
767#define RCR_AB BIT(3)
768#define RCR_AM BIT(2)
769#define RCR_APM BIT(1)
770#define RCR_AAP BIT(0)
771#define RCR_MXDMA_OFFSET 8
772#define RCR_FIFO_OFFSET 13
773
774#define RSV_CTRL 0x001C
775#define RD_CTRL 0x0524
776
777#define REG_USB_INFO 0xFE17
778#define REG_USB_SPECIAL_OPTION 0xFE55
779#define REG_USB_DMA_AGG_TO 0xFE5B
780#define REG_USB_AGG_TO 0xFE5C
781#define REG_USB_AGG_TH 0xFE5D
782
783#define REG_USB_VID 0xFE60
784#define REG_USB_PID 0xFE62
785#define REG_USB_OPTIONAL 0xFE64
786#define REG_USB_CHIRP_K 0xFE65
787#define REG_USB_PHY 0xFE66
788#define REG_USB_MAC_ADDR 0xFE70
789#define REG_USB_HRPWM 0xFE58
790#define REG_USB_HCPWM 0xFE57
791
792#define SW18_FPWM BIT(3)
793
794#define ISO_MD2PP BIT(0)
795#define ISO_UA2USB BIT(1)
796#define ISO_UD2CORE BIT(2)
797#define ISO_PA2PCIE BIT(3)
798#define ISO_PD2CORE BIT(4)
799#define ISO_IP2MAC BIT(5)
800#define ISO_DIOP BIT(6)
801#define ISO_DIOE BIT(7)
802#define ISO_EB2CORE BIT(8)
803#define ISO_DIOR BIT(9)
804
805#define PWC_EV25V BIT(14)
806#define PWC_EV12V BIT(15)
807
808#define FEN_BBRSTB BIT(0)
809#define FEN_BB_GLB_RSTN BIT(1)
810#define FEN_USBA BIT(2)
811#define FEN_UPLL BIT(3)
812#define FEN_USBD BIT(4)
813#define FEN_DIO_PCIE BIT(5)
814#define FEN_PCIEA BIT(6)
815#define FEN_PPLL BIT(7)
816#define FEN_PCIED BIT(8)
817#define FEN_DIOE BIT(9)
818#define FEN_CPUEN BIT(10)
819#define FEN_DCORE BIT(11)
820#define FEN_ELDR BIT(12)
821#define FEN_DIO_RF BIT(13)
822#define FEN_HWPDN BIT(14)
823#define FEN_MREGEN BIT(15)
824
825#define PFM_LDALL BIT(0)
826#define PFM_ALDN BIT(1)
827#define PFM_LDKP BIT(2)
828#define PFM_WOWL BIT(3)
829#define ENPDN BIT(4)
830#define PDN_PL BIT(5)
831#define APFM_ONMAC BIT(8)
832#define APFM_OFF BIT(9)
833#define APFM_RSM BIT(10)
834#define AFSM_HSUS BIT(11)
835#define AFSM_PCIE BIT(12)
836#define APDM_MAC BIT(13)
837#define APDM_HOST BIT(14)
838#define APDM_HPDN BIT(15)
839#define RDY_MACON BIT(16)
840#define SUS_HOST BIT(17)
841#define ROP_ALD BIT(20)
842#define ROP_PWR BIT(21)
843#define ROP_SPS BIT(22)
844#define SOP_MRST BIT(25)
845#define SOP_FUSE BIT(26)
846#define SOP_ABG BIT(27)
847#define SOP_AMB BIT(28)
848#define SOP_RCK BIT(29)
849#define SOP_A8M BIT(30)
850#define XOP_BTCK BIT(31)
851
852#define ANAD16V_EN BIT(0)
853#define ANA8M BIT(1)
854#define MACSLP BIT(4)
855#define LOADER_CLK_EN BIT(5)
856#define _80M_SSC_DIS BIT(7)
857#define _80M_SSC_EN_HO BIT(8)
858#define PHY_SSC_RSTB BIT(9)
859#define SEC_CLK_EN BIT(10)
860#define MAC_CLK_EN BIT(11)
861#define SYS_CLK_EN BIT(12)
862#define RING_CLK_EN BIT(13)
863
864#define BOOT_FROM_EEPROM BIT(4)
865#define EEPROM_EN BIT(5)
866
867#define AFE_BGEN BIT(0)
868#define AFE_MBEN BIT(1)
869#define MAC_ID_EN BIT(7)
870
871#define WLOCK_ALL BIT(0)
872#define WLOCK_00 BIT(1)
873#define WLOCK_04 BIT(2)
874#define WLOCK_08 BIT(3)
875#define WLOCK_40 BIT(4)
876#define R_DIS_PRST_0 BIT(5)
877#define R_DIS_PRST_1 BIT(6)
878#define LOCK_ALL_EN BIT(7)
879
880#define RF_EN BIT(0)
881#define RF_RSTB BIT(1)
882#define RF_SDMRSTB BIT(2)
883
884#define LDA15_EN BIT(0)
885#define LDA15_STBY BIT(1)
886#define LDA15_OBUF BIT(2)
887#define LDA15_REG_VOS BIT(3)
888#define _LDA15_VOADJ(x) (((x) & 0x7) << 4)
889
890#define LDV12_EN BIT(0)
891#define LDV12_SDBY BIT(1)
892#define LPLDO_HSM BIT(2)
893#define LPLDO_LSM_DIS BIT(3)
894#define _LDV12_VADJ(x) (((x) & 0xF) << 4)
895
896#define XTAL_EN BIT(0)
897#define XTAL_BSEL BIT(1)
898#define _XTAL_BOSC(x) (((x) & 0x3) << 2)
899#define _XTAL_CADJ(x) (((x) & 0xF) << 4)
900#define XTAL_GATE_USB BIT(8)
901#define _XTAL_USB_DRV(x) (((x) & 0x3) << 9)
902#define XTAL_GATE_AFE BIT(11)
903#define _XTAL_AFE_DRV(x) (((x) & 0x3) << 12)
904#define XTAL_RF_GATE BIT(14)
905#define _XTAL_RF_DRV(x) (((x) & 0x3) << 15)
906#define XTAL_GATE_DIG BIT(17)
907#define _XTAL_DIG_DRV(x) (((x) & 0x3) << 18)
908#define XTAL_BT_GATE BIT(20)
909#define _XTAL_BT_DRV(x) (((x) & 0x3) << 21)
910#define _XTAL_GPIO(x) (((x) & 0x7) << 23)
911
912#define CKDLY_AFE BIT(26)
913#define CKDLY_USB BIT(27)
914#define CKDLY_DIG BIT(28)
915#define CKDLY_BT BIT(29)
916
917#define APLL_EN BIT(0)
918#define APLL_320_EN BIT(1)
919#define APLL_FREF_SEL BIT(2)
920#define APLL_EDGE_SEL BIT(3)
921#define APLL_WDOGB BIT(4)
922#define APLL_LPFEN BIT(5)
923
924#define APLL_REF_CLK_13MHZ 0x1
925#define APLL_REF_CLK_19_2MHZ 0x2
926#define APLL_REF_CLK_20MHZ 0x3
927#define APLL_REF_CLK_25MHZ 0x4
928#define APLL_REF_CLK_26MHZ 0x5
929#define APLL_REF_CLK_38_4MHZ 0x6
930#define APLL_REF_CLK_40MHZ 0x7
931
932#define APLL_320EN BIT(14)
933#define APLL_80EN BIT(15)
934#define APLL_1MEN BIT(24)
935
936#define ALD_EN BIT(18)
937#define EF_PD BIT(19)
938#define EF_FLAG BIT(31)
939
940#define EF_TRPT BIT(7)
941#define LDOE25_EN BIT(31)
942
943#define RSM_EN BIT(0)
944#define TIMER_EN BIT(4)
945
946#define TRSW0EN BIT(2)
947#define TRSW1EN BIT(3)
948#define EROM_EN BIT(4)
949#define ENBT BIT(5)
950#define ENUART BIT(8)
951#define UART_910 BIT(9)
952#define ENPMAC BIT(10)
953#define SIC_SWRST BIT(11)
954#define ENSIC BIT(12)
955#define SIC_23 BIT(13)
956#define ENHDP BIT(14)
957#define SIC_LBK BIT(15)
958
959#define LED0PL BIT(4)
960#define LED1PL BIT(12)
961#define LED0DIS BIT(7)
962
963#define MCUFWDL_EN BIT(0)
964#define MCUFWDL_RDY BIT(1)
965#define FWDL_CHKSUM_RPT BIT(2)
966#define MACINI_RDY BIT(3)
967#define BBINI_RDY BIT(4)
968#define RFINI_RDY BIT(5)
969#define WINTINI_RDY BIT(6)
970#define CPRST BIT(23)
971
972#define XCLK_VLD BIT(0)
973#define ACLK_VLD BIT(1)
974#define UCLK_VLD BIT(2)
975#define PCLK_VLD BIT(3)
976#define PCIRSTB BIT(4)
977#define V15_VLD BIT(5)
978#define TRP_B15V_EN BIT(7)
979#define SIC_IDLE BIT(8)
980#define BD_MAC2 BIT(9)
981#define BD_MAC1 BIT(10)
982#define IC_MACPHY_MODE BIT(11)
983#define VENDOR_ID BIT(19)
984#define PAD_HWPD_IDN BIT(22)
985#define TRP_VAUX_EN BIT(23)
986#define TRP_BT_EN BIT(24)
987#define BD_PKG_SEL BIT(25)
988#define BD_HCI_SEL BIT(26)
989#define TYPE_ID BIT(27)
990
991#define CHIP_VER_RTL_MASK 0xF000
992#define CHIP_VER_RTL_SHIFT 12
993
994#define REG_LBMODE (REG_CR + 3)
995
996#define HCI_TXDMA_EN BIT(0)
997#define HCI_RXDMA_EN BIT(1)
998#define TXDMA_EN BIT(2)
999#define RXDMA_EN BIT(3)
1000#define PROTOCOL_EN BIT(4)
1001#define SCHEDULE_EN BIT(5)
1002#define MACTXEN BIT(6)
1003#define MACRXEN BIT(7)
1004#define ENSWBCN BIT(8)
1005#define ENSEC BIT(9)
1006
1007#define _NETTYPE(x) (((x) & 0x3) << 16)
1008#define MASK_NETTYPE 0x30000
1009#define NT_NO_LINK 0x0
1010#define NT_LINK_AD_HOC 0x1
1011#define NT_LINK_AP 0x2
1012#define NT_AS_AP 0x3
1013
1014#define _LBMODE(x) (((x) & 0xF) << 24)
1015#define MASK_LBMODE 0xF000000
1016#define LOOPBACK_NORMAL 0x0
1017#define LOOPBACK_IMMEDIATELY 0xB
1018#define LOOPBACK_MAC_DELAY 0x3
1019#define LOOPBACK_PHY 0x1
1020#define LOOPBACK_DMA 0x7
1021
1022#define GET_RX_PAGE_SIZE(value) ((value) & 0xF)
1023#define GET_TX_PAGE_SIZE(value) (((value) & 0xF0) >> 4)
1024#define _PSRX_MASK 0xF
1025#define _PSTX_MASK 0xF0
1026#define _PSRX(x) (x)
1027#define _PSTX(x) ((x) << 4)
1028
1029#define PBP_64 0x0
1030#define PBP_128 0x1
1031#define PBP_256 0x2
1032#define PBP_512 0x3
1033#define PBP_1024 0x4
1034
1035#define RXDMA_ARBBW_EN BIT(0)
1036#define RXSHFT_EN BIT(1)
1037#define RXDMA_AGG_EN BIT(2)
1038#define QS_VO_QUEUE BIT(8)
1039#define QS_VI_QUEUE BIT(9)
1040#define QS_BE_QUEUE BIT(10)
1041#define QS_BK_QUEUE BIT(11)
1042#define QS_MANAGER_QUEUE BIT(12)
1043#define QS_HIGH_QUEUE BIT(13)
1044
1045#define HQSEL_VOQ BIT(0)
1046#define HQSEL_VIQ BIT(1)
1047#define HQSEL_BEQ BIT(2)
1048#define HQSEL_BKQ BIT(3)
1049#define HQSEL_MGTQ BIT(4)
1050#define HQSEL_HIQ BIT(5)
1051
1052#define _TXDMA_HIQ_MAP(x) (((x)&0x3) << 14)
1053#define _TXDMA_MGQ_MAP(x) (((x)&0x3) << 12)
1054#define _TXDMA_BKQ_MAP(x) (((x)&0x3) << 10)
1055#define _TXDMA_BEQ_MAP(x) (((x)&0x3) << 8)
1056#define _TXDMA_VIQ_MAP(x) (((x)&0x3) << 6)
1057#define _TXDMA_VOQ_MAP(x) (((x)&0x3) << 4)
1058
1059#define QUEUE_LOW 1
1060#define QUEUE_NORMAL 2
1061#define QUEUE_HIGH 3
1062
1063#define _LLT_NO_ACTIVE 0x0
1064#define _LLT_WRITE_ACCESS 0x1
1065#define _LLT_READ_ACCESS 0x2
1066
1067#define _LLT_INIT_DATA(x) ((x) & 0xFF)
1068#define _LLT_INIT_ADDR(x) (((x) & 0xFF) << 8)
1069#define _LLT_OP(x) (((x) & 0x3) << 30)
1070#define _LLT_OP_VALUE(x) (((x) >> 30) & 0x3)
1071
1072#define BB_WRITE_READ_MASK (BIT(31) | BIT(30))
1073#define BB_WRITE_EN BIT(30)
1074#define BB_READ_EN BIT(31)
1075
1076#define _HPQ(x) ((x) & 0xFF)
1077#define _LPQ(x) (((x) & 0xFF) << 8)
1078#define _PUBQ(x) (((x) & 0xFF) << 16)
1079#define _NPQ(x) ((x) & 0xFF)
1080
1081#define HPQ_PUBLIC_DIS BIT(24)
1082#define LPQ_PUBLIC_DIS BIT(25)
1083#define LD_RQPN BIT(31)
1084
1085#define BCN_VALID BIT(16)
1086#define BCN_HEAD(x) (((x) & 0xFF) << 8)
1087#define BCN_HEAD_MASK 0xFF00
1088
1089#define BLK_DESC_NUM_SHIFT 4
1090#define BLK_DESC_NUM_MASK 0xF
1091
1092#define DROP_DATA_EN BIT(9)
1093
1094#define EN_AMPDU_RTY_NEW BIT(7)
1095
1096#define _INIRTSMCS_SEL(x) ((x) & 0x3F)
1097
1098#define _SPEC_SIFS_CCK(x) ((x) & 0xFF)
1099#define _SPEC_SIFS_OFDM(x) (((x) & 0xFF) << 8)
1100
1101#define RATE_REG_BITMAP_ALL 0xFFFFF
1102
1103#define _RRSC_BITMAP(x) ((x) & 0xFFFFF)
1104
1105#define _RRSR_RSC(x) (((x) & 0x3) << 21)
1106#define RRSR_RSC_RESERVED 0x0
1107#define RRSR_RSC_UPPER_SUBCHANNEL 0x1
1108#define RRSR_RSC_LOWER_SUBCHANNEL 0x2
1109#define RRSR_RSC_DUPLICATE_MODE 0x3
1110
1111#define USE_SHORT_G1 BIT(20)
1112
1113#define _AGGLMT_MCS0(x) ((x) & 0xF)
1114#define _AGGLMT_MCS1(x) (((x) & 0xF) << 4)
1115#define _AGGLMT_MCS2(x) (((x) & 0xF) << 8)
1116#define _AGGLMT_MCS3(x) (((x) & 0xF) << 12)
1117#define _AGGLMT_MCS4(x) (((x) & 0xF) << 16)
1118#define _AGGLMT_MCS5(x) (((x) & 0xF) << 20)
1119#define _AGGLMT_MCS6(x) (((x) & 0xF) << 24)
1120#define _AGGLMT_MCS7(x) (((x) & 0xF) << 28)
1121
1122#define RETRY_LIMIT_SHORT_SHIFT 8
1123#define RETRY_LIMIT_LONG_SHIFT 0
1124
1125#define _DARF_RC1(x) ((x) & 0x1F)
1126#define _DARF_RC2(x) (((x) & 0x1F) << 8)
1127#define _DARF_RC3(x) (((x) & 0x1F) << 16)
1128#define _DARF_RC4(x) (((x) & 0x1F) << 24)
1129#define _DARF_RC5(x) ((x) & 0x1F)
1130#define _DARF_RC6(x) (((x) & 0x1F) << 8)
1131#define _DARF_RC7(x) (((x) & 0x1F) << 16)
1132#define _DARF_RC8(x) (((x) & 0x1F) << 24)
1133
1134#define _RARF_RC1(x) ((x) & 0x1F)
1135#define _RARF_RC2(x) (((x) & 0x1F) << 8)
1136#define _RARF_RC3(x) (((x) & 0x1F) << 16)
1137#define _RARF_RC4(x) (((x) & 0x1F) << 24)
1138#define _RARF_RC5(x) ((x) & 0x1F)
1139#define _RARF_RC6(x) (((x) & 0x1F) << 8)
1140#define _RARF_RC7(x) (((x) & 0x1F) << 16)
1141#define _RARF_RC8(x) (((x) & 0x1F) << 24)
1142
1143#define AC_PARAM_TXOP_LIMIT_OFFSET 16
1144#define AC_PARAM_ECW_MAX_OFFSET 12
1145#define AC_PARAM_ECW_MIN_OFFSET 8
1146#define AC_PARAM_AIFS_OFFSET 0
1147
1148#define _AIFS(x) (x)
1149#define _ECW_MAX_MIN(x) ((x) << 8)
1150#define _TXOP_LIMIT(x) ((x) << 16)
1151
1152#define _BCNIFS(x) ((x) & 0xFF)
1153#define _BCNECW(x) ((((x) & 0xF)) << 8)
1154
1155#define _LRL(x) ((x) & 0x3F)
1156#define _SRL(x) (((x) & 0x3F) << 8)
1157
1158#define _SIFS_CCK_CTX(x) ((x) & 0xFF)
1159#define _SIFS_CCK_TRX(x) (((x) & 0xFF) << 8)
1160
1161#define _SIFS_OFDM_CTX(x) ((x) & 0xFF)
1162#define _SIFS_OFDM_TRX(x) (((x) & 0xFF) << 8)
1163
1164#define _TBTT_PROHIBIT_HOLD(x) (((x) & 0xFF) << 8)
1165
1166#define DIS_EDCA_CNT_DWN BIT(11)
1167
1168#define EN_MBSSID BIT(1)
1169#define EN_TXBCN_RPT BIT(2)
1170#define EN_BCN_FUNCTION BIT(3)
1171
1172#define TSFTR_RST BIT(0)
1173#define TSFTR1_RST BIT(1)
1174
1175#define STOP_BCNQ BIT(6)
1176
1177#define DIS_TSF_UDT0_NORMAL_CHIP BIT(4)
1178#define DIS_TSF_UDT0_TEST_CHIP BIT(5)
1179
1180#define ACMHW_HWEN BIT(0)
1181#define ACMHW_BEQEN BIT(1)
1182#define ACMHW_VIQEN BIT(2)
1183#define ACMHW_VOQEN BIT(3)
1184#define ACMHW_BEQSTATUS BIT(4)
1185#define ACMHW_VIQSTATUS BIT(5)
1186#define ACMHW_VOQSTATUS BIT(6)
1187
1188#define APSDOFF BIT(6)
1189#define APSDOFF_STATUS BIT(7)
1190
1191#define BW_20MHZ BIT(2)
1192
1193#define RATE_BITMAP_ALL 0xFFFFF
1194
1195#define RATE_RRSR_CCK_ONLY_1M 0xFFFF1
1196
1197#define TSFRST BIT(0)
1198#define DIS_GCLK BIT(1)
1199#define PAD_SEL BIT(2)
1200#define PWR_ST BIT(6)
1201#define PWRBIT_OW_EN BIT(7)
1202#define ACRC BIT(8)
1203#define CFENDFORM BIT(9)
1204#define ICV BIT(10)
1205
1206#define AAP BIT(0)
1207#define APM BIT(1)
1208#define AM BIT(2)
1209#define AB BIT(3)
1210#define ADD3 BIT(4)
1211#define APWRMGT BIT(5)
1212#define CBSSID BIT(6)
1213#define CBSSID_DATA BIT(6)
1214#define CBSSID_BCN BIT(7)
1215#define ACRC32 BIT(8)
1216#define AICV BIT(9)
1217#define ADF BIT(11)
1218#define ACF BIT(12)
1219#define AMF BIT(13)
1220#define HTC_LOC_CTRL BIT(14)
1221#define UC_DATA_EN BIT(16)
1222#define BM_DATA_EN BIT(17)
1223#define MFBEN BIT(22)
1224#define LSIGEN BIT(23)
1225#define ENMBID BIT(24)
1226#define APP_BASSN BIT(27)
1227#define APP_PHYSTS BIT(28)
1228#define APP_ICV BIT(29)
1229#define APP_MIC BIT(30)
1230#define APP_FCS BIT(31)
1231
1232#define _MIN_SPACE(x) ((x) & 0x7)
1233#define _SHORT_GI_PADDING(x) (((x) & 0x1F) << 3)
1234
1235#define RXERR_TYPE_OFDM_PPDU 0
1236#define RXERR_TYPE_OFDM_FALSE_ALARM 1
1237#define RXERR_TYPE_OFDM_MPDU_OK 2
1238#define RXERR_TYPE_OFDM_MPDU_FAIL 3
1239#define RXERR_TYPE_CCK_PPDU 4
1240#define RXERR_TYPE_CCK_FALSE_ALARM 5
1241#define RXERR_TYPE_CCK_MPDU_OK 6
1242#define RXERR_TYPE_CCK_MPDU_FAIL 7
1243#define RXERR_TYPE_HT_PPDU 8
1244#define RXERR_TYPE_HT_FALSE_ALARM 9
1245#define RXERR_TYPE_HT_MPDU_TOTAL 10
1246#define RXERR_TYPE_HT_MPDU_OK 11
1247#define RXERR_TYPE_HT_MPDU_FAIL 12
1248#define RXERR_TYPE_RX_FULL_DROP 15
1249
1250#define RXERR_COUNTER_MASK 0xFFFFF
1251#define RXERR_RPT_RST BIT(27)
1252#define _RXERR_RPT_SEL(type) ((type) << 28)
1253
1254#define SCR_TXUSEDK BIT(0)
1255#define SCR_RXUSEDK BIT(1)
1256#define SCR_TXENCENABLE BIT(2)
1257#define SCR_RXDECENABLE BIT(3)
1258#define SCR_SKBYA2 BIT(4)
1259#define SCR_NOSKMC BIT(5)
1260#define SCR_TXBCUSEDK BIT(6)
1261#define SCR_RXBCUSEDK BIT(7)
1262
1263#define XCLK_VLD BIT(0)
1264#define ACLK_VLD BIT(1)
1265#define UCLK_VLD BIT(2)
1266#define PCLK_VLD BIT(3)
1267#define PCIRSTB BIT(4)
1268#define V15_VLD BIT(5)
1269#define TRP_B15V_EN BIT(7)
1270#define SIC_IDLE BIT(8)
1271#define BD_MAC2 BIT(9)
1272#define BD_MAC1 BIT(10)
1273#define IC_MACPHY_MODE BIT(11)
1274#define BT_FUNC BIT(16)
1275#define VENDOR_ID BIT(19)
1276#define PAD_HWPD_IDN BIT(22)
1277#define TRP_VAUX_EN BIT(23)
1278#define TRP_BT_EN BIT(24)
1279#define BD_PKG_SEL BIT(25)
1280#define BD_HCI_SEL BIT(26)
1281#define TYPE_ID BIT(27)
1282
1283#define USB_IS_HIGH_SPEED 0
1284#define USB_IS_FULL_SPEED 1
1285#define USB_SPEED_MASK BIT(5)
1286
1287#define USB_NORMAL_SIE_EP_MASK 0xF
1288#define USB_NORMAL_SIE_EP_SHIFT 4
1289
1290#define USB_TEST_EP_MASK 0x30
1291#define USB_TEST_EP_SHIFT 4
1292
1293#define USB_AGG_EN BIT(3)
1294
1295#define MAC_ADDR_LEN 6
1296#define LAST_ENTRY_OF_TX_PKT_BUFFER 255
1297
1298#define POLLING_LLT_THRESHOLD 20
1299#define POLLING_READY_TIMEOUT_COUNT 3000
1300
1301#define MAX_MSS_DENSITY_2T 0x13
1302#define MAX_MSS_DENSITY_1T 0x0A
1303
1304#define EPROM_CMD_OPERATING_MODE_MASK ((1<<7)|(1<<6))
1305#define EPROM_CMD_CONFIG 0x3
1306#define EPROM_CMD_LOAD 1
1307
1308#define HWSET_MAX_SIZE_92S HWSET_MAX_SIZE
1309
1310#define HAL_8192C_HW_GPIO_WPS_BIT BIT(2)
1311
1312#define RA_LSSIWRITE_8821A 0xc90
1313#define RB_LSSIWRITE_8821A 0xe90
1314
1315#define RA_PIREAD_8821A 0xd04
1316#define RB_PIREAD_8821A 0xd44
1317#define RA_SIREAD_8821A 0xd08
1318#define RB_SIREAD_8821A 0xd48
1319
1320#define RPMAC_RESET 0x100
1321#define RPMAC_TXSTART 0x104
1322#define RPMAC_TXLEGACYSIG 0x108
1323#define RPMAC_TXHTSIG1 0x10c
1324#define RPMAC_TXHTSIG2 0x110
1325#define RPMAC_PHYDEBUG 0x114
1326#define RPMAC_TXPACKETNUM 0x118
1327#define RPMAC_TXIDLE 0x11c
1328#define RPMAC_TXMACHEADER0 0x120
1329#define RPMAC_TXMACHEADER1 0x124
1330#define RPMAC_TXMACHEADER2 0x128
1331#define RPMAC_TXMACHEADER3 0x12c
1332#define RPMAC_TXMACHEADER4 0x130
1333#define RPMAC_TXMACHEADER5 0x134
1334#define RPMAC_TXDADATYPE 0x138
1335#define RPMAC_TXRANDOMSEED 0x13c
1336#define RPMAC_CCKPLCPPREAMBLE 0x140
1337#define RPMAC_CCKPLCPHEADER 0x144
1338#define RPMAC_CCKCRC16 0x148
1339#define RPMAC_OFDMRXCRC32OK 0x170
1340#define RPMAC_OFDMRXCRC32ER 0x174
1341#define RPMAC_OFDMRXPARITYER 0x178
1342#define RPMAC_OFDMRXCRC8ER 0x17c
1343#define RPMAC_CCKCRXRC16ER 0x180
1344#define RPMAC_CCKCRXRC32ER 0x184
1345#define RPMAC_CCKCRXRC32OK 0x188
1346#define RPMAC_TXSTATUS 0x18c
1347
1348#define RFPGA0_RFMOD 0x800
1349
1350#define RFPGA0_TXINFO 0x804
1351#define RFPGA0_PSDFUNCTION 0x808
1352
1353#define RFPGA0_TXGAINSTAGE 0x80c
1354
1355#define RFPGA0_RFTIMING1 0x810
1356#define RFPGA0_RFTIMING2 0x814
1357
1358#define RFPGA0_XA_HSSIPARAMETER1 0x820
1359#define RFPGA0_XA_HSSIPARAMETER2 0x824
1360#define RFPGA0_XB_HSSIPARAMETER1 0x828
1361#define RFPGA0_XB_HSSIPARAMETER2 0x82c
1362#define RCCAONSEC 0x838
1363
1364#define RFPGA0_XA_LSSIPARAMETER 0x840
1365#define RFPGA0_XB_LSSIPARAMETER 0x844
1366#define RL1PEAKTH 0x848
1367
1368#define RFPGA0_RFWAKEUPPARAMETER 0x850
1369#define RFPGA0_RFSLEEPUPPARAMETER 0x854
1370
1371#define RFPGA0_XAB_SWITCHCONTROL 0x858
1372#define RFPGA0_XCD_SWITCHCONTROL 0x85c
1373
1374#define RFPGA0_XA_RFINTERFACEOE 0x860
1375#define RFC_AREA 0x860
1376#define RFPGA0_XB_RFINTERFACEOE 0x864
1377
1378#define RFPGA0_XAB_RFINTERFACESW 0x870
1379#define RFPGA0_XCD_RFINTERFACESW 0x874
1380
1381#define RFPGA0_XAB_RFPARAMETER 0x878
1382#define RFPGA0_XCD_RFPARAMETER 0x87c
1383
1384#define RFPGA0_ANALOGPARAMETER1 0x880
1385#define RFPGA0_ANALOGPARAMETER2 0x884
1386#define RFPGA0_ANALOGPARAMETER3 0x888
1387#define RFPGA0_ANALOGPARAMETER4 0x88c
1388
1389#define RFPGA0_XA_LSSIREADBACK 0x8a0
1390#define RFPGA0_XB_LSSIREADBACK 0x8a4
1391#define RFPGA0_XC_LSSIREADBACK 0x8a8
1392#define RRFMOD 0x8ac
1393#define RHSSIREAD_8821AE 0x8b0
1394
1395#define RFPGA0_PSDREPORT 0x8b4
1396#define TRANSCEIVEA_HSPI_READBACK 0x8b8
1397#define TRANSCEIVEB_HSPI_READBACK 0x8bc
1398#define RADC_BUF_CLK 0x8c4
1399#define RFPGA0_XAB_RFINTERFACERB 0x8e0
1400#define RFPGA0_XCD_RFINTERFACERB 0x8e4
1401
1402#define RFPGA1_RFMOD 0x900
1403
1404#define RFPGA1_TXBLOCK 0x904
1405#define RFPGA1_DEBUGSELECT 0x908
1406#define RFPGA1_TXINFO 0x90c
1407
1408#define RCCK_SYSTEM 0xa00
1409#define BCCK_SYSTEM 0x10
1410
1411#define RCCK0_AFESETTING 0xa04
1412#define RCCK0_CCA 0xa08
1413
1414#define RCCK0_RXAGC1 0xa0c
1415#define RCCK0_RXAGC2 0xa10
1416
1417#define RCCK0_RXHP 0xa14
1418
1419#define RCCK0_DSPPARAMETER1 0xa18
1420#define RCCK0_DSPPARAMETER2 0xa1c
1421
1422#define RCCK0_TXFILTER1 0xa20
1423#define RCCK0_TXFILTER2 0xa24
1424#define RCCK0_DEBUGPORT 0xa28
1425#define RCCK0_FALSEALARMREPORT 0xa2c
1426#define RCCK0_TRSSIREPORT 0xa50
1427#define RCCK0_RXREPORT 0xa54
1428#define RCCK0_FACOUNTERLOWER 0xa5c
1429#define RCCK0_FACOUNTERUPPER 0xa58
1430#define RCCK0_CCA_CNT 0xa60
1431
1432/* PageB(0xB00) */
1433#define RPDP_ANTA 0xb00
1434#define RPDP_ANTA_4 0xb04
1435#define RPDP_ANTA_8 0xb08
1436#define RPDP_ANTA_C 0xb0c
1437#define RPDP_ANTA_10 0xb10
1438#define RPDP_ANTA_14 0xb14
1439#define RPDP_ANTA_18 0xb18
1440#define RPDP_ANTA_1C 0xb1c
1441#define RPDP_ANTA_20 0xb20
1442#define RPDP_ANTA_24 0xb24
1443
1444#define RCONFIG_PMPD_ANTA 0xb28
1445#define RCONFIG_RAM64x16 0xb2c
1446
1447#define RBNDA 0xb30
1448#define RHSSIPAR 0xb34
1449
1450#define RCONFIG_ANTA 0xb68
1451#define RCONFIG_ANTB 0xb6c
1452
1453#define RPDP_ANTB 0xb70
1454#define RPDP_ANTB_4 0xb74
1455#define RPDP_ANTB_8 0xb78
1456#define RPDP_ANTB_C 0xb7c
1457#define RPDP_ANTB_10 0xb80
1458#define RPDP_ANTB_14 0xb84
1459#define RPDP_ANTB_18 0xb88
1460#define RPDP_ANTB_1C 0xb8c
1461#define RPDP_ANTB_20 0xb90
1462#define RPDP_ANTB_24 0xb94
1463
1464#define RCONFIG_PMPD_ANTB 0xb98
1465
1466#define RBNDB 0xba0
1467
1468#define RAPK 0xbd8
1469#define RPM_RX0_ANTA 0xbdc
1470#define RPM_RX1_ANTA 0xbe0
1471#define RPM_RX2_ANTA 0xbe4
1472#define RPM_RX3_ANTA 0xbe8
1473#define RPM_RX0_ANTB 0xbec
1474#define RPM_RX1_ANTB 0xbf0
1475#define RPM_RX2_ANTB 0xbf4
1476#define RPM_RX3_ANTB 0xbf8
1477
1478/*RSSI Dump*/
1479#define RA_RSSI_DUMP 0xBF0
1480#define RB_RSSI_DUMP 0xBF1
1481#define RS1_RX_EVM_DUMP 0xBF4
1482#define RS2_RX_EVM_DUMP 0xBF5
1483#define RA_RX_SNR_DUMP 0xBF6
1484#define RB_RX_SNR_DUMP 0xBF7
1485#define RA_CFO_SHORT_DUMP 0xBF8
1486#define RB_CFO_SHORT_DUMP 0xBFA
1487#define RA_CFO_LONG_DUMP 0xBEC
1488#define RB_CFO_LONG_DUMP 0xBEE
1489
1490/*Page C*/
1491#define ROFDM0_LSTF 0xc00
1492
1493#define ROFDM0_TRXPATHENABLE 0xc04
1494#define ROFDM0_TRMUXPAR 0xc08
1495#define ROFDM0_TRSWISOLATION 0xc0c
1496
1497#define ROFDM0_XARXAFE 0xc10
1498#define ROFDM0_XARXIQIMBALANCE 0xc14
1499#define ROFDM0_XBRXAFE 0xc18
1500#define ROFDM0_XBRXIQIMBALANCE 0xc1c
1501#define ROFDM0_XCRXAFE 0xc20
1502#define ROFDM0_XCRXIQIMBANLANCE 0xc24
1503#define ROFDM0_XDRXAFE 0xc28
1504#define ROFDM0_XDRXIQIMBALANCE 0xc2c
1505
1506#define ROFDM0_RXDETECTOR1 0xc30
1507#define ROFDM0_RXDETECTOR2 0xc34
1508#define ROFDM0_RXDETECTOR3 0xc38
1509#define ROFDM0_RXDETECTOR4 0xc3c
1510
1511#define ROFDM0_RXDSP 0xc40
1512#define ROFDM0_CFOANDDAGC 0xc44
1513#define ROFDM0_CCADROPTHRESHOLD 0xc48
1514#define ROFDM0_ECCATHRESHOLD 0xc4c
1515
1516#define ROFDM0_XAAGCCORE1 0xc50
1517#define ROFDM0_XAAGCCORE2 0xc54
1518#define ROFDM0_XBAGCCORE1 0xc58
1519#define ROFDM0_XBAGCCORE2 0xc5c
1520#define ROFDM0_XCAGCCORE1 0xc60
1521#define ROFDM0_XCAGCCORE2 0xc64
1522#define ROFDM0_XDAGCCORE1 0xc68
1523#define ROFDM0_XDAGCCORE2 0xc6c
1524
1525#define ROFDM0_AGCPARAMETER1 0xc70
1526#define ROFDM0_AGCPARAMETER2 0xc74
1527#define ROFDM0_AGCRSSITABLE 0xc78
1528#define ROFDM0_HTSTFAGC 0xc7c
1529
1530#define ROFDM0_XATXIQIMBALANCE 0xc80
1531#define ROFDM0_XATXAFE 0xc84
1532#define ROFDM0_XBTXIQIMBALANCE 0xc88
1533#define ROFDM0_XBTXAFE 0xc8c
1534#define ROFDM0_XCTXIQIMBALANCE 0xc90
1535#define ROFDM0_XCTXAFE 0xc94
1536#define ROFDM0_XDTXIQIMBALANCE 0xc98
1537#define ROFDM0_XDTXAFE 0xc9c
1538
1539#define ROFDM0_RXIQEXTANTA 0xca0
1540#define ROFDM0_TXCOEFF1 0xca4
1541#define ROFDM0_TXCOEFF2 0xca8
1542#define ROFDM0_TXCOEFF3 0xcac
1543#define ROFDM0_TXCOEFF4 0xcb0
1544#define ROFDM0_TXCOEFF5 0xcb4
1545#define ROFDM0_TXCOEFF6 0xcb8
1546
1547/*Path_A RFE cotrol */
1548#define RA_RFE_CTRL_8812 0xcb8
1549/*Path_B RFE control*/
1550#define RB_RFE_CTRL_8812 0xeb8
1551
1552#define ROFDM0_RXHPPARAMETER 0xce0
1553#define ROFDM0_TXPSEUDONOISEWGT 0xce4
1554#define ROFDM0_FRAMESYNC 0xcf0
1555#define ROFDM0_DFSREPORT 0xcf4
1556
1557#define ROFDM1_LSTF 0xd00
1558#define ROFDM1_TRXPATHENABLE 0xd04
1559
1560#define ROFDM1_CF0 0xd08
1561#define ROFDM1_CSI1 0xd10
1562#define ROFDM1_SBD 0xd14
1563#define ROFDM1_CSI2 0xd18
1564#define ROFDM1_CFOTRACKING 0xd2c
1565#define ROFDM1_TRXMESAURE1 0xd34
1566#define ROFDM1_INTFDET 0xd3c
1567#define ROFDM1_PSEUDONOISESTATEAB 0xd50
1568#define ROFDM1_PSEUDONOISESTATECD 0xd54
1569#define ROFDM1_RXPSEUDONOISEWGT 0xd58
1570
1571#define ROFDM_PHYCOUNTER1 0xda0
1572#define ROFDM_PHYCOUNTER2 0xda4
1573#define ROFDM_PHYCOUNTER3 0xda8
1574
1575#define ROFDM_SHORTCFOAB 0xdac
1576#define ROFDM_SHORTCFOCD 0xdb0
1577#define ROFDM_LONGCFOAB 0xdb4
1578#define ROFDM_LONGCFOCD 0xdb8
1579#define ROFDM_TAILCF0AB 0xdbc
1580#define ROFDM_TAILCF0CD 0xdc0
1581#define ROFDM_PWMEASURE1 0xdc4
1582#define ROFDM_PWMEASURE2 0xdc8
1583#define ROFDM_BWREPORT 0xdcc
1584#define ROFDM_AGCREPORT 0xdd0
1585#define ROFDM_RXSNR 0xdd4
1586#define ROFDM_RXEVMCSI 0xdd8
1587#define ROFDM_SIGREPORT 0xddc
1588
1589#define RTXAGC_A_CCK11_CCK1 0xc20
1590#define RTXAGC_A_OFDM18_OFDM6 0xc24
1591#define RTXAGC_A_OFDM54_OFDM24 0xc28
1592#define RTXAGC_A_MCS03_MCS00 0xc2c
1593#define RTXAGC_A_MCS07_MCS04 0xc30
1594#define RTXAGC_A_MCS11_MCS08 0xc34
1595#define RTXAGC_A_MCS15_MCS12 0xc38
1596#define RTXAGC_A_NSS1INDEX3_NSS1INDEX0 0xc3c
1597#define RTXAGC_A_NSS1INDEX7_NSS1INDEX4 0xc40
1598#define RTXAGC_A_NSS2INDEX1_NSS1INDEX8 0xc44
1599#define RTXAGC_A_NSS2INDEX5_NSS2INDEX2 0xc48
1600#define RTXAGC_A_NSS2INDEX9_NSS2INDEX6 0xc4c
1601#define RTXAGC_B_CCK11_CCK1 0xe20
1602#define RTXAGC_B_OFDM18_OFDM6 0xe24
1603#define RTXAGC_B_OFDM54_OFDM24 0xe28
1604#define RTXAGC_B_MCS03_MCS00 0xe2c
1605#define RTXAGC_B_MCS07_MCS04 0xe30
1606#define RTXAGC_B_MCS11_MCS08 0xe34
1607#define RTXAGC_B_MCS15_MCS12 0xe38
1608#define RTXAGC_B_NSS1INDEX3_NSS1INDEX0 0xe3c
1609#define RTXAGC_B_NSS1INDEX7_NSS1INDEX4 0xe40
1610#define RTXAGC_B_NSS2INDEX1_NSS1INDEX8 0xe44
1611#define RTXAGC_B_NSS2INDEX5_NSS2INDEX2 0xe48
1612#define RTXAGC_B_NSS2INDEX9_NSS2INDEX6 0xe4c
1613
1614#define RA_TXPWRTRAING 0xc54
1615#define RB_TXPWRTRAING 0xe54
1616
1617#define RFPGA0_IQK 0xe28
1618#define RTX_IQK_TONE_A 0xe30
1619#define RRX_IQK_TONE_A 0xe34
1620#define RTX_IQK_PI_A 0xe38
1621#define RRX_IQK_PI_A 0xe3c
1622
1623#define RTX_IQK 0xe40
1624#define RRX_IQK 0xe44
1625#define RIQK_AGC_PTS 0xe48
1626#define RIQK_AGC_RSP 0xe4c
1627#define RTX_IQK_TONE_B 0xe50
1628#define RRX_IQK_TONE_B 0xe54
1629#define RTX_IQK_PI_B 0xe58
1630#define RRX_IQK_PI_B 0xe5c
1631#define RIQK_AGC_CONT 0xe60
1632
1633#define RBLUE_TOOTH 0xe6c
1634#define RRX_WAIT_CCA 0xe70
1635#define RTX_CCK_RFON 0xe74
1636#define RTX_CCK_BBON 0xe78
1637#define RTX_OFDM_RFON 0xe7c
1638#define RTX_OFDM_BBON 0xe80
1639#define RTX_TO_RX 0xe84
1640#define RTX_TO_TX 0xe88
1641#define RRX_CCK 0xe8c
1642
1643#define RTX_POWER_BEFORE_IQK_A 0xe94
1644#define RTX_POWER_AFTER_IQK_A 0xe9c
1645
1646#define RRX_POWER_BEFORE_IQK_A 0xea0
1647#define RRX_POWER_BEFORE_IQK_A_2 0xea4
1648#define RRX_POWER_AFTER_IQK_A 0xea8
1649#define RRX_POWER_AFTER_IQK_A_2 0xeac
1650
1651#define RTX_POWER_BEFORE_IQK_B 0xeb4
1652#define RTX_POWER_AFTER_IQK_B 0xebc
1653
1654#define RRX_POER_BEFORE_IQK_B 0xec0
1655#define RRX_POER_BEFORE_IQK_B_2 0xec4
1656#define RRX_POWER_AFTER_IQK_B 0xec8
1657#define RRX_POWER_AFTER_IQK_B_2 0xecc
1658
1659#define RRX_OFDM 0xed0
1660#define RRX_WAIT_RIFS 0xed4
1661#define RRX_TO_RX 0xed8
1662#define RSTANDBY 0xedc
1663#define RSLEEP 0xee0
1664#define RPMPD_ANAEN 0xeec
1665
1666#define RZEBRA1_HSSIENABLE 0x0
1667#define RZEBRA1_TRXENABLE1 0x1
1668#define RZEBRA1_TRXENABLE2 0x2
1669#define RZEBRA1_AGC 0x4
1670#define RZEBRA1_CHARGEPUMP 0x5
1671#define RZEBRA1_CHANNEL 0x7
1672
1673#define RZEBRA1_TXGAIN 0x8
1674#define RZEBRA1_TXLPF 0x9
1675#define RZEBRA1_RXLPF 0xb
1676#define RZEBRA1_RXHPFCORNER 0xc
1677
1678#define RGLOBALCTRL 0
1679#define RRTL8256_TXLPF 19
1680#define RRTL8256_RXLPF 11
1681#define RRTL8258_TXLPF 0x11
1682#define RRTL8258_RXLPF 0x13
1683#define RRTL8258_RSSILPF 0xa
1684
1685#define RF_AC 0x00
1686
1687#define RF_IQADJ_G1 0x01
1688#define RF_IQADJ_G2 0x02
1689#define RF_POW_TRSW 0x05
1690
1691#define RF_GAIN_RX 0x06
1692#define RF_GAIN_TX 0x07
1693
1694#define RF_TXM_IDAC 0x08
1695#define RF_BS_IQGEN 0x0F
1696
1697#define RF_MODE1 0x10
1698#define RF_MODE2 0x11
1699
1700#define RF_RX_AGC_HP 0x12
1701#define RF_TX_AGC 0x13
1702#define RF_BIAS 0x14
1703#define RF_IPA 0x15
1704#define RF_POW_ABILITY 0x17
1705#define RF_MODE_AG 0x18
1706#define RRFCHANNEL 0x18
1707#define RF_CHNLBW 0x18
1708#define RF_TOP 0x19
1709
1710#define RF_RX_G1 0x1A
1711#define RF_RX_G2 0x1B
1712
1713#define RF_RX_BB2 0x1C
1714#define RF_RX_BB1 0x1D
1715
1716#define RF_RCK1 0x1E
1717#define RF_RCK2 0x1F
1718
1719#define RF_TX_G1 0x20
1720#define RF_TX_G2 0x21
1721#define RF_TX_G3 0x22
1722
1723#define RF_TX_BB1 0x23
1724#define RF_T_METER 0x24
1725#define RF_T_METER_88E 0x42
1726#define RF_T_METER_8812A 0x42
1727
1728#define RF_SYN_G1 0x25
1729#define RF_SYN_G2 0x26
1730#define RF_SYN_G3 0x27
1731#define RF_SYN_G4 0x28
1732#define RF_SYN_G5 0x29
1733#define RF_SYN_G6 0x2A
1734#define RF_SYN_G7 0x2B
1735#define RF_SYN_G8 0x2C
1736
1737#define RF_RCK_OS 0x30
1738#define RF_TXPA_G1 0x31
1739#define RF_TXPA_G2 0x32
1740#define RF_TXPA_G3 0x33
1741
1742#define RF_TX_BIAS_A 0x35
1743#define RF_TX_BIAS_D 0x36
1744#define RF_LOBF_9 0x38
1745#define RF_RXRF_A3 0x3C
1746#define RF_TRSW 0x3F
1747
1748#define RF_TXRF_A2 0x41
1749#define RF_TXPA_G4 0x46
1750#define RF_TXPA_A4 0x4B
1751
1752#define RF_APK 0x63
1753
1754#define RF_WE_LUT 0xEF
1755
1756#define BBBRESETB 0x100
1757#define BGLOBALRESETB 0x200
1758#define BOFDMTXSTART 0x4
1759#define BCCKTXSTART 0x8
1760#define BCRC32DEBUG 0x100
1761#define BPMACLOOPBACK 0x10
1762#define BTXLSIG 0xffffff
1763#define BOFDMTXRATE 0xf
1764#define BOFDMTXRESERVED 0x10
1765#define BOFDMTXLENGTH 0x1ffe0
1766#define BOFDMTXPARITY 0x20000
1767#define BTXHTSIG1 0xffffff
1768#define BTXHTMCSRATE 0x7f
1769#define BTXHTBW 0x80
1770#define BTXHTLENGTH 0xffff00
1771#define BTXHTSIG2 0xffffff
1772#define BTXHTSMOOTHING 0x1
1773#define BTXHTSOUNDING 0x2
1774#define BTXHTRESERVED 0x4
1775#define BTXHTAGGREATION 0x8
1776#define BTXHTSTBC 0x30
1777#define BTXHTADVANCECODING 0x40
1778#define BTXHTSHORTGI 0x80
1779#define BTXHTNUMBERHT_LTF 0x300
1780#define BTXHTCRC8 0x3fc00
1781#define BCOUNTERRESET 0x10000
1782#define BNUMOFOFDMTX 0xffff
1783#define BNUMOFCCKTX 0xffff0000
1784#define BTXIDLEINTERVAL 0xffff
1785#define BOFDMSERVICE 0xffff0000
1786#define BTXMACHEADER 0xffffffff
1787#define BTXDATAINIT 0xff
1788#define BTXHTMODE 0x100
1789#define BTXDATATYPE 0x30000
1790#define BTXRANDOMSEED 0xffffffff
1791#define BCCKTXPREAMBLE 0x1
1792#define BCCKTXSFD 0xffff0000
1793#define BCCKTXSIG 0xff
1794#define BCCKTXSERVICE 0xff00
1795#define BCCKLENGTHEXT 0x8000
1796#define BCCKTXLENGHT 0xffff0000
1797#define BCCKTXCRC16 0xffff
1798#define BCCKTXSTATUS 0x1
1799#define BOFDMTXSTATUS 0x2
1800#define IS_BB_REG_OFFSET_92S(__offset) \
1801 ((__offset >= 0x800) && (__offset <= 0xfff))
1802
1803#define BRFMOD 0x1
1804#define BJAPANMODE 0x2
1805#define BCCKTXSC 0x30
1806/* Block & Path enable*/
1807#define ROFDMCCKEN 0x808
1808#define BCCKEN 0x10000000
1809#define BOFDMEN 0x20000000
1810/* Rx antenna*/
1811#define RRXPATH 0x808
1812#define BRXPATH 0xff
1813/* Tx antenna*/
1814#define RTXPATH 0x80c
1815#define BTXPATH 0x0fffffff
1816/* for cck rx path selection*/
1817#define RCCK_RX 0xa04
1818#define BCCK_RX 0x0c000000
1819/* Use LSIG for VHT length*/
1820#define RVHTLEN_USE_LSIG 0x8c3
1821
1822#define BOFDMRXADCPHASE 0x10000
1823#define BOFDMTXDACPHASE 0x40000
1824#define BXATXAGC 0x3f
1825
1826#define BXBTXAGC 0xf00
1827#define BXCTXAGC 0xf000
1828#define BXDTXAGC 0xf0000
1829
1830#define BPASTART 0xf0000000
1831#define BTRSTART 0x00f00000
1832#define BRFSTART 0x0000f000
1833#define BBBSTART 0x000000f0
1834#define BBBCCKSTART 0x0000000f
1835#define BPAEND 0xf
1836#define BTREND 0x0f000000
1837#define BRFEND 0x000f0000
1838#define BCCAMASK 0x000000f0
1839#define BR2RCCAMASK 0x00000f00
1840#define BHSSI_R2TDELAY 0xf8000000
1841#define BHSSI_T2RDELAY 0xf80000
1842#define BCONTXHSSI 0x400
1843#define BIGFROMCCK 0x200
1844#define BAGCADDRESS 0x3f
1845#define BRXHPTX 0x7000
1846#define BRXHP2RX 0x38000
1847#define BRXHPCCKINI 0xc0000
1848#define BAGCTXCODE 0xc00000
1849#define BAGCRXCODE 0x300000
1850
1851#define B3WIREDATALENGTH 0x800
1852#define B3WIREADDREAALENGTH 0x400
1853
1854#define B3WIRERFPOWERDOWN 0x1
1855#define B5GPAPEPOLARITY 0x40000000
1856#define B2GPAPEPOLARITY 0x80000000
1857#define BRFSW_TXDEFAULTANT 0x3
1858#define BRFSW_TXOPTIONANT 0x30
1859#define BRFSW_RXDEFAULTANT 0x300
1860#define BRFSW_RXOPTIONANT 0x3000
1861#define BRFSI_3WIREDATA 0x1
1862#define BRFSI_3WIRECLOCK 0x2
1863#define BRFSI_3WIRELOAD 0x4
1864#define BRFSI_3WIRERW 0x8
1865#define BRFSI_3WIRE 0xf
1866
1867#define BRFSI_RFENV 0x10
1868
1869#define BRFSI_TRSW 0x20
1870#define BRFSI_TRSWB 0x40
1871#define BRFSI_ANTSW 0x100
1872#define BRFSI_ANTSWB 0x200
1873#define BRFSI_PAPE 0x400
1874#define BRFSI_PAPE5G 0x800
1875#define BBANDSELECT 0x1
1876#define BHTSIG2_GI 0x80
1877#define BHTSIG2_SMOOTHING 0x01
1878#define BHTSIG2_SOUNDING 0x02
1879#define BHTSIG2_AGGREATON 0x08
1880#define BHTSIG2_STBC 0x30
1881#define BHTSIG2_ADVCODING 0x40
1882#define BHTSIG2_NUMOFHTLTF 0x300
1883#define BHTSIG2_CRC8 0x3fc
1884#define BHTSIG1_MCS 0x7f
1885#define BHTSIG1_BANDWIDTH 0x80
1886#define BHTSIG1_HTLENGTH 0xffff
1887#define BLSIG_RATE 0xf
1888#define BLSIG_RESERVED 0x10
1889#define BLSIG_LENGTH 0x1fffe
1890#define BLSIG_PARITY 0x20
1891#define BCCKRXPHASE 0x4
1892
1893#define BLSSIREADADDRESS 0x7f800000
1894#define BLSSIREADEDGE 0x80000000
1895
1896#define BLSSIREADBACKDATA 0xfffff
1897
1898#define BLSSIREADOKFLAG 0x1000
1899#define BCCKSAMPLERATE 0x8
1900#define BREGULATOR0STANDBY 0x1
1901#define BREGULATORPLLSTANDBY 0x2
1902#define BREGULATOR1STANDBY 0x4
1903#define BPLLPOWERUP 0x8
1904#define BDPLLPOWERUP 0x10
1905#define BDA10POWERUP 0x20
1906#define BAD7POWERUP 0x200
1907#define BDA6POWERUP 0x2000
1908#define BXTALPOWERUP 0x4000
1909#define B40MDCLKPOWERUP 0x8000
1910#define BDA6DEBUGMODE 0x20000
1911#define BDA6SWING 0x380000
1912
1913#define BADCLKPHASE 0x4000000
1914#define B80MCLKDELAY 0x18000000
1915#define BAFEWATCHDOGENABLE 0x20000000
1916
1917#define BXTALCAP01 0xc0000000
1918#define BXTALCAP23 0x3
1919#define BXTALCAP92X 0x0f000000
1920#define BXTALCAP 0x0f000000
1921
1922#define BINTDIFCLKENABLE 0x400
1923#define BEXTSIGCLKENABLE 0x800
1924#define BBANDGAP_MBIAS_POWERUP 0x10000
1925#define BAD11SH_GAIN 0xc0000
1926#define BAD11NPUT_RANGE 0x700000
1927#define BAD110P_CURRENT 0x3800000
1928#define BLPATH_LOOPBACK 0x4000000
1929#define BQPATH_LOOPBACK 0x8000000
1930#define BAFE_LOOPBACK 0x10000000
1931#define BDA10_SWING 0x7e0
1932#define BDA10_REVERSE 0x800
1933#define BDA_CLK_SOURCE 0x1000
1934#define BDA7INPUT_RANGE 0x6000
1935#define BDA7_GAIN 0x38000
1936#define BDA7OUTPUT_CM_MODE 0x40000
1937#define BDA7INPUT_CM_MODE 0x380000
1938#define BDA7CURRENT 0xc00000
1939#define BREGULATOR_ADJUST 0x7000000
1940#define BAD11POWERUP_ATTX 0x1
1941#define BDA10PS_ATTX 0x10
1942#define BAD11POWERUP_ATRX 0x100
1943#define BDA10PS_ATRX 0x1000
1944#define BCCKRX_AGC_FORMAT 0x200
1945#define BPSDFFT_SAMPLE_POINT 0xc000
1946#define BPSD_AVERAGE_NUM 0x3000
1947#define BIQPATH_CONTROL 0xc00
1948#define BPSD_FREQ 0x3ff
1949#define BPSD_ANTENNA_PATH 0x30
1950#define BPSD_IQ_SWITCH 0x40
1951#define BPSD_RX_TRIGGER 0x400000
1952#define BPSD_TX_TRIGGER 0x80000000
1953#define BPSD_SINE_TONE_SCALE 0x7f000000
1954#define BPSD_REPORT 0xffff
1955
1956#define BOFDM_TXSC 0x30000000
1957#define BCCK_TXON 0x1
1958#define BOFDM_TXON 0x2
1959#define BDEBUG_PAGE 0xfff
1960#define BDEBUG_ITEM 0xff
1961#define BANTL 0x10
1962#define BANT_NONHT 0x100
1963#define BANT_HT1 0x1000
1964#define BANT_HT2 0x10000
1965#define BANT_HT1S1 0x100000
1966#define BANT_NONHTS1 0x1000000
1967
1968#define BCCK_BBMODE 0x3
1969#define BCCK_TXPOWERSAVING 0x80
1970#define BCCK_RXPOWERSAVING 0x40
1971
1972#define BCCK_SIDEBAND 0x10
1973
1974#define BCCK_SCRAMBLE 0x8
1975#define BCCK_ANTDIVERSITY 0x8000
1976#define BCCK_CARRIER_RECOVERY 0x4000
1977#define BCCK_TXRATE 0x3000
1978#define BCCK_DCCANCEL 0x0800
1979#define BCCK_ISICANCEL 0x0400
1980#define BCCK_MATCH_FILTER 0x0200
1981#define BCCK_EQUALIZER 0x0100
1982#define BCCK_PREAMBLE_DETECT 0x800000
1983#define BCCK_FAST_FALSECCA 0x400000
1984#define BCCK_CH_ESTSTART 0x300000
1985#define BCCK_CCA_COUNT 0x080000
1986#define BCCK_CS_LIM 0x070000
1987#define BCCK_BIST_MODE 0x80000000
1988#define BCCK_CCAMASK 0x40000000
1989#define BCCK_TX_DAC_PHASE 0x4
1990#define BCCK_RX_ADC_PHASE 0x20000000
1991#define BCCKR_CP_MODE 0x0100
1992#define BCCK_TXDC_OFFSET 0xf0
1993#define BCCK_RXDC_OFFSET 0xf
1994#define BCCK_CCA_MODE 0xc000
1995#define BCCK_FALSECS_LIM 0x3f00
1996#define BCCK_CS_RATIO 0xc00000
1997#define BCCK_CORGBIT_SEL 0x300000
1998#define BCCK_PD_LIM 0x0f0000
1999#define BCCK_NEWCCA 0x80000000
2000#define BCCK_RXHP_OF_IG 0x8000
2001#define BCCK_RXIG 0x7f00
2002#define BCCK_LNA_POLARITY 0x800000
2003#define BCCK_RX1ST_BAIN 0x7f0000
2004#define BCCK_RF_EXTEND 0x20000000
2005#define BCCK_RXAGC_SATLEVEL 0x1f000000
2006#define BCCK_RXAGC_SATCOUNT 0xe0
2007#define BCCKRXRFSETTLE 0x1f
2008#define BCCK_FIXED_RXAGC 0x8000
2009#define BCCK_ANTENNA_POLARITY 0x2000
2010#define BCCK_TXFILTER_TYPE 0x0c00
2011#define BCCK_RXAGC_REPORTTYPE 0x0300
2012#define BCCK_RXDAGC_EN 0x80000000
2013#define BCCK_RXDAGC_PERIOD 0x20000000
2014#define BCCK_RXDAGC_SATLEVEL 0x1f000000
2015#define BCCK_TIMING_RECOVERY 0x800000
2016#define BCCK_TXC0 0x3f0000
2017#define BCCK_TXC1 0x3f000000
2018#define BCCK_TXC2 0x3f
2019#define BCCK_TXC3 0x3f00
2020#define BCCK_TXC4 0x3f0000
2021#define BCCK_TXC5 0x3f000000
2022#define BCCK_TXC6 0x3f
2023#define BCCK_TXC7 0x3f00
2024#define BCCK_DEBUGPORT 0xff0000
2025#define BCCK_DAC_DEBUG 0x0f000000
2026#define BCCK_FALSEALARM_ENABLE 0x8000
2027#define BCCK_FALSEALARM_READ 0x4000
2028#define BCCK_TRSSI 0x7f
2029#define BCCK_RXAGC_REPORT 0xfe
2030#define BCCK_RXREPORT_ANTSEL 0x80000000
2031#define BCCK_RXREPORT_MFOFF 0x40000000
2032#define BCCK_RXREPORT_SQLOSS 0x20000000
2033#define BCCK_RXREPORT_PKTLOSS 0x10000000
2034#define BCCK_RXREPORT_LOCKEDBIT 0x08000000
2035#define BCCK_RXREPORT_RATEERROR 0x04000000
2036#define BCCK_RXREPORT_RXRATE 0x03000000
2037#define BCCK_RXFA_COUNTER_LOWER 0xff
2038#define BCCK_RXFA_COUNTER_UPPER 0xff000000
2039#define BCCK_RXHPAGC_START 0xe000
2040#define BCCK_RXHPAGC_FINAL 0x1c00
2041#define BCCK_RXFALSEALARM_ENABLE 0x8000
2042#define BCCK_FACOUNTER_FREEZE 0x4000
2043#define BCCK_TXPATH_SEL 0x10000000
2044#define BCCK_DEFAULT_RXPATH 0xc000000
2045#define BCCK_OPTION_RXPATH 0x3000000
2046
2047#define BNUM_OFSTF 0x3
2048#define BSHIFT_L 0xc0
2049#define BGI_TH 0xc
2050#define BRXPATH_A 0x1
2051#define BRXPATH_B 0x2
2052#define BRXPATH_C 0x4
2053#define BRXPATH_D 0x8
2054#define BTXPATH_A 0x1
2055#define BTXPATH_B 0x2
2056#define BTXPATH_C 0x4
2057#define BTXPATH_D 0x8
2058#define BTRSSI_FREQ 0x200
2059#define BADC_BACKOFF 0x3000
2060#define BDFIR_BACKOFF 0xc000
2061#define BTRSSI_LATCH_PHASE 0x10000
2062#define BRX_LDC_OFFSET 0xff
2063#define BRX_QDC_OFFSET 0xff00
2064#define BRX_DFIR_MODE 0x1800000
2065#define BRX_DCNF_TYPE 0xe000000
2066#define BRXIQIMB_A 0x3ff
2067#define BRXIQIMB_B 0xfc00
2068#define BRXIQIMB_C 0x3f0000
2069#define BRXIQIMB_D 0xffc00000
2070#define BDC_DC_NOTCH 0x60000
2071#define BRXNB_NOTCH 0x1f000000
2072#define BPD_TH 0xf
2073#define BPD_TH_OPT2 0xc000
2074#define BPWED_TH 0x700
2075#define BIFMF_WIN_L 0x800
2076#define BPD_OPTION 0x1000
2077#define BMF_WIN_L 0xe000
2078#define BBW_SEARCH_L 0x30000
2079#define BWIN_ENH_L 0xc0000
2080#define BBW_TH 0x700000
2081#define BED_TH2 0x3800000
2082#define BBW_OPTION 0x4000000
2083#define BRADIO_TH 0x18000000
2084#define BWINDOW_L 0xe0000000
2085#define BSBD_OPTION 0x1
2086#define BFRAME_TH 0x1c
2087#define BFS_OPTION 0x60
2088#define BDC_SLOPE_CHECK 0x80
2089#define BFGUARD_COUNTER_DC_L 0xe00
2090#define BFRAME_WEIGHT_SHORT 0x7000
2091#define BSUB_TUNE 0xe00000
2092#define BFRAME_DC_LENGTH 0xe000000
2093#define BSBD_START_OFFSET 0x30000000
2094#define BFRAME_TH_2 0x7
2095#define BFRAME_GI2_TH 0x38
2096#define BGI2_SYNC_EN 0x40
2097#define BSARCH_SHORT_EARLY 0x300
2098#define BSARCH_SHORT_LATE 0xc00
2099#define BSARCH_GI2_LATE 0x70000
2100#define BCFOANTSUM 0x1
2101#define BCFOACC 0x2
2102#define BCFOSTARTOFFSET 0xc
2103#define BCFOLOOPBACK 0x70
2104#define BCFOSUMWEIGHT 0x80
2105#define BDAGCENABLE 0x10000
2106#define BTXIQIMB_A 0x3ff
2107#define BTXIQIMB_b 0xfc00
2108#define BTXIQIMB_C 0x3f0000
2109#define BTXIQIMB_D 0xffc00000
2110#define BTXIDCOFFSET 0xff
2111#define BTXIQDCOFFSET 0xff00
2112#define BTXDFIRMODE 0x10000
2113#define BTXPESUDO_NOISEON 0x4000000
2114#define BTXPESUDO_NOISE_A 0xff
2115#define BTXPESUDO_NOISE_B 0xff00
2116#define BTXPESUDO_NOISE_C 0xff0000
2117#define BTXPESUDO_NOISE_D 0xff000000
2118#define BCCA_DROPOPTION 0x20000
2119#define BCCA_DROPTHRES 0xfff00000
2120#define BEDCCA_H 0xf
2121#define BEDCCA_L 0xf0
2122#define BLAMBDA_ED 0x300
2123#define BRX_INITIALGAIN 0x7f
2124#define BRX_ANTDIV_EN 0x80
2125#define BRX_AGC_ADDRESS_FOR_LNA 0x7f00
2126#define BRX_HIGHPOWER_FLOW 0x8000
2127#define BRX_AGC_FREEZE_THRES 0xc0000
2128#define BRX_FREEZESTEP_AGC1 0x300000
2129#define BRX_FREEZESTEP_AGC2 0xc00000
2130#define BRX_FREEZESTEP_AGC3 0x3000000
2131#define BRX_FREEZESTEP_AGC0 0xc000000
2132#define BRXRSSI_CMP_EN 0x10000000
2133#define BRXQUICK_AGCEN 0x20000000
2134#define BRXAGC_FREEZE_THRES_MODE 0x40000000
2135#define BRX_OVERFLOW_CHECKTYPE 0x80000000
2136#define BRX_AGCSHIFT 0x7f
2137#define BTRSW_TRI_ONLY 0x80
2138#define BPOWER_THRES 0x300
2139#define BRXAGC_EN 0x1
2140#define BRXAGC_TOGETHER_EN 0x2
2141#define BRXAGC_MIN 0x4
2142#define BRXHP_INI 0x7
2143#define BRXHP_TRLNA 0x70
2144#define BRXHP_RSSI 0x700
2145#define BRXHP_BBP1 0x7000
2146#define BRXHP_BBP2 0x70000
2147#define BRXHP_BBP3 0x700000
2148#define BRSSI_H 0x7f0000
2149#define BRSSI_GEN 0x7f000000
2150#define BRXSETTLE_TRSW 0x7
2151#define BRXSETTLE_LNA 0x38
2152#define BRXSETTLE_RSSI 0x1c0
2153#define BRXSETTLE_BBP 0xe00
2154#define BRXSETTLE_RXHP 0x7000
2155#define BRXSETTLE_ANTSW_RSSI 0x38000
2156#define BRXSETTLE_ANTSW 0xc0000
2157#define BRXPROCESS_TIME_DAGC 0x300000
2158#define BRXSETTLE_HSSI 0x400000
2159#define BRXPROCESS_TIME_BBPPW 0x800000
2160#define BRXANTENNA_POWER_SHIFT 0x3000000
2161#define BRSSI_TABLE_SELECT 0xc000000
2162#define BRXHP_FINAL 0x7000000
2163#define BRXHPSETTLE_BBP 0x7
2164#define BRXHTSETTLE_HSSI 0x8
2165#define BRXHTSETTLE_RXHP 0x70
2166#define BRXHTSETTLE_BBPPW 0x80
2167#define BRXHTSETTLE_IDLE 0x300
2168#define BRXHTSETTLE_RESERVED 0x1c00
2169#define BRXHT_RXHP_EN 0x8000
2170#define BRXAGC_FREEZE_THRES 0x30000
2171#define BRXAGC_TOGETHEREN 0x40000
2172#define BRXHTAGC_MIN 0x80000
2173#define BRXHTAGC_EN 0x100000
2174#define BRXHTDAGC_EN 0x200000
2175#define BRXHT_RXHP_BBP 0x1c00000
2176#define BRXHT_RXHP_FINAL 0xe0000000
2177#define BRXPW_RADIO_TH 0x3
2178#define BRXPW_RADIO_EN 0x4
2179#define BRXMF_HOLD 0x3800
2180#define BRXPD_DELAY_TH1 0x38
2181#define BRXPD_DELAY_TH2 0x1c0
2182#define BRXPD_DC_COUNT_MAX 0x600
2183#define BRXPD_DELAY_TH 0x8000
2184#define BRXPROCESS_DELAY 0xf0000
2185#define BRXSEARCHRANGE_GI2_EARLY 0x700000
2186#define BRXFRAME_FUARD_COUNTER_L 0x3800000
2187#define BRXSGI_GUARD_L 0xc000000
2188#define BRXSGI_SEARCH_L 0x30000000
2189#define BRXSGI_TH 0xc0000000
2190#define BDFSCNT0 0xff
2191#define BDFSCNT1 0xff00
2192#define BDFSFLAG 0xf0000
2193#define BMF_WEIGHT_SUM 0x300000
2194#define BMINIDX_TH 0x7f000000
2195#define BDAFORMAT 0x40000
2196#define BTXCH_EMU_ENABLE 0x01000000
2197#define BTRSW_ISOLATION_A 0x7f
2198#define BTRSW_ISOLATION_B 0x7f00
2199#define BTRSW_ISOLATION_C 0x7f0000
2200#define BTRSW_ISOLATION_D 0x7f000000
2201#define BEXT_LNA_GAIN 0x7c00
2202
2203#define BSTBC_EN 0x4
2204#define BANTENNA_MAPPING 0x10
2205#define BNSS 0x20
2206#define BCFO_ANTSUM_ID 0x200
2207#define BPHY_COUNTER_RESET 0x8000000
2208#define BCFO_REPORT_GET 0x4000000
2209#define BOFDM_CONTINUE_TX 0x10000000
2210#define BOFDM_SINGLE_CARRIER 0x20000000
2211#define BOFDM_SINGLE_TONE 0x40000000
2212#define BHT_DETECT 0x100
2213#define BCFOEN 0x10000
2214#define BCFOVALUE 0xfff00000
2215#define BSIGTONE_RE 0x3f
2216#define BSIGTONE_IM 0x7f00
2217#define BCOUNTER_CCA 0xffff
2218#define BCOUNTER_PARITYFAIL 0xffff0000
2219#define BCOUNTER_RATEILLEGAL 0xffff
2220#define BCOUNTER_CRC8FAIL 0xffff0000
2221#define BCOUNTER_MCSNOSUPPORT 0xffff
2222#define BCOUNTER_FASTSYNC 0xffff
2223#define BSHORTCFO 0xfff
2224#define BSHORTCFOT_LENGTH 12
2225#define BSHORTCFOF_LENGTH 11
2226#define BLONGCFO 0x7ff
2227#define BLONGCFOT_LENGTH 11
2228#define BLONGCFOF_LENGTH 11
2229#define BTAILCFO 0x1fff
2230#define BTAILCFOT_LENGTH 13
2231#define BTAILCFOF_LENGTH 12
2232#define BNOISE_EN_PWDB 0xffff
2233#define BCC_POWER_DB 0xffff0000
2234#define BMOISE_PWDB 0xffff
2235#define BPOWERMEAST_LENGTH 10
2236#define BPOWERMEASF_LENGTH 3
2237#define BRX_HT_BW 0x1
2238#define BRXSC 0x6
2239#define BRX_HT 0x8
2240#define BNB_INTF_DET_ON 0x1
2241#define BINTF_WIN_LEN_CFG 0x30
2242#define BNB_INTF_TH_CFG 0x1c0
2243#define BRFGAIN 0x3f
2244#define BTABLESEL 0x40
2245#define BTRSW 0x80
2246#define BRXSNR_A 0xff
2247#define BRXSNR_B 0xff00
2248#define BRXSNR_C 0xff0000
2249#define BRXSNR_D 0xff000000
2250#define BSNR_EVMT_LENGTH 8
2251#define BSNR_EVMF_LENGTH 1
2252#define BCSI1ST 0xff
2253#define BCSI2ND 0xff00
2254#define BRXEVM1ST 0xff0000
2255#define BRXEVM2ND 0xff000000
2256#define BSIGEVM 0xff
2257#define BPWDB 0xff00
2258#define BSGIEN 0x10000
2259
2260#define BSFACTOR_QMA1 0xf
2261#define BSFACTOR_QMA2 0xf0
2262#define BSFACTOR_QMA3 0xf00
2263#define BSFACTOR_QMA4 0xf000
2264#define BSFACTOR_QMA5 0xf0000
2265#define BSFACTOR_QMA6 0xf0000
2266#define BSFACTOR_QMA7 0xf00000
2267#define BSFACTOR_QMA8 0xf000000
2268#define BSFACTOR_QMA9 0xf0000000
2269#define BCSI_SCHEME 0x100000
2270
2271#define BNOISE_LVL_TOP_SET 0x3
2272#define BCHSMOOTH 0x4
2273#define BCHSMOOTH_CFG1 0x38
2274#define BCHSMOOTH_CFG2 0x1c0
2275#define BCHSMOOTH_CFG3 0xe00
2276#define BCHSMOOTH_CFG4 0x7000
2277#define BMRCMODE 0x800000
2278#define BTHEVMCFG 0x7000000
2279
2280#define BLOOP_FIT_TYPE 0x1
2281#define BUPD_CFO 0x40
2282#define BUPD_CFO_OFFDATA 0x80
2283#define BADV_UPD_CFO 0x100
2284#define BADV_TIME_CTRL 0x800
2285#define BUPD_CLKO 0x1000
2286#define BFC 0x6000
2287#define BTRACKING_MODE 0x8000
2288#define BPHCMP_ENABLE 0x10000
2289#define BUPD_CLKO_LTF 0x20000
2290#define BCOM_CH_CFO 0x40000
2291#define BCSI_ESTI_MODE 0x80000
2292#define BADV_UPD_EQZ 0x100000
2293#define BUCHCFG 0x7000000
2294#define BUPDEQZ 0x8000000
2295
2296#define BRX_PESUDO_NOISE_ON 0x20000000
2297#define BRX_PESUDO_NOISE_A 0xff
2298#define BRX_PESUDO_NOISE_B 0xff00
2299#define BRX_PESUDO_NOISE_C 0xff0000
2300#define BRX_PESUDO_NOISE_D 0xff000000
2301#define BRX_PESUDO_NOISESTATE_A 0xffff
2302#define BRX_PESUDO_NOISESTATE_B 0xffff0000
2303#define BRX_PESUDO_NOISESTATE_C 0xffff
2304#define BRX_PESUDO_NOISESTATE_D 0xffff0000
2305
2306#define BZEBRA1_HSSIENABLE 0x8
2307#define BZEBRA1_TRXCONTROL 0xc00
2308#define BZEBRA1_TRXGAINSETTING 0x07f
2309#define BZEBRA1_RXCOUNTER 0xc00
2310#define BZEBRA1_TXCHANGEPUMP 0x38
2311#define BZEBRA1_RXCHANGEPUMP 0x7
2312#define BZEBRA1_CHANNEL_NUM 0xf80
2313#define BZEBRA1_TXLPFBW 0x400
2314#define BZEBRA1_RXLPFBW 0x600
2315
2316#define BRTL8256REG_MODE_CTRL1 0x100
2317#define BRTL8256REG_MODE_CTRL0 0x40
2318#define BRTL8256REG_TXLPFBW 0x18
2319#define BRTL8256REG_RXLPFBW 0x600
2320
2321#define BRTL8258_TXLPFBW 0xc
2322#define BRTL8258_RXLPFBW 0xc00
2323#define BRTL8258_RSSILPFBW 0xc0
2324
2325#define BBYTE0 0x1
2326#define BBYTE1 0x2
2327#define BBYTE2 0x4
2328#define BBYTE3 0x8
2329#define BWORD0 0x3
2330#define BWORD1 0xc
2331#define BWORD 0xf
2332
2333#define MASKBYTE0 0xff
2334#define MASKBYTE1 0xff00
2335#define MASKBYTE2 0xff0000
2336#define MASKBYTE3 0xff000000
2337#define MASKHWORD 0xffff0000
2338#define MASKLWORD 0x0000ffff
2339#define MASKDWORD 0xffffffff
2340#define MASK12BITS 0xfff
2341#define MASKH4BITS 0xf0000000
2342#define MASKOFDM_D 0xffc00000
2343#define MASKCCK 0x3f3f3f3f
2344
2345#define MASK4BITS 0x0f
2346#define MASK20BITS 0xfffff
2347#define RFREG_OFFSET_MASK 0xfffff
2348
2349#define BENABLE 0x1
2350#define BDISABLE 0x0
2351
2352#define LEFT_ANTENNA 0x0
2353#define RIGHT_ANTENNA 0x1
2354
2355#define TCHECK_TXSTATUS 500
2356#define TUPDATE_RXCOUNTER 100
2357
2358#define REG_UN_used_register 0x01bf
2359
2360/* Path_A RFE cotrol pinmux*/
2361#define RA_RFE_PINMUX 0xcb0
2362/* Path_B RFE control pinmux*/
2363#define RB_RFE_PINMUX 0xeb0
2364
2365#define RA_RFE_INV 0xcb4
2366#define RB_RFE_INV 0xeb4
2367
2368/* RXIQC */
2369/*RxIQ imblance matrix coeff. A & B*/
2370#define RA_RXIQC_AB 0xc10
2371/*RxIQ imblance matrix coeff. C & D*/
2372#define RA_RXIQC_CD 0xc14
2373/* Pah_A TX scaling factor*/
2374#define RA_TXSCALE 0xc1c
2375/* Path_B TX scaling factor*/
2376#define RB_TXSCALE 0xe1c
2377/*RxIQ imblance matrix coeff. A & B*/
2378#define RB_RXIQC_AB 0xe10
2379/*RxIQ imblance matrix coeff. C & D*/
2380#define RB_RXIQC_CD 0xe14
2381/*bit mask for IQC matrix element A & C*/
2382#define RXIQC_AC 0x02ff
2383 /*bit mask for IQC matrix element A & C*/
2384#define RXIQC_BD 0x02ff0000
2385
2386/* 2 EFUSE_TEST (For RTL8723 partially) */
2387#define EFUSE_SEL(x) (((x) & 0x3) << 8)
2388#define EFUSE_SEL_MASK 0x300
2389#define EFUSE_WIFI_SEL_0 0x0
2390
2391/*REG_MULTI_FUNC_CTRL(For RTL8723 Only)*/
2392/* Enable GPIO[9] as WiFi HW PDn source*/
2393#define WL_HWPDN_EN BIT(0)
2394/* WiFi HW PDn polarity control*/
2395#define WL_HWPDN_SL BIT(1)
2396/* WiFi function enable */
2397#define WL_FUNC_EN BIT(2)
2398/* Enable GPIO[9] as WiFi RF HW PDn source */
2399#define WL_HWROF_EN BIT(3)
2400/* Enable GPIO[11] as BT HW PDn source */
2401#define BT_HWPDN_EN BIT(16)
2402/* BT HW PDn polarity control */
2403#define BT_HWPDN_SL BIT(17)
2404/* BT function enable */
2405#define BT_FUNC_EN BIT(18)
2406/* Enable GPIO[11] as BT/GPS RF HW PDn source */
2407#define BT_HWROF_EN BIT(19)
2408/* Enable GPIO[10] as GPS HW PDn source */
2409#define GPS_HWPDN_EN BIT(20)
2410/* GPS HW PDn polarity control */
2411#define GPS_HWPDN_SL BIT(21)
2412/* GPS function enable */
2413#define GPS_FUNC_EN BIT(22)
2414
2415#define BMASKBYTE0 0xff
2416#define BMASKBYTE1 0xff00
2417#define BMASKBYTE2 0xff0000
2418#define BMASKBYTE3 0xff000000
2419#define BMASKHWORD 0xffff0000
2420#define BMASKLWORD 0x0000ffff
2421#define BMASKDWORD 0xffffffff
2422#define BMASK12BITS 0xfff
2423#define BMASKH4BITS 0xf0000000
2424#define BMASKOFDM_D 0xffc00000
2425#define BMASKCCK 0x3f3f3f3f
2426
2427#define BRFREGOFFSETMASK 0xfffff
2428
2429#define ODM_REG_CCK_RPT_FORMAT_11AC 0x804
2430#define ODM_REG_BB_RX_PATH_11AC 0x808
2431/*PAGE 9*/
2432#define ODM_REG_OFDM_FA_RST_11AC 0x9A4
2433/*PAGE A*/
2434#define ODM_REG_CCK_CCA_11AC 0xA0A
2435#define ODM_REG_CCK_FA_RST_11AC 0xA2C
2436#define ODM_REG_CCK_FA_11AC 0xA5C
2437/*PAGE C*/
2438#define ODM_REG_IGI_A_11AC 0xC50
2439/*PAGE E*/
2440#define ODM_REG_IGI_B_11AC 0xE50
2441/*PAGE F*/
2442#define ODM_REG_OFDM_FA_11AC 0xF48
2443
2444/* 2 MAC REG LIST */
2445
2446/* DIG Related */
2447#define ODM_BIT_IGI_11AC 0xFFFFFFFF
2448#define ODM_BIT_CCK_RPT_FORMAT_11AC BIT16
2449#define ODM_BIT_BB_RX_PATH_11AC 0xF
2450
2451enum AGGRE_SIZE {
2452 HT_AGG_SIZE_8K = 0,
2453 HT_AGG_SIZE_16K = 1,
2454 HT_AGG_SIZE_32K = 2,
2455 HT_AGG_SIZE_64K = 3,
2456 VHT_AGG_SIZE_128K = 4,
2457 VHT_AGG_SIZE_256K = 5,
2458 VHT_AGG_SIZE_512K = 6,
2459 VHT_AGG_SIZE_1024K = 7,
2460};
2461
2462#define REG_AMPDU_MAX_LENGTH_8812 0x0458
2463
2464#endif
diff --git a/drivers/net/wireless/rtlwifi/rtl8821ae/rf.c b/drivers/net/wireless/rtlwifi/rtl8821ae/rf.c
new file mode 100644
index 000000000000..2922538160e5
--- /dev/null
+++ b/drivers/net/wireless/rtlwifi/rtl8821ae/rf.c
@@ -0,0 +1,465 @@
1/******************************************************************************
2 *
3 * Copyright(c) 2009-2010 Realtek Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * The full GNU General Public License is included in this distribution in the
15 * file called LICENSE.
16 *
17 * Contact Information:
18 * wlanfae <wlanfae@realtek.com>
19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20 * Hsinchu 300, Taiwan.
21 *
22 * Larry Finger <Larry.Finger@lwfinger.net>
23 *
24 *****************************************************************************/
25
26#include "../wifi.h"
27#include "reg.h"
28#include "def.h"
29#include "phy.h"
30#include "rf.h"
31#include "dm.h"
32
33static bool _rtl8821ae_phy_rf6052_config_parafile(struct ieee80211_hw *hw);
34
35void rtl8821ae_phy_rf6052_set_bandwidth(struct ieee80211_hw *hw, u8 bandwidth)
36{
37 struct rtl_priv *rtlpriv = rtl_priv(hw);
38
39 switch (bandwidth) {
40 case HT_CHANNEL_WIDTH_20:
41 rtl_set_rfreg(hw, RF90_PATH_A, RF_CHNLBW, BIT(11)|BIT(10), 3);
42 rtl_set_rfreg(hw, RF90_PATH_B, RF_CHNLBW, BIT(11)|BIT(10), 3);
43 break;
44 case HT_CHANNEL_WIDTH_20_40:
45 rtl_set_rfreg(hw, RF90_PATH_A, RF_CHNLBW, BIT(11)|BIT(10), 1);
46 rtl_set_rfreg(hw, RF90_PATH_B, RF_CHNLBW, BIT(11)|BIT(10), 1);
47 break;
48 case HT_CHANNEL_WIDTH_80:
49 rtl_set_rfreg(hw, RF90_PATH_A, RF_CHNLBW, BIT(11)|BIT(10), 0);
50 rtl_set_rfreg(hw, RF90_PATH_B, RF_CHNLBW, BIT(11)|BIT(10), 0);
51 break;
52 default:
53 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
54 "unknown bandwidth: %#X\n", bandwidth);
55 break;
56 }
57}
58
59void rtl8821ae_phy_rf6052_set_cck_txpower(struct ieee80211_hw *hw,
60 u8 *ppowerlevel)
61{
62 struct rtl_priv *rtlpriv = rtl_priv(hw);
63 struct rtl_phy *rtlphy = &rtlpriv->phy;
64 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
65 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
66 u32 tx_agc[2] = {0, 0}, tmpval;
67 bool turbo_scanoff = false;
68 u8 idx1, idx2;
69 u8 *ptr;
70 u8 direction;
71 u32 pwrtrac_value;
72
73 if (rtlefuse->eeprom_regulatory != 0)
74 turbo_scanoff = true;
75
76 if (mac->act_scanning) {
77 tx_agc[RF90_PATH_A] = 0x3f3f3f3f;
78 tx_agc[RF90_PATH_B] = 0x3f3f3f3f;
79
80 if (turbo_scanoff) {
81 for (idx1 = RF90_PATH_A;
82 idx1 <= RF90_PATH_B;
83 idx1++) {
84 tx_agc[idx1] = ppowerlevel[idx1] |
85 (ppowerlevel[idx1] << 8) |
86 (ppowerlevel[idx1] << 16) |
87 (ppowerlevel[idx1] << 24);
88 }
89 }
90 } else {
91 for (idx1 = RF90_PATH_A; idx1 <= RF90_PATH_B; idx1++) {
92 tx_agc[idx1] = ppowerlevel[idx1] |
93 (ppowerlevel[idx1] << 8) |
94 (ppowerlevel[idx1] << 16) |
95 (ppowerlevel[idx1] << 24);
96 }
97
98 if (rtlefuse->eeprom_regulatory == 0) {
99 tmpval =
100 (rtlphy->mcs_txpwrlevel_origoffset[0][6]) +
101 (rtlphy->mcs_txpwrlevel_origoffset[0][7] <<
102 8);
103 tx_agc[RF90_PATH_A] += tmpval;
104
105 tmpval = (rtlphy->mcs_txpwrlevel_origoffset[0][14]) +
106 (rtlphy->mcs_txpwrlevel_origoffset[0][15] <<
107 24);
108 tx_agc[RF90_PATH_B] += tmpval;
109 }
110 }
111
112 for (idx1 = RF90_PATH_A; idx1 <= RF90_PATH_B; idx1++) {
113 ptr = (u8 *)(&tx_agc[idx1]);
114 for (idx2 = 0; idx2 < 4; idx2++) {
115 if (*ptr > RF6052_MAX_TX_PWR)
116 *ptr = RF6052_MAX_TX_PWR;
117 ptr++;
118 }
119 }
120 rtl8821ae_dm_txpower_track_adjust(hw, 1, &direction, &pwrtrac_value);
121 if (direction == 1) {
122 tx_agc[0] += pwrtrac_value;
123 tx_agc[1] += pwrtrac_value;
124 } else if (direction == 2) {
125 tx_agc[0] -= pwrtrac_value;
126 tx_agc[1] -= pwrtrac_value;
127 }
128 tmpval = tx_agc[RF90_PATH_A];
129 rtl_set_bbreg(hw, RTXAGC_A_CCK11_CCK1, MASKDWORD, tmpval);
130
131 RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
132 "CCK PWR 1~11M (rf-A) = 0x%x (reg 0x%x)\n", tmpval,
133 RTXAGC_A_CCK11_CCK1);
134
135 tmpval = tx_agc[RF90_PATH_B];
136 rtl_set_bbreg(hw, RTXAGC_B_CCK11_CCK1, MASKDWORD, tmpval);
137
138 RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
139 "CCK PWR 11M (rf-B) = 0x%x (reg 0x%x)\n", tmpval,
140 RTXAGC_B_CCK11_CCK1);
141}
142
143static void rtl8821ae_phy_get_power_base(struct ieee80211_hw *hw,
144 u8 *ppowerlevel_ofdm,
145 u8 *ppowerlevel_bw20,
146 u8 *ppowerlevel_bw40, u8 channel,
147 u32 *ofdmbase, u32 *mcsbase)
148{
149 struct rtl_priv *rtlpriv = rtl_priv(hw);
150 struct rtl_phy *rtlphy = &rtlpriv->phy;
151 u32 powerbase0, powerbase1;
152 u8 i, powerlevel[2];
153
154 for (i = 0; i < 2; i++) {
155 powerbase0 = ppowerlevel_ofdm[i];
156
157 powerbase0 = (powerbase0 << 24) | (powerbase0 << 16) |
158 (powerbase0 << 8) | powerbase0;
159 *(ofdmbase + i) = powerbase0;
160 RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
161 " [OFDM power base index rf(%c) = 0x%x]\n",
162 ((i == 0) ? 'A' : 'B'), *(ofdmbase + i));
163 }
164
165 for (i = 0; i < 2; i++) {
166 if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20)
167 powerlevel[i] = ppowerlevel_bw20[i];
168 else
169 powerlevel[i] = ppowerlevel_bw40[i];
170
171 powerbase1 = powerlevel[i];
172 powerbase1 = (powerbase1 << 24) |
173 (powerbase1 << 16) | (powerbase1 << 8) | powerbase1;
174
175 *(mcsbase + i) = powerbase1;
176
177 RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
178 " [MCS power base index rf(%c) = 0x%x]\n",
179 ((i == 0) ? 'A' : 'B'), *(mcsbase + i));
180 }
181}
182
183static void get_txpower_writeval_by_regulatory(struct ieee80211_hw *hw,
184 u8 channel, u8 index,
185 u32 *powerbase0,
186 u32 *powerbase1,
187 u32 *p_outwriteval)
188{
189 struct rtl_priv *rtlpriv = rtl_priv(hw);
190 struct rtl_phy *rtlphy = &rtlpriv->phy;
191 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
192 u8 i, chnlgroup = 0, pwr_diff_limit[4], pwr_diff = 0, customer_pwr_diff;
193 u32 writeval, customer_limit, rf;
194
195 for (rf = 0; rf < 2; rf++) {
196 switch (rtlefuse->eeprom_regulatory) {
197 case 0:
198 chnlgroup = 0;
199
200 writeval =
201 rtlphy->mcs_txpwrlevel_origoffset[chnlgroup][index +
202 (rf ? 8 : 0)]
203 + ((index < 2) ? powerbase0[rf] : powerbase1[rf]);
204
205 RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
206 "RTK better performance, writeval(%c) = 0x%x\n",
207 ((rf == 0) ? 'A' : 'B'), writeval);
208 break;
209 case 1:
210 if (rtlphy->pwrgroup_cnt == 1) {
211 chnlgroup = 0;
212 } else {
213 if (channel < 3)
214 chnlgroup = 0;
215 else if (channel < 6)
216 chnlgroup = 1;
217 else if (channel < 9)
218 chnlgroup = 2;
219 else if (channel < 12)
220 chnlgroup = 3;
221 else if (channel < 14)
222 chnlgroup = 4;
223 else if (channel == 14)
224 chnlgroup = 5;
225 }
226
227 writeval =
228 rtlphy->mcs_txpwrlevel_origoffset[chnlgroup]
229 [index + (rf ? 8 : 0)] + ((index < 2) ?
230 powerbase0[rf] :
231 powerbase1[rf]);
232
233 RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
234 "Realtek regulatory, 20MHz, writeval(%c) = 0x%x\n",
235 ((rf == 0) ? 'A' : 'B'), writeval);
236
237 break;
238 case 2:
239 writeval =
240 ((index < 2) ? powerbase0[rf] : powerbase1[rf]);
241
242 RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
243 "Better regulatory, writeval(%c) = 0x%x\n",
244 ((rf == 0) ? 'A' : 'B'), writeval);
245 break;
246 case 3:
247 chnlgroup = 0;
248
249 if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20_40) {
250 RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
251 "customer's limit, 40MHz rf(%c) = 0x%x\n",
252 ((rf == 0) ? 'A' : 'B'),
253 rtlefuse->pwrgroup_ht40[rf][channel -
254 1]);
255 } else {
256 RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
257 "customer's limit, 20MHz rf(%c) = 0x%x\n",
258 ((rf == 0) ? 'A' : 'B'),
259 rtlefuse->pwrgroup_ht20[rf][channel -
260 1]);
261 }
262
263 if (index < 2)
264 pwr_diff = rtlefuse->txpwr_legacyhtdiff[rf][channel-1];
265 else if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20)
266 pwr_diff =
267 rtlefuse->txpwr_ht20diff[rf][channel-1];
268
269 if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20_40)
270 customer_pwr_diff =
271 rtlefuse->pwrgroup_ht40[rf][channel-1];
272 else
273 customer_pwr_diff =
274 rtlefuse->pwrgroup_ht20[rf][channel-1];
275
276 if (pwr_diff > customer_pwr_diff)
277 pwr_diff = 0;
278 else
279 pwr_diff = customer_pwr_diff - pwr_diff;
280
281 for (i = 0; i < 4; i++) {
282 pwr_diff_limit[i] =
283 (u8)((rtlphy->mcs_txpwrlevel_origoffset
284 [chnlgroup][index + (rf ? 8 : 0)] &
285 (0x7f << (i * 8))) >> (i * 8));
286
287 if (pwr_diff_limit[i] > pwr_diff)
288 pwr_diff_limit[i] = pwr_diff;
289 }
290
291 customer_limit = (pwr_diff_limit[3] << 24) |
292 (pwr_diff_limit[2] << 16) |
293 (pwr_diff_limit[1] << 8) | (pwr_diff_limit[0]);
294
295 RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
296 "Customer's limit rf(%c) = 0x%x\n",
297 ((rf == 0) ? 'A' : 'B'), customer_limit);
298
299 writeval = customer_limit +
300 ((index < 2) ? powerbase0[rf] : powerbase1[rf]);
301
302 RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
303 "Customer, writeval rf(%c)= 0x%x\n",
304 ((rf == 0) ? 'A' : 'B'), writeval);
305 break;
306 default:
307 chnlgroup = 0;
308 writeval =
309 rtlphy->mcs_txpwrlevel_origoffset[chnlgroup]
310 [index + (rf ? 8 : 0)]
311 + ((index < 2) ? powerbase0[rf] : powerbase1[rf]);
312
313 RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
314 "RTK better performance, writeval rf(%c) = 0x%x\n",
315 ((rf == 0) ? 'A' : 'B'), writeval);
316 break;
317 }
318
319 if (rtlpriv->dm.dynamic_txhighpower_lvl == TXHIGHPWRLEVEL_BT1)
320 writeval = writeval - 0x06060606;
321 else if (rtlpriv->dm.dynamic_txhighpower_lvl ==
322 TXHIGHPWRLEVEL_BT2)
323 writeval = writeval - 0x0c0c0c0c;
324 *(p_outwriteval + rf) = writeval;
325 }
326}
327
328static void _rtl8821ae_write_ofdm_power_reg(struct ieee80211_hw *hw,
329 u8 index, u32 *pvalue)
330{
331 struct rtl_priv *rtlpriv = rtl_priv(hw);
332 u16 regoffset_a[6] = {
333 RTXAGC_A_OFDM18_OFDM6, RTXAGC_A_OFDM54_OFDM24,
334 RTXAGC_A_MCS03_MCS00, RTXAGC_A_MCS07_MCS04,
335 RTXAGC_A_MCS11_MCS08, RTXAGC_A_MCS15_MCS12
336 };
337 u16 regoffset_b[6] = {
338 RTXAGC_B_OFDM18_OFDM6, RTXAGC_B_OFDM54_OFDM24,
339 RTXAGC_B_MCS03_MCS00, RTXAGC_B_MCS07_MCS04,
340 RTXAGC_B_MCS11_MCS08, RTXAGC_B_MCS15_MCS12
341 };
342 u8 i, rf, pwr_val[4];
343 u32 writeval;
344 u16 regoffset;
345
346 for (rf = 0; rf < 2; rf++) {
347 writeval = pvalue[rf];
348 for (i = 0; i < 4; i++) {
349 pwr_val[i] = (u8)((writeval & (0x7f <<
350 (i * 8))) >> (i * 8));
351
352 if (pwr_val[i] > RF6052_MAX_TX_PWR)
353 pwr_val[i] = RF6052_MAX_TX_PWR;
354 }
355 writeval = (pwr_val[3] << 24) | (pwr_val[2] << 16) |
356 (pwr_val[1] << 8) | pwr_val[0];
357
358 if (rf == 0)
359 regoffset = regoffset_a[index];
360 else
361 regoffset = regoffset_b[index];
362 rtl_set_bbreg(hw, regoffset, MASKDWORD, writeval);
363
364 RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
365 "Set 0x%x = %08x\n", regoffset, writeval);
366 }
367}
368
369void rtl8821ae_phy_rf6052_set_ofdm_txpower(struct ieee80211_hw *hw,
370 u8 *ppowerlevel_ofdm,
371 u8 *ppowerlevel_bw20,
372 u8 *ppowerlevel_bw40,
373 u8 channel)
374{
375 u32 writeval[2], powerbase0[2], powerbase1[2];
376 u8 index;
377 u8 direction;
378 u32 pwrtrac_value;
379
380 rtl8821ae_phy_get_power_base(hw, ppowerlevel_ofdm,
381 ppowerlevel_bw20,
382 ppowerlevel_bw40,
383 channel,
384 &powerbase0[0],
385 &powerbase1[0]);
386
387 rtl8821ae_dm_txpower_track_adjust(hw, 1, &direction, &pwrtrac_value);
388
389 for (index = 0; index < 6; index++) {
390 get_txpower_writeval_by_regulatory(hw, channel, index,
391 &powerbase0[0],
392 &powerbase1[0],
393 &writeval[0]);
394 if (direction == 1) {
395 writeval[0] += pwrtrac_value;
396 writeval[1] += pwrtrac_value;
397 } else if (direction == 2) {
398 writeval[0] -= pwrtrac_value;
399 writeval[1] -= pwrtrac_value;
400 }
401 _rtl8821ae_write_ofdm_power_reg(hw, index, &writeval[0]);
402 }
403}
404
405bool rtl8821ae_phy_rf6052_config(struct ieee80211_hw *hw)
406{
407 struct rtl_priv *rtlpriv = rtl_priv(hw);
408 struct rtl_phy *rtlphy = &rtlpriv->phy;
409
410 if (rtlphy->rf_type == RF_1T1R)
411 rtlphy->num_total_rfpath = 1;
412 else
413 rtlphy->num_total_rfpath = 2;
414
415 return _rtl8821ae_phy_rf6052_config_parafile(hw);
416}
417
418static bool _rtl8821ae_phy_rf6052_config_parafile(struct ieee80211_hw *hw)
419{
420 struct rtl_priv *rtlpriv = rtl_priv(hw);
421 struct rtl_phy *rtlphy = &rtlpriv->phy;
422 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
423 u8 rfpath;
424 bool rtstatus = true;
425
426 for (rfpath = 0; rfpath < rtlphy->num_total_rfpath; rfpath++) {
427 switch (rfpath) {
428 case RF90_PATH_A: {
429 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE)
430 rtstatus =
431 rtl8812ae_phy_config_rf_with_headerfile(hw,
432 (enum radio_path)rfpath);
433 else
434 rtstatus =
435 rtl8821ae_phy_config_rf_with_headerfile(hw,
436 (enum radio_path)rfpath);
437 break;
438 }
439 case RF90_PATH_B:
440 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE)
441 rtstatus =
442 rtl8812ae_phy_config_rf_with_headerfile(hw,
443 (enum radio_path)rfpath);
444 else
445 rtstatus =
446 rtl8821ae_phy_config_rf_with_headerfile(hw,
447 (enum radio_path)rfpath);
448 break;
449 case RF90_PATH_C:
450 break;
451 case RF90_PATH_D:
452 break;
453 }
454
455 if (!rtstatus) {
456 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
457 "Radio[%d] Fail!!", rfpath);
458 return false;
459 }
460 }
461
462 /*put arrays in dm.c*/
463 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, "\n");
464 return rtstatus;
465}
diff --git a/drivers/net/wireless/rtlwifi/rtl8821ae/rf.h b/drivers/net/wireless/rtlwifi/rtl8821ae/rf.h
new file mode 100644
index 000000000000..d9582ee1c335
--- /dev/null
+++ b/drivers/net/wireless/rtlwifi/rtl8821ae/rf.h
@@ -0,0 +1,43 @@
1/******************************************************************************
2 *
3 * Copyright(c) 2009-2010 Realtek Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * The full GNU General Public License is included in this distribution in the
15 * file called LICENSE.
16 *
17 * Contact Information:
18 * wlanfae <wlanfae@realtek.com>
19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20 * Hsinchu 300, Taiwan.
21 *
22 * Larry Finger <Larry.Finger@lwfinger.net>
23 *
24 *****************************************************************************/
25
26#ifndef __RTL8821AE_RF_H__
27#define __RTL8821AE_RF_H__
28
29#define RF6052_MAX_TX_PWR 0x3F
30#define RF6052_MAX_REG 0x3F
31
32void rtl8821ae_phy_rf6052_set_bandwidth(struct ieee80211_hw *hw,
33 u8 bandwidth);
34void rtl8821ae_phy_rf6052_set_cck_txpower(struct ieee80211_hw *hw,
35 u8 *ppowerlevel);
36void rtl8821ae_phy_rf6052_set_ofdm_txpower(struct ieee80211_hw *hw,
37 u8 *ppowerlevel_ofdm,
38 u8 *ppowerlevel_bw20,
39 u8 *ppowerlevel_bw40,
40 u8 channel);
41bool rtl8821ae_phy_rf6052_config(struct ieee80211_hw *hw);
42
43#endif
diff --git a/drivers/net/wireless/rtlwifi/rtl8821ae/sw.c b/drivers/net/wireless/rtlwifi/rtl8821ae/sw.c
new file mode 100644
index 000000000000..fc92dd6a0d07
--- /dev/null
+++ b/drivers/net/wireless/rtlwifi/rtl8821ae/sw.c
@@ -0,0 +1,484 @@
1/******************************************************************************
2 *
3 * Copyright(c) 2009-2010 Realtek Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * The full GNU General Public License is included in this distribution in the
15 * file called LICENSE.
16 *
17 * Contact Information:
18 * wlanfae <wlanfae@realtek.com>
19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20 * Hsinchu 300, Taiwan.
21 *
22 * Larry Finger <Larry.Finger@lwfinger.net>
23 *
24 *****************************************************************************/
25
26#include "../wifi.h"
27#include "../core.h"
28#include "../pci.h"
29#include "reg.h"
30#include "def.h"
31#include "phy.h"
32#include "dm.h"
33#include "hw.h"
34#include "fw.h"
35#include "sw.h"
36#include "trx.h"
37#include "led.h"
38#include "table.h"
39#include "../btcoexist/rtl_btc.h"
40
41#include <linux/vmalloc.h>
42#include <linux/module.h>
43
44static void rtl8821ae_init_aspm_vars(struct ieee80211_hw *hw)
45{
46 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
47
48 /*close ASPM for AMD defaultly */
49 rtlpci->const_amdpci_aspm = 0;
50
51 /**
52 * ASPM PS mode.
53 * 0 - Disable ASPM,
54 * 1 - Enable ASPM without Clock Req,
55 * 2 - Enable ASPM with Clock Req,
56 * 3 - Alwyas Enable ASPM with Clock Req,
57 * 4 - Always Enable ASPM without Clock Req.
58 * set defult to RTL8192CE:3 RTL8192E:2
59 */
60 rtlpci->const_pci_aspm = 3;
61
62 /*Setting for PCI-E device */
63 rtlpci->const_devicepci_aspm_setting = 0x03;
64
65 /*Setting for PCI-E bridge */
66 rtlpci->const_hostpci_aspm_setting = 0x02;
67
68 /**
69 * In Hw/Sw Radio Off situation.
70 * 0 - Default,
71 * 1 - From ASPM setting without low Mac Pwr,
72 * 2 - From ASPM setting with low Mac Pwr,
73 * 3 - Bus D3
74 * set default to RTL8192CE:0 RTL8192SE:2
75 */
76 rtlpci->const_hwsw_rfoff_d3 = 0;
77
78 /**
79 * This setting works for those device with
80 * backdoor ASPM setting such as EPHY setting.
81 * 0 - Not support ASPM,
82 * 1 - Support ASPM,
83 * 2 - According to chipset.
84 */
85 rtlpci->const_support_pciaspm = 1;
86}
87
88static void load_wowlan_fw(struct rtl_priv *rtlpriv)
89{
90 /* callback routine to load wowlan firmware after main fw has
91 * been loaded
92 */
93 const struct firmware *wowlan_firmware;
94 char *fw_name = NULL;
95 int err;
96
97 /* for wowlan firmware buf */
98 rtlpriv->rtlhal.wowlan_firmware = vzalloc(0x8000);
99 if (!rtlpriv->rtlhal.wowlan_firmware) {
100 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
101 "Can't alloc buffer for wowlan fw.\n");
102 return;
103 }
104
105 if (rtlpriv->rtlhal.hw_type == HARDWARE_TYPE_RTL8821AE)
106 fw_name = "rtlwifi/rtl8821aefw_wowlan.bin";
107 else
108 fw_name = "rtlwifi/rtl8812aefw_wowlan.bin";
109 err = request_firmware(&wowlan_firmware, fw_name, rtlpriv->io.dev);
110 if (err) {
111 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
112 "Failed to request wowlan firmware!\n");
113 goto error;
114 }
115
116 if (wowlan_firmware->size > 0x8000) {
117 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
118 "Wowlan Firmware is too big!\n");
119 goto error;
120 }
121
122 memcpy(rtlpriv->rtlhal.wowlan_firmware, wowlan_firmware->data,
123 wowlan_firmware->size);
124 rtlpriv->rtlhal.wowlan_fwsize = wowlan_firmware->size;
125 release_firmware(wowlan_firmware);
126
127 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "WOWLAN FirmwareDownload OK\n");
128 return;
129error:
130 release_firmware(wowlan_firmware);
131 vfree(rtlpriv->rtlhal.wowlan_firmware);
132}
133
134/*InitializeVariables8812E*/
135int rtl8821ae_init_sw_vars(struct ieee80211_hw *hw)
136{
137 int err = 0;
138 struct rtl_priv *rtlpriv = rtl_priv(hw);
139 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
140 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
141 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
142
143 rtl8821ae_bt_reg_init(hw);
144 rtlpci->msi_support = rtlpriv->cfg->mod_params->msi_support;
145 rtlpriv->btcoexist.btc_ops = rtl_btc_get_ops_pointer();
146
147 rtlpriv->dm.dm_initialgain_enable = 1;
148 rtlpriv->dm.dm_flag = 0;
149 rtlpriv->dm.disable_framebursting = 0;
150 rtlpriv->dm.thermalvalue = 0;
151 rtlpci->transmit_config = CFENDFORM | BIT(15) | BIT(24) | BIT(25);
152
153 mac->ht_enable = true;
154 mac->ht_cur_stbc = 0;
155 mac->ht_stbc_cap = 0;
156 mac->vht_cur_ldpc = 0;
157 mac->vht_ldpc_cap = 0;
158 mac->vht_cur_stbc = 0;
159 mac->vht_stbc_cap = 0;
160
161 rtlpriv->rtlhal.current_bandtype = BAND_ON_2_4G;
162 /*following 2 is for register 5G band, refer to _rtl_init_mac80211()*/
163 rtlpriv->rtlhal.bandset = BAND_ON_BOTH;
164 rtlpriv->rtlhal.macphymode = SINGLEMAC_SINGLEPHY;
165
166 rtlpci->receive_config = (RCR_APPFCS |
167 RCR_APP_MIC |
168 RCR_APP_ICV |
169 RCR_APP_PHYST_RXFF |
170 RCR_NONQOS_VHT |
171 RCR_HTC_LOC_CTRL |
172 RCR_AMF |
173 RCR_ACF |
174 /*This bit controls the PS-Poll packet filter.*/
175 RCR_ADF |
176 RCR_AICV |
177 RCR_ACRC32 |
178 RCR_AB |
179 RCR_AM |
180 RCR_APM |
181 0);
182
183 rtlpci->irq_mask[0] =
184 (u32)(IMR_PSTIMEOUT |
185 IMR_GTINT3 |
186 IMR_HSISR_IND_ON_INT |
187 IMR_C2HCMD |
188 IMR_HIGHDOK |
189 IMR_MGNTDOK |
190 IMR_BKDOK |
191 IMR_BEDOK |
192 IMR_VIDOK |
193 IMR_VODOK |
194 IMR_RDU |
195 IMR_ROK |
196 0);
197
198 rtlpci->irq_mask[1] =
199 (u32)(IMR_RXFOVW |
200 IMR_TXFOVW |
201 0);
202 rtlpci->sys_irq_mask = (u32)(HSIMR_PDN_INT_EN |
203 HSIMR_RON_INT_EN |
204 0);
205 /* for WOWLAN */
206 rtlpriv->psc.wo_wlan_mode = WAKE_ON_MAGIC_PACKET |
207 WAKE_ON_PATTERN_MATCH;
208
209 /* for debug level */
210 rtlpriv->dbg.global_debuglevel = rtlpriv->cfg->mod_params->debug;
211 /* for LPS & IPS */
212 rtlpriv->psc.inactiveps = rtlpriv->cfg->mod_params->inactiveps;
213 rtlpriv->psc.swctrl_lps = rtlpriv->cfg->mod_params->swctrl_lps;
214 rtlpriv->psc.fwctrl_lps = rtlpriv->cfg->mod_params->fwctrl_lps;
215 rtlpci->msi_support = rtlpriv->cfg->mod_params->msi_support;
216 if (rtlpriv->cfg->mod_params->disable_watchdog)
217 pr_info("watchdog disabled\n");
218 rtlpriv->psc.reg_fwctrl_lps = 3;
219 rtlpriv->psc.reg_max_lps_awakeintvl = 5;
220 rtlpci->msi_support = rtlpriv->cfg->mod_params->msi_support;
221
222 /* for ASPM, you can close aspm through
223 * set const_support_pciaspm = 0
224 */
225 rtl8821ae_init_aspm_vars(hw);
226
227 if (rtlpriv->psc.reg_fwctrl_lps == 1)
228 rtlpriv->psc.fwctrl_psmode = FW_PS_MIN_MODE;
229 else if (rtlpriv->psc.reg_fwctrl_lps == 2)
230 rtlpriv->psc.fwctrl_psmode = FW_PS_MAX_MODE;
231 else if (rtlpriv->psc.reg_fwctrl_lps == 3)
232 rtlpriv->psc.fwctrl_psmode = FW_PS_DTIM_MODE;
233
234 rtlpriv->rtl_fw_second_cb = load_wowlan_fw;
235 /* for firmware buf */
236 rtlpriv->rtlhal.pfirmware = vzalloc(0x8000);
237 if (!rtlpriv->rtlhal.pfirmware) {
238 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
239 "Can't alloc buffer for fw.\n");
240 return 1;
241 }
242
243 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE)
244 rtlpriv->cfg->fw_name = "rtlwifi/rtl8812aefw.bin";
245 else
246 rtlpriv->cfg->fw_name = "rtlwifi/rtl8821aefw.bin";
247
248 rtlpriv->max_fw_size = 0x8000;
249 pr_info("Using firmware %s\n", rtlpriv->cfg->fw_name);
250 err = request_firmware_nowait(THIS_MODULE, 1, rtlpriv->cfg->fw_name,
251 rtlpriv->io.dev, GFP_KERNEL, hw,
252 rtl_fw_cb);
253 if (err) {
254 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
255 "Failed to request firmware!\n");
256 return 1;
257 }
258 return 0;
259}
260
261void rtl8821ae_deinit_sw_vars(struct ieee80211_hw *hw)
262{
263 struct rtl_priv *rtlpriv = rtl_priv(hw);
264
265 if (rtlpriv->rtlhal.pfirmware) {
266 vfree(rtlpriv->rtlhal.pfirmware);
267 rtlpriv->rtlhal.pfirmware = NULL;
268 }
269#if (USE_SPECIFIC_FW_TO_SUPPORT_WOWLAN == 1)
270 if (rtlpriv->rtlhal.wowlan_firmware) {
271 vfree(rtlpriv->rtlhal.wowlan_firmware);
272 rtlpriv->rtlhal.wowlan_firmware = NULL;
273 }
274#endif
275}
276
277/* get bt coexist status */
278bool rtl8821ae_get_btc_status(void)
279{
280 return true;
281}
282
283static struct rtl_hal_ops rtl8821ae_hal_ops = {
284 .init_sw_vars = rtl8821ae_init_sw_vars,
285 .deinit_sw_vars = rtl8821ae_deinit_sw_vars,
286 .read_eeprom_info = rtl8821ae_read_eeprom_info,
287 .interrupt_recognized = rtl8821ae_interrupt_recognized,
288 .hw_init = rtl8821ae_hw_init,
289 .hw_disable = rtl8821ae_card_disable,
290 .hw_suspend = rtl8821ae_suspend,
291 .hw_resume = rtl8821ae_resume,
292 .enable_interrupt = rtl8821ae_enable_interrupt,
293 .disable_interrupt = rtl8821ae_disable_interrupt,
294 .set_network_type = rtl8821ae_set_network_type,
295 .set_chk_bssid = rtl8821ae_set_check_bssid,
296 .set_qos = rtl8821ae_set_qos,
297 .set_bcn_reg = rtl8821ae_set_beacon_related_registers,
298 .set_bcn_intv = rtl8821ae_set_beacon_interval,
299 .update_interrupt_mask = rtl8821ae_update_interrupt_mask,
300 .get_hw_reg = rtl8821ae_get_hw_reg,
301 .set_hw_reg = rtl8821ae_set_hw_reg,
302 .update_rate_tbl = rtl8821ae_update_hal_rate_tbl,
303 .fill_tx_desc = rtl8821ae_tx_fill_desc,
304 .fill_tx_cmddesc = rtl8821ae_tx_fill_cmddesc,
305 .query_rx_desc = rtl8821ae_rx_query_desc,
306 .set_channel_access = rtl8821ae_update_channel_access_setting,
307 .radio_onoff_checking = rtl8821ae_gpio_radio_on_off_checking,
308 .set_bw_mode = rtl8821ae_phy_set_bw_mode,
309 .switch_channel = rtl8821ae_phy_sw_chnl,
310 .dm_watchdog = rtl8821ae_dm_watchdog,
311 .scan_operation_backup = rtl8821ae_phy_scan_operation_backup,
312 .set_rf_power_state = rtl8821ae_phy_set_rf_power_state,
313 .led_control = rtl8821ae_led_control,
314 .set_desc = rtl8821ae_set_desc,
315 .get_desc = rtl8821ae_get_desc,
316 .is_tx_desc_closed = rtl8821ae_is_tx_desc_closed,
317 .tx_polling = rtl8821ae_tx_polling,
318 .enable_hw_sec = rtl8821ae_enable_hw_security_config,
319 .set_key = rtl8821ae_set_key,
320 .init_sw_leds = rtl8821ae_init_sw_leds,
321 .get_bbreg = rtl8821ae_phy_query_bb_reg,
322 .set_bbreg = rtl8821ae_phy_set_bb_reg,
323 .get_rfreg = rtl8821ae_phy_query_rf_reg,
324 .set_rfreg = rtl8821ae_phy_set_rf_reg,
325 .fill_h2c_cmd = rtl8821ae_fill_h2c_cmd,
326 .get_btc_status = rtl8821ae_get_btc_status,
327 .rx_command_packet = rtl8821ae_rx_command_packet,
328 .add_wowlan_pattern = rtl8821ae_add_wowlan_pattern,
329};
330
331static struct rtl_mod_params rtl8821ae_mod_params = {
332 .sw_crypto = false,
333 .inactiveps = true,
334 .swctrl_lps = false,
335 .fwctrl_lps = true,
336 .msi_support = true,
337 .debug = DBG_EMERG,
338 .disable_watchdog = 0,
339};
340
341static struct rtl_hal_cfg rtl8821ae_hal_cfg = {
342 .bar_id = 2,
343 .write_readback = true,
344 .name = "rtl8821ae_pci",
345 .fw_name = "rtlwifi/rtl8821aefw.bin",
346 .ops = &rtl8821ae_hal_ops,
347 .mod_params = &rtl8821ae_mod_params,
348 .maps[SYS_ISO_CTRL] = REG_SYS_ISO_CTRL,
349 .maps[SYS_FUNC_EN] = REG_SYS_FUNC_EN,
350 .maps[SYS_CLK] = REG_SYS_CLKR,
351 .maps[MAC_RCR_AM] = AM,
352 .maps[MAC_RCR_AB] = AB,
353 .maps[MAC_RCR_ACRC32] = ACRC32,
354 .maps[MAC_RCR_ACF] = ACF,
355 .maps[MAC_RCR_AAP] = AAP,
356 .maps[MAC_HIMR] = REG_HIMR,
357 .maps[MAC_HIMRE] = REG_HIMRE,
358
359 .maps[EFUSE_ACCESS] = REG_EFUSE_ACCESS,
360
361 .maps[EFUSE_TEST] = REG_EFUSE_TEST,
362 .maps[EFUSE_CTRL] = REG_EFUSE_CTRL,
363 .maps[EFUSE_CLK] = 0,
364 .maps[EFUSE_CLK_CTRL] = REG_EFUSE_CTRL,
365 .maps[EFUSE_PWC_EV12V] = PWC_EV12V,
366 .maps[EFUSE_FEN_ELDR] = FEN_ELDR,
367 .maps[EFUSE_LOADER_CLK_EN] = LOADER_CLK_EN,
368 .maps[EFUSE_ANA8M] = ANA8M,
369 .maps[EFUSE_HWSET_MAX_SIZE] = HWSET_MAX_SIZE,
370 .maps[EFUSE_MAX_SECTION_MAP] = EFUSE_MAX_SECTION,
371 .maps[EFUSE_REAL_CONTENT_SIZE] = EFUSE_REAL_CONTENT_LEN,
372 .maps[EFUSE_OOB_PROTECT_BYTES_LEN] = EFUSE_OOB_PROTECT_BYTES,
373
374 .maps[RWCAM] = REG_CAMCMD,
375 .maps[WCAMI] = REG_CAMWRITE,
376 .maps[RCAMO] = REG_CAMREAD,
377 .maps[CAMDBG] = REG_CAMDBG,
378 .maps[SECR] = REG_SECCFG,
379 .maps[SEC_CAM_NONE] = CAM_NONE,
380 .maps[SEC_CAM_WEP40] = CAM_WEP40,
381 .maps[SEC_CAM_TKIP] = CAM_TKIP,
382 .maps[SEC_CAM_AES] = CAM_AES,
383 .maps[SEC_CAM_WEP104] = CAM_WEP104,
384
385 .maps[RTL_IMR_BCNDMAINT6] = IMR_BCNDMAINT6,
386 .maps[RTL_IMR_BCNDMAINT5] = IMR_BCNDMAINT5,
387 .maps[RTL_IMR_BCNDMAINT4] = IMR_BCNDMAINT4,
388 .maps[RTL_IMR_BCNDMAINT3] = IMR_BCNDMAINT3,
389 .maps[RTL_IMR_BCNDMAINT2] = IMR_BCNDMAINT2,
390 .maps[RTL_IMR_BCNDMAINT1] = IMR_BCNDMAINT1,
391/* .maps[RTL_IMR_BCNDOK8] = IMR_BCNDOK8, */ /*need check*/
392 .maps[RTL_IMR_BCNDOK7] = IMR_BCNDOK7,
393 .maps[RTL_IMR_BCNDOK6] = IMR_BCNDOK6,
394 .maps[RTL_IMR_BCNDOK5] = IMR_BCNDOK5,
395 .maps[RTL_IMR_BCNDOK4] = IMR_BCNDOK4,
396 .maps[RTL_IMR_BCNDOK3] = IMR_BCNDOK3,
397 .maps[RTL_IMR_BCNDOK2] = IMR_BCNDOK2,
398 .maps[RTL_IMR_BCNDOK1] = IMR_BCNDOK1,
399/* .maps[RTL_IMR_TIMEOUT2] = IMR_TIMEOUT2,*/
400/* .maps[RTL_IMR_TIMEOUT1] = IMR_TIMEOUT1,*/
401
402 .maps[RTL_IMR_TXFOVW] = IMR_TXFOVW,
403 .maps[RTL_IMR_PSTIMEOUT] = IMR_PSTIMEOUT,
404 .maps[RTL_IMR_BCNINT] = IMR_BCNDMAINT0,
405 .maps[RTL_IMR_RXFOVW] = IMR_RXFOVW,
406 .maps[RTL_IMR_RDU] = IMR_RDU,
407 .maps[RTL_IMR_ATIMEND] = IMR_ATIMEND,
408 .maps[RTL_IMR_BDOK] = IMR_BCNDOK0,
409 .maps[RTL_IMR_MGNTDOK] = IMR_MGNTDOK,
410 .maps[RTL_IMR_TBDER] = IMR_TBDER,
411 .maps[RTL_IMR_HIGHDOK] = IMR_HIGHDOK,
412 .maps[RTL_IMR_TBDOK] = IMR_TBDOK,
413 .maps[RTL_IMR_BKDOK] = IMR_BKDOK,
414 .maps[RTL_IMR_BEDOK] = IMR_BEDOK,
415 .maps[RTL_IMR_VIDOK] = IMR_VIDOK,
416 .maps[RTL_IMR_VODOK] = IMR_VODOK,
417 .maps[RTL_IMR_ROK] = IMR_ROK,
418 .maps[RTL_IBSS_INT_MASKS] = (IMR_BCNDMAINT0 | IMR_TBDOK | IMR_TBDER),
419
420 .maps[RTL_RC_CCK_RATE1M] = DESC_RATE1M,
421 .maps[RTL_RC_CCK_RATE2M] = DESC_RATE2M,
422 .maps[RTL_RC_CCK_RATE5_5M] = DESC_RATE5_5M,
423 .maps[RTL_RC_CCK_RATE11M] = DESC_RATE11M,
424 .maps[RTL_RC_OFDM_RATE6M] = DESC_RATE6M,
425 .maps[RTL_RC_OFDM_RATE9M] = DESC_RATE9M,
426 .maps[RTL_RC_OFDM_RATE12M] = DESC_RATE12M,
427 .maps[RTL_RC_OFDM_RATE18M] = DESC_RATE18M,
428 .maps[RTL_RC_OFDM_RATE24M] = DESC_RATE24M,
429 .maps[RTL_RC_OFDM_RATE36M] = DESC_RATE36M,
430 .maps[RTL_RC_OFDM_RATE48M] = DESC_RATE48M,
431 .maps[RTL_RC_OFDM_RATE54M] = DESC_RATE54M,
432
433 .maps[RTL_RC_HT_RATEMCS7] = DESC_RATEMCS7,
434 .maps[RTL_RC_HT_RATEMCS15] = DESC_RATEMCS15,
435
436 /*VHT hightest rate*/
437 .maps[RTL_RC_VHT_RATE_1SS_MCS7] = DESC_RATEVHT1SS_MCS7,
438 .maps[RTL_RC_VHT_RATE_1SS_MCS8] = DESC_RATEVHT1SS_MCS8,
439 .maps[RTL_RC_VHT_RATE_1SS_MCS9] = DESC_RATEVHT1SS_MCS9,
440 .maps[RTL_RC_VHT_RATE_2SS_MCS7] = DESC_RATEVHT2SS_MCS7,
441 .maps[RTL_RC_VHT_RATE_2SS_MCS8] = DESC_RATEVHT2SS_MCS8,
442 .maps[RTL_RC_VHT_RATE_2SS_MCS9] = DESC_RATEVHT2SS_MCS9,
443};
444
445static struct pci_device_id rtl8821ae_pci_ids[] = {
446 {RTL_PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0x8812, rtl8821ae_hal_cfg)},
447 {RTL_PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0x8821, rtl8821ae_hal_cfg)},
448 {},
449};
450
451MODULE_DEVICE_TABLE(pci, rtl8821ae_pci_ids);
452
453MODULE_AUTHOR("Realtek WlanFAE <wlanfae@realtek.com>");
454MODULE_LICENSE("GPL");
455MODULE_DESCRIPTION("Realtek 8821ae 802.11ac PCI wireless");
456MODULE_FIRMWARE("rtlwifi/rtl8821aefw.bin");
457
458module_param_named(swenc, rtl8821ae_mod_params.sw_crypto, bool, 0444);
459module_param_named(debug, rtl8821ae_mod_params.debug, int, 0444);
460module_param_named(ips, rtl8821ae_mod_params.inactiveps, bool, 0444);
461module_param_named(swlps, rtl8821ae_mod_params.swctrl_lps, bool, 0444);
462module_param_named(fwlps, rtl8821ae_mod_params.fwctrl_lps, bool, 0444);
463module_param_named(msi, rtl8821ae_mod_params.msi_support, bool, 0444);
464module_param_named(disable_watchdog, rtl8821ae_mod_params.disable_watchdog,
465 bool, 0444);
466MODULE_PARM_DESC(swenc, "Set to 1 for software crypto (default 0)\n");
467MODULE_PARM_DESC(ips, "Set to 0 to not use link power save (default 1)\n");
468MODULE_PARM_DESC(swlps, "Set to 1 to use SW control power save (default 0)\n");
469MODULE_PARM_DESC(fwlps, "Set to 1 to use FW control power save (default 1)\n");
470MODULE_PARM_DESC(msi, "Set to 1 to use MSI interrupts mode (default 1)\n");
471MODULE_PARM_DESC(debug, "Set debug level (0-5) (default 0)");
472MODULE_PARM_DESC(disable_watchdog, "Set to 1 to disable the watchdog (default 0)\n");
473
474static SIMPLE_DEV_PM_OPS(rtlwifi_pm_ops, rtl_pci_suspend, rtl_pci_resume);
475
476static struct pci_driver rtl8821ae_driver = {
477 .name = KBUILD_MODNAME,
478 .id_table = rtl8821ae_pci_ids,
479 .probe = rtl_pci_probe,
480 .remove = rtl_pci_disconnect,
481 .driver.pm = &rtlwifi_pm_ops,
482};
483
484module_pci_driver(rtl8821ae_driver);
diff --git a/drivers/net/wireless/rtlwifi/rtl8821ae/sw.h b/drivers/net/wireless/rtlwifi/rtl8821ae/sw.h
new file mode 100644
index 000000000000..d001e7ce3052
--- /dev/null
+++ b/drivers/net/wireless/rtlwifi/rtl8821ae/sw.h
@@ -0,0 +1,34 @@
1/******************************************************************************
2 *
3 * Copyright(c) 2009-2010 Realtek Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * The full GNU General Public License is included in this distribution in the
15 * file called LICENSE.
16 *
17 * Contact Information:
18 * wlanfae <wlanfae@realtek.com>
19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20 * Hsinchu 300, Taiwan.
21 *
22 * Larry Finger <Larry.Finger@lwfinger.net>
23 *
24 *****************************************************************************/
25
26#ifndef __RTL8821AE_SW_H__
27#define __RTL8821AE_SW_H__
28
29int rtl8821ae_init_sw_vars(struct ieee80211_hw *hw);
30void rtl8821ae_deinit_sw_vars(struct ieee80211_hw *hw);
31void rtl8821ae_init_var_map(struct ieee80211_hw *hw);
32bool rtl8821ae_get_btc_status(void);
33
34#endif
diff --git a/drivers/net/wireless/rtlwifi/rtl8821ae/table.c b/drivers/net/wireless/rtlwifi/rtl8821ae/table.c
new file mode 100644
index 000000000000..62a0fb76f080
--- /dev/null
+++ b/drivers/net/wireless/rtlwifi/rtl8821ae/table.c
@@ -0,0 +1,4572 @@
1/******************************************************************************
2 *
3 * Copyright(c) 2009-2010 Realtek Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * The full GNU General Public License is included in this distribution in the
15 * file called LICENSE.
16 *
17 * Contact Information:
18 * wlanfae <wlanfae@realtek.com>
19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20 * Hsinchu 300, Taiwan.
21 *
22 * Created on 2010/ 5/18, 1:41
23 *
24 * Larry Finger <Larry.Finger@lwfinger.net>
25 *
26 *****************************************************************************/
27
28#include "table.h"
29u32 RTL8812AE_PHY_REG_ARRAY[] = {
30 0x800, 0x8020D010,
31 0x804, 0x080112E0,
32 0x808, 0x0E028233,
33 0x80C, 0x12131113,
34 0x810, 0x20101263,
35 0x814, 0x020C3D10,
36 0x818, 0x03A00385,
37 0x820, 0x00000000,
38 0x824, 0x00030FE0,
39 0x828, 0x00000000,
40 0x82C, 0x002083DD,
41 0x830, 0x2AAA6C86,
42 0x834, 0x0037A706,
43 0x838, 0x06C89B44,
44 0x83C, 0x0000095B,
45 0x840, 0xC0000001,
46 0x844, 0x40003CDE,
47 0x848, 0x6210FF8B,
48 0x84C, 0x6CFDFFB8,
49 0x850, 0x28874706,
50 0x854, 0x0001520C,
51 0x858, 0x8060E000,
52 0x85C, 0x74210168,
53 0x860, 0x6929C321,
54 0x864, 0x79727432,
55 0x868, 0x8CA7A314,
56 0x86C, 0x338C2878,
57 0x870, 0x03333333,
58 0x874, 0x31602C2E,
59 0x878, 0x00003152,
60 0x87C, 0x000FC000,
61 0x8A0, 0x00000013,
62 0x8A4, 0x7F7F7F7F,
63 0x8A8, 0xA202033E,
64 0x8AC, 0x0FF0FA0A,
65 0x8B0, 0x00000600,
66 0x8B4, 0x000FC080,
67 0x8B8, 0x6C0057FF,
68 0x8BC, 0x4CA520A3,
69 0x8C0, 0x27F00020,
70 0x8C4, 0x00000000,
71 0x8C8, 0x00013169,
72 0x8CC, 0x08248492,
73 0x8D0, 0x0000B800,
74 0x8DC, 0x00000000,
75 0x8D4, 0x940008A0,
76 0x8D8, 0x290B5612,
77 0x8F8, 0x400002C0,
78 0x8FC, 0x00000000,
79 0xFF0F07D8, 0xABCD,
80 0x900, 0x00000701,
81 0xFF0F07D0, 0xCDEF,
82 0x900, 0x00000701,
83 0xCDCDCDCD, 0xCDCD,
84 0x900, 0x00000700,
85 0xFF0F07D8, 0xDEAD,
86 0x90C, 0x00000000,
87 0x910, 0x0000FC00,
88 0x914, 0x00000404,
89 0x918, 0x1C1028C0,
90 0x91C, 0x64B11A1C,
91 0x920, 0xE0767233,
92 0x924, 0x055AA500,
93 0x928, 0x00000004,
94 0x92C, 0xFFFE0000,
95 0x930, 0xFFFFFFFE,
96 0x934, 0x001FFFFF,
97 0x960, 0x00000000,
98 0x964, 0x00000000,
99 0x968, 0x00000000,
100 0x96C, 0x00000000,
101 0x970, 0x801FFFFF,
102 0x978, 0x00000000,
103 0x97C, 0x00000000,
104 0x980, 0x00000000,
105 0x984, 0x00000000,
106 0x988, 0x00000000,
107 0x990, 0x27100000,
108 0x994, 0xFFFF0100,
109 0x998, 0xFFFFFF5C,
110 0x99C, 0xFFFFFFFF,
111 0x9A0, 0x000000FF,
112 0x9A4, 0x00080080,
113 0x9A8, 0x00000000,
114 0x9AC, 0x00000000,
115 0x9B0, 0x81081008,
116 0x9B4, 0x00000000,
117 0x9B8, 0x01081008,
118 0x9BC, 0x01081008,
119 0x9D0, 0x00000000,
120 0x9D4, 0x00000000,
121 0x9D8, 0x00000000,
122 0x9DC, 0x00000000,
123 0x9E4, 0x00000002,
124 0x9E8, 0x000002D5,
125 0xA00, 0x00D047C8,
126 0xA04, 0x01FF000C,
127 0xA08, 0x8C838300,
128 0xA0C, 0x2E7F000F,
129 0xA10, 0x9500BB78,
130 0xA14, 0x11144028,
131 0xA18, 0x00881117,
132 0xA1C, 0x89140F00,
133 0xA20, 0x1A1B0000,
134 0xA24, 0x090E1317,
135 0xA28, 0x00000204,
136 0xA2C, 0x00900000,
137 0xA70, 0x101FFF00,
138 0xA74, 0x00000008,
139 0xA78, 0x00000900,
140 0xA7C, 0x225B0606,
141 0xA80, 0x218075B2,
142 0xA84, 0x001F8C80,
143 0xB00, 0x03100000,
144 0xB04, 0x0000B000,
145 0xB08, 0xAE0201EB,
146 0xB0C, 0x01003207,
147 0xB10, 0x00009807,
148 0xB14, 0x01000000,
149 0xB18, 0x00000002,
150 0xB1C, 0x00000002,
151 0xB20, 0x0000001F,
152 0xB24, 0x03020100,
153 0xB28, 0x07060504,
154 0xB2C, 0x0B0A0908,
155 0xB30, 0x0F0E0D0C,
156 0xB34, 0x13121110,
157 0xB38, 0x17161514,
158 0xB3C, 0x0000003A,
159 0xB40, 0x00000000,
160 0xB44, 0x00000000,
161 0xB48, 0x13000032,
162 0xB4C, 0x48080000,
163 0xB50, 0x00000000,
164 0xB54, 0x00000000,
165 0xB58, 0x00000000,
166 0xB5C, 0x00000000,
167 0xC00, 0x00000007,
168 0xC04, 0x00042020,
169 0xC08, 0x80410231,
170 0xC0C, 0x00000000,
171 0xC10, 0x00000100,
172 0xC14, 0x01000000,
173 0xC1C, 0x40000003,
174 0xC20, 0x12121212,
175 0xC24, 0x12121212,
176 0xC28, 0x12121212,
177 0xC2C, 0x12121212,
178 0xC30, 0x12121212,
179 0xC34, 0x12121212,
180 0xC38, 0x12121212,
181 0xC3C, 0x12121212,
182 0xC40, 0x12121212,
183 0xC44, 0x12121212,
184 0xC48, 0x12121212,
185 0xC4C, 0x12121212,
186 0xC50, 0x00000020,
187 0xC54, 0x0008121C,
188 0xC58, 0x30000C1C,
189 0xC5C, 0x00000058,
190 0xC60, 0x34344443,
191 0xC64, 0x07003333,
192 0xC68, 0x59791979,
193 0xC6C, 0x59795979,
194 0xC70, 0x19795979,
195 0xC74, 0x19795979,
196 0xC78, 0x19791979,
197 0xC7C, 0x19791979,
198 0xC80, 0x19791979,
199 0xC84, 0x19791979,
200 0xC94, 0x0100005C,
201 0xC98, 0x00000000,
202 0xC9C, 0x00000000,
203 0xCA0, 0x00000029,
204 0xCA4, 0x08040201,
205 0xCA8, 0x80402010,
206 0xFF0F0740, 0xABCD,
207 0xCB0, 0x77547717,
208 0xFF0F01C0, 0xCDEF,
209 0xCB0, 0x77547717,
210 0xFF0F02C0, 0xCDEF,
211 0xCB0, 0x77547717,
212 0xFF0F07D8, 0xCDEF,
213 0xCB0, 0x54547710,
214 0xFF0F07D0, 0xCDEF,
215 0xCB0, 0x54547710,
216 0xCDCDCDCD, 0xCDCD,
217 0xCB0, 0x77547777,
218 0xFF0F0740, 0xDEAD,
219 0xCB4, 0x00000077,
220 0xCB8, 0x00508242,
221 0xE00, 0x00000007,
222 0xE04, 0x00042020,
223 0xE08, 0x80410231,
224 0xE0C, 0x00000000,
225 0xE10, 0x00000100,
226 0xE14, 0x01000000,
227 0xE1C, 0x40000003,
228 0xE20, 0x12121212,
229 0xE24, 0x12121212,
230 0xE28, 0x12121212,
231 0xE2C, 0x12121212,
232 0xE30, 0x12121212,
233 0xE34, 0x12121212,
234 0xE38, 0x12121212,
235 0xE3C, 0x12121212,
236 0xE40, 0x12121212,
237 0xE44, 0x12121212,
238 0xE48, 0x12121212,
239 0xE4C, 0x12121212,
240 0xE50, 0x00000020,
241 0xE54, 0x0008121C,
242 0xE58, 0x30000C1C,
243 0xE5C, 0x00000058,
244 0xE60, 0x34344443,
245 0xE64, 0x07003333,
246 0xE68, 0x59791979,
247 0xE6C, 0x59795979,
248 0xE70, 0x19795979,
249 0xE74, 0x19795979,
250 0xE78, 0x19791979,
251 0xE7C, 0x19791979,
252 0xE80, 0x19791979,
253 0xE84, 0x19791979,
254 0xE94, 0x0100005C,
255 0xE98, 0x00000000,
256 0xE9C, 0x00000000,
257 0xEA0, 0x00000029,
258 0xEA4, 0x08040201,
259 0xEA8, 0x80402010,
260 0xFF0F0740, 0xABCD,
261 0xEB0, 0x77547717,
262 0xFF0F01C0, 0xCDEF,
263 0xEB0, 0x77547717,
264 0xFF0F02C0, 0xCDEF,
265 0xEB0, 0x77547717,
266 0xFF0F07D8, 0xCDEF,
267 0xEB0, 0x54547710,
268 0xFF0F07D0, 0xCDEF,
269 0xEB0, 0x54547710,
270 0xCDCDCDCD, 0xCDCD,
271 0xEB0, 0x77547777,
272 0xFF0F0740, 0xDEAD,
273 0xEB4, 0x00000077,
274 0xEB8, 0x00508242,
275};
276
277u32 RTL8821AE_PHY_REG_ARRAY[] = {
278 0x800, 0x0020D090,
279 0x804, 0x080112E0,
280 0x808, 0x0E028211,
281 0x80C, 0x92131111,
282 0x810, 0x20101261,
283 0x814, 0x020C3D10,
284 0x818, 0x03A00385,
285 0x820, 0x00000000,
286 0x824, 0x00030FE0,
287 0x828, 0x00000000,
288 0x82C, 0x002081DD,
289 0x830, 0x2AAA8E24,
290 0x834, 0x0037A706,
291 0x838, 0x06489B44,
292 0x83C, 0x0000095B,
293 0x840, 0xC0000001,
294 0x844, 0x40003CDE,
295 0x848, 0x62103F8B,
296 0x84C, 0x6CFDFFB8,
297 0x850, 0x28874706,
298 0x854, 0x0001520C,
299 0x858, 0x8060E000,
300 0x85C, 0x74210168,
301 0x860, 0x6929C321,
302 0x864, 0x79727432,
303 0x868, 0x8CA7A314,
304 0x86C, 0x888C2878,
305 0x870, 0x08888888,
306 0x874, 0x31612C2E,
307 0x878, 0x00000152,
308 0x87C, 0x000FD000,
309 0x8A0, 0x00000013,
310 0x8A4, 0x7F7F7F7F,
311 0x8A8, 0xA2000338,
312 0x8AC, 0x0FF0FA0A,
313 0x8B4, 0x000FC080,
314 0x8B8, 0x6C10D7FF,
315 0x8BC, 0x0CA52090,
316 0x8C0, 0x1BF00020,
317 0x8C4, 0x00000000,
318 0x8C8, 0x00013169,
319 0x8CC, 0x08248492,
320 0x8D4, 0x940008A0,
321 0x8D8, 0x290B5612,
322 0x8F8, 0x400002C0,
323 0x8FC, 0x00000000,
324 0x900, 0x00000700,
325 0x90C, 0x00000000,
326 0x910, 0x0000FC00,
327 0x914, 0x00000404,
328 0x918, 0x1C1028C0,
329 0x91C, 0x64B11A1C,
330 0x920, 0xE0767233,
331 0x924, 0x055AA500,
332 0x928, 0x00000004,
333 0x92C, 0xFFFE0000,
334 0x930, 0xFFFFFFFE,
335 0x934, 0x001FFFFF,
336 0x960, 0x00000000,
337 0x964, 0x00000000,
338 0x968, 0x00000000,
339 0x96C, 0x00000000,
340 0x970, 0x801FFFFF,
341 0x974, 0x000003FF,
342 0x978, 0x00000000,
343 0x97C, 0x00000000,
344 0x980, 0x00000000,
345 0x984, 0x00000000,
346 0x988, 0x00000000,
347 0x990, 0x27100000,
348 0x994, 0xFFFF0100,
349 0x998, 0xFFFFFF5C,
350 0x99C, 0xFFFFFFFF,
351 0x9A0, 0x000000FF,
352 0x9A4, 0x00480080,
353 0x9A8, 0x00000000,
354 0x9AC, 0x00000000,
355 0x9B0, 0x81081008,
356 0x9B4, 0x01081008,
357 0x9B8, 0x01081008,
358 0x9BC, 0x01081008,
359 0x9D0, 0x00000000,
360 0x9D4, 0x00000000,
361 0x9D8, 0x00000000,
362 0x9DC, 0x00000000,
363 0x9E0, 0x00005D00,
364 0x9E4, 0x00000002,
365 0x9E8, 0x00000001,
366 0xA00, 0x00D047C8,
367 0xA04, 0x01FF000C,
368 0xA08, 0x8C8A8300,
369 0xA0C, 0x2E68000F,
370 0xA10, 0x9500BB78,
371 0xA14, 0x11144028,
372 0xA18, 0x00881117,
373 0xA1C, 0x89140F00,
374 0xA20, 0x1A1B0000,
375 0xA24, 0x090E1317,
376 0xA28, 0x00000204,
377 0xA2C, 0x00900000,
378 0xA70, 0x101FFF00,
379 0xA74, 0x00000008,
380 0xA78, 0x00000900,
381 0xA7C, 0x225B0606,
382 0xA80, 0x21805490,
383 0xA84, 0x001F0000,
384 0xB00, 0x03100040,
385 0xB04, 0x0000B000,
386 0xB08, 0xAE0201EB,
387 0xB0C, 0x01003207,
388 0xB10, 0x00009807,
389 0xB14, 0x01000000,
390 0xB18, 0x00000002,
391 0xB1C, 0x00000002,
392 0xB20, 0x0000001F,
393 0xB24, 0x03020100,
394 0xB28, 0x07060504,
395 0xB2C, 0x0B0A0908,
396 0xB30, 0x0F0E0D0C,
397 0xB34, 0x13121110,
398 0xB38, 0x17161514,
399 0xB3C, 0x0000003A,
400 0xB40, 0x00000000,
401 0xB44, 0x00000000,
402 0xB48, 0x13000032,
403 0xB4C, 0x48080000,
404 0xB50, 0x00000000,
405 0xB54, 0x00000000,
406 0xB58, 0x00000000,
407 0xB5C, 0x00000000,
408 0xC00, 0x00000007,
409 0xC04, 0x00042020,
410 0xC08, 0x80410231,
411 0xC0C, 0x00000000,
412 0xC10, 0x00000100,
413 0xC14, 0x01000000,
414 0xC1C, 0x40000003,
415 0xC20, 0x2C2C2C2C,
416 0xC24, 0x30303030,
417 0xC28, 0x30303030,
418 0xC2C, 0x2C2C2C2C,
419 0xC30, 0x2C2C2C2C,
420 0xC34, 0x2C2C2C2C,
421 0xC38, 0x2C2C2C2C,
422 0xC3C, 0x2A2A2A2A,
423 0xC40, 0x2A2A2A2A,
424 0xC44, 0x2A2A2A2A,
425 0xC48, 0x2A2A2A2A,
426 0xC4C, 0x2A2A2A2A,
427 0xC50, 0x00000020,
428 0xC54, 0x001C1208,
429 0xC58, 0x30000C1C,
430 0xC5C, 0x00000058,
431 0xC60, 0x34344443,
432 0xC64, 0x07003333,
433 0xC68, 0x19791979,
434 0xC6C, 0x19791979,
435 0xC70, 0x19791979,
436 0xC74, 0x19791979,
437 0xC78, 0x19791979,
438 0xC7C, 0x19791979,
439 0xC80, 0x19791979,
440 0xC84, 0x19791979,
441 0xC94, 0x0100005C,
442 0xC98, 0x00000000,
443 0xC9C, 0x00000000,
444 0xCA0, 0x00000029,
445 0xCA4, 0x08040201,
446 0xCA8, 0x80402010,
447 0xCB0, 0x77775747,
448 0xCB4, 0x10000077,
449 0xCB8, 0x00508240,
450};
451
452u32 RTL8812AE_PHY_REG_ARRAY_PG[] = {
453 0, 0, 0, 0x00000c20, 0xffffffff, 0x34363840,
454 0, 0, 0, 0x00000c24, 0xffffffff, 0x42424444,
455 0, 0, 0, 0x00000c28, 0xffffffff, 0x30323638,
456 0, 0, 0, 0x00000c2c, 0xffffffff, 0x40424444,
457 0, 0, 0, 0x00000c30, 0xffffffff, 0x28303236,
458 0, 0, 1, 0x00000c34, 0xffffffff, 0x38404242,
459 0, 0, 1, 0x00000c38, 0xffffffff, 0x26283034,
460 0, 0, 0, 0x00000c3c, 0xffffffff, 0x40424444,
461 0, 0, 0, 0x00000c40, 0xffffffff, 0x28303236,
462 0, 0, 0, 0x00000c44, 0xffffffff, 0x42422426,
463 0, 0, 1, 0x00000c48, 0xffffffff, 0x30343840,
464 0, 0, 1, 0x00000c4c, 0xffffffff, 0x22242628,
465 0, 1, 0, 0x00000e20, 0xffffffff, 0x34363840,
466 0, 1, 0, 0x00000e24, 0xffffffff, 0x42424444,
467 0, 1, 0, 0x00000e28, 0xffffffff, 0x30323638,
468 0, 1, 0, 0x00000e2c, 0xffffffff, 0x40424444,
469 0, 1, 0, 0x00000e30, 0xffffffff, 0x28303236,
470 0, 1, 1, 0x00000e34, 0xffffffff, 0x38404242,
471 0, 1, 1, 0x00000e38, 0xffffffff, 0x26283034,
472 0, 1, 0, 0x00000e3c, 0xffffffff, 0x40424444,
473 0, 1, 0, 0x00000e40, 0xffffffff, 0x28303236,
474 0, 1, 0, 0x00000e44, 0xffffffff, 0x42422426,
475 0, 1, 1, 0x00000e48, 0xffffffff, 0x30343840,
476 0, 1, 1, 0x00000e4c, 0xffffffff, 0x22242628,
477 1, 0, 0, 0x00000c24, 0xffffffff, 0x42424444,
478 1, 0, 0, 0x00000c28, 0xffffffff, 0x30323640,
479 1, 0, 0, 0x00000c2c, 0xffffffff, 0x40424444,
480 1, 0, 0, 0x00000c30, 0xffffffff, 0x28303236,
481 1, 0, 1, 0x00000c34, 0xffffffff, 0x38404242,
482 1, 0, 1, 0x00000c38, 0xffffffff, 0x26283034,
483 1, 0, 0, 0x00000c3c, 0xffffffff, 0x40424444,
484 1, 0, 0, 0x00000c40, 0xffffffff, 0x28303236,
485 1, 0, 0, 0x00000c44, 0xffffffff, 0x42422426,
486 1, 0, 1, 0x00000c48, 0xffffffff, 0x30343840,
487 1, 0, 1, 0x00000c4c, 0xffffffff, 0x22242628,
488 1, 1, 0, 0x00000e24, 0xffffffff, 0x42424444,
489 1, 1, 0, 0x00000e28, 0xffffffff, 0x30323640,
490 1, 1, 0, 0x00000e2c, 0xffffffff, 0x40424444,
491 1, 1, 0, 0x00000e30, 0xffffffff, 0x28303236,
492 1, 1, 1, 0x00000e34, 0xffffffff, 0x38404242,
493 1, 1, 1, 0x00000e38, 0xffffffff, 0x26283034,
494 1, 1, 0, 0x00000e3c, 0xffffffff, 0x40424444,
495 1, 1, 0, 0x00000e40, 0xffffffff, 0x28303236,
496 1, 1, 0, 0x00000e44, 0xffffffff, 0x42422426,
497 1, 1, 1, 0x00000e48, 0xffffffff, 0x30343840,
498 1, 1, 1, 0x00000e4c, 0xffffffff, 0x22242628
499};
500
501u32 RTL8821AE_PHY_REG_ARRAY_PG[] = {
502 0, 0, 0, 0x00000c20, 0xffffffff, 0x32343638,
503 0, 0, 0, 0x00000c24, 0xffffffff, 0x36363838,
504 0, 0, 0, 0x00000c28, 0xffffffff, 0x28303234,
505 0, 0, 0, 0x00000c2c, 0xffffffff, 0x34363838,
506 0, 0, 0, 0x00000c30, 0xffffffff, 0x26283032,
507 0, 0, 0, 0x00000c3c, 0xffffffff, 0x32343636,
508 0, 0, 0, 0x00000c40, 0xffffffff, 0x24262830,
509 0, 0, 0, 0x00000c44, 0x0000ffff, 0x00002022,
510 1, 0, 0, 0x00000c24, 0xffffffff, 0x34343636,
511 1, 0, 0, 0x00000c28, 0xffffffff, 0x26283032,
512 1, 0, 0, 0x00000c2c, 0xffffffff, 0x32343636,
513 1, 0, 0, 0x00000c30, 0xffffffff, 0x24262830,
514 1, 0, 0, 0x00000c3c, 0xffffffff, 0x32343636,
515 1, 0, 0, 0x00000c40, 0xffffffff, 0x24262830,
516 1, 0, 0, 0x00000c44, 0x0000ffff, 0x00002022
517};
518
519u32 RTL8812AE_RADIOA_ARRAY[] = {
520 0x000, 0x00010000,
521 0x018, 0x0001712A,
522 0x056, 0x00051CF2,
523 0x066, 0x00040000,
524 0x01E, 0x00080000,
525 0x089, 0x00000080,
526 0xFF0F0740, 0xABCD,
527 0x086, 0x00014B38,
528 0xFF0F02C0, 0xCDEF,
529 0x086, 0x00014B38,
530 0xFF0F01C0, 0xCDEF,
531 0x086, 0x00014B38,
532 0xFF0F07D8, 0xCDEF,
533 0x086, 0x00014B3A,
534 0xFF0F07D0, 0xCDEF,
535 0x086, 0x00014B3A,
536 0xCDCDCDCD, 0xCDCD,
537 0x086, 0x00014B38,
538 0xFF0F0740, 0xDEAD,
539 0x0B1, 0x0001FC1A,
540 0x0B3, 0x000F0810,
541 0x0B4, 0x0001A78D,
542 0x0BA, 0x00086180,
543 0x018, 0x00000006,
544 0x0EF, 0x00002000,
545 0xFF0F07D8, 0xABCD,
546 0x03B, 0x0003F218,
547 0x03B, 0x00030A58,
548 0x03B, 0x0002FA58,
549 0x03B, 0x00022590,
550 0x03B, 0x0001FA50,
551 0x03B, 0x00010248,
552 0x03B, 0x00008240,
553 0xFF0F07D0, 0xCDEF,
554 0x03B, 0x0003F218,
555 0x03B, 0x00030A58,
556 0x03B, 0x0002FA58,
557 0x03B, 0x00022590,
558 0x03B, 0x0001FA50,
559 0x03B, 0x00010248,
560 0x03B, 0x00008240,
561 0xCDCDCDCD, 0xCDCD,
562 0x03B, 0x00038A58,
563 0x03B, 0x00037A58,
564 0x03B, 0x0002A590,
565 0x03B, 0x00027A50,
566 0x03B, 0x00018248,
567 0x03B, 0x00010240,
568 0x03B, 0x00008240,
569 0xFF0F07D8, 0xDEAD,
570 0x0EF, 0x00000100,
571 0xFF0F07D8, 0xABCD,
572 0x034, 0x0000A4EE,
573 0x034, 0x00009076,
574 0x034, 0x00008073,
575 0x034, 0x00007070,
576 0x034, 0x0000606D,
577 0x034, 0x0000506A,
578 0x034, 0x00004049,
579 0x034, 0x00003046,
580 0x034, 0x00002028,
581 0x034, 0x00001025,
582 0x034, 0x00000022,
583 0xCDCDCDCD, 0xCDCD,
584 0x034, 0x0000ADF4,
585 0x034, 0x00009DF1,
586 0x034, 0x00008DEE,
587 0x034, 0x00007DEB,
588 0x034, 0x00006DE8,
589 0x034, 0x00005CEC,
590 0x034, 0x00004CE9,
591 0x034, 0x000034EA,
592 0x034, 0x000024E7,
593 0x034, 0x0000146B,
594 0x034, 0x0000006D,
595 0xFF0F07D8, 0xDEAD,
596 0x0EF, 0x00000000,
597 0x0EF, 0x000020A2,
598 0x0DF, 0x00000080,
599 0x035, 0x00000192,
600 0x035, 0x00008192,
601 0x035, 0x00010192,
602 0x036, 0x00000024,
603 0x036, 0x00008024,
604 0x036, 0x00010024,
605 0x036, 0x00018024,
606 0x0EF, 0x00000000,
607 0x051, 0x00000C21,
608 0x052, 0x000006D9,
609 0x053, 0x000FC649,
610 0x054, 0x0000017E,
611 0x0EF, 0x00000002,
612 0x008, 0x00008400,
613 0x018, 0x0001712A,
614 0x0EF, 0x00001000,
615 0x03A, 0x00000080,
616 0x03B, 0x0003A02C,
617 0x03C, 0x00004000,
618 0x03A, 0x00000400,
619 0x03B, 0x0003202C,
620 0x03C, 0x00010000,
621 0x03A, 0x000000A0,
622 0x03B, 0x0002B064,
623 0x03C, 0x00004000,
624 0x03A, 0x000000D8,
625 0x03B, 0x00023070,
626 0x03C, 0x00004000,
627 0x03A, 0x00000468,
628 0x03B, 0x0001B870,
629 0x03C, 0x00010000,
630 0x03A, 0x00000098,
631 0x03B, 0x00012085,
632 0x03C, 0x000E4000,
633 0x03A, 0x00000418,
634 0x03B, 0x0000A080,
635 0x03C, 0x000F0000,
636 0x03A, 0x00000418,
637 0x03B, 0x00002080,
638 0x03C, 0x00010000,
639 0x03A, 0x00000080,
640 0x03B, 0x0007A02C,
641 0x03C, 0x00004000,
642 0x03A, 0x00000400,
643 0x03B, 0x0007202C,
644 0x03C, 0x00010000,
645 0x03A, 0x000000A0,
646 0x03B, 0x0006B064,
647 0x03C, 0x00004000,
648 0x03A, 0x000000D8,
649 0x03B, 0x00023070,
650 0x03C, 0x00004000,
651 0x03A, 0x00000468,
652 0x03B, 0x0005B870,
653 0x03C, 0x00010000,
654 0x03A, 0x00000098,
655 0x03B, 0x00052085,
656 0x03C, 0x000E4000,
657 0x03A, 0x00000418,
658 0x03B, 0x0004A080,
659 0x03C, 0x000F0000,
660 0x03A, 0x00000418,
661 0x03B, 0x00042080,
662 0x03C, 0x00010000,
663 0x03A, 0x00000080,
664 0x03B, 0x000BA02C,
665 0x03C, 0x00004000,
666 0x03A, 0x00000400,
667 0x03B, 0x000B202C,
668 0x03C, 0x00010000,
669 0x03A, 0x000000A0,
670 0x03B, 0x000AB064,
671 0x03C, 0x00004000,
672 0x03A, 0x000000D8,
673 0x03B, 0x000A3070,
674 0x03C, 0x00004000,
675 0x03A, 0x00000468,
676 0x03B, 0x0009B870,
677 0x03C, 0x00010000,
678 0x03A, 0x00000098,
679 0x03B, 0x00092085,
680 0x03C, 0x000E4000,
681 0x03A, 0x00000418,
682 0x03B, 0x0008A080,
683 0x03C, 0x000F0000,
684 0x03A, 0x00000418,
685 0x03B, 0x00082080,
686 0x03C, 0x00010000,
687 0x0EF, 0x00001100,
688 0xFF0F0740, 0xABCD,
689 0x034, 0x0004A0B2,
690 0x034, 0x000490AF,
691 0x034, 0x00048070,
692 0x034, 0x0004706D,
693 0x034, 0x00046050,
694 0x034, 0x0004504D,
695 0x034, 0x0004404A,
696 0x034, 0x00043047,
697 0x034, 0x0004200A,
698 0x034, 0x00041007,
699 0x034, 0x00040004,
700 0xFF0F02C0, 0xCDEF,
701 0x034, 0x0004A0B2,
702 0x034, 0x000490AF,
703 0x034, 0x00048070,
704 0x034, 0x0004706D,
705 0x034, 0x00046050,
706 0x034, 0x0004504D,
707 0x034, 0x0004404A,
708 0x034, 0x00043047,
709 0x034, 0x0004200A,
710 0x034, 0x00041007,
711 0x034, 0x00040004,
712 0xFF0F01C0, 0xCDEF,
713 0x034, 0x0004A0B2,
714 0x034, 0x000490AF,
715 0x034, 0x00048070,
716 0x034, 0x0004706D,
717 0x034, 0x00046050,
718 0x034, 0x0004504D,
719 0x034, 0x0004404A,
720 0x034, 0x00043047,
721 0x034, 0x0004200A,
722 0x034, 0x00041007,
723 0x034, 0x00040004,
724 0xFF0F07D8, 0xCDEF,
725 0x034, 0x0004A0B2,
726 0x034, 0x000490AF,
727 0x034, 0x00048070,
728 0x034, 0x0004706D,
729 0x034, 0x00046050,
730 0x034, 0x0004504D,
731 0x034, 0x0004404A,
732 0x034, 0x00043047,
733 0x034, 0x0004200A,
734 0x034, 0x00041007,
735 0x034, 0x00040004,
736 0xFF0F07D0, 0xCDEF,
737 0x034, 0x0004A0B2,
738 0x034, 0x000490AF,
739 0x034, 0x00048070,
740 0x034, 0x0004706D,
741 0x034, 0x00046050,
742 0x034, 0x0004504D,
743 0x034, 0x0004404A,
744 0x034, 0x00043047,
745 0x034, 0x0004200A,
746 0x034, 0x00041007,
747 0x034, 0x00040004,
748 0xCDCDCDCD, 0xCDCD,
749 0x034, 0x0004ADF5,
750 0x034, 0x00049DF2,
751 0x034, 0x00048DEF,
752 0x034, 0x00047DEC,
753 0x034, 0x00046DE9,
754 0x034, 0x00045DC9,
755 0x034, 0x00044CE8,
756 0x034, 0x000438CA,
757 0x034, 0x00042889,
758 0x034, 0x0004184A,
759 0x034, 0x0004044A,
760 0xFF0F0740, 0xDEAD,
761 0xFF0F0740, 0xABCD,
762 0x034, 0x0002A0B2,
763 0x034, 0x000290AF,
764 0x034, 0x00028070,
765 0x034, 0x0002706D,
766 0x034, 0x00026050,
767 0x034, 0x0002504D,
768 0x034, 0x0002404A,
769 0x034, 0x00023047,
770 0x034, 0x0002200A,
771 0x034, 0x00021007,
772 0x034, 0x00020004,
773 0xFF0F02C0, 0xCDEF,
774 0x034, 0x0002A0B2,
775 0x034, 0x000290AF,
776 0x034, 0x00028070,
777 0x034, 0x0002706D,
778 0x034, 0x00026050,
779 0x034, 0x0002504D,
780 0x034, 0x0002404A,
781 0x034, 0x00023047,
782 0x034, 0x0002200A,
783 0x034, 0x00021007,
784 0x034, 0x00020004,
785 0xFF0F01C0, 0xCDEF,
786 0x034, 0x0002A0B2,
787 0x034, 0x000290AF,
788 0x034, 0x00028070,
789 0x034, 0x0002706D,
790 0x034, 0x00026050,
791 0x034, 0x0002504D,
792 0x034, 0x0002404A,
793 0x034, 0x00023047,
794 0x034, 0x0002200A,
795 0x034, 0x00021007,
796 0x034, 0x00020004,
797 0xFF0F07D8, 0xCDEF,
798 0x034, 0x0002A0B2,
799 0x034, 0x000290AF,
800 0x034, 0x00028070,
801 0x034, 0x0002706D,
802 0x034, 0x00026050,
803 0x034, 0x0002504D,
804 0x034, 0x0002404A,
805 0x034, 0x00023047,
806 0x034, 0x0002200A,
807 0x034, 0x00021007,
808 0x034, 0x00020004,
809 0xFF0F07D0, 0xCDEF,
810 0x034, 0x0002A0B2,
811 0x034, 0x000290AF,
812 0x034, 0x00028070,
813 0x034, 0x0002706D,
814 0x034, 0x00026050,
815 0x034, 0x0002504D,
816 0x034, 0x0002404A,
817 0x034, 0x00023047,
818 0x034, 0x0002200A,
819 0x034, 0x00021007,
820 0x034, 0x00020004,
821 0xCDCDCDCD, 0xCDCD,
822 0x034, 0x0002ADF5,
823 0x034, 0x00029DF2,
824 0x034, 0x00028DEF,
825 0x034, 0x00027DEC,
826 0x034, 0x00026DE9,
827 0x034, 0x00025DC9,
828 0x034, 0x00024CE8,
829 0x034, 0x000238CA,
830 0x034, 0x00022889,
831 0x034, 0x0002184A,
832 0x034, 0x0002044A,
833 0xFF0F0740, 0xDEAD,
834 0xFF0F0740, 0xABCD,
835 0x034, 0x0000A0B2,
836 0x034, 0x000090AF,
837 0x034, 0x00008070,
838 0x034, 0x0000706D,
839 0x034, 0x00006050,
840 0x034, 0x0000504D,
841 0x034, 0x0000404A,
842 0x034, 0x00003047,
843 0x034, 0x0000200A,
844 0x034, 0x00001007,
845 0x034, 0x00000004,
846 0xFF0F02C0, 0xCDEF,
847 0x034, 0x0000A0B2,
848 0x034, 0x000090AF,
849 0x034, 0x00008070,
850 0x034, 0x0000706D,
851 0x034, 0x00006050,
852 0x034, 0x0000504D,
853 0x034, 0x0000404A,
854 0x034, 0x00003047,
855 0x034, 0x0000200A,
856 0x034, 0x00001007,
857 0x034, 0x00000004,
858 0xFF0F01C0, 0xCDEF,
859 0x034, 0x0000A0B2,
860 0x034, 0x000090AF,
861 0x034, 0x00008070,
862 0x034, 0x0000706D,
863 0x034, 0x00006050,
864 0x034, 0x0000504D,
865 0x034, 0x0000404A,
866 0x034, 0x00003047,
867 0x034, 0x0000200A,
868 0x034, 0x00001007,
869 0x034, 0x00000004,
870 0xFF0F07D8, 0xCDEF,
871 0x034, 0x0000A0B2,
872 0x034, 0x000090AF,
873 0x034, 0x00008070,
874 0x034, 0x0000706D,
875 0x034, 0x00006050,
876 0x034, 0x0000504D,
877 0x034, 0x0000404A,
878 0x034, 0x00003047,
879 0x034, 0x0000200A,
880 0x034, 0x00001007,
881 0x034, 0x00000004,
882 0xFF0F07D0, 0xCDEF,
883 0x034, 0x0000A0B2,
884 0x034, 0x000090AF,
885 0x034, 0x00008070,
886 0x034, 0x0000706D,
887 0x034, 0x00006050,
888 0x034, 0x0000504D,
889 0x034, 0x0000404A,
890 0x034, 0x00003047,
891 0x034, 0x0000200A,
892 0x034, 0x00001007,
893 0x034, 0x00000004,
894 0xCDCDCDCD, 0xCDCD,
895 0x034, 0x0000AFF7,
896 0x034, 0x00009DF7,
897 0x034, 0x00008DF4,
898 0x034, 0x00007DF1,
899 0x034, 0x00006DEE,
900 0x034, 0x00005DCD,
901 0x034, 0x00004CEB,
902 0x034, 0x000038CC,
903 0x034, 0x0000288B,
904 0x034, 0x0000184C,
905 0x034, 0x0000044C,
906 0xFF0F0740, 0xDEAD,
907 0x0EF, 0x00000000,
908 0xFF0F0740, 0xABCD,
909 0x018, 0x0001712A,
910 0x0EF, 0x00000040,
911 0x035, 0x000001D4,
912 0x035, 0x000081D4,
913 0x035, 0x000101D4,
914 0x035, 0x000201B4,
915 0x035, 0x000281B4,
916 0x035, 0x000301B4,
917 0x035, 0x000401B4,
918 0x035, 0x000481B4,
919 0x035, 0x000501B4,
920 0xFF0F02C0, 0xCDEF,
921 0x018, 0x0001712A,
922 0x0EF, 0x00000040,
923 0x035, 0x000001D4,
924 0x035, 0x000081D4,
925 0x035, 0x000101D4,
926 0x035, 0x000201B4,
927 0x035, 0x000281B4,
928 0x035, 0x000301B4,
929 0x035, 0x000401B4,
930 0x035, 0x000481B4,
931 0x035, 0x000501B4,
932 0xFF0F01C0, 0xCDEF,
933 0x018, 0x0001712A,
934 0x0EF, 0x00000040,
935 0x035, 0x000001D4,
936 0x035, 0x000081D4,
937 0x035, 0x000101D4,
938 0x035, 0x000201B4,
939 0x035, 0x000281B4,
940 0x035, 0x000301B4,
941 0x035, 0x000401B4,
942 0x035, 0x000481B4,
943 0x035, 0x000501B4,
944 0xFF0F07D8, 0xCDEF,
945 0x018, 0x0001712A,
946 0x0EF, 0x00000040,
947 0x035, 0x000001D4,
948 0x035, 0x000081D4,
949 0x035, 0x000101D4,
950 0x035, 0x000201B4,
951 0x035, 0x000281B4,
952 0x035, 0x000301B4,
953 0x035, 0x000401B4,
954 0x035, 0x000481B4,
955 0x035, 0x000501B4,
956 0xFF0F07D0, 0xCDEF,
957 0x018, 0x0001712A,
958 0x0EF, 0x00000040,
959 0x035, 0x000001D4,
960 0x035, 0x000081D4,
961 0x035, 0x000101D4,
962 0x035, 0x000201B4,
963 0x035, 0x000281B4,
964 0x035, 0x000301B4,
965 0x035, 0x000401B4,
966 0x035, 0x000481B4,
967 0x035, 0x000501B4,
968 0xCDCDCDCD, 0xCDCD,
969 0x018, 0x0001712A,
970 0x0EF, 0x00000040,
971 0x035, 0x00000188,
972 0x035, 0x00008147,
973 0x035, 0x00010147,
974 0x035, 0x000201D7,
975 0x035, 0x000281D7,
976 0x035, 0x000301D7,
977 0x035, 0x000401D8,
978 0x035, 0x000481D8,
979 0x035, 0x000501D8,
980 0xFF0F0740, 0xDEAD,
981 0x0EF, 0x00000000,
982 0xFF0F0740, 0xABCD,
983 0x018, 0x0001712A,
984 0x0EF, 0x00000010,
985 0x036, 0x00004BFB,
986 0x036, 0x0000CBFB,
987 0x036, 0x00014BFB,
988 0x036, 0x0001CBFB,
989 0x036, 0x00024F4B,
990 0x036, 0x0002CF4B,
991 0x036, 0x00034F4B,
992 0x036, 0x0003CF4B,
993 0x036, 0x00044F4B,
994 0x036, 0x0004CF4B,
995 0x036, 0x00054F4B,
996 0x036, 0x0005CF4B,
997 0xFF0F02C0, 0xCDEF,
998 0x018, 0x0001712A,
999 0x0EF, 0x00000010,
1000 0x036, 0x00004BFB,
1001 0x036, 0x0000CBFB,
1002 0x036, 0x00014BFB,
1003 0x036, 0x0001CBFB,
1004 0x036, 0x00024F4B,
1005 0x036, 0x0002CF4B,
1006 0x036, 0x00034F4B,
1007 0x036, 0x0003CF4B,
1008 0x036, 0x00044F4B,
1009 0x036, 0x0004CF4B,
1010 0x036, 0x00054F4B,
1011 0x036, 0x0005CF4B,
1012 0xFF0F01C0, 0xCDEF,
1013 0x018, 0x0001712A,
1014 0x0EF, 0x00000010,
1015 0x036, 0x00004BFB,
1016 0x036, 0x0000CBFB,
1017 0x036, 0x00014BFB,
1018 0x036, 0x0001CBFB,
1019 0x036, 0x00024F4B,
1020 0x036, 0x0002CF4B,
1021 0x036, 0x00034F4B,
1022 0x036, 0x0003CF4B,
1023 0x036, 0x00044F4B,
1024 0x036, 0x0004CF4B,
1025 0x036, 0x00054F4B,
1026 0x036, 0x0005CF4B,
1027 0xFF0F07D8, 0xCDEF,
1028 0x018, 0x0001712A,
1029 0x0EF, 0x00000010,
1030 0x036, 0x00004BFB,
1031 0x036, 0x0000CBFB,
1032 0x036, 0x00014BFB,
1033 0x036, 0x0001CBFB,
1034 0x036, 0x00024F4B,
1035 0x036, 0x0002CF4B,
1036 0x036, 0x00034F4B,
1037 0x036, 0x0003CF4B,
1038 0x036, 0x00044F4B,
1039 0x036, 0x0004CF4B,
1040 0x036, 0x00054F4B,
1041 0x036, 0x0005CF4B,
1042 0xFF0F07D0, 0xCDEF,
1043 0x018, 0x0001712A,
1044 0x0EF, 0x00000010,
1045 0x036, 0x00004BFB,
1046 0x036, 0x0000CBFB,
1047 0x036, 0x00014BFB,
1048 0x036, 0x0001CBFB,
1049 0x036, 0x00024F4B,
1050 0x036, 0x0002CF4B,
1051 0x036, 0x00034F4B,
1052 0x036, 0x0003CF4B,
1053 0x036, 0x00044F4B,
1054 0x036, 0x0004CF4B,
1055 0x036, 0x00054F4B,
1056 0x036, 0x0005CF4B,
1057 0xCDCDCDCD, 0xCDCD,
1058 0x018, 0x0001712A,
1059 0x0EF, 0x00000010,
1060 0x036, 0x00084EB4,
1061 0x036, 0x0008CC35,
1062 0x036, 0x00094C35,
1063 0x036, 0x0009CC35,
1064 0x036, 0x000A4935,
1065 0x036, 0x000ACC35,
1066 0x036, 0x000B4C35,
1067 0x036, 0x000BCC35,
1068 0x036, 0x000C4EB4,
1069 0x036, 0x000CCEB5,
1070 0x036, 0x000D4EB5,
1071 0x036, 0x000DCEB5,
1072 0xFF0F0740, 0xDEAD,
1073 0x0EF, 0x00000000,
1074 0x0EF, 0x00000008,
1075 0xFF0F0740, 0xABCD,
1076 0x03C, 0x000002CC,
1077 0x03C, 0x00000522,
1078 0x03C, 0x00000902,
1079 0xFF0F02C0, 0xCDEF,
1080 0x03C, 0x000002CC,
1081 0x03C, 0x00000522,
1082 0x03C, 0x00000902,
1083 0xFF0F01C0, 0xCDEF,
1084 0x03C, 0x000002CC,
1085 0x03C, 0x00000522,
1086 0x03C, 0x00000902,
1087 0xFF0F07D8, 0xCDEF,
1088 0x03C, 0x000002CC,
1089 0x03C, 0x00000522,
1090 0x03C, 0x00000902,
1091 0xFF0F07D0, 0xCDEF,
1092 0x03C, 0x000002CC,
1093 0x03C, 0x00000522,
1094 0x03C, 0x00000902,
1095 0xCDCDCDCD, 0xCDCD,
1096 0x03C, 0x000002A8,
1097 0x03C, 0x000005A2,
1098 0x03C, 0x00000880,
1099 0xFF0F0740, 0xDEAD,
1100 0x0EF, 0x00000000,
1101 0x018, 0x0001712A,
1102 0x0EF, 0x00000002,
1103 0x0DF, 0x00000080,
1104 0x01F, 0x00040064,
1105 0xFF0F0740, 0xABCD,
1106 0x061, 0x000FDD43,
1107 0x062, 0x00038F4B,
1108 0x063, 0x00032117,
1109 0x064, 0x000194AC,
1110 0x065, 0x000931D1,
1111 0xFF0F02C0, 0xCDEF,
1112 0x061, 0x000FDD43,
1113 0x062, 0x00038F4B,
1114 0x063, 0x00032117,
1115 0x064, 0x000194AC,
1116 0x065, 0x000931D1,
1117 0xFF0F01C0, 0xCDEF,
1118 0x061, 0x000FDD43,
1119 0x062, 0x00038F4B,
1120 0x063, 0x00032117,
1121 0x064, 0x000194AC,
1122 0x065, 0x000931D1,
1123 0xFF0F07D8, 0xCDEF,
1124 0x061, 0x000FDD43,
1125 0x062, 0x00038F4B,
1126 0x063, 0x00032117,
1127 0x064, 0x000194AC,
1128 0x065, 0x000931D1,
1129 0xFF0F07D0, 0xCDEF,
1130 0x061, 0x000FDD43,
1131 0x062, 0x00038F4B,
1132 0x063, 0x00032117,
1133 0x064, 0x000194AC,
1134 0x065, 0x000931D1,
1135 0xCDCDCDCD, 0xCDCD,
1136 0x061, 0x000E5D53,
1137 0x062, 0x00038FCD,
1138 0x063, 0x000314EB,
1139 0x064, 0x000196AC,
1140 0x065, 0x000911D7,
1141 0xFF0F0740, 0xDEAD,
1142 0x008, 0x00008400,
1143 0x01C, 0x000739D2,
1144 0x0B4, 0x0001E78D,
1145 0x018, 0x0001F12A,
1146 0x0FE, 0x00000000,
1147 0x0FE, 0x00000000,
1148 0x0FE, 0x00000000,
1149 0x0FE, 0x00000000,
1150 0x0B4, 0x0001A78D,
1151 0x018, 0x0001712A,
1152
1153};
1154
1155u32 RTL8812AE_RADIOB_ARRAY[] = {
1156 0x056, 0x00051CF2,
1157 0x066, 0x00040000,
1158 0x089, 0x00000080,
1159 0xFF0F0740, 0xABCD,
1160 0x086, 0x00014B38,
1161 0xFF0F01C0, 0xCDEF,
1162 0x086, 0x00014B38,
1163 0xFF0F02C0, 0xCDEF,
1164 0x086, 0x00014B38,
1165 0xFF0F07D8, 0xCDEF,
1166 0x086, 0x00014B3A,
1167 0xFF0F07D0, 0xCDEF,
1168 0x086, 0x00014B3A,
1169 0xCDCDCDCD, 0xCDCD,
1170 0x086, 0x00014B38,
1171 0xFF0F0740, 0xDEAD,
1172 0x018, 0x00000006,
1173 0x0EF, 0x00002000,
1174 0xFF0F07D8, 0xABCD,
1175 0x03B, 0x0003F218,
1176 0x03B, 0x00030A58,
1177 0x03B, 0x0002FA58,
1178 0x03B, 0x00022590,
1179 0x03B, 0x0001FA50,
1180 0x03B, 0x00010248,
1181 0x03B, 0x00008240,
1182 0xFF0F07D0, 0xCDEF,
1183 0x03B, 0x0003F218,
1184 0x03B, 0x00030A58,
1185 0x03B, 0x0002FA58,
1186 0x03B, 0x00022590,
1187 0x03B, 0x0001FA50,
1188 0x03B, 0x00010248,
1189 0x03B, 0x00008240,
1190 0xCDCDCDCD, 0xCDCD,
1191 0x03B, 0x00038A58,
1192 0x03B, 0x00037A58,
1193 0x03B, 0x0002A590,
1194 0x03B, 0x00027A50,
1195 0x03B, 0x00018248,
1196 0x03B, 0x00010240,
1197 0x03B, 0x00008240,
1198 0xFF0F07D8, 0xDEAD,
1199 0x0EF, 0x00000100,
1200 0xFF0F07D8, 0xABCD,
1201 0x034, 0x0000A4EE,
1202 0x034, 0x00009076,
1203 0x034, 0x00008073,
1204 0x034, 0x00007070,
1205 0x034, 0x0000606D,
1206 0x034, 0x0000506A,
1207 0x034, 0x00004049,
1208 0x034, 0x00003046,
1209 0x034, 0x00002028,
1210 0x034, 0x00001025,
1211 0x034, 0x00000022,
1212 0xCDCDCDCD, 0xCDCD,
1213 0x034, 0x0000ADF4,
1214 0x034, 0x00009DF1,
1215 0x034, 0x00008DEE,
1216 0x034, 0x00007DEB,
1217 0x034, 0x00006DE8,
1218 0x034, 0x00005CEC,
1219 0x034, 0x00004CE9,
1220 0x034, 0x000034EA,
1221 0x034, 0x000024E7,
1222 0x034, 0x0000146B,
1223 0x034, 0x0000006D,
1224 0xFF0F07D8, 0xDEAD,
1225 0x0EF, 0x00000000,
1226 0x0EF, 0x000020A2,
1227 0x0DF, 0x00000080,
1228 0x035, 0x00000192,
1229 0x035, 0x00008192,
1230 0x035, 0x00010192,
1231 0x036, 0x00000024,
1232 0x036, 0x00008024,
1233 0x036, 0x00010024,
1234 0x036, 0x00018024,
1235 0x0EF, 0x00000000,
1236 0x051, 0x00000C21,
1237 0x052, 0x000006D9,
1238 0x053, 0x000FC649,
1239 0x054, 0x0000017E,
1240 0x0EF, 0x00000002,
1241 0x008, 0x00008400,
1242 0x018, 0x0001712A,
1243 0x0EF, 0x00001000,
1244 0x03A, 0x00000080,
1245 0x03B, 0x0003A02C,
1246 0x03C, 0x00004000,
1247 0x03A, 0x00000400,
1248 0x03B, 0x0003202C,
1249 0x03C, 0x00010000,
1250 0x03A, 0x000000A0,
1251 0x03B, 0x0002B064,
1252 0x03C, 0x00004000,
1253 0x03A, 0x000000D8,
1254 0x03B, 0x00023070,
1255 0x03C, 0x00004000,
1256 0x03A, 0x00000468,
1257 0x03B, 0x0001B870,
1258 0x03C, 0x00010000,
1259 0x03A, 0x00000098,
1260 0x03B, 0x00012085,
1261 0x03C, 0x000E4000,
1262 0x03A, 0x00000418,
1263 0x03B, 0x0000A080,
1264 0x03C, 0x000F0000,
1265 0x03A, 0x00000418,
1266 0x03B, 0x00002080,
1267 0x03C, 0x00010000,
1268 0x03A, 0x00000080,
1269 0x03B, 0x0007A02C,
1270 0x03C, 0x00004000,
1271 0x03A, 0x00000400,
1272 0x03B, 0x0007202C,
1273 0x03C, 0x00010000,
1274 0x03A, 0x000000A0,
1275 0x03B, 0x0006B064,
1276 0x03C, 0x00004000,
1277 0x03A, 0x000000D8,
1278 0x03B, 0x00063070,
1279 0x03C, 0x00004000,
1280 0x03A, 0x00000468,
1281 0x03B, 0x0005B870,
1282 0x03C, 0x00010000,
1283 0x03A, 0x00000098,
1284 0x03B, 0x00052085,
1285 0x03C, 0x000E4000,
1286 0x03A, 0x00000418,
1287 0x03B, 0x0004A080,
1288 0x03C, 0x000F0000,
1289 0x03A, 0x00000418,
1290 0x03B, 0x00042080,
1291 0x03C, 0x00010000,
1292 0x03A, 0x00000080,
1293 0x03B, 0x000BA02C,
1294 0x03C, 0x00004000,
1295 0x03A, 0x00000400,
1296 0x03B, 0x000B202C,
1297 0x03C, 0x00010000,
1298 0x03A, 0x000000A0,
1299 0x03B, 0x000AB064,
1300 0x03C, 0x00004000,
1301 0x03A, 0x000000D8,
1302 0x03B, 0x000A3070,
1303 0x03C, 0x00004000,
1304 0x03A, 0x00000468,
1305 0x03B, 0x0009B870,
1306 0x03C, 0x00010000,
1307 0x03A, 0x00000098,
1308 0x03B, 0x00092085,
1309 0x03C, 0x000E4000,
1310 0x03A, 0x00000418,
1311 0x03B, 0x0008A080,
1312 0x03C, 0x000F0000,
1313 0x03A, 0x00000418,
1314 0x03B, 0x00082080,
1315 0x03C, 0x00010000,
1316 0x0EF, 0x00001100,
1317 0xFF0F0740, 0xABCD,
1318 0x034, 0x0004A0B2,
1319 0x034, 0x000490AF,
1320 0x034, 0x00048070,
1321 0x034, 0x0004706D,
1322 0x034, 0x00046050,
1323 0x034, 0x0004504D,
1324 0x034, 0x0004404A,
1325 0x034, 0x00043047,
1326 0x034, 0x0004200A,
1327 0x034, 0x00041007,
1328 0x034, 0x00040004,
1329 0xFF0F01C0, 0xCDEF,
1330 0x034, 0x0004A0B2,
1331 0x034, 0x000490AF,
1332 0x034, 0x00048070,
1333 0x034, 0x0004706D,
1334 0x034, 0x00046050,
1335 0x034, 0x0004504D,
1336 0x034, 0x0004404A,
1337 0x034, 0x00043047,
1338 0x034, 0x0004200A,
1339 0x034, 0x00041007,
1340 0x034, 0x00040004,
1341 0xFF0F02C0, 0xCDEF,
1342 0x034, 0x0004A0B2,
1343 0x034, 0x000490AF,
1344 0x034, 0x00048070,
1345 0x034, 0x0004706D,
1346 0x034, 0x00046050,
1347 0x034, 0x0004504D,
1348 0x034, 0x0004404A,
1349 0x034, 0x00043047,
1350 0x034, 0x0004200A,
1351 0x034, 0x00041007,
1352 0x034, 0x00040004,
1353 0xFF0F07D8, 0xCDEF,
1354 0x034, 0x0004A0B2,
1355 0x034, 0x000490AF,
1356 0x034, 0x00048070,
1357 0x034, 0x0004706D,
1358 0x034, 0x00046050,
1359 0x034, 0x0004504D,
1360 0x034, 0x0004404A,
1361 0x034, 0x00043047,
1362 0x034, 0x0004200A,
1363 0x034, 0x00041007,
1364 0x034, 0x00040004,
1365 0xFF0F07D0, 0xCDEF,
1366 0x034, 0x0004A0B2,
1367 0x034, 0x000490AF,
1368 0x034, 0x00048070,
1369 0x034, 0x0004706D,
1370 0x034, 0x00046050,
1371 0x034, 0x0004504D,
1372 0x034, 0x0004404A,
1373 0x034, 0x00043047,
1374 0x034, 0x0004200A,
1375 0x034, 0x00041007,
1376 0x034, 0x00040004,
1377 0xCDCDCDCD, 0xCDCD,
1378 0x034, 0x0004ADF5,
1379 0x034, 0x00049DF2,
1380 0x034, 0x00048DEF,
1381 0x034, 0x00047DEC,
1382 0x034, 0x00046DE9,
1383 0x034, 0x00045DC9,
1384 0x034, 0x00044CE8,
1385 0x034, 0x000438CA,
1386 0x034, 0x00042889,
1387 0x034, 0x0004184A,
1388 0x034, 0x0004044A,
1389 0xFF0F0740, 0xDEAD,
1390 0xFF0F0740, 0xABCD,
1391 0x034, 0x0002A0B2,
1392 0x034, 0x000290AF,
1393 0x034, 0x00028070,
1394 0x034, 0x0002706D,
1395 0x034, 0x00026050,
1396 0x034, 0x0002504D,
1397 0x034, 0x0002404A,
1398 0x034, 0x00023047,
1399 0x034, 0x0002200A,
1400 0x034, 0x00021007,
1401 0x034, 0x00020004,
1402 0xFF0F01C0, 0xCDEF,
1403 0x034, 0x0002A0B2,
1404 0x034, 0x000290AF,
1405 0x034, 0x00028070,
1406 0x034, 0x0002706D,
1407 0x034, 0x00026050,
1408 0x034, 0x0002504D,
1409 0x034, 0x0002404A,
1410 0x034, 0x00023047,
1411 0x034, 0x0002200A,
1412 0x034, 0x00021007,
1413 0x034, 0x00020004,
1414 0xFF0F02C0, 0xCDEF,
1415 0x034, 0x0002A0B2,
1416 0x034, 0x000290AF,
1417 0x034, 0x00028070,
1418 0x034, 0x0002706D,
1419 0x034, 0x00026050,
1420 0x034, 0x0002504D,
1421 0x034, 0x0002404A,
1422 0x034, 0x00023047,
1423 0x034, 0x0002200A,
1424 0x034, 0x00021007,
1425 0x034, 0x00020004,
1426 0xFF0F07D8, 0xCDEF,
1427 0x034, 0x0002A0B2,
1428 0x034, 0x000290AF,
1429 0x034, 0x00028070,
1430 0x034, 0x0002706D,
1431 0x034, 0x00026050,
1432 0x034, 0x0002504D,
1433 0x034, 0x0002404A,
1434 0x034, 0x00023047,
1435 0x034, 0x0002200A,
1436 0x034, 0x00021007,
1437 0x034, 0x00020004,
1438 0xFF0F07D0, 0xCDEF,
1439 0x034, 0x0002A0B2,
1440 0x034, 0x000290AF,
1441 0x034, 0x00028070,
1442 0x034, 0x0002706D,
1443 0x034, 0x00026050,
1444 0x034, 0x0002504D,
1445 0x034, 0x0002404A,
1446 0x034, 0x00023047,
1447 0x034, 0x0002200A,
1448 0x034, 0x00021007,
1449 0x034, 0x00020004,
1450 0xCDCDCDCD, 0xCDCD,
1451 0x034, 0x0002ADF5,
1452 0x034, 0x00029DF2,
1453 0x034, 0x00028DEF,
1454 0x034, 0x00027DEC,
1455 0x034, 0x00026DE9,
1456 0x034, 0x00025DC9,
1457 0x034, 0x00024CE8,
1458 0x034, 0x000238CA,
1459 0x034, 0x00022889,
1460 0x034, 0x0002184A,
1461 0x034, 0x0002044A,
1462 0xFF0F0740, 0xDEAD,
1463 0xFF0F0740, 0xABCD,
1464 0x034, 0x0000A0B2,
1465 0x034, 0x000090AF,
1466 0x034, 0x00008070,
1467 0x034, 0x0000706D,
1468 0x034, 0x00006050,
1469 0x034, 0x0000504D,
1470 0x034, 0x0000404A,
1471 0x034, 0x00003047,
1472 0x034, 0x0000200A,
1473 0x034, 0x00001007,
1474 0x034, 0x00000004,
1475 0xFF0F01C0, 0xCDEF,
1476 0x034, 0x0000A0B2,
1477 0x034, 0x000090AF,
1478 0x034, 0x00008070,
1479 0x034, 0x0000706D,
1480 0x034, 0x00006050,
1481 0x034, 0x0000504D,
1482 0x034, 0x0000404A,
1483 0x034, 0x00003047,
1484 0x034, 0x0000200A,
1485 0x034, 0x00001007,
1486 0x034, 0x00000004,
1487 0xFF0F02C0, 0xCDEF,
1488 0x034, 0x0000A0B2,
1489 0x034, 0x000090AF,
1490 0x034, 0x00008070,
1491 0x034, 0x0000706D,
1492 0x034, 0x00006050,
1493 0x034, 0x0000504D,
1494 0x034, 0x0000404A,
1495 0x034, 0x00003047,
1496 0x034, 0x0000200A,
1497 0x034, 0x00001007,
1498 0x034, 0x00000004,
1499 0xFF0F07D8, 0xCDEF,
1500 0x034, 0x0000A0B2,
1501 0x034, 0x000090AF,
1502 0x034, 0x00008070,
1503 0x034, 0x0000706D,
1504 0x034, 0x00006050,
1505 0x034, 0x0000504D,
1506 0x034, 0x0000404A,
1507 0x034, 0x00003047,
1508 0x034, 0x0000200A,
1509 0x034, 0x00001007,
1510 0x034, 0x00000004,
1511 0xFF0F07D0, 0xCDEF,
1512 0x034, 0x0000A0B2,
1513 0x034, 0x000090AF,
1514 0x034, 0x00008070,
1515 0x034, 0x0000706D,
1516 0x034, 0x00006050,
1517 0x034, 0x0000504D,
1518 0x034, 0x0000404A,
1519 0x034, 0x00003047,
1520 0x034, 0x0000200A,
1521 0x034, 0x00001007,
1522 0x034, 0x00000004,
1523 0xCDCDCDCD, 0xCDCD,
1524 0x034, 0x0000AFF7,
1525 0x034, 0x00009DF7,
1526 0x034, 0x00008DF4,
1527 0x034, 0x00007DF1,
1528 0x034, 0x00006DEE,
1529 0x034, 0x00005DCD,
1530 0x034, 0x00004CEB,
1531 0x034, 0x000038CC,
1532 0x034, 0x0000288B,
1533 0x034, 0x0000184C,
1534 0x034, 0x0000044C,
1535 0xFF0F0740, 0xDEAD,
1536 0x0EF, 0x00000000,
1537 0xFF0F0740, 0xABCD,
1538 0x018, 0x0001712A,
1539 0x0EF, 0x00000040,
1540 0x035, 0x000001C5,
1541 0x035, 0x000081C5,
1542 0x035, 0x000101C5,
1543 0x035, 0x00020174,
1544 0x035, 0x00028174,
1545 0x035, 0x00030174,
1546 0x035, 0x00040185,
1547 0x035, 0x00048185,
1548 0x035, 0x00050185,
1549 0x0EF, 0x00000000,
1550 0xFF0F01C0, 0xCDEF,
1551 0x018, 0x0001712A,
1552 0x0EF, 0x00000040,
1553 0x035, 0x000001C5,
1554 0x035, 0x000081C5,
1555 0x035, 0x000101C5,
1556 0x035, 0x00020174,
1557 0x035, 0x00028174,
1558 0x035, 0x00030174,
1559 0x035, 0x00040185,
1560 0x035, 0x00048185,
1561 0x035, 0x00050185,
1562 0x0EF, 0x00000000,
1563 0xFF0F02C0, 0xCDEF,
1564 0x018, 0x0001712A,
1565 0x0EF, 0x00000040,
1566 0x035, 0x000001C5,
1567 0x035, 0x000081C5,
1568 0x035, 0x000101C5,
1569 0x035, 0x00020174,
1570 0x035, 0x00028174,
1571 0x035, 0x00030174,
1572 0x035, 0x00040185,
1573 0x035, 0x00048185,
1574 0x035, 0x00050185,
1575 0x0EF, 0x00000000,
1576 0xFF0F07D8, 0xCDEF,
1577 0x018, 0x0001712A,
1578 0x0EF, 0x00000040,
1579 0x035, 0x000001C5,
1580 0x035, 0x000081C5,
1581 0x035, 0x000101C5,
1582 0x035, 0x00020174,
1583 0x035, 0x00028174,
1584 0x035, 0x00030174,
1585 0x035, 0x00040185,
1586 0x035, 0x00048185,
1587 0x035, 0x00050185,
1588 0x0EF, 0x00000000,
1589 0xFF0F07D0, 0xCDEF,
1590 0x018, 0x0001712A,
1591 0x0EF, 0x00000040,
1592 0x035, 0x000001C5,
1593 0x035, 0x000081C5,
1594 0x035, 0x000101C5,
1595 0x035, 0x00020174,
1596 0x035, 0x00028174,
1597 0x035, 0x00030174,
1598 0x035, 0x00040185,
1599 0x035, 0x00048185,
1600 0x035, 0x00050185,
1601 0x0EF, 0x00000000,
1602 0xCDCDCDCD, 0xCDCD,
1603 0x018, 0x0001712A,
1604 0x0EF, 0x00000040,
1605 0x035, 0x00000186,
1606 0x035, 0x00008186,
1607 0x035, 0x00010185,
1608 0x035, 0x000201D5,
1609 0x035, 0x000281D5,
1610 0x035, 0x000301D5,
1611 0x035, 0x000401D5,
1612 0x035, 0x000481D5,
1613 0x035, 0x000501D5,
1614 0x0EF, 0x00000000,
1615 0xFF0F0740, 0xDEAD,
1616 0xFF0F0740, 0xABCD,
1617 0x018, 0x0001712A,
1618 0x0EF, 0x00000010,
1619 0x036, 0x00005B8B,
1620 0x036, 0x0000DB8B,
1621 0x036, 0x00015B8B,
1622 0x036, 0x0001DB8B,
1623 0x036, 0x000262DB,
1624 0x036, 0x0002E2DB,
1625 0x036, 0x000362DB,
1626 0x036, 0x0003E2DB,
1627 0x036, 0x0004553B,
1628 0x036, 0x0004D53B,
1629 0x036, 0x0005553B,
1630 0x036, 0x0005D53B,
1631 0xFF0F01C0, 0xCDEF,
1632 0x018, 0x0001712A,
1633 0x0EF, 0x00000010,
1634 0x036, 0x00005B8B,
1635 0x036, 0x0000DB8B,
1636 0x036, 0x00015B8B,
1637 0x036, 0x0001DB8B,
1638 0x036, 0x000262DB,
1639 0x036, 0x0002E2DB,
1640 0x036, 0x000362DB,
1641 0x036, 0x0003E2DB,
1642 0x036, 0x0004553B,
1643 0x036, 0x0004D53B,
1644 0x036, 0x0005553B,
1645 0x036, 0x0005D53B,
1646 0xFF0F02C0, 0xCDEF,
1647 0x018, 0x0001712A,
1648 0x0EF, 0x00000010,
1649 0x036, 0x00005B8B,
1650 0x036, 0x0000DB8B,
1651 0x036, 0x00015B8B,
1652 0x036, 0x0001DB8B,
1653 0x036, 0x000262DB,
1654 0x036, 0x0002E2DB,
1655 0x036, 0x000362DB,
1656 0x036, 0x0003E2DB,
1657 0x036, 0x0004553B,
1658 0x036, 0x0004D53B,
1659 0x036, 0x0005553B,
1660 0x036, 0x0005D53B,
1661 0xFF0F07D8, 0xCDEF,
1662 0x018, 0x0001712A,
1663 0x0EF, 0x00000010,
1664 0x036, 0x00005B8B,
1665 0x036, 0x0000DB8B,
1666 0x036, 0x00015B8B,
1667 0x036, 0x0001DB8B,
1668 0x036, 0x000262DB,
1669 0x036, 0x0002E2DB,
1670 0x036, 0x000362DB,
1671 0x036, 0x0003E2DB,
1672 0x036, 0x0004553B,
1673 0x036, 0x0004D53B,
1674 0x036, 0x0005553B,
1675 0x036, 0x0005D53B,
1676 0xFF0F07D0, 0xCDEF,
1677 0x018, 0x0001712A,
1678 0x0EF, 0x00000010,
1679 0x036, 0x00005B8B,
1680 0x036, 0x0000DB8B,
1681 0x036, 0x00015B8B,
1682 0x036, 0x0001DB8B,
1683 0x036, 0x000262DB,
1684 0x036, 0x0002E2DB,
1685 0x036, 0x000362DB,
1686 0x036, 0x0003E2DB,
1687 0x036, 0x0004553B,
1688 0x036, 0x0004D53B,
1689 0x036, 0x0005553B,
1690 0x036, 0x0005D53B,
1691 0xCDCDCDCD, 0xCDCD,
1692 0x018, 0x0001712A,
1693 0x0EF, 0x00000010,
1694 0x036, 0x00084EB4,
1695 0x036, 0x0008C9B4,
1696 0x036, 0x000949B4,
1697 0x036, 0x0009C9B4,
1698 0x036, 0x000A4935,
1699 0x036, 0x000AC935,
1700 0x036, 0x000B4935,
1701 0x036, 0x000BC935,
1702 0x036, 0x000C4EB4,
1703 0x036, 0x000CCEB4,
1704 0x036, 0x000D4EB4,
1705 0x036, 0x000DCEB4,
1706 0xFF0F0740, 0xDEAD,
1707 0x0EF, 0x00000000,
1708 0x0EF, 0x00000008,
1709 0xFF0F0740, 0xABCD,
1710 0x03C, 0x000002DC,
1711 0x03C, 0x00000524,
1712 0x03C, 0x00000902,
1713 0xFF0F01C0, 0xCDEF,
1714 0x03C, 0x000002DC,
1715 0x03C, 0x00000524,
1716 0x03C, 0x00000902,
1717 0xFF0F02C0, 0xCDEF,
1718 0x03C, 0x000002DC,
1719 0x03C, 0x00000524,
1720 0x03C, 0x00000902,
1721 0xFF0F07D8, 0xCDEF,
1722 0x03C, 0x000002DC,
1723 0x03C, 0x00000524,
1724 0x03C, 0x00000902,
1725 0xFF0F07D0, 0xCDEF,
1726 0x03C, 0x000002DC,
1727 0x03C, 0x00000524,
1728 0x03C, 0x00000902,
1729 0xCDCDCDCD, 0xCDCD,
1730 0x03C, 0x000002AA,
1731 0x03C, 0x000005A2,
1732 0x03C, 0x00000880,
1733 0xFF0F0740, 0xDEAD,
1734 0x0EF, 0x00000000,
1735 0x018, 0x0001712A,
1736 0x0EF, 0x00000002,
1737 0x0DF, 0x00000080,
1738 0xFF0F0740, 0xABCD,
1739 0x061, 0x000EAC43,
1740 0x062, 0x00038F47,
1741 0x063, 0x00031157,
1742 0x064, 0x0001C4AC,
1743 0x065, 0x000931D1,
1744 0xFF0F01C0, 0xCDEF,
1745 0x061, 0x000EAC43,
1746 0x062, 0x00038F47,
1747 0x063, 0x00031157,
1748 0x064, 0x0001C4AC,
1749 0x065, 0x000931D1,
1750 0xFF0F02C0, 0xCDEF,
1751 0x061, 0x000EAC43,
1752 0x062, 0x00038F47,
1753 0x063, 0x00031157,
1754 0x064, 0x0001C4AC,
1755 0x065, 0x000931D1,
1756 0xFF0F07D8, 0xCDEF,
1757 0x061, 0x000EAC43,
1758 0x062, 0x00038F47,
1759 0x063, 0x00031157,
1760 0x064, 0x0001C4AC,
1761 0x065, 0x000931D1,
1762 0xFF0F07D0, 0xCDEF,
1763 0x061, 0x000EAC43,
1764 0x062, 0x00038F47,
1765 0x063, 0x00031157,
1766 0x064, 0x0001C4AC,
1767 0x065, 0x000931D1,
1768 0xCDCDCDCD, 0xCDCD,
1769 0x061, 0x000E5D53,
1770 0x062, 0x00038FCD,
1771 0x063, 0x000314EB,
1772 0x064, 0x000196AC,
1773 0x065, 0x000931D7,
1774 0xFF0F0740, 0xDEAD,
1775 0x008, 0x00008400,
1776
1777};
1778
1779u32 RTL8821AE_RADIOA_ARRAY[] = {
1780 0x018, 0x0001712A,
1781 0x056, 0x00051CF2,
1782 0x066, 0x00040000,
1783 0x000, 0x00010000,
1784 0x01E, 0x00080000,
1785 0x082, 0x00000830,
1786 0x083, 0x00021800,
1787 0x084, 0x00028000,
1788 0x085, 0x00048000,
1789 0x086, 0x00094838,
1790 0x087, 0x00044980,
1791 0x088, 0x00048000,
1792 0x089, 0x0000D480,
1793 0x08A, 0x00042240,
1794 0x08B, 0x000F0380,
1795 0x08C, 0x00090000,
1796 0x08D, 0x00022852,
1797 0x08E, 0x00065540,
1798 0x08F, 0x00088001,
1799 0x0EF, 0x00020000,
1800 0x03E, 0x00000380,
1801 0x03F, 0x00090018,
1802 0x03E, 0x00020380,
1803 0x03F, 0x000A0018,
1804 0x03E, 0x00040308,
1805 0x03F, 0x000A0018,
1806 0x03E, 0x00060018,
1807 0x03F, 0x000A0018,
1808 0x0EF, 0x00000000,
1809 0x018, 0x0001712A,
1810 0x089, 0x00000080,
1811 0x08B, 0x00080180,
1812 0x0EF, 0x00001000,
1813 0x03A, 0x00000244,
1814 0x03B, 0x00038027,
1815 0x03C, 0x00082000,
1816 0x03A, 0x00000244,
1817 0x03B, 0x00030113,
1818 0x03C, 0x00082000,
1819 0x03A, 0x0000014C,
1820 0x03B, 0x00028027,
1821 0x03C, 0x00082000,
1822 0x03A, 0x000000CC,
1823 0x03B, 0x00027027,
1824 0x03C, 0x00042000,
1825 0x03A, 0x0000014C,
1826 0x03B, 0x0001F913,
1827 0x03C, 0x00042000,
1828 0x03A, 0x0000010C,
1829 0x03B, 0x00017F10,
1830 0x03C, 0x00012000,
1831 0x03A, 0x000000D0,
1832 0x03B, 0x00008027,
1833 0x03C, 0x000CA000,
1834 0x03A, 0x00000244,
1835 0x03B, 0x00078027,
1836 0x03C, 0x00082000,
1837 0x03A, 0x00000244,
1838 0x03B, 0x00070113,
1839 0x03C, 0x00082000,
1840 0x03A, 0x0000014C,
1841 0x03B, 0x00068027,
1842 0x03C, 0x00082000,
1843 0x03A, 0x000000CC,
1844 0x03B, 0x00067027,
1845 0x03C, 0x00042000,
1846 0x03A, 0x0000014C,
1847 0x03B, 0x0005F913,
1848 0x03C, 0x00042000,
1849 0x03A, 0x0000010C,
1850 0x03B, 0x00057F10,
1851 0x03C, 0x00012000,
1852 0x03A, 0x000000D0,
1853 0x03B, 0x00048027,
1854 0x03C, 0x000CA000,
1855 0x03A, 0x00000244,
1856 0x03B, 0x000B8027,
1857 0x03C, 0x00082000,
1858 0x03A, 0x00000244,
1859 0x03B, 0x000B0113,
1860 0x03C, 0x00082000,
1861 0x03A, 0x0000014C,
1862 0x03B, 0x000A8027,
1863 0x03C, 0x00082000,
1864 0x03A, 0x000000CC,
1865 0x03B, 0x000A7027,
1866 0x03C, 0x00042000,
1867 0x03A, 0x0000014C,
1868 0x03B, 0x0009F913,
1869 0x03C, 0x00042000,
1870 0x03A, 0x0000010C,
1871 0x03B, 0x00097F10,
1872 0x03C, 0x00012000,
1873 0x03A, 0x000000D0,
1874 0x03B, 0x00088027,
1875 0x03C, 0x000CA000,
1876 0x0EF, 0x00000000,
1877 0x0EF, 0x00001100,
1878 0xFF0F0104, 0xABCD,
1879 0x034, 0x0004ADF3,
1880 0x034, 0x00049DF0,
1881 0xFF0F0204, 0xCDEF,
1882 0x034, 0x0004ADF3,
1883 0x034, 0x00049DF0,
1884 0xFF0F0404, 0xCDEF,
1885 0x034, 0x0004ADF3,
1886 0x034, 0x00049DF0,
1887 0xFF0F0200, 0xCDEF,
1888 0x034, 0x0004ADF5,
1889 0x034, 0x00049DF2,
1890 0xFF0F02C0, 0xCDEF,
1891 0x034, 0x0004A0F3,
1892 0x034, 0x000490B1,
1893 0xCDCDCDCD, 0xCDCD,
1894 0x034, 0x0004ADF7,
1895 0x034, 0x00049DF3,
1896 0xFF0F0104, 0xDEAD,
1897 0xFF0F0104, 0xABCD,
1898 0x034, 0x00048DED,
1899 0x034, 0x00047DEA,
1900 0x034, 0x00046DE7,
1901 0x034, 0x00045CE9,
1902 0x034, 0x00044CE6,
1903 0x034, 0x000438C6,
1904 0x034, 0x00042886,
1905 0x034, 0x00041486,
1906 0x034, 0x00040447,
1907 0xFF0F0204, 0xCDEF,
1908 0x034, 0x00048DED,
1909 0x034, 0x00047DEA,
1910 0x034, 0x00046DE7,
1911 0x034, 0x00045CE9,
1912 0x034, 0x00044CE6,
1913 0x034, 0x000438C6,
1914 0x034, 0x00042886,
1915 0x034, 0x00041486,
1916 0x034, 0x00040447,
1917 0xFF0F0404, 0xCDEF,
1918 0x034, 0x00048DED,
1919 0x034, 0x00047DEA,
1920 0x034, 0x00046DE7,
1921 0x034, 0x00045CE9,
1922 0x034, 0x00044CE6,
1923 0x034, 0x000438C6,
1924 0x034, 0x00042886,
1925 0x034, 0x00041486,
1926 0x034, 0x00040447,
1927 0xFF0F02C0, 0xCDEF,
1928 0x034, 0x000480AE,
1929 0x034, 0x000470AB,
1930 0x034, 0x0004608B,
1931 0x034, 0x00045069,
1932 0x034, 0x00044048,
1933 0x034, 0x00043045,
1934 0x034, 0x00042026,
1935 0x034, 0x00041023,
1936 0x034, 0x00040002,
1937 0xCDCDCDCD, 0xCDCD,
1938 0x034, 0x00048DEF,
1939 0x034, 0x00047DEC,
1940 0x034, 0x00046DE9,
1941 0x034, 0x00045CCB,
1942 0x034, 0x0004488D,
1943 0x034, 0x0004348D,
1944 0x034, 0x0004248A,
1945 0x034, 0x0004108D,
1946 0x034, 0x0004008A,
1947 0xFF0F0104, 0xDEAD,
1948 0xFF0F0200, 0xABCD,
1949 0x034, 0x0002ADF4,
1950 0xFF0F02C0, 0xCDEF,
1951 0x034, 0x0002A0F3,
1952 0xCDCDCDCD, 0xCDCD,
1953 0x034, 0x0002ADF7,
1954 0xFF0F0200, 0xDEAD,
1955 0xFF0F0104, 0xABCD,
1956 0x034, 0x00029DF4,
1957 0xFF0F0204, 0xCDEF,
1958 0x034, 0x00029DF4,
1959 0xFF0F0404, 0xCDEF,
1960 0x034, 0x00029DF4,
1961 0xFF0F0200, 0xCDEF,
1962 0x034, 0x00029DF1,
1963 0xFF0F02C0, 0xCDEF,
1964 0x034, 0x000290F0,
1965 0xCDCDCDCD, 0xCDCD,
1966 0x034, 0x00029DF2,
1967 0xFF0F0104, 0xDEAD,
1968 0xFF0F0104, 0xABCD,
1969 0x034, 0x00028DF1,
1970 0x034, 0x00027DEE,
1971 0x034, 0x00026DEB,
1972 0x034, 0x00025CEC,
1973 0x034, 0x00024CE9,
1974 0x034, 0x000238CA,
1975 0x034, 0x00022889,
1976 0x034, 0x00021489,
1977 0x034, 0x0002044A,
1978 0xFF0F0204, 0xCDEF,
1979 0x034, 0x00028DF1,
1980 0x034, 0x00027DEE,
1981 0x034, 0x00026DEB,
1982 0x034, 0x00025CEC,
1983 0x034, 0x00024CE9,
1984 0x034, 0x000238CA,
1985 0x034, 0x00022889,
1986 0x034, 0x00021489,
1987 0x034, 0x0002044A,
1988 0xFF0F0404, 0xCDEF,
1989 0x034, 0x00028DF1,
1990 0x034, 0x00027DEE,
1991 0x034, 0x00026DEB,
1992 0x034, 0x00025CEC,
1993 0x034, 0x00024CE9,
1994 0x034, 0x000238CA,
1995 0x034, 0x00022889,
1996 0x034, 0x00021489,
1997 0x034, 0x0002044A,
1998 0xFF0F02C0, 0xCDEF,
1999 0x034, 0x000280AF,
2000 0x034, 0x000270AC,
2001 0x034, 0x0002608B,
2002 0x034, 0x00025069,
2003 0x034, 0x00024048,
2004 0x034, 0x00023045,
2005 0x034, 0x00022026,
2006 0x034, 0x00021023,
2007 0x034, 0x00020002,
2008 0xCDCDCDCD, 0xCDCD,
2009 0x034, 0x00028DEE,
2010 0x034, 0x00027DEB,
2011 0x034, 0x00026CCD,
2012 0x034, 0x00025CCA,
2013 0x034, 0x0002488C,
2014 0x034, 0x0002384C,
2015 0x034, 0x00022849,
2016 0x034, 0x00021449,
2017 0x034, 0x0002004D,
2018 0xFF0F0104, 0xDEAD,
2019 0xFF0F02C0, 0xABCD,
2020 0x034, 0x0000A0D7,
2021 0x034, 0x000090D3,
2022 0x034, 0x000080B1,
2023 0x034, 0x000070AE,
2024 0xCDCDCDCD, 0xCDCD,
2025 0x034, 0x0000ADF7,
2026 0x034, 0x00009DF4,
2027 0x034, 0x00008DF1,
2028 0x034, 0x00007DEE,
2029 0xFF0F02C0, 0xDEAD,
2030 0xFF0F0104, 0xABCD,
2031 0x034, 0x00006DEB,
2032 0x034, 0x00005CEC,
2033 0x034, 0x00004CE9,
2034 0x034, 0x000038CA,
2035 0x034, 0x00002889,
2036 0x034, 0x00001489,
2037 0x034, 0x0000044A,
2038 0xFF0F0204, 0xCDEF,
2039 0x034, 0x00006DEB,
2040 0x034, 0x00005CEC,
2041 0x034, 0x00004CE9,
2042 0x034, 0x000038CA,
2043 0x034, 0x00002889,
2044 0x034, 0x00001489,
2045 0x034, 0x0000044A,
2046 0xFF0F0404, 0xCDEF,
2047 0x034, 0x00006DEB,
2048 0x034, 0x00005CEC,
2049 0x034, 0x00004CE9,
2050 0x034, 0x000038CA,
2051 0x034, 0x00002889,
2052 0x034, 0x00001489,
2053 0x034, 0x0000044A,
2054 0xFF0F02C0, 0xCDEF,
2055 0x034, 0x0000608D,
2056 0x034, 0x0000506B,
2057 0x034, 0x0000404A,
2058 0x034, 0x00003047,
2059 0x034, 0x00002044,
2060 0x034, 0x00001025,
2061 0x034, 0x00000004,
2062 0xCDCDCDCD, 0xCDCD,
2063 0x034, 0x00006DCD,
2064 0x034, 0x00005CCD,
2065 0x034, 0x00004CCA,
2066 0x034, 0x0000388C,
2067 0x034, 0x00002888,
2068 0x034, 0x00001488,
2069 0x034, 0x00000486,
2070 0xFF0F0104, 0xDEAD,
2071 0x0EF, 0x00000000,
2072 0x018, 0x0001712A,
2073 0x0EF, 0x00000040,
2074 0xFF0F0104, 0xABCD,
2075 0x035, 0x00000187,
2076 0x035, 0x00008187,
2077 0x035, 0x00010187,
2078 0x035, 0x00020188,
2079 0x035, 0x00028188,
2080 0x035, 0x00030188,
2081 0x035, 0x00040188,
2082 0x035, 0x00048188,
2083 0x035, 0x00050188,
2084 0xFF0F0204, 0xCDEF,
2085 0x035, 0x00000187,
2086 0x035, 0x00008187,
2087 0x035, 0x00010187,
2088 0x035, 0x00020188,
2089 0x035, 0x00028188,
2090 0x035, 0x00030188,
2091 0x035, 0x00040188,
2092 0x035, 0x00048188,
2093 0x035, 0x00050188,
2094 0xFF0F0404, 0xCDEF,
2095 0x035, 0x00000187,
2096 0x035, 0x00008187,
2097 0x035, 0x00010187,
2098 0x035, 0x00020188,
2099 0x035, 0x00028188,
2100 0x035, 0x00030188,
2101 0x035, 0x00040188,
2102 0x035, 0x00048188,
2103 0x035, 0x00050188,
2104 0xCDCDCDCD, 0xCDCD,
2105 0x035, 0x00000145,
2106 0x035, 0x00008145,
2107 0x035, 0x00010145,
2108 0x035, 0x00020196,
2109 0x035, 0x00028196,
2110 0x035, 0x00030196,
2111 0x035, 0x000401C7,
2112 0x035, 0x000481C7,
2113 0x035, 0x000501C7,
2114 0xFF0F0104, 0xDEAD,
2115 0x0EF, 0x00000000,
2116 0x018, 0x0001712A,
2117 0x0EF, 0x00000010,
2118 0xFF0F0104, 0xABCD,
2119 0x036, 0x00085733,
2120 0x036, 0x0008D733,
2121 0x036, 0x00095733,
2122 0x036, 0x0009D733,
2123 0x036, 0x000A64B4,
2124 0x036, 0x000AE4B4,
2125 0x036, 0x000B64B4,
2126 0x036, 0x000BE4B4,
2127 0x036, 0x000C64B4,
2128 0x036, 0x000CE4B4,
2129 0x036, 0x000D64B4,
2130 0x036, 0x000DE4B4,
2131 0xFF0F0204, 0xCDEF,
2132 0x036, 0x00085733,
2133 0x036, 0x0008D733,
2134 0x036, 0x00095733,
2135 0x036, 0x0009D733,
2136 0x036, 0x000A64B4,
2137 0x036, 0x000AE4B4,
2138 0x036, 0x000B64B4,
2139 0x036, 0x000BE4B4,
2140 0x036, 0x000C64B4,
2141 0x036, 0x000CE4B4,
2142 0x036, 0x000D64B4,
2143 0x036, 0x000DE4B4,
2144 0xFF0F0404, 0xCDEF,
2145 0x036, 0x00085733,
2146 0x036, 0x0008D733,
2147 0x036, 0x00095733,
2148 0x036, 0x0009D733,
2149 0x036, 0x000A64B4,
2150 0x036, 0x000AE4B4,
2151 0x036, 0x000B64B4,
2152 0x036, 0x000BE4B4,
2153 0x036, 0x000C64B4,
2154 0x036, 0x000CE4B4,
2155 0x036, 0x000D64B4,
2156 0x036, 0x000DE4B4,
2157 0xCDCDCDCD, 0xCDCD,
2158 0x036, 0x000056B3,
2159 0x036, 0x0000D6B3,
2160 0x036, 0x000156B3,
2161 0x036, 0x0001D6B3,
2162 0x036, 0x00026634,
2163 0x036, 0x0002E634,
2164 0x036, 0x00036634,
2165 0x036, 0x0003E634,
2166 0x036, 0x000467B4,
2167 0x036, 0x0004E7B4,
2168 0x036, 0x000567B4,
2169 0x036, 0x0005E7B4,
2170 0xFF0F0104, 0xDEAD,
2171 0x0EF, 0x00000000,
2172 0x0EF, 0x00000008,
2173 0xFF0F0104, 0xABCD,
2174 0x03C, 0x000001C8,
2175 0x03C, 0x00000492,
2176 0xFF0F0204, 0xCDEF,
2177 0x03C, 0x000001C8,
2178 0x03C, 0x00000492,
2179 0xFF0F0404, 0xCDEF,
2180 0x03C, 0x000001C8,
2181 0x03C, 0x00000492,
2182 0xCDCDCDCD, 0xCDCD,
2183 0x03C, 0x0000022A,
2184 0x03C, 0x00000594,
2185 0xFF0F0104, 0xDEAD,
2186 0xFF0F0104, 0xABCD,
2187 0x03C, 0x00000800,
2188 0xFF0F0204, 0xCDEF,
2189 0x03C, 0x00000800,
2190 0xFF0F0404, 0xCDEF,
2191 0x03C, 0x00000800,
2192 0xFF0F02C0, 0xCDEF,
2193 0x03C, 0x00000820,
2194 0xCDCDCDCD, 0xCDCD,
2195 0x03C, 0x00000900,
2196 0xFF0F0104, 0xDEAD,
2197 0x0EF, 0x00000000,
2198 0x018, 0x0001712A,
2199 0x0EF, 0x00000002,
2200 0xFF0F0104, 0xABCD,
2201 0x008, 0x0004E400,
2202 0xFF0F0204, 0xCDEF,
2203 0x008, 0x0004E400,
2204 0xFF0F0404, 0xCDEF,
2205 0x008, 0x0004E400,
2206 0xCDCDCDCD, 0xCDCD,
2207 0x008, 0x00002000,
2208 0xFF0F0104, 0xDEAD,
2209 0x0EF, 0x00000000,
2210 0x0DF, 0x000000C0,
2211 0x01F, 0x00040064,
2212 0xFF0F0104, 0xABCD,
2213 0x058, 0x000A7284,
2214 0x059, 0x000600EC,
2215 0xFF0F0204, 0xCDEF,
2216 0x058, 0x000A7284,
2217 0x059, 0x000600EC,
2218 0xFF0F0404, 0xCDEF,
2219 0x058, 0x000A7284,
2220 0x059, 0x000600EC,
2221 0xCDCDCDCD, 0xCDCD,
2222 0x058, 0x00081184,
2223 0x059, 0x0006016C,
2224 0xFF0F0104, 0xDEAD,
2225 0xFF0F0104, 0xABCD,
2226 0x061, 0x000E8D73,
2227 0x062, 0x00093FC5,
2228 0xFF0F0204, 0xCDEF,
2229 0x061, 0x000E8D73,
2230 0x062, 0x00093FC5,
2231 0xFF0F0404, 0xCDEF,
2232 0x061, 0x000E8D73,
2233 0x062, 0x00093FC5,
2234 0xCDCDCDCD, 0xCDCD,
2235 0x061, 0x000EAD53,
2236 0x062, 0x00093BC4,
2237 0xFF0F0104, 0xDEAD,
2238 0xFF0F0104, 0xABCD,
2239 0x063, 0x000110E9,
2240 0xFF0F0204, 0xCDEF,
2241 0x063, 0x000110E9,
2242 0xFF0F0404, 0xCDEF,
2243 0x063, 0x000110E9,
2244 0xFF0F0200, 0xCDEF,
2245 0x063, 0x000710E9,
2246 0xFF0F02C0, 0xCDEF,
2247 0x063, 0x000110E9,
2248 0xCDCDCDCD, 0xCDCD,
2249 0x063, 0x000714E9,
2250 0xFF0F0104, 0xDEAD,
2251 0xFF0F0104, 0xABCD,
2252 0x064, 0x0001C27C,
2253 0xFF0F0204, 0xCDEF,
2254 0x064, 0x0001C27C,
2255 0xFF0F0404, 0xCDEF,
2256 0x064, 0x0001C27C,
2257 0xCDCDCDCD, 0xCDCD,
2258 0x064, 0x0001C67C,
2259 0xFF0F0104, 0xDEAD,
2260 0xFF0F0200, 0xABCD,
2261 0x065, 0x00093016,
2262 0xFF0F02C0, 0xCDEF,
2263 0x065, 0x00093015,
2264 0xCDCDCDCD, 0xCDCD,
2265 0x065, 0x00091016,
2266 0xFF0F0200, 0xDEAD,
2267 0x018, 0x00000006,
2268 0x0EF, 0x00002000,
2269 0x03B, 0x0003824B,
2270 0x03B, 0x0003024B,
2271 0x03B, 0x0002844B,
2272 0x03B, 0x00020F4B,
2273 0x03B, 0x00018F4B,
2274 0x03B, 0x000104B2,
2275 0x03B, 0x00008049,
2276 0x03B, 0x00000148,
2277 0x03B, 0x0007824B,
2278 0x03B, 0x0007024B,
2279 0x03B, 0x0006824B,
2280 0x03B, 0x00060F4B,
2281 0x03B, 0x00058F4B,
2282 0x03B, 0x000504B2,
2283 0x03B, 0x00048049,
2284 0x03B, 0x00040148,
2285 0x0EF, 0x00000000,
2286 0x0EF, 0x00000100,
2287 0x034, 0x0000ADF3,
2288 0x034, 0x00009DEF,
2289 0x034, 0x00008DEC,
2290 0x034, 0x00007DE9,
2291 0x034, 0x00006CED,
2292 0x034, 0x00005CE9,
2293 0x034, 0x000044E9,
2294 0x034, 0x000034E6,
2295 0x034, 0x0000246A,
2296 0x034, 0x00001467,
2297 0x034, 0x00000068,
2298 0x0EF, 0x00000000,
2299 0x0ED, 0x00000010,
2300 0x044, 0x0000ADF2,
2301 0x044, 0x00009DEF,
2302 0x044, 0x00008DEC,
2303 0x044, 0x00007DE9,
2304 0x044, 0x00006CEC,
2305 0x044, 0x00005CE9,
2306 0x044, 0x000044EC,
2307 0x044, 0x000034E9,
2308 0x044, 0x0000246C,
2309 0x044, 0x00001469,
2310 0x044, 0x0000006C,
2311 0x0ED, 0x00000000,
2312 0x0ED, 0x00000001,
2313 0x040, 0x00038DA7,
2314 0x040, 0x000300C2,
2315 0x040, 0x000288E2,
2316 0x040, 0x000200B8,
2317 0x040, 0x000188A5,
2318 0x040, 0x00010FBC,
2319 0x040, 0x00008F71,
2320 0x040, 0x00000240,
2321 0x0ED, 0x00000000,
2322 0x0EF, 0x000020A2,
2323 0x0DF, 0x00000080,
2324 0x035, 0x00000120,
2325 0x035, 0x00008120,
2326 0x035, 0x00010120,
2327 0x036, 0x00000085,
2328 0x036, 0x00008085,
2329 0x036, 0x00010085,
2330 0x036, 0x00018085,
2331 0x0EF, 0x00000000,
2332 0x051, 0x00000C31,
2333 0x052, 0x00000622,
2334 0x053, 0x000FC70B,
2335 0x054, 0x0000017E,
2336 0x056, 0x00051DF3,
2337 0x051, 0x00000C01,
2338 0x052, 0x000006D6,
2339 0x053, 0x000FC649,
2340 0x070, 0x00049661,
2341 0x071, 0x0007843E,
2342 0x072, 0x00000382,
2343 0x074, 0x00051400,
2344 0x035, 0x00000160,
2345 0x035, 0x00008160,
2346 0x035, 0x00010160,
2347 0x036, 0x00000124,
2348 0x036, 0x00008124,
2349 0x036, 0x00010124,
2350 0x036, 0x00018124,
2351 0x0ED, 0x0000000C,
2352 0x045, 0x00000140,
2353 0x045, 0x00008140,
2354 0x045, 0x00010140,
2355 0x046, 0x00000124,
2356 0x046, 0x00008124,
2357 0x046, 0x00010124,
2358 0x046, 0x00018124,
2359 0x0DF, 0x00000088,
2360 0x0B3, 0x000F0E18,
2361 0x0B4, 0x0001214C,
2362 0x0B7, 0x0003000C,
2363 0x01C, 0x000539D2,
2364 0x018, 0x0001F12A,
2365 0x0FE, 0x00000000,
2366 0x0FE, 0x00000000,
2367 0x018, 0x0001712A,
2368};
2369
2370u32 RTL8812AE_MAC_REG_ARRAY[] = {
2371 0x010, 0x0000000C,
2372 0xFF0F0180, 0xABCD,
2373 0x025, 0x0000000F,
2374 0xFF0F01C0, 0xCDEF,
2375 0x025, 0x0000000F,
2376 0xCDCDCDCD, 0xCDCD,
2377 0x025, 0x0000006F,
2378 0xFF0F0180, 0xDEAD,
2379 0x072, 0x00000000,
2380 0x428, 0x0000000A,
2381 0x429, 0x00000010,
2382 0x430, 0x00000000,
2383 0x431, 0x00000000,
2384 0x432, 0x00000000,
2385 0x433, 0x00000001,
2386 0x434, 0x00000004,
2387 0x435, 0x00000005,
2388 0x436, 0x00000007,
2389 0x437, 0x00000008,
2390 0x43C, 0x00000004,
2391 0x43D, 0x00000005,
2392 0x43E, 0x00000007,
2393 0x43F, 0x00000008,
2394 0x440, 0x0000005D,
2395 0x441, 0x00000001,
2396 0x442, 0x00000000,
2397 0x444, 0x00000010,
2398 0x445, 0x00000000,
2399 0x446, 0x00000000,
2400 0x447, 0x00000000,
2401 0x448, 0x00000000,
2402 0x449, 0x000000F0,
2403 0x44A, 0x0000000F,
2404 0x44B, 0x0000003E,
2405 0x44C, 0x00000010,
2406 0x44D, 0x00000000,
2407 0x44E, 0x00000000,
2408 0x44F, 0x00000000,
2409 0x450, 0x00000000,
2410 0x451, 0x000000F0,
2411 0x452, 0x0000000F,
2412 0x453, 0x00000000,
2413 0x45B, 0x00000080,
2414 0x460, 0x00000066,
2415 0x461, 0x00000066,
2416 0x4C8, 0x000000FF,
2417 0x4C9, 0x00000008,
2418 0x4CC, 0x000000FF,
2419 0x4CD, 0x000000FF,
2420 0x4CE, 0x00000001,
2421 0x500, 0x00000026,
2422 0x501, 0x000000A2,
2423 0x502, 0x0000002F,
2424 0x503, 0x00000000,
2425 0x504, 0x00000028,
2426 0x505, 0x000000A3,
2427 0x506, 0x0000005E,
2428 0x507, 0x00000000,
2429 0x508, 0x0000002B,
2430 0x509, 0x000000A4,
2431 0x50A, 0x0000005E,
2432 0x50B, 0x00000000,
2433 0x50C, 0x0000004F,
2434 0x50D, 0x000000A4,
2435 0x50E, 0x00000000,
2436 0x50F, 0x00000000,
2437 0x512, 0x0000001C,
2438 0x514, 0x0000000A,
2439 0x516, 0x0000000A,
2440 0x525, 0x0000004F,
2441 0x550, 0x00000010,
2442 0x551, 0x00000010,
2443 0x559, 0x00000002,
2444 0x55C, 0x00000050,
2445 0x55D, 0x000000FF,
2446 0x604, 0x00000001,
2447 0x605, 0x00000030,
2448 0x607, 0x00000003,
2449 0x608, 0x0000000E,
2450 0x609, 0x0000002A,
2451 0x620, 0x000000FF,
2452 0x621, 0x000000FF,
2453 0x622, 0x000000FF,
2454 0x623, 0x000000FF,
2455 0x624, 0x000000FF,
2456 0x625, 0x000000FF,
2457 0x626, 0x000000FF,
2458 0x627, 0x000000FF,
2459 0x638, 0x00000050,
2460 0x63C, 0x0000000A,
2461 0x63D, 0x0000000A,
2462 0x63E, 0x0000000E,
2463 0x63F, 0x0000000E,
2464 0x640, 0x00000080,
2465 0x642, 0x00000040,
2466 0x643, 0x00000000,
2467 0x652, 0x000000C8,
2468 0x66E, 0x00000005,
2469 0x700, 0x00000021,
2470 0x701, 0x00000043,
2471 0x702, 0x00000065,
2472 0x703, 0x00000087,
2473 0x708, 0x00000021,
2474 0x709, 0x00000043,
2475 0x70A, 0x00000065,
2476 0x70B, 0x00000087,
2477 0x718, 0x00000040,
2478
2479};
2480
2481u32 RTL8821AE_MAC_REG_ARRAY[] = {
2482 0x428, 0x0000000A,
2483 0x429, 0x00000010,
2484 0x430, 0x00000000,
2485 0x431, 0x00000000,
2486 0x432, 0x00000000,
2487 0x433, 0x00000001,
2488 0x434, 0x00000004,
2489 0x435, 0x00000005,
2490 0x436, 0x00000007,
2491 0x437, 0x00000008,
2492 0x43C, 0x00000004,
2493 0x43D, 0x00000005,
2494 0x43E, 0x00000007,
2495 0x43F, 0x00000008,
2496 0x440, 0x0000005D,
2497 0x441, 0x00000001,
2498 0x442, 0x00000000,
2499 0x444, 0x00000010,
2500 0x445, 0x00000000,
2501 0x446, 0x00000000,
2502 0x447, 0x00000000,
2503 0x448, 0x00000000,
2504 0x449, 0x000000F0,
2505 0x44A, 0x0000000F,
2506 0x44B, 0x0000003E,
2507 0x44C, 0x00000010,
2508 0x44D, 0x00000000,
2509 0x44E, 0x00000000,
2510 0x44F, 0x00000000,
2511 0x450, 0x00000000,
2512 0x451, 0x000000F0,
2513 0x452, 0x0000000F,
2514 0x453, 0x00000000,
2515 0x456, 0x0000005E,
2516 0x460, 0x00000066,
2517 0x461, 0x00000066,
2518 0x4C8, 0x0000003F,
2519 0x4C9, 0x000000FF,
2520 0x4CC, 0x000000FF,
2521 0x4CD, 0x000000FF,
2522 0x4CE, 0x00000001,
2523 0x500, 0x00000026,
2524 0x501, 0x000000A2,
2525 0x502, 0x0000002F,
2526 0x503, 0x00000000,
2527 0x504, 0x00000028,
2528 0x505, 0x000000A3,
2529 0x506, 0x0000005E,
2530 0x507, 0x00000000,
2531 0x508, 0x0000002B,
2532 0x509, 0x000000A4,
2533 0x50A, 0x0000005E,
2534 0x50B, 0x00000000,
2535 0x50C, 0x0000004F,
2536 0x50D, 0x000000A4,
2537 0x50E, 0x00000000,
2538 0x50F, 0x00000000,
2539 0x512, 0x0000001C,
2540 0x514, 0x0000000A,
2541 0x516, 0x0000000A,
2542 0x525, 0x0000004F,
2543 0x550, 0x00000010,
2544 0x551, 0x00000010,
2545 0x559, 0x00000002,
2546 0x55C, 0x00000050,
2547 0x55D, 0x000000FF,
2548 0x605, 0x00000030,
2549 0x607, 0x00000007,
2550 0x608, 0x0000000E,
2551 0x609, 0x0000002A,
2552 0x620, 0x000000FF,
2553 0x621, 0x000000FF,
2554 0x622, 0x000000FF,
2555 0x623, 0x000000FF,
2556 0x624, 0x000000FF,
2557 0x625, 0x000000FF,
2558 0x626, 0x000000FF,
2559 0x627, 0x000000FF,
2560 0x638, 0x00000050,
2561 0x63C, 0x0000000A,
2562 0x63D, 0x0000000A,
2563 0x63E, 0x0000000E,
2564 0x63F, 0x0000000E,
2565 0x640, 0x00000040,
2566 0x642, 0x00000040,
2567 0x643, 0x00000000,
2568 0x652, 0x000000C8,
2569 0x66E, 0x00000005,
2570 0x700, 0x00000021,
2571 0x701, 0x00000043,
2572 0x702, 0x00000065,
2573 0x703, 0x00000087,
2574 0x708, 0x00000021,
2575 0x709, 0x00000043,
2576 0x70A, 0x00000065,
2577 0x70B, 0x00000087,
2578 0x718, 0x00000040,
2579};
2580
2581u32 RTL8812AE_AGC_TAB_ARRAY[] = {
2582 0xFF0F07D8, 0xABCD,
2583 0x81C, 0xFC000001,
2584 0x81C, 0xFB020001,
2585 0x81C, 0xFA040001,
2586 0x81C, 0xF9060001,
2587 0x81C, 0xF8080001,
2588 0x81C, 0xF70A0001,
2589 0x81C, 0xF60C0001,
2590 0x81C, 0xF50E0001,
2591 0x81C, 0xF4100001,
2592 0x81C, 0xF3120001,
2593 0x81C, 0xF2140001,
2594 0x81C, 0xF1160001,
2595 0x81C, 0xF0180001,
2596 0x81C, 0xEF1A0001,
2597 0x81C, 0xEE1C0001,
2598 0x81C, 0xED1E0001,
2599 0x81C, 0xEC200001,
2600 0x81C, 0xEB220001,
2601 0x81C, 0xEA240001,
2602 0x81C, 0xCD260001,
2603 0x81C, 0xCC280001,
2604 0x81C, 0xCB2A0001,
2605 0x81C, 0xCA2C0001,
2606 0x81C, 0xC92E0001,
2607 0x81C, 0xC8300001,
2608 0x81C, 0xA6320001,
2609 0x81C, 0xA5340001,
2610 0x81C, 0xA4360001,
2611 0x81C, 0xA3380001,
2612 0x81C, 0xA23A0001,
2613 0x81C, 0x883C0001,
2614 0x81C, 0x873E0001,
2615 0x81C, 0x86400001,
2616 0x81C, 0x85420001,
2617 0x81C, 0x84440001,
2618 0x81C, 0x83460001,
2619 0x81C, 0x82480001,
2620 0x81C, 0x814A0001,
2621 0x81C, 0x484C0001,
2622 0x81C, 0x474E0001,
2623 0x81C, 0x46500001,
2624 0x81C, 0x45520001,
2625 0x81C, 0x44540001,
2626 0x81C, 0x43560001,
2627 0x81C, 0x42580001,
2628 0x81C, 0x415A0001,
2629 0x81C, 0x255C0001,
2630 0x81C, 0x245E0001,
2631 0x81C, 0x23600001,
2632 0x81C, 0x22620001,
2633 0x81C, 0x21640001,
2634 0x81C, 0x21660001,
2635 0x81C, 0x21680001,
2636 0x81C, 0x216A0001,
2637 0x81C, 0x216C0001,
2638 0x81C, 0x216E0001,
2639 0x81C, 0x21700001,
2640 0x81C, 0x21720001,
2641 0x81C, 0x21740001,
2642 0x81C, 0x21760001,
2643 0x81C, 0x21780001,
2644 0x81C, 0x217A0001,
2645 0x81C, 0x217C0001,
2646 0x81C, 0x217E0001,
2647 0xFF0F07D0, 0xCDEF,
2648 0x81C, 0xF9000001,
2649 0x81C, 0xF8020001,
2650 0x81C, 0xF7040001,
2651 0x81C, 0xF6060001,
2652 0x81C, 0xF5080001,
2653 0x81C, 0xF40A0001,
2654 0x81C, 0xF30C0001,
2655 0x81C, 0xF20E0001,
2656 0x81C, 0xF1100001,
2657 0x81C, 0xF0120001,
2658 0x81C, 0xEF140001,
2659 0x81C, 0xEE160001,
2660 0x81C, 0xED180001,
2661 0x81C, 0xEC1A0001,
2662 0x81C, 0xEB1C0001,
2663 0x81C, 0xEA1E0001,
2664 0x81C, 0xCD200001,
2665 0x81C, 0xCC220001,
2666 0x81C, 0xCB240001,
2667 0x81C, 0xCA260001,
2668 0x81C, 0xC9280001,
2669 0x81C, 0xC82A0001,
2670 0x81C, 0xC72C0001,
2671 0x81C, 0xC62E0001,
2672 0x81C, 0xA5300001,
2673 0x81C, 0xA4320001,
2674 0x81C, 0xA3340001,
2675 0x81C, 0xA2360001,
2676 0x81C, 0x88380001,
2677 0x81C, 0x873A0001,
2678 0x81C, 0x863C0001,
2679 0x81C, 0x853E0001,
2680 0x81C, 0x84400001,
2681 0x81C, 0x83420001,
2682 0x81C, 0x82440001,
2683 0x81C, 0x81460001,
2684 0x81C, 0x48480001,
2685 0x81C, 0x474A0001,
2686 0x81C, 0x464C0001,
2687 0x81C, 0x454E0001,
2688 0x81C, 0x44500001,
2689 0x81C, 0x43520001,
2690 0x81C, 0x42540001,
2691 0x81C, 0x41560001,
2692 0x81C, 0x25580001,
2693 0x81C, 0x245A0001,
2694 0x81C, 0x235C0001,
2695 0x81C, 0x225E0001,
2696 0x81C, 0x21600001,
2697 0x81C, 0x21620001,
2698 0x81C, 0x21640001,
2699 0x81C, 0x21660001,
2700 0x81C, 0x21680001,
2701 0x81C, 0x216A0001,
2702 0x81C, 0x236C0001,
2703 0x81C, 0x226E0001,
2704 0x81C, 0x21700001,
2705 0x81C, 0x21720001,
2706 0x81C, 0x21740001,
2707 0x81C, 0x21760001,
2708 0x81C, 0x21780001,
2709 0x81C, 0x217A0001,
2710 0x81C, 0x217C0001,
2711 0x81C, 0x217E0001,
2712 0xCDCDCDCD, 0xCDCD,
2713 0x81C, 0xFF000001,
2714 0x81C, 0xFF020001,
2715 0x81C, 0xFF040001,
2716 0x81C, 0xFF060001,
2717 0x81C, 0xFF080001,
2718 0x81C, 0xFE0A0001,
2719 0x81C, 0xFD0C0001,
2720 0x81C, 0xFC0E0001,
2721 0x81C, 0xFB100001,
2722 0x81C, 0xFA120001,
2723 0x81C, 0xF9140001,
2724 0x81C, 0xF8160001,
2725 0x81C, 0xF7180001,
2726 0x81C, 0xF61A0001,
2727 0x81C, 0xF51C0001,
2728 0x81C, 0xF41E0001,
2729 0x81C, 0xF3200001,
2730 0x81C, 0xF2220001,
2731 0x81C, 0xF1240001,
2732 0x81C, 0xF0260001,
2733 0x81C, 0xEF280001,
2734 0x81C, 0xEE2A0001,
2735 0x81C, 0xED2C0001,
2736 0x81C, 0xEC2E0001,
2737 0x81C, 0xEB300001,
2738 0x81C, 0xEA320001,
2739 0x81C, 0xE9340001,
2740 0x81C, 0xE8360001,
2741 0x81C, 0xE7380001,
2742 0x81C, 0xE63A0001,
2743 0x81C, 0xE53C0001,
2744 0x81C, 0xC73E0001,
2745 0x81C, 0xC6400001,
2746 0x81C, 0xC5420001,
2747 0x81C, 0xC4440001,
2748 0x81C, 0xC3460001,
2749 0x81C, 0xC2480001,
2750 0x81C, 0xC14A0001,
2751 0x81C, 0xA74C0001,
2752 0x81C, 0xA64E0001,
2753 0x81C, 0xA5500001,
2754 0x81C, 0xA4520001,
2755 0x81C, 0xA3540001,
2756 0x81C, 0xA2560001,
2757 0x81C, 0xA1580001,
2758 0x81C, 0x675A0001,
2759 0x81C, 0x665C0001,
2760 0x81C, 0x655E0001,
2761 0x81C, 0x64600001,
2762 0x81C, 0x63620001,
2763 0x81C, 0x48640001,
2764 0x81C, 0x47660001,
2765 0x81C, 0x46680001,
2766 0x81C, 0x456A0001,
2767 0x81C, 0x446C0001,
2768 0x81C, 0x436E0001,
2769 0x81C, 0x42700001,
2770 0x81C, 0x41720001,
2771 0x81C, 0x41740001,
2772 0x81C, 0x41760001,
2773 0x81C, 0x41780001,
2774 0x81C, 0x417A0001,
2775 0x81C, 0x417C0001,
2776 0x81C, 0x417E0001,
2777 0xFF0F07D8, 0xDEAD,
2778 0xFF0F0180, 0xABCD,
2779 0x81C, 0xFC800001,
2780 0x81C, 0xFB820001,
2781 0x81C, 0xFA840001,
2782 0x81C, 0xF9860001,
2783 0x81C, 0xF8880001,
2784 0x81C, 0xF78A0001,
2785 0x81C, 0xF68C0001,
2786 0x81C, 0xF58E0001,
2787 0x81C, 0xF4900001,
2788 0x81C, 0xF3920001,
2789 0x81C, 0xF2940001,
2790 0x81C, 0xF1960001,
2791 0x81C, 0xF0980001,
2792 0x81C, 0xEF9A0001,
2793 0x81C, 0xEE9C0001,
2794 0x81C, 0xED9E0001,
2795 0x81C, 0xECA00001,
2796 0x81C, 0xEBA20001,
2797 0x81C, 0xEAA40001,
2798 0x81C, 0xE9A60001,
2799 0x81C, 0xE8A80001,
2800 0x81C, 0xE7AA0001,
2801 0x81C, 0xE6AC0001,
2802 0x81C, 0xE5AE0001,
2803 0x81C, 0xE4B00001,
2804 0x81C, 0xE3B20001,
2805 0x81C, 0xA8B40001,
2806 0x81C, 0xA7B60001,
2807 0x81C, 0xA6B80001,
2808 0x81C, 0xA5BA0001,
2809 0x81C, 0xA4BC0001,
2810 0x81C, 0xA3BE0001,
2811 0x81C, 0xA2C00001,
2812 0x81C, 0xA1C20001,
2813 0x81C, 0x68C40001,
2814 0x81C, 0x67C60001,
2815 0x81C, 0x66C80001,
2816 0x81C, 0x65CA0001,
2817 0x81C, 0x64CC0001,
2818 0x81C, 0x47CE0001,
2819 0x81C, 0x46D00001,
2820 0x81C, 0x45D20001,
2821 0x81C, 0x44D40001,
2822 0x81C, 0x43D60001,
2823 0x81C, 0x42D80001,
2824 0x81C, 0x08DA0001,
2825 0x81C, 0x07DC0001,
2826 0x81C, 0x06DE0001,
2827 0x81C, 0x05E00001,
2828 0x81C, 0x04E20001,
2829 0x81C, 0x03E40001,
2830 0x81C, 0x02E60001,
2831 0x81C, 0x01E80001,
2832 0x81C, 0x01EA0001,
2833 0x81C, 0x01EC0001,
2834 0x81C, 0x01EE0001,
2835 0x81C, 0x01F00001,
2836 0x81C, 0x01F20001,
2837 0x81C, 0x01F40001,
2838 0x81C, 0x01F60001,
2839 0x81C, 0x01F80001,
2840 0x81C, 0x01FA0001,
2841 0x81C, 0x01FC0001,
2842 0x81C, 0x01FE0001,
2843 0xFF0F0280, 0xCDEF,
2844 0x81C, 0xFC800001,
2845 0x81C, 0xFB820001,
2846 0x81C, 0xFA840001,
2847 0x81C, 0xF9860001,
2848 0x81C, 0xF8880001,
2849 0x81C, 0xF78A0001,
2850 0x81C, 0xF68C0001,
2851 0x81C, 0xF58E0001,
2852 0x81C, 0xF4900001,
2853 0x81C, 0xF3920001,
2854 0x81C, 0xF2940001,
2855 0x81C, 0xF1960001,
2856 0x81C, 0xF0980001,
2857 0x81C, 0xEF9A0001,
2858 0x81C, 0xEE9C0001,
2859 0x81C, 0xED9E0001,
2860 0x81C, 0xECA00001,
2861 0x81C, 0xEBA20001,
2862 0x81C, 0xEAA40001,
2863 0x81C, 0xE9A60001,
2864 0x81C, 0xE8A80001,
2865 0x81C, 0xE7AA0001,
2866 0x81C, 0xE6AC0001,
2867 0x81C, 0xE5AE0001,
2868 0x81C, 0xE4B00001,
2869 0x81C, 0xE3B20001,
2870 0x81C, 0xA8B40001,
2871 0x81C, 0xA7B60001,
2872 0x81C, 0xA6B80001,
2873 0x81C, 0xA5BA0001,
2874 0x81C, 0xA4BC0001,
2875 0x81C, 0xA3BE0001,
2876 0x81C, 0xA2C00001,
2877 0x81C, 0xA1C20001,
2878 0x81C, 0x68C40001,
2879 0x81C, 0x67C60001,
2880 0x81C, 0x66C80001,
2881 0x81C, 0x65CA0001,
2882 0x81C, 0x64CC0001,
2883 0x81C, 0x47CE0001,
2884 0x81C, 0x46D00001,
2885 0x81C, 0x45D20001,
2886 0x81C, 0x44D40001,
2887 0x81C, 0x43D60001,
2888 0x81C, 0x42D80001,
2889 0x81C, 0x08DA0001,
2890 0x81C, 0x07DC0001,
2891 0x81C, 0x06DE0001,
2892 0x81C, 0x05E00001,
2893 0x81C, 0x04E20001,
2894 0x81C, 0x03E40001,
2895 0x81C, 0x02E60001,
2896 0x81C, 0x01E80001,
2897 0x81C, 0x01EA0001,
2898 0x81C, 0x01EC0001,
2899 0x81C, 0x01EE0001,
2900 0x81C, 0x01F00001,
2901 0x81C, 0x01F20001,
2902 0x81C, 0x01F40001,
2903 0x81C, 0x01F60001,
2904 0x81C, 0x01F80001,
2905 0x81C, 0x01FA0001,
2906 0x81C, 0x01FC0001,
2907 0x81C, 0x01FE0001,
2908 0xFF0F01C0, 0xCDEF,
2909 0x81C, 0xFC800001,
2910 0x81C, 0xFB820001,
2911 0x81C, 0xFA840001,
2912 0x81C, 0xF9860001,
2913 0x81C, 0xF8880001,
2914 0x81C, 0xF78A0001,
2915 0x81C, 0xF68C0001,
2916 0x81C, 0xF58E0001,
2917 0x81C, 0xF4900001,
2918 0x81C, 0xF3920001,
2919 0x81C, 0xF2940001,
2920 0x81C, 0xF1960001,
2921 0x81C, 0xF0980001,
2922 0x81C, 0xEF9A0001,
2923 0x81C, 0xEE9C0001,
2924 0x81C, 0xED9E0001,
2925 0x81C, 0xECA00001,
2926 0x81C, 0xEBA20001,
2927 0x81C, 0xEAA40001,
2928 0x81C, 0xE9A60001,
2929 0x81C, 0xE8A80001,
2930 0x81C, 0xE7AA0001,
2931 0x81C, 0xE6AC0001,
2932 0x81C, 0xE5AE0001,
2933 0x81C, 0xE4B00001,
2934 0x81C, 0xE3B20001,
2935 0x81C, 0xA8B40001,
2936 0x81C, 0xA7B60001,
2937 0x81C, 0xA6B80001,
2938 0x81C, 0xA5BA0001,
2939 0x81C, 0xA4BC0001,
2940 0x81C, 0xA3BE0001,
2941 0x81C, 0xA2C00001,
2942 0x81C, 0xA1C20001,
2943 0x81C, 0x68C40001,
2944 0x81C, 0x67C60001,
2945 0x81C, 0x66C80001,
2946 0x81C, 0x65CA0001,
2947 0x81C, 0x64CC0001,
2948 0x81C, 0x47CE0001,
2949 0x81C, 0x46D00001,
2950 0x81C, 0x45D20001,
2951 0x81C, 0x44D40001,
2952 0x81C, 0x43D60001,
2953 0x81C, 0x42D80001,
2954 0x81C, 0x08DA0001,
2955 0x81C, 0x07DC0001,
2956 0x81C, 0x06DE0001,
2957 0x81C, 0x05E00001,
2958 0x81C, 0x04E20001,
2959 0x81C, 0x03E40001,
2960 0x81C, 0x02E60001,
2961 0x81C, 0x01E80001,
2962 0x81C, 0x01EA0001,
2963 0x81C, 0x01EC0001,
2964 0x81C, 0x01EE0001,
2965 0x81C, 0x01F00001,
2966 0x81C, 0x01F20001,
2967 0x81C, 0x01F40001,
2968 0x81C, 0x01F60001,
2969 0x81C, 0x01F80001,
2970 0x81C, 0x01FA0001,
2971 0x81C, 0x01FC0001,
2972 0x81C, 0x01FE0001,
2973 0xFF0F02C0, 0xCDEF,
2974 0x81C, 0xFC800001,
2975 0x81C, 0xFB820001,
2976 0x81C, 0xFA840001,
2977 0x81C, 0xF9860001,
2978 0x81C, 0xF8880001,
2979 0x81C, 0xF78A0001,
2980 0x81C, 0xF68C0001,
2981 0x81C, 0xF58E0001,
2982 0x81C, 0xF4900001,
2983 0x81C, 0xF3920001,
2984 0x81C, 0xF2940001,
2985 0x81C, 0xF1960001,
2986 0x81C, 0xF0980001,
2987 0x81C, 0xEF9A0001,
2988 0x81C, 0xEE9C0001,
2989 0x81C, 0xED9E0001,
2990 0x81C, 0xECA00001,
2991 0x81C, 0xEBA20001,
2992 0x81C, 0xEAA40001,
2993 0x81C, 0xE9A60001,
2994 0x81C, 0xE8A80001,
2995 0x81C, 0xE7AA0001,
2996 0x81C, 0xE6AC0001,
2997 0x81C, 0xE5AE0001,
2998 0x81C, 0xE4B00001,
2999 0x81C, 0xE3B20001,
3000 0x81C, 0xA8B40001,
3001 0x81C, 0xA7B60001,
3002 0x81C, 0xA6B80001,
3003 0x81C, 0xA5BA0001,
3004 0x81C, 0xA4BC0001,
3005 0x81C, 0xA3BE0001,
3006 0x81C, 0xA2C00001,
3007 0x81C, 0xA1C20001,
3008 0x81C, 0x68C40001,
3009 0x81C, 0x67C60001,
3010 0x81C, 0x66C80001,
3011 0x81C, 0x65CA0001,
3012 0x81C, 0x64CC0001,
3013 0x81C, 0x47CE0001,
3014 0x81C, 0x46D00001,
3015 0x81C, 0x45D20001,
3016 0x81C, 0x44D40001,
3017 0x81C, 0x43D60001,
3018 0x81C, 0x42D80001,
3019 0x81C, 0x08DA0001,
3020 0x81C, 0x07DC0001,
3021 0x81C, 0x06DE0001,
3022 0x81C, 0x05E00001,
3023 0x81C, 0x04E20001,
3024 0x81C, 0x03E40001,
3025 0x81C, 0x02E60001,
3026 0x81C, 0x01E80001,
3027 0x81C, 0x01EA0001,
3028 0x81C, 0x01EC0001,
3029 0x81C, 0x01EE0001,
3030 0x81C, 0x01F00001,
3031 0x81C, 0x01F20001,
3032 0x81C, 0x01F40001,
3033 0x81C, 0x01F60001,
3034 0x81C, 0x01F80001,
3035 0x81C, 0x01FA0001,
3036 0x81C, 0x01FC0001,
3037 0x81C, 0x01FE0001,
3038 0xFF0F07D8, 0xCDEF,
3039 0x81C, 0xFC800001,
3040 0x81C, 0xFB820001,
3041 0x81C, 0xFA840001,
3042 0x81C, 0xF9860001,
3043 0x81C, 0xF8880001,
3044 0x81C, 0xF78A0001,
3045 0x81C, 0xF68C0001,
3046 0x81C, 0xF58E0001,
3047 0x81C, 0xF4900001,
3048 0x81C, 0xF3920001,
3049 0x81C, 0xF2940001,
3050 0x81C, 0xF1960001,
3051 0x81C, 0xF0980001,
3052 0x81C, 0xEF9A0001,
3053 0x81C, 0xEE9C0001,
3054 0x81C, 0xED9E0001,
3055 0x81C, 0xECA00001,
3056 0x81C, 0xEBA20001,
3057 0x81C, 0xEAA40001,
3058 0x81C, 0xE9A60001,
3059 0x81C, 0xE8A80001,
3060 0x81C, 0xE7AA0001,
3061 0x81C, 0xE6AC0001,
3062 0x81C, 0xE5AE0001,
3063 0x81C, 0xE4B00001,
3064 0x81C, 0xE3B20001,
3065 0x81C, 0xA8B40001,
3066 0x81C, 0xA7B60001,
3067 0x81C, 0xA6B80001,
3068 0x81C, 0xA5BA0001,
3069 0x81C, 0xA4BC0001,
3070 0x81C, 0xA3BE0001,
3071 0x81C, 0xA2C00001,
3072 0x81C, 0xA1C20001,
3073 0x81C, 0x68C40001,
3074 0x81C, 0x67C60001,
3075 0x81C, 0x66C80001,
3076 0x81C, 0x65CA0001,
3077 0x81C, 0x64CC0001,
3078 0x81C, 0x47CE0001,
3079 0x81C, 0x46D00001,
3080 0x81C, 0x45D20001,
3081 0x81C, 0x44D40001,
3082 0x81C, 0x43D60001,
3083 0x81C, 0x42D80001,
3084 0x81C, 0x08DA0001,
3085 0x81C, 0x07DC0001,
3086 0x81C, 0x06DE0001,
3087 0x81C, 0x05E00001,
3088 0x81C, 0x04E20001,
3089 0x81C, 0x03E40001,
3090 0x81C, 0x02E60001,
3091 0x81C, 0x01E80001,
3092 0x81C, 0x01EA0001,
3093 0x81C, 0x01EC0001,
3094 0x81C, 0x01EE0001,
3095 0x81C, 0x01F00001,
3096 0x81C, 0x01F20001,
3097 0x81C, 0x01F40001,
3098 0x81C, 0x01F60001,
3099 0x81C, 0x01F80001,
3100 0x81C, 0x01FA0001,
3101 0x81C, 0x01FC0001,
3102 0x81C, 0x01FE0001,
3103 0xFF0F07D0, 0xCDEF,
3104 0x81C, 0xFC800001,
3105 0x81C, 0xFB820001,
3106 0x81C, 0xFA840001,
3107 0x81C, 0xF9860001,
3108 0x81C, 0xF8880001,
3109 0x81C, 0xF78A0001,
3110 0x81C, 0xF68C0001,
3111 0x81C, 0xF58E0001,
3112 0x81C, 0xF4900001,
3113 0x81C, 0xF3920001,
3114 0x81C, 0xF2940001,
3115 0x81C, 0xF1960001,
3116 0x81C, 0xF0980001,
3117 0x81C, 0xEF9A0001,
3118 0x81C, 0xEE9C0001,
3119 0x81C, 0xED9E0001,
3120 0x81C, 0xECA00001,
3121 0x81C, 0xEBA20001,
3122 0x81C, 0xEAA40001,
3123 0x81C, 0xE9A60001,
3124 0x81C, 0xE8A80001,
3125 0x81C, 0xE7AA0001,
3126 0x81C, 0xE6AC0001,
3127 0x81C, 0xE5AE0001,
3128 0x81C, 0xE4B00001,
3129 0x81C, 0xE3B20001,
3130 0x81C, 0xA8B40001,
3131 0x81C, 0xA7B60001,
3132 0x81C, 0xA6B80001,
3133 0x81C, 0xA5BA0001,
3134 0x81C, 0xA4BC0001,
3135 0x81C, 0xA3BE0001,
3136 0x81C, 0xA2C00001,
3137 0x81C, 0xA1C20001,
3138 0x81C, 0x68C40001,
3139 0x81C, 0x67C60001,
3140 0x81C, 0x66C80001,
3141 0x81C, 0x65CA0001,
3142 0x81C, 0x64CC0001,
3143 0x81C, 0x47CE0001,
3144 0x81C, 0x46D00001,
3145 0x81C, 0x45D20001,
3146 0x81C, 0x44D40001,
3147 0x81C, 0x43D60001,
3148 0x81C, 0x42D80001,
3149 0x81C, 0x08DA0001,
3150 0x81C, 0x07DC0001,
3151 0x81C, 0x06DE0001,
3152 0x81C, 0x05E00001,
3153 0x81C, 0x04E20001,
3154 0x81C, 0x03E40001,
3155 0x81C, 0x02E60001,
3156 0x81C, 0x01E80001,
3157 0x81C, 0x01EA0001,
3158 0x81C, 0x01EC0001,
3159 0x81C, 0x01EE0001,
3160 0x81C, 0x01F00001,
3161 0x81C, 0x01F20001,
3162 0x81C, 0x01F40001,
3163 0x81C, 0x01F60001,
3164 0x81C, 0x01F80001,
3165 0x81C, 0x01FA0001,
3166 0x81C, 0x01FC0001,
3167 0x81C, 0x01FE0001,
3168 0xCDCDCDCD, 0xCDCD,
3169 0x81C, 0xFF800001,
3170 0x81C, 0xFF820001,
3171 0x81C, 0xFF840001,
3172 0x81C, 0xFE860001,
3173 0x81C, 0xFD880001,
3174 0x81C, 0xFC8A0001,
3175 0x81C, 0xFB8C0001,
3176 0x81C, 0xFA8E0001,
3177 0x81C, 0xF9900001,
3178 0x81C, 0xF8920001,
3179 0x81C, 0xF7940001,
3180 0x81C, 0xF6960001,
3181 0x81C, 0xF5980001,
3182 0x81C, 0xF49A0001,
3183 0x81C, 0xF39C0001,
3184 0x81C, 0xF29E0001,
3185 0x81C, 0xF1A00001,
3186 0x81C, 0xF0A20001,
3187 0x81C, 0xEFA40001,
3188 0x81C, 0xEEA60001,
3189 0x81C, 0xEDA80001,
3190 0x81C, 0xECAA0001,
3191 0x81C, 0xEBAC0001,
3192 0x81C, 0xEAAE0001,
3193 0x81C, 0xE9B00001,
3194 0x81C, 0xE8B20001,
3195 0x81C, 0xE7B40001,
3196 0x81C, 0xE6B60001,
3197 0x81C, 0xE5B80001,
3198 0x81C, 0xE4BA0001,
3199 0x81C, 0xE3BC0001,
3200 0x81C, 0xA8BE0001,
3201 0x81C, 0xA7C00001,
3202 0x81C, 0xA6C20001,
3203 0x81C, 0xA5C40001,
3204 0x81C, 0xA4C60001,
3205 0x81C, 0xA3C80001,
3206 0x81C, 0xA2CA0001,
3207 0x81C, 0xA1CC0001,
3208 0x81C, 0x68CE0001,
3209 0x81C, 0x67D00001,
3210 0x81C, 0x66D20001,
3211 0x81C, 0x65D40001,
3212 0x81C, 0x64D60001,
3213 0x81C, 0x47D80001,
3214 0x81C, 0x46DA0001,
3215 0x81C, 0x45DC0001,
3216 0x81C, 0x44DE0001,
3217 0x81C, 0x43E00001,
3218 0x81C, 0x42E20001,
3219 0x81C, 0x08E40001,
3220 0x81C, 0x07E60001,
3221 0x81C, 0x06E80001,
3222 0x81C, 0x05EA0001,
3223 0x81C, 0x04EC0001,
3224 0x81C, 0x03EE0001,
3225 0x81C, 0x02F00001,
3226 0x81C, 0x01F20001,
3227 0x81C, 0x01F40001,
3228 0x81C, 0x01F60001,
3229 0x81C, 0x01F80001,
3230 0x81C, 0x01FA0001,
3231 0x81C, 0x01FC0001,
3232 0x81C, 0x01FE0001,
3233 0xFF0F0180, 0xDEAD,
3234 0xC50, 0x00000022,
3235 0xC50, 0x00000020,
3236 0xE50, 0x00000022,
3237 0xE50, 0x00000020,
3238
3239};
3240
3241u32 RTL8821AE_AGC_TAB_ARRAY[] = {
3242 0x81C, 0xBF000001,
3243 0x81C, 0xBF020001,
3244 0x81C, 0xBF040001,
3245 0x81C, 0xBF060001,
3246 0x81C, 0xBE080001,
3247 0x81C, 0xBD0A0001,
3248 0x81C, 0xBC0C0001,
3249 0x81C, 0xBA0E0001,
3250 0x81C, 0xB9100001,
3251 0x81C, 0xB8120001,
3252 0x81C, 0xB7140001,
3253 0x81C, 0xB6160001,
3254 0x81C, 0xB5180001,
3255 0x81C, 0xB41A0001,
3256 0x81C, 0xB31C0001,
3257 0x81C, 0xB21E0001,
3258 0x81C, 0xB1200001,
3259 0x81C, 0xB0220001,
3260 0x81C, 0xAF240001,
3261 0x81C, 0xAE260001,
3262 0x81C, 0xAD280001,
3263 0x81C, 0xAC2A0001,
3264 0x81C, 0xAB2C0001,
3265 0x81C, 0xAA2E0001,
3266 0x81C, 0xA9300001,
3267 0x81C, 0xA8320001,
3268 0x81C, 0xA7340001,
3269 0x81C, 0xA6360001,
3270 0x81C, 0xA5380001,
3271 0x81C, 0xA43A0001,
3272 0x81C, 0xA33C0001,
3273 0x81C, 0x673E0001,
3274 0x81C, 0x66400001,
3275 0x81C, 0x65420001,
3276 0x81C, 0x64440001,
3277 0x81C, 0x63460001,
3278 0x81C, 0x62480001,
3279 0x81C, 0x614A0001,
3280 0x81C, 0x474C0001,
3281 0x81C, 0x464E0001,
3282 0x81C, 0x45500001,
3283 0x81C, 0x44520001,
3284 0x81C, 0x43540001,
3285 0x81C, 0x42560001,
3286 0x81C, 0x41580001,
3287 0x81C, 0x285A0001,
3288 0x81C, 0x275C0001,
3289 0x81C, 0x265E0001,
3290 0x81C, 0x25600001,
3291 0x81C, 0x24620001,
3292 0x81C, 0x0A640001,
3293 0x81C, 0x09660001,
3294 0x81C, 0x08680001,
3295 0x81C, 0x076A0001,
3296 0x81C, 0x066C0001,
3297 0x81C, 0x056E0001,
3298 0x81C, 0x04700001,
3299 0x81C, 0x03720001,
3300 0x81C, 0x02740001,
3301 0x81C, 0x01760001,
3302 0x81C, 0x01780001,
3303 0x81C, 0x017A0001,
3304 0x81C, 0x017C0001,
3305 0x81C, 0x017E0001,
3306 0xFF0F02C0, 0xABCD,
3307 0x81C, 0xFB000101,
3308 0x81C, 0xFA020101,
3309 0x81C, 0xF9040101,
3310 0x81C, 0xF8060101,
3311 0x81C, 0xF7080101,
3312 0x81C, 0xF60A0101,
3313 0x81C, 0xF50C0101,
3314 0x81C, 0xF40E0101,
3315 0x81C, 0xF3100101,
3316 0x81C, 0xF2120101,
3317 0x81C, 0xF1140101,
3318 0x81C, 0xF0160101,
3319 0x81C, 0xEF180101,
3320 0x81C, 0xEE1A0101,
3321 0x81C, 0xED1C0101,
3322 0x81C, 0xEC1E0101,
3323 0x81C, 0xEB200101,
3324 0x81C, 0xEA220101,
3325 0x81C, 0xE9240101,
3326 0x81C, 0xE8260101,
3327 0x81C, 0xE7280101,
3328 0x81C, 0xE62A0101,
3329 0x81C, 0xE52C0101,
3330 0x81C, 0xE42E0101,
3331 0x81C, 0xE3300101,
3332 0x81C, 0xA5320101,
3333 0x81C, 0xA4340101,
3334 0x81C, 0xA3360101,
3335 0x81C, 0x87380101,
3336 0x81C, 0x863A0101,
3337 0x81C, 0x853C0101,
3338 0x81C, 0x843E0101,
3339 0x81C, 0x69400101,
3340 0x81C, 0x68420101,
3341 0x81C, 0x67440101,
3342 0x81C, 0x66460101,
3343 0x81C, 0x49480101,
3344 0x81C, 0x484A0101,
3345 0x81C, 0x474C0101,
3346 0x81C, 0x2A4E0101,
3347 0x81C, 0x29500101,
3348 0x81C, 0x28520101,
3349 0x81C, 0x27540101,
3350 0x81C, 0x26560101,
3351 0x81C, 0x25580101,
3352 0x81C, 0x245A0101,
3353 0x81C, 0x235C0101,
3354 0x81C, 0x055E0101,
3355 0x81C, 0x04600101,
3356 0x81C, 0x03620101,
3357 0x81C, 0x02640101,
3358 0x81C, 0x01660101,
3359 0x81C, 0x01680101,
3360 0x81C, 0x016A0101,
3361 0x81C, 0x016C0101,
3362 0x81C, 0x016E0101,
3363 0x81C, 0x01700101,
3364 0x81C, 0x01720101,
3365 0xCDCDCDCD, 0xCDCD,
3366 0x81C, 0xFF000101,
3367 0x81C, 0xFF020101,
3368 0x81C, 0xFE040101,
3369 0x81C, 0xFD060101,
3370 0x81C, 0xFC080101,
3371 0x81C, 0xFD0A0101,
3372 0x81C, 0xFC0C0101,
3373 0x81C, 0xFB0E0101,
3374 0x81C, 0xFA100101,
3375 0x81C, 0xF9120101,
3376 0x81C, 0xF8140101,
3377 0x81C, 0xF7160101,
3378 0x81C, 0xF6180101,
3379 0x81C, 0xF51A0101,
3380 0x81C, 0xF41C0101,
3381 0x81C, 0xF31E0101,
3382 0x81C, 0xF2200101,
3383 0x81C, 0xF1220101,
3384 0x81C, 0xF0240101,
3385 0x81C, 0xEF260101,
3386 0x81C, 0xEE280101,
3387 0x81C, 0xED2A0101,
3388 0x81C, 0xEC2C0101,
3389 0x81C, 0xEB2E0101,
3390 0x81C, 0xEA300101,
3391 0x81C, 0xE9320101,
3392 0x81C, 0xE8340101,
3393 0x81C, 0xE7360101,
3394 0x81C, 0xE6380101,
3395 0x81C, 0xE53A0101,
3396 0x81C, 0xE43C0101,
3397 0x81C, 0xE33E0101,
3398 0x81C, 0xA5400101,
3399 0x81C, 0xA4420101,
3400 0x81C, 0xA3440101,
3401 0x81C, 0x87460101,
3402 0x81C, 0x86480101,
3403 0x81C, 0x854A0101,
3404 0x81C, 0x844C0101,
3405 0x81C, 0x694E0101,
3406 0x81C, 0x68500101,
3407 0x81C, 0x67520101,
3408 0x81C, 0x66540101,
3409 0x81C, 0x49560101,
3410 0x81C, 0x48580101,
3411 0x81C, 0x475A0101,
3412 0x81C, 0x2A5C0101,
3413 0x81C, 0x295E0101,
3414 0x81C, 0x28600101,
3415 0x81C, 0x27620101,
3416 0x81C, 0x26640101,
3417 0x81C, 0x25660101,
3418 0x81C, 0x24680101,
3419 0x81C, 0x236A0101,
3420 0x81C, 0x056C0101,
3421 0x81C, 0x046E0101,
3422 0x81C, 0x03700101,
3423 0x81C, 0x02720101,
3424 0xFF0F02C0, 0xDEAD,
3425 0x81C, 0x01740101,
3426 0x81C, 0x01760101,
3427 0x81C, 0x01780101,
3428 0x81C, 0x017A0101,
3429 0x81C, 0x017C0101,
3430 0x81C, 0x017E0101,
3431 0xC50, 0x00000022,
3432 0xC50, 0x00000020,
3433
3434};
3435
3436/******************************************************************************
3437* TXPWR_LMT.TXT
3438******************************************************************************/
3439
3440u8 *RTL8812AE_TXPWR_LMT[] = {
3441 "FCC", "2.4G", "20M", "CCK", "1T", "01", "36",
3442 "ETSI", "2.4G", "20M", "CCK", "1T", "01", "32",
3443 "MKK", "2.4G", "20M", "CCK", "1T", "01", "32",
3444 "FCC", "2.4G", "20M", "CCK", "1T", "02", "36",
3445 "ETSI", "2.4G", "20M", "CCK", "1T", "02", "32",
3446 "MKK", "2.4G", "20M", "CCK", "1T", "02", "32",
3447 "FCC", "2.4G", "20M", "CCK", "1T", "03", "36",
3448 "ETSI", "2.4G", "20M", "CCK", "1T", "03", "32",
3449 "MKK", "2.4G", "20M", "CCK", "1T", "03", "32",
3450 "FCC", "2.4G", "20M", "CCK", "1T", "04", "36",
3451 "ETSI", "2.4G", "20M", "CCK", "1T", "04", "32",
3452 "MKK", "2.4G", "20M", "CCK", "1T", "04", "32",
3453 "FCC", "2.4G", "20M", "CCK", "1T", "05", "36",
3454 "ETSI", "2.4G", "20M", "CCK", "1T", "05", "32",
3455 "MKK", "2.4G", "20M", "CCK", "1T", "05", "32",
3456 "FCC", "2.4G", "20M", "CCK", "1T", "06", "36",
3457 "ETSI", "2.4G", "20M", "CCK", "1T", "06", "32",
3458 "MKK", "2.4G", "20M", "CCK", "1T", "06", "32",
3459 "FCC", "2.4G", "20M", "CCK", "1T", "07", "36",
3460 "ETSI", "2.4G", "20M", "CCK", "1T", "07", "32",
3461 "MKK", "2.4G", "20M", "CCK", "1T", "07", "32",
3462 "FCC", "2.4G", "20M", "CCK", "1T", "08", "36",
3463 "ETSI", "2.4G", "20M", "CCK", "1T", "08", "32",
3464 "MKK", "2.4G", "20M", "CCK", "1T", "08", "32",
3465 "FCC", "2.4G", "20M", "CCK", "1T", "09", "36",
3466 "ETSI", "2.4G", "20M", "CCK", "1T", "09", "32",
3467 "MKK", "2.4G", "20M", "CCK", "1T", "09", "32",
3468 "FCC", "2.4G", "20M", "CCK", "1T", "10", "36",
3469 "ETSI", "2.4G", "20M", "CCK", "1T", "10", "32",
3470 "MKK", "2.4G", "20M", "CCK", "1T", "10", "32",
3471 "FCC", "2.4G", "20M", "CCK", "1T", "11", "36",
3472 "ETSI", "2.4G", "20M", "CCK", "1T", "11", "32",
3473 "MKK", "2.4G", "20M", "CCK", "1T", "11", "32",
3474 "FCC", "2.4G", "20M", "CCK", "1T", "12", "63",
3475 "ETSI", "2.4G", "20M", "CCK", "1T", "12", "32",
3476 "MKK", "2.4G", "20M", "CCK", "1T", "12", "32",
3477 "FCC", "2.4G", "20M", "CCK", "1T", "13", "63",
3478 "ETSI", "2.4G", "20M", "CCK", "1T", "13", "32",
3479 "MKK", "2.4G", "20M", "CCK", "1T", "13", "32",
3480 "FCC", "2.4G", "20M", "CCK", "1T", "14", "63",
3481 "ETSI", "2.4G", "20M", "CCK", "1T", "14", "63",
3482 "MKK", "2.4G", "20M", "CCK", "1T", "14", "32",
3483 "FCC", "2.4G", "20M", "OFDM", "1T", "01", "34",
3484 "ETSI", "2.4G", "20M", "OFDM", "1T", "01", "32",
3485 "MKK", "2.4G", "20M", "OFDM", "1T", "01", "32",
3486 "FCC", "2.4G", "20M", "OFDM", "1T", "02", "36",
3487 "ETSI", "2.4G", "20M", "OFDM", "1T", "02", "32",
3488 "MKK", "2.4G", "20M", "OFDM", "1T", "02", "32",
3489 "FCC", "2.4G", "20M", "OFDM", "1T", "03", "36",
3490 "ETSI", "2.4G", "20M", "OFDM", "1T", "03", "32",
3491 "MKK", "2.4G", "20M", "OFDM", "1T", "03", "32",
3492 "FCC", "2.4G", "20M", "OFDM", "1T", "04", "36",
3493 "ETSI", "2.4G", "20M", "OFDM", "1T", "04", "32",
3494 "MKK", "2.4G", "20M", "OFDM", "1T", "04", "32",
3495 "FCC", "2.4G", "20M", "OFDM", "1T", "05", "36",
3496 "ETSI", "2.4G", "20M", "OFDM", "1T", "05", "32",
3497 "MKK", "2.4G", "20M", "OFDM", "1T", "05", "32",
3498 "FCC", "2.4G", "20M", "OFDM", "1T", "06", "36",
3499 "ETSI", "2.4G", "20M", "OFDM", "1T", "06", "32",
3500 "MKK", "2.4G", "20M", "OFDM", "1T", "06", "32",
3501 "FCC", "2.4G", "20M", "OFDM", "1T", "07", "36",
3502 "ETSI", "2.4G", "20M", "OFDM", "1T", "07", "32",
3503 "MKK", "2.4G", "20M", "OFDM", "1T", "07", "32",
3504 "FCC", "2.4G", "20M", "OFDM", "1T", "08", "36",
3505 "ETSI", "2.4G", "20M", "OFDM", "1T", "08", "32",
3506 "MKK", "2.4G", "20M", "OFDM", "1T", "08", "32",
3507 "FCC", "2.4G", "20M", "OFDM", "1T", "09", "36",
3508 "ETSI", "2.4G", "20M", "OFDM", "1T", "09", "32",
3509 "MKK", "2.4G", "20M", "OFDM", "1T", "09", "32",
3510 "FCC", "2.4G", "20M", "OFDM", "1T", "10", "36",
3511 "ETSI", "2.4G", "20M", "OFDM", "1T", "10", "32",
3512 "MKK", "2.4G", "20M", "OFDM", "1T", "10", "32",
3513 "FCC", "2.4G", "20M", "OFDM", "1T", "11", "32",
3514 "ETSI", "2.4G", "20M", "OFDM", "1T", "11", "32",
3515 "MKK", "2.4G", "20M", "OFDM", "1T", "11", "32",
3516 "FCC", "2.4G", "20M", "OFDM", "1T", "12", "63",
3517 "ETSI", "2.4G", "20M", "OFDM", "1T", "12", "32",
3518 "MKK", "2.4G", "20M", "OFDM", "1T", "12", "32",
3519 "FCC", "2.4G", "20M", "OFDM", "1T", "13", "63",
3520 "ETSI", "2.4G", "20M", "OFDM", "1T", "13", "32",
3521 "MKK", "2.4G", "20M", "OFDM", "1T", "13", "32",
3522 "FCC", "2.4G", "20M", "OFDM", "1T", "14", "63",
3523 "ETSI", "2.4G", "20M", "OFDM", "1T", "14", "63",
3524 "MKK", "2.4G", "20M", "OFDM", "1T", "14", "63",
3525 "FCC", "2.4G", "20M", "HT", "1T", "01", "34",
3526 "ETSI", "2.4G", "20M", "HT", "1T", "01", "32",
3527 "MKK", "2.4G", "20M", "HT", "1T", "01", "32",
3528 "FCC", "2.4G", "20M", "HT", "1T", "02", "36",
3529 "ETSI", "2.4G", "20M", "HT", "1T", "02", "32",
3530 "MKK", "2.4G", "20M", "HT", "1T", "02", "32",
3531 "FCC", "2.4G", "20M", "HT", "1T", "03", "36",
3532 "ETSI", "2.4G", "20M", "HT", "1T", "03", "32",
3533 "MKK", "2.4G", "20M", "HT", "1T", "03", "32",
3534 "FCC", "2.4G", "20M", "HT", "1T", "04", "36",
3535 "ETSI", "2.4G", "20M", "HT", "1T", "04", "32",
3536 "MKK", "2.4G", "20M", "HT", "1T", "04", "32",
3537 "FCC", "2.4G", "20M", "HT", "1T", "05", "36",
3538 "ETSI", "2.4G", "20M", "HT", "1T", "05", "32",
3539 "MKK", "2.4G", "20M", "HT", "1T", "05", "32",
3540 "FCC", "2.4G", "20M", "HT", "1T", "06", "36",
3541 "ETSI", "2.4G", "20M", "HT", "1T", "06", "32",
3542 "MKK", "2.4G", "20M", "HT", "1T", "06", "32",
3543 "FCC", "2.4G", "20M", "HT", "1T", "07", "36",
3544 "ETSI", "2.4G", "20M", "HT", "1T", "07", "32",
3545 "MKK", "2.4G", "20M", "HT", "1T", "07", "32",
3546 "FCC", "2.4G", "20M", "HT", "1T", "08", "36",
3547 "ETSI", "2.4G", "20M", "HT", "1T", "08", "32",
3548 "MKK", "2.4G", "20M", "HT", "1T", "08", "32",
3549 "FCC", "2.4G", "20M", "HT", "1T", "09", "36",
3550 "ETSI", "2.4G", "20M", "HT", "1T", "09", "32",
3551 "MKK", "2.4G", "20M", "HT", "1T", "09", "32",
3552 "FCC", "2.4G", "20M", "HT", "1T", "10", "36",
3553 "ETSI", "2.4G", "20M", "HT", "1T", "10", "32",
3554 "MKK", "2.4G", "20M", "HT", "1T", "10", "32",
3555 "FCC", "2.4G", "20M", "HT", "1T", "11", "32",
3556 "ETSI", "2.4G", "20M", "HT", "1T", "11", "32",
3557 "MKK", "2.4G", "20M", "HT", "1T", "11", "32",
3558 "FCC", "2.4G", "20M", "HT", "1T", "12", "63",
3559 "ETSI", "2.4G", "20M", "HT", "1T", "12", "32",
3560 "MKK", "2.4G", "20M", "HT", "1T", "12", "32",
3561 "FCC", "2.4G", "20M", "HT", "1T", "13", "63",
3562 "ETSI", "2.4G", "20M", "HT", "1T", "13", "32",
3563 "MKK", "2.4G", "20M", "HT", "1T", "13", "32",
3564 "FCC", "2.4G", "20M", "HT", "1T", "14", "63",
3565 "ETSI", "2.4G", "20M", "HT", "1T", "14", "63",
3566 "MKK", "2.4G", "20M", "HT", "1T", "14", "63",
3567 "FCC", "2.4G", "20M", "HT", "2T", "01", "32",
3568 "ETSI", "2.4G", "20M", "HT", "2T", "01", "32",
3569 "MKK", "2.4G", "20M", "HT", "2T", "01", "32",
3570 "FCC", "2.4G", "20M", "HT", "2T", "02", "34",
3571 "ETSI", "2.4G", "20M", "HT", "2T", "02", "32",
3572 "MKK", "2.4G", "20M", "HT", "2T", "02", "32",
3573 "FCC", "2.4G", "20M", "HT", "2T", "03", "34",
3574 "ETSI", "2.4G", "20M", "HT", "2T", "03", "32",
3575 "MKK", "2.4G", "20M", "HT", "2T", "03", "32",
3576 "FCC", "2.4G", "20M", "HT", "2T", "04", "34",
3577 "ETSI", "2.4G", "20M", "HT", "2T", "04", "32",
3578 "MKK", "2.4G", "20M", "HT", "2T", "04", "32",
3579 "FCC", "2.4G", "20M", "HT", "2T", "05", "34",
3580 "ETSI", "2.4G", "20M", "HT", "2T", "05", "32",
3581 "MKK", "2.4G", "20M", "HT", "2T", "05", "32",
3582 "FCC", "2.4G", "20M", "HT", "2T", "06", "34",
3583 "ETSI", "2.4G", "20M", "HT", "2T", "06", "32",
3584 "MKK", "2.4G", "20M", "HT", "2T", "06", "32",
3585 "FCC", "2.4G", "20M", "HT", "2T", "07", "34",
3586 "ETSI", "2.4G", "20M", "HT", "2T", "07", "32",
3587 "MKK", "2.4G", "20M", "HT", "2T", "07", "32",
3588 "FCC", "2.4G", "20M", "HT", "2T", "08", "34",
3589 "ETSI", "2.4G", "20M", "HT", "2T", "08", "32",
3590 "MKK", "2.4G", "20M", "HT", "2T", "08", "32",
3591 "FCC", "2.4G", "20M", "HT", "2T", "09", "34",
3592 "ETSI", "2.4G", "20M", "HT", "2T", "09", "32",
3593 "MKK", "2.4G", "20M", "HT", "2T", "09", "32",
3594 "FCC", "2.4G", "20M", "HT", "2T", "10", "34",
3595 "ETSI", "2.4G", "20M", "HT", "2T", "10", "32",
3596 "MKK", "2.4G", "20M", "HT", "2T", "10", "32",
3597 "FCC", "2.4G", "20M", "HT", "2T", "11", "30",
3598 "ETSI", "2.4G", "20M", "HT", "2T", "11", "32",
3599 "MKK", "2.4G", "20M", "HT", "2T", "11", "32",
3600 "FCC", "2.4G", "20M", "HT", "2T", "12", "63",
3601 "ETSI", "2.4G", "20M", "HT", "2T", "12", "32",
3602 "MKK", "2.4G", "20M", "HT", "2T", "12", "32",
3603 "FCC", "2.4G", "20M", "HT", "2T", "13", "63",
3604 "ETSI", "2.4G", "20M", "HT", "2T", "13", "32",
3605 "MKK", "2.4G", "20M", "HT", "2T", "13", "32",
3606 "FCC", "2.4G", "20M", "HT", "2T", "14", "63",
3607 "ETSI", "2.4G", "20M", "HT", "2T", "14", "63",
3608 "MKK", "2.4G", "20M", "HT", "2T", "14", "63",
3609 "FCC", "2.4G", "40M", "HT", "1T", "01", "63",
3610 "ETSI", "2.4G", "40M", "HT", "1T", "01", "63",
3611 "MKK", "2.4G", "40M", "HT", "1T", "01", "63",
3612 "FCC", "2.4G", "40M", "HT", "1T", "02", "63",
3613 "ETSI", "2.4G", "40M", "HT", "1T", "02", "63",
3614 "MKK", "2.4G", "40M", "HT", "1T", "02", "63",
3615 "FCC", "2.4G", "40M", "HT", "1T", "03", "32",
3616 "ETSI", "2.4G", "40M", "HT", "1T", "03", "32",
3617 "MKK", "2.4G", "40M", "HT", "1T", "03", "32",
3618 "FCC", "2.4G", "40M", "HT", "1T", "04", "36",
3619 "ETSI", "2.4G", "40M", "HT", "1T", "04", "32",
3620 "MKK", "2.4G", "40M", "HT", "1T", "04", "32",
3621 "FCC", "2.4G", "40M", "HT", "1T", "05", "36",
3622 "ETSI", "2.4G", "40M", "HT", "1T", "05", "32",
3623 "MKK", "2.4G", "40M", "HT", "1T", "05", "32",
3624 "FCC", "2.4G", "40M", "HT", "1T", "06", "36",
3625 "ETSI", "2.4G", "40M", "HT", "1T", "06", "32",
3626 "MKK", "2.4G", "40M", "HT", "1T", "06", "32",
3627 "FCC", "2.4G", "40M", "HT", "1T", "07", "36",
3628 "ETSI", "2.4G", "40M", "HT", "1T", "07", "32",
3629 "MKK", "2.4G", "40M", "HT", "1T", "07", "32",
3630 "FCC", "2.4G", "40M", "HT", "1T", "08", "36",
3631 "ETSI", "2.4G", "40M", "HT", "1T", "08", "32",
3632 "MKK", "2.4G", "40M", "HT", "1T", "08", "32",
3633 "FCC", "2.4G", "40M", "HT", "1T", "09", "36",
3634 "ETSI", "2.4G", "40M", "HT", "1T", "09", "32",
3635 "MKK", "2.4G", "40M", "HT", "1T", "09", "32",
3636 "FCC", "2.4G", "40M", "HT", "1T", "10", "36",
3637 "ETSI", "2.4G", "40M", "HT", "1T", "10", "32",
3638 "MKK", "2.4G", "40M", "HT", "1T", "10", "32",
3639 "FCC", "2.4G", "40M", "HT", "1T", "11", "32",
3640 "ETSI", "2.4G", "40M", "HT", "1T", "11", "32",
3641 "MKK", "2.4G", "40M", "HT", "1T", "11", "32",
3642 "FCC", "2.4G", "40M", "HT", "1T", "12", "63",
3643 "ETSI", "2.4G", "40M", "HT", "1T", "12", "32",
3644 "MKK", "2.4G", "40M", "HT", "1T", "12", "32",
3645 "FCC", "2.4G", "40M", "HT", "1T", "13", "63",
3646 "ETSI", "2.4G", "40M", "HT", "1T", "13", "32",
3647 "MKK", "2.4G", "40M", "HT", "1T", "13", "32",
3648 "FCC", "2.4G", "40M", "HT", "1T", "14", "63",
3649 "ETSI", "2.4G", "40M", "HT", "1T", "14", "63",
3650 "MKK", "2.4G", "40M", "HT", "1T", "14", "63",
3651 "FCC", "2.4G", "40M", "HT", "2T", "01", "63",
3652 "ETSI", "2.4G", "40M", "HT", "2T", "01", "63",
3653 "MKK", "2.4G", "40M", "HT", "2T", "01", "63",
3654 "FCC", "2.4G", "40M", "HT", "2T", "02", "63",
3655 "ETSI", "2.4G", "40M", "HT", "2T", "02", "63",
3656 "MKK", "2.4G", "40M", "HT", "2T", "02", "63",
3657 "FCC", "2.4G", "40M", "HT", "2T", "03", "30",
3658 "ETSI", "2.4G", "40M", "HT", "2T", "03", "30",
3659 "MKK", "2.4G", "40M", "HT", "2T", "03", "30",
3660 "FCC", "2.4G", "40M", "HT", "2T", "04", "34",
3661 "ETSI", "2.4G", "40M", "HT", "2T", "04", "30",
3662 "MKK", "2.4G", "40M", "HT", "2T", "04", "30",
3663 "FCC", "2.4G", "40M", "HT", "2T", "05", "34",
3664 "ETSI", "2.4G", "40M", "HT", "2T", "05", "30",
3665 "MKK", "2.4G", "40M", "HT", "2T", "05", "30",
3666 "FCC", "2.4G", "40M", "HT", "2T", "06", "34",
3667 "ETSI", "2.4G", "40M", "HT", "2T", "06", "30",
3668 "MKK", "2.4G", "40M", "HT", "2T", "06", "30",
3669 "FCC", "2.4G", "40M", "HT", "2T", "07", "34",
3670 "ETSI", "2.4G", "40M", "HT", "2T", "07", "30",
3671 "MKK", "2.4G", "40M", "HT", "2T", "07", "30",
3672 "FCC", "2.4G", "40M", "HT", "2T", "08", "34",
3673 "ETSI", "2.4G", "40M", "HT", "2T", "08", "30",
3674 "MKK", "2.4G", "40M", "HT", "2T", "08", "30",
3675 "FCC", "2.4G", "40M", "HT", "2T", "09", "34",
3676 "ETSI", "2.4G", "40M", "HT", "2T", "09", "30",
3677 "MKK", "2.4G", "40M", "HT", "2T", "09", "30",
3678 "FCC", "2.4G", "40M", "HT", "2T", "10", "34",
3679 "ETSI", "2.4G", "40M", "HT", "2T", "10", "30",
3680 "MKK", "2.4G", "40M", "HT", "2T", "10", "30",
3681 "FCC", "2.4G", "40M", "HT", "2T", "11", "30",
3682 "ETSI", "2.4G", "40M", "HT", "2T", "11", "30",
3683 "MKK", "2.4G", "40M", "HT", "2T", "11", "30",
3684 "FCC", "2.4G", "40M", "HT", "2T", "12", "63",
3685 "ETSI", "2.4G", "40M", "HT", "2T", "12", "32",
3686 "MKK", "2.4G", "40M", "HT", "2T", "12", "32",
3687 "FCC", "2.4G", "40M", "HT", "2T", "13", "63",
3688 "ETSI", "2.4G", "40M", "HT", "2T", "13", "32",
3689 "MKK", "2.4G", "40M", "HT", "2T", "13", "32",
3690 "FCC", "2.4G", "40M", "HT", "2T", "14", "63",
3691 "ETSI", "2.4G", "40M", "HT", "2T", "14", "63",
3692 "MKK", "2.4G", "40M", "HT", "2T", "14", "63",
3693 "FCC", "5G", "20M", "OFDM", "1T", "36", "30",
3694 "ETSI", "5G", "20M", "OFDM", "1T", "36", "32",
3695 "MKK", "5G", "20M", "OFDM", "1T", "36", "32",
3696 "FCC", "5G", "20M", "OFDM", "1T", "40", "30",
3697 "ETSI", "5G", "20M", "OFDM", "1T", "40", "32",
3698 "MKK", "5G", "20M", "OFDM", "1T", "40", "32",
3699 "FCC", "5G", "20M", "OFDM", "1T", "44", "30",
3700 "ETSI", "5G", "20M", "OFDM", "1T", "44", "32",
3701 "MKK", "5G", "20M", "OFDM", "1T", "44", "32",
3702 "FCC", "5G", "20M", "OFDM", "1T", "48", "30",
3703 "ETSI", "5G", "20M", "OFDM", "1T", "48", "32",
3704 "MKK", "5G", "20M", "OFDM", "1T", "48", "32",
3705 "FCC", "5G", "20M", "OFDM", "1T", "52", "36",
3706 "ETSI", "5G", "20M", "OFDM", "1T", "52", "32",
3707 "MKK", "5G", "20M", "OFDM", "1T", "52", "32",
3708 "FCC", "5G", "20M", "OFDM", "1T", "56", "34",
3709 "ETSI", "5G", "20M", "OFDM", "1T", "56", "32",
3710 "MKK", "5G", "20M", "OFDM", "1T", "56", "32",
3711 "FCC", "5G", "20M", "OFDM", "1T", "60", "32",
3712 "ETSI", "5G", "20M", "OFDM", "1T", "60", "32",
3713 "MKK", "5G", "20M", "OFDM", "1T", "60", "32",
3714 "FCC", "5G", "20M", "OFDM", "1T", "64", "28",
3715 "ETSI", "5G", "20M", "OFDM", "1T", "64", "32",
3716 "MKK", "5G", "20M", "OFDM", "1T", "64", "32",
3717 "FCC", "5G", "20M", "OFDM", "1T", "100", "30",
3718 "ETSI", "5G", "20M", "OFDM", "1T", "100", "32",
3719 "MKK", "5G", "20M", "OFDM", "1T", "100", "32",
3720 "FCC", "5G", "20M", "OFDM", "1T", "114", "30",
3721 "ETSI", "5G", "20M", "OFDM", "1T", "114", "32",
3722 "MKK", "5G", "20M", "OFDM", "1T", "114", "32",
3723 "FCC", "5G", "20M", "OFDM", "1T", "108", "32",
3724 "ETSI", "5G", "20M", "OFDM", "1T", "108", "32",
3725 "MKK", "5G", "20M", "OFDM", "1T", "108", "32",
3726 "FCC", "5G", "20M", "OFDM", "1T", "112", "34",
3727 "ETSI", "5G", "20M", "OFDM", "1T", "112", "32",
3728 "MKK", "5G", "20M", "OFDM", "1T", "112", "32",
3729 "FCC", "5G", "20M", "OFDM", "1T", "116", "34",
3730 "ETSI", "5G", "20M", "OFDM", "1T", "116", "32",
3731 "MKK", "5G", "20M", "OFDM", "1T", "116", "32",
3732 "FCC", "5G", "20M", "OFDM", "1T", "120", "36",
3733 "ETSI", "5G", "20M", "OFDM", "1T", "120", "32",
3734 "MKK", "5G", "20M", "OFDM", "1T", "120", "32",
3735 "FCC", "5G", "20M", "OFDM", "1T", "124", "34",
3736 "ETSI", "5G", "20M", "OFDM", "1T", "124", "32",
3737 "MKK", "5G", "20M", "OFDM", "1T", "124", "32",
3738 "FCC", "5G", "20M", "OFDM", "1T", "128", "32",
3739 "ETSI", "5G", "20M", "OFDM", "1T", "128", "32",
3740 "MKK", "5G", "20M", "OFDM", "1T", "128", "32",
3741 "FCC", "5G", "20M", "OFDM", "1T", "132", "30",
3742 "ETSI", "5G", "20M", "OFDM", "1T", "132", "32",
3743 "MKK", "5G", "20M", "OFDM", "1T", "132", "32",
3744 "FCC", "5G", "20M", "OFDM", "1T", "136", "30",
3745 "ETSI", "5G", "20M", "OFDM", "1T", "136", "32",
3746 "MKK", "5G", "20M", "OFDM", "1T", "136", "32",
3747 "FCC", "5G", "20M", "OFDM", "1T", "140", "28",
3748 "ETSI", "5G", "20M", "OFDM", "1T", "140", "32",
3749 "MKK", "5G", "20M", "OFDM", "1T", "140", "32",
3750 "FCC", "5G", "20M", "OFDM", "1T", "149", "36",
3751 "ETSI", "5G", "20M", "OFDM", "1T", "149", "32",
3752 "MKK", "5G", "20M", "OFDM", "1T", "149", "63",
3753 "FCC", "5G", "20M", "OFDM", "1T", "153", "36",
3754 "ETSI", "5G", "20M", "OFDM", "1T", "153", "32",
3755 "MKK", "5G", "20M", "OFDM", "1T", "153", "63",
3756 "FCC", "5G", "20M", "OFDM", "1T", "157", "36",
3757 "ETSI", "5G", "20M", "OFDM", "1T", "157", "32",
3758 "MKK", "5G", "20M", "OFDM", "1T", "157", "63",
3759 "FCC", "5G", "20M", "OFDM", "1T", "161", "36",
3760 "ETSI", "5G", "20M", "OFDM", "1T", "161", "32",
3761 "MKK", "5G", "20M", "OFDM", "1T", "161", "63",
3762 "FCC", "5G", "20M", "OFDM", "1T", "165", "36",
3763 "ETSI", "5G", "20M", "OFDM", "1T", "165", "32",
3764 "MKK", "5G", "20M", "OFDM", "1T", "165", "63",
3765 "FCC", "5G", "20M", "HT", "1T", "36", "30",
3766 "ETSI", "5G", "20M", "HT", "1T", "36", "32",
3767 "MKK", "5G", "20M", "HT", "1T", "36", "32",
3768 "FCC", "5G", "20M", "HT", "1T", "40", "30",
3769 "ETSI", "5G", "20M", "HT", "1T", "40", "32",
3770 "MKK", "5G", "20M", "HT", "1T", "40", "32",
3771 "FCC", "5G", "20M", "HT", "1T", "44", "30",
3772 "ETSI", "5G", "20M", "HT", "1T", "44", "32",
3773 "MKK", "5G", "20M", "HT", "1T", "44", "32",
3774 "FCC", "5G", "20M", "HT", "1T", "48", "30",
3775 "ETSI", "5G", "20M", "HT", "1T", "48", "32",
3776 "MKK", "5G", "20M", "HT", "1T", "48", "32",
3777 "FCC", "5G", "20M", "HT", "1T", "52", "36",
3778 "ETSI", "5G", "20M", "HT", "1T", "52", "32",
3779 "MKK", "5G", "20M", "HT", "1T", "52", "32",
3780 "FCC", "5G", "20M", "HT", "1T", "56", "34",
3781 "ETSI", "5G", "20M", "HT", "1T", "56", "32",
3782 "MKK", "5G", "20M", "HT", "1T", "56", "32",
3783 "FCC", "5G", "20M", "HT", "1T", "60", "32",
3784 "ETSI", "5G", "20M", "HT", "1T", "60", "32",
3785 "MKK", "5G", "20M", "HT", "1T", "60", "32",
3786 "FCC", "5G", "20M", "HT", "1T", "64", "28",
3787 "ETSI", "5G", "20M", "HT", "1T", "64", "32",
3788 "MKK", "5G", "20M", "HT", "1T", "64", "32",
3789 "FCC", "5G", "20M", "HT", "1T", "100", "30",
3790 "ETSI", "5G", "20M", "HT", "1T", "100", "32",
3791 "MKK", "5G", "20M", "HT", "1T", "100", "32",
3792 "FCC", "5G", "20M", "HT", "1T", "114", "30",
3793 "ETSI", "5G", "20M", "HT", "1T", "114", "32",
3794 "MKK", "5G", "20M", "HT", "1T", "114", "32",
3795 "FCC", "5G", "20M", "HT", "1T", "108", "32",
3796 "ETSI", "5G", "20M", "HT", "1T", "108", "32",
3797 "MKK", "5G", "20M", "HT", "1T", "108", "32",
3798 "FCC", "5G", "20M", "HT", "1T", "112", "34",
3799 "ETSI", "5G", "20M", "HT", "1T", "112", "32",
3800 "MKK", "5G", "20M", "HT", "1T", "112", "32",
3801 "FCC", "5G", "20M", "HT", "1T", "116", "34",
3802 "ETSI", "5G", "20M", "HT", "1T", "116", "32",
3803 "MKK", "5G", "20M", "HT", "1T", "116", "32",
3804 "FCC", "5G", "20M", "HT", "1T", "120", "36",
3805 "ETSI", "5G", "20M", "HT", "1T", "120", "32",
3806 "MKK", "5G", "20M", "HT", "1T", "120", "32",
3807 "FCC", "5G", "20M", "HT", "1T", "124", "34",
3808 "ETSI", "5G", "20M", "HT", "1T", "124", "32",
3809 "MKK", "5G", "20M", "HT", "1T", "124", "32",
3810 "FCC", "5G", "20M", "HT", "1T", "128", "32",
3811 "ETSI", "5G", "20M", "HT", "1T", "128", "32",
3812 "MKK", "5G", "20M", "HT", "1T", "128", "32",
3813 "FCC", "5G", "20M", "HT", "1T", "132", "30",
3814 "ETSI", "5G", "20M", "HT", "1T", "132", "32",
3815 "MKK", "5G", "20M", "HT", "1T", "132", "32",
3816 "FCC", "5G", "20M", "HT", "1T", "136", "30",
3817 "ETSI", "5G", "20M", "HT", "1T", "136", "32",
3818 "MKK", "5G", "20M", "HT", "1T", "136", "32",
3819 "FCC", "5G", "20M", "HT", "1T", "140", "28",
3820 "ETSI", "5G", "20M", "HT", "1T", "140", "32",
3821 "MKK", "5G", "20M", "HT", "1T", "140", "32",
3822 "FCC", "5G", "20M", "HT", "1T", "149", "36",
3823 "ETSI", "5G", "20M", "HT", "1T", "149", "32",
3824 "MKK", "5G", "20M", "HT", "1T", "149", "63",
3825 "FCC", "5G", "20M", "HT", "1T", "153", "36",
3826 "ETSI", "5G", "20M", "HT", "1T", "153", "32",
3827 "MKK", "5G", "20M", "HT", "1T", "153", "63",
3828 "FCC", "5G", "20M", "HT", "1T", "157", "36",
3829 "ETSI", "5G", "20M", "HT", "1T", "157", "32",
3830 "MKK", "5G", "20M", "HT", "1T", "157", "63",
3831 "FCC", "5G", "20M", "HT", "1T", "161", "36",
3832 "ETSI", "5G", "20M", "HT", "1T", "161", "32",
3833 "MKK", "5G", "20M", "HT", "1T", "161", "63",
3834 "FCC", "5G", "20M", "HT", "1T", "165", "36",
3835 "ETSI", "5G", "20M", "HT", "1T", "165", "32",
3836 "MKK", "5G", "20M", "HT", "1T", "165", "63",
3837 "FCC", "5G", "20M", "HT", "2T", "36", "28",
3838 "ETSI", "5G", "20M", "HT", "2T", "36", "30",
3839 "MKK", "5G", "20M", "HT", "2T", "36", "30",
3840 "FCC", "5G", "20M", "HT", "2T", "40", "28",
3841 "ETSI", "5G", "20M", "HT", "2T", "40", "30",
3842 "MKK", "5G", "20M", "HT", "2T", "40", "30",
3843 "FCC", "5G", "20M", "HT", "2T", "44", "28",
3844 "ETSI", "5G", "20M", "HT", "2T", "44", "30",
3845 "MKK", "5G", "20M", "HT", "2T", "44", "30",
3846 "FCC", "5G", "20M", "HT", "2T", "48", "28",
3847 "ETSI", "5G", "20M", "HT", "2T", "48", "30",
3848 "MKK", "5G", "20M", "HT", "2T", "48", "30",
3849 "FCC", "5G", "20M", "HT", "2T", "52", "34",
3850 "ETSI", "5G", "20M", "HT", "2T", "52", "30",
3851 "MKK", "5G", "20M", "HT", "2T", "52", "30",
3852 "FCC", "5G", "20M", "HT", "2T", "56", "32",
3853 "ETSI", "5G", "20M", "HT", "2T", "56", "30",
3854 "MKK", "5G", "20M", "HT", "2T", "56", "30",
3855 "FCC", "5G", "20M", "HT", "2T", "60", "30",
3856 "ETSI", "5G", "20M", "HT", "2T", "60", "30",
3857 "MKK", "5G", "20M", "HT", "2T", "60", "30",
3858 "FCC", "5G", "20M", "HT", "2T", "64", "26",
3859 "ETSI", "5G", "20M", "HT", "2T", "64", "30",
3860 "MKK", "5G", "20M", "HT", "2T", "64", "30",
3861 "FCC", "5G", "20M", "HT", "2T", "100", "28",
3862 "ETSI", "5G", "20M", "HT", "2T", "100", "30",
3863 "MKK", "5G", "20M", "HT", "2T", "100", "30",
3864 "FCC", "5G", "20M", "HT", "2T", "114", "28",
3865 "ETSI", "5G", "20M", "HT", "2T", "114", "30",
3866 "MKK", "5G", "20M", "HT", "2T", "114", "30",
3867 "FCC", "5G", "20M", "HT", "2T", "108", "30",
3868 "ETSI", "5G", "20M", "HT", "2T", "108", "30",
3869 "MKK", "5G", "20M", "HT", "2T", "108", "30",
3870 "FCC", "5G", "20M", "HT", "2T", "112", "32",
3871 "ETSI", "5G", "20M", "HT", "2T", "112", "30",
3872 "MKK", "5G", "20M", "HT", "2T", "112", "30",
3873 "FCC", "5G", "20M", "HT", "2T", "116", "32",
3874 "ETSI", "5G", "20M", "HT", "2T", "116", "30",
3875 "MKK", "5G", "20M", "HT", "2T", "116", "30",
3876 "FCC", "5G", "20M", "HT", "2T", "120", "34",
3877 "ETSI", "5G", "20M", "HT", "2T", "120", "30",
3878 "MKK", "5G", "20M", "HT", "2T", "120", "30",
3879 "FCC", "5G", "20M", "HT", "2T", "124", "32",
3880 "ETSI", "5G", "20M", "HT", "2T", "124", "30",
3881 "MKK", "5G", "20M", "HT", "2T", "124", "30",
3882 "FCC", "5G", "20M", "HT", "2T", "128", "30",
3883 "ETSI", "5G", "20M", "HT", "2T", "128", "30",
3884 "MKK", "5G", "20M", "HT", "2T", "128", "30",
3885 "FCC", "5G", "20M", "HT", "2T", "132", "28",
3886 "ETSI", "5G", "20M", "HT", "2T", "132", "30",
3887 "MKK", "5G", "20M", "HT", "2T", "132", "30",
3888 "FCC", "5G", "20M", "HT", "2T", "136", "28",
3889 "ETSI", "5G", "20M", "HT", "2T", "136", "30",
3890 "MKK", "5G", "20M", "HT", "2T", "136", "30",
3891 "FCC", "5G", "20M", "HT", "2T", "140", "26",
3892 "ETSI", "5G", "20M", "HT", "2T", "140", "30",
3893 "MKK", "5G", "20M", "HT", "2T", "140", "30",
3894 "FCC", "5G", "20M", "HT", "2T", "149", "34",
3895 "ETSI", "5G", "20M", "HT", "2T", "149", "30",
3896 "MKK", "5G", "20M", "HT", "2T", "149", "63",
3897 "FCC", "5G", "20M", "HT", "2T", "153", "34",
3898 "ETSI", "5G", "20M", "HT", "2T", "153", "30",
3899 "MKK", "5G", "20M", "HT", "2T", "153", "63",
3900 "FCC", "5G", "20M", "HT", "2T", "157", "34",
3901 "ETSI", "5G", "20M", "HT", "2T", "157", "30",
3902 "MKK", "5G", "20M", "HT", "2T", "157", "63",
3903 "FCC", "5G", "20M", "HT", "2T", "161", "34",
3904 "ETSI", "5G", "20M", "HT", "2T", "161", "30",
3905 "MKK", "5G", "20M", "HT", "2T", "161", "63",
3906 "FCC", "5G", "20M", "HT", "2T", "165", "34",
3907 "ETSI", "5G", "20M", "HT", "2T", "165", "30",
3908 "MKK", "5G", "20M", "HT", "2T", "165", "63",
3909 "FCC", "5G", "40M", "HT", "1T", "38", "30",
3910 "ETSI", "5G", "40M", "HT", "1T", "38", "32",
3911 "MKK", "5G", "40M", "HT", "1T", "38", "32",
3912 "FCC", "5G", "40M", "HT", "1T", "46", "30",
3913 "ETSI", "5G", "40M", "HT", "1T", "46", "32",
3914 "MKK", "5G", "40M", "HT", "1T", "46", "32",
3915 "FCC", "5G", "40M", "HT", "1T", "54", "32",
3916 "ETSI", "5G", "40M", "HT", "1T", "54", "32",
3917 "MKK", "5G", "40M", "HT", "1T", "54", "32",
3918 "FCC", "5G", "40M", "HT", "1T", "62", "32",
3919 "ETSI", "5G", "40M", "HT", "1T", "62", "32",
3920 "MKK", "5G", "40M", "HT", "1T", "62", "32",
3921 "FCC", "5G", "40M", "HT", "1T", "102", "28",
3922 "ETSI", "5G", "40M", "HT", "1T", "102", "32",
3923 "MKK", "5G", "40M", "HT", "1T", "102", "32",
3924 "FCC", "5G", "40M", "HT", "1T", "110", "32",
3925 "ETSI", "5G", "40M", "HT", "1T", "110", "32",
3926 "MKK", "5G", "40M", "HT", "1T", "110", "32",
3927 "FCC", "5G", "40M", "HT", "1T", "118", "36",
3928 "ETSI", "5G", "40M", "HT", "1T", "118", "32",
3929 "MKK", "5G", "40M", "HT", "1T", "118", "32",
3930 "FCC", "5G", "40M", "HT", "1T", "126", "34",
3931 "ETSI", "5G", "40M", "HT", "1T", "126", "32",
3932 "MKK", "5G", "40M", "HT", "1T", "126", "32",
3933 "FCC", "5G", "40M", "HT", "1T", "134", "32",
3934 "ETSI", "5G", "40M", "HT", "1T", "134", "32",
3935 "MKK", "5G", "40M", "HT", "1T", "134", "32",
3936 "FCC", "5G", "40M", "HT", "1T", "151", "36",
3937 "ETSI", "5G", "40M", "HT", "1T", "151", "32",
3938 "MKK", "5G", "40M", "HT", "1T", "151", "63",
3939 "FCC", "5G", "40M", "HT", "1T", "159", "36",
3940 "ETSI", "5G", "40M", "HT", "1T", "159", "32",
3941 "MKK", "5G", "40M", "HT", "1T", "159", "63",
3942 "FCC", "5G", "40M", "HT", "2T", "38", "28",
3943 "ETSI", "5G", "40M", "HT", "2T", "38", "30",
3944 "MKK", "5G", "40M", "HT", "2T", "38", "30",
3945 "FCC", "5G", "40M", "HT", "2T", "46", "28",
3946 "ETSI", "5G", "40M", "HT", "2T", "46", "30",
3947 "MKK", "5G", "40M", "HT", "2T", "46", "30",
3948 "FCC", "5G", "40M", "HT", "2T", "54", "30",
3949 "ETSI", "5G", "40M", "HT", "2T", "54", "30",
3950 "MKK", "5G", "40M", "HT", "2T", "54", "30",
3951 "FCC", "5G", "40M", "HT", "2T", "62", "30",
3952 "ETSI", "5G", "40M", "HT", "2T", "62", "30",
3953 "MKK", "5G", "40M", "HT", "2T", "62", "30",
3954 "FCC", "5G", "40M", "HT", "2T", "102", "26",
3955 "ETSI", "5G", "40M", "HT", "2T", "102", "30",
3956 "MKK", "5G", "40M", "HT", "2T", "102", "30",
3957 "FCC", "5G", "40M", "HT", "2T", "110", "30",
3958 "ETSI", "5G", "40M", "HT", "2T", "110", "30",
3959 "MKK", "5G", "40M", "HT", "2T", "110", "30",
3960 "FCC", "5G", "40M", "HT", "2T", "118", "34",
3961 "ETSI", "5G", "40M", "HT", "2T", "118", "30",
3962 "MKK", "5G", "40M", "HT", "2T", "118", "30",
3963 "FCC", "5G", "40M", "HT", "2T", "126", "32",
3964 "ETSI", "5G", "40M", "HT", "2T", "126", "30",
3965 "MKK", "5G", "40M", "HT", "2T", "126", "30",
3966 "FCC", "5G", "40M", "HT", "2T", "134", "30",
3967 "ETSI", "5G", "40M", "HT", "2T", "134", "30",
3968 "MKK", "5G", "40M", "HT", "2T", "134", "30",
3969 "FCC", "5G", "40M", "HT", "2T", "151", "34",
3970 "ETSI", "5G", "40M", "HT", "2T", "151", "30",
3971 "MKK", "5G", "40M", "HT", "2T", "151", "63",
3972 "FCC", "5G", "40M", "HT", "2T", "159", "34",
3973 "ETSI", "5G", "40M", "HT", "2T", "159", "30",
3974 "MKK", "5G", "40M", "HT", "2T", "159", "63",
3975 "FCC", "5G", "80M", "VHT", "1T", "42", "30",
3976 "ETSI", "5G", "80M", "VHT", "1T", "42", "32",
3977 "MKK", "5G", "80M", "VHT", "1T", "42", "32",
3978 "FCC", "5G", "80M", "VHT", "1T", "58", "28",
3979 "ETSI", "5G", "80M", "VHT", "1T", "58", "32",
3980 "MKK", "5G", "80M", "VHT", "1T", "58", "32",
3981 "FCC", "5G", "80M", "VHT", "1T", "106", "30",
3982 "ETSI", "5G", "80M", "VHT", "1T", "106", "32",
3983 "MKK", "5G", "80M", "VHT", "1T", "106", "32",
3984 "FCC", "5G", "80M", "VHT", "1T", "122", "34",
3985 "ETSI", "5G", "80M", "VHT", "1T", "122", "32",
3986 "MKK", "5G", "80M", "VHT", "1T", "122", "32",
3987 "FCC", "5G", "80M", "VHT", "1T", "155", "36",
3988 "ETSI", "5G", "80M", "VHT", "1T", "155", "32",
3989 "MKK", "5G", "80M", "VHT", "1T", "155", "63",
3990 "FCC", "5G", "80M", "VHT", "2T", "42", "28",
3991 "ETSI", "5G", "80M", "VHT", "2T", "42", "30",
3992 "MKK", "5G", "80M", "VHT", "2T", "42", "30",
3993 "FCC", "5G", "80M", "VHT", "2T", "58", "26",
3994 "ETSI", "5G", "80M", "VHT", "2T", "58", "30",
3995 "MKK", "5G", "80M", "VHT", "2T", "58", "30",
3996 "FCC", "5G", "80M", "VHT", "2T", "106", "28",
3997 "ETSI", "5G", "80M", "VHT", "2T", "106", "30",
3998 "MKK", "5G", "80M", "VHT", "2T", "106", "30",
3999 "FCC", "5G", "80M", "VHT", "2T", "122", "32",
4000 "ETSI", "5G", "80M", "VHT", "2T", "122", "30",
4001 "MKK", "5G", "80M", "VHT", "2T", "122", "30",
4002 "FCC", "5G", "80M", "VHT", "2T", "155", "34",
4003 "ETSI", "5G", "80M", "VHT", "2T", "155", "30",
4004 "MKK", "5G", "80M", "VHT", "2T", "155", "63"
4005};
4006
4007u8 *RTL8821AE_TXPWR_LMT[] = {
4008 "FCC", "2.4G", "20M", "CCK", "1T", "01", "32",
4009 "ETSI", "2.4G", "20M", "CCK", "1T", "01", "32",
4010 "MKK", "2.4G", "20M", "CCK", "1T", "01", "32",
4011 "FCC", "2.4G", "20M", "CCK", "1T", "02", "32",
4012 "ETSI", "2.4G", "20M", "CCK", "1T", "02", "32",
4013 "MKK", "2.4G", "20M", "CCK", "1T", "02", "32",
4014 "FCC", "2.4G", "20M", "CCK", "1T", "03", "36",
4015 "ETSI", "2.4G", "20M", "CCK", "1T", "03", "32",
4016 "MKK", "2.4G", "20M", "CCK", "1T", "03", "32",
4017 "FCC", "2.4G", "20M", "CCK", "1T", "04", "36",
4018 "ETSI", "2.4G", "20M", "CCK", "1T", "04", "32",
4019 "MKK", "2.4G", "20M", "CCK", "1T", "04", "32",
4020 "FCC", "2.4G", "20M", "CCK", "1T", "05", "36",
4021 "ETSI", "2.4G", "20M", "CCK", "1T", "05", "32",
4022 "MKK", "2.4G", "20M", "CCK", "1T", "05", "32",
4023 "FCC", "2.4G", "20M", "CCK", "1T", "06", "36",
4024 "ETSI", "2.4G", "20M", "CCK", "1T", "06", "32",
4025 "MKK", "2.4G", "20M", "CCK", "1T", "06", "32",
4026 "FCC", "2.4G", "20M", "CCK", "1T", "07", "36",
4027 "ETSI", "2.4G", "20M", "CCK", "1T", "07", "32",
4028 "MKK", "2.4G", "20M", "CCK", "1T", "07", "32",
4029 "FCC", "2.4G", "20M", "CCK", "1T", "08", "36",
4030 "ETSI", "2.4G", "20M", "CCK", "1T", "08", "32",
4031 "MKK", "2.4G", "20M", "CCK", "1T", "08", "32",
4032 "FCC", "2.4G", "20M", "CCK", "1T", "09", "32",
4033 "ETSI", "2.4G", "20M", "CCK", "1T", "09", "32",
4034 "MKK", "2.4G", "20M", "CCK", "1T", "09", "32",
4035 "FCC", "2.4G", "20M", "CCK", "1T", "10", "32",
4036 "ETSI", "2.4G", "20M", "CCK", "1T", "10", "32",
4037 "MKK", "2.4G", "20M", "CCK", "1T", "10", "32",
4038 "FCC", "2.4G", "20M", "CCK", "1T", "11", "32",
4039 "ETSI", "2.4G", "20M", "CCK", "1T", "11", "32",
4040 "MKK", "2.4G", "20M", "CCK", "1T", "11", "32",
4041 "FCC", "2.4G", "20M", "CCK", "1T", "12", "63",
4042 "ETSI", "2.4G", "20M", "CCK", "1T", "12", "32",
4043 "MKK", "2.4G", "20M", "CCK", "1T", "12", "32",
4044 "FCC", "2.4G", "20M", "CCK", "1T", "13", "63",
4045 "ETSI", "2.4G", "20M", "CCK", "1T", "13", "32",
4046 "MKK", "2.4G", "20M", "CCK", "1T", "13", "32",
4047 "FCC", "2.4G", "20M", "CCK", "1T", "14", "63",
4048 "ETSI", "2.4G", "20M", "CCK", "1T", "14", "63",
4049 "MKK", "2.4G", "20M", "CCK", "1T", "14", "32",
4050 "FCC", "2.4G", "20M", "OFDM", "1T", "01", "30",
4051 "ETSI", "2.4G", "20M", "OFDM", "1T", "01", "32",
4052 "MKK", "2.4G", "20M", "OFDM", "1T", "01", "32",
4053 "FCC", "2.4G", "20M", "OFDM", "1T", "02", "30",
4054 "ETSI", "2.4G", "20M", "OFDM", "1T", "02", "32",
4055 "MKK", "2.4G", "20M", "OFDM", "1T", "02", "32",
4056 "FCC", "2.4G", "20M", "OFDM", "1T", "03", "32",
4057 "ETSI", "2.4G", "20M", "OFDM", "1T", "03", "32",
4058 "MKK", "2.4G", "20M", "OFDM", "1T", "03", "32",
4059 "FCC", "2.4G", "20M", "OFDM", "1T", "04", "32",
4060 "ETSI", "2.4G", "20M", "OFDM", "1T", "04", "32",
4061 "MKK", "2.4G", "20M", "OFDM", "1T", "04", "32",
4062 "FCC", "2.4G", "20M", "OFDM", "1T", "05", "32",
4063 "ETSI", "2.4G", "20M", "OFDM", "1T", "05", "32",
4064 "MKK", "2.4G", "20M", "OFDM", "1T", "05", "32",
4065 "FCC", "2.4G", "20M", "OFDM", "1T", "06", "32",
4066 "ETSI", "2.4G", "20M", "OFDM", "1T", "06", "32",
4067 "MKK", "2.4G", "20M", "OFDM", "1T", "06", "32",
4068 "FCC", "2.4G", "20M", "OFDM", "1T", "07", "32",
4069 "ETSI", "2.4G", "20M", "OFDM", "1T", "07", "32",
4070 "MKK", "2.4G", "20M", "OFDM", "1T", "07", "32",
4071 "FCC", "2.4G", "20M", "OFDM", "1T", "08", "32",
4072 "ETSI", "2.4G", "20M", "OFDM", "1T", "08", "32",
4073 "MKK", "2.4G", "20M", "OFDM", "1T", "08", "32",
4074 "FCC", "2.4G", "20M", "OFDM", "1T", "09", "30",
4075 "ETSI", "2.4G", "20M", "OFDM", "1T", "09", "32",
4076 "MKK", "2.4G", "20M", "OFDM", "1T", "09", "32",
4077 "FCC", "2.4G", "20M", "OFDM", "1T", "10", "30",
4078 "ETSI", "2.4G", "20M", "OFDM", "1T", "10", "32",
4079 "MKK", "2.4G", "20M", "OFDM", "1T", "10", "32",
4080 "FCC", "2.4G", "20M", "OFDM", "1T", "11", "30",
4081 "ETSI", "2.4G", "20M", "OFDM", "1T", "11", "32",
4082 "MKK", "2.4G", "20M", "OFDM", "1T", "11", "32",
4083 "FCC", "2.4G", "20M", "OFDM", "1T", "12", "63",
4084 "ETSI", "2.4G", "20M", "OFDM", "1T", "12", "32",
4085 "MKK", "2.4G", "20M", "OFDM", "1T", "12", "32",
4086 "FCC", "2.4G", "20M", "OFDM", "1T", "13", "63",
4087 "ETSI", "2.4G", "20M", "OFDM", "1T", "13", "32",
4088 "MKK", "2.4G", "20M", "OFDM", "1T", "13", "32",
4089 "FCC", "2.4G", "20M", "OFDM", "1T", "14", "63",
4090 "ETSI", "2.4G", "20M", "OFDM", "1T", "14", "63",
4091 "MKK", "2.4G", "20M", "OFDM", "1T", "14", "63",
4092 "FCC", "2.4G", "20M", "HT", "1T", "01", "26",
4093 "ETSI", "2.4G", "20M", "HT", "1T", "01", "32",
4094 "MKK", "2.4G", "20M", "HT", "1T", "01", "32",
4095 "FCC", "2.4G", "20M", "HT", "1T", "02", "26",
4096 "ETSI", "2.4G", "20M", "HT", "1T", "02", "32",
4097 "MKK", "2.4G", "20M", "HT", "1T", "02", "32",
4098 "FCC", "2.4G", "20M", "HT", "1T", "03", "32",
4099 "ETSI", "2.4G", "20M", "HT", "1T", "03", "32",
4100 "MKK", "2.4G", "20M", "HT", "1T", "03", "32",
4101 "FCC", "2.4G", "20M", "HT", "1T", "04", "32",
4102 "ETSI", "2.4G", "20M", "HT", "1T", "04", "32",
4103 "MKK", "2.4G", "20M", "HT", "1T", "04", "32",
4104 "FCC", "2.4G", "20M", "HT", "1T", "05", "32",
4105 "ETSI", "2.4G", "20M", "HT", "1T", "05", "32",
4106 "MKK", "2.4G", "20M", "HT", "1T", "05", "32",
4107 "FCC", "2.4G", "20M", "HT", "1T", "06", "32",
4108 "ETSI", "2.4G", "20M", "HT", "1T", "06", "32",
4109 "MKK", "2.4G", "20M", "HT", "1T", "06", "32",
4110 "FCC", "2.4G", "20M", "HT", "1T", "07", "32",
4111 "ETSI", "2.4G", "20M", "HT", "1T", "07", "32",
4112 "MKK", "2.4G", "20M", "HT", "1T", "07", "32",
4113 "FCC", "2.4G", "20M", "HT", "1T", "08", "32",
4114 "ETSI", "2.4G", "20M", "HT", "1T", "08", "32",
4115 "MKK", "2.4G", "20M", "HT", "1T", "08", "32",
4116 "FCC", "2.4G", "20M", "HT", "1T", "09", "26",
4117 "ETSI", "2.4G", "20M", "HT", "1T", "09", "32",
4118 "MKK", "2.4G", "20M", "HT", "1T", "09", "32",
4119 "FCC", "2.4G", "20M", "HT", "1T", "10", "26",
4120 "ETSI", "2.4G", "20M", "HT", "1T", "10", "32",
4121 "MKK", "2.4G", "20M", "HT", "1T", "10", "32",
4122 "FCC", "2.4G", "20M", "HT", "1T", "11", "26",
4123 "ETSI", "2.4G", "20M", "HT", "1T", "11", "32",
4124 "MKK", "2.4G", "20M", "HT", "1T", "11", "32",
4125 "FCC", "2.4G", "20M", "HT", "1T", "12", "63",
4126 "ETSI", "2.4G", "20M", "HT", "1T", "12", "32",
4127 "MKK", "2.4G", "20M", "HT", "1T", "12", "32",
4128 "FCC", "2.4G", "20M", "HT", "1T", "13", "63",
4129 "ETSI", "2.4G", "20M", "HT", "1T", "13", "32",
4130 "MKK", "2.4G", "20M", "HT", "1T", "13", "32",
4131 "FCC", "2.4G", "20M", "HT", "1T", "14", "63",
4132 "ETSI", "2.4G", "20M", "HT", "1T", "14", "63",
4133 "MKK", "2.4G", "20M", "HT", "1T", "14", "63",
4134 "FCC", "2.4G", "20M", "HT", "2T", "01", "30",
4135 "ETSI", "2.4G", "20M", "HT", "2T", "01", "32",
4136 "MKK", "2.4G", "20M", "HT", "2T", "01", "32",
4137 "FCC", "2.4G", "20M", "HT", "2T", "02", "32",
4138 "ETSI", "2.4G", "20M", "HT", "2T", "02", "32",
4139 "MKK", "2.4G", "20M", "HT", "2T", "02", "32",
4140 "FCC", "2.4G", "20M", "HT", "2T", "03", "32",
4141 "ETSI", "2.4G", "20M", "HT", "2T", "03", "32",
4142 "MKK", "2.4G", "20M", "HT", "2T", "03", "32",
4143 "FCC", "2.4G", "20M", "HT", "2T", "04", "32",
4144 "ETSI", "2.4G", "20M", "HT", "2T", "04", "32",
4145 "MKK", "2.4G", "20M", "HT", "2T", "04", "32",
4146 "FCC", "2.4G", "20M", "HT", "2T", "05", "32",
4147 "ETSI", "2.4G", "20M", "HT", "2T", "05", "32",
4148 "MKK", "2.4G", "20M", "HT", "2T", "05", "32",
4149 "FCC", "2.4G", "20M", "HT", "2T", "06", "32",
4150 "ETSI", "2.4G", "20M", "HT", "2T", "06", "32",
4151 "MKK", "2.4G", "20M", "HT", "2T", "06", "32",
4152 "FCC", "2.4G", "20M", "HT", "2T", "07", "32",
4153 "ETSI", "2.4G", "20M", "HT", "2T", "07", "32",
4154 "MKK", "2.4G", "20M", "HT", "2T", "07", "32",
4155 "FCC", "2.4G", "20M", "HT", "2T", "08", "32",
4156 "ETSI", "2.4G", "20M", "HT", "2T", "08", "32",
4157 "MKK", "2.4G", "20M", "HT", "2T", "08", "32",
4158 "FCC", "2.4G", "20M", "HT", "2T", "09", "32",
4159 "ETSI", "2.4G", "20M", "HT", "2T", "09", "32",
4160 "MKK", "2.4G", "20M", "HT", "2T", "09", "32",
4161 "FCC", "2.4G", "20M", "HT", "2T", "10", "32",
4162 "ETSI", "2.4G", "20M", "HT", "2T", "10", "32",
4163 "MKK", "2.4G", "20M", "HT", "2T", "10", "32",
4164 "FCC", "2.4G", "20M", "HT", "2T", "11", "30",
4165 "ETSI", "2.4G", "20M", "HT", "2T", "11", "32",
4166 "MKK", "2.4G", "20M", "HT", "2T", "11", "32",
4167 "FCC", "2.4G", "20M", "HT", "2T", "12", "63",
4168 "ETSI", "2.4G", "20M", "HT", "2T", "12", "32",
4169 "MKK", "2.4G", "20M", "HT", "2T", "12", "32",
4170 "FCC", "2.4G", "20M", "HT", "2T", "13", "63",
4171 "ETSI", "2.4G", "20M", "HT", "2T", "13", "32",
4172 "MKK", "2.4G", "20M", "HT", "2T", "13", "32",
4173 "FCC", "2.4G", "20M", "HT", "2T", "14", "63",
4174 "ETSI", "2.4G", "20M", "HT", "2T", "14", "63",
4175 "MKK", "2.4G", "20M", "HT", "2T", "14", "63",
4176 "FCC", "2.4G", "40M", "HT", "1T", "01", "63",
4177 "ETSI", "2.4G", "40M", "HT", "1T", "01", "63",
4178 "MKK", "2.4G", "40M", "HT", "1T", "01", "63",
4179 "FCC", "2.4G", "40M", "HT", "1T", "02", "63",
4180 "ETSI", "2.4G", "40M", "HT", "1T", "02", "63",
4181 "MKK", "2.4G", "40M", "HT", "1T", "02", "63",
4182 "FCC", "2.4G", "40M", "HT", "1T", "03", "26",
4183 "ETSI", "2.4G", "40M", "HT", "1T", "03", "32",
4184 "MKK", "2.4G", "40M", "HT", "1T", "03", "32",
4185 "FCC", "2.4G", "40M", "HT", "1T", "04", "26",
4186 "ETSI", "2.4G", "40M", "HT", "1T", "04", "32",
4187 "MKK", "2.4G", "40M", "HT", "1T", "04", "32",
4188 "FCC", "2.4G", "40M", "HT", "1T", "05", "26",
4189 "ETSI", "2.4G", "40M", "HT", "1T", "05", "32",
4190 "MKK", "2.4G", "40M", "HT", "1T", "05", "32",
4191 "FCC", "2.4G", "40M", "HT", "1T", "06", "32",
4192 "ETSI", "2.4G", "40M", "HT", "1T", "06", "32",
4193 "MKK", "2.4G", "40M", "HT", "1T", "06", "32",
4194 "FCC", "2.4G", "40M", "HT", "1T", "07", "32",
4195 "ETSI", "2.4G", "40M", "HT", "1T", "07", "32",
4196 "MKK", "2.4G", "40M", "HT", "1T", "07", "32",
4197 "FCC", "2.4G", "40M", "HT", "1T", "08", "32",
4198 "ETSI", "2.4G", "40M", "HT", "1T", "08", "32",
4199 "MKK", "2.4G", "40M", "HT", "1T", "08", "32",
4200 "FCC", "2.4G", "40M", "HT", "1T", "09", "26",
4201 "ETSI", "2.4G", "40M", "HT", "1T", "09", "32",
4202 "MKK", "2.4G", "40M", "HT", "1T", "09", "32",
4203 "FCC", "2.4G", "40M", "HT", "1T", "10", "26",
4204 "ETSI", "2.4G", "40M", "HT", "1T", "10", "32",
4205 "MKK", "2.4G", "40M", "HT", "1T", "10", "32",
4206 "FCC", "2.4G", "40M", "HT", "1T", "11", "26",
4207 "ETSI", "2.4G", "40M", "HT", "1T", "11", "32",
4208 "MKK", "2.4G", "40M", "HT", "1T", "11", "32",
4209 "FCC", "2.4G", "40M", "HT", "1T", "12", "63",
4210 "ETSI", "2.4G", "40M", "HT", "1T", "12", "32",
4211 "MKK", "2.4G", "40M", "HT", "1T", "12", "32",
4212 "FCC", "2.4G", "40M", "HT", "1T", "13", "63",
4213 "ETSI", "2.4G", "40M", "HT", "1T", "13", "32",
4214 "MKK", "2.4G", "40M", "HT", "1T", "13", "32",
4215 "FCC", "2.4G", "40M", "HT", "1T", "14", "63",
4216 "ETSI", "2.4G", "40M", "HT", "1T", "14", "63",
4217 "MKK", "2.4G", "40M", "HT", "1T", "14", "63",
4218 "FCC", "2.4G", "40M", "HT", "2T", "01", "63",
4219 "ETSI", "2.4G", "40M", "HT", "2T", "01", "63",
4220 "MKK", "2.4G", "40M", "HT", "2T", "01", "63",
4221 "FCC", "2.4G", "40M", "HT", "2T", "02", "63",
4222 "ETSI", "2.4G", "40M", "HT", "2T", "02", "63",
4223 "MKK", "2.4G", "40M", "HT", "2T", "02", "63",
4224 "FCC", "2.4G", "40M", "HT", "2T", "03", "30",
4225 "ETSI", "2.4G", "40M", "HT", "2T", "03", "30",
4226 "MKK", "2.4G", "40M", "HT", "2T", "03", "30",
4227 "FCC", "2.4G", "40M", "HT", "2T", "04", "32",
4228 "ETSI", "2.4G", "40M", "HT", "2T", "04", "30",
4229 "MKK", "2.4G", "40M", "HT", "2T", "04", "30",
4230 "FCC", "2.4G", "40M", "HT", "2T", "05", "32",
4231 "ETSI", "2.4G", "40M", "HT", "2T", "05", "30",
4232 "MKK", "2.4G", "40M", "HT", "2T", "05", "30",
4233 "FCC", "2.4G", "40M", "HT", "2T", "06", "32",
4234 "ETSI", "2.4G", "40M", "HT", "2T", "06", "30",
4235 "MKK", "2.4G", "40M", "HT", "2T", "06", "30",
4236 "FCC", "2.4G", "40M", "HT", "2T", "07", "32",
4237 "ETSI", "2.4G", "40M", "HT", "2T", "07", "30",
4238 "MKK", "2.4G", "40M", "HT", "2T", "07", "30",
4239 "FCC", "2.4G", "40M", "HT", "2T", "08", "32",
4240 "ETSI", "2.4G", "40M", "HT", "2T", "08", "30",
4241 "MKK", "2.4G", "40M", "HT", "2T", "08", "30",
4242 "FCC", "2.4G", "40M", "HT", "2T", "09", "32",
4243 "ETSI", "2.4G", "40M", "HT", "2T", "09", "30",
4244 "MKK", "2.4G", "40M", "HT", "2T", "09", "30",
4245 "FCC", "2.4G", "40M", "HT", "2T", "10", "32",
4246 "ETSI", "2.4G", "40M", "HT", "2T", "10", "30",
4247 "MKK", "2.4G", "40M", "HT", "2T", "10", "30",
4248 "FCC", "2.4G", "40M", "HT", "2T", "11", "30",
4249 "ETSI", "2.4G", "40M", "HT", "2T", "11", "30",
4250 "MKK", "2.4G", "40M", "HT", "2T", "11", "30",
4251 "FCC", "2.4G", "40M", "HT", "2T", "12", "63",
4252 "ETSI", "2.4G", "40M", "HT", "2T", "12", "32",
4253 "MKK", "2.4G", "40M", "HT", "2T", "12", "32",
4254 "FCC", "2.4G", "40M", "HT", "2T", "13", "63",
4255 "ETSI", "2.4G", "40M", "HT", "2T", "13", "32",
4256 "MKK", "2.4G", "40M", "HT", "2T", "13", "32",
4257 "FCC", "2.4G", "40M", "HT", "2T", "14", "63",
4258 "ETSI", "2.4G", "40M", "HT", "2T", "14", "63",
4259 "MKK", "2.4G", "40M", "HT", "2T", "14", "63",
4260 "FCC", "5G", "20M", "OFDM", "1T", "36", "32",
4261 "ETSI", "5G", "20M", "OFDM", "1T", "36", "30",
4262 "MKK", "5G", "20M", "OFDM", "1T", "36", "30",
4263 "FCC", "5G", "20M", "OFDM", "1T", "40", "32",
4264 "ETSI", "5G", "20M", "OFDM", "1T", "40", "30",
4265 "MKK", "5G", "20M", "OFDM", "1T", "40", "30",
4266 "FCC", "5G", "20M", "OFDM", "1T", "44", "32",
4267 "ETSI", "5G", "20M", "OFDM", "1T", "44", "30",
4268 "MKK", "5G", "20M", "OFDM", "1T", "44", "30",
4269 "FCC", "5G", "20M", "OFDM", "1T", "48", "32",
4270 "ETSI", "5G", "20M", "OFDM", "1T", "48", "30",
4271 "MKK", "5G", "20M", "OFDM", "1T", "48", "30",
4272 "FCC", "5G", "20M", "OFDM", "1T", "52", "32",
4273 "ETSI", "5G", "20M", "OFDM", "1T", "52", "30",
4274 "MKK", "5G", "20M", "OFDM", "1T", "52", "30",
4275 "FCC", "5G", "20M", "OFDM", "1T", "56", "32",
4276 "ETSI", "5G", "20M", "OFDM", "1T", "56", "30",
4277 "MKK", "5G", "20M", "OFDM", "1T", "56", "30",
4278 "FCC", "5G", "20M", "OFDM", "1T", "60", "32",
4279 "ETSI", "5G", "20M", "OFDM", "1T", "60", "30",
4280 "MKK", "5G", "20M", "OFDM", "1T", "60", "30",
4281 "FCC", "5G", "20M", "OFDM", "1T", "64", "32",
4282 "ETSI", "5G", "20M", "OFDM", "1T", "64", "30",
4283 "MKK", "5G", "20M", "OFDM", "1T", "64", "30",
4284 "FCC", "5G", "20M", "OFDM", "1T", "100", "32",
4285 "ETSI", "5G", "20M", "OFDM", "1T", "100", "30",
4286 "MKK", "5G", "20M", "OFDM", "1T", "100", "30",
4287 "FCC", "5G", "20M", "OFDM", "1T", "114", "32",
4288 "ETSI", "5G", "20M", "OFDM", "1T", "114", "30",
4289 "MKK", "5G", "20M", "OFDM", "1T", "114", "30",
4290 "FCC", "5G", "20M", "OFDM", "1T", "108", "32",
4291 "ETSI", "5G", "20M", "OFDM", "1T", "108", "30",
4292 "MKK", "5G", "20M", "OFDM", "1T", "108", "30",
4293 "FCC", "5G", "20M", "OFDM", "1T", "112", "32",
4294 "ETSI", "5G", "20M", "OFDM", "1T", "112", "30",
4295 "MKK", "5G", "20M", "OFDM", "1T", "112", "30",
4296 "FCC", "5G", "20M", "OFDM", "1T", "116", "32",
4297 "ETSI", "5G", "20M", "OFDM", "1T", "116", "30",
4298 "MKK", "5G", "20M", "OFDM", "1T", "116", "30",
4299 "FCC", "5G", "20M", "OFDM", "1T", "120", "32",
4300 "ETSI", "5G", "20M", "OFDM", "1T", "120", "30",
4301 "MKK", "5G", "20M", "OFDM", "1T", "120", "30",
4302 "FCC", "5G", "20M", "OFDM", "1T", "124", "32",
4303 "ETSI", "5G", "20M", "OFDM", "1T", "124", "30",
4304 "MKK", "5G", "20M", "OFDM", "1T", "124", "30",
4305 "FCC", "5G", "20M", "OFDM", "1T", "128", "32",
4306 "ETSI", "5G", "20M", "OFDM", "1T", "128", "30",
4307 "MKK", "5G", "20M", "OFDM", "1T", "128", "30",
4308 "FCC", "5G", "20M", "OFDM", "1T", "132", "32",
4309 "ETSI", "5G", "20M", "OFDM", "1T", "132", "30",
4310 "MKK", "5G", "20M", "OFDM", "1T", "132", "30",
4311 "FCC", "5G", "20M", "OFDM", "1T", "136", "32",
4312 "ETSI", "5G", "20M", "OFDM", "1T", "136", "30",
4313 "MKK", "5G", "20M", "OFDM", "1T", "136", "30",
4314 "FCC", "5G", "20M", "OFDM", "1T", "140", "32",
4315 "ETSI", "5G", "20M", "OFDM", "1T", "140", "30",
4316 "MKK", "5G", "20M", "OFDM", "1T", "140", "30",
4317 "FCC", "5G", "20M", "OFDM", "1T", "149", "32",
4318 "ETSI", "5G", "20M", "OFDM", "1T", "149", "30",
4319 "MKK", "5G", "20M", "OFDM", "1T", "149", "63",
4320 "FCC", "5G", "20M", "OFDM", "1T", "153", "32",
4321 "ETSI", "5G", "20M", "OFDM", "1T", "153", "30",
4322 "MKK", "5G", "20M", "OFDM", "1T", "153", "63",
4323 "FCC", "5G", "20M", "OFDM", "1T", "157", "32",
4324 "ETSI", "5G", "20M", "OFDM", "1T", "157", "30",
4325 "MKK", "5G", "20M", "OFDM", "1T", "157", "63",
4326 "FCC", "5G", "20M", "OFDM", "1T", "161", "32",
4327 "ETSI", "5G", "20M", "OFDM", "1T", "161", "30",
4328 "MKK", "5G", "20M", "OFDM", "1T", "161", "63",
4329 "FCC", "5G", "20M", "OFDM", "1T", "165", "32",
4330 "ETSI", "5G", "20M", "OFDM", "1T", "165", "30",
4331 "MKK", "5G", "20M", "OFDM", "1T", "165", "63",
4332 "FCC", "5G", "20M", "HT", "1T", "36", "32",
4333 "ETSI", "5G", "20M", "HT", "1T", "36", "30",
4334 "MKK", "5G", "20M", "HT", "1T", "36", "30",
4335 "FCC", "5G", "20M", "HT", "1T", "40", "32",
4336 "ETSI", "5G", "20M", "HT", "1T", "40", "30",
4337 "MKK", "5G", "20M", "HT", "1T", "40", "30",
4338 "FCC", "5G", "20M", "HT", "1T", "44", "32",
4339 "ETSI", "5G", "20M", "HT", "1T", "44", "30",
4340 "MKK", "5G", "20M", "HT", "1T", "44", "30",
4341 "FCC", "5G", "20M", "HT", "1T", "48", "32",
4342 "ETSI", "5G", "20M", "HT", "1T", "48", "30",
4343 "MKK", "5G", "20M", "HT", "1T", "48", "30",
4344 "FCC", "5G", "20M", "HT", "1T", "52", "32",
4345 "ETSI", "5G", "20M", "HT", "1T", "52", "30",
4346 "MKK", "5G", "20M", "HT", "1T", "52", "30",
4347 "FCC", "5G", "20M", "HT", "1T", "56", "32",
4348 "ETSI", "5G", "20M", "HT", "1T", "56", "30",
4349 "MKK", "5G", "20M", "HT", "1T", "56", "30",
4350 "FCC", "5G", "20M", "HT", "1T", "60", "32",
4351 "ETSI", "5G", "20M", "HT", "1T", "60", "30",
4352 "MKK", "5G", "20M", "HT", "1T", "60", "30",
4353 "FCC", "5G", "20M", "HT", "1T", "64", "32",
4354 "ETSI", "5G", "20M", "HT", "1T", "64", "30",
4355 "MKK", "5G", "20M", "HT", "1T", "64", "30",
4356 "FCC", "5G", "20M", "HT", "1T", "100", "32",
4357 "ETSI", "5G", "20M", "HT", "1T", "100", "30",
4358 "MKK", "5G", "20M", "HT", "1T", "100", "30",
4359 "FCC", "5G", "20M", "HT", "1T", "114", "32",
4360 "ETSI", "5G", "20M", "HT", "1T", "114", "30",
4361 "MKK", "5G", "20M", "HT", "1T", "114", "30",
4362 "FCC", "5G", "20M", "HT", "1T", "108", "32",
4363 "ETSI", "5G", "20M", "HT", "1T", "108", "30",
4364 "MKK", "5G", "20M", "HT", "1T", "108", "30",
4365 "FCC", "5G", "20M", "HT", "1T", "112", "32",
4366 "ETSI", "5G", "20M", "HT", "1T", "112", "30",
4367 "MKK", "5G", "20M", "HT", "1T", "112", "30",
4368 "FCC", "5G", "20M", "HT", "1T", "116", "32",
4369 "ETSI", "5G", "20M", "HT", "1T", "116", "30",
4370 "MKK", "5G", "20M", "HT", "1T", "116", "30",
4371 "FCC", "5G", "20M", "HT", "1T", "120", "32",
4372 "ETSI", "5G", "20M", "HT", "1T", "120", "30",
4373 "MKK", "5G", "20M", "HT", "1T", "120", "30",
4374 "FCC", "5G", "20M", "HT", "1T", "124", "32",
4375 "ETSI", "5G", "20M", "HT", "1T", "124", "30",
4376 "MKK", "5G", "20M", "HT", "1T", "124", "30",
4377 "FCC", "5G", "20M", "HT", "1T", "128", "32",
4378 "ETSI", "5G", "20M", "HT", "1T", "128", "30",
4379 "MKK", "5G", "20M", "HT", "1T", "128", "30",
4380 "FCC", "5G", "20M", "HT", "1T", "132", "32",
4381 "ETSI", "5G", "20M", "HT", "1T", "132", "30",
4382 "MKK", "5G", "20M", "HT", "1T", "132", "30",
4383 "FCC", "5G", "20M", "HT", "1T", "136", "32",
4384 "ETSI", "5G", "20M", "HT", "1T", "136", "30",
4385 "MKK", "5G", "20M", "HT", "1T", "136", "30",
4386 "FCC", "5G", "20M", "HT", "1T", "140", "32",
4387 "ETSI", "5G", "20M", "HT", "1T", "140", "30",
4388 "MKK", "5G", "20M", "HT", "1T", "140", "30",
4389 "FCC", "5G", "20M", "HT", "1T", "149", "32",
4390 "ETSI", "5G", "20M", "HT", "1T", "149", "30",
4391 "MKK", "5G", "20M", "HT", "1T", "149", "63",
4392 "FCC", "5G", "20M", "HT", "1T", "153", "32",
4393 "ETSI", "5G", "20M", "HT", "1T", "153", "30",
4394 "MKK", "5G", "20M", "HT", "1T", "153", "63",
4395 "FCC", "5G", "20M", "HT", "1T", "157", "32",
4396 "ETSI", "5G", "20M", "HT", "1T", "157", "30",
4397 "MKK", "5G", "20M", "HT", "1T", "157", "63",
4398 "FCC", "5G", "20M", "HT", "1T", "161", "32",
4399 "ETSI", "5G", "20M", "HT", "1T", "161", "30",
4400 "MKK", "5G", "20M", "HT", "1T", "161", "63",
4401 "FCC", "5G", "20M", "HT", "1T", "165", "32",
4402 "ETSI", "5G", "20M", "HT", "1T", "165", "30",
4403 "MKK", "5G", "20M", "HT", "1T", "165", "63",
4404 "FCC", "5G", "20M", "HT", "2T", "36", "28",
4405 "ETSI", "5G", "20M", "HT", "2T", "36", "30",
4406 "MKK", "5G", "20M", "HT", "2T", "36", "30",
4407 "FCC", "5G", "20M", "HT", "2T", "40", "28",
4408 "ETSI", "5G", "20M", "HT", "2T", "40", "30",
4409 "MKK", "5G", "20M", "HT", "2T", "40", "30",
4410 "FCC", "5G", "20M", "HT", "2T", "44", "28",
4411 "ETSI", "5G", "20M", "HT", "2T", "44", "30",
4412 "MKK", "5G", "20M", "HT", "2T", "44", "30",
4413 "FCC", "5G", "20M", "HT", "2T", "48", "28",
4414 "ETSI", "5G", "20M", "HT", "2T", "48", "30",
4415 "MKK", "5G", "20M", "HT", "2T", "48", "30",
4416 "FCC", "5G", "20M", "HT", "2T", "52", "34",
4417 "ETSI", "5G", "20M", "HT", "2T", "52", "30",
4418 "MKK", "5G", "20M", "HT", "2T", "52", "30",
4419 "FCC", "5G", "20M", "HT", "2T", "56", "32",
4420 "ETSI", "5G", "20M", "HT", "2T", "56", "30",
4421 "MKK", "5G", "20M", "HT", "2T", "56", "30",
4422 "FCC", "5G", "20M", "HT", "2T", "60", "30",
4423 "ETSI", "5G", "20M", "HT", "2T", "60", "30",
4424 "MKK", "5G", "20M", "HT", "2T", "60", "30",
4425 "FCC", "5G", "20M", "HT", "2T", "64", "26",
4426 "ETSI", "5G", "20M", "HT", "2T", "64", "30",
4427 "MKK", "5G", "20M", "HT", "2T", "64", "30",
4428 "FCC", "5G", "20M", "HT", "2T", "100", "28",
4429 "ETSI", "5G", "20M", "HT", "2T", "100", "30",
4430 "MKK", "5G", "20M", "HT", "2T", "100", "30",
4431 "FCC", "5G", "20M", "HT", "2T", "114", "28",
4432 "ETSI", "5G", "20M", "HT", "2T", "114", "30",
4433 "MKK", "5G", "20M", "HT", "2T", "114", "30",
4434 "FCC", "5G", "20M", "HT", "2T", "108", "30",
4435 "ETSI", "5G", "20M", "HT", "2T", "108", "30",
4436 "MKK", "5G", "20M", "HT", "2T", "108", "30",
4437 "FCC", "5G", "20M", "HT", "2T", "112", "32",
4438 "ETSI", "5G", "20M", "HT", "2T", "112", "30",
4439 "MKK", "5G", "20M", "HT", "2T", "112", "30",
4440 "FCC", "5G", "20M", "HT", "2T", "116", "32",
4441 "ETSI", "5G", "20M", "HT", "2T", "116", "30",
4442 "MKK", "5G", "20M", "HT", "2T", "116", "30",
4443 "FCC", "5G", "20M", "HT", "2T", "120", "34",
4444 "ETSI", "5G", "20M", "HT", "2T", "120", "30",
4445 "MKK", "5G", "20M", "HT", "2T", "120", "30",
4446 "FCC", "5G", "20M", "HT", "2T", "124", "32",
4447 "ETSI", "5G", "20M", "HT", "2T", "124", "30",
4448 "MKK", "5G", "20M", "HT", "2T", "124", "30",
4449 "FCC", "5G", "20M", "HT", "2T", "128", "30",
4450 "ETSI", "5G", "20M", "HT", "2T", "128", "30",
4451 "MKK", "5G", "20M", "HT", "2T", "128", "30",
4452 "FCC", "5G", "20M", "HT", "2T", "132", "28",
4453 "ETSI", "5G", "20M", "HT", "2T", "132", "30",
4454 "MKK", "5G", "20M", "HT", "2T", "132", "30",
4455 "FCC", "5G", "20M", "HT", "2T", "136", "28",
4456 "ETSI", "5G", "20M", "HT", "2T", "136", "30",
4457 "MKK", "5G", "20M", "HT", "2T", "136", "30",
4458 "FCC", "5G", "20M", "HT", "2T", "140", "26",
4459 "ETSI", "5G", "20M", "HT", "2T", "140", "30",
4460 "MKK", "5G", "20M", "HT", "2T", "140", "30",
4461 "FCC", "5G", "20M", "HT", "2T", "149", "34",
4462 "ETSI", "5G", "20M", "HT", "2T", "149", "30",
4463 "MKK", "5G", "20M", "HT", "2T", "149", "63",
4464 "FCC", "5G", "20M", "HT", "2T", "153", "34",
4465 "ETSI", "5G", "20M", "HT", "2T", "153", "30",
4466 "MKK", "5G", "20M", "HT", "2T", "153", "63",
4467 "FCC", "5G", "20M", "HT", "2T", "157", "34",
4468 "ETSI", "5G", "20M", "HT", "2T", "157", "30",
4469 "MKK", "5G", "20M", "HT", "2T", "157", "63",
4470 "FCC", "5G", "20M", "HT", "2T", "161", "34",
4471 "ETSI", "5G", "20M", "HT", "2T", "161", "30",
4472 "MKK", "5G", "20M", "HT", "2T", "161", "63",
4473 "FCC", "5G", "20M", "HT", "2T", "165", "34",
4474 "ETSI", "5G", "20M", "HT", "2T", "165", "30",
4475 "MKK", "5G", "20M", "HT", "2T", "165", "63",
4476 "FCC", "5G", "40M", "HT", "1T", "38", "26",
4477 "ETSI", "5G", "40M", "HT", "1T", "38", "30",
4478 "MKK", "5G", "40M", "HT", "1T", "38", "30",
4479 "FCC", "5G", "40M", "HT", "1T", "46", "32",
4480 "ETSI", "5G", "40M", "HT", "1T", "46", "30",
4481 "MKK", "5G", "40M", "HT", "1T", "46", "30",
4482 "FCC", "5G", "40M", "HT", "1T", "54", "32",
4483 "ETSI", "5G", "40M", "HT", "1T", "54", "30",
4484 "MKK", "5G", "40M", "HT", "1T", "54", "30",
4485 "FCC", "5G", "40M", "HT", "1T", "62", "24",
4486 "ETSI", "5G", "40M", "HT", "1T", "62", "30",
4487 "MKK", "5G", "40M", "HT", "1T", "62", "30",
4488 "FCC", "5G", "40M", "HT", "1T", "102", "24",
4489 "ETSI", "5G", "40M", "HT", "1T", "102", "30",
4490 "MKK", "5G", "40M", "HT", "1T", "102", "30",
4491 "FCC", "5G", "40M", "HT", "1T", "110", "32",
4492 "ETSI", "5G", "40M", "HT", "1T", "110", "30",
4493 "MKK", "5G", "40M", "HT", "1T", "110", "30",
4494 "FCC", "5G", "40M", "HT", "1T", "118", "32",
4495 "ETSI", "5G", "40M", "HT", "1T", "118", "30",
4496 "MKK", "5G", "40M", "HT", "1T", "118", "30",
4497 "FCC", "5G", "40M", "HT", "1T", "126", "32",
4498 "ETSI", "5G", "40M", "HT", "1T", "126", "30",
4499 "MKK", "5G", "40M", "HT", "1T", "126", "30",
4500 "FCC", "5G", "40M", "HT", "1T", "134", "32",
4501 "ETSI", "5G", "40M", "HT", "1T", "134", "30",
4502 "MKK", "5G", "40M", "HT", "1T", "134", "30",
4503 "FCC", "5G", "40M", "HT", "1T", "151", "30",
4504 "ETSI", "5G", "40M", "HT", "1T", "151", "30",
4505 "MKK", "5G", "40M", "HT", "1T", "151", "63",
4506 "FCC", "5G", "40M", "HT", "1T", "159", "32",
4507 "ETSI", "5G", "40M", "HT", "1T", "159", "30",
4508 "MKK", "5G", "40M", "HT", "1T", "159", "63",
4509 "FCC", "5G", "40M", "HT", "2T", "38", "28",
4510 "ETSI", "5G", "40M", "HT", "2T", "38", "30",
4511 "MKK", "5G", "40M", "HT", "2T", "38", "30",
4512 "FCC", "5G", "40M", "HT", "2T", "46", "28",
4513 "ETSI", "5G", "40M", "HT", "2T", "46", "30",
4514 "MKK", "5G", "40M", "HT", "2T", "46", "30",
4515 "FCC", "5G", "40M", "HT", "2T", "54", "30",
4516 "ETSI", "5G", "40M", "HT", "2T", "54", "30",
4517 "MKK", "5G", "40M", "HT", "2T", "54", "30",
4518 "FCC", "5G", "40M", "HT", "2T", "62", "30",
4519 "ETSI", "5G", "40M", "HT", "2T", "62", "30",
4520 "MKK", "5G", "40M", "HT", "2T", "62", "30",
4521 "FCC", "5G", "40M", "HT", "2T", "102", "26",
4522 "ETSI", "5G", "40M", "HT", "2T", "102", "30",
4523 "MKK", "5G", "40M", "HT", "2T", "102", "30",
4524 "FCC", "5G", "40M", "HT", "2T", "110", "30",
4525 "ETSI", "5G", "40M", "HT", "2T", "110", "30",
4526 "MKK", "5G", "40M", "HT", "2T", "110", "30",
4527 "FCC", "5G", "40M", "HT", "2T", "118", "34",
4528 "ETSI", "5G", "40M", "HT", "2T", "118", "30",
4529 "MKK", "5G", "40M", "HT", "2T", "118", "30",
4530 "FCC", "5G", "40M", "HT", "2T", "126", "32",
4531 "ETSI", "5G", "40M", "HT", "2T", "126", "30",
4532 "MKK", "5G", "40M", "HT", "2T", "126", "30",
4533 "FCC", "5G", "40M", "HT", "2T", "134", "30",
4534 "ETSI", "5G", "40M", "HT", "2T", "134", "30",
4535 "MKK", "5G", "40M", "HT", "2T", "134", "30",
4536 "FCC", "5G", "40M", "HT", "2T", "151", "34",
4537 "ETSI", "5G", "40M", "HT", "2T", "151", "30",
4538 "MKK", "5G", "40M", "HT", "2T", "151", "63",
4539 "FCC", "5G", "40M", "HT", "2T", "159", "34",
4540 "ETSI", "5G", "40M", "HT", "2T", "159", "30",
4541 "MKK", "5G", "40M", "HT", "2T", "159", "63",
4542 "FCC", "5G", "80M", "VHT", "1T", "42", "22",
4543 "ETSI", "5G", "80M", "VHT", "1T", "42", "30",
4544 "MKK", "5G", "80M", "VHT", "1T", "42", "30",
4545 "FCC", "5G", "80M", "VHT", "1T", "58", "20",
4546 "ETSI", "5G", "80M", "VHT", "1T", "58", "30",
4547 "MKK", "5G", "80M", "VHT", "1T", "58", "30",
4548 "FCC", "5G", "80M", "VHT", "1T", "106", "20",
4549 "ETSI", "5G", "80M", "VHT", "1T", "106", "30",
4550 "MKK", "5G", "80M", "VHT", "1T", "106", "30",
4551 "FCC", "5G", "80M", "VHT", "1T", "122", "20",
4552 "ETSI", "5G", "80M", "VHT", "1T", "122", "30",
4553 "MKK", "5G", "80M", "VHT", "1T", "122", "30",
4554 "FCC", "5G", "80M", "VHT", "1T", "155", "28",
4555 "ETSI", "5G", "80M", "VHT", "1T", "155", "30",
4556 "MKK", "5G", "80M", "VHT", "1T", "155", "63",
4557 "FCC", "5G", "80M", "VHT", "2T", "42", "28",
4558 "ETSI", "5G", "80M", "VHT", "2T", "42", "30",
4559 "MKK", "5G", "80M", "VHT", "2T", "42", "30",
4560 "FCC", "5G", "80M", "VHT", "2T", "58", "26",
4561 "ETSI", "5G", "80M", "VHT", "2T", "58", "30",
4562 "MKK", "5G", "80M", "VHT", "2T", "58", "30",
4563 "FCC", "5G", "80M", "VHT", "2T", "106", "28",
4564 "ETSI", "5G", "80M", "VHT", "2T", "106", "30",
4565 "MKK", "5G", "80M", "VHT", "2T", "106", "30",
4566 "FCC", "5G", "80M", "VHT", "2T", "122", "32",
4567 "ETSI", "5G", "80M", "VHT", "2T", "122", "30",
4568 "MKK", "5G", "80M", "VHT", "2T", "122", "30",
4569 "FCC", "5G", "80M", "VHT", "2T", "155", "34",
4570 "ETSI", "5G", "80M", "VHT", "2T", "155", "30",
4571 "MKK", "5G", "80M", "VHT", "2T", "155", "63"
4572};
diff --git a/drivers/net/wireless/rtlwifi/rtl8821ae/table.h b/drivers/net/wireless/rtlwifi/rtl8821ae/table.h
new file mode 100644
index 000000000000..24bcff6bc507
--- /dev/null
+++ b/drivers/net/wireless/rtlwifi/rtl8821ae/table.h
@@ -0,0 +1,60 @@
1/******************************************************************************
2 *
3 * Copyright(c) 2009-2010 Realtek Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * The full GNU General Public License is included in this distribution in the
15 * file called LICENSE.
16 *
17 * Contact Information:
18 * wlanfae <wlanfae@realtek.com>
19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20 * Hsinchu 300, Taiwan.
21 *
22 * Created on 2010/ 5/18, 1:41
23 *
24 * Larry Finger <Larry.Finger@lwfinger.net>
25 *
26 *****************************************************************************/
27
28#ifndef __RTL8821AE_TABLE__H_
29#define __RTL8821AE_TABLE__H_
30
31#include <linux/types.h>
32#define RTL8821AEPHY_REG_1TARRAYLEN 344
33extern u32 RTL8821AE_PHY_REG_ARRAY[];
34#define RTL8812AEPHY_REG_1TARRAYLEN 490
35extern u32 RTL8812AE_PHY_REG_ARRAY[];
36#define RTL8821AEPHY_REG_ARRAY_PGLEN 90
37extern u32 RTL8821AE_PHY_REG_ARRAY_PG[];
38#define RTL8812AEPHY_REG_ARRAY_PGLEN 276
39extern u32 RTL8812AE_PHY_REG_ARRAY_PG[];
40/* #define RTL8723BE_RADIOA_1TARRAYLEN 206 */
41/* extern u8 *RTL8821AE_TXPWR_LMT_ARRAY[]; */
42#define RTL8812AE_RADIOA_1TARRAYLEN 1264
43extern u32 RTL8812AE_RADIOA_ARRAY[];
44#define RTL8812AE_RADIOB_1TARRAYLEN 1240
45extern u32 RTL8812AE_RADIOB_ARRAY[];
46#define RTL8821AE_RADIOA_1TARRAYLEN 1176
47extern u32 RTL8821AE_RADIOA_ARRAY[];
48#define RTL8821AEMAC_1T_ARRAYLEN 194
49extern u32 RTL8821AE_MAC_REG_ARRAY[];
50#define RTL8812AEMAC_1T_ARRAYLEN 214
51extern u32 RTL8812AE_MAC_REG_ARRAY[];
52#define RTL8821AEAGCTAB_1TARRAYLEN 382
53extern u32 RTL8821AE_AGC_TAB_ARRAY[];
54#define RTL8812AEAGCTAB_1TARRAYLEN 1312
55extern u32 RTL8812AE_AGC_TAB_ARRAY[];
56#define RTL8812AE_TXPWR_LMT_ARRAY_LEN 3948
57extern u8 *RTL8812AE_TXPWR_LMT[];
58#define RTL8821AE_TXPWR_LMT_ARRAY_LEN 3948
59extern u8 *RTL8821AE_TXPWR_LMT[];
60#endif
diff --git a/drivers/net/wireless/rtlwifi/rtl8821ae/trx.c b/drivers/net/wireless/rtlwifi/rtl8821ae/trx.c
new file mode 100644
index 000000000000..383b86b05cba
--- /dev/null
+++ b/drivers/net/wireless/rtlwifi/rtl8821ae/trx.c
@@ -0,0 +1,1236 @@
1/******************************************************************************
2 *
3 * Copyright(c) 2009-2010 Realtek Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * The full GNU General Public License is included in this distribution in the
15 * file called LICENSE.
16 *
17 * Contact Information:
18 * wlanfae <wlanfae@realtek.com>
19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20 * Hsinchu 300, Taiwan.
21 *
22 * Larry Finger <Larry.Finger@lwfinger.net>
23 *
24 *****************************************************************************/
25
26#include "../wifi.h"
27#include "../pci.h"
28#include "../base.h"
29#include "../stats.h"
30#include "reg.h"
31#include "def.h"
32#include "phy.h"
33#include "trx.h"
34#include "led.h"
35#include "dm.h"
36#include "phy.h"
37#include "fw.h"
38
39static u8 _rtl8821ae_map_hwqueue_to_fwqueue(struct sk_buff *skb, u8 hw_queue)
40{
41 __le16 fc = rtl_get_fc(skb);
42
43 if (unlikely(ieee80211_is_beacon(fc)))
44 return QSLT_BEACON;
45 if (ieee80211_is_mgmt(fc) || ieee80211_is_ctl(fc))
46 return QSLT_MGNT;
47
48 return skb->priority;
49}
50
51/* mac80211's rate_idx is like this:
52 *
53 * 2.4G band:rx_status->band == IEEE80211_BAND_2GHZ
54 *
55 * B/G rate:
56 * (rx_status->flag & RX_FLAG_HT) = 0,
57 * DESC_RATE1M-->DESC_RATE54M ==> idx is 0-->11,
58 *
59 * N rate:
60 * (rx_status->flag & RX_FLAG_HT) = 1,
61 * DESC_RATEMCS0-->DESC_RATEMCS15 ==> idx is 0-->15
62 *
63 * 5G band:rx_status->band == IEEE80211_BAND_5GHZ
64 * A rate:
65 * (rx_status->flag & RX_FLAG_HT) = 0,
66 * DESC_RATE6M-->DESC_RATE54M ==> idx is 0-->7,
67 *
68 * N rate:
69 * (rx_status->flag & RX_FLAG_HT) = 1,
70 * DESC_RATEMCS0-->DESC_RATEMCS15 ==> idx is 0-->15
71 */
72static int _rtl8821ae_rate_mapping(struct ieee80211_hw *hw,
73 bool isht, bool isvht, u8 desc_rate)
74{
75 int rate_idx;
76
77 if (!isht) {
78 if (IEEE80211_BAND_2GHZ == hw->conf.chandef.chan->band) {
79 switch (desc_rate) {
80 case DESC_RATE1M:
81 rate_idx = 0;
82 break;
83 case DESC_RATE2M:
84 rate_idx = 1;
85 break;
86 case DESC_RATE5_5M:
87 rate_idx = 2;
88 break;
89 case DESC_RATE11M:
90 rate_idx = 3;
91 break;
92 case DESC_RATE6M:
93 rate_idx = 4;
94 break;
95 case DESC_RATE9M:
96 rate_idx = 5;
97 break;
98 case DESC_RATE12M:
99 rate_idx = 6;
100 break;
101 case DESC_RATE18M:
102 rate_idx = 7;
103 break;
104 case DESC_RATE24M:
105 rate_idx = 8;
106 break;
107 case DESC_RATE36M:
108 rate_idx = 9;
109 break;
110 case DESC_RATE48M:
111 rate_idx = 10;
112 break;
113 case DESC_RATE54M:
114 rate_idx = 11;
115 break;
116 default:
117 rate_idx = 0;
118 break;
119 }
120 } else {
121 switch (desc_rate) {
122 case DESC_RATE6M:
123 rate_idx = 0;
124 break;
125 case DESC_RATE9M:
126 rate_idx = 1;
127 break;
128 case DESC_RATE12M:
129 rate_idx = 2;
130 break;
131 case DESC_RATE18M:
132 rate_idx = 3;
133 break;
134 case DESC_RATE24M:
135 rate_idx = 4;
136 break;
137 case DESC_RATE36M:
138 rate_idx = 5;
139 break;
140 case DESC_RATE48M:
141 rate_idx = 6;
142 break;
143 case DESC_RATE54M:
144 rate_idx = 7;
145 break;
146 default:
147 rate_idx = 0;
148 break;
149 }
150 }
151 } else {
152 switch (desc_rate) {
153 case DESC_RATEMCS0:
154 rate_idx = 0;
155 break;
156 case DESC_RATEMCS1:
157 rate_idx = 1;
158 break;
159 case DESC_RATEMCS2:
160 rate_idx = 2;
161 break;
162 case DESC_RATEMCS3:
163 rate_idx = 3;
164 break;
165 case DESC_RATEMCS4:
166 rate_idx = 4;
167 break;
168 case DESC_RATEMCS5:
169 rate_idx = 5;
170 break;
171 case DESC_RATEMCS6:
172 rate_idx = 6;
173 break;
174 case DESC_RATEMCS7:
175 rate_idx = 7;
176 break;
177 case DESC_RATEMCS8:
178 rate_idx = 8;
179 break;
180 case DESC_RATEMCS9:
181 rate_idx = 9;
182 break;
183 case DESC_RATEMCS10:
184 rate_idx = 10;
185 break;
186 case DESC_RATEMCS11:
187 rate_idx = 11;
188 break;
189 case DESC_RATEMCS12:
190 rate_idx = 12;
191 break;
192 case DESC_RATEMCS13:
193 rate_idx = 13;
194 break;
195 case DESC_RATEMCS14:
196 rate_idx = 14;
197 break;
198 case DESC_RATEMCS15:
199 rate_idx = 15;
200 break;
201 default:
202 rate_idx = 0;
203 break;
204 }
205 }
206
207 if (isvht) {
208 switch (desc_rate) {
209 case DESC_RATEVHT1SS_MCS0:
210 rate_idx = 0;
211 break;
212 case DESC_RATEVHT1SS_MCS1:
213 rate_idx = 1;
214 break;
215 case DESC_RATEVHT1SS_MCS2:
216 rate_idx = 2;
217 break;
218 case DESC_RATEVHT1SS_MCS3:
219 rate_idx = 3;
220 break;
221 case DESC_RATEVHT1SS_MCS4:
222 rate_idx = 4;
223 break;
224 case DESC_RATEVHT1SS_MCS5:
225 rate_idx = 5;
226 break;
227 case DESC_RATEVHT1SS_MCS6:
228 rate_idx = 6;
229 break;
230 case DESC_RATEVHT1SS_MCS7:
231 rate_idx = 7;
232 break;
233 case DESC_RATEVHT1SS_MCS8:
234 rate_idx = 8;
235 break;
236 case DESC_RATEVHT1SS_MCS9:
237 rate_idx = 9;
238 break;
239 case DESC_RATEVHT2SS_MCS0:
240 rate_idx = 0;
241 break;
242 case DESC_RATEVHT2SS_MCS1:
243 rate_idx = 1;
244 break;
245 case DESC_RATEVHT2SS_MCS2:
246 rate_idx = 2;
247 break;
248 case DESC_RATEVHT2SS_MCS3:
249 rate_idx = 3;
250 break;
251 case DESC_RATEVHT2SS_MCS4:
252 rate_idx = 4;
253 break;
254 case DESC_RATEVHT2SS_MCS5:
255 rate_idx = 5;
256 break;
257 case DESC_RATEVHT2SS_MCS6:
258 rate_idx = 6;
259 break;
260 case DESC_RATEVHT2SS_MCS7:
261 rate_idx = 7;
262 break;
263 case DESC_RATEVHT2SS_MCS8:
264 rate_idx = 8;
265 break;
266 case DESC_RATEVHT2SS_MCS9:
267 rate_idx = 9;
268 break;
269 default:
270 rate_idx = 0;
271 break;
272 }
273 }
274 return rate_idx;
275}
276
277static u16 odm_cfo(char value)
278{
279 int ret_val;
280
281 if (value < 0) {
282 ret_val = 0 - value;
283 ret_val = (ret_val << 1) + (ret_val >> 1);
284 /* set bit12 as 1 for negative cfo */
285 ret_val = ret_val | BIT(12);
286 } else {
287 ret_val = value;
288 ret_val = (ret_val << 1) + (ret_val >> 1);
289 }
290 return ret_val;
291}
292
293static void query_rxphystatus(struct ieee80211_hw *hw,
294 struct rtl_stats *pstatus, u8 *pdesc,
295 struct rx_fwinfo_8821ae *p_drvinfo,
296 bool bpacket_match_bssid,
297 bool bpacket_toself, bool packet_beacon)
298{
299 struct rtl_priv *rtlpriv = rtl_priv(hw);
300 struct phy_status_rpt *p_phystrpt = (struct phy_status_rpt *)p_drvinfo;
301 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
302 struct rtl_phy *rtlphy = &rtlpriv->phy;
303 char rx_pwr_all = 0, rx_pwr[4];
304 u8 rf_rx_num = 0, evm, evmdbm, pwdb_all;
305 u8 i, max_spatial_stream;
306 u32 rssi, total_rssi = 0;
307 bool is_cck = pstatus->is_cck;
308 u8 lan_idx, vga_idx;
309
310 /* Record it for next packet processing */
311 pstatus->packet_matchbssid = bpacket_match_bssid;
312 pstatus->packet_toself = bpacket_toself;
313 pstatus->packet_beacon = packet_beacon;
314 pstatus->rx_mimo_signalquality[0] = -1;
315 pstatus->rx_mimo_signalquality[1] = -1;
316
317 if (is_cck) {
318 u8 cck_highpwr;
319 u8 cck_agc_rpt;
320
321 cck_agc_rpt = p_phystrpt->cfosho[0];
322
323 /* (1)Hardware does not provide RSSI for CCK
324 * (2)PWDB, Average PWDB cacluated by
325 * hardware (for rate adaptive)
326 */
327 cck_highpwr = (u8)rtlphy->cck_high_power;
328
329 lan_idx = ((cck_agc_rpt & 0xE0) >> 5);
330 vga_idx = (cck_agc_rpt & 0x1f);
331 if (rtlpriv->rtlhal.hw_type == HARDWARE_TYPE_RTL8812AE) {
332 switch (lan_idx) {
333 case 7:
334 if (vga_idx <= 27)
335 /*VGA_idx = 27~2*/
336 rx_pwr_all = -100 + 2*(27-vga_idx);
337 else
338 rx_pwr_all = -100;
339 break;
340 case 6:
341 /*VGA_idx = 2~0*/
342 rx_pwr_all = -48 + 2*(2-vga_idx);
343 break;
344 case 5:
345 /*VGA_idx = 7~5*/
346 rx_pwr_all = -42 + 2*(7-vga_idx);
347 break;
348 case 4:
349 /*VGA_idx = 7~4*/
350 rx_pwr_all = -36 + 2*(7-vga_idx);
351 break;
352 case 3:
353 /*VGA_idx = 7~0*/
354 rx_pwr_all = -24 + 2*(7-vga_idx);
355 break;
356 case 2:
357 if (cck_highpwr)
358 /*VGA_idx = 5~0*/
359 rx_pwr_all = -12 + 2*(5-vga_idx);
360 else
361 rx_pwr_all = -6 + 2*(5-vga_idx);
362 break;
363 case 1:
364 rx_pwr_all = 8-2*vga_idx;
365 break;
366 case 0:
367 rx_pwr_all = 14-2*vga_idx;
368 break;
369 default:
370 break;
371 }
372 rx_pwr_all += 6;
373 pwdb_all = rtl_query_rxpwrpercentage(rx_pwr_all);
374 if (!cck_highpwr) {
375 if (pwdb_all >= 80)
376 pwdb_all =
377 ((pwdb_all - 80)<<1) +
378 ((pwdb_all - 80)>>1) + 80;
379 else if ((pwdb_all <= 78) && (pwdb_all >= 20))
380 pwdb_all += 3;
381 if (pwdb_all > 100)
382 pwdb_all = 100;
383 }
384 } else { /* 8821 */
385 char pout = -6;
386
387 switch (lan_idx) {
388 case 5:
389 rx_pwr_all = pout - 32 - (2*vga_idx);
390 break;
391 case 4:
392 rx_pwr_all = pout - 24 - (2*vga_idx);
393 break;
394 case 2:
395 rx_pwr_all = pout - 11 - (2*vga_idx);
396 break;
397 case 1:
398 rx_pwr_all = pout + 5 - (2*vga_idx);
399 break;
400 case 0:
401 rx_pwr_all = pout + 21 - (2*vga_idx);
402 break;
403 }
404 pwdb_all = rtl_query_rxpwrpercentage(rx_pwr_all);
405 }
406
407 pstatus->rx_pwdb_all = pwdb_all;
408 pstatus->recvsignalpower = rx_pwr_all;
409
410 /* (3) Get Signal Quality (EVM) */
411 if (bpacket_match_bssid) {
412 u8 sq;
413
414 if (pstatus->rx_pwdb_all > 40) {
415 sq = 100;
416 } else {
417 sq = p_phystrpt->pwdb_all;
418 if (sq > 64)
419 sq = 0;
420 else if (sq < 20)
421 sq = 100;
422 else
423 sq = ((64 - sq) * 100) / 44;
424 }
425
426 pstatus->signalquality = sq;
427 pstatus->rx_mimo_signalquality[0] = sq;
428 pstatus->rx_mimo_signalquality[1] = -1;
429 }
430 } else {
431 /* (1)Get RSSI for HT rate */
432 for (i = RF90_PATH_A; i < RF6052_MAX_PATH; i++) {
433 /* we will judge RF RX path now. */
434 if (rtlpriv->dm.rfpath_rxenable[i])
435 rf_rx_num++;
436
437 rx_pwr[i] = (p_phystrpt->gain_trsw[i] & 0x7f) - 110;
438
439 /* Translate DBM to percentage. */
440 rssi = rtl_query_rxpwrpercentage(rx_pwr[i]);
441 total_rssi += rssi;
442
443 /* Get Rx snr value in DB */
444 pstatus->rx_snr[i] = p_phystrpt->rxsnr[i] / 2;
445 rtlpriv->stats.rx_snr_db[i] = p_phystrpt->rxsnr[i] / 2;
446
447 pstatus->cfo_short[i] = odm_cfo(p_phystrpt->cfosho[i]);
448 pstatus->cfo_tail[i] = odm_cfo(p_phystrpt->cfotail[i]);
449 /* Record Signal Strength for next packet */
450 pstatus->rx_mimo_signalstrength[i] = (u8)rssi;
451 }
452
453 /* (2)PWDB, Average PWDB cacluated by
454 * hardware (for rate adaptive)
455 */
456 rx_pwr_all = ((p_drvinfo->pwdb_all >> 1) & 0x7f) - 110;
457
458 pwdb_all = rtl_query_rxpwrpercentage(rx_pwr_all);
459 pstatus->rx_pwdb_all = pwdb_all;
460 pstatus->rxpower = rx_pwr_all;
461 pstatus->recvsignalpower = rx_pwr_all;
462
463 /* (3)EVM of HT rate */
464 if ((pstatus->is_ht && pstatus->rate >= DESC_RATEMCS8 &&
465 pstatus->rate <= DESC_RATEMCS15) ||
466 (pstatus->is_vht &&
467 pstatus->rate >= DESC_RATEVHT2SS_MCS0 &&
468 pstatus->rate <= DESC_RATEVHT2SS_MCS9))
469 max_spatial_stream = 2;
470 else
471 max_spatial_stream = 1;
472
473 for (i = 0; i < max_spatial_stream; i++) {
474 evm = rtl_evm_db_to_percentage(p_phystrpt->rxevm[i]);
475 evmdbm = rtl_evm_dbm_jaguar(p_phystrpt->rxevm[i]);
476
477 if (bpacket_match_bssid) {
478 /* Fill value in RFD, Get the first
479 * spatial stream only
480 */
481 if (i == 0)
482 pstatus->signalquality = evm;
483 pstatus->rx_mimo_signalquality[i] = evm;
484 pstatus->rx_mimo_evm_dbm[i] = evmdbm;
485 }
486 }
487 if (bpacket_match_bssid) {
488 for (i = RF90_PATH_A; i <= RF90_PATH_B; i++)
489 rtl_priv(hw)->dm.cfo_tail[i] =
490 (char)p_phystrpt->cfotail[i];
491
492 rtl_priv(hw)->dm.packet_count++;
493 }
494 }
495
496 /* UI BSS List signal strength(in percentage),
497 * make it good looking, from 0~100.
498 */
499 if (is_cck)
500 pstatus->signalstrength = (u8)(rtl_signal_scale_mapping(hw,
501 pwdb_all));
502 else if (rf_rx_num != 0)
503 pstatus->signalstrength = (u8)(rtl_signal_scale_mapping(hw,
504 total_rssi /= rf_rx_num));
505 /*HW antenna diversity*/
506 rtldm->fat_table.antsel_rx_keep_0 = p_phystrpt->antidx_anta;
507 rtldm->fat_table.antsel_rx_keep_1 = p_phystrpt->antidx_antb;
508}
509
510static void translate_rx_signal_stuff(struct ieee80211_hw *hw,
511 struct sk_buff *skb,
512 struct rtl_stats *pstatus, u8 *pdesc,
513 struct rx_fwinfo_8821ae *p_drvinfo)
514{
515 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
516 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
517 struct ieee80211_hdr *hdr;
518 u8 *tmp_buf;
519 u8 *praddr;
520 u8 *psaddr;
521 __le16 fc;
522 u16 type;
523 bool packet_matchbssid, packet_toself, packet_beacon;
524
525 tmp_buf = skb->data + pstatus->rx_drvinfo_size + pstatus->rx_bufshift;
526
527 hdr = (struct ieee80211_hdr *)tmp_buf;
528 fc = hdr->frame_control;
529 type = WLAN_FC_GET_TYPE(hdr->frame_control);
530 praddr = hdr->addr1;
531 psaddr = ieee80211_get_SA(hdr);
532 ether_addr_copy(pstatus->psaddr, psaddr);
533
534 packet_matchbssid = (!ieee80211_is_ctl(fc) &&
535 (ether_addr_equal(mac->bssid,
536 ieee80211_has_tods(fc) ?
537 hdr->addr1 :
538 ieee80211_has_fromds(fc) ?
539 hdr->addr2 : hdr->addr3)) &&
540 (!pstatus->hwerror) &&
541 (!pstatus->crc) && (!pstatus->icv));
542
543 packet_toself = packet_matchbssid &&
544 (ether_addr_equal(praddr, rtlefuse->dev_addr));
545
546 if (ieee80211_is_beacon(hdr->frame_control))
547 packet_beacon = true;
548 else
549 packet_beacon = false;
550
551 if (packet_beacon && packet_matchbssid)
552 rtl_priv(hw)->dm.dbginfo.num_qry_beacon_pkt++;
553
554 if (packet_matchbssid &&
555 ieee80211_is_data_qos(hdr->frame_control) &&
556 !is_multicast_ether_addr(ieee80211_get_DA(hdr))) {
557 struct ieee80211_qos_hdr *hdr_qos =
558 (struct ieee80211_qos_hdr *)tmp_buf;
559 u16 tid = le16_to_cpu(hdr_qos->qos_ctrl) & 0xf;
560
561 if (tid != 0 && tid != 3)
562 rtl_priv(hw)->dm.dbginfo.num_non_be_pkt++;
563 }
564
565 query_rxphystatus(hw, pstatus, pdesc, p_drvinfo,
566 packet_matchbssid, packet_toself,
567 packet_beacon);
568 /*_rtl8821ae_smart_antenna(hw, pstatus); */
569 rtl_process_phyinfo(hw, tmp_buf, pstatus);
570}
571
572static void _rtl8821ae_insert_emcontent(struct rtl_tcb_desc *ptcb_desc,
573 u8 *virtualaddress)
574{
575 u32 dwtmp = 0;
576
577 memset(virtualaddress, 0, 8);
578
579 SET_EARLYMODE_PKTNUM(virtualaddress, ptcb_desc->empkt_num);
580 if (ptcb_desc->empkt_num == 1) {
581 dwtmp = ptcb_desc->empkt_len[0];
582 } else {
583 dwtmp = ptcb_desc->empkt_len[0];
584 dwtmp += ((dwtmp % 4) ? (4 - dwtmp % 4) : 0)+4;
585 dwtmp += ptcb_desc->empkt_len[1];
586 }
587 SET_EARLYMODE_LEN0(virtualaddress, dwtmp);
588
589 if (ptcb_desc->empkt_num <= 3) {
590 dwtmp = ptcb_desc->empkt_len[2];
591 } else {
592 dwtmp = ptcb_desc->empkt_len[2];
593 dwtmp += ((dwtmp % 4) ? (4 - dwtmp % 4) : 0)+4;
594 dwtmp += ptcb_desc->empkt_len[3];
595 }
596 SET_EARLYMODE_LEN1(virtualaddress, dwtmp);
597 if (ptcb_desc->empkt_num <= 5) {
598 dwtmp = ptcb_desc->empkt_len[4];
599 } else {
600 dwtmp = ptcb_desc->empkt_len[4];
601 dwtmp += ((dwtmp % 4) ? (4 - dwtmp % 4) : 0)+4;
602 dwtmp += ptcb_desc->empkt_len[5];
603 }
604 SET_EARLYMODE_LEN2_1(virtualaddress, dwtmp & 0xF);
605 SET_EARLYMODE_LEN2_2(virtualaddress, dwtmp >> 4);
606 if (ptcb_desc->empkt_num <= 7) {
607 dwtmp = ptcb_desc->empkt_len[6];
608 } else {
609 dwtmp = ptcb_desc->empkt_len[6];
610 dwtmp += ((dwtmp % 4) ? (4 - dwtmp % 4) : 0)+4;
611 dwtmp += ptcb_desc->empkt_len[7];
612 }
613 SET_EARLYMODE_LEN3(virtualaddress, dwtmp);
614 if (ptcb_desc->empkt_num <= 9) {
615 dwtmp = ptcb_desc->empkt_len[8];
616 } else {
617 dwtmp = ptcb_desc->empkt_len[8];
618 dwtmp += ((dwtmp % 4) ? (4 - dwtmp % 4) : 0)+4;
619 dwtmp += ptcb_desc->empkt_len[9];
620 }
621 SET_EARLYMODE_LEN4(virtualaddress, dwtmp);
622}
623
624static bool rtl8821ae_get_rxdesc_is_ht(struct ieee80211_hw *hw, u8 *pdesc)
625{
626 struct rtl_priv *rtlpriv = rtl_priv(hw);
627 u8 rx_rate = 0;
628
629 rx_rate = GET_RX_DESC_RXMCS(pdesc);
630
631 RT_TRACE(rtlpriv, COMP_RXDESC, DBG_LOUD, "rx_rate=0x%02x.\n", rx_rate);
632
633 if ((rx_rate >= DESC_RATEMCS0) && (rx_rate <= DESC_RATEMCS15))
634 return true;
635 return false;
636}
637
638static bool rtl8821ae_get_rxdesc_is_vht(struct ieee80211_hw *hw, u8 *pdesc)
639{
640 struct rtl_priv *rtlpriv = rtl_priv(hw);
641 u8 rx_rate = 0;
642
643 rx_rate = GET_RX_DESC_RXMCS(pdesc);
644
645 RT_TRACE(rtlpriv, COMP_RXDESC, DBG_LOUD, "rx_rate=0x%02x.\n", rx_rate);
646
647 if (rx_rate >= DESC_RATEVHT1SS_MCS0)
648 return true;
649 return false;
650}
651
652static u8 rtl8821ae_get_rx_vht_nss(struct ieee80211_hw *hw, u8 *pdesc)
653{
654 u8 rx_rate = 0;
655 u8 vht_nss = 0;
656
657 rx_rate = GET_RX_DESC_RXMCS(pdesc);
658 if ((rx_rate >= DESC_RATEVHT1SS_MCS0) &&
659 (rx_rate <= DESC_RATEVHT1SS_MCS9))
660 vht_nss = 1;
661 else if ((rx_rate >= DESC_RATEVHT2SS_MCS0) &&
662 (rx_rate <= DESC_RATEVHT2SS_MCS9))
663 vht_nss = 2;
664
665 return vht_nss;
666}
667
668bool rtl8821ae_rx_query_desc(struct ieee80211_hw *hw,
669 struct rtl_stats *status,
670 struct ieee80211_rx_status *rx_status,
671 u8 *pdesc, struct sk_buff *skb)
672{
673 struct rtl_priv *rtlpriv = rtl_priv(hw);
674 struct rx_fwinfo_8821ae *p_drvinfo;
675 struct ieee80211_hdr *hdr;
676
677 u32 phystatus = GET_RX_DESC_PHYST(pdesc);
678
679 status->length = (u16)GET_RX_DESC_PKT_LEN(pdesc);
680 status->rx_drvinfo_size = (u8)GET_RX_DESC_DRV_INFO_SIZE(pdesc) *
681 RX_DRV_INFO_SIZE_UNIT;
682 status->rx_bufshift = (u8)(GET_RX_DESC_SHIFT(pdesc) & 0x03);
683 status->icv = (u16)GET_RX_DESC_ICV(pdesc);
684 status->crc = (u16)GET_RX_DESC_CRC32(pdesc);
685 status->hwerror = (status->crc | status->icv);
686 status->decrypted = !GET_RX_DESC_SWDEC(pdesc);
687 status->rate = (u8)GET_RX_DESC_RXMCS(pdesc);
688 status->shortpreamble = (u16)GET_RX_DESC_SPLCP(pdesc);
689 status->isampdu = (bool)(GET_RX_DESC_PAGGR(pdesc) == 1);
690 status->isfirst_ampdu = (bool)(GET_RX_DESC_PAGGR(pdesc) == 1);
691 status->timestamp_low = GET_RX_DESC_TSFL(pdesc);
692 status->rx_packet_bw = GET_RX_DESC_BW(pdesc);
693 status->macid = GET_RX_DESC_MACID(pdesc);
694 status->is_short_gi = !(bool)GET_RX_DESC_SPLCP(pdesc);
695 status->is_ht = rtl8821ae_get_rxdesc_is_ht(hw, pdesc);
696 status->is_vht = rtl8821ae_get_rxdesc_is_vht(hw, pdesc);
697 status->vht_nss = rtl8821ae_get_rx_vht_nss(hw, pdesc);
698 status->is_cck = RTL8821AE_RX_HAL_IS_CCK_RATE(status->rate);
699
700 RT_TRACE(rtlpriv, COMP_RXDESC, DBG_LOUD,
701 "rx_packet_bw=%s,is_ht %d, is_vht %d, vht_nss=%d,is_short_gi %d.\n",
702 (status->rx_packet_bw == 2) ? "80M" :
703 (status->rx_packet_bw == 1) ? "40M" : "20M",
704 status->is_ht, status->is_vht, status->vht_nss,
705 status->is_short_gi);
706
707 if (GET_RX_STATUS_DESC_RPT_SEL(pdesc))
708 status->packet_report_type = C2H_PACKET;
709 else
710 status->packet_report_type = NORMAL_RX;
711
712 if (GET_RX_STATUS_DESC_PATTERN_MATCH(pdesc))
713 status->wake_match = BIT(2);
714 else if (GET_RX_STATUS_DESC_MAGIC_MATCH(pdesc))
715 status->wake_match = BIT(1);
716 else if (GET_RX_STATUS_DESC_UNICAST_MATCH(pdesc))
717 status->wake_match = BIT(0);
718 else
719 status->wake_match = 0;
720
721 if (status->wake_match)
722 RT_TRACE(rtlpriv, COMP_RXDESC, DBG_LOUD,
723 "GGGGGGGGGGGGGet Wakeup Packet!! WakeMatch=%d\n",
724 status->wake_match);
725 rx_status->freq = hw->conf.chandef.chan->center_freq;
726 rx_status->band = hw->conf.chandef.chan->band;
727
728 hdr = (struct ieee80211_hdr *)(skb->data +
729 status->rx_drvinfo_size + status->rx_bufshift);
730
731 if (status->crc)
732 rx_status->flag |= RX_FLAG_FAILED_FCS_CRC;
733
734 if (status->rx_packet_bw == HT_CHANNEL_WIDTH_20_40)
735 rx_status->flag |= RX_FLAG_40MHZ;
736 else if (status->rx_packet_bw == HT_CHANNEL_WIDTH_80)
737 rx_status->vht_flag |= RX_VHT_FLAG_80MHZ;
738 if (status->is_ht)
739 rx_status->flag |= RX_FLAG_HT;
740 if (status->is_vht)
741 rx_status->flag |= RX_FLAG_VHT;
742
743 if (status->is_short_gi)
744 rx_status->flag |= RX_FLAG_SHORT_GI;
745
746 rx_status->vht_nss = status->vht_nss;
747 rx_status->flag |= RX_FLAG_MACTIME_START;
748
749 /* hw will set status->decrypted true, if it finds the
750 * frame is open data frame or mgmt frame.
751 * So hw will not decryption robust managment frame
752 * for IEEE80211w but still set status->decrypted
753 * true, so here we should set it back to undecrypted
754 * for IEEE80211w frame, and mac80211 sw will help
755 * to decrypt it
756 */
757 if (status->decrypted) {
758 if ((!_ieee80211_is_robust_mgmt_frame(hdr)) &&
759 (ieee80211_has_protected(hdr->frame_control)))
760 rx_status->flag |= RX_FLAG_DECRYPTED;
761 else
762 rx_status->flag &= ~RX_FLAG_DECRYPTED;
763 }
764
765 /* rate_idx: index of data rate into band's
766 * supported rates or MCS index if HT rates
767 * are use (RX_FLAG_HT)
768 */
769 rx_status->rate_idx =
770 _rtl8821ae_rate_mapping(hw, status->is_ht,
771 status->is_vht, status->rate);
772
773 rx_status->mactime = status->timestamp_low;
774 if (phystatus) {
775 p_drvinfo = (struct rx_fwinfo_8821ae *)(skb->data +
776 status->rx_bufshift);
777
778 translate_rx_signal_stuff(hw, skb, status, pdesc, p_drvinfo);
779 }
780 rx_status->signal = status->recvsignalpower + 10;
781 if (status->packet_report_type == TX_REPORT2) {
782 status->macid_valid_entry[0] =
783 GET_RX_RPT2_DESC_MACID_VALID_1(pdesc);
784 status->macid_valid_entry[1] =
785 GET_RX_RPT2_DESC_MACID_VALID_2(pdesc);
786 }
787 return true;
788}
789
790static u8 rtl8821ae_bw_mapping(struct ieee80211_hw *hw,
791 struct rtl_tcb_desc *ptcb_desc)
792{
793 struct rtl_priv *rtlpriv = rtl_priv(hw);
794 struct rtl_phy *rtlphy = &rtlpriv->phy;
795 u8 bw_setting_of_desc = 0;
796
797 RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE,
798 "rtl8821ae_bw_mapping, current_chan_bw %d, packet_bw %d\n",
799 rtlphy->current_chan_bw, ptcb_desc->packet_bw);
800
801 if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_80) {
802 if (ptcb_desc->packet_bw == HT_CHANNEL_WIDTH_80)
803 bw_setting_of_desc = 2;
804 else if (ptcb_desc->packet_bw == HT_CHANNEL_WIDTH_20_40)
805 bw_setting_of_desc = 1;
806 else
807 bw_setting_of_desc = 0;
808 } else if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20_40) {
809 if ((ptcb_desc->packet_bw == HT_CHANNEL_WIDTH_20_40) ||
810 (ptcb_desc->packet_bw == HT_CHANNEL_WIDTH_80))
811 bw_setting_of_desc = 1;
812 else
813 bw_setting_of_desc = 0;
814 } else {
815 bw_setting_of_desc = 0;
816 }
817 return bw_setting_of_desc;
818}
819
820static u8 rtl8821ae_sc_mapping(struct ieee80211_hw *hw,
821 struct rtl_tcb_desc *ptcb_desc)
822{
823 struct rtl_priv *rtlpriv = rtl_priv(hw);
824 struct rtl_phy *rtlphy = &rtlpriv->phy;
825 struct rtl_mac *mac = rtl_mac(rtlpriv);
826 u8 sc_setting_of_desc = 0;
827
828 if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_80) {
829 if (ptcb_desc->packet_bw == HT_CHANNEL_WIDTH_80) {
830 sc_setting_of_desc = VHT_DATA_SC_DONOT_CARE;
831 } else if (ptcb_desc->packet_bw == HT_CHANNEL_WIDTH_20_40) {
832 if (mac->cur_80_prime_sc ==
833 HAL_PRIME_CHNL_OFFSET_LOWER)
834 sc_setting_of_desc =
835 VHT_DATA_SC_40_LOWER_OF_80MHZ;
836 else if (mac->cur_80_prime_sc ==
837 HAL_PRIME_CHNL_OFFSET_UPPER)
838 sc_setting_of_desc =
839 VHT_DATA_SC_40_UPPER_OF_80MHZ;
840 else
841 RT_TRACE(rtlpriv, COMP_SEND, DBG_LOUD,
842 "rtl8821ae_sc_mapping: Not Correct Primary40MHz Setting\n");
843 } else {
844 if ((mac->cur_40_prime_sc ==
845 HAL_PRIME_CHNL_OFFSET_LOWER) &&
846 (mac->cur_80_prime_sc ==
847 HAL_PRIME_CHNL_OFFSET_LOWER))
848 sc_setting_of_desc =
849 VHT_DATA_SC_20_LOWEST_OF_80MHZ;
850 else if ((mac->cur_40_prime_sc ==
851 HAL_PRIME_CHNL_OFFSET_UPPER) &&
852 (mac->cur_80_prime_sc ==
853 HAL_PRIME_CHNL_OFFSET_LOWER))
854 sc_setting_of_desc =
855 VHT_DATA_SC_20_LOWER_OF_80MHZ;
856 else if ((mac->cur_40_prime_sc ==
857 HAL_PRIME_CHNL_OFFSET_LOWER) &&
858 (mac->cur_80_prime_sc ==
859 HAL_PRIME_CHNL_OFFSET_UPPER))
860 sc_setting_of_desc =
861 VHT_DATA_SC_20_UPPER_OF_80MHZ;
862 else if ((mac->cur_40_prime_sc ==
863 HAL_PRIME_CHNL_OFFSET_UPPER) &&
864 (mac->cur_80_prime_sc ==
865 HAL_PRIME_CHNL_OFFSET_UPPER))
866 sc_setting_of_desc =
867 VHT_DATA_SC_20_UPPERST_OF_80MHZ;
868 else
869 RT_TRACE(rtlpriv, COMP_SEND, DBG_LOUD,
870 "rtl8821ae_sc_mapping: Not Correct Primary40MHz Setting\n");
871 }
872 } else if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20_40) {
873 if (ptcb_desc->packet_bw == HT_CHANNEL_WIDTH_20_40) {
874 sc_setting_of_desc = VHT_DATA_SC_DONOT_CARE;
875 } else if (ptcb_desc->packet_bw == HT_CHANNEL_WIDTH_20) {
876 if (mac->cur_40_prime_sc ==
877 HAL_PRIME_CHNL_OFFSET_UPPER) {
878 sc_setting_of_desc =
879 VHT_DATA_SC_20_UPPER_OF_80MHZ;
880 } else if (mac->cur_40_prime_sc ==
881 HAL_PRIME_CHNL_OFFSET_LOWER){
882 sc_setting_of_desc =
883 VHT_DATA_SC_20_LOWER_OF_80MHZ;
884 } else {
885 sc_setting_of_desc = VHT_DATA_SC_DONOT_CARE;
886 }
887 }
888 } else {
889 sc_setting_of_desc = VHT_DATA_SC_DONOT_CARE;
890 }
891
892 return sc_setting_of_desc;
893}
894
895void rtl8821ae_tx_fill_desc(struct ieee80211_hw *hw,
896 struct ieee80211_hdr *hdr, u8 *pdesc_tx, u8 *txbd,
897 struct ieee80211_tx_info *info,
898 struct ieee80211_sta *sta,
899 struct sk_buff *skb,
900 u8 hw_queue, struct rtl_tcb_desc *ptcb_desc)
901{
902 struct rtl_priv *rtlpriv = rtl_priv(hw);
903 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
904 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
905 struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
906 u8 *pdesc = (u8 *)pdesc_tx;
907 u16 seq_number;
908 __le16 fc = hdr->frame_control;
909 unsigned int buf_len = 0;
910 unsigned int skb_len = skb->len;
911 u8 fw_qsel = _rtl8821ae_map_hwqueue_to_fwqueue(skb, hw_queue);
912 bool firstseg = ((hdr->seq_ctrl &
913 cpu_to_le16(IEEE80211_SCTL_FRAG)) == 0);
914 bool lastseg = ((hdr->frame_control &
915 cpu_to_le16(IEEE80211_FCTL_MOREFRAGS)) == 0);
916 dma_addr_t mapping;
917 u8 short_gi = 0;
918
919 seq_number = (le16_to_cpu(hdr->seq_ctrl) & IEEE80211_SCTL_SEQ) >> 4;
920 rtl_get_tcb_desc(hw, info, sta, skb, ptcb_desc);
921 /* reserve 8 byte for AMPDU early mode */
922 if (rtlhal->earlymode_enable) {
923 skb_push(skb, EM_HDR_LEN);
924 memset(skb->data, 0, EM_HDR_LEN);
925 }
926 buf_len = skb->len;
927 mapping = pci_map_single(rtlpci->pdev, skb->data, skb->len,
928 PCI_DMA_TODEVICE);
929 if (pci_dma_mapping_error(rtlpci->pdev, mapping)) {
930 RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE,
931 "DMA mapping error");
932 return;
933 }
934 CLEAR_PCI_TX_DESC_CONTENT(pdesc, sizeof(struct tx_desc_8821ae));
935 if (ieee80211_is_nullfunc(fc) || ieee80211_is_ctl(fc)) {
936 firstseg = true;
937 lastseg = true;
938 }
939 if (firstseg) {
940 if (rtlhal->earlymode_enable) {
941 SET_TX_DESC_PKT_OFFSET(pdesc, 1);
942 SET_TX_DESC_OFFSET(pdesc, USB_HWDESC_HEADER_LEN +
943 EM_HDR_LEN);
944 if (ptcb_desc->empkt_num) {
945 RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE,
946 "Insert 8 byte.pTcb->EMPktNum:%d\n",
947 ptcb_desc->empkt_num);
948 _rtl8821ae_insert_emcontent(ptcb_desc,
949 (u8 *)(skb->data));
950 }
951 } else {
952 SET_TX_DESC_OFFSET(pdesc, USB_HWDESC_HEADER_LEN);
953 }
954
955 /* ptcb_desc->use_driver_rate = true; */
956 SET_TX_DESC_TX_RATE(pdesc, ptcb_desc->hw_rate);
957 if (ptcb_desc->hw_rate > DESC_RATEMCS0)
958 short_gi = (ptcb_desc->use_shortgi) ? 1 : 0;
959 else
960 short_gi = (ptcb_desc->use_shortpreamble) ? 1 : 0;
961
962 SET_TX_DESC_DATA_SHORTGI(pdesc, short_gi);
963
964 if (info->flags & IEEE80211_TX_CTL_AMPDU) {
965 SET_TX_DESC_AGG_ENABLE(pdesc, 1);
966 SET_TX_DESC_MAX_AGG_NUM(pdesc, 0x1f);
967 }
968 SET_TX_DESC_SEQ(pdesc, seq_number);
969 SET_TX_DESC_RTS_ENABLE(pdesc, ((ptcb_desc->rts_enable &&
970 !ptcb_desc->cts_enable) ? 1 : 0));
971 SET_TX_DESC_HW_RTS_ENABLE(pdesc, 0);
972 SET_TX_DESC_CTS2SELF(pdesc, ((ptcb_desc->cts_enable) ? 1 : 0));
973
974 SET_TX_DESC_RTS_RATE(pdesc, ptcb_desc->rts_rate);
975 SET_TX_DESC_RTS_SC(pdesc, ptcb_desc->rts_sc);
976 SET_TX_DESC_RTS_SHORT(pdesc,
977 ((ptcb_desc->rts_rate <= DESC_RATE54M) ?
978 (ptcb_desc->rts_use_shortpreamble ? 1 : 0) :
979 (ptcb_desc->rts_use_shortgi ? 1 : 0)));
980
981 if (ptcb_desc->tx_enable_sw_calc_duration)
982 SET_TX_DESC_NAV_USE_HDR(pdesc, 1);
983
984 SET_TX_DESC_DATA_BW(pdesc,
985 rtl8821ae_bw_mapping(hw, ptcb_desc));
986
987 SET_TX_DESC_TX_SUB_CARRIER(pdesc,
988 rtl8821ae_sc_mapping(hw, ptcb_desc));
989
990 SET_TX_DESC_LINIP(pdesc, 0);
991 SET_TX_DESC_PKT_SIZE(pdesc, (u16)skb_len);
992 if (sta) {
993 u8 ampdu_density = sta->ht_cap.ampdu_density;
994
995 SET_TX_DESC_AMPDU_DENSITY(pdesc, ampdu_density);
996 }
997 if (info->control.hw_key) {
998 struct ieee80211_key_conf *keyconf =
999 info->control.hw_key;
1000 switch (keyconf->cipher) {
1001 case WLAN_CIPHER_SUITE_WEP40:
1002 case WLAN_CIPHER_SUITE_WEP104:
1003 case WLAN_CIPHER_SUITE_TKIP:
1004 SET_TX_DESC_SEC_TYPE(pdesc, 0x1);
1005 break;
1006 case WLAN_CIPHER_SUITE_CCMP:
1007 SET_TX_DESC_SEC_TYPE(pdesc, 0x3);
1008 break;
1009 default:
1010 SET_TX_DESC_SEC_TYPE(pdesc, 0x0);
1011 break;
1012 }
1013 }
1014
1015 SET_TX_DESC_QUEUE_SEL(pdesc, fw_qsel);
1016 SET_TX_DESC_DATA_RATE_FB_LIMIT(pdesc, 0x1F);
1017 SET_TX_DESC_RTS_RATE_FB_LIMIT(pdesc, 0xF);
1018 SET_TX_DESC_DISABLE_FB(pdesc, ptcb_desc->disable_ratefallback ?
1019 1 : 0);
1020 SET_TX_DESC_USE_RATE(pdesc, ptcb_desc->use_driver_rate ? 1 : 0);
1021
1022 if (ieee80211_is_data_qos(fc)) {
1023 if (mac->rdg_en) {
1024 RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE,
1025 "Enable RDG function.\n");
1026 SET_TX_DESC_RDG_ENABLE(pdesc, 1);
1027 SET_TX_DESC_HTC(pdesc, 1);
1028 }
1029 }
1030 }
1031
1032 SET_TX_DESC_FIRST_SEG(pdesc, (firstseg ? 1 : 0));
1033 SET_TX_DESC_LAST_SEG(pdesc, (lastseg ? 1 : 0));
1034 SET_TX_DESC_TX_BUFFER_SIZE(pdesc, (u16)buf_len);
1035 SET_TX_DESC_TX_BUFFER_ADDRESS(pdesc, mapping);
1036 /* if (rtlpriv->dm.useramask) { */
1037 if (1) {
1038 SET_TX_DESC_RATE_ID(pdesc, ptcb_desc->ratr_index);
1039 SET_TX_DESC_MACID(pdesc, ptcb_desc->mac_id);
1040 } else {
1041 SET_TX_DESC_RATE_ID(pdesc, 0xC + ptcb_desc->ratr_index);
1042 SET_TX_DESC_MACID(pdesc, ptcb_desc->mac_id);
1043 }
1044 if (!ieee80211_is_data_qos(fc)) {
1045 SET_TX_DESC_HWSEQ_EN(pdesc, 1);
1046 SET_TX_DESC_HWSEQ_SEL(pdesc, 0);
1047 }
1048 SET_TX_DESC_MORE_FRAG(pdesc, (lastseg ? 0 : 1));
1049 if (is_multicast_ether_addr(ieee80211_get_DA(hdr)) ||
1050 is_broadcast_ether_addr(ieee80211_get_DA(hdr))) {
1051 SET_TX_DESC_BMC(pdesc, 1);
1052 }
1053
1054 rtl8821ae_dm_set_tx_ant_by_tx_info(hw, pdesc, ptcb_desc->mac_id);
1055 RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE, "\n");
1056}
1057
1058void rtl8821ae_tx_fill_cmddesc(struct ieee80211_hw *hw,
1059 u8 *pdesc, bool firstseg,
1060 bool lastseg, struct sk_buff *skb)
1061{
1062 struct rtl_priv *rtlpriv = rtl_priv(hw);
1063 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1064 u8 fw_queue = QSLT_BEACON;
1065
1066 dma_addr_t mapping = pci_map_single(rtlpci->pdev,
1067 skb->data, skb->len,
1068 PCI_DMA_TODEVICE);
1069
1070 if (pci_dma_mapping_error(rtlpci->pdev, mapping)) {
1071 RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE,
1072 "DMA mapping error");
1073 return;
1074 }
1075 CLEAR_PCI_TX_DESC_CONTENT(pdesc, TX_DESC_SIZE);
1076
1077 SET_TX_DESC_FIRST_SEG(pdesc, 1);
1078 SET_TX_DESC_LAST_SEG(pdesc, 1);
1079
1080 SET_TX_DESC_PKT_SIZE((u8 *)pdesc, (u16)(skb->len));
1081
1082 SET_TX_DESC_OFFSET(pdesc, USB_HWDESC_HEADER_LEN);
1083
1084 SET_TX_DESC_USE_RATE(pdesc, 1);
1085 SET_TX_DESC_TX_RATE(pdesc, DESC_RATE1M);
1086 SET_TX_DESC_DISABLE_FB(pdesc, 1);
1087
1088 SET_TX_DESC_DATA_BW(pdesc, 0);
1089
1090 SET_TX_DESC_HWSEQ_EN(pdesc, 1);
1091
1092 SET_TX_DESC_QUEUE_SEL(pdesc, fw_queue);
1093
1094 SET_TX_DESC_TX_BUFFER_SIZE(pdesc, (u16)(skb->len));
1095
1096 SET_TX_DESC_TX_BUFFER_ADDRESS(pdesc, mapping);
1097
1098 SET_TX_DESC_MACID(pdesc, 0);
1099
1100 SET_TX_DESC_OWN(pdesc, 1);
1101
1102 RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_LOUD,
1103 "H2C Tx Cmd Content\n",
1104 pdesc, TX_DESC_SIZE);
1105}
1106
1107void rtl8821ae_set_desc(struct ieee80211_hw *hw, u8 *pdesc,
1108 bool istx, u8 desc_name, u8 *val)
1109{
1110 if (istx) {
1111 switch (desc_name) {
1112 case HW_DESC_OWN:
1113 SET_TX_DESC_OWN(pdesc, 1);
1114 break;
1115 case HW_DESC_TX_NEXTDESC_ADDR:
1116 SET_TX_DESC_NEXT_DESC_ADDRESS(pdesc, *(u32 *)val);
1117 break;
1118 default:
1119 RT_ASSERT(false,
1120 "ERR txdesc :%d not process\n", desc_name);
1121 break;
1122 }
1123 } else {
1124 switch (desc_name) {
1125 case HW_DESC_RXOWN:
1126 SET_RX_DESC_OWN(pdesc, 1);
1127 break;
1128 case HW_DESC_RXBUFF_ADDR:
1129 SET_RX_DESC_BUFF_ADDR(pdesc, *(u32 *)val);
1130 break;
1131 case HW_DESC_RXPKT_LEN:
1132 SET_RX_DESC_PKT_LEN(pdesc, *(u32 *)val);
1133 break;
1134 case HW_DESC_RXERO:
1135 SET_RX_DESC_EOR(pdesc, 1);
1136 break;
1137 default:
1138 RT_ASSERT(false,
1139 "ERR rxdesc :%d not process\n", desc_name);
1140 break;
1141 }
1142 }
1143}
1144
1145u32 rtl8821ae_get_desc(u8 *pdesc, bool istx, u8 desc_name)
1146{
1147 u32 ret = 0;
1148
1149 if (istx) {
1150 switch (desc_name) {
1151 case HW_DESC_OWN:
1152 ret = GET_TX_DESC_OWN(pdesc);
1153 break;
1154 case HW_DESC_TXBUFF_ADDR:
1155 ret = GET_TX_DESC_TX_BUFFER_ADDRESS(pdesc);
1156 break;
1157 default:
1158 RT_ASSERT(false,
1159 "ERR txdesc :%d not process\n", desc_name);
1160 break;
1161 }
1162 } else {
1163 switch (desc_name) {
1164 case HW_DESC_OWN:
1165 ret = GET_RX_DESC_OWN(pdesc);
1166 break;
1167 case HW_DESC_RXPKT_LEN:
1168 ret = GET_RX_DESC_PKT_LEN(pdesc);
1169 break;
1170 case HW_DESC_RXBUFF_ADDR:
1171 ret = GET_RX_DESC_BUFF_ADDR(pdesc);
1172 break;
1173 default:
1174 RT_ASSERT(false,
1175 "ERR rxdesc :%d not process\n", desc_name);
1176 break;
1177 }
1178 }
1179 return ret;
1180}
1181
1182bool rtl8821ae_is_tx_desc_closed(struct ieee80211_hw *hw,
1183 u8 hw_queue, u16 index)
1184{
1185 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1186 struct rtl8192_tx_ring *ring = &rtlpci->tx_ring[hw_queue];
1187 u8 *entry = (u8 *)(&ring->desc[ring->idx]);
1188 u8 own = (u8)rtl8821ae_get_desc(entry, true, HW_DESC_OWN);
1189
1190 /**
1191 *beacon packet will only use the first
1192 *descriptor defautly,and the own may not
1193 *be cleared by the hardware
1194 */
1195 if (own)
1196 return false;
1197 return true;
1198}
1199
1200void rtl8821ae_tx_polling(struct ieee80211_hw *hw, u8 hw_queue)
1201{
1202 struct rtl_priv *rtlpriv = rtl_priv(hw);
1203
1204 if (hw_queue == BEACON_QUEUE) {
1205 rtl_write_word(rtlpriv, REG_PCIE_CTRL_REG, BIT(4));
1206 } else {
1207 rtl_write_word(rtlpriv, REG_PCIE_CTRL_REG,
1208 BIT(0) << (hw_queue));
1209 }
1210}
1211
1212u32 rtl8821ae_rx_command_packet(struct ieee80211_hw *hw,
1213 struct rtl_stats status,
1214 struct sk_buff *skb)
1215{
1216 u32 result = 0;
1217 struct rtl_priv *rtlpriv = rtl_priv(hw);
1218
1219 switch (status.packet_report_type) {
1220 case NORMAL_RX:
1221 result = 0;
1222 break;
1223 case C2H_PACKET:
1224 rtl8821ae_c2h_packet_handler(hw, skb->data, (u8)skb->len);
1225 result = 1;
1226 RT_TRACE(rtlpriv, COMP_RECV, DBG_LOUD,
1227 "skb->len=%d\n\n", skb->len);
1228 break;
1229 default:
1230 RT_TRACE(rtlpriv, COMP_RECV, DBG_LOUD,
1231 "No this packet type!!\n");
1232 break;
1233 }
1234
1235 return result;
1236}
diff --git a/drivers/net/wireless/rtlwifi/rtl8821ae/trx.h b/drivers/net/wireless/rtlwifi/rtl8821ae/trx.h
new file mode 100644
index 000000000000..31409042d8dd
--- /dev/null
+++ b/drivers/net/wireless/rtlwifi/rtl8821ae/trx.h
@@ -0,0 +1,620 @@
1/******************************************************************************
2 *
3 * Copyright(c) 2009-2010 Realtek Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * The full GNU General Public License is included in this distribution in the
15 * file called LICENSE.
16 *
17 * Contact Information:
18 * wlanfae <wlanfae@realtek.com>
19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20 * Hsinchu 300, Taiwan.
21 *
22 * Larry Finger <Larry.Finger@lwfinger.net>
23 *
24 *****************************************************************************/
25
26#ifndef __RTL8821AE_TRX_H__
27#define __RTL8821AE_TRX_H__
28
29#define TX_DESC_SIZE 40
30#define TX_DESC_AGGR_SUBFRAME_SIZE 32
31
32#define RX_DESC_SIZE 32
33#define RX_DRV_INFO_SIZE_UNIT 8
34
35#define TX_DESC_NEXT_DESC_OFFSET 40
36#define USB_HWDESC_HEADER_LEN 40
37#define CRCLENGTH 4
38
39#define SET_TX_DESC_PKT_SIZE(__pdesc, __val) \
40 SET_BITS_TO_LE_4BYTE(__pdesc, 0, 16, __val)
41#define SET_TX_DESC_OFFSET(__pdesc, __val) \
42 SET_BITS_TO_LE_4BYTE(__pdesc, 16, 8, __val)
43#define SET_TX_DESC_BMC(__pdesc, __val) \
44 SET_BITS_TO_LE_4BYTE(__pdesc, 24, 1, __val)
45#define SET_TX_DESC_HTC(__pdesc, __val) \
46 SET_BITS_TO_LE_4BYTE(__pdesc, 25, 1, __val)
47#define SET_TX_DESC_LAST_SEG(__pdesc, __val) \
48 SET_BITS_TO_LE_4BYTE(__pdesc, 26, 1, __val)
49#define SET_TX_DESC_FIRST_SEG(__pdesc, __val) \
50 SET_BITS_TO_LE_4BYTE(__pdesc, 27, 1, __val)
51#define SET_TX_DESC_LINIP(__pdesc, __val) \
52 SET_BITS_TO_LE_4BYTE(__pdesc, 28, 1, __val)
53#define SET_TX_DESC_NO_ACM(__pdesc, __val) \
54 SET_BITS_TO_LE_4BYTE(__pdesc, 29, 1, __val)
55#define SET_TX_DESC_GF(__pdesc, __val) \
56 SET_BITS_TO_LE_4BYTE(__pdesc, 30, 1, __val)
57#define SET_TX_DESC_OWN(__pdesc, __val) \
58 SET_BITS_TO_LE_4BYTE(__pdesc, 31, 1, __val)
59
60#define GET_TX_DESC_PKT_SIZE(__pdesc) \
61 LE_BITS_TO_4BYTE(__pdesc, 0, 16)
62#define GET_TX_DESC_OFFSET(__pdesc) \
63 LE_BITS_TO_4BYTE(__pdesc, 16, 8)
64#define GET_TX_DESC_BMC(__pdesc) \
65 LE_BITS_TO_4BYTE(__pdesc, 24, 1)
66#define GET_TX_DESC_HTC(__pdesc) \
67 LE_BITS_TO_4BYTE(__pdesc, 25, 1)
68#define GET_TX_DESC_LAST_SEG(__pdesc) \
69 LE_BITS_TO_4BYTE(__pdesc, 26, 1)
70#define GET_TX_DESC_FIRST_SEG(__pdesc) \
71 LE_BITS_TO_4BYTE(__pdesc, 27, 1)
72#define GET_TX_DESC_LINIP(__pdesc) \
73 LE_BITS_TO_4BYTE(__pdesc, 28, 1)
74#define GET_TX_DESC_NO_ACM(__pdesc) \
75 LE_BITS_TO_4BYTE(__pdesc, 29, 1)
76#define GET_TX_DESC_GF(__pdesc) \
77 LE_BITS_TO_4BYTE(__pdesc, 30, 1)
78#define GET_TX_DESC_OWN(__pdesc) \
79 LE_BITS_TO_4BYTE(__pdesc, 31, 1)
80
81#define SET_TX_DESC_MACID(__pdesc, __val) \
82 SET_BITS_TO_LE_4BYTE(__pdesc+4, 0, 7, __val)
83#define SET_TX_DESC_QUEUE_SEL(__pdesc, __val) \
84 SET_BITS_TO_LE_4BYTE(__pdesc+4, 8, 5, __val)
85#define SET_TX_DESC_RDG_NAV_EXT(__pdesc, __val) \
86 SET_BITS_TO_LE_4BYTE(__pdesc+4, 13, 1, __val)
87#define SET_TX_DESC_LSIG_TXOP_EN(__pdesc, __val) \
88 SET_BITS_TO_LE_4BYTE(__pdesc+4, 14, 1, __val)
89#define SET_TX_DESC_PIFS(__pdesc, __val) \
90 SET_BITS_TO_LE_4BYTE(__pdesc+4, 15, 1, __val)
91#define SET_TX_DESC_RATE_ID(__pdesc, __val) \
92 SET_BITS_TO_LE_4BYTE(__pdesc+4, 16, 5, __val)
93#define SET_TX_DESC_EN_DESC_ID(__pdesc, __val) \
94 SET_BITS_TO_LE_4BYTE(__pdesc+4, 21, 1, __val)
95#define SET_TX_DESC_SEC_TYPE(__pdesc, __val) \
96 SET_BITS_TO_LE_4BYTE(__pdesc+4, 22, 2, __val)
97#define SET_TX_DESC_PKT_OFFSET(__pdesc, __val) \
98 SET_BITS_TO_LE_4BYTE(__pdesc+4, 24, 5, __val)
99
100#define SET_TX_DESC_PAID(__pdesc, __val) \
101 SET_BITS_TO_LE_4BYTE(__pdesc+8, 0, 9, __val)
102#define SET_TX_DESC_CCA_RTS(__pdesc, __val) \
103 SET_BITS_TO_LE_4BYTE(__pdesc+8, 10, 2, __val)
104#define SET_TX_DESC_AGG_ENABLE(__pdesc, __val) \
105 SET_BITS_TO_LE_4BYTE(__pdesc+8, 12, 1, __val)
106#define SET_TX_DESC_RDG_ENABLE(__pdesc, __val) \
107 SET_BITS_TO_LE_4BYTE(__pdesc+8, 13, 1, __val)
108#define SET_TX_DESC_BAR_RTY_TH(__pdesc, __val) \
109 SET_BITS_TO_LE_4BYTE(__pdesc+8, 14, 2, __val)
110#define SET_TX_DESC_AGG_BREAK(__pdesc, __val) \
111 SET_BITS_TO_LE_4BYTE(__pdesc+8, 16, 1, __val)
112#define SET_TX_DESC_MORE_FRAG(__pdesc, __val) \
113 SET_BITS_TO_LE_4BYTE(__pdesc+8, 17, 1, __val)
114#define SET_TX_DESC_RAW(__pdesc, __val) \
115 SET_BITS_TO_LE_4BYTE(__pdesc+8, 18, 1, __val)
116#define SET_TX_DESC_SPE_RPT(__pdesc, __val) \
117 SET_BITS_TO_LE_4BYTE(__pdesc+8, 19, 1, __val)
118#define SET_TX_DESC_AMPDU_DENSITY(__pdesc, __val) \
119 SET_BITS_TO_LE_4BYTE(__pdesc+8, 20, 3, __val)
120#define SET_TX_DESC_BT_INT(__pdesc, __val) \
121 SET_BITS_TO_LE_4BYTE(__pdesc+8, 23, 1, __val)
122#define SET_TX_DESC_GID(__pdesc, __val) \
123 SET_BITS_TO_LE_4BYTE(__pdesc+8, 24, 6, __val)
124
125#define SET_TX_DESC_WHEADER_LEN(__pdesc, __val) \
126 SET_BITS_TO_LE_4BYTE(__pdesc+12, 0, 4, __val)
127#define SET_TX_DESC_CHK_EN(__pdesc, __val) \
128 SET_BITS_TO_LE_4BYTE(__pdesc+12, 4, 1, __val)
129#define SET_TX_DESC_EARLY_MODE(__pdesc, __val) \
130 SET_BITS_TO_LE_4BYTE(__pdesc+12, 5, 1, __val)
131#define SET_TX_DESC_HWSEQ_SEL(__pdesc, __val) \
132 SET_BITS_TO_LE_4BYTE(__pdesc+12, 6, 2, __val)
133#define SET_TX_DESC_USE_RATE(__pdesc, __val) \
134 SET_BITS_TO_LE_4BYTE(__pdesc+12, 8, 1, __val)
135#define SET_TX_DESC_DISABLE_RTS_FB(__pdesc, __val) \
136 SET_BITS_TO_LE_4BYTE(__pdesc+12, 9, 1, __val)
137#define SET_TX_DESC_DISABLE_FB(__pdesc, __val) \
138 SET_BITS_TO_LE_4BYTE(__pdesc+12, 10, 1, __val)
139#define SET_TX_DESC_CTS2SELF(__pdesc, __val) \
140 SET_BITS_TO_LE_4BYTE(__pdesc+12, 11, 1, __val)
141#define SET_TX_DESC_RTS_ENABLE(__pdesc, __val) \
142 SET_BITS_TO_LE_4BYTE(__pdesc+12, 12, 1, __val)
143#define SET_TX_DESC_HW_RTS_ENABLE(__pdesc, __val) \
144 SET_BITS_TO_LE_4BYTE(__pdesc+12, 13, 1, __val)
145#define SET_TX_DESC_NAV_USE_HDR(__pdesc, __val) \
146 SET_BITS_TO_LE_4BYTE(__pdesc+12, 15, 1, __val)
147#define SET_TX_DESC_USE_MAX_LEN(__pdesc, __val) \
148 SET_BITS_TO_LE_4BYTE(__pdesc+12, 16, 1, __val)
149#define SET_TX_DESC_MAX_AGG_NUM(__pdesc, __val) \
150 SET_BITS_TO_LE_4BYTE(__pdesc+12, 17, 5, __val)
151#define SET_TX_DESC_NDPA(__pdesc, __val) \
152 SET_BITS_TO_LE_4BYTE(__pdesc+12, 22, 2, __val)
153#define SET_TX_DESC_AMPDU_MAX_TIME(__pdesc, __val) \
154 SET_BITS_TO_LE_4BYTE(__pdesc+12, 24, 8, __val)
155#define SET_TX_DESC_TX_ANT(__pdesc, __val) \
156 SET_BITS_TO_LE_4BYTE(__pdesc+20, 24, 4, __val)
157
158#define SET_TX_DESC_TX_RATE(__pdesc, __val) \
159 SET_BITS_TO_LE_4BYTE(__pdesc+16, 0, 7, __val)
160#define SET_TX_DESC_DATA_RATE_FB_LIMIT(__pdesc, __val) \
161 SET_BITS_TO_LE_4BYTE(__pdesc+16, 8, 5, __val)
162#define SET_TX_DESC_RTS_RATE_FB_LIMIT(__pdesc, __val) \
163 SET_BITS_TO_LE_4BYTE(__pdesc+16, 13, 4, __val)
164#define SET_TX_DESC_RETRY_LIMIT_ENABLE(__pdesc, __val) \
165 SET_BITS_TO_LE_4BYTE(__pdesc+16, 17, 1, __val)
166#define SET_TX_DESC_DATA_RETRY_LIMIT(__pdesc, __val) \
167 SET_BITS_TO_LE_4BYTE(__pdesc+16, 18, 6, __val)
168#define SET_TX_DESC_RTS_RATE(__pdesc, __val) \
169 SET_BITS_TO_LE_4BYTE(__pdesc+16, 24, 5, __val)
170
171#define SET_TX_DESC_TX_SUB_CARRIER(__pdesc, __val) \
172 SET_BITS_TO_LE_4BYTE(__pdesc+20, 0, 4, __val)
173#define SET_TX_DESC_DATA_SHORTGI(__pdesc, __val) \
174 SET_BITS_TO_LE_1BYTE(__pdesc+20, 4, 1, __val)
175#define SET_TX_DESC_DATA_BW(__pdesc, __val) \
176 SET_BITS_TO_LE_4BYTE(__pdesc+20, 5, 2, __val)
177#define SET_TX_DESC_DATA_LDPC(__pdesc, __val) \
178 SET_BITS_TO_LE_4BYTE(__pdesc+20, 7, 1, __val)
179#define SET_TX_DESC_DATA_STBC(__pdesc, __val) \
180 SET_BITS_TO_LE_4BYTE(__pdesc+20, 8, 2, __val)
181#define SET_TX_DESC_CTROL_STBC(__pdesc, __val) \
182 SET_BITS_TO_LE_4BYTE(__pdesc+20, 10, 2, __val)
183#define SET_TX_DESC_RTS_SHORT(__pdesc, __val) \
184 SET_BITS_TO_LE_4BYTE(__pdesc+20, 12, 1, __val)
185#define SET_TX_DESC_RTS_SC(__pdesc, __val) \
186 SET_BITS_TO_LE_4BYTE(__pdesc+20, 13, 4, __val)
187
188#define SET_TX_DESC_TX_BUFFER_SIZE(__pdesc, __val) \
189 SET_BITS_TO_LE_4BYTE(__pdesc+28, 0, 16, __val)
190
191#define GET_TX_DESC_TX_BUFFER_SIZE(__pdesc) \
192 LE_BITS_TO_4BYTE(__pdesc+28, 0, 16)
193
194#define SET_TX_DESC_HWSEQ_EN(__pdesc, __val) \
195 SET_BITS_TO_LE_4BYTE(__pdesc+32, 15, 1, __val)
196
197#define SET_TX_DESC_SEQ(__pdesc, __val) \
198 SET_BITS_TO_LE_4BYTE(__pdesc+36, 12, 12, __val)
199
200#define SET_TX_DESC_TX_BUFFER_ADDRESS(__pdesc, __val) \
201 SET_BITS_TO_LE_4BYTE(__pdesc+40, 0, 32, __val)
202
203#define GET_TX_DESC_TX_BUFFER_ADDRESS(__pdesc) \
204 LE_BITS_TO_4BYTE(__pdesc+40, 0, 32)
205
206#define SET_TX_DESC_NEXT_DESC_ADDRESS(__pdesc, __val) \
207 SET_BITS_TO_LE_4BYTE(__pdesc+48, 0, 32, __val)
208
209#define GET_TX_DESC_NEXT_DESC_ADDRESS(__pdesc) \
210 LE_BITS_TO_4BYTE(__pdesc+48, 0, 32)
211
212#define GET_RX_DESC_PKT_LEN(__pdesc) \
213 LE_BITS_TO_4BYTE(__pdesc, 0, 14)
214#define GET_RX_DESC_CRC32(__pdesc) \
215 LE_BITS_TO_4BYTE(__pdesc, 14, 1)
216#define GET_RX_DESC_ICV(__pdesc) \
217 LE_BITS_TO_4BYTE(__pdesc, 15, 1)
218#define GET_RX_DESC_DRV_INFO_SIZE(__pdesc) \
219 LE_BITS_TO_4BYTE(__pdesc, 16, 4)
220#define GET_RX_DESC_SECURITY(__pdesc) \
221 LE_BITS_TO_4BYTE(__pdesc, 20, 3)
222#define GET_RX_DESC_QOS(__pdesc) \
223 LE_BITS_TO_4BYTE(__pdesc, 23, 1)
224#define GET_RX_DESC_SHIFT(__pdesc) \
225 LE_BITS_TO_4BYTE(__pdesc, 24, 2)
226#define GET_RX_DESC_PHYST(__pdesc) \
227 LE_BITS_TO_4BYTE(__pdesc, 26, 1)
228#define GET_RX_DESC_SWDEC(__pdesc) \
229 LE_BITS_TO_4BYTE(__pdesc, 27, 1)
230#define GET_RX_DESC_LS(__pdesc) \
231 LE_BITS_TO_4BYTE(__pdesc, 28, 1)
232#define GET_RX_DESC_FS(__pdesc) \
233 LE_BITS_TO_4BYTE(__pdesc, 29, 1)
234#define GET_RX_DESC_EOR(__pdesc) \
235 LE_BITS_TO_4BYTE(__pdesc, 30, 1)
236#define GET_RX_DESC_OWN(__pdesc) \
237 LE_BITS_TO_4BYTE(__pdesc, 31, 1)
238
239#define SET_RX_DESC_PKT_LEN(__pdesc, __val) \
240 SET_BITS_TO_LE_4BYTE(__pdesc, 0, 14, __val)
241#define SET_RX_DESC_EOR(__pdesc, __val) \
242 SET_BITS_TO_LE_4BYTE(__pdesc, 30, 1, __val)
243#define SET_RX_DESC_OWN(__pdesc, __val) \
244 SET_BITS_TO_LE_4BYTE(__pdesc, 31, 1, __val)
245
246#define GET_RX_DESC_MACID(__pdesc) \
247 LE_BITS_TO_4BYTE(__pdesc+4, 0, 7)
248#define GET_RX_DESC_TID(__pdesc) \
249 LE_BITS_TO_4BYTE(__pdesc+4, 8, 4)
250#define GET_RX_DESC_AMSDU(__pdesc) \
251 LE_BITS_TO_4BYTE(__pdesc+4, 13, 1)
252#define GET_RX_STATUS_DESC_RXID_MATCH(__pdesc) \
253 LE_BITS_TO_4BYTE(__pdesc+4, 14, 1)
254#define GET_RX_DESC_PAGGR(__pdesc) \
255 LE_BITS_TO_4BYTE(__pdesc+4, 15, 1)
256#define GET_RX_DESC_A1_FIT(__pdesc) \
257 LE_BITS_TO_4BYTE(__pdesc+4, 16, 4)
258#define GET_RX_DESC_CHKERR(__pdesc) \
259 LE_BITS_TO_4BYTE(__pdesc+4, 20, 1)
260#define GET_RX_DESC_IPVER(__pdesc) \
261 LE_BITS_TO_4BYTE(__pdesc+4, 21, 1)
262#define GET_RX_STATUS_DESC_IS_TCPUDP(__pdesc) \
263 LE_BITS_TO_4BYTE(__pdesc+4, 22, 1)
264#define GET_RX_STATUS_DESC_CHK_VLD(__pdesc) \
265 LE_BITS_TO_4BYTE(__pdesc+4, 23, 1)
266#define GET_RX_DESC_PAM(__pdesc) \
267 LE_BITS_TO_4BYTE(__pdesc+4, 24, 1)
268#define GET_RX_DESC_PWR(__pdesc) \
269 LE_BITS_TO_4BYTE(__pdesc+4, 25, 1)
270#define GET_RX_DESC_MD(__pdesc) \
271 LE_BITS_TO_4BYTE(__pdesc+4, 26, 1)
272#define GET_RX_DESC_MF(__pdesc) \
273 LE_BITS_TO_4BYTE(__pdesc+4, 27, 1)
274#define GET_RX_DESC_TYPE(__pdesc) \
275 LE_BITS_TO_4BYTE(__pdesc+4, 28, 2)
276#define GET_RX_DESC_MC(__pdesc) \
277 LE_BITS_TO_4BYTE(__pdesc+4, 30, 1)
278#define GET_RX_DESC_BC(__pdesc) \
279 LE_BITS_TO_4BYTE(__pdesc+4, 31, 1)
280
281#define GET_RX_DESC_SEQ(__pdesc) \
282 LE_BITS_TO_4BYTE(__pdesc+8, 0, 12)
283#define GET_RX_DESC_FRAG(__pdesc) \
284 LE_BITS_TO_4BYTE(__pdesc+8, 12, 4)
285#define GET_RX_STATUS_DESC_RX_IS_QOS(__pdesc) \
286 LE_BITS_TO_4BYTE(__pdesc+8, 16, 1)
287#define GET_RX_STATUS_DESC_WLANHD_IV_LEN(__pdesc) \
288 LE_BITS_TO_4BYTE(__pdesc+8, 18, 6)
289#define GET_RX_STATUS_DESC_RPT_SEL(__pdesc) \
290 LE_BITS_TO_4BYTE(__pdesc+8, 28, 1)
291
292#define GET_RX_DESC_RXMCS(__pdesc) \
293 LE_BITS_TO_4BYTE(__pdesc+12, 0, 7)
294#define GET_RX_DESC_HTC(__pdesc) \
295 LE_BITS_TO_4BYTE(__pdesc+12, 10, 1)
296#define GET_RX_STATUS_DESC_EOSP(__pdesc) \
297 LE_BITS_TO_4BYTE(__pdesc+12, 11, 1)
298#define GET_RX_STATUS_DESC_BSSID_FIT(__pdesc) \
299 LE_BITS_TO_4BYTE(__pdesc+12, 12, 2)
300
301#define GET_RX_STATUS_DESC_PATTERN_MATCH(__pdesc) \
302 LE_BITS_TO_4BYTE(__pdesc+12, 29, 1)
303#define GET_RX_STATUS_DESC_UNICAST_MATCH(__pdesc) \
304 LE_BITS_TO_4BYTE(__pdesc+12, 30, 1)
305#define GET_RX_STATUS_DESC_MAGIC_MATCH(__pdesc) \
306 LE_BITS_TO_4BYTE(__pdesc+12, 31, 1)
307
308#define GET_RX_DESC_SPLCP(__pdesc) \
309 LE_BITS_TO_4BYTE(__pdesc+16, 0, 1)
310#define GET_RX_STATUS_DESC_LDPC(__pdesc) \
311 LE_BITS_TO_4BYTE(__pdesc+16, 1, 1)
312#define GET_RX_STATUS_DESC_STBC(__pdesc) \
313 LE_BITS_TO_4BYTE(__pdesc+16, 2, 1)
314#define GET_RX_DESC_BW(__pdesc) \
315 LE_BITS_TO_4BYTE(__pdesc+16, 4, 2)
316
317#define GET_RX_DESC_TSFL(__pdesc) \
318 LE_BITS_TO_4BYTE(__pdesc+20, 0, 32)
319
320#define GET_RX_DESC_BUFF_ADDR(__pdesc) \
321 LE_BITS_TO_4BYTE(__pdesc+24, 0, 32)
322#define GET_RX_DESC_BUFF_ADDR64(__pdesc) \
323 LE_BITS_TO_4BYTE(__pdesc+28, 0, 32)
324
325#define SET_RX_DESC_BUFF_ADDR(__pdesc, __val) \
326 SET_BITS_TO_LE_4BYTE(__pdesc+24, 0, 32, __val)
327#define SET_RX_DESC_BUFF_ADDR64(__pdesc, __val) \
328 SET_BITS_TO_LE_4BYTE(__pdesc+28, 0, 32, __val)
329
330/* TX report 2 format in Rx desc*/
331
332#define GET_RX_RPT2_DESC_PKT_LEN(__status) \
333 LE_BITS_TO_4BYTE(__status, 0, 9)
334#define GET_RX_RPT2_DESC_MACID_VALID_1(__status) \
335 LE_BITS_TO_4BYTE(__status+16, 0, 32)
336#define GET_RX_RPT2_DESC_MACID_VALID_2(__status) \
337 LE_BITS_TO_4BYTE(__status+20, 0, 32)
338
339#define SET_EARLYMODE_PKTNUM(__paddr, __value) \
340 SET_BITS_TO_LE_4BYTE(__paddr, 0, 4, __value)
341#define SET_EARLYMODE_LEN0(__paddr, __value) \
342 SET_BITS_TO_LE_4BYTE(__paddr, 4, 12, __value)
343#define SET_EARLYMODE_LEN1(__paddr, __value) \
344 SET_BITS_TO_LE_4BYTE(__paddr, 16, 12, __value)
345#define SET_EARLYMODE_LEN2_1(__paddr, __value) \
346 SET_BITS_TO_LE_4BYTE(__paddr, 28, 4, __value)
347#define SET_EARLYMODE_LEN2_2(__paddr, __value) \
348 SET_BITS_TO_LE_4BYTE(__paddr+4, 0, 8, __value)
349#define SET_EARLYMODE_LEN3(__paddr, __value) \
350 SET_BITS_TO_LE_4BYTE(__paddr+4, 8, 12, __value)
351#define SET_EARLYMODE_LEN4(__paddr, __value) \
352 SET_BITS_TO_LE_4BYTE(__paddr+4, 20, 12, __value)
353
354#define CLEAR_PCI_TX_DESC_CONTENT(__pdesc, _size) \
355do { \
356 if (_size > TX_DESC_NEXT_DESC_OFFSET) \
357 memset(__pdesc, 0, TX_DESC_NEXT_DESC_OFFSET); \
358 else \
359 memset(__pdesc, 0, _size); \
360} while (0)
361
362#define RTL8821AE_RX_HAL_IS_CCK_RATE(rxmcs)\
363 (rxmcs == DESC_RATE1M ||\
364 rxmcs == DESC_RATE2M ||\
365 rxmcs == DESC_RATE5_5M ||\
366 rxmcs == DESC_RATE11M)
367
368struct phy_rx_agc_info_t {
369 #ifdef __LITTLE_ENDIAN
370 u8 gain:7, trsw:1;
371 #else
372 u8 trsw:1, gain:7;
373 #endif
374};
375
376struct phy_status_rpt {
377 /* DWORD 0 */
378 u8 gain_trsw[2];
379#ifdef __LITTLE_ENDIAN
380 u16 chl_num:10;
381 u16 sub_chnl:4;
382 u16 r_rfmod:2;
383#else /* _BIG_ENDIAN_ */
384 u16 r_rfmod:2;
385 u16 sub_chnl:4;
386 u16 chl_num:10;
387#endif
388 /* DWORD 1 */
389 u8 pwdb_all;
390 u8 cfosho[4]; /* DW 1 byte 1 DW 2 byte 0 */
391
392 /* DWORD 2 */
393 char cfotail[4]; /* DW 2 byte 1 DW 3 byte 0 */
394
395 /* DWORD 3 */
396 char rxevm[2]; /* DW 3 byte 1 DW 3 byte 2 */
397 char rxsnr[2]; /* DW 3 byte 3 DW 4 byte 0 */
398
399 /* DWORD 4 */
400 u8 pcts_msk_rpt[2];
401 u8 pdsnr[2]; /* DW 4 byte 3 DW 5 Byte 0 */
402
403 /* DWORD 5 */
404 u8 csi_current[2];
405 u8 rx_gain_c;
406
407 /* DWORD 6 */
408 u8 rx_gain_d;
409 u8 sigevm;
410 u8 resvd_0;
411 u8 antidx_anta:3;
412 u8 antidx_antb:3;
413 u8 resvd_1:2;
414} __packed;
415
416struct rx_fwinfo_8821ae {
417 u8 gain_trsw[4];
418 u8 pwdb_all;
419 u8 cfosho[4];
420 u8 cfotail[4];
421 char rxevm[2];
422 char rxsnr[4];
423 u8 pdsnr[2];
424 u8 csi_current[2];
425 u8 csi_target[2];
426 u8 sigevm;
427 u8 max_ex_pwr;
428 u8 ex_intf_flag:1;
429 u8 sgi_en:1;
430 u8 rxsc:2;
431 u8 reserve:4;
432} __packed;
433
434struct tx_desc_8821ae {
435 u32 pktsize:16;
436 u32 offset:8;
437 u32 bmc:1;
438 u32 htc:1;
439 u32 lastseg:1;
440 u32 firstseg:1;
441 u32 linip:1;
442 u32 noacm:1;
443 u32 gf:1;
444 u32 own:1;
445
446 u32 macid:6;
447 u32 rsvd0:2;
448 u32 queuesel:5;
449 u32 rd_nav_ext:1;
450 u32 lsig_txop_en:1;
451 u32 pifs:1;
452 u32 rateid:4;
453 u32 nav_usehdr:1;
454 u32 en_descid:1;
455 u32 sectype:2;
456 u32 pktoffset:8;
457
458 u32 rts_rc:6;
459 u32 data_rc:6;
460 u32 agg_en:1;
461 u32 rdg_en:1;
462 u32 bar_retryht:2;
463 u32 agg_break:1;
464 u32 morefrag:1;
465 u32 raw:1;
466 u32 ccx:1;
467 u32 ampdudensity:3;
468 u32 bt_int:1;
469 u32 ant_sela:1;
470 u32 ant_selb:1;
471 u32 txant_cck:2;
472 u32 txant_l:2;
473 u32 txant_ht:2;
474
475 u32 nextheadpage:8;
476 u32 tailpage:8;
477 u32 seq:12;
478 u32 cpu_handle:1;
479 u32 tag1:1;
480 u32 trigger_int:1;
481 u32 hwseq_en:1;
482
483 u32 rtsrate:5;
484 u32 apdcfe:1;
485 u32 qos:1;
486 u32 hwseq_ssn:1;
487 u32 userrate:1;
488 u32 dis_rtsfb:1;
489 u32 dis_datafb:1;
490 u32 cts2self:1;
491 u32 rts_en:1;
492 u32 hwrts_en:1;
493 u32 portid:1;
494 u32 pwr_status:3;
495 u32 waitdcts:1;
496 u32 cts2ap_en:1;
497 u32 txsc:2;
498 u32 stbc:2;
499 u32 txshort:1;
500 u32 txbw:1;
501 u32 rtsshort:1;
502 u32 rtsbw:1;
503 u32 rtssc:2;
504 u32 rtsstbc:2;
505
506 u32 txrate:6;
507 u32 shortgi:1;
508 u32 ccxt:1;
509 u32 txrate_fb_lmt:5;
510 u32 rtsrate_fb_lmt:4;
511 u32 retrylmt_en:1;
512 u32 txretrylmt:6;
513 u32 usb_txaggnum:8;
514
515 u32 txagca:5;
516 u32 txagcb:5;
517 u32 usemaxlen:1;
518 u32 maxaggnum:5;
519 u32 mcsg1maxlen:4;
520 u32 mcsg2maxlen:4;
521 u32 mcsg3maxlen:4;
522 u32 mcs7sgimaxlen:4;
523
524 u32 txbuffersize:16;
525 u32 sw_offset30:8;
526 u32 sw_offset31:4;
527 u32 rsvd1:1;
528 u32 antsel_c:1;
529 u32 null_0:1;
530 u32 null_1:1;
531
532 u32 txbuffaddr;
533 u32 txbufferaddr64;
534 u32 nextdescaddress;
535 u32 nextdescaddress64;
536
537 u32 reserve_pass_pcie_mm_limit[4];
538} __packed;
539
540struct rx_desc_8821ae {
541 u32 length:14;
542 u32 crc32:1;
543 u32 icverror:1;
544 u32 drv_infosize:4;
545 u32 security:3;
546 u32 qos:1;
547 u32 shift:2;
548 u32 phystatus:1;
549 u32 swdec:1;
550 u32 lastseg:1;
551 u32 firstseg:1;
552 u32 eor:1;
553 u32 own:1;
554
555 u32 macid:6;
556 u32 tid:4;
557 u32 hwrsvd:5;
558 u32 paggr:1;
559 u32 faggr:1;
560 u32 a1_fit:4;
561 u32 a2_fit:4;
562 u32 pam:1;
563 u32 pwr:1;
564 u32 moredata:1;
565 u32 morefrag:1;
566 u32 type:2;
567 u32 mc:1;
568 u32 bc:1;
569
570 u32 seq:12;
571 u32 frag:4;
572 u32 nextpktlen:14;
573 u32 nextind:1;
574 u32 rsvd:1;
575
576 u32 rxmcs:6;
577 u32 rxht:1;
578 u32 amsdu:1;
579 u32 splcp:1;
580 u32 bandwidth:1;
581 u32 htc:1;
582 u32 tcpchk_rpt:1;
583 u32 ipcchk_rpt:1;
584 u32 tcpchk_valid:1;
585 u32 hwpcerr:1;
586 u32 hwpcind:1;
587 u32 iv0:16;
588
589 u32 iv1;
590
591 u32 tsfl;
592
593 u32 bufferaddress;
594 u32 bufferaddress64;
595
596} __packed;
597
598void rtl8821ae_tx_fill_desc(struct ieee80211_hw *hw,
599 struct ieee80211_hdr *hdr, u8 *pdesc_tx, u8 *txbd,
600 struct ieee80211_tx_info *info,
601 struct ieee80211_sta *sta,
602 struct sk_buff *skb,
603 u8 hw_queue, struct rtl_tcb_desc *ptcb_desc);
604bool rtl8821ae_rx_query_desc(struct ieee80211_hw *hw,
605 struct rtl_stats *status,
606 struct ieee80211_rx_status *rx_status,
607 u8 *pdesc, struct sk_buff *skb);
608void rtl8821ae_set_desc(struct ieee80211_hw *hw, u8 *pdesc,
609 bool istx, u8 desc_name, u8 *val);
610u32 rtl8821ae_get_desc(u8 *pdesc, bool istx, u8 desc_name);
611bool rtl8821ae_is_tx_desc_closed(struct ieee80211_hw *hw,
612 u8 hw_queue, u16 index);
613void rtl8821ae_tx_polling(struct ieee80211_hw *hw, u8 hw_queue);
614void rtl8821ae_tx_fill_cmddesc(struct ieee80211_hw *hw, u8 *pdesc,
615 bool firstseg, bool lastseg,
616 struct sk_buff *skb);
617u32 rtl8821ae_rx_command_packet(struct ieee80211_hw *hw,
618 struct rtl_stats status,
619 struct sk_buff *skb);
620#endif