|
@@ -610,9 +610,6 @@ void ata_scsi_error(struct Scsi_Host *host)
|
|
|
if (ata_ncq_enabled(dev))
|
|
|
ehc->saved_ncq_enabled |= 1 << devno;
|
|
|
}
|
|
|
-
|
|
|
- /* set last reset timestamp to some time in the past */
|
|
|
- ehc->last_reset = jiffies - 60 * HZ;
|
|
|
}
|
|
|
|
|
|
ap->pflags |= ATA_PFLAG_EH_IN_PROGRESS;
|
|
@@ -2281,17 +2278,21 @@ int ata_eh_reset(struct ata_link *link, int classify,
|
|
|
if (link->flags & ATA_LFLAG_NO_SRST)
|
|
|
softreset = NULL;
|
|
|
|
|
|
- now = jiffies;
|
|
|
- deadline = ata_deadline(ehc->last_reset, ATA_EH_RESET_COOL_DOWN);
|
|
|
- if (time_before(now, deadline))
|
|
|
- schedule_timeout_uninterruptible(deadline - now);
|
|
|
+ /* make sure each reset attemp is at least COOL_DOWN apart */
|
|
|
+ if (ehc->i.flags & ATA_EHI_DID_RESET) {
|
|
|
+ now = jiffies;
|
|
|
+ WARN_ON(time_after(ehc->last_reset, now));
|
|
|
+ deadline = ata_deadline(ehc->last_reset,
|
|
|
+ ATA_EH_RESET_COOL_DOWN);
|
|
|
+ if (time_before(now, deadline))
|
|
|
+ schedule_timeout_uninterruptible(deadline - now);
|
|
|
+ }
|
|
|
|
|
|
spin_lock_irqsave(ap->lock, flags);
|
|
|
ap->pflags |= ATA_PFLAG_RESETTING;
|
|
|
spin_unlock_irqrestore(ap->lock, flags);
|
|
|
|
|
|
ata_eh_about_to_do(link, NULL, ATA_EH_RESET);
|
|
|
- ehc->last_reset = jiffies;
|
|
|
|
|
|
ata_link_for_each_dev(dev, link) {
|
|
|
/* If we issue an SRST then an ATA drive (not ATAPI)
|
|
@@ -2379,7 +2380,6 @@ int ata_eh_reset(struct ata_link *link, int classify,
|
|
|
/*
|
|
|
* Perform reset
|
|
|
*/
|
|
|
- ehc->last_reset = jiffies;
|
|
|
if (ata_is_host_link(link))
|
|
|
ata_eh_freeze_port(ap);
|
|
|
|
|
@@ -2391,6 +2391,7 @@ int ata_eh_reset(struct ata_link *link, int classify,
|
|
|
reset == softreset ? "soft" : "hard");
|
|
|
|
|
|
/* mark that this EH session started with reset */
|
|
|
+ ehc->last_reset = jiffies;
|
|
|
if (reset == hardreset)
|
|
|
ehc->i.flags |= ATA_EHI_DID_HARDRESET;
|
|
|
else
|
|
@@ -2535,7 +2536,7 @@ int ata_eh_reset(struct ata_link *link, int classify,
|
|
|
ata_eh_done(link, NULL, ATA_EH_RESET);
|
|
|
if (slave)
|
|
|
ata_eh_done(slave, NULL, ATA_EH_RESET);
|
|
|
- ehc->last_reset = jiffies;
|
|
|
+ ehc->last_reset = jiffies; /* update to completion time */
|
|
|
ehc->i.action |= ATA_EH_REVALIDATE;
|
|
|
|
|
|
rc = 0;
|