for (i = 0;; i++) {
                events = readl(base + NvRegMSIXIrqStatus) & NVREG_IRQ_TX_ALL;
-               writel(NVREG_IRQ_TX_ALL, base + NvRegMSIXIrqStatus);
+               writel(events, base + NvRegMSIXIrqStatus);
+               netdev_dbg(dev, "tx irq events: %08x\n", events);
                if (!(events & np->irqmask))
                        break;
 
 
        for (i = 0;; i++) {
                events = readl(base + NvRegMSIXIrqStatus) & NVREG_IRQ_RX_ALL;
-               writel(NVREG_IRQ_RX_ALL, base + NvRegMSIXIrqStatus);
+               writel(events, base + NvRegMSIXIrqStatus);
+               netdev_dbg(dev, "rx irq events: %08x\n", events);
                if (!(events & np->irqmask))
                        break;
 
 
        for (i = 0;; i++) {
                events = readl(base + NvRegMSIXIrqStatus) & NVREG_IRQ_OTHER;
-               writel(NVREG_IRQ_OTHER, base + NvRegMSIXIrqStatus);
+               writel(events, base + NvRegMSIXIrqStatus);
+               netdev_dbg(dev, "irq events: %08x\n", events);
                if (!(events & np->irqmask))
                        break;
 
 
        if (!(np->msi_flags & NV_MSI_X_ENABLED)) {
                events = readl(base + NvRegIrqStatus) & NVREG_IRQSTAT_MASK;
-               writel(NVREG_IRQ_TIMER, base + NvRegIrqStatus);
+               writel(events & NVREG_IRQ_TIMER, base + NvRegIrqStatus);
        } else {
                events = readl(base + NvRegMSIXIrqStatus) & NVREG_IRQSTAT_MASK;
-               writel(NVREG_IRQ_TIMER, base + NvRegMSIXIrqStatus);
+               writel(events & NVREG_IRQ_TIMER, base + NvRegMSIXIrqStatus);
        }
        pci_push(base);
        if (!(events & NVREG_IRQ_TIMER))