diff options
author | Gabriele Mazzotta <gabriele.mzt@gmail.com> | 2015-04-25 13:52:37 -0400 |
---|---|---|
committer | Tejun Heo <tj@kernel.org> | 2015-04-25 16:50:14 -0400 |
commit | 09c5b4803a80a5451d950d6a539d2eb311dc0fb1 (patch) | |
tree | 3c705a3de60c8c2fe76ee8dd8d13d6e8676bce10 /drivers/ata | |
parent | 8393b811f38acdf7fd8da2028708edad3e68ce1f (diff) |
libata: Ignore spurious PHY event on LPM policy change
When the LPM policy is set to ATA_LPM_MAX_POWER, the device might
generate a spurious PHY event that cuases errors on the link.
Ignore this event if it occured within 10s after the policy change.
The timeout was chosen observing that on a Dell XPS13 9333 these
spurious events can occur up to roughly 6s after the policy change.
Link: http://lkml.kernel.org/g/3352987.ugV1Ipy7Z5@xps13
Signed-off-by: Gabriele Mazzotta <gabriele.mzt@gmail.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
Cc: stable@vger.kernel.org
Diffstat (limited to 'drivers/ata')
-rw-r--r-- | drivers/ata/libata-core.c | 15 | ||||
-rw-r--r-- | drivers/ata/libata-eh.c | 3 |
2 files changed, 17 insertions, 1 deletions
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index 12adcf78f94b..85e659945c12 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c | |||
@@ -6766,8 +6766,21 @@ u32 ata_wait_register(struct ata_port *ap, void __iomem *reg, u32 mask, u32 val, | |||
6766 | */ | 6766 | */ |
6767 | bool sata_lpm_ignore_phy_events(struct ata_link *link) | 6767 | bool sata_lpm_ignore_phy_events(struct ata_link *link) |
6768 | { | 6768 | { |
6769 | unsigned long lpm_timeout = link->last_lpm_change + | ||
6770 | msecs_to_jiffies(ATA_TMOUT_SPURIOUS_PHY); | ||
6771 | |||
6769 | /* if LPM is enabled, PHYRDY doesn't mean anything */ | 6772 | /* if LPM is enabled, PHYRDY doesn't mean anything */ |
6770 | return !!(link->lpm_policy > ATA_LPM_MAX_POWER); | 6773 | if (link->lpm_policy > ATA_LPM_MAX_POWER) |
6774 | return true; | ||
6775 | |||
6776 | /* ignore the first PHY event after the LPM policy changed | ||
6777 | * as it is might be spurious | ||
6778 | */ | ||
6779 | if ((link->flags & ATA_LFLAG_CHANGED) && | ||
6780 | time_before(jiffies, lpm_timeout)) | ||
6781 | return true; | ||
6782 | |||
6783 | return false; | ||
6771 | } | 6784 | } |
6772 | EXPORT_SYMBOL_GPL(sata_lpm_ignore_phy_events); | 6785 | EXPORT_SYMBOL_GPL(sata_lpm_ignore_phy_events); |
6773 | 6786 | ||
diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c index 07f41be38fbe..cf0022ec07f2 100644 --- a/drivers/ata/libata-eh.c +++ b/drivers/ata/libata-eh.c | |||
@@ -3597,6 +3597,9 @@ static int ata_eh_set_lpm(struct ata_link *link, enum ata_lpm_policy policy, | |||
3597 | } | 3597 | } |
3598 | } | 3598 | } |
3599 | 3599 | ||
3600 | link->last_lpm_change = jiffies; | ||
3601 | link->flags |= ATA_LFLAG_CHANGED; | ||
3602 | |||
3600 | return 0; | 3603 | return 0; |
3601 | 3604 | ||
3602 | fail: | 3605 | fail: |