diff options
-rw-r--r-- | drivers/net/ethernet/sfc/falcon.c | 13 |
1 files changed, 5 insertions, 8 deletions
diff --git a/drivers/net/ethernet/sfc/falcon.c b/drivers/net/ethernet/sfc/falcon.c index 0b7880b0b8fc..b4e91edec0fa 100644 --- a/drivers/net/ethernet/sfc/falcon.c +++ b/drivers/net/ethernet/sfc/falcon.c | |||
@@ -174,19 +174,16 @@ irqreturn_t falcon_legacy_interrupt_a1(int irq, void *dev_id) | |||
174 | "IRQ %d on CPU %d status " EFX_OWORD_FMT "\n", | 174 | "IRQ %d on CPU %d status " EFX_OWORD_FMT "\n", |
175 | irq, raw_smp_processor_id(), EFX_OWORD_VAL(*int_ker)); | 175 | irq, raw_smp_processor_id(), EFX_OWORD_VAL(*int_ker)); |
176 | 176 | ||
177 | /* Check to see if we have a serious error condition */ | ||
178 | syserr = EFX_OWORD_FIELD(*int_ker, FSF_AZ_NET_IVEC_FATAL_INT); | ||
179 | if (unlikely(syserr)) | ||
180 | return efx_nic_fatal_interrupt(efx); | ||
181 | |||
177 | /* Determine interrupting queues, clear interrupt status | 182 | /* Determine interrupting queues, clear interrupt status |
178 | * register and acknowledge the device interrupt. | 183 | * register and acknowledge the device interrupt. |
179 | */ | 184 | */ |
180 | BUILD_BUG_ON(FSF_AZ_NET_IVEC_INT_Q_WIDTH > EFX_MAX_CHANNELS); | 185 | BUILD_BUG_ON(FSF_AZ_NET_IVEC_INT_Q_WIDTH > EFX_MAX_CHANNELS); |
181 | queues = EFX_OWORD_FIELD(*int_ker, FSF_AZ_NET_IVEC_INT_Q); | 186 | queues = EFX_OWORD_FIELD(*int_ker, FSF_AZ_NET_IVEC_INT_Q); |
182 | |||
183 | /* Check to see if we have a serious error condition */ | ||
184 | if (queues & (1U << efx->fatal_irq_level)) { | ||
185 | syserr = EFX_OWORD_FIELD(*int_ker, FSF_AZ_NET_IVEC_FATAL_INT); | ||
186 | if (unlikely(syserr)) | ||
187 | return efx_nic_fatal_interrupt(efx); | ||
188 | } | ||
189 | |||
190 | EFX_ZERO_OWORD(*int_ker); | 187 | EFX_ZERO_OWORD(*int_ker); |
191 | wmb(); /* Ensure the vector is cleared before interrupt ack */ | 188 | wmb(); /* Ensure the vector is cleared before interrupt ack */ |
192 | falcon_irq_ack_a1(efx); | 189 | falcon_irq_ack_a1(efx); |