On Armada XP (non-armada3700), mvneta uses percpu interrupts where the ISR (mvneta_percpu_isr) calls disable_percpu_irq() to mask the MPIC percpu IRQ, then schedules NAPI. NAPI poll completion calls enable_percpu_irq() to unmask. If suspend occurs while NAPI is actively polling (between disable_percpu_irq in the ISR and enable_percpu_irq in napi_complete_done), the MPIC percpu interrupt remains masked. mvneta_stop_dev/mvneta_start_dev do not manage the percpu IRQ enable state -- they only control mvneta's own INTR_NEW_MASK register. After resume, the MPIC percpu IRQ stays masked permanently: the network hardware generates interrupts (INTR_NEW_CAUSE != 0) but the CPU never receives them (irq count stops incrementing), causing a complete loss of network connectivity. Fix by calling on_each_cpu(mvneta_percpu_enable) after mvneta_start_dev() in the resume path, ensuring the MPIC percpu IRQ is always unmasked regardless of the pre-suspend state. Fixes: 12bb03b436da ("net: mvneta: Handle per-cpu interrupts") Signed-off-by: Yun Zhou --- v3: - Dropped the free_irq/request_irq approach (incorrect root cause). - Instead, call on_each_cpu(mvneta_percpu_enable) in the resume path to ensure the MPIC percpu IRQ is unmasked, matching mvneta_open(). - Updated commit message with correct root cause analysis. v2: - Move request_irq before cpuhp registration in resume (matching mvneta_open ordering) so that failure does not leave cpuhp callbacks registered on a non-functional device. - On request_irq failure, call netif_device_detach() to prevent further traffic on the dead interface. drivers/net/ethernet/marvell/mvneta.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/net/ethernet/marvell/mvneta.c b/drivers/net/ethernet/marvell/mvneta.c index b4a845f04c05..5ef79e70e319 100644 --- a/drivers/net/ethernet/marvell/mvneta.c +++ b/drivers/net/ethernet/marvell/mvneta.c @@ -5907,6 +5907,9 @@ static int mvneta_resume(struct device *device) rtnl_unlock(); mvneta_set_rx_mode(dev); + if (!pp->neta_armada3700) + on_each_cpu(mvneta_percpu_enable, pp, true); + return 0; } #endif -- 2.43.0