diff options
author | Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> | 2012-01-12 12:06:46 -0500 |
---|---|---|
committer | Jesse Barnes <jbarnes@virtuousgeek.org> | 2012-02-14 11:44:48 -0500 |
commit | 6fbf9e7a90862988c278462d85ce9684605a52b2 (patch) | |
tree | ccc79061bac41537c37f5edc73bdc5bc59005c8a /drivers/pci | |
parent | 8f0cdddcd3f270901765fc909c3aee37a2091e78 (diff) |
PCI: Introduce __pci_reset_function_locked to be used when holding device_lock.
The use case of this is when a driver wants to call FLR when a device
is attached to it using the SysFS "bind" or "unbind" functionality.
The call chain when a user does "bind" looks as so:
echo "0000:01.07.0" > /sys/bus/pci/drivers/XXXX/bind
and ends up calling:
driver_bind:
device_lock(dev); <=== TAKES LOCK
XXXX_probe:
.. pci_enable_device()
...__pci_reset_function(), which calls
pci_dev_reset(dev, 0):
if (!0) {
device_lock(dev) <==== DEADLOCK
The __pci_reset_function_locked function allows the the drivers
'probe' function to call the "pci_reset_function" while still holding
the driver mutex lock.
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Diffstat (limited to 'drivers/pci')
-rw-r--r-- | drivers/pci/pci.c | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index af295bb21d62..053670e09e2b 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c | |||
@@ -3163,6 +3163,31 @@ int __pci_reset_function(struct pci_dev *dev) | |||
3163 | EXPORT_SYMBOL_GPL(__pci_reset_function); | 3163 | EXPORT_SYMBOL_GPL(__pci_reset_function); |
3164 | 3164 | ||
3165 | /** | 3165 | /** |
3166 | * __pci_reset_function_locked - reset a PCI device function while holding | ||
3167 | * the @dev mutex lock. | ||
3168 | * @dev: PCI device to reset | ||
3169 | * | ||
3170 | * Some devices allow an individual function to be reset without affecting | ||
3171 | * other functions in the same device. The PCI device must be responsive | ||
3172 | * to PCI config space in order to use this function. | ||
3173 | * | ||
3174 | * The device function is presumed to be unused and the caller is holding | ||
3175 | * the device mutex lock when this function is called. | ||
3176 | * Resetting the device will make the contents of PCI configuration space | ||
3177 | * random, so any caller of this must be prepared to reinitialise the | ||
3178 | * device including MSI, bus mastering, BARs, decoding IO and memory spaces, | ||
3179 | * etc. | ||
3180 | * | ||
3181 | * Returns 0 if the device function was successfully reset or negative if the | ||
3182 | * device doesn't support resetting a single function. | ||
3183 | */ | ||
3184 | int __pci_reset_function_locked(struct pci_dev *dev) | ||
3185 | { | ||
3186 | return pci_dev_reset(dev, 1); | ||
3187 | } | ||
3188 | EXPORT_SYMBOL_GPL(__pci_reset_function_locked); | ||
3189 | |||
3190 | /** | ||
3166 | * pci_probe_reset_function - check whether the device can be safely reset | 3191 | * pci_probe_reset_function - check whether the device can be safely reset |
3167 | * @dev: PCI device to reset | 3192 | * @dev: PCI device to reset |
3168 | * | 3193 | * |