Linux Audio

Check our new training course

Loading...
v6.13.7
  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}
v4.17
 
  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
 29static 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
 43static 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
 57static 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
 72static 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?
 90static 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 */
109static 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 */
121static 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 */
191static 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 */
293static 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 */
374static 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
537void 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
585void 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}