1ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt/* 2ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt * Misc utility routines for WL and Apps 3ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt * This header file housing the define and function prototype use by 4ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt * both the wl driver, tools & Apps. 5ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt * 638eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * Copyright (C) 1999-2013, Broadcom Corporation 7ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt * 8ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt * Permission to use, copy, modify, and/or distribute this software for any 9ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt * purpose with or without fee is hereby granted, provided that the above 10ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt * copyright notice and this permission notice appear in all copies. 11ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt * 12ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 13ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 14ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY 15ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 16ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION 17ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN 18ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 19ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt * 20ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt * $Id: bcmwifi_channels.h 309193 2012-01-19 00:03:57Z $ 21ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt */ 22ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt 23ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#ifndef _bcmwifi_channels_h_ 24ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define _bcmwifi_channels_h_ 25ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt 26ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt 2738eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* A chanspec holds the channel number, band, bandwidth and control sideband */ 28ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidttypedef uint16 chanspec_t; 29ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt 3038eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* channel defines */ 31ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define CH_UPPER_SB 0x01 32ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define CH_LOWER_SB 0x02 33ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define CH_EWA_VALID 0x04 34ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define CH_80MHZ_APART 16 35ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define CH_40MHZ_APART 8 36ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define CH_20MHZ_APART 4 37ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define CH_10MHZ_APART 2 3838eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define CH_5MHZ_APART 1 /* 2G band channels are 5 Mhz apart */ 3938eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define CH_MAX_2G_CHANNEL 14 /* Max channel in 2G band */ 4038eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define MAXCHANNEL 224 /* max # supported channels. The max channel no is 216, 4138eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * this is that + 1 rounded up to a multiple of NBBY (8). 4238eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * DO NOT MAKE it > 255: channels are uint8's all over 4338eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt */ 4438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define CHSPEC_CTLOVLP(sp1, sp2, sep) (ABS(wf_chspec_ctlchan(sp1) - wf_chspec_ctlchan(sp2)) < \ 4538eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt (sep)) 4638eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt 4738eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* All builds use the new 11ac ratespec/chanspec */ 48ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#undef D11AC_IOTYPES 49ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define D11AC_IOTYPES 50ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt 51ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#ifndef D11AC_IOTYPES 52ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt 53ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define WL_CHANSPEC_CHAN_MASK 0x00ff 54ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define WL_CHANSPEC_CHAN_SHIFT 0 55ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt 56ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define WL_CHANSPEC_CTL_SB_MASK 0x0300 57ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define WL_CHANSPEC_CTL_SB_SHIFT 8 58ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define WL_CHANSPEC_CTL_SB_LOWER 0x0100 59ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define WL_CHANSPEC_CTL_SB_UPPER 0x0200 60ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define WL_CHANSPEC_CTL_SB_NONE 0x0300 61ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt 62ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define WL_CHANSPEC_BW_MASK 0x0C00 63ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define WL_CHANSPEC_BW_SHIFT 10 64ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define WL_CHANSPEC_BW_10 0x0400 65ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define WL_CHANSPEC_BW_20 0x0800 66ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define WL_CHANSPEC_BW_40 0x0C00 67ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt 68ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define WL_CHANSPEC_BAND_MASK 0xf000 69ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define WL_CHANSPEC_BAND_SHIFT 12 7038eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#ifdef WL_CHANSPEC_BAND_5G 7138eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#undef WL_CHANSPEC_BAND_5G 7238eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#endif 7338eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#ifdef WL_CHANSPEC_BAND_2G 7438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#undef WL_CHANSPEC_BAND_2G 7538eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#endif 76ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define WL_CHANSPEC_BAND_5G 0x1000 77ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define WL_CHANSPEC_BAND_2G 0x2000 78ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define INVCHANSPEC 255 79ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt 8038eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* channel defines */ 81ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define LOWER_20_SB(channel) (((channel) > CH_10MHZ_APART) ? ((channel) - CH_10MHZ_APART) : 0) 82ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define UPPER_20_SB(channel) (((channel) < (MAXCHANNEL - CH_10MHZ_APART)) ? \ 83ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt ((channel) + CH_10MHZ_APART) : 0) 8438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt 8538eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define LL_20_SB(channel) (((channel) > 3 * CH_10MHZ_APART) ? ((channel) - 3 * CH_10MHZ_APART) : 0) 8638eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define UU_20_SB(channel) (((channel) < (MAXCHANNEL - 3 * CH_10MHZ_APART)) ? \ 8738eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt ((channel) + 3 * CH_10MHZ_APART) : 0) 8838eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define LU_20_SB(channel) LOWER_20_SB(channel) 8938eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define UL_20_SB(channel) UPPER_20_SB(channel) 9038eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt 91ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define CHSPEC_WLCBANDUNIT(chspec) (CHSPEC_IS5G(chspec) ? BAND_5G_INDEX : BAND_2G_INDEX) 92ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define CH20MHZ_CHSPEC(channel) (chanspec_t)((chanspec_t)(channel) | WL_CHANSPEC_BW_20 | \ 93ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt WL_CHANSPEC_CTL_SB_NONE | (((channel) <= CH_MAX_2G_CHANNEL) ? \ 94ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt WL_CHANSPEC_BAND_2G : WL_CHANSPEC_BAND_5G)) 95ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define NEXT_20MHZ_CHAN(channel) (((channel) < (MAXCHANNEL - CH_20MHZ_APART)) ? \ 96ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt ((channel) + CH_20MHZ_APART) : 0) 97ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define CH40MHZ_CHSPEC(channel, ctlsb) (chanspec_t) \ 98ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt ((channel) | (ctlsb) | WL_CHANSPEC_BW_40 | \ 99ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt ((channel) <= CH_MAX_2G_CHANNEL ? WL_CHANSPEC_BAND_2G : \ 100ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt WL_CHANSPEC_BAND_5G)) 101ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define CHSPEC_CHANNEL(chspec) ((uint8)((chspec) & WL_CHANSPEC_CHAN_MASK)) 102ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define CHSPEC_BAND(chspec) ((chspec) & WL_CHANSPEC_BAND_MASK) 103ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt 10438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* chanspec stores radio channel & flags to indicate control channel location, i.e. upper/lower */ 105ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define CHSPEC_CTL_SB(chspec) ((chspec) & WL_CHANSPEC_CTL_SB_MASK) 106ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define CHSPEC_BW(chspec) ((chspec) & WL_CHANSPEC_BW_MASK) 107ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt 108ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#ifdef WL11N_20MHZONLY 109ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt 110ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define CHSPEC_IS10(chspec) 0 111ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define CHSPEC_IS20(chspec) 1 112ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#ifndef CHSPEC_IS40 113ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define CHSPEC_IS40(chspec) 0 114ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#endif 115ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt 11638eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#else /* !WL11N_20MHZONLY */ 117ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt 118ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define CHSPEC_IS10(chspec) (((chspec) & WL_CHANSPEC_BW_MASK) == WL_CHANSPEC_BW_10) 119ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define CHSPEC_IS20(chspec) (((chspec) & WL_CHANSPEC_BW_MASK) == WL_CHANSPEC_BW_20) 120ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#ifndef CHSPEC_IS40 121ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define CHSPEC_IS40(chspec) (((chspec) & WL_CHANSPEC_BW_MASK) == WL_CHANSPEC_BW_40) 122ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#endif 123ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt 12438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#endif /* !WL11N_20MHZONLY */ 125ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt 126ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define CHSPEC_IS5G(chspec) (((chspec) & WL_CHANSPEC_BAND_MASK) == WL_CHANSPEC_BAND_5G) 127ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define CHSPEC_IS2G(chspec) (((chspec) & WL_CHANSPEC_BAND_MASK) == WL_CHANSPEC_BAND_2G) 128ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define CHSPEC_SB_NONE(chspec) (((chspec) & WL_CHANSPEC_CTL_SB_MASK) == WL_CHANSPEC_CTL_SB_NONE) 129ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define CHSPEC_SB_UPPER(chspec) (((chspec) & WL_CHANSPEC_CTL_SB_MASK) == WL_CHANSPEC_CTL_SB_UPPER) 130ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define CHSPEC_SB_LOWER(chspec) (((chspec) & WL_CHANSPEC_CTL_SB_MASK) == WL_CHANSPEC_CTL_SB_LOWER) 131ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define CHSPEC_CTL_CHAN(chspec) ((CHSPEC_SB_LOWER(chspec)) ? \ 132ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt (LOWER_20_SB(((chspec) & WL_CHANSPEC_CHAN_MASK))) : \ 133ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt (UPPER_20_SB(((chspec) & WL_CHANSPEC_CHAN_MASK)))) 134ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define CHSPEC2WLC_BAND(chspec) (CHSPEC_IS5G(chspec) ? WLC_BAND_5G : WLC_BAND_2G) 135ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt 136ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define CHANSPEC_STR_LEN 8 137ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt 13838eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#else /* D11AC_IOTYPES */ 139ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt 140ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define WL_CHANSPEC_CHAN_MASK 0x00ff 141ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define WL_CHANSPEC_CHAN_SHIFT 0 142ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define WL_CHANSPEC_CHAN1_MASK 0x000f 143ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define WL_CHANSPEC_CHAN1_SHIFT 0 144ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define WL_CHANSPEC_CHAN2_MASK 0x00f0 145ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define WL_CHANSPEC_CHAN2_SHIFT 4 146ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt 147ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define WL_CHANSPEC_CTL_SB_MASK 0x0700 148ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define WL_CHANSPEC_CTL_SB_SHIFT 8 149ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define WL_CHANSPEC_CTL_SB_LLL 0x0000 150ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define WL_CHANSPEC_CTL_SB_LLU 0x0100 151ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define WL_CHANSPEC_CTL_SB_LUL 0x0200 152ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define WL_CHANSPEC_CTL_SB_LUU 0x0300 153ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define WL_CHANSPEC_CTL_SB_ULL 0x0400 154ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define WL_CHANSPEC_CTL_SB_ULU 0x0500 155ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define WL_CHANSPEC_CTL_SB_UUL 0x0600 156ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define WL_CHANSPEC_CTL_SB_UUU 0x0700 157ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define WL_CHANSPEC_CTL_SB_LL WL_CHANSPEC_CTL_SB_LLL 158ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define WL_CHANSPEC_CTL_SB_LU WL_CHANSPEC_CTL_SB_LLU 159ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define WL_CHANSPEC_CTL_SB_UL WL_CHANSPEC_CTL_SB_LUL 160ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define WL_CHANSPEC_CTL_SB_UU WL_CHANSPEC_CTL_SB_LUU 161ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define WL_CHANSPEC_CTL_SB_L WL_CHANSPEC_CTL_SB_LLL 162ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define WL_CHANSPEC_CTL_SB_U WL_CHANSPEC_CTL_SB_LLU 163ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define WL_CHANSPEC_CTL_SB_LOWER WL_CHANSPEC_CTL_SB_LLL 164ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define WL_CHANSPEC_CTL_SB_UPPER WL_CHANSPEC_CTL_SB_LLU 165ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt 166ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define WL_CHANSPEC_BW_MASK 0x3800 167ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define WL_CHANSPEC_BW_SHIFT 11 168ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define WL_CHANSPEC_BW_5 0x0000 169ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define WL_CHANSPEC_BW_10 0x0800 170ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define WL_CHANSPEC_BW_20 0x1000 171ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define WL_CHANSPEC_BW_40 0x1800 172ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define WL_CHANSPEC_BW_80 0x2000 173ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define WL_CHANSPEC_BW_160 0x2800 174ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define WL_CHANSPEC_BW_8080 0x3000 175ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt 176ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define WL_CHANSPEC_BAND_MASK 0xc000 177ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define WL_CHANSPEC_BAND_SHIFT 14 178ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define WL_CHANSPEC_BAND_2G 0x0000 179ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define WL_CHANSPEC_BAND_3G 0x4000 180ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define WL_CHANSPEC_BAND_4G 0x8000 181ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define WL_CHANSPEC_BAND_5G 0xc000 182ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define INVCHANSPEC 255 183ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt 18438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* channel defines */ 185ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define LOWER_20_SB(channel) (((channel) > CH_10MHZ_APART) ? \ 186ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt ((channel) - CH_10MHZ_APART) : 0) 187ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define UPPER_20_SB(channel) (((channel) < (MAXCHANNEL - CH_10MHZ_APART)) ? \ 188ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt ((channel) + CH_10MHZ_APART) : 0) 18938eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt 19038eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define LL_20_SB(channel) (((channel) > 3 * CH_10MHZ_APART) ? ((channel) - 3 * CH_10MHZ_APART) : 0) 19138eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define UU_20_SB(channel) (((channel) < (MAXCHANNEL - 3 * CH_10MHZ_APART)) ? \ 19238eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt ((channel) + 3 * CH_10MHZ_APART) : 0) 19338eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define LU_20_SB(channel) LOWER_20_SB(channel) 19438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define UL_20_SB(channel) UPPER_20_SB(channel) 19538eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt 196ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define LOWER_40_SB(channel) ((channel) - CH_20MHZ_APART) 197ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define UPPER_40_SB(channel) ((channel) + CH_20MHZ_APART) 198ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define CHSPEC_WLCBANDUNIT(chspec) (CHSPEC_IS5G(chspec) ? BAND_5G_INDEX : BAND_2G_INDEX) 199ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define CH20MHZ_CHSPEC(channel) (chanspec_t)((chanspec_t)(channel) | WL_CHANSPEC_BW_20 | \ 200ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt (((channel) <= CH_MAX_2G_CHANNEL) ? \ 201ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt WL_CHANSPEC_BAND_2G : WL_CHANSPEC_BAND_5G)) 202ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define NEXT_20MHZ_CHAN(channel) (((channel) < (MAXCHANNEL - CH_20MHZ_APART)) ? \ 203ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt ((channel) + CH_20MHZ_APART) : 0) 204ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define CH40MHZ_CHSPEC(channel, ctlsb) (chanspec_t) \ 205ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt ((channel) | (ctlsb) | WL_CHANSPEC_BW_40 | \ 206ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt ((channel) <= CH_MAX_2G_CHANNEL ? WL_CHANSPEC_BAND_2G : \ 207ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt WL_CHANSPEC_BAND_5G)) 208ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define CH80MHZ_CHSPEC(channel, ctlsb) (chanspec_t) \ 209ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt ((channel) | (ctlsb) | \ 210ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt WL_CHANSPEC_BW_80 | WL_CHANSPEC_BAND_5G) 211ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define CH160MHZ_CHSPEC(channel, ctlsb) (chanspec_t) \ 212ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt ((channel) | (ctlsb) | \ 213ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt WL_CHANSPEC_BW_160 | WL_CHANSPEC_BAND_5G) 214ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt 21538eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* simple MACROs to get different fields of chanspec */ 216ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define CHSPEC_CHANNEL(chspec) ((uint8)((chspec) & WL_CHANSPEC_CHAN_MASK)) 217ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define CHSPEC_CHAN1(chspec) ((chspec) & WL_CHANSPEC_CHAN1_MASK) 218ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define CHSPEC_CHAN2(chspec) ((chspec) & WL_CHANSPEC_CHAN2_MASK) 219ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define CHSPEC_BAND(chspec) ((chspec) & WL_CHANSPEC_BAND_MASK) 220ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define CHSPEC_CTL_SB(chspec) ((chspec) & WL_CHANSPEC_CTL_SB_MASK) 221ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define CHSPEC_BW(chspec) ((chspec) & WL_CHANSPEC_BW_MASK) 222ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt 223ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#ifdef WL11N_20MHZONLY 224ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt 225ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define CHSPEC_IS10(chspec) 0 226ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define CHSPEC_IS20(chspec) 1 227ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#ifndef CHSPEC_IS40 228ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define CHSPEC_IS40(chspec) 0 229ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#endif 230ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#ifndef CHSPEC_IS80 231ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define CHSPEC_IS80(chspec) 0 232ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#endif 233ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#ifndef CHSPEC_IS160 234ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define CHSPEC_IS160(chspec) 0 235ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#endif 236ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#ifndef CHSPEC_IS8080 237ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define CHSPEC_IS8080(chspec) 0 238ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#endif 239ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt 24038eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#else /* !WL11N_20MHZONLY */ 241ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt 242ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define CHSPEC_IS10(chspec) (((chspec) & WL_CHANSPEC_BW_MASK) == WL_CHANSPEC_BW_10) 243ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define CHSPEC_IS20(chspec) (((chspec) & WL_CHANSPEC_BW_MASK) == WL_CHANSPEC_BW_20) 244ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#ifndef CHSPEC_IS40 245ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define CHSPEC_IS40(chspec) (((chspec) & WL_CHANSPEC_BW_MASK) == WL_CHANSPEC_BW_40) 246ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#endif 247ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#ifndef CHSPEC_IS80 248ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define CHSPEC_IS80(chspec) (((chspec) & WL_CHANSPEC_BW_MASK) == WL_CHANSPEC_BW_80) 249ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#endif 250ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#ifndef CHSPEC_IS160 251ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define CHSPEC_IS160(chspec) (((chspec) & WL_CHANSPEC_BW_MASK) == WL_CHANSPEC_BW_160) 252ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#endif 253ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#ifndef CHSPEC_IS8080 254ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define CHSPEC_IS8080(chspec) (((chspec) & WL_CHANSPEC_BW_MASK) == WL_CHANSPEC_BW_8080) 255ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#endif 256ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt 25738eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#endif /* !WL11N_20MHZONLY */ 258ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt 259ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define CHSPEC_IS5G(chspec) (((chspec) & WL_CHANSPEC_BAND_MASK) == WL_CHANSPEC_BAND_5G) 260ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define CHSPEC_IS2G(chspec) (((chspec) & WL_CHANSPEC_BAND_MASK) == WL_CHANSPEC_BAND_2G) 261ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define CHSPEC_SB_UPPER(chspec) \ 262ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt ((((chspec) & WL_CHANSPEC_CTL_SB_MASK) == WL_CHANSPEC_CTL_SB_UPPER) && \ 263ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt (((chspec) & WL_CHANSPEC_BW_MASK) == WL_CHANSPEC_BW_40)) 264ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define CHSPEC_SB_LOWER(chspec) \ 265ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt ((((chspec) & WL_CHANSPEC_CTL_SB_MASK) == WL_CHANSPEC_CTL_SB_LOWER) && \ 266ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt (((chspec) & WL_CHANSPEC_BW_MASK) == WL_CHANSPEC_BW_40)) 267ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define CHSPEC2WLC_BAND(chspec) (CHSPEC_IS5G(chspec) ? WLC_BAND_5G : WLC_BAND_2G) 268ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt 26938eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/** 27038eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * Number of chars needed for wf_chspec_ntoa() destination character buffer. 27138eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt */ 272ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define CHANSPEC_STR_LEN 20 273ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt 274ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt 27538eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* Legacy Chanspec defines 27638eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * These are the defines for the previous format of the chanspec_t 27738eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt */ 278ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define WL_LCHANSPEC_CHAN_MASK 0x00ff 279ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define WL_LCHANSPEC_CHAN_SHIFT 0 280ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt 281ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define WL_LCHANSPEC_CTL_SB_MASK 0x0300 282ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define WL_LCHANSPEC_CTL_SB_SHIFT 8 283ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define WL_LCHANSPEC_CTL_SB_LOWER 0x0100 284ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define WL_LCHANSPEC_CTL_SB_UPPER 0x0200 285ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define WL_LCHANSPEC_CTL_SB_NONE 0x0300 286ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt 287ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define WL_LCHANSPEC_BW_MASK 0x0C00 288ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define WL_LCHANSPEC_BW_SHIFT 10 289ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define WL_LCHANSPEC_BW_10 0x0400 290ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define WL_LCHANSPEC_BW_20 0x0800 291ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define WL_LCHANSPEC_BW_40 0x0C00 292ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt 293ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define WL_LCHANSPEC_BAND_MASK 0xf000 294ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define WL_LCHANSPEC_BAND_SHIFT 12 295ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define WL_LCHANSPEC_BAND_5G 0x1000 296ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define WL_LCHANSPEC_BAND_2G 0x2000 297ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt 298ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define LCHSPEC_CHANNEL(chspec) ((uint8)((chspec) & WL_LCHANSPEC_CHAN_MASK)) 299ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define LCHSPEC_BAND(chspec) ((chspec) & WL_LCHANSPEC_BAND_MASK) 300ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define LCHSPEC_CTL_SB(chspec) ((chspec) & WL_LCHANSPEC_CTL_SB_MASK) 301ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define LCHSPEC_BW(chspec) ((chspec) & WL_LCHANSPEC_BW_MASK) 302ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define LCHSPEC_IS10(chspec) (((chspec) & WL_LCHANSPEC_BW_MASK) == WL_LCHANSPEC_BW_10) 303ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define LCHSPEC_IS20(chspec) (((chspec) & WL_LCHANSPEC_BW_MASK) == WL_LCHANSPEC_BW_20) 304ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define LCHSPEC_IS40(chspec) (((chspec) & WL_LCHANSPEC_BW_MASK) == WL_LCHANSPEC_BW_40) 305ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define LCHSPEC_IS5G(chspec) (((chspec) & WL_LCHANSPEC_BAND_MASK) == WL_LCHANSPEC_BAND_5G) 306ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define LCHSPEC_IS2G(chspec) (((chspec) & WL_LCHANSPEC_BAND_MASK) == WL_LCHANSPEC_BAND_2G) 307ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt 308ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define LCHSPEC_CREATE(chan, band, bw, sb) ((uint16)((chan) | (sb) | (bw) | (band))) 309ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt 31038eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#endif /* D11AC_IOTYPES */ 311ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt 31238eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* 31338eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * WF_CHAN_FACTOR_* constants are used to calculate channel frequency 31438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * given a channel number. 31538eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * chan_freq = chan_factor * 500Mhz + chan_number * 5 31638eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt */ 317ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt 31838eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/** 31938eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * Channel Factor for the starting frequence of 2.4 GHz channels. 32038eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * The value corresponds to 2407 MHz. 32138eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt */ 32238eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define WF_CHAN_FACTOR_2_4_G 4814 /* 2.4 GHz band, 2407 MHz */ 323ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt 32438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/** 32538eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * Channel Factor for the starting frequence of 5 GHz channels. 32638eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * The value corresponds to 5000 MHz. 32738eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt */ 32838eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define WF_CHAN_FACTOR_5_G 10000 /* 5 GHz band, 5000 MHz */ 329ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt 33038eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/** 33138eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * Channel Factor for the starting frequence of 4.9 GHz channels. 33238eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * The value corresponds to 4000 MHz. 33338eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt */ 33438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define WF_CHAN_FACTOR_4_G 8000 /* 4.9 GHz band for Japan */ 335ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt 33638eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define WLC_2G_25MHZ_OFFSET 5 /* 2.4GHz band channel offset */ 337ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt 33838eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/** 33938eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * Convert chanspec to ascii string 34038eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * 34138eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * @param chspec chanspec format 34238eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * @param buf ascii string of chanspec 34338eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * 34438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * @return pointer to buf with room for at least CHANSPEC_STR_LEN bytes 34538eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * 34638eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * @see CHANSPEC_STR_LEN 34738eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt */ 348ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidtextern char * wf_chspec_ntoa(chanspec_t chspec, char *buf); 349ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt 35038eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/** 35138eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * Convert ascii string to chanspec 35238eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * 35338eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * @param a pointer to input string 35438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * 35538eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * @return >= 0 if successful or 0 otherwise 35638eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt */ 357ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidtextern chanspec_t wf_chspec_aton(const char *a); 358ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt 35938eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/** 36038eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * Verify the chanspec fields are valid. 36138eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * 36238eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * Verify the chanspec is using a legal set field values, i.e. that the chanspec 36338eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * specified a band, bw, ctl_sb and channel and that the combination could be 36438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * legal given some set of circumstances. 36538eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * 36638eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * @param chanspec input chanspec to verify 36738eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * 36838eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * @return TRUE if the chanspec is malformed, FALSE if it looks good. 36938eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt */ 370ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidtextern bool wf_chspec_malformed(chanspec_t chanspec); 371ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt 37238eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/** 37338eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * Verify the chanspec specifies a valid channel according to 802.11. 37438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * 37538eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * @param chanspec input chanspec to verify 37638eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * 37738eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * @return TRUE if the chanspec is a valid 802.11 channel 37838eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt */ 379ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidtextern bool wf_chspec_valid(chanspec_t chanspec); 380ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt 38138eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/** 38238eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * Return the primary (control) channel. 38338eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * 38438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * This function returns the channel number of the primary 20MHz channel. For 38538eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * 20MHz channels this is just the channel number. For 40MHz or wider channels 38638eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * it is the primary 20MHz channel specified by the chanspec. 38738eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * 38838eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * @param chspec input chanspec 38938eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * 39038eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * @return Returns the channel number of the primary 20MHz channel 39138eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt */ 392ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidtextern uint8 wf_chspec_ctlchan(chanspec_t chspec); 393ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt 39438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/** 39538eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * Return the primary (control) chanspec. 39638eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * 39738eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * This function returns the chanspec of the primary 20MHz channel. For 20MHz 39838eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * channels this is just the chanspec. For 40MHz or wider channels it is the 39938eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * chanspec of the primary 20MHZ channel specified by the chanspec. 40038eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * 40138eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * @param chspec input chanspec 40238eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * 40338eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * @return Returns the chanspec of the primary 20MHz channel 40438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt */ 405ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidtextern chanspec_t wf_chspec_ctlchspec(chanspec_t chspec); 406ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt 40738eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/** 40838eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * Return a channel number corresponding to a frequency. 40938eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * 41038eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * This function returns the chanspec for the primary 40MHz of an 80MHz channel. 41138eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * The control sideband specifies the same 20MHz channel that the 80MHz channel is using 41238eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * as the primary 20MHz channel. 41338eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt */ 414ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidtextern chanspec_t wf_chspec_primary40_chspec(chanspec_t chspec); 415ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt 41638eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* 41738eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * Return the channel number for a given frequency and base frequency. 41838eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * The returned channel number is relative to the given base frequency. 41938eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * If the given base frequency is zero, a base frequency of 5 GHz is assumed for 42038eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * frequencies from 5 - 6 GHz, and 2.407 GHz is assumed for 2.4 - 2.5 GHz. 42138eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * 42238eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * Frequency is specified in MHz. 42338eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * The base frequency is specified as (start_factor * 500 kHz). 42438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * Constants WF_CHAN_FACTOR_2_4_G, WF_CHAN_FACTOR_5_G are defined for 42538eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * 2.4 GHz and 5 GHz bands. 42638eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * 42738eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * The returned channel will be in the range [1, 14] in the 2.4 GHz band 42838eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * and [0, 200] otherwise. 42938eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * -1 is returned if the start_factor is WF_CHAN_FACTOR_2_4_G and the 43038eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * frequency is not a 2.4 GHz channel, or if the frequency is not and even 43138eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * multiple of 5 MHz from the base frequency to the base plus 1 GHz. 43238eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * 43338eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * Reference 802.11 REVma, section 17.3.8.3, and 802.11B section 18.4.6.2 43438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * 43538eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * @param freq frequency in MHz 43638eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * @param start_factor base frequency in 500 kHz units, e.g. 10000 for 5 GHz 43738eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * 43838eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * @return Returns a channel number 43938eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * 44038eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * @see WF_CHAN_FACTOR_2_4_G 44138eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * @see WF_CHAN_FACTOR_5_G 44238eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt */ 443ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidtextern int wf_mhz2channel(uint freq, uint start_factor); 444ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt 44538eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/** 44638eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * Return the center frequency in MHz of the given channel and base frequency. 44738eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * 44838eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * Return the center frequency in MHz of the given channel and base frequency. 44938eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * The channel number is interpreted relative to the given base frequency. 45038eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * 45138eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * The valid channel range is [1, 14] in the 2.4 GHz band and [0, 200] otherwise. 45238eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * The base frequency is specified as (start_factor * 500 kHz). 45338eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * Constants WF_CHAN_FACTOR_2_4_G, WF_CHAN_FACTOR_5_G are defined for 45438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * 2.4 GHz and 5 GHz bands. 45538eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * The channel range of [1, 14] is only checked for a start_factor of 45638eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * WF_CHAN_FACTOR_2_4_G (4814). 45738eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * Odd start_factors produce channels on .5 MHz boundaries, in which case 45838eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * the answer is rounded down to an integral MHz. 45938eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * -1 is returned for an out of range channel. 46038eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * 46138eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * Reference 802.11 REVma, section 17.3.8.3, and 802.11B section 18.4.6.2 46238eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * 46338eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * @param channel input channel number 46438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * @param start_factor base frequency in 500 kHz units, e.g. 10000 for 5 GHz 46538eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * 46638eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * @return Returns a frequency in MHz 46738eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * 46838eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * @see WF_CHAN_FACTOR_2_4_G 46938eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * @see WF_CHAN_FACTOR_5_G 47038eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt */ 471ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidtextern int wf_channel2mhz(uint channel, uint start_factor); 472ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt 47338eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/** 47438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * Convert ctl chan and bw to chanspec 47538eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * 47638eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * @param ctl_ch channel 47738eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * @param bw bandwidth 47838eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * 47938eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * @return > 0 if successful or 0 otherwise 48038eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * 48138eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt */ 48238eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidtextern uint16 wf_channel2chspec(uint ctl_ch, uint bw); 48338eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt 48438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidtextern uint wf_channel2freq(uint channel); 48538eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidtextern uint wf_freq2channel(uint freq); 48638eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt 48738eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt 48838eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#endif /* _bcmwifi_channels_h_ */ 489