Skip to content

Commit 69f2c93

Browse files
author
Damien Le Moal
committed
ata: libata: Fix sata_down_spd_limit() when no link speed is reported
Commit 2dc0b46 ("libata: sata_down_spd_limit should return if driver has not recorded sstatus speed") changed the behavior of sata_down_spd_limit() to return doing nothing if a drive does not report a current link speed, to avoid reducing the link speed to the lowest 1.5 Gbps speed. However, the change assumed that a speed was recorded before probing (e.g. before a suspend/resume) and set in link->sata_spd. This causes problems with adapters/drives combination failing to establish a link speed during probe autonegotiation. One example reported of this problem is an mvebu adapter with a 3Gbps port-multiplier box: autonegotiation fails, leaving no recorded link speed and no reported current link speed. Probe retries also fail as no action is taken by sata_set_spd() after each retry. Fix this by returning early in sata_down_spd_limit() only if we do have a recorded link speed, that is, if link->sata_spd is not 0. With this fix, a failed probe not leading to a recorded link speed is retried at the lower 1.5 Gbps speed, with the link speed potentially increased later on the second revalidate of the device if the device reports that it supports higher link speeds. Reported-by: Marius Dinu <[email protected]> Fixes: 2dc0b46 ("libata: sata_down_spd_limit should return if driver has not recorded sstatus speed") Reviewed-by: Niklas Cassel <[email protected]> Tested-by: Marius Dinu <[email protected]> Signed-off-by: Damien Le Moal <[email protected]>
1 parent 22eebaa commit 69f2c93

File tree

1 file changed

+1
-1
lines changed

1 file changed

+1
-1
lines changed

drivers/ata/libata-core.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3109,7 +3109,7 @@ int sata_down_spd_limit(struct ata_link *link, u32 spd_limit)
31093109
*/
31103110
if (spd > 1)
31113111
mask &= (1 << (spd - 1)) - 1;
3112-
else
3112+
else if (link->sata_spd)
31133113
return -EINVAL;
31143114

31153115
/* were we already at the bottom? */

0 commit comments

Comments
 (0)