Message ID | 1543413321-30761-1-git-send-email-mathias.nyman@linux.intel.com (mailing list archive) |
---|---|
State | Mainlined |
Commit | e86108940e541febf35813402ff29fa6f4a9ac0b |
Headers | show |
Series | usb: hub: delay hub autosuspend if USB3 port is still link training | expand |
On Wed, 28 Nov 2018, Mathias Nyman wrote: > When initializing a hub we want to give a USB3 port in link training > the same debounce delay time before autosuspening the hub as already > trained, connected enabled ports. > > USB3 ports won't reach the enabled state with "current connect status" and > "connect status change" bits set until the USB3 link training finishes. > > Catching the port in link training (polling) and adding the debounce delay > prevents unnecessary failed attempts to autosuspend the hub. > > Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com> > --- > drivers/usb/core/hub.c | 10 ++++++++++ > 1 file changed, 10 insertions(+) > > diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c > index 0f9381b..009f928 100644 > --- a/drivers/usb/core/hub.c > +++ b/drivers/usb/core/hub.c > @@ -1112,6 +1112,16 @@ static void hub_activate(struct usb_hub *hub, enum hub_activation_type type) > USB_PORT_FEAT_ENABLE); > } > > + /* > + * Add debounce if USB3 link is in polling/link training state. > + * Link will automatically transition to Enabled state after > + * link training completes. > + */ > + if (hub_is_superspeed(hdev) && > + ((portstatus & USB_PORT_STAT_LINK_STATE) == > + USB_SS_PORT_LS_POLLING)) > + need_debounce_delay = true; > + > /* Clear status-change flags; we'll debounce later */ > if (portchange & USB_PORT_STAT_C_CONNECTION) { > need_debounce_delay = true; Acked-by: Alan Stern <stern@rowland.harvard.edu>
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index 0f9381b..009f928 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c @@ -1112,6 +1112,16 @@ static void hub_activate(struct usb_hub *hub, enum hub_activation_type type) USB_PORT_FEAT_ENABLE); } + /* + * Add debounce if USB3 link is in polling/link training state. + * Link will automatically transition to Enabled state after + * link training completes. + */ + if (hub_is_superspeed(hdev) && + ((portstatus & USB_PORT_STAT_LINK_STATE) == + USB_SS_PORT_LS_POLLING)) + need_debounce_delay = true; + /* Clear status-change flags; we'll debounce later */ if (portchange & USB_PORT_STAT_C_CONNECTION) { need_debounce_delay = true;
When initializing a hub we want to give a USB3 port in link training the same debounce delay time before autosuspening the hub as already trained, connected enabled ports. USB3 ports won't reach the enabled state with "current connect status" and "connect status change" bits set until the USB3 link training finishes. Catching the port in link training (polling) and adding the debounce delay prevents unnecessary failed attempts to autosuspend the hub. Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com> --- drivers/usb/core/hub.c | 10 ++++++++++ 1 file changed, 10 insertions(+)