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