On 4/21/22 18:43, Runa Guo-oc wrote: > On some platform, when OS enables LPM by default (eg, min_power), > then, PhyRdy Change cannot be detected if ahci supports no LPM. Do you mean "...if the ahci adapter does not support LPM." ? If that is what you mean, then min_power should not be set. Mario has patches to fix that. > > In ahci spec, PhyRdy Change cannot coexist with LPM. > > Adds support to control this case on actual LPM capability. > > Signed-off-by: Runa Guo-oc <RunaGuo-oc@xxxxxxxxxxx> > --- > drivers/ata/ahci.c | 9 +++++++++ > drivers/ata/libata-eh.c | 4 ++++ > include/linux/libata.h | 4 ++++ > 3 files changed, 17 insertions(+) > > diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c > index 397dfd2..03f0cb3 100644 > --- a/drivers/ata/ahci.c > +++ b/drivers/ata/ahci.c > @@ -1870,6 +1870,15 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) > else > dev_info(&pdev->dev, "SSS flag set, parallel bus scan disabled\n"); > > + if (hpriv->cap & HOST_CAP_PART) > + host->flags |= ATA_HOST_PART; > + > + if (hpriv->cap & HOST_CAP_SSC) > + host->flags |= ATA_HOST_SSC; > + > + if (hpriv->cap2 & HOST_CAP2_SDS) > + host->flags |= ATA_HOST_DEVSLP; > + > if (pi.flags & ATA_FLAG_EM) > ahci_reset_em(host); > > diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c > index 3307ed4..05b1043 100644 > --- a/drivers/ata/libata-eh.c > +++ b/drivers/ata/libata-eh.c > @@ -3246,6 +3246,10 @@ static int ata_eh_set_lpm(struct ata_link *link, enum ata_lpm_policy policy, > unsigned int err_mask; > int rc; > > + /* if controller does not support lpm, then sets no LPM flags*/ > + if (!(ap->host->flags & (ATA_HOST_PART | ATA_HOST_SSC | ATA_HOST_DEVSLP))) > + link->flags |= ATA_LFLAG_NO_LPM; > + > /* if the link or host doesn't do LPM, noop */ > if (!IS_ENABLED(CONFIG_SATA_HOST) || > (link->flags & ATA_LFLAG_NO_LPM) || (ap && !ap->ops->set_lpm)) > diff --git a/include/linux/libata.h b/include/linux/libata.h > index 732de90..7a243f4 100644 > --- a/include/linux/libata.h > +++ b/include/linux/libata.h > @@ -216,6 +216,10 @@ enum { > ATA_HOST_PARALLEL_SCAN = (1 << 2), /* Ports on this host can be scanned in parallel */ > ATA_HOST_IGNORE_ATA = (1 << 3), /* Ignore ATA devices on this host. */ > > + ATA_HOST_PART = (1 << 4), /* Host support partial.*/ > + ATA_HOST_SSC = (1 << 5), /* Host support slumber.*/ > + ATA_HOST_DEVSLP = (1 << 6), /* Host support devslp.*/ > + > /* bits 24:31 of host->flags are reserved for LLD specific flags */ > > /* various lengths of time */ -- Damien Le Moal Western Digital Research