On Fri, 27 Dec 2019, Peter Chen wrote:
On 19-12-26 14:46:15, Alan Stern wrote:
On Thu, 26 Dec 2019, Guenter Roeck wrote:
On shutdown, ehci_power_off() is called unconditionally to power off each port, even if it was never called to power on the port. For chipidea, this results in a call to ehci_ci_portpower() with a request to power off ports even if the port was never powered on. This results in the following warning from the regulator code.
That's weird -- we should always power-on every port during hub initialization.
It looks like there's a bug in hub.c:hub_activate(): The line under HUB_INIT which calls hub_power_on() should call usb_hub_set_port_power() instead. In fact, the comment near the start of hub_power_on() is wrong. It says "Enable power on each port", but in fact it only enables power for ports that had been powered-on previously (i.e., the port's bit in hub->power_bits was set). Apparently this got messed up in commit ad493e5e5805 ("usb: add usb port auto power off mechanism").
Now, the chipidea driver may still need to be updated, because ehci_turn_off_all_ports() will still be called during shutdown and it will try to power-down all ports, even those which are already powered down (for example, because the port is suspended).
Hi Alan,
When the port is suspended, why it was turned off? If it was turned off, how could respond wakeup event?
You're right; if a port is powered off then it can't respond to wakeup events.
But if the power/wakeup attribute is set to "disabled" then the port doesn't need to respond to wakeup events. In that situation, usbcore may decide to power-down the port.
Alan Stern