1 // SPDX-License-Identifier: GPL-2.0-or-later 2 /* 3 4 Broadcom B43 wireless driver 5 IEEE 802.11n 2059 radio device data tables 6 7 Copyright (c) 2011 Rafał Miłecki <zajec5@gmail.com> 8 9 10 */ 11 12 #include "b43.h" 13 #include "radio_2059.h" 14 15 /* Extracted from MMIO dump of 6.30.223.141 */ 16 static u16 r2059_phy_rev1_init[][2] = { 17 { 0x051, 0x70 }, { 0x05a, 0x03 }, { 0x079, 0x01 }, { 0x082, 0x70 }, 18 { 0x083, 0x00 }, { 0x084, 0x70 }, { 0x09a, 0x7f }, { 0x0b6, 0x10 }, 19 { 0x188, 0x05 }, 20 }; 21 22 #define RADIOREGS(r00, r01, r02, r03, r04, r05, r06, r07, r08, r09, \ 23 r10, r11, r12, r13, r14, r15, r16, r17, r18, r19, \ 24 r20) \ 25 .radio_syn16 = r00, \ 26 .radio_syn17 = r01, \ 27 .radio_syn22 = r02, \ 28 .radio_syn25 = r03, \ 29 .radio_syn27 = r04, \ 30 .radio_syn28 = r05, \ 31 .radio_syn29 = r06, \ 32 .radio_syn2c = r07, \ 33 .radio_syn2d = r08, \ 34 .radio_syn37 = r09, \ 35 .radio_syn41 = r10, \ 36 .radio_syn43 = r11, \ 37 .radio_syn47 = r12, \ 38 .radio_rxtx4a = r13, \ 39 .radio_rxtx58 = r14, \ 40 .radio_rxtx5a = r15, \ 41 .radio_rxtx6a = r16, \ 42 .radio_rxtx6d = r17, \ 43 .radio_rxtx6e = r18, \ 44 .radio_rxtx92 = r19, \ 45 .radio_rxtx98 = r20 46 47 #define PHYREGS(r0, r1, r2, r3, r4, r5) \ 48 .phy_regs.bw1 = r0, \ 49 .phy_regs.bw2 = r1, \ 50 .phy_regs.bw3 = r2, \ 51 .phy_regs.bw4 = r3, \ 52 .phy_regs.bw5 = r4, \ 53 .phy_regs.bw6 = r5 54 55 /* Extracted from MMIO dump of 6.30.223.141 56 * TODO: Values for channels 12 & 13 are outdated (from some old 5.x driver)! 57 */ 58 static const struct b43_phy_ht_channeltab_e_radio2059 b43_phy_ht_channeltab_radio2059[] = { 59 { 60 .freq = 2412, 61 RADIOREGS(0x48, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x6c, 62 0x09, 0x0f, 0x0a, 0x00, 0x0a, 0x00, 0x61, 0x73, 63 0x00, 0x00, 0x00, 0xd0, 0x00), 64 PHYREGS(0x03c9, 0x03c5, 0x03c1, 0x043a, 0x043f, 0x0443), 65 }, 66 { 67 .freq = 2417, 68 RADIOREGS(0x4b, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x71, 69 0x09, 0x0f, 0x0a, 0x00, 0x0a, 0x00, 0x61, 0x73, 70 0x00, 0x00, 0x00, 0xd0, 0x00), 71 PHYREGS(0x03cb, 0x03c7, 0x03c3, 0x0438, 0x043d, 0x0441), 72 }, 73 { 74 .freq = 2422, 75 RADIOREGS(0x4e, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x76, 76 0x09, 0x0f, 0x09, 0x00, 0x09, 0x00, 0x61, 0x73, 77 0x00, 0x00, 0x00, 0xd0, 0x00), 78 PHYREGS(0x03cd, 0x03c9, 0x03c5, 0x0436, 0x043a, 0x043f), 79 }, 80 { 81 .freq = 2427, 82 RADIOREGS(0x52, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x7b, 83 0x09, 0x0f, 0x09, 0x00, 0x09, 0x00, 0x61, 0x73, 84 0x00, 0x00, 0x00, 0xa0, 0x00), 85 PHYREGS(0x03cf, 0x03cb, 0x03c7, 0x0434, 0x0438, 0x043d), 86 }, 87 { 88 .freq = 2432, 89 RADIOREGS(0x55, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x80, 90 0x09, 0x0f, 0x08, 0x00, 0x08, 0x00, 0x61, 0x73, 91 0x00, 0x00, 0x00, 0xa0, 0x00), 92 PHYREGS(0x03d1, 0x03cd, 0x03c9, 0x0431, 0x0436, 0x043a), 93 }, 94 { 95 .freq = 2437, 96 RADIOREGS(0x58, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x85, 97 0x09, 0x0f, 0x08, 0x00, 0x08, 0x00, 0x61, 0x73, 98 0x00, 0x00, 0x00, 0xa0, 0x00), 99 PHYREGS(0x03d3, 0x03cf, 0x03cb, 0x042f, 0x0434, 0x0438), 100 }, 101 { 102 .freq = 2442, 103 RADIOREGS(0x5c, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x8a, 104 0x09, 0x0f, 0x07, 0x00, 0x07, 0x00, 0x61, 0x73, 105 0x00, 0x00, 0x00, 0x80, 0x00), 106 PHYREGS(0x03d5, 0x03d1, 0x03cd, 0x042d, 0x0431, 0x0436), 107 }, 108 { 109 .freq = 2447, 110 RADIOREGS(0x5f, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x8f, 111 0x09, 0x0f, 0x07, 0x00, 0x07, 0x00, 0x61, 0x73, 112 0x00, 0x00, 0x00, 0x80, 0x00), 113 PHYREGS(0x03d7, 0x03d3, 0x03cf, 0x042b, 0x042f, 0x0434), 114 }, 115 { 116 .freq = 2452, 117 RADIOREGS(0x62, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x94, 118 0x09, 0x0f, 0x07, 0x00, 0x07, 0x00, 0x61, 0x73, 119 0x00, 0x00, 0x00, 0x80, 0x00), 120 PHYREGS(0x03d9, 0x03d5, 0x03d1, 0x0429, 0x042d, 0x0431), 121 }, 122 { 123 .freq = 2457, 124 RADIOREGS(0x66, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x99, 125 0x09, 0x0f, 0x06, 0x00, 0x06, 0x00, 0x61, 0x73, 126 0x00, 0x00, 0x00, 0x60, 0x00), 127 PHYREGS(0x03db, 0x03d7, 0x03d3, 0x0427, 0x042b, 0x042f), 128 }, 129 { 130 .freq = 2462, 131 RADIOREGS(0x69, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x9e, 132 0x09, 0x0f, 0x06, 0x00, 0x06, 0x00, 0x61, 0x73, 133 0x00, 0x00, 0x00, 0x60, 0x00), 134 PHYREGS(0x03dd, 0x03d9, 0x03d5, 0x0424, 0x0429, 0x042d), 135 }, 136 { .freq = 2467, 137 RADIOREGS(0x6c, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0xa3, 138 0x09, 0x0f, 0x05, 0x00, 0x05, 0x00, 0x61, 0x03, 139 0x00, 0x00, 0x00, 0xf0, 0x00), 140 PHYREGS(0x03df, 0x03db, 0x03d7, 0x0422, 0x0427, 0x042b), 141 }, 142 { .freq = 2472, 143 RADIOREGS(0x70, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0xa8, 144 0x09, 0x0f, 0x05, 0x00, 0x05, 0x00, 0x61, 0x03, 145 0x00, 0x00, 0x00, 0xf0, 0x00), 146 PHYREGS(0x03e1, 0x03dd, 0x03d9, 0x0420, 0x0424, 0x0429), 147 }, 148 { 149 .freq = 5180, 150 RADIOREGS(0xbe, 0x16, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x06, 151 0x02, 0x0c, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x00, 152 0x0f, 0x4f, 0xa3, 0x00, 0xfc), 153 PHYREGS(0x081c, 0x0818, 0x0814, 0x01f9, 0x01fa, 0x01fb), 154 }, 155 { 156 .freq = 5200, 157 RADIOREGS(0xc5, 0x16, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x08, 158 0x02, 0x0c, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x00, 159 0x0f, 0x4f, 0x93, 0x00, 0xfb), 160 PHYREGS(0x0824, 0x0820, 0x081c, 0x01f7, 0x01f8, 0x01f9), 161 }, 162 { 163 .freq = 5220, 164 RADIOREGS(0xcc, 0x16, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x0a, 165 0x02, 0x0c, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x00, 166 0x0f, 0x4f, 0x93, 0x00, 0xea), 167 PHYREGS(0x082c, 0x0828, 0x0824, 0x01f5, 0x01f6, 0x01f7), 168 }, 169 { 170 .freq = 5240, 171 RADIOREGS(0xd2, 0x16, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x0c, 172 0x02, 0x0c, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x00, 173 0x0f, 0x4f, 0x93, 0x00, 0xda), 174 PHYREGS(0x0834, 0x0830, 0x082c, 0x01f3, 0x01f4, 0x01f5), 175 }, 176 { 177 .freq = 5260, 178 RADIOREGS(0xd9, 0x16, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x0e, 179 0x02, 0x0b, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0x00, 180 0x0f, 0x4f, 0x93, 0x00, 0xca), 181 PHYREGS(0x083c, 0x0838, 0x0834, 0x01f1, 0x01f2, 0x01f3), 182 }, 183 { 184 .freq = 5280, 185 RADIOREGS(0xe0, 0x16, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x10, 186 0x02, 0x0b, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0x00, 187 0x0f, 0x4f, 0x93, 0x00, 0xb9), 188 PHYREGS(0x0844, 0x0840, 0x083c, 0x01f0, 0x01f0, 0x01f1), 189 }, 190 { 191 .freq = 5300, 192 RADIOREGS(0xe6, 0x16, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x12, 193 0x02, 0x0b, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0x00, 194 0x0f, 0x4c, 0x83, 0x00, 0xb8), 195 PHYREGS(0x084c, 0x0848, 0x0844, 0x01ee, 0x01ef, 0x01f0), 196 }, 197 { 198 .freq = 5320, 199 RADIOREGS(0xed, 0x16, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x14, 200 0x02, 0x0b, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0x00, 201 0x0f, 0x4c, 0x83, 0x00, 0xa8), 202 PHYREGS(0x0854, 0x0850, 0x084c, 0x01ec, 0x01ed, 0x01ee), 203 }, 204 { 205 .freq = 5500, 206 RADIOREGS(0x29, 0x17, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x26, 207 0x02, 0x09, 0x00, 0x09, 0x00, 0x09, 0x00, 0x00, 208 0x0a, 0x46, 0x43, 0x00, 0x75), 209 PHYREGS(0x089c, 0x0898, 0x0894, 0x01dc, 0x01dd, 0x01dd), 210 }, 211 { 212 .freq = 5520, 213 RADIOREGS(0x30, 0x17, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x28, 214 0x02, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 215 0x0a, 0x46, 0x43, 0x00, 0x75), 216 PHYREGS(0x08a4, 0x08a0, 0x089c, 0x01da, 0x01db, 0x01dc), 217 }, 218 { 219 .freq = 5540, 220 RADIOREGS(0x36, 0x17, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x2a, 221 0x02, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 222 0x0a, 0x46, 0x43, 0x00, 0x75), 223 PHYREGS(0x08ac, 0x08a8, 0x08a4, 0x01d8, 0x01d9, 0x01da), 224 }, 225 { 226 .freq = 5560, 227 RADIOREGS(0x3d, 0x17, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x2c, 228 0x02, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 229 0x0a, 0x46, 0x43, 0x00, 0x75), 230 PHYREGS(0x08b4, 0x08b0, 0x08ac, 0x01d7, 0x01d7, 0x01d8), 231 }, 232 { 233 .freq = 5580, 234 RADIOREGS(0x44, 0x17, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x2e, 235 0x02, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 236 0x0a, 0x46, 0x43, 0x00, 0x74), 237 PHYREGS(0x08bc, 0x08b8, 0x08b4, 0x01d5, 0x01d6, 0x01d7), 238 }, 239 { 240 .freq = 5600, 241 RADIOREGS(0x4a, 0x17, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x30, 242 0x02, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 243 0x09, 0x44, 0x23, 0x00, 0x54), 244 PHYREGS(0x08c4, 0x08c0, 0x08bc, 0x01d3, 0x01d4, 0x01d5), 245 }, 246 { 247 .freq = 5620, 248 RADIOREGS(0x51, 0x17, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x32, 249 0x02, 0x07, 0x00, 0x07, 0x00, 0x07, 0x00, 0x00, 250 0x09, 0x44, 0x23, 0x00, 0x54), 251 PHYREGS(0x08cc, 0x08c8, 0x08c4, 0x01d2, 0x01d2, 0x01d3), 252 }, 253 { 254 .freq = 5640, 255 RADIOREGS(0x58, 0x17, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x34, 256 0x02, 0x07, 0x00, 0x07, 0x00, 0x07, 0x00, 0x00, 257 0x09, 0x44, 0x23, 0x00, 0x43), 258 PHYREGS(0x08d4, 0x08d0, 0x08cc, 0x01d0, 0x01d1, 0x01d2), 259 }, 260 { 261 .freq = 5660, 262 RADIOREGS(0x5e, 0x17, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x36, 263 0x02, 0x07, 0x00, 0x07, 0x00, 0x07, 0x00, 0x00, 264 0x09, 0x43, 0x23, 0x00, 0x43), 265 PHYREGS(0x08dc, 0x08d8, 0x08d4, 0x01ce, 0x01cf, 0x01d0), 266 }, 267 { 268 .freq = 5680, 269 RADIOREGS(0x65, 0x17, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x38, 270 0x02, 0x07, 0x00, 0x07, 0x00, 0x07, 0x00, 0x00, 271 0x09, 0x42, 0x23, 0x00, 0x43), 272 PHYREGS(0x08e4, 0x08e0, 0x08dc, 0x01cd, 0x01ce, 0x01ce), 273 }, 274 { 275 .freq = 5700, 276 RADIOREGS(0x6c, 0x17, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x3a, 277 0x02, 0x07, 0x00, 0x07, 0x00, 0x07, 0x00, 0x00, 278 0x08, 0x42, 0x13, 0x00, 0x32), 279 PHYREGS(0x08ec, 0x08e8, 0x08e4, 0x01cb, 0x01cc, 0x01cd), 280 }, 281 { 282 .freq = 5745, 283 RADIOREGS(0x7b, 0x17, 0x20, 0x1f, 0x08, 0x08, 0x3f, 0x7d, 284 0x04, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 285 0x08, 0x42, 0x13, 0x00, 0x21), 286 PHYREGS(0x08fe, 0x08fa, 0x08f6, 0x01c8, 0x01c8, 0x01c9), 287 }, 288 { 289 .freq = 5765, 290 RADIOREGS(0x81, 0x17, 0x20, 0x1f, 0x08, 0x08, 0x3f, 0x81, 291 0x04, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 292 0x08, 0x42, 0x13, 0x00, 0x11), 293 PHYREGS(0x0906, 0x0902, 0x08fe, 0x01c6, 0x01c7, 0x01c8), 294 }, 295 { 296 .freq = 5785, 297 RADIOREGS(0x88, 0x17, 0x20, 0x1f, 0x08, 0x08, 0x3f, 0x85, 298 0x04, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x00, 299 0x08, 0x42, 0x13, 0x00, 0x00), 300 PHYREGS(0x090e, 0x090a, 0x0906, 0x01c4, 0x01c5, 0x01c6), 301 }, 302 { 303 .freq = 5805, 304 RADIOREGS(0x8f, 0x17, 0x20, 0x1f, 0x08, 0x08, 0x3f, 0x89, 305 0x04, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x00, 306 0x06, 0x41, 0x03, 0x00, 0x00), 307 PHYREGS(0x0916, 0x0912, 0x090e, 0x01c3, 0x01c4, 0x01c4), 308 }, 309 { 310 .freq = 5825, 311 RADIOREGS(0x95, 0x17, 0x20, 0x1f, 0x08, 0x08, 0x3f, 0x8d, 312 0x04, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x00, 313 0x06, 0x41, 0x03, 0x00, 0x00), 314 PHYREGS(0x091e, 0x091a, 0x0916, 0x01c1, 0x01c2, 0x01c3), 315 }, 316 }; 317 318 void r2059_upload_inittabs(struct b43_wldev *dev) 319 { 320 struct b43_phy *phy = &dev->phy; 321 u16 *table = NULL; 322 u16 size, i; 323 324 switch (phy->rev) { 325 case 1: 326 table = r2059_phy_rev1_init[0]; 327 size = ARRAY_SIZE(r2059_phy_rev1_init); 328 break; 329 default: 330 B43_WARN_ON(1); 331 return; 332 } 333 334 for (i = 0; i < size; i++, table += 2) 335 b43_radio_write(dev, R2059_ALL | table[0], table[1]); 336 } 337 338 const struct b43_phy_ht_channeltab_e_radio2059 339 *b43_phy_ht_get_channeltab_e_r2059(struct b43_wldev *dev, u16 freq) 340 { 341 const struct b43_phy_ht_channeltab_e_radio2059 *e; 342 unsigned int i; 343 344 e = b43_phy_ht_channeltab_radio2059; 345 for (i = 0; i < ARRAY_SIZE(b43_phy_ht_channeltab_radio2059); i++, e++) { 346 if (e->freq == freq) 347 return e; 348 } 349 350 return NULL; 351 } 352