aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/pci/quirks.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/pci/quirks.c')
-rw-r--r--drivers/pci/quirks.c57
1 files changed, 57 insertions, 0 deletions
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
index e3c78c39b7e4..5ca1e94887be 100644
--- a/drivers/pci/quirks.c
+++ b/drivers/pci/quirks.c
@@ -1511,6 +1511,63 @@ static void __devinit quirk_netmos(struct pci_dev *dev)
1511} 1511}
1512DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_NETMOS, PCI_ANY_ID, quirk_netmos); 1512DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_NETMOS, PCI_ANY_ID, quirk_netmos);
1513 1513
1514static void __devinit quirk_e100_interrupt(struct pci_dev *dev)
1515{
1516 u16 command;
1517 u32 bar;
1518 u8 __iomem *csr;
1519 u8 cmd_hi;
1520
1521 switch (dev->device) {
1522 /* PCI IDs taken from drivers/net/e100.c */
1523 case 0x1029:
1524 case 0x1030 ... 0x1034:
1525 case 0x1038 ... 0x103E:
1526 case 0x1050 ... 0x1057:
1527 case 0x1059:
1528 case 0x1064 ... 0x106B:
1529 case 0x1091 ... 0x1095:
1530 case 0x1209:
1531 case 0x1229:
1532 case 0x2449:
1533 case 0x2459:
1534 case 0x245D:
1535 case 0x27DC:
1536 break;
1537 default:
1538 return;
1539 }
1540
1541 /*
1542 * Some firmware hands off the e100 with interrupts enabled,
1543 * which can cause a flood of interrupts if packets are
1544 * received before the driver attaches to the device. So
1545 * disable all e100 interrupts here. The driver will
1546 * re-enable them when it's ready.
1547 */
1548 pci_read_config_word(dev, PCI_COMMAND, &command);
1549 pci_read_config_dword(dev, PCI_BASE_ADDRESS_0, &bar);
1550
1551 if (!(command & PCI_COMMAND_MEMORY) || !bar)
1552 return;
1553
1554 csr = ioremap(bar, 8);
1555 if (!csr) {
1556 printk(KERN_WARNING "PCI: Can't map %s e100 registers\n",
1557 pci_name(dev));
1558 return;
1559 }
1560
1561 cmd_hi = readb(csr + 3);
1562 if (cmd_hi == 0) {
1563 printk(KERN_WARNING "PCI: Firmware left %s e100 interrupts "
1564 "enabled, disabling\n", pci_name(dev));
1565 writeb(1, csr + 3);
1566 }
1567
1568 iounmap(csr);
1569}
1570DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, PCI_ANY_ID, quirk_e100_interrupt);
1514 1571
1515static void __devinit fixup_rev1_53c810(struct pci_dev* dev) 1572static void __devinit fixup_rev1_53c810(struct pci_dev* dev)
1516{ 1573{