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 2057 radio device data tables
0006 
0007   Copyright (c) 2010 Rafał Miłecki <zajec5@gmail.com>
0008 
0009 
0010 */
0011 
0012 #include "b43.h"
0013 #include "radio_2057.h"
0014 #include "phy_common.h"
0015 
0016 static u16 r2057_rev4_init[][2] = {
0017     { 0x0E, 0x20 }, { 0x31, 0x00 }, { 0x32, 0x00 }, { 0x33, 0x00 },
0018     { 0x35, 0x26 }, { 0x3C, 0xff }, { 0x3D, 0xff }, { 0x3E, 0xff },
0019     { 0x3F, 0xff }, { 0x62, 0x33 }, { 0x8A, 0xf0 }, { 0x8B, 0x10 },
0020     { 0x8C, 0xf0 }, { 0x91, 0x3f }, { 0x92, 0x36 }, { 0xA4, 0x8c },
0021     { 0xA8, 0x55 }, { 0xAF, 0x01 }, { 0x10F, 0xf0 }, { 0x110, 0x10 },
0022     { 0x111, 0xf0 }, { 0x116, 0x3f }, { 0x117, 0x36 }, { 0x129, 0x8c },
0023     { 0x12D, 0x55 }, { 0x134, 0x01 }, { 0x15E, 0x00 }, { 0x15F, 0x00 },
0024     { 0x160, 0x00 }, { 0x161, 0x00 }, { 0x162, 0x00 }, { 0x163, 0x00 },
0025     { 0x169, 0x02 }, { 0x16A, 0x00 }, { 0x16B, 0x00 }, { 0x16C, 0x00 },
0026     { 0x1A4, 0x00 }, { 0x1A5, 0x00 }, { 0x1A6, 0x00 }, { 0x1AA, 0x00 },
0027     { 0x1AB, 0x00 }, { 0x1AC, 0x00 },
0028 };
0029 
0030 static u16 r2057_rev5_init[][2] = {
0031     { 0x00, 0x00 }, { 0x01, 0x57 }, { 0x02, 0x20 }, { 0x23, 0x6 },
0032     { 0x31, 0x00 }, { 0x32, 0x00 }, { 0x33, 0x00 }, { 0x51, 0x70 },
0033     { 0x59, 0x88 }, { 0x5C, 0x20 }, { 0x62, 0x33 }, { 0x63, 0x0f },
0034     { 0x64, 0x0f }, { 0x81, 0x01 }, { 0x91, 0x3f }, { 0x92, 0x36 },
0035     { 0xA1, 0x20 }, { 0xD6, 0x70 }, { 0xDE, 0x88 }, { 0xE1, 0x20 },
0036     { 0xE8, 0x0f }, { 0xE9, 0x0f }, { 0x106, 0x01 }, { 0x116, 0x3f },
0037     { 0x117, 0x36 }, { 0x126, 0x20 }, { 0x15E, 0x00 }, { 0x15F, 0x00 },
0038     { 0x160, 0x00 }, { 0x161, 0x00 }, { 0x162, 0x00 }, { 0x163, 0x00 },
0039     { 0x16A, 0x00 }, { 0x16B, 0x00 }, { 0x16C, 0x00 }, { 0x1A4, 0x00 },
0040     { 0x1A5, 0x00 }, { 0x1A6, 0x00 }, { 0x1AA, 0x00 }, { 0x1AB, 0x00 },
0041     { 0x1AC, 0x00 }, { 0x1B7, 0x0c }, { 0x1C1, 0x01 }, { 0x1C2, 0x80 },
0042 };
0043 
0044 static u16 r2057_rev5a_init[][2] = {
0045     { 0x00, 0x15 }, { 0x01, 0x57 }, { 0x02, 0x20 }, { 0x23, 0x6 },
0046     { 0x31, 0x00 }, { 0x32, 0x00 }, { 0x33, 0x00 }, { 0x51, 0x70 },
0047     { 0x59, 0x88 }, { 0x5C, 0x20 }, { 0x62, 0x33 }, { 0x63, 0x0f },
0048     { 0x64, 0x0f }, { 0x81, 0x01 }, { 0x91, 0x3f }, { 0x92, 0x36 },
0049     { 0xC9, 0x01 }, { 0xD6, 0x70 }, { 0xDE, 0x88 }, { 0xE1, 0x20 },
0050     { 0xE8, 0x0f }, { 0xE9, 0x0f }, { 0x106, 0x01 }, { 0x116, 0x3f },
0051     { 0x117, 0x36 }, { 0x126, 0x20 }, { 0x14E, 0x01 }, { 0x15E, 0x00 },
0052     { 0x15F, 0x00 }, { 0x160, 0x00 }, { 0x161, 0x00 }, { 0x162, 0x00 },
0053     { 0x163, 0x00 }, { 0x16A, 0x00 }, { 0x16B, 0x00 }, { 0x16C, 0x00 },
0054     { 0x1A4, 0x00 }, { 0x1A5, 0x00 }, { 0x1A6, 0x00 }, { 0x1AA, 0x00 },
0055     { 0x1AB, 0x00 }, { 0x1AC, 0x00 }, { 0x1B7, 0x0c }, { 0x1C1, 0x01 },
0056     { 0x1C2, 0x80 },
0057 };
0058 
0059 static u16 r2057_rev7_init[][2] = {
0060     { 0x00, 0x00 }, { 0x01, 0x57 }, { 0x02, 0x20 }, { 0x31, 0x00 },
0061     { 0x32, 0x00 }, { 0x33, 0x00 }, { 0x51, 0x70 }, { 0x59, 0x88 },
0062     { 0x5C, 0x20 }, { 0x62, 0x33 }, { 0x63, 0x0f }, { 0x64, 0x13 },
0063     { 0x66, 0xee }, { 0x6E, 0x58 }, { 0x75, 0x13 }, { 0x7B, 0x13 },
0064     { 0x7C, 0x14 }, { 0x7D, 0xee }, { 0x81, 0x01 }, { 0x91, 0x3f },
0065     { 0x92, 0x36 }, { 0xA1, 0x20 }, { 0xD6, 0x70 }, { 0xDE, 0x88 },
0066     { 0xE1, 0x20 }, { 0xE8, 0x0f }, { 0xE9, 0x13 }, { 0xEB, 0xee },
0067     { 0xF3, 0x58 }, { 0xFA, 0x13 }, { 0x100, 0x13 }, { 0x101, 0x14 },
0068     { 0x102, 0xee }, { 0x106, 0x01 }, { 0x116, 0x3f }, { 0x117, 0x36 },
0069     { 0x126, 0x20 }, { 0x15E, 0x00 }, { 0x15F, 0x00 }, { 0x160, 0x00 },
0070     { 0x161, 0x00 }, { 0x162, 0x00 }, { 0x163, 0x00 }, { 0x16A, 0x00 },
0071     { 0x16B, 0x00 }, { 0x16C, 0x00 }, { 0x1A4, 0x00 }, { 0x1A5, 0x00 },
0072     { 0x1A6, 0x00 }, { 0x1AA, 0x00 }, { 0x1AB, 0x00 }, { 0x1AC, 0x00 },
0073     { 0x1B7, 0x05 }, { 0x1C2, 0xa0 },
0074 };
0075 
0076 /* TODO: Which devices should use it?
0077 static u16 r2057_rev8_init[][2] = {
0078     { 0x00, 0x08 }, { 0x01, 0x57 }, { 0x02, 0x20 }, { 0x31, 0x00 },
0079     { 0x32, 0x00 }, { 0x33, 0x00 }, { 0x51, 0x70 }, { 0x59, 0x88 },
0080     { 0x5C, 0x20 }, { 0x62, 0x33 }, { 0x63, 0x0f }, { 0x64, 0x0f },
0081     { 0x6E, 0x58 }, { 0x75, 0x13 }, { 0x7B, 0x13 }, { 0x7C, 0x0f },
0082     { 0x7D, 0xee }, { 0x81, 0x01 }, { 0x91, 0x3f }, { 0x92, 0x36 },
0083     { 0xA1, 0x20 }, { 0xC9, 0x01 }, { 0xD6, 0x70 }, { 0xDE, 0x88 },
0084     { 0xE1, 0x20 }, { 0xE8, 0x0f }, { 0xE9, 0x0f }, { 0xF3, 0x58 },
0085     { 0xFA, 0x13 }, { 0x100, 0x13 }, { 0x101, 0x0f }, { 0x102, 0xee },
0086     { 0x106, 0x01 }, { 0x116, 0x3f }, { 0x117, 0x36 }, { 0x126, 0x20 },
0087     { 0x14E, 0x01 }, { 0x15E, 0x00 }, { 0x15F, 0x00 }, { 0x160, 0x00 },
0088     { 0x161, 0x00 }, { 0x162, 0x00 }, { 0x163, 0x00 }, { 0x16A, 0x00 },
0089     { 0x16B, 0x00 }, { 0x16C, 0x00 }, { 0x1A4, 0x00 }, { 0x1A5, 0x00 },
0090     { 0x1A6, 0x00 }, { 0x1AA, 0x00 }, { 0x1AB, 0x00 }, { 0x1AC, 0x00 },
0091     { 0x1B7, 0x05 }, { 0x1C2, 0xa0 },
0092 };
0093 */
0094 
0095 /* Extracted from MMIO dump of 6.30.223.141 */
0096 static u16 r2057_rev9_init[][2] = {
0097     { 0x27, 0x1f }, { 0x28, 0x0a }, { 0x29, 0x2f }, { 0x42, 0x1f },
0098     { 0x48, 0x3f }, { 0x5c, 0x41 }, { 0x63, 0x14 }, { 0x64, 0x12 },
0099     { 0x66, 0xff }, { 0x74, 0xa3 }, { 0x7b, 0x14 }, { 0x7c, 0x14 },
0100     { 0x7d, 0xee }, { 0x86, 0xc0 }, { 0xc4, 0x10 }, { 0xc9, 0x01 },
0101     { 0xe1, 0x41 }, { 0xe8, 0x14 }, { 0xe9, 0x12 }, { 0xeb, 0xff },
0102     { 0xf5, 0x0a }, { 0xf8, 0x09 }, { 0xf9, 0xa3 }, { 0x100, 0x14 },
0103     { 0x101, 0x10 }, { 0x102, 0xee }, { 0x10b, 0xc0 }, { 0x149, 0x10 },
0104     { 0x14e, 0x01 }, { 0x1b7, 0x05 }, { 0x1c2, 0xa0 },
0105 };
0106 
0107 /* Extracted from MMIO dump of 6.30.223.248 */
0108 static u16 r2057_rev14_init[][2] = {
0109     { 0x011, 0xfc }, { 0x030, 0x24 }, { 0x040, 0x1c }, { 0x082, 0x08 },
0110     { 0x0b4, 0x44 }, { 0x0c8, 0x01 }, { 0x0c9, 0x01 }, { 0x107, 0x08 },
0111     { 0x14d, 0x01 }, { 0x14e, 0x01 }, { 0x1af, 0x40 }, { 0x1b0, 0x40 },
0112     { 0x1cc, 0x01 }, { 0x1cf, 0x10 }, { 0x1d0, 0x0f }, { 0x1d3, 0x10 },
0113     { 0x1d4, 0x0f },
0114 };
0115 
0116 #define RADIOREGS7(r00, r01, r02, r03, r04, r05, r06, r07, r08, r09, \
0117            r10, r11, r12, r13, r14, r15, r16, r17, r18, r19, \
0118            r20, r21, r22, r23, r24, r25, r26, r27) \
0119     .radio_vcocal_countval0         = r00,  \
0120     .radio_vcocal_countval1         = r01,  \
0121     .radio_rfpll_refmaster_sparextalsize    = r02,  \
0122     .radio_rfpll_loopfilter_r1      = r03,  \
0123     .radio_rfpll_loopfilter_c2      = r04,  \
0124     .radio_rfpll_loopfilter_c1      = r05,  \
0125     .radio_cp_kpd_idac          = r06,  \
0126     .radio_rfpll_mmd0           = r07,  \
0127     .radio_rfpll_mmd1           = r08,  \
0128     .radio_vcobuf_tune          = r09,  \
0129     .radio_logen_mx2g_tune          = r10,  \
0130     .radio_logen_mx5g_tune          = r11,  \
0131     .radio_logen_indbuf2g_tune      = r12,  \
0132     .radio_logen_indbuf5g_tune      = r13,  \
0133     .radio_txmix2g_tune_boost_pu_core0  = r14,  \
0134     .radio_pad2g_tune_pus_core0     = r15,  \
0135     .radio_pga_boost_tune_core0     = r16,  \
0136     .radio_txmix5g_boost_tune_core0     = r17,  \
0137     .radio_pad5g_tune_misc_pus_core0    = r18,  \
0138     .radio_lna2g_tune_core0         = r19,  \
0139     .radio_lna5g_tune_core0         = r20,  \
0140     .radio_txmix2g_tune_boost_pu_core1  = r21,  \
0141     .radio_pad2g_tune_pus_core1     = r22,  \
0142     .radio_pga_boost_tune_core1     = r23,  \
0143     .radio_txmix5g_boost_tune_core1     = r24,  \
0144     .radio_pad5g_tune_misc_pus_core1    = r25,  \
0145     .radio_lna2g_tune_core1         = r26,  \
0146     .radio_lna5g_tune_core1         = r27
0147 
0148 #define RADIOREGS7_2G(r00, r01, r02, r03, r04, r05, r06, r07, r08, r09, \
0149               r10, r11, r12, r13, r14, r15, r16, r17) \
0150     .radio_vcocal_countval0         = r00,  \
0151     .radio_vcocal_countval1         = r01,  \
0152     .radio_rfpll_refmaster_sparextalsize    = r02,  \
0153     .radio_rfpll_loopfilter_r1      = r03,  \
0154     .radio_rfpll_loopfilter_c2      = r04,  \
0155     .radio_rfpll_loopfilter_c1      = r05,  \
0156     .radio_cp_kpd_idac          = r06,  \
0157     .radio_rfpll_mmd0           = r07,  \
0158     .radio_rfpll_mmd1           = r08,  \
0159     .radio_vcobuf_tune          = r09,  \
0160     .radio_logen_mx2g_tune          = r10,  \
0161     .radio_logen_indbuf2g_tune      = r11,  \
0162     .radio_txmix2g_tune_boost_pu_core0  = r12,  \
0163     .radio_pad2g_tune_pus_core0     = r13,  \
0164     .radio_lna2g_tune_core0         = r14,  \
0165     .radio_txmix2g_tune_boost_pu_core1  = r15,  \
0166     .radio_pad2g_tune_pus_core1     = r16,  \
0167     .radio_lna2g_tune_core1         = r17
0168 
0169 #define PHYREGS(r0, r1, r2, r3, r4, r5) \
0170     .phy_regs.phy_bw1a  = r0,   \
0171     .phy_regs.phy_bw2   = r1,   \
0172     .phy_regs.phy_bw3   = r2,   \
0173     .phy_regs.phy_bw4   = r3,   \
0174     .phy_regs.phy_bw5   = r4,   \
0175     .phy_regs.phy_bw6   = r5
0176 
0177 /* Copied from brcmsmac (5.75.11): chan_info_nphyrev8_2057_rev5 */
0178 static const struct b43_nphy_chantabent_rev7_2g b43_nphy_chantab_phy_rev8_radio_rev5[] = {
0179     {
0180         .freq           = 2412,
0181         RADIOREGS7_2G(0x48, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x6c,
0182                   0x09, 0x0d, 0x08, 0x0e, 0x61, 0x03, 0xff, 0x61,
0183                   0x03, 0xff),
0184         PHYREGS(0x03c9, 0x03c5, 0x03c1, 0x043a, 0x043f, 0x0443),
0185     },
0186     {
0187         .freq           = 2417,
0188         RADIOREGS7_2G(0x4b, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x71,
0189                   0x09, 0x0d, 0x08, 0x0e, 0x61, 0x03, 0xff, 0x61,
0190                   0x03, 0xff),
0191         PHYREGS(0x03cb, 0x03c7, 0x03c3, 0x0438, 0x043d, 0x0441),
0192     },
0193     {
0194         .freq           = 2422,
0195         RADIOREGS7_2G(0x4e, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x76,
0196                   0x09, 0x0d, 0x08, 0x0e, 0x61, 0x03, 0xef, 0x61,
0197                   0x03, 0xef),
0198         PHYREGS(0x03cd, 0x03c9, 0x03c5, 0x0436, 0x043a, 0x043f),
0199     },
0200     {
0201         .freq           = 2427,
0202         RADIOREGS7_2G(0x52, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x7b,
0203                   0x09, 0x0c, 0x08, 0x0e, 0x61, 0x03, 0xdf, 0x61,
0204                   0x03, 0xdf),
0205         PHYREGS(0x03cf, 0x03cb, 0x03c7, 0x0434, 0x0438, 0x043d),
0206     },
0207     {
0208         .freq           = 2432,
0209         RADIOREGS7_2G(0x55, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x80,
0210                   0x09, 0x0c, 0x07, 0x0d, 0x61, 0x03, 0xcf, 0x61,
0211                   0x03, 0xcf),
0212         PHYREGS(0x03d1, 0x03cd, 0x03c9, 0x0431, 0x0436, 0x043a),
0213     },
0214     {
0215         .freq           = 2437,
0216         RADIOREGS7_2G(0x58, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x85,
0217                   0x09, 0x0c, 0x07, 0x0d, 0x61, 0x03, 0xbf, 0x61,
0218                   0x03, 0xbf),
0219         PHYREGS(0x03d3, 0x03cf, 0x03cb, 0x042f, 0x0434, 0x0438),
0220     },
0221     {
0222         .freq           = 2442,
0223         RADIOREGS7_2G(0x5c, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x8a,
0224                   0x09, 0x0b, 0x07, 0x0d, 0x61, 0x03, 0xaf, 0x61,
0225                   0x03, 0xaf),
0226         PHYREGS(0x03d5, 0x03d1, 0x03cd, 0x042d, 0x0431, 0x0436),
0227     },
0228     {
0229         .freq           = 2447,
0230         RADIOREGS7_2G(0x5f, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x8f,
0231                   0x09, 0x0b, 0x07, 0x0d, 0x61, 0x03, 0x9f, 0x61,
0232                   0x03, 0x9f),
0233         PHYREGS(0x03d7, 0x03d3, 0x03cf, 0x042b, 0x042f, 0x0434),
0234     },
0235     {
0236         .freq           = 2452,
0237         RADIOREGS7_2G(0x62, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x94,
0238                   0x09, 0x0b, 0x07, 0x0d, 0x61, 0x03, 0x8f, 0x61,
0239                   0x03, 0x8f),
0240         PHYREGS(0x03d9, 0x03d5, 0x03d1, 0x0429, 0x042d, 0x0431),
0241     },
0242     {
0243         .freq           = 2457,
0244         RADIOREGS7_2G(0x66, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x99,
0245                   0x09, 0x0b, 0x07, 0x0c, 0x61, 0x03, 0x7f, 0x61,
0246                   0x03, 0x7f),
0247         PHYREGS(0x03db, 0x03d7, 0x03d3, 0x0427, 0x042b, 0x042f),
0248     },
0249     {
0250         .freq           = 2462,
0251         RADIOREGS7_2G(0x69, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x9e,
0252                   0x09, 0x0b, 0x07, 0x0c, 0x61, 0x03, 0x6f, 0x61,
0253                   0x03, 0x6f),
0254         PHYREGS(0x03dd, 0x03d9, 0x03d5, 0x0424, 0x0429, 0x042d),
0255     },
0256     {
0257         .freq           = 2467,
0258         RADIOREGS7_2G(0x6c, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0xa3,
0259                   0x09, 0x0b, 0x06, 0x0c, 0x61, 0x03, 0x5f, 0x61,
0260                   0x03, 0x5f),
0261         PHYREGS(0x03df, 0x03db, 0x03d7, 0x0422, 0x0427, 0x042b),
0262     },
0263     {
0264         .freq           = 2472,
0265         RADIOREGS7_2G(0x70, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0xa8,
0266                   0x09, 0x0a, 0x06, 0x0b, 0x61, 0x03, 0x4f, 0x61,
0267                   0x03, 0x4f),
0268         PHYREGS(0x03e1, 0x03dd, 0x03d9, 0x0420, 0x0424, 0x0429),
0269     },
0270     {
0271         .freq           = 2484,
0272         RADIOREGS7_2G(0x78, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0xb4,
0273                   0x09, 0x0a, 0x06, 0x0b, 0x61, 0x03, 0x3f, 0x61,
0274                   0x03, 0x3f),
0275         PHYREGS(0x03e6, 0x03e2, 0x03de, 0x041b, 0x041f, 0x0424),
0276     }
0277 };
0278 
0279 /* Extracted from MMIO dump of 6.30.223.248 */
0280 static const struct b43_nphy_chantabent_rev7_2g b43_nphy_chantab_phy_rev17_radio_rev14[] = {
0281     {
0282         .freq           = 2412,
0283         RADIOREGS7_2G(0x48, 0x16, 0x30, 0x2b, 0x1f, 0x1f, 0x30, 0x6c,
0284                   0x09, 0x0d, 0x09, 0x03, 0x21, 0x53, 0xff, 0x21,
0285                   0x53, 0xff),
0286         PHYREGS(0x03c9, 0x03c5, 0x03c1, 0x043a, 0x043f, 0x0443),
0287     },
0288     {
0289         .freq           = 2417,
0290         RADIOREGS7_2G(0x4b, 0x16, 0x30, 0x2b, 0x1f, 0x1f, 0x30, 0x71,
0291                   0x09, 0x0d, 0x08, 0x03, 0x21, 0x53, 0xff, 0x21,
0292                   0x53, 0xff),
0293         PHYREGS(0x03cb, 0x03c7, 0x03c3, 0x0438, 0x043d, 0x0441),
0294     },
0295     {
0296         .freq           = 2422,
0297         RADIOREGS7_2G(0x4e, 0x16, 0x30, 0x2b, 0x1f, 0x1f, 0x30, 0x76,
0298                   0x09, 0x0d, 0x08, 0x03, 0x21, 0x53, 0xff, 0x21,
0299                   0x53, 0xff),
0300         PHYREGS(0x03cd, 0x03c9, 0x03c5, 0x0436, 0x043a, 0x043f),
0301     },
0302     {
0303         .freq           = 2427,
0304         RADIOREGS7_2G(0x52, 0x16, 0x30, 0x2b, 0x1f, 0x1f, 0x30, 0x7b,
0305                   0x09, 0x0c, 0x08, 0x03, 0x21, 0x53, 0xff, 0x21,
0306                   0x53, 0xff),
0307         PHYREGS(0x03cf, 0x03cb, 0x03c7, 0x0434, 0x0438, 0x043d),
0308     },
0309     {
0310         .freq           = 2432,
0311         RADIOREGS7_2G(0x55, 0x16, 0x30, 0x2b, 0x1f, 0x1f, 0x30, 0x80,
0312                   0x09, 0x0c, 0x08, 0x03, 0x21, 0x53, 0xff, 0x21,
0313                   0x53, 0xff),
0314         PHYREGS(0x03d1, 0x03cd, 0x03c9, 0x0431, 0x0436, 0x043a),
0315     },
0316     {
0317         .freq           = 2437,
0318         RADIOREGS7_2G(0x58, 0x16, 0x30, 0x2b, 0x1f, 0x1f, 0x30, 0x85,
0319                   0x09, 0x0c, 0x08, 0x03, 0x21, 0x53, 0xff, 0x21,
0320                   0x53, 0xff),
0321         PHYREGS(0x03d3, 0x03cf, 0x03cb, 0x042f, 0x0434, 0x0438),
0322     },
0323     {
0324         .freq           = 2442,
0325         RADIOREGS7_2G(0x5c, 0x16, 0x30, 0x2b, 0x1f, 0x1f, 0x30, 0x8a,
0326                   0x09, 0x0c, 0x08, 0x03, 0x21, 0x43, 0xff, 0x21,
0327                   0x43, 0xff),
0328         PHYREGS(0x03d5, 0x03d1, 0x03cd, 0x042d, 0x0431, 0x0436),
0329     },
0330     {
0331         .freq           = 2447,
0332         RADIOREGS7_2G(0x5f, 0x16, 0x30, 0x2b, 0x1f, 0x1f, 0x30, 0x8f,
0333                   0x09, 0x0c, 0x08, 0x03, 0x21, 0x43, 0xff, 0x21,
0334                   0x43, 0xff),
0335         PHYREGS(0x03d7, 0x03d3, 0x03cf, 0x042b, 0x042f, 0x0434),
0336     },
0337     {
0338         .freq           = 2452,
0339         RADIOREGS7_2G(0x62, 0x16, 0x30, 0x2b, 0x1f, 0x1f, 0x30, 0x94,
0340                   0x09, 0x0c, 0x08, 0x03, 0x21, 0x43, 0xff, 0x21,
0341                   0x43, 0xff),
0342         PHYREGS(0x03d9, 0x03d5, 0x03d1, 0x0429, 0x042d, 0x0431),
0343     },
0344     {
0345         .freq           = 2457,
0346         RADIOREGS7_2G(0x66, 0x16, 0x30, 0x2b, 0x1f, 0x1f, 0x30, 0x99,
0347                   0x09, 0x0b, 0x07, 0x03, 0x21, 0x43, 0xff, 0x21,
0348                   0x43, 0xff),
0349         PHYREGS(0x03db, 0x03d7, 0x03d3, 0x0427, 0x042b, 0x042f),
0350     },
0351     {
0352         .freq           = 2462,
0353         RADIOREGS7_2G(0x69, 0x16, 0x30, 0x2b, 0x1f, 0x1f, 0x30, 0x9e,
0354                   0x09, 0x0b, 0x07, 0x03, 0x01, 0x43, 0xff, 0x01,
0355                   0x43, 0xff),
0356         PHYREGS(0x03dd, 0x03d9, 0x03d5, 0x0424, 0x0429, 0x042d),
0357     },
0358 };
0359 
0360 /* Extracted from MMIO dump of 6.30.223.141 */
0361 static const struct b43_nphy_chantabent_rev7 b43_nphy_chantab_phy_rev16_radio_rev9[] = {
0362     {
0363         .freq           = 2412,
0364         RADIOREGS7(0x48, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x6c,
0365                0x09, 0x0f, 0x0a, 0x00, 0x0a, 0x00, 0x41, 0x63,
0366                0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00,
0367                0x00, 0x00, 0xf0, 0x00),
0368         PHYREGS(0x03c9, 0x03c5, 0x03c1, 0x043a, 0x043f, 0x0443),
0369     },
0370     {
0371         .freq           = 2417,
0372         RADIOREGS7(0x4b, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x71,
0373                0x09, 0x0f, 0x0a, 0x00, 0x0a, 0x00, 0x41, 0x63,
0374                0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00,
0375                0x00, 0x00, 0xf0, 0x00),
0376         PHYREGS(0x03cb, 0x03c7, 0x03c3, 0x0438, 0x043d, 0x0441),
0377     },
0378     {
0379         .freq           = 2422,
0380         RADIOREGS7(0x4e, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x76,
0381                0x09, 0x0f, 0x09, 0x00, 0x09, 0x00, 0x41, 0x63,
0382                0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00,
0383                0x00, 0x00, 0xf0, 0x00),
0384         PHYREGS(0x03cd, 0x03c9, 0x03c5, 0x0436, 0x043a, 0x043f),
0385     },
0386     {
0387         .freq           = 2427,
0388         RADIOREGS7(0x52, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x7b,
0389                0x09, 0x0f, 0x09, 0x00, 0x09, 0x00, 0x41, 0x63,
0390                0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00,
0391                0x00, 0x00, 0xf0, 0x00),
0392         PHYREGS(0x03cf, 0x03cb, 0x03c7, 0x0434, 0x0438, 0x043d),
0393     },
0394     {
0395         .freq           = 2432,
0396         RADIOREGS7(0x55, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x80,
0397                0x09, 0x0f, 0x08, 0x00, 0x08, 0x00, 0x41, 0x63,
0398                0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00,
0399                0x00, 0x00, 0xf0, 0x00),
0400         PHYREGS(0x03d1, 0x03cd, 0x03c9, 0x0431, 0x0436, 0x043a),
0401     },
0402     {
0403         .freq           = 2437,
0404         RADIOREGS7(0x58, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x85,
0405                0x09, 0x0f, 0x08, 0x00, 0x08, 0x00, 0x41, 0x63,
0406                0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00,
0407                0x00, 0x00, 0xf0, 0x00),
0408         PHYREGS(0x03d3, 0x03cf, 0x03cb, 0x042f, 0x0434, 0x0438),
0409     },
0410     {
0411         .freq           = 2442,
0412         RADIOREGS7(0x5c, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x8a,
0413                0x09, 0x0f, 0x07, 0x00, 0x07, 0x00, 0x41, 0x63,
0414                0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00,
0415                0x00, 0x00, 0xf0, 0x00),
0416         PHYREGS(0x03d5, 0x03d1, 0x03cd, 0x042d, 0x0431, 0x0436),
0417     },
0418     {
0419         .freq           = 2447,
0420         RADIOREGS7(0x5f, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x8f,
0421                0x09, 0x0f, 0x07, 0x00, 0x07, 0x00, 0x41, 0x63,
0422                0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00,
0423                0x00, 0x00, 0xf0, 0x00),
0424         PHYREGS(0x03d7, 0x03d3, 0x03cf, 0x042b, 0x042f, 0x0434),
0425     },
0426     {
0427         .freq           = 2452,
0428         RADIOREGS7(0x62, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x94,
0429                0x09, 0x0f, 0x07, 0x00, 0x07, 0x00, 0x41, 0x63,
0430                0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00,
0431                0x00, 0x00, 0xf0, 0x00),
0432         PHYREGS(0x03d9, 0x03d5, 0x03d1, 0x0429, 0x042d, 0x0431),
0433     },
0434     {
0435         .freq           = 2457,
0436         RADIOREGS7(0x66, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x99,
0437                0x09, 0x0f, 0x06, 0x00, 0x06, 0x00, 0x41, 0x63,
0438                0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00,
0439                0x00, 0x00, 0xf0, 0x00),
0440         PHYREGS(0x03db, 0x03d7, 0x03d3, 0x0427, 0x042b, 0x042f),
0441     },
0442     {
0443         .freq           = 2462,
0444         RADIOREGS7(0x69, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x9e,
0445                0x09, 0x0f, 0x06, 0x00, 0x06, 0x00, 0x41, 0x63,
0446                0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00,
0447                0x00, 0x00, 0xf0, 0x00),
0448         PHYREGS(0x03dd, 0x03d9, 0x03d5, 0x0424, 0x0429, 0x042d),
0449     },
0450     {
0451         .freq           = 5180,
0452         RADIOREGS7(0xbe, 0x16, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x06,
0453                0x02, 0x0e, 0x00, 0x0e, 0x00, 0x9e, 0x00, 0x00,
0454                0x9f, 0x2f, 0xa3, 0x00, 0xfc, 0x00, 0x00, 0x4f,
0455                0x3a, 0x83, 0x00, 0xfc),
0456         PHYREGS(0x081c, 0x0818, 0x0814, 0x01f9, 0x01fa, 0x01fb),
0457     },
0458     {
0459         .freq           = 5200,
0460         RADIOREGS7(0xc5, 0x16, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x08,
0461                0x02, 0x0e, 0x00, 0x0e, 0x00, 0x9e, 0x00, 0x00,
0462                0x7f, 0x2f, 0x83, 0x00, 0xf8, 0x00, 0x00, 0x4c,
0463                0x4a, 0x83, 0x00, 0xf8),
0464         PHYREGS(0x0824, 0x0820, 0x081c, 0x01f7, 0x01f8, 0x01f9),
0465     },
0466     {
0467         .freq           = 5220,
0468         RADIOREGS7(0xcc, 0x16, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x0a,
0469                0x02, 0x0e, 0x00, 0x0e, 0x00, 0x9e, 0x00, 0x00,
0470                0x6d, 0x3d, 0x83, 0x00, 0xf8, 0x00, 0x00, 0x2d,
0471                0x2a, 0x73, 0x00, 0xf8),
0472         PHYREGS(0x082c, 0x0828, 0x0824, 0x01f5, 0x01f6, 0x01f7),
0473     },
0474     {
0475         .freq           = 5240,
0476         RADIOREGS7(0xd2, 0x16, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x0c,
0477                0x02, 0x0d, 0x00, 0x0d, 0x00, 0x8d, 0x00, 0x00,
0478                0x4d, 0x1c, 0x73, 0x00, 0xf8, 0x00, 0x00, 0x4d,
0479                0x2b, 0x73, 0x00, 0xf8),
0480         PHYREGS(0x0834, 0x0830, 0x082c, 0x01f3, 0x01f4, 0x01f5),
0481     },
0482     {
0483         .freq           = 5745,
0484         RADIOREGS7(0x7b, 0x17, 0x20, 0x1f, 0x08, 0x08, 0x3f, 0x7d,
0485                0x04, 0x08, 0x00, 0x06, 0x00, 0x15, 0x00, 0x00,
0486                0x08, 0x03, 0x03, 0x00, 0x30, 0x00, 0x00, 0x06,
0487                0x02, 0x03, 0x00, 0x30),
0488         PHYREGS(0x08fe, 0x08fa, 0x08f6, 0x01c8, 0x01c8, 0x01c9),
0489     },
0490     {
0491         .freq           = 5765,
0492         RADIOREGS7(0x81, 0x17, 0x20, 0x1f, 0x08, 0x08, 0x3f, 0x81,
0493                0x04, 0x08, 0x00, 0x06, 0x00, 0x15, 0x00, 0x00,
0494                0x06, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x05,
0495                0x02, 0x03, 0x00, 0x00),
0496         PHYREGS(0x0906, 0x0902, 0x08fe, 0x01c6, 0x01c7, 0x01c8),
0497     },
0498     {
0499         .freq           = 5785,
0500         RADIOREGS7(0x88, 0x17, 0x20, 0x1f, 0x08, 0x08, 0x3f, 0x85,
0501                0x04, 0x08, 0x00, 0x06, 0x00, 0x15, 0x00, 0x00,
0502                0x08, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x05,
0503                0x21, 0x03, 0x00, 0x00),
0504         PHYREGS(0x090e, 0x090a, 0x0906, 0x01c4, 0x01c5, 0x01c6),
0505     },
0506     {
0507         .freq           = 5805,
0508         RADIOREGS7(0x8f, 0x17, 0x20, 0x1f, 0x08, 0x08, 0x3f, 0x89,
0509                0x04, 0x07, 0x00, 0x06, 0x00, 0x04, 0x00, 0x00,
0510                0x06, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x03,
0511                0x00, 0x03, 0x00, 0x00),
0512         PHYREGS(0x0916, 0x0912, 0x090e, 0x01c3, 0x01c4, 0x01c4),
0513     },
0514     {
0515         .freq           = 5825,
0516         RADIOREGS7(0x95, 0x17, 0x20, 0x1f, 0x08, 0x08, 0x3f, 0x8d,
0517                0x04, 0x07, 0x00, 0x05, 0x00, 0x03, 0x00, 0x00,
0518                0x05, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x03,
0519                0x00, 0x03, 0x00, 0x00),
0520         PHYREGS(0x091e, 0x091a, 0x0916, 0x01c1, 0x01c2, 0x01c3),
0521     },
0522 };
0523 
0524 void r2057_upload_inittabs(struct b43_wldev *dev)
0525 {
0526     struct b43_phy *phy = &dev->phy;
0527     u16 *table = NULL;
0528     u16 size, i;
0529 
0530     switch (phy->rev) {
0531     case 7:
0532         table = r2057_rev4_init[0];
0533         size = ARRAY_SIZE(r2057_rev4_init);
0534         break;
0535     case 8:
0536         if (phy->radio_rev == 5) {
0537             table = r2057_rev5_init[0];
0538             size = ARRAY_SIZE(r2057_rev5_init);
0539         } else if (phy->radio_rev == 7) {
0540             table = r2057_rev7_init[0];
0541             size = ARRAY_SIZE(r2057_rev7_init);
0542         }
0543         break;
0544     case 9:
0545         if (phy->radio_rev == 5) {
0546             table = r2057_rev5a_init[0];
0547             size = ARRAY_SIZE(r2057_rev5a_init);
0548         }
0549         break;
0550     case 16:
0551         if (phy->radio_rev == 9) {
0552             table = r2057_rev9_init[0];
0553             size = ARRAY_SIZE(r2057_rev9_init);
0554         }
0555         break;
0556     case 17:
0557         if (phy->radio_rev == 14) {
0558             table = r2057_rev14_init[0];
0559             size = ARRAY_SIZE(r2057_rev14_init);
0560         }
0561         break;
0562     }
0563 
0564     B43_WARN_ON(!table);
0565 
0566     if (table) {
0567         for (i = 0; i < size; i++, table += 2)
0568             b43_radio_write(dev, table[0], table[1]);
0569     }
0570 }
0571 
0572 void r2057_get_chantabent_rev7(struct b43_wldev *dev, u16 freq,
0573                    const struct b43_nphy_chantabent_rev7 **tabent_r7,
0574                    const struct b43_nphy_chantabent_rev7_2g **tabent_r7_2g)
0575 {
0576     struct b43_phy *phy = &dev->phy;
0577     const struct b43_nphy_chantabent_rev7 *e_r7 = NULL;
0578     const struct b43_nphy_chantabent_rev7_2g *e_r7_2g = NULL;
0579     unsigned int len, i;
0580 
0581     *tabent_r7 = NULL;
0582     *tabent_r7_2g = NULL;
0583 
0584     switch (phy->rev) {
0585     case 8:
0586         if (phy->radio_rev == 5) {
0587             e_r7_2g = b43_nphy_chantab_phy_rev8_radio_rev5;
0588             len = ARRAY_SIZE(b43_nphy_chantab_phy_rev8_radio_rev5);
0589         }
0590         break;
0591     case 16:
0592         if (phy->radio_rev == 9) {
0593             e_r7 = b43_nphy_chantab_phy_rev16_radio_rev9;
0594             len = ARRAY_SIZE(b43_nphy_chantab_phy_rev16_radio_rev9);
0595         }
0596         break;
0597     case 17:
0598         if (phy->radio_rev == 14) {
0599             e_r7_2g = b43_nphy_chantab_phy_rev17_radio_rev14;
0600             len = ARRAY_SIZE(b43_nphy_chantab_phy_rev17_radio_rev14);
0601         }
0602         break;
0603     default:
0604         break;
0605     }
0606 
0607     if (e_r7) {
0608         for (i = 0; i < len; i++, e_r7++) {
0609             if (e_r7->freq == freq) {
0610                 *tabent_r7 = e_r7;
0611                 return;
0612             }
0613         }
0614     } else if (e_r7_2g) {
0615         for (i = 0; i < len; i++, e_r7_2g++) {
0616             if (e_r7_2g->freq == freq) {
0617                 *tabent_r7_2g = e_r7_2g;
0618                 return;
0619             }
0620         }
0621     } else {
0622         B43_WARN_ON(1);
0623     }
0624 }