jme: fix irq storm after suspend/resume
Subsystems (2)
PATCH 1/1 jme: fix irq storm after suspend/resume
If the device is down during suspend/resume, interrupts are enabled without a registered interrupt handler, causing a storm of unhandled interrupts until the IRQ is disabled because "nobody cared".
Instead, check that the device is up before touching it in the suspend/resume code.
Fixes https://bugzilla.kernel.org/show_bug.cgi?id=39112
---
Unfortunately, bugzilla.kernel.org is still down. There is at least one other person who reported the issue, and I don't have their email address. So for now, I am the only one who tested this fix.
The patch applies to current tip (2efd7c0) of Linus' tree. I also tested it based on v3.0 and it worked the same.
Many thanks to Adrian and Mohammed for helping me debug this issue. See this thread for the history:
http://mid.gmane.org/20110827113253.GA1444@ecki
drivers/net/jme.c | 6 ++++++ 1 files changed, 6 insertions(+), 0 deletions(-)
drivers/net/jme.c +6 -0
@@ -3131,6 +3131,9 @@ jme_suspend(struct device *dev)struct net_device *netdev =pci_get_drvdata (pdev);struct jme_adapter *jme =netdev_priv (netdev); +if (!netif_running (netdev)) +return 0 ; +atomic_dec (&jme->link_changing);netif_device_detach (netdev);
@@ -3171,6 +3174,9 @@ jme_resume(struct device *dev)struct net_device *netdev =pci_get_drvdata (pdev);struct jme_adapter *jme =netdev_priv (netdev); +if (!netif_running (netdev)) +return 0 ; +jme_clear_pm (jme);jme_phy_on (jme);if (test_bit (JME_FLAG_SSET , &jme->flags))
Signature · 1 line
1.7.7
Quoted 4 lines · Clemens Buchacher
If the device is down during suspend/resume, interrupts are enabled without a registered interrupt handler, causing a storm of unhandled interrupts until the IRQ is disabled because "nobody cared".
thank you so much for fixing this. incredible persistence from your side!
Quoted 53 lines
Instead, check that the device is up before touching it in the suspend/resume code.
Fixes https://bugzilla.kernel.org/show_bug.cgi?id=39112
Helped-by Adrian Chadd <[email protected]>Helped-by Mohammed Shafi <[email protected]>Signed-off-by Clemens Buchacher <[email protected]>---
Unfortunately, bugzilla.kernel.org is still down. There is at least one other person who reported the issue, and I don't have their email address. So for now, I am the only one who tested this fix.
The patch applies to current tip (2efd7c0) of Linus' tree. I also tested it based on v3.0 and it worked the same.
Many thanks to Adrian and Mohammed for helping me debug this issue. See this thread for the history:
http://mid.gmane.org/20110827113253.GA1444@eckidrivers/net/jme.c | 6 ++++++
1 files changed, 6 insertions(+), 0 deletions(-)drivers/net/jme.c +6
-1@@ -3131,6 +3131,9 @@ jme_suspend(struct device *dev) struct net_device *netdev = pci_get_drvdata(pdev); struct jme_adapter *jme = netdev_priv(netdev); + if (!netif_running(netdev)) + return 0; + atomic_dec(&jme->link_changing); netif_device_detach(netdev);@@ -3171,6 +3174,9 @@ jme_resume(struct device *dev) struct net_device *netdev = pci_get_drvdata(pdev); struct jme_adapter *jme = netdev_priv(netdev); + if (!netif_running(netdev)) + return 0; + jme_clear_pm(jme); jme_phy_on(jme); if (test_bit(JME_FLAG_SSET, &jme->flags)) --1.7.7
Signature · 1 line
shafi
Quoted 9 lines · Clemens Buchacher
If the device is down during suspend/resume, interrupts are enabled without a registered interrupt handler, causing a storm of unhandled interrupts until the IRQ is disabled because "nobody cared".
Instead, check that the device is up before touching it in the suspend/resume code.
Just tested the patch, suspend/resume works well.
Signature · 1 line
Mantas M.
From: "Mantas M." <[email protected]>
Date: Sat, 22 Oct 2011 19:27:09 +0300
Quoted 6 lines · Clemens Buchacher
Quoted 5 lines
If the device is down during suspend/resume, interrupts are enabled without a registered interrupt handler, causing a storm of unhandled interrupts until the IRQ is disabled because "nobody cared".
Quoted 6 lines
Quoted 4 lines
Instead, check that the device is up before touching it in the suspend/resume code.
Just tested the patch, suspend/resume works well.
Applied, thanks.