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