Commit 9913ff8a authored by Tejun Heo's avatar Tejun Heo Committed by Jeff Garzik

libata: check onlineness before using SPD in sata_down_spd_limit()

sata_down_spd_limit() should check whether the link is online before
using the SPD value to determine how to limit the link speed.  Factor
out onlineness test and test it from sata_down_spd_limit().
Signed-off-by: default avatarTejun Heo <tj@kernel.org>
Signed-off-by: default avatarJeff Garzik <jgarzik@redhat.com>
parent 678afac6
...@@ -164,6 +164,11 @@ MODULE_LICENSE("GPL"); ...@@ -164,6 +164,11 @@ MODULE_LICENSE("GPL");
MODULE_VERSION(DRV_VERSION); MODULE_VERSION(DRV_VERSION);
static bool ata_sstatus_online(u32 sstatus)
{
return (sstatus & 0xf) == 0x3;
}
/** /**
* ata_link_next - link iteration helper * ata_link_next - link iteration helper
* @link: the previous link, NULL to start * @link: the previous link, NULL to start
...@@ -2891,7 +2896,7 @@ int sata_down_spd_limit(struct ata_link *link) ...@@ -2891,7 +2896,7 @@ int sata_down_spd_limit(struct ata_link *link)
* If not, use cached value in link->sata_spd. * If not, use cached value in link->sata_spd.
*/ */
rc = sata_scr_read(link, SCR_STATUS, &sstatus); rc = sata_scr_read(link, SCR_STATUS, &sstatus);
if (rc == 0) if (rc == 0 && ata_sstatus_online(sstatus))
spd = (sstatus >> 4) & 0xf; spd = (sstatus >> 4) & 0xf;
else else
spd = link->sata_spd; spd = link->sata_spd;
...@@ -5162,7 +5167,7 @@ bool ata_phys_link_online(struct ata_link *link) ...@@ -5162,7 +5167,7 @@ bool ata_phys_link_online(struct ata_link *link)
u32 sstatus; u32 sstatus;
if (sata_scr_read(link, SCR_STATUS, &sstatus) == 0 && if (sata_scr_read(link, SCR_STATUS, &sstatus) == 0 &&
(sstatus & 0xf) == 0x3) ata_sstatus_online(sstatus))
return true; return true;
return false; return false;
} }
...@@ -5186,7 +5191,7 @@ bool ata_phys_link_offline(struct ata_link *link) ...@@ -5186,7 +5191,7 @@ bool ata_phys_link_offline(struct ata_link *link)
u32 sstatus; u32 sstatus;
if (sata_scr_read(link, SCR_STATUS, &sstatus) == 0 && if (sata_scr_read(link, SCR_STATUS, &sstatus) == 0 &&
(sstatus & 0xf) != 0x3) !ata_sstatus_online(sstatus))
return true; return true;
return false; return false;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment