Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 10 Aug 2026 10:04:14 +0000
Message-ID:  <6a79a21e.362f7.e37f82d@gitrepo.freebsd.org>

index | next in thread | raw e-mail

The branch main has been updated by kbowling:

URL: https://cgit.FreeBSD.org/src/commit/?id=f008b582c9f1e1a636e88a5f330ff3a167094440

commit f008b582c9f1e1a636e88a5f330ff3a167094440
Author:     Kevin Bowling <kbowling@FreeBSD.org>
AuthorDate: 2026-08-10 03:41:08 +0000
Commit:     Kevin Bowling <kbowling@FreeBSD.org>
CommitDate: 2026-08-10 10:03:43 +0000

    ixl: Report PF initialization failures to iflib
    
    ixl_if_init() returned early after AdminQ reconstruction, LAA, or
    VSI initialization failures.  Since IFDI_INIT has no return value,
    iflib then marked the interface RUNNING and enabled its interrupts
    and timers despite the incomplete hardware state.
    
    Use iflib_init_failed() on each incomplete path.  Also stop at the
    first ring-enable error and tear down any partially enabled rings
    before reporting failure.  This keeps the interface stopped and
    makes a later initialization attempt start from a bounded state.
    
    MFC after:      2 weeks
---
 sys/dev/ixl/if_ixl.c       | 29 ++++++++++++++++++++---------
 sys/dev/ixl/ixl_pf_iflib.c | 14 ++++++++++----
 2 files changed, 30 insertions(+), 13 deletions(-)

diff --git a/sys/dev/ixl/if_ixl.c b/sys/dev/ixl/if_ixl.c
index 0c95838ce3ed..b7234cf89bef 100644
--- a/sys/dev/ixl/if_ixl.c
+++ b/sys/dev/ixl/if_ixl.c
@@ -961,7 +961,7 @@ ixl_if_init(if_ctx_t ctx)
 	int		ret;
 
 	if (IXL_PF_IN_RECOVERY_MODE(pf))
-		return;
+		goto fail;
 	/*
 	 * If the aq is dead here, it probably means something outside of the driver
 	 * did something to the adapter, like a PF reset.
@@ -969,23 +969,25 @@ ixl_if_init(if_ctx_t ctx)
 	 */
 	if (!i40e_check_asq_alive(&pf->hw)) {
 		device_printf(dev, "Admin Queue is down; resetting...\n");
-		ixl_teardown_hw_structs(pf);
-		ixl_rebuild_hw_structs_after_reset(pf, false);
+		(void)ixl_teardown_hw_structs(pf);
+		ret = ixl_rebuild_hw_structs_after_reset(pf, false);
+		if (ret != 0)
+			goto fail;
 	}
 
 	/* Get the latest mac address... User might use a LAA */
 	bcopy(if_getlladdr(vsi->ifp), tmpaddr, ETH_ALEN);
 	if (!ixl_ether_is_equal(hw->mac.addr, tmpaddr) &&
 	    (i40e_validate_mac_addr(tmpaddr) == I40E_SUCCESS)) {
-		ixl_del_all_vlan_filters(vsi, hw->mac.addr);
-		bcopy(tmpaddr, hw->mac.addr, ETH_ALEN);
 		ret = i40e_aq_mac_address_write(hw,
 		    I40E_AQC_WRITE_TYPE_LAA_ONLY,
-		    hw->mac.addr, NULL);
+		    tmpaddr, NULL);
 		if (ret) {
 			device_printf(dev, "LLA address change failed!!\n");
-			return;
+			goto fail;
 		}
+		ixl_del_all_vlan_filters(vsi, hw->mac.addr);
+		bcopy(tmpaddr, hw->mac.addr, ETH_ALEN);
 		/*
 		 * New filters are configured by ixl_reconfigure_filters
 		 * at the end of ixl_init_locked.
@@ -997,7 +999,7 @@ ixl_if_init(if_ctx_t ctx)
 	/* Prepare the VSI: rings, hmc contexts, etc... */
 	if (ixl_initialize_vsi(vsi)) {
 		device_printf(dev, "initialize vsi failed!!\n");
-		return;
+		goto fail;
 	}
 
 	ixl_set_link(pf, true);
@@ -1020,7 +1022,12 @@ ixl_if_init(if_ctx_t ctx)
 	else
 		ixl_init_tx_rsqs(vsi);
 
-	ixl_enable_rings(vsi);
+	ret = ixl_enable_rings(vsi);
+	if (ret != 0) {
+		device_printf(dev, "enable rings failed: %d\n", ret);
+		ixl_disable_rings(pf, vsi, &pf->qtag);
+		goto fail;
+	}
 
 	i40e_aq_set_default_vsi(hw, vsi->seid, NULL);
 
@@ -1038,6 +1045,10 @@ ixl_if_init(if_ctx_t ctx)
 			    "initialize iwarp failed, code %d\n", ret);
 	}
 #endif
+	return;
+
+fail:
+	iflib_init_failed(ctx);
 }
 
 void
diff --git a/sys/dev/ixl/ixl_pf_iflib.c b/sys/dev/ixl/ixl_pf_iflib.c
index 8289cc72bc64..1f48519344f7 100644
--- a/sys/dev/ixl/ixl_pf_iflib.c
+++ b/sys/dev/ixl/ixl_pf_iflib.c
@@ -875,15 +875,21 @@ int
 ixl_enable_rings(struct ixl_vsi *vsi)
 {
 	struct ixl_pf	*pf = vsi->back;
-	int		error = 0;
+	int		error;
 
-	for (int i = 0; i < vsi->num_tx_queues; i++)
+	for (int i = 0; i < vsi->num_tx_queues; i++) {
 		error = ixl_enable_tx_ring(pf, &pf->qtag, i);
+		if (error != 0)
+			return (error);
+	}
 
-	for (int i = 0; i < vsi->num_rx_queues; i++)
+	for (int i = 0; i < vsi->num_rx_queues; i++) {
 		error = ixl_enable_rx_ring(pf, &pf->qtag, i);
+		if (error != 0)
+			return (error);
+	}
 
-	return (error);
+	return (0);
 }
 
 int


home | help

Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?6a79a21e.362f7.e37f82d>