diff options
| author | Justin Lai <justinlai0215@realtek.com> | 2024-09-04 11:21:10 +0800 | 
|---|---|---|
| committer | Jakub Kicinski <kuba@kernel.org> | 2024-09-05 22:02:38 -0700 | 
| commit | a25a0b070c5160b44707fa1dfbf32d3d84e4224f (patch) | |
| tree | 8686510fb9d5e25acad7a01b3149a1baaf1120b8 | |
| parent | 0796004899601249e26c3fa474e7c248e4d2568f (diff) | |
rtase: Implement pci_driver suspend and resume function
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: Justin Lai <justinlai0215@realtek.com>
Link: https://patch.msgid.link/20240904032114.247117-10-justinlai0215@realtek.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
| -rw-r--r-- | drivers/net/ethernet/realtek/rtase/rtase_main.c | 51 | 
1 files changed, 51 insertions, 0 deletions
| diff --git a/drivers/net/ethernet/realtek/rtase/rtase_main.c b/drivers/net/ethernet/realtek/rtase/rtase_main.c index ea569a2d8b8b..7a31bef0576a 100644 --- a/drivers/net/ethernet/realtek/rtase/rtase_main.c +++ b/drivers/net/ethernet/realtek/rtase/rtase_main.c @@ -2151,12 +2151,63 @@ static void rtase_shutdown(struct pci_dev *pdev)  	rtase_reset_interrupt(pdev, tp);  } +static int rtase_suspend(struct device *device) +{ +	struct net_device *dev = dev_get_drvdata(device); + +	if (netif_running(dev)) { +		netif_device_detach(dev); +		rtase_hw_reset(dev); +	} + +	return 0; +} + +static int rtase_resume(struct device *device) +{ +	struct net_device *dev = dev_get_drvdata(device); +	struct rtase_private *tp = netdev_priv(dev); +	int ret; + +	/* restore last modified mac address */ +	rtase_rar_set(tp, dev->dev_addr); + +	if (!netif_running(dev)) +		goto out; + +	rtase_wait_for_quiescence(dev); + +	rtase_tx_clear(tp); +	rtase_rx_clear(tp); + +	ret = rtase_init_ring(dev); +	if (ret) { +		netdev_err(dev, "unable to init ring\n"); +		rtase_free_desc(tp); +		return -ENOMEM; +	} + +	rtase_hw_config(dev); +	/* always link, so start to transmit & receive */ +	rtase_hw_start(dev); + +	netif_device_attach(dev); +out: + +	return 0; +} + +static const struct dev_pm_ops rtase_pm_ops = { +	SYSTEM_SLEEP_PM_OPS(rtase_suspend, rtase_resume) +}; +  static struct pci_driver rtase_pci_driver = {  	.name = KBUILD_MODNAME,  	.id_table = rtase_pci_tbl,  	.probe = rtase_init_one,  	.remove = rtase_remove_one,  	.shutdown = rtase_shutdown, +	.driver.pm = pm_ptr(&rtase_pm_ops),  };  module_pci_driver(rtase_pci_driver); | 
