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:
Родитель
6897b9a177
Коммит
ec199a8df6
|
@ -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
|
||||||
|
|
Загрузка…
Ссылка в новой задаче