c62a94082bca6617daf411e87e8f495cb10f5433
[deliverable/linux.git] / drivers / net / wireless / b43 / tables_phy_lcn.c
1 /*
2
3 Broadcom B43 wireless driver
4 IEEE 802.11n LCN-PHY data tables
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; see the file COPYING. If not, write to
18 the Free Software Foundation, Inc., 51 Franklin Steet, Fifth Floor,
19 Boston, MA 02110-1301, USA.
20
21 */
22
23 #include "b43.h"
24 #include "tables_phy_lcn.h"
25 #include "phy_common.h"
26 #include "phy_lcn.h"
27
28 static const u16 b43_lcntab_0x02[] = {
29 0x014d, 0x014d, 0x014d, 0x014d, 0x014d, 0x014d,
30 0x014d, 0x014d, 0x014d, 0x014d, 0x014d, 0x014d,
31 0x014d, 0x014d, 0x014d, 0x014d, 0x014d, 0x014d,
32 0x014d, 0x014d, 0x014d, 0x014d, 0x014d, 0x014d,
33 0x014d, 0x014d, 0x014d, 0x014d, 0x014d, 0x014d,
34 0x014d, 0x014d, 0x014d, 0x014d, 0x014d, 0x014d,
35 0x014d, 0x014d, 0x014d, 0x014d, 0x014d, 0x014d,
36 0x014d, 0x014d, 0x014d, 0x014d, 0x014d, 0x014d,
37 0x014d, 0x014d, 0x014d, 0x014d, 0x014d, 0x014d,
38 0x014d, 0x014d, 0x014d, 0x014d, 0x014d, 0x014d,
39 0x014d, 0x014d, 0x014d, 0x014d,
40 };
41
42 static const u16 b43_lcntab_0x01[] = {
43 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
44 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
45 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
46 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
47 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
48 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
49 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
50 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
51 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
52 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
53 0x0000, 0x0000, 0x0000, 0x0000,
54 };
55
56 static const u32 b43_lcntab_0x0b[] = {
57 0x000141f8, 0x000021f8, 0x000021fb, 0x000041fb,
58 0x0001fedb, 0x0000217b, 0x00002133, 0x000040eb,
59 0x0001fea3, 0x0000024b,
60 };
61
62 static const u32 b43_lcntab_0x0c[] = {
63 0x00100001, 0x00200010, 0x00300001, 0x00400010,
64 0x00500022, 0x00600122, 0x00700222, 0x00800322,
65 0x00900422, 0x00a00522, 0x00b00622, 0x00c00722,
66 0x00d00822, 0x00f00922, 0x00100a22, 0x00200b22,
67 0x00300c22, 0x00400d22, 0x00500e22, 0x00600f22,
68 };
69
70 static const u32 b43_lcntab_0x0d[] = {
71 0x00000000, 0x00000000, 0x10000000, 0x00000000,
72 0x20000000, 0x00000000, 0x30000000, 0x00000000,
73 0x40000000, 0x00000000, 0x50000000, 0x00000000,
74 0x60000000, 0x00000000, 0x70000000, 0x00000000,
75 0x80000000, 0x00000000, 0x90000000, 0x00000008,
76 0xa0000000, 0x00000008, 0xb0000000, 0x00000008,
77 0xc0000000, 0x00000008, 0xd0000000, 0x00000008,
78 0xe0000000, 0x00000008, 0xf0000000, 0x00000008,
79 0x00000000, 0x00000009, 0x10000000, 0x00000009,
80 0x20000000, 0x00000019, 0x30000000, 0x00000019,
81 0x40000000, 0x00000019, 0x50000000, 0x00000019,
82 0x60000000, 0x00000019, 0x70000000, 0x00000019,
83 0x80000000, 0x00000019, 0x90000000, 0x00000019,
84 0xa0000000, 0x00000019, 0xb0000000, 0x00000019,
85 0xc0000000, 0x00000019, 0xd0000000, 0x00000019,
86 0xe0000000, 0x00000019, 0xf0000000, 0x00000019,
87 0x00000000, 0x0000001a, 0x10000000, 0x0000001a,
88 0x20000000, 0x0000001a, 0x30000000, 0x0000001a,
89 0x40000000, 0x0000001a, 0x50000000, 0x00000002,
90 0x60000000, 0x00000002, 0x70000000, 0x00000002,
91 0x80000000, 0x00000002, 0x90000000, 0x00000002,
92 0xa0000000, 0x00000002, 0xb0000000, 0x00000002,
93 0xc0000000, 0x0000000a, 0xd0000000, 0x0000000a,
94 0xe0000000, 0x0000000a, 0xf0000000, 0x0000000a,
95 0x00000000, 0x0000000b, 0x10000000, 0x0000000b,
96 0x20000000, 0x0000000b, 0x30000000, 0x0000000b,
97 0x40000000, 0x0000000b, 0x50000000, 0x0000001b,
98 0x60000000, 0x0000001b, 0x70000000, 0x0000001b,
99 0x80000000, 0x0000001b, 0x90000000, 0x0000001b,
100 0xa0000000, 0x0000001b, 0xb0000000, 0x0000001b,
101 0xc0000000, 0x0000001b, 0xd0000000, 0x0000001b,
102 0xe0000000, 0x0000001b, 0xf0000000, 0x0000001b,
103 0x00000000, 0x0000001c, 0x10000000, 0x0000001c,
104 0x20000000, 0x0000001c, 0x30000000, 0x0000001c,
105 0x40000000, 0x0000001c, 0x50000000, 0x0000001c,
106 0x60000000, 0x0000001c, 0x70000000, 0x0000001c,
107 0x80000000, 0x0000001c, 0x90000000, 0x0000001c,
108 };
109
110 static const u16 b43_lcntab_0x0e[] = {
111 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0406,
112 0x0407, 0x0408, 0x0409, 0x040a, 0x058b, 0x058c,
113 0x058d, 0x058e, 0x058f, 0x0090, 0x0091, 0x0092,
114 0x0193, 0x0194, 0x0195, 0x0196, 0x0197, 0x0198,
115 0x0199, 0x019a, 0x019b, 0x019c, 0x019d, 0x019e,
116 0x019f, 0x01a0, 0x01a1, 0x01a2, 0x01a3, 0x01a4,
117 0x01a5, 0x0000,
118 };
119
120 static const u16 b43_lcntab_0x0f[] = {
121 0x000a, 0x0009, 0x0006, 0x0005, 0x000a, 0x0009,
122 0x0006, 0x0005, 0x000a, 0x0009, 0x0006, 0x0005,
123 0x000a, 0x0009, 0x0006, 0x0005, 0x000a, 0x0009,
124 0x0006, 0x0005, 0x000a, 0x0009, 0x0006, 0x0005,
125 0x000a, 0x0009, 0x0006, 0x0005, 0x000a, 0x0009,
126 0x0006, 0x0005, 0x000a, 0x0009, 0x0006, 0x0005,
127 0x000a, 0x0009, 0x0006, 0x0005, 0x000a, 0x0009,
128 0x0006, 0x0005, 0x000a, 0x0009, 0x0006, 0x0005,
129 0x000a, 0x0009, 0x0006, 0x0005, 0x000a, 0x0009,
130 0x0006, 0x0005, 0x000a, 0x0009, 0x0006, 0x0005,
131 0x000a, 0x0009, 0x0006, 0x0005,
132 };
133
134 static const u16 b43_lcntab_0x10[] = {
135 0x005f, 0x0036, 0x0029, 0x001f, 0x005f, 0x0036,
136 0x0029, 0x001f, 0x005f, 0x0036, 0x0029, 0x001f,
137 0x005f, 0x0036, 0x0029, 0x001f,
138 };
139
140 static const u16 b43_lcntab_0x11[] = {
141 0x0009, 0x000f, 0x0014, 0x0018, 0x00fe, 0x0007,
142 0x000b, 0x000f, 0x00fb, 0x00fe, 0x0001, 0x0005,
143 0x0008, 0x000b, 0x000e, 0x0011, 0x0014, 0x0017,
144 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
145 0x0000, 0x0003, 0x0006, 0x0009, 0x000c, 0x000f,
146 0x0012, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
147 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0003,
148 0x0006, 0x0009, 0x000c, 0x000f, 0x0012, 0x0015,
149 0x0018, 0x001b, 0x0000, 0x0000, 0x0000, 0x0000,
150 0x0000, 0x0000, 0x0003, 0x00eb, 0x0000, 0x0000,
151 };
152
153 static const u32 b43_lcntab_0x12[] = {
154 0x00000000, 0x00000000, 0x00000000, 0x00000000,
155 0x00000000, 0x00000000, 0x00000000, 0x00000000,
156 0x00000004, 0x00000000, 0x00000004, 0x00000008,
157 0x00000001, 0x00000005, 0x00000009, 0x0000000d,
158 0x0000004d, 0x0000008d, 0x0000000d, 0x0000004d,
159 0x0000008d, 0x000000cd, 0x0000004f, 0x0000008f,
160 0x000000cf, 0x000000d3, 0x00000113, 0x00000513,
161 0x00000913, 0x00000953, 0x00000d53, 0x00001153,
162 0x00001193, 0x00005193, 0x00009193, 0x0000d193,
163 0x00011193, 0x00000000, 0x00000000, 0x00000000,
164 0x00000000, 0x00000000, 0x00000000, 0x00000004,
165 0x00000000, 0x00000004, 0x00000008, 0x00000001,
166 0x00000005, 0x00000009, 0x0000000d, 0x0000004d,
167 0x0000008d, 0x0000000d, 0x0000004d, 0x0000008d,
168 0x000000cd, 0x0000004f, 0x0000008f, 0x000000cf,
169 0x000000d3, 0x00000113, 0x00000513, 0x00000913,
170 0x00000953, 0x00000d53, 0x00001153, 0x00005153,
171 0x00009153, 0x0000d153, 0x00011153, 0x00015153,
172 0x00019153, 0x0001d153, 0x00000000, 0x00000000,
173 0x00000000, 0x00000000, 0x00000000, 0x00000000,
174 0x00000000, 0x00000000, 0x00000000, 0x00000000,
175 0x00000000, 0x00000000, 0x00000000, 0x00000000,
176 0x00000000, 0x00000000, 0x00000000, 0x00000000,
177 0x00000000, 0x00000000, 0x00000000, 0x00000000,
178 };
179
180 static const u16 b43_lcntab_0x14[] = {
181 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
182 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
183 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
184 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
185 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
186 0x0002, 0x0003, 0x0001, 0x0003, 0x0002, 0x0001,
187 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
188 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
189 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
190 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
191 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
192 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
193 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
194 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
195 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
196 0x0001, 0x0001, 0x0001, 0x0001, 0x0002, 0x0003,
197 0x0001, 0x0003, 0x0002, 0x0001, 0x0001, 0x0001,
198 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
199 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
200 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
201 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
202 0x0001, 0x0001,
203 };
204
205 static const u16 b43_lcntab_0x17[] = {
206 0x001a, 0x0034, 0x004e, 0x0068, 0x009c, 0x00d0,
207 0x00ea, 0x0104, 0x0034, 0x0068, 0x009c, 0x00d0,
208 0x0138, 0x01a0, 0x01d4, 0x0208, 0x004e, 0x009c,
209 0x00ea, 0x0138, 0x01d4, 0x0270, 0x02be, 0x030c,
210 0x0068, 0x00d0, 0x0138, 0x01a0, 0x0270, 0x0340,
211 0x03a8, 0x0410, 0x0018, 0x009c, 0x00d0, 0x0104,
212 0x00ea, 0x0138, 0x0186, 0x00d0, 0x0104, 0x0104,
213 0x0138, 0x016c, 0x016c, 0x01a0, 0x0138, 0x0186,
214 0x0186, 0x01d4, 0x0222, 0x0222, 0x0270, 0x0104,
215 0x0138, 0x016c, 0x0138, 0x016c, 0x01a0, 0x01d4,
216 0x01a0, 0x01d4, 0x0208, 0x0208, 0x023c, 0x0186,
217 0x01d4, 0x0222, 0x01d4, 0x0222, 0x0270, 0x02be,
218 0x0270, 0x02be, 0x030c, 0x030c, 0x035a, 0x0036,
219 0x006c, 0x00a2, 0x00d8, 0x0144, 0x01b0, 0x01e6,
220 0x021c, 0x006c, 0x00d8, 0x0144, 0x01b0, 0x0288,
221 0x0360, 0x03cc, 0x0438, 0x00a2, 0x0144, 0x01e6,
222 0x0288, 0x03cc, 0x0510, 0x05b2, 0x0654, 0x00d8,
223 0x01b0, 0x0288, 0x0360, 0x0510, 0x06c0, 0x0798,
224 0x0870, 0x0018, 0x0144, 0x01b0, 0x021c, 0x01e6,
225 0x0288, 0x032a, 0x01b0, 0x021c, 0x021c, 0x0288,
226 0x02f4, 0x02f4, 0x0360, 0x0288, 0x032a, 0x032a,
227 0x03cc, 0x046e, 0x046e, 0x0510, 0x021c, 0x0288,
228 0x02f4, 0x0288, 0x02f4, 0x0360, 0x03cc, 0x0360,
229 0x03cc, 0x0438, 0x0438, 0x04a4, 0x032a, 0x03cc,
230 0x046e, 0x03cc, 0x046e, 0x0510, 0x05b2, 0x0510,
231 0x05b2, 0x0654, 0x0654, 0x06f6,
232 };
233
234 static const u16 b43_lcntab_0x00[] = {
235 0x0200, 0x0300, 0x0400, 0x0600, 0x0800, 0x0b00,
236 0x1000, 0x1001, 0x1002, 0x1003, 0x1004, 0x1005,
237 0x1006, 0x1007, 0x1707, 0x2007, 0x2d07, 0x4007,
238 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
239 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
240 0x0000, 0x0000, 0x0200, 0x0300, 0x0400, 0x0600,
241 0x0800, 0x0b00, 0x1000, 0x1001, 0x1002, 0x1003,
242 0x1004, 0x1005, 0x1006, 0x1007, 0x1707, 0x2007,
243 0x2d07, 0x4007, 0x0000, 0x0000, 0x0000, 0x0000,
244 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
245 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
246 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
247 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
248 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
249 0x0000, 0x0000, 0x0000, 0x4000, 0x0000, 0x0000,
250 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
251 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
252 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
253 };
254
255 static const u32 b43_lcntab_0x18[] = {
256 0x00080000, 0x00080000, 0x00080000, 0x00080000,
257 0x00080000, 0x00080000, 0x00080000, 0x00080000,
258 0x00080000, 0x00080000, 0x00080000, 0x00080000,
259 0x00080000, 0x00080000, 0x00080000, 0x00080000,
260 0x00080000, 0x00080000, 0x00080000, 0x00080000,
261 0x00080000, 0x00080000, 0x00080000, 0x00080000,
262 0x00080000, 0x00080000, 0x00080000, 0x00080000,
263 0x00080000, 0x00080000, 0x00080000, 0x00080000,
264 0x00080000, 0x00080000, 0x00080000, 0x00080000,
265 0x00080000, 0x00080000, 0x00080000, 0x00080000,
266 0x00080000, 0x00080000, 0x00080000, 0x00080000,
267 0x00080000, 0x00080000, 0x00080000, 0x00080000,
268 0x00080000, 0x00080000, 0x00080000, 0x00080000,
269 0x00080000, 0x00080000, 0x00080000, 0x00080000,
270 0x00080000, 0x00080000, 0x00080000, 0x00080000,
271 0x00080000, 0x00080000, 0x00080000, 0x00080000,
272 0x00080000, 0x00080000, 0x00080000, 0x00080000,
273 0x00080000, 0x00080000, 0x00080000, 0x00080000,
274 0x00080000, 0x00080000, 0x00080000, 0x00080000,
275 0x00080000, 0x00080000, 0x00080000, 0x00080000,
276 0x00080000, 0x00080000, 0x00080000, 0x00080000,
277 0x00080000, 0x00080000, 0x00080000, 0x00080000,
278 0x00080000, 0x00080000, 0x00080000, 0x00080000,
279 0x00080000, 0x00080000, 0x00080000, 0x00080000,
280 0x00080000, 0x00080000, 0x00080000, 0x00080000,
281 0x00080000, 0x00080000, 0x00080000, 0x00080000,
282 0x00080000, 0x00080000, 0x00080000, 0x00080000,
283 0x00080000, 0x00080000, 0x00080000, 0x00080000,
284 0x00080000, 0x00080000, 0x00080000, 0x00080000,
285 0x00080000, 0x00080000, 0x00080000, 0x00080000,
286 0x00080000, 0x00080000, 0x00080000, 0x00080000,
287 0x00080000, 0x00080000, 0x00080000, 0x00080000,
288 0x00080000, 0x00080000, 0x00080000, 0x00080000,
289 0x00080000, 0x00080000, 0x00080000, 0x00080000,
290 0x00080000, 0x00080000, 0x00080000, 0x00080000,
291 0x00080000, 0x00080000, 0x00080000, 0x00080000,
292 0x00080000, 0x00080000, 0x00080000, 0x00080000,
293 0x00080000, 0x00080000, 0x00080000, 0x00080000,
294 0x00080000, 0x00080000, 0x00080000, 0x00080000,
295 0x00080000, 0x00080000, 0x00080000, 0x00080000,
296 };
297
298 const u16 b43_lcntab_sw_ctl_4313_epa_rev0[] = {
299 0x0002, 0x0008, 0x0004, 0x0001, 0x0002, 0x0008,
300 0x0004, 0x0001, 0x0002, 0x0008, 0x0004, 0x0001,
301 0x0002, 0x0008, 0x0004, 0x0001, 0x0002, 0x0008,
302 0x0004, 0x0001, 0x0002, 0x0008, 0x0004, 0x0001,
303 0x0002, 0x0008, 0x0004, 0x0001, 0x0002, 0x0008,
304 0x0004, 0x0001, 0x0002, 0x0008, 0x0004, 0x0001,
305 0x0002, 0x0008, 0x0004, 0x0001, 0x0002, 0x0008,
306 0x0004, 0x0001, 0x0002, 0x0008, 0x0004, 0x0001,
307 0x0002, 0x0008, 0x0004, 0x0001, 0x0002, 0x0008,
308 0x0004, 0x0001, 0x0002, 0x0008, 0x0004, 0x0001,
309 0x0002, 0x0008, 0x0004, 0x0001,
310 };
311
312 /**************************************************
313 * R/W ops.
314 **************************************************/
315
316 u32 b43_lcntab_read(struct b43_wldev *dev, u32 offset)
317 {
318 u32 type, value;
319
320 type = offset & B43_LCNTAB_TYPEMASK;
321 offset &= ~B43_LCNTAB_TYPEMASK;
322 B43_WARN_ON(offset > 0xFFFF);
323
324 switch (type) {
325 case B43_LCNTAB_8BIT:
326 b43_phy_write(dev, B43_PHY_LCN_TABLE_ADDR, offset);
327 value = b43_phy_read(dev, B43_PHY_LCN_TABLE_DATALO) & 0xFF;
328 break;
329 case B43_LCNTAB_16BIT:
330 b43_phy_write(dev, B43_PHY_LCN_TABLE_ADDR, offset);
331 value = b43_phy_read(dev, B43_PHY_LCN_TABLE_DATALO);
332 break;
333 case B43_LCNTAB_32BIT:
334 b43_phy_write(dev, B43_PHY_LCN_TABLE_ADDR, offset);
335 value = b43_phy_read(dev, B43_PHY_LCN_TABLE_DATALO);
336 value |= (b43_phy_read(dev, B43_PHY_LCN_TABLE_DATAHI) << 16);
337 break;
338 default:
339 B43_WARN_ON(1);
340 value = 0;
341 }
342
343 return value;
344 }
345
346 void b43_lcntab_read_bulk(struct b43_wldev *dev, u32 offset,
347 unsigned int nr_elements, void *_data)
348 {
349 u32 type;
350 u8 *data = _data;
351 unsigned int i;
352
353 type = offset & B43_LCNTAB_TYPEMASK;
354 offset &= ~B43_LCNTAB_TYPEMASK;
355 B43_WARN_ON(offset > 0xFFFF);
356
357 b43_phy_write(dev, B43_PHY_LCN_TABLE_ADDR, offset);
358
359 for (i = 0; i < nr_elements; i++) {
360 switch (type) {
361 case B43_LCNTAB_8BIT:
362 *data = b43_phy_read(dev,
363 B43_PHY_LCN_TABLE_DATALO) & 0xFF;
364 data++;
365 break;
366 case B43_LCNTAB_16BIT:
367 *((u16 *)data) = b43_phy_read(dev,
368 B43_PHY_LCN_TABLE_DATALO);
369 data += 2;
370 break;
371 case B43_LCNTAB_32BIT:
372 *((u32 *)data) = b43_phy_read(dev,
373 B43_PHY_LCN_TABLE_DATALO);
374 *((u32 *)data) |= (b43_phy_read(dev,
375 B43_PHY_LCN_TABLE_DATAHI) << 16);
376 data += 4;
377 break;
378 default:
379 B43_WARN_ON(1);
380 }
381 }
382 }
383
384 void b43_lcntab_write(struct b43_wldev *dev, u32 offset, u32 value)
385 {
386 u32 type;
387
388 type = offset & B43_LCNTAB_TYPEMASK;
389 offset &= 0xFFFF;
390
391 switch (type) {
392 case B43_LCNTAB_8BIT:
393 B43_WARN_ON(value & ~0xFF);
394 b43_phy_write(dev, B43_PHY_LCN_TABLE_ADDR, offset);
395 b43_phy_write(dev, B43_PHY_LCN_TABLE_DATALO, value);
396 break;
397 case B43_LCNTAB_16BIT:
398 B43_WARN_ON(value & ~0xFFFF);
399 b43_phy_write(dev, B43_PHY_LCN_TABLE_ADDR, offset);
400 b43_phy_write(dev, B43_PHY_LCN_TABLE_DATALO, value);
401 break;
402 case B43_LCNTAB_32BIT:
403 b43_phy_write(dev, B43_PHY_LCN_TABLE_ADDR, offset);
404 b43_phy_write(dev, B43_PHY_LCN_TABLE_DATAHI, value >> 16);
405 b43_phy_write(dev, B43_PHY_LCN_TABLE_DATALO, value & 0xFFFF);
406 break;
407 default:
408 B43_WARN_ON(1);
409 }
410
411 return;
412 }
413
414 void b43_lcntab_write_bulk(struct b43_wldev *dev, u32 offset,
415 unsigned int nr_elements, const void *_data)
416 {
417 u32 type, value;
418 const u8 *data = _data;
419 unsigned int i;
420
421 type = offset & B43_LCNTAB_TYPEMASK;
422 offset &= ~B43_LCNTAB_TYPEMASK;
423 B43_WARN_ON(offset > 0xFFFF);
424
425 b43_phy_write(dev, B43_PHY_LCN_TABLE_ADDR, offset);
426
427 for (i = 0; i < nr_elements; i++) {
428 switch (type) {
429 case B43_LCNTAB_8BIT:
430 value = *data;
431 data++;
432 B43_WARN_ON(value & ~0xFF);
433 b43_phy_write(dev, B43_PHY_LCN_TABLE_DATALO, value);
434 break;
435 case B43_LCNTAB_16BIT:
436 value = *((u16 *)data);
437 data += 2;
438 B43_WARN_ON(value & ~0xFFFF);
439 b43_phy_write(dev, B43_PHY_LCN_TABLE_DATALO, value);
440 break;
441 case B43_LCNTAB_32BIT:
442 value = *((u32 *)data);
443 data += 4;
444 b43_phy_write(dev, B43_PHY_LCN_TABLE_DATAHI,
445 value >> 16);
446 b43_phy_write(dev, B43_PHY_LCN_TABLE_DATALO,
447 value & 0xFFFF);
448 break;
449 default:
450 B43_WARN_ON(1);
451 }
452 }
453 }
454
455 /**************************************************
456 * Tables ops.
457 **************************************************/
458
459 #define lcntab_upload(dev, offset, data) do { \
460 b43_lcntab_write_bulk(dev, offset, ARRAY_SIZE(data), data); \
461 } while (0)
462 static void b43_phy_lcn_upload_static_tables(struct b43_wldev *dev)
463 {
464 lcntab_upload(dev, B43_LCNTAB16(0x02, 0), b43_lcntab_0x02);
465 lcntab_upload(dev, B43_LCNTAB16(0x01, 0), b43_lcntab_0x01);
466 lcntab_upload(dev, B43_LCNTAB32(0x0b, 0), b43_lcntab_0x0b);
467 lcntab_upload(dev, B43_LCNTAB32(0x0c, 0), b43_lcntab_0x0c);
468 lcntab_upload(dev, B43_LCNTAB32(0x0d, 0), b43_lcntab_0x0d);
469 lcntab_upload(dev, B43_LCNTAB16(0x0e, 0), b43_lcntab_0x0e);
470 lcntab_upload(dev, B43_LCNTAB16(0x0f, 0), b43_lcntab_0x0f);
471 lcntab_upload(dev, B43_LCNTAB16(0x10, 0), b43_lcntab_0x10);
472 lcntab_upload(dev, B43_LCNTAB16(0x11, 0), b43_lcntab_0x11);
473 lcntab_upload(dev, B43_LCNTAB32(0x12, 0), b43_lcntab_0x12);
474 lcntab_upload(dev, B43_LCNTAB16(0x14, 0), b43_lcntab_0x14);
475 lcntab_upload(dev, B43_LCNTAB16(0x17, 0), b43_lcntab_0x17);
476 lcntab_upload(dev, B43_LCNTAB16(0x00, 0), b43_lcntab_0x00);
477 lcntab_upload(dev, B43_LCNTAB32(0x18, 0), b43_lcntab_0x18);
478 }
479
480 /* Not implemented in brcmsmac, noticed in wl in MMIO dump */
481 static void b43_phy_lcn_rewrite_tables(struct b43_wldev *dev)
482 {
483 int i;
484 u32 tmp;
485 for (i = 0; i < 128; i++) {
486 tmp = b43_lcntab_read(dev, B43_LCNTAB32(0x7, 0x240 + i));
487 b43_lcntab_write(dev, B43_LCNTAB32(0x7, 0x240 + i), tmp);
488 }
489 }
490
491 /* wlc_lcnphy_clear_papd_comptable */
492 static void b43_phy_lcn_clean_papd_comp_table(struct b43_wldev *dev)
493 {
494 u8 i;
495
496 for (i = 0; i < 0x80; i++)
497 b43_lcntab_write(dev, B43_LCNTAB32(0x18, i), 0x80000);
498 }
499
500 void b43_phy_lcn_tables_init(struct b43_wldev *dev)
501 {
502 b43_phy_lcn_upload_static_tables(dev);
503 /* TODO: various tables ops here */
504 b43_lcntab_write_bulk(dev, B43_LCNTAB16(0xf, 0),
505 ARRAY_SIZE(b43_lcntab_sw_ctl_4313_epa_rev0),
506 b43_lcntab_sw_ctl_4313_epa_rev0);
507 /* TODO: various tables ops here */
508 b43_phy_lcn_rewrite_tables(dev);
509 b43_phy_lcn_clean_papd_comp_table(dev);
510 }
This page took 0.045357 seconds and 4 git commands to generate.