|
@@ -3305,8 +3305,27 @@ static void pci_dev_unlock(struct pci_dev *dev)
|
|
|
pci_cfg_access_unlock(dev);
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * pci_reset_notify - notify device driver of reset
|
|
|
+ * @dev: device to be notified of reset
|
|
|
+ * @prepare: 'true' if device is about to be reset; 'false' if reset attempt
|
|
|
+ * completed
|
|
|
+ *
|
|
|
+ * Must be called prior to device access being disabled and after device
|
|
|
+ * access is restored.
|
|
|
+ */
|
|
|
+static void pci_reset_notify(struct pci_dev *dev, bool prepare)
|
|
|
+{
|
|
|
+ const struct pci_error_handlers *err_handler =
|
|
|
+ dev->driver ? dev->driver->err_handler : NULL;
|
|
|
+ if (err_handler && err_handler->reset_notify)
|
|
|
+ err_handler->reset_notify(dev, prepare);
|
|
|
+}
|
|
|
+
|
|
|
static void pci_dev_save_and_disable(struct pci_dev *dev)
|
|
|
{
|
|
|
+ pci_reset_notify(dev, true);
|
|
|
+
|
|
|
/*
|
|
|
* Wake-up device prior to save. PM registers default to D0 after
|
|
|
* 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)
|
|
|
static void pci_dev_restore(struct pci_dev *dev)
|
|
|
{
|
|
|
pci_restore_state(dev);
|
|
|
+ pci_reset_notify(dev, false);
|
|
|
}
|
|
|
|
|
|
static 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)
|
|
|
|
|
|
return rc;
|
|
|
}
|
|
|
+
|
|
|
/**
|
|
|
* __pci_reset_function - reset a PCI device function
|
|
|
* @dev: PCI device to reset
|