Index: /usr/src/sys/dev/usb/usb_hub.c =================================================================== --- /usr/src/sys/dev/usb/usb_hub.c +++ /usr/src/sys/dev/usb/usb_hub.c @@ -1045,6 +1045,29 @@ udev, NULL, portno, UHF_C_PORT_OVER_CURRENT); if (err != USB_ERR_NORMAL_COMPLETION) retval = err; + + /* Turn on hub port power if current get normalized. */ + DPRINTF("Turn on power on port %d.\n", portno); + err = usbd_req_set_port_feature( + udev, NULL, portno, UHF_PORT_POWER); + if (err != USB_ERR_NORMAL_COMPLETION) + retval = err; + + /* Wait for power to come back on. */ + usb_pause_mtx(NULL, + USB_MS_TO_TICKS(usb_port_powerup_delay)); + + /* Re-validate if overcurrent still exists. */ + err = uhub_read_port_status(sc, portno); + if (err != USB_ERR_NORMAL_COMPLETION) + retval = err; + if (sc->sc_st.port_change & UPS_C_OVERCURRENT_INDICATOR) { + DPRINTF("Overcurrent condition on port %u.\n", portno); + err = usbd_req_clear_port_feature( + udev, NULL, portno, UHF_C_PORT_OVER_CURRENT); + if (err != USB_ERR_NORMAL_COMPLETION) + retval = err; + } } if (!(sc->sc_flags & UHUB_FLAG_DID_EXPLORE)) { /*