summaryrefslogtreecommitdiffstats
path: root/sys/dev/ata/ata-sata.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/ata/ata-sata.c')
-rw-r--r--sys/dev/ata/ata-sata.c21
1 files changed, 17 insertions, 4 deletions
diff --git a/sys/dev/ata/ata-sata.c b/sys/dev/ata/ata-sata.c
index 465e4b2..931c60e 100644
--- a/sys/dev/ata/ata-sata.c
+++ b/sys/dev/ata/ata-sata.c
@@ -152,8 +152,12 @@ int
ata_sata_phy_reset(device_t dev, int port, int quick)
{
struct ata_channel *ch = device_get_softc(dev);
- int loop, retry;
- uint32_t val;
+ int loop, retry, sata_rev;
+ uint32_t val, val1;
+
+ sata_rev = ch->user[port < 0 ? 0 : port].revision;
+ if (sata_rev > 0)
+ quick = 0;
if (quick) {
if (ata_sata_scr_read(ch, port, ATA_SCONTROL, &val))
@@ -173,9 +177,18 @@ ata_sata_phy_reset(device_t dev, int port, int quick)
device_printf(dev, "p%d: hard reset ...\n", port);
}
}
+ if (sata_rev == 1)
+ val1 = ATA_SC_SPD_SPEED_GEN1;
+ else if (sata_rev == 2)
+ val1 = ATA_SC_SPD_SPEED_GEN2;
+ else if (sata_rev == 3)
+ val1 = ATA_SC_SPD_SPEED_GEN3;
+ else
+ val1 = 0;
for (retry = 0; retry < 10; retry++) {
for (loop = 0; loop < 10; loop++) {
- if (ata_sata_scr_write(ch, port, ATA_SCONTROL, ATA_SC_DET_RESET))
+ if (ata_sata_scr_write(ch, port, ATA_SCONTROL, ATA_SC_DET_RESET |
+ val1 | ATA_SC_IPM_DIS_PARTIAL | ATA_SC_IPM_DIS_SLUMBER))
goto fail;
ata_udelay(100);
if (ata_sata_scr_read(ch, port, ATA_SCONTROL, &val))
@@ -186,7 +199,7 @@ ata_sata_phy_reset(device_t dev, int port, int quick)
ata_udelay(5000);
for (loop = 0; loop < 10; loop++) {
if (ata_sata_scr_write(ch, port, ATA_SCONTROL,
- ATA_SC_DET_IDLE | ((ch->pm_level > 0) ? 0 :
+ ATA_SC_DET_IDLE | val1 | ((ch->pm_level > 0) ? 0 :
ATA_SC_IPM_DIS_PARTIAL | ATA_SC_IPM_DIS_SLUMBER)))
goto fail;
ata_udelay(100);
OpenPOWER on IntegriCloud