[coreboot] SeaBIOS wit USB3.0 hub and USB3.0 devide behind the hub

Werner Zeh werner.zeh at gmx.net
Mon Dec 15 09:06:51 CET 2014


Hi Kevin.

I have tried your fix but it doesn't help.
You can find a (huge) log with loglevel 5 here: http://pastebin.com/21rrAhfA

Werner

> Gesendet: Donnerstag, 11. Dezember 2014 um 19:46 Uhr
> Von: "Kevin O'Connor" <kevin at koconnor.net>
> An: "Werner Zeh" <werner.zeh at gmx.net>
> Cc: coreboot at coreboot.org, seabios at seabios.org
> Betreff: Re: [coreboot] SeaBIOS wit USB3.0 hub and USB3.0 devide behind the hub
>
> On Wed, Dec 10, 2014 at 07:21:54AM +0100, Werner Zeh wrote:
> > Hi all.
> > 
> > I have made some tests with SeaBIOS and XHCI and found, that on my board (which is baytrail-based)
> > a USB3.0 hub won't work. For those who are familar with SeaBIOS I have attached two
> > logfiles from SeaBIOS. One of them is with the USB3.0 flash drive directly connected to one of the root ports of SoC
> > (in which case the boot process starts from the flash drive) and the other is with the same flash drive but a USB3.0 hub in between 
> > (I have used a hub from Delock #62534, http://www.delock.de/produkte/F_247_extern_62534/merkmale.html). In the hub-case, I see the
> > "No bootable device" screen and no boot will happen.
> > 
> > Maybe someone more experienced can see the cause from the logs.
> 
> > ?SeaBIOS (version rel-1.7.5-116-g56b252e-dirty-20141210_064921-deerlf0x73)
> [...]
> > |1ad7d000| xhci_process_events: ring 0x1adcb200 [trb 0x1adcb200, evt 0x1adcb300, type 32, eidx 1, cc 1]
> > |1ad7d000| device rev=0300 cls=09 sub=00 proto=03 size=512
> > |1ad7d000| xhci_realloc_pipe: usbdev 0x1ad82bc0, ring 0x1adba600, slotid 4, epid 1
> [...]
> > |1ad7f000| xhci_process_events: ring 0x1adba600 [trb 0x1adba6c0, evt 0x1adba700, type 32, eidx 13, cc 6]
> 
> It looks like the hub is found, but responds with a "stall" error on
> the get_hub_desc() request.  Looks like usb3 hubs use a different
> descriptor id.  You could try the patch below - it's a lot of guess
> work though.
> 
> -Kevin
> 
> 
> diff --git a/src/hw/usb-hub.c b/src/hw/usb-hub.c
> index c21cbfb..7688ef2 100644
> --- a/src/hw/usb-hub.c
> +++ b/src/hw/usb-hub.c
> @@ -17,7 +17,10 @@ get_hub_desc(struct usb_pipe *pipe, struct usb_hub_descriptor *desc)
>      struct usb_ctrlrequest req;
>      req.bRequestType = USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_DEVICE;
>      req.bRequest = USB_REQ_GET_DESCRIPTOR;
> -    req.wValue = USB_DT_HUB<<8;
> +    if (pipe->speed == USB_SUPERSPEED)
> +        req.wValue = USB_DT_HUB3<<8;
> +    else
> +        req.wValue = USB_DT_HUB<<8;
>      req.wIndex = 0;
>      req.wLength = sizeof(*desc);
>      return usb_send_default_control(pipe, &req, desc);
> @@ -105,7 +108,9 @@ usb_hub_reset(struct usbhub_s *hub, u32 port)
>          ret = get_port_status(hub, port, &sts);
>          if (ret)
>              goto fail;
> -        if (!(sts.wPortStatus & USB_PORT_STAT_RESET))
> +        if (!(sts.wPortStatus & USB_PORT_STAT_RESET)
> +            && (hub->usbdev->speed != USB_SUPERSPEED
> +                || !(sts.wPortStatus & USB_PORT_STAT_LINK_MASK)))
>              break;
>          if (timer_check(end)) {
>              warn_timeout();
> @@ -119,6 +124,8 @@ usb_hub_reset(struct usbhub_s *hub, u32 port)
>          // Device no longer present
>          return -1;
>  
> +    if (hub->usbdev->speed == USB_SUPERSPEED)
> +        return USB_SUPERSPEED;
>      return ((sts.wPortStatus & USB_PORT_STAT_SPEED_MASK)
>              >> USB_PORT_STAT_SPEED_SHIFT);
>  
> diff --git a/src/hw/usb-hub.h b/src/hw/usb-hub.h
> index 5b09947..f7436a5 100644
> --- a/src/hw/usb-hub.h
> +++ b/src/hw/usb-hub.h
> @@ -11,6 +11,7 @@ int usb_hub_setup(struct usbdevice_s *usbdev);
>   ****************************************************************/
>  
>  #define USB_DT_HUB                      (USB_TYPE_CLASS | 0x09)
> +#define USB_DT_HUB3                     (USB_TYPE_CLASS | 0x0a)
>  
>  struct usb_hub_descriptor {
>      u8  bDescLength;
> @@ -48,7 +49,8 @@ struct usb_port_status {
>  #define USB_PORT_STAT_SUSPEND           0x0004
>  #define USB_PORT_STAT_OVERCURRENT       0x0008
>  #define USB_PORT_STAT_RESET             0x0010
> -#define USB_PORT_STAT_L1                0x0020
> +#define USB_PORT_STAT_LINK_SHIFT        5
> +#define USB_PORT_STAT_LINK_MASK         (0x7 << USB_PORT_STAT_LINK_SHIFT)
>  #define USB_PORT_STAT_POWER             0x0100
>  #define USB_PORT_STAT_SPEED_SHIFT       9
>  #define USB_PORT_STAT_SPEED_MASK        (0x3 << USB_PORT_STAT_SPEED_SHIFT)
> 



More information about the coreboot mailing list