aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/broadcom/tg3.c
diff options
context:
space:
mode:
authorGavin Shan <gwshan@linux.vnet.ibm.com>2015-04-24 01:22:23 -0400
committerDavid S. Miller <davem@davemloft.net>2015-04-25 14:31:25 -0400
commitdfc8f370316b31b9ca9ce96e50f1c438d9410b4f (patch)
tree0f0e20636e1edea235ca49db622cfdbee7c2865a /drivers/net/ethernet/broadcom/tg3.c
parent2d6c9091ab7630dfcf34417c6683ce4764d7d40a (diff)
net/tg3: Release IRQs on permanent error
When having permanent EEH error, the PCI device will be removed from the system. For this case, we shouldn't set pcierr_recovery to true wrongly, which blocks the driver to release the allocated interrupts and their handlers. Eventually, we can't disable MSI or MSIx successfully because of the MSI or MSIx interrupts still have associated interrupt actions, which is turned into following stack dump. Oops: Exception in kernel mode, sig: 5 [#1] : [c0000000003b76a8] .free_msi_irqs+0x80/0x1a0 (unreliable) [c00000000039f388] .pci_remove_bus_device+0x98/0x110 [c0000000000790f4] .pcibios_remove_pci_devices+0x9c/0x128 [c000000000077b98] .handle_eeh_events+0x2d8/0x4b0 [c0000000000782d0] .eeh_event_handler+0x130/0x1c0 [c000000000022bd4] .kernel_thread+0x54/0x70 Signed-off-by: Gavin Shan <gwshan@linux.vnet.ibm.com> Acked-by: Prashant Sreedharan <prashant@broadcom.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/broadcom/tg3.c')
-rw-r--r--drivers/net/ethernet/broadcom/tg3.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/drivers/net/ethernet/broadcom/tg3.c b/drivers/net/ethernet/broadcom/tg3.c
index 1270b189a9a2..069952fa5d64 100644
--- a/drivers/net/ethernet/broadcom/tg3.c
+++ b/drivers/net/ethernet/broadcom/tg3.c
@@ -18129,7 +18129,9 @@ static pci_ers_result_t tg3_io_error_detected(struct pci_dev *pdev,
18129 18129
18130 rtnl_lock(); 18130 rtnl_lock();
18131 18131
18132 tp->pcierr_recovery = true; 18132 /* We needn't recover from permanent error */
18133 if (state == pci_channel_io_frozen)
18134 tp->pcierr_recovery = true;
18133 18135
18134 /* We probably don't have netdev yet */ 18136 /* We probably don't have netdev yet */
18135 if (!netdev || !netif_running(netdev)) 18137 if (!netdev || !netif_running(netdev))