]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blame - drivers/net/wireless/brcm80211/include/brcmu_wifi.h
brcm80211: use endian annotation for pmk related structure
[mirror_ubuntu-bionic-kernel.git] / drivers / net / wireless / brcm80211 / include / brcmu_wifi.h
CommitLineData
5b435de0
AS
1/*
2 * Copyright (c) 2010 Broadcom Corporation
3 *
4 * Permission to use, copy, modify, and/or distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
7 *
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
11 * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
13 * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
14 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15 */
16
17#ifndef _BRCMU_WIFI_H_
18#define _BRCMU_WIFI_H_
19
20#include <linux/if_ether.h> /* for ETH_ALEN */
21#include <linux/ieee80211.h> /* for WLAN_PMKID_LEN */
22
23/*
24 * A chanspec (u16) holds the channel number, band, bandwidth and control
25 * sideband
26 */
27
28/* channel defines */
29#define CH_UPPER_SB 0x01
30#define CH_LOWER_SB 0x02
31#define CH_EWA_VALID 0x04
32#define CH_20MHZ_APART 4
33#define CH_10MHZ_APART 2
34#define CH_5MHZ_APART 1 /* 2G band channels are 5 Mhz apart */
35#define CH_MAX_2G_CHANNEL 14 /* Max channel in 2G band */
36#define BRCM_MAX_2G_CHANNEL CH_MAX_2G_CHANNEL /* legacy define */
37
38/* bandstate array indices */
39#define BAND_2G_INDEX 0 /* wlc->bandstate[x] index */
40#define BAND_5G_INDEX 1 /* wlc->bandstate[x] index */
41
42/*
43 * max # supported channels. The max channel no is 216, this is that + 1
44 * rounded up to a multiple of NBBY (8). DO NOT MAKE it > 255: channels are
45 * u8's all over
46*/
47#define MAXCHANNEL 224
48
49#define WL_CHANSPEC_CHAN_MASK 0x00ff
50#define WL_CHANSPEC_CHAN_SHIFT 0
51
52#define WL_CHANSPEC_CTL_SB_MASK 0x0300
53#define WL_CHANSPEC_CTL_SB_SHIFT 8
54#define WL_CHANSPEC_CTL_SB_LOWER 0x0100
55#define WL_CHANSPEC_CTL_SB_UPPER 0x0200
56#define WL_CHANSPEC_CTL_SB_NONE 0x0300
57
58#define WL_CHANSPEC_BW_MASK 0x0C00
59#define WL_CHANSPEC_BW_SHIFT 10
60#define WL_CHANSPEC_BW_10 0x0400
61#define WL_CHANSPEC_BW_20 0x0800
62#define WL_CHANSPEC_BW_40 0x0C00
63
64#define WL_CHANSPEC_BAND_MASK 0xf000
65#define WL_CHANSPEC_BAND_SHIFT 12
66#define WL_CHANSPEC_BAND_5G 0x1000
67#define WL_CHANSPEC_BAND_2G 0x2000
68#define INVCHANSPEC 255
69
70/* used to calculate the chan_freq = chan_factor * 500Mhz + 5 * chan_number */
71#define WF_CHAN_FACTOR_2_4_G 4814 /* 2.4 GHz band, 2407 MHz */
72#define WF_CHAN_FACTOR_5_G 10000 /* 5 GHz band, 5000 MHz */
73#define WF_CHAN_FACTOR_4_G 8000 /* 4.9 GHz band for Japan */
74
75#define CHSPEC_CHANNEL(chspec) ((u8)((chspec) & WL_CHANSPEC_CHAN_MASK))
76#define CHSPEC_BAND(chspec) ((chspec) & WL_CHANSPEC_BAND_MASK)
77
78#define CHSPEC_CTL_SB(chspec) ((chspec) & WL_CHANSPEC_CTL_SB_MASK)
79#define CHSPEC_BW(chspec) ((chspec) & WL_CHANSPEC_BW_MASK)
80
81#define CHSPEC_IS10(chspec) \
82 (((chspec) & WL_CHANSPEC_BW_MASK) == WL_CHANSPEC_BW_10)
83
84#define CHSPEC_IS20(chspec) \
85 (((chspec) & WL_CHANSPEC_BW_MASK) == WL_CHANSPEC_BW_20)
86
87#ifndef CHSPEC_IS40
88#define CHSPEC_IS40(chspec) \
89 (((chspec) & WL_CHANSPEC_BW_MASK) == WL_CHANSPEC_BW_40)
90#endif
91
92#define CHSPEC_IS5G(chspec) \
93 (((chspec) & WL_CHANSPEC_BAND_MASK) == WL_CHANSPEC_BAND_5G)
94
95#define CHSPEC_IS2G(chspec) \
96 (((chspec) & WL_CHANSPEC_BAND_MASK) == WL_CHANSPEC_BAND_2G)
97
98#define CHSPEC_SB_NONE(chspec) \
99 (((chspec) & WL_CHANSPEC_CTL_SB_MASK) == WL_CHANSPEC_CTL_SB_NONE)
100
101#define CHSPEC_SB_UPPER(chspec) \
102 (((chspec) & WL_CHANSPEC_CTL_SB_MASK) == WL_CHANSPEC_CTL_SB_UPPER)
103
104#define CHSPEC_SB_LOWER(chspec) \
105 (((chspec) & WL_CHANSPEC_CTL_SB_MASK) == WL_CHANSPEC_CTL_SB_LOWER)
106
107#define CHSPEC_CTL_CHAN(chspec) \
108 ((CHSPEC_SB_LOWER(chspec)) ? \
109 (lower_20_sb(((chspec) & WL_CHANSPEC_CHAN_MASK))) : \
110 (upper_20_sb(((chspec) & WL_CHANSPEC_CHAN_MASK))))
111
112#define CHSPEC2BAND(chspec) (CHSPEC_IS5G(chspec) ? BRCM_BAND_5G : BRCM_BAND_2G)
113
114#define CHANSPEC_STR_LEN 8
115
116static inline int lower_20_sb(int channel)
117{
118 return channel > CH_10MHZ_APART ? (channel - CH_10MHZ_APART) : 0;
119}
120
121static inline int upper_20_sb(int channel)
122{
123 return (channel < (MAXCHANNEL - CH_10MHZ_APART)) ?
124 channel + CH_10MHZ_APART : 0;
125}
126
127static inline int chspec_bandunit(u16 chspec)
128{
129 return CHSPEC_IS5G(chspec) ? BAND_5G_INDEX : BAND_2G_INDEX;
130}
131
132static inline u16 ch20mhz_chspec(int channel)
133{
134 u16 rc = channel <= CH_MAX_2G_CHANNEL ?
135 WL_CHANSPEC_BAND_2G : WL_CHANSPEC_BAND_5G;
136
137 return (u16)((u16)channel | WL_CHANSPEC_BW_20 |
138 WL_CHANSPEC_CTL_SB_NONE | rc);
139}
140
141static inline int next_20mhz_chan(int channel)
142{
143 return channel < (MAXCHANNEL - CH_20MHZ_APART) ?
144 channel + CH_20MHZ_APART : 0;
145}
146
147/* defined rate in 500kbps */
148#define BRCM_MAXRATE 108 /* in 500kbps units */
149#define BRCM_RATE_1M 2 /* in 500kbps units */
150#define BRCM_RATE_2M 4 /* in 500kbps units */
151#define BRCM_RATE_5M5 11 /* in 500kbps units */
152#define BRCM_RATE_11M 22 /* in 500kbps units */
153#define BRCM_RATE_6M 12 /* in 500kbps units */
154#define BRCM_RATE_9M 18 /* in 500kbps units */
155#define BRCM_RATE_12M 24 /* in 500kbps units */
156#define BRCM_RATE_18M 36 /* in 500kbps units */
157#define BRCM_RATE_24M 48 /* in 500kbps units */
158#define BRCM_RATE_36M 72 /* in 500kbps units */
159#define BRCM_RATE_48M 96 /* in 500kbps units */
160#define BRCM_RATE_54M 108 /* in 500kbps units */
161
162#define BRCM_2G_25MHZ_OFFSET 5 /* 2.4GHz band channel offset */
163
164#define MCSSET_LEN 16
165
166static inline bool ac_bitmap_tst(u8 bitmap, int prec)
167{
168 return (bitmap & (1 << (prec))) != 0;
169}
170
171/*
172 * Verify the chanspec is using a legal set of parameters, i.e. that the
173 * chanspec specified a band, bw, ctl_sb and channel and that the
174 * combination could be legal given any set of circumstances.
175 * RETURNS: true is the chanspec is malformed, false if it looks good.
176 */
177extern bool brcmu_chspec_malformed(u16 chanspec);
178
179/*
180 * This function returns the channel number that control traffic is being sent
181 * on, for legacy channels this is just the channel number, for 40MHZ channels
182 * it is the upper or lower 20MHZ sideband depending on the chanspec selected.
183 */
184extern u8 brcmu_chspec_ctlchan(u16 chspec);
185
186/*
187 * Return the channel number for a given frequency and base frequency.
188 * The returned channel number is relative to the given base frequency.
189 * If the given base frequency is zero, a base frequency of 5 GHz is assumed for
190 * frequencies from 5 - 6 GHz, and 2.407 GHz is assumed for 2.4 - 2.5 GHz.
191 *
192 * Frequency is specified in MHz.
193 * The base frequency is specified as (start_factor * 500 kHz).
194 * Constants WF_CHAN_FACTOR_2_4_G, WF_CHAN_FACTOR_5_G are defined for
195 * 2.4 GHz and 5 GHz bands.
196 *
197 * The returned channel will be in the range [1, 14] in the 2.4 GHz band
198 * and [0, 200] otherwise.
199 * -1 is returned if the start_factor is WF_CHAN_FACTOR_2_4_G and the
200 * frequency is not a 2.4 GHz channel, or if the frequency is not and even
201 * multiple of 5 MHz from the base frequency to the base plus 1 GHz.
202 *
203 * Reference 802.11 REVma, section 17.3.8.3, and 802.11B section 18.4.6.2
204 */
205extern int brcmu_mhz2channel(uint freq, uint start_factor);
206
207/* Enumerate crypto algorithms */
208#define CRYPTO_ALGO_OFF 0
209#define CRYPTO_ALGO_WEP1 1
210#define CRYPTO_ALGO_TKIP 2
211#define CRYPTO_ALGO_WEP128 3
212#define CRYPTO_ALGO_AES_CCM 4
213#define CRYPTO_ALGO_AES_RESERVED1 5
214#define CRYPTO_ALGO_AES_RESERVED2 6
215#define CRYPTO_ALGO_NALG 7
216
217/* wireless security bitvec */
218
219#define WEP_ENABLED 0x0001
220#define TKIP_ENABLED 0x0002
221#define AES_ENABLED 0x0004
222#define WSEC_SWFLAG 0x0008
223/* to go into transition mode without setting wep */
224#define SES_OW_ENABLED 0x0040
225
226/* WPA authentication mode bitvec */
227#define WPA_AUTH_DISABLED 0x0000 /* Legacy (i.e., non-WPA) */
228#define WPA_AUTH_NONE 0x0001 /* none (IBSS) */
229#define WPA_AUTH_UNSPECIFIED 0x0002 /* over 802.1x */
230#define WPA_AUTH_PSK 0x0004 /* Pre-shared key */
231#define WPA_AUTH_RESERVED1 0x0008
232#define WPA_AUTH_RESERVED2 0x0010
233
234#define WPA2_AUTH_RESERVED1 0x0020
235#define WPA2_AUTH_UNSPECIFIED 0x0040 /* over 802.1x */
236#define WPA2_AUTH_PSK 0x0080 /* Pre-shared key */
237#define WPA2_AUTH_RESERVED3 0x0200
238#define WPA2_AUTH_RESERVED4 0x0400
239#define WPA2_AUTH_RESERVED5 0x0800
240
241/* pmkid */
242#define MAXPMKID 16
243
244#define DOT11_DEFAULT_RTS_LEN 2347
245#define DOT11_DEFAULT_FRAG_LEN 2346
246
247#define DOT11_ICV_AES_LEN 8
248#define DOT11_QOS_LEN 2
249#define DOT11_IV_MAX_LEN 8
250#define DOT11_A4_HDR_LEN 30
251
252#define HT_CAP_RX_STBC_NO 0x0
253#define HT_CAP_RX_STBC_ONE_STREAM 0x1
254
255struct pmkid {
256 u8 BSSID[ETH_ALEN];
257 u8 PMKID[WLAN_PMKID_LEN];
258};
259
260struct pmkid_list {
40c8e95a 261 __le32 npmkid;
5b435de0
AS
262 struct pmkid pmkid[1];
263};
264
265struct pmkid_cand {
266 u8 BSSID[ETH_ALEN];
267 u8 preauth;
268};
269
270struct pmkid_cand_list {
271 u32 npmkid_cand;
272 struct pmkid_cand pmkid_cand[1];
273};
274
275#endif /* _BRCMU_WIFI_H_ */