From cc47a320ca8f8b19d00b1b710bb1b377a223c8e8 Mon Sep 17 00:00:00 2001 From: LeoLiu-oc Date: Fri, 14 Nov 2025 19:24:28 +0800 Subject: [PATCH 1/2] Revert "EHCI: Clear wakeup signal locked in S0 state when device plug in" zhaoxin inclusion category: feature bugzilla: https://gitee.com/openeuler/kernel/issues/ID6P9Y CVE: NA -------------------- This reverts commit 7d2f5624044c73d0e9abcdc957d8c72b301319d4. EHCI: Clear wakeup signal locked in S0 state when device plug in has been accepted by the mainline. Therefore, it is necessary to update to the upstream Mainline Version. Reviewed-by: Tony W. Wang Tested-by: Lyle li Signed-off-by: leoliu-oc --- drivers/pci/pci-driver.c | 6 +----- drivers/usb/host/ehci-hcd.c | 21 --------------------- drivers/usb/host/ehci-pci.c | 4 ---- drivers/usb/host/ehci.h | 1 - 4 files changed, 1 insertion(+), 31 deletions(-) diff --git a/drivers/pci/pci-driver.c b/drivers/pci/pci-driver.c index 606e4a083337..986bb53b60c9 100644 --- a/drivers/pci/pci-driver.c +++ b/drivers/pci/pci-driver.c @@ -525,11 +525,7 @@ static int pci_restore_standard_config(struct pci_dev *pci_dev) } pci_restore_state(pci_dev); - if (!(pci_dev->vendor == PCI_VENDOR_ID_ZHAOXIN && - pci_dev->device == 0x3104 && - (pci_dev->revision & 0xf0) == 0x90 && - pci_dev->class == PCI_CLASS_SERIAL_USB_EHCI)) - pci_pme_restore(pci_dev); + pci_pme_restore(pci_dev); return 0; } diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c index 586e2735d6e0..8aff19ff8e8f 100644 --- a/drivers/usb/host/ehci-hcd.c +++ b/drivers/usb/host/ehci-hcd.c @@ -1142,27 +1142,6 @@ int ehci_suspend(struct usb_hcd *hcd, bool do_wakeup) return -EBUSY; } - /*clear wakeup signal locked in S0 state when device plug in*/ - if (ehci->zx_wakeup_clear == 1) { - u32 __iomem *reg = &ehci->regs->port_status[4]; - u32 t1 = ehci_readl(ehci, reg); - - t1 &= (u32)~0xf0000; - t1 |= PORT_TEST_FORCE; - ehci_writel(ehci, t1, reg); - t1 = ehci_readl(ehci, reg); - usleep_range(1000, 2000); - t1 &= (u32)~0xf0000; - ehci_writel(ehci, t1, reg); - usleep_range(1000, 2000); - t1 = ehci_readl(ehci, reg); - ehci_writel(ehci, t1 | PORT_CSC, reg); - udelay(500); - t1 = ehci_readl(ehci, &ehci->regs->status); - ehci_writel(ehci, t1 & STS_PCD, &ehci->regs->status); - ehci_readl(ehci, &ehci->regs->status); - } - return 0; } EXPORT_SYMBOL_GPL(ehci_suspend); diff --git a/drivers/usb/host/ehci-pci.c b/drivers/usb/host/ehci-pci.c index d0d07d30e912..638f03b89739 100644 --- a/drivers/usb/host/ehci-pci.c +++ b/drivers/usb/host/ehci-pci.c @@ -225,10 +225,6 @@ static int ehci_pci_setup(struct usb_hcd *hcd) ehci->has_synopsys_hc_bug = 1; } break; - case PCI_VENDOR_ID_ZHAOXIN: - if (pdev->device == 0x3104 && (pdev->revision & 0xf0) == 0x90) - ehci->zx_wakeup_clear = 1; - break; case PCI_VENDOR_ID_ASPEED: if (pdev->device == PCI_DEVICE_ID_ASPEED_EHCI) { ehci_info(ehci, "applying Aspeed HC workaround\n"); diff --git a/drivers/usb/host/ehci.h b/drivers/usb/host/ehci.h index 8da080a54668..59fd523c55f3 100644 --- a/drivers/usb/host/ehci.h +++ b/drivers/usb/host/ehci.h @@ -219,7 +219,6 @@ struct ehci_hcd { /* one per controller */ unsigned need_oc_pp_cycle:1; /* MPC834X port power */ unsigned imx28_write_fix:1; /* For Freescale i.MX28 */ unsigned is_aspeed:1; - unsigned zx_wakeup_clear:1; /* required for usb32 quirk */ #define OHCI_CTRL_HCFS (3 << 6) -- Gitee From eda3b922dc832d045125b3707fd10188836d4ae8 Mon Sep 17 00:00:00 2001 From: Weitao Wango Date: Thu, 24 Mar 2022 20:17:35 +0800 Subject: [PATCH 2/2] USB: Fix ehci infinite suspend-resume loop issue in zhaoxin mainline inclusion from mainline-v5.18-rc5 commit f085bd4bfe0907ce2fad2c787fc65871ec5ca6d6 category: feature bugzilla: https://gitee.com/openeuler/kernel/issues/ICULKF CVE: NA -------------------- In zhaoxin platform, some ehci projects will latch a wakeup signal internal when plug in a device on port during system S0. This wakeup signal will turn on when ehci runtime suspend, which will trigger a system control interrupt that will resume ehci back to D0. As no device connect, ehci will be set to runtime suspend and turn on the internal latched wakeup signal again. It will cause a suspend-resume loop and generate system control interrupt continuously. Fixed this issue by clear wakeup signal latched in ehci internal when ehci resume callback is called. Acked-by: Alan Stern Signed-off-by: Weitao Wang Link: https://lore.kernel.org/r/20220324121735.3803-1-WeitaoWang-oc@zhaoxin.com Signed-off-by: Greg Kroah-Hartman Reviewed-by: Tony W. Wang Tested-by: Lyle li Signed-off-by: leoliu-oc --- drivers/usb/host/ehci-hcd.c | 23 +++++++++++++++++++++++ drivers/usb/host/ehci-pci.c | 4 ++++ drivers/usb/host/ehci.h | 1 + 3 files changed, 28 insertions(+) diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c index 8aff19ff8e8f..c11a89cd5a35 100644 --- a/drivers/usb/host/ehci-hcd.c +++ b/drivers/usb/host/ehci-hcd.c @@ -1109,6 +1109,26 @@ static void ehci_remove_device(struct usb_hcd *hcd, struct usb_device *udev) #ifdef CONFIG_PM +/* Clear wakeup signal locked in zhaoxin platform when device plug in. */ +static void ehci_zx_wakeup_clear(struct ehci_hcd *ehci) +{ + u32 __iomem *reg = &ehci->regs->port_status[4]; + u32 t1 = ehci_readl(ehci, reg); + + t1 &= (u32)~0xf0000; + t1 |= PORT_TEST_FORCE; + ehci_writel(ehci, t1, reg); + t1 = ehci_readl(ehci, reg); + msleep(1); + t1 &= (u32)~0xf0000; + ehci_writel(ehci, t1, reg); + ehci_readl(ehci, reg); + msleep(1); + t1 = ehci_readl(ehci, reg); + ehci_writel(ehci, t1 | PORT_CSC, reg); + ehci_readl(ehci, reg); +} + /* suspend/resume, section 4.3 */ /* These routines handle the generic parts of controller suspend/resume */ @@ -1160,6 +1180,9 @@ int ehci_resume(struct usb_hcd *hcd, bool force_reset) if (ehci->shutdown) return 0; /* Controller is dead */ + if (ehci->zx_wakeup_clear_needed) + ehci_zx_wakeup_clear(ehci); + /* * If CF is still set and reset isn't forced * then we maintained suspend power. diff --git a/drivers/usb/host/ehci-pci.c b/drivers/usb/host/ehci-pci.c index 638f03b89739..9937c5a7efc2 100644 --- a/drivers/usb/host/ehci-pci.c +++ b/drivers/usb/host/ehci-pci.c @@ -231,6 +231,10 @@ static int ehci_pci_setup(struct usb_hcd *hcd) ehci->is_aspeed = 1; } break; + case PCI_VENDOR_ID_ZHAOXIN: + if (pdev->device == 0x3104 && (pdev->revision & 0xf0) == 0x90) + ehci->zx_wakeup_clear_needed = 1; + break; } /* optional debug port, normally in the first BAR */ diff --git a/drivers/usb/host/ehci.h b/drivers/usb/host/ehci.h index 59fd523c55f3..480833c942e7 100644 --- a/drivers/usb/host/ehci.h +++ b/drivers/usb/host/ehci.h @@ -219,6 +219,7 @@ struct ehci_hcd { /* one per controller */ unsigned need_oc_pp_cycle:1; /* MPC834X port power */ unsigned imx28_write_fix:1; /* For Freescale i.MX28 */ unsigned is_aspeed:1; + unsigned zx_wakeup_clear_needed:1; /* required for usb32 quirk */ #define OHCI_CTRL_HCFS (3 << 6) -- Gitee