[U-Boot] [U-Boot,v3,7/8] usb: hub: Reset only usb 2.0 ports

Vivek Gautam gautamvivek1987 at gmail.com
Tue Apr 30 14:24:44 CEST 2013


Hi Marek,


On Wed, Apr 24, 2013 at 11:38 AM, Vivek Gautam
<gautamvivek1987 at gmail.com> wrote:
> On Wed, Apr 24, 2013 at 5:51 AM, Marek Vasut <marex at denx.de> wrote:
>> Dear Julius Werner,
>>
>>> Sorry, forgot this one yesterday. I would consider to just drop/revert
>>> this patch entirely. It's not wrong, but it adds complexity where it is
>>> not needed. You don't have to reset SuperSpeed devices, but it shouldn't
>>> hurt either and from what I can tell Linux does it as well.
>>
>> Ok, I can drop this one.

We need to drop this from u-boot-usb/next branch, right ?
I am sure this is added to you to-do list, just wanted to make sure
since i could
see it in 'next' right now.
Thanks !!

>
> Alright, we will drop this.
> I think a possible bug related to calling xhci_port_state_to_neutral()
> in xhci_submit_root()
> (one pointed by Julius in [PATCH v3 3/8] usb: hub: Power-cycle on
> root-hub ports) was causing
> USB 3.0 protocol ports fail while resetting.
> Now things are fine.
>
>>
>>> > As per XHCI specifications USB 3.0 protocol ports attempt
>>> > to advance to 'Enabled' state; however USB 2.0 protocol ports
>>> > require software reset to advance them to 'Enabled' state.
>>> > Thereby, inferring that software need to reset USB 2.0 protocol
>>> > ports invariably (as per EHCI spec or xHCI spec).
>>> >
>>> > Signed-off-by: Vivek Gautam <gautam.vivek at samsung.com>
>>> >
>>> > ---
>>> > This patch added in V3(current-version) of this patch-series.
>>> >
>>> >  common/usb_hub.c |   23 +++++++++++++++++++----
>>> >  1 files changed, 19 insertions(+), 4 deletions(-)
>>> >
>>> > diff --git a/common/usb_hub.c b/common/usb_hub.c
>>> > index 1e225e6..eedbcf2 100644
>>> > --- a/common/usb_hub.c
>>> > +++ b/common/usb_hub.c
>>> > @@ -233,6 +233,7 @@ void usb_hub_port_connect_change(struct usb_device
>>> > *dev, int port)
>>> >
>>> >     struct usb_device *usb;
>>> >     ALLOC_CACHE_ALIGN_BUFFER(struct usb_port_status, portsts, 1);
>>> >     unsigned short portstatus;
>>> >
>>> > +   uint32_t do_port_reset = 1;
>>> >
>>> >     /* Check status */
>>> >     if (usb_get_port_status(dev, port + 1, portsts) < 0) {
>>> >
>>> > @@ -246,6 +247,9 @@ void usb_hub_port_connect_change(struct usb_device
>>> > *dev, int port)
>>> >
>>> >           le16_to_cpu(portsts->wPortChange),
>>> >           portspeed(portstatus));
>>> >
>>> > +   if (portstatus & (1 << USB_PORT_FEAT_SUPERSPEED))
>>> > +           do_port_reset = 0;
>>> > +
>>> >
>>> >     /* Clear the connection change status */
>>> >     usb_clear_port_feature(dev, port + 1, USB_PORT_FEAT_C_CONNECTION);
>>> >
>>> > @@ -259,10 +263,21 @@ void usb_hub_port_connect_change(struct usb_device
>>> > *dev, int port)
>>> >
>>> >     }
>>> >     mdelay(200);
>>> >
>>> > -   /* Reset the port */
>>> > -   if (hub_port_reset(dev, port, &portstatus) < 0) {
>>> > -           printf("cannot reset port %i!?\n", port + 1);
>>> > -           return;
>>> > +   /*
>>> > +    * Reset the port:
>>> > +    * As per xHCI protocol, USB 3.0 devices do not require
>>> > +    * a port reset, however USB 2.0 device do require the same
>>> > +    * to let ports proceed to 'enabled' state
>>> > +    *
>>> > +    * XXX: Will this break EHCI ??
>>> > +    * probably not, above condition for 'do_port_reset' checks for
>>> > +    * speed, and for EHCI it can't reach Super speed anyways.
>>> > +    */
>>> > +   if (do_port_reset) {
>>> > +           if (hub_port_reset(dev, port, &portstatus) < 0) {
>>> > +                   printf("cannot reset port %i!?\n", port + 1);
>>> > +                   return;
>>> > +           }
>>> >
>>> >     }
>>> >
>>> >     mdelay(200);


-- 
Best Regards
Vivek


More information about the U-Boot mailing list