From: Andrew Morton On Fri, 28 Mar 2008 16:10:11 -0700 (PDT) David Miller wrote: > From: Mariusz Kozlowski > Date: Fri, 28 Mar 2008 23:52:10 +0100 > > > The gregkh-pci-pci-sparc64-use-generic-pci_enable_resources.patch which > > replaces arch-specific code with generic pci_enable_resources() makes my sparc64 > > box unable to boot (that's what quilt bisection says). At first I see these messages: > > Yes, that generic code won't work because of the NULL > r->parent check. > > Alpha, ARM, V32, FRV, IA64, MIPS, MN10300, PARISC, PPC, > SH, V850, X86, and Xtensa are all likely to run into > problems because of this change. > > The only platform that did the check as a test of r->parent > being NULL is Powerpc. > > The rest either didn't check (like sparc64), or tested it by going: > > if (!r->start && r->end) > > So the amount of potential breakage from this change is enormous. Cc: Bjorn Helgaas Cc: Greg KH Signed-off-by: Andrew Morton --- arch/parisc/kernel/pci.c | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff -puN arch/parisc/kernel/pci.c~revert-gregkh-pci-pci-parisc-use-generic-pci_enable_resources arch/parisc/kernel/pci.c --- a/arch/parisc/kernel/pci.c~revert-gregkh-pci-pci-parisc-use-generic-pci_enable_resources +++ a/arch/parisc/kernel/pci.c @@ -287,15 +287,23 @@ void pcibios_align_resource(void *data, */ int pcibios_enable_device(struct pci_dev *dev, int mask) { - int err; - u16 cmd, old_cmd; - - err = pci_enable_resources(dev, mask); - if (err < 0) - return err; + u16 cmd; + int idx; pci_read_config_word(dev, PCI_COMMAND, &cmd); - old_cmd = cmd; + + for (idx = 0; idx < DEVICE_COUNT_RESOURCE; idx++) { + struct resource *r = &dev->resource[idx]; + + /* only setup requested resources */ + if (!(mask & (1<flags & IORESOURCE_IO) + cmd |= PCI_COMMAND_IO; + if (r->flags & IORESOURCE_MEM) + cmd |= PCI_COMMAND_MEMORY; + } cmd |= (PCI_COMMAND_SERR | PCI_COMMAND_PARITY); @@ -304,12 +312,8 @@ int pcibios_enable_device(struct pci_dev if (dev->bus->bridge_ctl & PCI_BRIDGE_CTL_FAST_BACK) cmd |= PCI_COMMAND_FAST_BACK; #endif - - if (cmd != old_cmd) { - dev_info(&dev->dev, "enabling SERR and PARITY (%04x -> %04x)\n", - old_cmd, cmd); - pci_write_config_word(dev, PCI_COMMAND, cmd); - } + DBGC("PCIBIOS: Enabling device %s cmd 0x%04x\n", pci_name(dev), cmd); + pci_write_config_word(dev, PCI_COMMAND, cmd); return 0; } _