Commit 39ea5d70 authored by David S. Miller's avatar David S. Miller

Merge branch 'ethernet-amd-Convert-to-generic-power-management'

Vaibhav Gupta says:

====================
ethernet: amd: Convert to generic power management

Linux Kernel Mentee: Remove Legacy Power Management.

The purpose of this patch series is to remove legacy power management callbacks
from amd ethernet drivers.

The callbacks performing suspend() and resume() operations are still calling
pci_save_state(), pci_set_power_state(), etc. and handling the power management
themselves, which is not recommended.

The conversion requires the removal of the those function calls and change the
callback definition accordingly and make use of dev_pm_ops structure.

All patches are compile-tested only.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents f9215d6b c6f0fb5d
...@@ -1580,9 +1580,10 @@ static void amd8111e_tx_timeout(struct net_device *dev, unsigned int txqueue) ...@@ -1580,9 +1580,10 @@ static void amd8111e_tx_timeout(struct net_device *dev, unsigned int txqueue)
if(!err) if(!err)
netif_wake_queue(dev); netif_wake_queue(dev);
} }
static int amd8111e_suspend(struct pci_dev *pci_dev, pm_message_t state)
static int amd8111e_suspend(struct device *dev_d)
{ {
struct net_device *dev = pci_get_drvdata(pci_dev); struct net_device *dev = dev_get_drvdata(dev_d);
struct amd8111e_priv *lp = netdev_priv(dev); struct amd8111e_priv *lp = netdev_priv(dev);
if (!netif_running(dev)) if (!netif_running(dev))
...@@ -1609,34 +1610,24 @@ static int amd8111e_suspend(struct pci_dev *pci_dev, pm_message_t state) ...@@ -1609,34 +1610,24 @@ static int amd8111e_suspend(struct pci_dev *pci_dev, pm_message_t state)
if(lp->options & OPTION_WAKE_PHY_ENABLE) if(lp->options & OPTION_WAKE_PHY_ENABLE)
amd8111e_enable_link_change(lp); amd8111e_enable_link_change(lp);
pci_enable_wake(pci_dev, PCI_D3hot, 1); device_set_wakeup_enable(dev_d, 1);
pci_enable_wake(pci_dev, PCI_D3cold, 1);
} }
else{ else{
pci_enable_wake(pci_dev, PCI_D3hot, 0); device_set_wakeup_enable(dev_d, 0);
pci_enable_wake(pci_dev, PCI_D3cold, 0);
} }
pci_save_state(pci_dev);
pci_set_power_state(pci_dev, PCI_D3hot);
return 0; return 0;
} }
static int amd8111e_resume(struct pci_dev *pci_dev)
static int amd8111e_resume(struct device *dev_d)
{ {
struct net_device *dev = pci_get_drvdata(pci_dev); struct net_device *dev = dev_get_drvdata(dev_d);
struct amd8111e_priv *lp = netdev_priv(dev); struct amd8111e_priv *lp = netdev_priv(dev);
if (!netif_running(dev)) if (!netif_running(dev))
return 0; return 0;
pci_set_power_state(pci_dev, PCI_D0);
pci_restore_state(pci_dev);
pci_enable_wake(pci_dev, PCI_D3hot, 0);
pci_enable_wake(pci_dev, PCI_D3cold, 0); /* D3 cold */
netif_device_attach(dev); netif_device_attach(dev);
spin_lock_irq(&lp->lock); spin_lock_irq(&lp->lock);
...@@ -1918,13 +1909,14 @@ static const struct pci_device_id amd8111e_pci_tbl[] = { ...@@ -1918,13 +1909,14 @@ static const struct pci_device_id amd8111e_pci_tbl[] = {
}; };
MODULE_DEVICE_TABLE(pci, amd8111e_pci_tbl); MODULE_DEVICE_TABLE(pci, amd8111e_pci_tbl);
static SIMPLE_DEV_PM_OPS(amd8111e_pm_ops, amd8111e_suspend, amd8111e_resume);
static struct pci_driver amd8111e_driver = { static struct pci_driver amd8111e_driver = {
.name = MODULE_NAME, .name = MODULE_NAME,
.id_table = amd8111e_pci_tbl, .id_table = amd8111e_pci_tbl,
.probe = amd8111e_probe_one, .probe = amd8111e_probe_one,
.remove = amd8111e_remove_one, .remove = amd8111e_remove_one,
.suspend = amd8111e_suspend, .driver.pm = &amd8111e_pm_ops
.resume = amd8111e_resume
}; };
module_pci_driver(amd8111e_driver); module_pci_driver(amd8111e_driver);
...@@ -2913,30 +2913,27 @@ static void pcnet32_watchdog(struct timer_list *t) ...@@ -2913,30 +2913,27 @@ static void pcnet32_watchdog(struct timer_list *t)
mod_timer(&lp->watchdog_timer, round_jiffies(PCNET32_WATCHDOG_TIMEOUT)); mod_timer(&lp->watchdog_timer, round_jiffies(PCNET32_WATCHDOG_TIMEOUT));
} }
static int pcnet32_pm_suspend(struct pci_dev *pdev, pm_message_t state) static int pcnet32_pm_suspend(struct device *device_d)
{ {
struct net_device *dev = pci_get_drvdata(pdev); struct net_device *dev = dev_get_drvdata(device_d);
if (netif_running(dev)) { if (netif_running(dev)) {
netif_device_detach(dev); netif_device_detach(dev);
pcnet32_close(dev); pcnet32_close(dev);
} }
pci_save_state(pdev);
pci_set_power_state(pdev, pci_choose_state(pdev, state));
return 0; return 0;
} }
static int pcnet32_pm_resume(struct pci_dev *pdev) static int pcnet32_pm_resume(struct device *device_d)
{ {
struct net_device *dev = pci_get_drvdata(pdev); struct net_device *dev = dev_get_drvdata(device_d);
pci_set_power_state(pdev, PCI_D0);
pci_restore_state(pdev);
if (netif_running(dev)) { if (netif_running(dev)) {
pcnet32_open(dev); pcnet32_open(dev);
netif_device_attach(dev); netif_device_attach(dev);
} }
return 0; return 0;
} }
...@@ -2957,13 +2954,16 @@ static void pcnet32_remove_one(struct pci_dev *pdev) ...@@ -2957,13 +2954,16 @@ static void pcnet32_remove_one(struct pci_dev *pdev)
} }
} }
static SIMPLE_DEV_PM_OPS(pcnet32_pm_ops, pcnet32_pm_suspend, pcnet32_pm_resume);
static struct pci_driver pcnet32_driver = { static struct pci_driver pcnet32_driver = {
.name = DRV_NAME, .name = DRV_NAME,
.probe = pcnet32_probe_pci, .probe = pcnet32_probe_pci,
.remove = pcnet32_remove_one, .remove = pcnet32_remove_one,
.id_table = pcnet32_pci_tbl, .id_table = pcnet32_pci_tbl,
.suspend = pcnet32_pm_suspend, .driver = {
.resume = pcnet32_pm_resume, .pm = &pcnet32_pm_ops,
},
}; };
/* An additional parameter that may be passed in... */ /* An additional parameter that may be passed in... */
......
...@@ -421,10 +421,9 @@ static void xgbe_pci_remove(struct pci_dev *pdev) ...@@ -421,10 +421,9 @@ static void xgbe_pci_remove(struct pci_dev *pdev)
xgbe_free_pdata(pdata); xgbe_free_pdata(pdata);
} }
#ifdef CONFIG_PM static int __maybe_unused xgbe_pci_suspend(struct device *dev)
static int xgbe_pci_suspend(struct pci_dev *pdev, pm_message_t state)
{ {
struct xgbe_prv_data *pdata = pci_get_drvdata(pdev); struct xgbe_prv_data *pdata = dev_get_drvdata(dev);
struct net_device *netdev = pdata->netdev; struct net_device *netdev = pdata->netdev;
int ret = 0; int ret = 0;
...@@ -438,9 +437,9 @@ static int xgbe_pci_suspend(struct pci_dev *pdev, pm_message_t state) ...@@ -438,9 +437,9 @@ static int xgbe_pci_suspend(struct pci_dev *pdev, pm_message_t state)
return ret; return ret;
} }
static int xgbe_pci_resume(struct pci_dev *pdev) static int __maybe_unused xgbe_pci_resume(struct device *dev)
{ {
struct xgbe_prv_data *pdata = pci_get_drvdata(pdev); struct xgbe_prv_data *pdata = dev_get_drvdata(dev);
struct net_device *netdev = pdata->netdev; struct net_device *netdev = pdata->netdev;
int ret = 0; int ret = 0;
...@@ -460,7 +459,6 @@ static int xgbe_pci_resume(struct pci_dev *pdev) ...@@ -460,7 +459,6 @@ static int xgbe_pci_resume(struct pci_dev *pdev)
return ret; return ret;
} }
#endif /* CONFIG_PM */
static const struct xgbe_version_data xgbe_v2a = { static const struct xgbe_version_data xgbe_v2a = {
.init_function_ptrs_phy_impl = xgbe_init_function_ptrs_phy_v2, .init_function_ptrs_phy_impl = xgbe_init_function_ptrs_phy_v2,
...@@ -502,15 +500,16 @@ static const struct pci_device_id xgbe_pci_table[] = { ...@@ -502,15 +500,16 @@ static const struct pci_device_id xgbe_pci_table[] = {
}; };
MODULE_DEVICE_TABLE(pci, xgbe_pci_table); MODULE_DEVICE_TABLE(pci, xgbe_pci_table);
static SIMPLE_DEV_PM_OPS(xgbe_pci_pm_ops, xgbe_pci_suspend, xgbe_pci_resume);
static struct pci_driver xgbe_driver = { static struct pci_driver xgbe_driver = {
.name = XGBE_DRV_NAME, .name = XGBE_DRV_NAME,
.id_table = xgbe_pci_table, .id_table = xgbe_pci_table,
.probe = xgbe_pci_probe, .probe = xgbe_pci_probe,
.remove = xgbe_pci_remove, .remove = xgbe_pci_remove,
#ifdef CONFIG_PM .driver = {
.suspend = xgbe_pci_suspend, .pm = &xgbe_pci_pm_ops,
.resume = xgbe_pci_resume, }
#endif
}; };
int xgbe_pci_init(void) int xgbe_pci_init(void)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment