Commit e6a43910 authored by Edward Cree's avatar Edward Cree Committed by David S. Miller

sfc: don't free_irq()s if they were never requested

If efx_nic_init_interrupt fails, or was never run (e.g. due to an earlier
 failure in ef100_net_open), freeing irqs in efx_nic_fini_interrupt is not
 needed and will cause error messages and stack traces.
So instead, only do this if efx_nic_init_interrupt successfully completed,
 as indicated by the new efx->irqs_hooked flag.

Fixes: 965b549f ("sfc_ef100: implement ndo_open/close and EVQ probing")
Signed-off-by: default avatarEdward Cree <ecree@solarflare.com>
Reviewed-by: default avatarJesse Brandeburg <jesse.brandeburg@intel.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 788f920a
...@@ -846,6 +846,7 @@ struct efx_async_filter_insertion { ...@@ -846,6 +846,7 @@ struct efx_async_filter_insertion {
* @timer_quantum_ns: Interrupt timer quantum, in nanoseconds * @timer_quantum_ns: Interrupt timer quantum, in nanoseconds
* @timer_max_ns: Interrupt timer maximum value, in nanoseconds * @timer_max_ns: Interrupt timer maximum value, in nanoseconds
* @irq_rx_adaptive: Adaptive IRQ moderation enabled for RX event queues * @irq_rx_adaptive: Adaptive IRQ moderation enabled for RX event queues
* @irqs_hooked: Channel interrupts are hooked
* @irq_rx_mod_step_us: Step size for IRQ moderation for RX event queues * @irq_rx_mod_step_us: Step size for IRQ moderation for RX event queues
* @irq_rx_moderation_us: IRQ moderation time for RX event queues * @irq_rx_moderation_us: IRQ moderation time for RX event queues
* @msg_enable: Log message enable flags * @msg_enable: Log message enable flags
...@@ -1004,6 +1005,7 @@ struct efx_nic { ...@@ -1004,6 +1005,7 @@ struct efx_nic {
unsigned int timer_quantum_ns; unsigned int timer_quantum_ns;
unsigned int timer_max_ns; unsigned int timer_max_ns;
bool irq_rx_adaptive; bool irq_rx_adaptive;
bool irqs_hooked;
unsigned int irq_mod_step_us; unsigned int irq_mod_step_us;
unsigned int irq_rx_moderation_us; unsigned int irq_rx_moderation_us;
u32 msg_enable; u32 msg_enable;
......
...@@ -129,6 +129,7 @@ int efx_nic_init_interrupt(struct efx_nic *efx) ...@@ -129,6 +129,7 @@ int efx_nic_init_interrupt(struct efx_nic *efx)
#endif #endif
} }
efx->irqs_hooked = true;
return 0; return 0;
fail2: fail2:
...@@ -154,6 +155,8 @@ void efx_nic_fini_interrupt(struct efx_nic *efx) ...@@ -154,6 +155,8 @@ void efx_nic_fini_interrupt(struct efx_nic *efx)
efx->net_dev->rx_cpu_rmap = NULL; efx->net_dev->rx_cpu_rmap = NULL;
#endif #endif
if (!efx->irqs_hooked)
return;
if (EFX_INT_MODE_USE_MSI(efx)) { if (EFX_INT_MODE_USE_MSI(efx)) {
/* Disable MSI/MSI-X interrupts */ /* Disable MSI/MSI-X interrupts */
efx_for_each_channel(channel, efx) efx_for_each_channel(channel, efx)
...@@ -163,6 +166,7 @@ void efx_nic_fini_interrupt(struct efx_nic *efx) ...@@ -163,6 +166,7 @@ void efx_nic_fini_interrupt(struct efx_nic *efx)
/* Disable legacy interrupt */ /* Disable legacy interrupt */
free_irq(efx->legacy_irq, efx); free_irq(efx->legacy_irq, efx);
} }
efx->irqs_hooked = false;
} }
/* Register dump */ /* Register dump */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment