bwfmreg.h revision 1.6 1 /* $NetBSD: bwfmreg.h,v 1.6 2019/10/28 06:37:51 mlelstv Exp $ */
2 /* $OpenBSD: bwfmreg.h,v 1.16 2018/02/07 21:44:09 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_WATCHDOG 0x00000080
54 #define BWFM_CHIP_REG_EROMPTR 0x000000FC
55 #define BWFM_CHIP_REG_SR_CAPABILITY 0x00000500
56 #define BWFM_CHIP_REG_SR_CONTROL0 0x00000504
57 #define BWFM_CHIP_REG_SR_CONTROL1 0x00000508
58 #define BWFM_CHIP_REG_PMUCONTROL 0x00000600
59 #define BWFM_CHIP_REG_PMUCONTROL_RES_MASK 0x00006000
60 #define BWFM_CHIP_REG_PMUCONTROL_RES_SHIFT 13
61 #define BWFM_CHIP_REG_PMUCONTROL_RES_RELOAD 0x2
62 #define BWFM_CHIP_REG_PMUCAPABILITIES 0x00000604
63 #define BWFM_CHIP_REG_PMUCAPABILITIES_REV_MASK 0x000000ff
64 #define BWFM_CHIP_REG_PMUCAPABILITIES_EXT 0x0000064C
65 #define BWFM_CHIP_REG_PMUCAPABILITIES_SR_SUPP (1 << 1)
66 #define BWFM_CHIP_REG_CHIPCONTROL_ADDR 0x00000650
67 #define BWFM_CHIP_REG_CHIPCONTROL_DATA 0x00000654
68 #define BWFM_CHIP_REG_RETENTION_CTL 0x00000670
69 #define BWFM_CHIP_REG_RETENTION_CTL_MACPHY_DIS (1 << 26)
70 #define BWFM_CHIP_REG_RETENTION_CTL_LOGIC_DIS (1 << 27)
71
72 /* Agent registers */
73 #define BWFM_AGENT_IOCTL 0x0408
74 #define BWFM_AGENT_IOCTL_CLK 0x0001
75 #define BWFM_AGENT_IOCTL_FGC 0x0002
76 #define BWFM_AGENT_IOCTL_CORE_BITS 0x3FFC
77 #define BWFM_AGENT_IOCTL_PME_EN 0x4000
78 #define BWFM_AGENT_IOCTL_BIST_EN 0x8000
79 #define BWFM_AGENT_IOCTL_ARMCR4_CPUHALT 0x0020
80 #define BWFM_AGENT_RESET_CTL 0x0800
81 #define BWFM_AGENT_RESET_CTL_RESET 0x0001
82
83 /* Agent Core-IDs */
84 #define BWFM_AGENT_CORE_CHIPCOMMON 0x800
85 #define BWFM_AGENT_INTERNAL_MEM 0x80E
86 #define BWFM_AGENT_CORE_80211 0x812
87 #define BWFM_AGENT_CORE_PMU 0x827
88 #define BWFM_AGENT_CORE_SDIO_DEV 0x829
89 #define BWFM_AGENT_CORE_ARM_CM3 0x82A
90 #define BWFM_AGENT_CORE_PCIE2 0x83C
91 #define BWFM_AGENT_CORE_ARM_CR4 0x83E
92 #define BWFM_AGENT_CORE_ARM_CA7 0x847
93 #define BWFM_AGENT_SYS_MEM 0x849
94
95 /* Specific Core Bits */
96 #define BWFM_AGENT_ARMCR4_IOCTL_CPUHALT 0x0020
97 #define BWFM_AGENT_D11_IOCTL_PHYCLOCKEN 0x0004
98 #define BWFM_AGENT_D11_IOCTL_PHYRESET 0x0008
99
100 /* CR4 registers */
101 #define BWFM_ARMCR4_CAP 0x0004
102 #define BWFM_ARMCR4_CAP_TCBANB_MASK 0xf
103 #define BWFM_ARMCR4_CAP_TCBANB_SHIFT 0
104 #define BWFM_ARMCR4_CAP_TCBBNB_MASK 0xf0
105 #define BWFM_ARMCR4_CAP_TCBBNB_SHIFT 4
106 #define BWFM_ARMCR4_BANKIDX 0x0040
107 #define BWFM_ARMCR4_BANKINFO 0x0044
108 #define BWFM_ARMCR4_BANKINFO_BSZ_MASK 0x3f
109 #define BWFM_ARMCR4_BANKINFO_BSZ_MULT 8192
110 #define BWFM_ARMCR4_BANKPDA 0x004C
111
112 /* SOCRAM registers */
113 #define BWFM_SOCRAM_COREINFO 0x0000
114 #define BWFM_SOCRAM_COREINFO_SRBSZ_BASE 14
115 #define BWFM_SOCRAM_COREINFO_SRBSZ_MASK 0xf
116 #define BWFM_SOCRAM_COREINFO_SRBSZ_SHIFT 0
117 #define BWFM_SOCRAM_COREINFO_SRNB_MASK 0xf0
118 #define BWFM_SOCRAM_COREINFO_SRNB_SHIFT 4
119 #define BWFM_SOCRAM_COREINFO_LSS_MASK 0xf00000
120 #define BWFM_SOCRAM_COREINFO_LSS_SHIFT 20
121 #define BWFM_SOCRAM_BANKIDX 0x0010
122 #define BWFM_SOCRAM_BANKIDX_MEMTYPE_RAM 0
123 #define BWFM_SOCRAM_BANKIDX_MEMTYPE_ROM 1
124 #define BWFM_SOCRAM_BANKIDX_MEMTYPE_DEVRAM 2
125 #define BWFM_SOCRAM_BANKIDX_MEMTYPE_SHIFT 8
126 #define BWFM_SOCRAM_BANKINFO 0x0040
127 #define BWFM_SOCRAM_BANKINFO_SZBASE 8192
128 #define BWFM_SOCRAM_BANKINFO_SZMASK 0x7f
129 #define BWFM_SOCRAM_BANKINFO_RETNTRAM_MASK 0x10000
130 #define BWFM_SOCRAM_BANKPDA 0x0044
131
132 /* SDPCMD registers */
133 #define BWFM_SDPCMD_INTSTATUS 0x0020
134
135 /* DMP descriptor */
136 #define BWFM_DMP_DESC_MASK 0x0000000F
137 #define BWFM_DMP_DESC_EMPTY 0x00000000
138 #define BWFM_DMP_DESC_VALID 0x00000001
139 #define BWFM_DMP_DESC_COMPONENT 0x00000001
140 #define BWFM_DMP_DESC_MASTER_PORT 0x00000003
141 #define BWFM_DMP_DESC_ADDRESS 0x00000005
142 #define BWFM_DMP_DESC_ADDRSIZE_GT32 0x00000008
143 #define BWFM_DMP_DESC_EOT 0x0000000F
144 #define BWFM_DMP_COMP_DESIGNER 0xFFF00000
145 #define BWFM_DMP_COMP_DESIGNER_S 20
146 #define BWFM_DMP_COMP_PARTNUM 0x000FFF00
147 #define BWFM_DMP_COMP_PARTNUM_S 8
148 #define BWFM_DMP_COMP_CLASS 0x000000F0
149 #define BWFM_DMP_COMP_CLASS_S 4
150 #define BWFM_DMP_COMP_REVISION 0xFF000000
151 #define BWFM_DMP_COMP_REVISION_S 24
152 #define BWFM_DMP_COMP_NUM_SWRAP 0x00F80000
153 #define BWFM_DMP_COMP_NUM_SWRAP_S 19
154 #define BWFM_DMP_COMP_NUM_MWRAP 0x0007C000
155 #define BWFM_DMP_COMP_NUM_MWRAP_S 14
156 #define BWFM_DMP_COMP_NUM_SPORT 0x00003E00
157 #define BWFM_DMP_COMP_NUM_SPORT_S 9
158 #define BWFM_DMP_COMP_NUM_MPORT 0x000001F0
159 #define BWFM_DMP_COMP_NUM_MPORT_S 4
160 #define BWFM_DMP_MASTER_PORT_UID 0x0000FF00
161 #define BWFM_DMP_MASTER_PORT_UID_S 8
162 #define BWFM_DMP_MASTER_PORT_NUM 0x000000F0
163 #define BWFM_DMP_MASTER_PORT_NUM_S 4
164 #define BWFM_DMP_SLAVE_ADDR_BASE 0xFFFFF000
165 #define BWFM_DMP_SLAVE_ADDR_BASE_S 12
166 #define BWFM_DMP_SLAVE_PORT_NUM 0x00000F00
167 #define BWFM_DMP_SLAVE_PORT_NUM_S 8
168 #define BWFM_DMP_SLAVE_TYPE 0x000000C0
169 #define BWFM_DMP_SLAVE_TYPE_S 6
170 #define BWFM_DMP_SLAVE_TYPE_SLAVE 0
171 #define BWFM_DMP_SLAVE_TYPE_BRIDGE 1
172 #define BWFM_DMP_SLAVE_TYPE_SWRAP 2
173 #define BWFM_DMP_SLAVE_TYPE_MWRAP 3
174 #define BWFM_DMP_SLAVE_SIZE_TYPE 0x00000030
175 #define BWFM_DMP_SLAVE_SIZE_TYPE_S 4
176 #define BWFM_DMP_SLAVE_SIZE_4K 0
177 #define BWFM_DMP_SLAVE_SIZE_8K 1
178 #define BWFM_DMP_SLAVE_SIZE_16K 2
179 #define BWFM_DMP_SLAVE_SIZE_DESC 3
180
181 /* Security Parameters */
182 #define BWFM_AUTH_OPEN 0
183 #define BWFM_AUTH_SHARED_KEY 1
184 #define BWFM_AUTH_AUTO 2
185 #define BWFM_CRYPTO_ALGO_OFF 0
186 #define BWFM_CRYPTO_ALGO_WEP1 1
187 #define BWFM_CRYPTO_ALGO_TKIP 2
188 #define BWFM_CRYPTO_ALGO_WEP128 3
189 #define BWFM_CRYPTO_ALGO_AES_CCM 4
190 #define BWFM_CRYPTO_ALGO_AES_RESERVED1 5
191 #define BWFM_CRYPTO_ALGO_AES_RESERVED2 6
192 #define BWFM_MFP_NONE 0
193 #define BWFM_MFP_CAPABLE 1
194 #define BWFM_MFP_REQUIRED 2
195 #define BWFM_WPA_AUTH_DISABLED (0 << 0)
196 #define BWFM_WPA_AUTH_NONE (1 << 0)
197 #define BWFM_WPA_AUTH_WPA_UNSPECIFIED (1 << 1)
198 #define BWFM_WPA_AUTH_WPA_PSK (1 << 2)
199 #define BWFM_WPA_AUTH_WPA2_UNSPECIFIED (1 << 6)
200 #define BWFM_WPA_AUTH_WPA2_PSK (1 << 7)
201 #define BWFM_WPA_AUTH_WPA2_1X_SHA256 (1 << 12)
202 #define BWFM_WPA_AUTH_WPA2_PSK_SHA256 (1 << 15)
203 #define BWFM_WSEC_NONE (0 << 0)
204 #define BWFM_WSEC_WEP (1 << 0)
205 #define BWFM_WSEC_TKIP (1 << 1)
206 #define BWFM_WSEC_AES (1 << 2)
207
208 /* Channel Parameters */
209 #define BWFM_CHANSPEC_CHAN_MASK 0xff
210 #define BWFM_CHANSPEC_CHAN_SHIFT 0
211 #define BWFM_CHANSPEC_D11N_SB_L (0x1 << 8) /* control lower */
212 #define BWFM_CHANSPEC_D11N_SB_U (0x2 << 8) /* control lower */
213 #define BWFM_CHANSPEC_D11N_SB_N (0x3 << 8) /* none */
214 #define BWFM_CHANSPEC_D11N_SB_MASK (0x3 << 8)
215 #define BWFM_CHANSPEC_D11N_SB_SHIFT 8
216 #define BWFM_CHANSPEC_D11N_BW_10 (0x1 << 10)
217 #define BWFM_CHANSPEC_D11N_BW_20 (0x2 << 10)
218 #define BWFM_CHANSPEC_D11N_BW_40 (0x3 << 10)
219 #define BWFM_CHANSPEC_D11N_BW_MASK (0x3 << 10)
220 #define BWFM_CHANSPEC_D11N_BW_SHIFT 10
221 #define BWFM_CHANSPEC_D11N_BND_5G (0x1 << 12)
222 #define BWFM_CHANSPEC_D11N_BND_2G (0x2 << 12)
223 #define BWFM_CHANSPEC_D11N_BND_MASK (0x3 << 12)
224 #define BWFM_CHANSPEC_D11N_BND_SHIFT 12
225 #define BWFM_CHANSPEC_D11AC_SB_LLL (0x0 << 8)
226 #define BWFM_CHANSPEC_D11AC_SB_LLU (0x1 << 8)
227 #define BWFM_CHANSPEC_D11AC_SB_LUL (0x2 << 8)
228 #define BWFM_CHANSPEC_D11AC_SB_LUU (0x3 << 8)
229 #define BWFM_CHANSPEC_D11AC_SB_ULL (0x4 << 8)
230 #define BWFM_CHANSPEC_D11AC_SB_ULU (0x5 << 8)
231 #define BWFM_CHANSPEC_D11AC_SB_UUL (0x6 << 8)
232 #define BWFM_CHANSPEC_D11AC_SB_UUU (0x7 << 8)
233 #define BWFM_CHANSPEC_D11AC_SB_MASK (0x7 << 8)
234 #define BWFM_CHANSPEC_D11AC_SB_SHIFT 8
235 #define BWFM_CHANSPEC_D11AC_BW_5 (0x0 << 11)
236 #define BWFM_CHANSPEC_D11AC_BW_10 (0x1 << 11)
237 #define BWFM_CHANSPEC_D11AC_BW_20 (0x2 << 11)
238 #define BWFM_CHANSPEC_D11AC_BW_40 (0x3 << 11)
239 #define BWFM_CHANSPEC_D11AC_BW_80 (0x4 << 11)
240 #define BWFM_CHANSPEC_D11AC_BW_160 (0x5 << 11)
241 #define BWFM_CHANSPEC_D11AC_BW_8080 (0x6 << 11)
242 #define BWFM_CHANSPEC_D11AC_BW_MASK (0x7 << 11)
243 #define BWFM_CHANSPEC_D11AC_BW_SHIFT 11
244 #define BWFM_CHANSPEC_D11AC_BND_2G (0x0 << 14)
245 #define BWFM_CHANSPEC_D11AC_BND_3G (0x1 << 14)
246 #define BWFM_CHANSPEC_D11AC_BND_4G (0x2 << 14)
247 #define BWFM_CHANSPEC_D11AC_BND_5G (0x3 << 14)
248 #define BWFM_CHANSPEC_D11AC_BND_MASK (0x3 << 14)
249 #define BWFM_CHANSPEC_D11AC_BND_SHIFT 14
250
251 #define BWFM_BAND_AUTO 0
252 #define BWFM_BAND_5G 1
253 #define BWFM_BAND_2G 2
254 #define BWFM_BAND_ALL 3
255
256 /* Power Modes */
257 #define BWFM_PM_CAM 0
258 #define BWFM_PM_PS 1
259 #define BWFM_PM_FAST_PS 2
260
261 /* DCMD commands */
262 #define BWFM_C_GET_VERSION 1
263 #define BWFM_C_UP 2
264 #define BWFM_C_DOWN 3
265 #define BWFM_C_SET_PROMISC 10
266 #define BWFM_C_GET_RATE 12
267 #define BWFM_C_GET_INFRA 19
268 #define BWFM_C_SET_INFRA 20
269 #define BWFM_C_GET_AUTH 21
270 #define BWFM_C_SET_AUTH 22
271 #define BWFM_C_GET_BSSID 23
272 #define BWFM_C_GET_SSID 25
273 #define BWFM_C_SET_SSID 26
274 #define BWFM_C_TERMINATED 28
275 #define BWFM_C_GET_CHANNEL 29
276 #define BWFM_C_SET_CHANNEL 30
277 #define BWFM_C_GET_SRL 31
278 #define BWFM_C_SET_SRL 32
279 #define BWFM_C_GET_LRL 33
280 #define BWFM_C_SET_LRL 34
281 #define BWFM_C_GET_RADIO 37
282 #define BWFM_C_SET_RADIO 38
283 #define BWFM_C_GET_PHYTYPE 39
284 #define BWFM_C_SET_KEY 45
285 #define BWFM_C_GET_REGULATORY 46
286 #define BWFM_C_SET_REGULATORY 47
287 #define BWFM_C_SET_PASSIVE_SCAN 49
288 #define BWFM_C_SCAN 50
289 #define BWFM_C_SCAN_RESULTS 51
290 #define BWFM_C_DISASSOC 52
291 #define BWFM_C_REASSOC 53
292 #define BWFM_C_SET_ROAM_TRIGGER 55
293 #define BWFM_C_SET_ROAM_DELTA 57
294 #define BWFM_C_GET_BCNPRD 75
295 #define BWFM_C_SET_BCNPRD 76
296 #define BWFM_C_GET_DTIMPRD 77
297 #define BWFM_C_SET_DTIMPRD 78
298 #define BWFM_C_SET_COUNTRY 84
299 #define BWFM_C_GET_PM 85
300 #define BWFM_C_SET_PM 86
301 #define BWFM_C_GET_REVINFO 98
302 #define BWFM_C_GET_CURR_RATESET 114
303 #define BWFM_C_GET_AP 117
304 #define BWFM_C_SET_AP 118
305 #define BWFM_C_SET_SCB_AUTHORIZE 121
306 #define BWFM_C_SET_SCB_DEAUTHORIZE 122
307 #define BWFM_C_GET_RSSI 127
308 #define BWFM_C_GET_WSEC 133
309 #define BWFM_C_SET_WSEC 134
310 #define BWFM_C_GET_PHY_NOISE 135
311 #define BWFM_C_GET_BSS_INFO 136
312 #define BWFM_C_GET_GET_PKTCNTS 137
313 #define BWFM_C_GET_BANDLIST 140
314 #define BWFM_C_SET_SCB_TIMEOUT 158
315 #define BWFM_C_GET_ASSOCLIST 159
316 #define BWFM_C_GET_PHYLIST 180
317 #define BWFM_C_SET_SCAN_CHANNEL_TIME 185
318 #define BWFM_C_SET_SCAN_UNASSOC_TIME 187
319 #define BWFM_C_SCB_DEAUTHENTICATE_FOR_REASON 201
320 #define BWFM_C_SET_ASSOC_PREFER 205
321 #define BWFM_C_GET_VALID_CHANNELS 217
322 #define BWFM_C_GET_KEY_PRIMARY 235
323 #define BWFM_C_SET_KEY_PRIMARY 236
324 #define BWFM_C_SET_SCAN_PASSIVE_TIME 258
325 #define BWFM_C_GET_VAR 262
326 #define BWFM_C_SET_VAR 263
327 #define BWFM_C_SET_WSEC_PMK 268
328
329 /* Small, medium, and maximum buffer size for dcmd */
330 #define BWFM_DCMD_SMLEN 256
331 #define BWFM_DCMD_MEDLEN 1536
332 #define BWFM_DCMD_MAXLEN 8192
333
334 struct bwfm_proto_bcdc_dcmd {
335 struct {
336 uint32_t cmd;
337 uint32_t len;
338 uint32_t flags;
339 #define BWFM_BCDC_DCMD_ERROR (1 << 0)
340 #define BWFM_BCDC_DCMD_GET (0 << 1)
341 #define BWFM_BCDC_DCMD_SET (1 << 1)
342 #define BWFM_BCDC_DCMD_IF_GET(x) (((x) >> 12) & 0xf)
343 #define BWFM_BCDC_DCMD_IF_SET(x) (((x) & 0xf) << 12)
344 #define BWFM_BCDC_DCMD_ID_GET(x) (((x) >> 16) & 0xffff)
345 #define BWFM_BCDC_DCMD_ID_SET(x) (((x) & 0xffff) << 16)
346 uint32_t status;
347 } hdr;
348 char buf[8192];
349 };
350
351 struct bwfm_proto_bcdc_hdr {
352 uint8_t flags;
353 #define BWFM_BCDC_FLAG_PROTO_VER 2
354 #define BWFM_BCDC_FLAG_VER(x) (((x) & 0xf) << 4)
355 #define BWFM_BCDC_FLAG_SUM_GOOD (1 << 2) /* rx */
356 #define BWFM_BCDC_FLAG_SUM_NEEDED (1 << 3) /* tx */
357 uint8_t priority;
358 #define BWFM_BCDC_PRIORITY_MASK 0x7
359 uint8_t flags2;
360 #define BWFM_BCDC_FLAG2_IF_MASK 0xf
361 uint8_t data_offset;
362 };
363
364 #define BWFM_MCSSET_LEN 16
365 #define BWFM_MAX_SSID_LEN 32
366 #define BWFM_BSS_INFO_BUFLEN 2048
367 struct bwfm_bss_info {
368 uint32_t version;
369 uint32_t length;
370 uint8_t bssid[ETHER_ADDR_LEN];
371 uint16_t beacon_period;
372 uint16_t capability;
373 uint8_t ssid_len;
374 uint8_t ssid[BWFM_MAX_SSID_LEN];
375 uint8_t pad0;
376 uint32_t nrates;
377 uint8_t rates[16];
378 uint16_t chanspec;
379 uint16_t atim_window;
380 uint8_t dtim_period;
381 uint8_t pad1;
382 uint16_t rssi;
383 uint8_t phy_noise;
384 uint8_t n_cap;
385 uint16_t pad2;
386 uint32_t nbss_cap;
387 uint8_t ctl_ch;
388 uint8_t pad3[3];
389 uint32_t reserved32[1];
390 uint8_t flags;
391 uint8_t reserved[3];
392 uint8_t basic_mcs[BWFM_MCSSET_LEN];
393 uint16_t ie_offset;
394 uint16_t pad4;
395 uint32_t ie_length;
396 uint16_t snr;
397 };
398
399 #define BWFM_MAXRATES_IN_SET BWFM_MCSSET_LEN
400 #define BWFM_ANT_MAX 4
401 #define BWFM_VHT_CAP_MCS_MAP_NSS_MAX 8
402 #define BWFM_HE_CAP_MCS_MAP_NSS_MAX BWFM_VHT_CAP_MCS_MAP_NSS_MAX
403
404 struct bwfm_sta_rateset_v5 {
405 uint32_t count;
406 /* rates in 500kbps units w/hi bit set if basic */
407 uint8_t rates[BWFM_MAXRATES_IN_SET];
408 uint8_t mcs[BWFM_MCSSET_LEN];
409 uint16_t vht_mcs[BWFM_VHT_CAP_MCS_MAP_NSS_MAX];
410 };
411
412 struct bwfm_sta_rateset_v7 {
413 uint16_t version;
414 uint16_t len;
415 uint32_t count;
416 /* rates in 500kbps units w/hi bit set if basic */
417 uint8_t rates[BWFM_MAXRATES_IN_SET];
418 uint8_t mcs[BWFM_MCSSET_LEN];
419 uint16_t vht_mcs[BWFM_VHT_CAP_MCS_MAP_NSS_MAX];
420 uint16_t he_mcs[BWFM_HE_CAP_MCS_MAP_NSS_MAX];
421 };
422
423 struct bwfm_sta_info {
424 uint16_t ver;
425 uint16_t len;
426 uint16_t cap; /* sta's advertised capabilities */
427
428 uint32_t flags;
429 #define BWFM_STA_BRCM 0x00000001 /* Running a Broadcom driver */
430 #define BWFM_STA_WME 0x00000002 /* WMM association */
431 #define BWFM_STA_NONERP 0x00000004 /* No ERP */
432 #define BWFM_STA_AUTHE 0x00000008 /* Authenticated */
433 #define BWFM_STA_ASSOC 0x00000010 /* Associated */
434 #define BWFM_STA_AUTHO 0x00000020 /* Authorized */
435 #define BWFM_STA_WDS 0x00000040 /* Wireless Distribution System */
436 #define BWFM_STA_WDS_LINKUP 0x00000080 /* WDS traffic/probes flowing */
437 #define BWFM_STA_PS 0x00000100 /* STA in power save mode, says AP */
438 #define BWFM_STA_APSD_BE 0x00000200 /* APSD for AC_BE default enabled */
439 #define BWFM_STA_APSD_BK 0x00000400 /* APSD for AC_BK default enabled */
440 #define BWFM_STA_APSD_VI 0x00000800 /* APSD for AC_VI default enabled */
441 #define BWFM_STA_APSD_VO 0x00001000 /* APSD for AC_VO default enabled */
442 #define BWFM_STA_N_CAP 0x00002000 /* STA 802.11n capable */
443 #define BWFM_STA_SCBSTATS 0x00004000 /* Per STA debug stats */
444 #define BWFM_STA_AMPDU_CAP 0x00008000 /* STA AMPDU capable */
445 #define BWFM_STA_AMSDU_CAP 0x00010000 /* STA AMSDU capable */
446 #define BWFM_STA_MIMO_PS 0x00020000 /* mimo ps mode is enabled */
447 #define BWFM_STA_MIMO_RTS 0x00040000 /* send rts in mimo ps mode */
448 #define BWFM_STA_RIFS_CAP 0x00080000 /* rifs enabled */
449 #define BWFM_STA_VHT_CAP 0x00100000 /* STA VHT(11ac) capable */
450 #define BWFM_STA_WPS 0x00200000 /* WPS state */
451 #define BWFM_STA_DWDS_CAP 0x01000000 /* DWDS CAP */
452 #define BWFM_STA_DWDS 0x02000000 /* DWDS active */
453
454 uint32_t idle; /* time since data pkt rx'd from sta */
455 uint8_t ea[ETHER_ADDR_LEN];
456 uint32_t count; /* # rates in this set */
457 uint8_t rates[BWFM_MAXRATES_IN_SET]; /* rates in 500kbps units */
458 /* w/hi bit set if basic */
459 uint32_t in; /* seconds elapsed since associated */
460 uint32_t listen_interval_inms; /* Min Listen interval in ms for STA */
461
462 /* Fields valid for ver >= 3 */
463 uint32_t tx_pkts; /* # of packets transmitted */
464 uint32_t tx_failures; /* # of packets failed */
465 uint32_t rx_ucast_pkts; /* # of unicast packets received */
466 uint32_t rx_mcast_pkts; /* # of multicast packets received */
467 uint32_t tx_rate; /* Rate of last successful tx frame, in bps */
468 uint32_t rx_rate; /* Rate of last successful rx frame, in bps */
469 uint32_t rx_decrypt_succeeds; /* # of packet decrypted successfully */
470 uint32_t rx_decrypt_failures; /* # of packet decrypted failed */
471
472 /* Fields valid for ver >= 4 */
473 uint32_t tx_tot_pkts; /* # of tx pkts (ucast + mcast) */
474 uint32_t rx_tot_pkts; /* # of data packets recvd (uni + mcast) */
475 uint32_t tx_mcast_pkts; /* # of mcast pkts txed */
476 uint64_t tx_tot_bytes; /* data bytes txed (ucast + mcast) */
477 uint64_t rx_tot_bytes; /* data bytes recvd (ucast + mcast) */
478 uint64_t tx_ucast_bytes; /* data bytes txed (ucast) */
479 uint64_t tx_mcast_bytes; /* # data bytes txed (mcast) */
480 uint64_t rx_ucast_bytes; /* data bytes recvd (ucast) */
481 uint64_t rx_mcast_bytes; /* data bytes recvd (mcast) */
482 int8_t rssi[BWFM_ANT_MAX]; /* per antenna rssi */
483 int8_t nf[BWFM_ANT_MAX]; /* per antenna noise floor */
484 uint16_t aid; /* association ID */
485 uint16_t ht_capabilities; /* advertised ht caps */
486 uint16_t vht_flags; /* converted vht flags */
487 uint32_t tx_pkts_retry_cnt; /* # of frames where a retry was
488 * exhausted.
489 */
490 uint32_t tx_pkts_retry_exhausted; /* # of user frames where a retry
491 * was exhausted
492 */
493 int8_t rx_lastpkt_rssi[BWFM_ANT_MAX]; /* Per antenna RSSI of last
494 * received data frame.
495 */
496 /* TX WLAN retry/failure statistics:
497 * Separated for host requested frames and locally generated frames.
498 * Include unicast frame only where the retries/failures can be counted.
499 */
500 uint32_t tx_pkts_total; /* # user frames sent successfully */
501 uint32_t tx_pkts_retries; /* # user frames retries */
502 uint32_t tx_pkts_fw_total; /* # FW generated sent successfully */
503 uint32_t tx_pkts_fw_retries; /* # retries for FW generated frames */
504 uint32_t tx_pkts_fw_retry_exhausted; /* # FW generated where a retry
505 * was exhausted
506 */
507 uint32_t rx_pkts_retried; /* # rx with retry bit set */
508 uint32_t tx_rate_fallback; /* lowest fallback TX rate */
509
510 union {
511 struct {
512 struct bwfm_sta_rateset_v5 rateset_adv;
513 } v5;
514
515 struct {
516 uint32_t rx_dur_total; /* user RX duration (estimate) */
517 uint16_t chanspec;
518 uint16_t pad_1;
519 struct bwfm_sta_rateset_v7 rateset_adv;
520 uint16_t wpauth; /* authentication type */
521 uint8_t algo; /* crypto alogorithm */
522 uint8_t pad_2;
523 uint32_t tx_rspec;/* Rate of last successful tx frame */
524 uint32_t rx_rspec;/* Rate of last successful rx frame */
525 uint32_t wnm_cap;
526 } v7;
527 };
528 };
529
530 struct bwfm_ssid {
531 uint32_t len;
532 uint8_t ssid[BWFM_MAX_SSID_LEN];
533 };
534
535 struct bwfm_scan_params {
536 struct bwfm_ssid ssid;
537 uint8_t bssid[ETHER_ADDR_LEN];
538 uint8_t bss_type;
539 #define DOT11_BSSTYPE_ANY 2
540 uint8_t scan_type;
541 #define BWFM_SCANTYPE_ACTIVE 0
542 #define BWFM_SCANTYPE_PASSIVE 1
543 #define BWFM_SCANTYPE_DEFAULT 0xff
544 uint32_t nprobes;
545 uint32_t active_time;
546 uint32_t passive_time;
547 uint32_t home_time;
548 uint32_t channel_num;
549 uint16_t channel_list[];
550 };
551
552 struct bwfm_scan_results {
553 uint32_t buflen;
554 uint32_t version;
555 uint32_t count;
556 struct bwfm_bss_info bss_info[];
557 };
558
559 struct bwfm_escan_params {
560 uint32_t version;
561 #define BWFM_ESCAN_REQ_VERSION 1
562 uint16_t action;
563 #define WL_ESCAN_ACTION_START 1
564 #define WL_ESCAN_ACTION_CONTINUE 2
565 #define WL_ESCAN_ACTION_ABORT 3
566 uint16_t sync_id;
567 struct bwfm_scan_params scan_params;
568 };
569
570 struct bwfm_escan_results {
571 uint32_t buflen;
572 uint32_t version;
573 uint16_t sync_id;
574 uint16_t bss_count;
575 struct bwfm_bss_info bss_info[];
576 };
577
578 struct bwfm_assoc_params {
579 uint8_t bssid[ETHER_ADDR_LEN];
580 uint16_t pad;
581 uint32_t chanspec_num;
582 uint16_t chanspec_list[];
583 };
584
585 struct bwfm_join_pref_params {
586 uint8_t type;
587 #define BWFM_JOIN_PREF_RSSI 1
588 #define BWFM_JOIN_PREF_WPA 2
589 #define BWFM_JOIN_PREF_BAND 3
590 #define BWFM_JOIN_PREF_RSSI_DELTA 4
591 uint8_t len;
592 uint8_t rssi_gain;
593 #define BWFM_JOIN_PREF_RSSI_BOOST 8
594 uint8_t band;
595 #define BWFM_JOIN_PREF_BAND_AUTO 0
596 #define BWFM_JOIN_PREF_BAND_5G 1
597 #define BWFM_JOIN_PREF_BAND_2G 2
598 #define BWFM_JOIN_PREF_BAND_ALL 3
599 };
600
601 struct bwfm_join_params {
602 struct bwfm_ssid ssid;
603 struct bwfm_assoc_params assoc;
604 };
605
606 struct bwfm_join_scan_params {
607 uint8_t scan_type;
608 uint8_t pad[3];
609 uint32_t nprobes;
610 uint32_t active_time;
611 uint32_t passive_time;
612 uint32_t home_time;
613 };
614
615 struct bwfm_ext_join_params {
616 struct bwfm_ssid ssid;
617 struct bwfm_join_scan_params scan;
618 struct bwfm_assoc_params assoc;
619 };
620
621 struct bwfm_wsec_pmk {
622 uint16_t key_len;
623 #define BWFM_WSEC_MAX_PSK_LEN 32
624 uint16_t flags;
625 #define BWFM_WSEC_PASSPHRASE (1 << 0)
626 uint8_t key[2 * BWFM_WSEC_MAX_PSK_LEN + 1];
627 };
628
629 struct bwfm_wsec_key {
630 uint32_t index;
631 uint32_t len;
632 uint8_t data[32];
633 uint32_t pad_1[18];
634 uint32_t algo;
635 #define BWFM_CRYPTO_ALGO_OFF 0
636 #define BWFM_CRYPTO_ALGO_WEP1 1
637 #define BWFM_CRYPTO_ALGO_TKIP 2
638 #define BWFM_CRYPTO_ALGO_WEP128 3
639 #define BWFM_CRYPTO_ALGO_AES_CCM 4
640 #define BWFM_CRYPTO_ALGO_AES_RESERVED1 5
641 #define BWFM_CRYPTO_ALGO_AES_RESERVED2 6
642 uint32_t flags;
643 #define BWFM_WSEC_PRIMARY_KEY (1 << 1)
644 #define BWFM_PRIMARY_KEY BWFM_WSEC_PRIMARY_KEY
645 uint32_t pad_2[3];
646 uint32_t iv_initialized;
647 uint32_t pad_3;
648 /* Rx IV */
649 struct {
650 uint32_t hi;
651 uint16_t lo;
652 uint16_t pad_4;
653 } rxiv;
654 uint32_t pad_5[2];
655 uint8_t ea[IEEE80211_ADDR_LEN];
656 };
657
658 #define BWFM_BAND_5G 1
659 #define BWFM_BAND_2G 2
660
661 /* Event handling */
662 enum bwfm_fweh_event_code {
663 BWFM_E_SET_SSID = 0,
664 BWFM_E_JOIN = 1,
665 BWFM_E_START = 2,
666 BWFM_E_AUTH = 3,
667 BWFM_E_AUTH_IND = 4,
668 BWFM_E_DEAUTH = 5,
669 BWFM_E_DEAUTH_IND = 6,
670 BWFM_E_ASSOC = 7,
671 BWFM_E_ASSOC_IND = 8,
672 BWFM_E_REASSOC = 9,
673 BWFM_E_REASSOC_IND = 10,
674 BWFM_E_DISASSOC = 11,
675 BWFM_E_DISASSOC_IND = 12,
676 BWFM_E_QUIET_START = 13,
677 BWFM_E_QUIET_END = 14,
678 BWFM_E_BEACON_RX = 15,
679 BWFM_E_LINK = 16,
680 BWFM_E_MIC_ERROR = 17,
681 BWFM_E_NDIS_LINK = 18,
682 BWFM_E_ROAM = 19,
683 BWFM_E_TXFAIL = 20,
684 BWFM_E_PMKID_CACHE = 21,
685 BWFM_E_RETROGRADE_TSF = 22,
686 BWFM_E_PRUNE = 23,
687 BWFM_E_AUTOAUTH = 24,
688 BWFM_E_EAPOL_MSG = 25,
689 BWFM_E_SCAN_COMPLETE = 26,
690 BWFM_E_ADDTS_IND = 27,
691 BWFM_E_DELTS_IND = 28,
692 BWFM_E_BCNSENT_IND = 29,
693 BWFM_E_BCNRX_MSG = 30,
694 BWFM_E_BCNLOST_MSG = 31,
695 BWFM_E_ROAM_PREP = 32,
696 BWFM_E_PFN_NET_FOUND = 33,
697 BWFM_E_PFN_NET_LOST = 34,
698 BWFM_E_RESET_COMPLETE = 35,
699 BWFM_E_JOIN_START = 36,
700 BWFM_E_ROAM_START = 37,
701 BWFM_E_ASSOC_START = 38,
702 BWFM_E_IBSS_ASSOC = 39,
703 BWFM_E_RADIO = 40,
704 BWFM_E_PSM_WATCHDOG = 41,
705 BWFM_E_PROBREQ_MSG = 44,
706 BWFM_E_SCAN_CONFIRM_IND = 45,
707 BWFM_E_PSK_SUP = 46,
708 BWFM_E_COUNTRY_CODE_CHANGED = 47,
709 BWFM_E_EXCEEDED_MEDIUM_TIME = 48,
710 BWFM_E_ICV_ERROR = 49,
711 BWFM_E_UNICAST_DECODE_ERROR = 50,
712 BWFM_E_MULTICAST_DECODE_ERROR = 51,
713 BWFM_E_TRACE = 52,
714 BWFM_E_IF = 54,
715 BWFM_E_P2P_DISC_LISTEN_COMPLETE = 55,
716 BWFM_E_RSSI = 56,
717 BWFM_E_EXTLOG_MSG = 58,
718 BWFM_E_ACTION_FRAME = 59,
719 BWFM_E_ACTION_FRAME_COMPLETE = 60,
720 BWFM_E_PRE_ASSOC_IND = 61,
721 BWFM_E_PRE_REASSOC_IND = 62,
722 BWFM_E_CHANNEL_ADOPTED = 63,
723 BWFM_E_AP_STARTED = 64,
724 BWFM_E_DFS_AP_STOP = 65,
725 BWFM_E_DFS_AP_RESUME = 66,
726 BWFM_E_ESCAN_RESULT = 69,
727 BWFM_E_ACTION_FRAME_OFF_CHAN_COMPLETE = 70,
728 BWFM_E_PROBERESP_MSG = 71,
729 BWFM_E_P2P_PROBEREQ_MSG = 72,
730 BWFM_E_DCS_REQUEST = 73,
731 BWFM_E_FIFO_CREDIT_MAP = 74,
732 BWFM_E_ACTION_FRAME_RX = 75,
733 BWFM_E_TDLS_PEER_EVENT = 92,
734 BWFM_E_BCMC_CREDIT_SUPPORT = 127,
735 BWFM_E_LAST = 139
736 };
737 #define BWFM_EVENT_MASK_LEN (roundup(BWFM_E_LAST, 8) / 8)
738
739 enum bwfm_fweh_event_status {
740 BWFM_E_STATUS_SUCCESS = 0,
741 BWFM_E_STATUS_FAIL = 1,
742 BWFM_E_STATUS_TIMEOUT = 2,
743 BWFM_E_STATUS_NO_NETWORKS = 3,
744 BWFM_E_STATUS_ABORT = 4,
745 BWFM_E_STATUS_NO_ACK = 5,
746 BWFM_E_STATUS_UNSOLICITED = 6,
747 BWFM_E_STATUS_ATTEMPT = 7,
748 BWFM_E_STATUS_PARTIAL = 8,
749 BWFM_E_STATUS_NEWSCAN = 9,
750 BWFM_E_STATUS_NEWASSOC = 10,
751 BWFM_E_STATUS_11HQUIET = 11,
752 BWFM_E_STATUS_SUPPRESS = 12,
753 BWFM_E_STATUS_NOCHANS = 13,
754 BWFM_E_STATUS_CS_ABORT = 15,
755 BWFM_E_STATUS_ERROR = 16,
756 };
757
758 struct bwfm_ethhdr {
759 uint16_t subtype;
760 uint16_t length;
761 uint8_t version;
762 uint8_t oui[3];
763 #define BWFM_BRCM_OUI "\x00\x10\x18"
764 uint16_t usr_subtype;
765 #define BWFM_BRCM_SUBTYPE_EVENT 1
766 } __packed;
767
768 struct bwfm_event_msg {
769 uint16_t version;
770 uint16_t flags;
771 uint32_t event_type;
772 uint32_t status;
773 uint32_t reason;
774 uint32_t auth_type;
775 uint32_t datalen;
776 struct ether_addr addr;
777 char ifname[IFNAMSIZ];
778 uint8_t ifidx;
779 uint8_t bsscfgidx;
780 } __packed;
781
782 struct bwfm_event {
783 struct ether_header ehdr;
784 #define BWFM_ETHERTYPE_LINK_CTL 0x886c
785 struct bwfm_ethhdr hdr;
786 struct bwfm_event_msg msg;
787 } __packed;
788