cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

radio_2057.c (21709B)


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