summaryrefslogtreecommitdiff
path: root/drivers/net/wireless/brcm80211/include/brcmu_wifi.h
blob: f10d30274c23ade434cc8149ebcaebaadedf8584 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
/*
 * Copyright (c) 2010 Broadcom Corporation
 *
 * Permission to use, copy, modify, and/or distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
 * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
 * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */

#ifndef	_BRCMU_WIFI_H_
#define	_BRCMU_WIFI_H_

#include <linux/if_ether.h>		/* for ETH_ALEN */
#include <linux/ieee80211.h>		/* for WLAN_PMKID_LEN */

/*
 * A chanspec (u16) holds the channel number, band, bandwidth and control
 * sideband
 */

/* channel defines */
#define CH_UPPER_SB			0x01
#define CH_LOWER_SB			0x02
#define CH_EWA_VALID			0x04
#define CH_20MHZ_APART			4
#define CH_10MHZ_APART			2
#define CH_5MHZ_APART			1 /* 2G band channels are 5 Mhz apart */
#define CH_MAX_2G_CHANNEL		14	/* Max channel in 2G band */
#define BRCM_MAX_2G_CHANNEL	CH_MAX_2G_CHANNEL	/* legacy define */

/* bandstate array indices */
#define BAND_2G_INDEX		0	/* wlc->bandstate[x] index */
#define BAND_5G_INDEX		1	/* wlc->bandstate[x] index */

/*
 * max # supported channels. The max channel no is 216, this is that + 1
 * rounded up to a multiple of NBBY (8). DO NOT MAKE it > 255: channels are
 * u8's all over
*/
#define	MAXCHANNEL		224

#define WL_CHANSPEC_CHAN_MASK		0x00ff
#define WL_CHANSPEC_CHAN_SHIFT		0

#define WL_CHANSPEC_CTL_SB_MASK		0x0300
#define WL_CHANSPEC_CTL_SB_SHIFT	     8
#define WL_CHANSPEC_CTL_SB_LOWER	0x0100
#define WL_CHANSPEC_CTL_SB_UPPER	0x0200
#define WL_CHANSPEC_CTL_SB_NONE		0x0300

#define WL_CHANSPEC_BW_MASK		0x0C00
#define WL_CHANSPEC_BW_SHIFT		    10
#define WL_CHANSPEC_BW_10		0x0400
#define WL_CHANSPEC_BW_20		0x0800
#define WL_CHANSPEC_BW_40		0x0C00

#define WL_CHANSPEC_BAND_MASK		0xf000
#define WL_CHANSPEC_BAND_SHIFT		12
#define WL_CHANSPEC_BAND_5G		0x1000
#define WL_CHANSPEC_BAND_2G		0x2000
#define INVCHANSPEC			255

/* used to calculate the chan_freq = chan_factor * 500Mhz + 5 * chan_number */
#define WF_CHAN_FACTOR_2_4_G		4814	/* 2.4 GHz band, 2407 MHz */
#define WF_CHAN_FACTOR_5_G		10000	/* 5   GHz band, 5000 MHz */
#define WF_CHAN_FACTOR_4_G		8000	/* 4.9 GHz band for Japan */

#define CHSPEC_CHANNEL(chspec)	((u8)((chspec) & WL_CHANSPEC_CHAN_MASK))
#define CHSPEC_BAND(chspec)	((chspec) & WL_CHANSPEC_BAND_MASK)

#define CHSPEC_CTL_SB(chspec)	((chspec) & WL_CHANSPEC_CTL_SB_MASK)
#define CHSPEC_BW(chspec)	((chspec) & WL_CHANSPEC_BW_MASK)

#define CHSPEC_IS10(chspec) \
	(((chspec) & WL_CHANSPEC_BW_MASK) == WL_CHANSPEC_BW_10)

#define CHSPEC_IS20(chspec) \
	(((chspec) & WL_CHANSPEC_BW_MASK) == WL_CHANSPEC_BW_20)

#ifndef CHSPEC_IS40
#define CHSPEC_IS40(chspec) \
	(((chspec) & WL_CHANSPEC_BW_MASK) == WL_CHANSPEC_BW_40)
#endif

#define CHSPEC_IS5G(chspec) \
	(((chspec) & WL_CHANSPEC_BAND_MASK) == WL_CHANSPEC_BAND_5G)

#define CHSPEC_IS2G(chspec) \
	(((chspec) & WL_CHANSPEC_BAND_MASK) == WL_CHANSPEC_BAND_2G)

#define CHSPEC_SB_NONE(chspec) \
	(((chspec) & WL_CHANSPEC_CTL_SB_MASK) == WL_CHANSPEC_CTL_SB_NONE)

#define CHSPEC_SB_UPPER(chspec) \
	(((chspec) & WL_CHANSPEC_CTL_SB_MASK) == WL_CHANSPEC_CTL_SB_UPPER)

#define CHSPEC_SB_LOWER(chspec) \
	(((chspec) & WL_CHANSPEC_CTL_SB_MASK) == WL_CHANSPEC_CTL_SB_LOWER)

#define CHSPEC_CTL_CHAN(chspec) \
	((CHSPEC_SB_LOWER(chspec)) ? \
	(lower_20_sb(((chspec) & WL_CHANSPEC_CHAN_MASK))) : \
	(upper_20_sb(((chspec) & WL_CHANSPEC_CHAN_MASK))))

#define CHSPEC2BAND(chspec) (CHSPEC_IS5G(chspec) ? BRCM_BAND_5G : BRCM_BAND_2G)

#define CHANSPEC_STR_LEN    8

static inline int lower_20_sb(int channel)
{
	return channel > CH_10MHZ_APART ? (channel - CH_10MHZ_APART) : 0;
}

static inline int upper_20_sb(int channel)
{
	return (channel < (MAXCHANNEL - CH_10MHZ_APART)) ?
	       channel + CH_10MHZ_APART : 0;
}

static inline int chspec_bandunit(u16 chspec)
{
	return CHSPEC_IS5G(chspec) ? BAND_5G_INDEX : BAND_2G_INDEX;
}

static inline u16 ch20mhz_chspec(int channel)
{
	u16 rc = channel <= CH_MAX_2G_CHANNEL ?
		 WL_CHANSPEC_BAND_2G : WL_CHANSPEC_BAND_5G;

	return	(u16)((u16)channel | WL_CHANSPEC_BW_20 |
		      WL_CHANSPEC_CTL_SB_NONE | rc);
}

static inline int next_20mhz_chan(int channel)
{
	return channel < (MAXCHANNEL - CH_20MHZ_APART) ?
	       channel + CH_20MHZ_APART : 0;
}

/* defined rate in 500kbps */
#define BRCM_MAXRATE	108	/* in 500kbps units */
#define BRCM_RATE_1M	2	/* in 500kbps units */
#define BRCM_RATE_2M	4	/* in 500kbps units */
#define BRCM_RATE_5M5	11	/* in 500kbps units */
#define BRCM_RATE_11M	22	/* in 500kbps units */
#define BRCM_RATE_6M	12	/* in 500kbps units */
#define BRCM_RATE_9M	18	/* in 500kbps units */
#define BRCM_RATE_12M	24	/* in 500kbps units */
#define BRCM_RATE_18M	36	/* in 500kbps units */
#define BRCM_RATE_24M	48	/* in 500kbps units */
#define BRCM_RATE_36M	72	/* in 500kbps units */
#define BRCM_RATE_48M	96	/* in 500kbps units */
#define BRCM_RATE_54M	108	/* in 500kbps units */

#define BRCM_2G_25MHZ_OFFSET		5	/* 2.4GHz band channel offset */

#define MCSSET_LEN	16

static inline bool ac_bitmap_tst(u8 bitmap, int prec)
{
	return (bitmap & (1 << (prec))) != 0;
}

/* Enumerate crypto algorithms */
#define	CRYPTO_ALGO_OFF			0
#define	CRYPTO_ALGO_WEP1		1
#define	CRYPTO_ALGO_TKIP		2
#define	CRYPTO_ALGO_WEP128		3
#define CRYPTO_ALGO_AES_CCM		4
#define CRYPTO_ALGO_AES_RESERVED1	5
#define CRYPTO_ALGO_AES_RESERVED2	6
#define CRYPTO_ALGO_NALG		7

/* wireless security bitvec */

#define WEP_ENABLED		0x0001
#define TKIP_ENABLED		0x0002
#define AES_ENABLED		0x0004
#define WSEC_SWFLAG		0x0008
/* to go into transition mode without setting wep */
#define SES_OW_ENABLED		0x0040

/* WPA authentication mode bitvec */
#define WPA_AUTH_DISABLED	0x0000	/* Legacy (i.e., non-WPA) */
#define WPA_AUTH_NONE		0x0001	/* none (IBSS) */
#define WPA_AUTH_UNSPECIFIED	0x0002	/* over 802.1x */
#define WPA_AUTH_PSK		0x0004	/* Pre-shared key */
#define WPA_AUTH_RESERVED1	0x0008
#define WPA_AUTH_RESERVED2	0x0010

#define WPA2_AUTH_RESERVED1	0x0020
#define WPA2_AUTH_UNSPECIFIED	0x0040	/* over 802.1x */
#define WPA2_AUTH_PSK		0x0080	/* Pre-shared key */
#define WPA2_AUTH_RESERVED3	0x0200
#define WPA2_AUTH_RESERVED4	0x0400
#define WPA2_AUTH_RESERVED5	0x0800

/* pmkid */
#define	MAXPMKID		16

#define DOT11_DEFAULT_RTS_LEN		2347
#define DOT11_DEFAULT_FRAG_LEN		2346

#define DOT11_ICV_AES_LEN		8
#define DOT11_QOS_LEN			2
#define DOT11_IV_MAX_LEN		8
#define DOT11_A4_HDR_LEN		30

#define HT_CAP_RX_STBC_NO		0x0
#define HT_CAP_RX_STBC_ONE_STREAM	0x1

struct pmkid {
	u8 BSSID[ETH_ALEN];
	u8 PMKID[WLAN_PMKID_LEN];
};

struct pmkid_list {
	__le32 npmkid;
	struct pmkid pmkid[1];
};

struct pmkid_cand {
	u8 BSSID[ETH_ALEN];
	u8 preauth;
};

struct pmkid_cand_list {
	u32 npmkid_cand;
	struct pmkid_cand pmkid_cand[1];
};

#endif				/* _BRCMU_WIFI_H_ */