Skip to content

Commit

Permalink
libata: unify mechanism to request follow-up SRST
Browse files Browse the repository at this point in the history
Previously, there were two ways to trigger follow-up SRST from
hardreset method - returning -EAGAIN and leaving all device classes
unmodified.  Drivers never used the latter mechanism and the only use
case for the former was when hardreset couldn't classify.

Drop the latter mechanism and let -EAGAIN mean "perform follow-up SRST
if classification is required".  This change removes unnecessary
follow-up SRSTs and simplifies reset implementations.

Signed-off-by: Tejun Heo <htejun@gmail.com>
  • Loading branch information
Tejun Heo authored and Jeff Garzik committed Apr 17, 2008
1 parent 5958e30 commit 305d2a1
Show file tree
Hide file tree
Showing 4 changed files with 8 additions and 23 deletions.
3 changes: 0 additions & 3 deletions drivers/ata/ahci.c
Original file line number Diff line number Diff line change
Expand Up @@ -1365,7 +1365,6 @@ static int ahci_hardreset(struct ata_link *link, unsigned int *class,

ahci_start_engine(ap);

*class = ATA_DEV_NONE;
if (online)
*class = ahci_dev_classify(ap);

Expand Down Expand Up @@ -1394,7 +1393,6 @@ static int ahci_vt8251_hardreset(struct ata_link *link, unsigned int *class,
/* vt8251 doesn't clear BSY on signature FIS reception,
* request follow-up softreset.
*/
*class = ATA_DEV_NONE;
return online ? -EAGAIN : rc;
}

Expand Down Expand Up @@ -1439,7 +1437,6 @@ static int ahci_p5wdh_hardreset(struct ata_link *link, unsigned int *class,
if (rc)
ahci_kick_engine(ap, 0);
}
*class = ATA_DEV_NONE;
return rc;
}

Expand Down
1 change: 0 additions & 1 deletion drivers/ata/libata-core.c
Original file line number Diff line number Diff line change
Expand Up @@ -3701,7 +3701,6 @@ int sata_std_hardreset(struct ata_link *link, unsigned int *class,

/* do hardreset */
rc = sata_link_hardreset(link, timing, deadline, &online, NULL);
*class = ATA_DEV_NONE;
return online ? -EAGAIN : rc;
}

Expand Down
26 changes: 8 additions & 18 deletions drivers/ata/libata-eh.c
Original file line number Diff line number Diff line change
Expand Up @@ -2055,20 +2055,10 @@ static int ata_do_reset(struct ata_link *link, ata_reset_fn_t reset,
if (rc)
return rc;

/* If any class isn't ATA_DEV_UNKNOWN, consider classification
* is complete and convert all ATA_DEV_UNKNOWN to
* ATA_DEV_NONE.
*/
/* convert all ATA_DEV_UNKNOWN to ATA_DEV_NONE */
ata_link_for_each_dev(dev, link)
if (classes[dev->devno] != ATA_DEV_UNKNOWN)
break;

if (dev) {
ata_link_for_each_dev(dev, link) {
if (classes[dev->devno] == ATA_DEV_UNKNOWN)
classes[dev->devno] = ATA_DEV_NONE;
}
}
if (classes[dev->devno] == ATA_DEV_UNKNOWN)
classes[dev->devno] = ATA_DEV_NONE;

return 0;
}
Expand All @@ -2079,15 +2069,15 @@ static int ata_eh_followup_srst_needed(struct ata_link *link,
{
if (link->flags & ATA_LFLAG_NO_SRST)
return 0;
if (rc == -EAGAIN)
return 1;
if (rc == -EAGAIN) {
if (classify)
return 1;
rc = 0;
}
if (rc != 0)
return 0;
if ((link->ap->flags & ATA_FLAG_PMP) && ata_is_host_link(link))
return 1;
if (classify && !(link->flags & ATA_LFLAG_ASSUME_CLASS) &&
classes[0] == ATA_DEV_UNKNOWN)
return 1;
return 0;
}

Expand Down
1 change: 0 additions & 1 deletion drivers/ata/libata-sff.c
Original file line number Diff line number Diff line change
Expand Up @@ -1929,7 +1929,6 @@ int sata_sff_hardreset(struct ata_link *link, unsigned int *class,

rc = sata_link_hardreset(link, timing, deadline, &online,
ata_sff_check_ready);
*class = ATA_DEV_NONE;
if (online)
*class = ata_sff_dev_classify(link->device, 1, NULL);

Expand Down

0 comments on commit 305d2a1

Please sign in to comment.