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
16 static 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
30 static 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
44 static 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
59 static 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?
77 static 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 */
96 static 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 */
108 static 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 */
178 static 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 */
280 static 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 */
361 static 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
r2057_upload_inittabs(struct b43_wldev * dev)524 void 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
r2057_get_chantabent_rev7(struct b43_wldev * dev,u16 freq,const struct b43_nphy_chantabent_rev7 ** tabent_r7,const struct b43_nphy_chantabent_rev7_2g ** tabent_r7_2g)572 void 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 }
625