[PATCH net-next v3 12/14] motorcomm:yt6801: Implement pci_driver suspend and resume
From: Frank Sae <Frank.Sae@motor-comm.com>
Date: 2025-02-28 10:00:57
Also in:
lkml
Subsystem:
networking drivers, the rest · Maintainers:
Andrew Lunn, "David S. Miller", Eric Dumazet, Jakub Kicinski, Paolo Abeni, Linus Torvalds
Implement the pci_driver suspend function to enable the device to sleep, and implement the resume function to enable the device to resume operation. Signed-off-by: Frank Sae <Frank.Sae@motor-comm.com> --- .../ethernet/motorcomm/yt6801/yt6801_net.c | 14 +++++ .../ethernet/motorcomm/yt6801/yt6801_pci.c | 58 +++++++++++++++++++ 2 files changed, 72 insertions(+)
diff --git a/drivers/net/ethernet/motorcomm/yt6801/yt6801_net.c b/drivers/net/ethernet/motorcomm/yt6801/yt6801_net.c
index d6c1c0fd4..01df945d0 100644
--- a/drivers/net/ethernet/motorcomm/yt6801/yt6801_net.c
+++ b/drivers/net/ethernet/motorcomm/yt6801/yt6801_net.c@@ -1378,6 +1378,20 @@ static void fxgmac_restart_work(struct work_struct *work) rtnl_unlock(); } +int fxgmac_net_powerup(struct fxgmac_pdata *priv) +{ + int ret; + + priv->powerstate = 0;/* clear all bits as normal now */ + ret = fxgmac_start(priv); + if (ret < 0) { + yt_err(priv, "%s: fxgmac_start ret: %d\n", __func__, ret); + return ret; + } + + return 0; +} + static void fxgmac_config_powerdown(struct fxgmac_pdata *priv) { FXGMAC_MAC_IO_WR_BITS(priv, MAC_CR, RE, 1); /* Enable MAC Rx */
diff --git a/drivers/net/ethernet/motorcomm/yt6801/yt6801_pci.c b/drivers/net/ethernet/motorcomm/yt6801/yt6801_pci.c
index fba01e393..e9d2ac820 100644
--- a/drivers/net/ethernet/motorcomm/yt6801/yt6801_pci.c
+++ b/drivers/net/ethernet/motorcomm/yt6801/yt6801_pci.c@@ -103,6 +103,59 @@ static void fxgmac_shutdown(struct pci_dev *pcidev) } mutex_unlock(&priv->mutex); } + +static int fxgmac_suspend(struct device *device) +{ + struct fxgmac_pdata *priv = dev_get_drvdata(device); + struct net_device *netdev = priv->netdev; + int ret = 0; + + mutex_lock(&priv->mutex); + if (priv->dev_state != FXGMAC_DEV_START) + goto unlock; + + if (netif_running(netdev)) + __fxgmac_shutdown(to_pci_dev(device)); + + priv->dev_state = FXGMAC_DEV_SUSPEND; +unlock: + mutex_unlock(&priv->mutex); + + return ret; +} + +static int fxgmac_resume(struct device *device) +{ + struct fxgmac_pdata *priv = dev_get_drvdata(device); + struct net_device *netdev = priv->netdev; + int ret = 0; + + mutex_lock(&priv->mutex); + if (priv->dev_state != FXGMAC_DEV_SUSPEND) + goto unlock; + + priv->dev_state = FXGMAC_DEV_RESUME; + __clear_bit(FXGMAC_POWER_STATE_DOWN, &priv->powerstate); + + rtnl_lock(); + if (netif_running(netdev)) { + ret = fxgmac_net_powerup(priv); + if (ret < 0) { + dev_err(device, "%s, fxgmac_net_powerup err:%d\n", + __func__, ret); + goto unlock; + } + } + + netif_device_attach(netdev); + rtnl_unlock(); + +unlock: + mutex_unlock(&priv->mutex); + + return ret; +} + #define MOTORCOMM_PCI_ID 0x1f0a #define YT6801_PCI_DEVICE_ID 0x6801
@@ -113,11 +166,16 @@ static const struct pci_device_id fxgmac_pci_tbl[] = { MODULE_DEVICE_TABLE(pci, fxgmac_pci_tbl); +static const struct dev_pm_ops fxgmac_pm_ops = { + SYSTEM_SLEEP_PM_OPS(fxgmac_suspend, fxgmac_resume) +}; + static struct pci_driver fxgmac_pci_driver = { .name = FXGMAC_DRV_NAME, .id_table = fxgmac_pci_tbl, .probe = fxgmac_probe, .remove = fxgmac_remove, + .driver.pm = pm_ptr(&fxgmac_pm_ops), .shutdown = fxgmac_shutdown, };
--
2.34.1