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 28 typedef 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 313 extern char * wf_chspec_ntoa(chanspec_t chspec, char *buf); 314 315 316 extern chanspec_t wf_chspec_aton(const char *a); 317 318 319 extern bool wf_chspec_malformed(chanspec_t chanspec); 320 321 322 extern bool wf_chspec_valid(chanspec_t chanspec); 323 324 325 extern uint8 wf_chspec_ctlchan(chanspec_t chspec); 326 327 328 extern chanspec_t wf_chspec_ctlchspec(chanspec_t chspec); 329 330 331 extern chanspec_t wf_chspec_primary40_chspec(chanspec_t chspec); 332 333 334 extern int wf_mhz2channel(uint freq, uint start_factor); 335 336 337 extern int wf_channel2mhz(uint channel, uint start_factor); 338 339 #endif 340