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