bcmwifi_channels.h revision ac2bc7e7aaad957f235992ff74d5f9af34dc5f88
1/*
2 * Misc utility routines for WL and Apps
3 * This header file housing the define and function prototype use by
4 * both the wl driver, tools & Apps.
5 *
6 * Copyright (C) 1999-2012, Broadcom Corporation
7 *
8 * Permission to use, copy, modify, and/or distribute this software for any
9 * purpose with or without fee is hereby granted, provided that the above
10 * copyright notice and this permission notice appear in all copies.
11 *
12 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
13 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
14 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
15 * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
16 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
17 * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
18 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19 *
20 * $Id: bcmwifi_channels.h 309193 2012-01-19 00:03:57Z $
21 */
22
23#ifndef	_bcmwifi_channels_h_
24#define	_bcmwifi_channels_h_
25
26
27
28typedef uint16 chanspec_t;
29
30
31#define CH_UPPER_SB			0x01
32#define CH_LOWER_SB			0x02
33#define CH_EWA_VALID			0x04
34#define CH_80MHZ_APART			16
35#define CH_40MHZ_APART			8
36#define CH_20MHZ_APART			4
37#define CH_10MHZ_APART			2
38#define CH_5MHZ_APART			1
39#define CH_MAX_2G_CHANNEL		14
40#define	MAXCHANNEL		224
41#define CHSPEC_CTLOVLP(sp1, sp2, sep)	ABS(wf_chspec_ctlchan(sp1) - wf_chspec_ctlchan(sp2)) < (sep)
42
43
44#undef  D11AC_IOTYPES
45#define D11AC_IOTYPES
46
47#ifndef D11AC_IOTYPES
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
71#define LOWER_20_SB(channel)	(((channel) > CH_10MHZ_APART) ? ((channel) - CH_10MHZ_APART) : 0)
72#define UPPER_20_SB(channel)	(((channel) < (MAXCHANNEL - CH_10MHZ_APART)) ? \
73				((channel) + CH_10MHZ_APART) : 0)
74#define CHSPEC_WLCBANDUNIT(chspec)	(CHSPEC_IS5G(chspec) ? BAND_5G_INDEX : BAND_2G_INDEX)
75#define CH20MHZ_CHSPEC(channel)	(chanspec_t)((chanspec_t)(channel) | WL_CHANSPEC_BW_20 | \
76				WL_CHANSPEC_CTL_SB_NONE | (((channel) <= CH_MAX_2G_CHANNEL) ? \
77				WL_CHANSPEC_BAND_2G : WL_CHANSPEC_BAND_5G))
78#define NEXT_20MHZ_CHAN(channel)	(((channel) < (MAXCHANNEL - CH_20MHZ_APART)) ? \
79					((channel) + CH_20MHZ_APART) : 0)
80#define CH40MHZ_CHSPEC(channel, ctlsb)	(chanspec_t) \
81					((channel) | (ctlsb) | WL_CHANSPEC_BW_40 | \
82					((channel) <= CH_MAX_2G_CHANNEL ? WL_CHANSPEC_BAND_2G : \
83					WL_CHANSPEC_BAND_5G))
84#define CHSPEC_CHANNEL(chspec)	((uint8)((chspec) & WL_CHANSPEC_CHAN_MASK))
85#define CHSPEC_BAND(chspec)	((chspec) & WL_CHANSPEC_BAND_MASK)
86
87
88#define CHSPEC_CTL_SB(chspec)	((chspec) & WL_CHANSPEC_CTL_SB_MASK)
89#define CHSPEC_BW(chspec)	((chspec) & WL_CHANSPEC_BW_MASK)
90
91#ifdef WL11N_20MHZONLY
92
93#define CHSPEC_IS10(chspec)	0
94#define CHSPEC_IS20(chspec)	1
95#ifndef CHSPEC_IS40
96#define CHSPEC_IS40(chspec)	0
97#endif
98
99#else
100
101#define CHSPEC_IS10(chspec)	(((chspec) & WL_CHANSPEC_BW_MASK) == WL_CHANSPEC_BW_10)
102#define CHSPEC_IS20(chspec)	(((chspec) & WL_CHANSPEC_BW_MASK) == WL_CHANSPEC_BW_20)
103#ifndef CHSPEC_IS40
104#define CHSPEC_IS40(chspec)	(((chspec) & WL_CHANSPEC_BW_MASK) == WL_CHANSPEC_BW_40)
105#endif
106
107#endif
108
109#define CHSPEC_IS5G(chspec)	(((chspec) & WL_CHANSPEC_BAND_MASK) == WL_CHANSPEC_BAND_5G)
110#define CHSPEC_IS2G(chspec)	(((chspec) & WL_CHANSPEC_BAND_MASK) == WL_CHANSPEC_BAND_2G)
111#define CHSPEC_SB_NONE(chspec)	(((chspec) & WL_CHANSPEC_CTL_SB_MASK) == WL_CHANSPEC_CTL_SB_NONE)
112#define CHSPEC_SB_UPPER(chspec)	(((chspec) & WL_CHANSPEC_CTL_SB_MASK) == WL_CHANSPEC_CTL_SB_UPPER)
113#define CHSPEC_SB_LOWER(chspec)	(((chspec) & WL_CHANSPEC_CTL_SB_MASK) == WL_CHANSPEC_CTL_SB_LOWER)
114#define CHSPEC_CTL_CHAN(chspec)  ((CHSPEC_SB_LOWER(chspec)) ? \
115				  (LOWER_20_SB(((chspec) & WL_CHANSPEC_CHAN_MASK))) : \
116				  (UPPER_20_SB(((chspec) & WL_CHANSPEC_CHAN_MASK))))
117#define CHSPEC2WLC_BAND(chspec) (CHSPEC_IS5G(chspec) ? WLC_BAND_5G : WLC_BAND_2G)
118
119#define CHANSPEC_STR_LEN    8
120
121#else
122
123#define WL_CHANSPEC_CHAN_MASK		0x00ff
124#define WL_CHANSPEC_CHAN_SHIFT		0
125#define WL_CHANSPEC_CHAN1_MASK		0x000f
126#define WL_CHANSPEC_CHAN1_SHIFT		0
127#define WL_CHANSPEC_CHAN2_MASK		0x00f0
128#define WL_CHANSPEC_CHAN2_SHIFT		4
129
130#define WL_CHANSPEC_CTL_SB_MASK		0x0700
131#define WL_CHANSPEC_CTL_SB_SHIFT	8
132#define WL_CHANSPEC_CTL_SB_LLL		0x0000
133#define WL_CHANSPEC_CTL_SB_LLU		0x0100
134#define WL_CHANSPEC_CTL_SB_LUL		0x0200
135#define WL_CHANSPEC_CTL_SB_LUU		0x0300
136#define WL_CHANSPEC_CTL_SB_ULL		0x0400
137#define WL_CHANSPEC_CTL_SB_ULU		0x0500
138#define WL_CHANSPEC_CTL_SB_UUL		0x0600
139#define WL_CHANSPEC_CTL_SB_UUU		0x0700
140#define WL_CHANSPEC_CTL_SB_LL		WL_CHANSPEC_CTL_SB_LLL
141#define WL_CHANSPEC_CTL_SB_LU		WL_CHANSPEC_CTL_SB_LLU
142#define WL_CHANSPEC_CTL_SB_UL		WL_CHANSPEC_CTL_SB_LUL
143#define WL_CHANSPEC_CTL_SB_UU		WL_CHANSPEC_CTL_SB_LUU
144#define WL_CHANSPEC_CTL_SB_L		WL_CHANSPEC_CTL_SB_LLL
145#define WL_CHANSPEC_CTL_SB_U		WL_CHANSPEC_CTL_SB_LLU
146#define WL_CHANSPEC_CTL_SB_LOWER 	WL_CHANSPEC_CTL_SB_LLL
147#define WL_CHANSPEC_CTL_SB_UPPER	WL_CHANSPEC_CTL_SB_LLU
148
149#define WL_CHANSPEC_BW_MASK		0x3800
150#define WL_CHANSPEC_BW_SHIFT		11
151#define WL_CHANSPEC_BW_5		0x0000
152#define WL_CHANSPEC_BW_10		0x0800
153#define WL_CHANSPEC_BW_20		0x1000
154#define WL_CHANSPEC_BW_40		0x1800
155#define WL_CHANSPEC_BW_80		0x2000
156#define WL_CHANSPEC_BW_160		0x2800
157#define WL_CHANSPEC_BW_8080		0x3000
158
159#define WL_CHANSPEC_BAND_MASK		0xc000
160#define WL_CHANSPEC_BAND_SHIFT		14
161#define WL_CHANSPEC_BAND_2G		0x0000
162#define WL_CHANSPEC_BAND_3G		0x4000
163#define WL_CHANSPEC_BAND_4G		0x8000
164#define WL_CHANSPEC_BAND_5G		0xc000
165#define INVCHANSPEC			255
166
167
168#define LOWER_20_SB(channel)		(((channel) > CH_10MHZ_APART) ? \
169					((channel) - CH_10MHZ_APART) : 0)
170#define UPPER_20_SB(channel)		(((channel) < (MAXCHANNEL - CH_10MHZ_APART)) ? \
171					((channel) + CH_10MHZ_APART) : 0)
172#define LOWER_40_SB(channel)		((channel) - CH_20MHZ_APART)
173#define UPPER_40_SB(channel)		((channel) + CH_20MHZ_APART)
174#define CHSPEC_WLCBANDUNIT(chspec)	(CHSPEC_IS5G(chspec) ? BAND_5G_INDEX : BAND_2G_INDEX)
175#define CH20MHZ_CHSPEC(channel)		(chanspec_t)((chanspec_t)(channel) | WL_CHANSPEC_BW_20 | \
176					(((channel) <= CH_MAX_2G_CHANNEL) ? \
177					WL_CHANSPEC_BAND_2G : WL_CHANSPEC_BAND_5G))
178#define NEXT_20MHZ_CHAN(channel)	(((channel) < (MAXCHANNEL - CH_20MHZ_APART)) ? \
179					((channel) + CH_20MHZ_APART) : 0)
180#define CH40MHZ_CHSPEC(channel, ctlsb)	(chanspec_t) \
181					((channel) | (ctlsb) | WL_CHANSPEC_BW_40 | \
182					((channel) <= CH_MAX_2G_CHANNEL ? WL_CHANSPEC_BAND_2G : \
183					WL_CHANSPEC_BAND_5G))
184#define CH80MHZ_CHSPEC(channel, ctlsb)	(chanspec_t) \
185					((channel) | (ctlsb) | \
186					 WL_CHANSPEC_BW_80 | WL_CHANSPEC_BAND_5G)
187#define CH160MHZ_CHSPEC(channel, ctlsb)	(chanspec_t) \
188					((channel) | (ctlsb) | \
189					 WL_CHANSPEC_BW_160 | WL_CHANSPEC_BAND_5G)
190
191
192#define CHSPEC_CHANNEL(chspec)		((uint8)((chspec) & WL_CHANSPEC_CHAN_MASK))
193#define CHSPEC_CHAN1(chspec)		((chspec) & WL_CHANSPEC_CHAN1_MASK)
194#define CHSPEC_CHAN2(chspec)		((chspec) & WL_CHANSPEC_CHAN2_MASK)
195#define CHSPEC_BAND(chspec)		((chspec) & WL_CHANSPEC_BAND_MASK)
196#define CHSPEC_CTL_SB(chspec)		((chspec) & WL_CHANSPEC_CTL_SB_MASK)
197#define CHSPEC_BW(chspec)		((chspec) & WL_CHANSPEC_BW_MASK)
198
199#ifdef WL11N_20MHZONLY
200
201#define CHSPEC_IS10(chspec)	0
202#define CHSPEC_IS20(chspec)	1
203#ifndef CHSPEC_IS40
204#define CHSPEC_IS40(chspec)	0
205#endif
206#ifndef CHSPEC_IS80
207#define CHSPEC_IS80(chspec)	0
208#endif
209#ifndef CHSPEC_IS160
210#define CHSPEC_IS160(chspec)	0
211#endif
212#ifndef CHSPEC_IS8080
213#define CHSPEC_IS8080(chspec)	0
214#endif
215
216#else
217
218#define CHSPEC_IS10(chspec)	(((chspec) & WL_CHANSPEC_BW_MASK) == WL_CHANSPEC_BW_10)
219#define CHSPEC_IS20(chspec)	(((chspec) & WL_CHANSPEC_BW_MASK) == WL_CHANSPEC_BW_20)
220#ifndef CHSPEC_IS40
221#define CHSPEC_IS40(chspec)	(((chspec) & WL_CHANSPEC_BW_MASK) == WL_CHANSPEC_BW_40)
222#endif
223#ifndef CHSPEC_IS80
224#define CHSPEC_IS80(chspec)	(((chspec) & WL_CHANSPEC_BW_MASK) == WL_CHANSPEC_BW_80)
225#endif
226#ifndef CHSPEC_IS160
227#define CHSPEC_IS160(chspec)	(((chspec) & WL_CHANSPEC_BW_MASK) == WL_CHANSPEC_BW_160)
228#endif
229#ifndef CHSPEC_IS8080
230#define CHSPEC_IS8080(chspec)	(((chspec) & WL_CHANSPEC_BW_MASK) == WL_CHANSPEC_BW_8080)
231#endif
232
233#endif
234
235#define CHSPEC_IS5G(chspec)	(((chspec) & WL_CHANSPEC_BAND_MASK) == WL_CHANSPEC_BAND_5G)
236#define CHSPEC_IS2G(chspec)	(((chspec) & WL_CHANSPEC_BAND_MASK) == WL_CHANSPEC_BAND_2G)
237#define CHSPEC_SB_UPPER(chspec)	\
238	((((chspec) & WL_CHANSPEC_CTL_SB_MASK) == WL_CHANSPEC_CTL_SB_UPPER) && \
239	(((chspec) & WL_CHANSPEC_BW_MASK) == WL_CHANSPEC_BW_40))
240#define CHSPEC_SB_LOWER(chspec)	\
241	((((chspec) & WL_CHANSPEC_CTL_SB_MASK) == WL_CHANSPEC_CTL_SB_LOWER) && \
242	(((chspec) & WL_CHANSPEC_BW_MASK) == WL_CHANSPEC_BW_40))
243#define CHSPEC2WLC_BAND(chspec) (CHSPEC_IS5G(chspec) ? WLC_BAND_5G : WLC_BAND_2G)
244
245
246#define CHANSPEC_STR_LEN    20
247
248
249
250#define WL_LCHANSPEC_CHAN_MASK		0x00ff
251#define WL_LCHANSPEC_CHAN_SHIFT		     0
252
253#define WL_LCHANSPEC_CTL_SB_MASK	0x0300
254#define WL_LCHANSPEC_CTL_SB_SHIFT	     8
255#define WL_LCHANSPEC_CTL_SB_LOWER	0x0100
256#define WL_LCHANSPEC_CTL_SB_UPPER	0x0200
257#define WL_LCHANSPEC_CTL_SB_NONE	0x0300
258
259#define WL_LCHANSPEC_BW_MASK		0x0C00
260#define WL_LCHANSPEC_BW_SHIFT		    10
261#define WL_LCHANSPEC_BW_10		0x0400
262#define WL_LCHANSPEC_BW_20		0x0800
263#define WL_LCHANSPEC_BW_40		0x0C00
264
265#define WL_LCHANSPEC_BAND_MASK		0xf000
266#define WL_LCHANSPEC_BAND_SHIFT		    12
267#define WL_LCHANSPEC_BAND_5G		0x1000
268#define WL_LCHANSPEC_BAND_2G		0x2000
269
270#define LCHSPEC_CHANNEL(chspec)	((uint8)((chspec) & WL_LCHANSPEC_CHAN_MASK))
271#define LCHSPEC_BAND(chspec)	((chspec) & WL_LCHANSPEC_BAND_MASK)
272#define LCHSPEC_CTL_SB(chspec)	((chspec) & WL_LCHANSPEC_CTL_SB_MASK)
273#define LCHSPEC_BW(chspec)	((chspec) & WL_LCHANSPEC_BW_MASK)
274#define LCHSPEC_IS10(chspec)	(((chspec) & WL_LCHANSPEC_BW_MASK) == WL_LCHANSPEC_BW_10)
275#define LCHSPEC_IS20(chspec)	(((chspec) & WL_LCHANSPEC_BW_MASK) == WL_LCHANSPEC_BW_20)
276#define LCHSPEC_IS40(chspec)	(((chspec) & WL_LCHANSPEC_BW_MASK) == WL_LCHANSPEC_BW_40)
277#define LCHSPEC_IS5G(chspec)	(((chspec) & WL_LCHANSPEC_BAND_MASK) == WL_LCHANSPEC_BAND_5G)
278#define LCHSPEC_IS2G(chspec)	(((chspec) & WL_LCHANSPEC_BAND_MASK) == WL_LCHANSPEC_BAND_2G)
279
280#define LCHSPEC_CREATE(chan, band, bw, sb)  ((uint16)((chan) | (sb) | (bw) | (band)))
281
282#endif
283
284
285
286
287#define WF_CHAN_FACTOR_2_4_G		4814
288
289
290#define WF_CHAN_FACTOR_5_G		10000
291
292
293#define WF_CHAN_FACTOR_4_G		8000
294
295
296#define WLC_MAXRATE	108
297#define WLC_RATE_1M	2
298#define WLC_RATE_2M	4
299#define WLC_RATE_5M5	11
300#define WLC_RATE_11M	22
301#define WLC_RATE_6M	12
302#define WLC_RATE_9M	18
303#define WLC_RATE_12M	24
304#define WLC_RATE_18M	36
305#define WLC_RATE_24M	48
306#define WLC_RATE_36M	72
307#define WLC_RATE_48M	96
308#define WLC_RATE_54M	108
309
310#define WLC_2G_25MHZ_OFFSET		5
311
312
313extern char * wf_chspec_ntoa(chanspec_t chspec, char *buf);
314
315
316extern chanspec_t wf_chspec_aton(const char *a);
317
318
319extern bool wf_chspec_malformed(chanspec_t chanspec);
320
321
322extern bool wf_chspec_valid(chanspec_t chanspec);
323
324
325extern uint8 wf_chspec_ctlchan(chanspec_t chspec);
326
327
328extern chanspec_t wf_chspec_ctlchspec(chanspec_t chspec);
329
330
331extern chanspec_t wf_chspec_primary40_chspec(chanspec_t chspec);
332
333
334extern int wf_mhz2channel(uint freq, uint start_factor);
335
336
337extern int wf_channel2mhz(uint channel, uint start_factor);
338
339#endif
340