|
@@ -2107,7 +2107,7 @@ static void ahci_set_aggressive_devslp(struct ata_port *ap, bool sleep)
|
|
|
struct ahci_host_priv *hpriv = ap->host->private_data;
|
|
|
void __iomem *port_mmio = ahci_port_base(ap);
|
|
|
struct ata_device *dev = ap->link.device;
|
|
|
- u32 devslp, dm, dito, mdat, deto;
|
|
|
+ u32 devslp, dm, dito, mdat, deto, dito_conf;
|
|
|
int rc;
|
|
|
unsigned int err_mask;
|
|
|
|
|
@@ -2131,8 +2131,15 @@ static void ahci_set_aggressive_devslp(struct ata_port *ap, bool sleep)
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- /* device sleep was already enabled */
|
|
|
- if (devslp & PORT_DEVSLP_ADSE)
|
|
|
+ dm = (devslp & PORT_DEVSLP_DM_MASK) >> PORT_DEVSLP_DM_OFFSET;
|
|
|
+ dito = devslp_idle_timeout / (dm + 1);
|
|
|
+ if (dito > 0x3ff)
|
|
|
+ dito = 0x3ff;
|
|
|
+
|
|
|
+ dito_conf = (devslp >> PORT_DEVSLP_DITO_OFFSET) & 0x3FF;
|
|
|
+
|
|
|
+ /* device sleep was already enabled and same dito */
|
|
|
+ if ((devslp & PORT_DEVSLP_ADSE) && (dito_conf == dito))
|
|
|
return;
|
|
|
|
|
|
/* set DITO, MDAT, DETO and enable DevSlp, need to stop engine first */
|
|
@@ -2140,11 +2147,6 @@ static void ahci_set_aggressive_devslp(struct ata_port *ap, bool sleep)
|
|
|
if (rc)
|
|
|
return;
|
|
|
|
|
|
- dm = (devslp & PORT_DEVSLP_DM_MASK) >> PORT_DEVSLP_DM_OFFSET;
|
|
|
- dito = devslp_idle_timeout / (dm + 1);
|
|
|
- if (dito > 0x3ff)
|
|
|
- dito = 0x3ff;
|
|
|
-
|
|
|
/* Use the nominal value 10 ms if the read MDAT is zero,
|
|
|
* the nominal value of DETO is 20 ms.
|
|
|
*/
|