Skip to content

Commit 974365e

Browse files
catSully012davem330
authored andcommitted
gve: Implement suspend/resume/shutdown
Add support for suspend, resume and shutdown. Signed-off-by: Catherine Sullivan <[email protected]> Signed-off-by: David Awogbemila <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 497dbb2 commit 974365e

File tree

2 files changed

+60
-0
lines changed

2 files changed

+60
-0
lines changed

drivers/net/ethernet/google/gve/gve.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -557,6 +557,8 @@ struct gve_priv {
557557
u32 page_alloc_fail; /* count of page alloc fails */
558558
u32 dma_mapping_error; /* count of dma mapping errors */
559559
u32 stats_report_trigger_cnt; /* count of device-requested stats-reports since last reset */
560+
u32 suspend_cnt; /* count of times suspended */
561+
u32 resume_cnt; /* count of times resumed */
560562
struct workqueue_struct *gve_wq;
561563
struct work_struct service_task;
562564
struct work_struct stats_report_task;
@@ -573,6 +575,7 @@ struct gve_priv {
573575

574576
/* Gvnic device link speed from hypervisor. */
575577
u64 link_speed;
578+
bool up_before_suspend; /* True if dev was up before suspend */
576579

577580
struct gve_options_dqo_rda options_dqo_rda;
578581
struct gve_ptype_lut *ptype_lut_dqo;

drivers/net/ethernet/google/gve/gve_main.c

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
16791731
static 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

16911748
module_pci_driver(gvnic_driver);

0 commit comments

Comments
 (0)