]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
idpf: keep the netdev when a reset fails
authorEmil Tantilov <emil.s.tantilov@intel.com>
Fri, 21 Nov 2025 00:12:14 +0000 (16:12 -0800)
committerTony Nguyen <anthony.l.nguyen@intel.com>
Tue, 6 Jan 2026 19:00:44 +0000 (11:00 -0800)
During a successful reset the driver would re-allocate vport resources
while keeping the netdevs intact. However, in case of an error in the
init task, the netdev of the failing vport will be unregistered,
effectively removing the network interface:

[  121.211076] idpf 0000:83:00.0: enabling device (0100 -> 0102)
[  121.221976] idpf 0000:83:00.0: Device HW Reset initiated
[  124.161229] idpf 0000:83:00.0 ens801f0: renamed from eth0
[  124.163364] idpf 0000:83:00.0 ens801f0d1: renamed from eth1
[  125.934656] idpf 0000:83:00.0 ens801f0d2: renamed from eth2
[  128.218429] idpf 0000:83:00.0 ens801f0d3: renamed from eth3

ip -br a
ens801f0         UP
ens801f0d1       UP
ens801f0d2       UP
ens801f0d3       UP
echo 1 > /sys/class/net/ens801f0/device/reset

[  145.885537] idpf 0000:83:00.0: resetting
[  145.990280] idpf 0000:83:00.0: reset done
[  146.284766] idpf 0000:83:00.0: HW reset detected
[  146.296610] idpf 0000:83:00.0: Device HW Reset initiated
[  211.556719] idpf 0000:83:00.0: Transaction timed-out (op:526 cookie:7700 vc_op:526 salt:77 timeout:60000ms)
[  272.996705] idpf 0000:83:00.0: Transaction timed-out (op:502 cookie:7800 vc_op:502 salt:78 timeout:60000ms)

ip -br a
ens801f0d1       DOWN
ens801f0d2       DOWN
ens801f0d3       DOWN

Re-shuffle the logic in the error path of the init task to make sure the
netdevs remain intact. This will allow the driver to attempt recovery via
subsequent resets, provided the FW is still functional.

The main change is to make sure that idpf_decfg_netdev() is not called
should the init task fail during a reset. The error handling is
consolidated under unwind_vports, as the removed labels had the same
cleanup logic split depending on the point of failure.

Fixes: ce1b75d0635c ("idpf: add ptypes and MAC filter support")
Signed-off-by: Emil Tantilov <emil.s.tantilov@intel.com>
Reviewed-by: Aleksandr Loktionov <aleksandr.loktionov@intel.com>
Tested-by: Samuel Salin <Samuel.salin@intel.com>
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
drivers/net/ethernet/intel/idpf/idpf_lib.c

index 7ce4eb71a433c50a5a0eac1ab89bbb4743e0f661..313803c088478a7a6816c8cf2854087b718f8e40 100644 (file)
@@ -1579,6 +1579,10 @@ void idpf_init_task(struct work_struct *work)
                goto unwind_vports;
        }
 
+       err = idpf_send_get_rx_ptype_msg(vport);
+       if (err)
+               goto unwind_vports;
+
        index = vport->idx;
        vport_config = adapter->vport_config[index];
 
@@ -1590,15 +1594,11 @@ void idpf_init_task(struct work_struct *work)
        err = idpf_check_supported_desc_ids(vport);
        if (err) {
                dev_err(&pdev->dev, "failed to get required descriptor ids\n");
-               goto cfg_netdev_err;
+               goto unwind_vports;
        }
 
        if (idpf_cfg_netdev(vport))
-               goto cfg_netdev_err;
-
-       err = idpf_send_get_rx_ptype_msg(vport);
-       if (err)
-               goto handle_err;
+               goto unwind_vports;
 
        /* Once state is put into DOWN, driver is ready for dev_open */
        np = netdev_priv(vport->netdev);
@@ -1645,11 +1645,6 @@ void idpf_init_task(struct work_struct *work)
 
        return;
 
-handle_err:
-       idpf_decfg_netdev(vport);
-cfg_netdev_err:
-       idpf_vport_rel(vport);
-       adapter->vports[index] = NULL;
 unwind_vports:
        if (default_vport) {
                for (index = 0; index < adapter->max_vports; index++) {