aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKevin Bowling <kbowling@FreeBSD.org>2026-08-09 09:38:21 +0000
committerKevin Bowling <kbowling@FreeBSD.org>2026-08-10 00:33:10 +0000
commitdcdc00a41d3e4be0e75eb625cd3a23d5a927ed15 (patch)
treea6bcd3d6467e0fcdb1fe4103f331f1394049dd87
parentcb0e8f5fb6de03428137c096b1c8b62710829029 (diff)
ice: Report initialization failures to iflib
The primary and mirror-VSI ifdi_init callbacks can return early when reset state or hardware queue and filter setup prevents initialization. Iflib then marks the interface running and enables interrupts although the driver did not finish bringing it up. Report each non-detach failure through iflib_init_failed(). Keep the existing ice reset and subinterface-reinitialization machinery responsible for scheduling recovery. MFC after: 2 weeks
-rw-r--r--sys/dev/ice/if_ice_iflib.c22
1 files changed, 13 insertions, 9 deletions
diff --git a/sys/dev/ice/if_ice_iflib.c b/sys/dev/ice/if_ice_iflib.c
index 6ea539d52e02..2722b8892d61 100644
--- a/sys/dev/ice/if_ice_iflib.c
+++ b/sys/dev/ice/if_ice_iflib.c
@@ -2084,16 +2084,16 @@ ice_if_init(if_ctx_t ctx)
return;
if (ice_test_state(&sc->state, ICE_STATE_RECOVERY_MODE))
- return;
+ goto err_init_failed;
if (ice_test_state(&sc->state, ICE_STATE_RESET_FAILED)) {
device_printf(sc->dev, "request to start interface cannot be completed as the device failed to reset\n");
- return;
+ goto err_init_failed;
}
if (ice_test_state(&sc->state, ICE_STATE_PREPARED_FOR_RESET)) {
device_printf(sc->dev, "request to start interface while device is prepared for impending reset\n");
- return;
+ goto err_init_failed;
}
ice_update_rx_mbuf_sz(sc);
@@ -2104,7 +2104,7 @@ ice_if_init(if_ctx_t ctx)
device_printf(dev,
"LAA address change failed, err %s\n",
ice_err_str(err));
- return;
+ goto err_init_failed;
}
/* Initialize software Tx tracking values */
@@ -2115,7 +2115,7 @@ ice_if_init(if_ctx_t ctx)
device_printf(dev,
"Unable to configure the main VSI for Tx: %s\n",
ice_err_str(err));
- return;
+ goto err_init_failed;
}
err = ice_cfg_vsi_for_rx(&sc->pf_vsi);
@@ -2172,6 +2172,8 @@ err_stop_rx:
ice_control_all_rx_queues(&sc->pf_vsi, false);
err_cleanup_tx:
ice_vsi_disable_tx(&sc->pf_vsi);
+err_init_failed:
+ iflib_init_failed(ctx);
}
/**
@@ -4406,20 +4408,20 @@ ice_subif_if_init(if_ctx_t ctx)
return;
if (ice_test_state(&sc->state, ICE_STATE_RECOVERY_MODE))
- return;
+ goto err_init_failed;
if (ice_test_state(&sc->state, ICE_STATE_RESET_FAILED)) {
device_printf(dev,
"request to start interface cannot be completed as the parent device %s failed to reset\n",
device_get_nameunit(sc->dev));
- return;
+ goto err_init_failed;
}
if (ice_test_state(&sc->state, ICE_STATE_PREPARED_FOR_RESET)) {
device_printf(dev,
"request to start interface cannot be completed while parent device %s is prepared for impending reset\n",
device_get_nameunit(sc->dev));
- return;
+ goto err_init_failed;
}
/* XXX: Equiv to ice_update_rx_mbuf_sz */
@@ -4433,7 +4435,7 @@ ice_subif_if_init(if_ctx_t ctx)
device_printf(dev,
"Unable to configure subif VSI for Tx: %s\n",
ice_err_str(err));
- return;
+ goto err_init_failed;
}
err = ice_cfg_vsi_for_rx(vsi);
@@ -4460,6 +4462,8 @@ ice_subif_if_init(if_ctx_t ctx)
err_cleanup_tx:
ice_vsi_disable_tx(vsi);
+err_init_failed:
+ iflib_init_failed(ctx);
}
/**