[Bug 296989] ice: failed Tx scheduler t opology config leaves global config lock held ; AdminQ dead, Safe Mode, unusable E810 (NVM ≥4.60)

[email protected] Thu, 23 Jul 2026 05:50:50 +0000
Newsgroups gmane.os.freebsd.bugs
Message-ID <[email protected]/bugzilla/>
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=296989

            Bug ID: 296989
           Summary: ice: failed Tx scheduler topology config leaves global
                    config lock held; AdminQ dead, Safe Mode, unusable
                    E810 (NVM ≥4.60)
           Product: Base System
           Version: 15.1-STABLE
          Hardware: amd64
                OS: Any
            Status: New
          Severity: Affects Many People
          Priority: ---
         Component: kern
          Assignee: [email protected]
          Reporter: [email protected]

On Intel E810 (E810-XXV-2) with NVM ≥4.60, FreeBSD 15.1 ice (1.43.3-k) can fail
during transmit-balancing / 5-layer Tx topology setup. After the failure the
interface is effectively dead: DDP load reports an unknown error, the driver
enters Safe Mode, and subsequent AdminQ commands time out.

The same card and NVM work under Linux ice (Proxmox/kernel 7.x) on the same
host.

Hardware / firmware

• NIC: Intel Ethernet Network Adapter E810-XXV-2 (8086:159b)
• NVM 4.50: path largely avoided; interface usable (separate FEC issue not the
subject of this PR)
• NVM ≥4.60 / 5.01: tx_sched_topo_comp_mode_en advertised; Tx topology path
runs
• Under Linux after boot: tx_scheduling_layers permanent value 5; DDP 1.3.43.0
loads; link 25G RS-FEC OK

FreeBSD / OPNsense symptoms (dmesg)

ice0: Error configuring transmit balancing: ICE_ERR_AQ_ERROR
ice0: An unknown error occurred when loading the DDP package.  Entering Safe
Mode.
ice0: fw ... nvm 4.60 ...
ice0: Using 1 Tx and Rx queues
...
ice0: ice_read_sff_eeprom: Error reading I2C data: err ICE_ERR_AQ_TIMEOUT
aq_err OK
ice0: ice_intersect_phy_types_and_speeds: ice_aq_get_phy_caps (ACTIVE) failed;
status ICE_ERR_AQ_TIMEOUT
ice0: Failed to set LAN Tx queue 0 (TC 0, handle 0) context, err
ICE_ERR_AQ_TIMEOUT
ice0: Unable to configure the main VSI for Tx: ENODEV
ice0: Could not add new MAC filters, err ICE_ERR_AQ_TIMEOUT

Root cause (FreeBSD 15.1 sources)

In sys/dev/ice/ice_ddp_common.c, ice_cfg_tx_topo():

1. Acquires ICE_GLOBAL_CFG_LOCK_RES_ID (firmware global configuration lock used
for DDP / topology programming).
2. Calls ice_get_set_tx_topo(..., set=true) (AdminQ opcode 0x0417).
3. On failure, returns immediately without ice_reset(..., ICE_RESET_CORER).
4. CORER is only issued on the success path; CORER is what clears the global
configuration lock.

While that lock is held, firmware rejects most AdminQ commands. The caller then
tries ice_copy_and_init_pkg(), fails to complete global config, reports an
unknown DDP error, enters Safe Mode, and every later AQ op times out — matching
the dmesg cascade above.

This is not primarily “missing ice_ddp module.” Even with ice_ddp_load="YES", a
failed topology SET that leaks the lock makes DDP download and normal attach
fail.

The path is gated on FW capability tx_sched_topo_comp_mode_en (set on NVM
≥4.60), which is why NVM 4.50 does not hit this brick path the same way.

Upstream Linux: known and fixed

Linux fixed the identical failure mode:

• Patch: “ice: don't leave device non-functional if Tx scheduler config fails”
  Jacob Keller (Intel), 17 July 2025
  https://www.mail-archive.com/[email protected]/msg12135.html
• Fixes: 91427e6d9030 (“ice: Support 5 layer topology”)

That commit message describes the same lock/CORER/DDP/Safe Mode chain. The fix:

• Always trigger CORER after the global lock has been acquired for topology
programming, whether SET succeeds or fails
• Re-init HW after CORER inside ice_cfg_tx_topo()
• Treat topology apply failure as non-fatal so the device still loads (default
topology); only post-CORER re-init failure aborts probe

Important note from that patch (applies to FreeBSD port as well): you must not
“release” the global lock with a normal unlock on SET failure — that signals FW
that global configuration completed and breaks subsequent DDP loads. CORER is
the required recovery.

FreeBSD releng/15.1 / current main sys/dev/ice still has the early return
status after failed set_tx_topo and does not always CORER after taking the
lock.

Suggested FreeBSD fix

Port the Linux change to:

• sys/dev/ice/ice_ddp_common.c — ice_cfg_tx_topo()
• sys/dev/ice/ice_lib.c — ice_load_pkg_file() (caller: do not treat topology AQ
failure as fatal; continue DDP after successful re-init)

Optional hardening (seen when NVM already selected 5-layer tree): treat
num_tx_sched_layers == 5 as already applied and skip reprogramming; match Linux
by copying the 5-layer section into a zeroed ICE_AQ_MAX_BUF_LEN buffer before
SET.

Workarounds (for users)

1. Stay on NVM 4.50 (avoids capability path; may need FEC sysctls for 25G).
2. Loader tunable: hw.ice.debug.tx_balance_en=0 (skips topology step; does not
fix the lock leak if something else hits the path).
3. Host Linux PF + SR-IOV, guest uses iavf (avoids FreeBSD ice topology path
entirely).

How to reproduce

1. E810-XXV-2 with NVM ≥4.60, FreeBSD 15.1 / OPNsense 26.7, PF passed through
(or bare metal).
2. Boot with if_ice + ice_ddp loaded.
3. Observe transmit-balancing AQ error, Safe Mode, then AdminQ timeouts.
4. Same card under Linux: DDP loads, link up, no Safe Mode.

Related (not the same)

• FreeBSD Bug 274440 — different historical “Failed to set LAN Tx queue”
reports, not this topology lock-leak.

-- 
You are receiving this mail because:
You are the assignee for the bug.