summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoe Chou <Joe.Chou@rdc.com.tw>2008-12-22 19:40:02 -0800
committerGreg Kroah-Hartman <gregkh@suse.de>2009-01-24 16:36:19 -0800
commit2d699e5364e67b9189968103e00cdb7acd98c514 (patch)
treebf2d5732d1166b3dde3d1614cb6061e8e4fab7fd
parent0e3ee4452e429811861a5a42f6ba6c33226deff1 (diff)
r6040: save and restore MIER correctly in the interrupt routine
[ Upstream commit: 3e7c469f07ff14cbf9a814739e1fc99a863e0943 ] This patch saves the MIER register contents before treating interrupts, then restores them correcty at the end of the interrupt routine. Signed-off-by: Joe Chou <Joe.Chou@rdc.com.tw> Signed-off-by: Florian Fainelli <florian@openwrt.org> Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-rw-r--r--drivers/net/r6040.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/drivers/net/r6040.c b/drivers/net/r6040.c
index da43d9e0f17e..9e3bdb477dc2 100644
--- a/drivers/net/r6040.c
+++ b/drivers/net/r6040.c
@@ -681,8 +681,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 */
@@ -702,7 +704,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);
}
@@ -710,6 +712,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;
}