libata: Add the AHCI_HFLAG_YES_ALPM flag
authorDoug Berger <opendmb@gmail.com>
Wed, 21 Jun 2017 23:20:12 +0000 (16:20 -0700)
committerTejun Heo <tj@kernel.org>
Thu, 22 Jun 2017 20:12:59 +0000 (16:12 -0400)
Some hardware is capable of supporting Aggresive Link Power Management
even though it is not indicated by the Host Capability register.

This commit adds the AHCI_HFLAG_YES_ALPM flag to the AHCI library to
allow indication of this quirk when the Host Capability register is
Read Only and therefore cannot be changed.

Signed-off-by: Doug Berger <opendmb@gmail.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
drivers/ata/ahci.h
drivers/ata/libahci.c

index 30f67a1a4f54c42d499dfeb038c24fdaef147ff3..ee176e4af97a2eb228496c557ef180ce77c30ef9 100644 (file)
@@ -248,6 +248,7 @@ enum {
        AHCI_HFLAG_MULTI_MSI            = 0,
 #endif
        AHCI_HFLAG_WAKE_BEFORE_STOP     = (1 << 22), /* wake before DMA stop */
+       AHCI_HFLAG_YES_ALPM             = (1 << 23), /* force ALPM cap on */
 
        /* ap->flags bits */
 
index b3a685ad9b87538344275804a02e592f76765d85..4462f8a8cf2c1c1edf79040ecbbe85ed61295f92 100644 (file)
@@ -504,6 +504,11 @@ void ahci_save_initial_config(struct device *dev, struct ahci_host_priv *hpriv)
                cap &= ~HOST_CAP_FBS;
        }
 
+       if (!(cap & HOST_CAP_ALPM) && (hpriv->flags & AHCI_HFLAG_YES_ALPM)) {
+               dev_info(dev, "controller can do ALPM, turning on CAP_ALPM\n");
+               cap |= HOST_CAP_ALPM;
+       }
+
        if (hpriv->force_port_map && port_map != hpriv->force_port_map) {
                dev_info(dev, "forcing port_map 0x%x -> 0x%x\n",
                         port_map, hpriv->force_port_map);