mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 02:32:09 -04:00
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 <[email protected]> Signed-off-by: Tejun Heo <[email protected]> Cc: [email protected]
This commit is contained in:
parent
8393b811f3
commit
09c5b4803a
3 changed files with 26 additions and 1 deletions
|
|
@ -6766,8 +6766,21 @@ u32 ata_wait_register(struct ata_port *ap, void __iomem *reg, u32 mask, u32 val,
|
|||
*/
|
||||
bool sata_lpm_ignore_phy_events(struct ata_link *link)
|
||||
{
|
||||
unsigned long lpm_timeout = link->last_lpm_change +
|
||||
msecs_to_jiffies(ATA_TMOUT_SPURIOUS_PHY);
|
||||
|
||||
/* if LPM is enabled, PHYRDY doesn't mean anything */
|
||||
return !!(link->lpm_policy > ATA_LPM_MAX_POWER);
|
||||
if (link->lpm_policy > ATA_LPM_MAX_POWER)
|
||||
return true;
|
||||
|
||||
/* ignore the first PHY event after the LPM policy changed
|
||||
* as it is might be spurious
|
||||
*/
|
||||
if ((link->flags & ATA_LFLAG_CHANGED) &&
|
||||
time_before(jiffies, lpm_timeout))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(sata_lpm_ignore_phy_events);
|
||||
|
||||
|
|
|
|||
|
|
@ -3597,6 +3597,9 @@ static int ata_eh_set_lpm(struct ata_link *link, enum ata_lpm_policy policy,
|
|||
}
|
||||
}
|
||||
|
||||
link->last_lpm_change = jiffies;
|
||||
link->flags |= ATA_LFLAG_CHANGED;
|
||||
|
||||
return 0;
|
||||
|
||||
fail:
|
||||
|
|
|
|||
Loading…
Reference in a new issue