1 /* 2 3 Broadcom B43 wireless driver 4 IEEE 802.11n 2057 radio device data tables 5 6 Copyright (c) 2010 Rafał Miłecki <zajec5@gmail.com> 7 8 This program is free software; you can redistribute it and/or modify 9 it under the terms of the GNU General Public License as published by 10 the Free Software Foundation; either version 2 of the License, or 11 (at your option) any later version. 12 13 This program is distributed in the hope that it will be useful, 14 but WITHOUT ANY WARRANTY; without even the implied warranty of 15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 GNU General Public License for more details. 17 18 You should have received a copy of the GNU General Public License 19 along with this program; see the file COPYING. If not, write to 20 the Free Software Foundation, Inc., 51 Franklin Steet, Fifth Floor, 21 Boston, MA 02110-1301, USA. 22 23 */ 24 25 #include "b43.h" 26 #include "radio_2057.h" 27 #include "phy_common.h" 28 29 static u16 r2057_rev4_init[][2] = { 30 { 0x0E, 0x20 }, { 0x31, 0x00 }, { 0x32, 0x00 }, { 0x33, 0x00 }, 31 { 0x35, 0x26 }, { 0x3C, 0xff }, { 0x3D, 0xff }, { 0x3E, 0xff }, 32 { 0x3F, 0xff }, { 0x62, 0x33 }, { 0x8A, 0xf0 }, { 0x8B, 0x10 }, 33 { 0x8C, 0xf0 }, { 0x91, 0x3f }, { 0x92, 0x36 }, { 0xA4, 0x8c }, 34 { 0xA8, 0x55 }, { 0xAF, 0x01 }, { 0x10F, 0xf0 }, { 0x110, 0x10 }, 35 { 0x111, 0xf0 }, { 0x116, 0x3f }, { 0x117, 0x36 }, { 0x129, 0x8c }, 36 { 0x12D, 0x55 }, { 0x134, 0x01 }, { 0x15E, 0x00 }, { 0x15F, 0x00 }, 37 { 0x160, 0x00 }, { 0x161, 0x00 }, { 0x162, 0x00 }, { 0x163, 0x00 }, 38 { 0x169, 0x02 }, { 0x16A, 0x00 }, { 0x16B, 0x00 }, { 0x16C, 0x00 }, 39 { 0x1A4, 0x00 }, { 0x1A5, 0x00 }, { 0x1A6, 0x00 }, { 0x1AA, 0x00 }, 40 { 0x1AB, 0x00 }, { 0x1AC, 0x00 }, 41 }; 42 43 static u16 r2057_rev5_init[][2] = { 44 { 0x00, 0x00 }, { 0x01, 0x57 }, { 0x02, 0x20 }, { 0x23, 0x6 }, 45 { 0x31, 0x00 }, { 0x32, 0x00 }, { 0x33, 0x00 }, { 0x51, 0x70 }, 46 { 0x59, 0x88 }, { 0x5C, 0x20 }, { 0x62, 0x33 }, { 0x63, 0x0f }, 47 { 0x64, 0x0f }, { 0x81, 0x01 }, { 0x91, 0x3f }, { 0x92, 0x36 }, 48 { 0xA1, 0x20 }, { 0xD6, 0x70 }, { 0xDE, 0x88 }, { 0xE1, 0x20 }, 49 { 0xE8, 0x0f }, { 0xE9, 0x0f }, { 0x106, 0x01 }, { 0x116, 0x3f }, 50 { 0x117, 0x36 }, { 0x126, 0x20 }, { 0x15E, 0x00 }, { 0x15F, 0x00 }, 51 { 0x160, 0x00 }, { 0x161, 0x00 }, { 0x162, 0x00 }, { 0x163, 0x00 }, 52 { 0x16A, 0x00 }, { 0x16B, 0x00 }, { 0x16C, 0x00 }, { 0x1A4, 0x00 }, 53 { 0x1A5, 0x00 }, { 0x1A6, 0x00 }, { 0x1AA, 0x00 }, { 0x1AB, 0x00 }, 54 { 0x1AC, 0x00 }, { 0x1B7, 0x0c }, { 0x1C1, 0x01 }, { 0x1C2, 0x80 }, 55 }; 56 57 static u16 r2057_rev5a_init[][2] = { 58 { 0x00, 0x15 }, { 0x01, 0x57 }, { 0x02, 0x20 }, { 0x23, 0x6 }, 59 { 0x31, 0x00 }, { 0x32, 0x00 }, { 0x33, 0x00 }, { 0x51, 0x70 }, 60 { 0x59, 0x88 }, { 0x5C, 0x20 }, { 0x62, 0x33 }, { 0x63, 0x0f }, 61 { 0x64, 0x0f }, { 0x81, 0x01 }, { 0x91, 0x3f }, { 0x92, 0x36 }, 62 { 0xC9, 0x01 }, { 0xD6, 0x70 }, { 0xDE, 0x88 }, { 0xE1, 0x20 }, 63 { 0xE8, 0x0f }, { 0xE9, 0x0f }, { 0x106, 0x01 }, { 0x116, 0x3f }, 64 { 0x117, 0x36 }, { 0x126, 0x20 }, { 0x14E, 0x01 }, { 0x15E, 0x00 }, 65 { 0x15F, 0x00 }, { 0x160, 0x00 }, { 0x161, 0x00 }, { 0x162, 0x00 }, 66 { 0x163, 0x00 }, { 0x16A, 0x00 }, { 0x16B, 0x00 }, { 0x16C, 0x00 }, 67 { 0x1A4, 0x00 }, { 0x1A5, 0x00 }, { 0x1A6, 0x00 }, { 0x1AA, 0x00 }, 68 { 0x1AB, 0x00 }, { 0x1AC, 0x00 }, { 0x1B7, 0x0c }, { 0x1C1, 0x01 }, 69 { 0x1C2, 0x80 }, 70 }; 71 72 static u16 r2057_rev7_init[][2] = { 73 { 0x00, 0x00 }, { 0x01, 0x57 }, { 0x02, 0x20 }, { 0x31, 0x00 }, 74 { 0x32, 0x00 }, { 0x33, 0x00 }, { 0x51, 0x70 }, { 0x59, 0x88 }, 75 { 0x5C, 0x20 }, { 0x62, 0x33 }, { 0x63, 0x0f }, { 0x64, 0x13 }, 76 { 0x66, 0xee }, { 0x6E, 0x58 }, { 0x75, 0x13 }, { 0x7B, 0x13 }, 77 { 0x7C, 0x14 }, { 0x7D, 0xee }, { 0x81, 0x01 }, { 0x91, 0x3f }, 78 { 0x92, 0x36 }, { 0xA1, 0x20 }, { 0xD6, 0x70 }, { 0xDE, 0x88 }, 79 { 0xE1, 0x20 }, { 0xE8, 0x0f }, { 0xE9, 0x13 }, { 0xEB, 0xee }, 80 { 0xF3, 0x58 }, { 0xFA, 0x13 }, { 0x100, 0x13 }, { 0x101, 0x14 }, 81 { 0x102, 0xee }, { 0x106, 0x01 }, { 0x116, 0x3f }, { 0x117, 0x36 }, 82 { 0x126, 0x20 }, { 0x15E, 0x00 }, { 0x15F, 0x00 }, { 0x160, 0x00 }, 83 { 0x161, 0x00 }, { 0x162, 0x00 }, { 0x163, 0x00 }, { 0x16A, 0x00 }, 84 { 0x16B, 0x00 }, { 0x16C, 0x00 }, { 0x1A4, 0x00 }, { 0x1A5, 0x00 }, 85 { 0x1A6, 0x00 }, { 0x1AA, 0x00 }, { 0x1AB, 0x00 }, { 0x1AC, 0x00 }, 86 { 0x1B7, 0x05 }, { 0x1C2, 0xa0 }, 87 }; 88 89 /* TODO: Which devices should use it? 90 static u16 r2057_rev8_init[][2] = { 91 { 0x00, 0x08 }, { 0x01, 0x57 }, { 0x02, 0x20 }, { 0x31, 0x00 }, 92 { 0x32, 0x00 }, { 0x33, 0x00 }, { 0x51, 0x70 }, { 0x59, 0x88 }, 93 { 0x5C, 0x20 }, { 0x62, 0x33 }, { 0x63, 0x0f }, { 0x64, 0x0f }, 94 { 0x6E, 0x58 }, { 0x75, 0x13 }, { 0x7B, 0x13 }, { 0x7C, 0x0f }, 95 { 0x7D, 0xee }, { 0x81, 0x01 }, { 0x91, 0x3f }, { 0x92, 0x36 }, 96 { 0xA1, 0x20 }, { 0xC9, 0x01 }, { 0xD6, 0x70 }, { 0xDE, 0x88 }, 97 { 0xE1, 0x20 }, { 0xE8, 0x0f }, { 0xE9, 0x0f }, { 0xF3, 0x58 }, 98 { 0xFA, 0x13 }, { 0x100, 0x13 }, { 0x101, 0x0f }, { 0x102, 0xee }, 99 { 0x106, 0x01 }, { 0x116, 0x3f }, { 0x117, 0x36 }, { 0x126, 0x20 }, 100 { 0x14E, 0x01 }, { 0x15E, 0x00 }, { 0x15F, 0x00 }, { 0x160, 0x00 }, 101 { 0x161, 0x00 }, { 0x162, 0x00 }, { 0x163, 0x00 }, { 0x16A, 0x00 }, 102 { 0x16B, 0x00 }, { 0x16C, 0x00 }, { 0x1A4, 0x00 }, { 0x1A5, 0x00 }, 103 { 0x1A6, 0x00 }, { 0x1AA, 0x00 }, { 0x1AB, 0x00 }, { 0x1AC, 0x00 }, 104 { 0x1B7, 0x05 }, { 0x1C2, 0xa0 }, 105 }; 106 */ 107 108 /* Extracted from MMIO dump of 6.30.223.141 */ 109 static u16 r2057_rev9_init[][2] = { 110 { 0x27, 0x1f }, { 0x28, 0x0a }, { 0x29, 0x2f }, { 0x42, 0x1f }, 111 { 0x48, 0x3f }, { 0x5c, 0x41 }, { 0x63, 0x14 }, { 0x64, 0x12 }, 112 { 0x66, 0xff }, { 0x74, 0xa3 }, { 0x7b, 0x14 }, { 0x7c, 0x14 }, 113 { 0x7d, 0xee }, { 0x86, 0xc0 }, { 0xc4, 0x10 }, { 0xc9, 0x01 }, 114 { 0xe1, 0x41 }, { 0xe8, 0x14 }, { 0xe9, 0x12 }, { 0xeb, 0xff }, 115 { 0xf5, 0x0a }, { 0xf8, 0x09 }, { 0xf9, 0xa3 }, { 0x100, 0x14 }, 116 { 0x101, 0x10 }, { 0x102, 0xee }, { 0x10b, 0xc0 }, { 0x149, 0x10 }, 117 { 0x14e, 0x01 }, { 0x1b7, 0x05 }, { 0x1c2, 0xa0 }, 118 }; 119 120 /* Extracted from MMIO dump of 6.30.223.248 */ 121 static u16 r2057_rev14_init[][2] = { 122 { 0x011, 0xfc }, { 0x030, 0x24 }, { 0x040, 0x1c }, { 0x082, 0x08 }, 123 { 0x0b4, 0x44 }, { 0x0c8, 0x01 }, { 0x0c9, 0x01 }, { 0x107, 0x08 }, 124 { 0x14d, 0x01 }, { 0x14e, 0x01 }, { 0x1af, 0x40 }, { 0x1b0, 0x40 }, 125 { 0x1cc, 0x01 }, { 0x1cf, 0x10 }, { 0x1d0, 0x0f }, { 0x1d3, 0x10 }, 126 { 0x1d4, 0x0f }, 127 }; 128 129 #define RADIOREGS7(r00, r01, r02, r03, r04, r05, r06, r07, r08, r09, \ 130 r10, r11, r12, r13, r14, r15, r16, r17, r18, r19, \ 131 r20, r21, r22, r23, r24, r25, r26, r27) \ 132 .radio_vcocal_countval0 = r00, \ 133 .radio_vcocal_countval1 = r01, \ 134 .radio_rfpll_refmaster_sparextalsize = r02, \ 135 .radio_rfpll_loopfilter_r1 = r03, \ 136 .radio_rfpll_loopfilter_c2 = r04, \ 137 .radio_rfpll_loopfilter_c1 = r05, \ 138 .radio_cp_kpd_idac = r06, \ 139 .radio_rfpll_mmd0 = r07, \ 140 .radio_rfpll_mmd1 = r08, \ 141 .radio_vcobuf_tune = r09, \ 142 .radio_logen_mx2g_tune = r10, \ 143 .radio_logen_mx5g_tune = r11, \ 144 .radio_logen_indbuf2g_tune = r12, \ 145 .radio_logen_indbuf5g_tune = r13, \ 146 .radio_txmix2g_tune_boost_pu_core0 = r14, \ 147 .radio_pad2g_tune_pus_core0 = r15, \ 148 .radio_pga_boost_tune_core0 = r16, \ 149 .radio_txmix5g_boost_tune_core0 = r17, \ 150 .radio_pad5g_tune_misc_pus_core0 = r18, \ 151 .radio_lna2g_tune_core0 = r19, \ 152 .radio_lna5g_tune_core0 = r20, \ 153 .radio_txmix2g_tune_boost_pu_core1 = r21, \ 154 .radio_pad2g_tune_pus_core1 = r22, \ 155 .radio_pga_boost_tune_core1 = r23, \ 156 .radio_txmix5g_boost_tune_core1 = r24, \ 157 .radio_pad5g_tune_misc_pus_core1 = r25, \ 158 .radio_lna2g_tune_core1 = r26, \ 159 .radio_lna5g_tune_core1 = r27 160 161 #define RADIOREGS7_2G(r00, r01, r02, r03, r04, r05, r06, r07, r08, r09, \ 162 r10, r11, r12, r13, r14, r15, r16, r17) \ 163 .radio_vcocal_countval0 = r00, \ 164 .radio_vcocal_countval1 = r01, \ 165 .radio_rfpll_refmaster_sparextalsize = r02, \ 166 .radio_rfpll_loopfilter_r1 = r03, \ 167 .radio_rfpll_loopfilter_c2 = r04, \ 168 .radio_rfpll_loopfilter_c1 = r05, \ 169 .radio_cp_kpd_idac = r06, \ 170 .radio_rfpll_mmd0 = r07, \ 171 .radio_rfpll_mmd1 = r08, \ 172 .radio_vcobuf_tune = r09, \ 173 .radio_logen_mx2g_tune = r10, \ 174 .radio_logen_indbuf2g_tune = r11, \ 175 .radio_txmix2g_tune_boost_pu_core0 = r12, \ 176 .radio_pad2g_tune_pus_core0 = r13, \ 177 .radio_lna2g_tune_core0 = r14, \ 178 .radio_txmix2g_tune_boost_pu_core1 = r15, \ 179 .radio_pad2g_tune_pus_core1 = r16, \ 180 .radio_lna2g_tune_core1 = r17 181 182 #define PHYREGS(r0, r1, r2, r3, r4, r5) \ 183 .phy_regs.phy_bw1a = r0, \ 184 .phy_regs.phy_bw2 = r1, \ 185 .phy_regs.phy_bw3 = r2, \ 186 .phy_regs.phy_bw4 = r3, \ 187 .phy_regs.phy_bw5 = r4, \ 188 .phy_regs.phy_bw6 = r5 189 190 /* Copied from brcmsmac (5.75.11): chan_info_nphyrev8_2057_rev5 */ 191 static const struct b43_nphy_chantabent_rev7_2g b43_nphy_chantab_phy_rev8_radio_rev5[] = { 192 { 193 .freq = 2412, 194 RADIOREGS7_2G(0x48, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x6c, 195 0x09, 0x0d, 0x08, 0x0e, 0x61, 0x03, 0xff, 0x61, 196 0x03, 0xff), 197 PHYREGS(0x03c9, 0x03c5, 0x03c1, 0x043a, 0x043f, 0x0443), 198 }, 199 { 200 .freq = 2417, 201 RADIOREGS7_2G(0x4b, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x71, 202 0x09, 0x0d, 0x08, 0x0e, 0x61, 0x03, 0xff, 0x61, 203 0x03, 0xff), 204 PHYREGS(0x03cb, 0x03c7, 0x03c3, 0x0438, 0x043d, 0x0441), 205 }, 206 { 207 .freq = 2422, 208 RADIOREGS7_2G(0x4e, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x76, 209 0x09, 0x0d, 0x08, 0x0e, 0x61, 0x03, 0xef, 0x61, 210 0x03, 0xef), 211 PHYREGS(0x03cd, 0x03c9, 0x03c5, 0x0436, 0x043a, 0x043f), 212 }, 213 { 214 .freq = 2427, 215 RADIOREGS7_2G(0x52, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x7b, 216 0x09, 0x0c, 0x08, 0x0e, 0x61, 0x03, 0xdf, 0x61, 217 0x03, 0xdf), 218 PHYREGS(0x03cf, 0x03cb, 0x03c7, 0x0434, 0x0438, 0x043d), 219 }, 220 { 221 .freq = 2432, 222 RADIOREGS7_2G(0x55, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x80, 223 0x09, 0x0c, 0x07, 0x0d, 0x61, 0x03, 0xcf, 0x61, 224 0x03, 0xcf), 225 PHYREGS(0x03d1, 0x03cd, 0x03c9, 0x0431, 0x0436, 0x043a), 226 }, 227 { 228 .freq = 2437, 229 RADIOREGS7_2G(0x58, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x85, 230 0x09, 0x0c, 0x07, 0x0d, 0x61, 0x03, 0xbf, 0x61, 231 0x03, 0xbf), 232 PHYREGS(0x03d3, 0x03cf, 0x03cb, 0x042f, 0x0434, 0x0438), 233 }, 234 { 235 .freq = 2442, 236 RADIOREGS7_2G(0x5c, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x8a, 237 0x09, 0x0b, 0x07, 0x0d, 0x61, 0x03, 0xaf, 0x61, 238 0x03, 0xaf), 239 PHYREGS(0x03d5, 0x03d1, 0x03cd, 0x042d, 0x0431, 0x0436), 240 }, 241 { 242 .freq = 2447, 243 RADIOREGS7_2G(0x5f, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x8f, 244 0x09, 0x0b, 0x07, 0x0d, 0x61, 0x03, 0x9f, 0x61, 245 0x03, 0x9f), 246 PHYREGS(0x03d7, 0x03d3, 0x03cf, 0x042b, 0x042f, 0x0434), 247 }, 248 { 249 .freq = 2452, 250 RADIOREGS7_2G(0x62, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x94, 251 0x09, 0x0b, 0x07, 0x0d, 0x61, 0x03, 0x8f, 0x61, 252 0x03, 0x8f), 253 PHYREGS(0x03d9, 0x03d5, 0x03d1, 0x0429, 0x042d, 0x0431), 254 }, 255 { 256 .freq = 2457, 257 RADIOREGS7_2G(0x66, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x99, 258 0x09, 0x0b, 0x07, 0x0c, 0x61, 0x03, 0x7f, 0x61, 259 0x03, 0x7f), 260 PHYREGS(0x03db, 0x03d7, 0x03d3, 0x0427, 0x042b, 0x042f), 261 }, 262 { 263 .freq = 2462, 264 RADIOREGS7_2G(0x69, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x9e, 265 0x09, 0x0b, 0x07, 0x0c, 0x61, 0x03, 0x6f, 0x61, 266 0x03, 0x6f), 267 PHYREGS(0x03dd, 0x03d9, 0x03d5, 0x0424, 0x0429, 0x042d), 268 }, 269 { 270 .freq = 2467, 271 RADIOREGS7_2G(0x6c, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0xa3, 272 0x09, 0x0b, 0x06, 0x0c, 0x61, 0x03, 0x5f, 0x61, 273 0x03, 0x5f), 274 PHYREGS(0x03df, 0x03db, 0x03d7, 0x0422, 0x0427, 0x042b), 275 }, 276 { 277 .freq = 2472, 278 RADIOREGS7_2G(0x70, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0xa8, 279 0x09, 0x0a, 0x06, 0x0b, 0x61, 0x03, 0x4f, 0x61, 280 0x03, 0x4f), 281 PHYREGS(0x03e1, 0x03dd, 0x03d9, 0x0420, 0x0424, 0x0429), 282 }, 283 { 284 .freq = 2484, 285 RADIOREGS7_2G(0x78, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0xb4, 286 0x09, 0x0a, 0x06, 0x0b, 0x61, 0x03, 0x3f, 0x61, 287 0x03, 0x3f), 288 PHYREGS(0x03e6, 0x03e2, 0x03de, 0x041b, 0x041f, 0x0424), 289 } 290 }; 291 292 /* Extracted from MMIO dump of 6.30.223.248 */ 293 static const struct b43_nphy_chantabent_rev7_2g b43_nphy_chantab_phy_rev17_radio_rev14[] = { 294 { 295 .freq = 2412, 296 RADIOREGS7_2G(0x48, 0x16, 0x30, 0x2b, 0x1f, 0x1f, 0x30, 0x6c, 297 0x09, 0x0d, 0x09, 0x03, 0x21, 0x53, 0xff, 0x21, 298 0x53, 0xff), 299 PHYREGS(0x03c9, 0x03c5, 0x03c1, 0x043a, 0x043f, 0x0443), 300 }, 301 { 302 .freq = 2417, 303 RADIOREGS7_2G(0x4b, 0x16, 0x30, 0x2b, 0x1f, 0x1f, 0x30, 0x71, 304 0x09, 0x0d, 0x08, 0x03, 0x21, 0x53, 0xff, 0x21, 305 0x53, 0xff), 306 PHYREGS(0x03cb, 0x03c7, 0x03c3, 0x0438, 0x043d, 0x0441), 307 }, 308 { 309 .freq = 2422, 310 RADIOREGS7_2G(0x4e, 0x16, 0x30, 0x2b, 0x1f, 0x1f, 0x30, 0x76, 311 0x09, 0x0d, 0x08, 0x03, 0x21, 0x53, 0xff, 0x21, 312 0x53, 0xff), 313 PHYREGS(0x03cd, 0x03c9, 0x03c5, 0x0436, 0x043a, 0x043f), 314 }, 315 { 316 .freq = 2427, 317 RADIOREGS7_2G(0x52, 0x16, 0x30, 0x2b, 0x1f, 0x1f, 0x30, 0x7b, 318 0x09, 0x0c, 0x08, 0x03, 0x21, 0x53, 0xff, 0x21, 319 0x53, 0xff), 320 PHYREGS(0x03cf, 0x03cb, 0x03c7, 0x0434, 0x0438, 0x043d), 321 }, 322 { 323 .freq = 2432, 324 RADIOREGS7_2G(0x55, 0x16, 0x30, 0x2b, 0x1f, 0x1f, 0x30, 0x80, 325 0x09, 0x0c, 0x08, 0x03, 0x21, 0x53, 0xff, 0x21, 326 0x53, 0xff), 327 PHYREGS(0x03d1, 0x03cd, 0x03c9, 0x0431, 0x0436, 0x043a), 328 }, 329 { 330 .freq = 2437, 331 RADIOREGS7_2G(0x58, 0x16, 0x30, 0x2b, 0x1f, 0x1f, 0x30, 0x85, 332 0x09, 0x0c, 0x08, 0x03, 0x21, 0x53, 0xff, 0x21, 333 0x53, 0xff), 334 PHYREGS(0x03d3, 0x03cf, 0x03cb, 0x042f, 0x0434, 0x0438), 335 }, 336 { 337 .freq = 2442, 338 RADIOREGS7_2G(0x5c, 0x16, 0x30, 0x2b, 0x1f, 0x1f, 0x30, 0x8a, 339 0x09, 0x0c, 0x08, 0x03, 0x21, 0x43, 0xff, 0x21, 340 0x43, 0xff), 341 PHYREGS(0x03d5, 0x03d1, 0x03cd, 0x042d, 0x0431, 0x0436), 342 }, 343 { 344 .freq = 2447, 345 RADIOREGS7_2G(0x5f, 0x16, 0x30, 0x2b, 0x1f, 0x1f, 0x30, 0x8f, 346 0x09, 0x0c, 0x08, 0x03, 0x21, 0x43, 0xff, 0x21, 347 0x43, 0xff), 348 PHYREGS(0x03d7, 0x03d3, 0x03cf, 0x042b, 0x042f, 0x0434), 349 }, 350 { 351 .freq = 2452, 352 RADIOREGS7_2G(0x62, 0x16, 0x30, 0x2b, 0x1f, 0x1f, 0x30, 0x94, 353 0x09, 0x0c, 0x08, 0x03, 0x21, 0x43, 0xff, 0x21, 354 0x43, 0xff), 355 PHYREGS(0x03d9, 0x03d5, 0x03d1, 0x0429, 0x042d, 0x0431), 356 }, 357 { 358 .freq = 2457, 359 RADIOREGS7_2G(0x66, 0x16, 0x30, 0x2b, 0x1f, 0x1f, 0x30, 0x99, 360 0x09, 0x0b, 0x07, 0x03, 0x21, 0x43, 0xff, 0x21, 361 0x43, 0xff), 362 PHYREGS(0x03db, 0x03d7, 0x03d3, 0x0427, 0x042b, 0x042f), 363 }, 364 { 365 .freq = 2462, 366 RADIOREGS7_2G(0x69, 0x16, 0x30, 0x2b, 0x1f, 0x1f, 0x30, 0x9e, 367 0x09, 0x0b, 0x07, 0x03, 0x01, 0x43, 0xff, 0x01, 368 0x43, 0xff), 369 PHYREGS(0x03dd, 0x03d9, 0x03d5, 0x0424, 0x0429, 0x042d), 370 }, 371 }; 372 373 /* Extracted from MMIO dump of 6.30.223.141 */ 374 static const struct b43_nphy_chantabent_rev7 b43_nphy_chantab_phy_rev16_radio_rev9[] = { 375 { 376 .freq = 2412, 377 RADIOREGS7(0x48, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x6c, 378 0x09, 0x0f, 0x0a, 0x00, 0x0a, 0x00, 0x41, 0x63, 379 0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00, 380 0x00, 0x00, 0xf0, 0x00), 381 PHYREGS(0x03c9, 0x03c5, 0x03c1, 0x043a, 0x043f, 0x0443), 382 }, 383 { 384 .freq = 2417, 385 RADIOREGS7(0x4b, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x71, 386 0x09, 0x0f, 0x0a, 0x00, 0x0a, 0x00, 0x41, 0x63, 387 0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00, 388 0x00, 0x00, 0xf0, 0x00), 389 PHYREGS(0x03cb, 0x03c7, 0x03c3, 0x0438, 0x043d, 0x0441), 390 }, 391 { 392 .freq = 2422, 393 RADIOREGS7(0x4e, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x76, 394 0x09, 0x0f, 0x09, 0x00, 0x09, 0x00, 0x41, 0x63, 395 0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00, 396 0x00, 0x00, 0xf0, 0x00), 397 PHYREGS(0x03cd, 0x03c9, 0x03c5, 0x0436, 0x043a, 0x043f), 398 }, 399 { 400 .freq = 2427, 401 RADIOREGS7(0x52, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x7b, 402 0x09, 0x0f, 0x09, 0x00, 0x09, 0x00, 0x41, 0x63, 403 0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00, 404 0x00, 0x00, 0xf0, 0x00), 405 PHYREGS(0x03cf, 0x03cb, 0x03c7, 0x0434, 0x0438, 0x043d), 406 }, 407 { 408 .freq = 2432, 409 RADIOREGS7(0x55, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x80, 410 0x09, 0x0f, 0x08, 0x00, 0x08, 0x00, 0x41, 0x63, 411 0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00, 412 0x00, 0x00, 0xf0, 0x00), 413 PHYREGS(0x03d1, 0x03cd, 0x03c9, 0x0431, 0x0436, 0x043a), 414 }, 415 { 416 .freq = 2437, 417 RADIOREGS7(0x58, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x85, 418 0x09, 0x0f, 0x08, 0x00, 0x08, 0x00, 0x41, 0x63, 419 0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00, 420 0x00, 0x00, 0xf0, 0x00), 421 PHYREGS(0x03d3, 0x03cf, 0x03cb, 0x042f, 0x0434, 0x0438), 422 }, 423 { 424 .freq = 2442, 425 RADIOREGS7(0x5c, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x8a, 426 0x09, 0x0f, 0x07, 0x00, 0x07, 0x00, 0x41, 0x63, 427 0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00, 428 0x00, 0x00, 0xf0, 0x00), 429 PHYREGS(0x03d5, 0x03d1, 0x03cd, 0x042d, 0x0431, 0x0436), 430 }, 431 { 432 .freq = 2447, 433 RADIOREGS7(0x5f, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x8f, 434 0x09, 0x0f, 0x07, 0x00, 0x07, 0x00, 0x41, 0x63, 435 0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00, 436 0x00, 0x00, 0xf0, 0x00), 437 PHYREGS(0x03d7, 0x03d3, 0x03cf, 0x042b, 0x042f, 0x0434), 438 }, 439 { 440 .freq = 2452, 441 RADIOREGS7(0x62, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x94, 442 0x09, 0x0f, 0x07, 0x00, 0x07, 0x00, 0x41, 0x63, 443 0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00, 444 0x00, 0x00, 0xf0, 0x00), 445 PHYREGS(0x03d9, 0x03d5, 0x03d1, 0x0429, 0x042d, 0x0431), 446 }, 447 { 448 .freq = 2457, 449 RADIOREGS7(0x66, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x99, 450 0x09, 0x0f, 0x06, 0x00, 0x06, 0x00, 0x41, 0x63, 451 0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00, 452 0x00, 0x00, 0xf0, 0x00), 453 PHYREGS(0x03db, 0x03d7, 0x03d3, 0x0427, 0x042b, 0x042f), 454 }, 455 { 456 .freq = 2462, 457 RADIOREGS7(0x69, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x9e, 458 0x09, 0x0f, 0x06, 0x00, 0x06, 0x00, 0x41, 0x63, 459 0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00, 460 0x00, 0x00, 0xf0, 0x00), 461 PHYREGS(0x03dd, 0x03d9, 0x03d5, 0x0424, 0x0429, 0x042d), 462 }, 463 { 464 .freq = 5180, 465 RADIOREGS7(0xbe, 0x16, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x06, 466 0x02, 0x0e, 0x00, 0x0e, 0x00, 0x9e, 0x00, 0x00, 467 0x9f, 0x2f, 0xa3, 0x00, 0xfc, 0x00, 0x00, 0x4f, 468 0x3a, 0x83, 0x00, 0xfc), 469 PHYREGS(0x081c, 0x0818, 0x0814, 0x01f9, 0x01fa, 0x01fb), 470 }, 471 { 472 .freq = 5200, 473 RADIOREGS7(0xc5, 0x16, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x08, 474 0x02, 0x0e, 0x00, 0x0e, 0x00, 0x9e, 0x00, 0x00, 475 0x7f, 0x2f, 0x83, 0x00, 0xf8, 0x00, 0x00, 0x4c, 476 0x4a, 0x83, 0x00, 0xf8), 477 PHYREGS(0x0824, 0x0820, 0x081c, 0x01f7, 0x01f8, 0x01f9), 478 }, 479 { 480 .freq = 5220, 481 RADIOREGS7(0xcc, 0x16, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x0a, 482 0x02, 0x0e, 0x00, 0x0e, 0x00, 0x9e, 0x00, 0x00, 483 0x6d, 0x3d, 0x83, 0x00, 0xf8, 0x00, 0x00, 0x2d, 484 0x2a, 0x73, 0x00, 0xf8), 485 PHYREGS(0x082c, 0x0828, 0x0824, 0x01f5, 0x01f6, 0x01f7), 486 }, 487 { 488 .freq = 5240, 489 RADIOREGS7(0xd2, 0x16, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x0c, 490 0x02, 0x0d, 0x00, 0x0d, 0x00, 0x8d, 0x00, 0x00, 491 0x4d, 0x1c, 0x73, 0x00, 0xf8, 0x00, 0x00, 0x4d, 492 0x2b, 0x73, 0x00, 0xf8), 493 PHYREGS(0x0834, 0x0830, 0x082c, 0x01f3, 0x01f4, 0x01f5), 494 }, 495 { 496 .freq = 5745, 497 RADIOREGS7(0x7b, 0x17, 0x20, 0x1f, 0x08, 0x08, 0x3f, 0x7d, 498 0x04, 0x08, 0x00, 0x06, 0x00, 0x15, 0x00, 0x00, 499 0x08, 0x03, 0x03, 0x00, 0x30, 0x00, 0x00, 0x06, 500 0x02, 0x03, 0x00, 0x30), 501 PHYREGS(0x08fe, 0x08fa, 0x08f6, 0x01c8, 0x01c8, 0x01c9), 502 }, 503 { 504 .freq = 5765, 505 RADIOREGS7(0x81, 0x17, 0x20, 0x1f, 0x08, 0x08, 0x3f, 0x81, 506 0x04, 0x08, 0x00, 0x06, 0x00, 0x15, 0x00, 0x00, 507 0x06, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x05, 508 0x02, 0x03, 0x00, 0x00), 509 PHYREGS(0x0906, 0x0902, 0x08fe, 0x01c6, 0x01c7, 0x01c8), 510 }, 511 { 512 .freq = 5785, 513 RADIOREGS7(0x88, 0x17, 0x20, 0x1f, 0x08, 0x08, 0x3f, 0x85, 514 0x04, 0x08, 0x00, 0x06, 0x00, 0x15, 0x00, 0x00, 515 0x08, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x05, 516 0x21, 0x03, 0x00, 0x00), 517 PHYREGS(0x090e, 0x090a, 0x0906, 0x01c4, 0x01c5, 0x01c6), 518 }, 519 { 520 .freq = 5805, 521 RADIOREGS7(0x8f, 0x17, 0x20, 0x1f, 0x08, 0x08, 0x3f, 0x89, 522 0x04, 0x07, 0x00, 0x06, 0x00, 0x04, 0x00, 0x00, 523 0x06, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x03, 524 0x00, 0x03, 0x00, 0x00), 525 PHYREGS(0x0916, 0x0912, 0x090e, 0x01c3, 0x01c4, 0x01c4), 526 }, 527 { 528 .freq = 5825, 529 RADIOREGS7(0x95, 0x17, 0x20, 0x1f, 0x08, 0x08, 0x3f, 0x8d, 530 0x04, 0x07, 0x00, 0x05, 0x00, 0x03, 0x00, 0x00, 531 0x05, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x03, 532 0x00, 0x03, 0x00, 0x00), 533 PHYREGS(0x091e, 0x091a, 0x0916, 0x01c1, 0x01c2, 0x01c3), 534 }, 535 }; 536 537 void r2057_upload_inittabs(struct b43_wldev *dev) 538 { 539 struct b43_phy *phy = &dev->phy; 540 u16 *table = NULL; 541 u16 size, i; 542 543 switch (phy->rev) { 544 case 7: 545 table = r2057_rev4_init[0]; 546 size = ARRAY_SIZE(r2057_rev4_init); 547 break; 548 case 8: 549 if (phy->radio_rev == 5) { 550 table = r2057_rev5_init[0]; 551 size = ARRAY_SIZE(r2057_rev5_init); 552 } else if (phy->radio_rev == 7) { 553 table = r2057_rev7_init[0]; 554 size = ARRAY_SIZE(r2057_rev7_init); 555 } 556 break; 557 case 9: 558 if (phy->radio_rev == 5) { 559 table = r2057_rev5a_init[0]; 560 size = ARRAY_SIZE(r2057_rev5a_init); 561 } 562 break; 563 case 16: 564 if (phy->radio_rev == 9) { 565 table = r2057_rev9_init[0]; 566 size = ARRAY_SIZE(r2057_rev9_init); 567 } 568 break; 569 case 17: 570 if (phy->radio_rev == 14) { 571 table = r2057_rev14_init[0]; 572 size = ARRAY_SIZE(r2057_rev14_init); 573 } 574 break; 575 } 576 577 B43_WARN_ON(!table); 578 579 if (table) { 580 for (i = 0; i < size; i++, table += 2) 581 b43_radio_write(dev, table[0], table[1]); 582 } 583 } 584 585 void r2057_get_chantabent_rev7(struct b43_wldev *dev, u16 freq, 586 const struct b43_nphy_chantabent_rev7 **tabent_r7, 587 const struct b43_nphy_chantabent_rev7_2g **tabent_r7_2g) 588 { 589 struct b43_phy *phy = &dev->phy; 590 const struct b43_nphy_chantabent_rev7 *e_r7 = NULL; 591 const struct b43_nphy_chantabent_rev7_2g *e_r7_2g = NULL; 592 unsigned int len, i; 593 594 *tabent_r7 = NULL; 595 *tabent_r7_2g = NULL; 596 597 switch (phy->rev) { 598 case 8: 599 if (phy->radio_rev == 5) { 600 e_r7_2g = b43_nphy_chantab_phy_rev8_radio_rev5; 601 len = ARRAY_SIZE(b43_nphy_chantab_phy_rev8_radio_rev5); 602 } 603 break; 604 case 16: 605 if (phy->radio_rev == 9) { 606 e_r7 = b43_nphy_chantab_phy_rev16_radio_rev9; 607 len = ARRAY_SIZE(b43_nphy_chantab_phy_rev16_radio_rev9); 608 } 609 break; 610 case 17: 611 if (phy->radio_rev == 14) { 612 e_r7_2g = b43_nphy_chantab_phy_rev17_radio_rev14; 613 len = ARRAY_SIZE(b43_nphy_chantab_phy_rev17_radio_rev14); 614 } 615 break; 616 default: 617 break; 618 } 619 620 if (e_r7) { 621 for (i = 0; i < len; i++, e_r7++) { 622 if (e_r7->freq == freq) { 623 *tabent_r7 = e_r7; 624 return; 625 } 626 } 627 } else if (e_r7_2g) { 628 for (i = 0; i < len; i++, e_r7_2g++) { 629 if (e_r7_2g->freq == freq) { 630 *tabent_r7_2g = e_r7_2g; 631 return; 632 } 633 } 634 } else { 635 B43_WARN_ON(1); 636 } 637 } 638