Patchwork [1/1] smsc9420: fix interrupt signalling test failures

login
register
mail settings
Submitter Steve Glendinning
Date Jan. 29, 2009, 4:39 p.m.
Message ID <1233247163-4317-2-git-send-email-steve.glendinning@smsc.com>
Download mbox | patch
Permalink /patch/21022/
State Accepted
Delegated to: David Miller
Headers show

Comments

Steve Glendinning - Jan. 29, 2009, 4:39 p.m.
smsc9420 performs an interrupt signalling test when the interface is
brought up.  The current code mistakenly sets its test flag to false
AFTER enabling the software interrupt source, making failure quite
likely.

This patch changes the code to set the test flag BEFORE enabling
interrupts. I've also removed an smp_wmb because the following spinlock
provides an implicit memory barrier.

Signed-off-by: Steve Glendinning <steve.glendinning@smsc.com>
---
 drivers/net/smsc9420.c |    3 +--
 1 files changed, 1 insertions(+), 2 deletions(-)
David Miller - Jan. 30, 2009, 1:29 a.m.
From: Steve Glendinning <steve.glendinning@smsc.com>
Date: Thu, 29 Jan 2009 16:39:23 +0000

> smsc9420 performs an interrupt signalling test when the interface is
> brought up.  The current code mistakenly sets its test flag to false
> AFTER enabling the software interrupt source, making failure quite
> likely.
> 
> This patch changes the code to set the test flag BEFORE enabling
> interrupts. I've also removed an smp_wmb because the following spinlock
> provides an implicit memory barrier.
> 
> Signed-off-by: Steve Glendinning <steve.glendinning@smsc.com>

Applied, thanks Steve.
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Patch

diff --git a/drivers/net/smsc9420.c b/drivers/net/smsc9420.c
index c14a4c6..d801900 100644
--- a/drivers/net/smsc9420.c
+++ b/drivers/net/smsc9420.c
@@ -1378,6 +1378,7 @@  static int smsc9420_open(struct net_device *dev)
 
 	/* test the IRQ connection to the ISR */
 	smsc_dbg(IFUP, "Testing ISR using IRQ %d", dev->irq);
+	pd->software_irq_signal = false;
 
 	spin_lock_irqsave(&pd->int_lock, flags);
 	/* configure interrupt deassertion timer and enable interrupts */
@@ -1393,8 +1394,6 @@  static int smsc9420_open(struct net_device *dev)
 	smsc9420_pci_flush_write(pd);
 
 	timeout = 1000;
-	pd->software_irq_signal = false;
-	smp_wmb();
 	while (timeout--) {
 		if (pd->software_irq_signal)
 			break;