lkml.org 
[lkml]   [2020]   [Jun]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.7 284/376] PCI: Avoid Pericom USB controller OHCI/EHCI PME# defect
    Date
    From: Kai-Heng Feng <kai.heng.feng@canonical.com>

    [ Upstream commit 68f5fc4ea9ddf9f77720d568144219c4e6452cde ]

    Both Pericom OHCI and EHCI devices advertise PME# support from all power
    states:

    06:00.0 USB controller [0c03]: Pericom Semiconductor PI7C9X442SL USB OHCI Controller [12d8:400e] (rev 01) (prog-if 10 [OHCI])
    Subsystem: Pericom Semiconductor PI7C9X442SL USB OHCI Controller [12d8:400e]
    Capabilities: [80] Power Management version 3
    Flags: PMEClk- DSI- D1+ D2+ AuxCurrent=375mA PME(D0+,D1+,D2+,D3hot+,D3cold+)

    06:00.2 USB controller [0c03]: Pericom Semiconductor PI7C9X442SL USB EHCI Controller [12d8:400f] (rev 01) (prog-if 20 [EHCI])
    Subsystem: Pericom Semiconductor PI7C9X442SL USB EHCI Controller [12d8:400f]
    Capabilities: [80] Power Management version 3
    Flags: PMEClk- DSI- D1+ D2+ AuxCurrent=375mA PME(D0+,D1+,D2+,D3hot+,D3cold+)

    But testing shows that it's unreliable: there is a 20% chance PME# won't be
    asserted when a USB device is plugged.

    Remove PME support for both devices to make USB plugging work reliably.

    Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=205981
    Link: https://lore.kernel.org/r/20200508065343.32751-2-kai.heng.feng@canonical.com
    Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com>
    Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
    Cc: stable@vger.kernel.org
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/pci/quirks.c | 13 +++++++++++++
    1 file changed, 13 insertions(+)

    diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
    index ca9ed5774eb1..268f74d43a73 100644
    --- a/drivers/pci/quirks.c
    +++ b/drivers/pci/quirks.c
    @@ -5568,6 +5568,19 @@ static void pci_fixup_no_d0_pme(struct pci_dev *dev)
    }
    DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ASMEDIA, 0x2142, pci_fixup_no_d0_pme);

    +/*
    + * Device [12d8:0x400e] and [12d8:0x400f]
    + * These devices advertise PME# support in all power states but don't
    + * reliably assert it.
    + */
    +static void pci_fixup_no_pme(struct pci_dev *dev)
    +{
    + pci_info(dev, "PME# is unreliable, disabling it\n");
    + dev->pme_support = 0;
    +}
    +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_PERICOM, 0x400e, pci_fixup_no_pme);
    +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_PERICOM, 0x400f, pci_fixup_no_pme);
    +
    static void apex_pci_fixup_class(struct pci_dev *pdev)
    {
    pdev->class = (PCI_CLASS_SYSTEM_OTHER << 8) | pdev->class;
    --
    2.25.1


    \
     
     \ /
      Last update: 2020-06-19 17:55    [W:4.144 / U:0.080 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site