Hello

While working with USB code, I noticed the port numbering was
inconsistent: A device would be detected on port 5 during boot, but if I
detached and reattached it with drvctl, the kernel would tell about port
4. 

This happens because attaching and reattaching do not go through the
same functions. I can make the port display consistent by the patch
below, but I am not sure it is the right fix. Any advice?

--- sys/dev/usb/uhub.c  27 Sep 2018 14:52:26 -0000      1.136.2.2
+++ sys/dev/usb/uhub.c  18 Oct 2018 00:32:58 -0000
@@ -821,10 +821,10 @@
        /* XXXSMP usb */
        KERNEL_LOCK(1, curlwp);
 
        nports = hub->uh_hubdesc.bNbrPorts;
-       for (port = 0; port < nports; port++) {
-               rup = &hub->uh_ports[port];
+       for (port = 1; port <= nports; port++) {
+               rup = &hub->uh_ports[port - 1];
                if (rup->up_dev == NULL)
                        continue;
                if ((rc = usb_disconnect_port(rup, self, flags)) != 0) {
                        /* XXXSMP usb */
@@ -869,12 +869,13 @@
        struct usbd_hub *hub = sc->sc_hub->ud_hub;
        struct usbd_device *dev;
        int port;
 
-       for (port = 0; port < hub->uh_hubdesc.bNbrPorts; port++) {
-               dev = hub->uh_ports[port].up_dev;
+       for (port = 1; port <= hub->uh_hubdesc.bNbrPorts; port++) {
+               dev = hub->uh_ports[port - 1].up_dev;
                if (dev == NULL)
                        continue;
+printf("uhub_rescan > usbd_reattach_device port %d\n", port);
                usbd_reattach_device(sc->sc_dev, dev, port, locators);
        }
        return 0;
 }
@@ -894,10 +895,10 @@
                /* should never happen; children are only created after
init */
                panic("hub not fully initialised, but child deleted?");
 
        nports = devhub->ud_hub->uh_hubdesc.bNbrPorts;
-       for (port = 0; port < nports; port++) {
-               dev = devhub->ud_hub->uh_ports[port].up_dev;
+       for (port = 1; port <= nports; port++) {
+               dev = devhub->ud_hub->uh_ports[port - 1].up_dev;
                if (!dev || dev->ud_subdevlen == 0)
                        continue;
                for (i = 0; i < dev->ud_subdevlen; i++) {
                        if (dev->ud_subdevs[i] == child) {



-- 
Emmanuel Dreyfus
http://hcpnet.free.fr/pubz
m...@netbsd.org

Reply via email to