aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/pci
diff options
context:
space:
mode:
authorKeith Busch <keith.busch@intel.com>2014-05-02 12:40:42 -0400
committerBjorn Helgaas <bhelgaas@google.com>2014-05-27 13:11:00 -0400
commit3ebe7f9f7e4a4fd1f6461ecd01ff2961317a483a (patch)
tree01547552912774f2008af5b020fbeed20078719f /drivers/pci
parent761ce53330a4f02c58768631027d1c1dd0d538f7 (diff)
PCI: Notify driver before and after device reset
Notify a PCI device driver when its device's access is about to be disabled for an impending reset attempt, then after the attempt completes and device access is restored. The notification is via the pci_error_handlers interface. Signed-off-by: Keith Busch <keith.busch@intel.com> Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Diffstat (limited to 'drivers/pci')
-rw-r--r--drivers/pci/pci.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
index 7325d43bf030..43d87b26ec5b 100644
--- a/drivers/pci/pci.c
+++ b/drivers/pci/pci.c
@@ -3305,8 +3305,27 @@ static void pci_dev_unlock(struct pci_dev *dev)
3305 pci_cfg_access_unlock(dev); 3305 pci_cfg_access_unlock(dev);
3306} 3306}
3307 3307
3308/**
3309 * pci_reset_notify - notify device driver of reset
3310 * @dev: device to be notified of reset
3311 * @prepare: 'true' if device is about to be reset; 'false' if reset attempt
3312 * completed
3313 *
3314 * Must be called prior to device access being disabled and after device
3315 * access is restored.
3316 */
3317static void pci_reset_notify(struct pci_dev *dev, bool prepare)
3318{
3319 const struct pci_error_handlers *err_handler =
3320 dev->driver ? dev->driver->err_handler : NULL;
3321 if (err_handler && err_handler->reset_notify)
3322 err_handler->reset_notify(dev, prepare);
3323}
3324
3308static void pci_dev_save_and_disable(struct pci_dev *dev) 3325static void pci_dev_save_and_disable(struct pci_dev *dev)
3309{ 3326{
3327 pci_reset_notify(dev, true);
3328
3310 /* 3329 /*
3311 * Wake-up device prior to save. PM registers default to D0 after 3330 * Wake-up device prior to save. PM registers default to D0 after
3312 * reset and a simple register restore doesn't reliably return 3331 * reset and a simple register restore doesn't reliably return
@@ -3328,6 +3347,7 @@ static void pci_dev_save_and_disable(struct pci_dev *dev)
3328static void pci_dev_restore(struct pci_dev *dev) 3347static void pci_dev_restore(struct pci_dev *dev)
3329{ 3348{
3330 pci_restore_state(dev); 3349 pci_restore_state(dev);
3350 pci_reset_notify(dev, false);
3331} 3351}
3332 3352
3333static int pci_dev_reset(struct pci_dev *dev, int probe) 3353static int pci_dev_reset(struct pci_dev *dev, int probe)
@@ -3344,6 +3364,7 @@ static int pci_dev_reset(struct pci_dev *dev, int probe)
3344 3364
3345 return rc; 3365 return rc;
3346} 3366}
3367
3347/** 3368/**
3348 * __pci_reset_function - reset a PCI device function 3369 * __pci_reset_function - reset a PCI device function
3349 * @dev: PCI device to reset 3370 * @dev: PCI device to reset