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