ath9k_htc: Update to upstream's commit d19607454d656cb14d8c16dfbf161eebb542e8fe dated...
[linux-libre-firmware.git] / ath9k_htc / target_firmware / wlan / ieee80211.h
1 /*-
2  * Copyright (c) 2001 Atsushi Onoe
3  * Copyright (c) 2002-2005 Sam Leffler, Errno Consulting
4  * All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  * 3. The name of the author may not be used to endorse or promote products
15  *    derived from this software without specific prior written permission.
16  *
17  * Alternatively, this software may be distributed under the terms of the
18  * GNU General Public License ("GPL") version 2 as published by the Free
19  * Software Foundation.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
22  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
23  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
24  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
25  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
26  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
30  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  *
32  * $FreeBSD: src/sys/net80211/ieee80211.h,v 1.8 2004/12/31 22:44:26 sam Exp $
33  */
34 #ifndef _NET80211_IEEE80211_H_
35 #define _NET80211_IEEE80211_H_
36
37 /*
38  * 802.11 protocol definitions.
39  */
40
41 #define IEEE80211_ADDR_LEN      6               /* size of 802.11 address */
42 /* is 802.11 address multicast/broadcast? */
43 #define IEEE80211_IS_MULTICAST(_a)      (*(_a) & 0x01)
44
45 #ifdef __CARRIER_PLATFORM__
46 #include <ath_carr_pltfrm.h>
47 #endif
48
49 /* IEEE 802.11 PLCP header */
50 struct ieee80211_plcp_hdr {
51         a_uint16_t      i_sfd;
52         a_uint8_t       i_signal;
53         a_uint8_t       i_service;
54         a_uint16_t      i_length;
55         a_uint16_t      i_crc;
56 } adf_os_packed;
57
58 #define IEEE80211_PLCP_SFD      0xF3A0
59 #define IEEE80211_PLCP_SERVICE  0x00
60
61 /*
62  * generic definitions for IEEE 802.11 frames
63  */
64 struct ieee80211_frame {
65         a_uint8_t       i_fc[2];
66         a_uint8_t       i_dur[2];
67         a_uint8_t       i_addr1[IEEE80211_ADDR_LEN];
68         a_uint8_t       i_addr2[IEEE80211_ADDR_LEN];
69         a_uint8_t       i_addr3[IEEE80211_ADDR_LEN];
70         a_uint8_t       i_seq[2];
71         /* possibly followed by addr4[IEEE80211_ADDR_LEN]; */
72         /* see below */
73 } adf_os_packed;
74
75 struct ieee80211_qosframe {
76         a_uint8_t       i_fc[2];
77         a_uint8_t       i_dur[2];
78         a_uint8_t       i_addr1[IEEE80211_ADDR_LEN];
79         a_uint8_t       i_addr2[IEEE80211_ADDR_LEN];
80         a_uint8_t       i_addr3[IEEE80211_ADDR_LEN];
81         a_uint8_t       i_seq[2];
82         a_uint8_t       i_qos[2];
83         /* possibly followed by addr4[IEEE80211_ADDR_LEN]; */
84         /* see below */
85 } adf_os_packed;
86
87 struct ieee80211_qoscntl {
88         a_uint8_t       i_qos[2];
89 };
90
91 struct ieee80211_frame_addr4 {
92         a_uint8_t       i_fc[2];
93         a_uint8_t       i_dur[2];
94         a_uint8_t       i_addr1[IEEE80211_ADDR_LEN];
95         a_uint8_t       i_addr2[IEEE80211_ADDR_LEN];
96         a_uint8_t       i_addr3[IEEE80211_ADDR_LEN];
97         a_uint8_t       i_seq[2];
98         a_uint8_t       i_addr4[IEEE80211_ADDR_LEN];
99 } adf_os_packed;
100
101
102 struct ieee80211_qosframe_addr4 {
103         a_uint8_t       i_fc[2];
104         a_uint8_t       i_dur[2];
105         a_uint8_t       i_addr1[IEEE80211_ADDR_LEN];
106         a_uint8_t       i_addr2[IEEE80211_ADDR_LEN];
107         a_uint8_t       i_addr3[IEEE80211_ADDR_LEN];
108         a_uint8_t       i_seq[2];
109         a_uint8_t       i_addr4[IEEE80211_ADDR_LEN];
110         a_uint8_t       i_qos[2];
111 } adf_os_packed;
112
113 struct ieee80211_ctlframe_addr2 {
114         a_uint8_t       i_fc[2];
115         a_uint8_t       i_aidordur[2]; /* AID or duration */
116         a_uint8_t       i_addr1[IEEE80211_ADDR_LEN];
117         a_uint8_t       i_addr2[IEEE80211_ADDR_LEN];
118 } adf_os_packed;
119
120 #define IEEE80211_FC0_VERSION_MASK              0x03
121 #define IEEE80211_FC0_VERSION_SHIFT             0
122 #define IEEE80211_FC0_VERSION_0                 0x00
123 #define IEEE80211_FC0_TYPE_MASK                 0x0c
124 #define IEEE80211_FC0_TYPE_SHIFT                2
125 #define IEEE80211_FC0_TYPE_MGT                  0x00
126 #define IEEE80211_FC0_TYPE_CTL                  0x04
127 #define IEEE80211_FC0_TYPE_DATA                 0x08
128
129 #define IEEE80211_FC0_SUBTYPE_MASK              0xf0
130 #define IEEE80211_FC0_SUBTYPE_SHIFT             4
131 /* for TYPE_MGT */
132 #define IEEE80211_FC0_SUBTYPE_ASSOC_REQ         0x00
133 #define IEEE80211_FC0_SUBTYPE_ASSOC_RESP        0x10
134 #define IEEE80211_FC0_SUBTYPE_REASSOC_REQ       0x20
135 #define IEEE80211_FC0_SUBTYPE_REASSOC_RESP      0x30
136 #define IEEE80211_FC0_SUBTYPE_PROBE_REQ         0x40
137 #define IEEE80211_FC0_SUBTYPE_PROBE_RESP        0x50
138 #define IEEE80211_FC0_SUBTYPE_BEACON            0x80
139 #define IEEE80211_FC0_SUBTYPE_ATIM              0x90
140 #define IEEE80211_FC0_SUBTYPE_DISASSOC          0xa0
141 #define IEEE80211_FC0_SUBTYPE_AUTH              0xb0
142 #define IEEE80211_FC0_SUBTYPE_DEAUTH            0xc0
143 #define IEEE80211_FC0_SUBTYPE_ACTION            0xd0
144 /* for TYPE_CTL */
145 #define IEEE80211_FC0_SUBTYPE_BAR               0x80
146 #define IEEE80211_FC0_SUBTYPE_PS_POLL           0xa0
147 #define IEEE80211_FC0_SUBTYPE_RTS               0xb0
148 #define IEEE80211_FC0_SUBTYPE_CTS               0xc0
149 #define IEEE80211_FC0_SUBTYPE_ACK               0xd0
150 #define IEEE80211_FC0_SUBTYPE_CF_END            0xe0
151 #define IEEE80211_FC0_SUBTYPE_CF_END_ACK        0xf0
152 /* for TYPE_DATA (bit combination) */
153 #define IEEE80211_FC0_SUBTYPE_DATA              0x00
154 #define IEEE80211_FC0_SUBTYPE_CF_ACK            0x10
155 #define IEEE80211_FC0_SUBTYPE_CF_POLL           0x20
156 #define IEEE80211_FC0_SUBTYPE_CF_ACPL           0x30
157 #define IEEE80211_FC0_SUBTYPE_NODATA            0x40
158 #define IEEE80211_FC0_SUBTYPE_CFACK             0x50
159 #define IEEE80211_FC0_SUBTYPE_CFPOLL            0x60
160 #define IEEE80211_FC0_SUBTYPE_CF_ACK_CF_ACK     0x70
161 #define IEEE80211_FC0_SUBTYPE_QOS               0x80
162 #define IEEE80211_FC0_SUBTYPE_QOS_NULL          0xc0
163
164 #define IEEE80211_FC1_DIR_MASK                  0x03
165 #define IEEE80211_FC1_DIR_NODS                  0x00    /* STA->STA */
166 #define IEEE80211_FC1_DIR_TODS                  0x01    /* STA->AP  */
167 #define IEEE80211_FC1_DIR_FROMDS                0x02    /* AP ->STA */
168 #define IEEE80211_FC1_DIR_DSTODS                0x03    /* AP ->AP  */
169
170 #define IEEE80211_FC1_MORE_FRAG                 0x04
171 #define IEEE80211_FC1_RETRY                     0x08
172 #define IEEE80211_FC1_PWR_MGT                   0x10
173 #define IEEE80211_FC1_MORE_DATA                 0x20
174 #define IEEE80211_FC1_WEP                       0x40
175 #define IEEE80211_FC1_ORDER                     0x80
176
177 #define IEEE80211_SEQ_FRAG_MASK                 0x000f
178 #define IEEE80211_SEQ_FRAG_SHIFT                0
179 #define IEEE80211_SEQ_SEQ_MASK                  0xfff0
180 #define IEEE80211_SEQ_SEQ_SHIFT                 4
181
182 #define IEEE80211_SEQ_LEQ(a,b)  ((a_int32_t)((a)-(b)) <= 0)
183
184 #define IEEE80211_NWID_LEN                      32
185
186 #define IEEE80211_QOS_TXOP                      0x00ff
187
188 #define IEEE80211_QOS_AMSDU                     0x80
189 #define IEEE80211_QOS_AMSDU_S                   7
190 #define IEEE80211_QOS_ACKPOLICY                 0x60
191 #define IEEE80211_QOS_ACKPOLICY_S               5
192 #define IEEE80211_QOS_EOSP                      0x10
193 #define IEEE80211_QOS_EOSP_S                    4
194 #define IEEE80211_QOS_TID                       0x0f
195
196 /*
197  * Country/Region Codes from MS WINNLS.H
198  * Numbering from ISO 3166
199  * XXX belongs elsewhere
200  */
201 enum CountryCode {
202     CTRY_ALBANIA              = 8,       /* Albania */
203     CTRY_ALGERIA              = 12,      /* Algeria */
204     CTRY_ARGENTINA            = 32,      /* Argentina */
205     CTRY_ARMENIA              = 51,      /* Armenia */
206     CTRY_AUSTRALIA            = 36,      /* Australia */
207     CTRY_AUSTRIA              = 40,      /* Austria */
208     CTRY_AZERBAIJAN           = 31,      /* Azerbaijan */
209     CTRY_BAHRAIN              = 48,      /* Bahrain */
210     CTRY_BELARUS              = 112,     /* Belarus */
211     CTRY_BELGIUM              = 56,      /* Belgium */
212     CTRY_BELIZE               = 84,      /* Belize */
213     CTRY_BOLIVIA              = 68,      /* Bolivia */
214     CTRY_BOSNIA_HERZEGOWINA   = 70,      /* Bosnia and Herzegowina */
215     CTRY_BRAZIL               = 76,      /* Brazil */
216     CTRY_BRUNEI_DARUSSALAM    = 96,      /* Brunei Darussalam */
217     CTRY_BULGARIA             = 100,     /* Bulgaria */
218     CTRY_CANADA               = 124,     /* Canada */
219     CTRY_CHILE                = 152,     /* Chile */
220     CTRY_CHINA                = 156,     /* People's Republic of China */
221     CTRY_COLOMBIA             = 170,     /* Colombia */
222     CTRY_COSTA_RICA           = 188,     /* Costa Rica */
223     CTRY_CROATIA              = 191,     /* Croatia */
224     CTRY_CYPRUS               = 196,
225     CTRY_CZECH                = 203,     /* Czech Republic */
226     CTRY_DENMARK              = 208,     /* Denmark */
227     CTRY_DOMINICAN_REPUBLIC   = 214,     /* Dominican Republic */
228     CTRY_ECUADOR              = 218,     /* Ecuador */
229     CTRY_EGYPT                = 818,     /* Egypt */
230     CTRY_EL_SALVADOR          = 222,     /* El Salvador */
231     CTRY_ESTONIA              = 233,     /* Estonia */
232     CTRY_FAEROE_ISLANDS       = 234,     /* Faeroe Islands */
233     CTRY_FINLAND              = 246,     /* Finland */
234     CTRY_FRANCE               = 250,     /* France */
235     CTRY_FRANCE2              = 255,     /* France2 */
236     CTRY_GEORGIA              = 268,     /* Georgia */
237     CTRY_GERMANY              = 276,     /* Germany */
238     CTRY_GREECE               = 300,     /* Greece */
239     CTRY_GUATEMALA            = 320,     /* Guatemala */
240     CTRY_HONDURAS             = 340,     /* Honduras */
241     CTRY_HONG_KONG            = 344,     /* Hong Kong S.A.R., P.R.C. */
242     CTRY_HUNGARY              = 348,     /* Hungary */
243     CTRY_ICELAND              = 352,     /* Iceland */
244     CTRY_INDIA                = 356,     /* India */
245     CTRY_INDONESIA            = 360,     /* Indonesia */
246     CTRY_IRAN                 = 364,     /* Iran */
247     CTRY_IRAQ                 = 368,     /* Iraq */
248     CTRY_IRELAND              = 372,     /* Ireland */
249     CTRY_ISRAEL               = 376,     /* Israel */
250     CTRY_ITALY                = 380,     /* Italy */
251     CTRY_JAMAICA              = 388,     /* Jamaica */
252     CTRY_JAPAN                = 392,     /* Japan */
253     CTRY_JAPAN1               = 393,     /* Japan (JP1) */
254     CTRY_JAPAN2               = 394,     /* Japan (JP0) */
255     CTRY_JAPAN3               = 395,     /* Japan (JP1-1) */
256     CTRY_JAPAN4               = 396,     /* Japan (JE1) */
257     CTRY_JAPAN5               = 397,     /* Japan (JE2) */
258     CTRY_JAPAN6               = 399,     /* Japan (JP6) */
259     CTRY_JAPAN7               = 4007,    /* Japan */
260     CTRY_JAPAN8               = 4008,    /* Japan */
261     CTRY_JAPAN9               = 4009,    /* Japan */
262     CTRY_JAPAN10              = 4010,    /* Japan */
263     CTRY_JAPAN11              = 4011,    /* Japan */
264     CTRY_JAPAN12              = 4012,    /* Japan */
265     CTRY_JAPAN13              = 4013,    /* Japan */
266     CTRY_JAPAN14              = 4014,    /* Japan */
267     CTRY_JAPAN15              = 4015,    /* Japan */
268     CTRY_JAPAN16              = 4016,    /* Japan */
269     CTRY_JAPAN17              = 4017,    /* Japan */
270     CTRY_JAPAN18              = 4018,    /* Japan */
271     CTRY_JAPAN19              = 4019,    /* Japan */
272     CTRY_JAPAN20              = 4020,    /* Japan */
273     CTRY_JAPAN21              = 4021,    /* Japan */
274     CTRY_JAPAN22              = 4022,    /* Japan */
275     CTRY_JAPAN23              = 4023,    /* Japan */
276     CTRY_JAPAN24              = 4024,    /* Japan */
277     CTRY_JORDAN               = 400,     /* Jordan */
278     CTRY_KAZAKHSTAN           = 398,     /* Kazakhstan */
279     CTRY_KENYA                = 404,     /* Kenya */
280     CTRY_KOREA_NORTH          = 408,     /* North Korea */
281     CTRY_KOREA_ROC            = 410,     /* South Korea */
282     CTRY_KOREA_ROC2           = 411,     /* South Korea */
283     CTRY_KUWAIT               = 414,     /* Kuwait */
284     CTRY_LATVIA               = 428,     /* Latvia */
285     CTRY_LEBANON              = 422,     /* Lebanon */
286     CTRY_LIBYA                = 434,     /* Libya */
287     CTRY_LIECHTENSTEIN        = 438,     /* Liechtenstein */
288     CTRY_LITHUANIA            = 440,     /* Lithuania */
289     CTRY_LUXEMBOURG           = 442,     /* Luxembourg */
290     CTRY_MACAU                = 446,     /* Macau */
291     CTRY_MACEDONIA            = 807,     /* the Former Yugoslav Republic of Macedonia */
292     CTRY_MALAYSIA             = 458,     /* Malaysia */
293     CTRY_MEXICO               = 484,     /* Mexico */
294     CTRY_MONACO               = 492,     /* Principality of Monaco */
295     CTRY_MOROCCO              = 504,     /* Morocco */
296     CTRY_NETHERLANDS          = 528,     /* Netherlands */
297     CTRY_NEW_ZEALAND          = 554,     /* New Zealand */
298     CTRY_NICARAGUA            = 558,     /* Nicaragua */
299     CTRY_NORWAY               = 578,     /* Norway */
300     CTRY_OMAN                 = 512,     /* Oman */
301     CTRY_PAKISTAN             = 586,     /* Islamic Republic of Pakistan */
302     CTRY_PANAMA               = 591,     /* Panama */
303     CTRY_PARAGUAY             = 600,     /* Paraguay */
304     CTRY_PERU                 = 604,     /* Peru */
305     CTRY_PHILIPPINES          = 608,     /* Republic of the Philippines */
306     CTRY_POLAND               = 616,     /* Poland */
307     CTRY_PORTUGAL             = 620,     /* Portugal */
308     CTRY_PUERTO_RICO          = 630,     /* Puerto Rico */
309     CTRY_QATAR                = 634,     /* Qatar */
310     CTRY_ROMANIA              = 642,     /* Romania */
311     CTRY_RUSSIA               = 643,     /* Russia */
312     CTRY_SAUDI_ARABIA         = 682,     /* Saudi Arabia */
313     CTRY_SINGAPORE            = 702,     /* Singapore */
314     CTRY_SLOVAKIA             = 703,     /* Slovak Republic */
315     CTRY_SLOVENIA             = 705,     /* Slovenia */
316     CTRY_SOUTH_AFRICA         = 710,     /* South Africa */
317     CTRY_SPAIN                = 724,     /* Spain */
318     CTRY_SRI_LANKA            = 144,     /* Sri Lanka */
319     CTRY_SWEDEN               = 752,     /* Sweden */
320     CTRY_SWITZERLAND          = 756,     /* Switzerland */
321     CTRY_SYRIA                = 760,     /* Syria */
322     CTRY_TAIWAN               = 158,     /* Taiwan */
323     CTRY_THAILAND             = 764,     /* Thailand */
324     CTRY_TRINIDAD_Y_TOBAGO    = 780,     /* Trinidad y Tobago */
325     CTRY_TUNISIA              = 788,     /* Tunisia */
326     CTRY_TURKEY               = 792,     /* Turkey */
327     CTRY_UAE                  = 784,     /* U.A.E. */
328     CTRY_UKRAINE              = 804,     /* Ukraine */
329     CTRY_UNITED_KINGDOM       = 826,     /* United Kingdom */
330     CTRY_UNITED_STATES        = 840,     /* United States */
331     CTRY_UNITED_STATES_FCC49  = 842,     /* United States (Public Safety)*/
332     CTRY_URUGUAY              = 858,     /* Uruguay */
333     CTRY_UZBEKISTAN           = 860,     /* Uzbekistan */
334     CTRY_VENEZUELA            = 862,     /* Venezuela */
335     CTRY_VIET_NAM             = 704,     /* Viet Nam */
336     CTRY_YEMEN                = 887,     /* Yemen */
337     CTRY_ZIMBABWE             = 716,     /* Zimbabwe */
338     CTRY_AUSTRALIA2           = 5000,    /* Australia */
339     CTRY_CANADA2              = 5001     /* Canada */
340 };
341
342 /*
343  * Country information element.
344  */
345 #define IEEE80211_COUNTRY_MAX_TRIPLETS (83)
346 struct ieee80211_ie_country {
347         a_uint8_t       country_id;
348         a_uint8_t       country_len;
349         a_uint8_t       country_str[3];
350         a_uint8_t       country_triplet[IEEE80211_COUNTRY_MAX_TRIPLETS*3];
351 } adf_os_packed;
352
353 /* does frame have QoS sequence control data */
354 #define IEEE80211_QOS_HAS_SEQ(wh)                                       \
355         (((wh)->i_fc[0] &                                               \
356           (IEEE80211_FC0_TYPE_MASK | IEEE80211_FC0_SUBTYPE_QOS)) ==     \
357          (IEEE80211_FC0_TYPE_DATA | IEEE80211_FC0_SUBTYPE_QOS))
358
359 #define WME_QOSINFO_COUNT       0x0f  /* Mask for Param Set Count field */
360 /*
361  * WME/802.11e information element.
362  */
363 struct ieee80211_ie_wme {
364         a_uint8_t       wme_id;         /* IEEE80211_ELEMID_VENDOR */
365         a_uint8_t       wme_len;        /* length in bytes */
366         a_uint8_t       wme_oui[3];     /* 0x00, 0x50, 0xf2 */
367         a_uint8_t       wme_type;       /* OUI type */
368         a_uint8_t       wme_subtype;    /* OUI subtype */
369         a_uint8_t       wme_version;    /* spec revision */
370         a_uint8_t       wme_info;       /* QoS info */
371 } adf_os_packed;
372
373 /*
374  * WME/802.11e Tspec Element
375  */
376 struct ieee80211_wme_tspec {
377         a_uint8_t       ts_id;
378         a_uint8_t       ts_len;
379         a_uint8_t       ts_oui[3];
380         a_uint8_t       ts_oui_type;
381         a_uint8_t       ts_oui_subtype;
382         a_uint8_t       ts_version;
383         a_uint8_t       ts_tsinfo[3];
384         a_uint8_t       ts_nom_msdu[2];
385         a_uint8_t       ts_max_msdu[2];
386         a_uint8_t       ts_min_svc[4];
387         a_uint8_t       ts_max_svc[4];
388         a_uint8_t       ts_inactv_intv[4];
389         a_uint8_t       ts_susp_intv[4];
390         a_uint8_t       ts_start_svc[4];
391         a_uint8_t       ts_min_rate[4];
392         a_uint8_t       ts_mean_rate[4];
393         a_uint8_t       ts_max_burst[4];
394         a_uint8_t       ts_min_phy[4];
395         a_uint8_t       ts_peak_rate[4];
396         a_uint8_t       ts_delay[4];
397         a_uint8_t       ts_surplus[2];
398         a_uint8_t       ts_medium_time[2];
399 } adf_os_packed;
400
401 /*
402  * WME AC parameter field
403  */
404
405 struct ieee80211_wme_acparams {
406         a_uint8_t       acp_aci_aifsn;
407         a_uint8_t       acp_logcwminmax;
408         a_uint16_t      acp_txop;
409 } adf_os_packed;
410
411 #define IEEE80211_WME_PARAM_LEN 24
412 #define WME_NUM_AC              4       /* 4 AC categories */
413
414 #define WME_PARAM_ACI           0x60    /* Mask for ACI field */
415 #define WME_PARAM_ACI_S         5       /* Shift for ACI field */
416 #define WME_PARAM_ACM           0x10    /* Mask for ACM bit */
417 #define WME_PARAM_ACM_S         4       /* Shift for ACM bit */
418 #define WME_PARAM_AIFSN         0x0f    /* Mask for aifsn field */
419 #define WME_PARAM_AIFSN_S       0       /* Shift for aifsn field */
420 #define WME_PARAM_LOGCWMIN      0x0f    /* Mask for CwMin field (in log) */
421 #define WME_PARAM_LOGCWMIN_S    0       /* Shift for CwMin field */
422 #define WME_PARAM_LOGCWMAX      0xf0    /* Mask for CwMax field (in log) */
423 #define WME_PARAM_LOGCWMAX_S    4       /* Shift for CwMax field */
424
425 #define WME_AC_TO_TID(_ac) (                    \
426                 ((_ac) == WME_AC_VO) ? 6 :      \
427                 ((_ac) == WME_AC_VI) ? 5 :      \
428                 ((_ac) == WME_AC_BK) ? 1 :      \
429                 0)
430
431 #define TID_TO_WME_AC(_tid) (                                   \
432                 (((_tid) == 0) || ((_tid) == 3)) ? WME_AC_BE :  \
433                 (((_tid) == 1) || ((_tid) == 2)) ? WME_AC_BK :  \
434                 (((_tid) == 4) || ((_tid) == 5)) ? WME_AC_VI :  \
435                 WME_AC_VO)
436
437 /*
438  * WME Parameter Element
439  */
440
441 struct ieee80211_wme_param {
442         a_uint8_t       param_id;
443         a_uint8_t       param_len;
444         a_uint8_t       param_oui[3];
445         a_uint8_t       param_oui_type;
446         a_uint8_t       param_oui_sybtype;
447         a_uint8_t       param_version;
448         a_uint8_t       param_qosInfo;
449         a_uint8_t       param_reserved;
450         struct ieee80211_wme_acparams   params_acParams[WME_NUM_AC];
451 } adf_os_packed;
452
453 /*
454  * WME U-APSD qos info field defines
455  */
456 #define WME_CAPINFO_UAPSD_EN                    0x00000080
457 #define WME_CAPINFO_UAPSD_VO                    0x00000001
458 #define WME_CAPINFO_UAPSD_VI                    0x00000002
459 #define WME_CAPINFO_UAPSD_BK                    0x00000004
460 #define WME_CAPINFO_UAPSD_BE                    0x00000008
461 #define WME_CAPINFO_UAPSD_ACFLAGS_SHIFT         0
462 #define WME_CAPINFO_UAPSD_ACFLAGS_MASK          0xF
463 #define WME_CAPINFO_UAPSD_MAXSP_SHIFT           5
464 #define WME_CAPINFO_UAPSD_MAXSP_MASK            0x3
465 #define WME_CAPINFO_IE_OFFSET                   8
466 #define WME_UAPSD_MAXSP(_qosinfo) (((_qosinfo) >> WME_CAPINFO_UAPSD_MAXSP_SHIFT) & WME_CAPINFO_UAPSD_MAXSP_MASK)
467 #define WME_UAPSD_AC_ENABLED(_ac, _qosinfo) ( (1<<(3 - (_ac))) &   \
468                 (((_qosinfo) >> WME_CAPINFO_UAPSD_ACFLAGS_SHIFT) & WME_CAPINFO_UAPSD_ACFLAGS_MASK) )
469
470 /*
471  * Atheros Advanced Capability information element.
472  */
473 struct ieee80211_ie_athAdvCap {
474         a_uint8_t       athAdvCap_id;           /* IEEE80211_ELEMID_VENDOR */
475         a_uint8_t       athAdvCap_len;          /* length in bytes */
476         a_uint8_t       athAdvCap_oui[3];       /* 0x00, 0x03, 0x7f */
477         a_uint8_t       athAdvCap_type;         /* OUI type */
478         a_uint8_t       athAdvCap_subtype;      /* OUI subtype */
479         a_uint8_t       athAdvCap_version;      /* spec revision */
480         a_uint8_t       athAdvCap_capability;   /* Capability info */
481         a_uint16_t      athAdvCap_defKeyIndex;
482 } adf_os_packed;
483
484 /*
485  * Atheros Extended Capability information element.
486  */
487 struct ieee80211_ie_ath_extcap {
488         a_uint8_t       ath_extcap_id;  /* IEEE80211_ELEMID_VENDOR */
489         a_uint8_t       ath_extcap_len; /* length in bytes */
490         a_uint8_t       ath_extcap_oui[3];      /* 0x00, 0x03, 0x7f */
491         a_uint8_t       ath_extcap_type;        /* OUI type */
492         a_uint8_t       ath_extcap_subtype;     /* OUI subtype */
493         a_uint8_t       ath_extcap_version;     /* spec revision */
494         a_uint32_t      ath_extcap_data;        /* Data */
495 } adf_os_packed;
496
497 /*
498  * Atheros XR information element.
499  */
500 struct ieee80211_xr_param {
501         a_uint8_t       param_id;
502         a_uint8_t       param_len;
503         a_uint8_t       param_oui[3];
504         a_uint8_t       param_oui_type;
505         a_uint8_t       param_oui_sybtype;
506         a_uint8_t       param_version;
507         a_uint8_t       param_Info;
508         a_uint8_t       param_base_bssid[IEEE80211_ADDR_LEN];
509         a_uint8_t       param_xr_bssid[IEEE80211_ADDR_LEN];
510         a_uint16_t      param_xr_beacon_interval;
511         a_uint8_t       param_base_ath_capability;
512         a_uint8_t       param_xr_ath_capability;
513 } adf_os_packed;
514
515 /*
516  * Management Action Frames
517  */
518
519 /* generic frame format */
520 struct ieee80211_action {
521         a_uint8_t       ia_category;
522         a_uint8_t       ia_action;
523 } adf_os_packed;
524
525 /* categories */
526 #define IEEE80211_ACTION_CAT_QOS                0       /* qos */
527 #define IEEE80211_ACTION_CAT_BA                 3       /* BA */
528 #define IEEE80211_ACTION_CAT_HT                 7       /* HT per IEEE802.11n-D1.06 */
529
530 /* HT actions */
531 #define IEEE80211_ACTION_HT_TXCHWIDTH           0       /* recommended transmission channel width */
532 #define IEEE80211_ACTION_HT_SMPOWERSAVE         1       /* Spatial Multiplexing (SM) Power Save */
533
534
535 /* HT - recommended transmission channel width */
536 struct ieee80211_action_ht_txchwidth {
537         struct ieee80211_action         at_header;
538         a_uint8_t                       at_chwidth;
539 } adf_os_packed;
540
541 #define IEEE80211_A_HT_TXCHWIDTH_20     0
542 #define IEEE80211_A_HT_TXCHWIDTH_2040   1
543
544
545 /* HT - Spatial Multiplexing (SM) Power Save */
546 struct ieee80211_action_ht_smpowersave {
547         struct ieee80211_action         as_header;
548         a_uint8_t                       as_control;
549 } adf_os_packed;
550
551 /* values defined for 'as_control' field per 802.11n-D1.06 */
552 #define IEEE80211_A_HT_SMPOWERSAVE_DISABLED     0x00   /* SM Power Save Disabled, SM packets ok  */
553 #define IEEE80211_A_HT_SMPOWERSAVE_ENABLED      0x01   /* SM Power Save Enabled bit  */
554 #define IEEE80211_A_HT_SMPOWERSAVE_MODE         0x02   /* SM Power Save Mode bit */
555 #define IEEE80211_A_HT_SMPOWERSAVE_RESERVED     0xFC   /* SM Power Save Reserved bits */
556
557 /* values defined for SM Power Save Mode bit */
558 #define IEEE80211_A_HT_SMPOWERSAVE_STATIC       0x00   /* Static, SM packets not ok */
559 #define IEEE80211_A_HT_SMPOWERSAVE_DYNAMIC      0x02   /* Dynamic, SM packets ok if preceded by RTS */
560
561 /* BA actions */
562 #define IEEE80211_ACTION_BA_ADDBA_REQUEST       0   /* ADDBA request */
563 #define IEEE80211_ACTION_BA_ADDBA_RESPONSE      1   /* ADDBA response */
564 #define IEEE80211_ACTION_BA_DELBA               2   /* DELBA */
565
566 struct ieee80211_ba_parameterset {
567 #if _BYTE_ORDER == _BIG_ENDIAN
568         a_uint16_t      buffersize      : 10,   /* B6-15  buffer size */
569                         tid             : 4,    /* B2-5   TID */
570                         bapolicy        : 1,    /* B1   block ack policy */
571                         reserved0       : 1;    /* B0   reserved */
572 #else
573         a_uint16_t      reserved0       : 1,    /* B0   reserved */
574                         bapolicy        : 1,    /* B1   block ack policy */
575                         tid             : 4,    /* B2-5   TID */
576                         buffersize      : 10;   /* B6-15  buffer size */
577 #endif
578 } adf_os_packed;
579
580 #define  IEEE80211_BA_POLICY_DELAYED      0
581 #define  IEEE80211_BA_POLICY_IMMEDIATE    1
582
583 struct ieee80211_ba_seqctrl {
584     a_uint16_t              startseq;
585 } adf_os_packed;
586
587 struct ieee80211_delba_parameterset {
588 #if _BYTE_ORDER == _BIG_ENDIAN
589         a_uint16_t      tid             : 4,     /* B12-15  tid */
590                         initiator       : 1,     /* B11     initiator */
591                         reserved0       : 11;    /* B0-10   reserved */
592 #else
593         a_uint16_t      reserved0       : 11,    /* B0-10   reserved */
594                         initiator       : 1,     /* B11     initiator */
595                         tid             : 4;     /* B12-15  tid */
596 #endif
597 } adf_os_packed;
598
599 /* BA - ADDBA request */
600 struct ieee80211_action_ba_addbarequest {
601         struct ieee80211_action                 rq_header;
602         a_uint8_t                               rq_dialogtoken;
603         struct ieee80211_ba_parameterset        rq_baparamset;
604         a_uint16_t                              rq_batimeout;   /* in TUs */
605         struct ieee80211_ba_seqctrl             rq_basequencectrl;
606 } adf_os_packed;
607
608 /* BA - ADDBA response */
609 struct ieee80211_action_ba_addbaresponse {
610         struct ieee80211_action                 rs_header;
611         a_uint8_t                               rs_dialogtoken;
612         a_uint16_t                              rs_statuscode;
613         struct ieee80211_ba_parameterset        rs_baparamset;
614         a_uint16_t                              rs_batimeout;          /* in TUs */
615 } adf_os_packed;
616
617 /* BA - DELBA */
618 struct ieee80211_action_ba_delba {
619         struct ieee80211_action                 dl_header;
620         struct ieee80211_delba_parameterset     dl_delbaparamset;
621         a_uint16_t                              dl_reasoncode;
622 } adf_os_packed;
623
624 /*
625  * Control frames.
626  */
627 struct ieee80211_frame_min {
628         a_uint8_t       i_fc[2];
629         a_uint8_t       i_dur[2];
630         a_uint8_t       i_addr1[IEEE80211_ADDR_LEN];
631         a_uint8_t       i_addr2[IEEE80211_ADDR_LEN];
632         /* FCS */
633 } adf_os_packed;
634
635 /*
636  * BAR frame format
637  */
638 #define IEEE80211_BAR_CTL_TID_M     0xF000      /* tid mask             */
639 #define IEEE80211_BAR_CTL_TID_S         12      /* tid shift            */
640 #define IEEE80211_BAR_CTL_NOACK     0x0001      /* no-ack policy        */
641 #define IEEE80211_BAR_CTL_COMBA     0x0004      /* compressed block-ack */
642 struct ieee80211_frame_bar {
643         a_uint8_t       i_fc[2];
644         a_uint8_t       i_dur[2];
645         a_uint8_t       i_ra[IEEE80211_ADDR_LEN];
646         a_uint8_t       i_ta[IEEE80211_ADDR_LEN];
647     a_uint16_t   i_ctl;
648     a_uint16_t   i_seq;
649         /* FCS */
650 } adf_os_packed;
651
652 struct ieee80211_frame_rts {
653         a_uint8_t       i_fc[2];
654         a_uint8_t       i_dur[2];
655         a_uint8_t       i_ra[IEEE80211_ADDR_LEN];
656         a_uint8_t       i_ta[IEEE80211_ADDR_LEN];
657         /* FCS */
658 } adf_os_packed;
659
660 struct ieee80211_frame_cts {
661         a_uint8_t       i_fc[2];
662         a_uint8_t       i_dur[2];
663         a_uint8_t       i_ra[IEEE80211_ADDR_LEN];
664         /* FCS */
665 } adf_os_packed;
666
667 struct ieee80211_frame_ack {
668         a_uint8_t       i_fc[2];
669         a_uint8_t       i_dur[2];
670         a_uint8_t       i_ra[IEEE80211_ADDR_LEN];
671         /* FCS */
672 } adf_os_packed;
673
674 struct ieee80211_frame_pspoll {
675         a_uint8_t       i_fc[2];
676         a_uint8_t       i_aid[2];
677         a_uint8_t       i_bssid[IEEE80211_ADDR_LEN];
678         a_uint8_t       i_ta[IEEE80211_ADDR_LEN];
679         /* FCS */
680 } adf_os_packed;
681
682 struct ieee80211_frame_cfend {          /* NB: also CF-End+CF-Ack */
683         a_uint8_t       i_fc[2];
684         a_uint8_t       i_dur[2];       /* should be zero */
685         a_uint8_t       i_ra[IEEE80211_ADDR_LEN];
686         a_uint8_t       i_bssid[IEEE80211_ADDR_LEN];
687         /* FCS */
688 } adf_os_packed;
689
690 /*
691  * BEACON management packets
692  *
693  *      octet timestamp[8]
694  *      octet beacon interval[2]
695  *      octet capability information[2]
696  *      information element
697  *              octet elemid
698  *              octet length
699  *              octet information[length]
700  */
701
702 typedef a_uint8_t *ieee80211_mgt_beacon_t;
703
704 #define IEEE80211_BEACON_INTERVAL(beacon) \
705         ((beacon)[8] | ((beacon)[9] << 8))
706 #define IEEE80211_BEACON_CAPABILITY(beacon) \
707         ((beacon)[10] | ((beacon)[11] << 8))
708
709 #define IEEE80211_CAPINFO_ESS                   0x0001
710 #define IEEE80211_CAPINFO_IBSS                  0x0002
711 #define IEEE80211_CAPINFO_CF_POLLABLE           0x0004
712 #define IEEE80211_CAPINFO_CF_POLLREQ            0x0008
713 #define IEEE80211_CAPINFO_PRIVACY               0x0010
714 #define IEEE80211_CAPINFO_SHORT_PREAMBLE        0x0020
715 #define IEEE80211_CAPINFO_PBCC                  0x0040
716 #define IEEE80211_CAPINFO_CHNL_AGILITY          0x0080
717 /* bits 8-9 are reserved (8 now for specturm management) */
718 #define IEEE80211_CAPINFO_SPECTRUM_MGMT         0x0100
719 #define IEEE80211_CAPINFO_SHORT_SLOTTIME        0x0400
720 #define IEEE80211_CAPINFO_RSN                   0x0800
721 /* bit 12 is reserved */
722 #define IEEE80211_CAPINFO_DSSSOFDM              0x2000
723 /* bits 14-15 are reserved */
724
725 /*
726  * 802.11i/WPA information element (maximally sized).
727  */
728 struct ieee80211_ie_wpa {
729         a_uint8_t       wpa_id;         /* IEEE80211_ELEMID_VENDOR */
730         a_uint8_t       wpa_len;        /* length in bytes */
731         a_uint8_t       wpa_oui[3];     /* 0x00, 0x50, 0xf2 */
732         a_uint8_t       wpa_type;       /* OUI type */
733         a_uint16_t      wpa_version;    /* spec revision */
734         a_uint32_t      wpa_mcipher[1]; /* multicast/group key cipher */
735         a_uint16_t      wpa_uciphercnt; /* # pairwise key ciphers */
736         a_uint32_t      wpa_uciphers[8];/* ciphers */
737         a_uint16_t      wpa_authselcnt; /* authentication selector cnt*/
738         a_uint32_t      wpa_authsels[8];/* selectors */
739         a_uint16_t      wpa_caps;       /* 802.11i capabilities */
740         a_uint16_t      wpa_pmkidcnt;   /* 802.11i pmkid count */
741         a_uint16_t      wpa_pmkids[8];  /* 802.11i pmkids */
742 } adf_os_packed;
743
744 #ifndef _BYTE_ORDER
745 #error "Don't know native byte order"
746 #endif
747
748 #ifndef IEEE80211N_IE
749 /* Temporary vendor specific IE for 11n pre-standard interoperability */
750 #define HT_OUI 0x4c9000
751 #endif
752
753 struct ieee80211_ie_htcap_cmn {
754         a_uint16_t      hc_cap;                 /* HT capabilities */
755 #if _BYTE_ORDER == _BIG_ENDIAN
756         a_uint8_t       hc_reserved     : 3,    /* B5-7 reserved */
757                 hc_mpdudensity  : 3,    /* B2-4 MPDU density (aka Minimum MPDU Start Spacing) */
758                 hc_maxampdu     : 2;    /* B0-1 maximum rx A-MPDU factor */
759 #else
760         a_uint8_t       hc_maxampdu     : 2,    /* B0-1 maximum rx A-MPDU factor */
761                 hc_mpdudensity  : 3,    /* B2-4 MPDU density (aka Minimum MPDU Start Spacing) */
762                 hc_reserved     : 3;    /* B5-7 reserved */
763 #endif
764         a_uint8_t       hc_mcsset[16];          /* supported MCS set */
765         a_uint16_t      hc_extcap;              /* extended HT capabilities */
766         a_uint32_t      hc_txbf;                /* txbf capabilities */
767         a_uint8_t       hc_antenna;             /* antenna capabilities */
768 } adf_os_packed;
769
770 /*
771  * 802.11n HT Capability IE
772  */
773 struct ieee80211_ie_htcap {
774         a_uint8_t                           hc_id;                      /* element ID */
775         a_uint8_t                           hc_len;                     /* length in bytes */
776         struct ieee80211_ie_htcap_cmn       hc_ie;
777 } adf_os_packed;
778
779 /*
780  * Temporary vendor private HT Capability IE
781  */
782 struct vendor_ie_htcap {
783         a_uint8_t                           hc_id;                      /* element ID */
784         a_uint8_t                           hc_len;                     /* length in bytes */
785         a_uint8_t                           hc_oui[3];
786         a_uint8_t                           hc_ouitype;
787         struct ieee80211_ie_htcap_cmn       hc_ie;
788 } adf_os_packed;
789
790 /* HT capability flags */
791 #define IEEE80211_HTCAP_C_ADVCODING               0x0001
792 #define IEEE80211_HTCAP_C_CHWIDTH40               0x0002
793 #define IEEE80211_HTCAP_C_SMPOWERSAVE_STATIC      0x0000 /* Capable of SM Power Save (Static) */
794 #define IEEE80211_HTCAP_C_SMPOWERSAVE_DYNAMIC     0x0004 /* Capable of SM Power Save (Dynamic) */
795 #define IEEE80211_HTCAP_C_SM_RESERVED             0x0008 /* Reserved */
796 #define IEEE80211_HTCAP_C_SM_ENABLED              0x000c /* SM enabled, no SM Power Save */
797 #define IEEE80211_HTCAP_C_GREENFIELD              0x0010
798 #define IEEE80211_HTCAP_C_SHORTGI20               0x0020
799 #define IEEE80211_HTCAP_C_SHORTGI40               0x0040
800 #define IEEE80211_HTCAP_C_TXSTBC                  0x0080
801 #define IEEE80211_HTCAP_C_RXSTBC                  0x0100  /* 2 bits */
802 #define IEEE80211_HTCAP_C_DELAYEDBLKACK           0x0400
803 #define IEEE80211_HTCAP_C_MAXAMSDUSIZE            0x0800  /* 1 = 8K, 0 = 3839B */
804 #define IEEE80211_HTCAP_C_DSSSCCK40               0x1000
805 #define IEEE80211_HTCAP_C_PSMP                    0x2000
806 #define IEEE80211_HTCAP_C_INTOLERANT40            0x4000
807 #define IEEE80211_HTCAP_C_LSIGTXOPPROT            0x8000
808
809 #define IEEE80211_HTCAP_C_SM_MASK                 0x000c /* Spatial Multiplexing (SM) capabitlity bitmask */
810
811 /* B0-1 maximum rx A-MPDU factor 2^(13+Max Rx A-MPDU Factor) */
812 enum {
813         IEEE80211_HTCAP_MAXRXAMPDU_8192,        /* 2 ^ 13 */
814         IEEE80211_HTCAP_MAXRXAMPDU_16384,   /* 2 ^ 14 */
815         IEEE80211_HTCAP_MAXRXAMPDU_32768,   /* 2 ^ 15 */
816         IEEE80211_HTCAP_MAXRXAMPDU_65536,   /* 2 ^ 16 */
817 };
818 #define IEEE80211_HTCAP_MAXRXAMPDU_FACTOR   13
819
820 /* B2-4 MPDU density (usec) */
821 enum {
822         IEEE80211_HTCAP_MPDUDENSITY_NA,         /* No time restriction */
823         IEEE80211_HTCAP_MPDUDENSITY_0_25,       /* 1/4 usec */
824         IEEE80211_HTCAP_MPDUDENSITY_0_5,    /* 1/2 usec */
825         IEEE80211_HTCAP_MPDUDENSITY_1,          /* 1 usec */
826         IEEE80211_HTCAP_MPDUDENSITY_2,          /* 2 usec */
827         IEEE80211_HTCAP_MPDUDENSITY_4,          /* 4 usec */
828         IEEE80211_HTCAP_MPDUDENSITY_8,          /* 8 usec */
829         IEEE80211_HTCAP_MPDUDENSITY_16,         /* 16 usec */
830 };
831
832 /* HT extended capability flags */
833 #define IEEE80211_HTCAP_EXTC_PCO                        0x0001
834 #define IEEE80211_HTCAP_EXTC_TRANS_TIME_RSVD    0x0000
835 #define IEEE80211_HTCAP_EXTC_TRANS_TIME_400     0x0002 /* 20-40 switch time */
836 #define IEEE80211_HTCAP_EXTC_TRANS_TIME_1500    0x0004 /* in us             */
837 #define IEEE80211_HTCAP_EXTC_TRANS_TIME_5000    0x0006
838 #define IEEE80211_HTCAP_EXTC_RSVD_1             0x00f8
839 #define IEEE80211_HTCAP_EXTC_MCS_FEEDBACK_NONE  0x0000
840 #define IEEE80211_HTCAP_EXTC_MCS_FEEDBACK_RSVD  0x0100
841 #define IEEE80211_HTCAP_EXTC_MCS_FEEDBACK_UNSOL 0x0200
842 #define IEEE80211_HTCAP_EXTC_MCS_FEEDBACK_FULL  0x0300
843 #define IEEE80211_HTCAP_EXTC_RSVD_2             0xfc00
844
845 struct ieee80211_ie_htinfo_cmn {
846         a_uint8_t       hi_ctrlchannel;         /* control channel */
847 #if _BYTE_ORDER == _BIG_ENDIAN
848         a_uint8_t       hi_serviceinterval : 3,    /* B5-7 svc interval granularity */
849                 hi_ctrlaccess      : 1,    /* B4   controlled access only */
850                 hi_rifsmode        : 1,    /* B3   rifs mode */
851                 hi_txchwidth       : 1,    /* B2   recommended xmiss width set */
852                 hi_extchoff        : 2;    /* B0-1 extension channel offset */
853 #else
854         a_uint8_t    hi_extchoff        : 2,    /* B0-1 extension channel offset */
855                 hi_txchwidth       : 1,    /* B2   recommended xmiss width set */
856                 hi_rifsmode        : 1,    /* B3   rifs mode */
857                 hi_ctrlaccess      : 1,    /* B4   controlled access only */
858                 hi_serviceinterval : 3;    /* B5-7 svc interval granularity */
859 #endif
860 #if _BYTE_ORDER == _BIG_ENDIAN
861     a_uint8_t   hi_reserved0       : 3,   /* B5-7 Reserved */
862                 hi_obssnonhtpresent: 1,    /* B4    OBSS Non-HT STAs Present */
863                 hi_txburstlimit    : 1,    /* B3    Transmit Burst Limit */
864                 hi_nongfpresent    : 1,    /* B2    Non-greenfield STAs present */
865                 hi_opmode          : 2;    /* B0-1  Operating Mode */
866 #else
867     a_uint8_t   hi_opmode          : 2,    /* B0-1  Operating Mode */
868                 hi_nongfpresent    : 1,    /* B2    Non-greenfield STAs present */
869                 hi_txburstlimit    : 1,    /* B3    Transmit Burst Limit */
870                 hi_obssnonhtpresent: 1,    /* B4    OBSS Non-HT STAs Present */
871                 hi_reserved0       : 3;   /* B5-7 Reserved */
872 #endif
873     a_uint8_t    hi_reserved1;
874     a_uint16_t   hi_miscflags;
875
876         a_uint8_t       hi_basicmcsset[16];     /* basic MCS set */
877 } adf_os_packed;
878
879 /*
880  * 802.11n HT Information IE
881  */
882 struct ieee80211_ie_htinfo {
883         a_uint8_t                           hi_id;                      /* element ID */
884         a_uint8_t                           hi_len;                     /* length in bytes */
885         struct ieee80211_ie_htinfo_cmn      hi_ie;
886 } adf_os_packed;
887
888 /*
889  * Temporary vendor private HT Information IE
890  */
891 struct vendor_ie_htinfo {
892         a_uint8_t                    hi_id;                     /* element ID */
893         a_uint8_t                    hi_len;                    /* length in bytes */
894     a_uint8_t                        hi_oui[3];
895     a_uint8_t                        hi_ouitype;
896     struct ieee80211_ie_htinfo_cmn   hi_ie;
897 } adf_os_packed;
898
899 /* extension channel offset (2 bit signed number) */
900 enum {
901         IEEE80211_HTINFO_EXTOFFSET_NA    = 0,   /* 0  no extension channel is present */
902         IEEE80211_HTINFO_EXTOFFSET_ABOVE = 1,   /* +1 extension channel above control channel */
903         IEEE80211_HTINFO_EXTOFFSET_UNDEF = 2,   /* -2 undefined */
904         IEEE80211_HTINFO_EXTOFFSET_BELOW = 3    /* -1 extension channel below control channel*/
905 };
906
907 /* recommended transmission width set */
908 enum {
909         IEEE80211_HTINFO_TXWIDTH_20,
910         IEEE80211_HTINFO_TXWIDTH_2040
911 };
912
913 /* operating flags */
914 #define IEEE80211_HTINFO_OPMODE_PURE                0x00 /* no protection */
915 #define IEEE80211_HTINFO_OPMODE_MIXED_PROT_OPT  0x01 /* prot optional (legacy device maybe present) */
916 #define IEEE80211_HTINFO_OPMODE_MIXED_PROT_40   0x02 /* prot required (20 MHz) */
917 #define IEEE80211_HTINFO_OPMODE_MIXED_PROT_ALL  0x03 /* prot required (legacy devices present) */
918 #define IEEE80211_HTINFO_OPMODE_MASK            0x03 /* For protection 0x00-0x03 */
919
920 /* Non-greenfield STAs present */
921 enum {
922         IEEE80211_HTINFO_NON_GF_NOT_PRESENT,    /* Non-greenfield STAs not present */
923         IEEE80211_HTINFO_NON_GF_PRESENT,        /* Non-greenfield STAs present */
924 };
925
926 /* Transmit Burst Limit */
927 enum {
928         IEEE80211_HTINFO_TXBURST_UNLIMITED, /* Transmit Burst is unlimited */
929         IEEE80211_HTINFO_TXBURST_LIMITED, /* Transmit Burst is limited */
930 };
931
932 /* OBSS Non-HT STAs present */
933 enum {
934         IEEE80211_HTINFO_OBBSS_NONHT_NOT_PRESENT, /* OBSS Non-HT STAs not present */
935         IEEE80211_HTINFO_OBBSS_NONHT_PRESENT, /* OBSS Non-HT STAs present */
936 };
937
938 /* misc flags */
939 #define IEEE80211_HTINFO_BASICSTBCMCS    0x007F    /* B0-6 basic STBC MCS */
940 #define IEEE80211_HTINFO_DUALSTBCPROT    0x0080    /* B7   dual stbc protection */
941 #define IEEE80211_HTINFO_SECONDARYBEACON 0x0100    /* B8   secondary beacon */
942 #define IEEE80211_HTINFO_LSIGTXOPPROT    0x0200    /* B9   lsig txop prot full support */
943 #define IEEE80211_HTINFO_PCOACTIVE       0x0400    /* B10  pco active */
944 #define IEEE80211_HTINFO_PCOPHASE        0x0800    /* B11  pco phase */
945
946 /* RIFS mode */
947 enum {
948         IEEE80211_HTINFO_RIFSMODE_PROHIBITED,   /* use of rifs prohibited */
949         IEEE80211_HTINFO_RIFSMODE_ALLOWED,      /* use of rifs permitted */
950 };
951
952 /*
953  * Management information element payloads.
954  */
955
956 enum {
957         IEEE80211_ELEMID_SSID           = 0,
958         IEEE80211_ELEMID_RATES          = 1,
959         IEEE80211_ELEMID_FHPARMS        = 2,
960         IEEE80211_ELEMID_DSPARMS        = 3,
961         IEEE80211_ELEMID_CFPARMS        = 4,
962         IEEE80211_ELEMID_TIM            = 5,
963         IEEE80211_ELEMID_IBSSPARMS      = 6,
964         IEEE80211_ELEMID_COUNTRY        = 7,
965         IEEE80211_ELEMID_REQINFO        = 10,
966         IEEE80211_ELEMID_CHALLENGE      = 16,
967         /* 17-31 reserved for challenge text extension */
968         IEEE80211_ELEMID_PWRCNSTR       = 32,
969         IEEE80211_ELEMID_PWRCAP         = 33,
970         IEEE80211_ELEMID_TPCREQ         = 34,
971         IEEE80211_ELEMID_TPCREP         = 35,
972         IEEE80211_ELEMID_SUPPCHAN       = 36,
973         IEEE80211_ELEMID_CHANSWITCHANN  = 37,
974         IEEE80211_ELEMID_MEASREQ        = 38,
975         IEEE80211_ELEMID_MEASREP        = 39,
976         IEEE80211_ELEMID_QUIET          = 40,
977         IEEE80211_ELEMID_IBSSDFS        = 41,
978         IEEE80211_ELEMID_ERP            = 42,
979         IEEE80211_ELEMID_HTCAP_ANA      = 45,
980         IEEE80211_ELEMID_RSN            = 48,
981         IEEE80211_ELEMID_XRATES         = 50,
982         IEEE80211_ELEMID_HTCAP          = 51,
983         IEEE80211_ELEMID_HTINFO         = 52,
984         IEEE80211_ELEMID_EXTCHANSWITCHANN = 60, /* Fix this later as per ANA definition */
985         IEEE80211_ELEMID_HTINFO_ANA     = 61,
986         IEEE80211_ELEMID_TPC            = 150,
987         IEEE80211_ELEMID_CCKM           = 156,
988         IEEE80211_ELEMID_VENDOR         = 221,  /* vendor private */
989 };
990
991 #define IEEE80211_CHANSWITCHANN_BYTES 5
992 #define IEEE80211_EXTCHANSWITCHANN_BYTES 6
993
994 struct ieee80211_tim_ie {
995         a_uint8_t       tim_ie;                 /* IEEE80211_ELEMID_TIM */
996         a_uint8_t       tim_len;
997         a_uint8_t       tim_count;              /* DTIM count */
998         a_uint8_t       tim_period;             /* DTIM period */
999         a_uint8_t       tim_bitctl;             /* bitmap control */
1000         a_uint8_t       tim_bitmap[1];          /* variable-length bitmap */
1001 } adf_os_packed;
1002
1003 struct ieee80211_country_ie {
1004         a_uint8_t       ie;                     /* IEEE80211_ELEMID_COUNTRY */
1005         a_uint8_t       len;
1006         a_uint8_t       cc[3];                  /* ISO CC+(I)ndoor/(O)utdoor */
1007         struct {
1008                 a_uint8_t schan;                        /* starting channel */
1009                 a_uint8_t nchan;                        /* number channels */
1010                 a_uint8_t maxtxpwr;             /* tx power cap */
1011         } adf_os_packed band[4];                        /* up to 4 sub bands */
1012 } adf_os_packed;
1013
1014 #define IEEE80211_CHALLENGE_LEN         128
1015
1016 #define IEEE80211_SUPPCHAN_LEN          26
1017
1018 #define IEEE80211_RATE_BASIC            0x80
1019 #define IEEE80211_RATE_VAL              0x7f
1020
1021 /* EPR information element flags */
1022 #define IEEE80211_ERP_NON_ERP_PRESENT   0x01
1023 #define IEEE80211_ERP_USE_PROTECTION    0x02
1024 #define IEEE80211_ERP_LONG_PREAMBLE     0x04
1025
1026 /* Atheros private advanced capabilities info */
1027 #define ATHEROS_CAP_TURBO_PRIME         0x01
1028 #define ATHEROS_CAP_COMPRESSION         0x02
1029 #define ATHEROS_CAP_FAST_FRAME          0x04
1030 /* bits 3-6 reserved */
1031 #define ATHEROS_CAP_BOOST               0x80
1032
1033 #define ATH_OUI                 0x7f0300                /* Atheros OUI */
1034 #define ATH_OUI_TYPE            0x01
1035 #define ATH_OUI_SUBTYPE         0x01
1036 #define ATH_OUI_VERSION         0x00
1037 #define ATH_OUI_TYPE_XR         0x03
1038 #define ATH_OUI_VER_XR          0x01
1039 #define ATH_OUI_EXTCAP_TYPE     0x04    /* Atheros Extended Cap Type */
1040 #define ATH_OUI_EXTCAP_SUBTYPE  0x01    /* Atheros Extended Cap Sub-type */
1041 #define ATH_OUI_EXTCAP_VERSION  0x00    /* Atheros Extended Cap Version */
1042
1043 #define WPA_OUI                 0xf25000
1044 #define WPA_OUI_TYPE            0x01
1045 #define WPA_VERSION             1               /* current supported version */
1046
1047 #define WSC_OUI                 0x0050f204
1048
1049 #define WPA_CSE_NULL            0x00
1050 #define WPA_CSE_WEP40           0x01
1051 #define WPA_CSE_TKIP            0x02
1052 #define WPA_CSE_CCMP            0x04
1053 #define WPA_CSE_WEP104          0x05
1054
1055 #define WPA_ASE_NONE            0x00
1056 #define WPA_ASE_8021X_UNSPEC    0x01
1057 #define WPA_ASE_8021X_PSK       0x02
1058
1059 #define RSN_OUI                 0xac0f00
1060 #define RSN_VERSION             1               /* current supported version */
1061
1062 #define RSN_CSE_NULL            0x00
1063 #define RSN_CSE_WEP40           0x01
1064 #define RSN_CSE_TKIP            0x02
1065 #define RSN_CSE_WRAP            0x03
1066 #define RSN_CSE_CCMP            0x04
1067 #define RSN_CSE_WEP104          0x05
1068
1069 #define RSN_ASE_NONE            0x00
1070 #define RSN_ASE_8021X_UNSPEC    0x01
1071 #define RSN_ASE_8021X_PSK       0x02
1072
1073 #define RSN_CAP_PREAUTH         0x01
1074
1075 #define WME_OUI                 0xf25000
1076 #define WME_OUI_TYPE            0x02
1077 #define WME_INFO_OUI_SUBTYPE    0x00
1078 #define WME_PARAM_OUI_SUBTYPE   0x01
1079 #define WME_VERSION             1
1080
1081 /* WME stream classes */
1082 #define WME_AC_BE       0               /* best effort */
1083 #define WME_AC_BK       1               /* background */
1084 #define WME_AC_VI       2               /* video */
1085 #define WME_AC_VO       3               /* voice */
1086
1087 /*
1088  * AUTH management packets
1089  *
1090  *      octet algo[2]
1091  *      octet seq[2]
1092  *      octet status[2]
1093  *      octet chal.id
1094  *      octet chal.length
1095  *      octet chal.text[253]
1096  */
1097
1098 typedef a_uint8_t *ieee80211_mgt_auth_t;
1099
1100 #define IEEE80211_AUTH_ALGORITHM(auth) \
1101         ((auth)[0] | ((auth)[1] << 8))
1102 #define IEEE80211_AUTH_TRANSACTION(auth) \
1103         ((auth)[2] | ((auth)[3] << 8))
1104 #define IEEE80211_AUTH_STATUS(auth) \
1105         ((auth)[4] | ((auth)[5] << 8))
1106
1107 #define IEEE80211_AUTH_ALG_OPEN         0x0000
1108 #define IEEE80211_AUTH_ALG_SHARED       0x0001
1109 #define IEEE80211_AUTH_ALG_LEAP         0x0080
1110
1111 enum {
1112         IEEE80211_AUTH_OPEN_REQUEST             = 1,
1113         IEEE80211_AUTH_OPEN_RESPONSE            = 2,
1114 };
1115
1116 enum {
1117         IEEE80211_AUTH_SHARED_REQUEST           = 1,
1118         IEEE80211_AUTH_SHARED_CHALLENGE         = 2,
1119         IEEE80211_AUTH_SHARED_RESPONSE          = 3,
1120         IEEE80211_AUTH_SHARED_PASS              = 4,
1121 };
1122
1123 /*
1124  * Reason codes
1125  *
1126  * Unlisted codes are reserved
1127  */
1128
1129 enum {
1130         IEEE80211_REASON_UNSPECIFIED            = 1,
1131         IEEE80211_REASON_AUTH_EXPIRE            = 2,
1132         IEEE80211_REASON_AUTH_LEAVE             = 3,
1133         IEEE80211_REASON_ASSOC_EXPIRE           = 4,
1134         IEEE80211_REASON_ASSOC_TOOMANY          = 5,
1135         IEEE80211_REASON_NOT_AUTHED             = 6,
1136         IEEE80211_REASON_NOT_ASSOCED            = 7,
1137         IEEE80211_REASON_ASSOC_LEAVE            = 8,
1138         IEEE80211_REASON_ASSOC_NOT_AUTHED       = 9,
1139
1140         IEEE80211_REASON_RSN_REQUIRED           = 11,
1141         IEEE80211_REASON_RSN_INCONSISTENT       = 12,
1142         IEEE80211_REASON_IE_INVALID             = 13,
1143         IEEE80211_REASON_MIC_FAILURE            = 14,
1144
1145         IEEE80211_STATUS_SUCCESS                = 0,
1146         IEEE80211_STATUS_UNSPECIFIED            = 1,
1147         IEEE80211_STATUS_CAPINFO                = 10,
1148         IEEE80211_STATUS_NOT_ASSOCED            = 11,
1149         IEEE80211_STATUS_OTHER                  = 12,
1150         IEEE80211_STATUS_ALG                    = 13,
1151         IEEE80211_STATUS_SEQUENCE               = 14,
1152         IEEE80211_STATUS_CHALLENGE              = 15,
1153         IEEE80211_STATUS_TIMEOUT                = 16,
1154         IEEE80211_STATUS_TOOMANY                = 17,
1155         IEEE80211_STATUS_BASIC_RATE             = 18,
1156         IEEE80211_STATUS_SP_REQUIRED            = 19,
1157         IEEE80211_STATUS_PBCC_REQUIRED          = 20,
1158         IEEE80211_STATUS_CA_REQUIRED            = 21,
1159         IEEE80211_STATUS_TOO_MANY_STATIONS      = 22,
1160         IEEE80211_STATUS_RATES                  = 23,
1161         IEEE80211_STATUS_SHORTSLOT_REQUIRED     = 25,
1162         IEEE80211_STATUS_DSSSOFDM_REQUIRED      = 26,
1163         IEEE80211_STATUS_REFUSED                = 37,
1164         IEEE80211_STATUS_INVALID_PARAM          = 38,
1165 };
1166
1167 #define IEEE80211_WEP_KEYLEN            5       /* 40bit */
1168 #define IEEE80211_WEP_IVLEN             3       /* 24bit */
1169 #define IEEE80211_WEP_KIDLEN            1       /* 1 octet */
1170 #define IEEE80211_WEP_CRCLEN            4       /* CRC-32 */
1171 #define IEEE80211_WEP_NKID              4       /* number of key ids */
1172
1173 /*
1174  * 802.11i defines an extended IV for use with non-WEP ciphers.
1175  * When the EXTIV bit is set in the key id byte an additional
1176  * 4 bytes immediately follow the IV for TKIP.  For CCMP the
1177  * EXTIV bit is likewise set but the 8 bytes represent the
1178  * CCMP header rather than IV+extended-IV.
1179  */
1180 #define IEEE80211_WEP_EXTIV             0x20
1181 #define IEEE80211_WEP_EXTIVLEN          4       /* extended IV length */
1182 #define IEEE80211_WEP_MICLEN            8       /* trailing MIC */
1183 #define IEEE80211_WEP_ICVLEN            4
1184 #define IEEE80211_WAPI_MICLEN           16      /* trailing MIC */
1185 #define IEEE80211_WAPI_IVLEN            16
1186
1187 #define IEEE80211_CRC_LEN               4
1188
1189 /*
1190  * Maximum acceptable MTU is:
1191  *      IEEE80211_MAX_LEN - WEP overhead - CRC -
1192  *              QoS overhead - RSN/WPA overhead
1193  * Min is arbitrarily chosen > IEEE80211_MIN_LEN.  The default
1194  * mtu is Ethernet-compatible; it's set by ether_ifattach.
1195  */
1196 #define IEEE80211_MTU_MAX               2290
1197 #define IEEE80211_MTU_MIN               32
1198
1199 #define IEEE80211_MAX_LEN               (2300 + IEEE80211_CRC_LEN + \
1200     (IEEE80211_WEP_IVLEN + IEEE80211_WEP_KIDLEN + IEEE80211_WEP_CRCLEN))
1201 #define IEEE80211_ACK_LEN \
1202         (sizeof(struct ieee80211_frame_ack) + IEEE80211_CRC_LEN)
1203 #define IEEE80211_MIN_LEN \
1204         (sizeof(struct ieee80211_frame_min) + IEEE80211_CRC_LEN)
1205
1206 /* An 802.11 data frame can be one of three types:
1207 1. An unaggregated frame: The maximum length of an unaggregated data frame is 2324 bytes + headers.
1208 2. A data frame that is part of an AMPDU: The maximum length of an AMPDU may be upto 65535 bytes, but data frame is limited to 2324 bytes + header.
1209 3. An AMSDU: The maximum length of an AMSDU is eihther 3839 or 7095 bytes.
1210 The maximum frame length supported by hardware is 4095 bytes.
1211 A length of 3839 bytes is chosen here to support unaggregated data frames, any size AMPDUs and 3839 byte AMSDUs.
1212 */
1213 #define IEEE80211N_MAX_FRAMELEN  3839
1214 #define IEEE80211N_MAX_LEN (IEEE80211N_MAX_FRAMELEN + IEEE80211_CRC_LEN + \
1215     (IEEE80211_WEP_IVLEN + IEEE80211_WEP_KIDLEN + IEEE80211_WEP_CRCLEN))
1216
1217 #define IEEE80211_TX_CHAINMASK_MIN      1
1218 #define IEEE80211_TX_CHAINMASK_MAX      7
1219
1220 #define IEEE80211_RX_CHAINMASK_MIN      1
1221 #define IEEE80211_RX_CHAINMASK_MAX      7
1222
1223 /*
1224  * The 802.11 spec says at most 2007 stations may be
1225  * associated at once.  For most AP's this is way more
1226  * than is feasible so we use a default of 128.  This
1227  * number may be overridden by the driver and/or by
1228  * user configuration.
1229  */
1230 #define IEEE80211_AID_MAX               2007
1231 #define IEEE80211_AID_DEF               128
1232
1233 #define IEEE80211_AID(b)        ((b) &~ 0xc000)
1234
1235 /*
1236  * RTS frame length parameters.  The default is specified in
1237  * the 802.11 spec.  The max may be wrong for jumbo frames.
1238  */
1239 #define IEEE80211_RTS_DEFAULT           512
1240 #define IEEE80211_RTS_MIN               1
1241 #define IEEE80211_RTS_MAX               2346
1242
1243 /*
1244  * Regulatory extention identifier for country IE.
1245  */
1246 #define IEEE80211_REG_EXT_ID            201
1247
1248 #endif /* _NET80211_IEEE80211_H_ */