]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
[PATCH] libata: separate out sata_phy_resume() from sata_std_hardreset()
authorTejun Heo <htejun@gmail.com>
Thu, 2 Feb 2006 09:20:00 +0000 (18:20 +0900)
committerJeff Garzik <jgarzik@pobox.com>
Thu, 9 Feb 2006 06:52:54 +0000 (01:52 -0500)
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>
drivers/scsi/libata-core.c

index d4fb0f754c916d0e1bf52c018d3c21338171b2ab..99f4bf6022ee5174c67ba80f75a29c72f3a55f5d 100644 (file)
@@ -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);