Merge tag 'iio-fixes-for-4.0b' of git://git.kernel.org/pub/scm/linux/kernel/git/jic23...
[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
3b7caa29
RM
120/* Extracted from MMIO dump of 6.30.223.248 */
121static u16 r2057_rev14_init[][2] = {
122 { 0x011, 0xfc }, { 0x030, 0x24 }, { 0x040, 0x1c }, { 0x082, 0x08 },
123 { 0x0b4, 0x44 }, { 0x0c8, 0x01 }, { 0x0c9, 0x01 }, { 0x107, 0x08 },
124 { 0x14d, 0x01 }, { 0x14e, 0x01 }, { 0x1af, 0x40 }, { 0x1b0, 0x40 },
125 { 0x1cc, 0x01 }, { 0x1cf, 0x10 }, { 0x1d0, 0x0f }, { 0x1d3, 0x10 },
126 { 0x1d4, 0x0f },
127};
128
fe255b40
RM
129#define RADIOREGS7(r00, r01, r02, r03, r04, r05, r06, r07, r08, r09, \
130 r10, r11, r12, r13, r14, r15, r16, r17, r18, r19, \
131 r20, r21, r22, r23, r24, r25, r26, r27) \
132 .radio_vcocal_countval0 = r00, \
133 .radio_vcocal_countval1 = r01, \
134 .radio_rfpll_refmaster_sparextalsize = r02, \
135 .radio_rfpll_loopfilter_r1 = r03, \
136 .radio_rfpll_loopfilter_c2 = r04, \
137 .radio_rfpll_loopfilter_c1 = r05, \
138 .radio_cp_kpd_idac = r06, \
139 .radio_rfpll_mmd0 = r07, \
140 .radio_rfpll_mmd1 = r08, \
141 .radio_vcobuf_tune = r09, \
142 .radio_logen_mx2g_tune = r10, \
143 .radio_logen_mx5g_tune = r11, \
144 .radio_logen_indbuf2g_tune = r12, \
145 .radio_logen_indbuf5g_tune = r13, \
146 .radio_txmix2g_tune_boost_pu_core0 = r14, \
147 .radio_pad2g_tune_pus_core0 = r15, \
148 .radio_pga_boost_tune_core0 = r16, \
149 .radio_txmix5g_boost_tune_core0 = r17, \
150 .radio_pad5g_tune_misc_pus_core0 = r18, \
151 .radio_lna2g_tune_core0 = r19, \
152 .radio_lna5g_tune_core0 = r20, \
153 .radio_txmix2g_tune_boost_pu_core1 = r21, \
154 .radio_pad2g_tune_pus_core1 = r22, \
155 .radio_pga_boost_tune_core1 = r23, \
156 .radio_txmix5g_boost_tune_core1 = r24, \
157 .radio_pad5g_tune_misc_pus_core1 = r25, \
158 .radio_lna2g_tune_core1 = r26, \
159 .radio_lna5g_tune_core1 = r27
160
785e7dbb
RM
161#define RADIOREGS7_2G(r00, r01, r02, r03, r04, r05, r06, r07, r08, r09, \
162 r10, r11, r12, r13, r14, r15, r16, r17) \
163 .radio_vcocal_countval0 = r00, \
164 .radio_vcocal_countval1 = r01, \
165 .radio_rfpll_refmaster_sparextalsize = r02, \
166 .radio_rfpll_loopfilter_r1 = r03, \
167 .radio_rfpll_loopfilter_c2 = r04, \
168 .radio_rfpll_loopfilter_c1 = r05, \
169 .radio_cp_kpd_idac = r06, \
170 .radio_rfpll_mmd0 = r07, \
171 .radio_rfpll_mmd1 = r08, \
172 .radio_vcobuf_tune = r09, \
173 .radio_logen_mx2g_tune = r10, \
174 .radio_logen_indbuf2g_tune = r11, \
701fa113
RM
175 .radio_txmix2g_tune_boost_pu_core0 = r12, \
176 .radio_pad2g_tune_pus_core0 = r13, \
177 .radio_lna2g_tune_core0 = r14, \
178 .radio_txmix2g_tune_boost_pu_core1 = r15, \
179 .radio_pad2g_tune_pus_core1 = r16, \
180 .radio_lna2g_tune_core1 = r17
785e7dbb 181
fe255b40
RM
182#define PHYREGS(r0, r1, r2, r3, r4, r5) \
183 .phy_regs.phy_bw1a = r0, \
184 .phy_regs.phy_bw2 = r1, \
185 .phy_regs.phy_bw3 = r2, \
186 .phy_regs.phy_bw4 = r3, \
187 .phy_regs.phy_bw5 = r4, \
188 .phy_regs.phy_bw6 = r5
572d37a4 189
785e7dbb
RM
190/* Copied from brcmsmac (5.75.11): chan_info_nphyrev8_2057_rev5 */
191static const struct b43_nphy_chantabent_rev7_2g b43_nphy_chantab_phy_rev8_radio_rev5[] = {
192 {
193 .freq = 2412,
194 RADIOREGS7_2G(0x48, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x6c,
195 0x09, 0x0d, 0x08, 0x0e, 0x61, 0x03, 0xff, 0x61,
196 0x03, 0xff),
197 PHYREGS(0x03c9, 0x03c5, 0x03c1, 0x043a, 0x043f, 0x0443),
198 },
199 {
200 .freq = 2417,
201 RADIOREGS7_2G(0x4b, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x71,
202 0x09, 0x0d, 0x08, 0x0e, 0x61, 0x03, 0xff, 0x61,
203 0x03, 0xff),
204 PHYREGS(0x03cb, 0x03c7, 0x03c3, 0x0438, 0x043d, 0x0441),
205 },
206 {
207 .freq = 2422,
208 RADIOREGS7_2G(0x4e, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x76,
209 0x09, 0x0d, 0x08, 0x0e, 0x61, 0x03, 0xef, 0x61,
210 0x03, 0xef),
211 PHYREGS(0x03cd, 0x03c9, 0x03c5, 0x0436, 0x043a, 0x043f),
212 },
213 {
214 .freq = 2427,
215 RADIOREGS7_2G(0x52, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x7b,
216 0x09, 0x0c, 0x08, 0x0e, 0x61, 0x03, 0xdf, 0x61,
217 0x03, 0xdf),
218 PHYREGS(0x03cf, 0x03cb, 0x03c7, 0x0434, 0x0438, 0x043d),
219 },
220 {
221 .freq = 2432,
222 RADIOREGS7_2G(0x55, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x80,
223 0x09, 0x0c, 0x07, 0x0d, 0x61, 0x03, 0xcf, 0x61,
224 0x03, 0xcf),
225 PHYREGS(0x03d1, 0x03cd, 0x03c9, 0x0431, 0x0436, 0x043a),
226 },
227 {
228 .freq = 2437,
229 RADIOREGS7_2G(0x58, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x85,
230 0x09, 0x0c, 0x07, 0x0d, 0x61, 0x03, 0xbf, 0x61,
231 0x03, 0xbf),
232 PHYREGS(0x03d3, 0x03cf, 0x03cb, 0x042f, 0x0434, 0x0438),
233 },
234 {
235 .freq = 2442,
236 RADIOREGS7_2G(0x5c, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x8a,
237 0x09, 0x0b, 0x07, 0x0d, 0x61, 0x03, 0xaf, 0x61,
238 0x03, 0xaf),
239 PHYREGS(0x03d5, 0x03d1, 0x03cd, 0x042d, 0x0431, 0x0436),
240 },
241 {
242 .freq = 2447,
243 RADIOREGS7_2G(0x5f, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x8f,
244 0x09, 0x0b, 0x07, 0x0d, 0x61, 0x03, 0x9f, 0x61,
245 0x03, 0x9f),
246 PHYREGS(0x03d7, 0x03d3, 0x03cf, 0x042b, 0x042f, 0x0434),
247 },
248 {
249 .freq = 2452,
250 RADIOREGS7_2G(0x62, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x94,
251 0x09, 0x0b, 0x07, 0x0d, 0x61, 0x03, 0x8f, 0x61,
252 0x03, 0x8f),
253 PHYREGS(0x03d9, 0x03d5, 0x03d1, 0x0429, 0x042d, 0x0431),
254 },
255 {
256 .freq = 2457,
257 RADIOREGS7_2G(0x66, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x99,
258 0x09, 0x0b, 0x07, 0x0c, 0x61, 0x03, 0x7f, 0x61,
259 0x03, 0x7f),
260 PHYREGS(0x03db, 0x03d7, 0x03d3, 0x0427, 0x042b, 0x042f),
261 },
262 {
263 .freq = 2462,
264 RADIOREGS7_2G(0x69, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x9e,
265 0x09, 0x0b, 0x07, 0x0c, 0x61, 0x03, 0x6f, 0x61,
266 0x03, 0x6f),
267 PHYREGS(0x03dd, 0x03d9, 0x03d5, 0x0424, 0x0429, 0x042d),
268 },
269 {
270 .freq = 2467,
271 RADIOREGS7_2G(0x6c, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0xa3,
272 0x09, 0x0b, 0x06, 0x0c, 0x61, 0x03, 0x5f, 0x61,
273 0x03, 0x5f),
274 PHYREGS(0x03df, 0x03db, 0x03d7, 0x0422, 0x0427, 0x042b),
275 },
276 {
277 .freq = 2472,
278 RADIOREGS7_2G(0x70, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0xa8,
279 0x09, 0x0a, 0x06, 0x0b, 0x61, 0x03, 0x4f, 0x61,
280 0x03, 0x4f),
281 PHYREGS(0x03e1, 0x03dd, 0x03d9, 0x0420, 0x0424, 0x0429),
282 },
283 {
284 .freq = 2484,
285 RADIOREGS7_2G(0x78, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0xb4,
286 0x09, 0x0a, 0x06, 0x0b, 0x61, 0x03, 0x3f, 0x61,
287 0x03, 0x3f),
288 PHYREGS(0x03e6, 0x03e2, 0x03de, 0x041b, 0x041f, 0x0424),
289 }
290};
291
3b7caa29
RM
292/* Extracted from MMIO dump of 6.30.223.248 */
293static const struct b43_nphy_chantabent_rev7_2g b43_nphy_chantab_phy_rev17_radio_rev14[] = {
294 {
295 .freq = 2412,
296 RADIOREGS7_2G(0x48, 0x16, 0x30, 0x2b, 0x1f, 0x1f, 0x30, 0x6c,
297 0x09, 0x0d, 0x09, 0x03, 0x21, 0x53, 0xff, 0x21,
298 0x53, 0xff),
299 PHYREGS(0x03c9, 0x03c5, 0x03c1, 0x043a, 0x043f, 0x0443),
300 },
301 {
302 .freq = 2417,
303 RADIOREGS7_2G(0x4b, 0x16, 0x30, 0x2b, 0x1f, 0x1f, 0x30, 0x71,
304 0x09, 0x0d, 0x08, 0x03, 0x21, 0x53, 0xff, 0x21,
305 0x53, 0xff),
306 PHYREGS(0x03cb, 0x03c7, 0x03c3, 0x0438, 0x043d, 0x0441),
307 },
308 {
309 .freq = 2422,
310 RADIOREGS7_2G(0x4e, 0x16, 0x30, 0x2b, 0x1f, 0x1f, 0x30, 0x76,
311 0x09, 0x0d, 0x08, 0x03, 0x21, 0x53, 0xff, 0x21,
312 0x53, 0xff),
313 PHYREGS(0x03cd, 0x03c9, 0x03c5, 0x0436, 0x043a, 0x043f),
314 },
315 {
316 .freq = 2427,
317 RADIOREGS7_2G(0x52, 0x16, 0x30, 0x2b, 0x1f, 0x1f, 0x30, 0x7b,
318 0x09, 0x0c, 0x08, 0x03, 0x21, 0x53, 0xff, 0x21,
319 0x53, 0xff),
320 PHYREGS(0x03cf, 0x03cb, 0x03c7, 0x0434, 0x0438, 0x043d),
321 },
322 {
323 .freq = 2432,
324 RADIOREGS7_2G(0x55, 0x16, 0x30, 0x2b, 0x1f, 0x1f, 0x30, 0x80,
325 0x09, 0x0c, 0x08, 0x03, 0x21, 0x53, 0xff, 0x21,
326 0x53, 0xff),
327 PHYREGS(0x03d1, 0x03cd, 0x03c9, 0x0431, 0x0436, 0x043a),
328 },
329 {
330 .freq = 2437,
331 RADIOREGS7_2G(0x58, 0x16, 0x30, 0x2b, 0x1f, 0x1f, 0x30, 0x85,
332 0x09, 0x0c, 0x08, 0x03, 0x21, 0x53, 0xff, 0x21,
333 0x53, 0xff),
334 PHYREGS(0x03d3, 0x03cf, 0x03cb, 0x042f, 0x0434, 0x0438),
335 },
336 {
337 .freq = 2442,
338 RADIOREGS7_2G(0x5c, 0x16, 0x30, 0x2b, 0x1f, 0x1f, 0x30, 0x8a,
339 0x09, 0x0c, 0x08, 0x03, 0x21, 0x43, 0xff, 0x21,
340 0x43, 0xff),
341 PHYREGS(0x03d5, 0x03d1, 0x03cd, 0x042d, 0x0431, 0x0436),
342 },
343 {
344 .freq = 2447,
345 RADIOREGS7_2G(0x5f, 0x16, 0x30, 0x2b, 0x1f, 0x1f, 0x30, 0x8f,
346 0x09, 0x0c, 0x08, 0x03, 0x21, 0x43, 0xff, 0x21,
347 0x43, 0xff),
348 PHYREGS(0x03d7, 0x03d3, 0x03cf, 0x042b, 0x042f, 0x0434),
349 },
350 {
351 .freq = 2452,
352 RADIOREGS7_2G(0x62, 0x16, 0x30, 0x2b, 0x1f, 0x1f, 0x30, 0x94,
353 0x09, 0x0c, 0x08, 0x03, 0x21, 0x43, 0xff, 0x21,
354 0x43, 0xff),
355 PHYREGS(0x03d9, 0x03d5, 0x03d1, 0x0429, 0x042d, 0x0431),
356 },
357 {
358 .freq = 2457,
359 RADIOREGS7_2G(0x66, 0x16, 0x30, 0x2b, 0x1f, 0x1f, 0x30, 0x99,
360 0x09, 0x0b, 0x07, 0x03, 0x21, 0x43, 0xff, 0x21,
361 0x43, 0xff),
362 PHYREGS(0x03db, 0x03d7, 0x03d3, 0x0427, 0x042b, 0x042f),
363 },
364 {
365 .freq = 2462,
366 RADIOREGS7_2G(0x69, 0x16, 0x30, 0x2b, 0x1f, 0x1f, 0x30, 0x9e,
367 0x09, 0x0b, 0x07, 0x03, 0x01, 0x43, 0xff, 0x01,
368 0x43, 0xff),
369 PHYREGS(0x03dd, 0x03d9, 0x03d5, 0x0424, 0x0429, 0x042d),
370 },
371};
372
162bee1a
RM
373/* Extracted from MMIO dump of 6.30.223.141 */
374static const struct b43_nphy_chantabent_rev7 b43_nphy_chantab_phy_rev16_radio_rev9[] = {
375 {
376 .freq = 2412,
377 RADIOREGS7(0x48, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x6c,
378 0x09, 0x0f, 0x0a, 0x00, 0x0a, 0x00, 0x41, 0x63,
379 0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00,
380 0x00, 0x00, 0xf0, 0x00),
381 PHYREGS(0x03c9, 0x03c5, 0x03c1, 0x043a, 0x043f, 0x0443),
382 },
383 {
384 .freq = 2417,
385 RADIOREGS7(0x4b, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x71,
386 0x09, 0x0f, 0x0a, 0x00, 0x0a, 0x00, 0x41, 0x63,
387 0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00,
388 0x00, 0x00, 0xf0, 0x00),
389 PHYREGS(0x03cb, 0x03c7, 0x03c3, 0x0438, 0x043d, 0x0441),
390 },
391 {
392 .freq = 2422,
393 RADIOREGS7(0x4e, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x76,
394 0x09, 0x0f, 0x09, 0x00, 0x09, 0x00, 0x41, 0x63,
395 0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00,
396 0x00, 0x00, 0xf0, 0x00),
397 PHYREGS(0x03cd, 0x03c9, 0x03c5, 0x0436, 0x043a, 0x043f),
398 },
399 {
400 .freq = 2427,
401 RADIOREGS7(0x52, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x7b,
402 0x09, 0x0f, 0x09, 0x00, 0x09, 0x00, 0x41, 0x63,
403 0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00,
404 0x00, 0x00, 0xf0, 0x00),
405 PHYREGS(0x03cf, 0x03cb, 0x03c7, 0x0434, 0x0438, 0x043d),
406 },
407 {
408 .freq = 2432,
409 RADIOREGS7(0x55, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x80,
410 0x09, 0x0f, 0x08, 0x00, 0x08, 0x00, 0x41, 0x63,
411 0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00,
412 0x00, 0x00, 0xf0, 0x00),
413 PHYREGS(0x03d1, 0x03cd, 0x03c9, 0x0431, 0x0436, 0x043a),
414 },
415 {
416 .freq = 2437,
417 RADIOREGS7(0x58, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x85,
418 0x09, 0x0f, 0x08, 0x00, 0x08, 0x00, 0x41, 0x63,
419 0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00,
420 0x00, 0x00, 0xf0, 0x00),
421 PHYREGS(0x03d3, 0x03cf, 0x03cb, 0x042f, 0x0434, 0x0438),
422 },
423 {
424 .freq = 2442,
425 RADIOREGS7(0x5c, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x8a,
426 0x09, 0x0f, 0x07, 0x00, 0x07, 0x00, 0x41, 0x63,
427 0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00,
428 0x00, 0x00, 0xf0, 0x00),
429 PHYREGS(0x03d5, 0x03d1, 0x03cd, 0x042d, 0x0431, 0x0436),
430 },
431 {
432 .freq = 2447,
433 RADIOREGS7(0x5f, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x8f,
434 0x09, 0x0f, 0x07, 0x00, 0x07, 0x00, 0x41, 0x63,
435 0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00,
436 0x00, 0x00, 0xf0, 0x00),
437 PHYREGS(0x03d7, 0x03d3, 0x03cf, 0x042b, 0x042f, 0x0434),
438 },
439 {
440 .freq = 2452,
441 RADIOREGS7(0x62, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x94,
442 0x09, 0x0f, 0x07, 0x00, 0x07, 0x00, 0x41, 0x63,
443 0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00,
444 0x00, 0x00, 0xf0, 0x00),
445 PHYREGS(0x03d9, 0x03d5, 0x03d1, 0x0429, 0x042d, 0x0431),
446 },
447 {
448 .freq = 2457,
449 RADIOREGS7(0x66, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x99,
450 0x09, 0x0f, 0x06, 0x00, 0x06, 0x00, 0x41, 0x63,
451 0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00,
452 0x00, 0x00, 0xf0, 0x00),
453 PHYREGS(0x03db, 0x03d7, 0x03d3, 0x0427, 0x042b, 0x042f),
454 },
455 {
456 .freq = 2462,
457 RADIOREGS7(0x69, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x9e,
458 0x09, 0x0f, 0x06, 0x00, 0x06, 0x00, 0x41, 0x63,
459 0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00,
460 0x00, 0x00, 0xf0, 0x00),
461 PHYREGS(0x03dd, 0x03d9, 0x03d5, 0x0424, 0x0429, 0x042d),
462 },
463 {
464 .freq = 5180,
465 RADIOREGS7(0xbe, 0x16, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x06,
466 0x02, 0x0e, 0x00, 0x0e, 0x00, 0x9e, 0x00, 0x00,
467 0x9f, 0x2f, 0xa3, 0x00, 0xfc, 0x00, 0x00, 0x4f,
468 0x3a, 0x83, 0x00, 0xfc),
469 PHYREGS(0x081c, 0x0818, 0x0814, 0x01f9, 0x01fa, 0x01fb),
470 },
471 {
472 .freq = 5200,
473 RADIOREGS7(0xc5, 0x16, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x08,
474 0x02, 0x0e, 0x00, 0x0e, 0x00, 0x9e, 0x00, 0x00,
475 0x7f, 0x2f, 0x83, 0x00, 0xf8, 0x00, 0x00, 0x4c,
476 0x4a, 0x83, 0x00, 0xf8),
477 PHYREGS(0x0824, 0x0820, 0x081c, 0x01f7, 0x01f8, 0x01f9),
478 },
479 {
480 .freq = 5220,
481 RADIOREGS7(0xcc, 0x16, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x0a,
482 0x02, 0x0e, 0x00, 0x0e, 0x00, 0x9e, 0x00, 0x00,
483 0x6d, 0x3d, 0x83, 0x00, 0xf8, 0x00, 0x00, 0x2d,
484 0x2a, 0x73, 0x00, 0xf8),
485 PHYREGS(0x082c, 0x0828, 0x0824, 0x01f5, 0x01f6, 0x01f7),
486 },
487 {
488 .freq = 5240,
489 RADIOREGS7(0xd2, 0x16, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x0c,
490 0x02, 0x0d, 0x00, 0x0d, 0x00, 0x8d, 0x00, 0x00,
491 0x4d, 0x1c, 0x73, 0x00, 0xf8, 0x00, 0x00, 0x4d,
492 0x2b, 0x73, 0x00, 0xf8),
493 PHYREGS(0x0834, 0x0830, 0x082c, 0x01f3, 0x01f4, 0x01f5),
494 },
495 {
496 .freq = 5745,
497 RADIOREGS7(0x7b, 0x17, 0x20, 0x1f, 0x08, 0x08, 0x3f, 0x7d,
498 0x04, 0x08, 0x00, 0x06, 0x00, 0x15, 0x00, 0x00,
499 0x08, 0x03, 0x03, 0x00, 0x30, 0x00, 0x00, 0x06,
500 0x02, 0x03, 0x00, 0x30),
501 PHYREGS(0x08fe, 0x08fa, 0x08f6, 0x01c8, 0x01c8, 0x01c9),
502 },
503 {
504 .freq = 5765,
505 RADIOREGS7(0x81, 0x17, 0x20, 0x1f, 0x08, 0x08, 0x3f, 0x81,
506 0x04, 0x08, 0x00, 0x06, 0x00, 0x15, 0x00, 0x00,
507 0x06, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x05,
508 0x02, 0x03, 0x00, 0x00),
509 PHYREGS(0x0906, 0x0902, 0x08fe, 0x01c6, 0x01c7, 0x01c8),
510 },
511 {
512 .freq = 5785,
513 RADIOREGS7(0x88, 0x17, 0x20, 0x1f, 0x08, 0x08, 0x3f, 0x85,
514 0x04, 0x08, 0x00, 0x06, 0x00, 0x15, 0x00, 0x00,
515 0x08, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x05,
516 0x21, 0x03, 0x00, 0x00),
517 PHYREGS(0x090e, 0x090a, 0x0906, 0x01c4, 0x01c5, 0x01c6),
518 },
519 {
520 .freq = 5805,
521 RADIOREGS7(0x8f, 0x17, 0x20, 0x1f, 0x08, 0x08, 0x3f, 0x89,
522 0x04, 0x07, 0x00, 0x06, 0x00, 0x04, 0x00, 0x00,
523 0x06, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x03,
524 0x00, 0x03, 0x00, 0x00),
525 PHYREGS(0x0916, 0x0912, 0x090e, 0x01c3, 0x01c4, 0x01c4),
526 },
527 {
528 .freq = 5825,
529 RADIOREGS7(0x95, 0x17, 0x20, 0x1f, 0x08, 0x08, 0x3f, 0x8d,
530 0x04, 0x07, 0x00, 0x05, 0x00, 0x03, 0x00, 0x00,
531 0x05, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x03,
532 0x00, 0x03, 0x00, 0x00),
533 PHYREGS(0x091e, 0x091a, 0x0916, 0x01c1, 0x01c2, 0x01c3),
534 },
535};
536
572d37a4
RM
537void r2057_upload_inittabs(struct b43_wldev *dev)
538{
539 struct b43_phy *phy = &dev->phy;
540 u16 *table = NULL;
541 u16 size, i;
542
fe255b40
RM
543 switch (phy->rev) {
544 case 7:
572d37a4
RM
545 table = r2057_rev4_init[0];
546 size = ARRAY_SIZE(r2057_rev4_init);
fe255b40
RM
547 break;
548 case 8:
572d37a4 549 if (phy->radio_rev == 5) {
fe255b40
RM
550 table = r2057_rev5_init[0];
551 size = ARRAY_SIZE(r2057_rev5_init);
572d37a4
RM
552 } else if (phy->radio_rev == 7) {
553 table = r2057_rev7_init[0];
554 size = ARRAY_SIZE(r2057_rev7_init);
572d37a4 555 }
fe255b40
RM
556 break;
557 case 9:
558 if (phy->radio_rev == 5) {
559 table = r2057_rev5a_init[0];
560 size = ARRAY_SIZE(r2057_rev5a_init);
561 }
562 break;
162bee1a
RM
563 case 16:
564 if (phy->radio_rev == 9) {
565 table = r2057_rev9_init[0];
566 size = ARRAY_SIZE(r2057_rev9_init);
567 }
568 break;
3b7caa29
RM
569 case 17:
570 if (phy->radio_rev == 14) {
571 table = r2057_rev14_init[0];
572 size = ARRAY_SIZE(r2057_rev14_init);
573 }
574 break;
572d37a4
RM
575 }
576
e90cf1c7
RM
577 B43_WARN_ON(!table);
578
572d37a4 579 if (table) {
e90cf1c7
RM
580 for (i = 0; i < size; i++, table += 2)
581 b43_radio_write(dev, table[0], table[1]);
572d37a4
RM
582 }
583}
fe255b40
RM
584
585void r2057_get_chantabent_rev7(struct b43_wldev *dev, u16 freq,
586 const struct b43_nphy_chantabent_rev7 **tabent_r7,
587 const struct b43_nphy_chantabent_rev7_2g **tabent_r7_2g)
588{
589 struct b43_phy *phy = &dev->phy;
590 const struct b43_nphy_chantabent_rev7 *e_r7 = NULL;
591 const struct b43_nphy_chantabent_rev7_2g *e_r7_2g = NULL;
592 unsigned int len, i;
593
594 *tabent_r7 = NULL;
595 *tabent_r7_2g = NULL;
596
fe255b40 597 switch (phy->rev) {
785e7dbb
RM
598 case 8:
599 if (phy->radio_rev == 5) {
600 e_r7_2g = b43_nphy_chantab_phy_rev8_radio_rev5;
601 len = ARRAY_SIZE(b43_nphy_chantab_phy_rev8_radio_rev5);
602 }
603 break;
162bee1a
RM
604 case 16:
605 if (phy->radio_rev == 9) {
606 e_r7 = b43_nphy_chantab_phy_rev16_radio_rev9;
607 len = ARRAY_SIZE(b43_nphy_chantab_phy_rev16_radio_rev9);
608 }
609 break;
3b7caa29
RM
610 case 17:
611 if (phy->radio_rev == 14) {
612 e_r7_2g = b43_nphy_chantab_phy_rev17_radio_rev14;
613 len = ARRAY_SIZE(b43_nphy_chantab_phy_rev17_radio_rev14);
614 }
615 break;
fe255b40
RM
616 default:
617 break;
618 }
619
620 if (e_r7) {
621 for (i = 0; i < len; i++, e_r7++) {
622 if (e_r7->freq == freq) {
623 *tabent_r7 = e_r7;
624 return;
625 }
626 }
627 } else if (e_r7_2g) {
628 for (i = 0; i < len; i++, e_r7_2g++) {
629 if (e_r7_2g->freq == freq) {
630 *tabent_r7_2g = e_r7_2g;
631 return;
632 }
633 }
634 } else {
635 B43_WARN_ON(1);
636 }
637}
This page took 0.292654 seconds and 5 git commands to generate.