* [PATCH net v2 0/2] net: ngbe: fix error handling in resume and open paths
@ 2026-09-22 10:08 Zhang Yunfei
2026-09-22 10:08 ` [PATCH net v2 1/2] net: ngbe: propagate resume errors to the PM core Zhang Yunfei
2026-09-22 10:08 ` [PATCH net v2 2/2] net: ngbe: clear DRV_LOAD bit when ngbe_open() fails Zhang Yunfei
0 siblings, 2 replies; 9+ messages in thread
From: Zhang Yunfei @ 2026-09-22 10:08 UTC (permalink / raw)
To: netdev
Cc: jiawenwu, mengyuanlou, andrew+netdev, davem, edumazet, kuba,
pabeni, aleksandr.loktionov, leitao, weirongguang,
u.kleine-koenig, linux-kernel
Two error-handling fixes for the ngbe PM/open paths.
ngbe_resume() declared err as u32 and returned 0 unconditionally, so a
failed ngbe_reset_hw(), wx_init_interrupt_scheme() or ngbe_open() left
the device in netif_device_detach() state with a broken interrupt
scheme while the PM core was told the resume succeeded; the reset task
bails out on the missing netif_device_present() check, so the device
cannot self-heal. Patch 1 fixes the type and propagates all of these
errors, making the whole tail of the resume path consistent with the
pci_enable_device_mem() failure path at the top, which already reports
its error.
ngbe_open() sets the WX_CFG_PORT_CTL_DRV_LOAD bit to tell the
management firmware the host has taken over the port, but no error
path cleared it, leaving the firmware owning a port whose rings and
IRQs are gone. Patch 2 rolls the bit back on all open error paths,
matching ngbe_close() and ngbe_dev_shutdown().
---
Changes in v2:
- also propagate the ngbe_reset_hw() failure, so the whole tail of
ngbe_resume() reports errors to the PM core (Sashiko review);
- drop the inaccurate "device can be re-probed" claim: the PM core
records and logs the failure, there is no re-probe (Sashiko review);
- patch 2/2 unchanged.
Link: https://lore.kernel.org/netdev/20260917090050.1927999-1-zhangyunfei1@kylinos.cn/T/#u/
Zhang Yunfei (2):
net: ngbe: propagate resume errors to the PM core
net: ngbe: clear DRV_LOAD bit when ngbe_open() fails
drivers/net/ethernet/wangxun/ngbe/ngbe_main.c | 12 ++++++++----
1 file changed, 8 insertions(+), 4 deletions(-)
base-commit: 93f51579e7df248780214094418f205253383cc5
--
2.25.1
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH net v2 1/2] net: ngbe: propagate resume errors to the PM core
2026-09-22 10:08 [PATCH net v2 0/2] net: ngbe: fix error handling in resume and open paths Zhang Yunfei
@ 2026-09-22 10:08 ` Zhang Yunfei
2026-09-22 11:09 ` Loktionov, Aleksandr
` (2 more replies)
2026-09-22 10:08 ` [PATCH net v2 2/2] net: ngbe: clear DRV_LOAD bit when ngbe_open() fails Zhang Yunfei
1 sibling, 3 replies; 9+ messages in thread
From: Zhang Yunfei @ 2026-09-22 10:08 UTC (permalink / raw)
To: netdev
Cc: jiawenwu, mengyuanlou, andrew+netdev, davem, edumazet, kuba,
pabeni, aleksandr.loktionov, leitao, weirongguang,
u.kleine-koenig, linux-kernel, stable
ngbe_resume() declares err as u32 and unconditionally returns 0, so
failures of wx_init_interrupt_scheme() or ngbe_open() are silently
swallowed, and the return value of ngbe_reset_hw() is ignored
entirely. The device stays in netif_device_detach() state with a
broken interrupt scheme, the PM core is told the resume succeeded,
and the netdev never appears in the networking stack again: the
reset task also bails out early on the missing
netif_device_present() check, so the device cannot self-heal.
Fix the type to int and propagate the errors instead, making the
whole tail of the resume path consistent with the
pci_enable_device_mem() failure path at the top, which already
propagates its error. If the hardware reset fails, the remaining
resume steps cannot succeed, so return early instead of continuing
with a broken device. A failed resume is then reported to the PM
core, which records and logs the failure, instead of being silently
swallowed.
Fixes: 6963e463256e ("net: ngbe: add Wake on Lan support")
Cc: stable@vger.kernel.org
Signed-off-by: Zhang Yunfei <zhangyunfei1@kylinos.cn>
---
Changes in v2:
- also propagate the ngbe_reset_hw() failure, so the whole tail of
ngbe_resume() reports errors to the PM core;
- drop the inaccurate "device can be re-probed" claim: the PM core
records and logs the failure, there is no re-probe.
drivers/net/ethernet/wangxun/ngbe/ngbe_main.c | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/drivers/net/ethernet/wangxun/ngbe/ngbe_main.c b/drivers/net/ethernet/wangxun/ngbe/ngbe_main.c
index 855dc963c610..e8cabcc84a41 100644
--- a/drivers/net/ethernet/wangxun/ngbe/ngbe_main.c
+++ b/drivers/net/ethernet/wangxun/ngbe/ngbe_main.c
@@ -954,7 +954,7 @@ static int ngbe_resume(struct pci_dev *pdev)
{
struct net_device *netdev;
struct wx *wx;
- u32 err;
+ int err;
wx = pci_get_drvdata(pdev);
netdev = wx->netdev;
@@ -968,7 +968,9 @@ static int ngbe_resume(struct pci_dev *pdev)
pci_set_master(pdev);
device_wakeup_disable(&pdev->dev);
- ngbe_reset_hw(wx);
+ err = ngbe_reset_hw(wx);
+ if (err)
+ return err;
rtnl_lock();
err = wx_init_interrupt_scheme(wx);
if (!err && netif_running(netdev))
@@ -977,7 +979,7 @@ static int ngbe_resume(struct pci_dev *pdev)
netif_device_attach(netdev);
rtnl_unlock();
- return 0;
+ return err;
}
static struct pci_driver ngbe_driver = {
--
2.25.1
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH net v2 2/2] net: ngbe: clear DRV_LOAD bit when ngbe_open() fails
2026-09-22 10:08 [PATCH net v2 0/2] net: ngbe: fix error handling in resume and open paths Zhang Yunfei
2026-09-22 10:08 ` [PATCH net v2 1/2] net: ngbe: propagate resume errors to the PM core Zhang Yunfei
@ 2026-09-22 10:08 ` Zhang Yunfei
2026-09-22 10:58 ` Breno Leitao
2026-09-22 11:10 ` Loktionov, Aleksandr
1 sibling, 2 replies; 9+ messages in thread
From: Zhang Yunfei @ 2026-09-22 10:08 UTC (permalink / raw)
To: netdev
Cc: jiawenwu, mengyuanlou, andrew+netdev, davem, edumazet, kuba,
pabeni, aleksandr.loktionov, leitao, weirongguang,
u.kleine-koenig, linux-kernel, stable
ngbe_open() sets the WX_CFG_PORT_CTL_DRV_LOAD bit via
wx_control_hw(wx, true) to tell the management firmware that the
host driver has taken over the port (NCSI/OOB firmware stops using
its management channel). Every error path of ngbe_open() returns
without clearing it, leaving rings, IRQs and the PHY torn down
while the firmware still believes the host owns the port, an
inconsistent driver-firmware handshake state that persists until
the next successful ifup.
Roll the bit back on all open error paths, matching ngbe_close()
and ngbe_dev_shutdown(), which already clear it.
Fixes: e7956139a6cf ("net: ngbe: Add irqs request flow")
Cc: stable@vger.kernel.org
Signed-off-by: Zhang Yunfei <zhangyunfei1@kylinos.cn>
---
drivers/net/ethernet/wangxun/ngbe/ngbe_main.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/drivers/net/ethernet/wangxun/ngbe/ngbe_main.c b/drivers/net/ethernet/wangxun/ngbe/ngbe_main.c
index e8cabcc84a41..7e2cc69fe8f8 100644
--- a/drivers/net/ethernet/wangxun/ngbe/ngbe_main.c
+++ b/drivers/net/ethernet/wangxun/ngbe/ngbe_main.c
@@ -494,7 +494,7 @@ static int ngbe_open(struct net_device *netdev)
err = wx_setup_resources(wx);
if (err)
- return err;
+ goto err_control_hw;
wx_configure(wx);
@@ -526,6 +526,8 @@ static int ngbe_open(struct net_device *netdev)
err_free_resources:
wx_free_isb_resources(wx);
wx_free_resources(wx);
+err_control_hw:
+ wx_control_hw(wx, false);
return err;
}
--
2.25.1
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH net v2 2/2] net: ngbe: clear DRV_LOAD bit when ngbe_open() fails
2026-09-22 10:08 ` [PATCH net v2 2/2] net: ngbe: clear DRV_LOAD bit when ngbe_open() fails Zhang Yunfei
@ 2026-09-22 10:58 ` Breno Leitao
2026-09-22 11:10 ` Loktionov, Aleksandr
1 sibling, 0 replies; 9+ messages in thread
From: Breno Leitao @ 2026-09-22 10:58 UTC (permalink / raw)
To: Zhang Yunfei
Cc: netdev, jiawenwu, mengyuanlou, andrew+netdev, davem, edumazet,
kuba, pabeni, aleksandr.loktionov, weirongguang, u.kleine-koenig,
linux-kernel, stable
On Tue, Sep 22, 2026 at 06:08:36PM +0800, Zhang Yunfei wrote:
> ngbe_open() sets the WX_CFG_PORT_CTL_DRV_LOAD bit via
> wx_control_hw(wx, true) to tell the management firmware that the
> host driver has taken over the port (NCSI/OOB firmware stops using
> its management channel). Every error path of ngbe_open() returns
> without clearing it, leaving rings, IRQs and the PHY torn down
> while the firmware still believes the host owns the port, an
> inconsistent driver-firmware handshake state that persists until
> the next successful ifup.
>
> Roll the bit back on all open error paths, matching ngbe_close()
> and ngbe_dev_shutdown(), which already clear it.
silly question, why unwind, rather than not taking hw control until the
port is actually up, as the last thing in ngbe_open()?
Looking at txgbe, it does something like:
static int txgbe_open(struct net_device *netdev) {
.....
txgbe_up_complete(wx);
return 0;
}
Would ngbe_open() be able to follow a similar approach?
--breno
^ permalink raw reply [flat|nested] 9+ messages in thread
* RE: [PATCH net v2 1/2] net: ngbe: propagate resume errors to the PM core
2026-09-22 10:08 ` [PATCH net v2 1/2] net: ngbe: propagate resume errors to the PM core Zhang Yunfei
@ 2026-09-22 11:09 ` Loktionov, Aleksandr
2026-09-22 11:35 ` Breno Leitao
2026-09-24 17:29 ` netdev-bot+sashiko
2 siblings, 0 replies; 9+ messages in thread
From: Loktionov, Aleksandr @ 2026-09-22 11:09 UTC (permalink / raw)
To: Zhang Yunfei, netdev
Cc: jiawenwu, mengyuanlou, andrew+netdev, davem, edumazet, kuba,
pabeni, leitao, weirongguang, u.kleine-koenig, linux-kernel,
stable
> -----Original Message-----
> From: Zhang Yunfei <zhangyunfei1@kylinos.cn>
> Sent: Tuesday, September 22, 2026 12:09 PM
> To: netdev@vger.kernel.org
> Cc: jiawenwu@trustnetic.com; mengyuanlou@net-swift.com;
> andrew+netdev@lunn.ch; davem@davemloft.net; edumazet@google.com;
> kuba@kernel.org; pabeni@redhat.com; Loktionov, Aleksandr
> <aleksandr.loktionov@intel.com>; leitao@debian.org;
> weirongguang@kylinos.cn; u.kleine-koenig@baylibre.com; linux-
> kernel@vger.kernel.org; stable@vger.kernel.org
> Subject: [PATCH net v2 1/2] net: ngbe: propagate resume errors to the
> PM core
>
> ngbe_resume() declares err as u32 and unconditionally returns 0, so
> failures of wx_init_interrupt_scheme() or ngbe_open() are silently
> swallowed, and the return value of ngbe_reset_hw() is ignored
> entirely. The device stays in netif_device_detach() state with a
> broken interrupt scheme, the PM core is told the resume succeeded, and
> the netdev never appears in the networking stack again: the reset task
> also bails out early on the missing
> netif_device_present() check, so the device cannot self-heal.
>
> Fix the type to int and propagate the errors instead, making the whole
> tail of the resume path consistent with the
> pci_enable_device_mem() failure path at the top, which already
> propagates its error. If the hardware reset fails, the remaining
> resume steps cannot succeed, so return early instead of continuing
> with a broken device. A failed resume is then reported to the PM core,
> which records and logs the failure, instead of being silently
> swallowed.
>
> Fixes: 6963e463256e ("net: ngbe: add Wake on Lan support")
> Cc: stable@vger.kernel.org
> Signed-off-by: Zhang Yunfei <zhangyunfei1@kylinos.cn>
> ---
>
> Changes in v2:
> - also propagate the ngbe_reset_hw() failure, so the whole tail of
> ngbe_resume() reports errors to the PM core;
> - drop the inaccurate "device can be re-probed" claim: the PM core
> records and logs the failure, there is no re-probe.
>
> drivers/net/ethernet/wangxun/ngbe/ngbe_main.c | 8 +++++---
> 1 file changed, 5 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/net/ethernet/wangxun/ngbe/ngbe_main.c
> b/drivers/net/ethernet/wangxun/ngbe/ngbe_main.c
> index 855dc963c610..e8cabcc84a41 100644
> --- a/drivers/net/ethernet/wangxun/ngbe/ngbe_main.c
> +++ b/drivers/net/ethernet/wangxun/ngbe/ngbe_main.c
> @@ -954,7 +954,7 @@ static int ngbe_resume(struct pci_dev *pdev) {
> struct net_device *netdev;
> struct wx *wx;
> - u32 err;
> + int err;
>
> wx = pci_get_drvdata(pdev);
> netdev = wx->netdev;
> @@ -968,7 +968,9 @@ static int ngbe_resume(struct pci_dev *pdev)
> pci_set_master(pdev);
> device_wakeup_disable(&pdev->dev);
>
> - ngbe_reset_hw(wx);
> + err = ngbe_reset_hw(wx);
> + if (err)
> + return err;
> rtnl_lock();
> err = wx_init_interrupt_scheme(wx);
> if (!err && netif_running(netdev))
> @@ -977,7 +979,7 @@ static int ngbe_resume(struct pci_dev *pdev)
> netif_device_attach(netdev);
> rtnl_unlock();
>
> - return 0;
> + return err;
> }
>
> static struct pci_driver ngbe_driver = {
> --
> 2.25.1
Reviewed-by: Aleksandr Loktionov <aleksandr.loktionov@intel.com>
^ permalink raw reply [flat|nested] 9+ messages in thread
* RE: [PATCH net v2 2/2] net: ngbe: clear DRV_LOAD bit when ngbe_open() fails
2026-09-22 10:08 ` [PATCH net v2 2/2] net: ngbe: clear DRV_LOAD bit when ngbe_open() fails Zhang Yunfei
2026-09-22 10:58 ` Breno Leitao
@ 2026-09-22 11:10 ` Loktionov, Aleksandr
1 sibling, 0 replies; 9+ messages in thread
From: Loktionov, Aleksandr @ 2026-09-22 11:10 UTC (permalink / raw)
To: Zhang Yunfei, netdev
Cc: jiawenwu, mengyuanlou, andrew+netdev, davem, edumazet, kuba,
pabeni, leitao, weirongguang, u.kleine-koenig, linux-kernel,
stable
> -----Original Message-----
> From: Zhang Yunfei <zhangyunfei1@kylinos.cn>
> Sent: Tuesday, September 22, 2026 12:09 PM
> To: netdev@vger.kernel.org
> Cc: jiawenwu@trustnetic.com; mengyuanlou@net-swift.com;
> andrew+netdev@lunn.ch; davem@davemloft.net; edumazet@google.com;
> kuba@kernel.org; pabeni@redhat.com; Loktionov, Aleksandr
> <aleksandr.loktionov@intel.com>; leitao@debian.org;
> weirongguang@kylinos.cn; u.kleine-koenig@baylibre.com; linux-
> kernel@vger.kernel.org; stable@vger.kernel.org
> Subject: [PATCH net v2 2/2] net: ngbe: clear DRV_LOAD bit when
> ngbe_open() fails
>
> ngbe_open() sets the WX_CFG_PORT_CTL_DRV_LOAD bit via
> wx_control_hw(wx, true) to tell the management firmware that the host
> driver has taken over the port (NCSI/OOB firmware stops using its
> management channel). Every error path of ngbe_open() returns without
> clearing it, leaving rings, IRQs and the PHY torn down while the
> firmware still believes the host owns the port, an inconsistent
> driver-firmware handshake state that persists until the next
> successful ifup.
>
> Roll the bit back on all open error paths, matching ngbe_close() and
> ngbe_dev_shutdown(), which already clear it.
>
> Fixes: e7956139a6cf ("net: ngbe: Add irqs request flow")
> Cc: stable@vger.kernel.org
> Signed-off-by: Zhang Yunfei <zhangyunfei1@kylinos.cn>
> ---
> drivers/net/ethernet/wangxun/ngbe/ngbe_main.c | 4 +++-
> 1 file changed, 3 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/net/ethernet/wangxun/ngbe/ngbe_main.c
> b/drivers/net/ethernet/wangxun/ngbe/ngbe_main.c
> index e8cabcc84a41..7e2cc69fe8f8 100644
> --- a/drivers/net/ethernet/wangxun/ngbe/ngbe_main.c
> +++ b/drivers/net/ethernet/wangxun/ngbe/ngbe_main.c
> @@ -494,7 +494,7 @@ static int ngbe_open(struct net_device *netdev)
>
> err = wx_setup_resources(wx);
> if (err)
> - return err;
> + goto err_control_hw;
>
> wx_configure(wx);
>
> @@ -526,6 +526,8 @@ static int ngbe_open(struct net_device *netdev)
> err_free_resources:
> wx_free_isb_resources(wx);
> wx_free_resources(wx);
> +err_control_hw:
> + wx_control_hw(wx, false);
> return err;
> }
>
> --
> 2.25.1
Reviewed-by: Aleksandr Loktionov <aleksandr.loktionov@intel.com>
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH net v2 1/2] net: ngbe: propagate resume errors to the PM core
2026-09-22 10:08 ` [PATCH net v2 1/2] net: ngbe: propagate resume errors to the PM core Zhang Yunfei
2026-09-22 11:09 ` Loktionov, Aleksandr
@ 2026-09-22 11:35 ` Breno Leitao
2026-09-24 17:29 ` netdev-bot+sashiko
2 siblings, 0 replies; 9+ messages in thread
From: Breno Leitao @ 2026-09-22 11:35 UTC (permalink / raw)
To: Zhang Yunfei
Cc: netdev, jiawenwu, mengyuanlou, andrew+netdev, davem, edumazet,
kuba, pabeni, aleksandr.loktionov, weirongguang, u.kleine-koenig,
linux-kernel, stable
On Tue, Sep 22, 2026 at 06:08:35PM +0800, Zhang Yunfei wrote:
> ngbe_resume() declares err as u32 and unconditionally returns 0, so
> failures of wx_init_interrupt_scheme() or ngbe_open() are silently
> swallowed, and the return value of ngbe_reset_hw() is ignored
> entirely. The device stays in netif_device_detach() state with a
> broken interrupt scheme, the PM core is told the resume succeeded,
> and the netdev never appears in the networking stack again: the
> reset task also bails out early on the missing
> netif_device_present() check, so the device cannot self-heal.
>
> Fix the type to int and propagate the errors instead, making the
> whole tail of the resume path consistent with the
> pci_enable_device_mem() failure path at the top, which already
> propagates its error. If the hardware reset fails, the remaining
> resume steps cannot succeed, so return early instead of continuing
> with a broken device. A failed resume is then reported to the PM
> core, which records and logs the failure, instead of being silently
> swallowed.
>
> Fixes: 6963e463256e ("net: ngbe: add Wake on Lan support")
> Cc: stable@vger.kernel.org
> Signed-off-by: Zhang Yunfei <zhangyunfei1@kylinos.cn>
Reviewed-by: Breno Leitao <leitao@debian.org>
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH net v2 1/2] net: ngbe: propagate resume errors to the PM core
2026-09-22 10:08 ` [PATCH net v2 1/2] net: ngbe: propagate resume errors to the PM core Zhang Yunfei
2026-09-22 11:09 ` Loktionov, Aleksandr
2026-09-22 11:35 ` Breno Leitao
@ 2026-09-24 17:29 ` netdev-bot+sashiko
2 siblings, 0 replies; 9+ messages in thread
From: netdev-bot+sashiko @ 2026-09-24 17:29 UTC (permalink / raw)
To: zhangyunfei1
Cc: netdev, jiawenwu, mengyuanlou, andrew+netdev, davem, edumazet,
kuba, pabeni, aleksandr.loktionov, leitao, weirongguang,
u.kleine-koenig, linux-kernel, stable
Thank you for your contribution! Sashiko AI review found 1 potential
issue(s) to consider.
Critical: 0 · High: 1 · Medium: 0 · Low: 0
If you believe none of the issues are legitimate, please reply to each
issue of Medium severity or higher and explain why the AI is wrong.
If any of them are legitimate and you plan to respin, please let patchwork
know by including "pw-bot: cr" as a separate line at the end of your reply
(one such reply per series is enough).
- [High] The newly added early return `err = ngbe_reset_hw(wx); if (err)
return err;` in ngbe_resume()…
--
net: ngbe: propagate resume errors to the PM core
ngbe_resume() used a u32 err and always returned 0, so resume failures
were never reported. The patch changes err to int, propagates the
wx_init_interrupt_scheme()/ngbe_open() error, and adds a new early
return when ngbe_reset_hw() fails.
> diff --git a/drivers/net/ethernet/wangxun/ngbe/ngbe_main.c b/drivers/net/ethernet/wangxun/ngbe/ngbe_main.c
> index 855dc963c610c..e8cabcc84a414 100644
> --- a/drivers/net/ethernet/wangxun/ngbe/ngbe_main.c
> +++ b/drivers/net/ethernet/wangxun/ngbe/ngbe_main.c
> @@ -954,7 +954,7 @@ static int ngbe_resume(struct pci_dev *pdev)
> {
> struct net_device *netdev;
> struct wx *wx;
> - u32 err;
> + int err;
>
> wx = pci_get_drvdata(pdev);
> netdev = wx->netdev;
> @@ -968,7 +968,9 @@ static int ngbe_resume(struct pci_dev *pdev)
> pci_set_master(pdev);
> device_wakeup_disable(&pdev->dev);
>
> - ngbe_reset_hw(wx);
> + err = ngbe_reset_hw(wx);
> + if (err)
> + return err;
[Severity: High]
Can this new bail-out leave the driver state claiming resources it no
longer owns?
The suspend side calls ngbe_close() directly rather than dev_close():
drivers/net/ethernet/wangxun/ngbe/ngbe_main.c:ngbe_dev_shutdown() {
...
if (netif_running(netdev))
ngbe_close(netdev);
wx_clear_interrupt_scheme(wx);
...
}
So __LINK_STATE_START is never cleared and netif_running(netdev) stays
true, while wx_clear_interrupt_scheme() zeroes wx->num_tx_queues /
num_rx_queues / num_q_vectors, NULLs wx->tx_ring[]/rx_ring[] in
wx_free_q_vector(), and calls pci_free_irq_vectors() so
pdev->msix_enabled and msi_enabled become false.
Returning here skips wx_init_interrupt_scheme(), so none of that is
rebuilt. ngbe_close()'s only idempotency guard is WX_STATE_RES_FREED,
and that bit is set only by ngbe_down_suspend() (the PCIe error
recovery path), not by ngbe_dev_shutdown():
drivers/net/ethernet/wangxun/ngbe/ngbe_main.c:ngbe_close() {
if (test_bit(WX_STATE_RES_FREED, wx->state))
goto out;
wx_ptp_stop(wx);
ngbe_down(wx);
wx_free_irq(wx);
...
}
Does that mean the next ndo_stop - "ip link set <dev> down", a second
ngbe_dev_shutdown() (netif_running() is still true), or
unregister_netdev() from ngbe_remove() on rmmod - re-runs the full
teardown on already-freed state and hits the unbalanced free_irq()
here?
drivers/net/ethernet/wangxun/libwx/wx_lib.c:wx_free_irq() {
...
if (!(pdev->msix_enabled)) {
if (!wx->misc_irq_domain)
free_irq(pdev->irq, wx);
return;
}
...
}
With msix_enabled false and wx->misc_irq_domain never set on ngbe (only
txgbe sets it), free_irq(pdev->irq, wx) is issued for an IRQ that has no
registered action, which gives the "Trying to free already-free IRQ"
WARN, or a panic with panic_on_warn.
Separately, ngbe_set_ringparam() is gated on netif_running() only, not
netif_device_present():
drivers/net/ethernet/wangxun/ngbe/ngbe_ethtool.c:ngbe_set_ringparam() {
...
if (!netif_running(wx->netdev)) {
...
}
After the failed resume it takes the "running" branch and drives
ngbe_down()/ngbe_up() with zero q_vectors and no IRQ vectors, and
ngbe_up_complete() clears WX_STATE_DOWN and restarts the tx queues of a
detached netdev whose tx_ring[] entries are NULL and whose
wx->num_tx_queues is 0, which wx_xmit_frame() then uses in
r_idx % wx->num_tx_queues.
Would it be better to leave a consistent representation before
returning, for example mirroring ngbe_down_suspend() by setting
WX_STATE_RES_FREED, or keeping the interrupt scheme initialised, or
marking the interface down, so the second close is a no-op?
ngbe_reset_hw() can fail through wx_stop_adapter() ->
wx_disable_pcie_master() returning -ETIMEDOUT, or through the
read_poll_timeout() on 0x10028, so this is reachable on a hardware or
timing fault and the follow-up ifdown/rmmod is an ordinary operation
once the NIC looks dead.
The same double-teardown hazard already exists on the pre-existing
wx_init_interrupt_scheme()/ngbe_open() failure paths below, but this
patch adds a new route into it. The only follow-up patch found, "net:
ngbe: clear DRV_LOAD bit when ngbe_open() fails", touches ngbe_open()
only and leaves ngbe_resume() unchanged.
> rtnl_lock();
> err = wx_init_interrupt_scheme(wx);
> if (!err && netif_running(netdev))
[ ... ]
--
Sashiko AI review · https://netdev-ai.bots.linux.dev/sashiko/#/patchset/20260922100836.1147718-1-zhangyunfei1%40kylinos.cn
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH net v2 2/2] net: ngbe: clear DRV_LOAD bit when ngbe_open() fails
[not found] <20260923104251.1514090-1-zhangyunfei1@kylinos.cn>
@ 2026-09-23 10:56 ` Zhang Yunfei
0 siblings, 0 replies; 9+ messages in thread
From: Zhang Yunfei @ 2026-09-23 10:56 UTC (permalink / raw)
To: netdev
Cc: leitao, jiawenwu, mengyuanlou, andrew+netdev, davem, edumazet,
kuba, pabeni, aleksandr.loktionov, weirongguang, u.kleine-koenig,
linux-kernel, stable
Resend with the full Cc list; the previous reply inadvertently dropped
the Cc recipients.
Hi Breno,
Not silly at all -- txgbe's approach is indeed cleaner, and you read it
right: wx_control_hw(wx, true) lives at the top of txgbe_up_complete()
(txgbe_main.c:160), so txgbe's open error paths never have to unwind
the bit.
For ngbe I kept the claim where the vendor put it (top of ngbe_open())
and added the missing rollback, because moving the claim into
ngbe_up_complete() changes the driver-firmware handshake timing: the
whole setup/configure window would then run while the NCSI/OOB
firmware still believes it owns the port. Whether ngbe's management
firmware tolerates that window is a firmware-contract question I
cannot answer from the code alone (txgbe is a different product line),
so Jiawen/Mengyuan are better placed to judge it. Deferring the claim
into ngbe_up_complete() would look like the cleaner long-term shape;
this patch only closes the existing inconsistency.
Thanks for the suggestion!
Zhang Yunfei
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2026-09-24 17:29 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-09-22 10:08 [PATCH net v2 0/2] net: ngbe: fix error handling in resume and open paths Zhang Yunfei
2026-09-22 10:08 ` [PATCH net v2 1/2] net: ngbe: propagate resume errors to the PM core Zhang Yunfei
2026-09-22 11:09 ` Loktionov, Aleksandr
2026-09-22 11:35 ` Breno Leitao
2026-09-24 17:29 ` netdev-bot+sashiko
2026-09-22 10:08 ` [PATCH net v2 2/2] net: ngbe: clear DRV_LOAD bit when ngbe_open() fails Zhang Yunfei
2026-09-22 10:58 ` Breno Leitao
2026-09-22 11:10 ` Loktionov, Aleksandr
[not found] <20260923104251.1514090-1-zhangyunfei1@kylinos.cn>
2026-09-23 10:56 ` Zhang Yunfei
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®