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