2 * Copyright (c) 2016 Andriy Voskoboinyk <avos@FreeBSD.org>
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
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.
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
33 * MAC initialization values.
35 #define RTL8812AU_MAC_PROG_START \
38 #define RTL8812AU_MAC_PROG_END \
39 { 0x025, 0x0f }, { 0x072, 0x00 }, { 0x420, 0x80 }, { 0x428, 0x0a }, \
40 { 0x429, 0x10 }, { 0x430, 0x00 }, { 0x431, 0x00 }, { 0x432, 0x00 }, \
41 { 0x433, 0x01 }, { 0x434, 0x04 }, { 0x435, 0x05 }, { 0x436, 0x07 }, \
42 { 0x437, 0x08 }, { 0x43c, 0x04 }, { 0x43d, 0x05 }, { 0x43e, 0x07 }, \
43 { 0x43f, 0x08 }, { 0x440, 0x5d }, { 0x441, 0x01 }, { 0x442, 0x00 }, \
44 { 0x444, 0x10 }, { 0x445, 0x00 }, { 0x446, 0x00 }, { 0x447, 0x00 }, \
45 { 0x448, 0x00 }, { 0x449, 0xf0 }, { 0x44a, 0x0f }, { 0x44b, 0x3e }, \
46 { 0x44c, 0x10 }, { 0x44d, 0x00 }, { 0x44e, 0x00 }, { 0x44f, 0x00 }, \
47 { 0x450, 0x00 }, { 0x451, 0xf0 }, { 0x452, 0x0f }, { 0x453, 0x00 }, \
48 { 0x45b, 0x80 }, { 0x460, 0x66 }, { 0x461, 0x66 }, { 0x4c8, 0xff }, \
49 { 0x4c9, 0x08 }, { 0x4cc, 0xff }, { 0x4cd, 0xff }, { 0x4ce, 0x01 }, \
50 { 0x500, 0x26 }, { 0x501, 0xa2 }, { 0x502, 0x2f }, { 0x503, 0x00 }, \
51 { 0x504, 0x28 }, { 0x505, 0xa3 }, { 0x506, 0x5e }, { 0x507, 0x00 }, \
52 { 0x508, 0x2b }, { 0x509, 0xa4 }, { 0x50a, 0x5e }, { 0x50b, 0x00 }, \
53 { 0x50c, 0x4f }, { 0x50d, 0xa4 }, { 0x50e, 0x00 }, { 0x50f, 0x00 }, \
54 { 0x512, 0x1c }, { 0x514, 0x0a }, { 0x516, 0x0a }, { 0x525, 0x4f }, \
55 { 0x550, 0x10 }, { 0x551, 0x10 }, { 0x559, 0x02 }, { 0x55c, 0x50 }, \
56 { 0x55d, 0xff }, { 0x604, 0x09 }, { 0x605, 0x30 }, { 0x607, 0x03 }, \
57 { 0x608, 0x0e }, { 0x609, 0x2a }, { 0x620, 0xff }, { 0x621, 0xff }, \
58 { 0x622, 0xff }, { 0x623, 0xff }, { 0x624, 0xff }, { 0x625, 0xff }, \
59 { 0x626, 0xff }, { 0x627, 0xff }, { 0x638, 0x50 }, { 0x63c, 0x0a }, \
60 { 0x63d, 0x0a }, { 0x63e, 0x0e }, { 0x63f, 0x0e }, { 0x640, 0x80 }, \
61 { 0x642, 0x40 }, { 0x643, 0x00 }, { 0x652, 0xc8 }, { 0x66e, 0x05 }, \
62 { 0x700, 0x21 }, { 0x701, 0x43 }, { 0x702, 0x65 }, { 0x703, 0x87 }, \
63 { 0x708, 0x21 }, { 0x709, 0x43 }, { 0x70a, 0x65 }, { 0x70b, 0x87 }, \
66 static const struct rtwn_mac_prog rtl8812au_mac_no_ext_pa_lna[] = {
67 RTL8812AU_MAC_PROG_START
69 RTL8812AU_MAC_PROG_END
70 }, rtl8812au_mac[] = {
71 RTL8812AU_MAC_PROG_START
73 RTL8812AU_MAC_PROG_END
78 * Baseband initialization values.
80 #define R12A_COND_GPA 0x01
81 #define R12A_COND_APA 0x02
82 #define R12A_COND_GLNA 0x04
83 #define R12A_COND_ALNA 0x08
84 #define R12A_COND_TYPE(t) ((t) << 4)
86 static const uint16_t rtl8812au_bb_regs0[] = {
87 0x800, 0x804, 0x808, 0x80c, 0x810, 0x814, 0x818, 0x820, 0x824,
88 0x828, 0x82c, 0x830, 0x834, 0x838, 0x83c, 0x840, 0x844, 0x848,
89 0x84c, 0x850, 0x854, 0x858, 0x85c, 0x860, 0x864, 0x868, 0x86c,
90 0x870, 0x874, 0x878, 0x87c, 0x8a0, 0x8a4, 0x8a8, 0x8ac, 0x8b0,
91 0x8b4, 0x8b8, 0x8bc, 0x8c0, 0x8c4, 0x8c8, 0x8cc, 0x8d0, 0x8dc,
92 0x8d4, 0x8d8, 0x8f8, 0x8fc, 0x900, 0x90c, 0x910, 0x914, 0x918,
93 0x91c, 0x920, 0x924, 0x928, 0x92c, 0x930, 0x934, 0x960, 0x964,
94 0x968, 0x96c, 0x970, 0x978, 0x97c, 0x980, 0x984, 0x988, 0x990,
95 0x994, 0x998, 0x99c, 0x9a0, 0x9a4, 0x9a8, 0x9ac, 0x9b0, 0x9b4,
96 0x9b8, 0x9bc, 0x9d0, 0x9d4, 0x9d8, 0x9dc, 0x9e4, 0x9e8, 0xa00,
97 0xa04, 0xa08, 0xa0c, 0xa10, 0xa14, 0xa18, 0xa1c, 0xa20, 0xa24,
98 0xa28, 0xa2c, 0xa70, 0xa74, 0xa78, 0xa7c, 0xa80, 0xa84, 0xb00,
99 0xb04, 0xb08, 0xb0c, 0xb10, 0xb14, 0xb18, 0xb1c, 0xb20, 0xb24,
100 0xb28, 0xb2c, 0xb30, 0xb34, 0xb38, 0xb3c, 0xb40, 0xb44, 0xb48,
101 0xb4c, 0xb50, 0xb54, 0xb58, 0xb5c, 0xc00, 0xc04, 0xc08, 0xc0c,
102 0xc10, 0xc14, 0xc1c, 0xc20, 0xc24, 0xc28, 0xc2c, 0xc30, 0xc34,
103 0xc38, 0xc3c, 0xc40, 0xc44, 0xc48, 0xc4c, 0xc50, 0xc54, 0xc58,
105 }, rtl8812au_bb_regs1[] = {
107 }, rtl8812au_bb_regs2[] = {
108 0xc6c, 0xc70, 0xc74, 0xc78, 0xc7c, 0xc80, 0xc84, 0xc94, 0xc98,
109 0xc9c, 0xca0, 0xca4, 0xca8, 0xcb0, 0xcb4, 0xcb8, 0xe00, 0xe04,
110 0xe08, 0xe0c, 0xe10, 0xe14, 0xe1c, 0xe20, 0xe24, 0xe28, 0xe2c,
111 0xe30, 0xe34, 0xe38, 0xe3c, 0xe40, 0xe44, 0xe48, 0xe4c, 0xe50,
112 0xe54, 0xe58, 0xe5c, 0xe60, 0xe64, 0xe68, 0xe6c, 0xe70, 0xe74,
113 0xe78, 0xe7c, 0xe80, 0xe84, 0xe94, 0xe98, 0xe9c, 0xea0, 0xea4,
114 0xea8, 0xeb0, 0xeb4, 0xeb8
117 static const uint32_t rtl8812au_bb_vals0[] = {
118 0x8020d010, 0x080112e0, 0x0e028233, 0x12131113, 0x20101263,
119 0x020c3d10, 0x03a00385, 0x00000000, 0x00030fe0, 0x00000000,
120 0x002083dd, 0x2eaaeeb8, 0x0037a706, 0x06c89b44, 0x0000095b,
121 0xc0000001, 0x40003cde, 0x6210ff8b, 0x6cfdffb8, 0x28874706,
122 0x0001520c, 0x8060e000, 0x74210168, 0x6929c321, 0x79727432,
123 0x8ca7a314, 0x338c2878, 0x03333333, 0x31602c2e, 0x00003152,
124 0x000fc000, 0x00000013, 0x7f7f7f7f, 0xa202033e, 0x0ff0fa0a,
125 0x00000600, 0x000fc080, 0x6c0057ff, 0x4ca520a3, 0x27f00020,
126 0x00000000, 0x00012d69, 0x08248492, 0x0000b800, 0x00000000,
127 0x940008a0, 0x290b5612, 0x400002c0, 0x00000000, 0x00000701,
128 0x00000000, 0x0000fc00, 0x00000404, 0x1c1028c0, 0x64b11a1c,
129 0xe0767233, 0x055aa500, 0x00000004, 0xfffe0000, 0xfffffffe,
130 0x001fffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
131 0x801fffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
132 0x00000000, 0x27100000, 0xffff0100, 0xffffff5c, 0xffffffff,
133 0x000000ff, 0x00080080, 0x00000000, 0x00000000, 0x81081008,
134 0x00000000, 0x01081008, 0x01081008, 0x00000000, 0x00000000,
135 0x00000000, 0x00000000, 0x00000003, 0x000002d5, 0x00d047c8,
136 0x01ff000c, 0x8c838300, 0x2e7f000f, 0x9500bb78, 0x11144028,
137 0x00881117, 0x89140f00, 0x1a1b0000, 0x090e1217, 0x00000305,
138 0x00900000, 0x101fff00, 0x00000008, 0x00000900, 0x225b0606,
139 0x218075b2, 0x001f8c80, 0x03100000, 0x0000b000, 0xae0201eb,
140 0x01003207, 0x00009807, 0x01000000, 0x00000002, 0x00000002,
141 0x0000001f, 0x03020100, 0x07060504, 0x0b0a0908, 0x0f0e0d0c,
142 0x13121110, 0x17161514, 0x0000003a, 0x00000000, 0x00000000,
143 0x13000032, 0x48080000, 0x00000000, 0x00000000, 0x00000000,
144 0x00000000, 0x00000007, 0x00042020, 0x80410231, 0x00000000,
145 0x00000100, 0x01000000, 0x40000003, 0x12121212, 0x12121212,
146 0x12121212, 0x12121212, 0x12121212, 0x12121212, 0x12121212,
147 0x12121212, 0x12121212, 0x12121212, 0x12121212, 0x12121212,
148 0x00000020, 0x0008121c, 0x30000c1c, 0x00000058, 0x34344443,
150 }, rtl8812au_bb_vals1_ext_pa_lna[] = {
152 }, rtl8812au_bb_vals1[] = {
154 }, rtl8812au_bb_vals2[] = {
155 0x59795979, 0x19795979, 0x19795979, 0x19791979, 0x19791979,
156 0x19791979, 0x19791979, 0x0100005c, 0x00000000, 0x00000000,
157 0x00000029, 0x08040201, 0x80402010, 0x77547777, 0x00000077,
158 0x00508242, 0x00000007, 0x00042020, 0x80410231, 0x00000000,
159 0x00000100, 0x01000000, 0x40000003, 0x12121212, 0x12121212,
160 0x12121212, 0x12121212, 0x12121212, 0x12121212, 0x12121212,
161 0x12121212, 0x12121212, 0x12121212, 0x12121212, 0x12121212,
162 0x00000020, 0x0008121c, 0x30000c1c, 0x00000058, 0x34344443,
163 0x07003333, 0x59791979, 0x59795979, 0x19795979, 0x19795979,
164 0x19791979, 0x19791979, 0x19791979, 0x19791979, 0x0100005c,
165 0x00000000, 0x00000000, 0x00000029, 0x08040201, 0x80402010,
166 0x77547777, 0x00000077, 0x00508242
169 static const struct rtwn_bb_prog rtl8812au_bb[] = {
171 nitems(rtl8812au_bb_regs0),
179 * * External 2GHz PA, type 0;
180 * * External 5GHz PA, type 0 or 5;
181 * * External 2GHz LNA, type 0 or 5;
182 * * External 5GHz LNA, type 0;
185 nitems(rtl8812au_bb_regs1),
187 rtl8812au_bb_vals1_ext_pa_lna,
189 R12A_COND_GPA | R12A_COND_GLNA |
190 R12A_COND_APA | R12A_COND_ALNA |
192 R12A_COND_APA | R12A_COND_GLNA |
193 R12A_COND_TYPE(0x5), 0
198 &(const struct rtwn_bb_prog){
199 nitems(rtl8812au_bb_regs1),
207 nitems(rtl8812au_bb_regs2),
216 static const uint32_t rtl8812au_agc_vals0_lna_g0[] = {
217 0xfc000001, 0xfb020001, 0xfa040001, 0xf9060001, 0xf8080001,
218 0xf70a0001, 0xf60c0001, 0xf50e0001, 0xf4100001, 0xf3120001,
219 0xf2140001, 0xf1160001, 0xf0180001, 0xef1a0001, 0xee1c0001,
220 0xed1e0001, 0xec200001, 0xeb220001, 0xea240001, 0xcd260001,
221 0xcc280001, 0xcb2a0001, 0xca2c0001, 0xc92e0001, 0xc8300001,
222 0xa6320001, 0xa5340001, 0xa4360001, 0xa3380001, 0xa23a0001,
223 0x883c0001, 0x873e0001, 0x86400001, 0x85420001, 0x84440001,
224 0x83460001, 0x82480001, 0x814a0001, 0x484c0001, 0x474e0001,
225 0x46500001, 0x45520001, 0x44540001, 0x43560001, 0x42580001,
226 0x415a0001, 0x255c0001, 0x245e0001, 0x23600001, 0x22620001,
227 0x21640001, 0x21660001, 0x21680001, 0x216a0001, 0x216c0001,
228 0x216e0001, 0x21700001, 0x21720001, 0x21740001, 0x21760001,
229 0x21780001, 0x217a0001, 0x217c0001, 0x217e0001
230 }, rtl8812au_agc_vals0_lna_g5[] = {
231 0xf9000001, 0xf8020001, 0xf7040001, 0xf6060001, 0xf5080001,
232 0xf40a0001, 0xf30c0001, 0xf20e0001, 0xf1100001, 0xf0120001,
233 0xef140001, 0xee160001, 0xed180001, 0xec1a0001, 0xeb1c0001,
234 0xea1e0001, 0xcd200001, 0xcc220001, 0xcb240001, 0xca260001,
235 0xc9280001, 0xc82a0001, 0xc72c0001, 0xc62e0001, 0xa5300001,
236 0xa4320001, 0xa3340001, 0xa2360001, 0x88380001, 0x873a0001,
237 0x863c0001, 0x853e0001, 0x84400001, 0x83420001, 0x82440001,
238 0x81460001, 0x48480001, 0x474a0001, 0x464c0001, 0x454e0001,
239 0x44500001, 0x43520001, 0x42540001, 0x41560001, 0x25580001,
240 0x245a0001, 0x235c0001, 0x225e0001, 0x21600001, 0x21620001,
241 0x21640001, 0x21660001, 0x21680001, 0x216a0001, 0x236c0001,
242 0x226e0001, 0x21700001, 0x21720001, 0x21740001, 0x21760001,
243 0x21780001, 0x217a0001, 0x217c0001, 0x217e0001
244 }, rtl8812au_agc_vals0[] = {
245 0xff000001, 0xff020001, 0xff040001, 0xff060001, 0xff080001,
246 0xfe0a0001, 0xfd0c0001, 0xfc0e0001, 0xfb100001, 0xfa120001,
247 0xf9140001, 0xf8160001, 0xf7180001, 0xf61a0001, 0xf51c0001,
248 0xf41e0001, 0xf3200001, 0xf2220001, 0xf1240001, 0xf0260001,
249 0xef280001, 0xee2a0001, 0xed2c0001, 0xec2e0001, 0xeb300001,
250 0xea320001, 0xe9340001, 0xe8360001, 0xe7380001, 0xe63a0001,
251 0xe53c0001, 0xc73e0001, 0xc6400001, 0xc5420001, 0xc4440001,
252 0xc3460001, 0xc2480001, 0xc14a0001, 0xa74c0001, 0xa64e0001,
253 0xa5500001, 0xa4520001, 0xa3540001, 0xa2560001, 0xa1580001,
254 0x675a0001, 0x665c0001, 0x655e0001, 0x64600001, 0x63620001,
255 0x48640001, 0x47660001, 0x46680001, 0x456a0001, 0x446c0001,
256 0x436e0001, 0x42700001, 0x41720001, 0x41740001, 0x41760001,
257 0x41780001, 0x417a0001, 0x417c0001, 0x417e0001
258 }, rtl8812au_agc_vals1_lna_a0[] = {
259 0xfc800001, 0xfb820001, 0xfa840001, 0xf9860001, 0xf8880001,
260 0xf78a0001, 0xf68c0001, 0xf58e0001, 0xf4900001, 0xf3920001,
261 0xf2940001, 0xf1960001, 0xf0980001, 0xef9a0001, 0xee9c0001,
262 0xed9e0001, 0xeca00001, 0xeba20001, 0xeaa40001, 0xe9a60001,
263 0xe8a80001, 0xe7aa0001, 0xe6ac0001, 0xe5ae0001, 0xe4b00001,
264 0xe3b20001, 0xa8b40001, 0xa7b60001, 0xa6b80001, 0xa5ba0001,
265 0xa4bc0001, 0xa3be0001, 0xa2c00001, 0xa1c20001, 0x68c40001,
266 0x67c60001, 0x66c80001, 0x65ca0001, 0x64cc0001, 0x47ce0001,
267 0x46d00001, 0x45d20001, 0x44d40001, 0x43d60001, 0x42d80001,
268 0x08da0001, 0x07dc0001, 0x06de0001, 0x05e00001, 0x04e20001,
269 0x03e40001, 0x02e60001, 0x01e80001, 0x01ea0001, 0x01ec0001,
270 0x01ee0001, 0x01f00001, 0x01f20001, 0x01f40001, 0x01f60001,
271 0x01f80001, 0x01fa0001, 0x01fc0001, 0x01fe0001
272 }, rtl8812au_agc_vals1[] = {
273 0xff800001, 0xff820001, 0xff840001, 0xfe860001, 0xfd880001,
274 0xfc8a0001, 0xfb8c0001, 0xfa8e0001, 0xf9900001, 0xf8920001,
275 0xf7940001, 0xf6960001, 0xf5980001, 0xf49a0001, 0xf39c0001,
276 0xf29e0001, 0xf1a00001, 0xf0a20001, 0xefa40001, 0xeea60001,
277 0xeda80001, 0xecaa0001, 0xebac0001, 0xeaae0001, 0xe9b00001,
278 0xe8b20001, 0xe7b40001, 0xe6b60001, 0xe5b80001, 0xe4ba0001,
279 0xe3bc0001, 0xa8be0001, 0xa7c00001, 0xa6c20001, 0xa5c40001,
280 0xa4c60001, 0xa3c80001, 0xa2ca0001, 0xa1cc0001, 0x68ce0001,
281 0x67d00001, 0x66d20001, 0x65d40001, 0x64d60001, 0x47d80001,
282 0x46da0001, 0x45dc0001, 0x44de0001, 0x43e00001, 0x42e20001,
283 0x08e40001, 0x07e60001, 0x06e80001, 0x05ea0001, 0x04ec0001,
284 0x03ee0001, 0x02f00001, 0x01f20001, 0x01f40001, 0x01f60001,
285 0x01f80001, 0x01fa0001, 0x01fc0001, 0x01fe0001
288 static const struct rtwn_agc_prog rtl8812au_agc[] = {
290 * External 2GHz LNA (type 0).
293 nitems(rtl8812au_agc_vals0_lna_g0),
294 rtl8812au_agc_vals0_lna_g0,
295 { R12A_COND_GLNA | R12A_COND_TYPE(0x0), 0 },
297 * External 2GHz LNA (type 5).
299 &(const struct rtwn_agc_prog){
300 nitems(rtl8812au_agc_vals0_lna_g5),
301 rtl8812au_agc_vals0_lna_g5,
302 { R12A_COND_GLNA | R12A_COND_TYPE(0x5), 0 },
306 &(const struct rtwn_agc_prog){
307 nitems(rtl8812au_agc_vals0),
315 * External 5GHz LNA (type 0).
318 nitems(rtl8812au_agc_vals1_lna_a0),
319 rtl8812au_agc_vals1_lna_a0,
320 { R12A_COND_ALNA | R12A_COND_TYPE(0x0), 0 },
324 &(const struct rtwn_agc_prog){
325 nitems(rtl8812au_agc_vals1),
334 * RF initialization values.
336 static const uint8_t rtl8812au_rf0_regs0[] = {
337 0x00, 0x18, 0x56, 0x66, 0x1e, 0x89
338 }, rtl8812au_rf0_regs1[] = {
340 }, rtl8812au_rf0_regs2[] = {
342 }, rtl8812au_rf0_regs3[] = {
343 0xb1, 0xb3, 0xb4, 0xba, 0x18, 0xef
344 }, rtl8812au_rf0_regs4[] = {
345 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b
346 }, rtl8812au_rf0_regs5[] = {
347 0xef, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34,
349 }, rtl8812au_rf0_regs6[] = {
350 0xef, 0xef, 0xdf, 0x35, 0x35, 0x35, 0x36, 0x36, 0x36, 0x36, 0xef,
351 0x51, 0x52, 0x53, 0x54, 0xef, 0x08, 0x18, 0xef, 0x3a, 0x3b, 0x3c,
352 0x3a, 0x3b, 0x3c, 0x3a, 0x3b, 0x3c, 0x3a, 0x3b, 0x3c, 0x3a, 0x3b,
353 0x3c, 0x3a, 0x3b, 0x3c, 0x3a, 0x3b, 0x3c, 0x3a, 0x3b, 0x3c, 0x3a,
354 0x3b, 0x3c, 0x3a, 0x3b, 0x3c, 0x3a, 0x3b, 0x3c, 0x3a, 0x3b, 0x3c,
355 0x3a, 0x3b, 0x3c, 0x3a, 0x3b, 0x3c, 0x3a, 0x3b, 0x3c, 0x3a, 0x3b,
356 0x3c, 0x3a, 0x3b, 0x3c, 0x3a, 0x3b, 0x3c, 0x3a, 0x3b, 0x3c, 0x3a,
357 0x3b, 0x3c, 0x3a, 0x3b, 0x3c, 0x3a, 0x3b, 0x3c, 0x3a, 0x3b, 0x3c,
358 0x3a, 0x3b, 0x3c, 0xef
359 }, rtl8812au_rf0_regs7[] = {
360 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34,
361 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34,
362 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34
363 }, rtl8812au_rf0_regs8[] = {
364 0xef, 0x18, 0xef, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35,
365 0x35, 0xef, 0x18, 0xef, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
366 0x36, 0x36, 0x36, 0x36, 0x36, 0xef, 0xef, 0x3c, 0x3c, 0x3c,
367 }, rtl8812au_rf0_regs9[] = {
368 0xef, 0x18, 0xef, 0xdf, 0x1f
369 }, rtl8812au_rf0_regs10[] = {
370 0x61, 0x62, 0x63, 0x64, 0x65
371 }, rtl8812au_rf0_regs11[] = {
372 0x08, 0x1c, 0xb4, 0x18, 0xfe, 0xfe, 0xfe, 0xfe, 0xb4, 0x18
373 }, rtl8812au_rf1_regs0[] = {
375 }, rtl8812au_rf1_regs3[] = {
376 0xb1, 0xb3, 0xb4, 0xba, 0x18, 0xef
379 static const uint32_t rtl8812au_rf0_vals0[] = {
380 0x10000, 0x1712a, 0x51cf2, 0x40000, 0x80000, 0x00080
381 }, rtl8812au_rf0_vals1_lna_g0_g5[] = {
383 }, rtl8812au_rf0_vals1[] = {
385 }, rtl8812au_rf0_vals2_lna_a0[] = {
387 }, rtl8812au_rf0_vals2[] = {
389 }, rtl8812au_rf0_vals3[] = {
390 0x1fc1a, 0xf0810, 0x1a78d, 0x86180, 0x00006, 0x02000
391 }, rtl8812au_rf0_vals4_lna_g0_g5[] = {
392 0x3f218, 0x30a58, 0x2fa58, 0x22590, 0x1fa50, 0x10248, 0x08240
393 }, rtl8812au_rf0_vals4[] = {
394 0x38a58, 0x37a58, 0x2a590, 0x27a50, 0x18248, 0x10240, 0x08240
395 }, rtl8812au_rf0_vals5_pa_g0[] = {
396 0x00100, 0x0a4ee, 0x09076, 0x08073, 0x07070, 0x0606d, 0x0506a,
397 0x04049, 0x03046, 0x02028, 0x01025, 0x00022
398 }, rtl8812au_rf0_vals5[] = {
399 0x00100, 0x0adf4, 0x09df1, 0x08dee, 0x07deb, 0x06de8, 0x05de5,
400 0x04de2, 0x03ce6, 0x024e7, 0x014e4, 0x004e1
401 }, rtl8812au_rf0_vals6[] = {
402 0x00000, 0x020a2, 0x00080, 0x00192, 0x08192, 0x10192, 0x00024,
403 0x08024, 0x10024, 0x18024, 0x00000, 0x00c21, 0x006d9, 0xfc649,
404 0x0017e, 0x00002, 0x08400, 0x1712a, 0x01000, 0x00080, 0x3a02c,
405 0x04000, 0x00400, 0x3202c, 0x10000, 0x000a0, 0x2b064, 0x04000,
406 0x000d8, 0x23070, 0x04000, 0x00468, 0x1b870, 0x10000, 0x00098,
407 0x12085, 0xe4000, 0x00418, 0x0a080, 0xf0000, 0x00418, 0x02080,
408 0x10000, 0x00080, 0x7a02c, 0x04000, 0x00400, 0x7202c, 0x10000,
409 0x000a0, 0x6b064, 0x04000, 0x000d8, 0x63070, 0x04000, 0x00468,
410 0x5b870, 0x10000, 0x00098, 0x52085, 0xe4000, 0x00418, 0x4a080,
411 0xf0000, 0x00418, 0x42080, 0x10000, 0x00080, 0xba02c, 0x04000,
412 0x00400, 0xb202c, 0x10000, 0x000a0, 0xab064, 0x04000, 0x000d8,
413 0xa3070, 0x04000, 0x00468, 0x9b870, 0x10000, 0x00098, 0x92085,
414 0xe4000, 0x00418, 0x8a080, 0xf0000, 0x00418, 0x82080, 0x10000,
416 }, rtl8812au_rf0_vals7_pa_a0[] = {
417 0x4a0b2, 0x490af, 0x48070, 0x4706d, 0x46050, 0x4504d, 0x4404a,
418 0x43047, 0x4200a, 0x41007, 0x40004, 0x2a0b2, 0x290af, 0x28070,
419 0x2706d, 0x26050, 0x2504d, 0x2404a, 0x23047, 0x2200a, 0x21007,
420 0x20004, 0x0a0b2, 0x090af, 0x08070, 0x0706d, 0x06050, 0x0504d,
421 0x0404a, 0x03047, 0x0200a, 0x01007, 0x00004
422 }, rtl8812au_rf0_vals7_pa_a5[] = {
423 0x4a0b2, 0x490af, 0x48070, 0x4706d, 0x4604d, 0x4504a, 0x44047,
424 0x43044, 0x42007, 0x41004, 0x40001, 0x2a0b4, 0x290b1, 0x28072,
425 0x2706f, 0x2604f, 0x2504c, 0x24049, 0x23046, 0x22009, 0x21006,
426 0x20003, 0x0a0b2, 0x090af, 0x08070, 0x0706d, 0x0604d, 0x0504a,
427 0x04047, 0x03044, 0x02007, 0x01004, 0x00001
428 }, rtl8812au_rf0_vals7[] = {
429 0x4adf5, 0x49df2, 0x48def, 0x47dec, 0x46de9, 0x45de6, 0x44de3,
430 0x438c8, 0x428c5, 0x418c2, 0x408c0, 0x2adf5, 0x29df2, 0x28def,
431 0x27dec, 0x26de9, 0x25de6, 0x24de3, 0x238c8, 0x228c5, 0x218c2,
432 0x208c0, 0x0aff7, 0x09df7, 0x08df4, 0x07df1, 0x06dee, 0x05deb,
433 0x04de8, 0x038cc, 0x028c9, 0x018c6, 0x008c3
434 }, rtl8812au_rf0_vals8_pa_a0_a5[] = {
435 0x00000, 0x1712a, 0x00040, 0x001d4, 0x081d4, 0x101d4, 0x201b4,
436 0x281b4, 0x301b4, 0x401b4, 0x481b4, 0x501b4, 0x00000, 0x1712a,
437 0x00010, 0x04bfb, 0x0cbfb, 0x14bfb, 0x1cbfb, 0x24f4b, 0x2cf4b,
438 0x34f4b, 0x3cf4b, 0x44f4b, 0x4cf4b, 0x54f4b, 0x5cf4b, 0x00000,
439 0x00008, 0x002cc, 0x00522, 0x00902
440 }, rtl8812au_rf0_vals8[] = {
441 0x00000, 0x1712a, 0x00040, 0x00188, 0x08147, 0x10147, 0x201d7,
442 0x281d7, 0x301d7, 0x401d8, 0x481d8, 0x501d8, 0x00000, 0x1712a,
443 0x00010, 0x84eb4, 0x8cc35, 0x94c35, 0x9cc35, 0xa4c35, 0xacc35,
444 0xb4c35, 0xbcc35, 0xc4c34, 0xccc35, 0xd4c35, 0xdcc35, 0x00000,
445 0x00008, 0x002a8, 0x005a2, 0x00880
446 }, rtl8812au_rf0_vals9[] = {
447 0x00000, 0x1712a, 0x00002, 0x00080, 0x00064
448 }, rtl8812au_rf0_vals10_pa_a0[] = {
449 0xfdd43, 0x38f4b, 0x32117, 0x194ac, 0x931d1
450 }, rtl8812au_rf0_vals10_pa_a5[] = {
451 0xfdd43, 0x38f4b, 0x32117, 0x194ac, 0x931d2
452 }, rtl8812au_rf0_vals10[] = {
453 0xe5d53, 0x38fcd, 0x114eb, 0x196ac, 0x911d7
454 }, rtl8812au_rf0_vals11[] = {
455 0x08400, 0x739d2, 0x1e78d, 0x1f12a, 0x0c350, 0x0c350, 0x0c350,
456 0x0c350, 0x1a78d, 0x1712a
457 }, rtl8812au_rf1_vals0[] = {
458 0x51cf2, 0x40000, 0x00080
459 }, rtl8812au_rf1_vals3[] = {
460 0x1fc1a, 0xf0810, 0x1a78d, 0x86180, 0x00006, 0x02000
461 }, rtl8812au_rf1_vals6[] = {
462 0x00000, 0x020a2, 0x00080, 0x00192, 0x08192, 0x10192, 0x00024,
463 0x08024, 0x10024, 0x18024, 0x00000, 0x00c21, 0x006d9, 0xfc649,
464 0x0017e, 0x00002, 0x08400, 0x1712a, 0x01000, 0x00080, 0x3a02c,
465 0x04000, 0x00400, 0x3202c, 0x10000, 0x000a0, 0x2b064, 0x04000,
466 0x000d8, 0x23070, 0x04000, 0x00468, 0x1b870, 0x10000, 0x00098,
467 0x12085, 0xe4000, 0x00418, 0x0a080, 0xf0000, 0x00418, 0x02080,
468 0x10000, 0x00080, 0x7a02c, 0x04000, 0x00400, 0x7202c, 0x10000,
469 0x000a0, 0x6b064, 0x04000, 0x000d8, 0x63070, 0x04000, 0x00468,
470 0x5b870, 0x10000, 0x00098, 0x52085, 0xe4000, 0x00418, 0x4a080,
471 0xf0000, 0x00418, 0x42080, 0x10000, 0x00080, 0xba02c, 0x04000,
472 0x00400, 0xb202c, 0x10000, 0x000a0, 0xab064, 0x04000, 0x000d8,
473 0xa3070, 0x04000, 0x00468, 0x9b870, 0x10000, 0x00098, 0x92085,
474 0xe4000, 0x00418, 0x8a080, 0xf0000, 0x00418, 0x82080, 0x10000,
476 }, rtl8812au_rf1_vals7_pa_a5[] = {
477 0x4a0b1, 0x490ae, 0x4806f, 0x4706c, 0x4604c, 0x45049, 0x44046,
478 0x43043, 0x42006, 0x41003, 0x40000, 0x2a0b3, 0x290b0, 0x28071,
479 0x2706e, 0x2604e, 0x2504b, 0x24048, 0x23045, 0x22008, 0x21005,
480 0x20002, 0x0a0b3, 0x090b0, 0x08070, 0x0706d, 0x0604d, 0x0504a,
481 0x04047, 0x03044, 0x02007, 0x01004, 0x00001
482 }, rtl8812au_rf1_vals8_pa_a0_a5[] = {
483 0x00000, 0x1712a, 0x00040, 0x001c5, 0x081c5, 0x101c5, 0x20174,
484 0x28174, 0x30174, 0x40185, 0x48185, 0x50185, 0x00000, 0x1712a,
485 0x00010, 0x05b8b, 0x0db8b, 0x15b8b, 0x1db8b, 0x262db, 0x2e2db,
486 0x362db, 0x3e2db, 0x4553b, 0x4d53b, 0x5553b, 0x5d53b, 0x00000,
487 0x00008, 0x002dc, 0x00524, 0x00902
488 }, rtl8812au_rf1_vals10_pa_g0_a0[] = {
489 0xeac43, 0x38f47, 0x31157, 0x1c4ac, 0x931d1
490 }, rtl8812au_rf1_vals10_pa_a5[] = {
491 0xeac43, 0x38f47, 0x31157, 0x1c4ac, 0x931d2
494 static const struct rtwn_rf_prog rtl8812au_rf[] = {
497 nitems(rtl8812au_rf0_regs0),
503 /* External 2GHz LNA, type 0 or 5. */
505 nitems(rtl8812au_rf0_regs1),
507 rtl8812au_rf0_vals1_lna_g0_g5,
509 R12A_COND_GLNA | R12A_COND_TYPE(0x0),
510 R12A_COND_GLNA | R12A_COND_TYPE(0x5), 0
513 &(const struct rtwn_rf_prog){
514 nitems(rtl8812au_rf0_regs1),
521 /* External 5GHz LNA, type 0. */
523 nitems(rtl8812au_rf0_regs2),
525 rtl8812au_rf0_vals2_lna_a0,
526 { R12A_COND_ALNA | R12A_COND_TYPE(0x0), 0 },
528 &(const struct rtwn_rf_prog){
529 nitems(rtl8812au_rf0_regs2),
537 nitems(rtl8812au_rf0_regs3),
543 /* External 2GHz LNA, type 0 or 5. */
545 nitems(rtl8812au_rf0_regs4),
547 rtl8812au_rf0_vals4_lna_g0_g5,
549 R12A_COND_GLNA | R12A_COND_TYPE(0x0),
550 R12A_COND_GLNA | R12A_COND_TYPE(0x5), 0
553 &(const struct rtwn_rf_prog){
554 nitems(rtl8812au_rf0_regs4),
561 /* External 2GHz PA, type 0. */
563 nitems(rtl8812au_rf0_regs5),
565 rtl8812au_rf0_vals5_pa_g0,
566 { R12A_COND_GPA | R12A_COND_TYPE(0x0), 0 },
568 &(const struct rtwn_rf_prog){
569 nitems(rtl8812au_rf0_regs5),
577 nitems(rtl8812au_rf0_regs6),
583 /* External 5GHz PA, type 0. */
585 nitems(rtl8812au_rf0_regs7),
587 rtl8812au_rf0_vals7_pa_a0,
588 { R12A_COND_APA | R12A_COND_TYPE(0x0), 0 },
589 /* External 5GHz PA, type 5. */
590 &(const struct rtwn_rf_prog){
591 nitems(rtl8812au_rf0_regs7),
593 rtl8812au_rf0_vals7_pa_a5,
594 { R12A_COND_APA | R12A_COND_TYPE(0x5), 0 },
596 &(const struct rtwn_rf_prog){
597 nitems(rtl8812au_rf0_regs7),
605 /* External 5GHz PA, type 0 or 5. */
607 nitems(rtl8812au_rf0_regs8),
609 rtl8812au_rf0_vals8_pa_a0_a5,
611 R12A_COND_APA | R12A_COND_TYPE(0x0),
612 R12A_COND_APA | R12A_COND_TYPE(0x5), 0
615 &(const struct rtwn_rf_prog){
616 nitems(rtl8812au_rf0_regs8),
624 nitems(rtl8812au_rf0_regs9),
630 /* External 5GHz PA, type 0. */
632 nitems(rtl8812au_rf0_regs10),
633 rtl8812au_rf0_regs10,
634 rtl8812au_rf0_vals10_pa_a0,
635 { R12A_COND_APA | R12A_COND_TYPE(0x0), 0 },
636 /* External 5GHz PA, type 5. */
637 &(const struct rtwn_rf_prog){
638 nitems(rtl8812au_rf0_regs10),
639 rtl8812au_rf0_regs10,
640 rtl8812au_rf0_vals10_pa_a5,
641 { R12A_COND_APA | R12A_COND_TYPE(0x5), 0 },
643 &(const struct rtwn_rf_prog){
644 nitems(rtl8812au_rf0_regs10),
645 rtl8812au_rf0_regs10,
646 rtl8812au_rf0_vals10,
653 nitems(rtl8812au_rf0_regs11),
654 rtl8812au_rf0_regs11,
655 rtl8812au_rf0_vals11,
659 { 0, NULL, NULL, { 0 }, NULL },
662 nitems(rtl8812au_rf1_regs0),
668 /* rtl8812au_rf[1] */
669 /* External 2GHz LNA, type 0 or 5. */
671 nitems(rtl8812au_rf0_regs1),
673 rtl8812au_rf0_vals1_lna_g0_g5,
675 R12A_COND_GLNA | R12A_COND_TYPE(0x0),
676 R12A_COND_GLNA | R12A_COND_TYPE(0x5), 0
679 &(const struct rtwn_rf_prog){
680 nitems(rtl8812au_rf0_regs1),
687 /* rtl8812au_rf[2] */
688 /* External 5GHz LNA, type 0. */
690 nitems(rtl8812au_rf0_regs2),
692 rtl8812au_rf0_vals2_lna_a0,
693 { R12A_COND_ALNA | R12A_COND_TYPE(0x0), 0 },
695 &(const struct rtwn_rf_prog){
696 nitems(rtl8812au_rf0_regs2),
704 nitems(rtl8812au_rf1_regs3),
710 /* rtl8812au_rf[4] */
711 /* External 2GHz LNA, type 0 or 5. */
713 nitems(rtl8812au_rf0_regs4),
715 rtl8812au_rf0_vals4_lna_g0_g5,
717 R12A_COND_GLNA | R12A_COND_TYPE(0x0),
718 R12A_COND_GLNA | R12A_COND_TYPE(0x5), 0
721 &(const struct rtwn_rf_prog){
722 nitems(rtl8812au_rf0_regs4),
729 /* rtl8812au_rf[5] */
730 /* External 2GHz PA, type 0. */
732 nitems(rtl8812au_rf0_regs5),
734 rtl8812au_rf0_vals5_pa_g0,
735 { R12A_COND_GPA | R12A_COND_TYPE(0x0), 0 },
737 &(const struct rtwn_rf_prog){
738 nitems(rtl8812au_rf0_regs5),
746 nitems(rtl8812au_rf0_regs6),
752 /* External 5GHz PA, type 0. */
754 nitems(rtl8812au_rf0_regs7),
756 rtl8812au_rf0_vals7_pa_a0,
757 { R12A_COND_APA | R12A_COND_TYPE(0x0), 0 },
758 /* External 5GHz PA, type 5. */
759 &(const struct rtwn_rf_prog){
760 nitems(rtl8812au_rf0_regs7),
762 rtl8812au_rf1_vals7_pa_a5,
763 { R12A_COND_APA | R12A_COND_TYPE(0x5), 0 },
765 &(const struct rtwn_rf_prog){
766 nitems(rtl8812au_rf0_regs7),
774 /* External 5GHz PA, type 0 or 5. */
776 nitems(rtl8812au_rf0_regs8),
778 rtl8812au_rf1_vals8_pa_a0_a5,
780 R12A_COND_APA | R12A_COND_TYPE(0x0),
781 R12A_COND_APA | R12A_COND_TYPE(0x5), 0
784 &(const struct rtwn_rf_prog){
785 nitems(rtl8812au_rf0_regs8),
793 nitems(rtl8812au_rf0_regs9) - 1,
800 /* External 2GHz or 5GHz PA, type 0. */
802 nitems(rtl8812au_rf0_regs10),
803 rtl8812au_rf0_regs10,
804 rtl8812au_rf1_vals10_pa_g0_a0,
806 R12A_COND_GPA | R12A_COND_TYPE(0x0),
807 R12A_COND_APA | R12A_COND_TYPE(0x0), 0
809 /* External 5GHz PA, type 5. */
810 &(const struct rtwn_rf_prog){
811 nitems(rtl8812au_rf0_regs10),
812 rtl8812au_rf0_regs10,
813 rtl8812au_rf1_vals10_pa_a5,
814 { R12A_COND_APA | R12A_COND_TYPE(0x5), 0 },
816 &(const struct rtwn_rf_prog){
817 nitems(rtl8812au_rf0_regs10),
818 rtl8812au_rf0_regs10,
819 rtl8812au_rf0_vals10,
827 rtl8812au_rf0_regs11,
828 rtl8812au_rf0_vals11,
832 { 0, NULL, NULL, { 0 }, NULL }
837 * Registers to save before IQ calibration.
839 static const uint16_t r12a_iq_bb_regs[] = {
840 0x520, 0x550, 0x808, 0xa04, 0x90c, 0xc00, 0xe00, 0x838, 0x82c
843 static const uint16_t r12a_iq_afe_regs[] = {
844 0xc5c, 0xc60, 0xc64, 0xc68, 0xcb0, 0xcb4, 0xe5c, 0xe60, 0xe64,
848 static const uint8_t r12a_iq_rf_regs[] = {
852 #endif /* R12A_PRIV_H */