PCI e100 interrupt quirk fix
PATCH 1/1 PCI e100 interrupt quirk fix
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]>
---
drivers/pci/quirks.c +9 -6
@@ -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);