[PATCH net-next 7/7] bnge: Process async events while administratively down

From: Bhargava Marreddy

Date: Tue Sep 01 2026 - 15:20:10 EST


Restructure bnge_sp_task() to skip only periodic stats via goto when the
interface is down, allowing it to fall through to async event handling.
Previously, clearing BNGE_STATE_OPEN caused an early return that dropped all
async events while down.

Additionally, add a netif_running() early return to bnge_report_link() to avoid
updating carrier state or printing link messages while closed, while still
updating bd->link_info safely in the background.

Signed-off-by: Bhargava Marreddy <bhargava.marreddy@xxxxxxxxxxxx>
Reviewed-by: Rajashekar Hudumula <rajashekar.hudumula@xxxxxxxxxxxx>
Reviewed-by: Dharmender Garg <dharmender.garg@xxxxxxxxxxxx>
---
drivers/net/ethernet/broadcom/bnge/bnge_link.c | 3 +++
drivers/net/ethernet/broadcom/bnge/bnge_netdev.c | 7 +++----
2 files changed, 6 insertions(+), 4 deletions(-)

diff --git a/drivers/net/ethernet/broadcom/bnge/bnge_link.c b/drivers/net/ethernet/broadcom/bnge/bnge_link.c
index 3b0dfcf27376..31e2ede2e537 100644
--- a/drivers/net/ethernet/broadcom/bnge/bnge_link.c
+++ b/drivers/net/ethernet/broadcom/bnge/bnge_link.c
@@ -402,6 +402,9 @@ static char *bnge_report_fec(struct bnge_link_info *link_info)

void bnge_report_link(struct bnge_dev *bd)
{
+ if (!netif_running(bd->netdev))
+ return;
+
if (BNGE_LINK_IS_UP(bd)) {
const char *signal = "";
const char *flow_ctrl;
diff --git a/drivers/net/ethernet/broadcom/bnge/bnge_netdev.c b/drivers/net/ethernet/broadcom/bnge/bnge_netdev.c
index d11c404acd4e..49e27cbc6394 100644
--- a/drivers/net/ethernet/broadcom/bnge/bnge_netdev.c
+++ b/drivers/net/ethernet/broadcom/bnge/bnge_netdev.c
@@ -394,10 +394,8 @@ static void bnge_sp_task(struct work_struct *work)
struct bnge_dev *bd = bn->bd;

netdev_lock(bn->netdev);
- if (!test_bit(BNGE_STATE_OPEN, &bd->state)) {
- netdev_unlock(bn->netdev);
- return;
- }
+ if (!test_bit(BNGE_STATE_OPEN, &bd->state))
+ goto async_evt;

if (test_and_clear_bit(BNGE_PERIODIC_STATS_SP_EVENT, &bn->sp_event)) {
bnge_hwrm_port_qstats(bd, 0);
@@ -405,6 +403,7 @@ static void bnge_sp_task(struct work_struct *work)
bnge_accumulate_all_stats(bd);
}

+async_evt:
if (test_and_clear_bit(BNGE_UPDATE_PHY_SP_EVENT, &bn->sp_event)) {
int rc;

--
2.47.3