PCI memory space may have a 64-bit offset on some architectures and the actual PCI memory address has to fixed up before remapping. So, pci_iomap should be used instead of reading and remapping PCI BAR directly.
Signed-off-by: Valentine Barshak <[EMAIL PROTECTED]> --- --- linux-2.6.orig/drivers/pci/quirks.c 2007-09-04 21:15:43.000000000 +0400 +++ linux-2.6.bld/drivers/pci/quirks.c 2007-09-05 20:46:14.000000000 +0400 @@ -1432,9 +1432,9 @@ static void __devinit quirk_e100_interrupt(struct pci_dev *dev) { u16 command; - u32 bar; u8 __iomem *csr; u8 cmd_hi; + int rc; switch (dev->device) { /* PCI IDs taken from drivers/net/e100.c */ @@ -1464,16 +1464,17 @@ * re-enable them when it's ready. */ pci_read_config_word(dev, PCI_COMMAND, &command); - pci_read_config_dword(dev, PCI_BASE_ADDRESS_0, &bar); - if (!(command & PCI_COMMAND_MEMORY) || !bar) + rc = pci_request_region(dev, 0, "e100_quirk"); + + if (!(command & PCI_COMMAND_MEMORY) || (rc < 0)) return; - csr = ioremap(bar, 8); + csr = pci_iomap(dev, 0, 8); if (!csr) { printk(KERN_WARNING "PCI: Can't map %s e100 registers\n", pci_name(dev)); - return; + goto e100_quirk_exit; } cmd_hi = readb(csr + 3); @@ -1483,7 +1484,9 @@ writeb(1, csr + 3); } - iounmap(csr); + pci_iounmap(dev, csr); +e100_quirk_exit: + pci_release_region(dev, 0); } DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, PCI_ANY_ID, quirk_e100_interrupt); _______________________________________________ Linuxppc-dev mailing list Linuxppc-dev@ozlabs.org https://ozlabs.org/mailman/listinfo/linuxppc-dev