scsi: aic79xx: Use generic power management

Drivers should do only device-specific jobs. But in general, drivers using
legacy PCI PM framework for .suspend()/.resume() have to manage many PCI
PM-related tasks themselves which can be done by PCI Core itself. This
brings extra load on the driver and it directly calls PCI helper functions
to handle them.

Switch to the new generic framework by updating function signatures and
define a "struct dev_pm_ops" variable to bind PM callbacks. Also, remove
unnecessary calls to the PCI Helper functions along with the legacy
.suspend & .resume bindings.

Link: https://lore.kernel.org/r/20201102164730.324035-8-vaibhavgupta40@gmail.com
Signed-off-by: Vaibhav Gupta <vaibhavgupta40@gmail.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
Vaibhav Gupta 2020-11-02 22:17:08 +05:30 коммит произвёл Martin K. Petersen
Родитель 6897b9a177
Коммит ec199a8df6
4 изменённых файлов: 20 добавлений и 49 удалений

Просмотреть файл

@ -1330,10 +1330,8 @@ const struct ahd_pci_identity *ahd_find_pci_device(ahd_dev_softc_t);
int ahd_pci_config(struct ahd_softc *, int ahd_pci_config(struct ahd_softc *,
const struct ahd_pci_identity *); const struct ahd_pci_identity *);
int ahd_pci_test_register_access(struct ahd_softc *); int ahd_pci_test_register_access(struct ahd_softc *);
#ifdef CONFIG_PM void __maybe_unused ahd_pci_suspend(struct ahd_softc *);
void ahd_pci_suspend(struct ahd_softc *); void __maybe_unused ahd_pci_resume(struct ahd_softc *);
void ahd_pci_resume(struct ahd_softc *);
#endif
/************************** SCB and SCB queue management **********************/ /************************** SCB and SCB queue management **********************/
void ahd_qinfifo_requeue_tail(struct ahd_softc *ahd, void ahd_qinfifo_requeue_tail(struct ahd_softc *ahd,
@ -1344,10 +1342,8 @@ struct ahd_softc *ahd_alloc(void *platform_arg, char *name);
int ahd_softc_init(struct ahd_softc *); int ahd_softc_init(struct ahd_softc *);
void ahd_controller_info(struct ahd_softc *ahd, char *buf); void ahd_controller_info(struct ahd_softc *ahd, char *buf);
int ahd_init(struct ahd_softc *ahd); int ahd_init(struct ahd_softc *ahd);
#ifdef CONFIG_PM int __maybe_unused ahd_suspend(struct ahd_softc *ahd);
int ahd_suspend(struct ahd_softc *ahd); void __maybe_unused ahd_resume(struct ahd_softc *ahd);
void ahd_resume(struct ahd_softc *ahd);
#endif
int ahd_default_config(struct ahd_softc *ahd); int ahd_default_config(struct ahd_softc *ahd);
int ahd_parse_vpddata(struct ahd_softc *ahd, int ahd_parse_vpddata(struct ahd_softc *ahd,
struct vpd_config *vpd); struct vpd_config *vpd);

Просмотреть файл

@ -7866,11 +7866,9 @@ ahd_pause_and_flushwork(struct ahd_softc *ahd)
ahd->flags &= ~AHD_ALL_INTERRUPTS; ahd->flags &= ~AHD_ALL_INTERRUPTS;
} }
#ifdef CONFIG_PM int __maybe_unused
int
ahd_suspend(struct ahd_softc *ahd) ahd_suspend(struct ahd_softc *ahd)
{ {
ahd_pause_and_flushwork(ahd); ahd_pause_and_flushwork(ahd);
if (LIST_FIRST(&ahd->pending_scbs) != NULL) { if (LIST_FIRST(&ahd->pending_scbs) != NULL) {
@ -7881,15 +7879,13 @@ ahd_suspend(struct ahd_softc *ahd)
return (0); return (0);
} }
void void __maybe_unused
ahd_resume(struct ahd_softc *ahd) ahd_resume(struct ahd_softc *ahd)
{ {
ahd_reset(ahd, /*reinit*/TRUE); ahd_reset(ahd, /*reinit*/TRUE);
ahd_intr_enable(ahd, TRUE); ahd_intr_enable(ahd, TRUE);
ahd_restart(ahd); ahd_restart(ahd);
} }
#endif
/************************** Busy Target Table *********************************/ /************************** Busy Target Table *********************************/
/* /*

Просмотреть файл

@ -74,11 +74,10 @@ static const struct pci_device_id ahd_linux_pci_id_table[] = {
MODULE_DEVICE_TABLE(pci, ahd_linux_pci_id_table); MODULE_DEVICE_TABLE(pci, ahd_linux_pci_id_table);
#ifdef CONFIG_PM static int __maybe_unused
static int ahd_linux_pci_dev_suspend(struct device *dev)
ahd_linux_pci_dev_suspend(struct pci_dev *pdev, pm_message_t mesg)
{ {
struct ahd_softc *ahd = pci_get_drvdata(pdev); struct ahd_softc *ahd = dev_get_drvdata(dev);
int rc; int rc;
if ((rc = ahd_suspend(ahd))) if ((rc = ahd_suspend(ahd)))
@ -86,39 +85,20 @@ ahd_linux_pci_dev_suspend(struct pci_dev *pdev, pm_message_t mesg)
ahd_pci_suspend(ahd); ahd_pci_suspend(ahd);
pci_save_state(pdev);
pci_disable_device(pdev);
if (mesg.event & PM_EVENT_SLEEP)
pci_set_power_state(pdev, PCI_D3hot);
return rc; return rc;
} }
static int static int __maybe_unused
ahd_linux_pci_dev_resume(struct pci_dev *pdev) ahd_linux_pci_dev_resume(struct device *dev)
{ {
struct ahd_softc *ahd = pci_get_drvdata(pdev); struct ahd_softc *ahd = dev_get_drvdata(dev);
int rc;
pci_set_power_state(pdev, PCI_D0);
pci_restore_state(pdev);
if ((rc = pci_enable_device(pdev))) {
dev_printk(KERN_ERR, &pdev->dev,
"failed to enable device after resume (%d)\n", rc);
return rc;
}
pci_set_master(pdev);
ahd_pci_resume(ahd); ahd_pci_resume(ahd);
ahd_resume(ahd); ahd_resume(ahd);
return rc; return 0;
} }
#endif
static void static void
ahd_linux_pci_dev_remove(struct pci_dev *pdev) ahd_linux_pci_dev_remove(struct pci_dev *pdev)
@ -224,13 +204,14 @@ ahd_linux_pci_dev_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
return (0); return (0);
} }
static SIMPLE_DEV_PM_OPS(ahd_linux_pci_dev_pm_ops,
ahd_linux_pci_dev_suspend,
ahd_linux_pci_dev_resume);
static struct pci_driver aic79xx_pci_driver = { static struct pci_driver aic79xx_pci_driver = {
.name = "aic79xx", .name = "aic79xx",
.probe = ahd_linux_pci_dev_probe, .probe = ahd_linux_pci_dev_probe,
#ifdef CONFIG_PM .driver.pm = &ahd_linux_pci_dev_pm_ops,
.suspend = ahd_linux_pci_dev_suspend,
.resume = ahd_linux_pci_dev_resume,
#endif
.remove = ahd_linux_pci_dev_remove, .remove = ahd_linux_pci_dev_remove,
.id_table = ahd_linux_pci_id_table .id_table = ahd_linux_pci_id_table
}; };

Просмотреть файл

@ -377,8 +377,7 @@ ahd_pci_config(struct ahd_softc *ahd, const struct ahd_pci_identity *entry)
return ahd_pci_map_int(ahd); return ahd_pci_map_int(ahd);
} }
#ifdef CONFIG_PM void __maybe_unused
void
ahd_pci_suspend(struct ahd_softc *ahd) ahd_pci_suspend(struct ahd_softc *ahd)
{ {
/* /*
@ -394,7 +393,7 @@ ahd_pci_suspend(struct ahd_softc *ahd)
} }
void void __maybe_unused
ahd_pci_resume(struct ahd_softc *ahd) ahd_pci_resume(struct ahd_softc *ahd)
{ {
ahd_pci_write_config(ahd->dev_softc, DEVCONFIG, ahd_pci_write_config(ahd->dev_softc, DEVCONFIG,
@ -404,7 +403,6 @@ ahd_pci_resume(struct ahd_softc *ahd)
ahd_pci_write_config(ahd->dev_softc, CSIZE_LATTIME, ahd_pci_write_config(ahd->dev_softc, CSIZE_LATTIME,
ahd->suspend_state.pci_state.csize_lattime, /*bytes*/1); ahd->suspend_state.pci_state.csize_lattime, /*bytes*/1);
} }
#endif
/* /*
* Perform some simple tests that should catch situations where * Perform some simple tests that should catch situations where