blob: a3cf9efd7e216cef5cbeb59e266d765bcbf07e05 [file] [log] [blame]
Rafał Miłecki5192bf52011-06-19 12:17:19 +02001/*
2
3 Broadcom B43 wireless driver
4 IEEE 802.11n 2059 radio device data tables
5
Rafał Miłecki108f4f32011-09-03 21:01:02 +02006 Copyright (c) 2011 Rafał Miłecki <zajec5@gmail.com>
7
Rafał Miłecki5192bf52011-06-19 12:17:19 +02008 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
Rafał Miłeckiea422b22014-09-09 21:17:09 +020028/* Extracted from MMIO dump of 6.30.223.141 */
29static 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
Rafał Miłeckifeb90632011-06-27 14:58:54 +020035#define RADIOREGS(r00, r01, r02, r03, r04, r05, r06, r07, r08, r09, \
36 r10, r11, r12, r13, r14, r15, r16, r17, r18, r19, \
Rafał Miłecki9a0bc412013-03-16 23:40:01 +010037 r20) \
Rafał Miłeckifeb90632011-06-27 14:58:54 +020038 .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, \
Rafał Miłecki9a0bc412013-03-16 23:40:01 +010051 .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
Rafał Miłeckifeb90632011-06-27 14:58:54 +020059
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
Rafał Miłecki5effb732014-09-12 10:24:11 +020068/* 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 */
Rafał Miłeckifeb90632011-06-27 14:58:54 +020071static const struct b43_phy_ht_channeltab_e_radio2059 b43_phy_ht_channeltab_radio2059[] = {
Rafał Miłecki5effb732014-09-12 10:24:11 +020072 {
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 },
Rafał Miłeckifeb90632011-06-27 14:58:54 +0200149 { .freq = 2467,
150 RADIOREGS(0x6c, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0xa3,
151 0x09, 0x0f, 0x05, 0x00, 0x05, 0x00, 0x61, 0x03,
Rafał Miłeckifeb90632011-06-27 14:58:54 +0200152 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,
Rafał Miłeckifeb90632011-06-27 14:58:54 +0200158 0x00, 0x00, 0x00, 0xf0, 0x00),
159 PHYREGS(0x03e1, 0x03dd, 0x03d9, 0x0420, 0x0424, 0x0429),
160 },
Rafał Miłecki5effb732014-09-12 10:24:11 +0200161 {
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 },
Rafał Miłeckifeb90632011-06-27 14:58:54 +0200329};
330
Rafał Miłeckiea422b22014-09-09 21:17:09 +0200331void 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
Rafał Miłecki5192bf52011-06-19 12:17:19 +0200351const struct b43_phy_ht_channeltab_e_radio2059
352*b43_phy_ht_get_channeltab_e_r2059(struct b43_wldev *dev, u16 freq)
353{
Rafał Miłecki49ac26f2011-07-17 10:30:33 +0200354 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
Rafał Miłecki5192bf52011-06-19 12:17:19 +0200363 return NULL;
364}