[SeaBIOS] [PATCH 2/7] usb-hub: Enable power to all ports prior to calling usb_enumerate().

Kevin O'Connor kevin at koconnor.net
Wed Sep 10 20:46:01 CEST 2014


Don't perform port power up in the detect code.  Instead do it prior
to calling usb_enumerate().  This makes the code more similar to the
usb root hub drivers.  It can also reduce the total boot time when
threads are disabled.

Signed-off-by: Kevin O'Connor <kevin at koconnor.net>
---
 src/hw/usb-hub.c | 22 ++++++++++++----------
 src/hw/usb.h     |  1 -
 2 files changed, 12 insertions(+), 11 deletions(-)

diff --git a/src/hw/usb-hub.c b/src/hw/usb-hub.c
index 477518b..2a34e57 100644
--- a/src/hw/usb-hub.c
+++ b/src/hw/usb-hub.c
@@ -72,19 +72,11 @@ get_port_status(struct usbhub_s *hub, int port, struct usb_port_status *sts)
 static int
 usb_hub_detect(struct usbhub_s *hub, u32 port)
 {
-    // Turn on power to port.
-    int ret = set_port_feature(hub, port, USB_PORT_FEAT_POWER);
-    if (ret)
-        goto fail;
-
-    // Wait for port power to stabilize.
-    msleep(hub->powerwait);
-
     // Check periodically for a device connect.
     struct usb_port_status sts;
     u32 end = timer_calc(USB_TIME_SIGATT);
     for (;;) {
-        ret = get_port_status(hub, port, &sts);
+        int ret = get_port_status(hub, port, &sts);
         if (ret)
             goto fail;
         if (sts.wPortStatus & USB_PORT_STAT_CONNECTION)
@@ -175,9 +167,19 @@ usb_hub_setup(struct usbdevice_s *usbdev)
     memset(&hub, 0, sizeof(hub));
     hub.usbdev = usbdev;
     hub.cntl = usbdev->defpipe->cntl;
-    hub.powerwait = desc.bPwrOn2PwrGood * 2;
     hub.portcount = desc.bNbrPorts;
     hub.op = &HubOp;
+
+    // Turn on power to ports.
+    int port;
+    for (port=0; port<desc.bNbrPorts; port++) {
+        ret = set_port_feature(&hub, port, USB_PORT_FEAT_POWER);
+        if (ret)
+            return ret;
+    }
+    // Wait for port power to stabilize.
+    msleep(desc.bPwrOn2PwrGood * 2);
+
     usb_enumerate(&hub);
 
     dprintf(1, "Initialized USB HUB (%d ports used)\n", hub.devcount);
diff --git a/src/hw/usb.h b/src/hw/usb.h
index 3a663ce..223e4d6 100644
--- a/src/hw/usb.h
+++ b/src/hw/usb.h
@@ -46,7 +46,6 @@ struct usbhub_s {
     struct usbdevice_s *usbdev;
     struct usb_s *cntl;
     struct mutex_s lock;
-    u32 powerwait;
     u32 port;
     u32 threads;
     u32 portcount;
-- 
1.9.3




More information about the SeaBIOS mailing list