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 | |
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, reg: table[0], value: table[1]); |
569 | } |
570 | } |
571 | |
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 | |