Re: [PATCH net-2.6] be2net: fix spurious interrupt handling in intx mode

Previous thread: [GIT]: Networking by David Miller on Tuesday, June 30, 2009 - 9:39 pm. (16 messages)

Next thread: [PATCH] dm9000: add checksum offload support by Mike Rapoport on Wednesday, July 1, 2009 - 7:56 am. (4 messages)
From: Guo-Fu Tseng
Date: Sunday, June 28, 2009 - 1:49 pm

Instead of using a large chunk of memory space preserved for
for modules, using kmalloc to obtain the needed memory.

Signed-off-by: Guo-Fu Tseng <cooldavid@cooldavid.org>
---
 drivers/net/jme.c |   86 ++++++++++++++++++++++++++++++++++++++---------------
 drivers/net/jme.h |    3 +-
 2 files changed, 63 insertions(+), 26 deletions(-)

diff --git a/drivers/net/jme.c b/drivers/net/jme.c
index 8de3940..4a55b05 100644
--- a/drivers/net/jme.c
+++ b/drivers/net/jme.c
@@ -522,12 +522,8 @@ jme_setup_tx_resources(struct jme_adapter *jme)
 				   &(txring->dmaalloc),
 				   GFP_ATOMIC);
 
-	if (!txring->alloc) {
-		txring->desc = NULL;
-		txring->dmaalloc = 0;
-		txring->dma = 0;
-		return -ENOMEM;
-	}
+	if (!txring->alloc)
+		goto err_set_null;
 
 	/*
 	 * 16 Bytes align
@@ -539,6 +535,11 @@ jme_setup_tx_resources(struct jme_adapter *jme)
 	atomic_set(&txring->next_to_clean, 0);
 	atomic_set(&txring->nr_free, jme->tx_ring_size);
 
+	txring->bufinf		= kmalloc(sizeof(struct jme_buffer_info) *
+					jme->tx_ring_size, GFP_ATOMIC);
+	if (unlikely(!(txring->bufinf)))
+		goto err_free_txring;
+
 	/*
 	 * Initialize Transmit Descriptors
 	 */
@@ -547,6 +548,20 @@ jme_setup_tx_resources(struct jme_adapter *jme)
 		sizeof(struct jme_buffer_info) * jme->tx_ring_size);
 
 	return 0;
+
+err_free_txring:
+	dma_free_coherent(&(jme->pdev->dev),
+			  TX_RING_ALLOC_SIZE(jme->tx_ring_size),
+			  txring->alloc,
+			  txring->dmaalloc);
+
+err_set_null:
+	txring->desc = NULL;
+	txring->dmaalloc = 0;
+	txring->dma = 0;
+	txring->bufinf = NULL;
+
+	return -ENOMEM;
 }
 
 static void
@@ -557,16 +572,19 @@ jme_free_tx_resources(struct jme_adapter *jme)
 	struct jme_buffer_info *txbi;
 
 	if (txring->alloc) {
-		for (i = 0 ; i < jme->tx_ring_size ; ++i) {
-			txbi = txring->bufinf + i;
-			if (txbi->skb) {
-				dev_kfree_skb(txbi->skb);
-				txbi->skb = NULL;
+		if (txring->bufinf) {
+			for (i = 0 ; i < jme->tx_ring_size ; ++i) {
+				txbi = txring->bufinf + ...
From: Sathya Perla
Date: Wednesday, July 1, 2009 - 4:06 am

Occasionally we may see an interrupt without an event in the eq.
 In intx, we currently see the event queue and return IRQ_NONE causing
 a the irq to be disabled ("no one cared".) Instead, read the CEV_ISR
 reg to check the existence of the interrupt.


Signed-off-by: Sathya Perla <sathyap@serverengines.com>
---
 drivers/net/benet/be_hw.h   |    4 ++++
 drivers/net/benet/be_main.c |   16 +++++++++-------
 2 files changed, 13 insertions(+), 7 deletions(-)

diff --git a/drivers/net/benet/be_hw.h b/drivers/net/benet/be_hw.h
index b02e805..29c33c7 100644
--- a/drivers/net/benet/be_hw.h
+++ b/drivers/net/benet/be_hw.h
@@ -55,6 +55,10 @@
 #define MEMBAR_CTRL_INT_CTRL_PFUNC_MASK  	0x7 	/* bits 26 - 28 */
 #define MEMBAR_CTRL_INT_CTRL_PFUNC_SHIFT	26
 
+/********* ISR0 Register offset **********/
+#define CEV_ISR0_OFFSET 			0xC18
+#define CEV_ISR_SIZE				4
+
 /********* Event Q door bell *************/
 #define DB_EQ_OFFSET			DB_CQ_OFFSET
 #define DB_EQ_RING_ID_MASK		0x1FF	/* bits 0 - 8 */
diff --git a/drivers/net/benet/be_main.c b/drivers/net/benet/be_main.c
index 308eb09..c43f6a1 100644
--- a/drivers/net/benet/be_main.c
+++ b/drivers/net/benet/be_main.c
@@ -1274,15 +1274,17 @@ static irqreturn_t be_intx(int irq, void *dev)
 {
 	struct be_adapter *adapter = dev;
 	struct be_ctrl_info *ctrl = &adapter->ctrl;
-	int rx, tx;
+        int isr;
 
-	tx = event_handle(ctrl, &adapter->tx_eq);
-	rx = event_handle(ctrl, &adapter->rx_eq);
+	isr = ioread32(ctrl->csr + CEV_ISR0_OFFSET +
+                      ctrl->pci_func * CEV_ISR_SIZE);
+	if (!isr)
+                return IRQ_NONE;
 
-	if (rx || tx)
-		return IRQ_HANDLED;
-	else
-		return IRQ_NONE;
+        event_handle(ctrl, &adapter->tx_eq);
+        event_handle(ctrl, &adapter->rx_eq);
+
+        return IRQ_HANDLED;
 }
 
 static irqreturn_t be_msix_rx(int irq, void *dev)
-- 
1.6.0.4

--

From: David Miller
Date: Friday, July 3, 2009 - 8:14 pm

From: Sathya Perla <sathyap@serverengines.com>

Applied.
--

Previous thread: [GIT]: Networking by David Miller on Tuesday, June 30, 2009 - 9:39 pm. (16 messages)

Next thread: [PATCH] dm9000: add checksum offload support by Mike Rapoport on Wednesday, July 1, 2009 - 7:56 am. (4 messages)