Skip to contentSkip to conversation

r6040: save and restore MIER correctly in the interrupt routine

PATCH In review Florian Fainelli 1 participant 1 message Dec 19, 2008

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

PATCH 2/3 r6040: save and restore MIER correctly in the interrupt routine

From: Florian Fainelli <[email protected]>
Subject: [PATCH 2/3] 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.

---

drivers/net/r6040.c +7 -2
index c2e8ac1..1117ffa 100644
@@ -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;
 }