DORMANTno replies

[PATCH] (11/12) skge: fix race with receive interrupt and NAPI

From: Stephen Hemminger <hidden>
Date: 2005-03-03 19:44:21

Avoid possible race with receive interrupt and NAPI.
Move code for chip specific mac interrupt out of main path.

Signed-off-by: Stephen Hemminger <redacted>
--- skge-2.6.11/drivers/net/skge.c.orig	2005-03-03 10:30:59.000000000 -0800
+++ skge-2.6.11/drivers/net/skge.c	2005-03-03 10:32:58.000000000 -0800
@@ -2709,6 +2709,14 @@
 	skge_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_OFF);
 }
 
+static void skge_mac_intr(struct skge_hw *hw, int port)
+{
+	if (hw->chip_id == CHIP_ID_GENESIS) 
+		genesis_mac_intr(hw, port);
+	else
+		yukon_mac_intr(hw, port);
+}
+
 /* Handle device specific framing and timeout interrupts */
 static void skge_error_irq(struct skge_hw *hw)
 {
@@ -2816,14 +2824,18 @@
 
 	status &= hw->intr_mask;
 
-	if (status & IS_R1_F) {
+	if ((status & IS_R1_F) && netif_rx_schedule_prep(hw->dev[0])) {
+		status &= ~IS_R1_F;
 		hw->intr_mask &= ~IS_R1_F;
-		netif_rx_schedule(hw->dev[0]);
+		skge_write32(hw, B0_IMSK, hw->intr_mask);
+		__netif_rx_schedule(hw->dev[0]);
 	}
 
-	if (status & IS_R2_F) {
+	if ((status & IS_R2_F) && netif_rx_schedule_prep(hw->dev[1])) {
+		status &= ~IS_R2_F;
 		hw->intr_mask &= ~IS_R2_F;
-		netif_rx_schedule(hw->dev[1]);
+		skge_write32(hw, B0_IMSK, hw->intr_mask);
+		__netif_rx_schedule(hw->dev[1]);
 	}
 
 	if (status & IS_XA1_F)
@@ -2832,19 +2844,11 @@
 	if (status & IS_XA2_F)
 		skge_tx_intr(hw->dev[1]);
 
-	if (hw->chip_id == CHIP_ID_GENESIS) {
-		if (status & IS_MAC1)
-			genesis_mac_intr(hw, 0);
-
-		if (status & IS_MAC2)
-			genesis_mac_intr(hw, 1);
-	} else {
-		if (status & IS_MAC1)
-			yukon_mac_intr(hw, 0);
-
-		if (status & IS_MAC2)
-			yukon_mac_intr(hw, 1);
-	}
+	if (status & IS_MAC1)
+		skge_mac_intr(hw, 0);
+	
+	if (status & IS_MAC2)
+		skge_mac_intr(hw, 1);
 
 	if (status & IS_HW_ERR)
 		skge_error_irq(hw);
@@ -2853,7 +2857,9 @@
 		hw->intr_mask &= ~IS_EXT_REG;
 		tasklet_schedule(&hw->ext_tasklet);
 	}
-	skge_write32(hw, B0_IMSK, hw->intr_mask);
+
+	if (status)
+		skge_write32(hw, B0_IMSK, hw->intr_mask);
 
 	return IRQ_HANDLED;
 }
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help