Revision 1758bde2e4aa5ff188d53e7d9d388bbb7e12eebb authored by Lukas Wunner on 28 June 2022, 10:15:08 UTC, committed by Jakub Kicinski on 30 June 2022, 03:38:52 UTC
Upon system sleep, mdio_bus_phy_suspend() stops the phy_state_machine(),
but subsequent interrupts may retrigger it:

They may have been left enabled to facilitate wakeup and are not
quiesced until the ->suspend_noirq() phase.  Unwanted interrupts may
hence occur between mdio_bus_phy_suspend() and dpm_suspend_noirq(),
as well as between dpm_resume_noirq() and mdio_bus_phy_resume().

Retriggering the phy_state_machine() through an interrupt is not only
undesirable for the reason given in mdio_bus_phy_suspend() (freezing it
midway with phydev->lock held), but also because the PHY may be
inaccessible after it's suspended:  Accesses to USB-attached PHYs are
blocked once usb_suspend_both() clears the can_submit flag and PHYs on
PCI network cards may become inaccessible upon suspend as well.

Amend phy_interrupt() to avoid triggering the state machine if the PHY
is suspended.  Signal wakeup instead if the attached net_device or its
parent has been configured as a wakeup source.  (Those conditions are
identical to mdio_bus_phy_may_suspend().)  Postpone handling of the
interrupt until the PHY has resumed.

Before stopping the phy_state_machine() in mdio_bus_phy_suspend(),
wait for a concurrent phy_interrupt() to run to completion.  That is
necessary because phy_interrupt() may have checked the PHY's suspend
status before the system sleep transition commenced and it may thus
retrigger the state machine after it was stopped.

Likewise, after re-enabling interrupt handling in mdio_bus_phy_resume(),
wait for a concurrent phy_interrupt() to complete to ensure that
interrupts which it postponed are properly rerun.

The issue was exposed by commit 1ce8b37241ed ("usbnet: smsc95xx: Forward
PHY interrupts to PHY driver to avoid polling"), but has existed since
forever.

Fixes: 541cd3ee00a4 ("phylib: Fix deadlock on resume")
Link: https://lore.kernel.org/netdev/a5315a8a-32c2-962f-f696-de9a26d30091@samsung.com/
Reported-by: Marek Szyprowski <m.szyprowski@samsung.com>
Tested-by: Marek Szyprowski <m.szyprowski@samsung.com>
Signed-off-by: Lukas Wunner <lukas@wunner.de>
Acked-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Cc: stable@vger.kernel.org # v2.6.33+
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Link: https://lore.kernel.org/r/b7f386d04e9b5b0e2738f0125743e30676f309ef.1656410895.git.lukas@wunner.de
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
1 parent e65af54
Raw File
Kconfig
# SPDX-License-Identifier: GPL-2.0-only
menuconfig SOUND
	tristate "Sound card support"
	depends on HAS_IOMEM
	help
	  If you have a sound card in your computer, i.e. if it can say more
	  than an occasional beep, say Y.

if SOUND

config SOUND_OSS_CORE
	bool
	default n

config SOUND_OSS_CORE_PRECLAIM
	bool "Preclaim OSS device numbers"
	depends on SOUND_OSS_CORE
	default y
	help
	  With this option enabled, the kernel will claim all OSS device
	  numbers if any OSS support (native or emulation) is enabled
	  whether the respective module is loaded or not and try to load the
	  appropriate module using sound-slot/service-* and char-major-*
	  module aliases when one of the device numbers is opened.  With
	  this option disabled, kernel will only claim actually in-use
	  device numbers and opening a missing device will generate only the
	  standard char-major-* aliases.

	  The only visible difference is use of additional module aliases
	  and whether OSS sound devices appear multiple times in
	  /proc/devices.  sound-slot/service-* module aliases are scheduled
	  to be removed (ie. PRECLAIM won't be available) and this option is
	  to make the transition easier.  This option can be overridden
	  during boot using the kernel parameter soundcore.preclaim_oss.

	  Disabling this allows alternative OSS implementations.

	  If unsure, say Y.

source "sound/oss/dmasound/Kconfig"

if !UML

menuconfig SND
	tristate "Advanced Linux Sound Architecture"
	help
	  Say 'Y' or 'M' to enable ALSA (Advanced Linux Sound Architecture),
	  the new base sound system.

	  For more information, see <http://www.alsa-project.org/>

if SND

source "sound/core/Kconfig"

source "sound/drivers/Kconfig"

source "sound/isa/Kconfig"

source "sound/pci/Kconfig"

source "sound/hda/Kconfig"

source "sound/ppc/Kconfig"

source "sound/ac97/Kconfig"

source "sound/aoa/Kconfig"

source "sound/arm/Kconfig"

source "sound/atmel/Kconfig"

source "sound/spi/Kconfig"

source "sound/mips/Kconfig"

source "sound/sh/Kconfig"

# the following will depend on the order of config.
# here assuming USB is defined before ALSA
source "sound/usb/Kconfig"

source "sound/firewire/Kconfig"

# the following will depend on the order of config.
# here assuming PCMCIA is defined before ALSA
source "sound/pcmcia/Kconfig"

source "sound/sparc/Kconfig"

source "sound/parisc/Kconfig"

source "sound/soc/Kconfig"

source "sound/x86/Kconfig"

source "sound/synth/Kconfig"

source "sound/xen/Kconfig"

source "sound/virtio/Kconfig"

endif # SND

endif # !UML

endif # SOUND

# AC97_BUS is used from both sound and ucb1400
config AC97_BUS
	tristate
	help
	  This is used to avoid config and link hard dependencies between the
	  sound subsystem and other function drivers completely unrelated to
	  sound although they're sharing the AC97 bus. Concerned drivers
	  should "select" this.
back to top