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 * Copyright 2014 Garrett D'Amore <garrett@damore.org> 26 */ 27 28 #ifndef _SYS_USB_USBAI_H 29 #define _SYS_USB_USBAI_H 30 31 32 #ifdef __cplusplus 33 extern "C" { 34 #endif 35 36 /* This header file is for USBA2.0 */ 37 #define USBA_MAJOR_VER 2 38 #define USBA_MINOR_VER 0 39 40 /* 41 * USBAI: Interfaces Between USBA and Client Driver 42 * 43 * 44 * Universal USB device state management : 45 * 46 * PWRED_DWN---<3----4>--ONLINE---<2-----1>-DISCONNECTED 47 * | ^ | 48 * | 6 | 49 * | | | 50 * | 5 | 51 * | v | 52 * +----5>----------SUSPENDED----<5----7>---+ 53 * 54 * 1 = Device Unplug 55 * 2 = Original Device reconnected 56 * 3 = Device idles for time T & transitions to low power state 57 * 4 = Remote wakeup by device OR Application kicking off IO to device 58 * 5 = Notification to save state prior to DDI_SUSPEND 59 * 6 = Notification to restore state after DDI_RESUME with correct device 60 * 7 = Notification to restore state after DDI_RESUME with device 61 * disconnected or a wrong device 62 * 63 * NOTE: device states 0x80 to 0xff are device specific and can be 64 * used by client drivers 65 */ 66 #define USB_DEV_ONLINE 1 /* device is online */ 67 #define USB_DEV_DISCONNECTED 2 /* indicates disconnect */ 68 #define USB_DEV_SUSPENDED 3 /* DDI_SUSPEND operation */ 69 #define USB_DEV_PWRED_DOWN 4 /* indicates power off state */ 70 71 72 /* 73 * *************************************************************************** 74 * USBA error and status definitions 75 * *************************************************************************** 76 */ 77 78 79 /* 80 * USBA function return values 81 */ 82 #define USB_SUCCESS 0 /* call success */ 83 #define USB_FAILURE -1 /* unspecified USBA or HCD error */ 84 #define USB_NO_RESOURCES -2 /* no resources available */ 85 #define USB_NO_BANDWIDTH -3 /* no bandwidth available */ 86 #define USB_NOT_SUPPORTED -4 /* function not supported by HCD */ 87 #define USB_PIPE_ERROR -5 /* error occured on the pipe */ 88 #define USB_INVALID_PIPE -6 /* pipe handle passed is invalid */ 89 #define USB_NO_FRAME_NUMBER -7 /* frame No or ASAP not specified */ 90 #define USB_INVALID_START_FRAME -8 /* starting USB frame not valid */ 91 #define USB_HC_HARDWARE_ERROR -9 /* usb host controller error */ 92 #define USB_INVALID_REQUEST -10 /* request had invalid values */ 93 #define USB_INVALID_CONTEXT -11 /* sleep flag in interrupt context */ 94 #define USB_INVALID_VERSION -12 /* invalid version specified */ 95 #define USB_INVALID_ARGS -13 /* invalid func args specified */ 96 #define USB_INVALID_PERM -14 /* privileged operation */ 97 #define USB_BUSY -15 /* busy condition */ 98 99 100 /* 101 * USB request completion flags, more than one may be set. 102 * The following flags are returned after a recovery action by 103 * HCD or USBA (autoclearing) or callbacks from pipe_close, 104 * abort, reset, or stop polling. More than one may be set. 105 * 106 * For sync requests, the client should check the request structure 107 * for this flag to determine what has happened. 108 * 109 * All callbacks are queued to preserve order. Note that if a normal callback 110 * uses a kernel thread, order is not guaranteed since each callback may use 111 * its own thread. The next request will be submitted to the 112 * HCD after the threads exits. 113 * 114 * Exception callbacks using a kernel thread may do auto clearing and no 115 * new request will be started until this thread has completed its work. 116 */ 117 typedef enum { 118 USB_CB_NO_INFO = 0x00, /* no exception */ 119 USB_CB_STALL_CLEARED = 0x01, /* func stall cleared */ 120 USB_CB_FUNCTIONAL_STALL = 0x02, /* func stall occurred */ 121 USB_CB_PROTOCOL_STALL = 0x04, /* protocal stall occurred */ 122 USB_CB_RESET_PIPE = 0x10, /* pipe was reset */ 123 USB_CB_ASYNC_REQ_FAILED = 0x80, /* thread couldn't be started */ 124 USB_CB_NO_RESOURCES = 0x100, /* no resources */ 125 USB_CB_SUBMIT_FAILED = 0x200, /* req was queued then submitted */ 126 /* to HCD which rejected it */ 127 USB_CB_INTR_CONTEXT = 0x400 /* Callback is in interrupt context. */ 128 } usb_cb_flags_t; 129 130 131 /* 132 * completion reason 133 * 134 * Set by HCD; only one can be set. 135 */ 136 typedef enum { 137 USB_CR_OK = 0, /* no errors detected */ 138 USB_CR_CRC = 1, /* crc error detected */ 139 USB_CR_BITSTUFFING = 2, /* bit stuffing violation */ 140 USB_CR_DATA_TOGGLE_MM = 3, /* d/t PID did not match */ 141 USB_CR_STALL = 4, /* e/p returned stall PID */ 142 USB_CR_DEV_NOT_RESP = 5, /* device not responding */ 143 USB_CR_PID_CHECKFAILURE = 6, /* check bits on PID failed */ 144 USB_CR_UNEXP_PID = 7, /* receive PID was not valid */ 145 USB_CR_DATA_OVERRUN = 8, /* data size exceeded */ 146 USB_CR_DATA_UNDERRUN = 9, /* less data received */ 147 USB_CR_BUFFER_OVERRUN = 10, /* memory write can't keep up */ 148 USB_CR_BUFFER_UNDERRUN = 11, /* buffer underrun */ 149 USB_CR_TIMEOUT = 12, /* command timed out */ 150 USB_CR_NOT_ACCESSED = 13, /* Not accessed by hardware */ 151 USB_CR_NO_RESOURCES = 14, /* no resources */ 152 USB_CR_UNSPECIFIED_ERR = 15, /* unspecified usba or hcd err */ 153 USB_CR_STOPPED_POLLING = 16, /* intr/isoc IN polling stopped */ 154 USB_CR_PIPE_CLOSING = 17, /* intr/isoc IN pipe closed */ 155 USB_CR_PIPE_RESET = 18, /* intr/isoc IN pipe reset */ 156 USB_CR_NOT_SUPPORTED = 19, /* command not supported */ 157 USB_CR_FLUSHED = 20, /* this request was flushed */ 158 USB_CR_HC_HARDWARE_ERR = 21 /* usb host controller error */ 159 } usb_cr_t; 160 161 162 /* 163 * *************************************************************************** 164 * General definitions, used all over 165 * *************************************************************************** 166 * 167 * A pipe handle is returned by usb_pipe_open() on success for 168 * all pipes except the default pipe which is accessed from 169 * the registration structure. Placed here as forward referenced by 170 * usb_client_dev_data_t below. 171 * 172 * The pipe_handle is opaque to the client driver. 173 */ 174 typedef struct usb_pipe_handle *usb_pipe_handle_t; 175 176 /* 177 * General opaque pointer. 178 */ 179 typedef struct usb_opaque *usb_opaque_t; 180 181 182 /* 183 * USB flags argument to USBA interfaces 184 */ 185 typedef enum { 186 /* do not block until resources are available */ 187 USB_FLAGS_NOSLEEP = 0x0000, 188 /* block until resources are available */ 189 USB_FLAGS_SLEEP = 0x0100, 190 /* reserved */ 191 USB_FLAGS_RESERVED = 0xFE00 192 } usb_flags_t; 193 194 195 /* 196 * *************************************************************************** 197 * Descriptor definitions (from USB 2.0 specification, chapter 9) 198 * *************************************************************************** 199 */ 200 201 202 /* 203 * USB Descriptor Management 204 * 205 * Standard USB descriptors: 206 * 207 * USB devices present their configuration information in response to 208 * a GET_DESCRIPTOR request in a form which is little-endian and, 209 * for multibyte integers, unaligned. It is also position-dependent, 210 * which makes non-sequential access to particular interface or 211 * endpoint data inconvenient. 212 * A GET_DESCRIPTOR request may yield a chunk of data that contains 213 * multiple descriptor types. For example, a GET_DESCRIPTOR request 214 * for a CONFIGURATION descriptor could return the configuration 215 * descriptor followed by an interface descriptor and the relevant 216 * endpoint descriptors. 217 * 218 * usb_get_dev_data() interface provides an easy way to get all 219 * the descriptors and avoids parsing standard descriptors by each 220 * client driver 221 * 222 * usb_dev_descr: 223 * usb device descriptor, refer to USB 2.0/9.6.1, 224 */ 225 typedef struct usb_dev_descr { 226 uint8_t bLength; /* descriptor size */ 227 uint8_t bDescriptorType; /* set to DEVICE */ 228 uint16_t bcdUSB; /* USB spec rel. number in bcd */ 229 uint8_t bDeviceClass; /* class code */ 230 uint8_t bDeviceSubClass; /* sub class code */ 231 uint8_t bDeviceProtocol; /* protocol code */ 232 uint8_t bMaxPacketSize0; /* max pkt size of e/p 0 */ 233 uint16_t idVendor; /* vendor ID */ 234 uint16_t idProduct; /* product ID */ 235 uint16_t bcdDevice; /* device release number in bcd */ 236 uint8_t iManufacturer; /* manufacturing string */ 237 uint8_t iProduct; /* product string */ 238 uint8_t iSerialNumber; /* serial number string index */ 239 uint8_t bNumConfigurations; /* #configs for device */ 240 } usb_dev_descr_t; 241 242 243 /* 244 * USB Device Qualifier Descriptor 245 * 246 * The device_qualifier descriptor describes information about a High 247 * speed capable device that would change if the device were operating 248 * at other (Full) speed. Example: if the device is currently operating 249 * at Full-speed, the device_qualifier returns information about how if 250 * would operate at high-speed and vice-versa. 251 * 252 * usb_dev_qlf_descr: 253 * 254 * usb device qualifier descriptor, refer to USB 2.0/9.6.2 255 */ 256 typedef struct usb_dev_qlf_descr { 257 uint8_t bLength; /* descriptor size */ 258 uint8_t bDescriptorType; /* set to DEVICE */ 259 uint16_t bcdUSB; /* USB spec rel. number in bcd */ 260 uint8_t bDeviceClass; /* class code */ 261 uint8_t bDeviceSubClass; /* sub class code */ 262 uint8_t bDeviceProtocol; /* protocol code */ 263 uint8_t bMaxPacketSize0; /* max pkt size of e/p 0 */ 264 uint8_t bNumConfigurations; /* #configs for device */ 265 uint8_t bReserved; /* reserved field */ 266 } usb_dev_qlf_descr_t; 267 268 269 /* 270 * usb_cfg_descr: 271 * usb configuration descriptor, refer to USB 2.0/9.6.3 272 */ 273 typedef struct usb_cfg_descr { 274 uint8_t bLength; /* descriptor size */ 275 uint8_t bDescriptorType; /* set to CONFIGURATION */ 276 uint16_t wTotalLength; /* total length of data returned */ 277 uint8_t bNumInterfaces; /* # interfaces in config */ 278 uint8_t bConfigurationValue; /* arg for SetConfiguration */ 279 uint8_t iConfiguration; /* configuration string */ 280 uint8_t bmAttributes; /* config characteristics */ 281 uint8_t bMaxPower; /* max pwr consumption */ 282 } usb_cfg_descr_t; 283 284 /* 285 * Default configuration index setting for devices with multiple 286 * configurations. Note the distinction between config index and config 287 * number 288 */ 289 #define USB_DEV_DEFAULT_CONFIG_INDEX 0 290 291 /* 292 * bmAttribute values for Configuration Descriptor 293 */ 294 #define USB_CFG_ATTR_SELFPWR 0x40 295 #define USB_CFG_ATTR_REMOTE_WAKEUP 0x20 296 #define USB_CFG_ATTR_BAT_PWR 0x10 297 298 /* 299 * USB Other Speed Configuration Descriptor 300 * 301 * The other_speed_configuration descriptor describes a configuration of 302 * a High speed capable device if it were operating at its other possible 303 * (Full) speed and vice-versa. 304 * 305 * usb_other_speed_cfg_descr: 306 * usb other speed configuration descriptor, refer to USB 2.0/9.6.4 307 */ 308 typedef struct usb_other_speed_cfg_descr { 309 uint8_t bLength; /* descriptor size */ 310 uint8_t bDescriptorType; /* set to CONFIGURATION */ 311 uint16_t wTotalLength; /* total length of data returned */ 312 uint8_t bNumInterfaces; /* # interfaces in config */ 313 uint8_t bConfigurationValue; /* arg for SetConfiguration */ 314 uint8_t iConfiguration; /* configuration string */ 315 uint8_t bmAttributes; /* config characteristics */ 316 uint8_t bMaxPower; /* max pwr consumption */ 317 } usb_other_speed_cfg_descr_t; 318 319 320 /* 321 * usb_ia_descr: 322 * usb interface association descriptor, refer to USB 2.0 ECN(IAD) 323 */ 324 typedef struct usb_ia_descr { 325 uint8_t bLength; /* descriptor size */ 326 uint8_t bDescriptorType; /* INTERFACE_ASSOCIATION */ 327 uint8_t bFirstInterface; /* 1st interface number */ 328 uint8_t bInterfaceCount; /* number of interfaces */ 329 uint8_t bFunctionClass; /* class code */ 330 uint8_t bFunctionSubClass; /* sub class code */ 331 uint8_t bFunctionProtocol; /* protocol code */ 332 uint8_t iFunction; /* description string */ 333 } usb_ia_descr_t; 334 335 336 /* 337 * usb_if_descr: 338 * usb interface descriptor, refer to USB 2.0/9.6.5 339 */ 340 typedef struct usb_if_descr { 341 uint8_t bLength; /* descriptor size */ 342 uint8_t bDescriptorType; /* set to INTERFACE */ 343 uint8_t bInterfaceNumber; /* interface number */ 344 uint8_t bAlternateSetting; /* alt. interface number */ 345 uint8_t bNumEndpoints; /* # of endpoints */ 346 uint8_t bInterfaceClass; /* class code */ 347 uint8_t bInterfaceSubClass; /* sub class code */ 348 uint8_t bInterfaceProtocol; /* protocol code */ 349 uint8_t iInterface; /* description string */ 350 } usb_if_descr_t; 351 352 353 /* 354 * usb_ep_descr: 355 * usb endpoint descriptor, refer to USB 2.0/9.6.6 356 */ 357 typedef struct usb_ep_descr { 358 uint8_t bLength; /* descriptor size */ 359 uint8_t bDescriptorType; /* set to ENDPOINT */ 360 uint8_t bEndpointAddress; /* address of this e/p */ 361 uint8_t bmAttributes; /* transfer type */ 362 uint16_t wMaxPacketSize; /* maximum packet size */ 363 uint8_t bInterval; /* e/p polling interval */ 364 } usb_ep_descr_t; 365 366 /* 367 * bEndpointAddress masks 368 */ 369 #define USB_EP_NUM_MASK 0x0F /* endpoint number mask */ 370 #define USB_EP_DIR_MASK 0x80 /* direction mask */ 371 #define USB_EP_DIR_OUT 0x00 /* OUT endpoint */ 372 #define USB_EP_DIR_IN 0x80 /* IN endpoint */ 373 374 /* 375 * bmAttribute transfer types for endpoints 376 */ 377 #define USB_EP_ATTR_MASK 0x03 /* transfer type mask */ 378 #define USB_EP_ATTR_CONTROL 0x00 /* control transfer */ 379 #define USB_EP_ATTR_ISOCH 0x01 /* isochronous transfer */ 380 #define USB_EP_ATTR_BULK 0x02 /* bulk transfer */ 381 #define USB_EP_ATTR_INTR 0x03 /* interrupt transfer */ 382 383 /* 384 * bmAttribute synchronization types for endpoints (isochronous only) 385 */ 386 #define USB_EP_SYNC_MASK 0x0C /* synchronization mask */ 387 #define USB_EP_SYNC_NONE 0x00 /* no synchronization */ 388 #define USB_EP_SYNC_ASYNC 0x04 /* asynchronous */ 389 #define USB_EP_SYNC_ADPT 0x08 /* adaptive */ 390 #define USB_EP_SYNC_SYNC 0x0C /* synchronous */ 391 392 /* 393 * bmAttribute synchronization feedback types for endpoints (isochronous only) 394 */ 395 #define USB_EP_USAGE_MASK 0x30 /* sync feedback mask */ 396 #define USB_EP_USAGE_DATA 0x00 /* data endpoint */ 397 #define USB_EP_USAGE_FEED 0x10 /* feedback endpoint */ 398 #define USB_EP_USAGE_IMPL 0x20 /* implicit feedback endpoint */ 399 400 /* 401 * wMaxPacketSize values for endpoints (isoch and interrupt, high speed only) 402 */ 403 #define USB_EP_MAX_PKTSZ_MASK 0x03FF /* Mask for packetsize bits */ 404 #define USB_EP_MAX_XACTS_MASK 0x0C00 /* Max Transactns/microframe */ 405 #define USB_EP_MAX_XACTS_SHIFT 10 /* Above is 10 bits from end */ 406 407 /* 408 * Ranges for endpoint parameter values. 409 */ 410 411 /* Min and Max NAK rates for high sped control endpoints. */ 412 #define USB_EP_MIN_HIGH_CONTROL_INTRVL 0 413 #define USB_EP_MAX_HIGH_CONTROL_INTRVL 255 414 415 /* Min and Max NAK rates for high speed bulk endpoints. */ 416 #define USB_EP_MIN_HIGH_BULK_INTRVL 0 417 #define USB_EP_MAX_HIGH_BULK_INTRVL 255 418 419 /* Min and Max polling intervals for low, full speed interrupt endpoints. */ 420 #define USB_EP_MIN_LOW_INTR_INTRVL 1 421 #define USB_EP_MAX_LOW_INTR_INTRVL 255 422 #define USB_EP_MIN_FULL_INTR_INTRVL 1 423 #define USB_EP_MAX_FULL_INTR_INTRVL 255 424 425 /* 426 * Min and Max polling intervals for high speed interrupt endpoints, and for 427 * isochronous endpoints. 428 * Note that the interval is 2**(value-1). See Section 9.6.6 of USB 2.0 spec. 429 */ 430 #define USB_EP_MIN_HIGH_INTR_INTRVL 1 431 #define USB_EP_MAX_HIGH_INTR_INTRVL 16 432 #define USB_EP_MIN_FULL_ISOCH_INTRVL 1 433 #define USB_EP_MAX_FULL_ISOCH_INTRVL 16 434 #define USB_EP_MIN_HIGH_ISOCH_INTRVL 1 435 #define USB_EP_MAX_HIGH_ISOCH_INTRVL 16 436 437 /* 438 * usb_string_descr: 439 * usb string descriptor, refer to USB 2.0/9.6.7 440 */ 441 typedef struct usb_string_descr { 442 uint8_t bLength; /* descr size */ 443 uint8_t bDescriptorType; /* set to STRING */ 444 uint8_t bString[1]; /* variable length unicode */ 445 /* encoded string */ 446 } usb_string_descr_t; 447 448 #define USB_MAXSTRINGLEN 255 /* max string descr length */ 449 450 /* 451 * *************************************************************************** 452 * Client driver registration with USBA 453 * *************************************************************************** 454 * 455 * The client registers with USBA during attach in two steps 456 * using usb_client_attach() and usb_get_dev_data(). On completion, the 457 * registration data has been initialized. Most data items are 458 * straightforward. Among the items returned in the data is the tree of 459 * parsed descriptors, in dev_cfg; the number of configurations parsed, 460 * in dev_n_cfg; a pointer to the current configuration in the tree, 461 * in dev_curr_cfg; the index of the first valid interface in the 462 * tree, in dev_curr_if, and a parse level that accurately reflects what 463 * is in the tree, in dev_parse_level. 464 */ 465 466 467 /* 468 * *************************************************************************** 469 * Data structures used in the configuration tree 470 * *************************************************************************** 471 */ 472 473 /* 474 * Tree data structure for each configuration in the tree 475 */ 476 typedef struct usb_cfg_data { 477 struct usb_cfg_descr cfg_descr; /* parsed config descr */ 478 struct usb_if_data *cfg_if; /* interfaces for this cfg */ 479 /* indexed by interface num */ 480 struct usb_cvs_data *cfg_cvs; /* class/vendor specific */ 481 /* descrs mod/extend cfg */ 482 char *cfg_str; /* string descriptor */ 483 uint_t cfg_n_if; /* #elements in cfg_if[] */ 484 uint_t cfg_n_cvs; /* #elements in cfg_cvs[] */ 485 uint_t cfg_strsize; /* size of string descr */ 486 } usb_cfg_data_t; 487 488 489 /* 490 * Tree data structure for each alternate interface set 491 * in each represented configuration 492 */ 493 typedef struct usb_if_data { 494 struct usb_alt_if_data *if_alt; /* sparse array of alts */ 495 /* indexed by alt setting */ 496 uint_t if_n_alt; /* #elements in if_alt[] */ 497 } usb_if_data_t; 498 499 500 /* 501 * Tree data structure for each alternate of each alternate interface set 502 */ 503 typedef struct usb_alt_if_data { 504 usb_if_descr_t altif_descr; /* parsed alternate if descr */ 505 struct usb_ep_data *altif_ep; /* endpts for alt if */ 506 /* (not a sparse array */ 507 struct usb_cvs_data *altif_cvs; /* cvs for this alt if */ 508 char *altif_str; /* string descriptor */ 509 uint_t altif_n_ep; /* #elements in altif_ep[] */ 510 uint_t altif_n_cvs; /* #elements in altif_cvs[] */ 511 uint_t altif_strsize; /* size of string descr */ 512 } usb_alt_if_data_t; 513 514 515 /* 516 * Tree data structure for each endpoint of each alternate 517 */ 518 typedef struct usb_ep_data { 519 usb_ep_descr_t ep_descr; /* endpoint descriptor */ 520 struct usb_cvs_data *ep_cvs; /* cv mod/extending this ep */ 521 uint_t ep_n_cvs; /* #elements in ep_cvs[] */ 522 } usb_ep_data_t; 523 524 525 /* 526 * Tree data structure for each class/vendor specific descriptor 527 */ 528 typedef struct usb_cvs_data { 529 uchar_t *cvs_buf; /* raw data of cvs descr */ 530 uint_t cvs_buf_len; /* cvs_buf size */ 531 } usb_cvs_data_t; 532 533 534 /* 535 * Parse_level determines the extent to which the tree is built, the amount 536 * of parsing usb_client_attach() is to do. It has the following values: 537 * 538 * USB_PARSE_LVL_NONE - Build no tree. dev_n_cfg will return 0, dev_cfg 539 * will return NULL, the dev_curr_xxx fields will be 540 * invalid. 541 * USB_PARSE_LVL_IF - Parse configured interface only, if configuration# 542 * and interface properties are set (as when different 543 * interfaces are viewed by the OS as different device 544 * instances). If an OS device instance is set up to 545 * represent an entire physical device, this works 546 * like USB_PARSE_LVL_ALL. 547 * USB_PARSE_LVL_CFG - Parse entire configuration of configured interface 548 * only. This is like USB_PARSE_LVL_IF except entire 549 * configuration is returned. 550 * USB_PARSE_LVL_ALL - Parse entire device (all configurations), even 551 * when driver is bound to a single interface of a 552 * single configuration. 553 */ 554 typedef enum { 555 USB_PARSE_LVL_NONE = 0, 556 USB_PARSE_LVL_IF = 1, 557 USB_PARSE_LVL_CFG = 2, 558 USB_PARSE_LVL_ALL = 3 559 } usb_reg_parse_lvl_t; 560 561 562 /* 563 * Registration data returned by usb_get_dev_data(). Configuration tree roots 564 * are returned in dev_cfg array. 565 */ 566 typedef struct usb_client_dev_data { 567 usb_pipe_handle_t dev_default_ph; /* default pipe handle */ 568 ddi_iblock_cookie_t dev_iblock_cookie; /* for mutex_init's */ 569 struct usb_dev_descr *dev_descr; /* cooked device descriptor */ 570 char *dev_mfg; /* manufacturing ID */ 571 char *dev_product; /* product ID */ 572 char *dev_serial; /* serial number */ 573 usb_reg_parse_lvl_t dev_parse_level; /* USB_PARSE_LVL_* flag */ 574 struct usb_cfg_data *dev_cfg; /* configs for this device */ 575 /* indexed by config index */ 576 uint_t dev_n_cfg; /* #elements in dev_cfg[] */ 577 struct usb_cfg_data *dev_curr_cfg; /* current cfg */ 578 int dev_curr_if; /* current interface number */ 579 } usb_client_dev_data_t; 580 581 582 /* 583 * *************************************************************************** 584 * Device configuration descriptor tree functions 585 * *************************************************************************** 586 */ 587 588 /* 589 * usb_get_dev_data: 590 * returns initialized registration data. Most data items are clear. 591 * Among the items returned is the tree ofparsed descriptors in dev_cfg; 592 * and the number of configurations parsed in dev_n_cfg. 593 * 594 * Arguments: 595 * dip - pointer to devinfo node of the client 596 * dev_data - return registration data at this address 597 * parse_level - See above 598 * flags - None used 599 * 600 * Return Values: 601 * USB_SUCCESS - usb_register_client succeeded 602 * USB_INVALID_ARGS - received null dip or reg argument 603 * USB_INVALID_CONTEXT - called with sleep from callback context 604 * USB_FAILURE - bad descriptor info or other internal failure 605 * 606 * Notes: 607 * 1) The non-standard USB descriptors are returned in RAW format. 608 * 609 * 2) The registration data is unshared. Each client receives its own copy. 610 * (The default control pipe may be shared, even though its tree 611 * description will be unique per device.) 612 * 613 */ 614 int usb_get_dev_data( 615 dev_info_t *dip, 616 usb_client_dev_data_t **dev_data, 617 usb_reg_parse_lvl_t parse_level, 618 usb_flags_t flags); 619 620 /* 621 * usb_free_dev_data: 622 * undoes what usb_get_dev_data() set up. It releases 623 * memory for all strings, descriptors, and trees set up by usb_get_dev_data(). 624 * 625 * Arguments: 626 * dip - pointer to devinfo node of the client 627 * dev_data - pointer to registration data containing the tree. 628 */ 629 void usb_free_dev_data( 630 dev_info_t *dip, 631 usb_client_dev_data_t *dev_data); 632 633 /* 634 * usb_free_descr_tree: 635 * Take down the configuration tree while leaving the rest of the 636 * registration intact. This can be used, for example, after attach has 637 * copied any descriptors it needs from the tree, but the rest of the 638 * registration data needs to remain intact. 639 * 640 * The following usb_client_dev_data_t fields will be modified: 641 * dev_cfg will be NULL 642 * dev_n_cfg will be 0 643 * dev_curr_cfg_ndx and dev_curr_if will be invalid 644 * dev_parse_level will be USB_REG_DESCR_NONE 645 * 646 * Arguments: 647 * dip - pointer to devinfo node of the client 648 * dev_data - pointer to registration data containing the tree. 649 */ 650 void usb_free_descr_tree( 651 dev_info_t *dip, 652 usb_client_dev_data_t *dev_data); 653 654 655 /* 656 * usb_print_descr_tree: 657 * Dump to the screen a descriptor tree as returned by 658 * usbai_register_client. 659 * 660 * Arguments: 661 * dip - pointer to devinfo of the client 662 * dev_data - pointer to registration area containing the tree 663 * 664 * Returns: 665 * USB_SUCCESS - tree successfully dumped 666 * USB_INVALID_CONTEXT - called from callback context 667 * USB_INVALID_ARGS - bad arguments given 668 */ 669 int usb_print_descr_tree( 670 dev_info_t *dip, 671 usb_client_dev_data_t *dev_data); 672 673 674 /* 675 * *************************************************************************** 676 * Registration and versioning 677 * *************************************************************************** 678 */ 679 680 681 /* 682 * USBA client drivers are required to define USBDRV_MAJOR_VER 683 * USBDRV_MINOR_VER and pass USBDRV_VERSION as the version 684 * number to usb_client_attach 685 */ 686 #if !defined(USBA_MAJOR_VER) || !defined(USBA_MINOR_VER) 687 #error incorrect USBA header 688 #endif 689 690 /* 691 * Driver major version must be the same as USBA major version, and 692 * driver minor version must be <= USBA minor version 693 */ 694 #if !defined(USBA_FRAMEWORK) 695 #if defined(USBDRV_MAJOR_VER) && defined(USBDRV_MINOR_VER) 696 697 #if (USBDRV_MAJOR_VER != USBA_MAJOR_VER) 698 #error USBA and driver major versions do not match 699 #endif 700 #if (USBDRV_MINOR_VER > USBA_MINOR_VER) 701 #error USBA and driver minor versions do not match 702 #endif 703 704 #endif 705 #endif 706 707 #define USBA_MAKE_VER(major, minor) ((major) << 8 | (minor)) 708 #define USBA_GET_MAJOR(ver) ((ver) >> 8) 709 #define USBA_GET_MINOR(ver) ((ver) & 0xff) 710 711 #define USBDRV_VERSION USBA_MAKE_VER(USBDRV_MAJOR_VER, USBDRV_MINOR_VER) 712 713 714 /* 715 * usb_client_attach: 716 * 717 * Arguments: 718 * dip - pointer to devinfo node of the client 719 * version - USBA registration version number 720 * flags - None used 721 * 722 * Return Values: 723 * USB_SUCCESS - attach succeeded 724 * USB_INVALID_ARGS - received null dip or reg argument 725 * USB_INVALID_CONTEXT - called with sleep from callback context 726 * or not at attach time 727 * USB_INVALID_VERSION - version argument is incorrect. 728 * USB_FAILURE - other internal failure 729 */ 730 int usb_client_attach( 731 dev_info_t *dip, 732 uint_t version, 733 usb_flags_t flags); 734 735 /* 736 * usb_client_detach: 737 * 738 * Arguments: 739 * dip - pointer to devinfo node of the client 740 * dev_data - pointer to data to free. may be NULL 741 */ 742 void usb_client_detach( 743 dev_info_t *dip, 744 struct usb_client_dev_data *dev_data); 745 746 /* 747 * *************************************************************************** 748 * Functions for parsing / retrieving data from the descriptor tree 749 * *************************************************************************** 750 */ 751 752 /* 753 * Function for unpacking any kind of little endian data, usually desriptors 754 * 755 * Arguments: 756 * format - string indicating the format in c, s, w, eg. "2c4ws" 757 * which describes 2 bytes, 4 int, one short. 758 * The number prefix parses the number of items of 759 * the following type. 760 * data - pointer to the LE data buffer 761 * datalen - length of the data 762 * structure - pointer to return structure where the unpacked data 763 * will be written 764 * structlen - length of the return structure 765 * 766 * return value: 767 * total number of bytes of the original data that was unpacked 768 * or USB_PARSE_ERROR 769 */ 770 #define USB_PARSE_ERROR 0 771 772 size_t usb_parse_data( 773 char *format, 774 uchar_t *data, 775 size_t datalen, 776 void *structure, 777 size_t structlen); 778 779 /* 780 * usb_lookup_ep_data: 781 * Function to get specific endpoint data 782 * This function will not access the device. 783 * 784 * Arguments: 785 * dip - pointer to dev info 786 * dev_datap - pointer to registration data 787 * interface - requested interface 788 * alternate - requested alternate 789 * skip - number of endpoints which match the requested type and 790 * direction to skip before finding one to retrieve 791 * type - endpoint type 792 * direction - endpoint direction: USB_EP_DIR_IN/OUT or none 793 * 794 * Return Values: 795 * NULL or an endpoint data pointer 796 */ 797 usb_ep_data_t *usb_lookup_ep_data( 798 dev_info_t *dip, 799 usb_client_dev_data_t *dev_datap, 800 uint_t interface, 801 uint_t alternate, 802 uint_t skip, 803 uint_t type, 804 uint_t direction); 805 806 807 /* Language ID for string descriptors. */ 808 #define USB_LANG_ID 0x0409 /* English, US */ 809 810 /* 811 * usb_get_string_descr: 812 * Reads the string descriptor. This function access the device and 813 * blocks. 814 * 815 * Arguments: 816 * dip - pointer to devinfo of the client. 817 * langid - LANGID to read different LOCALEs. 818 * index - index to the string. 819 * buf - user provided buffer for string descriptor. 820 * buflen - user provided length of the buffer. 821 * 822 * Return Values: 823 * USB_SUCCESS - descriptor is valid. 824 * USB_FAILURE - full descriptor could not be retrieved. 825 */ 826 int usb_get_string_descr( 827 dev_info_t *dip, 828 uint16_t langid, 829 uint8_t index, 830 char *buf, 831 size_t buflen); 832 833 834 /* 835 * *************************************************************************** 836 * Addressing utility functions 837 * *************************************************************************** 838 */ 839 840 /* 841 * usb_get_addr returns the current usb address, mostly for debugging 842 * purposes. The address may change after hotremove/insert. 843 * This address will not change on a disconnect/reconnect of open device. 844 */ 845 int usb_get_addr(dev_info_t *dip); 846 847 848 /* 849 * usb_get_if_number returns USB_COMBINED_NODE or USB_DEVICE_NODE 850 * if the driver is responsible for the entire device. 851 * Otherwise it returns the interface number. 852 */ 853 #define USB_COMBINED_NODE -1 854 #define USB_DEVICE_NODE -2 855 856 int usb_get_if_number( 857 dev_info_t *dip); 858 859 boolean_t usb_owns_device( 860 dev_info_t *dip); 861 862 863 /* 864 * *************************************************************************** 865 * Pipe Management definitions and functions 866 * *************************************************************************** 867 */ 868 869 870 /* 871 * 872 * usb_pipe_state: 873 * 874 * PIPE_STATE_IDLE: 875 * The pipe's policy is set, but the pipe currently isn't transferring 876 * data. 877 * 878 * PIPE_STATE_ACTIVE: 879 * The pipe's policy has been set, and the pipe is able to transmit data. 880 * When a control or bulk pipe is opened, the pipe's state is 881 * automatically set to PIPE_STATE_ACTIVE. For an interrupt or 882 * isochronous pipe, the pipe state becomes PIPE_STATE_ACTIVE once 883 * the polling on the pipe has been initiated. 884 * 885 * PIPE_STATE_ERROR: 886 * The device has generated a error on the pipe. The client driver 887 * must call usb_pipe_reset() to clear any leftover state that's associated 888 * with the pipe, clear the data toggle, and reset the state of the pipe. 889 * 890 * Calling usb_pipe_reset() on a control or bulk pipe resets the state to 891 * PIPE_STATE_ACTIVE. Calling usb_pipe_reset() on an interrupt or 892 * isochronous pipe, resets the state to PIPE_STATE_IDLE. 893 * 894 * State Diagram for Bulk/Control 895 * 896 * +-<--normal completion------------------<-------^ 897 * | | 898 * V | 899 * usb_pipe_open-->[PIPE_STATE_IDLE]-usb_pipe_*_xfer->[PIPE_STATE_ACTIVE] 900 * ^ | 901 * | v 902 * - usb_pipe_reset<-[PIPE_STATE_ERROR]<-device error 903 * 904 * State Diagram for Interrupt/Isochronous IN 905 * 906 * +-<--usb_pipe_stop_isoc/intr_polling----<-------^ 907 * | | 908 * V | 909 * usb_pipe_open-->[PIPE_STATE_IDLE]-usb_pipe_*_xfer->[PIPE_STATE_ACTIVE] 910 * ^ | 911 * | v 912 * + usb_pipe_reset<-[PIPE_STATE_ERROR]<-device error 913 * 914 * State Diagram for Interrupt/Isochronous OUT 915 * 916 * +-<--normal completion------------------<-------^ 917 * | | 918 * V | 919 * usb_pipe_open-->[PIPE_STATE_IDLE]-usb_pipe_*_xfer->[PIPE_STATE_ACTIVE] 920 * ^ | 921 * | v 922 * + usb_pipe_reset<-[PIPE_STATE_ERROR]<-device error 923 * 924 * 925 * The following table indicates which operations are allowed with each 926 * pipe state: 927 * 928 * -------------------------------------------------------------------------+ 929 * ctrl/bulk | idle | active | error | sync closing | async closing| 930 * -------------------------------------------------------------------------+ 931 * pipe xfer | OK |queue (USBA)| reject | reject | reject | 932 * pipe reset | no-op | OK | OK | reject | reject | 933 * pipe close | OK | wait&close | OK | no-op | no-op | 934 * -------------------------------------------------------------------------+ 935 * 936 * -------------------------------------------------------------------------+ 937 * intr/isoc IN | idle | active | error | sync closing | async closing| 938 * -------------------------------------------------------------------------+ 939 * pipe xfer | OK | reject | reject | reject | reject | 940 * pipe stoppoll| no-op | OK | no-op | reject | reject | 941 * pipe reset | no-op | OK | OK | reject | reject | 942 * pipe close | OK | wait&close | OK | no-op | no-op | 943 * -------------------------------------------------------------------------+ 944 * 945 * -------------------------------------------------------------------------+ 946 * intr/isoc OUT| idle | active | error | sync closing | async closing| 947 * -------------------------------------------------------------------------+ 948 * pipe xfer | OK |queue (HCD) | reject | reject | reject | 949 * pipe stoppoll| reject| reject | reject | reject | reject | 950 * pipe reset | no-op | OK | OK | reject | reject | 951 * pipe close | OK | wait&close | OK | no-op | no-op | 952 * -------------------------------------------------------------------------+ 953 */ 954 typedef enum { 955 USB_PIPE_STATE_CLOSED = 0, 956 USB_PIPE_STATE_IDLE = 1, 957 USB_PIPE_STATE_ACTIVE = 2, 958 USB_PIPE_STATE_ERROR = 3, 959 USB_PIPE_STATE_CLOSING = 4 960 } usb_pipe_state_t; 961 962 963 /* 964 * pipe state control: 965 * 966 * return values: 967 * USB_SUCCESS - success 968 * USB_FAILURE - unspecified failure 969 */ 970 int usb_pipe_get_state( 971 usb_pipe_handle_t pipe_handle, 972 usb_pipe_state_t *pipe_state, 973 usb_flags_t flags); 974 975 976 /* 977 * usb_pipe_policy 978 * 979 * Pipe policy specifies how a pipe to an endpoint should be used 980 * by the client driver and the HCD. 981 */ 982 typedef struct usb_pipe_policy { 983 /* 984 * This is a hint indicating how many asynchronous operations 985 * requiring a kernel thread will be concurrently active. 986 * Allow at least one for synch exception callback handling 987 * and another for asynchronous closing of pipes. 988 */ 989 uchar_t pp_max_async_reqs; 990 } usb_pipe_policy_t; 991 992 993 /* 994 * usb_pipe_open(): 995 * 996 * Before using any pipe including the default pipe, it must be opened. 997 * On success, a pipe handle is returned for use in other usb_pipe_*() 998 * functions. 999 * 1000 * The default pipe can only be opened by the hub driver. 1001 * 1002 * For isochronous and interrupt pipes, bandwidth has been allocated and 1003 * guaranteed. 1004 * 1005 * Only the default pipe can be shared. All other control pipes are 1006 * excusively opened by default. A pipe policy and endpoint descriptor 1007 * must always be provided except for default pipe. 1008 * 1009 * Arguments: 1010 * dip - devinfo ptr. 1011 * ep - endpoint descriptor pointer. 1012 * pipe_policy - pointer to pipe policy which provides hints on how 1013 * the pipe will be used. 1014 * flags - USB_FLAGS_SLEEP wait for resources to become 1015 * available. 1016 * pipe_handle - a pipe handle pointer. on a successful open, 1017 * a pipe_handle is returned in this pointer. 1018 * 1019 * Return values: 1020 * USB_SUCCESS - open succeeded. 1021 * USB_FAILURE - unspecified open failure or pipe is already open. 1022 * USB_NO_RESOURCES - no resources were available to complete the open. 1023 * USB_NO_BANDWIDTH - no bandwidth available (isoc/intr pipes). 1024 * USB_* - refer to list of all possible return values in 1025 * this file 1026 */ 1027 int usb_pipe_open( 1028 dev_info_t *dip, 1029 usb_ep_descr_t *ep, 1030 usb_pipe_policy_t *pipe_policy, 1031 usb_flags_t flags, 1032 usb_pipe_handle_t *pipe_handle); 1033 1034 1035 /* 1036 * usb_pipe_close(): 1037 * 1038 * Closes the pipe, releases resources and frees the pipe_handle. 1039 * Automatic polling, if active, will be terminated. 1040 * 1041 * Arguments: 1042 * dip - devinfo ptr. 1043 * pipe_handle - pipe handle. 1044 * flags - USB_FLAGS_SLEEP: 1045 * wait for resources, pipe 1046 * to become free, and all callbacks completed. 1047 * cb - If USB_FLAGS_SLEEP has not been specified, a 1048 * callback will be performed. 1049 * cb_arg - the 2nd argument of the callback. Note that the 1050 * pipehandle will be zeroed and therefore not passed. 1051 * 1052 * Notes: 1053 * 1054 * Pipe close always succeeds regardless whether USB_FLAGS_SLEEP has been 1055 * specified or not. An async close will always succeed if the hint in the 1056 * pipe policy has been correct about the max number of async requests 1057 * required. 1058 * In the unlikely event that no async requests can be queued, this 1059 * function will continue retrying before returning 1060 * 1061 * USBA prevents the client from submitting subsequent requests to a pipe 1062 * that is being closed. 1063 * Additional usb_pipe_close() requests on the same pipe causes USBA to 1064 * wait for the previous close(s) to complete. 1065 * 1066 * The pipe will not be destroyed until all activity on the pipe has 1067 * been drained, including outstanding request callbacks, async requests, 1068 * and other usb_pipe_*() calls. 1069 * 1070 * Calling usb_pipe_close() from a deferred callback (in kernel context) 1071 * with USB_FLAGS_SLEEP set, will cause deadlock 1072 */ 1073 void usb_pipe_close( 1074 dev_info_t *dip, 1075 usb_pipe_handle_t pipe_handle, 1076 usb_flags_t flags, 1077 void (*cb)( 1078 usb_pipe_handle_t ph, 1079 usb_opaque_t arg, /* cb arg */ 1080 int rval, 1081 usb_cb_flags_t flags), 1082 usb_opaque_t cb_arg); 1083 1084 1085 /* 1086 * usb_pipe_drain_reqs 1087 * this function blocks until there are no more requests 1088 * owned by this dip on the pipe 1089 * 1090 * Arguments: 1091 * dip - devinfo pointer 1092 * pipe_handle - opaque pipe handle 1093 * timeout - timeout in seconds 1094 * flags - USB_FLAGS_SLEEP: 1095 * wait for completion. 1096 * cb - if USB_FLAGS_SLEEP has not been specified 1097 * this callback function will be called on 1098 * completion. This callback may be NULL 1099 * and no notification of completion will then 1100 * be provided. 1101 * cb_arg - 2nd argument to callback function. 1102 * 1103 * callback and callback_arg should be NULL if USB_FLAGS_SLEEP has 1104 * been specified 1105 * 1106 * Returns: 1107 * USB_SUCCESS - pipe successfully reset or request queued 1108 * USB_FAILURE - timeout 1109 * USB_INVALID_PIPE - pipe is invalid or already closed 1110 * USB_INVALID_CONTEXT - called from interrupt context 1111 * USB_INVALID_ARGS - invalid arguments 1112 * USB_* - refer to return values defines in this file 1113 */ 1114 int usb_pipe_drain_reqs( 1115 dev_info_t *dip, 1116 usb_pipe_handle_t pipe_handle, 1117 uint_t time, 1118 usb_flags_t flags, 1119 void (*cb)( 1120 usb_pipe_handle_t ph, 1121 usb_opaque_t arg, /* cb arg */ 1122 int rval, 1123 usb_cb_flags_t flags), 1124 usb_opaque_t cb_arg); 1125 1126 1127 /* 1128 * Resetting a pipe: Refer to USB 2.0/10.5.2.2 1129 * The pipe's requests are retired and the pipe is cleared. The host state 1130 * is moved to active. If the reflected endpoint state needs to be changed, 1131 * that must be explicitly requested by the client driver. The reset 1132 * completes after all request callbacks have been completed. 1133 * 1134 * Arguments: 1135 * dip - devinfo pointer. 1136 * pipe_handle - pipe handle. 1137 * flags - USB_FLAGS_SLEEP: 1138 * wait for completion. 1139 * cb - if USB_FLAGS_SLEEP has not been specified 1140 * this callback function will be called on 1141 * completion. This callback may be NULL 1142 * and no notification of completion will then 1143 * be provided. 1144 * cb_arg - 2nd argument to callback function. 1145 * 1146 * callback and callback_arg should be NULL if USB_FLAGS_SLEEP has 1147 * been specified 1148 * 1149 * Note: Completion notification may be *before* all async request threads 1150 * have completed but *after* all immediate callbacks have completed. 1151 */ 1152 void usb_pipe_reset( 1153 dev_info_t *dip, 1154 usb_pipe_handle_t pipe_handle, 1155 usb_flags_t usb_flags, 1156 void (*cb)( 1157 usb_pipe_handle_t ph, 1158 usb_opaque_t arg, 1159 int rval, 1160 usb_cb_flags_t flags), 1161 usb_opaque_t cb_arg); 1162 1163 1164 /* 1165 * The client driver can store a private data pointer in the 1166 * pipe_handle. 1167 * 1168 * return values: 1169 * USB_SUCCESS - success 1170 * USB_FAILURE - unspecified failure 1171 */ 1172 int usb_pipe_set_private( 1173 usb_pipe_handle_t pipe_handle, 1174 usb_opaque_t data); 1175 1176 1177 usb_opaque_t usb_pipe_get_private( 1178 usb_pipe_handle_t pipe_handle); 1179 1180 1181 /* 1182 * *************************************************************************** 1183 * Transfer request definitions and functions 1184 * *************************************************************************** 1185 */ 1186 1187 1188 /* 1189 * USB xfer request attributes. 1190 * Set by the client driver, more than one may be set 1191 * 1192 * SHORT_XFER_OK if less data is transferred than specified, no error is 1193 * returned. 1194 * AUTOCLEARING if there is an exception, the pipe will be reset first 1195 * and a functional stall cleared before a callback is done. 1196 * PIPE_RESET if there is an exception, the pipe will be reset only 1197 * ONE_XFER polling will automatically stop on the first callback. 1198 * ISOC_START_FRAME use startframe specified. 1199 * USB_ATTRS_ISOC_XFER_ASAP let the host controller decide on the first 1200 * available frame. 1201 * 1202 * USB_ATTRS_ISOC_START_FRAME and USB_ATTRS_ISOC_XFER_ASAP are mutually 1203 * exclusive 1204 * 1205 * combinations of flag and attributes: 1206 * 1207 * usb_flags usb_req_attrs semantics 1208 * --------------------------------------------------------- 1209 * SLEEP USB_ATTRS_SHORT_XFER_OK legal for IN pipes 1210 * SLEEP USB_ATTRS_AUTOCLEARING legal 1211 * SLEEP USB_ATTRS_PIPE_RESET legal 1212 * SLEEP USB_ATTRS_ONE_XFER legal for interrupt IN pipes 1213 * SLEEP USB_ATTRS_ISOC_START_FRAME illegal 1214 * SLEEP USB_ATTRS_ISOC_XFER_ASAP illegal 1215 * 1216 * noSLEEP USB_ATTRS_SHORT_XFER_OK legal for all IN pipes 1217 * noSLEEP USB_ATTRS_AUTOCLEARING legal 1218 * noSLEEP USB_ATTRS_PIPE_RESET legal 1219 * noSLEEP USB_ATTRS_ONE_XFER legal 1220 * noSLEEP USB_ATTRS_ISOC_START_FRAME legal 1221 * noSLEEP USB_ATTRS_ISOC_XFER_ASAP legal 1222 */ 1223 typedef enum { 1224 USB_ATTRS_NONE = 0, 1225 1226 /* only ctrl/bulk/intr IN pipes */ 1227 USB_ATTRS_SHORT_XFER_OK = 0x01, /* short data xfer is ok */ 1228 USB_ATTRS_PIPE_RESET = 0x02, /* reset pipe only on exc */ 1229 USB_ATTRS_AUTOCLEARING = 0x12, /* autoclear STALLs */ 1230 1231 /* intr pipes only: one poll with data */ 1232 USB_ATTRS_ONE_XFER = 0x100, 1233 1234 /* only for isoch pipe */ 1235 USB_ATTRS_ISOC_START_FRAME = 0x200, /* Starting frame# specified */ 1236 USB_ATTRS_ISOC_XFER_ASAP = 0x400 /* HCD decides START_FRAME# */ 1237 } usb_req_attrs_t; 1238 1239 1240 /* 1241 * Note: client drivers are required to provide data buffers (mblks) for most 1242 * requests 1243 * IN OUT 1244 * ctlr request if wLength > 0 if wLength > 0 1245 * bulk request yes yes 1246 * intr request no yes 1247 * isoc request no yes 1248 */ 1249 1250 /* 1251 * =========================================================================== 1252 * USB control request management 1253 * =========================================================================== 1254 */ 1255 1256 /* 1257 * A client driver allocates and uses the usb_ctrl_req_t for all control 1258 * pipe requests. 1259 * 1260 * Direction of the xfer will be determined based on the bmRequestType. 1261 * 1262 * NULL callbacks are permitted, timeout = 0 indicates infinite timeout. 1263 * All timeouts are in seconds. 1264 * 1265 * All fields are initialized by client except for data on IN request 1266 * in which case the client is responsible for deallocating. 1267 * 1268 * Control requests may be reused. The client driver is responsible 1269 * for reinitializing some fields, eg data read/write pointers. 1270 * 1271 * Control requests can be queued. 1272 */ 1273 typedef struct usb_ctrl_req { 1274 uint8_t ctrl_bmRequestType; /* characteristics of request */ 1275 uint8_t ctrl_bRequest; /* specific request */ 1276 uint16_t ctrl_wValue; /* varies according to request */ 1277 uint16_t ctrl_wIndex; /* index or offset */ 1278 uint16_t ctrl_wLength; /* number of bytes to xfer */ 1279 1280 mblk_t *ctrl_data; /* the data for the data phase */ 1281 /* IN: allocated by HCD */ 1282 /* OUT: allocated by client */ 1283 uint_t ctrl_timeout; /* how long before HCD retires req */ 1284 usb_opaque_t ctrl_client_private; /* for client private info */ 1285 usb_req_attrs_t ctrl_attributes; /* attributes for this req */ 1286 1287 /* 1288 * callback function for control pipe requests 1289 * 1290 * a normal callback will be done upon: 1291 * - successful completion of a control pipe request 1292 * 1293 * callback arguments are: 1294 * - the pipe_handle 1295 * - usb_ctrl_req_t pointer 1296 */ 1297 void (*ctrl_cb)(usb_pipe_handle_t ph, 1298 struct usb_ctrl_req *req); 1299 1300 /* 1301 * exception callback function for control pipe 1302 * 1303 * a exception callback will be done upon: 1304 * - an exception/error (all types) 1305 * - partial xfer of data unless SHORT_XFER_OK has been set 1306 * 1307 * callback arguments are: 1308 * - the pipe_handle 1309 * - usb_ctrl_req_t pointer 1310 * 1311 * if USB_ATTRS_AUTOCLEARING was set, autoclearing will be attempted 1312 * and usb_cb_flags_t in usb_ctrl_req may indicate what was done 1313 */ 1314 void (*ctrl_exc_cb)(usb_pipe_handle_t ph, 1315 struct usb_ctrl_req *req); 1316 1317 /* set by USBA/HCD on completion */ 1318 usb_cr_t ctrl_completion_reason; /* set by HCD */ 1319 usb_cb_flags_t ctrl_cb_flags; /* Callback context / handling flgs */ 1320 } usb_ctrl_req_t; 1321 1322 1323 /* 1324 * In the setup packet, the descriptor type is passed in the high byte of the 1325 * wValue field. 1326 * descriptor types: 1327 */ 1328 #define USB_DESCR_TYPE_SETUP_DEV 0x0100 1329 #define USB_DESCR_TYPE_SETUP_CFG 0x0200 1330 #define USB_DESCR_TYPE_SETUP_STRING 0x0300 1331 #define USB_DESCR_TYPE_SETUP_IF 0x0400 1332 #define USB_DESCR_TYPE_SETUP_EP 0x0500 1333 #define USB_DESCR_TYPE_SETUP_DEV_QLF 0x0600 1334 #define USB_DESCR_TYPE_SETUP_OTHER_SPEED_CFG 0x0700 1335 #define USB_DESCR_TYPE_SETUP_IF_PWR 0x0800 1336 1337 #define USB_DESCR_TYPE_DEV 0x01 1338 #define USB_DESCR_TYPE_CFG 0x02 1339 #define USB_DESCR_TYPE_STRING 0x03 1340 #define USB_DESCR_TYPE_IF 0x04 1341 #define USB_DESCR_TYPE_EP 0x05 1342 #define USB_DESCR_TYPE_DEV_QLF 0x06 1343 #define USB_DESCR_TYPE_OTHER_SPEED_CFG 0x07 1344 #define USB_DESCR_TYPE_IF_PWR 0x08 1345 #define USB_DESCR_TYPE_IA 0x0B 1346 1347 #define USB_DESCR_TYPE_WA 0x21 1348 #define USB_DESCR_TYPE_RPIPE 0x22 1349 1350 /* Wireless USB extension, refer to WUSB 1.0/7.4 */ 1351 #define USB_DESCR_TYPE_SECURITY 0x0c 1352 #define USB_DESCR_TYPE_KEY 0x0d 1353 #define USB_DESCR_TYPE_ENCRYPTION 0x0e 1354 #define USB_DESCR_TYPE_BOS 0x0f 1355 #define USB_DESCR_TYPE_DEV_CAPABILITY 0x10 1356 #define USB_DESCR_TYPE_WIRELESS_EP_COMP 0x11 1357 1358 #define USB_WA_DESCR_SIZE 14 1359 #define USB_RPIPE_DESCR_SIZE 28 1360 1361 /* 1362 * device request type 1363 */ 1364 #define USB_DEV_REQ_HOST_TO_DEV 0x00 1365 #define USB_DEV_REQ_DEV_TO_HOST 0x80 1366 #define USB_DEV_REQ_DIR_MASK 0x80 1367 1368 #define USB_DEV_REQ_TYPE_STANDARD 0x00 1369 #define USB_DEV_REQ_TYPE_CLASS 0x20 1370 #define USB_DEV_REQ_TYPE_VENDOR 0x40 1371 #define USB_DEV_REQ_TYPE_MASK 0x60 1372 1373 #define USB_DEV_REQ_RCPT_DEV 0x00 1374 #define USB_DEV_REQ_RCPT_IF 0x01 1375 #define USB_DEV_REQ_RCPT_EP 0x02 1376 #define USB_DEV_REQ_RCPT_OTHER 0x03 1377 #define USB_DEV_REQ_RCPT_MASK 0x03 1378 1379 /* Wire adapter class extension for request recipient */ 1380 #define USB_DEV_REQ_RCPT_PORT 0x04 1381 #define USB_DEV_REQ_RCPT_RPIPE 0x05 1382 1383 /* 1384 * device request 1385 */ 1386 #define USB_REQ_GET_STATUS 0x00 1387 #define USB_REQ_CLEAR_FEATURE 0x01 1388 #define USB_REQ_SET_FEATURE 0x03 1389 #define USB_REQ_SET_ADDRESS 0x05 1390 #define USB_REQ_GET_DESCR 0x06 1391 #define USB_REQ_SET_DESCR 0x07 1392 #define USB_REQ_GET_CFG 0x08 1393 #define USB_REQ_SET_CFG 0x09 1394 #define USB_REQ_GET_IF 0x0a 1395 #define USB_REQ_SET_IF 0x0b 1396 #define USB_REQ_SYNC_FRAME 0x0c 1397 /* Wireless USB extension, refer to WUSB 1.0/7.3.1 */ 1398 #define USB_REQ_SET_ENCRYPTION 0x0d 1399 #define USB_REQ_GET_ENCRYPTION 0x0e 1400 #define USB_REQ_RPIPE_ABORT 0x0e 1401 #define USB_REQ_SET_HANDSHAKE 0x0f 1402 #define USB_REQ_RPIPE_RESET 0x0f 1403 #define USB_REQ_GET_HANDSHAKE 0x10 1404 #define USB_REQ_SET_CONNECTION 0x11 1405 #define USB_REQ_SET_SECURITY_DATA 0x12 1406 #define USB_REQ_GET_SECURITY_DATA 0x13 1407 #define USB_REQ_SET_WUSB_DATA 0x14 1408 #define USB_REQ_LOOPBACK_DATA_WRITE 0x15 1409 #define USB_REQ_LOOPBACK_DATA_READ 0x16 1410 #define USB_REQ_SET_INTERFACE_DS 0x17 1411 1412 /* language ID for string descriptors */ 1413 #define USB_LANG_ID 0x0409 1414 1415 /* 1416 * Standard Feature Selectors 1417 */ 1418 #define USB_EP_HALT 0x0000 1419 #define USB_DEV_REMOTE_WAKEUP 0x0001 1420 #define USB_DEV_TEST_MODE 0x0002 1421 /* Wireless USB extension, refer to WUSB 1.0/7.3.1 */ 1422 #define USB_DEV_WUSB 0x0003 1423 1424 1425 /* 1426 * Allocate usb control request 1427 * 1428 * Arguments: 1429 * dip - dev_info pointer of the client driver 1430 * len - length of "data" for this control request. 1431 * if 0, no mblk is alloc'ed 1432 * flags - USB_FLAGS_SLEEP: Sleep if resources are not available 1433 * 1434 * Return Values: 1435 * usb_ctrl_req_t pointer on success, NULL on failure 1436 * 1437 * Implementation NOTE: the dip allows checking on detach for memory leaks 1438 */ 1439 usb_ctrl_req_t *usb_alloc_ctrl_req( 1440 dev_info_t *dip, 1441 size_t len, 1442 usb_flags_t flags); 1443 1444 1445 /* 1446 * free USB control request 1447 */ 1448 void usb_free_ctrl_req( 1449 usb_ctrl_req_t *reqp); 1450 1451 1452 /* 1453 * usb_pipe_ctrl_xfer(); 1454 * Client driver calls this function to issue the control 1455 * request to the USBA which will queue or transport it to the device 1456 * 1457 * Arguments: 1458 * pipe_handle - control pipe pipehandle (obtained via usb_pipe_open() 1459 * reqp - pointer to control request 1460 * flags - USB_FLAGS_SLEEP: 1461 * wait for the request to complete 1462 * 1463 * Return values: 1464 * USB_SUCCESS - successfully queued (no sleep) or successfully 1465 * completed (with sleep specified) 1466 * USB_FAILURE - failure 1467 * USB_NO_RESOURCES - no resources 1468 */ 1469 int usb_pipe_ctrl_xfer(usb_pipe_handle_t pipe_handle, 1470 usb_ctrl_req_t *reqp, 1471 usb_flags_t flags); 1472 1473 1474 /* 1475 * --------------------------------------------------------------------------- 1476 * Wrapper function which allocates and deallocates a request structure, and 1477 * performs a control transfer. 1478 * --------------------------------------------------------------------------- 1479 */ 1480 1481 /* 1482 * Setup arguments for usb_pipe_ctrl_xfer_wait: 1483 * 1484 * bmRequestType - characteristics of request 1485 * bRequest - specific request 1486 * wValue - varies according to request 1487 * wIndex - index or offset 1488 * wLength - number of bytes to xfer 1489 * attrs - required request attributes 1490 * data - pointer to pointer to data 1491 * IN: HCD will allocate data 1492 * OUT: clients driver allocates data 1493 */ 1494 typedef struct usb_ctrl_setup { 1495 uchar_t bmRequestType; 1496 uchar_t bRequest; 1497 uint16_t wValue; 1498 uint16_t wIndex; 1499 uint16_t wLength; 1500 usb_req_attrs_t attrs; 1501 } usb_ctrl_setup_t; 1502 1503 1504 /* 1505 * usb_pipe_ctrl_xfer_wait(): 1506 * for simple synchronous control transactions this wrapper function 1507 * will perform the allocation, xfer, and deallocation. 1508 * USB_ATTRS_AUTOCLEARING will be enabled 1509 * 1510 * Arguments: 1511 * pipe_handle - control pipe pipehandle (obtained via usb_pipe_open()) 1512 * setup - contains pointer to client's devinfo, 1513 * setup descriptor params, attributes and data 1514 * completion_reason - completion status. 1515 * cb_flags - request completions flags. 1516 * flags - none. 1517 * 1518 * Return Values: 1519 * USB_SUCCESS - request successfully executed. 1520 * USB_FAILURE - request failed. 1521 * USB_* - refer to list of all possible return values in 1522 * this file 1523 * 1524 * NOTES: 1525 * - in the case of failure, the client should check completion_reason and 1526 * and cb_flags and determine further recovery action 1527 * - the client should check data and if non-zero, free the data on 1528 * completion 1529 */ 1530 int usb_pipe_ctrl_xfer_wait( 1531 usb_pipe_handle_t pipe_handle, 1532 usb_ctrl_setup_t *setup, 1533 mblk_t **data, 1534 usb_cr_t *completion_reason, 1535 usb_cb_flags_t *cb_flags, 1536 usb_flags_t flags); 1537 1538 1539 /* 1540 * --------------------------------------------------------------------------- 1541 * Some utility defines and wrapper functions for standard control requests. 1542 * --------------------------------------------------------------------------- 1543 */ 1544 1545 /* 1546 * 1547 * Status bits returned by a usb_get_status(). 1548 */ 1549 #define USB_DEV_SLF_PWRD_STATUS 1 /* Supports Self Power */ 1550 #define USB_DEV_RWAKEUP_STATUS 2 /* Remote Wakeup Enabled */ 1551 #define USB_DEV_BAT_PWRD_STATUS 4 /* Battery Powered */ 1552 #define USB_EP_HALT_STATUS 1 /* Endpoint is Halted */ 1553 #define USB_IF_STATUS 0 /* Interface Status is 0 */ 1554 1555 /* length of data returned by USB_REQ_GET_STATUS */ 1556 #define USB_GET_STATUS_LEN 2 1557 1558 /* 1559 * wrapper function returning status of device, interface, or endpoint 1560 * 1561 * Arguments: 1562 * dip - devinfo pointer. 1563 * ph - pipe handle 1564 * type - bmRequestType to be used 1565 * what - 0 for device, otherwise interface or ep number 1566 * status - pointer to returned status. 1567 * flags - USB_FLAGS_SLEEP (mandatory) 1568 * 1569 * Return Values: 1570 * valid usb_status_t or USB_FAILURE 1571 * 1572 */ 1573 int usb_get_status( 1574 dev_info_t *dip, 1575 usb_pipe_handle_t ph, 1576 uint_t type, /* bmRequestType */ 1577 uint_t what, /* 0, interface, endpoint number */ 1578 uint16_t *status, 1579 usb_flags_t flags); 1580 1581 1582 /* 1583 * function for clearing feature of device, interface, or endpoint 1584 * 1585 * Arguments: 1586 * dip - devinfo pointer. 1587 * type - bmRequestType to be used 1588 * feature - feature to be cleared 1589 * what - 0 for device, otherwise interface or ep number 1590 * flags - USB_FLAGS_SLEEP (mandatory) 1591 * cb - if USB_FLAGS_SLEEP has not been specified 1592 * this callback function will be called on 1593 * completion. This callback may be NULL 1594 * and no notification of completion will then 1595 * be provided. 1596 * cb_arg - 2nd argument to callback function. 1597 * 1598 * Return Values: 1599 * USB_SUCCESS clearing feature succeeded 1600 * USB_FAILURE clearing feature failed 1601 * USB_* refer to list of all possible return values in 1602 * this file 1603 */ 1604 int usb_clr_feature( 1605 dev_info_t *dip, 1606 uint_t type, /* bmRequestType */ 1607 uint_t feature, 1608 uint_t what, /* 0, interface, endpoint number */ 1609 usb_flags_t flags, 1610 void (*cb)( 1611 usb_pipe_handle_t ph, 1612 usb_opaque_t arg, 1613 int rval, 1614 usb_cb_flags_t flags), 1615 usb_opaque_t cb_arg); 1616 1617 1618 /* 1619 * usb_set_cfg(): 1620 * Sets the configuration. Use this function with caution as 1621 * the framework is normally responsible for configuration changes. 1622 * Changing configuration will fail if pipes are still open or 1623 * when invoked from a driver bound to an interface on a composite 1624 * device. This function access the device and blocks. 1625 * 1626 * Arguments: 1627 * dip - devinfo pointer. 1628 * cfg_index - Index of configuration to set. Corresponds to 1629 * index in the usb_client_dev_data_t tree of 1630 * configurations. See usb_client_dev_data_t(9F). 1631 * usb_flags - USB_FLAGS_SLEEP: 1632 * wait for completion. 1633 * cb - if USB_FLAGS_SLEEP has not been specified 1634 * this callback function will be called on 1635 * completion. This callback may be NULL 1636 * and no notification of completion will then 1637 * be provided. 1638 * cb_arg - 2nd argument to callback function. 1639 * 1640 * callback and callback_arg should be NULL if USB_FLAGS_SLEEP has 1641 * been specified 1642 * 1643 * Return Values: 1644 * USB_SUCCESS: new configuration was set or async request 1645 * submitted successfully. 1646 * USB_FAILURE: new configuration could not be set because 1647 * it may been illegal configuration or this 1648 * caller was not allowed to change configs or 1649 * pipes were still open or async request 1650 * could not be submitted. 1651 * USB_* refer to list of all possible return values in 1652 * this file 1653 * 1654 * the pipe handle argument in the callback will be the default pipe handle 1655 */ 1656 int usb_set_cfg( 1657 dev_info_t *dip, 1658 uint_t cfg_index, 1659 usb_flags_t usb_flags, 1660 void (*cb)( 1661 usb_pipe_handle_t ph, 1662 usb_opaque_t arg, 1663 int rval, 1664 usb_cb_flags_t flags), 1665 usb_opaque_t cb_arg); 1666 1667 1668 /* 1669 * usb_get_cfg: 1670 * dip - pointer to devinfo node 1671 * cfgval - pointer to cfgval 1672 * usb_flags - none, will always block 1673 * 1674 * return values: 1675 * USB_SUCCESS - current cfg value is returned to cfgval 1676 * USB_* - refer to list of all possible return values in 1677 * this file 1678 */ 1679 int usb_get_cfg( 1680 dev_info_t *dip, 1681 uint_t *cfgval, 1682 usb_flags_t usb_flags); 1683 1684 1685 /* 1686 * The following functions set or get the alternate interface 1687 * setting. 1688 * 1689 * usb_set_alt_if: 1690 * dip - pointer to devinfo node 1691 * interface - interface 1692 * alt_number - alternate to set to 1693 * usb_flags - USB_FLAGS_SLEEP: 1694 * wait for completion. 1695 * cb - if USB_FLAGS_SLEEP has not been specified 1696 * this callback function will be called on 1697 * completion. This callback may be NULL 1698 * and no notification of completion will then 1699 * be provided. 1700 * cb_arg - 2nd argument to callback function. 1701 * 1702 * callback and callback_arg should be NULL if USB_FLAGS_SLEEP has 1703 * been specified 1704 * 1705 * the pipe handle argument in the callback will be the default pipe handle 1706 * 1707 * return values: 1708 * USB_SUCCESS: alternate was set or async request was 1709 * submitted. 1710 * USB_FAILURE: alternate could not be set because pipes 1711 * were still open or some access error occurred 1712 * or an invalid alt if value was passed or 1713 * async request could not be submitted 1714 * USB_INVALID_PERM the driver does not own the device or the interface 1715 * USB_* refer to list of all possible return values in 1716 * this file 1717 */ 1718 int usb_set_alt_if( 1719 dev_info_t *dip, 1720 uint_t interface, 1721 uint_t alt_number, 1722 usb_flags_t usb_flags, 1723 void (*cb)( 1724 usb_pipe_handle_t ph, 1725 usb_opaque_t arg, 1726 int rval, 1727 usb_cb_flags_t flags), 1728 usb_opaque_t cb_arg); 1729 1730 1731 1732 /* flags must be USB_FLAGS_SLEEP, and this function will block */ 1733 int usb_get_alt_if( 1734 dev_info_t *dip, 1735 uint_t if_number, 1736 uint_t *alt_number, 1737 usb_flags_t flags); 1738 1739 1740 /* 1741 * =========================================================================== 1742 * USB bulk request management 1743 * =========================================================================== 1744 */ 1745 1746 /* 1747 * A client driver allocates/uses the usb_bulk_req_t for bulk pipe xfers. 1748 * 1749 * NOTES: 1750 * - bulk pipe sharing is not supported 1751 * - semantics of combinations of flag and attributes: 1752 * 1753 * flags Type attributes data timeout semantics 1754 * ---------------------------------------------------------------- 1755 * x x x == NULL x illegal 1756 * 1757 * no sleep IN x != NULL 0 fill buffer, no timeout 1758 * callback when xfer-len has 1759 * been xferred 1760 * no sleep IN x != NULL > 0 fill buffer, with timeout 1761 * callback when xfer-len has 1762 * been xferred 1763 * 1764 * sleep IN x != NULL 0 fill buffer, no timeout 1765 * unblock when xfer-len has 1766 * been xferred 1767 * no callback 1768 * sleep IN x != NULL > 0 fill buffer, with timeout 1769 * unblock when xfer-len has 1770 * been xferred or timeout 1771 * no callback 1772 * 1773 * X OUT SHORT_XFER_OK x x illegal 1774 * 1775 * no sleep OUT x != NULL 0 empty buffer, no timeout 1776 * callback when xfer-len has 1777 * been xferred 1778 * no sleep OUT x != NULL > 0 empty buffer, with timeout 1779 * callback when xfer-len has 1780 * been xferred or timeout 1781 * 1782 * sleep OUT x != NULL 0 empty buffer, no timeout 1783 * unblock when xfer-len has 1784 * been xferred 1785 * no callback 1786 * sleep OUT x != NULL > 0 empty buffer, with timeout 1787 * unblock when xfer-len has 1788 * been xferred or timeout 1789 * no callback 1790 * 1791 * - bulk_len and bulk_data must be > 0. SHORT_XFER_OK is not applicable. 1792 * 1793 * - multiple bulk requests can be queued 1794 * 1795 * - Splitting large Bulk xfer: 1796 * The HCD driver, due to internal constraints, can only do a limited size bulk 1797 * data xfer per request. The current limitations are 32K for UHCI and 128K 1798 * for OHCI. So, a client driver may first determine this limitation (by 1799 * calling the USBA interface usb_pipe_bulk_transfer_size()); and restrict 1800 * itself to doing xfers in multiples of this fixed size. This forces a client 1801 * driver to do data xfers in a loop for a large request, splitting it into 1802 * multiple chunks of fixed size. 1803 */ 1804 typedef struct usb_bulk_req { 1805 uint_t bulk_len; /* number of bytes to xfer */ 1806 mblk_t *bulk_data; /* the data for the data phase */ 1807 /* IN: allocated by HCD */ 1808 /* OUT: allocated by client */ 1809 uint_t bulk_timeout; /* xfer timeout value in secs */ 1810 usb_opaque_t bulk_client_private; /* Client specific information */ 1811 usb_req_attrs_t bulk_attributes; /* xfer-attributes */ 1812 1813 /* Normal Callback function (For synch xfers) */ 1814 void (*bulk_cb)(usb_pipe_handle_t ph, 1815 struct usb_bulk_req *req); 1816 1817 /* Exception Callback function (For asynch xfers) */ 1818 void (*bulk_exc_cb)(usb_pipe_handle_t ph, 1819 struct usb_bulk_req *req); 1820 1821 /* set by USBA/HCD on completion */ 1822 usb_cr_t bulk_completion_reason; /* set by HCD */ 1823 usb_cb_flags_t bulk_cb_flags; /* Callback context / handling flgs */ 1824 } usb_bulk_req_t; 1825 1826 1827 /* 1828 * Allocate/free usb bulk request 1829 * 1830 * Arguments: 1831 * dip - pointer to dev_info_t of the client driver 1832 * len - 0 or length of mblk to be allocated 1833 * flags - USB_FLAGS_SLEEP: 1834 * wait for resources 1835 * 1836 * Return Values: 1837 * usb_bulk_req_t on success, NULL on failure 1838 */ 1839 usb_bulk_req_t *usb_alloc_bulk_req( 1840 dev_info_t *dip, 1841 size_t len, 1842 usb_flags_t flags); 1843 1844 1845 void usb_free_bulk_req( 1846 usb_bulk_req_t *reqp); 1847 1848 1849 /* 1850 * usb_pipe_bulk_xfer(): 1851 * 1852 * Client drivers call this function to issue the bulk xfer to the USBA 1853 * which will queue or transfer it to the device 1854 * 1855 * Arguments: 1856 * pipe_handle - bulk pipe handle (obtained via usb_pipe_open() 1857 * reqp - pointer to bulk data xfer request (IN or OUT) 1858 * flags - USB_FLAGS_SLEEP: 1859 * wait for the request to complete 1860 * 1861 * Return Values: 1862 * USB_SUCCESS - success 1863 * USB_FAILURE - unspecified failure 1864 * USB_NO_RESOURCES - no resources 1865 * 1866 */ 1867 int usb_pipe_bulk_xfer( 1868 usb_pipe_handle_t pipe_handle, 1869 usb_bulk_req_t *reqp, 1870 usb_flags_t flags); 1871 1872 /* Get maximum bulk transfer size */ 1873 int usb_pipe_get_max_bulk_transfer_size( 1874 dev_info_t *dip, 1875 size_t *size); 1876 1877 1878 /* 1879 * =========================================================================== 1880 * USB interrupt pipe request management 1881 * =========================================================================== 1882 */ 1883 1884 /* 1885 * A client driver allocates and uses the usb_intr_req_t for 1886 * all interrupt pipe transfers. 1887 * 1888 * USB_FLAGS_SLEEP indicates here just to wait for resources except 1889 * for ONE_XFER where we also wait for completion 1890 * 1891 * semantics flags and attribute combinations: 1892 * 1893 * Notes: 1894 * none attributes indicates neither ONE_XFER nor SHORT_XFER_OK 1895 * 1896 * flags Type attributes data timeout semantics 1897 * ---------------------------------------------------------------- 1898 * x IN x != NULL x illegal 1899 * x IN ONE_XFER=0 x !=0 illegal 1900 * 1901 * x IN ONE_XFER=0 NULL 0 continuous polling, 1902 * many callbacks 1903 * request is returned on 1904 * stop polling 1905 * 1906 * no sleep IN ONE_XFER NULL 0 one time poll, no timeout, 1907 * one callback 1908 * no sleep IN ONE_XFER NULL !=0 one time poll, with 1909 * timeout, one callback 1910 * 1911 * sleep IN ONE_XFER NULL 0 one time poll, no timeout, 1912 * no callback, 1913 * block for completion 1914 * sleep IN ONE_XFER NULL !=0 one time poll, with timeout, 1915 * no callback 1916 * block for completion 1917 * 1918 * x OUT x NULL x illegal 1919 * x OUT ONE_XFER x x illegal 1920 * x OUT SHORT_XFER_OK x x illegal 1921 * 1922 * x OUT none != NULL 0 xfer until data exhausted, 1923 * no timeout, one callback 1924 * x OUT none != NULL !=0 xfer until data exhausted, 1925 * with timeout, one callback 1926 * 1927 * - Reads (IN): 1928 * 1929 * The client driver does *not* provide a data buffer. 1930 * By default, a READ request would mean continuous polling for data IN. The 1931 * HCD typically reads "wMaxPacketSize" amount of 'periodic data'. A client 1932 * driver may force the HCD to read instead intr_len 1933 * amount of 'periodic data' (See section 1). 1934 * 1935 * The HCD issues a callback to the client after each polling interval if 1936 * it has read in some data. Note that the amount of data read IN is either 1937 * intr_len or 'wMaxPacketSize' in length. 1938 * 1939 * Normally, the HCD keeps polling interrupt pipe forever even if there is 1940 * no data to be read IN. A client driver may stop this polling by 1941 * calling usb_pipe_stop_intr_polling(). 1942 * 1943 * If a client driver chooses to pass USB_ATTRS_ONE_XFER as 1944 * 'xfer_attributes' the HCD will poll for data until some data is received. 1945 * HCD reads in the data and does a callback and stops polling for any more 1946 * data. In this case, the client driver need not explicitly call 1947 * usb_pipe_stop_intr_polling(). 1948 * 1949 * When continuous polling is stopped, the original request is returned with 1950 * USB_CR_STOPPED_POLLING. 1951 * 1952 * - Writes (OUT): 1953 * 1954 * A client driver provides the data buffer, and data, needed for intr write. 1955 * There is no continuous write mode, a la read (See previous section). 1956 * The USB_ATTRS_ONE_XFER attribute is illegal. 1957 * By default USBA keeps writing intr data until the provided data buffer 1958 * has been written out. The HCD does ONE callback to the client driver. 1959 * Queueing is supported. 1960 * Max size is 8k 1961 */ 1962 typedef struct usb_intr_req { 1963 uint_t intr_len; /* OUT: size of total xfer */ 1964 /* IN : packet size */ 1965 mblk_t *intr_data; /* the data for the data phase */ 1966 /* IN: allocated by HCD */ 1967 /* OUT: allocated by client */ 1968 usb_opaque_t intr_client_private; /* Client specific information */ 1969 uint_t intr_timeout; /* only with ONE TIME POLL, in secs */ 1970 usb_req_attrs_t intr_attributes; 1971 1972 /* Normal callback function (For synch transfers) */ 1973 void (*intr_cb)(usb_pipe_handle_t ph, 1974 struct usb_intr_req *req); 1975 1976 /* Exception callback function (For asynch transfers) */ 1977 void (*intr_exc_cb)(usb_pipe_handle_t ph, 1978 struct usb_intr_req *req); 1979 1980 /* set by USBA/HCD on completion */ 1981 usb_cr_t intr_completion_reason; /* set by HCD */ 1982 usb_cb_flags_t intr_cb_flags; /* Callback context / handling flgs */ 1983 } usb_intr_req_t; 1984 1985 1986 /* 1987 * Allocate/free usb interrupt pipe request 1988 * 1989 * Arguments: 1990 * dip - pointer to dev_info_t of the client driver 1991 * reqp - pointer to request structure 1992 * len - 0 or length of mblk for this interrupt request 1993 * flags - USB_FLAGS_SLEEP: 1994 * Sleep if resources are not available 1995 * 1996 * Return Values: 1997 * usb_intr_req_t on success, NULL on failure 1998 */ 1999 usb_intr_req_t *usb_alloc_intr_req( 2000 dev_info_t *dip, 2001 size_t len, 2002 usb_flags_t flags); 2003 2004 2005 void usb_free_intr_req( 2006 usb_intr_req_t *reqp); 2007 2008 2009 /* 2010 * usb_pipe_intr_xfer(): 2011 * 2012 * Client drivers call this function to issue the intr xfer to USBA/HCD 2013 * which starts polling the device 2014 * 2015 * Arguments: 2016 * pipe_handle - interrupt pipe handle (obtained via usb_pipe_open() 2017 * reqp - pointer tothe interrupt pipe xfer request (IN or OUT) 2018 * flags - USB_FLAGS_SLEEP: 2019 * wait for resources to be available 2020 * 2021 * return values: 2022 * USB_SUCCESS - success 2023 * USB_FAILURE - unspecified failure 2024 * USB_NO_RESOURCES - no resources 2025 * 2026 * NOTE: start polling on an IN pipe that is already being polled is a NOP. 2027 * We don't queue requests on OUT pipe 2028 */ 2029 int usb_pipe_intr_xfer( 2030 usb_pipe_handle_t pipe_handle, 2031 usb_intr_req_t *req, 2032 usb_flags_t flags); 2033 2034 2035 /* 2036 * usb_pipe_stop_intr_polling(): 2037 * 2038 * Client drivers call this function to stop the automatic data-in/out transfers 2039 * without closing the pipe. 2040 * 2041 * If USB_FLAGS_SLEEP has been specified then this function will block until 2042 * polling has been stopped and all callbacks completed. If USB_FLAGS_SLEEP 2043 * has NOT been specified then polling is terminated when the original 2044 * request that started the polling has been returned with 2045 * USB_CR_STOPPED_POLLING 2046 * 2047 * Stop polling should never fail. 2048 * 2049 * Args:- 2050 * pipe_handle - interrupt pipe handle (obtained via usb_pipe_open()). 2051 * flags - USB_FLAGS_SLEEP: 2052 * wait for the resources to be available. 2053 */ 2054 void usb_pipe_stop_intr_polling( 2055 usb_pipe_handle_t pipe_handle, 2056 usb_flags_t flags); 2057 2058 2059 /* 2060 * =========================================================================== 2061 * USB isochronous xfer management 2062 * =========================================================================== 2063 */ 2064 2065 /* 2066 * The usb frame number is an absolute number since boot and incremented 2067 * every 1 ms. 2068 */ 2069 typedef uint64_t usb_frame_number_t; 2070 2071 /* 2072 * USB ischronous packet descriptor 2073 * 2074 * An array of structures of type usb_isoc_pkt_descr_t must be allocated and 2075 * initialized by the client driver using usb_alloc_isoc_req(). The client 2076 * driver must set isoc_pkt_length in each packet descriptor before submitting 2077 * the request. 2078 */ 2079 typedef struct usb_isoc_pkt_descr { 2080 /* 2081 * Set by the client driver, for all isochronous requests, to the 2082 * number of bytes to transfer in a frame. 2083 */ 2084 ushort_t isoc_pkt_length; 2085 2086 /* 2087 * Set by HCD to actual number of bytes sent/received in frame. 2088 */ 2089 ushort_t isoc_pkt_actual_length; 2090 2091 /* 2092 * Per frame status set by HCD both for the isochronous IN and OUT 2093 * requests. If any status is non-zero then isoc_error_count in the 2094 * isoc_req will be non-zero. 2095 */ 2096 usb_cr_t isoc_pkt_status; 2097 } usb_isoc_pkt_descr_t; 2098 2099 2100 /* 2101 * USB isochronous request 2102 * 2103 * The client driver allocates the usb_isoc_req_t before sending an 2104 * isochronous requests. 2105 * 2106 * USB_FLAGS_SLEEP indicates here just to wait for resources but not 2107 * to wait for completion 2108 * 2109 * Semantics of various combinations for data xfers: 2110 * 2111 * Note: attributes considered in this table are ONE_XFER, START_FRAME, 2112 * XFER_ASAP, SHORT_XFER 2113 * 2114 * 2115 * flags Type attributes data semantics 2116 * --------------------------------------------------------------------- 2117 * x x x NULL illegal 2118 * 2119 * x x ONE_XFER x illegal 2120 * 2121 * x IN x !=NULL continuous polling, 2122 * many callbacks 2123 * 2124 * x IN ISOC_START_FRAME !=NULL invalid if Current_frame# > 2125 * "isoc_frame_no" 2126 * x IN ISOC_XFER_ASAP !=NULL "isoc_frame_no" ignored. 2127 * HCD determines when to 2128 * insert xfer 2129 * 2130 * x OUT ONE_XFER x illegal 2131 * x OUT SHORT_XFER_OK x illegal 2132 * 2133 * x OUT ISOC_START_FRAME !=NULL invalid if Current_frame# > 2134 * "isoc_frame_no" 2135 * x OUT ISOC_XFER_ASAP !=NULL "isoc_frame_no" ignored. 2136 * HCD determines when to 2137 * insert xfer 2138 */ 2139 typedef struct usb_isoc_req { 2140 /* 2141 * Starting frame number will be set by the client driver in which 2142 * to begin this request. This frame number is used to synchronize 2143 * requests queued to different isochronous pipes. The frame number 2144 * is optional and client driver can skip starting frame number by 2145 * setting USB_ISOC_ATTRS_ASAP. In this case, HCD will decide starting 2146 * frame number for this isochronous request. If this field is 0, 2147 * then this indicates an invalid frame number. 2148 */ 2149 usb_frame_number_t isoc_frame_no; 2150 2151 /* 2152 * Number of isochronous data packets. 2153 * The first field is set by client driver and may not exceed 2154 * the maximum number of entries in the usb isochronous packet 2155 * descriptors. 2156 */ 2157 ushort_t isoc_pkts_count; 2158 2159 /* 2160 * The sum of all pkt lengths in the isoc request. Recommend to 2161 * set it to zero, so the sum of isoc_pkt_length in the 2162 * isoc_pkt_descr list will be used automatically and no check 2163 * will be apply to this element. 2164 */ 2165 ushort_t isoc_pkts_length; 2166 2167 /* 2168 * This field will be set by HCD and this field indicates the number 2169 * of packets that completed with errors. 2170 */ 2171 ushort_t isoc_error_count; 2172 2173 /* 2174 * Attributes specific to particular usb isochronous request. 2175 * Supported values are: USB_ATTRS_ISOC_START_FRAME, 2176 * USB_ATTRS_ISOC_XFER_ASAP. 2177 */ 2178 usb_req_attrs_t isoc_attributes; 2179 2180 /* 2181 * Isochronous OUT: 2182 * allocated and set by client driver, freed and zeroed by HCD 2183 * on successful completion 2184 * Isochronous IN: 2185 * allocated and set by HCD, freed by client driver 2186 */ 2187 mblk_t *isoc_data; 2188 2189 /* 2190 * The client driver specific private information. 2191 */ 2192 usb_opaque_t isoc_client_private; 2193 2194 /* 2195 * Isochronous OUT: 2196 * must be allocated & initialized by client driver 2197 * Isochronous IN: 2198 * must be allocated by client driver 2199 */ 2200 struct usb_isoc_pkt_descr *isoc_pkt_descr; 2201 2202 /* Normal callback function (For synch transfers) */ 2203 void (*isoc_cb)(usb_pipe_handle_t ph, 2204 struct usb_isoc_req *req); 2205 2206 /* Exception callback function (For asynch transfers) */ 2207 void (*isoc_exc_cb)(usb_pipe_handle_t ph, 2208 struct usb_isoc_req *req); 2209 2210 /* set by USBA/HCD on completion */ 2211 usb_cr_t isoc_completion_reason; /* set by HCD */ 2212 /* Callback context / handling flgs */ 2213 usb_cb_flags_t isoc_cb_flags; 2214 } usb_isoc_req_t; 2215 2216 2217 /* 2218 * Allocate/free usb isochronous resources 2219 * 2220 * isoc_pkts_count must be > 0 2221 * 2222 * Arguments: 2223 * dip - client driver's devinfo pointer 2224 * isoc_pkts_count - number of pkts required 2225 * len - 0 or size of mblk to allocate 2226 * flags - USB_FLAGS_SLEEP: 2227 * wait for resources 2228 * 2229 * Return Values: 2230 * usb_isoc_req pointer or NULL 2231 */ 2232 usb_isoc_req_t *usb_alloc_isoc_req( 2233 dev_info_t *dip, 2234 uint_t isoc_pkts_count, 2235 size_t len, 2236 usb_flags_t flags); 2237 2238 void usb_free_isoc_req( 2239 usb_isoc_req_t *usb_isoc_req); 2240 2241 /* 2242 * Returns current usb frame number. 2243 */ 2244 usb_frame_number_t usb_get_current_frame_number( 2245 dev_info_t *dip); 2246 2247 /* 2248 * Get maximum isochronous packets per usb isochronous request 2249 */ 2250 uint_t usb_get_max_pkts_per_isoc_request( 2251 dev_info_t *dip); 2252 2253 /* 2254 * usb_pipe_isoc_xfer() 2255 * 2256 * Client drivers call this to issue the isoch xfer (IN and OUT) to the USBA 2257 * which starts polling the device. 2258 * 2259 * Arguments: 2260 * pipe_handle - isoc pipe handle (obtained via usb_pipe_open(). 2261 * reqp - pointer to the isochronous pipe IN xfer request 2262 * allocated by the client driver. 2263 * flags - USB_FLAGS_SLEEP: 2264 * wait for the resources to be available. 2265 * 2266 * return values: 2267 * USB_SUCCESS - success. 2268 * USB_FAILURE - unspecified failure. 2269 * USB_NO_RESOURCES - no resources. 2270 * USB_NO_FRAME_NUMBER - START_FRAME, ASAP flags not specified. 2271 * USB_INVALID_START_FRAME - Starting USB frame number invalid. 2272 * 2273 * Notes: 2274 * - usb_pipe_isoc_xfer on an IN pipe that is already being polled is a NOP. 2275 * - requests can be queued on an OUT pipe. 2276 */ 2277 int usb_pipe_isoc_xfer( 2278 usb_pipe_handle_t pipe_handle, 2279 usb_isoc_req_t *reqp, 2280 usb_flags_t flags); 2281 2282 /* 2283 * usb_pipe_stop_isoc_polling(): 2284 * 2285 * Client drivers call this function to stop the automatic data-in/out 2286 * transfers without closing the isoc pipe. 2287 * 2288 * If USB_FLAGS_SLEEP has been specified then this function will block until 2289 * polling has been stopped and all callbacks completed. If USB_FLAGS_SLEEP 2290 * has NOT been specified then polling is terminated when the original 2291 * request that started the polling has been returned with 2292 * USB_CR_STOPPED_POLLING 2293 * 2294 * Stop polling should never fail. 2295 * 2296 * Arguments: 2297 * pipe_handle - isoc pipe handle (obtained via usb_pipe_open(). 2298 * flags - USB_FLAGS_SLEEP: 2299 * wait for polling to be stopped and all 2300 * callbacks completed. 2301 */ 2302 void usb_pipe_stop_isoc_polling( 2303 usb_pipe_handle_t pipe_handle, 2304 usb_flags_t flags); 2305 2306 /* 2307 * *************************************************************************** 2308 * USB device power management: 2309 * *************************************************************************** 2310 */ 2311 2312 /* 2313 * 2314 * As any usb device will have a max of 4 possible power states 2315 * the #define for them are provided below with mapping to the 2316 * corresponding OS power levels. 2317 */ 2318 #define USB_DEV_PWR_D0 USB_DEV_OS_FULL_PWR 2319 #define USB_DEV_PWR_D1 5 2320 #define USB_DEV_PWR_D2 6 2321 #define USB_DEV_PWR_D3 USB_DEV_OS_PWR_OFF 2322 2323 #define USB_DEV_OS_PWR_0 0 2324 #define USB_DEV_OS_PWR_1 1 2325 #define USB_DEV_OS_PWR_2 2 2326 #define USB_DEV_OS_PWR_3 3 2327 #define USB_DEV_OS_PWR_OFF USB_DEV_OS_PWR_0 2328 #define USB_DEV_OS_FULL_PWR USB_DEV_OS_PWR_3 2329 2330 /* Bit Masks for Power States */ 2331 #define USB_DEV_OS_PWRMASK_D0 1 2332 #define USB_DEV_OS_PWRMASK_D1 2 2333 #define USB_DEV_OS_PWRMASK_D2 4 2334 #define USB_DEV_OS_PWRMASK_D3 8 2335 2336 /* conversion for OS to Dx levels */ 2337 #define USB_DEV_OS_PWR2USB_PWR(l) (USB_DEV_OS_FULL_PWR - (l)) 2338 2339 /* from OS level to Dx mask */ 2340 #define USB_DEV_PWRMASK(l) (1 << (USB_DEV_OS_FULL_PWR - (l))) 2341 2342 /* Macro to check valid power level */ 2343 #define USB_DEV_PWRSTATE_OK(state, level) \ 2344 (((state) & USB_DEV_PWRMASK((level))) == 0) 2345 2346 int usb_handle_remote_wakeup( 2347 dev_info_t *dip, 2348 int cmd); 2349 2350 /* argument to usb_handle_remote wakeup function */ 2351 #define USB_REMOTE_WAKEUP_ENABLE 1 2352 #define USB_REMOTE_WAKEUP_DISABLE 2 2353 2354 int usb_create_pm_components( 2355 dev_info_t *dip, 2356 uint_t *pwrstates); 2357 2358 /* 2359 * *************************************************************************** 2360 * System event registration 2361 * *************************************************************************** 2362 */ 2363 2364 /* Functions for registering hotplug callback functions. */ 2365 2366 int usb_register_hotplug_cbs( 2367 dev_info_t *dip, 2368 int (*disconnect_event_handler)(dev_info_t *dip), 2369 int (*reconnect_event_handler)(dev_info_t *dip)); 2370 2371 void usb_unregister_hotplug_cbs(dev_info_t *dip); 2372 2373 /* 2374 * Reset_level determines the extent to which the device is reset, 2375 * It has the following values: 2376 * 2377 * USB_RESET_LVL_REATTACH - The device is reset, the original driver is 2378 * detached and a new driver attaching process 2379 * is started according to the updated 2380 * compatible name. This reset level applies to 2381 * the firmware download with the descriptors 2382 * changing, or other situations in which the 2383 * device needs to be reenumerated. 2384 * 2385 * USB_RESET_LVL_DEFAULT - Default reset level. The device is reset, all 2386 * error status is cleared, the device state 2387 * machines and registers are also cleared and 2388 * need to be reinitialized in the driver. The 2389 * current driver remains attached. This reset 2390 * level applies to hardware error recovery, or 2391 * firmware download without descriptors 2392 * changing. 2393 */ 2394 typedef enum { 2395 USB_RESET_LVL_REATTACH = 0, 2396 USB_RESET_LVL_DEFAULT = 1 2397 } usb_dev_reset_lvl_t; 2398 2399 /* 2400 * usb_reset_device: 2401 * 2402 * Client drivers call this function to request hardware reset for themselves, 2403 * which may be required in some situations such as: 2404 * 2405 * 1) Some USB devices need the driver to upload firmware into devices' RAM 2406 * and initiate a hardware reset in order to activate the new firmware. 2407 * 2) Hardware reset may help drivers to recover devices from an error state 2408 * caused by physical or firmware defects. 2409 * 2410 * Arguments: 2411 * dip - pointer to devinfo of the client 2412 * reset_level - see above 2413 * 2414 * Return values: 2415 * USB_SUCCESS - With USB_RESET_LVL_DEFAULT: the device was reset 2416 * successfully. 2417 * - With USB_RESET_LVL_REATTACH: reenumeration was 2418 * started successfully or a previous reset is still 2419 * in progress. 2420 * USB_FAILURE - The state of the device's parent hub is invalid 2421 * (disconnected or suspended). 2422 * - Called when the driver being detached. 2423 * - The device failed to be reset with 2424 * USB_RESET_LVL_DEFAULT specified. 2425 * - Reenumeration failed to start up with 2426 * - USB_RESET_LVL_REATTACH specified. 2427 * USB_INVALID_ARGS - Invalid arguments. 2428 * USB_INVALID_PERM - The driver of the dip doesn't own entire device. 2429 * USB_BUSY - One or more pipes other than the default control 2430 * pipe are open on the device with 2431 * USB_RESET_LVL_DEFAULT specified. 2432 * USB_INVALID_CONTEXT - Called from interrupt context with 2433 * USB_RESET_LVL_DEFAULT specified. 2434 */ 2435 2436 int usb_reset_device( 2437 dev_info_t *dip, 2438 usb_dev_reset_lvl_t reset_level); 2439 2440 2441 /* 2442 * ************************************************************************** 2443 * USB device driver registration and callback functions remaining 2444 * Contracted Project Private (for VirtualBox USB Device Capture) 2445 * ************************************************************************** 2446 */ 2447 2448 /* 2449 * getting the device strings of manufacturer, product and serial number 2450 */ 2451 typedef struct usb_dev_str { 2452 char *usb_mfg; /* manufacturer string */ 2453 char *usb_product; /* product string */ 2454 char *usb_serialno; /* serial number string */ 2455 } usb_dev_str_t; 2456 2457 /* 2458 * It is the callback function type for capture driver. 2459 * Arguments: 2460 * dev_descr - pointer to device descriptor 2461 * dev_str - pointer to device strings 2462 * path - pointer to device physical path 2463 * bus - USB bus address 2464 * port - USB port number 2465 * drv - capture driver name. 2466 * It is returned by the callback func. 2467 * Return Values: 2468 * USB_SUCCESS - VirtualBox will capture the device 2469 * USB_FAILURE - VirtualBox will not capture the device 2470 */ 2471 typedef int (*usb_dev_driver_callback_t)( 2472 usb_dev_descr_t *dev_descr, 2473 usb_dev_str_t *dev_str, 2474 char *path, 2475 int bus, 2476 int port, 2477 char **drv, 2478 void *reserved); 2479 2480 /* 2481 * Register the callback function in the usba. 2482 * Argument: 2483 * dip - client driver's devinfo pointer 2484 * cb - callback function 2485 * 2486 * Return Values: 2487 * USB_SUCCESS - the registeration was successful 2488 * USB_FAILURE - the registeration failed 2489 */ 2490 int usb_register_dev_driver( 2491 dev_info_t *dip, 2492 usb_dev_driver_callback_t cb); 2493 2494 /* 2495 * Unregister the callback function in the usba. 2496 */ 2497 void usb_unregister_dev_driver(dev_info_t *dip); 2498 2499 2500 /* 2501 * *************************************************************************** 2502 * USB Device and interface class, subclass and protocol codes 2503 * *************************************************************************** 2504 */ 2505 2506 /* 2507 * Available device and interface class codes. 2508 * Those which are device class codes are noted. 2509 */ 2510 2511 #define USB_CLASS_AUDIO 1 2512 #define USB_CLASS_COMM 2 /* Communication device class and */ 2513 #define USB_CLASS_CDC_CTRL 2 /* CDC-control iface class, also 2 */ 2514 #define USB_CLASS_HID 3 2515 #define USB_CLASS_PHYSICAL 5 2516 #define USB_CLASS_IMAGE 6 2517 #define USB_CLASS_PRINTER 7 2518 #define USB_CLASS_MASS_STORAGE 8 2519 #define USB_CLASS_HUB 9 /* Device class */ 2520 #define USB_CLASS_CDC_DATA 10 2521 #define USB_CLASS_CCID 11 2522 #define USB_CLASS_SECURITY 13 2523 #define USB_CLASS_VIDEO 14 2524 #define USB_CLASS_DIAG 220 /* Device class */ 2525 #define USB_CLASS_WIRELESS 224 2526 #define USB_CLASS_MISC 239 /* Device class */ 2527 #define USB_CLASS_APP 254 2528 #define USB_CLASS_VENDOR_SPEC 255 /* Device class */ 2529 2530 #define USB_CLASS_PER_INTERFACE 0 /* Class info is at interface level */ 2531 2532 /* Audio subclass. */ 2533 #define USB_SUBCLS_AUD_CONTROL 0x01 2534 #define USB_SUBCLS_AUD_STREAMING 0x02 2535 #define USB_SUBCLS_AUD_MIDI_STREAMING 0x03 2536 2537 /* Comms subclass. */ 2538 #define USB_SUBCLS_CDCC_DIRECT_LINE 0x01 2539 #define USB_SUBCLS_CDCC_ABSTRCT_CTRL 0x02 2540 #define USB_SUBCLS_CDCC_PHONE_CTRL 0x03 2541 #define USB_SUBCLS_CDCC_MULTCNL_ISDN 0x04 2542 #define USB_SUBCLS_CDCC_ISDN 0x05 2543 #define USB_SUBCLS_CDCC_ETHERNET 0x06 2544 #define USB_SUBCLS_CDCC_ATM_NETWORK 0x07 2545 2546 /* HID subclass and protocols. */ 2547 #define USB_SUBCLS_HID_1 1 2548 2549 #define USB_PROTO_HID_KEYBOARD 0x01 /* legacy keyboard */ 2550 #define USB_PROTO_HID_MOUSE 0x02 /* legacy mouse */ 2551 2552 /* Printer subclass and protocols. */ 2553 #define USB_SUBCLS_PRINTER_1 1 2554 2555 #define USB_PROTO_PRINTER_UNI 0x01 /* Unidirectional interface */ 2556 #define USB_PROTO_PRINTER_BI 0x02 /* Bidirectional interface */ 2557 2558 /* Mass storage subclasses and protocols. */ 2559 #define USB_SUBCLS_MS_RBC_T10 0x1 /* flash */ 2560 #define USB_SUBCLS_MS_SFF8020I 0x2 /* CD-ROM */ 2561 #define USB_SUBCLS_MS_QIC_157 0x3 /* tape */ 2562 #define USB_SUBCLS_MS_UFI 0x4 /* USB Floppy Disk Drive */ 2563 #define USB_SUBCLS_MS_SFF8070I 0x5 /* floppy */ 2564 #define USB_SUBCLS_MS_SCSI 0x6 /* transparent scsi */ 2565 2566 #define USB_PROTO_MS_CBI_WC 0x00 /* USB CBI Proto w/cmp intr */ 2567 #define USB_PROTO_MS_CBI 0x01 /* USB CBI Protocol */ 2568 #define USB_PROTO_MS_ISD_1999_SILICN 0x02 /* ZIP Protocol */ 2569 #define USB_PROTO_MS_BULK_ONLY 0x50 /* USB Bulk Only Protocol */ 2570 2571 /* Application subclasses. */ 2572 #define USB_SUBCLS_APP_FIRMWARE 0x01 /* app spec f/w subclass */ 2573 #define USB_SUBCLS_APP_IRDA 0x02 /* app spec IrDa subclass */ 2574 #define USB_SUBCLS_APP_TEST 0x03 /* app spec test subclass */ 2575 2576 /* Video subclasses */ 2577 #define USB_SUBCLS_VIDEO_CONTROL 0x01 /* video control */ 2578 #define USB_SUBCLS_VIDEO_STREAM 0x02 /* video stream */ 2579 #define USB_SUBCLS_VIDEO_COLLECTION 0x03 /* video interface collection */ 2580 2581 /* Wireless controller subclasses and protocols, refer to WUSB 1.0 chapter 8 */ 2582 #define USB_SUBCLS_WUSB_1 0x01 /* RF controller */ 2583 #define USB_SUBCLS_WUSB_2 0x02 /* Wireless adapter */ 2584 #define USB_PROTO_WUSB_HWA 0x01 /* host wire adapter */ 2585 #define USB_PROTO_WUSB_DWA 0x02 /* device wire adapter */ 2586 #define USB_PROTO_WUSB_DWA_ISO 0x03 /* device wire adapter isoc */ 2587 #define USB_PROTO_WUSB_RC 0x02 /* UWB radio controller */ 2588 2589 /* Association subclass and protocol, Association Model Supplement to WUSB1.0 */ 2590 #define USB_SUBCLS_CBAF 0x03 /* cable association */ 2591 #define USB_PROTO_CBAF 0x01 /* CBAF protocol */ 2592 2593 /* Misc subclasses and protocols, refer to WUSB 1.0 chapter 8 */ 2594 #define USB_SUBCLS_MISC_COMMON 0x02 /* common class */ 2595 #define USB_PROTO_MISC_WA 0x02 /* multifunction wire adapter */ 2596 2597 #ifdef __cplusplus 2598 } 2599 #endif 2600 2601 #endif /* _SYS_USB_USBAI_H */