diff options
Diffstat (limited to 'drivers/pci')
-rw-r--r-- | drivers/pci/pci.c | 21 |
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 | */ | ||
3317 | static 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 | |||
3308 | static void pci_dev_save_and_disable(struct pci_dev *dev) | 3325 | static 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) | |||
3328 | static void pci_dev_restore(struct pci_dev *dev) | 3347 | static 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 | ||
3333 | static int pci_dev_reset(struct pci_dev *dev, int probe) | 3353 | 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) | |||
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 |