Loading...
1// SPDX-License-Identifier: GPL-2.0-or-later
2/*
3
4 Broadcom B43 wireless driver
5 IEEE 802.11n LCN-PHY data tables
6
7 Copyright (c) 2011 Rafał Miłecki <zajec5@gmail.com>
8
9
10*/
11
12#include "b43.h"
13#include "tables_phy_lcn.h"
14#include "phy_common.h"
15#include "phy_lcn.h"
16
17struct b43_lcntab_tx_gain_tbl_entry {
18 u8 gm;
19 u8 pga;
20 u8 pad;
21 u8 dac;
22 u8 bb_mult;
23};
24
25/**************************************************
26 * Static tables.
27 **************************************************/
28
29static const u16 b43_lcntab_0x02[] = {
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, 0x014d, 0x014d,
40 0x014d, 0x014d, 0x014d, 0x014d,
41};
42
43static const u16 b43_lcntab_0x01[] = {
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, 0x0000, 0x0000,
54 0x0000, 0x0000, 0x0000, 0x0000,
55};
56
57static const u32 b43_lcntab_0x0b[] = {
58 0x000141f8, 0x000021f8, 0x000021fb, 0x000041fb,
59 0x0001fedb, 0x0000217b, 0x00002133, 0x000040eb,
60 0x0001fea3, 0x0000024b,
61};
62
63static const u32 b43_lcntab_0x0c[] = {
64 0x00100001, 0x00200010, 0x00300001, 0x00400010,
65 0x00500022, 0x00600122, 0x00700222, 0x00800322,
66 0x00900422, 0x00a00522, 0x00b00622, 0x00c00722,
67 0x00d00822, 0x00f00922, 0x00100a22, 0x00200b22,
68 0x00300c22, 0x00400d22, 0x00500e22, 0x00600f22,
69};
70
71static const u32 b43_lcntab_0x0d[] = {
72 0x00000000, 0x00000000, 0x10000000, 0x00000000,
73 0x20000000, 0x00000000, 0x30000000, 0x00000000,
74 0x40000000, 0x00000000, 0x50000000, 0x00000000,
75 0x60000000, 0x00000000, 0x70000000, 0x00000000,
76 0x80000000, 0x00000000, 0x90000000, 0x00000008,
77 0xa0000000, 0x00000008, 0xb0000000, 0x00000008,
78 0xc0000000, 0x00000008, 0xd0000000, 0x00000008,
79 0xe0000000, 0x00000008, 0xf0000000, 0x00000008,
80 0x00000000, 0x00000009, 0x10000000, 0x00000009,
81 0x20000000, 0x00000019, 0x30000000, 0x00000019,
82 0x40000000, 0x00000019, 0x50000000, 0x00000019,
83 0x60000000, 0x00000019, 0x70000000, 0x00000019,
84 0x80000000, 0x00000019, 0x90000000, 0x00000019,
85 0xa0000000, 0x00000019, 0xb0000000, 0x00000019,
86 0xc0000000, 0x00000019, 0xd0000000, 0x00000019,
87 0xe0000000, 0x00000019, 0xf0000000, 0x00000019,
88 0x00000000, 0x0000001a, 0x10000000, 0x0000001a,
89 0x20000000, 0x0000001a, 0x30000000, 0x0000001a,
90 0x40000000, 0x0000001a, 0x50000000, 0x00000002,
91 0x60000000, 0x00000002, 0x70000000, 0x00000002,
92 0x80000000, 0x00000002, 0x90000000, 0x00000002,
93 0xa0000000, 0x00000002, 0xb0000000, 0x00000002,
94 0xc0000000, 0x0000000a, 0xd0000000, 0x0000000a,
95 0xe0000000, 0x0000000a, 0xf0000000, 0x0000000a,
96 0x00000000, 0x0000000b, 0x10000000, 0x0000000b,
97 0x20000000, 0x0000000b, 0x30000000, 0x0000000b,
98 0x40000000, 0x0000000b, 0x50000000, 0x0000001b,
99 0x60000000, 0x0000001b, 0x70000000, 0x0000001b,
100 0x80000000, 0x0000001b, 0x90000000, 0x0000001b,
101 0xa0000000, 0x0000001b, 0xb0000000, 0x0000001b,
102 0xc0000000, 0x0000001b, 0xd0000000, 0x0000001b,
103 0xe0000000, 0x0000001b, 0xf0000000, 0x0000001b,
104 0x00000000, 0x0000001c, 0x10000000, 0x0000001c,
105 0x20000000, 0x0000001c, 0x30000000, 0x0000001c,
106 0x40000000, 0x0000001c, 0x50000000, 0x0000001c,
107 0x60000000, 0x0000001c, 0x70000000, 0x0000001c,
108 0x80000000, 0x0000001c, 0x90000000, 0x0000001c,
109};
110
111static const u16 b43_lcntab_0x0e[] = {
112 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0406,
113 0x0407, 0x0408, 0x0409, 0x040a, 0x058b, 0x058c,
114 0x058d, 0x058e, 0x058f, 0x0090, 0x0091, 0x0092,
115 0x0193, 0x0194, 0x0195, 0x0196, 0x0197, 0x0198,
116 0x0199, 0x019a, 0x019b, 0x019c, 0x019d, 0x019e,
117 0x019f, 0x01a0, 0x01a1, 0x01a2, 0x01a3, 0x01a4,
118 0x01a5, 0x0000,
119};
120
121static const u16 b43_lcntab_0x0f[] = {
122 0x000a, 0x0009, 0x0006, 0x0005, 0x000a, 0x0009,
123 0x0006, 0x0005, 0x000a, 0x0009, 0x0006, 0x0005,
124 0x000a, 0x0009, 0x0006, 0x0005, 0x000a, 0x0009,
125 0x0006, 0x0005, 0x000a, 0x0009, 0x0006, 0x0005,
126 0x000a, 0x0009, 0x0006, 0x0005, 0x000a, 0x0009,
127 0x0006, 0x0005, 0x000a, 0x0009, 0x0006, 0x0005,
128 0x000a, 0x0009, 0x0006, 0x0005, 0x000a, 0x0009,
129 0x0006, 0x0005, 0x000a, 0x0009, 0x0006, 0x0005,
130 0x000a, 0x0009, 0x0006, 0x0005, 0x000a, 0x0009,
131 0x0006, 0x0005, 0x000a, 0x0009, 0x0006, 0x0005,
132 0x000a, 0x0009, 0x0006, 0x0005,
133};
134
135static const u16 b43_lcntab_0x10[] = {
136 0x005f, 0x0036, 0x0029, 0x001f, 0x005f, 0x0036,
137 0x0029, 0x001f, 0x005f, 0x0036, 0x0029, 0x001f,
138 0x005f, 0x0036, 0x0029, 0x001f,
139};
140
141static const u16 b43_lcntab_0x11[] = {
142 0x0009, 0x000f, 0x0014, 0x0018, 0x00fe, 0x0007,
143 0x000b, 0x000f, 0x00fb, 0x00fe, 0x0001, 0x0005,
144 0x0008, 0x000b, 0x000e, 0x0011, 0x0014, 0x0017,
145 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
146 0x0000, 0x0003, 0x0006, 0x0009, 0x000c, 0x000f,
147 0x0012, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
148 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0003,
149 0x0006, 0x0009, 0x000c, 0x000f, 0x0012, 0x0015,
150 0x0018, 0x001b, 0x0000, 0x0000, 0x0000, 0x0000,
151 0x0000, 0x0000, 0x0003, 0x00eb, 0x0000, 0x0000,
152};
153
154static const u32 b43_lcntab_0x12[] = {
155 0x00000000, 0x00000000, 0x00000000, 0x00000000,
156 0x00000000, 0x00000000, 0x00000000, 0x00000000,
157 0x00000004, 0x00000000, 0x00000004, 0x00000008,
158 0x00000001, 0x00000005, 0x00000009, 0x0000000d,
159 0x0000004d, 0x0000008d, 0x0000000d, 0x0000004d,
160 0x0000008d, 0x000000cd, 0x0000004f, 0x0000008f,
161 0x000000cf, 0x000000d3, 0x00000113, 0x00000513,
162 0x00000913, 0x00000953, 0x00000d53, 0x00001153,
163 0x00001193, 0x00005193, 0x00009193, 0x0000d193,
164 0x00011193, 0x00000000, 0x00000000, 0x00000000,
165 0x00000000, 0x00000000, 0x00000000, 0x00000004,
166 0x00000000, 0x00000004, 0x00000008, 0x00000001,
167 0x00000005, 0x00000009, 0x0000000d, 0x0000004d,
168 0x0000008d, 0x0000000d, 0x0000004d, 0x0000008d,
169 0x000000cd, 0x0000004f, 0x0000008f, 0x000000cf,
170 0x000000d3, 0x00000113, 0x00000513, 0x00000913,
171 0x00000953, 0x00000d53, 0x00001153, 0x00005153,
172 0x00009153, 0x0000d153, 0x00011153, 0x00015153,
173 0x00019153, 0x0001d153, 0x00000000, 0x00000000,
174 0x00000000, 0x00000000, 0x00000000, 0x00000000,
175 0x00000000, 0x00000000, 0x00000000, 0x00000000,
176 0x00000000, 0x00000000, 0x00000000, 0x00000000,
177 0x00000000, 0x00000000, 0x00000000, 0x00000000,
178 0x00000000, 0x00000000, 0x00000000, 0x00000000,
179};
180
181static const u16 b43_lcntab_0x14[] = {
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 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
187 0x0002, 0x0003, 0x0001, 0x0003, 0x0002, 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, 0x0001, 0x0001,
197 0x0001, 0x0001, 0x0001, 0x0001, 0x0002, 0x0003,
198 0x0001, 0x0003, 0x0002, 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, 0x0001, 0x0001, 0x0001, 0x0001,
203 0x0001, 0x0001,
204};
205
206static const u16 b43_lcntab_0x17[] = {
207 0x001a, 0x0034, 0x004e, 0x0068, 0x009c, 0x00d0,
208 0x00ea, 0x0104, 0x0034, 0x0068, 0x009c, 0x00d0,
209 0x0138, 0x01a0, 0x01d4, 0x0208, 0x004e, 0x009c,
210 0x00ea, 0x0138, 0x01d4, 0x0270, 0x02be, 0x030c,
211 0x0068, 0x00d0, 0x0138, 0x01a0, 0x0270, 0x0340,
212 0x03a8, 0x0410, 0x0018, 0x009c, 0x00d0, 0x0104,
213 0x00ea, 0x0138, 0x0186, 0x00d0, 0x0104, 0x0104,
214 0x0138, 0x016c, 0x016c, 0x01a0, 0x0138, 0x0186,
215 0x0186, 0x01d4, 0x0222, 0x0222, 0x0270, 0x0104,
216 0x0138, 0x016c, 0x0138, 0x016c, 0x01a0, 0x01d4,
217 0x01a0, 0x01d4, 0x0208, 0x0208, 0x023c, 0x0186,
218 0x01d4, 0x0222, 0x01d4, 0x0222, 0x0270, 0x02be,
219 0x0270, 0x02be, 0x030c, 0x030c, 0x035a, 0x0036,
220 0x006c, 0x00a2, 0x00d8, 0x0144, 0x01b0, 0x01e6,
221 0x021c, 0x006c, 0x00d8, 0x0144, 0x01b0, 0x0288,
222 0x0360, 0x03cc, 0x0438, 0x00a2, 0x0144, 0x01e6,
223 0x0288, 0x03cc, 0x0510, 0x05b2, 0x0654, 0x00d8,
224 0x01b0, 0x0288, 0x0360, 0x0510, 0x06c0, 0x0798,
225 0x0870, 0x0018, 0x0144, 0x01b0, 0x021c, 0x01e6,
226 0x0288, 0x032a, 0x01b0, 0x021c, 0x021c, 0x0288,
227 0x02f4, 0x02f4, 0x0360, 0x0288, 0x032a, 0x032a,
228 0x03cc, 0x046e, 0x046e, 0x0510, 0x021c, 0x0288,
229 0x02f4, 0x0288, 0x02f4, 0x0360, 0x03cc, 0x0360,
230 0x03cc, 0x0438, 0x0438, 0x04a4, 0x032a, 0x03cc,
231 0x046e, 0x03cc, 0x046e, 0x0510, 0x05b2, 0x0510,
232 0x05b2, 0x0654, 0x0654, 0x06f6,
233};
234
235static const u16 b43_lcntab_0x00[] = {
236 0x0200, 0x0300, 0x0400, 0x0600, 0x0800, 0x0b00,
237 0x1000, 0x1001, 0x1002, 0x1003, 0x1004, 0x1005,
238 0x1006, 0x1007, 0x1707, 0x2007, 0x2d07, 0x4007,
239 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
240 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
241 0x0000, 0x0000, 0x0200, 0x0300, 0x0400, 0x0600,
242 0x0800, 0x0b00, 0x1000, 0x1001, 0x1002, 0x1003,
243 0x1004, 0x1005, 0x1006, 0x1007, 0x1707, 0x2007,
244 0x2d07, 0x4007, 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, 0x0000, 0x0000, 0x0000,
250 0x0000, 0x0000, 0x0000, 0x4000, 0x0000, 0x0000,
251 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
252 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
253 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
254};
255
256static const u32 b43_lcntab_0x18[] = {
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 0x00080000, 0x00080000, 0x00080000, 0x00080000,
297};
298
299/**************************************************
300 * TX gain.
301 **************************************************/
302
303static const struct b43_lcntab_tx_gain_tbl_entry
304 b43_lcntab_tx_gain_tbl_2ghz_ext_pa_rev0[B43_LCNTAB_TX_GAIN_SIZE] = {
305 { 0x03, 0x00, 0x1f, 0x0, 0x48 },
306 { 0x03, 0x00, 0x1f, 0x0, 0x46 },
307 { 0x03, 0x00, 0x1f, 0x0, 0x44 },
308 { 0x03, 0x00, 0x1e, 0x0, 0x43 },
309 { 0x03, 0x00, 0x1d, 0x0, 0x44 },
310 { 0x03, 0x00, 0x1c, 0x0, 0x44 },
311 { 0x03, 0x00, 0x1b, 0x0, 0x45 },
312 { 0x03, 0x00, 0x1a, 0x0, 0x46 },
313 { 0x03, 0x00, 0x19, 0x0, 0x46 },
314 { 0x03, 0x00, 0x18, 0x0, 0x47 },
315 { 0x03, 0x00, 0x17, 0x0, 0x48 },
316 { 0x03, 0x00, 0x17, 0x0, 0x46 },
317 { 0x03, 0x00, 0x16, 0x0, 0x47 },
318 { 0x03, 0x00, 0x15, 0x0, 0x48 },
319 { 0x03, 0x00, 0x15, 0x0, 0x46 },
320 { 0x03, 0x00, 0x15, 0x0, 0x44 },
321 { 0x03, 0x00, 0x15, 0x0, 0x42 },
322 { 0x03, 0x00, 0x15, 0x0, 0x40 },
323 { 0x03, 0x00, 0x15, 0x0, 0x3f },
324 { 0x03, 0x00, 0x14, 0x0, 0x40 },
325 { 0x03, 0x00, 0x13, 0x0, 0x41 },
326 { 0x03, 0x00, 0x13, 0x0, 0x40 },
327 { 0x03, 0x00, 0x12, 0x0, 0x41 },
328 { 0x03, 0x00, 0x12, 0x0, 0x40 },
329 { 0x03, 0x00, 0x11, 0x0, 0x41 },
330 { 0x03, 0x00, 0x11, 0x0, 0x40 },
331 { 0x03, 0x00, 0x10, 0x0, 0x41 },
332 { 0x03, 0x00, 0x10, 0x0, 0x40 },
333 { 0x03, 0x00, 0x10, 0x0, 0x3e },
334 { 0x03, 0x00, 0x10, 0x0, 0x3c },
335 { 0x03, 0x00, 0x10, 0x0, 0x3a },
336 { 0x03, 0x00, 0x0f, 0x0, 0x3d },
337 { 0x03, 0x00, 0x0f, 0x0, 0x3b },
338 { 0x03, 0x00, 0x0e, 0x0, 0x3d },
339 { 0x03, 0x00, 0x0e, 0x0, 0x3c },
340 { 0x03, 0x00, 0x0e, 0x0, 0x3a },
341 { 0x03, 0x00, 0x0d, 0x0, 0x3c },
342 { 0x03, 0x00, 0x0d, 0x0, 0x3b },
343 { 0x03, 0x00, 0x0c, 0x0, 0x3e },
344 { 0x03, 0x00, 0x0c, 0x0, 0x3c },
345 { 0x03, 0x00, 0x0c, 0x0, 0x3a },
346 { 0x03, 0x00, 0x0b, 0x0, 0x3e },
347 { 0x03, 0x00, 0x0b, 0x0, 0x3c },
348 { 0x03, 0x00, 0x0b, 0x0, 0x3b },
349 { 0x03, 0x00, 0x0b, 0x0, 0x39 },
350 { 0x03, 0x00, 0x0a, 0x0, 0x3d },
351 { 0x03, 0x00, 0x0a, 0x0, 0x3b },
352 { 0x03, 0x00, 0x0a, 0x0, 0x39 },
353 { 0x03, 0x00, 0x09, 0x0, 0x3e },
354 { 0x03, 0x00, 0x09, 0x0, 0x3c },
355 { 0x03, 0x00, 0x09, 0x0, 0x3a },
356 { 0x03, 0x00, 0x09, 0x0, 0x39 },
357 { 0x03, 0x00, 0x08, 0x0, 0x3e },
358 { 0x03, 0x00, 0x08, 0x0, 0x3c },
359 { 0x03, 0x00, 0x08, 0x0, 0x3a },
360 { 0x03, 0x00, 0x08, 0x0, 0x39 },
361 { 0x03, 0x00, 0x08, 0x0, 0x37 },
362 { 0x03, 0x00, 0x07, 0x0, 0x3d },
363 { 0x03, 0x00, 0x07, 0x0, 0x3c },
364 { 0x03, 0x00, 0x07, 0x0, 0x3a },
365 { 0x03, 0x00, 0x07, 0x0, 0x38 },
366 { 0x03, 0x00, 0x07, 0x0, 0x37 },
367 { 0x03, 0x00, 0x06, 0x0, 0x3e },
368 { 0x03, 0x00, 0x06, 0x0, 0x3c },
369 { 0x03, 0x00, 0x06, 0x0, 0x3a },
370 { 0x03, 0x00, 0x06, 0x0, 0x39 },
371 { 0x03, 0x00, 0x06, 0x0, 0x37 },
372 { 0x03, 0x00, 0x06, 0x0, 0x36 },
373 { 0x03, 0x00, 0x06, 0x0, 0x34 },
374 { 0x03, 0x00, 0x05, 0x0, 0x3d },
375 { 0x03, 0x00, 0x05, 0x0, 0x3b },
376 { 0x03, 0x00, 0x05, 0x0, 0x39 },
377 { 0x03, 0x00, 0x05, 0x0, 0x38 },
378 { 0x03, 0x00, 0x05, 0x0, 0x36 },
379 { 0x03, 0x00, 0x05, 0x0, 0x35 },
380 { 0x03, 0x00, 0x05, 0x0, 0x33 },
381 { 0x03, 0x00, 0x04, 0x0, 0x3e },
382 { 0x03, 0x00, 0x04, 0x0, 0x3c },
383 { 0x03, 0x00, 0x04, 0x0, 0x3a },
384 { 0x03, 0x00, 0x04, 0x0, 0x39 },
385 { 0x03, 0x00, 0x04, 0x0, 0x37 },
386 { 0x03, 0x00, 0x04, 0x0, 0x36 },
387 { 0x03, 0x00, 0x04, 0x0, 0x34 },
388 { 0x03, 0x00, 0x04, 0x0, 0x33 },
389 { 0x03, 0x00, 0x04, 0x0, 0x31 },
390 { 0x03, 0x00, 0x04, 0x0, 0x30 },
391 { 0x03, 0x00, 0x04, 0x0, 0x2e },
392 { 0x03, 0x00, 0x03, 0x0, 0x3c },
393 { 0x03, 0x00, 0x03, 0x0, 0x3a },
394 { 0x03, 0x00, 0x03, 0x0, 0x39 },
395 { 0x03, 0x00, 0x03, 0x0, 0x37 },
396 { 0x03, 0x00, 0x03, 0x0, 0x36 },
397 { 0x03, 0x00, 0x03, 0x0, 0x34 },
398 { 0x03, 0x00, 0x03, 0x0, 0x33 },
399 { 0x03, 0x00, 0x03, 0x0, 0x31 },
400 { 0x03, 0x00, 0x03, 0x0, 0x30 },
401 { 0x03, 0x00, 0x03, 0x0, 0x2e },
402 { 0x03, 0x00, 0x03, 0x0, 0x2d },
403 { 0x03, 0x00, 0x03, 0x0, 0x2c },
404 { 0x03, 0x00, 0x03, 0x0, 0x2b },
405 { 0x03, 0x00, 0x03, 0x0, 0x29 },
406 { 0x03, 0x00, 0x02, 0x0, 0x3d },
407 { 0x03, 0x00, 0x02, 0x0, 0x3b },
408 { 0x03, 0x00, 0x02, 0x0, 0x39 },
409 { 0x03, 0x00, 0x02, 0x0, 0x38 },
410 { 0x03, 0x00, 0x02, 0x0, 0x36 },
411 { 0x03, 0x00, 0x02, 0x0, 0x35 },
412 { 0x03, 0x00, 0x02, 0x0, 0x33 },
413 { 0x03, 0x00, 0x02, 0x0, 0x32 },
414 { 0x03, 0x00, 0x02, 0x0, 0x30 },
415 { 0x03, 0x00, 0x02, 0x0, 0x2f },
416 { 0x03, 0x00, 0x02, 0x0, 0x2e },
417 { 0x03, 0x00, 0x02, 0x0, 0x2c },
418 { 0x03, 0x00, 0x02, 0x0, 0x2b },
419 { 0x03, 0x00, 0x02, 0x0, 0x2a },
420 { 0x03, 0x00, 0x02, 0x0, 0x29 },
421 { 0x03, 0x00, 0x02, 0x0, 0x27 },
422 { 0x03, 0x00, 0x02, 0x0, 0x26 },
423 { 0x03, 0x00, 0x02, 0x0, 0x25 },
424 { 0x03, 0x00, 0x02, 0x0, 0x24 },
425 { 0x03, 0x00, 0x02, 0x0, 0x23 },
426 { 0x03, 0x00, 0x02, 0x0, 0x22 },
427 { 0x03, 0x00, 0x02, 0x0, 0x21 },
428 { 0x03, 0x00, 0x02, 0x0, 0x20 },
429 { 0x03, 0x00, 0x01, 0x0, 0x3f },
430 { 0x03, 0x00, 0x01, 0x0, 0x3d },
431 { 0x03, 0x00, 0x01, 0x0, 0x3b },
432 { 0x03, 0x00, 0x01, 0x0, 0x39 },
433};
434
435/**************************************************
436 * SW control.
437 **************************************************/
438
439static const u16 b43_lcntab_sw_ctl_4313_epa_rev0[] = {
440 0x0002, 0x0008, 0x0004, 0x0001, 0x0002, 0x0008,
441 0x0004, 0x0001, 0x0002, 0x0008, 0x0004, 0x0001,
442 0x0002, 0x0008, 0x0004, 0x0001, 0x0002, 0x0008,
443 0x0004, 0x0001, 0x0002, 0x0008, 0x0004, 0x0001,
444 0x0002, 0x0008, 0x0004, 0x0001, 0x0002, 0x0008,
445 0x0004, 0x0001, 0x0002, 0x0008, 0x0004, 0x0001,
446 0x0002, 0x0008, 0x0004, 0x0001, 0x0002, 0x0008,
447 0x0004, 0x0001, 0x0002, 0x0008, 0x0004, 0x0001,
448 0x0002, 0x0008, 0x0004, 0x0001, 0x0002, 0x0008,
449 0x0004, 0x0001, 0x0002, 0x0008, 0x0004, 0x0001,
450 0x0002, 0x0008, 0x0004, 0x0001,
451};
452
453/**************************************************
454 * R/W ops.
455 **************************************************/
456
457u32 b43_lcntab_read(struct b43_wldev *dev, u32 offset)
458{
459 u32 type, value;
460
461 type = offset & B43_LCNTAB_TYPEMASK;
462 offset &= ~B43_LCNTAB_TYPEMASK;
463 B43_WARN_ON(offset > 0xFFFF);
464
465 switch (type) {
466 case B43_LCNTAB_8BIT:
467 b43_phy_write(dev, B43_PHY_LCN_TABLE_ADDR, offset);
468 value = b43_phy_read(dev, B43_PHY_LCN_TABLE_DATALO) & 0xFF;
469 break;
470 case B43_LCNTAB_16BIT:
471 b43_phy_write(dev, B43_PHY_LCN_TABLE_ADDR, offset);
472 value = b43_phy_read(dev, B43_PHY_LCN_TABLE_DATALO);
473 break;
474 case B43_LCNTAB_32BIT:
475 b43_phy_write(dev, B43_PHY_LCN_TABLE_ADDR, offset);
476 value = b43_phy_read(dev, B43_PHY_LCN_TABLE_DATALO);
477 value |= (b43_phy_read(dev, B43_PHY_LCN_TABLE_DATAHI) << 16);
478 break;
479 default:
480 B43_WARN_ON(1);
481 value = 0;
482 }
483
484 return value;
485}
486
487void b43_lcntab_read_bulk(struct b43_wldev *dev, u32 offset,
488 unsigned int nr_elements, void *_data)
489{
490 u32 type;
491 u8 *data = _data;
492 unsigned int i;
493
494 type = offset & B43_LCNTAB_TYPEMASK;
495 offset &= ~B43_LCNTAB_TYPEMASK;
496 B43_WARN_ON(offset > 0xFFFF);
497
498 b43_phy_write(dev, B43_PHY_LCN_TABLE_ADDR, offset);
499
500 for (i = 0; i < nr_elements; i++) {
501 switch (type) {
502 case B43_LCNTAB_8BIT:
503 *data = b43_phy_read(dev,
504 B43_PHY_LCN_TABLE_DATALO) & 0xFF;
505 data++;
506 break;
507 case B43_LCNTAB_16BIT:
508 *((u16 *)data) = b43_phy_read(dev,
509 B43_PHY_LCN_TABLE_DATALO);
510 data += 2;
511 break;
512 case B43_LCNTAB_32BIT:
513 *((u32 *)data) = b43_phy_read(dev,
514 B43_PHY_LCN_TABLE_DATALO);
515 *((u32 *)data) |= (b43_phy_read(dev,
516 B43_PHY_LCN_TABLE_DATAHI) << 16);
517 data += 4;
518 break;
519 default:
520 B43_WARN_ON(1);
521 }
522 }
523}
524
525void b43_lcntab_write(struct b43_wldev *dev, u32 offset, u32 value)
526{
527 u32 type;
528
529 type = offset & B43_LCNTAB_TYPEMASK;
530 offset &= 0xFFFF;
531
532 switch (type) {
533 case B43_LCNTAB_8BIT:
534 B43_WARN_ON(value & ~0xFF);
535 b43_phy_write(dev, B43_PHY_LCN_TABLE_ADDR, offset);
536 b43_phy_write(dev, B43_PHY_LCN_TABLE_DATALO, value);
537 break;
538 case B43_LCNTAB_16BIT:
539 B43_WARN_ON(value & ~0xFFFF);
540 b43_phy_write(dev, B43_PHY_LCN_TABLE_ADDR, offset);
541 b43_phy_write(dev, B43_PHY_LCN_TABLE_DATALO, value);
542 break;
543 case B43_LCNTAB_32BIT:
544 b43_phy_write(dev, B43_PHY_LCN_TABLE_ADDR, offset);
545 b43_phy_write(dev, B43_PHY_LCN_TABLE_DATAHI, value >> 16);
546 b43_phy_write(dev, B43_PHY_LCN_TABLE_DATALO, value & 0xFFFF);
547 break;
548 default:
549 B43_WARN_ON(1);
550 }
551
552 return;
553}
554
555void b43_lcntab_write_bulk(struct b43_wldev *dev, u32 offset,
556 unsigned int nr_elements, const void *_data)
557{
558 u32 type, value;
559 const u8 *data = _data;
560 unsigned int i;
561
562 type = offset & B43_LCNTAB_TYPEMASK;
563 offset &= ~B43_LCNTAB_TYPEMASK;
564 B43_WARN_ON(offset > 0xFFFF);
565
566 b43_phy_write(dev, B43_PHY_LCN_TABLE_ADDR, offset);
567
568 for (i = 0; i < nr_elements; i++) {
569 switch (type) {
570 case B43_LCNTAB_8BIT:
571 value = *data;
572 data++;
573 B43_WARN_ON(value & ~0xFF);
574 b43_phy_write(dev, B43_PHY_LCN_TABLE_DATALO, value);
575 break;
576 case B43_LCNTAB_16BIT:
577 value = *((u16 *)data);
578 data += 2;
579 B43_WARN_ON(value & ~0xFFFF);
580 b43_phy_write(dev, B43_PHY_LCN_TABLE_DATALO, value);
581 break;
582 case B43_LCNTAB_32BIT:
583 value = *((u32 *)data);
584 data += 4;
585 b43_phy_write(dev, B43_PHY_LCN_TABLE_DATAHI,
586 value >> 16);
587 b43_phy_write(dev, B43_PHY_LCN_TABLE_DATALO,
588 value & 0xFFFF);
589 break;
590 default:
591 B43_WARN_ON(1);
592 }
593 }
594}
595
596/**************************************************
597 * Tables ops.
598 **************************************************/
599
600#define lcntab_upload(dev, offset, data) do { \
601 b43_lcntab_write_bulk(dev, offset, ARRAY_SIZE(data), data); \
602 } while (0)
603static void b43_phy_lcn_upload_static_tables(struct b43_wldev *dev)
604{
605 lcntab_upload(dev, B43_LCNTAB16(0x02, 0), b43_lcntab_0x02);
606 lcntab_upload(dev, B43_LCNTAB16(0x01, 0), b43_lcntab_0x01);
607 lcntab_upload(dev, B43_LCNTAB32(0x0b, 0), b43_lcntab_0x0b);
608 lcntab_upload(dev, B43_LCNTAB32(0x0c, 0), b43_lcntab_0x0c);
609 lcntab_upload(dev, B43_LCNTAB32(0x0d, 0), b43_lcntab_0x0d);
610 lcntab_upload(dev, B43_LCNTAB16(0x0e, 0), b43_lcntab_0x0e);
611 lcntab_upload(dev, B43_LCNTAB16(0x0f, 0), b43_lcntab_0x0f);
612 lcntab_upload(dev, B43_LCNTAB16(0x10, 0), b43_lcntab_0x10);
613 lcntab_upload(dev, B43_LCNTAB16(0x11, 0), b43_lcntab_0x11);
614 lcntab_upload(dev, B43_LCNTAB32(0x12, 0), b43_lcntab_0x12);
615 lcntab_upload(dev, B43_LCNTAB16(0x14, 0), b43_lcntab_0x14);
616 lcntab_upload(dev, B43_LCNTAB16(0x17, 0), b43_lcntab_0x17);
617 lcntab_upload(dev, B43_LCNTAB16(0x00, 0), b43_lcntab_0x00);
618 lcntab_upload(dev, B43_LCNTAB32(0x18, 0), b43_lcntab_0x18);
619}
620
621static void b43_phy_lcn_load_tx_gain_tab(struct b43_wldev *dev,
622 const struct b43_lcntab_tx_gain_tbl_entry *gain_table)
623{
624 u32 i;
625 u32 val;
626
627 u16 pa_gain = 0x70;
628 if (dev->dev->bus_sprom->boardflags_lo & B43_BFL_FEM)
629 pa_gain = 0x10;
630
631 for (i = 0; i < B43_LCNTAB_TX_GAIN_SIZE; i++) {
632 val = ((pa_gain << 24) |
633 (gain_table[i].pad << 16) |
634 (gain_table[i].pga << 8) |
635 gain_table[i].gm);
636 b43_lcntab_write(dev, B43_LCNTAB32(0x7, 0xc0 + i), val);
637
638 /* brcmsmac doesn't maskset, we follow newer wl here */
639 val = b43_lcntab_read(dev, B43_LCNTAB32(0x7, 0x140 + i));
640 val &= 0x000fffff;
641 val |= ((gain_table[i].dac << 28) |
642 (gain_table[i].bb_mult << 20));
643 b43_lcntab_write(dev, B43_LCNTAB32(0x7, 0x140 + i), val);
644 }
645}
646
647/* wlc_lcnphy_load_rfpower */
648static void b43_phy_lcn_load_rfpower(struct b43_wldev *dev)
649{
650 u32 bbmult, rfgain;
651 u8 i;
652
653 for (i = 0; i < 128; i++) {
654 bbmult = b43_lcntab_read(dev, B43_LCNTAB32(0x7, 0x140 + i));
655 bbmult >>= 20;
656 rfgain = b43_lcntab_read(dev, B43_LCNTAB32(0x7, 0xc0 + i));
657
658 /* TODO: calculate value for 0x240 + i table offset
659 * b43_lcntab_write(dev, B43_LCNTAB32(0x7, 0x240 + i), val);
660 */
661 }
662}
663
664/* Not implemented in brcmsmac, noticed in wl in MMIO dump */
665static void b43_phy_lcn_rewrite_rfpower_table(struct b43_wldev *dev)
666{
667 int i;
668 u32 tmp;
669 for (i = 0; i < 128; i++) {
670 tmp = b43_lcntab_read(dev, B43_LCNTAB32(0x7, 0x240 + i));
671 b43_lcntab_write(dev, B43_LCNTAB32(0x7, 0x240 + i), tmp);
672 }
673}
674
675/* wlc_lcnphy_clear_papd_comptable */
676static void b43_phy_lcn_clean_papd_comp_table(struct b43_wldev *dev)
677{
678 u8 i;
679
680 for (i = 0; i < 0x80; i++)
681 b43_lcntab_write(dev, B43_LCNTAB32(0x18, i), 0x80000);
682}
683
684/* wlc_lcnphy_tbl_init */
685void b43_phy_lcn_tables_init(struct b43_wldev *dev)
686{
687 struct ssb_sprom *sprom = dev->dev->bus_sprom;
688
689 b43_phy_lcn_upload_static_tables(dev);
690
691 if (b43_current_band(dev->wl) == NL80211_BAND_2GHZ) {
692 if (sprom->boardflags_lo & B43_BFL_FEM)
693 b43_phy_lcn_load_tx_gain_tab(dev,
694 b43_lcntab_tx_gain_tbl_2ghz_ext_pa_rev0);
695 else
696 b43err(dev->wl,
697 "TX gain table unknown for this card\n");
698 }
699
700 if (sprom->boardflags_lo & B43_BFL_FEM &&
701 !(sprom->boardflags_hi & B43_BFH_FEM_BT))
702 b43_lcntab_write_bulk(dev, B43_LCNTAB16(0xf, 0),
703 ARRAY_SIZE(b43_lcntab_sw_ctl_4313_epa_rev0),
704 b43_lcntab_sw_ctl_4313_epa_rev0);
705 else
706 b43err(dev->wl, "SW ctl table is unknown for this card\n");
707
708 b43_phy_lcn_load_rfpower(dev);
709 b43_phy_lcn_rewrite_rfpower_table(dev);
710 b43_phy_lcn_clean_papd_comp_table(dev);
711}
1/*
2
3 Broadcom B43 wireless driver
4 IEEE 802.11n LCN-PHY data tables
5
6 Copyright (c) 2011 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 "tables_phy_lcn.h"
27#include "phy_common.h"
28#include "phy_lcn.h"
29
30struct b43_lcntab_tx_gain_tbl_entry {
31 u8 gm;
32 u8 pga;
33 u8 pad;
34 u8 dac;
35 u8 bb_mult;
36};
37
38/**************************************************
39 * Static tables.
40 **************************************************/
41
42static const u16 b43_lcntab_0x02[] = {
43 0x014d, 0x014d, 0x014d, 0x014d, 0x014d, 0x014d,
44 0x014d, 0x014d, 0x014d, 0x014d, 0x014d, 0x014d,
45 0x014d, 0x014d, 0x014d, 0x014d, 0x014d, 0x014d,
46 0x014d, 0x014d, 0x014d, 0x014d, 0x014d, 0x014d,
47 0x014d, 0x014d, 0x014d, 0x014d, 0x014d, 0x014d,
48 0x014d, 0x014d, 0x014d, 0x014d, 0x014d, 0x014d,
49 0x014d, 0x014d, 0x014d, 0x014d, 0x014d, 0x014d,
50 0x014d, 0x014d, 0x014d, 0x014d, 0x014d, 0x014d,
51 0x014d, 0x014d, 0x014d, 0x014d, 0x014d, 0x014d,
52 0x014d, 0x014d, 0x014d, 0x014d, 0x014d, 0x014d,
53 0x014d, 0x014d, 0x014d, 0x014d,
54};
55
56static const u16 b43_lcntab_0x01[] = {
57 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
58 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
59 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
60 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
61 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
62 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
63 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
64 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
65 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
66 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
67 0x0000, 0x0000, 0x0000, 0x0000,
68};
69
70static const u32 b43_lcntab_0x0b[] = {
71 0x000141f8, 0x000021f8, 0x000021fb, 0x000041fb,
72 0x0001fedb, 0x0000217b, 0x00002133, 0x000040eb,
73 0x0001fea3, 0x0000024b,
74};
75
76static const u32 b43_lcntab_0x0c[] = {
77 0x00100001, 0x00200010, 0x00300001, 0x00400010,
78 0x00500022, 0x00600122, 0x00700222, 0x00800322,
79 0x00900422, 0x00a00522, 0x00b00622, 0x00c00722,
80 0x00d00822, 0x00f00922, 0x00100a22, 0x00200b22,
81 0x00300c22, 0x00400d22, 0x00500e22, 0x00600f22,
82};
83
84static const u32 b43_lcntab_0x0d[] = {
85 0x00000000, 0x00000000, 0x10000000, 0x00000000,
86 0x20000000, 0x00000000, 0x30000000, 0x00000000,
87 0x40000000, 0x00000000, 0x50000000, 0x00000000,
88 0x60000000, 0x00000000, 0x70000000, 0x00000000,
89 0x80000000, 0x00000000, 0x90000000, 0x00000008,
90 0xa0000000, 0x00000008, 0xb0000000, 0x00000008,
91 0xc0000000, 0x00000008, 0xd0000000, 0x00000008,
92 0xe0000000, 0x00000008, 0xf0000000, 0x00000008,
93 0x00000000, 0x00000009, 0x10000000, 0x00000009,
94 0x20000000, 0x00000019, 0x30000000, 0x00000019,
95 0x40000000, 0x00000019, 0x50000000, 0x00000019,
96 0x60000000, 0x00000019, 0x70000000, 0x00000019,
97 0x80000000, 0x00000019, 0x90000000, 0x00000019,
98 0xa0000000, 0x00000019, 0xb0000000, 0x00000019,
99 0xc0000000, 0x00000019, 0xd0000000, 0x00000019,
100 0xe0000000, 0x00000019, 0xf0000000, 0x00000019,
101 0x00000000, 0x0000001a, 0x10000000, 0x0000001a,
102 0x20000000, 0x0000001a, 0x30000000, 0x0000001a,
103 0x40000000, 0x0000001a, 0x50000000, 0x00000002,
104 0x60000000, 0x00000002, 0x70000000, 0x00000002,
105 0x80000000, 0x00000002, 0x90000000, 0x00000002,
106 0xa0000000, 0x00000002, 0xb0000000, 0x00000002,
107 0xc0000000, 0x0000000a, 0xd0000000, 0x0000000a,
108 0xe0000000, 0x0000000a, 0xf0000000, 0x0000000a,
109 0x00000000, 0x0000000b, 0x10000000, 0x0000000b,
110 0x20000000, 0x0000000b, 0x30000000, 0x0000000b,
111 0x40000000, 0x0000000b, 0x50000000, 0x0000001b,
112 0x60000000, 0x0000001b, 0x70000000, 0x0000001b,
113 0x80000000, 0x0000001b, 0x90000000, 0x0000001b,
114 0xa0000000, 0x0000001b, 0xb0000000, 0x0000001b,
115 0xc0000000, 0x0000001b, 0xd0000000, 0x0000001b,
116 0xe0000000, 0x0000001b, 0xf0000000, 0x0000001b,
117 0x00000000, 0x0000001c, 0x10000000, 0x0000001c,
118 0x20000000, 0x0000001c, 0x30000000, 0x0000001c,
119 0x40000000, 0x0000001c, 0x50000000, 0x0000001c,
120 0x60000000, 0x0000001c, 0x70000000, 0x0000001c,
121 0x80000000, 0x0000001c, 0x90000000, 0x0000001c,
122};
123
124static const u16 b43_lcntab_0x0e[] = {
125 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0406,
126 0x0407, 0x0408, 0x0409, 0x040a, 0x058b, 0x058c,
127 0x058d, 0x058e, 0x058f, 0x0090, 0x0091, 0x0092,
128 0x0193, 0x0194, 0x0195, 0x0196, 0x0197, 0x0198,
129 0x0199, 0x019a, 0x019b, 0x019c, 0x019d, 0x019e,
130 0x019f, 0x01a0, 0x01a1, 0x01a2, 0x01a3, 0x01a4,
131 0x01a5, 0x0000,
132};
133
134static const u16 b43_lcntab_0x0f[] = {
135 0x000a, 0x0009, 0x0006, 0x0005, 0x000a, 0x0009,
136 0x0006, 0x0005, 0x000a, 0x0009, 0x0006, 0x0005,
137 0x000a, 0x0009, 0x0006, 0x0005, 0x000a, 0x0009,
138 0x0006, 0x0005, 0x000a, 0x0009, 0x0006, 0x0005,
139 0x000a, 0x0009, 0x0006, 0x0005, 0x000a, 0x0009,
140 0x0006, 0x0005, 0x000a, 0x0009, 0x0006, 0x0005,
141 0x000a, 0x0009, 0x0006, 0x0005, 0x000a, 0x0009,
142 0x0006, 0x0005, 0x000a, 0x0009, 0x0006, 0x0005,
143 0x000a, 0x0009, 0x0006, 0x0005, 0x000a, 0x0009,
144 0x0006, 0x0005, 0x000a, 0x0009, 0x0006, 0x0005,
145 0x000a, 0x0009, 0x0006, 0x0005,
146};
147
148static const u16 b43_lcntab_0x10[] = {
149 0x005f, 0x0036, 0x0029, 0x001f, 0x005f, 0x0036,
150 0x0029, 0x001f, 0x005f, 0x0036, 0x0029, 0x001f,
151 0x005f, 0x0036, 0x0029, 0x001f,
152};
153
154static const u16 b43_lcntab_0x11[] = {
155 0x0009, 0x000f, 0x0014, 0x0018, 0x00fe, 0x0007,
156 0x000b, 0x000f, 0x00fb, 0x00fe, 0x0001, 0x0005,
157 0x0008, 0x000b, 0x000e, 0x0011, 0x0014, 0x0017,
158 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
159 0x0000, 0x0003, 0x0006, 0x0009, 0x000c, 0x000f,
160 0x0012, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
161 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0003,
162 0x0006, 0x0009, 0x000c, 0x000f, 0x0012, 0x0015,
163 0x0018, 0x001b, 0x0000, 0x0000, 0x0000, 0x0000,
164 0x0000, 0x0000, 0x0003, 0x00eb, 0x0000, 0x0000,
165};
166
167static const u32 b43_lcntab_0x12[] = {
168 0x00000000, 0x00000000, 0x00000000, 0x00000000,
169 0x00000000, 0x00000000, 0x00000000, 0x00000000,
170 0x00000004, 0x00000000, 0x00000004, 0x00000008,
171 0x00000001, 0x00000005, 0x00000009, 0x0000000d,
172 0x0000004d, 0x0000008d, 0x0000000d, 0x0000004d,
173 0x0000008d, 0x000000cd, 0x0000004f, 0x0000008f,
174 0x000000cf, 0x000000d3, 0x00000113, 0x00000513,
175 0x00000913, 0x00000953, 0x00000d53, 0x00001153,
176 0x00001193, 0x00005193, 0x00009193, 0x0000d193,
177 0x00011193, 0x00000000, 0x00000000, 0x00000000,
178 0x00000000, 0x00000000, 0x00000000, 0x00000004,
179 0x00000000, 0x00000004, 0x00000008, 0x00000001,
180 0x00000005, 0x00000009, 0x0000000d, 0x0000004d,
181 0x0000008d, 0x0000000d, 0x0000004d, 0x0000008d,
182 0x000000cd, 0x0000004f, 0x0000008f, 0x000000cf,
183 0x000000d3, 0x00000113, 0x00000513, 0x00000913,
184 0x00000953, 0x00000d53, 0x00001153, 0x00005153,
185 0x00009153, 0x0000d153, 0x00011153, 0x00015153,
186 0x00019153, 0x0001d153, 0x00000000, 0x00000000,
187 0x00000000, 0x00000000, 0x00000000, 0x00000000,
188 0x00000000, 0x00000000, 0x00000000, 0x00000000,
189 0x00000000, 0x00000000, 0x00000000, 0x00000000,
190 0x00000000, 0x00000000, 0x00000000, 0x00000000,
191 0x00000000, 0x00000000, 0x00000000, 0x00000000,
192};
193
194static const u16 b43_lcntab_0x14[] = {
195 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
196 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
197 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
198 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
199 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
200 0x0002, 0x0003, 0x0001, 0x0003, 0x0002, 0x0001,
201 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
202 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
203 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
204 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
205 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
206 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
207 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
208 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
209 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
210 0x0001, 0x0001, 0x0001, 0x0001, 0x0002, 0x0003,
211 0x0001, 0x0003, 0x0002, 0x0001, 0x0001, 0x0001,
212 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
213 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
214 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
215 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
216 0x0001, 0x0001,
217};
218
219static const u16 b43_lcntab_0x17[] = {
220 0x001a, 0x0034, 0x004e, 0x0068, 0x009c, 0x00d0,
221 0x00ea, 0x0104, 0x0034, 0x0068, 0x009c, 0x00d0,
222 0x0138, 0x01a0, 0x01d4, 0x0208, 0x004e, 0x009c,
223 0x00ea, 0x0138, 0x01d4, 0x0270, 0x02be, 0x030c,
224 0x0068, 0x00d0, 0x0138, 0x01a0, 0x0270, 0x0340,
225 0x03a8, 0x0410, 0x0018, 0x009c, 0x00d0, 0x0104,
226 0x00ea, 0x0138, 0x0186, 0x00d0, 0x0104, 0x0104,
227 0x0138, 0x016c, 0x016c, 0x01a0, 0x0138, 0x0186,
228 0x0186, 0x01d4, 0x0222, 0x0222, 0x0270, 0x0104,
229 0x0138, 0x016c, 0x0138, 0x016c, 0x01a0, 0x01d4,
230 0x01a0, 0x01d4, 0x0208, 0x0208, 0x023c, 0x0186,
231 0x01d4, 0x0222, 0x01d4, 0x0222, 0x0270, 0x02be,
232 0x0270, 0x02be, 0x030c, 0x030c, 0x035a, 0x0036,
233 0x006c, 0x00a2, 0x00d8, 0x0144, 0x01b0, 0x01e6,
234 0x021c, 0x006c, 0x00d8, 0x0144, 0x01b0, 0x0288,
235 0x0360, 0x03cc, 0x0438, 0x00a2, 0x0144, 0x01e6,
236 0x0288, 0x03cc, 0x0510, 0x05b2, 0x0654, 0x00d8,
237 0x01b0, 0x0288, 0x0360, 0x0510, 0x06c0, 0x0798,
238 0x0870, 0x0018, 0x0144, 0x01b0, 0x021c, 0x01e6,
239 0x0288, 0x032a, 0x01b0, 0x021c, 0x021c, 0x0288,
240 0x02f4, 0x02f4, 0x0360, 0x0288, 0x032a, 0x032a,
241 0x03cc, 0x046e, 0x046e, 0x0510, 0x021c, 0x0288,
242 0x02f4, 0x0288, 0x02f4, 0x0360, 0x03cc, 0x0360,
243 0x03cc, 0x0438, 0x0438, 0x04a4, 0x032a, 0x03cc,
244 0x046e, 0x03cc, 0x046e, 0x0510, 0x05b2, 0x0510,
245 0x05b2, 0x0654, 0x0654, 0x06f6,
246};
247
248static const u16 b43_lcntab_0x00[] = {
249 0x0200, 0x0300, 0x0400, 0x0600, 0x0800, 0x0b00,
250 0x1000, 0x1001, 0x1002, 0x1003, 0x1004, 0x1005,
251 0x1006, 0x1007, 0x1707, 0x2007, 0x2d07, 0x4007,
252 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
253 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
254 0x0000, 0x0000, 0x0200, 0x0300, 0x0400, 0x0600,
255 0x0800, 0x0b00, 0x1000, 0x1001, 0x1002, 0x1003,
256 0x1004, 0x1005, 0x1006, 0x1007, 0x1707, 0x2007,
257 0x2d07, 0x4007, 0x0000, 0x0000, 0x0000, 0x0000,
258 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
259 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
260 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
261 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
262 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
263 0x0000, 0x0000, 0x0000, 0x4000, 0x0000, 0x0000,
264 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
265 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
266 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
267};
268
269static const u32 b43_lcntab_0x18[] = {
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 0x00080000, 0x00080000, 0x00080000, 0x00080000,
297 0x00080000, 0x00080000, 0x00080000, 0x00080000,
298 0x00080000, 0x00080000, 0x00080000, 0x00080000,
299 0x00080000, 0x00080000, 0x00080000, 0x00080000,
300 0x00080000, 0x00080000, 0x00080000, 0x00080000,
301 0x00080000, 0x00080000, 0x00080000, 0x00080000,
302 0x00080000, 0x00080000, 0x00080000, 0x00080000,
303 0x00080000, 0x00080000, 0x00080000, 0x00080000,
304 0x00080000, 0x00080000, 0x00080000, 0x00080000,
305 0x00080000, 0x00080000, 0x00080000, 0x00080000,
306 0x00080000, 0x00080000, 0x00080000, 0x00080000,
307 0x00080000, 0x00080000, 0x00080000, 0x00080000,
308 0x00080000, 0x00080000, 0x00080000, 0x00080000,
309 0x00080000, 0x00080000, 0x00080000, 0x00080000,
310};
311
312/**************************************************
313 * TX gain.
314 **************************************************/
315
316static const struct b43_lcntab_tx_gain_tbl_entry
317 b43_lcntab_tx_gain_tbl_2ghz_ext_pa_rev0[B43_LCNTAB_TX_GAIN_SIZE] = {
318 { 0x03, 0x00, 0x1f, 0x0, 0x48 },
319 { 0x03, 0x00, 0x1f, 0x0, 0x46 },
320 { 0x03, 0x00, 0x1f, 0x0, 0x44 },
321 { 0x03, 0x00, 0x1e, 0x0, 0x43 },
322 { 0x03, 0x00, 0x1d, 0x0, 0x44 },
323 { 0x03, 0x00, 0x1c, 0x0, 0x44 },
324 { 0x03, 0x00, 0x1b, 0x0, 0x45 },
325 { 0x03, 0x00, 0x1a, 0x0, 0x46 },
326 { 0x03, 0x00, 0x19, 0x0, 0x46 },
327 { 0x03, 0x00, 0x18, 0x0, 0x47 },
328 { 0x03, 0x00, 0x17, 0x0, 0x48 },
329 { 0x03, 0x00, 0x17, 0x0, 0x46 },
330 { 0x03, 0x00, 0x16, 0x0, 0x47 },
331 { 0x03, 0x00, 0x15, 0x0, 0x48 },
332 { 0x03, 0x00, 0x15, 0x0, 0x46 },
333 { 0x03, 0x00, 0x15, 0x0, 0x44 },
334 { 0x03, 0x00, 0x15, 0x0, 0x42 },
335 { 0x03, 0x00, 0x15, 0x0, 0x40 },
336 { 0x03, 0x00, 0x15, 0x0, 0x3f },
337 { 0x03, 0x00, 0x14, 0x0, 0x40 },
338 { 0x03, 0x00, 0x13, 0x0, 0x41 },
339 { 0x03, 0x00, 0x13, 0x0, 0x40 },
340 { 0x03, 0x00, 0x12, 0x0, 0x41 },
341 { 0x03, 0x00, 0x12, 0x0, 0x40 },
342 { 0x03, 0x00, 0x11, 0x0, 0x41 },
343 { 0x03, 0x00, 0x11, 0x0, 0x40 },
344 { 0x03, 0x00, 0x10, 0x0, 0x41 },
345 { 0x03, 0x00, 0x10, 0x0, 0x40 },
346 { 0x03, 0x00, 0x10, 0x0, 0x3e },
347 { 0x03, 0x00, 0x10, 0x0, 0x3c },
348 { 0x03, 0x00, 0x10, 0x0, 0x3a },
349 { 0x03, 0x00, 0x0f, 0x0, 0x3d },
350 { 0x03, 0x00, 0x0f, 0x0, 0x3b },
351 { 0x03, 0x00, 0x0e, 0x0, 0x3d },
352 { 0x03, 0x00, 0x0e, 0x0, 0x3c },
353 { 0x03, 0x00, 0x0e, 0x0, 0x3a },
354 { 0x03, 0x00, 0x0d, 0x0, 0x3c },
355 { 0x03, 0x00, 0x0d, 0x0, 0x3b },
356 { 0x03, 0x00, 0x0c, 0x0, 0x3e },
357 { 0x03, 0x00, 0x0c, 0x0, 0x3c },
358 { 0x03, 0x00, 0x0c, 0x0, 0x3a },
359 { 0x03, 0x00, 0x0b, 0x0, 0x3e },
360 { 0x03, 0x00, 0x0b, 0x0, 0x3c },
361 { 0x03, 0x00, 0x0b, 0x0, 0x3b },
362 { 0x03, 0x00, 0x0b, 0x0, 0x39 },
363 { 0x03, 0x00, 0x0a, 0x0, 0x3d },
364 { 0x03, 0x00, 0x0a, 0x0, 0x3b },
365 { 0x03, 0x00, 0x0a, 0x0, 0x39 },
366 { 0x03, 0x00, 0x09, 0x0, 0x3e },
367 { 0x03, 0x00, 0x09, 0x0, 0x3c },
368 { 0x03, 0x00, 0x09, 0x0, 0x3a },
369 { 0x03, 0x00, 0x09, 0x0, 0x39 },
370 { 0x03, 0x00, 0x08, 0x0, 0x3e },
371 { 0x03, 0x00, 0x08, 0x0, 0x3c },
372 { 0x03, 0x00, 0x08, 0x0, 0x3a },
373 { 0x03, 0x00, 0x08, 0x0, 0x39 },
374 { 0x03, 0x00, 0x08, 0x0, 0x37 },
375 { 0x03, 0x00, 0x07, 0x0, 0x3d },
376 { 0x03, 0x00, 0x07, 0x0, 0x3c },
377 { 0x03, 0x00, 0x07, 0x0, 0x3a },
378 { 0x03, 0x00, 0x07, 0x0, 0x38 },
379 { 0x03, 0x00, 0x07, 0x0, 0x37 },
380 { 0x03, 0x00, 0x06, 0x0, 0x3e },
381 { 0x03, 0x00, 0x06, 0x0, 0x3c },
382 { 0x03, 0x00, 0x06, 0x0, 0x3a },
383 { 0x03, 0x00, 0x06, 0x0, 0x39 },
384 { 0x03, 0x00, 0x06, 0x0, 0x37 },
385 { 0x03, 0x00, 0x06, 0x0, 0x36 },
386 { 0x03, 0x00, 0x06, 0x0, 0x34 },
387 { 0x03, 0x00, 0x05, 0x0, 0x3d },
388 { 0x03, 0x00, 0x05, 0x0, 0x3b },
389 { 0x03, 0x00, 0x05, 0x0, 0x39 },
390 { 0x03, 0x00, 0x05, 0x0, 0x38 },
391 { 0x03, 0x00, 0x05, 0x0, 0x36 },
392 { 0x03, 0x00, 0x05, 0x0, 0x35 },
393 { 0x03, 0x00, 0x05, 0x0, 0x33 },
394 { 0x03, 0x00, 0x04, 0x0, 0x3e },
395 { 0x03, 0x00, 0x04, 0x0, 0x3c },
396 { 0x03, 0x00, 0x04, 0x0, 0x3a },
397 { 0x03, 0x00, 0x04, 0x0, 0x39 },
398 { 0x03, 0x00, 0x04, 0x0, 0x37 },
399 { 0x03, 0x00, 0x04, 0x0, 0x36 },
400 { 0x03, 0x00, 0x04, 0x0, 0x34 },
401 { 0x03, 0x00, 0x04, 0x0, 0x33 },
402 { 0x03, 0x00, 0x04, 0x0, 0x31 },
403 { 0x03, 0x00, 0x04, 0x0, 0x30 },
404 { 0x03, 0x00, 0x04, 0x0, 0x2e },
405 { 0x03, 0x00, 0x03, 0x0, 0x3c },
406 { 0x03, 0x00, 0x03, 0x0, 0x3a },
407 { 0x03, 0x00, 0x03, 0x0, 0x39 },
408 { 0x03, 0x00, 0x03, 0x0, 0x37 },
409 { 0x03, 0x00, 0x03, 0x0, 0x36 },
410 { 0x03, 0x00, 0x03, 0x0, 0x34 },
411 { 0x03, 0x00, 0x03, 0x0, 0x33 },
412 { 0x03, 0x00, 0x03, 0x0, 0x31 },
413 { 0x03, 0x00, 0x03, 0x0, 0x30 },
414 { 0x03, 0x00, 0x03, 0x0, 0x2e },
415 { 0x03, 0x00, 0x03, 0x0, 0x2d },
416 { 0x03, 0x00, 0x03, 0x0, 0x2c },
417 { 0x03, 0x00, 0x03, 0x0, 0x2b },
418 { 0x03, 0x00, 0x03, 0x0, 0x29 },
419 { 0x03, 0x00, 0x02, 0x0, 0x3d },
420 { 0x03, 0x00, 0x02, 0x0, 0x3b },
421 { 0x03, 0x00, 0x02, 0x0, 0x39 },
422 { 0x03, 0x00, 0x02, 0x0, 0x38 },
423 { 0x03, 0x00, 0x02, 0x0, 0x36 },
424 { 0x03, 0x00, 0x02, 0x0, 0x35 },
425 { 0x03, 0x00, 0x02, 0x0, 0x33 },
426 { 0x03, 0x00, 0x02, 0x0, 0x32 },
427 { 0x03, 0x00, 0x02, 0x0, 0x30 },
428 { 0x03, 0x00, 0x02, 0x0, 0x2f },
429 { 0x03, 0x00, 0x02, 0x0, 0x2e },
430 { 0x03, 0x00, 0x02, 0x0, 0x2c },
431 { 0x03, 0x00, 0x02, 0x0, 0x2b },
432 { 0x03, 0x00, 0x02, 0x0, 0x2a },
433 { 0x03, 0x00, 0x02, 0x0, 0x29 },
434 { 0x03, 0x00, 0x02, 0x0, 0x27 },
435 { 0x03, 0x00, 0x02, 0x0, 0x26 },
436 { 0x03, 0x00, 0x02, 0x0, 0x25 },
437 { 0x03, 0x00, 0x02, 0x0, 0x24 },
438 { 0x03, 0x00, 0x02, 0x0, 0x23 },
439 { 0x03, 0x00, 0x02, 0x0, 0x22 },
440 { 0x03, 0x00, 0x02, 0x0, 0x21 },
441 { 0x03, 0x00, 0x02, 0x0, 0x20 },
442 { 0x03, 0x00, 0x01, 0x0, 0x3f },
443 { 0x03, 0x00, 0x01, 0x0, 0x3d },
444 { 0x03, 0x00, 0x01, 0x0, 0x3b },
445 { 0x03, 0x00, 0x01, 0x0, 0x39 },
446};
447
448/**************************************************
449 * SW control.
450 **************************************************/
451
452static const u16 b43_lcntab_sw_ctl_4313_epa_rev0[] = {
453 0x0002, 0x0008, 0x0004, 0x0001, 0x0002, 0x0008,
454 0x0004, 0x0001, 0x0002, 0x0008, 0x0004, 0x0001,
455 0x0002, 0x0008, 0x0004, 0x0001, 0x0002, 0x0008,
456 0x0004, 0x0001, 0x0002, 0x0008, 0x0004, 0x0001,
457 0x0002, 0x0008, 0x0004, 0x0001, 0x0002, 0x0008,
458 0x0004, 0x0001, 0x0002, 0x0008, 0x0004, 0x0001,
459 0x0002, 0x0008, 0x0004, 0x0001, 0x0002, 0x0008,
460 0x0004, 0x0001, 0x0002, 0x0008, 0x0004, 0x0001,
461 0x0002, 0x0008, 0x0004, 0x0001, 0x0002, 0x0008,
462 0x0004, 0x0001, 0x0002, 0x0008, 0x0004, 0x0001,
463 0x0002, 0x0008, 0x0004, 0x0001,
464};
465
466/**************************************************
467 * R/W ops.
468 **************************************************/
469
470u32 b43_lcntab_read(struct b43_wldev *dev, u32 offset)
471{
472 u32 type, value;
473
474 type = offset & B43_LCNTAB_TYPEMASK;
475 offset &= ~B43_LCNTAB_TYPEMASK;
476 B43_WARN_ON(offset > 0xFFFF);
477
478 switch (type) {
479 case B43_LCNTAB_8BIT:
480 b43_phy_write(dev, B43_PHY_LCN_TABLE_ADDR, offset);
481 value = b43_phy_read(dev, B43_PHY_LCN_TABLE_DATALO) & 0xFF;
482 break;
483 case B43_LCNTAB_16BIT:
484 b43_phy_write(dev, B43_PHY_LCN_TABLE_ADDR, offset);
485 value = b43_phy_read(dev, B43_PHY_LCN_TABLE_DATALO);
486 break;
487 case B43_LCNTAB_32BIT:
488 b43_phy_write(dev, B43_PHY_LCN_TABLE_ADDR, offset);
489 value = b43_phy_read(dev, B43_PHY_LCN_TABLE_DATALO);
490 value |= (b43_phy_read(dev, B43_PHY_LCN_TABLE_DATAHI) << 16);
491 break;
492 default:
493 B43_WARN_ON(1);
494 value = 0;
495 }
496
497 return value;
498}
499
500void b43_lcntab_read_bulk(struct b43_wldev *dev, u32 offset,
501 unsigned int nr_elements, void *_data)
502{
503 u32 type;
504 u8 *data = _data;
505 unsigned int i;
506
507 type = offset & B43_LCNTAB_TYPEMASK;
508 offset &= ~B43_LCNTAB_TYPEMASK;
509 B43_WARN_ON(offset > 0xFFFF);
510
511 b43_phy_write(dev, B43_PHY_LCN_TABLE_ADDR, offset);
512
513 for (i = 0; i < nr_elements; i++) {
514 switch (type) {
515 case B43_LCNTAB_8BIT:
516 *data = b43_phy_read(dev,
517 B43_PHY_LCN_TABLE_DATALO) & 0xFF;
518 data++;
519 break;
520 case B43_LCNTAB_16BIT:
521 *((u16 *)data) = b43_phy_read(dev,
522 B43_PHY_LCN_TABLE_DATALO);
523 data += 2;
524 break;
525 case B43_LCNTAB_32BIT:
526 *((u32 *)data) = b43_phy_read(dev,
527 B43_PHY_LCN_TABLE_DATALO);
528 *((u32 *)data) |= (b43_phy_read(dev,
529 B43_PHY_LCN_TABLE_DATAHI) << 16);
530 data += 4;
531 break;
532 default:
533 B43_WARN_ON(1);
534 }
535 }
536}
537
538void b43_lcntab_write(struct b43_wldev *dev, u32 offset, u32 value)
539{
540 u32 type;
541
542 type = offset & B43_LCNTAB_TYPEMASK;
543 offset &= 0xFFFF;
544
545 switch (type) {
546 case B43_LCNTAB_8BIT:
547 B43_WARN_ON(value & ~0xFF);
548 b43_phy_write(dev, B43_PHY_LCN_TABLE_ADDR, offset);
549 b43_phy_write(dev, B43_PHY_LCN_TABLE_DATALO, value);
550 break;
551 case B43_LCNTAB_16BIT:
552 B43_WARN_ON(value & ~0xFFFF);
553 b43_phy_write(dev, B43_PHY_LCN_TABLE_ADDR, offset);
554 b43_phy_write(dev, B43_PHY_LCN_TABLE_DATALO, value);
555 break;
556 case B43_LCNTAB_32BIT:
557 b43_phy_write(dev, B43_PHY_LCN_TABLE_ADDR, offset);
558 b43_phy_write(dev, B43_PHY_LCN_TABLE_DATAHI, value >> 16);
559 b43_phy_write(dev, B43_PHY_LCN_TABLE_DATALO, value & 0xFFFF);
560 break;
561 default:
562 B43_WARN_ON(1);
563 }
564
565 return;
566}
567
568void b43_lcntab_write_bulk(struct b43_wldev *dev, u32 offset,
569 unsigned int nr_elements, const void *_data)
570{
571 u32 type, value;
572 const u8 *data = _data;
573 unsigned int i;
574
575 type = offset & B43_LCNTAB_TYPEMASK;
576 offset &= ~B43_LCNTAB_TYPEMASK;
577 B43_WARN_ON(offset > 0xFFFF);
578
579 b43_phy_write(dev, B43_PHY_LCN_TABLE_ADDR, offset);
580
581 for (i = 0; i < nr_elements; i++) {
582 switch (type) {
583 case B43_LCNTAB_8BIT:
584 value = *data;
585 data++;
586 B43_WARN_ON(value & ~0xFF);
587 b43_phy_write(dev, B43_PHY_LCN_TABLE_DATALO, value);
588 break;
589 case B43_LCNTAB_16BIT:
590 value = *((u16 *)data);
591 data += 2;
592 B43_WARN_ON(value & ~0xFFFF);
593 b43_phy_write(dev, B43_PHY_LCN_TABLE_DATALO, value);
594 break;
595 case B43_LCNTAB_32BIT:
596 value = *((u32 *)data);
597 data += 4;
598 b43_phy_write(dev, B43_PHY_LCN_TABLE_DATAHI,
599 value >> 16);
600 b43_phy_write(dev, B43_PHY_LCN_TABLE_DATALO,
601 value & 0xFFFF);
602 break;
603 default:
604 B43_WARN_ON(1);
605 }
606 }
607}
608
609/**************************************************
610 * Tables ops.
611 **************************************************/
612
613#define lcntab_upload(dev, offset, data) do { \
614 b43_lcntab_write_bulk(dev, offset, ARRAY_SIZE(data), data); \
615 } while (0)
616static void b43_phy_lcn_upload_static_tables(struct b43_wldev *dev)
617{
618 lcntab_upload(dev, B43_LCNTAB16(0x02, 0), b43_lcntab_0x02);
619 lcntab_upload(dev, B43_LCNTAB16(0x01, 0), b43_lcntab_0x01);
620 lcntab_upload(dev, B43_LCNTAB32(0x0b, 0), b43_lcntab_0x0b);
621 lcntab_upload(dev, B43_LCNTAB32(0x0c, 0), b43_lcntab_0x0c);
622 lcntab_upload(dev, B43_LCNTAB32(0x0d, 0), b43_lcntab_0x0d);
623 lcntab_upload(dev, B43_LCNTAB16(0x0e, 0), b43_lcntab_0x0e);
624 lcntab_upload(dev, B43_LCNTAB16(0x0f, 0), b43_lcntab_0x0f);
625 lcntab_upload(dev, B43_LCNTAB16(0x10, 0), b43_lcntab_0x10);
626 lcntab_upload(dev, B43_LCNTAB16(0x11, 0), b43_lcntab_0x11);
627 lcntab_upload(dev, B43_LCNTAB32(0x12, 0), b43_lcntab_0x12);
628 lcntab_upload(dev, B43_LCNTAB16(0x14, 0), b43_lcntab_0x14);
629 lcntab_upload(dev, B43_LCNTAB16(0x17, 0), b43_lcntab_0x17);
630 lcntab_upload(dev, B43_LCNTAB16(0x00, 0), b43_lcntab_0x00);
631 lcntab_upload(dev, B43_LCNTAB32(0x18, 0), b43_lcntab_0x18);
632}
633
634static void b43_phy_lcn_load_tx_gain_tab(struct b43_wldev *dev,
635 const struct b43_lcntab_tx_gain_tbl_entry *gain_table)
636{
637 u32 i;
638 u32 val;
639
640 u16 pa_gain = 0x70;
641 if (dev->dev->bus_sprom->boardflags_lo & B43_BFL_FEM)
642 pa_gain = 0x10;
643
644 for (i = 0; i < B43_LCNTAB_TX_GAIN_SIZE; i++) {
645 val = ((pa_gain << 24) |
646 (gain_table[i].pad << 16) |
647 (gain_table[i].pga << 8) |
648 gain_table[i].gm);
649 b43_lcntab_write(dev, B43_LCNTAB32(0x7, 0xc0 + i), val);
650
651 /* brcmsmac doesn't maskset, we follow newer wl here */
652 val = b43_lcntab_read(dev, B43_LCNTAB32(0x7, 0x140 + i));
653 val &= 0x000fffff;
654 val |= ((gain_table[i].dac << 28) |
655 (gain_table[i].bb_mult << 20));
656 b43_lcntab_write(dev, B43_LCNTAB32(0x7, 0x140 + i), val);
657 }
658}
659
660/* wlc_lcnphy_load_rfpower */
661static void b43_phy_lcn_load_rfpower(struct b43_wldev *dev)
662{
663 u32 bbmult, rfgain;
664 u8 i;
665
666 for (i = 0; i < 128; i++) {
667 bbmult = b43_lcntab_read(dev, B43_LCNTAB32(0x7, 0x140 + i));
668 bbmult >>= 20;
669 rfgain = b43_lcntab_read(dev, B43_LCNTAB32(0x7, 0xc0 + i));
670
671 /* TODO: calculate value for 0x240 + i table offset
672 * b43_lcntab_write(dev, B43_LCNTAB32(0x7, 0x240 + i), val);
673 */
674 }
675}
676
677/* Not implemented in brcmsmac, noticed in wl in MMIO dump */
678static void b43_phy_lcn_rewrite_rfpower_table(struct b43_wldev *dev)
679{
680 int i;
681 u32 tmp;
682 for (i = 0; i < 128; i++) {
683 tmp = b43_lcntab_read(dev, B43_LCNTAB32(0x7, 0x240 + i));
684 b43_lcntab_write(dev, B43_LCNTAB32(0x7, 0x240 + i), tmp);
685 }
686}
687
688/* wlc_lcnphy_clear_papd_comptable */
689static void b43_phy_lcn_clean_papd_comp_table(struct b43_wldev *dev)
690{
691 u8 i;
692
693 for (i = 0; i < 0x80; i++)
694 b43_lcntab_write(dev, B43_LCNTAB32(0x18, i), 0x80000);
695}
696
697/* wlc_lcnphy_tbl_init */
698void b43_phy_lcn_tables_init(struct b43_wldev *dev)
699{
700 struct ssb_sprom *sprom = dev->dev->bus_sprom;
701
702 b43_phy_lcn_upload_static_tables(dev);
703
704 if (b43_current_band(dev->wl) == IEEE80211_BAND_2GHZ) {
705 if (sprom->boardflags_lo & B43_BFL_FEM)
706 b43_phy_lcn_load_tx_gain_tab(dev,
707 b43_lcntab_tx_gain_tbl_2ghz_ext_pa_rev0);
708 else
709 b43err(dev->wl,
710 "TX gain table unknown for this card\n");
711 }
712
713 if (sprom->boardflags_lo & B43_BFL_FEM &&
714 !(sprom->boardflags_hi & B43_BFH_FEM_BT))
715 b43_lcntab_write_bulk(dev, B43_LCNTAB16(0xf, 0),
716 ARRAY_SIZE(b43_lcntab_sw_ctl_4313_epa_rev0),
717 b43_lcntab_sw_ctl_4313_epa_rev0);
718 else
719 b43err(dev->wl, "SW ctl table is unknown for this card\n");
720
721 b43_phy_lcn_load_rfpower(dev);
722 b43_phy_lcn_rewrite_rfpower_table(dev);
723 b43_phy_lcn_clean_papd_comp_table(dev);
724}