xref: /freebsd/sys/dev/rtwn/rtl8821a/r21a_priv.h (revision 4928135658a9d0eaee37003df6137ab363fcb0b4)
1 /*-
2  * Copyright (c) 2016 Andriy Voskoboinyk <avos@FreeBSD.org>
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24  * SUCH DAMAGE.
25  *
26  * $FreeBSD$
27  */
28 
29 #ifndef R21A_PRIV_H
30 #define R21A_PRIV_H
31 
32 /*
33  * MAC initialization values.
34  */
35 static const struct rtwn_mac_prog rtl8821au_mac[] = {
36 	{ 0x421, 0x0f }, { 0x428, 0x0a }, { 0x429, 0x10 }, { 0x430, 0x00 },
37 	{ 0x431, 0x00 }, { 0x432, 0x00 }, { 0x433, 0x01 }, { 0x434, 0x04 },
38 	{ 0x435, 0x05 }, { 0x436, 0x07 }, { 0x437, 0x08 }, { 0x43c, 0x04 },
39 	{ 0x43d, 0x05 }, { 0x43e, 0x07 }, { 0x43f, 0x08 }, { 0x440, 0x5d },
40 	{ 0x441, 0x01 }, { 0x442, 0x00 }, { 0x444, 0x10 }, { 0x445, 0x00 },
41 	{ 0x446, 0x00 }, { 0x447, 0x00 }, { 0x448, 0x00 }, { 0x449, 0xf0 },
42 	{ 0x44a, 0x0f }, { 0x44b, 0x3e }, { 0x44c, 0x10 }, { 0x44d, 0x00 },
43 	{ 0x44e, 0x00 }, { 0x44f, 0x00 }, { 0x450, 0x00 }, { 0x451, 0xf0 },
44 	{ 0x452, 0x0f }, { 0x453, 0x00 }, { 0x456, 0x5e }, { 0x460, 0x66 },
45 	{ 0x461, 0x66 }, { 0x4c8, 0x3f }, { 0x4c9, 0xff }, { 0x4cc, 0xff },
46 	{ 0x4cd, 0xff }, { 0x4ce, 0x01 }, { 0x500, 0x26 }, { 0x501, 0xa2 },
47 	{ 0x502, 0x2f }, { 0x503, 0x00 }, { 0x504, 0x28 }, { 0x505, 0xa3 },
48 	{ 0x506, 0x5e }, { 0x507, 0x00 }, { 0x508, 0x2b }, { 0x509, 0xa4 },
49 	{ 0x50a, 0x5e }, { 0x50b, 0x00 }, { 0x50c, 0x4f }, { 0x50d, 0xa4 },
50 	{ 0x50e, 0x00 }, { 0x50f, 0x00 }, { 0x512, 0x1c }, { 0x514, 0x0a },
51 	{ 0x516, 0x0a }, { 0x525, 0x4f }, { 0x550, 0x10 }, { 0x551, 0x10 },
52 	{ 0x559, 0x02 }, { 0x55c, 0x50 }, { 0x55d, 0xff }, { 0x605, 0x30 },
53 	{ 0x607, 0x07 }, { 0x608, 0x0e }, { 0x609, 0x2a }, { 0x620, 0xff },
54 	{ 0x621, 0xff }, { 0x622, 0xff }, { 0x623, 0xff }, { 0x624, 0xff },
55 	{ 0x625, 0xff }, { 0x626, 0xff }, { 0x627, 0xff }, { 0x638, 0x50 },
56 	{ 0x63c, 0x0a }, { 0x63d, 0x0a }, { 0x63e, 0x0e }, { 0x63f, 0x0e },
57 	{ 0x640, 0x40 }, { 0x642, 0x40 }, { 0x643, 0x00 }, { 0x652, 0xc8 },
58 	{ 0x66e, 0x05 }, { 0x700, 0x21 }, { 0x701, 0x43 }, { 0x702, 0x65 },
59 	{ 0x703, 0x87 }, { 0x708, 0x21 }, { 0x709, 0x43 }, { 0x70a, 0x65 },
60 	{ 0x70b, 0x87 }, { 0x718, 0x40 }
61 };
62 
63 
64 /*
65  * Baseband initialization values.
66  */
67 #define R21A_COND_EXT_PA_5G	0x01
68 #define R21A_COND_EXT_LNA_5G	0x02
69 #define R21A_COND_BOARD_DEF	0x04
70 #define R21A_COND_BT		0x08
71 
72 static const uint16_t rtl8821au_bb_regs[] = {
73 	0x800, 0x804, 0x808, 0x80c, 0x810, 0x814, 0x818, 0x820, 0x824,
74 	0x828, 0x82c, 0x830, 0x834, 0x838, 0x83c, 0x840, 0x844, 0x848,
75 	0x84c, 0x850, 0x854, 0x858, 0x85c, 0x860, 0x864, 0x868, 0x86c,
76 	0x870, 0x874, 0x878, 0x87c, 0x8a0, 0x8a4, 0x8a8, 0x8ac, 0x8b4,
77 	0x8b8, 0x8bc, 0x8c0, 0x8c4, 0x8c8, 0x8cc, 0x8d4, 0x8d8, 0x8f8,
78 	0x8fc, 0x900, 0x90c, 0x910, 0x914, 0x918, 0x91c, 0x920, 0x924,
79 	0x928, 0x92c, 0x930, 0x934, 0x960, 0x964, 0x968, 0x96c, 0x970,
80 	0x974, 0x978, 0x97c, 0x980, 0x984, 0x988, 0x990, 0x994, 0x998,
81 	0x99c, 0x9a0, 0x9a4, 0x9a8, 0x9ac, 0x9b0, 0x9b4, 0x9b8, 0x9bc,
82 	0x9d0, 0x9d4, 0x9d8, 0x9dc, 0x9e0, 0x9e4, 0x9e8, 0xa00, 0xa04,
83 	0xa08, 0xa0c, 0xa10, 0xa14, 0xa18, 0xa1c, 0xa20, 0xa24, 0xa28,
84 	0xa2c, 0xa70, 0xa74, 0xa78, 0xa7c, 0xa80, 0xa84, 0xb00, 0xb04,
85 	0xb08, 0xb0c, 0xb10, 0xb14, 0xb18, 0xb1c, 0xb20, 0xb24, 0xb28,
86 	0xb2c, 0xb30, 0xb34, 0xb38, 0xb3c, 0xb40, 0xb44, 0xb48, 0xb4c,
87 	0xb50, 0xb54, 0xb58, 0xb5c, 0xc00, 0xc04, 0xc08, 0xc0c, 0xc10,
88 	0xc14, 0xc1c, 0xc20, 0xc24, 0xc28, 0xc2c, 0xc30, 0xc34, 0xc38,
89 	0xc3c, 0xc40, 0xc44, 0xc48, 0xc4c, 0xc50, 0xc54, 0xc58, 0xc5c,
90 	0xc60, 0xc64, 0xc68, 0xc6c, 0xc70, 0xc74, 0xc78, 0xc7c, 0xc80,
91 	0xc84, 0xc94, 0xc98, 0xc9c, 0xca0, 0xca4, 0xca8, 0xcb0, 0xcb4,
92 	0xcb8
93 };
94 
95 static const uint32_t rtl8821au_bb_vals[] = {
96 	0x0020d090, 0x080112e0, 0x0e028211, 0x92131111, 0x20101261,
97 	0x020c3d10, 0x03a00385, 0x00000000, 0x00030fe0, 0x00000000,
98 	0x002081dd, 0x2aaaeec8, 0x0037a706, 0x06489b44, 0x0000095b,
99 	0xc0000001, 0x40003cde, 0x62103f8b, 0x6cfdffb8, 0x28874706,
100 	0x0001520c, 0x8060e000, 0x74210168, 0x6929c321, 0x79727432,
101 	0x8ca7a314, 0x888c2878, 0x08888888, 0x31612c2e, 0x00000152,
102 	0x000fd000, 0x00000013, 0x7f7f7f7f, 0xa2000338, 0x0ff0fa0a,
103 	0x000fc080, 0x6c10d7ff, 0x0ca52090, 0x1bf00020, 0x00000000,
104 	0x00013169, 0x08248492, 0x940008a0, 0x290b5612, 0x400002c0,
105 	0x00000000, 0x00000700, 0x00000000, 0x0000fc00, 0x00000404,
106 	0x1c1028c0, 0x64b11a1c, 0xe0767233, 0x055aa500, 0x00000004,
107 	0xfffe0000, 0xfffffffe, 0x001fffff, 0x00000000, 0x00000000,
108 	0x00000000, 0x00000000, 0x801fffff, 0x000003ff, 0x00000000,
109 	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x27100000,
110 	0xffff0100, 0xffffff5c, 0xffffffff, 0x000000ff, 0x00480080,
111 	0x00000000, 0x00000000, 0x81081008, 0x01081008, 0x01081008,
112 	0x01081008, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
113 	0x00005d00, 0x00000003, 0x00000001, 0x00d047c8, 0x01ff800c,
114 	0x8c8a8300, 0x2e68000f, 0x9500bb78, 0x11144028, 0x00881117,
115 	0x89140f00, 0x1a1b0000, 0x090e1317, 0x00000204, 0x00900000,
116 	0x101fff00, 0x00000008, 0x00000900, 0x225b0606, 0x21805490,
117 	0x001f0000, 0x03100040, 0x0000b000, 0xae0201eb, 0x01003207,
118 	0x00009807, 0x01000000, 0x00000002, 0x00000002, 0x0000001f,
119 	0x03020100, 0x07060504, 0x0b0a0908, 0x0f0e0d0c, 0x13121110,
120 	0x17161514, 0x0000003a, 0x00000000, 0x00000000, 0x13000032,
121 	0x48080000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
122 	0x00000007, 0x00042020, 0x80410231, 0x00000000, 0x00000100,
123 	0x01000000, 0x40000003, 0x2c2c2c2c, 0x30303030, 0x30303030,
124 	0x2c2c2c2c, 0x2c2c2c2c, 0x2c2c2c2c, 0x2c2c2c2c, 0x2a2a2a2a,
125 	0x2a2a2a2a, 0x2a2a2a2a, 0x2a2a2a2a, 0x2a2a2a2a, 0x00000020,
126 	0x001c1208, 0x30000c1c, 0x00000058, 0x34344443, 0x07003333,
127 	0x19791979, 0x19791979, 0x19791979, 0x19791979, 0x19791979,
128 	0x19791979, 0x19791979, 0x19791979, 0x0100005c, 0x00000000,
129 	0x00000000, 0x00000029, 0x08040201, 0x80402010, 0x77775747,
130 	0x10000077, 0x00508240
131 };
132 
133 static const struct rtwn_bb_prog rtl8821au_bb[] = {
134 	{
135 		nitems(rtl8821au_bb_regs),
136 		rtl8821au_bb_regs,
137 		rtl8821au_bb_vals,
138 		{ 0 },
139 		NULL
140 	}
141 };
142 
143 static const uint32_t rtl8821au_agc_vals0[] = {
144 	0xbf000001, 0xbf020001, 0xbf040001, 0xbf060001, 0xbe080001,
145 	0xbd0a0001, 0xbc0c0001, 0xba0e0001, 0xb9100001, 0xb8120001,
146 	0xb7140001, 0xb6160001, 0xb5180001, 0xb41a0001, 0xb31c0001,
147 	0xb21e0001, 0xb1200001, 0xb0220001, 0xaf240001, 0xae260001,
148 	0xad280001, 0xac2a0001, 0xab2c0001, 0xaa2e0001, 0xa9300001,
149 	0xa8320001, 0xa7340001, 0xa6360001, 0xa5380001, 0xa43a0001,
150 	0x683c0001, 0x673e0001, 0x66400001, 0x65420001, 0x64440001,
151 	0x63460001, 0x62480001, 0x614a0001, 0x474c0001, 0x464e0001,
152 	0x45500001, 0x44520001, 0x43540001, 0x42560001, 0x41580001,
153 	0x285a0001, 0x275c0001, 0x265e0001, 0x25600001, 0x24620001,
154 	0x0a640001, 0x09660001, 0x08680001, 0x076a0001, 0x066c0001,
155 	0x056e0001, 0x04700001, 0x03720001, 0x02740001, 0x01760001,
156 	0x01780001, 0x017a0001, 0x017c0001, 0x017e0001
157 }, rtl8821au_agc_vals1_pa_lna_5g[] = {
158 	0xfb000101, 0xfa020101, 0xf9040101, 0xf8060101, 0xf7080101,
159 	0xf60a0101, 0xf50c0101, 0xf40e0101, 0xf3100101, 0xf2120101,
160 	0xf1140101, 0xf0160101, 0xef180101, 0xee1a0101, 0xed1c0101,
161 	0xec1e0101, 0xeb200101, 0xea220101, 0xe9240101, 0xe8260101,
162 	0xe7280101, 0xe62a0101, 0xe52c0101, 0xe42e0101, 0xe3300101,
163 	0xa5320101, 0xa4340101, 0xa3360101, 0x87380101, 0x863a0101,
164 	0x853c0101, 0x843e0101, 0x69400101, 0x68420101, 0x67440101,
165 	0x66460101, 0x49480101, 0x484a0101, 0x474c0101, 0x2a4e0101,
166 	0x29500101, 0x28520101, 0x27540101, 0x26560101, 0x25580101,
167 	0x245a0101, 0x235c0101, 0x055e0101, 0x04600101, 0x03620101,
168 	0x02640101, 0x01660101, 0x01680101, 0x016a0101, 0x016c0101,
169 	0x016e0101, 0x01700101, 0x01720101
170 }, rtl8821au_agc_vals1[] = {
171 	0xff000101, 0xff020101, 0xfe040101, 0xfd060101, 0xfc080101,
172 	0xfd0a0101, 0xfc0c0101, 0xfb0e0101, 0xfa100101, 0xf9120101,
173 	0xf8140101, 0xf7160101, 0xf6180101, 0xf51a0101, 0xf41c0101,
174 	0xf31e0101, 0xf2200101, 0xf1220101, 0xf0240101, 0xef260101,
175 	0xee280101, 0xed2a0101, 0xec2c0101, 0xeb2e0101, 0xea300101,
176 	0xe9320101, 0xe8340101, 0xe7360101, 0xe6380101, 0xe53a0101,
177 	0xe43c0101, 0xe33e0101, 0xa5400101, 0xa4420101, 0xa3440101,
178 	0x87460101, 0x86480101, 0x854a0101, 0x844c0101, 0x694e0101,
179 	0x68500101, 0x67520101, 0x66540101, 0x49560101, 0x48580101,
180 	0x475a0101, 0x2a5c0101, 0x295e0101, 0x28600101, 0x27620101,
181 	0x26640101, 0x25660101, 0x24680101, 0x236a0101, 0x056c0101,
182 	0x046e0101, 0x03700101, 0x02720101
183 }, rtl8821au_agc_vals2[] = {
184 	0x01740101, 0x01760101, 0x01780101, 0x017a0101, 0x017c0101,
185 	0x017e0101
186 };
187 
188 static const struct rtwn_agc_prog rtl8821au_agc[] = {
189 	{
190 		nitems(rtl8821au_agc_vals0),
191 		rtl8821au_agc_vals0,
192 		{ 0 },
193 		NULL
194 	},
195 	/*
196 	 * For devices with external 5GHz PA / LNA.
197 	 */
198 	{
199 		nitems(rtl8821au_agc_vals1_pa_lna_5g),
200 		rtl8821au_agc_vals1_pa_lna_5g,
201 		{ R21A_COND_EXT_PA_5G | R21A_COND_EXT_LNA_5G, 0 },
202 		/*
203 		 * Others.
204 		 */
205 		&(const struct rtwn_agc_prog){
206 			nitems(rtl8821au_agc_vals1),
207 			rtl8821au_agc_vals1,
208 			{ 0 },
209 			NULL
210 		}
211 	},
212 	{
213 		nitems(rtl8821au_agc_vals2),
214 		rtl8821au_agc_vals2,
215 		{ 0 },
216 		NULL
217 	}
218 };
219 
220 
221 /*
222  * RF initialization values.
223  */
224 static const uint8_t rtl8821au_rf_regs0[] = {
225 	0x18, 0x56, 0x66, 0x00, 0x1e, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
226 	0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0xef, 0x3e, 0x3f,
227 	0x3e, 0x3f, 0x3e, 0x3f, 0x3e, 0x3f, 0xef, 0x18, 0x89, 0x8b, 0xef,
228 	0x3a, 0x3b, 0x3c, 0x3a, 0x3b, 0x3c, 0x3a, 0x3b, 0x3c, 0x3a, 0x3b,
229 	0x3c, 0x3a, 0x3b, 0x3c, 0x3a, 0x3b, 0x3c, 0x3a, 0x3b, 0x3c, 0x3a,
230 	0x3b, 0x3c, 0x3a, 0x3b, 0x3c, 0x3a, 0x3b, 0x3c, 0x3a, 0x3b, 0x3c,
231 	0x3a, 0x3b, 0x3c, 0x3a, 0x3b, 0x3c, 0x3a, 0x3b, 0x3c, 0x3a, 0x3b,
232 	0x3c, 0x3a, 0x3b, 0x3c, 0x3a, 0x3b, 0x3c, 0x3a, 0x3b, 0x3c, 0x3a,
233 	0x3b, 0x3c, 0x3a, 0x3b, 0x3c, 0x3a, 0x3b, 0x3c, 0xef, 0xef
234 }, rtl8821au_rf_regs1[] = {
235 	0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34,
236 	0x34, 0x34
237 }, rtl8821au_rf_regs2[] = {
238 	0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34,
239 	0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0xef, 0x18,
240 	0xef
241 }, rtl8821au_rf_regs3[] = {
242 	0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0xef, 0x18,
243 	0xef, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
244 	0x36, 0x36, 0xef, 0xef, 0x3c, 0x3c
245 }, rtl8821au_rf_regs4[] = {
246 	0x3c, 0xef, 0x18, 0xef, 0x08, 0xef, 0xdf, 0x1f, 0x58, 0x59, 0x61,
247 	0x62, 0x63, 0x64, 0x65
248 }, rtl8821au_rf_regs5[] = {
249 	0x18, 0xef, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
250 	0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0xef, 0xef, 0x34, 0x34,
251 	0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0xef, 0xed,
252 	0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
253 	0xed, 0xed, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0xed,
254 	0xef, 0xdf, 0x35, 0x35, 0x35, 0x36, 0x36, 0x36, 0x36, 0xef, 0x51,
255 	0x52, 0x53, 0x54, 0x56, 0x51, 0x52, 0x53, 0x70, 0x71, 0x72, 0x74,
256 	0x35, 0x35, 0x35, 0x36, 0x36, 0x36, 0x36, 0xed, 0x45, 0x45, 0x45,
257 	0x46, 0x46, 0x46, 0x46, 0xdf, 0xb3, 0xb4, 0xb7, 0x1c, 0xc4, 0x18,
258 	0xfe, 0xfe, 0x18,
259 };
260 
261 static const uint32_t rtl8821au_rf_vals0[] = {
262 	0x1712a, 0x51cf2, 0x40000, 0x10000, 0x80000, 0x00830, 0x21800,
263 	0x28000, 0x48000, 0x94838, 0x44980, 0x48000, 0x0d480, 0x42240,
264 	0xf0380, 0x90000, 0x22852, 0x65540, 0x88001, 0x20000, 0x00380,
265 	0x90018, 0x20380, 0xa0018, 0x40308, 0xa0018, 0x60018, 0xa0018,
266 	0x00000, 0x1712a, 0x00080, 0x80180, 0x01000, 0x00244, 0x38027,
267 	0x82000, 0x00244, 0x30113, 0x82000, 0x0014c, 0x28027, 0x82000,
268 	0x000cc, 0x27027, 0x42000, 0x0014c, 0x1f913, 0x42000, 0x0010c,
269 	0x17f10, 0x12000, 0x000d0, 0x08027, 0xca000, 0x00244, 0x78027,
270 	0x82000, 0x00244, 0x70113, 0x82000, 0x0014c, 0x68027, 0x82000,
271 	0x000cc, 0x67027, 0x42000, 0x0014c, 0x5f913, 0x42000, 0x0010c,
272 	0x57f10, 0x12000, 0x000d0, 0x48027, 0xca000, 0x00244, 0xb8027,
273 	0x82000, 0x00244, 0xb0113, 0x82000, 0x0014c, 0xa8027, 0x82000,
274 	0x000cc, 0xa7027, 0x42000, 0x0014c, 0x9f913, 0x42000, 0x0010c,
275 	0x97f10, 0x12000, 0x000d0, 0x88027, 0xca000, 0x00000, 0x01100
276 }, rtl8821au_rf_vals1_def_or_bt[] = {
277 	0x4adf5, 0x49df2, 0x48def, 0x47dec, 0x46de9, 0x45ccb, 0x4488d,
278 	0x4348d, 0x4248a, 0x4108d, 0x4008a, 0x2adf4, 0x29df1
279 }, rtl8821au_rf_vals1_ext_5g[] = {
280 	0x4a0f3, 0x490b1, 0x480ae, 0x470ab, 0x4608b, 0x45069, 0x44048,
281 	0x43045, 0x42026, 0x41023, 0x40002, 0x2a0f3, 0x290f0
282 }, rtl8821au_rf_vals1[] = {
283 	0x4adf7, 0x49df3, 0x48def, 0x47dec, 0x46de9, 0x45ccb, 0x4488d,
284 	0x4348d, 0x4248a, 0x4108d, 0x4008a, 0x2adf7, 0x29df2
285 }, rtl8821au_rf_vals2_ext_5g[] = {
286 	0x280af, 0x270ac, 0x2608b, 0x25069, 0x24048, 0x23045, 0x22026,
287 	0x21023, 0x20002, 0x0a0d7, 0x090d3, 0x080b1, 0x070ae, 0x0608d,
288 	0x0506b, 0x0404a, 0x03047, 0x02044, 0x01025, 0x00004, 0x00000,
289 	0x1712a, 0x00040
290 }, rtl8821au_rf_vals2[] = {
291 	0x28dee, 0x27deb, 0x26ccd, 0x25cca, 0x2488c, 0x2384c, 0x22849,
292 	0x21449, 0x2004d, 0x0adf7, 0x09df4, 0x08df1, 0x07dee, 0x06dcd,
293 	0x05ccd, 0x04cca, 0x0388c, 0x02888, 0x01488, 0x00486, 0x00000,
294 	0x1712a, 0x00040
295 }, rtl8821au_rf_vals3_def_or_bt[] = {
296 	0x00128, 0x08128, 0x10128, 0x201c8, 0x281c8, 0x301c8, 0x401c8,
297 	0x481c8, 0x501c8, 0x00000, 0x1712a, 0x00010, 0x063b5, 0x0e3b5,
298 	0x163b5, 0x1e3b5, 0x263b5, 0x2e3b5, 0x363b5, 0x3e3b5, 0x463b5,
299 	0x4e3b5, 0x563b5, 0x5e3b5, 0x00000, 0x00008, 0x001b6, 0x00492
300 }, rtl8821au_rf_vals3[] = {
301 	0x00145, 0x08145, 0x10145, 0x20196, 0x28196, 0x30196, 0x401c7,
302 	0x481c7, 0x501c7, 0x00000, 0x1712a, 0x00010, 0x056b3, 0x0d6b3,
303 	0x156b3, 0x1d6b3, 0x26634, 0x2e634, 0x36634, 0x3e634, 0x467b4,
304 	0x4e7b4, 0x567b4, 0x5e7b4, 0x00000, 0x00008, 0x0022a, 0x00594
305 }, rtl8821au_rf_vals4_def_or_bt[] = {
306 	0x00800, 0x00000, 0x1712a, 0x00002, 0x02000, 0x00000, 0x000c0,
307 	0x00064, 0x81184, 0x6016c, 0xefd83, 0x93fcc, 0x110eb, 0x1c27c,
308 	0x93016
309 }, rtl8821au_rf_vals4_ext_5g[] = {
310 	0x00820, 0x00000, 0x1712a, 0x00002, 0x02000, 0x00000, 0x000c0,
311 	0x00064, 0x81184, 0x6016c, 0xead53, 0x93bc4, 0x110e9, 0x1c67c,
312 	0x93015
313 }, rtl8821au_rf_vals4[] = {
314 	0x00900, 0x00000, 0x1712a, 0x00002, 0x02000, 0x00000, 0x000c0,
315 	0x00064, 0x81184, 0x6016c, 0xead53, 0x93bc4, 0x714e9, 0x1c67c,
316 	0x91016
317 }, rtl8821au_rf_vals5[] = {
318 	0x00006, 0x02000, 0x3824b, 0x3024b, 0x2844b, 0x20f4b, 0x18f4b,
319 	0x104b2, 0x08049, 0x00148, 0x7824b, 0x7024b, 0x6824b, 0x60f4b,
320 	0x58f4b, 0x504b2, 0x48049, 0x40148, 0x00000, 0x00100, 0x0adf3,
321 	0x09df0, 0x08d70, 0x07d6d, 0x06cee, 0x05ccc, 0x044ec, 0x034ac,
322 	0x0246d, 0x0106f, 0x0006c, 0x00000, 0x00010, 0x0adf2, 0x09def,
323 	0x08dec, 0x07de9, 0x06cec, 0x05ce9, 0x044ec, 0x034e9, 0x0246c,
324 	0x01469, 0x0006c, 0x00000, 0x00001, 0x38da7, 0x300c2, 0x288e2,
325 	0x200b8, 0x188a5, 0x10fbc, 0x08f71, 0x00240, 0x00000, 0x020a2,
326 	0x00080, 0x00120, 0x08120, 0x10120, 0x00085, 0x08085, 0x10085,
327 	0x18085, 0x00000, 0x00c31, 0x00622, 0xfc70b, 0x0017e, 0x51df3,
328 	0x00c01, 0x006d6, 0xfc649, 0x49661, 0x7843e, 0x00382, 0x51400,
329 	0x00160, 0x08160, 0x10160, 0x00124, 0x08124, 0x10124, 0x18124,
330 	0x0000c, 0x00140, 0x08140, 0x10140, 0x00124, 0x08124, 0x10124,
331 	0x18124, 0x00088, 0xf0e18, 0x1214c, 0x3000c, 0x539d2, 0xafe00,
332 	0x1f12a, 0x0c350, 0x0c350, 0x1712a,
333 };
334 
335 static const struct rtwn_rf_prog rtl8821au_rf[] = {
336 	/* RF chain 0. */
337 	{
338 		nitems(rtl8821au_rf_regs0),
339 		rtl8821au_rf_regs0,
340 		rtl8821au_rf_vals0,
341 		{ 0 },
342 		NULL
343 	},
344 	/*
345 	 * No external PA/LNA; with or without BT.
346 	 */
347 	{
348 		nitems(rtl8821au_rf_regs1),
349 		rtl8821au_rf_regs1,
350 		rtl8821au_rf_vals1_def_or_bt,
351 		{ R21A_COND_BOARD_DEF, R21A_COND_BT, 0 },
352 		/*
353 		 * With external 5GHz PA and LNA.
354 		 */
355 		&(const struct rtwn_rf_prog){
356 			nitems(rtl8821au_rf_regs1),
357 			rtl8821au_rf_regs1,
358 			rtl8821au_rf_vals1_ext_5g,
359 			{ R21A_COND_EXT_PA_5G | R21A_COND_EXT_LNA_5G, 0 },
360 			/*
361 			 * Others.
362 			 */
363 			&(const struct rtwn_rf_prog){
364 				nitems(rtl8821au_rf_regs1),
365 				rtl8821au_rf_regs1,
366 				rtl8821au_rf_vals1,
367 				{ 0 },
368 				NULL
369 			}
370 		}
371 	},
372 	/*
373 	 * With external 5GHz PA and LNA.
374 	 */
375 	{
376 		nitems(rtl8821au_rf_regs2),
377 		rtl8821au_rf_regs2,
378 		rtl8821au_rf_vals2_ext_5g,
379 		{ R21A_COND_EXT_PA_5G | R21A_COND_EXT_LNA_5G, 0 },
380 		/*
381 		 * Others.
382 		 */
383 		&(const struct rtwn_rf_prog){
384 			nitems(rtl8821au_rf_regs2),
385 			rtl8821au_rf_regs2,
386 			rtl8821au_rf_vals2,
387 			{ 0 },
388 			NULL
389 		}
390 	},
391 	/*
392 	 * No external PA/LNA; with or without BT.
393 	 */
394 	{
395 		nitems(rtl8821au_rf_regs3),
396 		rtl8821au_rf_regs3,
397 		rtl8821au_rf_vals3_def_or_bt,
398 		{ R21A_COND_BOARD_DEF, R21A_COND_BT, 0 },
399 		/*
400 		 * Others.
401 		 */
402 		&(const struct rtwn_rf_prog){
403 			nitems(rtl8821au_rf_regs3),
404 			rtl8821au_rf_regs3,
405 			rtl8821au_rf_vals3,
406 			{ 0 },
407 			NULL
408 		}
409 	},
410 	/*
411 	 * No external PA/LNA; with or without BT.
412 	 */
413 	{
414 		nitems(rtl8821au_rf_regs4),
415 		rtl8821au_rf_regs4,
416 		rtl8821au_rf_vals4_def_or_bt,
417 		{ R21A_COND_BOARD_DEF, R21A_COND_BT, 0 },
418 		/*
419 		 * With external 5GHz PA and LNA.
420 		 */
421 		&(const struct rtwn_rf_prog){
422 			nitems(rtl8821au_rf_regs4),
423 			rtl8821au_rf_regs4,
424 			rtl8821au_rf_vals4_ext_5g,
425 			{ R21A_COND_EXT_PA_5G | R21A_COND_EXT_LNA_5G, 0 },
426 			/*
427 			 * Others.
428 			 */
429 			&(const struct rtwn_rf_prog){
430 				nitems(rtl8821au_rf_regs4),
431 				rtl8821au_rf_regs4,
432 				rtl8821au_rf_vals4,
433 				{ 0 },
434 				NULL
435 			}
436 		}
437 	},
438 	{
439 		nitems(rtl8821au_rf_regs5),
440 		rtl8821au_rf_regs5,
441 		rtl8821au_rf_vals5,
442 		{ 0 },
443 		NULL
444 	},
445 	{ 0, NULL, NULL, { 0 }, NULL }
446 };
447 
448 
449 /*
450  * Registers to save before IQ calibration.
451  */
452 static const uint16_t r21a_iq_bb_regs[] = {
453 	0x520, 0x550, 0x808, 0xa04, 0x90c, 0xc00, 0x838, 0x82c
454 };
455 
456 static const uint16_t r21a_iq_afe_regs[] = {
457 	0xc5c, 0xc60, 0xc64, 0xc68
458 };
459 
460 static const uint8_t r21a_iq_rf_regs[] = {
461 	0x65, 0x8f, 0x0
462 };
463 
464 #endif	/* R21A_PRIV_H */
465