lkml.org 
[lkml]   [2018]   [Aug]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.17 06/31] net: stmmac: Fix WoL for PCI-based setups
    Date
    4.17-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Jose Abreu <Jose.Abreu@synopsys.com>

    [ Upstream commit b7d0f08e9129c45ed41bc0cfa8e77067881e45fd ]

    WoL won't work in PCI-based setups because we are not saving the PCI EP
    state before entering suspend state and not allowing D3 wake.

    Fix this by using a wrapper around stmmac_{suspend/resume} which
    correctly sets the PCI EP state.

    Signed-off-by: Jose Abreu <joabreu@synopsys.com>
    Cc: David S. Miller <davem@davemloft.net>
    Cc: Joao Pinto <jpinto@synopsys.com>
    Cc: Giuseppe Cavallaro <peppe.cavallaro@st.com>
    Cc: Alexandre Torgue <alexandre.torgue@st.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    drivers/net/ethernet/stmicro/stmmac/stmmac_pci.c | 40 +++++++++++++++++++++--
    1 file changed, 38 insertions(+), 2 deletions(-)

    --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_pci.c
    +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_pci.c
    @@ -257,7 +257,7 @@ static int stmmac_pci_probe(struct pci_d
    return -ENOMEM;

    /* Enable pci device */
    - ret = pcim_enable_device(pdev);
    + ret = pci_enable_device(pdev);
    if (ret) {
    dev_err(&pdev->dev, "%s: ERROR: failed to enable device\n",
    __func__);
    @@ -300,9 +300,45 @@ static int stmmac_pci_probe(struct pci_d
    static void stmmac_pci_remove(struct pci_dev *pdev)
    {
    stmmac_dvr_remove(&pdev->dev);
    + pci_disable_device(pdev);
    }

    -static SIMPLE_DEV_PM_OPS(stmmac_pm_ops, stmmac_suspend, stmmac_resume);
    +static int stmmac_pci_suspend(struct device *dev)
    +{
    + struct pci_dev *pdev = to_pci_dev(dev);
    + int ret;
    +
    + ret = stmmac_suspend(dev);
    + if (ret)
    + return ret;
    +
    + ret = pci_save_state(pdev);
    + if (ret)
    + return ret;
    +
    + pci_disable_device(pdev);
    + pci_wake_from_d3(pdev, true);
    + return 0;
    +}
    +
    +static int stmmac_pci_resume(struct device *dev)
    +{
    + struct pci_dev *pdev = to_pci_dev(dev);
    + int ret;
    +
    + pci_restore_state(pdev);
    + pci_set_power_state(pdev, PCI_D0);
    +
    + ret = pci_enable_device(pdev);
    + if (ret)
    + return ret;
    +
    + pci_set_master(pdev);
    +
    + return stmmac_resume(dev);
    +}
    +
    +static SIMPLE_DEV_PM_OPS(stmmac_pm_ops, stmmac_pci_suspend, stmmac_pci_resume);

    /* synthetic ID, no official vendor */
    #define PCI_VENDOR_ID_STMMAC 0x700

    \
     
     \ /
      Last update: 2018-08-04 11:29    [W:2.751 / U:0.228 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site