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@xxxxxxxxxxxxxxx> > Tested-by: Alessandro Antenucci <antenucci@xxxxxxx> > Signed-off-by: Bin Liu <b-liu@xxxxxx> > --- > 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@xxxxxxxxxxxxxxxxxxx>