Commit dbbec8c5 authored by Russell King (Oracle)'s avatar Russell King (Oracle) Committed by Jakub Kicinski
Browse files

net: stmmac: fix stm32 (and potentially others) resume regression

Marek reported that suspending stm32 causes the following errors when
the interface is administratively down:

	$ echo devices > /sys/power/pm_test
	$ echo mem > /sys/power/state
	...
	ck_ker_eth2stp already disabled
	...
	ck_ker_eth2stp already unprepared
	...

On suspend, stm32 starts the eth2stp clock in its suspend method, and
stops it in the resume method. This is because the blamed commit omits
the call to the platform glue ->suspend() method, but does make the
call to the platform glue ->resume() method.

This problem affects all other converted drivers as well - e.g. looking
at the PCIe drivers, pci_save_state() will not be called, but
pci_restore_state() will be. Similar issues affect all other drivers.

Fix this by always calling the ->suspend() method, even when the network
interface is down. This fixes all the conversions to the platform glue
->suspend() and ->resume() methods.

Link: https://lore.kernel.org/r/20260114081809.12758-1-marex@nabladev.com


Fixes: 07bbbfe7 ("net: stmmac: add suspend()/resume() platform ops")
Reported-by: default avatarMarek Vasut <marex@nabladev.com>
Tested-by: default avatarMarek Vasut <marex@nabladev.com>
Signed-off-by: default avatarRussell King (Oracle) <rmk+kernel@armlinux.org.uk>
Link: https://patch.msgid.link/E1vlujh-00000007Hkw-2p6r@rmk-PC.armlinux.org.uk


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 1c172feb
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -8042,7 +8042,7 @@ int stmmac_suspend(struct device *dev)
	u32 chan;

	if (!ndev || !netif_running(ndev))
		return 0;
		goto suspend_bsp;

	mutex_lock(&priv->lock);

@@ -8082,6 +8082,7 @@ int stmmac_suspend(struct device *dev)
	if (stmmac_fpe_supported(priv))
		ethtool_mmsv_stop(&priv->fpe_cfg.mmsv);

suspend_bsp:
	if (priv->plat->suspend)
		return priv->plat->suspend(dev, priv->plat->bsp_priv);