ca22faa41d2836c229be08ce783114900eee8600
[deliverable/linux.git] / drivers / net / wireless / b43 / radio_2057.c
1 /*
2
3 Broadcom B43 wireless driver
4 IEEE 802.11n 2057 radio device data tables
5
6 Copyright (c) 2010 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_2057.h"
27 #include "phy_common.h"
28
29 static u16 r2057_rev4_init[][2] = {
30 { 0x0E, 0x20 }, { 0x31, 0x00 }, { 0x32, 0x00 }, { 0x33, 0x00 },
31 { 0x35, 0x26 }, { 0x3C, 0xff }, { 0x3D, 0xff }, { 0x3E, 0xff },
32 { 0x3F, 0xff }, { 0x62, 0x33 }, { 0x8A, 0xf0 }, { 0x8B, 0x10 },
33 { 0x8C, 0xf0 }, { 0x91, 0x3f }, { 0x92, 0x36 }, { 0xA4, 0x8c },
34 { 0xA8, 0x55 }, { 0xAF, 0x01 }, { 0x10F, 0xf0 }, { 0x110, 0x10 },
35 { 0x111, 0xf0 }, { 0x116, 0x3f }, { 0x117, 0x36 }, { 0x129, 0x8c },
36 { 0x12D, 0x55 }, { 0x134, 0x01 }, { 0x15E, 0x00 }, { 0x15F, 0x00 },
37 { 0x160, 0x00 }, { 0x161, 0x00 }, { 0x162, 0x00 }, { 0x163, 0x00 },
38 { 0x169, 0x02 }, { 0x16A, 0x00 }, { 0x16B, 0x00 }, { 0x16C, 0x00 },
39 { 0x1A4, 0x00 }, { 0x1A5, 0x00 }, { 0x1A6, 0x00 }, { 0x1AA, 0x00 },
40 { 0x1AB, 0x00 }, { 0x1AC, 0x00 },
41 };
42
43 static u16 r2057_rev5_init[][2] = {
44 { 0x00, 0x00 }, { 0x01, 0x57 }, { 0x02, 0x20 }, { 0x23, 0x6 },
45 { 0x31, 0x00 }, { 0x32, 0x00 }, { 0x33, 0x00 }, { 0x51, 0x70 },
46 { 0x59, 0x88 }, { 0x5C, 0x20 }, { 0x62, 0x33 }, { 0x63, 0x0f },
47 { 0x64, 0x0f }, { 0x81, 0x01 }, { 0x91, 0x3f }, { 0x92, 0x36 },
48 { 0xA1, 0x20 }, { 0xD6, 0x70 }, { 0xDE, 0x88 }, { 0xE1, 0x20 },
49 { 0xE8, 0x0f }, { 0xE9, 0x0f }, { 0x106, 0x01 }, { 0x116, 0x3f },
50 { 0x117, 0x36 }, { 0x126, 0x20 }, { 0x15E, 0x00 }, { 0x15F, 0x00 },
51 { 0x160, 0x00 }, { 0x161, 0x00 }, { 0x162, 0x00 }, { 0x163, 0x00 },
52 { 0x16A, 0x00 }, { 0x16B, 0x00 }, { 0x16C, 0x00 }, { 0x1A4, 0x00 },
53 { 0x1A5, 0x00 }, { 0x1A6, 0x00 }, { 0x1AA, 0x00 }, { 0x1AB, 0x00 },
54 { 0x1AC, 0x00 }, { 0x1B7, 0x0c }, { 0x1C1, 0x01 }, { 0x1C2, 0x80 },
55 };
56
57 static u16 r2057_rev5a_init[][2] = {
58 { 0x00, 0x15 }, { 0x01, 0x57 }, { 0x02, 0x20 }, { 0x23, 0x6 },
59 { 0x31, 0x00 }, { 0x32, 0x00 }, { 0x33, 0x00 }, { 0x51, 0x70 },
60 { 0x59, 0x88 }, { 0x5C, 0x20 }, { 0x62, 0x33 }, { 0x63, 0x0f },
61 { 0x64, 0x0f }, { 0x81, 0x01 }, { 0x91, 0x3f }, { 0x92, 0x36 },
62 { 0xC9, 0x01 }, { 0xD6, 0x70 }, { 0xDE, 0x88 }, { 0xE1, 0x20 },
63 { 0xE8, 0x0f }, { 0xE9, 0x0f }, { 0x106, 0x01 }, { 0x116, 0x3f },
64 { 0x117, 0x36 }, { 0x126, 0x20 }, { 0x14E, 0x01 }, { 0x15E, 0x00 },
65 { 0x15F, 0x00 }, { 0x160, 0x00 }, { 0x161, 0x00 }, { 0x162, 0x00 },
66 { 0x163, 0x00 }, { 0x16A, 0x00 }, { 0x16B, 0x00 }, { 0x16C, 0x00 },
67 { 0x1A4, 0x00 }, { 0x1A5, 0x00 }, { 0x1A6, 0x00 }, { 0x1AA, 0x00 },
68 { 0x1AB, 0x00 }, { 0x1AC, 0x00 }, { 0x1B7, 0x0c }, { 0x1C1, 0x01 },
69 { 0x1C2, 0x80 },
70 };
71
72 static u16 r2057_rev7_init[][2] = {
73 { 0x00, 0x00 }, { 0x01, 0x57 }, { 0x02, 0x20 }, { 0x31, 0x00 },
74 { 0x32, 0x00 }, { 0x33, 0x00 }, { 0x51, 0x70 }, { 0x59, 0x88 },
75 { 0x5C, 0x20 }, { 0x62, 0x33 }, { 0x63, 0x0f }, { 0x64, 0x13 },
76 { 0x66, 0xee }, { 0x6E, 0x58 }, { 0x75, 0x13 }, { 0x7B, 0x13 },
77 { 0x7C, 0x14 }, { 0x7D, 0xee }, { 0x81, 0x01 }, { 0x91, 0x3f },
78 { 0x92, 0x36 }, { 0xA1, 0x20 }, { 0xD6, 0x70 }, { 0xDE, 0x88 },
79 { 0xE1, 0x20 }, { 0xE8, 0x0f }, { 0xE9, 0x13 }, { 0xEB, 0xee },
80 { 0xF3, 0x58 }, { 0xFA, 0x13 }, { 0x100, 0x13 }, { 0x101, 0x14 },
81 { 0x102, 0xee }, { 0x106, 0x01 }, { 0x116, 0x3f }, { 0x117, 0x36 },
82 { 0x126, 0x20 }, { 0x15E, 0x00 }, { 0x15F, 0x00 }, { 0x160, 0x00 },
83 { 0x161, 0x00 }, { 0x162, 0x00 }, { 0x163, 0x00 }, { 0x16A, 0x00 },
84 { 0x16B, 0x00 }, { 0x16C, 0x00 }, { 0x1A4, 0x00 }, { 0x1A5, 0x00 },
85 { 0x1A6, 0x00 }, { 0x1AA, 0x00 }, { 0x1AB, 0x00 }, { 0x1AC, 0x00 },
86 { 0x1B7, 0x05 }, { 0x1C2, 0xa0 },
87 };
88
89 /* TODO: Which devices should use it?
90 static u16 r2057_rev8_init[][2] = {
91 { 0x00, 0x08 }, { 0x01, 0x57 }, { 0x02, 0x20 }, { 0x31, 0x00 },
92 { 0x32, 0x00 }, { 0x33, 0x00 }, { 0x51, 0x70 }, { 0x59, 0x88 },
93 { 0x5C, 0x20 }, { 0x62, 0x33 }, { 0x63, 0x0f }, { 0x64, 0x0f },
94 { 0x6E, 0x58 }, { 0x75, 0x13 }, { 0x7B, 0x13 }, { 0x7C, 0x0f },
95 { 0x7D, 0xee }, { 0x81, 0x01 }, { 0x91, 0x3f }, { 0x92, 0x36 },
96 { 0xA1, 0x20 }, { 0xC9, 0x01 }, { 0xD6, 0x70 }, { 0xDE, 0x88 },
97 { 0xE1, 0x20 }, { 0xE8, 0x0f }, { 0xE9, 0x0f }, { 0xF3, 0x58 },
98 { 0xFA, 0x13 }, { 0x100, 0x13 }, { 0x101, 0x0f }, { 0x102, 0xee },
99 { 0x106, 0x01 }, { 0x116, 0x3f }, { 0x117, 0x36 }, { 0x126, 0x20 },
100 { 0x14E, 0x01 }, { 0x15E, 0x00 }, { 0x15F, 0x00 }, { 0x160, 0x00 },
101 { 0x161, 0x00 }, { 0x162, 0x00 }, { 0x163, 0x00 }, { 0x16A, 0x00 },
102 { 0x16B, 0x00 }, { 0x16C, 0x00 }, { 0x1A4, 0x00 }, { 0x1A5, 0x00 },
103 { 0x1A6, 0x00 }, { 0x1AA, 0x00 }, { 0x1AB, 0x00 }, { 0x1AC, 0x00 },
104 { 0x1B7, 0x05 }, { 0x1C2, 0xa0 },
105 };
106 */
107
108 /* Extracted from MMIO dump of 6.30.223.141 */
109 static u16 r2057_rev9_init[][2] = {
110 { 0x27, 0x1f }, { 0x28, 0x0a }, { 0x29, 0x2f }, { 0x42, 0x1f },
111 { 0x48, 0x3f }, { 0x5c, 0x41 }, { 0x63, 0x14 }, { 0x64, 0x12 },
112 { 0x66, 0xff }, { 0x74, 0xa3 }, { 0x7b, 0x14 }, { 0x7c, 0x14 },
113 { 0x7d, 0xee }, { 0x86, 0xc0 }, { 0xc4, 0x10 }, { 0xc9, 0x01 },
114 { 0xe1, 0x41 }, { 0xe8, 0x14 }, { 0xe9, 0x12 }, { 0xeb, 0xff },
115 { 0xf5, 0x0a }, { 0xf8, 0x09 }, { 0xf9, 0xa3 }, { 0x100, 0x14 },
116 { 0x101, 0x10 }, { 0x102, 0xee }, { 0x10b, 0xc0 }, { 0x149, 0x10 },
117 { 0x14e, 0x01 }, { 0x1b7, 0x05 }, { 0x1c2, 0xa0 },
118 };
119
120 #define RADIOREGS7(r00, r01, r02, r03, r04, r05, r06, r07, r08, r09, \
121 r10, r11, r12, r13, r14, r15, r16, r17, r18, r19, \
122 r20, r21, r22, r23, r24, r25, r26, r27) \
123 .radio_vcocal_countval0 = r00, \
124 .radio_vcocal_countval1 = r01, \
125 .radio_rfpll_refmaster_sparextalsize = r02, \
126 .radio_rfpll_loopfilter_r1 = r03, \
127 .radio_rfpll_loopfilter_c2 = r04, \
128 .radio_rfpll_loopfilter_c1 = r05, \
129 .radio_cp_kpd_idac = r06, \
130 .radio_rfpll_mmd0 = r07, \
131 .radio_rfpll_mmd1 = r08, \
132 .radio_vcobuf_tune = r09, \
133 .radio_logen_mx2g_tune = r10, \
134 .radio_logen_mx5g_tune = r11, \
135 .radio_logen_indbuf2g_tune = r12, \
136 .radio_logen_indbuf5g_tune = r13, \
137 .radio_txmix2g_tune_boost_pu_core0 = r14, \
138 .radio_pad2g_tune_pus_core0 = r15, \
139 .radio_pga_boost_tune_core0 = r16, \
140 .radio_txmix5g_boost_tune_core0 = r17, \
141 .radio_pad5g_tune_misc_pus_core0 = r18, \
142 .radio_lna2g_tune_core0 = r19, \
143 .radio_lna5g_tune_core0 = r20, \
144 .radio_txmix2g_tune_boost_pu_core1 = r21, \
145 .radio_pad2g_tune_pus_core1 = r22, \
146 .radio_pga_boost_tune_core1 = r23, \
147 .radio_txmix5g_boost_tune_core1 = r24, \
148 .radio_pad5g_tune_misc_pus_core1 = r25, \
149 .radio_lna2g_tune_core1 = r26, \
150 .radio_lna5g_tune_core1 = r27
151
152 #define RADIOREGS7_2G(r00, r01, r02, r03, r04, r05, r06, r07, r08, r09, \
153 r10, r11, r12, r13, r14, r15, r16, r17) \
154 .radio_vcocal_countval0 = r00, \
155 .radio_vcocal_countval1 = r01, \
156 .radio_rfpll_refmaster_sparextalsize = r02, \
157 .radio_rfpll_loopfilter_r1 = r03, \
158 .radio_rfpll_loopfilter_c2 = r04, \
159 .radio_rfpll_loopfilter_c1 = r05, \
160 .radio_cp_kpd_idac = r06, \
161 .radio_rfpll_mmd0 = r07, \
162 .radio_rfpll_mmd1 = r08, \
163 .radio_vcobuf_tune = r09, \
164 .radio_logen_mx2g_tune = r10, \
165 .radio_logen_indbuf2g_tune = r11, \
166 .radio_lna2g_tune_core0 = r12, \
167 .radio_txmix2g_tune_boost_pu_core0 = r13, \
168 .radio_pad2g_tune_pus_core0 = r14, \
169 .radio_lna2g_tune_core1 = r15, \
170 .radio_txmix2g_tune_boost_pu_core1 = r16, \
171 .radio_pad2g_tune_pus_core1 = r17
172
173 #define PHYREGS(r0, r1, r2, r3, r4, r5) \
174 .phy_regs.phy_bw1a = r0, \
175 .phy_regs.phy_bw2 = r1, \
176 .phy_regs.phy_bw3 = r2, \
177 .phy_regs.phy_bw4 = r3, \
178 .phy_regs.phy_bw5 = r4, \
179 .phy_regs.phy_bw6 = r5
180
181 /* Copied from brcmsmac (5.75.11): chan_info_nphyrev8_2057_rev5 */
182 static const struct b43_nphy_chantabent_rev7_2g b43_nphy_chantab_phy_rev8_radio_rev5[] = {
183 {
184 .freq = 2412,
185 RADIOREGS7_2G(0x48, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x6c,
186 0x09, 0x0d, 0x08, 0x0e, 0x61, 0x03, 0xff, 0x61,
187 0x03, 0xff),
188 PHYREGS(0x03c9, 0x03c5, 0x03c1, 0x043a, 0x043f, 0x0443),
189 },
190 {
191 .freq = 2417,
192 RADIOREGS7_2G(0x4b, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x71,
193 0x09, 0x0d, 0x08, 0x0e, 0x61, 0x03, 0xff, 0x61,
194 0x03, 0xff),
195 PHYREGS(0x03cb, 0x03c7, 0x03c3, 0x0438, 0x043d, 0x0441),
196 },
197 {
198 .freq = 2422,
199 RADIOREGS7_2G(0x4e, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x76,
200 0x09, 0x0d, 0x08, 0x0e, 0x61, 0x03, 0xef, 0x61,
201 0x03, 0xef),
202 PHYREGS(0x03cd, 0x03c9, 0x03c5, 0x0436, 0x043a, 0x043f),
203 },
204 {
205 .freq = 2427,
206 RADIOREGS7_2G(0x52, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x7b,
207 0x09, 0x0c, 0x08, 0x0e, 0x61, 0x03, 0xdf, 0x61,
208 0x03, 0xdf),
209 PHYREGS(0x03cf, 0x03cb, 0x03c7, 0x0434, 0x0438, 0x043d),
210 },
211 {
212 .freq = 2432,
213 RADIOREGS7_2G(0x55, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x80,
214 0x09, 0x0c, 0x07, 0x0d, 0x61, 0x03, 0xcf, 0x61,
215 0x03, 0xcf),
216 PHYREGS(0x03d1, 0x03cd, 0x03c9, 0x0431, 0x0436, 0x043a),
217 },
218 {
219 .freq = 2437,
220 RADIOREGS7_2G(0x58, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x85,
221 0x09, 0x0c, 0x07, 0x0d, 0x61, 0x03, 0xbf, 0x61,
222 0x03, 0xbf),
223 PHYREGS(0x03d3, 0x03cf, 0x03cb, 0x042f, 0x0434, 0x0438),
224 },
225 {
226 .freq = 2442,
227 RADIOREGS7_2G(0x5c, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x8a,
228 0x09, 0x0b, 0x07, 0x0d, 0x61, 0x03, 0xaf, 0x61,
229 0x03, 0xaf),
230 PHYREGS(0x03d5, 0x03d1, 0x03cd, 0x042d, 0x0431, 0x0436),
231 },
232 {
233 .freq = 2447,
234 RADIOREGS7_2G(0x5f, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x8f,
235 0x09, 0x0b, 0x07, 0x0d, 0x61, 0x03, 0x9f, 0x61,
236 0x03, 0x9f),
237 PHYREGS(0x03d7, 0x03d3, 0x03cf, 0x042b, 0x042f, 0x0434),
238 },
239 {
240 .freq = 2452,
241 RADIOREGS7_2G(0x62, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x94,
242 0x09, 0x0b, 0x07, 0x0d, 0x61, 0x03, 0x8f, 0x61,
243 0x03, 0x8f),
244 PHYREGS(0x03d9, 0x03d5, 0x03d1, 0x0429, 0x042d, 0x0431),
245 },
246 {
247 .freq = 2457,
248 RADIOREGS7_2G(0x66, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x99,
249 0x09, 0x0b, 0x07, 0x0c, 0x61, 0x03, 0x7f, 0x61,
250 0x03, 0x7f),
251 PHYREGS(0x03db, 0x03d7, 0x03d3, 0x0427, 0x042b, 0x042f),
252 },
253 {
254 .freq = 2462,
255 RADIOREGS7_2G(0x69, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x9e,
256 0x09, 0x0b, 0x07, 0x0c, 0x61, 0x03, 0x6f, 0x61,
257 0x03, 0x6f),
258 PHYREGS(0x03dd, 0x03d9, 0x03d5, 0x0424, 0x0429, 0x042d),
259 },
260 {
261 .freq = 2467,
262 RADIOREGS7_2G(0x6c, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0xa3,
263 0x09, 0x0b, 0x06, 0x0c, 0x61, 0x03, 0x5f, 0x61,
264 0x03, 0x5f),
265 PHYREGS(0x03df, 0x03db, 0x03d7, 0x0422, 0x0427, 0x042b),
266 },
267 {
268 .freq = 2472,
269 RADIOREGS7_2G(0x70, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0xa8,
270 0x09, 0x0a, 0x06, 0x0b, 0x61, 0x03, 0x4f, 0x61,
271 0x03, 0x4f),
272 PHYREGS(0x03e1, 0x03dd, 0x03d9, 0x0420, 0x0424, 0x0429),
273 },
274 {
275 .freq = 2484,
276 RADIOREGS7_2G(0x78, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0xb4,
277 0x09, 0x0a, 0x06, 0x0b, 0x61, 0x03, 0x3f, 0x61,
278 0x03, 0x3f),
279 PHYREGS(0x03e6, 0x03e2, 0x03de, 0x041b, 0x041f, 0x0424),
280 }
281 };
282
283 /* Extracted from MMIO dump of 6.30.223.141 */
284 static const struct b43_nphy_chantabent_rev7 b43_nphy_chantab_phy_rev16_radio_rev9[] = {
285 {
286 .freq = 2412,
287 RADIOREGS7(0x48, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x6c,
288 0x09, 0x0f, 0x0a, 0x00, 0x0a, 0x00, 0x41, 0x63,
289 0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00,
290 0x00, 0x00, 0xf0, 0x00),
291 PHYREGS(0x03c9, 0x03c5, 0x03c1, 0x043a, 0x043f, 0x0443),
292 },
293 {
294 .freq = 2417,
295 RADIOREGS7(0x4b, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x71,
296 0x09, 0x0f, 0x0a, 0x00, 0x0a, 0x00, 0x41, 0x63,
297 0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00,
298 0x00, 0x00, 0xf0, 0x00),
299 PHYREGS(0x03cb, 0x03c7, 0x03c3, 0x0438, 0x043d, 0x0441),
300 },
301 {
302 .freq = 2422,
303 RADIOREGS7(0x4e, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x76,
304 0x09, 0x0f, 0x09, 0x00, 0x09, 0x00, 0x41, 0x63,
305 0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00,
306 0x00, 0x00, 0xf0, 0x00),
307 PHYREGS(0x03cd, 0x03c9, 0x03c5, 0x0436, 0x043a, 0x043f),
308 },
309 {
310 .freq = 2427,
311 RADIOREGS7(0x52, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x7b,
312 0x09, 0x0f, 0x09, 0x00, 0x09, 0x00, 0x41, 0x63,
313 0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00,
314 0x00, 0x00, 0xf0, 0x00),
315 PHYREGS(0x03cf, 0x03cb, 0x03c7, 0x0434, 0x0438, 0x043d),
316 },
317 {
318 .freq = 2432,
319 RADIOREGS7(0x55, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x80,
320 0x09, 0x0f, 0x08, 0x00, 0x08, 0x00, 0x41, 0x63,
321 0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00,
322 0x00, 0x00, 0xf0, 0x00),
323 PHYREGS(0x03d1, 0x03cd, 0x03c9, 0x0431, 0x0436, 0x043a),
324 },
325 {
326 .freq = 2437,
327 RADIOREGS7(0x58, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x85,
328 0x09, 0x0f, 0x08, 0x00, 0x08, 0x00, 0x41, 0x63,
329 0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00,
330 0x00, 0x00, 0xf0, 0x00),
331 PHYREGS(0x03d3, 0x03cf, 0x03cb, 0x042f, 0x0434, 0x0438),
332 },
333 {
334 .freq = 2442,
335 RADIOREGS7(0x5c, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x8a,
336 0x09, 0x0f, 0x07, 0x00, 0x07, 0x00, 0x41, 0x63,
337 0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00,
338 0x00, 0x00, 0xf0, 0x00),
339 PHYREGS(0x03d5, 0x03d1, 0x03cd, 0x042d, 0x0431, 0x0436),
340 },
341 {
342 .freq = 2447,
343 RADIOREGS7(0x5f, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x8f,
344 0x09, 0x0f, 0x07, 0x00, 0x07, 0x00, 0x41, 0x63,
345 0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00,
346 0x00, 0x00, 0xf0, 0x00),
347 PHYREGS(0x03d7, 0x03d3, 0x03cf, 0x042b, 0x042f, 0x0434),
348 },
349 {
350 .freq = 2452,
351 RADIOREGS7(0x62, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x94,
352 0x09, 0x0f, 0x07, 0x00, 0x07, 0x00, 0x41, 0x63,
353 0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00,
354 0x00, 0x00, 0xf0, 0x00),
355 PHYREGS(0x03d9, 0x03d5, 0x03d1, 0x0429, 0x042d, 0x0431),
356 },
357 {
358 .freq = 2457,
359 RADIOREGS7(0x66, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x99,
360 0x09, 0x0f, 0x06, 0x00, 0x06, 0x00, 0x41, 0x63,
361 0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00,
362 0x00, 0x00, 0xf0, 0x00),
363 PHYREGS(0x03db, 0x03d7, 0x03d3, 0x0427, 0x042b, 0x042f),
364 },
365 {
366 .freq = 2462,
367 RADIOREGS7(0x69, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x9e,
368 0x09, 0x0f, 0x06, 0x00, 0x06, 0x00, 0x41, 0x63,
369 0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00,
370 0x00, 0x00, 0xf0, 0x00),
371 PHYREGS(0x03dd, 0x03d9, 0x03d5, 0x0424, 0x0429, 0x042d),
372 },
373 {
374 .freq = 5180,
375 RADIOREGS7(0xbe, 0x16, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x06,
376 0x02, 0x0e, 0x00, 0x0e, 0x00, 0x9e, 0x00, 0x00,
377 0x9f, 0x2f, 0xa3, 0x00, 0xfc, 0x00, 0x00, 0x4f,
378 0x3a, 0x83, 0x00, 0xfc),
379 PHYREGS(0x081c, 0x0818, 0x0814, 0x01f9, 0x01fa, 0x01fb),
380 },
381 {
382 .freq = 5200,
383 RADIOREGS7(0xc5, 0x16, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x08,
384 0x02, 0x0e, 0x00, 0x0e, 0x00, 0x9e, 0x00, 0x00,
385 0x7f, 0x2f, 0x83, 0x00, 0xf8, 0x00, 0x00, 0x4c,
386 0x4a, 0x83, 0x00, 0xf8),
387 PHYREGS(0x0824, 0x0820, 0x081c, 0x01f7, 0x01f8, 0x01f9),
388 },
389 {
390 .freq = 5220,
391 RADIOREGS7(0xcc, 0x16, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x0a,
392 0x02, 0x0e, 0x00, 0x0e, 0x00, 0x9e, 0x00, 0x00,
393 0x6d, 0x3d, 0x83, 0x00, 0xf8, 0x00, 0x00, 0x2d,
394 0x2a, 0x73, 0x00, 0xf8),
395 PHYREGS(0x082c, 0x0828, 0x0824, 0x01f5, 0x01f6, 0x01f7),
396 },
397 {
398 .freq = 5240,
399 RADIOREGS7(0xd2, 0x16, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x0c,
400 0x02, 0x0d, 0x00, 0x0d, 0x00, 0x8d, 0x00, 0x00,
401 0x4d, 0x1c, 0x73, 0x00, 0xf8, 0x00, 0x00, 0x4d,
402 0x2b, 0x73, 0x00, 0xf8),
403 PHYREGS(0x0834, 0x0830, 0x082c, 0x01f3, 0x01f4, 0x01f5),
404 },
405 {
406 .freq = 5745,
407 RADIOREGS7(0x7b, 0x17, 0x20, 0x1f, 0x08, 0x08, 0x3f, 0x7d,
408 0x04, 0x08, 0x00, 0x06, 0x00, 0x15, 0x00, 0x00,
409 0x08, 0x03, 0x03, 0x00, 0x30, 0x00, 0x00, 0x06,
410 0x02, 0x03, 0x00, 0x30),
411 PHYREGS(0x08fe, 0x08fa, 0x08f6, 0x01c8, 0x01c8, 0x01c9),
412 },
413 {
414 .freq = 5765,
415 RADIOREGS7(0x81, 0x17, 0x20, 0x1f, 0x08, 0x08, 0x3f, 0x81,
416 0x04, 0x08, 0x00, 0x06, 0x00, 0x15, 0x00, 0x00,
417 0x06, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x05,
418 0x02, 0x03, 0x00, 0x00),
419 PHYREGS(0x0906, 0x0902, 0x08fe, 0x01c6, 0x01c7, 0x01c8),
420 },
421 {
422 .freq = 5785,
423 RADIOREGS7(0x88, 0x17, 0x20, 0x1f, 0x08, 0x08, 0x3f, 0x85,
424 0x04, 0x08, 0x00, 0x06, 0x00, 0x15, 0x00, 0x00,
425 0x08, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x05,
426 0x21, 0x03, 0x00, 0x00),
427 PHYREGS(0x090e, 0x090a, 0x0906, 0x01c4, 0x01c5, 0x01c6),
428 },
429 {
430 .freq = 5805,
431 RADIOREGS7(0x8f, 0x17, 0x20, 0x1f, 0x08, 0x08, 0x3f, 0x89,
432 0x04, 0x07, 0x00, 0x06, 0x00, 0x04, 0x00, 0x00,
433 0x06, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x03,
434 0x00, 0x03, 0x00, 0x00),
435 PHYREGS(0x0916, 0x0912, 0x090e, 0x01c3, 0x01c4, 0x01c4),
436 },
437 {
438 .freq = 5825,
439 RADIOREGS7(0x95, 0x17, 0x20, 0x1f, 0x08, 0x08, 0x3f, 0x8d,
440 0x04, 0x07, 0x00, 0x05, 0x00, 0x03, 0x00, 0x00,
441 0x05, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x03,
442 0x00, 0x03, 0x00, 0x00),
443 PHYREGS(0x091e, 0x091a, 0x0916, 0x01c1, 0x01c2, 0x01c3),
444 },
445 };
446
447 void r2057_upload_inittabs(struct b43_wldev *dev)
448 {
449 struct b43_phy *phy = &dev->phy;
450 u16 *table = NULL;
451 u16 size, i;
452
453 switch (phy->rev) {
454 case 7:
455 table = r2057_rev4_init[0];
456 size = ARRAY_SIZE(r2057_rev4_init);
457 break;
458 case 8:
459 if (phy->radio_rev == 5) {
460 table = r2057_rev5_init[0];
461 size = ARRAY_SIZE(r2057_rev5_init);
462 } else if (phy->radio_rev == 7) {
463 table = r2057_rev7_init[0];
464 size = ARRAY_SIZE(r2057_rev7_init);
465 }
466 break;
467 case 9:
468 if (phy->radio_rev == 5) {
469 table = r2057_rev5a_init[0];
470 size = ARRAY_SIZE(r2057_rev5a_init);
471 }
472 break;
473 case 16:
474 if (phy->radio_rev == 9) {
475 table = r2057_rev9_init[0];
476 size = ARRAY_SIZE(r2057_rev9_init);
477 }
478 break;
479 }
480
481 B43_WARN_ON(!table);
482
483 if (table) {
484 for (i = 0; i < size; i++, table += 2)
485 b43_radio_write(dev, table[0], table[1]);
486 }
487 }
488
489 void r2057_get_chantabent_rev7(struct b43_wldev *dev, u16 freq,
490 const struct b43_nphy_chantabent_rev7 **tabent_r7,
491 const struct b43_nphy_chantabent_rev7_2g **tabent_r7_2g)
492 {
493 struct b43_phy *phy = &dev->phy;
494 const struct b43_nphy_chantabent_rev7 *e_r7 = NULL;
495 const struct b43_nphy_chantabent_rev7_2g *e_r7_2g = NULL;
496 unsigned int len, i;
497
498 *tabent_r7 = NULL;
499 *tabent_r7_2g = NULL;
500
501 /* TODO */
502 switch (phy->rev) {
503 case 8:
504 if (phy->radio_rev == 5) {
505 e_r7_2g = b43_nphy_chantab_phy_rev8_radio_rev5;
506 len = ARRAY_SIZE(b43_nphy_chantab_phy_rev8_radio_rev5);
507 }
508 break;
509 case 16:
510 if (phy->radio_rev == 9) {
511 e_r7 = b43_nphy_chantab_phy_rev16_radio_rev9;
512 len = ARRAY_SIZE(b43_nphy_chantab_phy_rev16_radio_rev9);
513 }
514 break;
515 default:
516 break;
517 }
518
519 if (e_r7) {
520 for (i = 0; i < len; i++, e_r7++) {
521 if (e_r7->freq == freq) {
522 *tabent_r7 = e_r7;
523 return;
524 }
525 }
526 } else if (e_r7_2g) {
527 for (i = 0; i < len; i++, e_r7_2g++) {
528 if (e_r7_2g->freq == freq) {
529 *tabent_r7_2g = e_r7_2g;
530 return;
531 }
532 }
533 } else {
534 B43_WARN_ON(1);
535 }
536 }
This page took 0.053894 seconds and 4 git commands to generate.