1 /* $OpenBSD: ar9280reg.h,v 1.8 2019/02/01 16:15:07 stsp Exp $ */ 2 3 /*- 4 * Copyright (c) 2009 Damien Bergamini <damien.bergamini@free.fr> 5 * Copyright (c) 2008-2009 Atheros Communications Inc. 6 * 7 * Permission to use, copy, modify, and/or distribute this software for any 8 * purpose with or without fee is hereby granted, provided that the above 9 * copyright notice and this permission notice appear in all copies. 10 * 11 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 12 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 13 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 14 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 15 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 16 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 17 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 18 */ 19 20 #define AR9280_MAX_CHAINS 2 21 22 #define AR9280_PD_GAIN_BOUNDARY_DEFAULT 56 23 24 #define AR9280_PHY_CCA_MIN_GOOD_VAL_2GHZ (-127) 25 #define AR9280_PHY_CCA_MIN_GOOD_VAL_5GHZ (-122) 26 #define AR9280_PHY_CCA_MAX_GOOD_VAL_2GHZ (-97) 27 #define AR9280_PHY_CCA_MAX_GOOD_VAL_5GHZ (-102) 28 29 #define AR9280_PHY_SYNTH_CONTROL 0x9874 30 31 /* Bits for AR9280_PHY_SYNTH_CONTROL. */ 32 #define AR9280_BMODE 0x20000000 33 #define AR9280_FRACMODE 0x10000000 34 #define AR9280_AMODE_REFSEL_M 0x0c000000 35 #define AR9280_AMODE_REFSEL_S 26 36 37 /* 38 * NB: The AR9280 uses the same ROM layout than the AR5416. 39 */ 40 41 /* Macro to "pack" registers to 16-bit to save some .rodata space. */ 42 #define P(x) (x) 43 44 /* 45 * AR9280 2.0 initialization values. 46 */ 47 static const uint16_t ar9280_2_0_regs[] = { 48 P(0x01030), P(0x01070), P(0x010b0), P(0x010f0), P(0x08014), 49 P(0x0801c), P(0x08120), P(0x081d0), P(0x08318), P(0x09804), 50 P(0x09820), P(0x09824), P(0x09828), P(0x09834), P(0x09838), 51 P(0x09840), P(0x09844), P(0x09850), P(0x09858), P(0x0985c), 52 P(0x09860), P(0x09864), P(0x09868), P(0x0986c), P(0x09914), 53 P(0x09918), P(0x09924), P(0x09944), P(0x09960), P(0x0a960), 54 P(0x09964), P(0x0c968), P(0x099b8), P(0x099bc), P(0x099c0), 55 P(0x0a204), P(0x0a20c), P(0x0b20c), P(0x0a21c), P(0x0a230), 56 P(0x0a23c), P(0x0a250), P(0x0a358), P(0x0a388), P(0x0a3d8), 57 P(0x07894) 58 }; 59 60 static const uint32_t ar9280_2_0_vals_5g20[] = { 61 0x00000230, 0x00000168, 0x00000e60, 0x00000000, 0x03e803e8, 62 0x128d8027, 0x08f04800, 0x00003210, 0x00003e80, 0x00000300, 63 0x02020200, 0x01000e0e, 0x0a020001, 0x00000e0e, 0x00000007, 64 0x206a022e, 0x0372161e, 0x6c4000e2, 0x7ec88d2e, 0x31395d5e, 65 0x00048d18, 0x0001ce00, 0x5ac640d0, 0x06903081, 0x000007d0, 66 0x0000000a, 0xd00a8a0b, 0xffbc1010, 0x00000010, 0x00000010, 67 0x00000210, 0x000003b5, 0x0000001c, 0x00000a00, 0x05eea6d4, 68 0x00000444, 0x00000014, 0x00000014, 0x1883800a, 0x00000000, 69 0x13c88000, 0x001ff000, 0x7999aa02, 0x0c000000, 0x00000000, 70 0x5a508000 71 }; 72 73 static const uint32_t ar9280_2_0_vals_5g40[] = { 74 0x00000460, 0x000002d0, 0x00001cc0, 0x00000000, 0x07d007d0, 75 0x128d804f, 0x08f04800, 0x00003210, 0x00007d00, 0x000003c4, 76 0x02020200, 0x01000e0e, 0x0a020001, 0x00000e0e, 0x00000007, 77 0x206a022e, 0x0372161e, 0x6d4000e2, 0x7ec88d2e, 0x3139605e, 78 0x00048d18, 0x0001ce00, 0x5ac640d0, 0x06903081, 0x00000fa0, 79 0x00000014, 0xd00a8a0b, 0xffbc1010, 0x00000010, 0x00000010, 80 0x00000210, 0x000003b5, 0x0000001c, 0x00000a00, 0x05eea6d4, 81 0x00000444, 0x00000014, 0x00000014, 0x1883800a, 0x00000000, 82 0x13c88000, 0x001ff000, 0x7999aa02, 0x0c000000, 0x00000000, 83 0x5a508000 84 }; 85 86 static const uint32_t ar9280_2_0_vals_2g40[] = { 87 0x000002c0, 0x00000318, 0x00007c70, 0x00000000, 0x10801600, 88 0x12e00057, 0x08f04810, 0x0000320a, 0x00006880, 0x000003c4, 89 0x02020200, 0x01000e0e, 0x0a020001, 0x00000e0e, 0x00000007, 90 0x206a012e, 0x037216a0, 0x6d4000e2, 0x7ec84d2e, 0x3139605e, 91 0x00048d20, 0x0001ce00, 0x5ac640d0, 0x06903881, 0x00001130, 92 0x00000268, 0xd00a8a0d, 0xffbc1010, 0x00000010, 0x00000010, 93 0x00000210, 0x000003ce, 0x0000001c, 0x00000c00, 0x05eea6d4, 94 0x00000444, 0x0001f019, 0x0001f019, 0x1883800a, 0x00000210, 95 0x13c88001, 0x0004a000, 0x7999aa0e, 0x08000000, 0x00000000, 96 0x5a508000 97 }; 98 99 static const uint32_t ar9280_2_0_vals_2g20[] = { 100 0x00000160, 0x0000018c, 0x00003e38, 0x00000000, 0x08400b00, 101 0x12e0002b, 0x08f04810, 0x0000320a, 0x00003440, 0x00000300, 102 0x02020200, 0x01000e0e, 0x0a020001, 0x00000e0e, 0x00000007, 103 0x206a012e, 0x037216a0, 0x6c4000e2, 0x7ec84d2e, 0x31395d5e, 104 0x00048d20, 0x0001ce00, 0x5ac640d0, 0x06903881, 0x00000898, 105 0x0000000b, 0xd00a8a0d, 0xffbc1010, 0x00000010, 0x00000010, 106 0x00000210, 0x000003ce, 0x0000001c, 0x00000c00, 0x05eea6d4, 107 0x00000444, 0x0001f019, 0x0001f019, 0x1883800a, 0x00000108, 108 0x13c88000, 0x0004a000, 0x7999aa0e, 0x0c000000, 0x00000000, 109 0x5a508000 110 }; 111 112 static const uint16_t ar9280_2_0_cm_regs[] = { 113 P(0x0000c), P(0x00030), P(0x00034), P(0x00040), P(0x00044), 114 P(0x00048), P(0x0004c), P(0x00050), P(0x00054), P(0x00800), 115 P(0x00804), P(0x00808), P(0x0080c), P(0x00810), P(0x00814), 116 P(0x00818), P(0x0081c), P(0x00820), P(0x00824), P(0x01040), 117 P(0x01044), P(0x01048), P(0x0104c), P(0x01050), P(0x01054), 118 P(0x01058), P(0x0105c), P(0x01060), P(0x01064), P(0x01230), 119 P(0x01270), P(0x01038), P(0x01078), P(0x010b8), P(0x010f8), 120 P(0x01138), P(0x01178), P(0x011b8), P(0x011f8), P(0x01238), 121 P(0x01278), P(0x012b8), P(0x012f8), P(0x01338), P(0x01378), 122 P(0x013b8), P(0x013f8), P(0x01438), P(0x01478), P(0x014b8), 123 P(0x014f8), P(0x01538), P(0x01578), P(0x015b8), P(0x015f8), 124 P(0x01638), P(0x01678), P(0x016b8), P(0x016f8), P(0x01738), 125 P(0x01778), P(0x017b8), P(0x017f8), P(0x0103c), P(0x0107c), 126 P(0x010bc), P(0x010fc), P(0x0113c), P(0x0117c), P(0x011bc), 127 P(0x011fc), P(0x0123c), P(0x0127c), P(0x012bc), P(0x012fc), 128 P(0x0133c), P(0x0137c), P(0x013bc), P(0x013fc), P(0x0143c), 129 P(0x0147c), P(0x04030), P(0x0403c), P(0x04024), P(0x04060), 130 P(0x04064), P(0x07010), P(0x07034), P(0x07038), P(0x08004), 131 P(0x08008), P(0x0800c), P(0x08018), P(0x08020), P(0x08038), 132 P(0x0803c), P(0x08048), P(0x08054), P(0x08058), P(0x0805c), 133 P(0x08060), P(0x08064), P(0x08070), P(0x080c0), P(0x080c4), 134 P(0x080c8), P(0x080cc), P(0x080d0), P(0x080d4), P(0x080d8), 135 P(0x080e0), P(0x080e4), P(0x080e8), P(0x080ec), P(0x080f0), 136 P(0x080f4), P(0x080f8), P(0x080fc), P(0x08100), P(0x08104), 137 P(0x08108), P(0x0810c), P(0x08110), P(0x08118), P(0x0811c), 138 P(0x08124), P(0x08128), P(0x0812c), P(0x08130), P(0x08134), 139 P(0x08138), P(0x0813c), P(0x08144), P(0x08168), P(0x0816c), 140 P(0x08170), P(0x08174), P(0x08178), P(0x0817c), P(0x081c0), 141 P(0x081ec), P(0x081f0), P(0x081f4), P(0x081f8), P(0x081fc), 142 P(0x08200), P(0x08204), P(0x08208), P(0x0820c), P(0x08210), 143 P(0x08214), P(0x08218), P(0x0821c), P(0x08220), P(0x08224), 144 P(0x08228), P(0x0822c), P(0x08230), P(0x08234), P(0x08238), 145 P(0x0823c), P(0x08240), P(0x08244), P(0x08248), P(0x0824c), 146 P(0x08250), P(0x08254), P(0x08258), P(0x0825c), P(0x08260), 147 P(0x08264), P(0x08270), P(0x08274), P(0x08278), P(0x0827c), 148 P(0x08284), P(0x08288), P(0x0828c), P(0x08294), P(0x08298), 149 P(0x0829c), P(0x08300), P(0x08314), P(0x08328), P(0x0832c), 150 P(0x08330), P(0x08334), P(0x08338), P(0x0833c), P(0x08340), 151 P(0x08344), P(0x09808), P(0x0980c), P(0x09810), P(0x09814), 152 P(0x0981c), P(0x0982c), P(0x09830), P(0x0983c), P(0x0984c), 153 P(0x0a84c), P(0x09854), P(0x09900), P(0x09904), P(0x09908), 154 P(0x0990c), P(0x09910), P(0x0991c), P(0x09920), P(0x0a920), 155 P(0x09928), P(0x0992c), P(0x09934), P(0x09938), P(0x0993c), 156 P(0x09948), P(0x0994c), P(0x09954), P(0x09958), P(0x09940), 157 P(0x0c95c), P(0x09970), P(0x09974), P(0x09978), P(0x0997c), 158 P(0x09980), P(0x09984), P(0x09988), P(0x0998c), P(0x09990), 159 P(0x09994), P(0x09998), P(0x0999c), P(0x099a0), P(0x099a4), 160 P(0x099a8), P(0x099ac), P(0x099b0), P(0x099b4), P(0x099c4), 161 P(0x099c8), P(0x099cc), P(0x099d0), P(0x099d4), P(0x099d8), 162 P(0x099dc), P(0x099e0), P(0x099e4), P(0x099e8), P(0x099ec), 163 P(0x099f0), P(0x099fc), P(0x0a208), P(0x0a210), P(0x0a214), 164 P(0x0a218), P(0x0a220), P(0x0a224), P(0x0a228), P(0x0a22c), 165 P(0x0a234), P(0x0a238), P(0x0a240), P(0x0a244), P(0x0a248), 166 P(0x0a24c), P(0x0a254), P(0x0a258), P(0x0a25c), P(0x0a260), 167 P(0x0a268), P(0x0a26c), P(0x0b26c), P(0x0d270), P(0x0a278), 168 P(0x0d35c), P(0x0d360), P(0x0d364), P(0x0d368), P(0x0d36c), 169 P(0x0d370), P(0x0d374), P(0x0d378), P(0x0d37c), P(0x0d380), 170 P(0x0d384), P(0x0a38c), P(0x0a390), P(0x0a394), P(0x0a398), 171 P(0x0a39c), P(0x0a3a0), P(0x0a3a4), P(0x0a3a8), P(0x0a3ac), 172 P(0x0a3b0), P(0x0a3b4), P(0x0a3b8), P(0x0a3bc), P(0x0a3c0), 173 P(0x0a3c4), P(0x0a3c8), P(0x0a3cc), P(0x0a3d0), P(0x0a3d4), 174 P(0x0a3dc), P(0x0a3e0), P(0x0a3e4), P(0x0a3e8), P(0x07800), 175 P(0x07804), P(0x07808), P(0x0780c), P(0x07810), P(0x07818), 176 P(0x07824), P(0x07828), P(0x0782c), P(0x07830), P(0x07834), 177 P(0x0783c), P(0x07848), P(0x0784c), P(0x07850), P(0x07854), 178 P(0x07858), P(0x07860), P(0x07864), P(0x07868), P(0x0786c), 179 P(0x07870), P(0x07874), P(0x07878), P(0x0787c), P(0x07880), 180 P(0x07884), P(0x07888), P(0x0788c), P(0x07890), P(0x07898) 181 }; 182 183 static const uint32_t ar9280_2_0_cm_vals[] = { 184 0x00000000, 0x00020015, 0x00000005, 0x00000000, 0x00000008, 185 0x00000008, 0x00000010, 0x00000000, 0x0000001f, 0x00000000, 186 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 187 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x002ffc0f, 188 0x002ffc0f, 0x002ffc0f, 0x002ffc0f, 0x002ffc0f, 0x002ffc0f, 189 0x002ffc0f, 0x002ffc0f, 0x002ffc0f, 0x002ffc0f, 0x00000000, 190 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 191 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 192 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 193 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 194 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 195 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 196 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 197 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 198 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 199 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 200 0x00000000, 0x00000002, 0x00000002, 0x0000001f, 0x00000000, 201 0x00000000, 0x00000033, 0x00000002, 0x000004c2, 0x00000000, 202 0x00000000, 0x00000000, 0x00000700, 0x00000000, 0x00000000, 203 0x00000000, 0x40000000, 0x00000000, 0x00000000, 0x000fc78f, 204 0x0000000f, 0x00000000, 0x00000000, 0x2a80001a, 0x05dc01e0, 205 0x1f402710, 0x01f40000, 0x00001e00, 0x00000000, 0x00400000, 206 0xffffffff, 0x0000ffff, 0x003f3f3f, 0x00000000, 0x00000000, 207 0x00000000, 0x00000000, 0x00020000, 0x00020000, 0x00000001, 208 0x00000052, 0x00000000, 0x00000168, 0x000100aa, 0x00003210, 209 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 210 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 211 0x32143320, 0xfaa4fa50, 0x00000100, 0x00000000, 0x00000000, 212 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 213 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 214 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 215 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 216 0x00000000, 0x00100000, 0x0010f400, 0x00000100, 0x0001e800, 217 0x00000000, 0x00000000, 0x00000000, 0x400000ff, 0x00080922, 218 0x88a00010, 0x00000000, 0x40000000, 0x003e4180, 0x00000000, 219 0x0000002c, 0x0000002c, 0x00000000, 0x00000000, 0x00000000, 220 0x00000000, 0x00000040, 0x00000000, 0x00000000, 0x00000007, 221 0x00000302, 0x00000e00, 0x00ff0000, 0x00000000, 0x000107ff, 222 0x00481043, 0x00000000, 0xafa68e30, 0xfd14e000, 0x9c0a9f6b, 223 0x00000000, 0x0000a000, 0x00000000, 0x00200400, 0x0040233c, 224 0x0040233c, 0x00000044, 0x00000000, 0x00000000, 0x00000000, 225 0x00000000, 0x01002310, 0x10000fff, 0x04900000, 0x04900000, 226 0x00000001, 0x00000004, 0x1e1f2022, 0x0a0b0c0d, 0x00000000, 227 0x9280c00a, 0x00020028, 0x5f3ca3de, 0x2108ecff, 0x14750604, 228 0x004b6a8e, 0x190fb514, 0x00000000, 0x00000001, 0x00000000, 229 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 230 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 231 0x201fff00, 0x006f0000, 0x03051000, 0x00000820, 0x06336f77, 232 0x6af6532f, 0x08f186c8, 0x00046384, 0x00000000, 0x00000000, 233 0x00000000, 0x00000000, 0xaaaaaaaa, 0x3c466478, 0x0cc80caa, 234 0x00000000, 0x00001042, 0x803e4788, 0x4080a333, 0x40206c10, 235 0x009c4060, 0x01834061, 0x00000400, 0x000003b5, 0x233f7180, 236 0x20202020, 0x20202020, 0x38490a20, 0x00007bb6, 0x0fff3ffc, 237 0x00000000, 0x00000000, 0x0cdbd380, 0x0f0f0f01, 0xdfa91f01, 238 0x00000000, 0x0e79e5c6, 0x0e79e5c6, 0x00820820, 0x1ce739ce, 239 0x07ffffef, 0x0fffffe7, 0x17ffffe5, 0x1fffffe4, 0x37ffffe3, 240 0x3fffffe3, 0x57ffffe3, 0x5fffffe2, 0x7fffffe2, 0x7f3c7bba, 241 0xf3307ff0, 0x20202020, 0x20202020, 0x1ce739ce, 0x000001ce, 242 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 243 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 244 0x00000000, 0x00000246, 0x20202020, 0x20202020, 0x20202020, 245 0x1ce739ce, 0x000001ce, 0x00000000, 0x18c43433, 0x00040000, 246 0xdb005012, 0x04924914, 0x21084210, 0x6d801300, 0x07e41000, 247 0x00040000, 0xdb005012, 0x04924914, 0x21084210, 0x6d801300, 248 0x07e40000, 0x00100000, 0x773f0567, 0x54214514, 0x12035828, 249 0x9259269a, 0x52802000, 0x0a8e370e, 0xc0102850, 0x812d4000, 250 0x807ec400, 0x001b6db0, 0x00376b63, 0x06db6db6, 0x006d8000, 251 0xffeffffe, 0xffeffffe, 0x00010000, 0x02060aeb, 0x2a850160 252 }; 253 254 static const uint16_t ar9280_2_0_fast_clock_regs[] = { 255 P(0x01030), P(0x01070), P(0x010b0), P(0x08014), P(0x0801c), 256 P(0x08318), P(0x09820), P(0x09824), P(0x09828), P(0x09834), 257 P(0x09844), P(0x09914), P(0x09918) 258 }; 259 260 static const uint32_t ar9280_2_0_fast_clock_vals_5g20[] = { 261 0x00000268, 0x0000018c, 0x00000fd0, 0x044c044c, 0x148ec02b, 262 0x000044c0, 0x02020200, 0x01000f0f, 0x0b020001, 0x00000f0f, 263 0x03721821, 0x00000898, 0x0000000b 264 }; 265 266 static const uint32_t ar9280_2_0_fast_clock_vals_5g40[] = { 267 0x000004d0, 0x00000318, 0x00001fa0, 0x08980898, 0x148ec057, 268 0x00008980, 0x02020200, 0x01000f0f, 0x0b020001, 0x00000f0f, 269 0x03721821, 0x00001130, 0x00000016 270 }; 271 272 static const struct athn_ini ar9280_2_0_ini = { 273 nitems(ar9280_2_0_regs), 274 ar9280_2_0_regs, 275 ar9280_2_0_vals_5g20, 276 ar9280_2_0_vals_5g40, 277 ar9280_2_0_vals_2g40, 278 ar9280_2_0_vals_2g20, 279 nitems(ar9280_2_0_cm_regs), 280 ar9280_2_0_cm_regs, 281 ar9280_2_0_cm_vals, 282 nitems(ar9280_2_0_fast_clock_regs), 283 ar9280_2_0_fast_clock_regs, 284 ar9280_2_0_fast_clock_vals_5g20, 285 ar9280_2_0_fast_clock_vals_5g40 286 }; 287 288 /* 289 * AR9280 2.0 Tx gains. 290 */ 291 static const uint16_t ar9280_2_0_tx_gain_regs[] = { 292 P(0x0a274), P(0x0a27c), P(0x0a300), P(0x0a304), P(0x0a308), 293 P(0x0a30c), P(0x0a310), P(0x0a314), P(0x0a318), P(0x0a31c), 294 P(0x0a320), P(0x0a324), P(0x0a328), P(0x0a32c), P(0x0a330), 295 P(0x0a334), P(0x0a338), P(0x0a33c), P(0x0a340), P(0x0a344), 296 P(0x0a348), P(0x0a34c), P(0x0a350), P(0x0a354), P(0x0a3ec), 297 P(0x07814), P(0x07838), P(0x0781c), P(0x07840), P(0x07820), 298 P(0x07844) 299 }; 300 301 static const uint32_t ar9280_2_0_tx_gain_vals_5g[] = { 302 0x0a19c652, 0x050701ce, 0x00000000, 0x00003002, 0x00006004, 303 0x0000a006, 0x0000e012, 0x00011014, 0x0001504a, 0x0001904c, 304 0x0001c04e, 0x00020092, 0x0002410a, 0x0002710c, 0x0002b18b, 305 0x0002e1cc, 0x000321ec, 0x000321ec, 0x000321ec, 0x000321ec, 306 0x000321ec, 0x000321ec, 0x000321ec, 0x000321ec, 0x00f70081, 307 0x0019beff, 0x0019beff, 0x00392000, 0x00392000, 0x92592480, 308 0x92592480 309 }; 310 311 static const uint32_t ar9280_2_0_tx_gain_vals_2g[] = { 312 0x0a1aa652, 0x050701ce, 0x00000000, 0x00003002, 0x00008009, 313 0x0000b00b, 0x0000e012, 0x00012048, 0x0001604a, 0x0001a211, 314 0x0001e213, 0x0002121b, 0x00024412, 0x00028414, 0x0002b44a, 315 0x00030649, 0x0003364b, 0x00038a49, 0x0003be48, 0x0003ee4a, 316 0x00042e88, 0x00046e8a, 0x00049ec9, 0x0004bf42, 0x00f70081, 317 0x0019beff, 0x0019beff, 0x00392000, 0x00392000, 0x92592480, 318 0x92592480 319 }; 320 321 static const struct athn_gain ar9280_2_0_tx_gain = { 322 nitems(ar9280_2_0_tx_gain_regs), 323 ar9280_2_0_tx_gain_regs, 324 ar9280_2_0_tx_gain_vals_5g, 325 ar9280_2_0_tx_gain_vals_2g 326 }; 327 328 static const uint32_t ar9280_2_0_tx_gain_high_power_vals_5g[] = { 329 0x0a19e652, 0x050739ce, 0x00000000, 0x00003002, 0x00006004, 330 0x0000a006, 0x0000e012, 0x00011014, 0x0001504a, 0x0001904c, 331 0x0001c04e, 0x00021092, 0x0002510a, 0x0002910c, 0x0002c18b, 332 0x0002f1cc, 0x000321eb, 0x000341ec, 0x000341ec, 0x000341ec, 333 0x000341ec, 0x000341ec, 0x000341ec, 0x000341ec, 0x00f70081, 334 0x00198eff, 0x00198eff, 0x00172000, 0x00172000, 0xf258a480, 335 0xf258a480 336 }; 337 338 static const uint32_t ar9280_2_0_tx_gain_high_power_vals_2g[] = { 339 0x0a1aa652, 0x050739ce, 0x00000000, 0x00004002, 0x00007008, 340 0x0000c010, 0x00010012, 0x00013014, 0x0001820a, 0x0001b211, 341 0x0001e213, 0x00022411, 0x00025413, 0x00029811, 0x0002c813, 342 0x00030a14, 0x00035a50, 0x00039c4c, 0x0003de8a, 0x00042e92, 343 0x00046ed2, 0x0004bed5, 0x0004ff54, 0x00055fd5, 0x00f70081, 344 0x00198eff, 0x00198eff, 0x00172000, 0x00172000, 0xf258a480, 345 0xf258a480 346 }; 347 348 static const struct athn_gain ar9280_2_0_tx_gain_high_power = { 349 nitems(ar9280_2_0_tx_gain_regs), 350 ar9280_2_0_tx_gain_regs, 351 ar9280_2_0_tx_gain_high_power_vals_5g, 352 ar9280_2_0_tx_gain_high_power_vals_2g 353 }; 354 355 /* 356 * AR9280 2.0 Rx gains. 357 */ 358 static const uint16_t ar9280_2_0_rx_gain_regs[] = { 359 P(0x09a00), P(0x09a04), P(0x09a08), P(0x09a0c), P(0x09a10), 360 P(0x09a14), P(0x09a18), P(0x09a1c), P(0x09a20), P(0x09a24), 361 P(0x09a28), P(0x09a2c), P(0x09a30), P(0x09a34), P(0x09a38), 362 P(0x09a3c), P(0x09a40), P(0x09a44), P(0x09a48), P(0x09a4c), 363 P(0x09a50), P(0x09a54), P(0x09a58), P(0x09a5c), P(0x09a60), 364 P(0x09a64), P(0x09a68), P(0x09a6c), P(0x09a70), P(0x09a74), 365 P(0x09a78), P(0x09a7c), P(0x09a80), P(0x09a84), P(0x09a88), 366 P(0x09a8c), P(0x09a90), P(0x09a94), P(0x09a98), P(0x09a9c), 367 P(0x09aa0), P(0x09aa4), P(0x09aa8), P(0x09aac), P(0x09ab0), 368 P(0x09ab4), P(0x09ab8), P(0x09abc), P(0x09ac0), P(0x09ac4), 369 P(0x09ac8), P(0x09acc), P(0x09ad0), P(0x09ad4), P(0x09ad8), 370 P(0x09adc), P(0x09ae0), P(0x09ae4), P(0x09ae8), P(0x09aec), 371 P(0x09af0), P(0x09af4), P(0x09af8), P(0x09afc), P(0x09b00), 372 P(0x09b04), P(0x09b08), P(0x09b0c), P(0x09b10), P(0x09b14), 373 P(0x09b18), P(0x09b1c), P(0x09b20), P(0x09b24), P(0x09b28), 374 P(0x09b2c), P(0x09b30), P(0x09b34), P(0x09b38), P(0x09b3c), 375 P(0x09b40), P(0x09b44), P(0x09b48), P(0x09b4c), P(0x09b50), 376 P(0x09b54), P(0x09b58), P(0x09b5c), P(0x09b60), P(0x09b64), 377 P(0x09b68), P(0x09b6c), P(0x09b70), P(0x09b74), P(0x09b78), 378 P(0x09b7c), P(0x09b80), P(0x09b84), P(0x09b88), P(0x09b8c), 379 P(0x09b90), P(0x09b94), P(0x09b98), P(0x09b9c), P(0x09ba0), 380 P(0x09ba4), P(0x09ba8), P(0x09bac), P(0x09bb0), P(0x09bb4), 381 P(0x09bb8), P(0x09bbc), P(0x09bc0), P(0x09bc4), P(0x09bc8), 382 P(0x09bcc), P(0x09bd0), P(0x09bd4), P(0x09bd8), P(0x09bdc), 383 P(0x09be0), P(0x09be4), P(0x09be8), P(0x09bec), P(0x09bf0), 384 P(0x09bf4), P(0x09bf8), P(0x09bfc), P(0x09848), P(0x0a848) 385 }; 386 387 static const uint32_t ar9280_2_0_rx_gain_vals_5g[] = { 388 0x00008184, 0x00008188, 0x0000818c, 0x00008190, 0x00008194, 389 0x00008200, 0x00008204, 0x00008208, 0x0000820c, 0x00008210, 390 0x00008214, 0x00008280, 0x00008284, 0x00008288, 0x0000828c, 391 0x00008290, 0x00008300, 0x00008304, 0x00008308, 0x0000830c, 392 0x00008310, 0x00008314, 0x00008380, 0x00008384, 0x00008388, 393 0x0000838c, 0x00008390, 0x00008394, 0x0000a380, 0x0000a384, 394 0x0000a388, 0x0000a38c, 0x0000a390, 0x0000a394, 0x0000a780, 395 0x0000a784, 0x0000a788, 0x0000a78c, 0x0000a790, 0x0000a794, 396 0x0000ab84, 0x0000ab88, 0x0000ab8c, 0x0000ab90, 0x0000ab94, 397 0x0000af80, 0x0000af84, 0x0000af88, 0x0000af8c, 0x0000af90, 398 0x0000af94, 0x0000b380, 0x0000b384, 0x0000b388, 0x0000b38c, 399 0x0000b390, 0x0000b394, 0x0000b398, 0x0000b780, 0x0000b784, 400 0x0000b788, 0x0000b78c, 0x0000b790, 0x0000b794, 0x0000b798, 401 0x0000d784, 0x0000d788, 0x0000d78c, 0x0000d790, 0x0000f780, 402 0x0000f784, 0x0000f788, 0x0000f78c, 0x0000f790, 0x0000f794, 403 0x0000f7a4, 0x0000f7a8, 0x0000f7ac, 0x0000f7b0, 0x0000f7b4, 404 0x0000f7a1, 0x0000f7a5, 0x0000f7a9, 0x0000f7ad, 0x0000f7b1, 405 0x0000f7b5, 0x0000f7c5, 0x0000f7c9, 0x0000f7cd, 0x0000f7d1, 406 0x0000f7d5, 0x0000f7c2, 0x0000f7c6, 0x0000f7ca, 0x0000f7ce, 407 0x0000f7d2, 0x0000f7d6, 0x0000f7c3, 0x0000f7c7, 0x0000f7cb, 408 0x0000f7d3, 0x0000f7d7, 0x0000f7db, 0x0000f7db, 0x0000f7db, 409 0x0000f7db, 0x0000f7db, 0x0000f7db, 0x0000f7db, 0x0000f7db, 410 0x0000f7db, 0x0000f7db, 0x0000f7db, 0x0000f7db, 0x0000f7db, 411 0x0000f7db, 0x0000f7db, 0x0000f7db, 0x0000f7db, 0x0000f7db, 412 0x0000f7db, 0x0000f7db, 0x0000f7db, 0x0000f7db, 0x0000f7db, 413 0x0000f7db, 0x0000f7db, 0x0000f7db, 0x00001066, 0x00001066 414 }; 415 416 static const uint32_t ar9280_2_0_rx_gain_vals_2g[] = { 417 0x00008000, 0x00008000, 0x00008000, 0x00008000, 0x00008000, 418 0x00008000, 0x00008004, 0x00008008, 0x0000800c, 0x00008080, 419 0x00008084, 0x00008088, 0x0000808c, 0x00008100, 0x00008104, 420 0x00008108, 0x0000810c, 0x00008110, 0x00008114, 0x00008180, 421 0x00008184, 0x00008188, 0x0000818c, 0x00008190, 0x00008194, 422 0x000081a0, 0x0000820c, 0x000081a8, 0x00008284, 0x00008288, 423 0x00008224, 0x00008290, 0x00008300, 0x00008304, 0x00008308, 424 0x0000830c, 0x00008380, 0x00008384, 0x00008700, 0x00008704, 425 0x00008708, 0x0000870c, 0x00008780, 0x00008784, 0x00008b00, 426 0x00008b04, 0x00008b08, 0x00008b0c, 0x00008b80, 0x00008b84, 427 0x00008b88, 0x00008b8c, 0x00008b90, 0x00008f80, 0x00008f84, 428 0x00008f88, 0x00008f8c, 0x00008f90, 0x0000930c, 0x00009310, 429 0x00009384, 0x00009388, 0x00009324, 0x00009704, 0x000096a4, 430 0x000096a8, 0x00009710, 0x00009714, 0x00009720, 0x00009724, 431 0x00009728, 0x0000972c, 0x000097a0, 0x000097a4, 0x000097a8, 432 0x000097b0, 0x000097b4, 0x000097b8, 0x000097a5, 0x000097a9, 433 0x000097ad, 0x000097b1, 0x000097b5, 0x000097b9, 0x000097c5, 434 0x000097c9, 0x000097d1, 0x000097d5, 0x000097d9, 0x000097c6, 435 0x000097ca, 0x000097ce, 0x000097d2, 0x000097d6, 0x000097c3, 436 0x000097c7, 0x000097cb, 0x000097cf, 0x000097d7, 0x000097db, 437 0x000097db, 0x000097db, 0x000097db, 0x000097db, 0x000097db, 438 0x000097db, 0x000097db, 0x000097db, 0x000097db, 0x000097db, 439 0x000097db, 0x000097db, 0x000097db, 0x000097db, 0x000097db, 440 0x000097db, 0x000097db, 0x000097db, 0x000097db, 0x000097db, 441 0x000097db, 0x000097db, 0x000097db, 0x000097db, 0x000097db, 442 0x000097db, 0x000097db, 0x000097db, 0x00001063, 0x00001063 443 }; 444 445 static const struct athn_gain ar9280_2_0_rx_gain = { 446 nitems(ar9280_2_0_rx_gain_regs), 447 ar9280_2_0_rx_gain_regs, 448 ar9280_2_0_rx_gain_vals_5g, 449 ar9280_2_0_rx_gain_vals_2g 450 }; 451 452 static const uint32_t ar9280_2_0_rx_gain_13db_backoff_vals_5g[] = { 453 0x00008184, 0x00008188, 0x0000818c, 0x00008190, 0x00008194, 454 0x00008200, 0x00008204, 0x00008208, 0x0000820c, 0x00008210, 455 0x00008214, 0x00008280, 0x00008284, 0x00008288, 0x0000828c, 456 0x00008290, 0x00008300, 0x00008304, 0x00008308, 0x0000830c, 457 0x00008310, 0x00008314, 0x00008380, 0x00008384, 0x00008388, 458 0x0000838c, 0x00008390, 0x00008394, 0x0000a380, 0x0000a384, 459 0x0000a388, 0x0000a38c, 0x0000a390, 0x0000a394, 0x0000a780, 460 0x0000a784, 0x0000a788, 0x0000a78c, 0x0000a790, 0x0000a794, 461 0x0000ab84, 0x0000ab88, 0x0000ab8c, 0x0000ab90, 0x0000ab94, 462 0x0000af80, 0x0000af84, 0x0000af88, 0x0000af8c, 0x0000af90, 463 0x0000af94, 0x0000b380, 0x0000b384, 0x0000b388, 0x0000b38c, 464 0x0000b390, 0x0000b394, 0x0000b398, 0x0000b780, 0x0000b784, 465 0x0000b788, 0x0000b78c, 0x0000b790, 0x0000b794, 0x0000b798, 466 0x0000d784, 0x0000d788, 0x0000d78c, 0x0000d790, 0x0000f780, 467 0x0000f784, 0x0000f788, 0x0000f78c, 0x0000f790, 0x0000f794, 468 0x0000f7a4, 0x0000f7a8, 0x0000f7ac, 0x0000f7b0, 0x0000f7b4, 469 0x0000f7a1, 0x0000f7a5, 0x0000f7a9, 0x0000f7ad, 0x0000f7b1, 470 0x0000f7b5, 0x0000f7c5, 0x0000f7c9, 0x0000f7cd, 0x0000f7d1, 471 0x0000f7d5, 0x0000f7c2, 0x0000f7c6, 0x0000f7ca, 0x0000f7ce, 472 0x0000f7d2, 0x0000f7d6, 0x0000f7c3, 0x0000f7c7, 0x0000f7cb, 473 0x0000f7d3, 0x0000f7d7, 0x0000f7db, 0x0000f7db, 0x0000f7db, 474 0x0000f7db, 0x0000f7db, 0x0000f7db, 0x0000f7db, 0x0000f7db, 475 0x0000f7db, 0x0000f7db, 0x0000f7db, 0x0000f7db, 0x0000f7db, 476 0x0000f7db, 0x0000f7db, 0x0000f7db, 0x0000f7db, 0x0000f7db, 477 0x0000f7db, 0x0000f7db, 0x0000f7db, 0x0000f7db, 0x0000f7db, 478 0x0000f7db, 0x0000f7db, 0x0000f7db, 0x00001066, 0x00001066 479 }; 480 481 static const uint32_t ar9280_2_0_rx_gain_13db_backoff_vals_2g[] = { 482 0x00000290, 0x00000300, 0x00000304, 0x00000308, 0x0000030c, 483 0x00008000, 0x00008004, 0x00008008, 0x0000800c, 0x00008080, 484 0x00008084, 0x00008088, 0x0000808c, 0x00008100, 0x00008104, 485 0x00008108, 0x0000810c, 0x00008110, 0x00008114, 0x00008180, 486 0x00008184, 0x00008188, 0x0000818c, 0x00008190, 0x00008194, 487 0x000081a0, 0x0000820c, 0x000081a8, 0x00008284, 0x00008288, 488 0x00008224, 0x00008290, 0x00008300, 0x00008304, 0x00008308, 489 0x0000830c, 0x00008380, 0x00008384, 0x00008700, 0x00008704, 490 0x00008708, 0x0000870c, 0x00008780, 0x00008784, 0x00008b00, 491 0x00008b04, 0x00008b08, 0x00008b0c, 0x00008b80, 0x00008b84, 492 0x00008b88, 0x00008b8c, 0x00008b90, 0x00008f80, 0x00008f84, 493 0x00008f88, 0x00008f8c, 0x00008f90, 0x00009310, 0x00009314, 494 0x00009320, 0x00009324, 0x00009328, 0x0000932c, 0x00009330, 495 0x00009334, 0x00009321, 0x00009325, 0x00009329, 0x0000932d, 496 0x00009331, 0x00009335, 0x00009322, 0x00009326, 0x0000932a, 497 0x0000932e, 0x00009332, 0x00009336, 0x00009323, 0x00009327, 498 0x0000932b, 0x0000932f, 0x00009333, 0x00009337, 0x00009343, 499 0x00009347, 0x0000934b, 0x0000934f, 0x00009353, 0x00009357, 500 0x0000935b, 0x0000935b, 0x0000935b, 0x0000935b, 0x0000935b, 501 0x0000935b, 0x0000935b, 0x0000935b, 0x0000935b, 0x0000935b, 502 0x0000935b, 0x0000935b, 0x0000935b, 0x0000935b, 0x0000935b, 503 0x0000935b, 0x0000935b, 0x0000935b, 0x0000935b, 0x0000935b, 504 0x0000935b, 0x0000935b, 0x0000935b, 0x0000935b, 0x0000935b, 505 0x0000935b, 0x0000935b, 0x0000935b, 0x0000935b, 0x0000935b, 506 0x0000935b, 0x0000935b, 0x0000935b, 0x0000935b, 0x0000935b, 507 0x0000935b, 0x0000935b, 0x0000935b, 0x0000105a, 0x0000105a 508 }; 509 510 static const struct athn_gain ar9280_2_0_rx_gain_13db_backoff = { 511 nitems(ar9280_2_0_rx_gain_regs), 512 ar9280_2_0_rx_gain_regs, 513 ar9280_2_0_rx_gain_13db_backoff_vals_5g, 514 ar9280_2_0_rx_gain_13db_backoff_vals_2g 515 }; 516 517 static const uint32_t ar9280_2_0_rx_gain_23db_backoff_vals_5g[] = { 518 0x00008184, 0x00008188, 0x0000818c, 0x00008190, 0x00008194, 519 0x00008200, 0x00008204, 0x00008208, 0x0000820c, 0x00008210, 520 0x00008214, 0x00008280, 0x00008284, 0x00008288, 0x0000828c, 521 0x00008290, 0x00008300, 0x00008304, 0x00008308, 0x0000830c, 522 0x00008310, 0x00008314, 0x00008380, 0x00008384, 0x00008388, 523 0x0000838c, 0x00008390, 0x00008394, 0x0000a380, 0x0000a384, 524 0x0000a388, 0x0000a38c, 0x0000a390, 0x0000a394, 0x0000a780, 525 0x0000a784, 0x0000a788, 0x0000a78c, 0x0000a790, 0x0000a794, 526 0x0000ab84, 0x0000ab88, 0x0000ab8c, 0x0000ab90, 0x0000ab94, 527 0x0000af80, 0x0000af84, 0x0000af88, 0x0000af8c, 0x0000af90, 528 0x0000af94, 0x0000b380, 0x0000b384, 0x0000b388, 0x0000b38c, 529 0x0000b390, 0x0000b394, 0x0000b398, 0x0000b780, 0x0000b784, 530 0x0000b788, 0x0000b78c, 0x0000b790, 0x0000b794, 0x0000b798, 531 0x0000d784, 0x0000d788, 0x0000d78c, 0x0000d790, 0x0000f780, 532 0x0000f784, 0x0000f788, 0x0000f78c, 0x0000f790, 0x0000f794, 533 0x0000f7a4, 0x0000f7a8, 0x0000f7ac, 0x0000f7b0, 0x0000f7b4, 534 0x0000f7a1, 0x0000f7a5, 0x0000f7a9, 0x0000f7ad, 0x0000f7b1, 535 0x0000f7b5, 0x0000f7c5, 0x0000f7c9, 0x0000f7cd, 0x0000f7d1, 536 0x0000f7d5, 0x0000f7c2, 0x0000f7c6, 0x0000f7ca, 0x0000f7ce, 537 0x0000f7d2, 0x0000f7d6, 0x0000f7c3, 0x0000f7c7, 0x0000f7cb, 538 0x0000f7d3, 0x0000f7d7, 0x0000f7db, 0x0000f7db, 0x0000f7db, 539 0x0000f7db, 0x0000f7db, 0x0000f7db, 0x0000f7db, 0x0000f7db, 540 0x0000f7db, 0x0000f7db, 0x0000f7db, 0x0000f7db, 0x0000f7db, 541 0x0000f7db, 0x0000f7db, 0x0000f7db, 0x0000f7db, 0x0000f7db, 542 0x0000f7db, 0x0000f7db, 0x0000f7db, 0x0000f7db, 0x0000f7db, 543 0x0000f7db, 0x0000f7db, 0x0000f7db, 0x00001066, 0x00001066 544 }; 545 546 static const uint32_t ar9280_2_0_rx_gain_23db_backoff_vals_2g[] = { 547 0x00000290, 0x00000300, 0x00000304, 0x00000308, 0x0000030c, 548 0x00008000, 0x00008004, 0x00008008, 0x0000800c, 0x00008080, 549 0x00008084, 0x00008088, 0x0000808c, 0x00008100, 0x00008104, 550 0x00008108, 0x0000810c, 0x00008110, 0x00008114, 0x00008180, 551 0x00008184, 0x00008188, 0x0000818c, 0x00008190, 0x00008194, 552 0x000081a0, 0x0000820c, 0x000081a8, 0x00008284, 0x00008288, 553 0x00008224, 0x00008290, 0x00008300, 0x00008304, 0x00008308, 554 0x0000830c, 0x00008380, 0x00008384, 0x00008700, 0x00008704, 555 0x00008708, 0x0000870c, 0x00008780, 0x00008784, 0x00008b00, 556 0x00008b04, 0x00008b08, 0x00008b0c, 0x00008b10, 0x00008b80, 557 0x00008b84, 0x00008b88, 0x00008b8c, 0x00008b90, 0x00008b94, 558 0x00008b98, 0x00008ba4, 0x00008ba8, 0x00008bac, 0x00008bb0, 559 0x00008bb4, 0x00008ba1, 0x00008ba5, 0x00008ba9, 0x00008bad, 560 0x00008bb1, 0x00008bb5, 0x00008ba2, 0x00008ba6, 0x00008baa, 561 0x00008bae, 0x00008bb2, 0x00008bb6, 0x00008ba3, 0x00008ba7, 562 0x00008bab, 0x00008baf, 0x00008bb3, 0x00008bb7, 0x00008bc3, 563 0x00008bc7, 0x00008bcb, 0x00008bcf, 0x00008bd3, 0x00008bd7, 564 0x00008bdb, 0x00008bdb, 0x00008bdb, 0x00008bdb, 0x00008bdb, 565 0x00008bdb, 0x00008bdb, 0x00008bdb, 0x00008bdb, 0x00008bdb, 566 0x00008bdb, 0x00008bdb, 0x00008bdb, 0x00008bdb, 0x00008bdb, 567 0x00008bdb, 0x00008bdb, 0x00008bdb, 0x00008bdb, 0x00008bdb, 568 0x00008bdb, 0x00008bdb, 0x00008bdb, 0x00008bdb, 0x00008bdb, 569 0x00008bdb, 0x00008bdb, 0x00008bdb, 0x00008bdb, 0x00008bdb, 570 0x00008bdb, 0x00008bdb, 0x00008bdb, 0x00008bdb, 0x00008bdb, 571 0x00008bdb, 0x00008bdb, 0x00008bdb, 0x00008bdb, 0x00008bdb, 572 0x00008bdb, 0x00008bdb, 0x00008bdb, 0x00001055, 0x00001055 573 }; 574 575 static const struct athn_gain ar9280_2_0_rx_gain_23db_backoff = { 576 nitems(ar9280_2_0_rx_gain_regs), 577 ar9280_2_0_rx_gain_regs, 578 ar9280_2_0_rx_gain_23db_backoff_vals_5g, 579 ar9280_2_0_rx_gain_23db_backoff_vals_2g 580 }; 581 582 /* 583 * Serializer/Deserializer programming. 584 */ 585 586 static const uint32_t ar9280_2_0_serdes_regs[] = { 587 AR_PCIE_SERDES, 588 AR_PCIE_SERDES, 589 AR_PCIE_SERDES, 590 AR_PCIE_SERDES, 591 AR_PCIE_SERDES, 592 AR_PCIE_SERDES, 593 AR_PCIE_SERDES, 594 AR_PCIE_SERDES, 595 AR_PCIE_SERDES, 596 AR_PCIE_SERDES2, 597 }; 598 599 static const uint32_t ar9280_2_0_serdes_vals[] = { 600 0x9248fd00, 601 0x24924924, 602 0xa8000019, 603 0x13160820, 604 0xe5980560, 605 #ifdef ATHN_PCIE_CLKREQ 606 0xc01dcffc, 607 #else 608 0xc01dcffd, 609 #endif 610 0x1aaabe41, 611 0xbe105554, 612 0x00043007, 613 0x00000000 614 }; 615 616 static const struct athn_serdes ar9280_2_0_serdes = { 617 nitems(ar9280_2_0_serdes_vals), 618 ar9280_2_0_serdes_regs, 619 ar9280_2_0_serdes_vals 620 }; 621