Message ID | 1532029177-23090-1-git-send-email-b-liu@ti.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Thu, 19 Jul 2018, Bin Liu wrote: > Based on USB2.0 Spec Section 11.12.5, > > "If a hub has per-port power switching and per-port current limiting, > an over-current on one port may still cause the power on another port > to fall below specific minimums. In this case, the affected port is > placed in the Power-Off state and C_PORT_OVER_CURRENT is set for the > port, but PORT_OVER_CURRENT is not set." > > so let's check C_PORT_OVER_CURRENT too for over current condition. > > Fixes: 08d1dec6f405 ("usb:hub set hub->change_bits when over-current happens") > Cc: <stable@vger.kernel.org> > Tested-by: Alessandro Antenucci <antenucci@korg.it> > Signed-off-by: Bin Liu <b-liu@ti.com> > --- > drivers/usb/core/hub.c | 8 ++++++-- > 1 file changed, 6 insertions(+), 2 deletions(-) > > diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c > index fcae521df29b..1fb266809966 100644 > --- a/drivers/usb/core/hub.c > +++ b/drivers/usb/core/hub.c > @@ -1142,10 +1142,14 @@ static void hub_activate(struct usb_hub *hub, enum hub_activation_type type) > > if (!udev || udev->state == USB_STATE_NOTATTACHED) { > /* Tell hub_wq to disconnect the device or > - * check for a new connection > + * check for a new connection or over current condition. > + * Based on USB2.0 Spec Section 11.12.5, > + * C_PORT_OVER_CURRENT could be set while > + * PORT_OVER_CURRENT is not. So check for any of them. > */ > if (udev || (portstatus & USB_PORT_STAT_CONNECTION) || > - (portstatus & USB_PORT_STAT_OVERCURRENT)) > + (portstatus & USB_PORT_STAT_OVERCURRENT) || > + (portchange & USB_PORT_STAT_C_OVERCURRENT)) > set_bit(port1, hub->change_bits); > > } else if (portstatus & USB_PORT_STAT_ENABLE) { Acked-by: Alan Stern <stern@rowland.harvard.edu> -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index fcae521df29b..1fb266809966 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c @@ -1142,10 +1142,14 @@ static void hub_activate(struct usb_hub *hub, enum hub_activation_type type) if (!udev || udev->state == USB_STATE_NOTATTACHED) { /* Tell hub_wq to disconnect the device or - * check for a new connection + * check for a new connection or over current condition. + * Based on USB2.0 Spec Section 11.12.5, + * C_PORT_OVER_CURRENT could be set while + * PORT_OVER_CURRENT is not. So check for any of them. */ if (udev || (portstatus & USB_PORT_STAT_CONNECTION) || - (portstatus & USB_PORT_STAT_OVERCURRENT)) + (portstatus & USB_PORT_STAT_OVERCURRENT) || + (portchange & USB_PORT_STAT_C_OVERCURRENT)) set_bit(port1, hub->change_bits); } else if (portstatus & USB_PORT_STAT_ENABLE) {