aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexandre Rames <arames@solarflare.com>2013-06-13 06:36:15 -0400
committerBen Hutchings <bhutchings@solarflare.com>2013-08-27 17:27:10 -0400
commit3de82b91ea604d7178925ce80ab821c968009c21 (patch)
treeaab126458684dcef7688679a35fc3621d60fd409
parent977a5d5d32f4797ace5ef65ee3f2232a1c88a274 (diff)
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>
-rw-r--r--drivers/net/ethernet/sfc/efx.c3
-rw-r--r--drivers/net/ethernet/sfc/enum.h6
-rw-r--r--drivers/net/ethernet/sfc/falcon.c3
-rw-r--r--drivers/net/ethernet/sfc/farch.c6
-rw-r--r--drivers/net/ethernet/sfc/mcdi.c8
5 files changed, 15 insertions, 11 deletions
diff --git a/drivers/net/ethernet/sfc/efx.c b/drivers/net/ethernet/sfc/efx.c
index 9fe375f1710a..efad5f73e1ce 100644
--- a/drivers/net/ethernet/sfc/efx.c
+++ b/drivers/net/ethernet/sfc/efx.c
@@ -80,8 +80,7 @@ const char *const efx_reset_type_names[] = {
80 [RESET_TYPE_TX_WATCHDOG] = "TX_WATCHDOG", 80 [RESET_TYPE_TX_WATCHDOG] = "TX_WATCHDOG",
81 [RESET_TYPE_INT_ERROR] = "INT_ERROR", 81 [RESET_TYPE_INT_ERROR] = "INT_ERROR",
82 [RESET_TYPE_RX_RECOVERY] = "RX_RECOVERY", 82 [RESET_TYPE_RX_RECOVERY] = "RX_RECOVERY",
83 [RESET_TYPE_RX_DESC_FETCH] = "RX_DESC_FETCH", 83 [RESET_TYPE_DMA_ERROR] = "DMA_ERROR",
84 [RESET_TYPE_TX_DESC_FETCH] = "TX_DESC_FETCH",
85 [RESET_TYPE_TX_SKIP] = "TX_SKIP", 84 [RESET_TYPE_TX_SKIP] = "TX_SKIP",
86 [RESET_TYPE_MC_FAILURE] = "MC_FAILURE", 85 [RESET_TYPE_MC_FAILURE] = "MC_FAILURE",
87}; 86};
diff --git a/drivers/net/ethernet/sfc/enum.h b/drivers/net/ethernet/sfc/enum.h
index ab8fb5889e55..8665921d7170 100644
--- a/drivers/net/ethernet/sfc/enum.h
+++ b/drivers/net/ethernet/sfc/enum.h
@@ -147,8 +147,7 @@ enum efx_loopback_mode {
147 * @RESET_TYPE_TX_WATCHDOG: reset due to TX watchdog 147 * @RESET_TYPE_TX_WATCHDOG: reset due to TX watchdog
148 * @RESET_TYPE_INT_ERROR: reset due to internal error 148 * @RESET_TYPE_INT_ERROR: reset due to internal error
149 * @RESET_TYPE_RX_RECOVERY: reset to recover from RX datapath errors 149 * @RESET_TYPE_RX_RECOVERY: reset to recover from RX datapath errors
150 * @RESET_TYPE_RX_DESC_FETCH: pcie error during rx descriptor fetch 150 * @RESET_TYPE_DMA_ERROR: DMA error
151 * @RESET_TYPE_TX_DESC_FETCH: pcie error during tx descriptor fetch
152 * @RESET_TYPE_TX_SKIP: hardware completed empty tx descriptors 151 * @RESET_TYPE_TX_SKIP: hardware completed empty tx descriptors
153 * @RESET_TYPE_MC_FAILURE: MC reboot/assertion 152 * @RESET_TYPE_MC_FAILURE: MC reboot/assertion
154 */ 153 */
@@ -163,8 +162,7 @@ enum reset_type {
163 RESET_TYPE_TX_WATCHDOG, 162 RESET_TYPE_TX_WATCHDOG,
164 RESET_TYPE_INT_ERROR, 163 RESET_TYPE_INT_ERROR,
165 RESET_TYPE_RX_RECOVERY, 164 RESET_TYPE_RX_RECOVERY,
166 RESET_TYPE_RX_DESC_FETCH, 165 RESET_TYPE_DMA_ERROR,
167 RESET_TYPE_TX_DESC_FETCH,
168 RESET_TYPE_TX_SKIP, 166 RESET_TYPE_TX_SKIP,
169 RESET_TYPE_MC_FAILURE, 167 RESET_TYPE_MC_FAILURE,
170 RESET_TYPE_MAX, 168 RESET_TYPE_MAX,
diff --git a/drivers/net/ethernet/sfc/falcon.c b/drivers/net/ethernet/sfc/falcon.c
index 0be1f3711c89..1140b832d541 100644
--- a/drivers/net/ethernet/sfc/falcon.c
+++ b/drivers/net/ethernet/sfc/falcon.c
@@ -1893,8 +1893,7 @@ static enum reset_type falcon_map_reset_reason(enum reset_type reason)
1893{ 1893{
1894 switch (reason) { 1894 switch (reason) {
1895 case RESET_TYPE_RX_RECOVERY: 1895 case RESET_TYPE_RX_RECOVERY:
1896 case RESET_TYPE_RX_DESC_FETCH: 1896 case RESET_TYPE_DMA_ERROR:
1897 case RESET_TYPE_TX_DESC_FETCH:
1898 case RESET_TYPE_TX_SKIP: 1897 case RESET_TYPE_TX_SKIP:
1899 /* These can occasionally occur due to hardware bugs. 1898 /* These can occasionally occur due to hardware bugs.
1900 * We try to reset without disrupting the link. 1899 * We try to reset without disrupting the link.
diff --git a/drivers/net/ethernet/sfc/farch.c b/drivers/net/ethernet/sfc/farch.c
index b6af8f4cc704..d21483dfea40 100644
--- a/drivers/net/ethernet/sfc/farch.c
+++ b/drivers/net/ethernet/sfc/farch.c
@@ -832,7 +832,7 @@ efx_farch_handle_tx_event(struct efx_channel *channel, efx_qword_t *event)
832 efx_farch_notify_tx_desc(tx_queue); 832 efx_farch_notify_tx_desc(tx_queue);
833 netif_tx_unlock(efx->net_dev); 833 netif_tx_unlock(efx->net_dev);
834 } else if (EFX_QWORD_FIELD(*event, FSF_AZ_TX_EV_PKT_ERR)) { 834 } else if (EFX_QWORD_FIELD(*event, FSF_AZ_TX_EV_PKT_ERR)) {
835 efx_schedule_reset(efx, RESET_TYPE_TX_DESC_FETCH); 835 efx_schedule_reset(efx, RESET_TYPE_DMA_ERROR);
836 } else { 836 } else {
837 netif_err(efx, tx_err, efx->net_dev, 837 netif_err(efx, tx_err, efx->net_dev,
838 "channel %d unexpected TX event " 838 "channel %d unexpected TX event "
@@ -1217,7 +1217,7 @@ efx_farch_handle_driver_event(struct efx_channel *channel, efx_qword_t *event)
1217 "RX DMA Q %d reports descriptor fetch error." 1217 "RX DMA Q %d reports descriptor fetch error."
1218 " RX Q %d is disabled.\n", ev_sub_data, 1218 " RX Q %d is disabled.\n", ev_sub_data,
1219 ev_sub_data); 1219 ev_sub_data);
1220 efx_schedule_reset(efx, RESET_TYPE_RX_DESC_FETCH); 1220 efx_schedule_reset(efx, RESET_TYPE_DMA_ERROR);
1221 } else 1221 } else
1222 efx_sriov_desc_fetch_err(efx, ev_sub_data); 1222 efx_sriov_desc_fetch_err(efx, ev_sub_data);
1223 break; 1223 break;
@@ -1227,7 +1227,7 @@ efx_farch_handle_driver_event(struct efx_channel *channel, efx_qword_t *event)
1227 "TX DMA Q %d reports descriptor fetch error." 1227 "TX DMA Q %d reports descriptor fetch error."
1228 " TX Q %d is disabled.\n", ev_sub_data, 1228 " TX Q %d is disabled.\n", ev_sub_data,
1229 ev_sub_data); 1229 ev_sub_data);
1230 efx_schedule_reset(efx, RESET_TYPE_TX_DESC_FETCH); 1230 efx_schedule_reset(efx, RESET_TYPE_DMA_ERROR);
1231 } else 1231 } else
1232 efx_sriov_desc_fetch_err(efx, ev_sub_data); 1232 efx_sriov_desc_fetch_err(efx, ev_sub_data);
1233 break; 1233 break;
diff --git a/drivers/net/ethernet/sfc/mcdi.c b/drivers/net/ethernet/sfc/mcdi.c
index ff90ebf51dbd..381063484ee4 100644
--- a/drivers/net/ethernet/sfc/mcdi.c
+++ b/drivers/net/ethernet/sfc/mcdi.c
@@ -587,6 +587,14 @@ void efx_mcdi_process_event(struct efx_channel *channel,
587 efx_ptp_event(efx, event); 587 efx_ptp_event(efx, event);
588 break; 588 break;
589 589
590 case MCDI_EVENT_CODE_TX_ERR:
591 case MCDI_EVENT_CODE_RX_ERR:
592 netif_err(efx, hw, efx->net_dev,
593 "%s DMA error (event: "EFX_QWORD_FMT")\n",
594 code == MCDI_EVENT_CODE_TX_ERR ? "TX" : "RX",
595 EFX_QWORD_VAL(*event));
596 efx_schedule_reset(efx, RESET_TYPE_DMA_ERROR);
597 break;
590 default: 598 default:
591 netif_err(efx, hw, efx->net_dev, "Unknown MCDI event 0x%x\n", 599 netif_err(efx, hw, efx->net_dev, "Unknown MCDI event 0x%x\n",
592 code); 600 code);