[SeaBIOS] SeaBIOS recognising USB 3.0 on boot works - partly

Kevin O'Connor kevin at koconnor.net
Sat Dec 19 03:12:28 CET 2015


On Sat, Dec 19, 2015 at 01:49:04AM +0000, edward wandasiewicz wrote:
> Is it a technically a manufacturer messing up the USB spec definitions it
> should be following?

That's a great question, and I don't know the answer to it.  It would
be great if there was some guidance in the USB3 spec to help here as
that would help point out if this is a controller, device, or software
issue.

> Of all the USB drives I've come across, this Philips one is the only one
> that behaves like this.
> 
> It's like its saying "hey, I'm a USB 2.0 spec device, no wait a moment, I'm
> really a USB 3.0 spec device." and we turn around and say "make ya mind
> up", by which time it's too late.

We've seen this USB2/3 confusion pop up a few times before - for
example, see:
  http://www.seabios.org/pipermail/seabios/2015-November/009907.html
  http://www.seabios.org/pipermail/seabios/2015-August/009626.html
  http://www.seabios.org/pipermail/seabios/2014-June/008151.html

This is the first time I've seen a report of a device/controller
having the confusion long enough for the USB2 instance to survive
through full drive detection.  (FYI, some of the issues in the emails
above I think were resolved with other fixes.)

> Sometimes we just can't fix every problem.
> 
> Granted this one is a tough one to solve.

I don't think it's that difficult to address your particular hardware
- for example, see the patch below on top of the testing branch.  It's
unclear to me, however, what implications a change like the one below
would have on other people's hardware.  :-(

-Kevin


--- a/src/hw/usb.c
+++ b/src/hw/usb.c
@@ -441,10 +441,14 @@ usb_hub_port_setup(void *data)
     mutex_unlock(&hub->cntl->resetlock);
 
     // Make sure device is still present (catches some weird USB3 devices)
-    ret = hub->op->detect(hub, port);
-    if (ret <= 0) {
-        hub->op->disconnect(hub, port);
-        goto done;
+    if (hub->cntl->type == USB_TYPE_XHCI && usbdev->speed == USB_HIGHSPEED) {
+        while (!timer_check(hub->detectend))
+            yield();
+        ret = hub->op->detect(hub, port);
+        if (ret <= 0) {
+            hub->op->disconnect(hub, port);
+            goto done;
+        }
     }
 
     // Configure the device



More information about the SeaBIOS mailing list