diff options
author | Tejun Heo <htejun@gmail.com> | 2006-02-02 04:20:00 -0500 |
---|---|---|
committer | Jeff Garzik <jgarzik@pobox.com> | 2006-02-09 01:52:54 -0500 |
commit | 7a7921e8661a6b9fb99400983ee67df7e125853b (patch) | |
tree | 9ef603fe34160b539c6478cfc7a107d38f80e4c9 /drivers/scsi/libata-core.c | |
parent | b911fc3ae0121ff0b72a52e58823c3f8ac3094d0 (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.c | 32 |
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 | ||
2280 | static 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 | */ |
2358 | int sata_std_hardreset(struct ata_port *ap, int verbose, unsigned int *class) | 2376 | int 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); |