aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/r6040.c
diff options
context:
space:
mode:
authorJoe Chou <Joe.Chou@rdc.com.tw>2008-12-22 22:40:02 -0500
committerDavid S. Miller <davem@davemloft.net>2008-12-22 22:40:02 -0500
commit3e7c469f07ff14cbf9a814739e1fc99a863e0943 (patch)
tree5de921edb410bdb564dcecd3fa76878f2775ed5c /drivers/net/r6040.c
parent11e5e8f5d14a1229706576184d2cf4c4556ed94c (diff)
r6040: save and restore MIER correctly in the interrupt routine
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>
Diffstat (limited to 'drivers/net/r6040.c')
-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 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)
680 struct net_device *dev = dev_id; 680 struct net_device *dev = dev_id;
681 struct r6040_private *lp = netdev_priv(dev); 681 struct r6040_private *lp = netdev_priv(dev);
682 void __iomem *ioaddr = lp->base; 682 void __iomem *ioaddr = lp->base;
683 u16 status; 683 u16 misr, status;
684 684
685 /* Save MIER */
686 misr = ioread16(ioaddr + MIER);
685 /* Mask off RDC MAC interrupt */ 687 /* Mask off RDC MAC interrupt */
686 iowrite16(MSK_INT, ioaddr + MIER); 688 iowrite16(MSK_INT, ioaddr + MIER);
687 /* Read MISR status and clear */ 689 /* Read MISR status and clear */
@@ -701,7 +703,7 @@ static irqreturn_t r6040_interrupt(int irq, void *dev_id)
701 dev->stats.rx_fifo_errors++; 703 dev->stats.rx_fifo_errors++;
702 704
703 /* Mask off RX interrupt */ 705 /* Mask off RX interrupt */
704 iowrite16(ioread16(ioaddr + MIER) & ~RX_INTS, ioaddr + MIER); 706 misr &= ~RX_INTS;
705 netif_rx_schedule(dev, &lp->napi); 707 netif_rx_schedule(dev, &lp->napi);
706 } 708 }
707 709
@@ -709,6 +711,9 @@ static irqreturn_t r6040_interrupt(int irq, void *dev_id)
709 if (status & TX_INTS) 711 if (status & TX_INTS)
710 r6040_tx(dev); 712 r6040_tx(dev);
711 713
714 /* Restore RDC MAC interrupt */
715 iowrite16(misr, ioaddr + MIER);
716
712 return IRQ_HANDLED; 717 return IRQ_HANDLED;
713} 718}
714 719