[PATCH] pci: Fix e100 interrupt quirk

Previous thread: [GIT PULL] XFS update for 2.6.23 by Tim Shimmin on Tuesday, September 18, 2007 - 7:24 am. (1 message)

Next thread: What can be done to reduce the huge number of build fixes required to release an MM tree? by Miles Lane on Tuesday, September 18, 2007 - 8:23 am. (3 messages)
To: <linux-kernel@...>
Date: Tuesday, September 18, 2007 - 7:17 am

PCI memory space may have a 64-bit offset on some architectures
(for example, PowerPC 440) and the actual PCI memory address
has to fixed up (an offset to PCI mem space shuld be added)
before remapping. So, pci_iomap should be used instead of
reading and remapping PCI BAR directly. This has been tested
on Sequoia PowerPC 440EPx board.

Signed-off-by: Valentine Barshak <vbarshak@ru.mvista.com>
---

--- 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
@@ -1444,9 +1444,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 */
@@ -1476,16 +1476,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);
@@ -1495,7 +1496,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);

-

To: Valentine Barshak <vbarshak@...>
Cc: <linux-kernel@...>, Auke Kok <auke-jan.h.kok@...>, <netdev@...>
Date: Thursday, September 20, 2007 - 2:37 am

Really? So if pci_request_region() failed and !(command & PCI_COMMAND_MEMORY),
-

To: Andrew Morton <akpm@...>
Cc: <linux-kernel@...>, Auke Kok <auke-jan.h.kok@...>, <netdev@...>
Date: Thursday, September 20, 2007 - 7:33 am

I've split command and request region checks and submitted new patch:
http://lkml.org/lkml/2007/9/19/106
Please, take a look,
Thanks,

-

To: Valentine Barshak <vbarshak@...>
Cc: <linux-kernel@...>
Date: Wednesday, September 19, 2007 - 6:43 am

I didn't look at this too much, but isn't something like:
if (rc >= 0)
goto e100_quirk_exit;
needed before this return?

Regards,
Jarek P.
-

To: <linux-kernel@...>
Cc: <jarkao2@...>
Date: Wednesday, September 19, 2007 - 8:36 am

PCI memory space may have a 64-bit offset on some architectures
(for example, PowerPC 440) and the actual PCI memory address
has to fixed up (an offset to PCI mem space shuld be added)
before remapping. So, pci_iomap should be used instead of
reading and remapping PCI BAR directly. This has been tested
on Sequoia PowerPC 440EPx board.

Signed-off-by: Valentine Barshak <vbarshak@ru.mvista.com>
---

diff -ruN linux-2.6.orig/drivers/pci/quirks.c linux-2.6/drivers/pci/quirks.c
--- linux-2.6.orig/drivers/pci/quirks.c 2007-09-18 15:32:48.000000000 +0400
+++ linux-2.6/drivers/pci/quirks.c 2007-09-19 15:57:26.000000000 +0400
@@ -1444,7 +1444,6 @@
static void __devinit quirk_e100_interrupt(struct pci_dev *dev)
{
u16 command;
- u32 bar;
u8 __iomem *csr;
u8 cmd_hi;

@@ -1476,16 +1475,18 @@
* 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)
+ if (!(command & PCI_COMMAND_MEMORY))
return;

- csr = ioremap(bar, 8);
+ if (pci_request_region(dev, 0, "e100_quirk"))
+ return;
+
+ 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);
@@ -1495,7 +1496,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);

-

To: Jarek Poplawski <jarkao2@...>
Cc: <linux-kernel@...>
Date: Wednesday, September 19, 2007 - 6:59 am

I'll split these 2 checks and submit new patch in a minute.

-

Previous thread: [GIT PULL] XFS update for 2.6.23 by Tim Shimmin on Tuesday, September 18, 2007 - 7:24 am. (1 message)

Next thread: What can be done to reduce the huge number of build fixes required to release an MM tree? by Miles Lane on Tuesday, September 18, 2007 - 8:23 am. (3 messages)