1 /*
2 
3   Broadcom B43 wireless driver
4   IEEE 802.11n HT-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_ht.h"
27 #include "phy_common.h"
28 #include "phy_ht.h"
29 
30 static const u16 b43_httab_0x12[] = {
31 	0x0000, 0x0008, 0x000a, 0x0010, 0x0012, 0x0019,
32 	0x001a, 0x001c, 0x0080, 0x0088, 0x008a, 0x0090,
33 	0x0092, 0x0099, 0x009a, 0x009c, 0x0100, 0x0108,
34 	0x010a, 0x0110, 0x0112, 0x0119, 0x011a, 0x011c,
35 	0x0180, 0x0188, 0x018a, 0x0190, 0x0192, 0x0199,
36 	0x019a, 0x019c, 0x0000, 0x0098, 0x00a0, 0x00a8,
37 	0x009a, 0x00a2, 0x00aa, 0x0120, 0x0128, 0x0128,
38 	0x0130, 0x0138, 0x0138, 0x0140, 0x0122, 0x012a,
39 	0x012a, 0x0132, 0x013a, 0x013a, 0x0142, 0x01a8,
40 	0x01b0, 0x01b8, 0x01b0, 0x01b8, 0x01c0, 0x01c8,
41 	0x01c0, 0x01c8, 0x01d0, 0x01d0, 0x01d8, 0x01aa,
42 	0x01b2, 0x01ba, 0x01b2, 0x01ba, 0x01c2, 0x01ca,
43 	0x01c2, 0x01ca, 0x01d2, 0x01d2, 0x01da, 0x0001,
44 	0x0002, 0x0004, 0x0009, 0x000c, 0x0011, 0x0014,
45 	0x0018, 0x0020, 0x0021, 0x0022, 0x0024, 0x0081,
46 	0x0082, 0x0084, 0x0089, 0x008c, 0x0091, 0x0094,
47 	0x0098, 0x00a0, 0x00a1, 0x00a2, 0x00a4, 0x0007,
48 	0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007,
49 	0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007,
50 	0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007,
51 	0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007,
52 	0x0007, 0x0007,
53 };
54 
55 static const u16 b43_httab_0x27[] = {
56 	0x0009, 0x000e, 0x0011, 0x0014, 0x0017, 0x001a,
57 	0x001d, 0x0020, 0x0009, 0x000e, 0x0011, 0x0014,
58 	0x0017, 0x001a, 0x001d, 0x0020, 0x0009, 0x000e,
59 	0x0011, 0x0014, 0x0017, 0x001a, 0x001d, 0x0020,
60 	0x0009, 0x000e, 0x0011, 0x0014, 0x0017, 0x001a,
61 	0x001d, 0x0020,
62 };
63 
64 static const u16 b43_httab_0x26[] = {
65 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
66 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
67 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
68 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
69 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
70 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
71 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
72 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
73 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
74 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
75 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
76 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
77 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
78 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
79 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
80 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
81 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
82 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
83 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
84 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
85 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
86 	0x0000, 0x0000,
87 };
88 
89 static const u32 b43_httab_0x25[] = {
90 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
91 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
92 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
93 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
94 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
95 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
96 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
97 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
98 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
99 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
100 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
101 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
102 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
103 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
104 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
105 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
106 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
107 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
108 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
109 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
110 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
111 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
112 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
113 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
114 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
115 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
116 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
117 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
118 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
119 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
120 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
121 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
122 };
123 
124 static const u32 b43_httab_0x2f[] = {
125 	0x00035700, 0x0002cc9a, 0x00026666, 0x0001581f,
126 	0x0001581f, 0x0001581f, 0x0001581f, 0x0001581f,
127 	0x0001581f, 0x0001581f, 0x0001581f, 0x00035700,
128 	0x0002cc9a, 0x00026666, 0x0001581f, 0x0001581f,
129 	0x0001581f, 0x0001581f, 0x0001581f, 0x0001581f,
130 	0x0001581f, 0x0001581f,
131 };
132 
133 static const u16 b43_httab_0x1a[] = {
134 	0x0055, 0x0054, 0x0054, 0x0053, 0x0052, 0x0052,
135 	0x0051, 0x0051, 0x0050, 0x004f, 0x004f, 0x004e,
136 	0x004e, 0x004d, 0x004c, 0x004c, 0x004b, 0x004a,
137 	0x0049, 0x0049, 0x0048, 0x0047, 0x0046, 0x0046,
138 	0x0045, 0x0044, 0x0043, 0x0042, 0x0041, 0x0040,
139 	0x0040, 0x003f, 0x003e, 0x003d, 0x003c, 0x003a,
140 	0x0039, 0x0038, 0x0037, 0x0036, 0x0035, 0x0033,
141 	0x0032, 0x0031, 0x002f, 0x002e, 0x002c, 0x002b,
142 	0x0029, 0x0027, 0x0025, 0x0023, 0x0021, 0x001f,
143 	0x001d, 0x001a, 0x0018, 0x0015, 0x0012, 0x000e,
144 	0x000b, 0x0007, 0x0002, 0x00fd,
145 };
146 
147 static const u16 b43_httab_0x1b[] = {
148 	0x0055, 0x0054, 0x0054, 0x0053, 0x0052, 0x0052,
149 	0x0051, 0x0051, 0x0050, 0x004f, 0x004f, 0x004e,
150 	0x004e, 0x004d, 0x004c, 0x004c, 0x004b, 0x004a,
151 	0x0049, 0x0049, 0x0048, 0x0047, 0x0046, 0x0046,
152 	0x0045, 0x0044, 0x0043, 0x0042, 0x0041, 0x0040,
153 	0x0040, 0x003f, 0x003e, 0x003d, 0x003c, 0x003a,
154 	0x0039, 0x0038, 0x0037, 0x0036, 0x0035, 0x0033,
155 	0x0032, 0x0031, 0x002f, 0x002e, 0x002c, 0x002b,
156 	0x0029, 0x0027, 0x0025, 0x0023, 0x0021, 0x001f,
157 	0x001d, 0x001a, 0x0018, 0x0015, 0x0012, 0x000e,
158 	0x000b, 0x0007, 0x0002, 0x00fd,
159 };
160 
161 static const u16 b43_httab_0x1c[] = {
162 	0x0055, 0x0054, 0x0054, 0x0053, 0x0052, 0x0052,
163 	0x0051, 0x0051, 0x0050, 0x004f, 0x004f, 0x004e,
164 	0x004e, 0x004d, 0x004c, 0x004c, 0x004b, 0x004a,
165 	0x0049, 0x0049, 0x0048, 0x0047, 0x0046, 0x0046,
166 	0x0045, 0x0044, 0x0043, 0x0042, 0x0041, 0x0040,
167 	0x0040, 0x003f, 0x003e, 0x003d, 0x003c, 0x003a,
168 	0x0039, 0x0038, 0x0037, 0x0036, 0x0035, 0x0033,
169 	0x0032, 0x0031, 0x002f, 0x002e, 0x002c, 0x002b,
170 	0x0029, 0x0027, 0x0025, 0x0023, 0x0021, 0x001f,
171 	0x001d, 0x001a, 0x0018, 0x0015, 0x0012, 0x000e,
172 	0x000b, 0x0007, 0x0002, 0x00fd,
173 };
174 
175 static const u32 b43_httab_0x1a_0xc0[] = {
176 	0x5bf70044, 0x5bf70042, 0x5bf70040, 0x5bf7003e,
177 	0x5bf7003c, 0x5bf7003b, 0x5bf70039, 0x5bf70037,
178 	0x5bf70036, 0x5bf70034, 0x5bf70033, 0x5bf70031,
179 	0x5bf70030, 0x5ba70044, 0x5ba70042, 0x5ba70040,
180 	0x5ba7003e, 0x5ba7003c, 0x5ba7003b, 0x5ba70039,
181 	0x5ba70037, 0x5ba70036, 0x5ba70034, 0x5ba70033,
182 	0x5b770044, 0x5b770042, 0x5b770040, 0x5b77003e,
183 	0x5b77003c, 0x5b77003b, 0x5b770039, 0x5b770037,
184 	0x5b770036, 0x5b770034, 0x5b770033, 0x5b770031,
185 	0x5b770030, 0x5b77002f, 0x5b77002d, 0x5b77002c,
186 	0x5b470044, 0x5b470042, 0x5b470040, 0x5b47003e,
187 	0x5b47003c, 0x5b47003b, 0x5b470039, 0x5b470037,
188 	0x5b470036, 0x5b470034, 0x5b470033, 0x5b470031,
189 	0x5b470030, 0x5b47002f, 0x5b47002d, 0x5b47002c,
190 	0x5b47002b, 0x5b47002a, 0x5b270044, 0x5b270042,
191 	0x5b270040, 0x5b27003e, 0x5b27003c, 0x5b27003b,
192 	0x5b270039, 0x5b270037, 0x5b270036, 0x5b270034,
193 	0x5b270033, 0x5b270031, 0x5b270030, 0x5b27002f,
194 	0x5b170044, 0x5b170042, 0x5b170040, 0x5b17003e,
195 	0x5b17003c, 0x5b17003b, 0x5b170039, 0x5b170037,
196 	0x5b170036, 0x5b170034, 0x5b170033, 0x5b170031,
197 	0x5b170030, 0x5b17002f, 0x5b17002d, 0x5b17002c,
198 	0x5b17002b, 0x5b17002a, 0x5b170028, 0x5b170027,
199 	0x5b170026, 0x5b170025, 0x5b170024, 0x5b170023,
200 	0x5b070044, 0x5b070042, 0x5b070040, 0x5b07003e,
201 	0x5b07003c, 0x5b07003b, 0x5b070039, 0x5b070037,
202 	0x5b070036, 0x5b070034, 0x5b070033, 0x5b070031,
203 	0x5b070030, 0x5b07002f, 0x5b07002d, 0x5b07002c,
204 	0x5b07002b, 0x5b07002a, 0x5b070028, 0x5b070027,
205 	0x5b070026, 0x5b070025, 0x5b070024, 0x5b070023,
206 	0x5b070022, 0x5b070021, 0x5b070020, 0x5b07001f,
207 	0x5b07001e, 0x5b07001d, 0x5b07001d, 0x5b07001c,
208 };
209 
210 static const u32 b43_httab_0x1a_0x140[] = {
211 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
212 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
213 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
214 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
215 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
216 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
217 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
218 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
219 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
220 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
221 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
222 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
223 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
224 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
225 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
226 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
227 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
228 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
229 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
230 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
231 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
232 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
233 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
234 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
235 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
236 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
237 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
238 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
239 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
240 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
241 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
242 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
243 };
244 
245 static const u32 b43_httab_0x1b_0x140[] = {
246 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
247 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
248 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
249 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
250 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
251 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
252 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
253 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
254 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
255 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
256 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
257 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
258 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
259 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
260 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
261 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
262 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
263 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
264 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
265 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
266 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
267 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
268 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
269 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
270 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
271 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
272 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
273 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
274 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
275 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
276 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
277 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
278 };
279 
280 static const u32 b43_httab_0x1c_0x140[] = {
281 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
282 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
283 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
284 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
285 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
286 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
287 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
288 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
289 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
290 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
291 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
292 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
293 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
294 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
295 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
296 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
297 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
298 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
299 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
300 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
301 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
302 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
303 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
304 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
305 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
306 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
307 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
308 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
309 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
310 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
311 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
312 	0x00000000, 0x00000000, 0x00000000, 0x00000000,
313 };
314 
315 static const u16 b43_httab_0x1a_0x1c0[] = {
316 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
317 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
318 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
319 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
320 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
321 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
322 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
323 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
324 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
325 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
326 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
327 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
328 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
329 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
330 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
331 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
332 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
333 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
334 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
335 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
336 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
337 	0x0000, 0x0000,
338 };
339 
340 static const u16 b43_httab_0x1b_0x1c0[] = {
341 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
342 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
343 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
344 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
345 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
346 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
347 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
348 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
349 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
350 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
351 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
352 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
353 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
354 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
355 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
356 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
357 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
358 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
359 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
360 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
361 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
362 	0x0000, 0x0000,
363 };
364 
365 static const u16 b43_httab_0x1c_0x1c0[] = {
366 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
367 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
368 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
369 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
370 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
371 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
372 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
373 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
374 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
375 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
376 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
377 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
378 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
379 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
380 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
381 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
382 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
383 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
384 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
385 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
386 	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
387 	0x0000, 0x0000,
388 };
389 
390 static const u16 b43_httab_0x1a_0x240[] = {
391 	0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036,
392 	0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036,
393 	0x0036, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a,
394 	0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a,
395 	0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e,
396 	0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e,
397 	0x001e, 0x001e, 0x001e, 0x001e, 0x000e, 0x000e,
398 	0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e,
399 	0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e,
400 	0x000e, 0x000e, 0x000e, 0x000e, 0x01fc, 0x01fc,
401 	0x01fc, 0x01fc, 0x01fc, 0x01fc, 0x01fc, 0x01fc,
402 	0x01fc, 0x01fc, 0x01fc, 0x01fc, 0x01fc, 0x01fc,
403 	0x01ee, 0x01ee, 0x01ee, 0x01ee, 0x01ee, 0x01ee,
404 	0x01ee, 0x01ee, 0x01ee, 0x01ee, 0x01ee, 0x01ee,
405 	0x01ee, 0x01ee, 0x01ee, 0x01ee, 0x01ee, 0x01ee,
406 	0x01ee, 0x01ee, 0x01ee, 0x01ee, 0x01ee, 0x01ee,
407 	0x01d6, 0x01d6, 0x01d6, 0x01d6, 0x01d6, 0x01d6,
408 	0x01d6, 0x01d6, 0x01d6, 0x01d6, 0x01d6, 0x01d6,
409 	0x01d6, 0x01d6, 0x01d6, 0x01d6, 0x01d6, 0x01d6,
410 	0x01d6, 0x01d6, 0x01d6, 0x01d6, 0x01d6, 0x01d6,
411 	0x01d6, 0x01d6, 0x01d6, 0x01d6, 0x01d6, 0x01d6,
412 	0x01d6, 0x01d6,
413 };
414 
415 static const u16 b43_httab_0x1b_0x240[] = {
416 	0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036,
417 	0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036,
418 	0x0036, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a,
419 	0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a,
420 	0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e,
421 	0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e,
422 	0x001e, 0x001e, 0x001e, 0x001e, 0x000e, 0x000e,
423 	0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e,
424 	0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e,
425 	0x000e, 0x000e, 0x000e, 0x000e, 0x01fc, 0x01fc,
426 	0x01fc, 0x01fc, 0x01fc, 0x01fc, 0x01fc, 0x01fc,
427 	0x01fc, 0x01fc, 0x01fc, 0x01fc, 0x01fc, 0x01fc,
428 	0x01ee, 0x01ee, 0x01ee, 0x01ee, 0x01ee, 0x01ee,
429 	0x01ee, 0x01ee, 0x01ee, 0x01ee, 0x01ee, 0x01ee,
430 	0x01ee, 0x01ee, 0x01ee, 0x01ee, 0x01ee, 0x01ee,
431 	0x01ee, 0x01ee, 0x01ee, 0x01ee, 0x01ee, 0x01ee,
432 	0x01d6, 0x01d6, 0x01d6, 0x01d6, 0x01d6, 0x01d6,
433 	0x01d6, 0x01d6, 0x01d6, 0x01d6, 0x01d6, 0x01d6,
434 	0x01d6, 0x01d6, 0x01d6, 0x01d6, 0x01d6, 0x01d6,
435 	0x01d6, 0x01d6, 0x01d6, 0x01d6, 0x01d6, 0x01d6,
436 	0x01d6, 0x01d6, 0x01d6, 0x01d6, 0x01d6, 0x01d6,
437 	0x01d6, 0x01d6,
438 };
439 
440 static const u16 b43_httab_0x1c_0x240[] = {
441 	0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036,
442 	0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036,
443 	0x0036, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a,
444 	0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a,
445 	0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e,
446 	0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e,
447 	0x001e, 0x001e, 0x001e, 0x001e, 0x000e, 0x000e,
448 	0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e,
449 	0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e,
450 	0x000e, 0x000e, 0x000e, 0x000e, 0x01fc, 0x01fc,
451 	0x01fc, 0x01fc, 0x01fc, 0x01fc, 0x01fc, 0x01fc,
452 	0x01fc, 0x01fc, 0x01fc, 0x01fc, 0x01fc, 0x01fc,
453 	0x01ee, 0x01ee, 0x01ee, 0x01ee, 0x01ee, 0x01ee,
454 	0x01ee, 0x01ee, 0x01ee, 0x01ee, 0x01ee, 0x01ee,
455 	0x01ee, 0x01ee, 0x01ee, 0x01ee, 0x01ee, 0x01ee,
456 	0x01ee, 0x01ee, 0x01ee, 0x01ee, 0x01ee, 0x01ee,
457 	0x01d6, 0x01d6, 0x01d6, 0x01d6, 0x01d6, 0x01d6,
458 	0x01d6, 0x01d6, 0x01d6, 0x01d6, 0x01d6, 0x01d6,
459 	0x01d6, 0x01d6, 0x01d6, 0x01d6, 0x01d6, 0x01d6,
460 	0x01d6, 0x01d6, 0x01d6, 0x01d6, 0x01d6, 0x01d6,
461 	0x01d6, 0x01d6, 0x01d6, 0x01d6, 0x01d6, 0x01d6,
462 	0x01d6, 0x01d6,
463 };
464 
465 static const u32 b43_httab_0x1f[] = {
466 	0x00000000, 0x00000000, 0x00016023, 0x00006028,
467 	0x00034036, 0x0003402e, 0x0007203c, 0x0006e037,
468 	0x00070030, 0x0009401f, 0x0009a00f, 0x000b600d,
469 	0x000c8007, 0x000ce007, 0x00101fff, 0x00121ff9,
470 	0x0012e004, 0x0014dffc, 0x0016dff6, 0x0018dfe9,
471 	0x001b3fe5, 0x001c5fd0, 0x001ddfc2, 0x001f1fb6,
472 	0x00207fa4, 0x00219f8f, 0x0022ff7d, 0x00247f6c,
473 	0x0024df5b, 0x00267f4b, 0x0027df3b, 0x0029bf3b,
474 	0x002b5f2f, 0x002d3f2e, 0x002f5f2a, 0x002fff15,
475 	0x00315f0b, 0x0032defa, 0x0033beeb, 0x0034fed9,
476 	0x00353ec5, 0x00361eb0, 0x00363e9b, 0x0036be87,
477 	0x0036be70, 0x0038fe67, 0x0044beb2, 0x00513ef3,
478 	0x00595f11, 0x00669f3d, 0x0078dfdf, 0x00a143aa,
479 	0x01642fff, 0x0162afff, 0x01620fff, 0x0160cfff,
480 	0x015f0fff, 0x015dafff, 0x015bcfff, 0x015bcfff,
481 	0x015b4fff, 0x015acfff, 0x01590fff, 0x0156cfff,
482 };
483 
484 static const u32 b43_httab_0x21[] = {
485 	0x00000000, 0x00000000, 0x00016023, 0x00006028,
486 	0x00034036, 0x0003402e, 0x0007203c, 0x0006e037,
487 	0x00070030, 0x0009401f, 0x0009a00f, 0x000b600d,
488 	0x000c8007, 0x000ce007, 0x00101fff, 0x00121ff9,
489 	0x0012e004, 0x0014dffc, 0x0016dff6, 0x0018dfe9,
490 	0x001b3fe5, 0x001c5fd0, 0x001ddfc2, 0x001f1fb6,
491 	0x00207fa4, 0x00219f8f, 0x0022ff7d, 0x00247f6c,
492 	0x0024df5b, 0x00267f4b, 0x0027df3b, 0x0029bf3b,
493 	0x002b5f2f, 0x002d3f2e, 0x002f5f2a, 0x002fff15,
494 	0x00315f0b, 0x0032defa, 0x0033beeb, 0x0034fed9,
495 	0x00353ec5, 0x00361eb0, 0x00363e9b, 0x0036be87,
496 	0x0036be70, 0x0038fe67, 0x0044beb2, 0x00513ef3,
497 	0x00595f11, 0x00669f3d, 0x0078dfdf, 0x00a143aa,
498 	0x01642fff, 0x0162afff, 0x01620fff, 0x0160cfff,
499 	0x015f0fff, 0x015dafff, 0x015bcfff, 0x015bcfff,
500 	0x015b4fff, 0x015acfff, 0x01590fff, 0x0156cfff,
501 };
502 
503 static const u32 b43_httab_0x23[] = {
504 	0x00000000, 0x00000000, 0x00016023, 0x00006028,
505 	0x00034036, 0x0003402e, 0x0007203c, 0x0006e037,
506 	0x00070030, 0x0009401f, 0x0009a00f, 0x000b600d,
507 	0x000c8007, 0x000ce007, 0x00101fff, 0x00121ff9,
508 	0x0012e004, 0x0014dffc, 0x0016dff6, 0x0018dfe9,
509 	0x001b3fe5, 0x001c5fd0, 0x001ddfc2, 0x001f1fb6,
510 	0x00207fa4, 0x00219f8f, 0x0022ff7d, 0x00247f6c,
511 	0x0024df5b, 0x00267f4b, 0x0027df3b, 0x0029bf3b,
512 	0x002b5f2f, 0x002d3f2e, 0x002f5f2a, 0x002fff15,
513 	0x00315f0b, 0x0032defa, 0x0033beeb, 0x0034fed9,
514 	0x00353ec5, 0x00361eb0, 0x00363e9b, 0x0036be87,
515 	0x0036be70, 0x0038fe67, 0x0044beb2, 0x00513ef3,
516 	0x00595f11, 0x00669f3d, 0x0078dfdf, 0x00a143aa,
517 	0x01642fff, 0x0162afff, 0x01620fff, 0x0160cfff,
518 	0x015f0fff, 0x015dafff, 0x015bcfff, 0x015bcfff,
519 	0x015b4fff, 0x015acfff, 0x01590fff, 0x0156cfff,
520 };
521 
522 static const u32 b43_httab_0x20[] = {
523 	0x0b5e002d, 0x0ae2002f, 0x0a3b0032, 0x09a70035,
524 	0x09220038, 0x08ab003b, 0x081f003f, 0x07a20043,
525 	0x07340047, 0x06d2004b, 0x067a004f, 0x06170054,
526 	0x05bf0059, 0x0571005e, 0x051e0064, 0x04d3006a,
527 	0x04910070, 0x044c0077, 0x040f007e, 0x03d90085,
528 	0x03a1008d, 0x036f0095, 0x033d009e, 0x030b00a8,
529 	0x02e000b2, 0x02b900bc, 0x029200c7, 0x026d00d3,
530 	0x024900e0, 0x022900ed, 0x020a00fb, 0x01ec010a,
531 	0x01d20119, 0x01b7012a, 0x019e013c, 0x0188014e,
532 	0x01720162, 0x015d0177, 0x0149018e, 0x013701a5,
533 	0x012601be, 0x011501d8, 0x010601f4, 0x00f70212,
534 	0x00e90231, 0x00dc0253, 0x00d00276, 0x00c4029b,
535 	0x00b902c3, 0x00af02ed, 0x00a50319, 0x009c0348,
536 	0x0093037a, 0x008b03af, 0x008303e6, 0x007c0422,
537 	0x00750460, 0x006e04a3, 0x006804e9, 0x00620533,
538 	0x005d0582, 0x005805d6, 0x0053062e, 0x004e068c,
539 };
540 
541 static const u32 b43_httab_0x22[] = {
542 	0x0b5e002d, 0x0ae2002f, 0x0a3b0032, 0x09a70035,
543 	0x09220038, 0x08ab003b, 0x081f003f, 0x07a20043,
544 	0x07340047, 0x06d2004b, 0x067a004f, 0x06170054,
545 	0x05bf0059, 0x0571005e, 0x051e0064, 0x04d3006a,
546 	0x04910070, 0x044c0077, 0x040f007e, 0x03d90085,
547 	0x03a1008d, 0x036f0095, 0x033d009e, 0x030b00a8,
548 	0x02e000b2, 0x02b900bc, 0x029200c7, 0x026d00d3,
549 	0x024900e0, 0x022900ed, 0x020a00fb, 0x01ec010a,
550 	0x01d20119, 0x01b7012a, 0x019e013c, 0x0188014e,
551 	0x01720162, 0x015d0177, 0x0149018e, 0x013701a5,
552 	0x012601be, 0x011501d8, 0x010601f4, 0x00f70212,
553 	0x00e90231, 0x00dc0253, 0x00d00276, 0x00c4029b,
554 	0x00b902c3, 0x00af02ed, 0x00a50319, 0x009c0348,
555 	0x0093037a, 0x008b03af, 0x008303e6, 0x007c0422,
556 	0x00750460, 0x006e04a3, 0x006804e9, 0x00620533,
557 	0x005d0582, 0x005805d6, 0x0053062e, 0x004e068c,
558 };
559 
560 static const u32 b43_httab_0x24[] = {
561 	0x0b5e002d, 0x0ae2002f, 0x0a3b0032, 0x09a70035,
562 	0x09220038, 0x08ab003b, 0x081f003f, 0x07a20043,
563 	0x07340047, 0x06d2004b, 0x067a004f, 0x06170054,
564 	0x05bf0059, 0x0571005e, 0x051e0064, 0x04d3006a,
565 	0x04910070, 0x044c0077, 0x040f007e, 0x03d90085,
566 	0x03a1008d, 0x036f0095, 0x033d009e, 0x030b00a8,
567 	0x02e000b2, 0x02b900bc, 0x029200c7, 0x026d00d3,
568 	0x024900e0, 0x022900ed, 0x020a00fb, 0x01ec010a,
569 	0x01d20119, 0x01b7012a, 0x019e013c, 0x0188014e,
570 	0x01720162, 0x015d0177, 0x0149018e, 0x013701a5,
571 	0x012601be, 0x011501d8, 0x010601f4, 0x00f70212,
572 	0x00e90231, 0x00dc0253, 0x00d00276, 0x00c4029b,
573 	0x00b902c3, 0x00af02ed, 0x00a50319, 0x009c0348,
574 	0x0093037a, 0x008b03af, 0x008303e6, 0x007c0422,
575 	0x00750460, 0x006e04a3, 0x006804e9, 0x00620533,
576 	0x005d0582, 0x005805d6, 0x0053062e, 0x004e068c,
577 };
578 
579 /* Some late-init table */
580 const u32 b43_httab_0x1a_0xc0_late[] = {
581 	0x10f90040, 0x10e10040, 0x10e1003c, 0x10c9003d,
582 	0x10b9003c, 0x10a9003d, 0x10a1003c, 0x1099003b,
583 	0x1091003b, 0x1089003a, 0x1081003a, 0x10790039,
584 	0x10710039, 0x1069003a, 0x1061003b, 0x1059003d,
585 	0x1051003f, 0x10490042, 0x1049003e, 0x1049003b,
586 	0x1041003e, 0x1041003b, 0x1039003e, 0x1039003b,
587 	0x10390038, 0x10390035, 0x1031003a, 0x10310036,
588 	0x10310033, 0x1029003a, 0x10290037, 0x10290034,
589 	0x10290031, 0x10210039, 0x10210036, 0x10210033,
590 	0x10210030, 0x1019003c, 0x10190039, 0x10190036,
591 	0x10190033, 0x10190030, 0x1019002d, 0x1019002b,
592 	0x10190028, 0x1011003a, 0x10110036, 0x10110033,
593 	0x10110030, 0x1011002e, 0x1011002b, 0x10110029,
594 	0x10110027, 0x10110024, 0x10110022, 0x10110020,
595 	0x1011001f, 0x1011001d, 0x1009003a, 0x10090037,
596 	0x10090034, 0x10090031, 0x1009002e, 0x1009002c,
597 	0x10090029, 0x10090027, 0x10090025, 0x10090023,
598 	0x10090021, 0x1009001f, 0x1009001d, 0x1009001b,
599 	0x1009001a, 0x10090018, 0x10090017, 0x10090016,
600 	0x10090015, 0x10090013, 0x10090012, 0x10090011,
601 	0x10090010, 0x1009000f, 0x1009000f, 0x1009000e,
602 	0x1009000d, 0x1009000c, 0x1009000c, 0x1009000b,
603 	0x1009000a, 0x1009000a, 0x10090009, 0x10090009,
604 	0x10090008, 0x10090008, 0x10090007, 0x10090007,
605 	0x10090007, 0x10090006, 0x10090006, 0x10090005,
606 	0x10090005, 0x10090005, 0x10090005, 0x10090004,
607 	0x10090004, 0x10090004, 0x10090004, 0x10090003,
608 	0x10090003, 0x10090003, 0x10090003, 0x10090003,
609 	0x10090003, 0x10090002, 0x10090002, 0x10090002,
610 	0x10090002, 0x10090002, 0x10090002, 0x10090002,
611 	0x10090002, 0x10090002, 0x10090001, 0x10090001,
612 	0x10090001, 0x10090001, 0x10090001, 0x10090001,
613 };
614 
615 /**************************************************
616  * R/W ops.
617  **************************************************/
618 
619 u32 b43_httab_read(struct b43_wldev *dev, u32 offset)
620 {
621 	u32 type, value;
622 
623 	type = offset & B43_HTTAB_TYPEMASK;
624 	offset &= ~B43_HTTAB_TYPEMASK;
625 	B43_WARN_ON(offset > 0xFFFF);
626 
627 	switch (type) {
628 	case B43_HTTAB_8BIT:
629 		b43_phy_write(dev, B43_PHY_HT_TABLE_ADDR, offset);
630 		value = b43_phy_read(dev, B43_PHY_HT_TABLE_DATALO) & 0xFF;
631 		break;
632 	case B43_HTTAB_16BIT:
633 		b43_phy_write(dev, B43_PHY_HT_TABLE_ADDR, offset);
634 		value = b43_phy_read(dev, B43_PHY_HT_TABLE_DATALO);
635 		break;
636 	case B43_HTTAB_32BIT:
637 		b43_phy_write(dev, B43_PHY_HT_TABLE_ADDR, offset);
638 		value = b43_phy_read(dev, B43_PHY_HT_TABLE_DATAHI);
639 		value <<= 16;
640 		value |= b43_phy_read(dev, B43_PHY_HT_TABLE_DATALO);
641 		break;
642 	default:
643 		B43_WARN_ON(1);
644 		value = 0;
645 	}
646 
647 	return value;
648 }
649 
650 void b43_httab_read_bulk(struct b43_wldev *dev, u32 offset,
651 			 unsigned int nr_elements, void *_data)
652 {
653 	u32 type;
654 	u8 *data = _data;
655 	unsigned int i;
656 
657 	type = offset & B43_HTTAB_TYPEMASK;
658 	offset &= ~B43_HTTAB_TYPEMASK;
659 	B43_WARN_ON(offset > 0xFFFF);
660 
661 	b43_phy_write(dev, B43_PHY_HT_TABLE_ADDR, offset);
662 
663 	for (i = 0; i < nr_elements; i++) {
664 		switch (type) {
665 		case B43_HTTAB_8BIT:
666 			*data = b43_phy_read(dev, B43_PHY_HT_TABLE_DATALO) & 0xFF;
667 			data++;
668 			break;
669 		case B43_HTTAB_16BIT:
670 			*((u16 *)data) = b43_phy_read(dev, B43_PHY_HT_TABLE_DATALO);
671 			data += 2;
672 			break;
673 		case B43_HTTAB_32BIT:
674 			*((u32 *)data) = b43_phy_read(dev, B43_PHY_HT_TABLE_DATAHI);
675 			*((u32 *)data) <<= 16;
676 			*((u32 *)data) |= b43_phy_read(dev, B43_PHY_HT_TABLE_DATALO);
677 			data += 4;
678 			break;
679 		default:
680 			B43_WARN_ON(1);
681 		}
682 	}
683 }
684 
685 void b43_httab_write(struct b43_wldev *dev, u32 offset, u32 value)
686 {
687 	u32 type;
688 
689 	type = offset & B43_HTTAB_TYPEMASK;
690 	offset &= 0xFFFF;
691 
692 	switch (type) {
693 	case B43_HTTAB_8BIT:
694 		B43_WARN_ON(value & ~0xFF);
695 		b43_phy_write(dev, B43_PHY_HT_TABLE_ADDR, offset);
696 		b43_phy_write(dev, B43_PHY_HT_TABLE_DATALO, value);
697 		break;
698 	case B43_HTTAB_16BIT:
699 		B43_WARN_ON(value & ~0xFFFF);
700 		b43_phy_write(dev, B43_PHY_HT_TABLE_ADDR, offset);
701 		b43_phy_write(dev, B43_PHY_HT_TABLE_DATALO, value);
702 		break;
703 	case B43_HTTAB_32BIT:
704 		b43_phy_write(dev, B43_PHY_HT_TABLE_ADDR, offset);
705 		b43_phy_write(dev, B43_PHY_HT_TABLE_DATAHI, value >> 16);
706 		b43_phy_write(dev, B43_PHY_HT_TABLE_DATALO, value & 0xFFFF);
707 		break;
708 	default:
709 		B43_WARN_ON(1);
710 	}
711 
712 	return;
713 }
714 
715 void b43_httab_write_few(struct b43_wldev *dev, u32 offset, size_t num, ...)
716 {
717 	va_list args;
718 	u32 type, value;
719 	unsigned int i;
720 
721 	type = offset & B43_HTTAB_TYPEMASK;
722 	offset &= 0xFFFF;
723 
724 	va_start(args, num);
725 	switch (type) {
726 	case B43_HTTAB_8BIT:
727 		b43_phy_write(dev, B43_PHY_HT_TABLE_ADDR, offset);
728 		for (i = 0; i < num; i++) {
729 			value = va_arg(args, int);
730 			B43_WARN_ON(value & ~0xFF);
731 			b43_phy_write(dev, B43_PHY_HT_TABLE_DATALO, value);
732 		}
733 		break;
734 	case B43_HTTAB_16BIT:
735 		b43_phy_write(dev, B43_PHY_HT_TABLE_ADDR, offset);
736 		for (i = 0; i < num; i++) {
737 			value = va_arg(args, int);
738 			B43_WARN_ON(value & ~0xFFFF);
739 			b43_phy_write(dev, B43_PHY_HT_TABLE_DATALO, value);
740 		}
741 		break;
742 	case B43_HTTAB_32BIT:
743 		b43_phy_write(dev, B43_PHY_HT_TABLE_ADDR, offset);
744 		for (i = 0; i < num; i++) {
745 			value = va_arg(args, int);
746 			b43_phy_write(dev, B43_PHY_HT_TABLE_DATAHI,
747 				      value >> 16);
748 			b43_phy_write(dev, B43_PHY_HT_TABLE_DATALO,
749 				      value & 0xFFFF);
750 		}
751 		break;
752 	default:
753 		B43_WARN_ON(1);
754 	}
755 	va_end(args);
756 
757 	return;
758 }
759 
760 void b43_httab_write_bulk(struct b43_wldev *dev, u32 offset,
761 			  unsigned int nr_elements, const void *_data)
762 {
763 	u32 type, value;
764 	const u8 *data = _data;
765 	unsigned int i;
766 
767 	type = offset & B43_HTTAB_TYPEMASK;
768 	offset &= ~B43_HTTAB_TYPEMASK;
769 	B43_WARN_ON(offset > 0xFFFF);
770 
771 	b43_phy_write(dev, B43_PHY_HT_TABLE_ADDR, offset);
772 
773 	for (i = 0; i < nr_elements; i++) {
774 		switch (type) {
775 		case B43_HTTAB_8BIT:
776 			value = *data;
777 			data++;
778 			B43_WARN_ON(value & ~0xFF);
779 			b43_phy_write(dev, B43_PHY_HT_TABLE_DATALO, value);
780 			break;
781 		case B43_HTTAB_16BIT:
782 			value = *((u16 *)data);
783 			data += 2;
784 			B43_WARN_ON(value & ~0xFFFF);
785 			b43_phy_write(dev, B43_PHY_HT_TABLE_DATALO, value);
786 			break;
787 		case B43_HTTAB_32BIT:
788 			value = *((u32 *)data);
789 			data += 4;
790 			b43_phy_write(dev, B43_PHY_HT_TABLE_DATAHI, value >> 16);
791 			b43_phy_write(dev, B43_PHY_HT_TABLE_DATALO,
792 					value & 0xFFFF);
793 			break;
794 		default:
795 			B43_WARN_ON(1);
796 		}
797 	}
798 }
799 
800 /**************************************************
801  * Tables ops.
802  **************************************************/
803 
804 #define httab_upload(dev, offset, data) do { \
805 		b43_httab_write_bulk(dev, offset, ARRAY_SIZE(data), data); \
806 	} while (0)
807 void b43_phy_ht_tables_init(struct b43_wldev *dev)
808 {
809 	BUILD_BUG_ON(ARRAY_SIZE(b43_httab_0x1a_0xc0_late) !=
810 			B43_HTTAB_1A_C0_LATE_SIZE);
811 
812 	httab_upload(dev, B43_HTTAB16(0x12, 0), b43_httab_0x12);
813 	httab_upload(dev, B43_HTTAB16(0x27, 0), b43_httab_0x27);
814 	httab_upload(dev, B43_HTTAB16(0x26, 0), b43_httab_0x26);
815 	httab_upload(dev, B43_HTTAB32(0x25, 0), b43_httab_0x25);
816 	httab_upload(dev, B43_HTTAB32(0x2f, 0), b43_httab_0x2f);
817 	httab_upload(dev, B43_HTTAB16(0x1a, 0), b43_httab_0x1a);
818 	httab_upload(dev, B43_HTTAB16(0x1b, 0), b43_httab_0x1b);
819 	httab_upload(dev, B43_HTTAB16(0x1c, 0), b43_httab_0x1c);
820 	httab_upload(dev, B43_HTTAB32(0x1a, 0x0c0), b43_httab_0x1a_0xc0);
821 	httab_upload(dev, B43_HTTAB32(0x1a, 0x140), b43_httab_0x1a_0x140);
822 	httab_upload(dev, B43_HTTAB32(0x1b, 0x140), b43_httab_0x1b_0x140);
823 	httab_upload(dev, B43_HTTAB32(0x1c, 0x140), b43_httab_0x1c_0x140);
824 	httab_upload(dev, B43_HTTAB16(0x1a, 0x1c0), b43_httab_0x1a_0x1c0);
825 	httab_upload(dev, B43_HTTAB16(0x1b, 0x1c0), b43_httab_0x1b_0x1c0);
826 	httab_upload(dev, B43_HTTAB16(0x1c, 0x1c0), b43_httab_0x1c_0x1c0);
827 	httab_upload(dev, B43_HTTAB16(0x1a, 0x240), b43_httab_0x1a_0x240);
828 	httab_upload(dev, B43_HTTAB16(0x1b, 0x240), b43_httab_0x1b_0x240);
829 	httab_upload(dev, B43_HTTAB16(0x1c, 0x240), b43_httab_0x1c_0x240);
830 	httab_upload(dev, B43_HTTAB32(0x1f, 0), b43_httab_0x1f);
831 	httab_upload(dev, B43_HTTAB32(0x21, 0), b43_httab_0x21);
832 	httab_upload(dev, B43_HTTAB32(0x23, 0), b43_httab_0x23);
833 	httab_upload(dev, B43_HTTAB32(0x20, 0), b43_httab_0x20);
834 	httab_upload(dev, B43_HTTAB32(0x22, 0), b43_httab_0x22);
835 	httab_upload(dev, B43_HTTAB32(0x24, 0), b43_httab_0x24);
836 }
837