/* The typical workload of the driver: Handle the network interface interrupts. */ static void seeq8005_interrupt(int irq, void *dev_id, struct pt_regs * regs) { struct device *dev = dev_id; struct net_local *lp; int ioaddr, status, boguscount = 0; if (dev == NULL) { printk ("net_interrupt(): irq %d for unknown device.\n", irq); return; } if (dev->interrupt) printk ("%s: Re-entering the interrupt handler.\n", dev->name); dev->interrupt = 1; ioaddr = dev->base_addr; lp = (struct net_local *)dev->priv; status = inw(SEEQ_STATUS); do { if (net_debug >2) { printk("%s: int, status=0x%04x\n",dev->name,status); } if (status & SEEQSTAT_WINDOW_INT) { outw( SEEQCMD_WINDOW_INT_ACK | (status & SEEQCMD_INT_MASK), SEEQ_CMD); if (net_debug) { printk("%s: window int!\n",dev->name); } } if (status & SEEQSTAT_TX_INT) { outw( SEEQCMD_TX_INT_ACK | (status & SEEQCMD_INT_MASK), SEEQ_CMD); lp->stats.tx_packets++; dev->tbusy = 0; mark_bh(NET_BH); /* Inform upper layers. */ } if (status & SEEQSTAT_RX_INT) { /* Got a packet(s). */ seeq8005_rx(dev); } status = inw(SEEQ_STATUS); } while ( (++boguscount < 10) && (status & SEEQSTAT_ANY_INT)) ; if(net_debug>2) { printk("%s: eoi\n",dev->name); } dev->interrupt = 0; return; }
/* The typical workload of the driver: Handle the network interface interrupts. */ static irqreturn_t seeq8005_interrupt(int irq, void *dev_id, struct pt_regs * regs) { struct net_device *dev = dev_id; struct net_local *lp; int ioaddr, status, boguscount = 0; int handled = 0; ioaddr = dev->base_addr; lp = netdev_priv(dev); status = inw(SEEQ_STATUS); do { if (net_debug >2) { printk("%s: int, status=0x%04x\n",dev->name,status); } if (status & SEEQSTAT_WINDOW_INT) { handled = 1; outw( SEEQCMD_WINDOW_INT_ACK | (status & SEEQCMD_INT_MASK), SEEQ_CMD); if (net_debug) { printk("%s: window int!\n",dev->name); } } if (status & SEEQSTAT_TX_INT) { handled = 1; outw( SEEQCMD_TX_INT_ACK | (status & SEEQCMD_INT_MASK), SEEQ_CMD); lp->stats.tx_packets++; netif_wake_queue(dev); /* Inform upper layers. */ } if (status & SEEQSTAT_RX_INT) { handled = 1; /* Got a packet(s). */ seeq8005_rx(dev); } status = inw(SEEQ_STATUS); } while ( (++boguscount < 10) && (status & SEEQSTAT_ANY_INT)) ; if(net_debug>2) { printk("%s: eoi\n",dev->name); } return IRQ_RETVAL(handled); }