summaryrefslogtreecommitdiffstats
path: root/drivers/scsi/libata-core.c
diff options
context:
space:
mode:
authorTejun Heo2006-02-02 10:20:00 +0100
committerJeff Garzik2006-02-09 07:52:54 +0100
commit7a7921e8661a6b9fb99400983ee67df7e125853b (patch)
tree9ef603fe34160b539c6478cfc7a107d38f80e4c9 /drivers/scsi/libata-core.c
parent[PATCH] libata: fix ata_std_probe_reset() SATA detection (diff)
downloadkernel-qcow2-linux-7a7921e8661a6b9fb99400983ee67df7e125853b.tar.gz
kernel-qcow2-linux-7a7921e8661a6b9fb99400983ee67df7e125853b.tar.xz
kernel-qcow2-linux-7a7921e8661a6b9fb99400983ee67df7e125853b.zip
[PATCH] libata: separate out sata_phy_resume() from sata_std_hardreset()
This patch separates out sata_phy_resume() from sata_std_hardreset(). The function will later be used by probeinit callback. Signed-off-by: Tejun Heo <htejun@gmail.com> Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
Diffstat (limited to 'drivers/scsi/libata-core.c')
-rw-r--r--drivers/scsi/libata-core.c32
1 files changed, 21 insertions, 11 deletions
diff --git a/drivers/scsi/libata-core.c b/drivers/scsi/libata-core.c
index d4fb0f754c91..99f4bf6022ee 100644
--- a/drivers/scsi/libata-core.c
+++ b/drivers/scsi/libata-core.c
@@ -2277,6 +2277,24 @@ err_out:
DPRINTK("EXIT\n");
}
+static int sata_phy_resume(struct ata_port *ap)
+{
+ unsigned long timeout = jiffies + (HZ * 5);
+ u32 sstatus;
+
+ scr_write_flush(ap, SCR_CONTROL, 0x300);
+
+ /* Wait for phy to become ready, if necessary. */
+ do {
+ msleep(200);
+ sstatus = scr_read(ap, SCR_STATUS);
+ if ((sstatus & 0xf) != 1)
+ return 0;
+ } while (time_before(jiffies, timeout));
+
+ return -1;
+}
+
/**
* ata_std_softreset - reset host port via ATA SRST
* @ap: port to reset
@@ -2357,8 +2375,7 @@ int ata_std_softreset(struct ata_port *ap, int verbose, unsigned int *classes)
*/
int sata_std_hardreset(struct ata_port *ap, int verbose, unsigned int *class)
{
- u32 sstatus, serror;
- unsigned long timeout = jiffies + (HZ * 5);
+ u32 serror;
DPRINTK("ENTER\n");
@@ -2371,15 +2388,8 @@ int sata_std_hardreset(struct ata_port *ap, int verbose, unsigned int *class)
*/
msleep(1);
- scr_write_flush(ap, SCR_CONTROL, 0x300);
-
- /* Wait for phy to become ready, if necessary. */
- do {
- msleep(200);
- sstatus = scr_read(ap, SCR_STATUS);
- if ((sstatus & 0xf) != 1)
- break;
- } while (time_before(jiffies, timeout));
+ /* Bring phy back */
+ sata_phy_resume(ap);
/* Clear SError */
serror = scr_read(ap, SCR_ERROR);