diff options
Diffstat (limited to 'drivers/net/sfc/falcon.c')
-rw-r--r-- | drivers/net/sfc/falcon.c | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/drivers/net/sfc/falcon.c b/drivers/net/sfc/falcon.c index 08278e7302b3..655b697b45b2 100644 --- a/drivers/net/sfc/falcon.c +++ b/drivers/net/sfc/falcon.c | |||
@@ -175,16 +175,19 @@ irqreturn_t falcon_legacy_interrupt_a1(int irq, void *dev_id) | |||
175 | EFX_TRACE(efx, "IRQ %d on CPU %d status " EFX_OWORD_FMT "\n", | 175 | EFX_TRACE(efx, "IRQ %d on CPU %d status " EFX_OWORD_FMT "\n", |
176 | irq, raw_smp_processor_id(), EFX_OWORD_VAL(*int_ker)); | 176 | irq, raw_smp_processor_id(), EFX_OWORD_VAL(*int_ker)); |
177 | 177 | ||
178 | /* Check to see if we have a serious error condition */ | ||
179 | syserr = EFX_OWORD_FIELD(*int_ker, FSF_AZ_NET_IVEC_FATAL_INT); | ||
180 | if (unlikely(syserr)) | ||
181 | return efx_nic_fatal_interrupt(efx); | ||
182 | |||
183 | /* Determine interrupting queues, clear interrupt status | 178 | /* Determine interrupting queues, clear interrupt status |
184 | * register and acknowledge the device interrupt. | 179 | * register and acknowledge the device interrupt. |
185 | */ | 180 | */ |
186 | BUILD_BUG_ON(FSF_AZ_NET_IVEC_INT_Q_WIDTH > EFX_MAX_CHANNELS); | 181 | BUILD_BUG_ON(FSF_AZ_NET_IVEC_INT_Q_WIDTH > EFX_MAX_CHANNELS); |
187 | queues = EFX_OWORD_FIELD(*int_ker, FSF_AZ_NET_IVEC_INT_Q); | 182 | queues = EFX_OWORD_FIELD(*int_ker, FSF_AZ_NET_IVEC_INT_Q); |
183 | |||
184 | /* Check to see if we have a serious error condition */ | ||
185 | if (queues & (1U << efx->fatal_irq_level)) { | ||
186 | syserr = EFX_OWORD_FIELD(*int_ker, FSF_AZ_NET_IVEC_FATAL_INT); | ||
187 | if (unlikely(syserr)) | ||
188 | return efx_nic_fatal_interrupt(efx); | ||
189 | } | ||
190 | |||
188 | EFX_ZERO_OWORD(*int_ker); | 191 | EFX_ZERO_OWORD(*int_ker); |
189 | wmb(); /* Ensure the vector is cleared before interrupt ack */ | 192 | wmb(); /* Ensure the vector is cleared before interrupt ack */ |
190 | falcon_irq_ack_a1(efx); | 193 | falcon_irq_ack_a1(efx); |
@@ -504,6 +507,9 @@ static void falcon_reset_macs(struct efx_nic *efx) | |||
504 | /* Ensure the correct MAC is selected before statistics | 507 | /* Ensure the correct MAC is selected before statistics |
505 | * are re-enabled by the caller */ | 508 | * are re-enabled by the caller */ |
506 | efx_writeo(efx, &mac_ctrl, FR_AB_MAC_CTRL); | 509 | efx_writeo(efx, &mac_ctrl, FR_AB_MAC_CTRL); |
510 | |||
511 | /* This can run even when the GMAC is selected */ | ||
512 | falcon_setup_xaui(efx); | ||
507 | } | 513 | } |
508 | 514 | ||
509 | void falcon_drain_tx_fifo(struct efx_nic *efx) | 515 | void falcon_drain_tx_fifo(struct efx_nic *efx) |