aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/libata-core.c
diff options
context:
space:
mode:
authorTejun Heo <htejun@gmail.com>2006-02-02 04:20:00 -0500
committerJeff Garzik <jgarzik@pobox.com>2006-02-09 01:52:54 -0500
commit7a7921e8661a6b9fb99400983ee67df7e125853b (patch)
tree9ef603fe34160b539c6478cfc7a107d38f80e4c9 /drivers/scsi/libata-core.c
parentb911fc3ae0121ff0b72a52e58823c3f8ac3094d0 (diff)
[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:
2277 DPRINTK("EXIT\n"); 2277 DPRINTK("EXIT\n");
2278} 2278}
2279 2279
2280static int sata_phy_resume(struct ata_port *ap)
2281{
2282 unsigned long timeout = jiffies + (HZ * 5);
2283 u32 sstatus;
2284
2285 scr_write_flush(ap, SCR_CONTROL, 0x300);
2286
2287 /* Wait for phy to become ready, if necessary. */
2288 do {
2289 msleep(200);
2290 sstatus = scr_read(ap, SCR_STATUS);
2291 if ((sstatus & 0xf) != 1)
2292 return 0;
2293 } while (time_before(jiffies, timeout));
2294
2295 return -1;
2296}
2297
2280/** 2298/**
2281 * ata_std_softreset - reset host port via ATA SRST 2299 * ata_std_softreset - reset host port via ATA SRST
2282 * @ap: port to reset 2300 * @ap: port to reset
@@ -2357,8 +2375,7 @@ int ata_std_softreset(struct ata_port *ap, int verbose, unsigned int *classes)
2357 */ 2375 */
2358int sata_std_hardreset(struct ata_port *ap, int verbose, unsigned int *class) 2376int sata_std_hardreset(struct ata_port *ap, int verbose, unsigned int *class)
2359{ 2377{
2360 u32 sstatus, serror; 2378 u32 serror;
2361 unsigned long timeout = jiffies + (HZ * 5);
2362 2379
2363 DPRINTK("ENTER\n"); 2380 DPRINTK("ENTER\n");
2364 2381
@@ -2371,15 +2388,8 @@ int sata_std_hardreset(struct ata_port *ap, int verbose, unsigned int *class)
2371 */ 2388 */
2372 msleep(1); 2389 msleep(1);
2373 2390
2374 scr_write_flush(ap, SCR_CONTROL, 0x300); 2391 /* Bring phy back */
2375 2392 sata_phy_resume(ap);
2376 /* Wait for phy to become ready, if necessary. */
2377 do {
2378 msleep(200);
2379 sstatus = scr_read(ap, SCR_STATUS);
2380 if ((sstatus & 0xf) != 1)
2381 break;
2382 } while (time_before(jiffies, timeout));
2383 2393
2384 /* Clear SError */ 2394 /* Clear SError */
2385 serror = scr_read(ap, SCR_ERROR); 2395 serror = scr_read(ap, SCR_ERROR);