outw(AckIntr | UpComplete, ioaddr + EL3_CMD); 
iowrite16(AckIntr | UpComplete, ioaddr + EL3_CMD); 
boomerang_interrupt(int irq, void *dev_id, struct pt_regs *regs){	struct net_device *dev = dev_id;	struct vortex_private *vp = netdev_priv(dev);	long ioaddr;	int status;	int work_done = max_interrupt_work;	ioaddr = dev->base_addr;	/*	 * It seems dopey to put the spinlock this early, but we could race against vortex_tx_timeout	 * and boomerang_start_xmit	 */	spin_lock(&vp->lock);	status = inw(ioaddr + EL3_STATUS);	if (vortex_debug > 6)		printk(KERN_DEBUG "boomerang_interrupt. status=0x%4x\n", status);	if ((status & IntLatch) == 0)		goto handler_exit;		/* No interrupt: shared IRQs can cause this */	if (status == 0xffff) {		/* h/w no longer present (hotplug)? */		if (vortex_debug > 1)			printk(KERN_DEBUG "boomerang_interrupt(1): status = 0xffff\n");		goto handler_exit;	}	if (status & IntReq) {		status |= vp->deferred;		vp->deferred = 0;	}	if (vortex_debug > 4)		printk(KERN_DEBUG "%s: interrupt, status %4.4x, latency %d ticks.\n",			   dev->name, status, inb(ioaddr + Timer));	do {		if (vortex_debug > 5)				printk(KERN_DEBUG "%s: In interrupt loop, status %4.4x.\n",					   dev->name, status);		if (status & UpComplete) {			outw(AckIntr | UpComplete, ioaddr + EL3_CMD);			if (vortex_debug > 5)				printk(KERN_DEBUG "boomerang_interrupt->boomerang_rx\n");			boomerang_rx(dev);		}		if (status & DownComplete) {			unsigned int dirty_tx = vp->dirty_tx;			outw(AckIntr | DownComplete, ioaddr + EL3_CMD);			while (vp->cur_tx - dirty_tx > 0) {				int entry = dirty_tx % TX_RING_SIZE;#if 1	/* AKPM: the latter is faster, but cyclone-only */				if (inl(ioaddr + DownListPtr) ==					vp->tx_ring_dma + entry * sizeof(struct boom_tx_desc))					break;			/* It still hasn't been processed. */#else				if ((vp->tx_ring[entry].status & DN_COMPLETE) == 0)					break;			/* It still hasn't been processed. */#endif									if (vp->tx_skbuff[entry]) {					struct sk_buff *skb = vp->tx_skbuff[entry];#if DO_ZEROCOPY										int i;					for (i=0; i<=skb_shinfo(skb)->nr_frags; i++)							pci_unmap_single(VORTEX_PCI(vp),											 le32_to_cpu(vp->tx_ring[entry].frag[i].addr),											 le32_to_cpu(vp->tx_ring[entry].frag[i].length)&0xFFF,											 PCI_DMA_TODEVICE);#else					pci_unmap_single(VORTEX_PCI(vp),						le32_to_cpu(vp->tx_ring[entry].addr), skb->len, PCI_DMA_TODEVICE);#endif					dev_kfree_skb_irq(skb);					vp->tx_skbuff[entry] = NULL;				} else {					printk(KERN_DEBUG "boomerang_interrupt: no skb!\n");				}				/* vp->stats.tx_packets++;  Counted below. */				dirty_tx++;			}			vp->dirty_tx = dirty_tx;			if (vp->cur_tx - dirty_tx <= TX_RING_SIZE - 1) {				if (vortex_debug > 6)					printk(KERN_DEBUG "boomerang_interrupt: wake queue\n");				netif_wake_queue (dev);			}		}		/* Check for all uncommon interrupts at once. */		if (status & (HostError | RxEarly | StatsFull | TxComplete | IntReq))			vortex_error(dev, status);		if (--work_done < 0) {			printk(KERN_WARNING "%s: Too much work in interrupt, status "				   "%4.4x.\n", dev->name, status);			/* Disable all pending interrupts. */			do {				vp->deferred |= status;				outw(SetStatusEnb | (~vp->deferred & vp->status_enable),					 ioaddr + EL3_CMD);				outw(AckIntr | (vp->deferred & 0x7ff), ioaddr + EL3_CMD);			} while ((status = inw(ioaddr + EL3_CMD)) & IntLatch);			/* The timer will reenable interrupts. */			mod_timer(&vp->timer, jiffies + 1*HZ);			break;		}		/* Acknowledge the IRQ. */		outw(AckIntr | IntReq | IntLatch, ioaddr + EL3_CMD);		if (vp->cb_fn_base)			/* The PCMCIA people are idiots.  */			writel(0x8000, vp->cb_fn_base + 4);	} while ((status = inw(ioaddr + EL3_STATUS)) & IntLatch);	if (vortex_debug > 4)		printk(KERN_DEBUG "%s: exiting interrupt, status %4.4x.\n",			   dev->name, status);handler_exit:	spin_unlock(&vp->lock);	return IRQ_HANDLED;}
4520	/local/tlutelli/issta_data/temp/c/2005_temp/2005/4520/62afe595de7aaac6c140103a34dc8c208afa34e7/3c59x.c/buggy/drivers/net/3c59x.c