@@ -1676,6 +1676,58 @@ static void gve_remove(struct pci_dev *pdev)
16761676 pci_disable_device (pdev );
16771677}
16781678
1679+ static void gve_shutdown (struct pci_dev * pdev )
1680+ {
1681+ struct net_device * netdev = pci_get_drvdata (pdev );
1682+ struct gve_priv * priv = netdev_priv (netdev );
1683+ bool was_up = netif_carrier_ok (priv -> dev );
1684+
1685+ rtnl_lock ();
1686+ if (was_up && gve_close (priv -> dev )) {
1687+ /* If the dev was up, attempt to close, if close fails, reset */
1688+ gve_reset_and_teardown (priv , was_up );
1689+ } else {
1690+ /* If the dev wasn't up or close worked, finish tearing down */
1691+ gve_teardown_priv_resources (priv );
1692+ }
1693+ rtnl_unlock ();
1694+ }
1695+
1696+ #ifdef CONFIG_PM
1697+ static int gve_suspend (struct pci_dev * pdev , pm_message_t state )
1698+ {
1699+ struct net_device * netdev = pci_get_drvdata (pdev );
1700+ struct gve_priv * priv = netdev_priv (netdev );
1701+ bool was_up = netif_carrier_ok (priv -> dev );
1702+
1703+ priv -> suspend_cnt ++ ;
1704+ rtnl_lock ();
1705+ if (was_up && gve_close (priv -> dev )) {
1706+ /* If the dev was up, attempt to close, if close fails, reset */
1707+ gve_reset_and_teardown (priv , was_up );
1708+ } else {
1709+ /* If the dev wasn't up or close worked, finish tearing down */
1710+ gve_teardown_priv_resources (priv );
1711+ }
1712+ priv -> up_before_suspend = was_up ;
1713+ rtnl_unlock ();
1714+ return 0 ;
1715+ }
1716+
1717+ static int gve_resume (struct pci_dev * pdev )
1718+ {
1719+ struct net_device * netdev = pci_get_drvdata (pdev );
1720+ struct gve_priv * priv = netdev_priv (netdev );
1721+ int err ;
1722+
1723+ priv -> resume_cnt ++ ;
1724+ rtnl_lock ();
1725+ err = gve_reset_recovery (priv , priv -> up_before_suspend );
1726+ rtnl_unlock ();
1727+ return err ;
1728+ }
1729+ #endif /* CONFIG_PM */
1730+
16791731static const struct pci_device_id gve_id_table [] = {
16801732 { PCI_DEVICE (PCI_VENDOR_ID_GOOGLE , PCI_DEV_ID_GVNIC ) },
16811733 { }
@@ -1686,6 +1738,11 @@ static struct pci_driver gvnic_driver = {
16861738 .id_table = gve_id_table ,
16871739 .probe = gve_probe ,
16881740 .remove = gve_remove ,
1741+ .shutdown = gve_shutdown ,
1742+ #ifdef CONFIG_PM
1743+ .suspend = gve_suspend ,
1744+ .resume = gve_resume ,
1745+ #endif
16891746};
16901747
16911748module_pci_driver (gvnic_driver );
0 commit comments