| From d1447d2ffbeb284928bca6524ea5838510f75b86 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Mon, 29 Jun 2020 14:59:39 +0530 |
| Subject: iavf: use generic power management |
| |
| From: Vaibhav Gupta <vaibhavgupta40@gmail.com> |
| |
| [ Upstream commit bc5cbd73eb493944b8665dc517f684c40eb18a4a ] |
| |
| With the support of generic PM callbacks, drivers no longer need to use |
| legacy .suspend() and .resume() in which they had to maintain PCI states |
| changes and device's power state themselves. The required operations are |
| done by PCI core. |
| |
| PCI drivers are not expected to invoke PCI helper functions like |
| pci_save/restore_state(), pci_enable/disable_device(), |
| pci_set_power_state(), etc. Their tasks are completed by PCI core itself. |
| |
| Compile-tested only. |
| |
| Signed-off-by: Vaibhav Gupta <vaibhavgupta40@gmail.com> |
| Tested-by: Andrew Bowers <andrewx.bowers@intel.com> |
| Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/net/ethernet/intel/iavf/iavf_main.c | 45 ++++++--------------- |
| 1 file changed, 12 insertions(+), 33 deletions(-) |
| |
| diff --git a/drivers/net/ethernet/intel/iavf/iavf_main.c b/drivers/net/ethernet/intel/iavf/iavf_main.c |
| index d338efe5f3f55..b3b349ecb0a8d 100644 |
| --- a/drivers/net/ethernet/intel/iavf/iavf_main.c |
| +++ b/drivers/net/ethernet/intel/iavf/iavf_main.c |
| @@ -3777,7 +3777,6 @@ err_dma: |
| return err; |
| } |
| |
| -#ifdef CONFIG_PM |
| /** |
| * iavf_suspend - Power management suspend routine |
| * @pdev: PCI device information struct |
| @@ -3785,11 +3784,10 @@ err_dma: |
| * |
| * Called when the system (VM) is entering sleep/suspend. |
| **/ |
| -static int iavf_suspend(struct pci_dev *pdev, pm_message_t state) |
| +static int __maybe_unused iavf_suspend(struct device *dev_d) |
| { |
| - struct net_device *netdev = pci_get_drvdata(pdev); |
| + struct net_device *netdev = dev_get_drvdata(dev_d); |
| struct iavf_adapter *adapter = netdev_priv(netdev); |
| - int retval = 0; |
| |
| netif_device_detach(netdev); |
| |
| @@ -3807,12 +3805,6 @@ static int iavf_suspend(struct pci_dev *pdev, pm_message_t state) |
| |
| clear_bit(__IAVF_IN_CRITICAL_TASK, &adapter->crit_section); |
| |
| - retval = pci_save_state(pdev); |
| - if (retval) |
| - return retval; |
| - |
| - pci_disable_device(pdev); |
| - |
| return 0; |
| } |
| |
| @@ -3822,24 +3814,13 @@ static int iavf_suspend(struct pci_dev *pdev, pm_message_t state) |
| * |
| * Called when the system (VM) is resumed from sleep/suspend. |
| **/ |
| -static int iavf_resume(struct pci_dev *pdev) |
| +static int __maybe_unused iavf_resume(struct device *dev_d) |
| { |
| + struct pci_dev *pdev = to_pci_dev(dev_d); |
| struct iavf_adapter *adapter = pci_get_drvdata(pdev); |
| struct net_device *netdev = adapter->netdev; |
| u32 err; |
| |
| - pci_set_power_state(pdev, PCI_D0); |
| - pci_restore_state(pdev); |
| - /* pci_restore_state clears dev->state_saved so call |
| - * pci_save_state to restore it. |
| - */ |
| - pci_save_state(pdev); |
| - |
| - err = pci_enable_device_mem(pdev); |
| - if (err) { |
| - dev_err(&pdev->dev, "Cannot enable PCI device from suspend.\n"); |
| - return err; |
| - } |
| pci_set_master(pdev); |
| |
| rtnl_lock(); |
| @@ -3863,7 +3844,6 @@ static int iavf_resume(struct pci_dev *pdev) |
| return err; |
| } |
| |
| -#endif /* CONFIG_PM */ |
| /** |
| * iavf_remove - Device Removal Routine |
| * @pdev: PCI device information struct |
| @@ -3965,16 +3945,15 @@ static void iavf_remove(struct pci_dev *pdev) |
| pci_disable_device(pdev); |
| } |
| |
| +static SIMPLE_DEV_PM_OPS(iavf_pm_ops, iavf_suspend, iavf_resume); |
| + |
| static struct pci_driver iavf_driver = { |
| - .name = iavf_driver_name, |
| - .id_table = iavf_pci_tbl, |
| - .probe = iavf_probe, |
| - .remove = iavf_remove, |
| -#ifdef CONFIG_PM |
| - .suspend = iavf_suspend, |
| - .resume = iavf_resume, |
| -#endif |
| - .shutdown = iavf_shutdown, |
| + .name = iavf_driver_name, |
| + .id_table = iavf_pci_tbl, |
| + .probe = iavf_probe, |
| + .remove = iavf_remove, |
| + .driver.pm = &iavf_pm_ops, |
| + .shutdown = iavf_shutdown, |
| }; |
| |
| /** |
| -- |
| 2.25.1 |
| |