diff options
Diffstat (limited to 'drivers/ata/libata-sata.c')
| -rw-r--r-- | drivers/ata/libata-sata.c | 19 | 
1 files changed, 16 insertions, 3 deletions
diff --git a/drivers/ata/libata-sata.c b/drivers/ata/libata-sata.c index 5d31c08be013..a701e1538482 100644 --- a/drivers/ata/libata-sata.c +++ b/drivers/ata/libata-sata.c @@ -396,10 +396,23 @@ int sata_link_scr_lpm(struct ata_link *link, enum ata_lpm_policy policy,  	case ATA_LPM_MED_POWER_WITH_DIPM:  	case ATA_LPM_MIN_POWER_WITH_PARTIAL:  	case ATA_LPM_MIN_POWER: -		if (ata_link_nr_enabled(link) > 0) -			/* no restrictions on LPM transitions */ +		if (ata_link_nr_enabled(link) > 0) { +			/* assume no restrictions on LPM transitions */  			scontrol &= ~(0x7 << 8); -		else { + +			/* +			 * If the controller does not support partial, slumber, +			 * or devsleep, then disallow these transitions. +			 */ +			if (link->ap->host->flags & ATA_HOST_NO_PART) +				scontrol |= (0x1 << 8); + +			if (link->ap->host->flags & ATA_HOST_NO_SSC) +				scontrol |= (0x2 << 8); + +			if (link->ap->host->flags & ATA_HOST_NO_DEVSLP) +				scontrol |= (0x4 << 8); +		} else {  			/* empty port, power off */  			scontrol &= ~0xf;  			scontrol |= (0x1 << 2);  | 
