diff --git a/drivers/net/r6040.c b/drivers/net/r6040.c index cc5e316de571..990612328ca1 100644 --- a/drivers/net/r6040.c +++ b/drivers/net/r6040.c @@ -680,8 +680,10 @@ static irqreturn_t r6040_interrupt(int irq, void *dev_id) struct net_device *dev = dev_id; struct r6040_private *lp = netdev_priv(dev); void __iomem *ioaddr = lp->base; - u16 status; + u16 misr, status; + /* Save MIER */ + misr = ioread16(ioaddr + MIER); /* Mask off RDC MAC interrupt */ iowrite16(MSK_INT, ioaddr + MIER); /* Read MISR status and clear */ @@ -701,7 +703,7 @@ static irqreturn_t r6040_interrupt(int irq, void *dev_id) dev->stats.rx_fifo_errors++; /* Mask off RX interrupt */ - iowrite16(ioread16(ioaddr + MIER) & ~RX_INTS, ioaddr + MIER); + misr &= ~RX_INTS; netif_rx_schedule(dev, &lp->napi); } @@ -709,6 +711,9 @@ static irqreturn_t r6040_interrupt(int irq, void *dev_id) if (status & TX_INTS) r6040_tx(dev); + /* Restore RDC MAC interrupt */ + iowrite16(misr, ioaddr + MIER); + return IRQ_HANDLED; }