b43: N-PHY: fix channel switching with 2 GHz radio 0x2057
[deliverable/linux.git] / drivers / net / wireless / b43 / radio_2057.c
CommitLineData
572d37a4
RM
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
e90cf1c7 29static u16 r2057_rev4_init[][2] = {
572d37a4
RM
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
e90cf1c7 43static u16 r2057_rev5_init[][2] = {
572d37a4
RM
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
e90cf1c7 57static u16 r2057_rev5a_init[][2] = {
572d37a4
RM
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
e90cf1c7 72static u16 r2057_rev7_init[][2] = {
572d37a4
RM
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
fe255b40 89/* TODO: Which devices should use it?
e90cf1c7 90static u16 r2057_rev8_init[][2] = {
572d37a4
RM
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};
fe255b40
RM
106*/
107
162bee1a
RM
108/* Extracted from MMIO dump of 6.30.223.141 */
109static 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
fe255b40
RM
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
785e7dbb
RM
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, \
701fa113
RM
166 .radio_txmix2g_tune_boost_pu_core0 = r12, \
167 .radio_pad2g_tune_pus_core0 = r13, \
168 .radio_lna2g_tune_core0 = r14, \
169 .radio_txmix2g_tune_boost_pu_core1 = r15, \
170 .radio_pad2g_tune_pus_core1 = r16, \
171 .radio_lna2g_tune_core1 = r17
785e7dbb 172
fe255b40
RM
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
572d37a4 180
785e7dbb
RM
181/* Copied from brcmsmac (5.75.11): chan_info_nphyrev8_2057_rev5 */
182static 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
162bee1a
RM
283/* Extracted from MMIO dump of 6.30.223.141 */
284static 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
572d37a4
RM
447void r2057_upload_inittabs(struct b43_wldev *dev)
448{
449 struct b43_phy *phy = &dev->phy;
450 u16 *table = NULL;
451 u16 size, i;
452
fe255b40
RM
453 switch (phy->rev) {
454 case 7:
572d37a4
RM
455 table = r2057_rev4_init[0];
456 size = ARRAY_SIZE(r2057_rev4_init);
fe255b40
RM
457 break;
458 case 8:
572d37a4 459 if (phy->radio_rev == 5) {
fe255b40
RM
460 table = r2057_rev5_init[0];
461 size = ARRAY_SIZE(r2057_rev5_init);
572d37a4
RM
462 } else if (phy->radio_rev == 7) {
463 table = r2057_rev7_init[0];
464 size = ARRAY_SIZE(r2057_rev7_init);
572d37a4 465 }
fe255b40
RM
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;
162bee1a
RM
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;
572d37a4
RM
479 }
480
e90cf1c7
RM
481 B43_WARN_ON(!table);
482
572d37a4 483 if (table) {
e90cf1c7
RM
484 for (i = 0; i < size; i++, table += 2)
485 b43_radio_write(dev, table[0], table[1]);
572d37a4
RM
486 }
487}
fe255b40
RM
488
489void 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) {
785e7dbb
RM
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;
162bee1a
RM
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;
fe255b40
RM
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.164741 seconds and 5 git commands to generate.