|
@@ -4259,6 +4259,41 @@ int pci_reset_function(struct pci_dev *dev)
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(pci_reset_function);
|
|
|
|
|
|
+/**
|
|
|
+ * pci_reset_function_locked - quiesce and reset a PCI device function
|
|
|
+ * @dev: PCI device to reset
|
|
|
+ *
|
|
|
+ * Some devices allow an individual function to be reset without affecting
|
|
|
+ * other functions in the same device. The PCI device must be responsive
|
|
|
+ * to PCI config space in order to use this function.
|
|
|
+ *
|
|
|
+ * This function does not just reset the PCI portion of a device, but
|
|
|
+ * clears all the state associated with the device. This function differs
|
|
|
+ * from __pci_reset_function() in that it saves and restores device state
|
|
|
+ * over the reset. It also differs from pci_reset_function() in that it
|
|
|
+ * requires the PCI device lock to be held.
|
|
|
+ *
|
|
|
+ * Returns 0 if the device function was successfully reset or negative if the
|
|
|
+ * device doesn't support resetting a single function.
|
|
|
+ */
|
|
|
+int pci_reset_function_locked(struct pci_dev *dev)
|
|
|
+{
|
|
|
+ int rc;
|
|
|
+
|
|
|
+ rc = pci_probe_reset_function(dev);
|
|
|
+ if (rc)
|
|
|
+ return rc;
|
|
|
+
|
|
|
+ pci_dev_save_and_disable(dev);
|
|
|
+
|
|
|
+ rc = __pci_reset_function_locked(dev);
|
|
|
+
|
|
|
+ pci_dev_restore(dev);
|
|
|
+
|
|
|
+ return rc;
|
|
|
+}
|
|
|
+EXPORT_SYMBOL_GPL(pci_reset_function_locked);
|
|
|
+
|
|
|
/**
|
|
|
* pci_try_reset_function - quiesce and reset a PCI device function
|
|
|
* @dev: PCI device to reset
|