lkml.org 
[lkml]   [2018]   [Apr]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v13 5/6] PCI: Unify wait for link active into generic PCI
    Date
    Clients such as HP, DPC are using pcie_wait_link_active(), which waits
    till the link becomes active or inactive.

    Made generic function and moved it to drivers/pci/pci.c

    Signed-off-by: Oza Pawandeep <poza@codeaurora.org>

    diff --git a/drivers/pci/hotplug/pciehp_hpc.c b/drivers/pci/hotplug/pciehp_hpc.c
    index 18a42f8..e0c2b8e 100644
    --- a/drivers/pci/hotplug/pciehp_hpc.c
    +++ b/drivers/pci/hotplug/pciehp_hpc.c
    @@ -231,25 +231,11 @@ bool pciehp_check_link_active(struct controller *ctrl)
    return ret;
    }

    -static void __pcie_wait_link_active(struct controller *ctrl, bool active)
    -{
    - int timeout = 1000;
    -
    - if (pciehp_check_link_active(ctrl) == active)
    - return;
    - while (timeout > 0) {
    - msleep(10);
    - timeout -= 10;
    - if (pciehp_check_link_active(ctrl) == active)
    - return;
    - }
    - ctrl_dbg(ctrl, "Data Link Layer Link Active not %s in 1000 msec\n",
    - active ? "set" : "cleared");
    -}
    -
    static void pcie_wait_link_active(struct controller *ctrl)
    {
    - __pcie_wait_link_active(ctrl, true);
    + struct pci_dev *pdev = ctrl_dev(ctrl);
    +
    + pcie_wait_for_link(pdev, true);
    }

    static bool pci_bus_check_dev(struct pci_bus *bus, int devfn)
    diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
    index f6a4dd1..bbea997 100644
    --- a/drivers/pci/pci.c
    +++ b/drivers/pci/pci.c
    @@ -4176,6 +4176,35 @@ static int pci_pm_reset(struct pci_dev *dev, int probe)
    return 0;
    }

    +/**
    + * pcie_wait_for_link - Wait for link till it's active/inactive
    + * @pdev: Bridge device
    + * @active: waiting for active or inactive ?
    + *
    + * Use this to wait till link becomes active or inactive.
    + */
    +bool pcie_wait_for_link(struct pci_dev *pdev, bool active)
    +{
    + int timeout = 1000;
    + bool ret;
    + u16 lnk_status;
    +
    + for (;;) {
    + pcie_capability_read_word(pdev, PCI_EXP_LNKSTA, &lnk_status);
    + ret = !!(lnk_status & PCI_EXP_LNKSTA_DLLLA);
    + if (ret == active)
    + return true;
    + if (timeout <= 0)
    + break;
    + timeout -= 10;
    + }
    +
    + pci_info(pdev, "Data Link Layer Link Active not %s in 1000 msec\n",
    + active ? "set" : "cleared");
    +
    + return false;
    +}
    +
    void pci_reset_secondary_bus(struct pci_dev *dev)
    {
    u16 ctrl;
    diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h
    index abc514e..5c44fbc 100644
    --- a/drivers/pci/pci.h
    +++ b/drivers/pci/pci.h
    @@ -345,6 +345,8 @@ void pci_enable_acs(struct pci_dev *dev);
    /* PCI error reporting and recovery */
    void pcie_do_recovery(struct pci_dev *dev, int severity);

    +bool pcie_wait_for_link(struct pci_dev *pdev, bool active);
    +
    #ifdef CONFIG_PCIEASPM
    void pcie_aspm_init_link_state(struct pci_dev *pdev);
    void pcie_aspm_exit_link_state(struct pci_dev *pdev);
    diff --git a/drivers/pci/pcie/pcie-dpc.c b/drivers/pci/pcie/pcie-dpc.c
    index 517c8b4..8e1553b 100644
    --- a/drivers/pci/pcie/pcie-dpc.c
    +++ b/drivers/pci/pcie/pcie-dpc.c
    @@ -95,19 +95,9 @@ static int dpc_wait_rp_inactive(struct dpc_dev *dpc)

    static void dpc_wait_link_inactive(struct dpc_dev *dpc)
    {
    - unsigned long timeout = jiffies + HZ;
    struct pci_dev *pdev = dpc->dev->port;
    - struct device *dev = &dpc->dev->device;
    - u16 lnk_status;

    - pcie_capability_read_word(pdev, PCI_EXP_LNKSTA, &lnk_status);
    - while (lnk_status & PCI_EXP_LNKSTA_DLLLA &&
    - !time_after(jiffies, timeout)) {
    - msleep(10);
    - pcie_capability_read_word(pdev, PCI_EXP_LNKSTA, &lnk_status);
    - }
    - if (lnk_status & PCI_EXP_LNKSTA_DLLLA)
    - dev_warn(dev, "Link state not disabled for DPC event\n");
    + pcie_wait_for_link(pdev, false);
    }

    /**
    --
    2.7.4
    \
     
     \ /
      Last update: 2018-04-09 16:49    [W:3.625 / U:0.180 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site