2.1.56 patch for PCI NE2000 irq sharing

Gordon Chaffee (chaffee@shmoo.cs.berkeley.edu)
Sun, 21 Sep 1997 17:02:04 -0700 (PDT)


Here is a small patch that allows a PCI NE2000 network card to share
interrupts with other PCI devices. I've been using it without problems
since 2.1.29.

- Gordon

diff -u -r linux-2.1.56-clean/drivers/net/3c503.c linux/drivers/net/3c503.c
--- linux-2.1.56-clean/drivers/net/3c503.c Wed Apr 23 19:01:18 1997
+++ linux/drivers/net/3c503.c Sat Sep 20 00:18:38 1997
@@ -346,7 +346,7 @@
outb_p(0x04 << ((*irqp == 9) ? 2 : *irqp), E33G_IDCFR);
outb_p(0x00, E33G_IDCFR);
if (*irqp == autoirq_report(0) /* It's a good IRQ line! */
- && request_irq (dev->irq = *irqp, &ei_interrupt, 0, ei_status.name, NULL) == 0)
+ && request_irq (dev->irq = *irqp, &ei_interrupt, 0, ei_status.name, dev) == 0)
break;
}
} while (*++irqp);
@@ -355,7 +355,7 @@
return -EAGAIN;
}
} else {
- if (request_irq(dev->irq, &ei_interrupt, 0, ei_status.name, NULL)) {
+ if (request_irq(dev->irq, &ei_interrupt, 0, ei_status.name, dev)) {
return -EAGAIN;
}
}
diff -u -r linux-2.1.56-clean/drivers/net/8390.c linux/drivers/net/8390.c
--- linux-2.1.56-clean/drivers/net/8390.c Tue Aug 5 09:24:32 1997
+++ linux/drivers/net/8390.c Sat Sep 20 00:18:38 1997
@@ -284,7 +284,7 @@
Handle the ether interface interrupts. */
void ei_interrupt(int irq, void *dev_id, struct pt_regs * regs)
{
- struct device *dev = (struct device *)(irq2dev_map[irq]);
+ struct device *dev = dev_id;
int e8390_base;
int interrupts, nr_serviced = 0;
struct ei_device *ei_local;
@@ -296,12 +296,14 @@
e8390_base = dev->base_addr;
ei_local = (struct ei_device *) dev->priv;
if (dev->interrupt || ei_local->irqlock) {
+#if 0 /* This could be an interrupt for a PCI device sharing this line */
/* The "irqlock" check is only for testing. */
printk(ei_local->irqlock
? "%s: Interrupted while interrupts are masked! isr=%#2x imr=%#2x.\n"
: "%s: Reentering the interrupt handler! isr=%#2x imr=%#2x.\n",
dev->name, inb_p(e8390_base + EN0_ISR),
inb_p(e8390_base + EN0_IMR));
+#endif
return;
}

diff -u -r linux-2.1.56-clean/drivers/net/ac3200.c linux/drivers/net/ac3200.c
--- linux-2.1.56-clean/drivers/net/ac3200.c Wed Apr 23 19:01:18 1997
+++ linux/drivers/net/ac3200.c Sat Sep 20 00:18:38 1997
@@ -165,7 +165,7 @@
else if (dev->irq == 2)
dev->irq = 9;

- if (request_irq(dev->irq, ei_interrupt, 0, "ac3200", NULL)) {
+ if (request_irq(dev->irq, ei_interrupt, 0, "ac3200", dev)) {
printk (" unable to get IRQ %d.\n", dev->irq);
return EAGAIN;
}
@@ -228,7 +228,7 @@
/* Someday we may enable the IRQ and shared memory here. */
int ioaddr = dev->base_addr;

- if (request_irq(dev->irq, ei_interrupt, 0, "ac3200", NULL))
+ if (request_irq(dev->irq, ei_interrupt, 0, "ac3200", dev))
return -EAGAIN;
#endif

diff -u -r linux-2.1.56-clean/drivers/net/e2100.c linux/drivers/net/e2100.c
--- linux-2.1.56-clean/drivers/net/e2100.c Wed Apr 23 19:01:19 1997
+++ linux/drivers/net/e2100.c Sat Sep 20 00:18:38 1997
@@ -254,7 +254,7 @@
{
short ioaddr = dev->base_addr;

- if (request_irq(dev->irq, ei_interrupt, 0, "e2100", NULL)) {
+ if (request_irq(dev->irq, ei_interrupt, 0, "e2100", dev)) {
return EBUSY;
}
irq2dev_map[dev->irq] = dev;
diff -u -r linux-2.1.56-clean/drivers/net/es3210.c linux/drivers/net/es3210.c
--- linux-2.1.56-clean/drivers/net/es3210.c Wed Apr 23 19:01:19 1997
+++ linux/drivers/net/es3210.c Sat Sep 20 00:18:38 1997
@@ -214,7 +214,7 @@
printk(" assigning IRQ %d", dev->irq);
}

- if (request_irq(dev->irq, ei_interrupt, 0, "es3210", NULL)) {
+ if (request_irq(dev->irq, ei_interrupt, 0, "es3210", dev)) {
printk (" unable to get IRQ %d.\n", dev->irq);
return EAGAIN;
}
diff -u -r linux-2.1.56-clean/drivers/net/hp-plus.c linux/drivers/net/hp-plus.c
--- linux-2.1.56-clean/drivers/net/hp-plus.c Wed Apr 23 19:01:19 1997
+++ linux/drivers/net/hp-plus.c Sat Sep 20 00:18:38 1997
@@ -259,7 +259,7 @@
int ioaddr = dev->base_addr - NIC_OFFSET;
int option_reg;

- if (request_irq(dev->irq, &ei_interrupt, 0, "hp-plus", NULL)) {
+ if (request_irq(dev->irq, &ei_interrupt, 0, "hp-plus", dev)) {
return -EAGAIN;
}

diff -u -r linux-2.1.56-clean/drivers/net/hp.c linux/drivers/net/hp.c
--- linux-2.1.56-clean/drivers/net/hp.c Wed Apr 23 19:01:19 1997
+++ linux/drivers/net/hp.c Sat Sep 20 00:18:39 1997
@@ -157,7 +157,7 @@
outb_p(irqmap[irq] | HP_RUN, ioaddr + HP_CONFIGURE);
outb_p( 0x00 | HP_RUN, ioaddr + HP_CONFIGURE);
if (irq == autoirq_report(0) /* It's a good IRQ line! */
- && request_irq (irq, &ei_interrupt, 0, "hp", NULL) == 0) {
+ && request_irq (irq, &ei_interrupt, 0, "hp", dev) == 0) {
printk(" selecting IRQ %d.\n", irq);
dev->irq = *irqp;
break;
@@ -171,7 +171,7 @@
} else {
if (dev->irq == 2)
dev->irq = 9;
- if (request_irq(dev->irq, ei_interrupt, 0, "hp", NULL)) {
+ if (request_irq(dev->irq, ei_interrupt, 0, "hp", dev)) {
printk (" unable to get IRQ %d.\n", dev->irq);
return EBUSY;
}
diff -u -r linux-2.1.56-clean/drivers/net/ne.c linux/drivers/net/ne.c
--- linux-2.1.56-clean/drivers/net/ne.c Tue Aug 5 09:24:32 1997
+++ linux/drivers/net/ne.c Sat Sep 20 00:18:39 1997
@@ -425,7 +425,8 @@
/* Snarf the interrupt now. There's no point in waiting since we cannot
share and the board will usually be enabled. */
{
- int irqval = request_irq(dev->irq, ei_interrupt, SA_INTERRUPT, name, NULL);
+ int irqval = request_irq(dev->irq, ei_interrupt,
+ pci_irq_line ? SA_SHIRQ : 0, name, dev);
if (irqval) {
printk (" unable to get IRQ %d (irqval=%d).\n", dev->irq, irqval);
return EAGAIN;
diff -u -r linux-2.1.56-clean/drivers/net/smc-mca.c linux/drivers/net/smc-mca.c
--- linux-2.1.56-clean/drivers/net/smc-mca.c Wed Apr 23 19:01:20 1997
+++ linux/drivers/net/smc-mca.c Sat Sep 20 00:18:39 1997
@@ -192,7 +192,7 @@
{
int ioaddr = dev->base_addr - ULTRA_NIC_OFFSET; /* ASIC addr */

- if (request_irq(dev->irq, ei_interrupt, 0, ei_status.name, NULL))
+ if (request_irq(dev->irq, ei_interrupt, 0, ei_status.name, dev))
return -EAGAIN;

outb(ULTRA_MEMENB, ioaddr); /* Enable memory */
diff -u -r linux-2.1.56-clean/drivers/net/smc-ultra.c linux/drivers/net/smc-ultra.c
--- linux-2.1.56-clean/drivers/net/smc-ultra.c Wed Apr 23 19:01:20 1997
+++ linux/drivers/net/smc-ultra.c Sat Sep 20 00:18:39 1997
@@ -253,7 +253,7 @@
{
int ioaddr = dev->base_addr - ULTRA_NIC_OFFSET; /* ASIC addr */

- if (request_irq(dev->irq, ei_interrupt, 0, ei_status.name, NULL))
+ if (request_irq(dev->irq, ei_interrupt, 0, ei_status.name, dev))
return -EAGAIN;

outb(0x00, ioaddr); /* Disable shared memory for safety. */
diff -u -r linux-2.1.56-clean/drivers/net/wd.c linux/drivers/net/wd.c
--- linux-2.1.56-clean/drivers/net/wd.c Wed Apr 23 19:01:20 1997
+++ linux/drivers/net/wd.c Sat Sep 20 00:18:39 1997
@@ -254,7 +254,7 @@

/* Snarf the interrupt now. There's no point in waiting since we cannot
share and the board will usually be enabled. */
- if (request_irq(dev->irq, ei_interrupt, 0, model_name, NULL)) {
+ if (request_irq(dev->irq, ei_interrupt, 0, model_name, dev)) {
printk (" unable to get IRQ %d.\n", dev->irq);
return EAGAIN;
}