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