FAILED: patch "[PATCH] usb: cdns3: host: fix endless superspeed hub port reset" failed to apply to 5.10-stable tree
[email protected]
maintainerThe patch below does not apply to the 5.10-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
Possible dependencies:
9d5333c93134 ("usb: cdns3: host: fix endless superspeed hub port reset")88171f67a2c1 ("usb: cdns3: Removes xhci_cdns3_suspend_quirk from host-export.h")3d82904559f4 ("usb: cdnsp: cdns3 Add main part of Cadence USBSSP DRD Driver")e93e58d27402 ("usb: cdnsp: Device side header file for CDNSP driver")0b490046d8d7 ("usb: cdns3: Refactoring names in reusable code")394c3a144de8 ("usb: cdns3: Moves reusable code to separate module")f738957277ba ("usb: cdns3: Split core.c into cdns3-plat and core.c file")db8892bb1bb6 ("usb: cdns3: Add support for DRD CDNSP")d2a968dddf98 ("Merge tag 'usb-v5.11-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/peter.chen/usb into usb-next")
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 9d5333c931347005352d5b8beaa43528c94cfc9c Mon Sep 17 00:00:00 2001
From: Li Jun <[email protected]>
Date: Wed, 26 Oct 2022 15:07:49 -0400
Subject: [PATCH] usb: cdns3: host: fix endless superspeed hub port reset
When usb 3.0 hub connect with one USB 2.0 device and NO USB 3.0 device, some usb hub reports endless port reset message.
[ 190.324169] usb 2-1: new SuperSpeed USB device number 88 using xhci-hcd [ 190.352834] hub 2-1:1.0: USB hub found [ 190.356995] hub 2-1:1.0: 4 ports detected [ 190.700056] usb 2-1: USB disconnect, device number 88 [ 192.472139] usb 2-1: new SuperSpeed USB device number 89 using xhci-hcd [ 192.500820] hub 2-1:1.0: USB hub found [ 192.504977] hub 2-1:1.0: 4 ports detected [ 192.852066] usb 2-1: USB disconnect, device number 89
The reason is the runtime pm state of USB2.0 port is active and USB 3.0 port is suspend, so parent device is active state.
cat /sys/bus/platform/devices/5b110000.usb/5b130000.usb/xhci-hcd.1.auto/usb2/power/runtime_status
suspended
cat /sys/bus/platform/devices/5b110000.usb/5b130000.usb/xhci-hcd.1.auto/usb1/power/runtime_status
active
cat /sys/bus/platform/devices/5b110000.usb/5b130000.usb/xhci-hcd.1.auto/power/runtime_status
active
cat /sys/bus/platform/devices/5b110000.usb/5b130000.usb/power/runtime_status
active
So xhci_cdns3_suspend_quirk() have not called. U3 configure is not applied.
move U3 configure into host start. Reinit again in resume function in case controller power lost during suspend.
drivers/usb/cdns3/host.c +28 -28
@@ -24,11 +24,37 @@#define CFG_RXDET_P3_EN BIT(15)#define LPM_2_STB_SWITCH_EN BIT(25) -static int xhci_cdns3_suspend_quirk (struct usb_hcd *hcd); +static void xhci_cdns3_plat_start (struct usb_hcd *hcd) +{ +struct xhci_hcd *xhci =hcd_to_xhci (hcd); +u32 value; + +/* set usbcmd.EU3S */ + value =readl (&xhci->op_regs->command); + value |=CMD_PM_INDEX ; +writel (value, &xhci->op_regs->command); + +if (hcd->regs) { + value =readl (hcd->regs +XECP_AUX_CTRL_REG1 ); + value |=CFG_RXDET_P3_EN ; +writel (value, hcd->regs +XECP_AUX_CTRL_REG1 ); + + value =readl (hcd->regs +XECP_PORT_CAP_REG ); + value |=LPM_2_STB_SWITCH_EN ; +writel (value, hcd->regs +XECP_PORT_CAP_REG ); + } +} + +static int xhci_cdns3_resume_quirk (struct usb_hcd *hcd) +{ +xhci_cdns3_plat_start (hcd); +return 0 ; +}static const struct xhci_plat_priv xhci_plat_cdns3_xhci = { .quirks =XHCI_SKIP_PHY_INIT |XHCI_AVOID_BEI , - .suspend_quirk = xhci_cdns3_suspend_quirk, + .plat_start = xhci_cdns3_plat_start, + .resume_quirk = xhci_cdns3_resume_quirk, };static int __cdns_host_init (struct cdns *cdns)
@@ -90,32 +116,6 @@ static int __cdns_host_init(struct cdns *cdns)return ret; } -static int xhci_cdns3_suspend_quirk (struct usb_hcd *hcd) -{ -struct xhci_hcd *xhci =hcd_to_xhci (hcd); -u32 value; - -if (pm_runtime_status_suspended (hcd->self.controller)) -return 0 ; - -/* set usbcmd.EU3S */ - value =readl (&xhci->op_regs->command); - value |=CMD_PM_INDEX ; -writel (value, &xhci->op_regs->command); - -if (hcd->regs) { - value =readl (hcd->regs +XECP_AUX_CTRL_REG1 ); - value |=CFG_RXDET_P3_EN ; -writel (value, hcd->regs +XECP_AUX_CTRL_REG1 ); - - value =readl (hcd->regs +XECP_PORT_CAP_REG ); - value |=LPM_2_STB_SWITCH_EN ; -writel (value, hcd->regs +XECP_PORT_CAP_REG ); - } - -return 0 ; -} -static void cdns_host_exit (struct cdns *cdns) {kfree (cdns->xhci_plat_data);