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:
Alexandre Rames 2013-06-13 11:36:15 +01:00 committed by Ben Hutchings
parent 977a5d5d32
commit 3de82b91ea
5 changed files with 15 additions and 11 deletions

View File

@ -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",
}; };

View File

@ -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,

View File

@ -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.

View File

@ -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;

View File

@ -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);