Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-or-later
0002 /*
0003 
0004   Broadcom B43 wireless driver
0005   IEEE 802.11n 2059 radio device data tables
0006 
0007   Copyright (c) 2011 Rafał Miłecki <zajec5@gmail.com>
0008 
0009 
0010 */
0011 
0012 #include "b43.h"
0013 #include "radio_2059.h"
0014 
0015 /* Extracted from MMIO dump of 6.30.223.141 */
0016 static u16 r2059_phy_rev1_init[][2] = {
0017     { 0x051, 0x70 }, { 0x05a, 0x03 }, { 0x079, 0x01 }, { 0x082, 0x70 },
0018     { 0x083, 0x00 }, { 0x084, 0x70 }, { 0x09a, 0x7f }, { 0x0b6, 0x10 },
0019     { 0x188, 0x05 },
0020 };
0021 
0022 #define RADIOREGS(r00, r01, r02, r03, r04, r05, r06, r07, r08, r09, \
0023           r10, r11, r12, r13, r14, r15, r16, r17, r18, r19, \
0024           r20) \
0025     .radio_syn16            = r00,  \
0026     .radio_syn17            = r01,  \
0027     .radio_syn22            = r02,  \
0028     .radio_syn25            = r03,  \
0029     .radio_syn27            = r04,  \
0030     .radio_syn28            = r05,  \
0031     .radio_syn29            = r06,  \
0032     .radio_syn2c            = r07,  \
0033     .radio_syn2d            = r08,  \
0034     .radio_syn37            = r09,  \
0035     .radio_syn41            = r10,  \
0036     .radio_syn43            = r11,  \
0037     .radio_syn47            = r12,  \
0038     .radio_rxtx4a           = r13,  \
0039     .radio_rxtx58           = r14,  \
0040     .radio_rxtx5a           = r15,  \
0041     .radio_rxtx6a           = r16,  \
0042     .radio_rxtx6d           = r17,  \
0043     .radio_rxtx6e           = r18,  \
0044     .radio_rxtx92           = r19,  \
0045     .radio_rxtx98           = r20
0046 
0047 #define PHYREGS(r0, r1, r2, r3, r4, r5) \
0048     .phy_regs.bw1   = r0,   \
0049     .phy_regs.bw2   = r1,   \
0050     .phy_regs.bw3   = r2,   \
0051     .phy_regs.bw4   = r3,   \
0052     .phy_regs.bw5   = r4,   \
0053     .phy_regs.bw6   = r5
0054 
0055 /* Extracted from MMIO dump of 6.30.223.141
0056  * TODO: Values for channels 12 & 13 are outdated (from some old 5.x driver)!
0057  */
0058 static const struct b43_phy_ht_channeltab_e_radio2059 b43_phy_ht_channeltab_radio2059[] = {
0059     {
0060         .freq           = 2412,
0061         RADIOREGS(0x48, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x6c,
0062               0x09, 0x0f, 0x0a, 0x00, 0x0a, 0x00, 0x61, 0x73,
0063               0x00, 0x00, 0x00, 0xd0, 0x00),
0064         PHYREGS(0x03c9, 0x03c5, 0x03c1, 0x043a, 0x043f, 0x0443),
0065     },
0066     {
0067         .freq           = 2417,
0068         RADIOREGS(0x4b, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x71,
0069               0x09, 0x0f, 0x0a, 0x00, 0x0a, 0x00, 0x61, 0x73,
0070               0x00, 0x00, 0x00, 0xd0, 0x00),
0071         PHYREGS(0x03cb, 0x03c7, 0x03c3, 0x0438, 0x043d, 0x0441),
0072     },
0073     {
0074         .freq           = 2422,
0075         RADIOREGS(0x4e, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x76,
0076               0x09, 0x0f, 0x09, 0x00, 0x09, 0x00, 0x61, 0x73,
0077               0x00, 0x00, 0x00, 0xd0, 0x00),
0078         PHYREGS(0x03cd, 0x03c9, 0x03c5, 0x0436, 0x043a, 0x043f),
0079     },
0080     {
0081         .freq           = 2427,
0082         RADIOREGS(0x52, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x7b,
0083               0x09, 0x0f, 0x09, 0x00, 0x09, 0x00, 0x61, 0x73,
0084               0x00, 0x00, 0x00, 0xa0, 0x00),
0085         PHYREGS(0x03cf, 0x03cb, 0x03c7, 0x0434, 0x0438, 0x043d),
0086     },
0087     {
0088         .freq           = 2432,
0089         RADIOREGS(0x55, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x80,
0090               0x09, 0x0f, 0x08, 0x00, 0x08, 0x00, 0x61, 0x73,
0091               0x00, 0x00, 0x00, 0xa0, 0x00),
0092         PHYREGS(0x03d1, 0x03cd, 0x03c9, 0x0431, 0x0436, 0x043a),
0093     },
0094     {
0095         .freq           = 2437,
0096         RADIOREGS(0x58, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x85,
0097               0x09, 0x0f, 0x08, 0x00, 0x08, 0x00, 0x61, 0x73,
0098               0x00, 0x00, 0x00, 0xa0, 0x00),
0099         PHYREGS(0x03d3, 0x03cf, 0x03cb, 0x042f, 0x0434, 0x0438),
0100     },
0101     {
0102         .freq           = 2442,
0103         RADIOREGS(0x5c, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x8a,
0104               0x09, 0x0f, 0x07, 0x00, 0x07, 0x00, 0x61, 0x73,
0105               0x00, 0x00, 0x00, 0x80, 0x00),
0106         PHYREGS(0x03d5, 0x03d1, 0x03cd, 0x042d, 0x0431, 0x0436),
0107     },
0108     {
0109         .freq           = 2447,
0110         RADIOREGS(0x5f, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x8f,
0111               0x09, 0x0f, 0x07, 0x00, 0x07, 0x00, 0x61, 0x73,
0112               0x00, 0x00, 0x00, 0x80, 0x00),
0113         PHYREGS(0x03d7, 0x03d3, 0x03cf, 0x042b, 0x042f, 0x0434),
0114     },
0115     {
0116         .freq           = 2452,
0117         RADIOREGS(0x62, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x94,
0118               0x09, 0x0f, 0x07, 0x00, 0x07, 0x00, 0x61, 0x73,
0119               0x00, 0x00, 0x00, 0x80, 0x00),
0120         PHYREGS(0x03d9, 0x03d5, 0x03d1, 0x0429, 0x042d, 0x0431),
0121     },
0122     {
0123         .freq           = 2457,
0124         RADIOREGS(0x66, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x99,
0125               0x09, 0x0f, 0x06, 0x00, 0x06, 0x00, 0x61, 0x73,
0126               0x00, 0x00, 0x00, 0x60, 0x00),
0127         PHYREGS(0x03db, 0x03d7, 0x03d3, 0x0427, 0x042b, 0x042f),
0128     },
0129     {
0130         .freq           = 2462,
0131         RADIOREGS(0x69, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x9e,
0132               0x09, 0x0f, 0x06, 0x00, 0x06, 0x00, 0x61, 0x73,
0133               0x00, 0x00, 0x00, 0x60, 0x00),
0134         PHYREGS(0x03dd, 0x03d9, 0x03d5, 0x0424, 0x0429, 0x042d),
0135     },
0136   { .freq           = 2467,
0137     RADIOREGS(0x6c, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0xa3,
0138           0x09, 0x0f, 0x05, 0x00, 0x05, 0x00, 0x61, 0x03,
0139           0x00, 0x00, 0x00, 0xf0, 0x00),
0140     PHYREGS(0x03df, 0x03db, 0x03d7, 0x0422, 0x0427, 0x042b),
0141   },
0142   { .freq           = 2472,
0143     RADIOREGS(0x70, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0xa8,
0144           0x09, 0x0f, 0x05, 0x00, 0x05, 0x00, 0x61, 0x03,
0145           0x00, 0x00, 0x00, 0xf0, 0x00),
0146     PHYREGS(0x03e1, 0x03dd, 0x03d9, 0x0420, 0x0424, 0x0429),
0147   },
0148     {
0149         .freq           = 5180,
0150         RADIOREGS(0xbe, 0x16, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x06,
0151               0x02, 0x0c, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x00,
0152               0x0f, 0x4f, 0xa3, 0x00, 0xfc),
0153         PHYREGS(0x081c, 0x0818, 0x0814, 0x01f9, 0x01fa, 0x01fb),
0154     },
0155     {
0156         .freq           = 5200,
0157         RADIOREGS(0xc5, 0x16, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x08,
0158               0x02, 0x0c, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x00,
0159               0x0f, 0x4f, 0x93, 0x00, 0xfb),
0160         PHYREGS(0x0824, 0x0820, 0x081c, 0x01f7, 0x01f8, 0x01f9),
0161     },
0162     {
0163         .freq           = 5220,
0164         RADIOREGS(0xcc, 0x16, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x0a,
0165               0x02, 0x0c, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x00,
0166               0x0f, 0x4f, 0x93, 0x00, 0xea),
0167         PHYREGS(0x082c, 0x0828, 0x0824, 0x01f5, 0x01f6, 0x01f7),
0168     },
0169     {
0170         .freq           = 5240,
0171         RADIOREGS(0xd2, 0x16, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x0c,
0172               0x02, 0x0c, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x00,
0173               0x0f, 0x4f, 0x93, 0x00, 0xda),
0174         PHYREGS(0x0834, 0x0830, 0x082c, 0x01f3, 0x01f4, 0x01f5),
0175     },
0176     {
0177         .freq           = 5260,
0178         RADIOREGS(0xd9, 0x16, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x0e,
0179               0x02, 0x0b, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0x00,
0180               0x0f, 0x4f, 0x93, 0x00, 0xca),
0181         PHYREGS(0x083c, 0x0838, 0x0834, 0x01f1, 0x01f2, 0x01f3),
0182     },
0183     {
0184         .freq           = 5280,
0185         RADIOREGS(0xe0, 0x16, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x10,
0186               0x02, 0x0b, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0x00,
0187               0x0f, 0x4f, 0x93, 0x00, 0xb9),
0188         PHYREGS(0x0844, 0x0840, 0x083c, 0x01f0, 0x01f0, 0x01f1),
0189     },
0190     {
0191         .freq           = 5300,
0192         RADIOREGS(0xe6, 0x16, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x12,
0193               0x02, 0x0b, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0x00,
0194               0x0f, 0x4c, 0x83, 0x00, 0xb8),
0195         PHYREGS(0x084c, 0x0848, 0x0844, 0x01ee, 0x01ef, 0x01f0),
0196     },
0197     {
0198         .freq           = 5320,
0199         RADIOREGS(0xed, 0x16, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x14,
0200               0x02, 0x0b, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0x00,
0201               0x0f, 0x4c, 0x83, 0x00, 0xa8),
0202         PHYREGS(0x0854, 0x0850, 0x084c, 0x01ec, 0x01ed, 0x01ee),
0203     },
0204     {
0205         .freq           = 5500,
0206         RADIOREGS(0x29, 0x17, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x26,
0207               0x02, 0x09, 0x00, 0x09, 0x00, 0x09, 0x00, 0x00,
0208               0x0a, 0x46, 0x43, 0x00, 0x75),
0209         PHYREGS(0x089c, 0x0898, 0x0894, 0x01dc, 0x01dd, 0x01dd),
0210     },
0211     {
0212         .freq           = 5520,
0213         RADIOREGS(0x30, 0x17, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x28,
0214               0x02, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00,
0215               0x0a, 0x46, 0x43, 0x00, 0x75),
0216         PHYREGS(0x08a4, 0x08a0, 0x089c, 0x01da, 0x01db, 0x01dc),
0217     },
0218     {
0219         .freq           = 5540,
0220         RADIOREGS(0x36, 0x17, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x2a,
0221               0x02, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00,
0222               0x0a, 0x46, 0x43, 0x00, 0x75),
0223         PHYREGS(0x08ac, 0x08a8, 0x08a4, 0x01d8, 0x01d9, 0x01da),
0224     },
0225     {
0226         .freq           = 5560,
0227         RADIOREGS(0x3d, 0x17, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x2c,
0228               0x02, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00,
0229               0x0a, 0x46, 0x43, 0x00, 0x75),
0230         PHYREGS(0x08b4, 0x08b0, 0x08ac, 0x01d7, 0x01d7, 0x01d8),
0231     },
0232     {
0233         .freq           = 5580,
0234         RADIOREGS(0x44, 0x17, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x2e,
0235               0x02, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00,
0236               0x0a, 0x46, 0x43, 0x00, 0x74),
0237         PHYREGS(0x08bc, 0x08b8, 0x08b4, 0x01d5, 0x01d6, 0x01d7),
0238     },
0239     {
0240         .freq           = 5600,
0241         RADIOREGS(0x4a, 0x17, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x30,
0242               0x02, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00,
0243               0x09, 0x44, 0x23, 0x00, 0x54),
0244         PHYREGS(0x08c4, 0x08c0, 0x08bc, 0x01d3, 0x01d4, 0x01d5),
0245     },
0246     {
0247         .freq           = 5620,
0248         RADIOREGS(0x51, 0x17, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x32,
0249               0x02, 0x07, 0x00, 0x07, 0x00, 0x07, 0x00, 0x00,
0250               0x09, 0x44, 0x23, 0x00, 0x54),
0251         PHYREGS(0x08cc, 0x08c8, 0x08c4, 0x01d2, 0x01d2, 0x01d3),
0252     },
0253     {
0254         .freq           = 5640,
0255         RADIOREGS(0x58, 0x17, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x34,
0256               0x02, 0x07, 0x00, 0x07, 0x00, 0x07, 0x00, 0x00,
0257               0x09, 0x44, 0x23, 0x00, 0x43),
0258         PHYREGS(0x08d4, 0x08d0, 0x08cc, 0x01d0, 0x01d1, 0x01d2),
0259     },
0260     {
0261         .freq           = 5660,
0262         RADIOREGS(0x5e, 0x17, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x36,
0263               0x02, 0x07, 0x00, 0x07, 0x00, 0x07, 0x00, 0x00,
0264               0x09, 0x43, 0x23, 0x00, 0x43),
0265         PHYREGS(0x08dc, 0x08d8, 0x08d4, 0x01ce, 0x01cf, 0x01d0),
0266     },
0267     {
0268         .freq           = 5680,
0269         RADIOREGS(0x65, 0x17, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x38,
0270               0x02, 0x07, 0x00, 0x07, 0x00, 0x07, 0x00, 0x00,
0271               0x09, 0x42, 0x23, 0x00, 0x43),
0272         PHYREGS(0x08e4, 0x08e0, 0x08dc, 0x01cd, 0x01ce, 0x01ce),
0273     },
0274     {
0275         .freq           = 5700,
0276         RADIOREGS(0x6c, 0x17, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x3a,
0277               0x02, 0x07, 0x00, 0x07, 0x00, 0x07, 0x00, 0x00,
0278               0x08, 0x42, 0x13, 0x00, 0x32),
0279         PHYREGS(0x08ec, 0x08e8, 0x08e4, 0x01cb, 0x01cc, 0x01cd),
0280     },
0281     {
0282         .freq           = 5745,
0283         RADIOREGS(0x7b, 0x17, 0x20, 0x1f, 0x08, 0x08, 0x3f, 0x7d,
0284               0x04, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00,
0285               0x08, 0x42, 0x13, 0x00, 0x21),
0286         PHYREGS(0x08fe, 0x08fa, 0x08f6, 0x01c8, 0x01c8, 0x01c9),
0287     },
0288     {
0289         .freq           = 5765,
0290         RADIOREGS(0x81, 0x17, 0x20, 0x1f, 0x08, 0x08, 0x3f, 0x81,
0291               0x04, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00,
0292               0x08, 0x42, 0x13, 0x00, 0x11),
0293         PHYREGS(0x0906, 0x0902, 0x08fe, 0x01c6, 0x01c7, 0x01c8),
0294     },
0295     {
0296         .freq           = 5785,
0297         RADIOREGS(0x88, 0x17, 0x20, 0x1f, 0x08, 0x08, 0x3f, 0x85,
0298               0x04, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x00,
0299               0x08, 0x42, 0x13, 0x00, 0x00),
0300         PHYREGS(0x090e, 0x090a, 0x0906, 0x01c4, 0x01c5, 0x01c6),
0301     },
0302     {
0303         .freq           = 5805,
0304         RADIOREGS(0x8f, 0x17, 0x20, 0x1f, 0x08, 0x08, 0x3f, 0x89,
0305               0x04, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x00,
0306               0x06, 0x41, 0x03, 0x00, 0x00),
0307         PHYREGS(0x0916, 0x0912, 0x090e, 0x01c3, 0x01c4, 0x01c4),
0308     },
0309     {
0310         .freq           = 5825,
0311         RADIOREGS(0x95, 0x17, 0x20, 0x1f, 0x08, 0x08, 0x3f, 0x8d,
0312               0x04, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x00,
0313               0x06, 0x41, 0x03, 0x00, 0x00),
0314         PHYREGS(0x091e, 0x091a, 0x0916, 0x01c1, 0x01c2, 0x01c3),
0315     },
0316 };
0317 
0318 void r2059_upload_inittabs(struct b43_wldev *dev)
0319 {
0320     struct b43_phy *phy = &dev->phy;
0321     u16 *table = NULL;
0322     u16 size, i;
0323 
0324     switch (phy->rev) {
0325     case 1:
0326         table = r2059_phy_rev1_init[0];
0327         size = ARRAY_SIZE(r2059_phy_rev1_init);
0328         break;
0329     default:
0330         B43_WARN_ON(1);
0331         return;
0332     }
0333 
0334     for (i = 0; i < size; i++, table += 2)
0335         b43_radio_write(dev, R2059_ALL | table[0], table[1]);
0336 }
0337 
0338 const struct b43_phy_ht_channeltab_e_radio2059
0339 *b43_phy_ht_get_channeltab_e_r2059(struct b43_wldev *dev, u16 freq)
0340 {
0341     const struct b43_phy_ht_channeltab_e_radio2059 *e;
0342     unsigned int i;
0343 
0344     e = b43_phy_ht_channeltab_radio2059;
0345     for (i = 0; i < ARRAY_SIZE(b43_phy_ht_channeltab_radio2059); i++, e++) {
0346         if (e->freq == freq)
0347             return e;
0348     }
0349 
0350     return NULL;
0351 }