]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
rtase: Implement pci_driver suspend and resume function
authorJustin Lai <justinlai0215@realtek.com>
Wed, 4 Sep 2024 03:21:10 +0000 (11:21 +0800)
committerJakub Kicinski <kuba@kernel.org>
Fri, 6 Sep 2024 05:02:38 +0000 (22:02 -0700)
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>
drivers/net/ethernet/realtek/rtase/rtase_main.c

index ea569a2d8b8bdcc4c53154d97727a62607a3fd80..7a31bef0576a4611554d58084177b642f52fd501 100644 (file)
@@ -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);