As the default low power policy applies to more chipsets and drives, it's important to make sure that drives actually support the policy that a user selected in their kernel configuration. If the drive doesn't support slumber, don't let the default policies dependent upon slumber (`min_power` or `min_power_with_partial`) affect the disk. Signed-off-by: Mario Limonciello <mario.limonciello@xxxxxxx> --- Changes from v1->v2: * Move deeper into codepaths * Reset to MED_POWER rather than ignore drivers/ata/libata-sata.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/drivers/ata/libata-sata.c b/drivers/ata/libata-sata.c index 071158c0c44c..0dc03888c62b 100644 --- a/drivers/ata/libata-sata.c +++ b/drivers/ata/libata-sata.c @@ -13,6 +13,7 @@ #include <scsi/scsi_device.h> #include <linux/libata.h> +#include "ahci.h" #include "libata.h" #include "libata-transport.h" @@ -368,10 +369,20 @@ int sata_link_scr_lpm(struct ata_link *link, enum ata_lpm_policy policy, bool spm_wakeup) { struct ata_eh_context *ehc = &link->eh_context; + struct ata_port *ap = link->ap; + struct ahci_host_priv *hpriv; bool woken_up = false; u32 scontrol; int rc; + hpriv = ap->host->private_data; + if (policy >= ATA_LPM_MIN_POWER_WITH_PARTIAL && + !(hpriv->cap & HOST_CAP_SSC)) { + dev_warn(ap->host->dev, + "This drive doesn't support slumber; restting policy to MED_POWER\n"); + policy = ATA_LPM_MED_POWER; + } + rc = sata_scr_read(link, SCR_CONTROL, &scontrol); if (rc) return rc; -- 2.34.1