This patchset mainly to fix pcie ari device hotplug bug. The last four based on the comment Bjorn suggested at http://marc.info/?l=linux-pci&m=135766710910208&w=2 v1: Oct 9 2012 add disable ari forwarding in pci hotplug drivers v2: Oct 16 2012 update ari forwarding in pci_init_capabilities() and rework pciehp_configure_device(),pciehp_unconfigure_device to traverse all ari function devices. v3: Jan 15 2013 use bus->devices list instead of pci_next_fn to traverse all pci fun devices. Commit 58c3a727cb(PCI: support PCIe ARI capability) introduced PCIe ARI capability support. pci_enable_ari() was introduced to enable ari forwarding bit in pcie port device when a connected pcie ari device was found in pci scan path. But system never clear ari forwarding bit regardless of a new non-ari pci device hot-inserted in the slot. PCIe Spec 2.0(6.13/441) recommends: "Following a hot-plug event below a Downstream Port, it is strongly recommended that software Clear the ARI Forwarding Enable bit in the Downstream Port until software determines that a newly added component is in fact an ARI Device" Following log described The ari device hotplug bug: Intel 82576 is PCIe ARI device and Qlogic HBA is non-ari device. "hot-remove Intel 82576(slot 201) NIC and Qlogic HBA card(slot 212)" pciehp 0000:08:14.0:pcie24: Button pressed on Slot(212) pciehp 0000:08:14.0:pcie24: PCI slot #212 - powering off due to button press. pciehp 0000:08:09.0:pcie24: Button pressed on Slot(201) pciehp 0000:08:09.0:pcie24: PCI slot #201 - powering off due to button press. igb 0000:0b:00.0: removed PHC on eth0 igb 0000:0b:00.1: removed PHC on eth1 GSI 39 (level, low) -> CPU 16 (0x0200) vector 85 unregistered pciehp 0000:08:14.0:pcie24: Latch open on Slot(212) pciehp 0000:08:14.0:pcie24: Latch close on Slot(212) pciehp 0000:08:14.0:pcie24: Latch open on Slot(212) pciehp 0000:08:09.0:pcie24: Latch open on Slot(201) pciehp 0000:08:14.0:pcie24: Latch close on Slot(212) pciehp 0000:08:09.0:pcie24: Latch close on Slot(201) "Inserted Intel 82576 in slot 212(originally HBA slot) and insert HBA in slot 201(insertd 82576)" pciehp 0000:08:14.0:pcie24: Button pressed on Slot(212) pciehp 0000:08:14.0:pcie24: PCI slot #212 - powering on due to button press. pciehp 0000:08:09.0:pcie24: Button pressed on Slot(201) pciehp 0000:08:09.0:pcie24: PCI slot #201 - powering on due to button press. pci 0000:0e:00.0: [8086:10c9] type 00 class 0x020000 pci 0000:0e:00.0: reg 10: [mem 0x00000000-0x0001ffff] pci 0000:0e:00.0: reg 14: [mem 0x00000000-0x0001ffff] pci 0000:0e:00.0: reg 18: [io 0x0000-0x001f] pci 0000:0e:00.0: reg 1c: [mem 0x00000000-0x00003fff] pci 0000:0e:00.0: reg 30: [mem 0x00000000-0x0001ffff pref] pci 0000:0e:00.0: calling pci_fixup_video+0x0/0x300 pci 0000:0e:00.0: PME# supported from D0 D3hot D3cold pci 0000:0e:00.0: PME# disabled pci 0000:0e:00.1: [8086:10c9] type 00 class 0x020000 pci 0000:0e:00.1: reg 10: [mem 0x00000000-0x0001ffff] pci 0000:0e:00.1: reg 14: [mem 0x00000000-0x0001ffff] pci 0000:0e:00.1: reg 18: [io 0x0000-0x001f] pci 0000:0e:00.1: reg 1c: [mem 0x00000000-0x00003fff] pci 0000:0e:00.1: reg 30: [mem 0x00000000-0x0001ffff pref] pci 0000:0e:00.1: calling pci_fixup_video+0x0/0x300 pci 0000:0e:00.1: PME# supported from D0 D3hot D3cold pci 0000:0e:00.1: PME# disabled pcieport 0000:08:14.0: bridge window [mem 0x00100000-0x001fffff pref] to [bus 0e] add_size 200000 pcieport 0000:08:14.0: res[9]=[mem 0x00100000-0x001fffff pref] get_res_add_size add_size 200000 pcieport 0000:08:14.0: BAR 9: can't assign mem pref (size 0x300000) pcieport 0000:08:14.0: BAR 7: can't assign io (size 0x1000) pcieport 0000:08:14.0: BAR 9: can't assign mem pref (size 0x100000) pcieport 0000:08:14.0: BAR 7: can't assign io (size 0x1000) pci 0000:0e:00.0: BAR 0: assigned [mem 0x56c00000-0x56c1ffff] pci 0000:0e:00.0: BAR 0: set to [mem 0x56c00000-0x56c1ffff] (PCI address [0x56c00000-0x56c1ffff]) pci 0000:0e:00.0: BAR 1: assigned [mem 0x56c20000-0x56c3ffff] pci 0000:0e:00.0: BAR 1: set to [mem 0x56c20000-0x56c3ffff] (PCI address [0x56c20000-0x56c3ffff]) pci 0000:0e:00.0: BAR 6: assigned [mem 0x56c40000-0x56c5ffff pref] pci 0000:0e:00.1: BAR 0: assigned [mem 0x56c60000-0x56c7ffff] pci 0000:0e:00.1: BAR 0: set to [mem 0x56c60000-0x56c7ffff] (PCI address [0x56c60000-0x56c7ffff]) pci 0000:0e:00.1: BAR 1: assigned [mem 0x56c80000-0x56c9ffff] pci 0000:0e:00.1: BAR 1: set to [mem 0x56c80000-0x56c9ffff] (PCI address [0x56c80000-0x56c9ffff]) pci 0000:0e:00.1: BAR 6: assigned [mem 0x56ca0000-0x56cbffff pref] pci 0000:0e:00.0: BAR 3: assigned [mem 0x56cc0000-0x56cc3fff] pci 0000:0e:00.0: BAR 3: set to [mem 0x56cc0000-0x56cc3fff] (PCI address [0x56cc0000-0x56cc3fff]) pci 0000:0e:00.1: BAR 3: assigned [mem 0x56cc4000-0x56cc7fff] pci 0000:0e:00.1: BAR 3: set to [mem 0x56cc4000-0x56cc7fff] (PCI address [0x56cc4000-0x56cc7fff]) pci 0000:0e:00.0: BAR 2: can't assign io (size 0x20) pci 0000:0e:00.1: BAR 2: can't assign io (size 0x20) pcieport 0000:08:14.0: PCI bridge to [bus 0e] pcieport 0000:08:14.0: bridge window [mem 0x56c00000-0x56efffff] PCI: No. 2 try to assign unassigned res pcieport 0000:08:14.0: bridge window [mem 0x00100000-0x001fffff 64bit pref] to [bus 0e] add_size 200000 pcieport 0000:08:14.0: res[9]=[mem 0x00100000-0x001fffff 64bit pref] get_res_add_size add_size 200000 pcieport 0000:08:14.0: BAR 9: can't assign mem pref (size 0x300000) pcieport 0000:08:14.0: BAR 7: can't assign io (size 0x1000) pcieport 0000:08:14.0: BAR 9: can't assign mem pref (size 0x100000) pcieport 0000:08:14.0: BAR 7: can't assign io (size 0x1000) pci 0000:0e:00.0: BAR 2: can't assign io (size 0x20) pci 0000:0e:00.1: BAR 2: can't assign io (size 0x20) pcieport 0000:08:14.0: PCI bridge to [bus 0e] pcieport 0000:08:14.0: bridge window [mem 0x56c00000-0x56efffff] pci 0000:0e:00.0: no hotplug settings from platform pci 0000:0e:00.1: no hotplug settings from platform pci 0000:0e:00.0: calling quirk_e100_interrupt+0x0/0x500 igb 0000:0e:00.0: enabling device (0000 -> 0002) igb 0000:0e:00.0: enabling bus mastering igb 0000:0e:00.0: added PHC on eth0 igb 0000:0e:00.0: Intel(R) Gigabit Ethernet Network Connection igb 0000:0e:00.0: eth0: (PCIe:2.5Gb/s:Width x4) 90:e2:ba:1e:59:8c igb 0000:0e:00.0: eth0: PBA No: FFFFFF-0FF igb 0000:0e:00.0: Using MSI-X interrupts. 8 rx queue(s), 8 tx queue(s) pci 0000:0e:00.1: calling quirk_e100_interrupt+0x0/0x500 igb 0000:0e:00.1: enabling device (0000 -> 0002) igb 0000:0e:00.1: enabling bus mastering igb 0000:0e:00.1: added PHC on eth1 igb 0000:0e:00.1: Intel(R) Gigabit Ethernet Network Connection igb 0000:0e:00.1: eth1: (PCIe:2.5Gb/s:Width x4) 90:e2:ba:1e:59:8d igb 0000:0e:00.1: eth1: PBA No: FFFFFF-0FF igb 0000:0e:00.1: Using MSI-X interrupts. 8 rx queue(s), 8 tx queue(s) pci 0000:0b:00.0: [1077:2532] type 00 class 0x0c0400 pci 0000:0b:00.0: reg 10: [io 0x0000-0x00ff] pci 0000:0b:00.0: reg 14: [mem 0x00000000-0x00003fff 64bit] pci 0000:0b:00.0: reg 30: [mem 0x00000000-0x0003ffff pref] pci 0000:0b:00.0: calling pci_fixup_video+0x0/0x300 pcieport 0000:08:09.0: bridge window [mem 0x00100000-0x001fffff pref] to [bus 0b] add_size 200000 pcieport 0000:08:09.0: res[9]=[mem 0x00100000-0x001fffff pref] get_res_add_size add_size 200000 pcieport 0000:08:09.0: BAR 9: can't assign mem pref (size 0x300000) pcieport 0000:08:09.0: BAR 7: can't assign io (size 0x1000) pcieport 0000:08:09.0: BAR 9: can't assign mem pref (size 0x100000) pcieport 0000:08:09.0: BAR 7: can't assign io (size 0x1000) pci 0000:0b:00.0: BAR 6: assigned [mem 0x57300000-0x5733ffff pref] pci 0000:0b:00.0: BAR 1: assigned [mem 0x57340000-0x57343fff 64bit] pci 0000:0b:00.0: BAR 1: set to [mem 0x57340000-0x57343fff 64bit] (PCI address [0x57340000-0x57343fff]) pci 0000:0b:00.0: BAR 0: can't assign io (size 0x100) pcieport 0000:08:09.0: PCI bridge to [bus 0b] pcieport 0000:08:09.0: bridge window [mem 0x57300000-0x575fffff] PCI: No. 2 try to assign unassigned res pcieport 0000:08:09.0: bridge window [mem 0x00100000-0x001fffff 64bit pref] to [bus 0b] add_size 200000 pcieport 0000:08:09.0: res[9]=[mem 0x00100000-0x001fffff 64bit pref] get_res_add_size add_size 200000 pcieport 0000:08:09.0: BAR 9: can't assign mem pref (size 0x300000) pcieport 0000:08:09.0: BAR 7: can't assign io (size 0x1000) pcieport 0000:08:09.0: BAR 9: can't assign mem pref (size 0x100000) pcieport 0000:08:09.0: BAR 7: can't assign io (size 0x1000) pci 0000:0b:00.0: BAR 0: can't assign io (size 0x100) pcieport 0000:08:09.0: PCI bridge to [bus 0b] pcieport 0000:08:09.0: bridge window [mem 0x57300000-0x575fffff] pci 0000:0b:00.0: no hotplug settings from platform qla2xxx 0000:0b:00.0: enabling device (0000 -> 0002) qla2xxx [0000:0b:00.0]-001d: : Found an ISP2532 irq 68 iobase 0xc000000057340000. qla2xxx 0000:0b:00.0: enabling bus mastering qla2xxx 0000:0b:00.0: enabling Mem-Wr-Inval scsi6 : qla2xxx qla2xxx [0000:0b:00.0]-00fb:6: QLogic QLE2562 - PCI-Express Dual Channel 8Gb Fibre Channel HBA. qla2xxx [0000:0b:00.0]-00fc:6: ISP2532: PCIe (5.0GT/s x8) @ 0000:0b:00.0 hdma+ host#=6 fw=5.03.02 (d5). qla2xxx [0000:0b:00.0]-8038:6: Cable is unplugged... >From the dmesg log, Qlogic HBA card can only find function device 0 after inserted this card in Intel 82576 slot, because ARI device set the ari forwarding of the pcie port device 0000:08:09.0. The first four patches have been tested in IA64 hotplug machine. The last three patches have not been tested because my hotplug machine don't support cpcihp,sgihp and shpchp. Bjorn Helgaas (4): PCI,pciehp: use bus->devices list intead of traditional traversal PCI,cpcihp: use bus->devices list instead of traditional traversal PCI,sgihp: use bus->devices list intead of traditional traversal PCI,shpchp: use bus->devices list instead of traditional traversal Yijing Wang (3): PCI: rework pci_enable_ari to support disable ari forwarding PCI: Rename pci_enable_ari to pci_configure_ari PCI: introduce pci_next_fn to simplify code drivers/pci/hotplug/cpci_hotplug_pci.c | 13 +----- drivers/pci/hotplug/pciehp_pci.c | 46 ++++++++-------------- drivers/pci/hotplug/sgi_hotplug.c | 40 ++++++++----------- drivers/pci/hotplug/shpchp_pci.c | 16 +------ drivers/pci/pci.c | 20 ++++++---- drivers/pci/pci.h | 2 +- drivers/pci/probe.c | 67 +++++++++++++++++--------------- 7 files changed, 89 insertions(+), 115 deletions(-) -- To unsubscribe from this list: send the line "unsubscribe linux-pci" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html