diff options
Diffstat (limited to 'drivers/net/sfc/falcon.c')
| -rw-r--r-- | drivers/net/sfc/falcon.c | 20 | 
1 files changed, 14 insertions, 6 deletions
diff --git a/drivers/net/sfc/falcon.c b/drivers/net/sfc/falcon.c index d294d66fd60..655b697b45b 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)  	EFX_TRACE(efx, "IRQ %d on CPU %d status " EFX_OWORD_FMT "\n",  		  irq, raw_smp_processor_id(), EFX_OWORD_VAL(*int_ker)); -	/* Check to see if we have a serious error condition */ -	syserr = EFX_OWORD_FIELD(*int_ker, FSF_AZ_NET_IVEC_FATAL_INT); -	if (unlikely(syserr)) -		return efx_nic_fatal_interrupt(efx); -  	/* Determine interrupting queues, clear interrupt status  	 * register and acknowledge the device interrupt.  	 */  	BUILD_BUG_ON(FSF_AZ_NET_IVEC_INT_Q_WIDTH > EFX_MAX_CHANNELS);  	queues = EFX_OWORD_FIELD(*int_ker, FSF_AZ_NET_IVEC_INT_Q); + +	/* Check to see if we have a serious error condition */ +	if (queues & (1U << efx->fatal_irq_level)) { +		syserr = EFX_OWORD_FIELD(*int_ker, FSF_AZ_NET_IVEC_FATAL_INT); +		if (unlikely(syserr)) +			return efx_nic_fatal_interrupt(efx); +	} +  	EFX_ZERO_OWORD(*int_ker);  	wmb(); /* Ensure the vector is cleared before interrupt ack */  	falcon_irq_ack_a1(efx); @@ -504,6 +507,9 @@ static void falcon_reset_macs(struct efx_nic *efx)  	/* Ensure the correct MAC is selected before statistics  	 * are re-enabled by the caller */  	efx_writeo(efx, &mac_ctrl, FR_AB_MAC_CTRL); + +	/* This can run even when the GMAC is selected */ +	falcon_setup_xaui(efx);  }  void falcon_drain_tx_fifo(struct efx_nic *efx) @@ -1320,7 +1326,9 @@ static int falcon_probe_nvconfig(struct efx_nic *efx)  	EFX_LOG(efx, "PHY is %d phy_id %d\n", efx->phy_type, efx->mdio.prtad); -	falcon_probe_board(efx, board_rev); +	rc = falcon_probe_board(efx, board_rev); +	if (rc) +		goto fail2;  	kfree(nvconfig);  	return 0;  |