aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/ata/libata-core.c22
1 files changed, 15 insertions, 7 deletions
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c
index 49d26675932e..12717fa5e888 100644
--- a/drivers/ata/libata-core.c
+++ b/drivers/ata/libata-core.c
@@ -3338,7 +3338,11 @@ static void ata_wait_spinup(struct ata_port *ap, unsigned long deadline)
3338 * @ap: ATA port to be reset 3338 * @ap: ATA port to be reset
3339 * @deadline: deadline jiffies for the operation 3339 * @deadline: deadline jiffies for the operation
3340 * 3340 *
3341 * @ap is about to be reset. Initialize it. 3341 * @ap is about to be reset. Initialize it. Failure from
3342 * prereset makes libata abort whole reset sequence and give up
3343 * that port, so prereset should be best-effort. It does its
3344 * best to prepare for reset sequence but if things go wrong, it
3345 * should just whine, not fail.
3342 * 3346 *
3343 * LOCKING: 3347 * LOCKING:
3344 * Kernel thread context (may sleep) 3348 * Kernel thread context (may sleep)
@@ -3368,19 +3372,23 @@ int ata_std_prereset(struct ata_port *ap, unsigned long deadline)
3368 /* if SATA, resume phy */ 3372 /* if SATA, resume phy */
3369 if (ap->cbl == ATA_CBL_SATA) { 3373 if (ap->cbl == ATA_CBL_SATA) {
3370 rc = sata_phy_resume(ap, timing, deadline); 3374 rc = sata_phy_resume(ap, timing, deadline);
3371 if (rc && rc != -EOPNOTSUPP) { 3375 /* whine about phy resume failure but proceed */
3372 /* phy resume failed */ 3376 if (rc && rc != -EOPNOTSUPP)
3373 ata_port_printk(ap, KERN_WARNING, "failed to resume " 3377 ata_port_printk(ap, KERN_WARNING, "failed to resume "
3374 "link for reset (errno=%d)\n", rc); 3378 "link for reset (errno=%d)\n", rc);
3375 return rc;
3376 }
3377 } 3379 }
3378 3380
3379 /* Wait for !BSY if the controller can wait for the first D2H 3381 /* Wait for !BSY if the controller can wait for the first D2H
3380 * Reg FIS and we don't know that no device is attached. 3382 * Reg FIS and we don't know that no device is attached.
3381 */ 3383 */
3382 if (!(ap->flags & ATA_FLAG_SKIP_D2H_BSY) && !ata_port_offline(ap)) 3384 if (!(ap->flags & ATA_FLAG_SKIP_D2H_BSY) && !ata_port_offline(ap)) {
3383 ata_wait_ready(ap, deadline); 3385 rc = ata_wait_ready(ap, deadline);
3386 if (rc) {
3387 ata_port_printk(ap, KERN_WARNING, "device not ready "
3388 "(errno=%d), forcing hardreset\n", rc);
3389 ehc->i.action |= ATA_EH_HARDRESET;
3390 }
3391 }
3384 3392
3385 return 0; 3393 return 0;
3386} 3394}