Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

pci: Fix hotplug of Express Module with pci bridges

I noticed that hotplug of one setup does not work with recent change in
pci tree.

After checking the bridge conf setup, I noticed that the bridges get
assigned but do not get enabled.

The reason is the following commit, while simply ignores bridge
resources when enabling a pci device:

| commit bbef98ab0f019f1b0c25c1acdf1683c68933d41b
| Author: Ram Pai <linuxram@us.ibm.com>
| Date: Sun Nov 6 10:33:10 2011 +0800
|
| PCI: defer enablement of SRIOV BARS
|...
| NOTE: Note, there is subtle change in the pci_enable_device() API. Any
| driver that depends on SRIOV BARS to be enabled in pci_enable_device()
| can fail.

Put back bridge resource and ROM resource checking to fix the problem.

That should fix regression like BIOS does not assign correct resource to
bridge.

Discussion can be found at:
http://www.spinics.net/lists/linux-pci/msg12874.html

Signed-off-by: Yinghai Lu <yinghai@kernel.org>
Acked-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by

Yinghai Lu and committed by
Linus Torvalds
497f16f2 ab347d94

+5 -1
+5 -1
drivers/pci/pci.c
··· 1129 1129 if (atomic_add_return(1, &dev->enable_cnt) > 1) 1130 1130 return 0; /* already enabled */ 1131 1131 1132 - for (i = 0; i < PCI_ROM_RESOURCE; i++) 1132 + /* only skip sriov related */ 1133 + for (i = 0; i <= PCI_ROM_RESOURCE; i++) 1134 + if (dev->resource[i].flags & flags) 1135 + bars |= (1 << i); 1136 + for (i = PCI_BRIDGE_RESOURCES; i < DEVICE_COUNT_RESOURCE; i++) 1133 1137 if (dev->resource[i].flags & flags) 1134 1138 bars |= (1 << i); 1135 1139