1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 /* 22 * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 23 * Use is subject to license terms. 24 */ 25 26 #ifndef _SYS_USB_WUSBA_H 27 #define _SYS_USB_WUSBA_H 28 29 #ifdef __cplusplus 30 extern "C" { 31 #endif 32 33 /* Wireless USB feature selectors */ 34 #define WUSB_FEAT_TX_DRP_IE 0 35 #define WUSB_FEAT_DEV_XMIT_PKT 1 36 #define WUSB_FEAT_COUNT_PKTS 2 37 #define WUSB_FEAT_CAPT_PKTS 3 38 39 /* Wireless USB status selector for GET_STATUS request */ 40 #define WUSB_STS_TYPE_STANDARD 0 41 #define WUSB_STS_TYPE_WIRELESS_FEAT 1 42 #define WUSB_STS_TYPE_CHANNEL_INFO 2 43 #define WUSB_STS_TYPE_RECVD_DATA 3 44 #define WUSB_STS_TYPE_MAS_AVAIL 4 45 #define WUSB_STS_TYPE_TRANS_PWR 5 46 47 /* 48 * Device buffer length for count packets and capture packet functions, 49 * refer to WUSB 1.0 4.3.7.2 50 */ 51 #define WUSB_COUNT_CAPT_PKT_LEN 512 52 53 /* Length for Wireless USB GET_STATUS request */ 54 #define WUSB_STANDARD_STS_LEN 2 55 #define WUSB_FEAT_STAT_LEN 1 56 #define WUSB_CHANNEL_INFO_STS_LEN 1 57 #define WUSB_RECVD_DATA_STS_LEN WUSB_COUNT_CAPT_PKT_LEN 58 #define WUSB_MAS_AVAIL_STS_LEN 1 59 #define WUSB_TRANS_PWR_STS_LEN 2 60 61 /* Wiless USB feature status bits */ 62 #define WUSB_TX_DRP_IE_STATUS 1 63 #define WUSB_TRANS_PWR_STATUS 2 64 #define WUSB_COUNT_PKTS_STATUS 4 65 #define WUSB_CAPT_PKTS_STATUS 8 66 67 /* Status data */ 68 typedef struct wusb_counted_pkt { 69 uint8_t recp_time[3]; 70 uint8_t mac_header[6]; 71 uint8_t lqi; 72 } wusb_counted_pkt_t; 73 74 typedef struct wusb_count_pkts { 75 uint8_t pkt_count; 76 wusb_counted_pkt_t pkt_block[51]; 77 } wusb_count_pkts_t; 78 79 typedef struct wusb_trans_pwr { 80 uint8_t bTxNotifTransPwr; 81 uint8_t bTxBeaconTransPwr; 82 } wusb_trans_pwr_t; 83 84 /* Wireless USB data selectors for SetWUSBDate request */ 85 #define WUSB_DATA_DRPIE_INFO 1 86 #define WUSB_DATA_TRANS_DATA 2 87 #define WUSB_DATA_TRANS_PARAMS 3 88 #define WUSB_DATA_RECV_PARAMS 4 89 #define WUSB_DATA_TRANS_PWR 5 90 91 typedef struct wusb_trans_params { 92 uint8_t trans_time[3]; 93 uint8_t trans_adjust; 94 } wusb_trans_params_t; 95 96 typedef struct wusb_recv_params { 97 uint8_t recv_filter; 98 uint8_t recv_channel; 99 uint8_t recv_start_time[3]; 100 uint8_t recv_end_time[3]; 101 } wusb_recv_params_t; 102 103 /* Wireless USB key index bits */ 104 #define WUSB_KEY_INDEX_MASK 0x0f 105 #define WUSB_KEY_TYPE_MASK 0x30 106 #define WUSB_KEY_TYPE_ASSOCIATION 0x10 107 #define WUSB_KEY_TYPE_GTK 0x20 108 #define WUSB_KEY_ORIGIN_MASK 0x40 109 #define WUSB_KEY_ORIGIN_HOST 0x00 110 #define WUSB_KEY_ORIGIN_DEV 0x40 111 112 typedef struct wusb_key { 113 #if defined(_BIT_FIELDS_LTOH) 114 uint8_t key_index :4, 115 key_type :2, 116 key_origin :1, 117 key_resv :1; 118 #elif defined(_BIT_FIELDS_HTOL) 119 uint8_t key_resv :1, 120 key_origin :1, 121 key_type :2, 122 key_index :4; 123 #endif 124 } wusb_key_t; 125 126 /* Wireless USB handshake data */ 127 typedef struct wusb_hndshk_data { 128 uint8_t bMessageNumber; 129 uint8_t bStatus; 130 uint8_t tTKID[3]; 131 uint8_t bReserved; 132 uint8_t CDID[16]; 133 uint8_t Nonce[16]; 134 uint8_t MIC[8]; 135 } wusb_hndshk_data_t; 136 137 /* Handshake stage */ 138 #define WUSB_HNDSHK_MSG_NUM1 1 139 #define WUSB_HNDSHK_MSG_NUM2 2 140 #define WUSB_HNDSHK_MSG_NUM3 3 141 142 /* Handshake status */ 143 #define WUSB_HNDSHK_NORMAL 0 144 #define WUSB_HNDSHK_ABORT_PER_POLICY 1 145 #define WUSB_HNDSHK_IN_PROGRESS 2 146 #define WUSB_HNDSHK_TKID_CONFLICT 3 147 148 #define WUSB_HNDSHK_DATA_LEN 46 149 150 /* Wireless USB connection context */ 151 #define WUSB_CHID_LEN 16 152 #define WUSB_CDID_LEN 16 153 #define WUSB_CK_LEN 16 154 #define WUSB_CC_LEN 48 155 156 157 /* 158 * **************************************** 159 * IE definitions 160 * **************************************** 161 */ 162 163 /* Wireless USB channel IE identifiers */ 164 #define WUSB_IE_WCTA 0x80 165 #define WUSB_IE_CONNECTACK 0x81 166 #define WUSB_IE_HOSTINFO 0x82 167 #define WUSB_IE_CHCHANGEANNOUNCE 0x83 168 #define WUSB_IE_DEV_DISCONNECT 0x84 169 #define WUSB_IE_HOST_DISCONNECT 0x85 170 #define WUSB_IE_RELEASE_CHANNEL 0x86 171 #define WUSB_IE_WORK 0x87 172 #define WUSB_IE_CHANNEL_STOP 0x88 173 #define WUSB_IE_DEV_KEEPALIVE 0x89 174 #define WUSB_IE_ISOC_DISCARD 0x8a 175 #define WUSB_IE_RESETDEVICE 0x8b 176 #define WUSB_IE_XMIT_PACKET_ADJUST 0x8c 177 178 /* Array-based IE must not include more than 4 elements */ 179 #define WUSB_IE_MAX_ELEMENT 4 180 #define WUSB_ACK_BLOCK_SIZE 18 181 #define WUSB_ACK_IE_MAX_DATA_LEN \ 182 (WUSB_ACK_BLOCK_SIZE * WUSB_IE_MAX_ELEMENT) 183 #define WUSB_DISCONN_IE_MAX_DATA_LEN (WUSB_IE_MAX_ELEMENT + 2) 184 185 typedef struct wusb_ie_header { 186 uint8_t bLength; 187 uint8_t bIEIdentifier; 188 } wusb_ie_header_t; 189 190 typedef struct wusb_connectack_block { 191 uint8_t CDID[16]; 192 uint8_t bDeviceAddress; 193 uint8_t bReserved; 194 } wusb_connectack_block_t; 195 196 typedef struct wusb_ie_connect_ack { 197 uint8_t bLength; 198 uint8_t bIEIdentifier; 199 uint8_t bAckBlock[WUSB_ACK_IE_MAX_DATA_LEN]; 200 } wusb_ie_connect_ack_t; 201 202 typedef struct wusb_ie_host_info { 203 uint8_t bLength; 204 uint8_t bIEIdentifier; 205 uint8_t bmAttributes[2]; 206 uint8_t CHID[16]; 207 } wusb_ie_host_info_t; 208 209 #define WUSB_HI_RECONN_ONLY 0x00 210 #define WUSB_HI_CONN_LMTED 0x01 211 #define WUSB_HI_CONN_ALL 0x03 212 #define WUSB_HI_P2P_DRD_CAP 0x04 213 #define WUSB_HI_STRIDX_SHIFT 3 214 #define WUSB_HI_STRIDX_MASK 0x38 215 216 typedef struct wusb_ie_chchange_announce { 217 uint8_t bLength; 218 uint8_t bIEIdentifier; 219 uint8_t bNewPHYChannelNumber; 220 uint8_t SwitchTime[3]; 221 } wusb_ie_chchange_announce_t; 222 223 /* the size must be even multiple of 2 bytes */ 224 typedef struct wusb_ie_dev_disconnect { 225 uint8_t bLength; 226 uint8_t bIEIdentifier; 227 uint8_t bDeviceAddress[WUSB_DISCONN_IE_MAX_DATA_LEN]; 228 } wusb_ie_dev_disconnect_t; 229 230 typedef wusb_ie_dev_disconnect_t wusb_ie_keepalive_t; 231 232 typedef struct wusb_ie_host_disconnect { 233 uint8_t bLength; 234 uint8_t bIEIdentifier; 235 } wusb_ie_host_disconnect_t; 236 237 typedef struct wusb_udrb { 238 uint16_t wStart; 239 uint16_t wDurationValue; 240 uint8_t bDeviceAddress; 241 uint8_t bReserved; 242 } wusb_udrb_t; 243 244 typedef struct wusb_ie_release_channel { 245 uint8_t bLength; 246 uint8_t bIEIdentifier; 247 wusb_udrb_t udrb[WUSB_IE_MAX_ELEMENT]; 248 } wusb_ie_release_channel_t; 249 250 typedef struct wusb_ie_channel_stop { 251 uint8_t bLength; 252 uint8_t bIEIdentifier; 253 uint8_t bmAttributes; 254 uint8_t StopTime[3]; 255 } wusb_ie_channel_stop_t; 256 257 typedef struct wusb_ie_isoc_discard { 258 uint8_t bLength; 259 uint8_t bIEIdentifier; 260 uint8_t bDiscardID; 261 uint8_t bDeviceAddress; 262 uint8_t bmAttributes; 263 uint8_t bFirstReceiveWindowPosition; 264 uint16_t wNumberDiscardedPackets; 265 uint16_t wNumberDiscardedSegments; 266 uint8_t bmDeviceReceiveWindow[4]; 267 } wusb_ie_isoc_discard_t; 268 269 typedef struct wusb_ie_reset_device { 270 uint8_t bLength; 271 uint8_t bIEIdentifier; 272 uint8_t CDID[4 * WUSB_IE_MAX_ELEMENT]; 273 } wusb_ie_reset_device_t; 274 275 typedef struct wusb_ie_xmit_packet_adjust { 276 uint8_t bLength; 277 uint8_t bIEIdentifier; 278 uint8_t bTransmitAdjustment; 279 uint8_t bReserved; 280 } wusb_ie_xmit_packet_adjust_t; 281 282 /* 283 * ************************************** 284 * Device notification definitions 285 * ************************************** 286 */ 287 288 /* Device notification message types */ 289 #define WUSB_DN_CONNECT 1 290 #define WUSB_DN_DISCONNECT 2 291 #define WUSB_DN_EPRDY 3 292 #define WUSB_DN_MASAVAILCHANGED 4 293 #define WUSB_DN_REMOTEWAKEUP 5 294 #define WUSB_DN_SLEEP 6 295 #define WUSB_DN_ALIVE 7 296 297 /* WUSB Errata 06.12 specifies WUSB header must not be included */ 298 typedef struct wusb_dn_header { 299 uint8_t bType; 300 } wusb_dn_header_t; 301 302 #define WUSB_DN_CONN_PKT_LEN 19 303 #define WUSB_DN_DISCONN_PKT_LEN 1 304 #define WUSB_DN_EPRDY_HDR_LEN 2 305 #define WUSB_DN_MASAVAILCHANGED_PKT_LEN 1 306 #define WUSB_DN_SLEEP_PKT_LEN 2 307 #define WUSB_DN_REMOTEWAKEUP_PKT_LEN 1 308 #define WUSB_DN_ALIVE_PKT_LEN 1 309 310 typedef struct wusb_dn_connect { 311 uint8_t bType; 312 uint8_t bmConnAttributes[2]; 313 uint8_t CDID[16]; 314 } wusb_dn_connect_t; 315 316 typedef struct wusb_dn_disconnect { 317 uint8_t bType; 318 } wusb_dn_disconnect_t; 319 320 typedef struct wusb_dn_eprdy { 321 uint8_t bType; 322 uint8_t bLength; 323 uint8_t bEPsReadyArray[1]; 324 } wusb_dn_eprdy_t; 325 326 typedef struct wusb_dn_masavail_changed { 327 uint8_t bType; 328 } wusb_dn_masavail_changed_t; 329 330 typedef struct wusb_dn_sleep { 331 uint8_t bType; 332 uint8_t bmSlpAttributes; 333 } wusb_dn_sleep_t; 334 335 typedef struct wusb_dn_remote_wakeup { 336 uint8_t bType; 337 } wusb_dn_remote_wakeup_t; 338 339 typedef struct wusb_dn_alive { 340 uint8_t bType; 341 } wusb_dn_alive_t; 342 343 #define WUSB_DN_CONN_NEW 0x01 344 #define WUSB_DN_CONN_BEACON_MASK 0x06 345 #define WUSB_DN_CONN_SELF_BEACON 0x02 346 #define WUSB_DN_CONN_DIRECTED_BEACON 0x04 347 #define WUSB_DN_CONN_NO_BEACON 0x06 348 349 #define WUSB_DN_SLP_ATTR_GTS 0 350 #define WUSB_DN_SLP_ATTR_WTS 1 351 352 /* 353 * WUSB data rate definitions. See WUSB 7.4.1.1 354 */ 355 #define WUSB_DATA_RATE_BIT_53 1 << 0 /* 53.3 Mbps */ 356 #define WUSB_DATA_RATE_BIT_80 1 << 1 /* 80 Mbps */ 357 #define WUSB_DATA_RATE_BIT_106 1 << 2 /* 106.7 Mbps */ 358 #define WUSB_DATA_RATE_BIT_160 1 << 3 /* 160 Mbps */ 359 #define WUSB_DATA_RATE_BIT_200 1 << 4 /* 200 Mbps */ 360 #define WUSB_DATA_RATE_BIT_320 1 << 5 /* 320 Mbps */ 361 #define WUSB_DATA_RATE_BIT_400 1 << 6 /* 400 Mbps */ 362 #define WUSB_DATA_RATE_BIT_480 1 << 7 /* 480 Mbps */ 363 364 /* 365 * WUSB PHY Transfer Rate. See WUSB 5.6 366 */ 367 #define WUSB_PHY_TX_RATE_53 0 /* 53.3 Mbps */ 368 #define WUSB_PHY_TX_RATE_80 1 /* 80 Mbps */ 369 #define WUSB_PHY_TX_RATE_106 2 /* 106.7 Mbps */ 370 #define WUSB_PHY_TX_RATE_160 3 /* 160 Mbps */ 371 #define WUSB_PHY_TX_RATE_200 4 /* 200 Mbps */ 372 #define WUSB_PHY_TX_RATE_320 5 /* 320 Mbps */ 373 #define WUSB_PHY_TX_RATE_400 6 /* 400 Mbps */ 374 #define WUSB_PHY_TX_RATE_480 7 /* 480 Mbps */ 375 #define WUSB_PHY_TX_RATE_RES 8 /* 8~1F, reserved */ 376 377 /* 378 * ***************************************** 379 * crypto definition 380 * ***************************************** 381 */ 382 383 typedef struct wusb_ccm_nonce { 384 uint64_t sfn; 385 uint32_t tkid; 386 uint16_t daddr; 387 uint16_t saddr; 388 } wusb_ccm_nonce_t; 389 390 #define CCM_MAC_LEN 8 /* from WUSB 6.4 */ 391 #define CCM_NONCE_LEN 13 /* from WUSB 6.4 */ 392 393 /* WUSB encryption types. see table 7-35 */ 394 #define WUSB_ENCRYP_TYPE_UNSECURE 0 395 #define WUSB_ENCRYP_TYPE_WIRED 1 396 #define WUSB_ENCRYP_TYPE_CCM_1 2 397 #define WUSB_ENCRYP_TYPE_RSA_1 3 398 399 /* association, refer to WUSB AM Spec 3.8 */ 400 enum wusb_association_attr { 401 attrAssociationTypeId = 0x0000, 402 attrAssociationSubTypeId = 0x0001, 403 attrLength = 0x0002, 404 attrAssociationStatus = 0x0004, 405 attrLangID = 0x0008, 406 attrDeviceFriendlyName = 0x000B, 407 attrHostFriendlyName = 0x000C, 408 attrCHID = 0x1000, 409 attrCDID = 0x1001, 410 attrConnectionContext = 0x1002, 411 attrBandGroups = 0x1004 412 }; 413 414 typedef uint16_t wusb_asso_attr_t; 415 416 typedef struct wusb_cbaf_info_item { 417 wusb_asso_attr_t typeID; 418 uint16_t length; 419 } wusb_cbaf_info_item_t; 420 421 #define fieldAssociationTypeId "\x00\x00\x02\x00" 422 #define fieldAssociationSubTypeId "\x01\x00\x02\x00" 423 #define fieldLength "\x02\x00\x04\x00" 424 #define fieldAssociationStatus "\x04\x00\x04\x00" 425 #define fieldLangID "\x08\x00\x02\x00" 426 #define fieldDeviceFriendlyName "\x0B\x00\x40\x00" 427 #define fieldHostFriendlyName "\x0C\x00\x40\x00" 428 #define fieldCHID "\x00\x10\x10\x00" 429 #define fieldCDID "\x01\x10\x10\x00" 430 #define fieldConnectionContext "\x02\x10\x30\x00" 431 #define fieldBandGroups "\x04\x10\x02\x00" 432 433 434 #ifdef __cplusplus 435 } 436 #endif 437 438 #endif /* _SYS_USB_WUSBA_H */ 439