usb: dwc2: hcd: Fix GetPortStatus & SetPortFeature
commit a8d3e4a734599c7d0f6735f8db8a812e503395dd upstream.
On Rasperry Pis without onboard USB hub the power cycle during
power connect init only disable the port but never enabled it again:
usb usb1-port1: attempt power cycle
The port relevant part in dwc2_hcd_hub_control() is skipped in case
port_connect_status = 0 under the assumption the core is or will be soon
in device mode. But this assumption is wrong, because after ClearPortFeature
USB_PORT_FEAT_POWER the port_connect_status will also be 0 and
SetPortFeature (incl. USB_PORT_FEAT_POWER) will be a no-op.
Fix the behavior of dwc2_hcd_hub_control() by replacing the
port_connect_status check with dwc2_is_device_mode().
Link: https://github.com/raspberrypi/linux/issues/6247
Fixes: 7359d482eb ("staging: HCD files for the DWC2 driver")
Signed-off-by: Stefan Wahren <wahrenst@gmx.net>
Link: https://lore.kernel.org/r/20241202001631.75473-3-wahrenst@gmx.net
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
efd985332e
commit
2da6e4d35d
1 changed files with 6 additions and 10 deletions
|
|
@ -3544,11 +3544,9 @@ static int dwc2_hcd_hub_control(struct dwc2_hsotg *hsotg, u16 typereq,
|
|||
port_status |= USB_PORT_STAT_C_OVERCURRENT << 16;
|
||||
}
|
||||
|
||||
if (!hsotg->flags.b.port_connect_status) {
|
||||
if (dwc2_is_device_mode(hsotg)) {
|
||||
/*
|
||||
* The port is disconnected, which means the core is
|
||||
* either in device mode or it soon will be. Just
|
||||
* return 0's for the remainder of the port status
|
||||
* Just return 0's for the remainder of the port status
|
||||
* since the port register can't be read if the core
|
||||
* is in device mode.
|
||||
*/
|
||||
|
|
@ -3618,13 +3616,11 @@ static int dwc2_hcd_hub_control(struct dwc2_hsotg *hsotg, u16 typereq,
|
|||
if (wvalue != USB_PORT_FEAT_TEST && (!windex || windex > 1))
|
||||
goto error;
|
||||
|
||||
if (!hsotg->flags.b.port_connect_status) {
|
||||
if (dwc2_is_device_mode(hsotg)) {
|
||||
/*
|
||||
* The port is disconnected, which means the core is
|
||||
* either in device mode or it soon will be. Just
|
||||
* return without doing anything since the port
|
||||
* register can't be written if the core is in device
|
||||
* mode.
|
||||
* Just return 0's for the remainder of the port status
|
||||
* since the port register can't be read if the core
|
||||
* is in device mode.
|
||||
*/
|
||||
break;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue