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