]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
ata: ahci: Disallow LPM policy control if not supported
authorDamien Le Moal <dlemoal@kernel.org>
Tue, 1 Jul 2025 12:53:19 +0000 (21:53 +0900)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 20 Aug 2025 16:40:55 +0000 (18:40 +0200)
[ Upstream commit 65b2c92f69d3df81422d27e5be012e357e733241 ]

Commit fa997b0576c9 ("ata: ahci: Do not enable LPM if no LPM states are
supported by the HBA") introduced an early return in
ahci_update_initial_lpm_policy() to ensure that the target_lpm_policy
of ports belonging to a host that does not support the Partial, Slumber
and DevSleep power states is unchanged and remains set to
ATA_LPM_UNKNOWN and thus prevents the execution of
ata_eh_link_set_lpm().

However, a user or a system daemon (e.g. systemd-udevd) may still
attempt changing the LPM policy through the sysfs
link_power_management_policy of the host.

Improve this to prevent sysfs LPM policy changes by setting the flag
ATA_FLAG_NO_LPM for the port of such host, and initialize the port
target_lpm_policy to ATA_LPM_MAX_POWER to guarantee that no unsupported
low power state is being used on the port and its link.

Signed-off-by: Damien Le Moal <dlemoal@kernel.org>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Reviewed-by: Niklas Cassel <cassel@kernel.org>
Link: https://lore.kernel.org/r/20250701125321.69496-9-dlemoal@kernel.org
Signed-off-by: Niklas Cassel <cassel@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/ata/ahci.c

index aa93b0ecbbc692cdbf1d4a2025c354df769066da..04c9b601cac14e516eefa493f5ab77f2b0e4ac4f 100644 (file)
@@ -1782,7 +1782,10 @@ static void ahci_update_initial_lpm_policy(struct ata_port *ap)
        if ((ap->host->flags & ATA_HOST_NO_PART) &&
            (ap->host->flags & ATA_HOST_NO_SSC) &&
            (ap->host->flags & ATA_HOST_NO_DEVSLP)) {
-               ata_port_dbg(ap, "no LPM states supported, not enabling LPM\n");
+               ata_port_dbg(ap,
+                       "No LPM states supported, forcing LPM max_power\n");
+               ap->flags |= ATA_FLAG_NO_LPM;
+               ap->target_lpm_policy = ATA_LPM_MAX_POWER;
                return;
        }