The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/dev/usb/usb_device.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /* $FreeBSD: releng/8.3/sys/dev/usb/usb_device.c 226984 2011-11-01 08:24:01Z hselasky $ */
    2 /*-
    3  * Copyright (c) 2008 Hans Petter Selasky. All rights reserved.
    4  *
    5  * Redistribution and use in source and binary forms, with or without
    6  * modification, are permitted provided that the following conditions
    7  * are met:
    8  * 1. Redistributions of source code must retain the above copyright
    9  *    notice, this list of conditions and the following disclaimer.
   10  * 2. Redistributions in binary form must reproduce the above copyright
   11  *    notice, this list of conditions and the following disclaimer in the
   12  *    documentation and/or other materials provided with the distribution.
   13  *
   14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
   15  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   17  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
   18  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   19  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   20  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   21  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   22  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   23  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   24  * SUCH DAMAGE.
   25  */
   26 
   27 #include <sys/stdint.h>
   28 #include <sys/stddef.h>
   29 #include <sys/param.h>
   30 #include <sys/queue.h>
   31 #include <sys/types.h>
   32 #include <sys/systm.h>
   33 #include <sys/kernel.h>
   34 #include <sys/bus.h>
   35 #include <sys/module.h>
   36 #include <sys/lock.h>
   37 #include <sys/mutex.h>
   38 #include <sys/condvar.h>
   39 #include <sys/sysctl.h>
   40 #include <sys/sx.h>
   41 #include <sys/unistd.h>
   42 #include <sys/callout.h>
   43 #include <sys/malloc.h>
   44 #include <sys/priv.h>
   45 #include <sys/conf.h>
   46 #include <sys/fcntl.h>
   47 
   48 #include <dev/usb/usb.h>
   49 #include <dev/usb/usbdi.h>
   50 #include <dev/usb/usbdi_util.h>
   51 #include <dev/usb/usb_ioctl.h>
   52 
   53 #if USB_HAVE_UGEN
   54 #include <sys/sbuf.h>
   55 #endif
   56 
   57 #include "usbdevs.h"
   58 
   59 #define USB_DEBUG_VAR usb_debug
   60 
   61 #include <dev/usb/usb_core.h>
   62 #include <dev/usb/usb_debug.h>
   63 #include <dev/usb/usb_process.h>
   64 #include <dev/usb/usb_device.h>
   65 #include <dev/usb/usb_busdma.h>
   66 #include <dev/usb/usb_transfer.h>
   67 #include <dev/usb/usb_request.h>
   68 #include <dev/usb/usb_dynamic.h>
   69 #include <dev/usb/usb_hub.h>
   70 #include <dev/usb/usb_util.h>
   71 #include <dev/usb/usb_msctest.h>
   72 #if USB_HAVE_UGEN
   73 #include <dev/usb/usb_dev.h>
   74 #include <dev/usb/usb_generic.h>
   75 #endif
   76 
   77 #include <dev/usb/quirk/usb_quirk.h>
   78 
   79 #include <dev/usb/usb_controller.h>
   80 #include <dev/usb/usb_bus.h>
   81 
   82 /* function prototypes  */
   83 
   84 static void     usb_init_endpoint(struct usb_device *, uint8_t,
   85                     struct usb_endpoint_descriptor *,
   86                     struct usb_endpoint_ss_comp_descriptor *,
   87                     struct usb_endpoint *);
   88 static void     usb_unconfigure(struct usb_device *, uint8_t);
   89 static void     usb_detach_device_sub(struct usb_device *, device_t *,
   90                     char **, uint8_t);
   91 static uint8_t  usb_probe_and_attach_sub(struct usb_device *,
   92                     struct usb_attach_arg *);
   93 static void     usb_init_attach_arg(struct usb_device *,
   94                     struct usb_attach_arg *);
   95 static void     usb_suspend_resume_sub(struct usb_device *, device_t,
   96                     uint8_t);
   97 static void     usbd_clear_stall_proc(struct usb_proc_msg *_pm);
   98 static usb_error_t usb_config_parse(struct usb_device *, uint8_t, uint8_t);
   99 static void     usbd_set_device_strings(struct usb_device *);
  100 #if USB_HAVE_DEVCTL
  101 static void     usb_notify_addq(const char *type, struct usb_device *);
  102 #endif
  103 #if USB_HAVE_UGEN
  104 static void     usb_fifo_free_wrap(struct usb_device *, uint8_t, uint8_t);
  105 static void     usb_cdev_create(struct usb_device *);
  106 static void     usb_cdev_free(struct usb_device *);
  107 #endif
  108 
  109 /* This variable is global to allow easy access to it: */
  110 
  111 int     usb_template = 0;
  112 
  113 TUNABLE_INT("hw.usb.usb_template", &usb_template);
  114 SYSCTL_INT(_hw_usb, OID_AUTO, template, CTLFLAG_RW,
  115     &usb_template, 0, "Selected USB device side template");
  116 
  117 /* English is default language */
  118 
  119 static int usb_lang_id = 0x0009;
  120 static int usb_lang_mask = 0x00FF;
  121 
  122 TUNABLE_INT("hw.usb.usb_lang_id", &usb_lang_id);
  123 SYSCTL_INT(_hw_usb, OID_AUTO, usb_lang_id, CTLFLAG_RW,
  124     &usb_lang_id, 0, "Preferred USB language ID");
  125 
  126 TUNABLE_INT("hw.usb.usb_lang_mask", &usb_lang_mask);
  127 SYSCTL_INT(_hw_usb, OID_AUTO, usb_lang_mask, CTLFLAG_RW,
  128     &usb_lang_mask, 0, "Preferred USB language mask");
  129 
  130 static const char* statestr[USB_STATE_MAX] = {
  131         [USB_STATE_DETACHED]    = "DETACHED",
  132         [USB_STATE_ATTACHED]    = "ATTACHED",
  133         [USB_STATE_POWERED]     = "POWERED",
  134         [USB_STATE_ADDRESSED]   = "ADDRESSED",
  135         [USB_STATE_CONFIGURED]  = "CONFIGURED",
  136 };
  137 
  138 const char *
  139 usb_statestr(enum usb_dev_state state)
  140 {
  141         return ((state < USB_STATE_MAX) ? statestr[state] : "UNKNOWN");
  142 }
  143 
  144 const char *
  145 usb_get_manufacturer(struct usb_device *udev)
  146 {
  147         return (udev->manufacturer ? udev->manufacturer : "Unknown");
  148 }
  149 
  150 const char *
  151 usb_get_product(struct usb_device *udev)
  152 {
  153         return (udev->product ? udev->product : "");
  154 }
  155 
  156 const char *
  157 usb_get_serial(struct usb_device *udev)
  158 {
  159         return (udev->serial ? udev->serial : "");
  160 }
  161 
  162 /*------------------------------------------------------------------------*
  163  *      usbd_get_ep_by_addr
  164  *
  165  * This function searches for an USB ep by endpoint address and
  166  * direction.
  167  *
  168  * Returns:
  169  * NULL: Failure
  170  * Else: Success
  171  *------------------------------------------------------------------------*/
  172 struct usb_endpoint *
  173 usbd_get_ep_by_addr(struct usb_device *udev, uint8_t ea_val)
  174 {
  175         struct usb_endpoint *ep = udev->endpoints;
  176         struct usb_endpoint *ep_end = udev->endpoints + udev->endpoints_max;
  177         enum {
  178                 EA_MASK = (UE_DIR_IN | UE_DIR_OUT | UE_ADDR),
  179         };
  180 
  181         /*
  182          * According to the USB specification not all bits are used
  183          * for the endpoint address. Keep defined bits only:
  184          */
  185         ea_val &= EA_MASK;
  186 
  187         /*
  188          * Iterate accross all the USB endpoints searching for a match
  189          * based on the endpoint address:
  190          */
  191         for (; ep != ep_end; ep++) {
  192 
  193                 if (ep->edesc == NULL) {
  194                         continue;
  195                 }
  196                 /* do the mask and check the value */
  197                 if ((ep->edesc->bEndpointAddress & EA_MASK) == ea_val) {
  198                         goto found;
  199                 }
  200         }
  201 
  202         /*
  203          * The default endpoint is always present and is checked separately:
  204          */
  205         if ((udev->ctrl_ep.edesc) &&
  206             ((udev->ctrl_ep.edesc->bEndpointAddress & EA_MASK) == ea_val)) {
  207                 ep = &udev->ctrl_ep;
  208                 goto found;
  209         }
  210         return (NULL);
  211 
  212 found:
  213         return (ep);
  214 }
  215 
  216 /*------------------------------------------------------------------------*
  217  *      usbd_get_endpoint
  218  *
  219  * This function searches for an USB endpoint based on the information
  220  * given by the passed "struct usb_config" pointer.
  221  *
  222  * Return values:
  223  * NULL: No match.
  224  * Else: Pointer to "struct usb_endpoint".
  225  *------------------------------------------------------------------------*/
  226 struct usb_endpoint *
  227 usbd_get_endpoint(struct usb_device *udev, uint8_t iface_index,
  228     const struct usb_config *setup)
  229 {
  230         struct usb_endpoint *ep = udev->endpoints;
  231         struct usb_endpoint *ep_end = udev->endpoints + udev->endpoints_max;
  232         uint8_t index = setup->ep_index;
  233         uint8_t ea_mask;
  234         uint8_t ea_val;
  235         uint8_t type_mask;
  236         uint8_t type_val;
  237 
  238         DPRINTFN(10, "udev=%p iface_index=%d address=0x%x "
  239             "type=0x%x dir=0x%x index=%d\n",
  240             udev, iface_index, setup->endpoint,
  241             setup->type, setup->direction, setup->ep_index);
  242 
  243         /* check USB mode */
  244 
  245         if (setup->usb_mode != USB_MODE_DUAL &&
  246             udev->flags.usb_mode != setup->usb_mode) {
  247                 /* wrong mode - no endpoint */
  248                 return (NULL);
  249         }
  250 
  251         /* setup expected endpoint direction mask and value */
  252 
  253         if (setup->direction == UE_DIR_RX) {
  254                 ea_mask = (UE_DIR_IN | UE_DIR_OUT);
  255                 ea_val = (udev->flags.usb_mode == USB_MODE_DEVICE) ?
  256                     UE_DIR_OUT : UE_DIR_IN;
  257         } else if (setup->direction == UE_DIR_TX) {
  258                 ea_mask = (UE_DIR_IN | UE_DIR_OUT);
  259                 ea_val = (udev->flags.usb_mode == USB_MODE_DEVICE) ?
  260                     UE_DIR_IN : UE_DIR_OUT;
  261         } else if (setup->direction == UE_DIR_ANY) {
  262                 /* match any endpoint direction */
  263                 ea_mask = 0;
  264                 ea_val = 0;
  265         } else {
  266                 /* match the given endpoint direction */
  267                 ea_mask = (UE_DIR_IN | UE_DIR_OUT);
  268                 ea_val = (setup->direction & (UE_DIR_IN | UE_DIR_OUT));
  269         }
  270 
  271         /* setup expected endpoint address */
  272 
  273         if (setup->endpoint == UE_ADDR_ANY) {
  274                 /* match any endpoint address */
  275         } else {
  276                 /* match the given endpoint address */
  277                 ea_mask |= UE_ADDR;
  278                 ea_val |= (setup->endpoint & UE_ADDR);
  279         }
  280 
  281         /* setup expected endpoint type */
  282 
  283         if (setup->type == UE_BULK_INTR) {
  284                 /* this will match BULK and INTERRUPT endpoints */
  285                 type_mask = 2;
  286                 type_val = 2;
  287         } else if (setup->type == UE_TYPE_ANY) {
  288                 /* match any endpoint type */
  289                 type_mask = 0;
  290                 type_val = 0;
  291         } else {
  292                 /* match the given endpoint type */
  293                 type_mask = UE_XFERTYPE;
  294                 type_val = (setup->type & UE_XFERTYPE);
  295         }
  296 
  297         /*
  298          * Iterate accross all the USB endpoints searching for a match
  299          * based on the endpoint address. Note that we are searching
  300          * the endpoints from the beginning of the "udev->endpoints" array.
  301          */
  302         for (; ep != ep_end; ep++) {
  303 
  304                 if ((ep->edesc == NULL) ||
  305                     (ep->iface_index != iface_index)) {
  306                         continue;
  307                 }
  308                 /* do the masks and check the values */
  309 
  310                 if (((ep->edesc->bEndpointAddress & ea_mask) == ea_val) &&
  311                     ((ep->edesc->bmAttributes & type_mask) == type_val)) {
  312                         if (!index--) {
  313                                 goto found;
  314                         }
  315                 }
  316         }
  317 
  318         /*
  319          * Match against default endpoint last, so that "any endpoint", "any
  320          * address" and "any direction" returns the first endpoint of the
  321          * interface. "iface_index" and "direction" is ignored:
  322          */
  323         if ((udev->ctrl_ep.edesc) &&
  324             ((udev->ctrl_ep.edesc->bEndpointAddress & ea_mask) == ea_val) &&
  325             ((udev->ctrl_ep.edesc->bmAttributes & type_mask) == type_val) &&
  326             (!index)) {
  327                 ep = &udev->ctrl_ep;
  328                 goto found;
  329         }
  330         return (NULL);
  331 
  332 found:
  333         return (ep);
  334 }
  335 
  336 /*------------------------------------------------------------------------*
  337  *      usbd_interface_count
  338  *
  339  * This function stores the number of USB interfaces excluding
  340  * alternate settings, which the USB config descriptor reports into
  341  * the unsigned 8-bit integer pointed to by "count".
  342  *
  343  * Returns:
  344  *    0: Success
  345  * Else: Failure
  346  *------------------------------------------------------------------------*/
  347 usb_error_t
  348 usbd_interface_count(struct usb_device *udev, uint8_t *count)
  349 {
  350         if (udev->cdesc == NULL) {
  351                 *count = 0;
  352                 return (USB_ERR_NOT_CONFIGURED);
  353         }
  354         *count = udev->ifaces_max;
  355         return (USB_ERR_NORMAL_COMPLETION);
  356 }
  357 
  358 
  359 /*------------------------------------------------------------------------*
  360  *      usb_init_endpoint
  361  *
  362  * This function will initialise the USB endpoint structure pointed to by
  363  * the "endpoint" argument. The structure pointed to by "endpoint" must be
  364  * zeroed before calling this function.
  365  *------------------------------------------------------------------------*/
  366 static void
  367 usb_init_endpoint(struct usb_device *udev, uint8_t iface_index,
  368     struct usb_endpoint_descriptor *edesc,
  369     struct usb_endpoint_ss_comp_descriptor *ecomp,
  370     struct usb_endpoint *ep)
  371 {
  372         struct usb_bus_methods *methods;
  373 
  374         methods = udev->bus->methods;
  375 
  376         (methods->endpoint_init) (udev, edesc, ep);
  377 
  378         /* initialise USB endpoint structure */
  379         ep->edesc = edesc;
  380         ep->ecomp = ecomp;
  381         ep->iface_index = iface_index;
  382         TAILQ_INIT(&ep->endpoint_q.head);
  383         ep->endpoint_q.command = &usbd_pipe_start;
  384 
  385         /* the pipe is not supported by the hardware */
  386         if (ep->methods == NULL)
  387                 return;
  388 
  389         /* clear stall, if any */
  390         if (methods->clear_stall != NULL) {
  391                 USB_BUS_LOCK(udev->bus);
  392                 (methods->clear_stall) (udev, ep);
  393                 USB_BUS_UNLOCK(udev->bus);
  394         }
  395 }
  396 
  397 /*-----------------------------------------------------------------------*
  398  *      usb_endpoint_foreach
  399  *
  400  * This function will iterate all the USB endpoints except the control
  401  * endpoint. This function is NULL safe.
  402  *
  403  * Return values:
  404  * NULL: End of USB endpoints
  405  * Else: Pointer to next USB endpoint
  406  *------------------------------------------------------------------------*/
  407 struct usb_endpoint *
  408 usb_endpoint_foreach(struct usb_device *udev, struct usb_endpoint *ep)
  409 {
  410         struct usb_endpoint *ep_end;
  411 
  412         /* be NULL safe */
  413         if (udev == NULL)
  414                 return (NULL);
  415 
  416         ep_end = udev->endpoints + udev->endpoints_max;
  417 
  418         /* get next endpoint */
  419         if (ep == NULL)
  420                 ep = udev->endpoints;
  421         else
  422                 ep++;
  423 
  424         /* find next allocated ep */
  425         while (ep != ep_end) {
  426                 if (ep->edesc != NULL)
  427                         return (ep);
  428                 ep++;
  429         }
  430         return (NULL);
  431 }
  432 
  433 /*------------------------------------------------------------------------*
  434  *      usb_unconfigure
  435  *
  436  * This function will free all USB interfaces and USB endpoints belonging
  437  * to an USB device.
  438  *
  439  * Flag values, see "USB_UNCFG_FLAG_XXX".
  440  *------------------------------------------------------------------------*/
  441 static void
  442 usb_unconfigure(struct usb_device *udev, uint8_t flag)
  443 {
  444         uint8_t do_unlock;
  445 
  446         /* automatic locking */
  447         if (usbd_enum_is_locked(udev)) {
  448                 do_unlock = 0;
  449         } else {
  450                 do_unlock = 1;
  451                 usbd_enum_lock(udev);
  452         }
  453 
  454         /* detach all interface drivers */
  455         usb_detach_device(udev, USB_IFACE_INDEX_ANY, flag);
  456 
  457 #if USB_HAVE_UGEN
  458         /* free all FIFOs except control endpoint FIFOs */
  459         usb_fifo_free_wrap(udev, USB_IFACE_INDEX_ANY, flag);
  460 
  461         /*
  462          * Free all cdev's, if any.
  463          */
  464         usb_cdev_free(udev);
  465 #endif
  466 
  467 #if USB_HAVE_COMPAT_LINUX
  468         /* free Linux compat device, if any */
  469         if (udev->linux_endpoint_start) {
  470                 usb_linux_free_device(udev);
  471                 udev->linux_endpoint_start = NULL;
  472         }
  473 #endif
  474 
  475         usb_config_parse(udev, USB_IFACE_INDEX_ANY, USB_CFG_FREE);
  476 
  477         /* free "cdesc" after "ifaces" and "endpoints", if any */
  478         if (udev->cdesc != NULL) {
  479                 if (udev->flags.usb_mode != USB_MODE_DEVICE)
  480                         free(udev->cdesc, M_USB);
  481                 udev->cdesc = NULL;
  482         }
  483         /* set unconfigured state */
  484         udev->curr_config_no = USB_UNCONFIG_NO;
  485         udev->curr_config_index = USB_UNCONFIG_INDEX;
  486 
  487         if (do_unlock)
  488                 usbd_enum_unlock(udev);
  489 }
  490 
  491 /*------------------------------------------------------------------------*
  492  *      usbd_set_config_index
  493  *
  494  * This function selects configuration by index, independent of the
  495  * actual configuration number. This function should not be used by
  496  * USB drivers.
  497  *
  498  * Returns:
  499  *    0: Success
  500  * Else: Failure
  501  *------------------------------------------------------------------------*/
  502 usb_error_t
  503 usbd_set_config_index(struct usb_device *udev, uint8_t index)
  504 {
  505         struct usb_status ds;
  506         struct usb_config_descriptor *cdp;
  507         uint16_t power;
  508         uint16_t max_power;
  509         uint8_t selfpowered;
  510         uint8_t do_unlock;
  511         usb_error_t err;
  512 
  513         DPRINTFN(6, "udev=%p index=%d\n", udev, index);
  514 
  515         /* automatic locking */
  516         if (usbd_enum_is_locked(udev)) {
  517                 do_unlock = 0;
  518         } else {
  519                 do_unlock = 1;
  520                 usbd_enum_lock(udev);
  521         }
  522 
  523         usb_unconfigure(udev, 0);
  524 
  525         if (index == USB_UNCONFIG_INDEX) {
  526                 /*
  527                  * Leave unallocated when unconfiguring the
  528                  * device. "usb_unconfigure()" will also reset
  529                  * the current config number and index.
  530                  */
  531                 err = usbd_req_set_config(udev, NULL, USB_UNCONFIG_NO);
  532                 if (udev->state == USB_STATE_CONFIGURED)
  533                         usb_set_device_state(udev, USB_STATE_ADDRESSED);
  534                 goto done;
  535         }
  536         /* get the full config descriptor */
  537         if (udev->flags.usb_mode == USB_MODE_DEVICE) {
  538                 /* save some memory */
  539                 err = usbd_req_get_descriptor_ptr(udev, &cdp, 
  540                     (UDESC_CONFIG << 8) | index);
  541         } else {
  542                 /* normal request */
  543                 err = usbd_req_get_config_desc_full(udev,
  544                     NULL, &cdp, M_USB, index);
  545         }
  546         if (err) {
  547                 goto done;
  548         }
  549         /* set the new config descriptor */
  550 
  551         udev->cdesc = cdp;
  552 
  553         /* Figure out if the device is self or bus powered. */
  554         selfpowered = 0;
  555         if ((!udev->flags.uq_bus_powered) &&
  556             (cdp->bmAttributes & UC_SELF_POWERED) &&
  557             (udev->flags.usb_mode == USB_MODE_HOST)) {
  558                 /* May be self powered. */
  559                 if (cdp->bmAttributes & UC_BUS_POWERED) {
  560                         /* Must ask device. */
  561                         err = usbd_req_get_device_status(udev, NULL, &ds);
  562                         if (err) {
  563                                 DPRINTFN(0, "could not read "
  564                                     "device status: %s\n",
  565                                     usbd_errstr(err));
  566                         } else if (UGETW(ds.wStatus) & UDS_SELF_POWERED) {
  567                                 selfpowered = 1;
  568                         }
  569                         DPRINTF("status=0x%04x \n",
  570                                 UGETW(ds.wStatus));
  571                 } else
  572                         selfpowered = 1;
  573         }
  574         DPRINTF("udev=%p cdesc=%p (addr %d) cno=%d attr=0x%02x, "
  575             "selfpowered=%d, power=%d\n",
  576             udev, cdp,
  577             udev->address, cdp->bConfigurationValue, cdp->bmAttributes,
  578             selfpowered, cdp->bMaxPower * 2);
  579 
  580         /* Check if we have enough power. */
  581         power = cdp->bMaxPower * 2;
  582 
  583         if (udev->parent_hub) {
  584                 max_power = udev->parent_hub->hub->portpower;
  585         } else {
  586                 max_power = USB_MAX_POWER;
  587         }
  588 
  589         if (power > max_power) {
  590                 DPRINTFN(0, "power exceeded %d > %d\n", power, max_power);
  591                 err = USB_ERR_NO_POWER;
  592                 goto done;
  593         }
  594         /* Only update "self_powered" in USB Host Mode */
  595         if (udev->flags.usb_mode == USB_MODE_HOST) {
  596                 udev->flags.self_powered = selfpowered;
  597         }
  598         udev->power = power;
  599         udev->curr_config_no = cdp->bConfigurationValue;
  600         udev->curr_config_index = index;
  601         usb_set_device_state(udev, USB_STATE_CONFIGURED);
  602 
  603         /* Set the actual configuration value. */
  604         err = usbd_req_set_config(udev, NULL, cdp->bConfigurationValue);
  605         if (err) {
  606                 goto done;
  607         }
  608 
  609         err = usb_config_parse(udev, USB_IFACE_INDEX_ANY, USB_CFG_ALLOC);
  610         if (err) {
  611                 goto done;
  612         }
  613 
  614         err = usb_config_parse(udev, USB_IFACE_INDEX_ANY, USB_CFG_INIT);
  615         if (err) {
  616                 goto done;
  617         }
  618 
  619 #if USB_HAVE_UGEN
  620         /* create device nodes for each endpoint */
  621         usb_cdev_create(udev);
  622 #endif
  623 
  624 done:
  625         DPRINTF("error=%s\n", usbd_errstr(err));
  626         if (err) {
  627                 usb_unconfigure(udev, 0);
  628         }
  629         if (do_unlock)
  630                 usbd_enum_unlock(udev);
  631         return (err);
  632 }
  633 
  634 /*------------------------------------------------------------------------*
  635  *      usb_config_parse
  636  *
  637  * This function will allocate and free USB interfaces and USB endpoints,
  638  * parse the USB configuration structure and initialise the USB endpoints
  639  * and interfaces. If "iface_index" is not equal to
  640  * "USB_IFACE_INDEX_ANY" then the "cmd" parameter is the
  641  * alternate_setting to be selected for the given interface. Else the
  642  * "cmd" parameter is defined by "USB_CFG_XXX". "iface_index" can be
  643  * "USB_IFACE_INDEX_ANY" or a valid USB interface index. This function
  644  * is typically called when setting the configuration or when setting
  645  * an alternate interface.
  646  *
  647  * Returns:
  648  *    0: Success
  649  * Else: Failure
  650  *------------------------------------------------------------------------*/
  651 static usb_error_t
  652 usb_config_parse(struct usb_device *udev, uint8_t iface_index, uint8_t cmd)
  653 {
  654         struct usb_idesc_parse_state ips;
  655         struct usb_interface_descriptor *id;
  656         struct usb_endpoint_descriptor *ed;
  657         struct usb_interface *iface;
  658         struct usb_endpoint *ep;
  659         usb_error_t err;
  660         uint8_t ep_curr;
  661         uint8_t ep_max;
  662         uint8_t temp;
  663         uint8_t do_init;
  664         uint8_t alt_index;
  665 
  666         if (iface_index != USB_IFACE_INDEX_ANY) {
  667                 /* parameter overload */
  668                 alt_index = cmd;
  669                 cmd = USB_CFG_INIT;
  670         } else {
  671                 /* not used */
  672                 alt_index = 0;
  673         }
  674 
  675         err = 0;
  676 
  677         DPRINTFN(5, "iface_index=%d cmd=%d\n",
  678             iface_index, cmd);
  679 
  680         if (cmd == USB_CFG_FREE)
  681                 goto cleanup;
  682 
  683         if (cmd == USB_CFG_INIT) {
  684                 sx_assert(&udev->enum_sx, SA_LOCKED);
  685 
  686                 /* check for in-use endpoints */
  687 
  688                 ep = udev->endpoints;
  689                 ep_max = udev->endpoints_max;
  690                 while (ep_max--) {
  691                         /* look for matching endpoints */
  692                         if ((iface_index == USB_IFACE_INDEX_ANY) ||
  693                             (iface_index == ep->iface_index)) {
  694                                 if (ep->refcount_alloc != 0) {
  695                                         /*
  696                                          * This typically indicates a
  697                                          * more serious error.
  698                                          */
  699                                         err = USB_ERR_IN_USE;
  700                                 } else {
  701                                         /* reset endpoint */
  702                                         memset(ep, 0, sizeof(*ep));
  703                                         /* make sure we don't zero the endpoint again */
  704                                         ep->iface_index = USB_IFACE_INDEX_ANY;
  705                                 }
  706                         }
  707                         ep++;
  708                 }
  709 
  710                 if (err)
  711                         return (err);
  712         }
  713 
  714         memset(&ips, 0, sizeof(ips));
  715 
  716         ep_curr = 0;
  717         ep_max = 0;
  718 
  719         while ((id = usb_idesc_foreach(udev->cdesc, &ips))) {
  720 
  721                 /* check for interface overflow */
  722                 if (ips.iface_index == USB_IFACE_MAX)
  723                         break;                  /* crazy */
  724 
  725                 iface = udev->ifaces + ips.iface_index;
  726 
  727                 /* check for specific interface match */
  728 
  729                 if (cmd == USB_CFG_INIT) {
  730                         if ((iface_index != USB_IFACE_INDEX_ANY) && 
  731                             (iface_index != ips.iface_index)) {
  732                                 /* wrong interface */
  733                                 do_init = 0;
  734                         } else if (alt_index != ips.iface_index_alt) {
  735                                 /* wrong alternate setting */
  736                                 do_init = 0;
  737                         } else {
  738                                 /* initialise interface */
  739                                 do_init = 1;
  740                         }
  741                 } else
  742                         do_init = 0;
  743 
  744                 /* check for new interface */
  745                 if (ips.iface_index_alt == 0) {
  746                         /* update current number of endpoints */
  747                         ep_curr = ep_max;
  748                 }
  749                 /* check for init */
  750                 if (do_init) {
  751                         /* setup the USB interface structure */
  752                         iface->idesc = id;
  753                         /* default setting */
  754                         iface->parent_iface_index = USB_IFACE_INDEX_ANY;
  755                         /* set alternate index */
  756                         iface->alt_index = alt_index;
  757                 }
  758 
  759                 DPRINTFN(5, "found idesc nendpt=%d\n", id->bNumEndpoints);
  760 
  761                 ed = (struct usb_endpoint_descriptor *)id;
  762 
  763                 temp = ep_curr;
  764 
  765                 /* iterate all the endpoint descriptors */
  766                 while ((ed = usb_edesc_foreach(udev->cdesc, ed))) {
  767 
  768                         if (temp == USB_EP_MAX)
  769                                 break;                  /* crazy */
  770 
  771                         ep = udev->endpoints + temp;
  772 
  773                         if (do_init) {
  774                                 void *ecomp;
  775 
  776                                 ecomp = usb_ed_comp_foreach(udev->cdesc, (void *)ed);
  777                                 if (ecomp != NULL)
  778                                         DPRINTFN(5, "Found endpoint companion descriptor\n");
  779 
  780                                 usb_init_endpoint(udev, 
  781                                     ips.iface_index, ed, ecomp, ep);
  782                         }
  783 
  784                         temp ++;
  785 
  786                         /* find maximum number of endpoints */
  787                         if (ep_max < temp)
  788                                 ep_max = temp;
  789 
  790                         /* optimalisation */
  791                         id = (struct usb_interface_descriptor *)ed;
  792                 }
  793         }
  794 
  795         /* NOTE: It is valid to have no interfaces and no endpoints! */
  796 
  797         if (cmd == USB_CFG_ALLOC) {
  798                 udev->ifaces_max = ips.iface_index;
  799                 udev->ifaces = NULL;
  800                 if (udev->ifaces_max != 0) {
  801                         udev->ifaces = malloc(sizeof(*iface) * udev->ifaces_max,
  802                                 M_USB, M_WAITOK | M_ZERO);
  803                         if (udev->ifaces == NULL) {
  804                                 err = USB_ERR_NOMEM;
  805                                 goto done;
  806                         }
  807                 }
  808                 if (ep_max != 0) {
  809                         udev->endpoints = malloc(sizeof(*ep) * ep_max,
  810                                 M_USB, M_WAITOK | M_ZERO);
  811                         if (udev->endpoints == NULL) {
  812                                 err = USB_ERR_NOMEM;
  813                                 goto done;
  814                         }
  815                 } else {
  816                         udev->endpoints = NULL;
  817                 }
  818                 USB_BUS_LOCK(udev->bus);
  819                 udev->endpoints_max = ep_max;
  820                 /* reset any ongoing clear-stall */
  821                 udev->ep_curr = NULL;
  822                 USB_BUS_UNLOCK(udev->bus);
  823         }
  824 
  825 done:
  826         if (err) {
  827                 if (cmd == USB_CFG_ALLOC) {
  828 cleanup:
  829                         USB_BUS_LOCK(udev->bus);
  830                         udev->endpoints_max = 0;
  831                         /* reset any ongoing clear-stall */
  832                         udev->ep_curr = NULL;
  833                         USB_BUS_UNLOCK(udev->bus);
  834 
  835                         /* cleanup */
  836                         if (udev->ifaces != NULL)
  837                                 free(udev->ifaces, M_USB);
  838                         if (udev->endpoints != NULL)
  839                                 free(udev->endpoints, M_USB);
  840 
  841                         udev->ifaces = NULL;
  842                         udev->endpoints = NULL;
  843                         udev->ifaces_max = 0;
  844                 }
  845         }
  846         return (err);
  847 }
  848 
  849 /*------------------------------------------------------------------------*
  850  *      usbd_set_alt_interface_index
  851  *
  852  * This function will select an alternate interface index for the
  853  * given interface index. The interface should not be in use when this
  854  * function is called. That means there should not be any open USB
  855  * transfers. Else an error is returned. If the alternate setting is
  856  * already set this function will simply return success. This function
  857  * is called in Host mode and Device mode!
  858  *
  859  * Returns:
  860  *    0: Success
  861  * Else: Failure
  862  *------------------------------------------------------------------------*/
  863 usb_error_t
  864 usbd_set_alt_interface_index(struct usb_device *udev,
  865     uint8_t iface_index, uint8_t alt_index)
  866 {
  867         struct usb_interface *iface = usbd_get_iface(udev, iface_index);
  868         usb_error_t err;
  869         uint8_t do_unlock;
  870 
  871         /* automatic locking */
  872         if (usbd_enum_is_locked(udev)) {
  873                 do_unlock = 0;
  874         } else {
  875                 do_unlock = 1;
  876                 usbd_enum_lock(udev);
  877         }
  878         if (iface == NULL) {
  879                 err = USB_ERR_INVAL;
  880                 goto done;
  881         }
  882         if (iface->alt_index == alt_index) {
  883                 /* 
  884                  * Optimise away duplicate setting of
  885                  * alternate setting in USB Host Mode!
  886                  */
  887                 err = 0;
  888                 goto done;
  889         }
  890 #if USB_HAVE_UGEN
  891         /*
  892          * Free all generic FIFOs for this interface, except control
  893          * endpoint FIFOs:
  894          */
  895         usb_fifo_free_wrap(udev, iface_index, 0);
  896 #endif
  897 
  898         err = usb_config_parse(udev, iface_index, alt_index);
  899         if (err) {
  900                 goto done;
  901         }
  902         if (iface->alt_index != alt_index) {
  903                 /* the alternate setting does not exist */
  904                 err = USB_ERR_INVAL;
  905                 goto done;
  906         }
  907 
  908         err = usbd_req_set_alt_interface_no(udev, NULL, iface_index,
  909             iface->idesc->bAlternateSetting);
  910 
  911 done:
  912         if (do_unlock)
  913                 usbd_enum_unlock(udev);
  914 
  915         return (err);
  916 }
  917 
  918 /*------------------------------------------------------------------------*
  919  *      usbd_set_endpoint_stall
  920  *
  921  * This function is used to make a BULK or INTERRUPT endpoint send
  922  * STALL tokens in USB device mode.
  923  *
  924  * Returns:
  925  *    0: Success
  926  * Else: Failure
  927  *------------------------------------------------------------------------*/
  928 usb_error_t
  929 usbd_set_endpoint_stall(struct usb_device *udev, struct usb_endpoint *ep,
  930     uint8_t do_stall)
  931 {
  932         struct usb_xfer *xfer;
  933         uint8_t et;
  934         uint8_t was_stalled;
  935 
  936         if (ep == NULL) {
  937                 /* nothing to do */
  938                 DPRINTF("Cannot find endpoint\n");
  939                 /*
  940                  * Pretend that the clear or set stall request is
  941                  * successful else some USB host stacks can do
  942                  * strange things, especially when a control endpoint
  943                  * stalls.
  944                  */
  945                 return (0);
  946         }
  947         et = (ep->edesc->bmAttributes & UE_XFERTYPE);
  948 
  949         if ((et != UE_BULK) &&
  950             (et != UE_INTERRUPT)) {
  951                 /*
  952                  * Should not stall control
  953                  * nor isochronous endpoints.
  954                  */
  955                 DPRINTF("Invalid endpoint\n");
  956                 return (0);
  957         }
  958         USB_BUS_LOCK(udev->bus);
  959 
  960         /* store current stall state */
  961         was_stalled = ep->is_stalled;
  962 
  963         /* check for no change */
  964         if (was_stalled && do_stall) {
  965                 /* if the endpoint is already stalled do nothing */
  966                 USB_BUS_UNLOCK(udev->bus);
  967                 DPRINTF("No change\n");
  968                 return (0);
  969         }
  970         /* set stalled state */
  971         ep->is_stalled = 1;
  972 
  973         if (do_stall || (!was_stalled)) {
  974                 if (!was_stalled) {
  975                         /* lookup the current USB transfer, if any */
  976                         xfer = ep->endpoint_q.curr;
  977                 } else {
  978                         xfer = NULL;
  979                 }
  980 
  981                 /*
  982                  * If "xfer" is non-NULL the "set_stall" method will
  983                  * complete the USB transfer like in case of a timeout
  984                  * setting the error code "USB_ERR_STALLED".
  985                  */
  986                 (udev->bus->methods->set_stall) (udev, xfer, ep, &do_stall);
  987         }
  988         if (!do_stall) {
  989                 ep->toggle_next = 0;    /* reset data toggle */
  990                 ep->is_stalled = 0;     /* clear stalled state */
  991 
  992                 (udev->bus->methods->clear_stall) (udev, ep);
  993 
  994                 /* start up the current or next transfer, if any */
  995                 usb_command_wrapper(&ep->endpoint_q, ep->endpoint_q.curr);
  996         }
  997         USB_BUS_UNLOCK(udev->bus);
  998         return (0);
  999 }
 1000 
 1001 /*------------------------------------------------------------------------*
 1002  *      usb_reset_iface_endpoints - used in USB device side mode
 1003  *------------------------------------------------------------------------*/
 1004 usb_error_t
 1005 usb_reset_iface_endpoints(struct usb_device *udev, uint8_t iface_index)
 1006 {
 1007         struct usb_endpoint *ep;
 1008         struct usb_endpoint *ep_end;
 1009 
 1010         ep = udev->endpoints;
 1011         ep_end = udev->endpoints + udev->endpoints_max;
 1012 
 1013         for (; ep != ep_end; ep++) {
 1014 
 1015                 if ((ep->edesc == NULL) ||
 1016                     (ep->iface_index != iface_index)) {
 1017                         continue;
 1018                 }
 1019                 /* simulate a clear stall from the peer */
 1020                 usbd_set_endpoint_stall(udev, ep, 0);
 1021         }
 1022         return (0);
 1023 }
 1024 
 1025 /*------------------------------------------------------------------------*
 1026  *      usb_detach_device_sub
 1027  *
 1028  * This function will try to detach an USB device. If it fails a panic
 1029  * will result.
 1030  *
 1031  * Flag values, see "USB_UNCFG_FLAG_XXX".
 1032  *------------------------------------------------------------------------*/
 1033 static void
 1034 usb_detach_device_sub(struct usb_device *udev, device_t *ppdev,
 1035     char **ppnpinfo, uint8_t flag)
 1036 {
 1037         device_t dev;
 1038         char *pnpinfo;
 1039         int err;
 1040 
 1041         dev = *ppdev;
 1042         if (dev) {
 1043                 /*
 1044                  * NOTE: It is important to clear "*ppdev" before deleting
 1045                  * the child due to some device methods being called late
 1046                  * during the delete process !
 1047                  */
 1048                 *ppdev = NULL;
 1049 
 1050                 device_printf(dev, "at %s, port %d, addr %d "
 1051                     "(disconnected)\n",
 1052                     device_get_nameunit(udev->parent_dev),
 1053                     udev->port_no, udev->address);
 1054 
 1055                 if (device_is_attached(dev)) {
 1056                         if (udev->flags.peer_suspended) {
 1057                                 err = DEVICE_RESUME(dev);
 1058                                 if (err) {
 1059                                         device_printf(dev, "Resume failed\n");
 1060                                 }
 1061                         }
 1062                         if (device_detach(dev)) {
 1063                                 goto error;
 1064                         }
 1065                 }
 1066                 if (device_delete_child(udev->parent_dev, dev)) {
 1067                         goto error;
 1068                 }
 1069         }
 1070 
 1071         pnpinfo = *ppnpinfo;
 1072         if (pnpinfo != NULL) {
 1073                 *ppnpinfo = NULL;
 1074                 free(pnpinfo, M_USBDEV);
 1075         }
 1076         return;
 1077 
 1078 error:
 1079         /* Detach is not allowed to fail in the USB world */
 1080         panic("usb_detach_device_sub: A USB driver would not detach\n");
 1081 }
 1082 
 1083 /*------------------------------------------------------------------------*
 1084  *      usb_detach_device
 1085  *
 1086  * The following function will detach the matching interfaces.
 1087  * This function is NULL safe.
 1088  *
 1089  * Flag values, see "USB_UNCFG_FLAG_XXX".
 1090  *------------------------------------------------------------------------*/
 1091 void
 1092 usb_detach_device(struct usb_device *udev, uint8_t iface_index,
 1093     uint8_t flag)
 1094 {
 1095         struct usb_interface *iface;
 1096         uint8_t i;
 1097 
 1098         if (udev == NULL) {
 1099                 /* nothing to do */
 1100                 return;
 1101         }
 1102         DPRINTFN(4, "udev=%p\n", udev);
 1103 
 1104         sx_assert(&udev->enum_sx, SA_LOCKED);
 1105 
 1106         /*
 1107          * First detach the child to give the child's detach routine a
 1108          * chance to detach the sub-devices in the correct order.
 1109          * Then delete the child using "device_delete_child()" which
 1110          * will detach all sub-devices from the bottom and upwards!
 1111          */
 1112         if (iface_index != USB_IFACE_INDEX_ANY) {
 1113                 i = iface_index;
 1114                 iface_index = i + 1;
 1115         } else {
 1116                 i = 0;
 1117                 iface_index = USB_IFACE_MAX;
 1118         }
 1119 
 1120         /* do the detach */
 1121 
 1122         for (; i != iface_index; i++) {
 1123 
 1124                 iface = usbd_get_iface(udev, i);
 1125                 if (iface == NULL) {
 1126                         /* looks like the end of the USB interfaces */
 1127                         break;
 1128                 }
 1129                 usb_detach_device_sub(udev, &iface->subdev,
 1130                     &iface->pnpinfo, flag);
 1131         }
 1132 }
 1133 
 1134 /*------------------------------------------------------------------------*
 1135  *      usb_probe_and_attach_sub
 1136  *
 1137  * Returns:
 1138  *    0: Success
 1139  * Else: Failure
 1140  *------------------------------------------------------------------------*/
 1141 static uint8_t
 1142 usb_probe_and_attach_sub(struct usb_device *udev,
 1143     struct usb_attach_arg *uaa)
 1144 {
 1145         struct usb_interface *iface;
 1146         device_t dev;
 1147         int err;
 1148 
 1149         iface = uaa->iface;
 1150         if (iface->parent_iface_index != USB_IFACE_INDEX_ANY) {
 1151                 /* leave interface alone */
 1152                 return (0);
 1153         }
 1154         dev = iface->subdev;
 1155         if (dev) {
 1156 
 1157                 /* clean up after module unload */
 1158 
 1159                 if (device_is_attached(dev)) {
 1160                         /* already a device there */
 1161                         return (0);
 1162                 }
 1163                 /* clear "iface->subdev" as early as possible */
 1164 
 1165                 iface->subdev = NULL;
 1166 
 1167                 if (device_delete_child(udev->parent_dev, dev)) {
 1168 
 1169                         /*
 1170                          * Panic here, else one can get a double call
 1171                          * to device_detach().  USB devices should
 1172                          * never fail on detach!
 1173                          */
 1174                         panic("device_delete_child() failed\n");
 1175                 }
 1176         }
 1177         if (uaa->temp_dev == NULL) {
 1178 
 1179                 /* create a new child */
 1180                 uaa->temp_dev = device_add_child(udev->parent_dev, NULL, -1);
 1181                 if (uaa->temp_dev == NULL) {
 1182                         device_printf(udev->parent_dev,
 1183                             "Device creation failed\n");
 1184                         return (1);     /* failure */
 1185                 }
 1186                 device_set_ivars(uaa->temp_dev, uaa);
 1187                 device_quiet(uaa->temp_dev);
 1188         }
 1189         /*
 1190          * Set "subdev" before probe and attach so that "devd" gets
 1191          * the information it needs.
 1192          */
 1193         iface->subdev = uaa->temp_dev;
 1194 
 1195         if (device_probe_and_attach(iface->subdev) == 0) {
 1196                 /*
 1197                  * The USB attach arguments are only available during probe
 1198                  * and attach !
 1199                  */
 1200                 uaa->temp_dev = NULL;
 1201                 device_set_ivars(iface->subdev, NULL);
 1202 
 1203                 if (udev->flags.peer_suspended) {
 1204                         err = DEVICE_SUSPEND(iface->subdev);
 1205                         if (err)
 1206                                 device_printf(iface->subdev, "Suspend failed\n");
 1207                 }
 1208                 return (0);             /* success */
 1209         } else {
 1210                 /* No USB driver found */
 1211                 iface->subdev = NULL;
 1212         }
 1213         return (1);                     /* failure */
 1214 }
 1215 
 1216 /*------------------------------------------------------------------------*
 1217  *      usbd_set_parent_iface
 1218  *
 1219  * Using this function will lock the alternate interface setting on an
 1220  * interface. It is typically used for multi interface drivers. In USB
 1221  * device side mode it is assumed that the alternate interfaces all
 1222  * have the same endpoint descriptors. The default parent index value
 1223  * is "USB_IFACE_INDEX_ANY". Then the alternate setting value is not
 1224  * locked.
 1225  *------------------------------------------------------------------------*/
 1226 void
 1227 usbd_set_parent_iface(struct usb_device *udev, uint8_t iface_index,
 1228     uint8_t parent_index)
 1229 {
 1230         struct usb_interface *iface;
 1231 
 1232         iface = usbd_get_iface(udev, iface_index);
 1233         if (iface) {
 1234                 iface->parent_iface_index = parent_index;
 1235         }
 1236 }
 1237 
 1238 static void
 1239 usb_init_attach_arg(struct usb_device *udev,
 1240     struct usb_attach_arg *uaa)
 1241 {
 1242         memset(uaa, 0, sizeof(*uaa));
 1243 
 1244         uaa->device = udev;
 1245         uaa->usb_mode = udev->flags.usb_mode;
 1246         uaa->port = udev->port_no;
 1247         uaa->dev_state = UAA_DEV_READY;
 1248 
 1249         uaa->info.idVendor = UGETW(udev->ddesc.idVendor);
 1250         uaa->info.idProduct = UGETW(udev->ddesc.idProduct);
 1251         uaa->info.bcdDevice = UGETW(udev->ddesc.bcdDevice);
 1252         uaa->info.bDeviceClass = udev->ddesc.bDeviceClass;
 1253         uaa->info.bDeviceSubClass = udev->ddesc.bDeviceSubClass;
 1254         uaa->info.bDeviceProtocol = udev->ddesc.bDeviceProtocol;
 1255         uaa->info.bConfigIndex = udev->curr_config_index;
 1256         uaa->info.bConfigNum = udev->curr_config_no;
 1257 }
 1258 
 1259 /*------------------------------------------------------------------------*
 1260  *      usb_probe_and_attach
 1261  *
 1262  * This function is called from "uhub_explore_sub()",
 1263  * "usb_handle_set_config()" and "usb_handle_request()".
 1264  *
 1265  * Returns:
 1266  *    0: Success
 1267  * Else: A control transfer failed
 1268  *------------------------------------------------------------------------*/
 1269 usb_error_t
 1270 usb_probe_and_attach(struct usb_device *udev, uint8_t iface_index)
 1271 {
 1272         struct usb_attach_arg uaa;
 1273         struct usb_interface *iface;
 1274         uint8_t i;
 1275         uint8_t j;
 1276         uint8_t do_unlock;
 1277 
 1278         if (udev == NULL) {
 1279                 DPRINTF("udev == NULL\n");
 1280                 return (USB_ERR_INVAL);
 1281         }
 1282         /* automatic locking */
 1283         if (usbd_enum_is_locked(udev)) {
 1284                 do_unlock = 0;
 1285         } else {
 1286                 do_unlock = 1;
 1287                 usbd_enum_lock(udev);
 1288         }
 1289 
 1290         if (udev->curr_config_index == USB_UNCONFIG_INDEX) {
 1291                 /* do nothing - no configuration has been set */
 1292                 goto done;
 1293         }
 1294         /* setup USB attach arguments */
 1295 
 1296         usb_init_attach_arg(udev, &uaa);
 1297 
 1298         /*
 1299          * If the whole USB device is targeted, invoke the USB event
 1300          * handler(s):
 1301          */
 1302         if (iface_index == USB_IFACE_INDEX_ANY) {
 1303 
 1304                 EVENTHANDLER_INVOKE(usb_dev_configured, udev, &uaa);
 1305 
 1306                 if (uaa.dev_state != UAA_DEV_READY) {
 1307                         /* leave device unconfigured */
 1308                         usb_unconfigure(udev, 0);
 1309                         goto done;
 1310                 }
 1311         }
 1312 
 1313         /* Check if only one interface should be probed: */
 1314         if (iface_index != USB_IFACE_INDEX_ANY) {
 1315                 i = iface_index;
 1316                 j = i + 1;
 1317         } else {
 1318                 i = 0;
 1319                 j = USB_IFACE_MAX;
 1320         }
 1321 
 1322         /* Do the probe and attach */
 1323         for (; i != j; i++) {
 1324 
 1325                 iface = usbd_get_iface(udev, i);
 1326                 if (iface == NULL) {
 1327                         /*
 1328                          * Looks like the end of the USB
 1329                          * interfaces !
 1330                          */
 1331                         DPRINTFN(2, "end of interfaces "
 1332                             "at %u\n", i);
 1333                         break;
 1334                 }
 1335                 if (iface->idesc == NULL) {
 1336                         /* no interface descriptor */
 1337                         continue;
 1338                 }
 1339                 uaa.iface = iface;
 1340 
 1341                 uaa.info.bInterfaceClass =
 1342                     iface->idesc->bInterfaceClass;
 1343                 uaa.info.bInterfaceSubClass =
 1344                     iface->idesc->bInterfaceSubClass;
 1345                 uaa.info.bInterfaceProtocol =
 1346                     iface->idesc->bInterfaceProtocol;
 1347                 uaa.info.bIfaceIndex = i;
 1348                 uaa.info.bIfaceNum =
 1349                     iface->idesc->bInterfaceNumber;
 1350                 uaa.driver_info = 0;    /* reset driver_info */
 1351 
 1352                 DPRINTFN(2, "iclass=%u/%u/%u iindex=%u/%u\n",
 1353                     uaa.info.bInterfaceClass,
 1354                     uaa.info.bInterfaceSubClass,
 1355                     uaa.info.bInterfaceProtocol,
 1356                     uaa.info.bIfaceIndex,
 1357                     uaa.info.bIfaceNum);
 1358 
 1359                 usb_probe_and_attach_sub(udev, &uaa);
 1360 
 1361                 /*
 1362                  * Remove the leftover child, if any, to enforce that
 1363                  * a new nomatch devd event is generated for the next
 1364                  * interface if no driver is found:
 1365                  */
 1366                 if (uaa.temp_dev == NULL)
 1367                         continue;
 1368                 if (device_delete_child(udev->parent_dev, uaa.temp_dev))
 1369                         DPRINTFN(0, "device delete child failed\n");
 1370                 uaa.temp_dev = NULL;
 1371         }
 1372 done:
 1373         if (do_unlock)
 1374                 usbd_enum_unlock(udev);
 1375 
 1376         return (0);
 1377 }
 1378 
 1379 /*------------------------------------------------------------------------*
 1380  *      usb_suspend_resume_sub
 1381  *
 1382  * This function is called when the suspend or resume methods should
 1383  * be executed on an USB device.
 1384  *------------------------------------------------------------------------*/
 1385 static void
 1386 usb_suspend_resume_sub(struct usb_device *udev, device_t dev, uint8_t do_suspend)
 1387 {
 1388         int err;
 1389 
 1390         if (dev == NULL) {
 1391                 return;
 1392         }
 1393         if (!device_is_attached(dev)) {
 1394                 return;
 1395         }
 1396         if (do_suspend) {
 1397                 err = DEVICE_SUSPEND(dev);
 1398         } else {
 1399                 err = DEVICE_RESUME(dev);
 1400         }
 1401         if (err) {
 1402                 device_printf(dev, "%s failed\n",
 1403                     do_suspend ? "Suspend" : "Resume");
 1404         }
 1405 }
 1406 
 1407 /*------------------------------------------------------------------------*
 1408  *      usb_suspend_resume
 1409  *
 1410  * The following function will suspend or resume the USB device.
 1411  *
 1412  * Returns:
 1413  *    0: Success
 1414  * Else: Failure
 1415  *------------------------------------------------------------------------*/
 1416 usb_error_t
 1417 usb_suspend_resume(struct usb_device *udev, uint8_t do_suspend)
 1418 {
 1419         struct usb_interface *iface;
 1420         uint8_t i;
 1421 
 1422         if (udev == NULL) {
 1423                 /* nothing to do */
 1424                 return (0);
 1425         }
 1426         DPRINTFN(4, "udev=%p do_suspend=%d\n", udev, do_suspend);
 1427 
 1428         sx_assert(&udev->sr_sx, SA_LOCKED);
 1429 
 1430         USB_BUS_LOCK(udev->bus);
 1431         /* filter the suspend events */
 1432         if (udev->flags.peer_suspended == do_suspend) {
 1433                 USB_BUS_UNLOCK(udev->bus);
 1434                 /* nothing to do */
 1435                 return (0);
 1436         }
 1437         udev->flags.peer_suspended = do_suspend;
 1438         USB_BUS_UNLOCK(udev->bus);
 1439 
 1440         /* do the suspend or resume */
 1441 
 1442         for (i = 0; i != USB_IFACE_MAX; i++) {
 1443 
 1444                 iface = usbd_get_iface(udev, i);
 1445                 if (iface == NULL) {
 1446                         /* looks like the end of the USB interfaces */
 1447                         break;
 1448                 }
 1449                 usb_suspend_resume_sub(udev, iface->subdev, do_suspend);
 1450         }
 1451         return (0);
 1452 }
 1453 
 1454 /*------------------------------------------------------------------------*
 1455  *      usbd_clear_stall_proc
 1456  *
 1457  * This function performs generic USB clear stall operations.
 1458  *------------------------------------------------------------------------*/
 1459 static void
 1460 usbd_clear_stall_proc(struct usb_proc_msg *_pm)
 1461 {
 1462         struct usb_clear_stall_msg *pm = (void *)_pm;
 1463         struct usb_device *udev = pm->udev;
 1464 
 1465         /* Change lock */
 1466         USB_BUS_UNLOCK(udev->bus);
 1467         mtx_lock(&udev->device_mtx);
 1468 
 1469         /* Start clear stall callback */
 1470         usbd_transfer_start(udev->ctrl_xfer[1]);
 1471 
 1472         /* Change lock */
 1473         mtx_unlock(&udev->device_mtx);
 1474         USB_BUS_LOCK(udev->bus);
 1475 }
 1476 
 1477 /*------------------------------------------------------------------------*
 1478  *      usb_alloc_device
 1479  *
 1480  * This function allocates a new USB device. This function is called
 1481  * when a new device has been put in the powered state, but not yet in
 1482  * the addressed state. Get initial descriptor, set the address, get
 1483  * full descriptor and get strings.
 1484  *
 1485  * Return values:
 1486  *    0: Failure
 1487  * Else: Success
 1488  *------------------------------------------------------------------------*/
 1489 struct usb_device *
 1490 usb_alloc_device(device_t parent_dev, struct usb_bus *bus,
 1491     struct usb_device *parent_hub, uint8_t depth, uint8_t port_index,
 1492     uint8_t port_no, enum usb_dev_speed speed, enum usb_hc_mode mode)
 1493 {
 1494         struct usb_attach_arg uaa;
 1495         struct usb_device *udev;
 1496         struct usb_device *adev;
 1497         struct usb_device *hub;
 1498         uint8_t *scratch_ptr;
 1499         size_t scratch_size;
 1500         usb_error_t err;
 1501         uint8_t device_index;
 1502         uint8_t config_index;
 1503         uint8_t config_quirk;
 1504         uint8_t set_config_failed;
 1505 
 1506         DPRINTF("parent_dev=%p, bus=%p, parent_hub=%p, depth=%u, "
 1507             "port_index=%u, port_no=%u, speed=%u, usb_mode=%u\n",
 1508             parent_dev, bus, parent_hub, depth, port_index, port_no,
 1509             speed, mode);
 1510 
 1511         /*
 1512          * Find an unused device index. In USB Host mode this is the
 1513          * same as the device address.
 1514          *
 1515          * Device index zero is not used and device index 1 should
 1516          * always be the root hub.
 1517          */
 1518         for (device_index = USB_ROOT_HUB_ADDR;
 1519             (device_index != bus->devices_max) &&
 1520             (bus->devices[device_index] != NULL);
 1521             device_index++) /* nop */;
 1522 
 1523         if (device_index == bus->devices_max) {
 1524                 device_printf(bus->bdev,
 1525                     "No free USB device index for new device\n");
 1526                 return (NULL);
 1527         }
 1528 
 1529         if (depth > 0x10) {
 1530                 device_printf(bus->bdev,
 1531                     "Invalid device depth\n");
 1532                 return (NULL);
 1533         }
 1534         udev = malloc(sizeof(*udev), M_USB, M_WAITOK | M_ZERO);
 1535         if (udev == NULL) {
 1536                 return (NULL);
 1537         }
 1538         /* initialise our SX-lock */
 1539         sx_init_flags(&udev->ctrl_sx, "USB device SX lock", SX_DUPOK);
 1540 
 1541         /* initialise our SX-lock */
 1542         sx_init_flags(&udev->enum_sx, "USB config SX lock", SX_DUPOK);
 1543         sx_init_flags(&udev->sr_sx, "USB suspend and resume SX lock", SX_NOWITNESS);
 1544 
 1545         cv_init(&udev->ctrlreq_cv, "WCTRL");
 1546         cv_init(&udev->ref_cv, "UGONE");
 1547 
 1548         /* initialise our mutex */
 1549         mtx_init(&udev->device_mtx, "USB device mutex", NULL, MTX_DEF);
 1550 
 1551         /* initialise generic clear stall */
 1552         udev->cs_msg[0].hdr.pm_callback = &usbd_clear_stall_proc;
 1553         udev->cs_msg[0].udev = udev;
 1554         udev->cs_msg[1].hdr.pm_callback = &usbd_clear_stall_proc;
 1555         udev->cs_msg[1].udev = udev;
 1556 
 1557         /* initialise some USB device fields */
 1558         udev->parent_hub = parent_hub;
 1559         udev->parent_dev = parent_dev;
 1560         udev->port_index = port_index;
 1561         udev->port_no = port_no;
 1562         udev->depth = depth;
 1563         udev->bus = bus;
 1564         udev->address = USB_START_ADDR; /* default value */
 1565         udev->plugtime = (usb_ticks_t)ticks;
 1566         /*
 1567          * We need to force the power mode to "on" because there are plenty
 1568          * of USB devices out there that do not work very well with
 1569          * automatic suspend and resume!
 1570          */
 1571         udev->power_mode = usbd_filter_power_mode(udev, USB_POWER_MODE_ON);
 1572         udev->pwr_save.last_xfer_time = ticks;
 1573         /* we are not ready yet */
 1574         udev->refcount = 1;
 1575 
 1576         /* set up default endpoint descriptor */
 1577         udev->ctrl_ep_desc.bLength = sizeof(udev->ctrl_ep_desc);
 1578         udev->ctrl_ep_desc.bDescriptorType = UDESC_ENDPOINT;
 1579         udev->ctrl_ep_desc.bEndpointAddress = USB_CONTROL_ENDPOINT;
 1580         udev->ctrl_ep_desc.bmAttributes = UE_CONTROL;
 1581         udev->ctrl_ep_desc.wMaxPacketSize[0] = USB_MAX_IPACKET;
 1582         udev->ctrl_ep_desc.wMaxPacketSize[1] = 0;
 1583         udev->ctrl_ep_desc.bInterval = 0;
 1584 
 1585         /* set up default endpoint companion descriptor */
 1586         udev->ctrl_ep_comp_desc.bLength = sizeof(udev->ctrl_ep_comp_desc);
 1587         udev->ctrl_ep_comp_desc.bDescriptorType = UDESC_ENDPOINT_SS_COMP;
 1588 
 1589         udev->ddesc.bMaxPacketSize = USB_MAX_IPACKET;
 1590 
 1591         udev->speed = speed;
 1592         udev->flags.usb_mode = mode;
 1593 
 1594         /* search for our High Speed USB HUB, if any */
 1595 
 1596         adev = udev;
 1597         hub = udev->parent_hub;
 1598 
 1599         while (hub) {
 1600                 if (hub->speed == USB_SPEED_HIGH) {
 1601                         udev->hs_hub_addr = hub->address;
 1602                         udev->parent_hs_hub = hub;
 1603                         udev->hs_port_no = adev->port_no;
 1604                         break;
 1605                 }
 1606                 adev = hub;
 1607                 hub = hub->parent_hub;
 1608         }
 1609 
 1610         /* init the default endpoint */
 1611         usb_init_endpoint(udev, 0,
 1612             &udev->ctrl_ep_desc,
 1613             &udev->ctrl_ep_comp_desc,
 1614             &udev->ctrl_ep);
 1615 
 1616         /* set device index */
 1617         udev->device_index = device_index;
 1618 
 1619 #if USB_HAVE_UGEN
 1620         /* Create ugen name */
 1621         snprintf(udev->ugen_name, sizeof(udev->ugen_name),
 1622             USB_GENERIC_NAME "%u.%u", device_get_unit(bus->bdev),
 1623             device_index);
 1624         LIST_INIT(&udev->pd_list);
 1625 
 1626         /* Create the control endpoint device */
 1627         udev->ctrl_dev = usb_make_dev(udev, NULL, 0, 0,
 1628             FREAD|FWRITE, UID_ROOT, GID_OPERATOR, 0600);
 1629 
 1630         /* Create a link from /dev/ugenX.X to the default endpoint */
 1631         if (udev->ctrl_dev != NULL)
 1632                 make_dev_alias(udev->ctrl_dev->cdev, "%s", udev->ugen_name);
 1633 #endif
 1634         /* Initialise device */
 1635         if (bus->methods->device_init != NULL) {
 1636                 err = (bus->methods->device_init) (udev);
 1637                 if (err != 0) {
 1638                         DPRINTFN(0, "device init %d failed "
 1639                             "(%s, ignored)\n", device_index, 
 1640                             usbd_errstr(err));
 1641                         goto done;
 1642                 }
 1643         }
 1644         /* set powered device state after device init is complete */
 1645         usb_set_device_state(udev, USB_STATE_POWERED);
 1646 
 1647         if (udev->flags.usb_mode == USB_MODE_HOST) {
 1648 
 1649                 err = usbd_req_set_address(udev, NULL, device_index);
 1650 
 1651                 /*
 1652                  * This is the new USB device address from now on, if
 1653                  * the set address request didn't set it already.
 1654                  */
 1655                 if (udev->address == USB_START_ADDR)
 1656                         udev->address = device_index;
 1657 
 1658                 /*
 1659                  * We ignore any set-address errors, hence there are
 1660                  * buggy USB devices out there that actually receive
 1661                  * the SETUP PID, but manage to set the address before
 1662                  * the STATUS stage is ACK'ed. If the device responds
 1663                  * to the subsequent get-descriptor at the new
 1664                  * address, then we know that the set-address command
 1665                  * was successful.
 1666                  */
 1667                 if (err) {
 1668                         DPRINTFN(0, "set address %d failed "
 1669                             "(%s, ignored)\n", udev->address, 
 1670                             usbd_errstr(err));
 1671                 }
 1672         } else {
 1673                 /* We are not self powered */
 1674                 udev->flags.self_powered = 0;
 1675 
 1676                 /* Set unconfigured state */
 1677                 udev->curr_config_no = USB_UNCONFIG_NO;
 1678                 udev->curr_config_index = USB_UNCONFIG_INDEX;
 1679 
 1680                 /* Setup USB descriptors */
 1681                 err = (usb_temp_setup_by_index_p) (udev, usb_template);
 1682                 if (err) {
 1683                         DPRINTFN(0, "setting up USB template failed maybe the USB "
 1684                             "template module has not been loaded\n");
 1685                         goto done;
 1686                 }
 1687         }
 1688         usb_set_device_state(udev, USB_STATE_ADDRESSED);
 1689 
 1690         /* setup the device descriptor and the initial "wMaxPacketSize" */
 1691         err = usbd_setup_device_desc(udev, NULL);
 1692 
 1693         if (err != 0) {
 1694                 /* XXX try to re-enumerate the device */
 1695                 err = usbd_req_re_enumerate(udev, NULL);
 1696                 if (err)
 1697                         goto done;
 1698         }
 1699 
 1700         /*
 1701          * Setup temporary USB attach args so that we can figure out some
 1702          * basic quirks for this device.
 1703          */
 1704         usb_init_attach_arg(udev, &uaa);
 1705 
 1706         if (usb_test_quirk(&uaa, UQ_BUS_POWERED)) {
 1707                 udev->flags.uq_bus_powered = 1;
 1708         }
 1709         if (usb_test_quirk(&uaa, UQ_NO_STRINGS)) {
 1710                 udev->flags.no_strings = 1;
 1711         }
 1712         /*
 1713          * Workaround for buggy USB devices.
 1714          *
 1715          * It appears that some string-less USB chips will crash and
 1716          * disappear if any attempts are made to read any string
 1717          * descriptors.
 1718          *
 1719          * Try to detect such chips by checking the strings in the USB
 1720          * device descriptor. If no strings are present there we
 1721          * simply disable all USB strings.
 1722          */
 1723         scratch_ptr = udev->bus->scratch[0].data;
 1724         scratch_size = sizeof(udev->bus->scratch[0].data);
 1725 
 1726         if (udev->ddesc.iManufacturer ||
 1727             udev->ddesc.iProduct ||
 1728             udev->ddesc.iSerialNumber) {
 1729                 /* read out the language ID string */
 1730                 err = usbd_req_get_string_desc(udev, NULL,
 1731                     (char *)scratch_ptr, 4, 0, USB_LANGUAGE_TABLE);
 1732         } else {
 1733                 err = USB_ERR_INVAL;
 1734         }
 1735 
 1736         if (err || (scratch_ptr[0] < 4)) {
 1737                 udev->flags.no_strings = 1;
 1738         } else {
 1739                 uint16_t langid;
 1740                 uint16_t pref;
 1741                 uint16_t mask;
 1742                 uint8_t x;
 1743 
 1744                 /* load preferred value and mask */
 1745                 pref = usb_lang_id;
 1746                 mask = usb_lang_mask;
 1747 
 1748                 /* align length correctly */
 1749                 scratch_ptr[0] &= ~1;
 1750 
 1751                 /* fix compiler warning */
 1752                 langid = 0;
 1753 
 1754                 /* search for preferred language */
 1755                 for (x = 2; (x < scratch_ptr[0]); x += 2) {
 1756                         langid = UGETW(scratch_ptr + x);
 1757                         if ((langid & mask) == pref)
 1758                                 break;
 1759                 }
 1760                 if (x >= scratch_ptr[0]) {
 1761                         /* pick the first language as the default */
 1762                         DPRINTFN(1, "Using first language\n");
 1763                         langid = UGETW(scratch_ptr + 2);
 1764                 }
 1765 
 1766                 DPRINTFN(1, "Language selected: 0x%04x\n", langid);
 1767                 udev->langid = langid;
 1768         }
 1769 
 1770         /* assume 100mA bus powered for now. Changed when configured. */
 1771         udev->power = USB_MIN_POWER;
 1772         /* fetch the vendor and product strings from the device */
 1773         usbd_set_device_strings(udev);
 1774 
 1775         if (udev->flags.usb_mode == USB_MODE_DEVICE) {
 1776                 /* USB device mode setup is complete */
 1777                 err = 0;
 1778                 goto config_done;
 1779         }
 1780 
 1781         /*
 1782          * Most USB devices should attach to config index 0 by
 1783          * default
 1784          */
 1785         if (usb_test_quirk(&uaa, UQ_CFG_INDEX_0)) {
 1786                 config_index = 0;
 1787                 config_quirk = 1;
 1788         } else if (usb_test_quirk(&uaa, UQ_CFG_INDEX_1)) {
 1789                 config_index = 1;
 1790                 config_quirk = 1;
 1791         } else if (usb_test_quirk(&uaa, UQ_CFG_INDEX_2)) {
 1792                 config_index = 2;
 1793                 config_quirk = 1;
 1794         } else if (usb_test_quirk(&uaa, UQ_CFG_INDEX_3)) {
 1795                 config_index = 3;
 1796                 config_quirk = 1;
 1797         } else if (usb_test_quirk(&uaa, UQ_CFG_INDEX_4)) {
 1798                 config_index = 4;
 1799                 config_quirk = 1;
 1800         } else {
 1801                 config_index = 0;
 1802                 config_quirk = 0;
 1803         }
 1804 
 1805         set_config_failed = 0;
 1806 repeat_set_config:
 1807 
 1808         DPRINTF("setting config %u\n", config_index);
 1809 
 1810         /* get the USB device configured */
 1811         err = usbd_set_config_index(udev, config_index);
 1812         if (err) {
 1813                 if (udev->ddesc.bNumConfigurations != 0) {
 1814                         if (!set_config_failed) {
 1815                                 set_config_failed = 1;
 1816                                 /* XXX try to re-enumerate the device */
 1817                                 err = usbd_req_re_enumerate(udev, NULL);
 1818                                 if (err == 0)
 1819                                         goto repeat_set_config;
 1820                         }
 1821                         DPRINTFN(0, "Failure selecting configuration index %u:"
 1822                             "%s, port %u, addr %u (ignored)\n",
 1823                             config_index, usbd_errstr(err), udev->port_no,
 1824                             udev->address);
 1825                 }
 1826                 /*
 1827                  * Some USB devices do not have any configurations. Ignore any
 1828                  * set config failures!
 1829                  */
 1830                 err = 0;
 1831                 goto config_done;
 1832         }
 1833         if (!config_quirk && config_index + 1 < udev->ddesc.bNumConfigurations) {
 1834                 if ((udev->cdesc->bNumInterface < 2) &&
 1835                     usbd_get_no_descriptors(udev->cdesc, UDESC_ENDPOINT) == 0) {
 1836                         DPRINTFN(0, "Found no endpoints, trying next config\n");
 1837                         config_index++;
 1838                         goto repeat_set_config;
 1839                 }
 1840                 if (config_index == 0) {
 1841                         /*
 1842                          * Try to figure out if we have an
 1843                          * auto-install disk there:
 1844                          */
 1845                         if (usb_iface_is_cdrom(udev, 0)) {
 1846                                 DPRINTFN(0, "Found possible auto-install "
 1847                                     "disk (trying next config)\n");
 1848                                 config_index++;
 1849                                 goto repeat_set_config;
 1850                         }
 1851                 }
 1852         }
 1853         if (set_config_failed == 0 && config_index == 0 &&
 1854             usb_test_quirk(&uaa, UQ_MSC_NO_SYNC_CACHE) == 0 &&
 1855             usb_test_quirk(&uaa, UQ_MSC_NO_GETMAXLUN) == 0) {
 1856 
 1857                 /*
 1858                  * Try to figure out if there are any MSC quirks we
 1859                  * should apply automatically:
 1860                  */
 1861                 err = usb_msc_auto_quirk(udev, 0);
 1862 
 1863                 if (err != 0) {
 1864                         set_config_failed = 1;
 1865                         goto repeat_set_config;
 1866                 }
 1867         }
 1868 
 1869 config_done:
 1870         DPRINTF("new dev (addr %d), udev=%p, parent_hub=%p\n",
 1871             udev->address, udev, udev->parent_hub);
 1872 
 1873         /* register our device - we are ready */
 1874         usb_bus_port_set_device(bus, parent_hub ?
 1875             parent_hub->hub->ports + port_index : NULL, udev, device_index);
 1876 
 1877 #if USB_HAVE_UGEN
 1878         /* Symlink the ugen device name */
 1879         udev->ugen_symlink = usb_alloc_symlink(udev->ugen_name);
 1880 
 1881         /* Announce device */
 1882         printf("%s: <%s> at %s\n", udev->ugen_name,
 1883             usb_get_manufacturer(udev),
 1884             device_get_nameunit(udev->bus->bdev));
 1885 #endif
 1886 
 1887 #if USB_HAVE_DEVCTL
 1888         usb_notify_addq("ATTACH", udev);
 1889 #endif
 1890 done:
 1891         if (err) {
 1892                 /*
 1893                  * Free USB device and all subdevices, if any.
 1894                  */
 1895                 usb_free_device(udev, 0);
 1896                 udev = NULL;
 1897         }
 1898         return (udev);
 1899 }
 1900 
 1901 #if USB_HAVE_UGEN
 1902 struct usb_fs_privdata *
 1903 usb_make_dev(struct usb_device *udev, const char *devname, int ep,
 1904     int fi, int rwmode, uid_t uid, gid_t gid, int mode)
 1905 {
 1906         struct usb_fs_privdata* pd;
 1907         char buffer[32];
 1908 
 1909         /* Store information to locate ourselves again later */
 1910         pd = malloc(sizeof(struct usb_fs_privdata), M_USBDEV,
 1911             M_WAITOK | M_ZERO);
 1912         pd->bus_index = device_get_unit(udev->bus->bdev);
 1913         pd->dev_index = udev->device_index;
 1914         pd->ep_addr = ep;
 1915         pd->fifo_index = fi;
 1916         pd->mode = rwmode;
 1917 
 1918         /* Now, create the device itself */
 1919         if (devname == NULL) {
 1920                 devname = buffer;
 1921                 snprintf(buffer, sizeof(buffer), USB_DEVICE_DIR "/%u.%u.%u",
 1922                     pd->bus_index, pd->dev_index, pd->ep_addr);
 1923         }
 1924 
 1925         pd->cdev = make_dev(&usb_devsw, 0, uid, gid, mode, "%s", devname);
 1926 
 1927         if (pd->cdev == NULL) {
 1928                 DPRINTFN(0, "Failed to create device %s\n", devname);
 1929                 free(pd, M_USBDEV);
 1930                 return (NULL);
 1931         }
 1932 
 1933         /* XXX setting si_drv1 and creating the device is not atomic! */
 1934         pd->cdev->si_drv1 = pd;
 1935 
 1936         return (pd);
 1937 }
 1938 
 1939 void
 1940 usb_destroy_dev(struct usb_fs_privdata *pd)
 1941 {
 1942         if (pd == NULL)
 1943                 return;
 1944 
 1945         destroy_dev(pd->cdev);
 1946 
 1947         free(pd, M_USBDEV);
 1948 }
 1949 
 1950 static void
 1951 usb_cdev_create(struct usb_device *udev)
 1952 {
 1953         struct usb_config_descriptor *cd;
 1954         struct usb_endpoint_descriptor *ed;
 1955         struct usb_descriptor *desc;
 1956         struct usb_fs_privdata* pd;
 1957         int inmode, outmode, inmask, outmask, mode;
 1958         uint8_t ep;
 1959 
 1960         KASSERT(LIST_FIRST(&udev->pd_list) == NULL, ("stale cdev entries"));
 1961 
 1962         DPRINTFN(2, "Creating device nodes\n");
 1963 
 1964         if (usbd_get_mode(udev) == USB_MODE_DEVICE) {
 1965                 inmode = FWRITE;
 1966                 outmode = FREAD;
 1967         } else {                 /* USB_MODE_HOST */
 1968                 inmode = FREAD;
 1969                 outmode = FWRITE;
 1970         }
 1971 
 1972         inmask = 0;
 1973         outmask = 0;
 1974         desc = NULL;
 1975 
 1976         /*
 1977          * Collect all used endpoint numbers instead of just
 1978          * generating 16 static endpoints.
 1979          */
 1980         cd = usbd_get_config_descriptor(udev);
 1981         while ((desc = usb_desc_foreach(cd, desc))) {
 1982                 /* filter out all endpoint descriptors */
 1983                 if ((desc->bDescriptorType == UDESC_ENDPOINT) &&
 1984                     (desc->bLength >= sizeof(*ed))) {
 1985                         ed = (struct usb_endpoint_descriptor *)desc;
 1986 
 1987                         /* update masks */
 1988                         ep = ed->bEndpointAddress;
 1989                         if (UE_GET_DIR(ep)  == UE_DIR_OUT)
 1990                                 outmask |= 1 << UE_GET_ADDR(ep);
 1991                         else
 1992                                 inmask |= 1 << UE_GET_ADDR(ep);
 1993                 }
 1994         }
 1995 
 1996         /* Create all available endpoints except EP0 */
 1997         for (ep = 1; ep < 16; ep++) {
 1998                 mode = (inmask & (1 << ep)) ? inmode : 0;
 1999                 mode |= (outmask & (1 << ep)) ? outmode : 0;
 2000                 if (mode == 0)
 2001                         continue;       /* no IN or OUT endpoint */
 2002 
 2003                 pd = usb_make_dev(udev, NULL, ep, 0,
 2004                     mode, UID_ROOT, GID_OPERATOR, 0600);
 2005 
 2006                 if (pd != NULL)
 2007                         LIST_INSERT_HEAD(&udev->pd_list, pd, pd_next);
 2008         }
 2009 }
 2010 
 2011 static void
 2012 usb_cdev_free(struct usb_device *udev)
 2013 {
 2014         struct usb_fs_privdata* pd;
 2015 
 2016         DPRINTFN(2, "Freeing device nodes\n");
 2017 
 2018         while ((pd = LIST_FIRST(&udev->pd_list)) != NULL) {
 2019                 KASSERT(pd->cdev->si_drv1 == pd, ("privdata corrupt"));
 2020 
 2021                 LIST_REMOVE(pd, pd_next);
 2022 
 2023                 usb_destroy_dev(pd);
 2024         }
 2025 }
 2026 #endif
 2027 
 2028 /*------------------------------------------------------------------------*
 2029  *      usb_free_device
 2030  *
 2031  * This function is NULL safe and will free an USB device and its
 2032  * children devices, if any.
 2033  *
 2034  * Flag values: Reserved, set to zero.
 2035  *------------------------------------------------------------------------*/
 2036 void
 2037 usb_free_device(struct usb_device *udev, uint8_t flag)
 2038 {
 2039         struct usb_bus *bus;
 2040 
 2041         if (udev == NULL)
 2042                 return;         /* already freed */
 2043 
 2044         DPRINTFN(4, "udev=%p port=%d\n", udev, udev->port_no);
 2045 
 2046         bus = udev->bus;
 2047         usb_set_device_state(udev, USB_STATE_DETACHED);
 2048 
 2049 #if USB_HAVE_DEVCTL
 2050         usb_notify_addq("DETACH", udev);
 2051 #endif
 2052 
 2053 #if USB_HAVE_UGEN
 2054         printf("%s: <%s> at %s (disconnected)\n", udev->ugen_name,
 2055             usb_get_manufacturer(udev), device_get_nameunit(bus->bdev));
 2056 
 2057         /* Destroy UGEN symlink, if any */
 2058         if (udev->ugen_symlink) {
 2059                 usb_free_symlink(udev->ugen_symlink);
 2060                 udev->ugen_symlink = NULL;
 2061         }
 2062 #endif
 2063         /*
 2064          * Unregister our device first which will prevent any further
 2065          * references:
 2066          */
 2067         usb_bus_port_set_device(bus, udev->parent_hub ?
 2068             udev->parent_hub->hub->ports + udev->port_index : NULL,
 2069             NULL, USB_ROOT_HUB_ADDR);
 2070 
 2071 #if USB_HAVE_UGEN
 2072         /* wait for all pending references to go away: */
 2073         mtx_lock(&usb_ref_lock);
 2074         udev->refcount--;
 2075         while (udev->refcount != 0) {
 2076                 cv_wait(&udev->ref_cv, &usb_ref_lock);
 2077         }
 2078         mtx_unlock(&usb_ref_lock);
 2079 
 2080         usb_destroy_dev(udev->ctrl_dev);
 2081 #endif
 2082 
 2083         if (udev->flags.usb_mode == USB_MODE_DEVICE) {
 2084                 /* stop receiving any control transfers (Device Side Mode) */
 2085                 usbd_transfer_unsetup(udev->ctrl_xfer, USB_CTRL_XFER_MAX);
 2086         }
 2087 
 2088         /* the following will get the device unconfigured in software */
 2089         usb_unconfigure(udev, USB_UNCFG_FLAG_FREE_EP0);
 2090 
 2091         /* unsetup any leftover default USB transfers */
 2092         usbd_transfer_unsetup(udev->ctrl_xfer, USB_CTRL_XFER_MAX);
 2093 
 2094         /* template unsetup, if any */
 2095         (usb_temp_unsetup_p) (udev);
 2096 
 2097         /* 
 2098          * Make sure that our clear-stall messages are not queued
 2099          * anywhere:
 2100          */
 2101         USB_BUS_LOCK(udev->bus);
 2102         usb_proc_mwait(&udev->bus->non_giant_callback_proc,
 2103             &udev->cs_msg[0], &udev->cs_msg[1]);
 2104         USB_BUS_UNLOCK(udev->bus);
 2105 
 2106         sx_destroy(&udev->ctrl_sx);
 2107         sx_destroy(&udev->enum_sx);
 2108         sx_destroy(&udev->sr_sx);
 2109 
 2110         cv_destroy(&udev->ctrlreq_cv);
 2111         cv_destroy(&udev->ref_cv);
 2112 
 2113         mtx_destroy(&udev->device_mtx);
 2114 #if USB_HAVE_UGEN
 2115         KASSERT(LIST_FIRST(&udev->pd_list) == NULL, ("leaked cdev entries"));
 2116 #endif
 2117 
 2118         /* Uninitialise device */
 2119         if (bus->methods->device_uninit != NULL)
 2120                 (bus->methods->device_uninit) (udev);
 2121 
 2122         /* free device */
 2123         free(udev->serial, M_USB);
 2124         free(udev->manufacturer, M_USB);
 2125         free(udev->product, M_USB);
 2126         free(udev, M_USB);
 2127 }
 2128 
 2129 /*------------------------------------------------------------------------*
 2130  *      usbd_get_iface
 2131  *
 2132  * This function is the safe way to get the USB interface structure
 2133  * pointer by interface index.
 2134  *
 2135  * Return values:
 2136  *   NULL: Interface not present.
 2137  *   Else: Pointer to USB interface structure.
 2138  *------------------------------------------------------------------------*/
 2139 struct usb_interface *
 2140 usbd_get_iface(struct usb_device *udev, uint8_t iface_index)
 2141 {
 2142         struct usb_interface *iface = udev->ifaces + iface_index;
 2143 
 2144         if (iface_index >= udev->ifaces_max)
 2145                 return (NULL);
 2146         return (iface);
 2147 }
 2148 
 2149 /*------------------------------------------------------------------------*
 2150  *      usbd_find_descriptor
 2151  *
 2152  * This function will lookup the first descriptor that matches the
 2153  * criteria given by the arguments "type" and "subtype". Descriptors
 2154  * will only be searched within the interface having the index
 2155  * "iface_index".  If the "id" argument points to an USB descriptor,
 2156  * it will be skipped before the search is started. This allows
 2157  * searching for multiple descriptors using the same criteria. Else
 2158  * the search is started after the interface descriptor.
 2159  *
 2160  * Return values:
 2161  *   NULL: End of descriptors
 2162  *   Else: A descriptor matching the criteria
 2163  *------------------------------------------------------------------------*/
 2164 void   *
 2165 usbd_find_descriptor(struct usb_device *udev, void *id, uint8_t iface_index,
 2166     uint8_t type, uint8_t type_mask,
 2167     uint8_t subtype, uint8_t subtype_mask)
 2168 {
 2169         struct usb_descriptor *desc;
 2170         struct usb_config_descriptor *cd;
 2171         struct usb_interface *iface;
 2172 
 2173         cd = usbd_get_config_descriptor(udev);
 2174         if (cd == NULL) {
 2175                 return (NULL);
 2176         }
 2177         if (id == NULL) {
 2178                 iface = usbd_get_iface(udev, iface_index);
 2179                 if (iface == NULL) {
 2180                         return (NULL);
 2181                 }
 2182                 id = usbd_get_interface_descriptor(iface);
 2183                 if (id == NULL) {
 2184                         return (NULL);
 2185                 }
 2186         }
 2187         desc = (void *)id;
 2188 
 2189         while ((desc = usb_desc_foreach(cd, desc))) {
 2190 
 2191                 if (desc->bDescriptorType == UDESC_INTERFACE) {
 2192                         break;
 2193                 }
 2194                 if (((desc->bDescriptorType & type_mask) == type) &&
 2195                     ((desc->bDescriptorSubtype & subtype_mask) == subtype)) {
 2196                         return (desc);
 2197                 }
 2198         }
 2199         return (NULL);
 2200 }
 2201 
 2202 /*------------------------------------------------------------------------*
 2203  *      usb_devinfo
 2204  *
 2205  * This function will dump information from the device descriptor
 2206  * belonging to the USB device pointed to by "udev", to the string
 2207  * pointed to by "dst_ptr" having a maximum length of "dst_len" bytes
 2208  * including the terminating zero.
 2209  *------------------------------------------------------------------------*/
 2210 void
 2211 usb_devinfo(struct usb_device *udev, char *dst_ptr, uint16_t dst_len)
 2212 {
 2213         struct usb_device_descriptor *udd = &udev->ddesc;
 2214         uint16_t bcdDevice;
 2215         uint16_t bcdUSB;
 2216 
 2217         bcdUSB = UGETW(udd->bcdUSB);
 2218         bcdDevice = UGETW(udd->bcdDevice);
 2219 
 2220         if (udd->bDeviceClass != 0xFF) {
 2221                 snprintf(dst_ptr, dst_len, "%s %s, class %d/%d, rev %x.%02x/"
 2222                     "%x.%02x, addr %d",
 2223                     usb_get_manufacturer(udev),
 2224                     usb_get_product(udev),
 2225                     udd->bDeviceClass, udd->bDeviceSubClass,
 2226                     (bcdUSB >> 8), bcdUSB & 0xFF,
 2227                     (bcdDevice >> 8), bcdDevice & 0xFF,
 2228                     udev->address);
 2229         } else {
 2230                 snprintf(dst_ptr, dst_len, "%s %s, rev %x.%02x/"
 2231                     "%x.%02x, addr %d",
 2232                     usb_get_manufacturer(udev),
 2233                     usb_get_product(udev),
 2234                     (bcdUSB >> 8), bcdUSB & 0xFF,
 2235                     (bcdDevice >> 8), bcdDevice & 0xFF,
 2236                     udev->address);
 2237         }
 2238 }
 2239 
 2240 #ifdef USB_VERBOSE
 2241 /*
 2242  * Descriptions of of known vendors and devices ("products").
 2243  */
 2244 struct usb_knowndev {
 2245         uint16_t vendor;
 2246         uint16_t product;
 2247         uint32_t flags;
 2248         const char *vendorname;
 2249         const char *productname;
 2250 };
 2251 
 2252 #define USB_KNOWNDEV_NOPROD     0x01    /* match on vendor only */
 2253 
 2254 #include "usbdevs.h"
 2255 #include "usbdevs_data.h"
 2256 #endif                                  /* USB_VERBOSE */
 2257 
 2258 static void
 2259 usbd_set_device_strings(struct usb_device *udev)
 2260 {
 2261         struct usb_device_descriptor *udd = &udev->ddesc;
 2262 #ifdef USB_VERBOSE
 2263         const struct usb_knowndev *kdp;
 2264 #endif
 2265         char *temp_ptr;
 2266         size_t temp_size;
 2267         uint16_t vendor_id;
 2268         uint16_t product_id;
 2269 
 2270         temp_ptr = (char *)udev->bus->scratch[0].data;
 2271         temp_size = sizeof(udev->bus->scratch[0].data);
 2272 
 2273         vendor_id = UGETW(udd->idVendor);
 2274         product_id = UGETW(udd->idProduct);
 2275 
 2276         /* get serial number string */
 2277         usbd_req_get_string_any(udev, NULL, temp_ptr, temp_size,
 2278             udev->ddesc.iSerialNumber);
 2279         udev->serial = strdup(temp_ptr, M_USB);
 2280 
 2281         /* get manufacturer string */
 2282         usbd_req_get_string_any(udev, NULL, temp_ptr, temp_size,
 2283             udev->ddesc.iManufacturer);
 2284         usb_trim_spaces(temp_ptr);
 2285         if (temp_ptr[0] != '\0')
 2286                 udev->manufacturer = strdup(temp_ptr, M_USB);
 2287 
 2288         /* get product string */
 2289         usbd_req_get_string_any(udev, NULL, temp_ptr, temp_size,
 2290             udev->ddesc.iProduct);
 2291         usb_trim_spaces(temp_ptr);
 2292         if (temp_ptr[0] != '\0')
 2293                 udev->product = strdup(temp_ptr, M_USB);
 2294 
 2295 #ifdef USB_VERBOSE
 2296         if (udev->manufacturer == NULL || udev->product == NULL) {
 2297                 for (kdp = usb_knowndevs; kdp->vendorname != NULL; kdp++) {
 2298                         if (kdp->vendor == vendor_id &&
 2299                             (kdp->product == product_id ||
 2300                             (kdp->flags & USB_KNOWNDEV_NOPROD) != 0))
 2301                                 break;
 2302                 }
 2303                 if (kdp->vendorname != NULL) {
 2304                         /* XXX should use pointer to knowndevs string */
 2305                         if (udev->manufacturer == NULL) {
 2306                                 udev->manufacturer = strdup(kdp->vendorname,
 2307                                     M_USB);
 2308                         }
 2309                         if (udev->product == NULL &&
 2310                             (kdp->flags & USB_KNOWNDEV_NOPROD) == 0) {
 2311                                 udev->product = strdup(kdp->productname,
 2312                                     M_USB);
 2313                         }
 2314                 }
 2315         }
 2316 #endif
 2317         /* Provide default strings if none were found */
 2318         if (udev->manufacturer == NULL) {
 2319                 snprintf(temp_ptr, temp_size, "vendor 0x%04x", vendor_id);
 2320                 udev->manufacturer = strdup(temp_ptr, M_USB);
 2321         }
 2322         if (udev->product == NULL) {
 2323                 snprintf(temp_ptr, temp_size, "product 0x%04x", product_id);
 2324                 udev->product = strdup(temp_ptr, M_USB);
 2325         }
 2326 }
 2327 
 2328 /*
 2329  * Returns:
 2330  * See: USB_MODE_XXX
 2331  */
 2332 enum usb_hc_mode
 2333 usbd_get_mode(struct usb_device *udev)
 2334 {
 2335         return (udev->flags.usb_mode);
 2336 }
 2337 
 2338 /*
 2339  * Returns:
 2340  * See: USB_SPEED_XXX
 2341  */
 2342 enum usb_dev_speed
 2343 usbd_get_speed(struct usb_device *udev)
 2344 {
 2345         return (udev->speed);
 2346 }
 2347 
 2348 uint32_t
 2349 usbd_get_isoc_fps(struct usb_device *udev)
 2350 {
 2351         ;                               /* indent fix */
 2352         switch (udev->speed) {
 2353         case USB_SPEED_LOW:
 2354         case USB_SPEED_FULL:
 2355                 return (1000);
 2356         default:
 2357                 return (8000);
 2358         }
 2359 }
 2360 
 2361 struct usb_device_descriptor *
 2362 usbd_get_device_descriptor(struct usb_device *udev)
 2363 {
 2364         if (udev == NULL)
 2365                 return (NULL);          /* be NULL safe */
 2366         return (&udev->ddesc);
 2367 }
 2368 
 2369 struct usb_config_descriptor *
 2370 usbd_get_config_descriptor(struct usb_device *udev)
 2371 {
 2372         if (udev == NULL)
 2373                 return (NULL);          /* be NULL safe */
 2374         return (udev->cdesc);
 2375 }
 2376 
 2377 /*------------------------------------------------------------------------*
 2378  *      usb_test_quirk - test a device for a given quirk
 2379  *
 2380  * Return values:
 2381  * 0: The USB device does not have the given quirk.
 2382  * Else: The USB device has the given quirk.
 2383  *------------------------------------------------------------------------*/
 2384 uint8_t
 2385 usb_test_quirk(const struct usb_attach_arg *uaa, uint16_t quirk)
 2386 {
 2387         uint8_t found;
 2388         uint8_t x;
 2389 
 2390         if (quirk == UQ_NONE)
 2391                 return (0);
 2392 
 2393         /* search the automatic per device quirks first */
 2394 
 2395         for (x = 0; x != USB_MAX_AUTO_QUIRK; x++) {
 2396                 if (uaa->device->autoQuirk[x] == quirk)
 2397                         return (1);
 2398         }
 2399 
 2400         /* search global quirk table, if any */
 2401 
 2402         found = (usb_test_quirk_p) (&uaa->info, quirk);
 2403 
 2404         return (found);
 2405 }
 2406 
 2407 struct usb_interface_descriptor *
 2408 usbd_get_interface_descriptor(struct usb_interface *iface)
 2409 {
 2410         if (iface == NULL)
 2411                 return (NULL);          /* be NULL safe */
 2412         return (iface->idesc);
 2413 }
 2414 
 2415 uint8_t
 2416 usbd_get_interface_altindex(struct usb_interface *iface)
 2417 {
 2418         return (iface->alt_index);
 2419 }
 2420 
 2421 uint8_t
 2422 usbd_get_bus_index(struct usb_device *udev)
 2423 {
 2424         return ((uint8_t)device_get_unit(udev->bus->bdev));
 2425 }
 2426 
 2427 uint8_t
 2428 usbd_get_device_index(struct usb_device *udev)
 2429 {
 2430         return (udev->device_index);
 2431 }
 2432 
 2433 #if USB_HAVE_DEVCTL
 2434 /*------------------------------------------------------------------------*
 2435  *      usb_notify_addq
 2436  *
 2437  * This function will generate events for dev.
 2438  *------------------------------------------------------------------------*/
 2439 #ifndef BURN_BRIDGES
 2440 static void
 2441 usb_notify_addq_compat(const char *type, struct usb_device *udev)
 2442 {
 2443         char *data = NULL;
 2444         const char *ntype;
 2445         struct malloc_type *mt;
 2446         const size_t buf_size = 512;
 2447 
 2448         /* Convert notify type */
 2449         if (strcmp(type, "ATTACH") == 0)
 2450                 ntype = "+";
 2451         else if (strcmp(type, "DETACH") == 0)
 2452                 ntype = "-";
 2453         else
 2454                 return;
 2455 
 2456         mtx_lock(&malloc_mtx);
 2457         mt = malloc_desc2type("bus");   /* XXX M_BUS */
 2458         mtx_unlock(&malloc_mtx);
 2459         if (mt == NULL)
 2460                 return;
 2461 
 2462         data = malloc(buf_size, mt, M_NOWAIT);
 2463         if (data == NULL)
 2464                 return;
 2465 
 2466         /* String it all together. */
 2467         snprintf(data, buf_size,
 2468             "%s"
 2469 #if USB_HAVE_UGEN
 2470             "%s "
 2471 #endif
 2472             "at port=%u "
 2473             "vendor=0x%04x "
 2474             "product=0x%04x "
 2475             "devclass=0x%02x "
 2476             "devsubclass=0x%02x "
 2477             "sernum=\"%s\" "
 2478             "release=0x%04x "
 2479 #if USB_HAVE_UGEN
 2480             "on %s\n"
 2481 #endif
 2482             "",
 2483             ntype,
 2484 #if USB_HAVE_UGEN
 2485             udev->ugen_name,
 2486 #endif
 2487             udev->port_no,
 2488             UGETW(udev->ddesc.idVendor),
 2489             UGETW(udev->ddesc.idProduct),
 2490             udev->ddesc.bDeviceClass,
 2491             udev->ddesc.bDeviceSubClass,
 2492             usb_get_serial(udev),
 2493             UGETW(udev->ddesc.bcdDevice)
 2494 #if USB_HAVE_UGEN
 2495             , udev->parent_hub != NULL ?
 2496                 udev->parent_hub->ugen_name :
 2497                 device_get_nameunit(device_get_parent(udev->bus->bdev))
 2498 #endif
 2499             );
 2500 
 2501         devctl_queue_data(data);
 2502 }
 2503 #endif
 2504 
 2505 static void
 2506 usb_notify_addq(const char *type, struct usb_device *udev)
 2507 {
 2508         struct usb_interface *iface;
 2509         struct sbuf *sb;
 2510         int i;
 2511 
 2512 #ifndef BURN_BRIDGES
 2513         usb_notify_addq_compat(type, udev);
 2514 #endif
 2515 
 2516         /* announce the device */
 2517         sb = sbuf_new_auto();
 2518         sbuf_printf(sb,
 2519 #if USB_HAVE_UGEN
 2520             "ugen=%s "
 2521             "cdev=%s "
 2522 #endif
 2523             "vendor=0x%04x "
 2524             "product=0x%04x "
 2525             "devclass=0x%02x "
 2526             "devsubclass=0x%02x "
 2527             "sernum=\"%s\" "
 2528             "release=0x%04x "
 2529             "mode=%s "
 2530             "port=%u "
 2531 #if USB_HAVE_UGEN
 2532             "parent=%s"
 2533 #endif
 2534             "",
 2535 #if USB_HAVE_UGEN
 2536             udev->ugen_name,
 2537             udev->ugen_name,
 2538 #endif
 2539             UGETW(udev->ddesc.idVendor),
 2540             UGETW(udev->ddesc.idProduct),
 2541             udev->ddesc.bDeviceClass,
 2542             udev->ddesc.bDeviceSubClass,
 2543             usb_get_serial(udev),
 2544             UGETW(udev->ddesc.bcdDevice),
 2545             (udev->flags.usb_mode == USB_MODE_HOST) ? "host" : "device",
 2546             udev->port_no
 2547 #if USB_HAVE_UGEN
 2548             , udev->parent_hub != NULL ?
 2549                 udev->parent_hub->ugen_name :
 2550                 device_get_nameunit(device_get_parent(udev->bus->bdev))
 2551 #endif
 2552             );
 2553         sbuf_finish(sb);
 2554         devctl_notify("USB", "DEVICE", type, sbuf_data(sb));
 2555         sbuf_delete(sb);
 2556 
 2557         /* announce each interface */
 2558         for (i = 0; i < USB_IFACE_MAX; i++) {
 2559                 iface = usbd_get_iface(udev, i);
 2560                 if (iface == NULL)
 2561                         break;          /* end of interfaces */
 2562                 if (iface->idesc == NULL)
 2563                         continue;       /* no interface descriptor */
 2564 
 2565                 sb = sbuf_new_auto();
 2566                 sbuf_printf(sb,
 2567 #if USB_HAVE_UGEN
 2568                     "ugen=%s "
 2569                     "cdev=%s "
 2570 #endif
 2571                     "vendor=0x%04x "
 2572                     "product=0x%04x "
 2573                     "devclass=0x%02x "
 2574                     "devsubclass=0x%02x "
 2575                     "sernum=\"%s\" "
 2576                     "release=0x%04x "
 2577                     "mode=%s "
 2578                     "interface=%d "
 2579                     "endpoints=%d "
 2580                     "intclass=0x%02x "
 2581                     "intsubclass=0x%02x "
 2582                     "intprotocol=0x%02x",
 2583 #if USB_HAVE_UGEN
 2584                     udev->ugen_name,
 2585                     udev->ugen_name,
 2586 #endif
 2587                     UGETW(udev->ddesc.idVendor),
 2588                     UGETW(udev->ddesc.idProduct),
 2589                     udev->ddesc.bDeviceClass,
 2590                     udev->ddesc.bDeviceSubClass,
 2591                     usb_get_serial(udev),
 2592                     UGETW(udev->ddesc.bcdDevice),
 2593                     (udev->flags.usb_mode == USB_MODE_HOST) ? "host" : "device",
 2594                     iface->idesc->bInterfaceNumber,
 2595                     iface->idesc->bNumEndpoints,
 2596                     iface->idesc->bInterfaceClass,
 2597                     iface->idesc->bInterfaceSubClass,
 2598                     iface->idesc->bInterfaceProtocol);
 2599                 sbuf_finish(sb);
 2600                 devctl_notify("USB", "INTERFACE", type, sbuf_data(sb));
 2601                 sbuf_delete(sb);
 2602         }
 2603 }
 2604 #endif
 2605 
 2606 #if USB_HAVE_UGEN
 2607 /*------------------------------------------------------------------------*
 2608  *      usb_fifo_free_wrap
 2609  *
 2610  * This function will free the FIFOs.
 2611  *
 2612  * Description of "flag" argument: If the USB_UNCFG_FLAG_FREE_EP0 flag
 2613  * is set and "iface_index" is set to "USB_IFACE_INDEX_ANY", we free
 2614  * all FIFOs. If the USB_UNCFG_FLAG_FREE_EP0 flag is not set and
 2615  * "iface_index" is set to "USB_IFACE_INDEX_ANY", we free all non
 2616  * control endpoint FIFOs. If "iface_index" is not set to
 2617  * "USB_IFACE_INDEX_ANY" the flag has no effect.
 2618  *------------------------------------------------------------------------*/
 2619 static void
 2620 usb_fifo_free_wrap(struct usb_device *udev,
 2621     uint8_t iface_index, uint8_t flag)
 2622 {
 2623         struct usb_fifo *f;
 2624         uint16_t i;
 2625 
 2626         /*
 2627          * Free any USB FIFOs on the given interface:
 2628          */
 2629         for (i = 0; i != USB_FIFO_MAX; i++) {
 2630                 f = udev->fifo[i];
 2631                 if (f == NULL) {
 2632                         continue;
 2633                 }
 2634                 /* Check if the interface index matches */
 2635                 if (iface_index == f->iface_index) {
 2636                         if (f->methods != &usb_ugen_methods) {
 2637                                 /*
 2638                                  * Don't free any non-generic FIFOs in
 2639                                  * this case.
 2640                                  */
 2641                                 continue;
 2642                         }
 2643                         if ((f->dev_ep_index == 0) &&
 2644                             (f->fs_xfer == NULL)) {
 2645                                 /* no need to free this FIFO */
 2646                                 continue;
 2647                         }
 2648                 } else if (iface_index == USB_IFACE_INDEX_ANY) {
 2649                         if ((f->methods == &usb_ugen_methods) &&
 2650                             (f->dev_ep_index == 0) &&
 2651                             (!(flag & USB_UNCFG_FLAG_FREE_EP0)) &&
 2652                             (f->fs_xfer == NULL)) {
 2653                                 /* no need to free this FIFO */
 2654                                 continue;
 2655                         }
 2656                 } else {
 2657                         /* no need to free this FIFO */
 2658                         continue;
 2659                 }
 2660                 /* free this FIFO */
 2661                 usb_fifo_free(f);
 2662         }
 2663 }
 2664 #endif
 2665 
 2666 /*------------------------------------------------------------------------*
 2667  *      usb_peer_can_wakeup
 2668  *
 2669  * Return values:
 2670  * 0: Peer cannot do resume signalling.
 2671  * Else: Peer can do resume signalling.
 2672  *------------------------------------------------------------------------*/
 2673 uint8_t
 2674 usb_peer_can_wakeup(struct usb_device *udev)
 2675 {
 2676         const struct usb_config_descriptor *cdp;
 2677 
 2678         cdp = udev->cdesc;
 2679         if ((cdp != NULL) && (udev->flags.usb_mode == USB_MODE_HOST)) {
 2680                 return (cdp->bmAttributes & UC_REMOTE_WAKEUP);
 2681         }
 2682         return (0);                     /* not supported */
 2683 }
 2684 
 2685 void
 2686 usb_set_device_state(struct usb_device *udev, enum usb_dev_state state)
 2687 {
 2688 
 2689         KASSERT(state < USB_STATE_MAX, ("invalid udev state"));
 2690 
 2691         DPRINTF("udev %p state %s -> %s\n", udev,
 2692             usb_statestr(udev->state), usb_statestr(state));
 2693         udev->state = state;
 2694 
 2695         if (udev->bus->methods->device_state_change != NULL)
 2696                 (udev->bus->methods->device_state_change) (udev);
 2697 }
 2698 
 2699 enum usb_dev_state
 2700 usb_get_device_state(struct usb_device *udev)
 2701 {
 2702         if (udev == NULL)
 2703                 return (USB_STATE_DETACHED);
 2704         return (udev->state);
 2705 }
 2706 
 2707 uint8_t
 2708 usbd_device_attached(struct usb_device *udev)
 2709 {
 2710         return (udev->state > USB_STATE_DETACHED);
 2711 }
 2712 
 2713 /* The following function locks enumerating the given USB device. */
 2714 
 2715 void
 2716 usbd_enum_lock(struct usb_device *udev)
 2717 {
 2718         sx_xlock(&udev->enum_sx);
 2719         sx_xlock(&udev->sr_sx);
 2720         /* 
 2721          * NEWBUS LOCK NOTE: We should check if any parent SX locks
 2722          * are locked before locking Giant. Else the lock can be
 2723          * locked multiple times.
 2724          */
 2725         mtx_lock(&Giant);
 2726 }
 2727 
 2728 /* The following function unlocks enumerating the given USB device. */
 2729 
 2730 void
 2731 usbd_enum_unlock(struct usb_device *udev)
 2732 {
 2733         mtx_unlock(&Giant);
 2734         sx_xunlock(&udev->enum_sx);
 2735         sx_xunlock(&udev->sr_sx);
 2736 }
 2737 
 2738 /* The following function locks suspend and resume. */
 2739 
 2740 void
 2741 usbd_sr_lock(struct usb_device *udev)
 2742 {
 2743         sx_xlock(&udev->sr_sx);
 2744         /* 
 2745          * NEWBUS LOCK NOTE: We should check if any parent SX locks
 2746          * are locked before locking Giant. Else the lock can be
 2747          * locked multiple times.
 2748          */
 2749         mtx_lock(&Giant);
 2750 }
 2751 
 2752 /* The following function unlocks suspend and resume. */
 2753 
 2754 void
 2755 usbd_sr_unlock(struct usb_device *udev)
 2756 {
 2757         mtx_unlock(&Giant);
 2758         sx_xunlock(&udev->sr_sx);
 2759 }
 2760 
 2761 /*
 2762  * The following function checks the enumerating lock for the given
 2763  * USB device.
 2764  */
 2765 
 2766 uint8_t
 2767 usbd_enum_is_locked(struct usb_device *udev)
 2768 {
 2769         return (sx_xlocked(&udev->enum_sx));
 2770 }
 2771 
 2772 /*
 2773  * The following function is used to set the per-interface specific
 2774  * plug and play information. The string referred to by the pnpinfo
 2775  * argument can safely be freed after calling this function. The
 2776  * pnpinfo of an interface will be reset at device detach or when
 2777  * passing a NULL argument to this function. This function
 2778  * returns zero on success, else a USB_ERR_XXX failure code.
 2779  */
 2780 
 2781 usb_error_t 
 2782 usbd_set_pnpinfo(struct usb_device *udev, uint8_t iface_index, const char *pnpinfo)
 2783 {
 2784         struct usb_interface *iface;
 2785 
 2786         iface = usbd_get_iface(udev, iface_index);
 2787         if (iface == NULL)
 2788                 return (USB_ERR_INVAL);
 2789 
 2790         if (iface->pnpinfo != NULL) {
 2791                 free(iface->pnpinfo, M_USBDEV);
 2792                 iface->pnpinfo = NULL;
 2793         }
 2794 
 2795         if (pnpinfo == NULL || pnpinfo[0] == 0)
 2796                 return (0);             /* success */
 2797 
 2798         iface->pnpinfo = strdup(pnpinfo, M_USBDEV);
 2799         if (iface->pnpinfo == NULL)
 2800                 return (USB_ERR_NOMEM);
 2801 
 2802         return (0);                     /* success */
 2803 }
 2804 
 2805 usb_error_t
 2806 usbd_add_dynamic_quirk(struct usb_device *udev, uint16_t quirk)
 2807 {
 2808         uint8_t x;
 2809 
 2810         for (x = 0; x != USB_MAX_AUTO_QUIRK; x++) {
 2811                 if (udev->autoQuirk[x] == 0 ||
 2812                     udev->autoQuirk[x] == quirk) {
 2813                         udev->autoQuirk[x] = quirk;
 2814                         return (0);     /* success */
 2815                 }
 2816         }
 2817         return (USB_ERR_NOMEM);
 2818 }

Cache object: dd7ebf0082f86808d46c5cbf711695ad


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.