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
30static 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
55static 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
64static 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
89static 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
124static 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
133static 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
147static 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
161static 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
175static 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
210static 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
245static 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
280static 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
315static 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
340static 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
365static 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
390static 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
415static 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
440static 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
465static 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
484static 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
503static 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
522static 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
541static 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
560static 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 */
580const 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
619u32 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
650void 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
685void 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
715void 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
760void 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)
807void 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