## add a module param own_irq=1 to forbid interrupt sharing ## add a check in e100intr for device interrupt masking -- if the driver has masked irqs off, ## don't execute the usual irq service, but simply report the clash --- Linux/drivers/net/e100/e100_main.c Thu Oct 21 17:25:24 2004 +++ linux/drivers/net/e100/e100_main.c Fri Oct 22 11:45:27 2004 @@ -424,6 +424,9 @@ E100_PARAM(BundleMax, "Maximum number fo E100_PARAM(IFS, "Disable or enable the adaptive IFS algorithm"); E100_PARAM(weight, "rx packets processed per poll"); +int own_irq = 0; /* every card gets *own* IRQ? */ +MODULE_PARM(own_irq, "i"); + /** * e100_exec_cmd - issue a comand * @bdp: atapter's private data struct @@ -1153,7 +1156,7 @@ e100_open(struct net_device *dev) netif_start_queue(dev); e100_start_ru(bdp); - if ((rc = request_irq(dev->irq, &e100intr, SA_SHIRQ, + if ((rc = request_irq(dev->irq, &e100intr, own_irq ? 0 : SA_SHIRQ, dev->name, dev)) != 0) { del_timer_sync(&bdp->watchdog_timer); goto err_exit; @@ -2062,11 +2065,20 @@ e100intr(int irq, void *dev_inst, struct dev = dev_inst; bdp = dev->priv; - intr_status = readw(&bdp->scb->scb_status); /* If not my interrupt, just return */ - if (!(intr_status & SCB_STATUS_ACK_MASK) || (intr_status == 0xffff)) { + if (readb(&bdp->scb->scb_cmd_hi) & SCB_INT_MASK) { + static int once = 0; + + if (!once) + printk(KERN_ERR "e100intr ignoring disabled interrupt, suspect irq-sharing\n"); + once = 1; return IRQ_NONE; } + + /* If no pending action, just return */ + intr_status = readw(&bdp->scb->scb_status); + if (!(intr_status & SCB_STATUS_ACK_MASK) || (intr_status == 0xffff)) + return IRQ_NONE; #ifdef CONFIG_E100_NAPI