Always assign the device address found by the USB stack even if it
authormpi <mpi@openbsd.org>
Thu, 10 Jul 2014 11:47:14 +0000 (11:47 +0000)
committermpi <mpi@openbsd.org>
Thu, 10 Jul 2014 11:47:14 +0000 (11:47 +0000)
does not match the hardware address.

This change only matters for xHCI buses where the controller assigns
device addresses.  But it is the simplest way to comply with the stack
requirement of assigning the first `logical' address to the root hub
device.

Device addresses are not much used anyway and a cleanup will follow to
avoid possible confusions.

This makes usbdevs(8) correctly report devices connected to xhci(4).

sys/dev/usb/usb_subr.c
sys/dev/usb/xhci.c

index 2bdeaeb..2bf4124 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: usb_subr.c,v 1.102 2014/07/09 18:15:04 mpi Exp $ */
+/*     $OpenBSD: usb_subr.c,v 1.103 2014/07/10 11:47:14 mpi Exp $ */
 /*     $NetBSD: usb_subr.c,v 1.103 2003/01/10 11:19:13 augustss Exp $  */
 /*     $FreeBSD: src/sys/dev/usb/usb_subr.c,v 1.18 1999/11/17 22:33:47 n_hibma Exp $   */
 
@@ -828,9 +828,6 @@ usbd_set_address(struct usbd_device *dev, int addr)
        if (usbd_do_request(dev, &req, 0))
                return (1);
 
-       dev->address = addr;
-       dev->bus->devices[addr] = dev;
-
        /* Allow device time to set new address */
        usbd_delay_ms(dev, USB_SET_ADDRESS_SETTLE);
 
@@ -1200,6 +1197,13 @@ usbd_new_device(struct device *parent, struct usbd_bus *bus, int depth,
                return (USBD_SET_ADDR_FAILED);
        }
 
+       /*
+        * If this device is attached to an xHCI controller, this
+        * address does not correspond to the hardware one.
+        */
+       dev->address = addr;
+       bus->devices[addr] = dev;
+
        /* Re-establish the default pipe with the new address. */
        usbd_close_pipe(dev->default_pipe);
        err = usbd_setup_pipe(dev, 0, &dev->def_ep, USBD_DEFAULT_INTERVAL,
index 6082132..411dbf7 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: xhci.c,v 1.14 2014/07/09 15:54:39 mpi Exp $ */
+/* $OpenBSD: xhci.c,v 1.15 2014/07/10 11:47:14 mpi Exp $ */
 
 /*
  * Copyright (c) 2014 Martin Pieuchot
@@ -960,10 +960,7 @@ xhci_device_setup(struct xhci_softc *sc, struct usbd_device *dev, uint8_t slot)
        if (addr == 0)
                return (EINVAL);
 
-       DPRINTF(("%s: dev %d new addr %d\n", DEVNAME(sc), slot, addr));
-
-       dev->address = addr;
-       dev->bus->devices[addr] = dev;
+       DPRINTF(("%s: dev %d internal addr %d\n", DEVNAME(sc), slot, addr));
 
        return (0);
 }