Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3de82b91 authored by Alexandre Rames's avatar Alexandre Rames Committed by Ben Hutchings
Browse files

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: default avatarBen Hutchings <bhutchings@solarflare.com>
parent 977a5d5d
Loading
Loading
Loading
Loading
+1 −2
Original line number Diff line number Diff line
@@ -80,8 +80,7 @@ const char *const efx_reset_type_names[] = {
	[RESET_TYPE_TX_WATCHDOG]        = "TX_WATCHDOG",
	[RESET_TYPE_INT_ERROR]          = "INT_ERROR",
	[RESET_TYPE_RX_RECOVERY]        = "RX_RECOVERY",
	[RESET_TYPE_RX_DESC_FETCH]      = "RX_DESC_FETCH",
	[RESET_TYPE_TX_DESC_FETCH]      = "TX_DESC_FETCH",
	[RESET_TYPE_DMA_ERROR]          = "DMA_ERROR",
	[RESET_TYPE_TX_SKIP]            = "TX_SKIP",
	[RESET_TYPE_MC_FAILURE]         = "MC_FAILURE",
};
+2 −4
Original line number Diff line number Diff line
@@ -147,8 +147,7 @@ enum efx_loopback_mode {
 * @RESET_TYPE_TX_WATCHDOG: reset due to TX watchdog
 * @RESET_TYPE_INT_ERROR: reset due to internal error
 * @RESET_TYPE_RX_RECOVERY: reset to recover from RX datapath errors
 * @RESET_TYPE_RX_DESC_FETCH: pcie error during rx descriptor fetch
 * @RESET_TYPE_TX_DESC_FETCH: pcie error during tx descriptor fetch
 * @RESET_TYPE_DMA_ERROR: DMA error
 * @RESET_TYPE_TX_SKIP: hardware completed empty tx descriptors
 * @RESET_TYPE_MC_FAILURE: MC reboot/assertion
 */
@@ -163,8 +162,7 @@ enum reset_type {
	RESET_TYPE_TX_WATCHDOG,
	RESET_TYPE_INT_ERROR,
	RESET_TYPE_RX_RECOVERY,
	RESET_TYPE_RX_DESC_FETCH,
	RESET_TYPE_TX_DESC_FETCH,
	RESET_TYPE_DMA_ERROR,
	RESET_TYPE_TX_SKIP,
	RESET_TYPE_MC_FAILURE,
	RESET_TYPE_MAX,
+1 −2
Original line number Diff line number Diff line
@@ -1893,8 +1893,7 @@ static enum reset_type falcon_map_reset_reason(enum reset_type reason)
{
	switch (reason) {
	case RESET_TYPE_RX_RECOVERY:
	case RESET_TYPE_RX_DESC_FETCH:
	case RESET_TYPE_TX_DESC_FETCH:
	case RESET_TYPE_DMA_ERROR:
	case RESET_TYPE_TX_SKIP:
		/* These can occasionally occur due to hardware bugs.
		 * We try to reset without disrupting the link.
+3 −3
Original line number Diff line number Diff line
@@ -832,7 +832,7 @@ efx_farch_handle_tx_event(struct efx_channel *channel, efx_qword_t *event)
		efx_farch_notify_tx_desc(tx_queue);
		netif_tx_unlock(efx->net_dev);
	} 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 {
		netif_err(efx, tx_err, efx->net_dev,
			  "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 Q %d is disabled.\n", ev_sub_data,
				  ev_sub_data);
			efx_schedule_reset(efx, RESET_TYPE_RX_DESC_FETCH);
			efx_schedule_reset(efx, RESET_TYPE_DMA_ERROR);
		} else
			efx_sriov_desc_fetch_err(efx, ev_sub_data);
		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 Q %d is disabled.\n", ev_sub_data,
				  ev_sub_data);
			efx_schedule_reset(efx, RESET_TYPE_TX_DESC_FETCH);
			efx_schedule_reset(efx, RESET_TYPE_DMA_ERROR);
		} else
			efx_sriov_desc_fetch_err(efx, ev_sub_data);
		break;
+8 −0
Original line number Diff line number Diff line
@@ -587,6 +587,14 @@ void efx_mcdi_process_event(struct efx_channel *channel,
		efx_ptp_event(efx, event);
		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:
		netif_err(efx, hw, efx->net_dev, "Unknown MCDI event 0x%x\n",
			  code);