sfc: Add EF10 support for TX/RX DMA error events handling.
Also, since we handle all DMA errors in the same way, merge RESET_TYPE_(RX|TX)_DESC_FETCH into RESET_TYPE_DMA_ERROR. Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>
This commit is contained in:
parent
977a5d5d32
commit
3de82b91ea
|
@ -80,8 +80,7 @@ const char *const efx_reset_type_names[] = {
|
||||||
[RESET_TYPE_TX_WATCHDOG] = "TX_WATCHDOG",
|
[RESET_TYPE_TX_WATCHDOG] = "TX_WATCHDOG",
|
||||||
[RESET_TYPE_INT_ERROR] = "INT_ERROR",
|
[RESET_TYPE_INT_ERROR] = "INT_ERROR",
|
||||||
[RESET_TYPE_RX_RECOVERY] = "RX_RECOVERY",
|
[RESET_TYPE_RX_RECOVERY] = "RX_RECOVERY",
|
||||||
[RESET_TYPE_RX_DESC_FETCH] = "RX_DESC_FETCH",
|
[RESET_TYPE_DMA_ERROR] = "DMA_ERROR",
|
||||||
[RESET_TYPE_TX_DESC_FETCH] = "TX_DESC_FETCH",
|
|
||||||
[RESET_TYPE_TX_SKIP] = "TX_SKIP",
|
[RESET_TYPE_TX_SKIP] = "TX_SKIP",
|
||||||
[RESET_TYPE_MC_FAILURE] = "MC_FAILURE",
|
[RESET_TYPE_MC_FAILURE] = "MC_FAILURE",
|
||||||
};
|
};
|
||||||
|
|
|
@ -147,8 +147,7 @@ enum efx_loopback_mode {
|
||||||
* @RESET_TYPE_TX_WATCHDOG: reset due to TX watchdog
|
* @RESET_TYPE_TX_WATCHDOG: reset due to TX watchdog
|
||||||
* @RESET_TYPE_INT_ERROR: reset due to internal error
|
* @RESET_TYPE_INT_ERROR: reset due to internal error
|
||||||
* @RESET_TYPE_RX_RECOVERY: reset to recover from RX datapath errors
|
* @RESET_TYPE_RX_RECOVERY: reset to recover from RX datapath errors
|
||||||
* @RESET_TYPE_RX_DESC_FETCH: pcie error during rx descriptor fetch
|
* @RESET_TYPE_DMA_ERROR: DMA error
|
||||||
* @RESET_TYPE_TX_DESC_FETCH: pcie error during tx descriptor fetch
|
|
||||||
* @RESET_TYPE_TX_SKIP: hardware completed empty tx descriptors
|
* @RESET_TYPE_TX_SKIP: hardware completed empty tx descriptors
|
||||||
* @RESET_TYPE_MC_FAILURE: MC reboot/assertion
|
* @RESET_TYPE_MC_FAILURE: MC reboot/assertion
|
||||||
*/
|
*/
|
||||||
|
@ -163,8 +162,7 @@ enum reset_type {
|
||||||
RESET_TYPE_TX_WATCHDOG,
|
RESET_TYPE_TX_WATCHDOG,
|
||||||
RESET_TYPE_INT_ERROR,
|
RESET_TYPE_INT_ERROR,
|
||||||
RESET_TYPE_RX_RECOVERY,
|
RESET_TYPE_RX_RECOVERY,
|
||||||
RESET_TYPE_RX_DESC_FETCH,
|
RESET_TYPE_DMA_ERROR,
|
||||||
RESET_TYPE_TX_DESC_FETCH,
|
|
||||||
RESET_TYPE_TX_SKIP,
|
RESET_TYPE_TX_SKIP,
|
||||||
RESET_TYPE_MC_FAILURE,
|
RESET_TYPE_MC_FAILURE,
|
||||||
RESET_TYPE_MAX,
|
RESET_TYPE_MAX,
|
||||||
|
|
|
@ -1893,8 +1893,7 @@ static enum reset_type falcon_map_reset_reason(enum reset_type reason)
|
||||||
{
|
{
|
||||||
switch (reason) {
|
switch (reason) {
|
||||||
case RESET_TYPE_RX_RECOVERY:
|
case RESET_TYPE_RX_RECOVERY:
|
||||||
case RESET_TYPE_RX_DESC_FETCH:
|
case RESET_TYPE_DMA_ERROR:
|
||||||
case RESET_TYPE_TX_DESC_FETCH:
|
|
||||||
case RESET_TYPE_TX_SKIP:
|
case RESET_TYPE_TX_SKIP:
|
||||||
/* These can occasionally occur due to hardware bugs.
|
/* These can occasionally occur due to hardware bugs.
|
||||||
* We try to reset without disrupting the link.
|
* We try to reset without disrupting the link.
|
||||||
|
|
|
@ -832,7 +832,7 @@ efx_farch_handle_tx_event(struct efx_channel *channel, efx_qword_t *event)
|
||||||
efx_farch_notify_tx_desc(tx_queue);
|
efx_farch_notify_tx_desc(tx_queue);
|
||||||
netif_tx_unlock(efx->net_dev);
|
netif_tx_unlock(efx->net_dev);
|
||||||
} else if (EFX_QWORD_FIELD(*event, FSF_AZ_TX_EV_PKT_ERR)) {
|
} else if (EFX_QWORD_FIELD(*event, FSF_AZ_TX_EV_PKT_ERR)) {
|
||||||
efx_schedule_reset(efx, RESET_TYPE_TX_DESC_FETCH);
|
efx_schedule_reset(efx, RESET_TYPE_DMA_ERROR);
|
||||||
} else {
|
} else {
|
||||||
netif_err(efx, tx_err, efx->net_dev,
|
netif_err(efx, tx_err, efx->net_dev,
|
||||||
"channel %d unexpected TX event "
|
"channel %d unexpected TX event "
|
||||||
|
@ -1217,7 +1217,7 @@ efx_farch_handle_driver_event(struct efx_channel *channel, efx_qword_t *event)
|
||||||
"RX DMA Q %d reports descriptor fetch error."
|
"RX DMA Q %d reports descriptor fetch error."
|
||||||
" RX Q %d is disabled.\n", ev_sub_data,
|
" RX Q %d is disabled.\n", ev_sub_data,
|
||||||
ev_sub_data);
|
ev_sub_data);
|
||||||
efx_schedule_reset(efx, RESET_TYPE_RX_DESC_FETCH);
|
efx_schedule_reset(efx, RESET_TYPE_DMA_ERROR);
|
||||||
} else
|
} else
|
||||||
efx_sriov_desc_fetch_err(efx, ev_sub_data);
|
efx_sriov_desc_fetch_err(efx, ev_sub_data);
|
||||||
break;
|
break;
|
||||||
|
@ -1227,7 +1227,7 @@ efx_farch_handle_driver_event(struct efx_channel *channel, efx_qword_t *event)
|
||||||
"TX DMA Q %d reports descriptor fetch error."
|
"TX DMA Q %d reports descriptor fetch error."
|
||||||
" TX Q %d is disabled.\n", ev_sub_data,
|
" TX Q %d is disabled.\n", ev_sub_data,
|
||||||
ev_sub_data);
|
ev_sub_data);
|
||||||
efx_schedule_reset(efx, RESET_TYPE_TX_DESC_FETCH);
|
efx_schedule_reset(efx, RESET_TYPE_DMA_ERROR);
|
||||||
} else
|
} else
|
||||||
efx_sriov_desc_fetch_err(efx, ev_sub_data);
|
efx_sriov_desc_fetch_err(efx, ev_sub_data);
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -587,6 +587,14 @@ void efx_mcdi_process_event(struct efx_channel *channel,
|
||||||
efx_ptp_event(efx, event);
|
efx_ptp_event(efx, event);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case MCDI_EVENT_CODE_TX_ERR:
|
||||||
|
case MCDI_EVENT_CODE_RX_ERR:
|
||||||
|
netif_err(efx, hw, efx->net_dev,
|
||||||
|
"%s DMA error (event: "EFX_QWORD_FMT")\n",
|
||||||
|
code == MCDI_EVENT_CODE_TX_ERR ? "TX" : "RX",
|
||||||
|
EFX_QWORD_VAL(*event));
|
||||||
|
efx_schedule_reset(efx, RESET_TYPE_DMA_ERROR);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
netif_err(efx, hw, efx->net_dev, "Unknown MCDI event 0x%x\n",
|
netif_err(efx, hw, efx->net_dev, "Unknown MCDI event 0x%x\n",
|
||||||
code);
|
code);
|
||||||
|
|
Loading…
Reference in New Issue