Hi I'm trying to use pciehp on powerpc platform. I set e1000e card to PCI Express bridge that has PCI Express HotPlug Capability. There is problem when poweron PCI Express HotPlug slot with pciehp. e1000e driver needs dma_ops in struct dev_archdata, but archdata isn't set (dma_ops is NULL) when probe from pciehp. Then e1000e driver returns error as below. -sh-3.2# echo 1 > /sys/bus/pci/slots/1/power <snip> [ 65.493662] pci 0000:03:00.0: BAR 2: set to [io 0xff7ee000-0xff7ee01f] (PCI address [0x1000-0x101f]) [ 65.502890] pcieport 0000:02:01.0: PCI bridge to [bus 03-03] [ 65.508555] pcieport 0000:02:01.0: bridge window [io 0xff7ee000-0xff7eefff] [ 65.515785] pcieport 0000:02:01.0: bridge window [mem 0xa0100000-0xa01fffff] [ 65.523015] pcieport 0000:02:01.0: bridge window [mem 0xa0200000-0xa02fffff 64bit pref] [ 65.531238] pci 0000:03:00.0: no hotplug settings from platform [ 65.538361] e1000e 0000:03:00.0: Disabling ASPM L1 [ 65.543616] e1000e 0000:03:00.0: enabling device (0000 -> 0002) [ 65.549876] e1000e 0000:03:00.0: No usable DMA configuration, aborting [ 65.557194] e1000e: probe of 0000:03:00.0 failed with error -5 -sh-3.2# lspci <snip> 0000:03:00.0 Ethernet controller: Intel Corporation 82572EI Gigabit Ethernet Controller (Copper) (rev 06) <snip> -sh-3.2# ifconfig -a <snip> // There is no network interface for 82572EI If archdata.dma_ops is NULL on x86 platform, e1000e will get dma_ops without archdata. So e1000e driver doesn't return error. I think that archdata should be set before driver probe (e.g pciehp). I tried to fix it (pciehp-add-archdata.patch), but I'm not good at PCI driver..., so please give better way. Regards. Hiroo MATSUMOTO (FUJITSU COMPUTER TECHNOLOGIES LIMITED) matsumoto.hiroo@xxxxxxxxxxxxxx
Signed-off-by: Hiroo MATSUMOTO <matsumoto.hiroo@xxxxxxxxxxxxxx> diff --git a/drivers/pci/hotplug/pciehp_pci.c b/drivers/pci/hotplug/pciehp_pci.c index a4031df..a021fbc 100644 --- a/drivers/pci/hotplug/pciehp_pci.c +++ b/drivers/pci/hotplug/pciehp_pci.c @@ -89,6 +89,7 @@ int pciehp_configure_device(struct slot *p_slot) pciehp_add_bridge(dev); } pci_dev_put(dev); + dev->dev.archdata = bridge->dev.archdata; } pci_assign_unassigned_bridge_resources(bridge);