Home | History | Annotate | Line # | Download | only in ic
bwfmreg.h revision 1.2
      1 /* $NetBSD: bwfmreg.h,v 1.2 2017/10/20 23:38:56 jmcneill Exp $ */
      2 /* $OpenBSD: bwfmreg.h,v 1.4 2017/10/16 22:27:16 patrick Exp $ */
      3 /*
      4  * Copyright (c) 2010-2016 Broadcom Corporation
      5  * Copyright (c) 2016,2017 Patrick Wildt <patrick (at) blueri.se>
      6  *
      7  * Permission to use, copy, modify, and/or distribute this software for any
      8  * purpose with or without fee is hereby granted, provided that the above
      9  * copyright notice and this permission notice appear in all copies.
     10  *
     11  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
     12  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
     13  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
     14  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
     15  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
     16  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
     17  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
     18  */
     19 
     20 /* SDIO registers */
     21 #define BWFM_SDIO_FUNC1_SBADDRLOW		0x1000A
     22 #define BWFM_SDIO_FUNC1_SBADDRMID		0x1000B
     23 #define BWFM_SDIO_FUNC1_SBADDRHIGH		0x1000C
     24 #define BWFM_SDIO_FUNC1_CHIPCLKCSR		0x1000E
     25 #define  BWFM_SDIO_FUNC1_CHIPCLKCSR_FORCE_ALP			0x01
     26 #define  BWFM_SDIO_FUNC1_CHIPCLKCSR_FORCE_HT			0x02
     27 #define  BWFM_SDIO_FUNC1_CHIPCLKCSR_FORCE_ILP			0x04
     28 #define  BWFM_SDIO_FUNC1_CHIPCLKCSR_ALP_AVAIL_REQ		0x08
     29 #define  BWFM_SDIO_FUNC1_CHIPCLKCSR_HT_AVAIL_REQ		0x10
     30 #define  BWFM_SDIO_FUNC1_CHIPCLKCSR_FORCE_HW_CLKREQ_OFF		0x20
     31 #define  BWFM_SDIO_FUNC1_CHIPCLKCSR_ALP_AVAIL			0x40
     32 #define  BWFM_SDIO_FUNC1_CHIPCLKCSR_HT_AVAIL			0x80
     33 #define  BWFM_SDIO_FUNC1_CHIPCLKCSR_CSR_MASK			0x1F
     34 #define BWFM_SDIO_FUNC1_SDIOPULLUP		0x1000F
     35 
     36 #define BWFM_SDIO_SB_OFT_ADDR_MASK		0x07FFF
     37 #define BWFM_SDIO_SB_ACCESS_2_4B_FLAG		0x08000
     38 
     39 /* Chip registers */
     40 #define BWFM_CHIP_BASE				0x18000000
     41 #define BWFM_CHIP_REG_CHIPID			0x00000000
     42 #define  BWFM_CHIP_CHIPID_ID(x)				(((x) >> 0) & 0xffff)
     43 #define  BWFM_CHIP_CHIPID_REV(x)			(((x) >> 16) & 0xf)
     44 #define  BWFM_CHIP_CHIPID_PKG(x)			(((x) >> 20) & 0xf)
     45 #define  BWFM_CHIP_CHIPID_CC(x)				(((x) >> 24) & 0xf)
     46 #define  BWFM_CHIP_CHIPID_TYPE(x)			(((x) >> 28) & 0xf)
     47 #define  BWFM_CHIP_CHIPID_TYPE_SOCI_SB			0
     48 #define  BWFM_CHIP_CHIPID_TYPE_SOCI_AI			1
     49 #define BWFM_CHIP_REG_CAPABILITIES		0x00000004
     50 #define  BWFM_CHIP_REG_CAPABILITIES_PMU			0x10000000
     51 #define BWFM_CHIP_REG_CAPABILITIES_EXT		0x000000AC
     52 #define  BWFM_CHIP_REG_CAPABILITIES_EXT_AOB_PRESENT	0x00000040
     53 #define BWFM_CHIP_REG_EROMPTR			0x000000FC
     54 #define BWFM_CHIP_REG_PMUCONTROL		0x00000600
     55 #define  BWFM_CHIP_REG_PMUCONTROL_RES_MASK		0x00006000
     56 #define  BWFM_CHIP_REG_PMUCONTROL_RES_SHIFT		13
     57 #define  BWFM_CHIP_REG_PMUCONTROL_RES_RELOAD		0x2
     58 #define BWFM_CHIP_REG_PMUCAPABILITIES		0x00000604
     59 #define  BWFM_CHIP_REG_PMUCAPABILITIES_REV_MASK		0x000000ff
     60 
     61 /* Agent registers */
     62 #define BWFM_AGENT_IOCTL			0x0408
     63 #define  BWFM_AGENT_IOCTL_CLK				0x0001
     64 #define  BWFM_AGENT_IOCTL_FGC				0x0002
     65 #define  BWFM_AGENT_IOCTL_CORE_BITS			0x3FFC
     66 #define  BWFM_AGENT_IOCTL_PME_EN			0x4000
     67 #define  BWFM_AGENT_IOCTL_BIST_EN			0x8000
     68 #define BWFM_AGENT_RESET_CTL			0x0800
     69 #define  BWFM_AGENT_RESET_CTL_RESET			0x0001
     70 
     71 /* Agent Core-IDs */
     72 #define BWFM_AGENT_CORE_CHIPCOMMON		0x800
     73 #define BWFM_AGENT_INTERNAL_MEM			0x80E
     74 #define BWFM_AGENT_CORE_80211			0x812
     75 #define BWFM_AGENT_CORE_PMU			0x827
     76 #define BWFM_AGENT_CORE_SDIO_DEV		0x829
     77 #define BWFM_AGENT_CORE_ARM_CM3			0x82A
     78 #define BWFM_AGENT_CORE_ARM_CR4			0x83E
     79 #define BWFM_AGENT_CORE_ARM_CA7			0x847
     80 
     81 /* Specific Core Bits */
     82 #define BWFM_AGENT_ARMCR4_IOCTL_CPUHALT		0x0020
     83 #define BWFM_AGENT_D11_IOCTL_PHYCLOCKEN		0x0004
     84 #define BWFM_AGENT_D11_IOCTL_PHYRESET		0x0008
     85 
     86 /* SOCRAM registers */
     87 #define BWFM_SOCRAM_BANKIDX			0x0010
     88 #define BWFM_SOCRAM_BANKPDA			0x0044
     89 
     90 /* SDPCMD registers */
     91 #define BWFM_SDPCMD_INTSTATUS			0x0020
     92 
     93 /* DMP descriptor */
     94 #define BWFM_DMP_DESC_MASK			0x0000000F
     95 #define BWFM_DMP_DESC_EMPTY			0x00000000
     96 #define BWFM_DMP_DESC_VALID			0x00000001
     97 #define BWFM_DMP_DESC_COMPONENT			0x00000001
     98 #define BWFM_DMP_DESC_MASTER_PORT		0x00000003
     99 #define BWFM_DMP_DESC_ADDRESS			0x00000005
    100 #define BWFM_DMP_DESC_ADDRSIZE_GT32		0x00000008
    101 #define BWFM_DMP_DESC_EOT			0x0000000F
    102 #define BWFM_DMP_COMP_DESIGNER			0xFFF00000
    103 #define BWFM_DMP_COMP_DESIGNER_S		20
    104 #define BWFM_DMP_COMP_PARTNUM			0x000FFF00
    105 #define BWFM_DMP_COMP_PARTNUM_S			8
    106 #define BWFM_DMP_COMP_CLASS			0x000000F0
    107 #define BWFM_DMP_COMP_CLASS_S			4
    108 #define BWFM_DMP_COMP_REVISION			0xFF000000
    109 #define BWFM_DMP_COMP_REVISION_S		24
    110 #define BWFM_DMP_COMP_NUM_SWRAP			0x00F80000
    111 #define BWFM_DMP_COMP_NUM_SWRAP_S		19
    112 #define BWFM_DMP_COMP_NUM_MWRAP			0x0007C000
    113 #define BWFM_DMP_COMP_NUM_MWRAP_S		14
    114 #define BWFM_DMP_COMP_NUM_SPORT			0x00003E00
    115 #define BWFM_DMP_COMP_NUM_SPORT_S		9
    116 #define BWFM_DMP_COMP_NUM_MPORT			0x000001F0
    117 #define BWFM_DMP_COMP_NUM_MPORT_S		4
    118 #define BWFM_DMP_MASTER_PORT_UID		0x0000FF00
    119 #define BWFM_DMP_MASTER_PORT_UID_S		8
    120 #define BWFM_DMP_MASTER_PORT_NUM		0x000000F0
    121 #define BWFM_DMP_MASTER_PORT_NUM_S		4
    122 #define BWFM_DMP_SLAVE_ADDR_BASE		0xFFFFF000
    123 #define BWFM_DMP_SLAVE_ADDR_BASE_S		12
    124 #define BWFM_DMP_SLAVE_PORT_NUM			0x00000F00
    125 #define BWFM_DMP_SLAVE_PORT_NUM_S		8
    126 #define BWFM_DMP_SLAVE_TYPE			0x000000C0
    127 #define BWFM_DMP_SLAVE_TYPE_S			6
    128 #define  BWFM_DMP_SLAVE_TYPE_SLAVE		0
    129 #define  BWFM_DMP_SLAVE_TYPE_BRIDGE		1
    130 #define  BWFM_DMP_SLAVE_TYPE_SWRAP		2
    131 #define  BWFM_DMP_SLAVE_TYPE_MWRAP		3
    132 #define BWFM_DMP_SLAVE_SIZE_TYPE		0x00000030
    133 #define BWFM_DMP_SLAVE_SIZE_TYPE_S		4
    134 #define  BWFM_DMP_SLAVE_SIZE_4K			0
    135 #define  BWFM_DMP_SLAVE_SIZE_8K			1
    136 #define  BWFM_DMP_SLAVE_SIZE_16K		2
    137 #define  BWFM_DMP_SLAVE_SIZE_DESC		3
    138 
    139 /* Security Parameters */
    140 #define BWFM_AUTH_OPEN				0
    141 #define BWFM_AUTH_SHARED_KEY			1
    142 #define BWFM_AUTH_AUTO				2
    143 #define BWFM_MFP_NONE				0
    144 #define BWFM_MFP_CAPABLE			1
    145 #define BWFM_MFP_REQUIRED			2
    146 #define BWFM_WPA_AUTH_DISABLED			(0 << 0)
    147 #define BWFM_WPA_AUTH_NONE			(1 << 0)
    148 #define BWFM_WPA_AUTH_WPA_UNSPECIFIED		(1 << 1)
    149 #define BWFM_WPA_AUTH_WPA_PSK			(1 << 2)
    150 #define BWFM_WPA_AUTH_WPA2_UNSPECIFIED		(1 << 6)
    151 #define BWFM_WPA_AUTH_WPA2_PSK			(1 << 7)
    152 #define BWFM_WPA_AUTH_WPA2_1X_SHA256		(1 << 12)
    153 #define BWFM_WPA_AUTH_WPA2_PSK_SHA256		(1 << 15)
    154 #define BWFM_WSEC_NONE				(0 << 0)
    155 #define BWFM_WSEC_WEP				(1 << 0)
    156 #define BWFM_WSEC_TKIP				(1 << 1)
    157 #define BWFM_WSEC_AES				(1 << 2)
    158 
    159 /* DCMD commands */
    160 #define BWFM_C_GET_VERSION			1
    161 #define BWFM_C_UP				2
    162 #define BWFM_C_DOWN				3
    163 #define BWFM_C_SET_PROMISC			10
    164 #define BWFM_C_GET_RATE				12
    165 #define BWFM_C_GET_INFRA			19
    166 #define BWFM_C_SET_INFRA			20
    167 #define BWFM_C_GET_AUTH				21
    168 #define BWFM_C_SET_AUTH				22
    169 #define BWFM_C_GET_BSSID			23
    170 #define BWFM_C_GET_SSID				25
    171 #define BWFM_C_SET_SSID				26
    172 #define BWFM_C_TERMINATED			28
    173 #define BWFM_C_GET_CHANNEL			29
    174 #define BWFM_C_SET_CHANNEL			30
    175 #define BWFM_C_GET_SRL				31
    176 #define BWFM_C_SET_SRL				32
    177 #define BWFM_C_GET_LRL				33
    178 #define BWFM_C_SET_LRL				34
    179 #define BWFM_C_GET_RADIO			37
    180 #define BWFM_C_SET_RADIO			38
    181 #define BWFM_C_GET_PHYTYPE			39
    182 #define BWFM_C_SET_KEY				45
    183 #define BWFM_C_GET_REGULATORY			46
    184 #define BWFM_C_SET_REGULATORY			47
    185 #define BWFM_C_SET_PASSIVE_SCAN			49
    186 #define BWFM_C_SCAN				50
    187 #define BWFM_C_SCAN_RESULTS			51
    188 #define BWFM_C_DISASSOC				52
    189 #define BWFM_C_REASSOC				53
    190 #define BWFM_C_SET_ROAM_TRIGGER			55
    191 #define BWFM_C_SET_ROAM_DELTA			57
    192 #define BWFM_C_GET_BCNPRD			75
    193 #define BWFM_C_SET_BCNPRD			76
    194 #define BWFM_C_GET_DTIMPRD			77
    195 #define BWFM_C_SET_DTIMPRD			78
    196 #define BWFM_C_SET_COUNTRY			84
    197 #define BWFM_C_GET_PM				85
    198 #define BWFM_C_SET_PM				86
    199 #define BWFM_C_GET_REVINFO			98
    200 #define BWFM_C_GET_CURR_RATESET			114
    201 #define BWFM_C_GET_AP				117
    202 #define BWFM_C_SET_AP				118
    203 #define BWFM_C_SET_SCB_AUTHORIZE		121
    204 #define BWFM_C_SET_SCB_DEAUTHORIZE		122
    205 #define BWFM_C_GET_RSSI				127
    206 #define BWFM_C_GET_WSEC				133
    207 #define BWFM_C_SET_WSEC				134
    208 #define BWFM_C_GET_PHY_NOISE			135
    209 #define BWFM_C_GET_BSS_INFO			136
    210 #define BWFM_C_GET_GET_PKTCNTS			137
    211 #define BWFM_C_GET_BANDLIST			140
    212 #define BWFM_C_SET_SCB_TIMEOUT			158
    213 #define BWFM_C_GET_ASSOCLIST			159
    214 #define BWFM_C_GET_PHYLIST			180
    215 #define BWFM_C_SET_SCAN_CHANNEL_TIME		185
    216 #define BWFM_C_SET_SCAN_UNASSOC_TIME		187
    217 #define BWFM_C_SCB_DEAUTHENTICATE_FOR_REASON	201
    218 #define BWFM_C_SET_ASSOC_PREFER			205
    219 #define BWFM_C_GET_VALID_CHANNELS		217
    220 #define BWFM_C_GET_KEY_PRIMARY			235
    221 #define BWFM_C_SET_KEY_PRIMARY			236
    222 #define BWFM_C_SET_SCAN_PASSIVE_TIME		258
    223 #define BWFM_C_GET_VAR				262
    224 #define BWFM_C_SET_VAR				263
    225 #define BWFM_C_SET_WSEC_PMK			268
    226 
    227 /* Small, medium, and maximum buffer size for dcmd */
    228 #define	BWFM_DCMD_SMLEN				256
    229 #define	BWFM_DCMD_MEDLEN			1536
    230 #define	BWFM_DCMD_MAXLEN			8192
    231 
    232 struct bwfm_proto_bcdc_dcmd {
    233 	struct {
    234 		uint32_t cmd;
    235 		uint32_t len;
    236 		uint32_t flags;
    237 #define BWFM_BCDC_DCMD_ERROR		(1 << 0)
    238 #define BWFM_BCDC_DCMD_GET		(0 << 1)
    239 #define BWFM_BCDC_DCMD_SET		(1 << 1)
    240 #define BWFM_BCDC_DCMD_IF_GET(x)	(((x) >> 12) & 0xf)
    241 #define BWFM_BCDC_DCMD_IF_SET(x)	(((x) & 0xf) << 12)
    242 #define BWFM_BCDC_DCMD_ID_GET(x)	(((x) >> 16) & 0xffff)
    243 #define BWFM_BCDC_DCMD_ID_SET(x)	(((x) & 0xffff) << 16)
    244 		uint32_t status;
    245 	} hdr;
    246 	char buf[8192];
    247 };
    248 
    249 struct bwfm_proto_bcdc_hdr {
    250 	uint8_t flags;
    251 #define BWFM_BCDC_FLAG_PROTO_VER	2
    252 #define BWFM_BCDC_FLAG_VER(x)		(((x) & 0xf) << 4)
    253 #define BWFM_BCDC_FLAG_SUM_GOOD		(1 << 2) /* rx */
    254 #define BWFM_BCDC_FLAG_SUM_NEEDED	(1 << 3) /* tx */
    255 	uint8_t priority;
    256 #define BWFM_BCDC_PRIORITY_MASK		0x7
    257 	uint8_t flags2;
    258 #define BWFM_BCDC_FLAG2_IF_MASK		0xf
    259 	uint8_t data_offset;
    260 };
    261 
    262 #define BWFM_MCSSET_LEN				16
    263 #define BWFM_MAX_SSID_LEN			32
    264 #define BWFM_BSS_INFO_BUFLEN			2048
    265 struct bwfm_bss_info {
    266 	uint32_t version;
    267 	uint32_t length;
    268 	uint8_t bssid[ETHER_ADDR_LEN];
    269 	uint16_t beacon_period;
    270 	uint16_t capability;
    271 	uint8_t ssid_len;
    272 	uint8_t ssid[BWFM_MAX_SSID_LEN];
    273 	uint32_t nrates;
    274 	uint8_t rates[16];
    275 	uint16_t chanspec;
    276 	uint16_t atim_window;
    277 	uint8_t dtim_period;
    278 	uint16_t rssi;
    279 	uint8_t phy_noise;
    280 	uint8_t n_cap;
    281 	uint32_t nbss_cap;
    282 	uint8_t ctl_ch;
    283 	uint32_t reserved32[1];
    284 	uint8_t flags;
    285 	uint8_t reserved[3];
    286 	uint8_t basic_mcs[BWFM_MCSSET_LEN];
    287 	uint16_t ie_offset;
    288 	uint32_t ie_length;
    289 	uint16_t snr;
    290 };
    291 
    292 struct bwfm_ssid {
    293 	uint32_t len;
    294 	uint8_t ssid[BWFM_MAX_SSID_LEN];
    295 };
    296 
    297 struct bwfm_scan_params {
    298 	struct bwfm_ssid ssid;
    299 	uint8_t bssid[ETHER_ADDR_LEN];
    300 	uint8_t bss_type;
    301 #define DOT11_BSSTYPE_ANY		2
    302 	uint8_t scan_type;
    303 	uint32_t nprobes;
    304 	uint32_t active_time;
    305 	uint32_t passive_time;
    306 	uint32_t home_time;
    307 	uint32_t channel_num;
    308 	uint16_t channel_list[];
    309 };
    310 
    311 struct bwfm_scan_results {
    312 	uint32_t buflen;
    313 	uint32_t version;
    314 	uint32_t count;
    315 	struct bwfm_bss_info bss_info[];
    316 };
    317 
    318 struct bwfm_escan_params {
    319 	uint32_t version;
    320 #define BWFM_ESCAN_REQ_VERSION		1
    321 	uint16_t action;
    322 #define WL_ESCAN_ACTION_START		1
    323 #define WL_ESCAN_ACTION_CONTINUE	2
    324 #define WL_ESCAN_ACTION_ABORT		3
    325 	uint16_t sync_id;
    326 	struct bwfm_scan_params scan_params;
    327 };
    328 
    329 struct bwfm_escan_results {
    330 	uint32_t buflen;
    331 	uint32_t version;
    332 	uint16_t sync_id;
    333 	uint16_t bss_count;
    334 	struct bwfm_bss_info bss_info[];
    335 };
    336 
    337 struct bwfm_assoc_params {
    338 	uint8_t bssid[ETHER_ADDR_LEN];
    339 	uint32_t chanspec_num;
    340 	uint16_t chanspec_list[];
    341 };
    342 
    343 struct bwfm_join_pref_params {
    344 	uint8_t type;
    345 #define BWFM_JOIN_PREF_RSSI		1
    346 #define BWFM_JOIN_PREF_WPA		2
    347 #define BWFM_JOIN_PREF_BAND		3
    348 #define BWFM_JOIN_PREF_RSSI_DELTA	4
    349 	uint8_t len;
    350 	uint8_t rssi_gain;
    351 #define BWFM_JOIN_PREF_RSSI_BOOST	8
    352 	uint8_t band;
    353 #define BWFM_JOIN_PREF_BAND_AUTO	0
    354 #define BWFM_JOIN_PREF_BAND_5G		1
    355 #define BWFM_JOIN_PREF_BAND_2G		2
    356 #define BWFM_JOIN_PREF_BAND_ALL		3
    357 };
    358 
    359 struct bwfm_join_params {
    360 	struct bwfm_ssid ssid;
    361 	struct bwfm_assoc_params assoc;
    362 };
    363 
    364 struct bwfm_join_scan_params {
    365 	uint8_t scan_type;
    366 	uint32_t nprobes;
    367 	uint32_t active_time;
    368 	uint32_t passive_time;
    369 	uint32_t home_time;
    370 };
    371 
    372 struct bwfm_ext_join_params {
    373 	struct bwfm_ssid ssid;
    374 	struct bwfm_join_scan_params scan;
    375 	struct bwfm_assoc_params assoc;
    376 };
    377 
    378 struct bwfm_wsec_pmk {
    379 	uint16_t key_len;
    380 #define BWFM_WSEC_MAX_PSK_LEN		32
    381 	uint16_t flags;
    382 #define BWFM_WSEC_PASSPHRASE		(1 << 0)
    383 	uint8_t key[2 * BWFM_WSEC_MAX_PSK_LEN + 1];
    384 };
    385 
    386 struct bwfm_wsec_key {
    387 	uint32_t index;
    388 	uint32_t len;
    389 	uint8_t data[32];
    390 	uint32_t pad_1[18];
    391 	uint32_t algo;
    392 #define	BWFM_CRYPTO_ALGO_OFF		0
    393 #define	BWFM_CRYPTO_ALGO_WEP1		1
    394 #define	BWFM_CRYPTO_ALGO_TKIP		2
    395 #define	BWFM_CRYPTO_ALGO_WEP128		3
    396 #define	BWFM_CRYPTO_ALGO_AES_CCM	4
    397 #define	BWFM_CRYPTO_ALGO_AES_RESERVED1	5
    398 #define	BWFM_CRYPTO_ALGO_AES_RESERVED2	6
    399 	uint32_t flags;
    400 #define	BWFM_PRIMARY_KEY		(1 << 1)
    401 	uint32_t pad_2[3];
    402 	uint32_t iv_initialized;
    403 	uint32_t pad_3;
    404 	struct {
    405 		uint32_t hi;
    406 		uint16_t lo;
    407 	} rxiv;
    408 	uint32_t pad_4[2];
    409 	uint8_t ea[IEEE80211_ADDR_LEN];
    410 };
    411 
    412 #define	BWFM_BAND_5G			1
    413 #define	BWFM_BAND_2G			2
    414 
    415 /* Event handling */
    416 enum bwfm_fweh_event_code {
    417 	BWFM_E_SET_SSID = 0,
    418 	BWFM_E_JOIN = 1,
    419 	BWFM_E_START = 2,
    420 	BWFM_E_AUTH = 3,
    421 	BWFM_E_AUTH_IND = 4,
    422 	BWFM_E_DEAUTH = 5,
    423 	BWFM_E_DEAUTH_IND = 6,
    424 	BWFM_E_ASSOC = 7,
    425 	BWFM_E_ASSOC_IND = 8,
    426 	BWFM_E_REASSOC = 9,
    427 	BWFM_E_REASSOC_IND = 10,
    428 	BWFM_E_DISASSOC = 11,
    429 	BWFM_E_DISASSOC_IND = 12,
    430 	BWFM_E_QUIET_START = 13,
    431 	BWFM_E_QUIET_END = 14,
    432 	BWFM_E_BEACON_RX = 15,
    433 	BWFM_E_LINK = 16,
    434 	BWFM_E_MIC_ERROR = 17,
    435 	BWFM_E_NDIS_LINK = 18,
    436 	BWFM_E_ROAM = 19,
    437 	BWFM_E_TXFAIL = 20,
    438 	BWFM_E_PMKID_CACHE = 21,
    439 	BWFM_E_RETROGRADE_TSF = 22,
    440 	BWFM_E_PRUNE = 23,
    441 	BWFM_E_AUTOAUTH = 24,
    442 	BWFM_E_EAPOL_MSG = 25,
    443 	BWFM_E_SCAN_COMPLETE = 26,
    444 	BWFM_E_ADDTS_IND = 27,
    445 	BWFM_E_DELTS_IND = 28,
    446 	BWFM_E_BCNSENT_IND = 29,
    447 	BWFM_E_BCNRX_MSG = 30,
    448 	BWFM_E_BCNLOST_MSG = 31,
    449 	BWFM_E_ROAM_PREP = 32,
    450 	BWFM_E_PFN_NET_FOUND = 33,
    451 	BWFM_E_PFN_NET_LOST = 34,
    452 	BWFM_E_RESET_COMPLETE = 35,
    453 	BWFM_E_JOIN_START = 36,
    454 	BWFM_E_ROAM_START = 37,
    455 	BWFM_E_ASSOC_START = 38,
    456 	BWFM_E_IBSS_ASSOC = 39,
    457 	BWFM_E_RADIO = 40,
    458 	BWFM_E_PSM_WATCHDOG = 41,
    459 	BWFM_E_PROBREQ_MSG = 44,
    460 	BWFM_E_SCAN_CONFIRM_IND = 45,
    461 	BWFM_E_PSK_SUP = 46,
    462 	BWFM_E_COUNTRY_CODE_CHANGED = 47,
    463 	BWFM_E_EXCEEDED_MEDIUM_TIME = 48,
    464 	BWFM_E_ICV_ERROR = 49,
    465 	BWFM_E_UNICAST_DECODE_ERROR = 50,
    466 	BWFM_E_MULTICAST_DECODE_ERROR = 51,
    467 	BWFM_E_TRACE = 52,
    468 	BWFM_E_IF = 54,
    469 	BWFM_E_P2P_DISC_LISTEN_COMPLETE = 55,
    470 	BWFM_E_RSSI = 56,
    471 	BWFM_E_EXTLOG_MSG = 58,
    472 	BWFM_E_ACTION_FRAME = 59,
    473 	BWFM_E_ACTION_FRAME_COMPLETE = 60,
    474 	BWFM_E_PRE_ASSOC_IND = 61,
    475 	BWFM_E_PRE_REASSOC_IND = 62,
    476 	BWFM_E_CHANNEL_ADOPTED = 63,
    477 	BWFM_E_AP_STARTED = 64,
    478 	BWFM_E_DFS_AP_STOP = 65,
    479 	BWFM_E_DFS_AP_RESUME = 66,
    480 	BWFM_E_ESCAN_RESULT = 69,
    481 	BWFM_E_ACTION_FRAME_OFF_CHAN_COMPLETE = 70,
    482 	BWFM_E_PROBERESP_MSG = 71,
    483 	BWFM_E_P2P_PROBEREQ_MSG = 72,
    484 	BWFM_E_DCS_REQUEST = 73,
    485 	BWFM_E_FIFO_CREDIT_MAP = 74,
    486 	BWFM_E_ACTION_FRAME_RX = 75,
    487 	BWFM_E_TDLS_PEER_EVENT = 92,
    488 	BWFM_E_BCMC_CREDIT_SUPPORT = 127,
    489 	BWFM_E_LAST = 139
    490 };
    491 #define BWFM_EVENT_MASK_LEN		(roundup(BWFM_E_LAST, 8) / 8)
    492 
    493 enum bwfm_fweh_event_status {
    494 	BWFM_E_STATUS_SUCCESS = 0,
    495 	BWFM_E_STATUS_FAIL = 1,
    496 	BWFM_E_STATUS_TIMEOUT = 2,
    497 	BWFM_E_STATUS_NO_NETWORKS = 3,
    498 	BWFM_E_STATUS_ABORT = 4,
    499 	BWFM_E_STATUS_NO_ACK = 5,
    500 	BWFM_E_STATUS_UNSOLICITED = 6,
    501 	BWFM_E_STATUS_ATTEMPT = 7,
    502 	BWFM_E_STATUS_PARTIAL = 8,
    503 	BWFM_E_STATUS_NEWSCAN = 9,
    504 	BWFM_E_STATUS_NEWASSOC = 10,
    505 	BWFM_E_STATUS_11HQUIET = 11,
    506 	BWFM_E_STATUS_SUPPRESS = 12,
    507 	BWFM_E_STATUS_NOCHANS = 13,
    508 	BWFM_E_STATUS_CS_ABORT = 15,
    509 	BWFM_E_STATUS_ERROR = 16,
    510 };
    511 
    512 struct bwfm_ethhdr {
    513 	uint16_t subtype;
    514 	uint16_t length;
    515 	uint8_t version;
    516 	uint8_t oui[3];
    517 #define	BWFM_BRCM_OUI			"\x00\x10\x18"
    518 	uint16_t usr_subtype;
    519 #define	BWFM_BRCM_SUBTYPE_EVENT		1
    520 };
    521 
    522 struct bwfm_event_msg {
    523 	uint16_t version;
    524 	uint16_t flags;
    525 	uint32_t event_type;
    526 	uint32_t status;
    527 	uint32_t reason;
    528 	uint32_t auth_type;
    529 	uint32_t datalen;
    530 	struct ether_addr addr;
    531 	char ifname[IFNAMSIZ];
    532 	uint8_t ifidx;
    533 	uint8_t bsscfgidx;
    534 };
    535 
    536 struct bwfm_event {
    537 	struct ether_header ehdr;
    538 #define BWFM_ETHERTYPE_LINK_CTL			0x886c
    539 	struct bwfm_ethhdr hdr;
    540 	struct bwfm_event_msg msg;
    541 } __packed;
    542