diff options
author | Alex Williamson <alex.williamson@redhat.com> | 2013-08-08 16:09:24 -0400 |
---|---|---|
committer | Bjorn Helgaas <bhelgaas@google.com> | 2013-08-09 18:47:48 -0400 |
commit | 64e8674fbe6bc848333a9b7e19f8cc019dde9eab (patch) | |
tree | 43321f9f0693954f38cf4b82fc0e1da3ea267d10 | |
parent | 3b2f64d00c46e1e4e9bd0bb9bb12619adac27a4b (diff) |
PCI: Add pci_reset_bridge_secondary_bus()
Move the secondary bus reset code from pci_parent_bus_reset() into its own
function. Export it as we'll later be calling it from hotplug controllers
and elsewhere.
Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
-rw-r--r-- | drivers/pci/pci.c | 32 | ||||
-rw-r--r-- | include/linux/pci.h | 1 |
2 files changed, 24 insertions, 9 deletions
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index e37fea6e178d..d46860898e1f 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c | |||
@@ -3215,9 +3215,30 @@ static int pci_pm_reset(struct pci_dev *dev, int probe) | |||
3215 | return 0; | 3215 | return 0; |
3216 | } | 3216 | } |
3217 | 3217 | ||
3218 | static int pci_parent_bus_reset(struct pci_dev *dev, int probe) | 3218 | /** |
3219 | * pci_reset_bridge_secondary_bus - Reset the secondary bus on a PCI bridge. | ||
3220 | * @dev: Bridge device | ||
3221 | * | ||
3222 | * Use the bridge control register to assert reset on the secondary bus. | ||
3223 | * Devices on the secondary bus are left in power-on state. | ||
3224 | */ | ||
3225 | void pci_reset_bridge_secondary_bus(struct pci_dev *dev) | ||
3219 | { | 3226 | { |
3220 | u16 ctrl; | 3227 | u16 ctrl; |
3228 | |||
3229 | pci_read_config_word(dev, PCI_BRIDGE_CONTROL, &ctrl); | ||
3230 | ctrl |= PCI_BRIDGE_CTL_BUS_RESET; | ||
3231 | pci_write_config_word(dev, PCI_BRIDGE_CONTROL, ctrl); | ||
3232 | msleep(100); | ||
3233 | |||
3234 | ctrl &= ~PCI_BRIDGE_CTL_BUS_RESET; | ||
3235 | pci_write_config_word(dev, PCI_BRIDGE_CONTROL, ctrl); | ||
3236 | msleep(100); | ||
3237 | } | ||
3238 | EXPORT_SYMBOL_GPL(pci_reset_bridge_secondary_bus); | ||
3239 | |||
3240 | static int pci_parent_bus_reset(struct pci_dev *dev, int probe) | ||
3241 | { | ||
3221 | struct pci_dev *pdev; | 3242 | struct pci_dev *pdev; |
3222 | 3243 | ||
3223 | if (pci_is_root_bus(dev->bus) || dev->subordinate || !dev->bus->self) | 3244 | if (pci_is_root_bus(dev->bus) || dev->subordinate || !dev->bus->self) |
@@ -3230,14 +3251,7 @@ static int pci_parent_bus_reset(struct pci_dev *dev, int probe) | |||
3230 | if (probe) | 3251 | if (probe) |
3231 | return 0; | 3252 | return 0; |
3232 | 3253 | ||
3233 | pci_read_config_word(dev->bus->self, PCI_BRIDGE_CONTROL, &ctrl); | 3254 | pci_reset_bridge_secondary_bus(dev->bus->self); |
3234 | ctrl |= PCI_BRIDGE_CTL_BUS_RESET; | ||
3235 | pci_write_config_word(dev->bus->self, PCI_BRIDGE_CONTROL, ctrl); | ||
3236 | msleep(100); | ||
3237 | |||
3238 | ctrl &= ~PCI_BRIDGE_CTL_BUS_RESET; | ||
3239 | pci_write_config_word(dev->bus->self, PCI_BRIDGE_CONTROL, ctrl); | ||
3240 | msleep(100); | ||
3241 | 3255 | ||
3242 | return 0; | 3256 | return 0; |
3243 | } | 3257 | } |
diff --git a/include/linux/pci.h b/include/linux/pci.h index 0fd1f1582fa1..35c1bc4909f3 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h | |||
@@ -924,6 +924,7 @@ int pcie_set_mps(struct pci_dev *dev, int mps); | |||
924 | int __pci_reset_function(struct pci_dev *dev); | 924 | int __pci_reset_function(struct pci_dev *dev); |
925 | int __pci_reset_function_locked(struct pci_dev *dev); | 925 | int __pci_reset_function_locked(struct pci_dev *dev); |
926 | int pci_reset_function(struct pci_dev *dev); | 926 | int pci_reset_function(struct pci_dev *dev); |
927 | void pci_reset_bridge_secondary_bus(struct pci_dev *dev); | ||
927 | void pci_update_resource(struct pci_dev *dev, int resno); | 928 | void pci_update_resource(struct pci_dev *dev, int resno); |
928 | int __must_check pci_assign_resource(struct pci_dev *dev, int i); | 929 | int __must_check pci_assign_resource(struct pci_dev *dev, int i); |
929 | int __must_check pci_reassign_resource(struct pci_dev *dev, int i, resource_size_t add_size, resource_size_t align); | 930 | int __must_check pci_reassign_resource(struct pci_dev *dev, int i, resource_size_t add_size, resource_size_t align); |