提交 8e6741d8 编写于 作者: L LeoLiu-oc 提交者: leoliuoc

Add support for PxSCT.LPM set based on actual LPM circumstances

zhaoxin inclusion
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/I54V2K
CVE: NA

----------------------------------------------------------------

AHCI Spec shows that the PxSCTL.IPM field in each port must be programmed
to disallow device initiated LPM requests when HBA can not support
transitions to the LPM state. The current LPM driver has no restrictions
on LPM transitions when enabling device initiated LPM.
Signed-off-by: NLeoLiu-oc <LeoLiu-oc@zhaoxin.com>
上级 7bf39571
...@@ -3975,6 +3975,9 @@ int sata_link_scr_lpm(struct ata_link *link, enum ata_lpm_policy policy, ...@@ -3975,6 +3975,9 @@ int sata_link_scr_lpm(struct ata_link *link, enum ata_lpm_policy policy,
bool spm_wakeup) bool spm_wakeup)
{ {
struct ata_eh_context *ehc = &link->eh_context; struct ata_eh_context *ehc = &link->eh_context;
struct ata_port *ap = ata_is_host_link(link) ? link->ap : NULL;
struct device *dev = ap ? ap->host->dev : NULL;
struct pci_dev *pdev = (!dev || !dev_is_pci(dev)) ? NULL : to_pci_dev(dev);
bool woken_up = false; bool woken_up = false;
u32 scontrol; u32 scontrol;
int rc; int rc;
...@@ -4001,10 +4004,20 @@ int sata_link_scr_lpm(struct ata_link *link, enum ata_lpm_policy policy, ...@@ -4001,10 +4004,20 @@ int sata_link_scr_lpm(struct ata_link *link, enum ata_lpm_policy policy,
case ATA_LPM_MED_POWER_WITH_DIPM: case ATA_LPM_MED_POWER_WITH_DIPM:
case ATA_LPM_MIN_POWER_WITH_PARTIAL: case ATA_LPM_MIN_POWER_WITH_PARTIAL:
case ATA_LPM_MIN_POWER: case ATA_LPM_MIN_POWER:
if (ata_link_nr_enabled(link) > 0) if (ata_link_nr_enabled(link) > 0) {
/* no restrictions on LPM transitions */ /* no restrictions on LPM transitions */
scontrol &= ~(0x7 << 8); scontrol &= ~(0x7 << 8);
else { /*
* If Host does not support partial, then disallows it,
* the same for slumber.
*/
if (pdev && pdev->vendor == PCI_VENDOR_ID_ZHAOXIN) {
if (!(link->ap->host->flags & ATA_HOST_PART))
scontrol |= (0x1 << 8);
if (!(link->ap->host->flags & ATA_HOST_SSC))
scontrol |= (0x2 << 8);
}
} else {
/* empty port, power off */ /* empty port, power off */
scontrol &= ~0xf; scontrol &= ~0xf;
scontrol |= (0x1 << 2); scontrol |= (0x1 << 2);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册