diff options
Diffstat (limited to 'drivers/pci')
| -rw-r--r-- | drivers/pci/hotplug/rpadlpar_core.c | 3 | ||||
| -rw-r--r-- | drivers/pci/hotplug/rpaphp_core.c | 3 | ||||
| -rw-r--r-- | drivers/pci/pci.c | 6 | ||||
| -rw-r--r-- | drivers/pci/pcie/aer/aerdrv.c | 10 | ||||
| -rw-r--r-- | drivers/pci/probe.c | 23 |
5 files changed, 22 insertions, 23 deletions
diff --git a/drivers/pci/hotplug/rpadlpar_core.c b/drivers/pci/hotplug/rpadlpar_core.c index 4e3e0382c16e..083034710fa6 100644 --- a/drivers/pci/hotplug/rpadlpar_core.c +++ b/drivers/pci/hotplug/rpadlpar_core.c | |||
| @@ -20,6 +20,7 @@ | |||
| 20 | #include <linux/init.h> | 20 | #include <linux/init.h> |
| 21 | #include <linux/pci.h> | 21 | #include <linux/pci.h> |
| 22 | #include <linux/string.h> | 22 | #include <linux/string.h> |
| 23 | #include <linux/vmalloc.h> | ||
| 23 | 24 | ||
| 24 | #include <asm/pci-bridge.h> | 25 | #include <asm/pci-bridge.h> |
| 25 | #include <linux/mutex.h> | 26 | #include <linux/mutex.h> |
| @@ -430,6 +431,8 @@ int dlpar_remove_slot(char *drc_name) | |||
| 430 | rc = dlpar_remove_pci_slot(drc_name, dn); | 431 | rc = dlpar_remove_pci_slot(drc_name, dn); |
| 431 | break; | 432 | break; |
| 432 | } | 433 | } |
| 434 | vm_unmap_aliases(); | ||
| 435 | |||
| 433 | printk(KERN_INFO "%s: slot %s removed\n", DLPAR_MODULE_NAME, drc_name); | 436 | printk(KERN_INFO "%s: slot %s removed\n", DLPAR_MODULE_NAME, drc_name); |
| 434 | exit: | 437 | exit: |
| 435 | mutex_unlock(&rpadlpar_mutex); | 438 | mutex_unlock(&rpadlpar_mutex); |
diff --git a/drivers/pci/hotplug/rpaphp_core.c b/drivers/pci/hotplug/rpaphp_core.c index 719702240780..ef7411c660b9 100644 --- a/drivers/pci/hotplug/rpaphp_core.c +++ b/drivers/pci/hotplug/rpaphp_core.c | |||
| @@ -29,6 +29,7 @@ | |||
| 29 | #include <linux/pci_hotplug.h> | 29 | #include <linux/pci_hotplug.h> |
| 30 | #include <linux/smp.h> | 30 | #include <linux/smp.h> |
| 31 | #include <linux/init.h> | 31 | #include <linux/init.h> |
| 32 | #include <linux/vmalloc.h> | ||
| 32 | #include <asm/eeh.h> /* for eeh_add_device() */ | 33 | #include <asm/eeh.h> /* for eeh_add_device() */ |
| 33 | #include <asm/rtas.h> /* rtas_call */ | 34 | #include <asm/rtas.h> /* rtas_call */ |
| 34 | #include <asm/pci-bridge.h> /* for pci_controller */ | 35 | #include <asm/pci-bridge.h> /* for pci_controller */ |
| @@ -418,6 +419,8 @@ static int disable_slot(struct hotplug_slot *hotplug_slot) | |||
| 418 | return -EINVAL; | 419 | return -EINVAL; |
| 419 | 420 | ||
| 420 | pcibios_remove_pci_devices(slot->bus); | 421 | pcibios_remove_pci_devices(slot->bus); |
| 422 | vm_unmap_aliases(); | ||
| 423 | |||
| 421 | slot->state = NOT_CONFIGURED; | 424 | slot->state = NOT_CONFIGURED; |
| 422 | return 0; | 425 | return 0; |
| 423 | } | 426 | } |
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index 5ea587e59e48..37499127c801 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c | |||
| @@ -679,7 +679,7 @@ static void __pci_start_power_transition(struct pci_dev *dev, pci_power_t state) | |||
| 679 | */ | 679 | */ |
| 680 | int __pci_complete_power_transition(struct pci_dev *dev, pci_power_t state) | 680 | int __pci_complete_power_transition(struct pci_dev *dev, pci_power_t state) |
| 681 | { | 681 | { |
| 682 | return state > PCI_D0 ? | 682 | return state >= PCI_D0 ? |
| 683 | pci_platform_power_transition(dev, state) : -EINVAL; | 683 | pci_platform_power_transition(dev, state) : -EINVAL; |
| 684 | } | 684 | } |
| 685 | EXPORT_SYMBOL_GPL(__pci_complete_power_transition); | 685 | EXPORT_SYMBOL_GPL(__pci_complete_power_transition); |
| @@ -716,10 +716,6 @@ int pci_set_power_state(struct pci_dev *dev, pci_power_t state) | |||
| 716 | */ | 716 | */ |
| 717 | return 0; | 717 | return 0; |
| 718 | 718 | ||
| 719 | /* Check if we're already there */ | ||
| 720 | if (dev->current_state == state) | ||
| 721 | return 0; | ||
| 722 | |||
| 723 | __pci_start_power_transition(dev, state); | 719 | __pci_start_power_transition(dev, state); |
| 724 | 720 | ||
| 725 | /* This device is quirked not to be put into D3, so | 721 | /* This device is quirked not to be put into D3, so |
diff --git a/drivers/pci/pcie/aer/aerdrv.c b/drivers/pci/pcie/aer/aerdrv.c index aa495ad9bbd4..7a711ee314b7 100644 --- a/drivers/pci/pcie/aer/aerdrv.c +++ b/drivers/pci/pcie/aer/aerdrv.c | |||
| @@ -244,11 +244,17 @@ static pci_ers_result_t aer_root_reset(struct pci_dev *dev) | |||
| 244 | 244 | ||
| 245 | /* Assert Secondary Bus Reset */ | 245 | /* Assert Secondary Bus Reset */ |
| 246 | pci_read_config_word(dev, PCI_BRIDGE_CONTROL, &p2p_ctrl); | 246 | pci_read_config_word(dev, PCI_BRIDGE_CONTROL, &p2p_ctrl); |
| 247 | p2p_ctrl |= PCI_CB_BRIDGE_CTL_CB_RESET; | 247 | p2p_ctrl |= PCI_BRIDGE_CTL_BUS_RESET; |
| 248 | pci_write_config_word(dev, PCI_BRIDGE_CONTROL, p2p_ctrl); | 248 | pci_write_config_word(dev, PCI_BRIDGE_CONTROL, p2p_ctrl); |
| 249 | 249 | ||
| 250 | /* | ||
| 251 | * we should send hot reset message for 2ms to allow it time to | ||
| 252 | * propogate to all downstream ports | ||
| 253 | */ | ||
| 254 | msleep(2); | ||
| 255 | |||
| 250 | /* De-assert Secondary Bus Reset */ | 256 | /* De-assert Secondary Bus Reset */ |
| 251 | p2p_ctrl &= ~PCI_CB_BRIDGE_CTL_CB_RESET; | 257 | p2p_ctrl &= ~PCI_BRIDGE_CTL_BUS_RESET; |
| 252 | pci_write_config_word(dev, PCI_BRIDGE_CONTROL, p2p_ctrl); | 258 | pci_write_config_word(dev, PCI_BRIDGE_CONTROL, p2p_ctrl); |
| 253 | 259 | ||
| 254 | /* | 260 | /* |
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c index 882bd8d29fe3..c82548afcd5c 100644 --- a/drivers/pci/probe.c +++ b/drivers/pci/probe.c | |||
| @@ -174,19 +174,14 @@ int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type, | |||
| 174 | pci_read_config_dword(dev, pos, &sz); | 174 | pci_read_config_dword(dev, pos, &sz); |
| 175 | pci_write_config_dword(dev, pos, l); | 175 | pci_write_config_dword(dev, pos, l); |
| 176 | 176 | ||
| 177 | if (!sz) | ||
| 178 | goto fail; /* BAR not implemented */ | ||
| 179 | |||
| 180 | /* | 177 | /* |
| 181 | * All bits set in sz means the device isn't working properly. | 178 | * All bits set in sz means the device isn't working properly. |
| 182 | * If it's a memory BAR or a ROM, bit 0 must be clear; if it's | 179 | * If the BAR isn't implemented, all bits must be 0. If it's a |
| 183 | * an io BAR, bit 1 must be clear. | 180 | * memory BAR or a ROM, bit 0 must be clear; if it's an io BAR, bit |
| 181 | * 1 must be clear. | ||
| 184 | */ | 182 | */ |
| 185 | if (sz == 0xffffffff) { | 183 | if (!sz || sz == 0xffffffff) |
| 186 | dev_err(&dev->dev, "reg %x: invalid size %#x; broken device?\n", | ||
| 187 | pos, sz); | ||
| 188 | goto fail; | 184 | goto fail; |
| 189 | } | ||
| 190 | 185 | ||
| 191 | /* | 186 | /* |
| 192 | * I don't know how l can have all bits set. Copied from old code. | 187 | * I don't know how l can have all bits set. Copied from old code. |
| @@ -249,17 +244,13 @@ int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type, | |||
| 249 | pos, res); | 244 | pos, res); |
| 250 | } | 245 | } |
| 251 | } else { | 246 | } else { |
| 252 | u32 size = pci_size(l, sz, mask); | 247 | sz = pci_size(l, sz, mask); |
| 253 | 248 | ||
| 254 | if (!size) { | 249 | if (!sz) |
| 255 | dev_err(&dev->dev, "reg %x: invalid size " | ||
| 256 | "(l %#x sz %#x mask %#x); broken device?", | ||
| 257 | pos, l, sz, mask); | ||
| 258 | goto fail; | 250 | goto fail; |
| 259 | } | ||
| 260 | 251 | ||
| 261 | res->start = l; | 252 | res->start = l; |
| 262 | res->end = l + size; | 253 | res->end = l + sz; |
| 263 | 254 | ||
| 264 | dev_printk(KERN_DEBUG, &dev->dev, "reg %x: %pR\n", pos, res); | 255 | dev_printk(KERN_DEBUG, &dev->dev, "reg %x: %pR\n", pos, res); |
| 265 | } | 256 | } |
