diff mbox series

usb: mtu3: fix USB 3.0 dual-role-switch from device to host

Message ID 20220419081245.21015-1-macpaul.lin@mediatek.com (mailing list archive)
State Accepted
Commit 456244aeecd54249096362a173dfe06b82a5cafa
Headers show
Series usb: mtu3: fix USB 3.0 dual-role-switch from device to host | expand

Commit Message

Macpaul Lin April 19, 2022, 8:12 a.m. UTC
Issue description:
  When an OTG port has been switched to device role and then switch back
  to host role again, the USB 3.0 Host (XHCI) will not be able to detect
  "plug in event of a connected USB 2.0/1.0 ((Highspeed and Fullspeed)
  devices until system reboot.

Root cause and Solution:
  There is a condition checking flag "ssusb->otg_switch.is_u3_drd" in
  toggle_opstate(). At the end of role switch procedure, toggle_opstate()
  will be called to set DC_SESSION and SOFT_CONN bit. If "is_u3_drd" was
  set and switched the role to USB host 3.0, bit DC_SESSION and SOFT_CONN
  will be skipped hence caused the port cannot detect connected USB 2.0
  (Highspeed and Fullspeed) devices. Simply remove the condition check to
  solve this issue.

Fixes: d0ed062a8b75 ("usb: mtu3: dual-role mode support")
Signed-off-by: Macpaul Lin <macpaul.lin@mediatek.com>
Signed-off-by: Tainping Fang <tianping.fang@mediatek.com>
Tested-by: Fabien Parent <fparent@baylibre.com>
Cc: stable@vger.kernel.org
---
 drivers/usb/mtu3/mtu3_dr.c | 6 ++----
 1 file changed, 2 insertions(+), 4 deletions(-)

Comments

Chunfeng Yun (云春峰) April 20, 2022, 9:18 a.m. UTC | #1
On Tue, 2022-04-19 at 16:12 +0800, Macpaul Lin wrote:
> Issue description:
>   When an OTG port has been switched to device role and then switch
> back
>   to host role again, the USB 3.0 Host (XHCI) will not be able to
> detect
>   "plug in event of a connected USB 2.0/1.0 ((Highspeed and
> Fullspeed)
>   devices until system reboot.
> 
> Root cause and Solution:
>   There is a condition checking flag "ssusb->otg_switch.is_u3_drd" in
>   toggle_opstate(). At the end of role switch procedure,
> toggle_opstate()
>   will be called to set DC_SESSION and SOFT_CONN bit. If "is_u3_drd"
> was
>   set and switched the role to USB host 3.0, bit DC_SESSION and
> SOFT_CONN
>   will be skipped hence caused the port cannot detect connected USB
> 2.0
>   (Highspeed and Fullspeed) devices. Simply remove the condition
> check to
>   solve this issue.
> 
> Fixes: d0ed062a8b75 ("usb: mtu3: dual-role mode support")
> Signed-off-by: Macpaul Lin <macpaul.lin@mediatek.com>
> Signed-off-by: Tainping Fang <tianping.fang@mediatek.com>
> Tested-by: Fabien Parent <fparent@baylibre.com>
> Cc: stable@vger.kernel.org
> ---
>  drivers/usb/mtu3/mtu3_dr.c | 6 ++----
>  1 file changed, 2 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/usb/mtu3/mtu3_dr.c b/drivers/usb/mtu3/mtu3_dr.c
> index ec6ec621838b..b820724c56e4 100644
> --- a/drivers/usb/mtu3/mtu3_dr.c
> +++ b/drivers/usb/mtu3/mtu3_dr.c
> @@ -21,10 +21,8 @@ static inline struct ssusb_mtk
> *otg_sx_to_ssusb(struct otg_switch_mtk *otg_sx)
>  
>  static void toggle_opstate(struct ssusb_mtk *ssusb)
>  {
> -	if (!ssusb->otg_switch.is_u3_drd) {
> -		mtu3_setbits(ssusb->mac_base, U3D_DEVICE_CONTROL,
> DC_SESSION);
> -		mtu3_setbits(ssusb->mac_base, U3D_POWER_MANAGEMENT,
> SOFT_CONN);
> -	}
> +	mtu3_setbits(ssusb->mac_base, U3D_DEVICE_CONTROL, DC_SESSION);
> +	mtu3_setbits(ssusb->mac_base, U3D_POWER_MANAGEMENT, SOFT_CONN);
>  }
>  
Reviewed-by: Chunfeng Yun <chunfeng.yun@mediatek.com>

Thanks

>  /* only port0 supports dual-role mode */
diff mbox series

Patch

diff --git a/drivers/usb/mtu3/mtu3_dr.c b/drivers/usb/mtu3/mtu3_dr.c
index ec6ec621838b..b820724c56e4 100644
--- a/drivers/usb/mtu3/mtu3_dr.c
+++ b/drivers/usb/mtu3/mtu3_dr.c
@@ -21,10 +21,8 @@  static inline struct ssusb_mtk *otg_sx_to_ssusb(struct otg_switch_mtk *otg_sx)
 
 static void toggle_opstate(struct ssusb_mtk *ssusb)
 {
-	if (!ssusb->otg_switch.is_u3_drd) {
-		mtu3_setbits(ssusb->mac_base, U3D_DEVICE_CONTROL, DC_SESSION);
-		mtu3_setbits(ssusb->mac_base, U3D_POWER_MANAGEMENT, SOFT_CONN);
-	}
+	mtu3_setbits(ssusb->mac_base, U3D_DEVICE_CONTROL, DC_SESSION);
+	mtu3_setbits(ssusb->mac_base, U3D_POWER_MANAGEMENT, SOFT_CONN);
 }
 
 /* only port0 supports dual-role mode */