Commit 5c4c0106 authored by Tomas Winkler's avatar Tomas Winkler Committed by Greg Kroah-Hartman

mei: add pci driver ops shutdown handler.

The shutdown handler quiesces the device, it performs link reset in
order to close all connections and notify the device that is not longer
managed by the driver.
This is essentially a stripped down version of the PCI remove() function
where only the necessary amount of work is done to stop any further
activity.
Signed-off-by: default avatarTomas Winkler <tomas.winkler@intel.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent f580ff0e
...@@ -241,12 +241,39 @@ static int mei_me_probe(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -241,12 +241,39 @@ static int mei_me_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
return err; return err;
} }
/**
* mei_me_shutdown - Device Removal Routine
*
* @pdev: PCI device structure
*
* mei_me_shutdown is called from the reboot notifier
* it's a simplified version of remove so we go down
* faster.
*/
static void mei_me_shutdown(struct pci_dev *pdev)
{
struct mei_device *dev;
dev = pci_get_drvdata(pdev);
if (!dev)
return;
dev_dbg(&pdev->dev, "shutdown\n");
mei_stop(dev);
if (!pci_dev_run_wake(pdev))
mei_me_unset_pm_domain(dev);
mei_disable_interrupts(dev);
free_irq(pdev->irq, dev);
}
/** /**
* mei_me_remove - Device Removal Routine * mei_me_remove - Device Removal Routine
* *
* @pdev: PCI device structure * @pdev: PCI device structure
* *
* mei_remove is called by the PCI subsystem to alert the driver * mei_me_remove is called by the PCI subsystem to alert the driver
* that it should release a PCI device. * that it should release a PCI device.
*/ */
static void mei_me_remove(struct pci_dev *pdev) static void mei_me_remove(struct pci_dev *pdev)
...@@ -456,7 +483,7 @@ static struct pci_driver mei_me_driver = { ...@@ -456,7 +483,7 @@ static struct pci_driver mei_me_driver = {
.id_table = mei_me_pci_tbl, .id_table = mei_me_pci_tbl,
.probe = mei_me_probe, .probe = mei_me_probe,
.remove = mei_me_remove, .remove = mei_me_remove,
.shutdown = mei_me_remove, .shutdown = mei_me_shutdown,
.driver.pm = MEI_ME_PM_OPS, .driver.pm = MEI_ME_PM_OPS,
}; };
......
...@@ -160,6 +160,33 @@ static int mei_txe_probe(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -160,6 +160,33 @@ static int mei_txe_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
return err; return err;
} }
/**
* mei_txe_remove - Device Shutdown Routine
*
* @pdev: PCI device structure
*
* mei_txe_shutdown is called from the reboot notifier
* it's a simplified version of remove so we go down
* faster.
*/
static void mei_txe_shutdown(struct pci_dev *pdev)
{
struct mei_device *dev;
dev = pci_get_drvdata(pdev);
if (!dev)
return;
dev_dbg(&pdev->dev, "shutdown\n");
mei_stop(dev);
if (!pci_dev_run_wake(pdev))
mei_txe_unset_pm_domain(dev);
mei_disable_interrupts(dev);
free_irq(pdev->irq, dev);
}
/** /**
* mei_txe_remove - Device Removal Routine * mei_txe_remove - Device Removal Routine
* *
...@@ -386,7 +413,7 @@ static struct pci_driver mei_txe_driver = { ...@@ -386,7 +413,7 @@ static struct pci_driver mei_txe_driver = {
.id_table = mei_txe_pci_tbl, .id_table = mei_txe_pci_tbl,
.probe = mei_txe_probe, .probe = mei_txe_probe,
.remove = mei_txe_remove, .remove = mei_txe_remove,
.shutdown = mei_txe_remove, .shutdown = mei_txe_shutdown,
.driver.pm = MEI_TXE_PM_OPS, .driver.pm = MEI_TXE_PM_OPS,
}; };
......
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