Skip to content

Commit

Permalink
libata: move link onlineness check out of softreset methods
Browse files Browse the repository at this point in the history
Currently, SATA softresets should do link onlineness check before
actually performing SRST protocol but it doesn't really belong to
softreset.

This patch moves onlineness check in softreset to ata_eh_reset() and
ata_eh_followup_srst_needed() to clean up code and help future sata_mv
changes which need clear separation between SCR and TF accesses.

sata_fsl is peculiar in that its softreset really isn't softreset but
combination of hardreset and softreset.  This patch adds dummy private
->prereset to keep the current behavior but the driver really should
implement separate hard and soft resets and return -EAGAIN from
hardreset if it should be follwed by softreset.

Signed-off-by: Tejun Heo <htejun@gmail.com>
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
  • Loading branch information
Tejun Heo authored and Jeff Garzik committed Apr 17, 2008
1 parent 2a0c15c commit 45db2f6
Show file tree
Hide file tree
Showing 8 changed files with 15 additions and 32 deletions.
6 changes: 0 additions & 6 deletions drivers/ata/ahci.c
Original file line number Diff line number Diff line change
Expand Up @@ -1273,12 +1273,6 @@ static int ahci_softreset(struct ata_link *link, unsigned int *class,

DPRINTK("ENTER\n");

if (ata_link_offline(link)) {
DPRINTK("PHY reports no device\n");
*class = ATA_DEV_NONE;
return 0;
}

/* prepare for SRST (AHCI-1.1 10.4.1) */
rc = ahci_kick_engine(ap, 1);
if (rc && rc != -EOPNOTSUPP)
Expand Down
4 changes: 4 additions & 0 deletions drivers/ata/libata-core.c
Original file line number Diff line number Diff line change
Expand Up @@ -3541,6 +3541,10 @@ int ata_std_prereset(struct ata_link *link, unsigned long deadline)
"link for reset (errno=%d)\n", rc);
}

/* no point in trying softreset on offline link */
if (ata_link_offline(link))
ehc->i.action &= ~ATA_EH_SOFTRESET;

return 0;
}

Expand Down
2 changes: 1 addition & 1 deletion drivers/ata/libata-eh.c
Original file line number Diff line number Diff line change
Expand Up @@ -2065,7 +2065,7 @@ static int ata_eh_followup_srst_needed(struct ata_link *link,
int rc, int classify,
const unsigned int *classes)
{
if (link->flags & ATA_LFLAG_NO_SRST)
if ((link->flags & ATA_LFLAG_NO_SRST) || ata_link_offline(link))
return 0;
if (rc == -EAGAIN) {
if (classify)
Expand Down
6 changes: 0 additions & 6 deletions drivers/ata/libata-sff.c
Original file line number Diff line number Diff line change
Expand Up @@ -1889,11 +1889,6 @@ int ata_sff_softreset(struct ata_link *link, unsigned int *classes,

DPRINTK("ENTER\n");

if (ata_link_offline(link)) {
classes[0] = ATA_DEV_NONE;
goto out;
}

/* determine if device 0/1 are present */
if (ata_devchk(ap, 0))
devmask |= (1 << 0);
Expand All @@ -1919,7 +1914,6 @@ int ata_sff_softreset(struct ata_link *link, unsigned int *classes,
classes[1] = ata_sff_dev_classify(&link->device[1],
devmask & (1 << 1), &err);

out:
DPRINTK("EXIT, classes[0]=%u [1]=%u\n", classes[0], classes[1]);
return 0;
}
Expand Down
6 changes: 0 additions & 6 deletions drivers/ata/pata_bf54x.c
Original file line number Diff line number Diff line change
Expand Up @@ -1103,11 +1103,6 @@ static int bfin_softreset(struct ata_link *link, unsigned int *classes,
unsigned int devmask = 0, err_mask;
u8 err;

if (ata_link_offline(link)) {
classes[0] = ATA_DEV_NONE;
goto out;
}

/* determine if device 0/1 are present */
if (bfin_devchk(ap, 0))
devmask |= (1 << 0);
Expand All @@ -1132,7 +1127,6 @@ static int bfin_softreset(struct ata_link *link, unsigned int *classes,
classes[1] = ata_sff_dev_classify(&ap->link.device[1],
devmask & (1 << 1), &err);

out:
return 0;
}

Expand Down
6 changes: 0 additions & 6 deletions drivers/ata/pata_scc.c
Original file line number Diff line number Diff line change
Expand Up @@ -615,11 +615,6 @@ static int scc_softreset(struct ata_link *link, unsigned int *classes,

DPRINTK("ENTER\n");

if (ata_link_offline(link)) {
classes[0] = ATA_DEV_NONE;
goto out;
}

/* determine if device 0/1 are present */
if (scc_devchk(ap, 0))
devmask |= (1 << 0);
Expand All @@ -645,7 +640,6 @@ static int scc_softreset(struct ata_link *link, unsigned int *classes,
classes[1] = ata_sff_dev_classify(&ap->link.device[1],
devmask & (1 << 1), &err);

out:
DPRINTK("EXIT, classes[0]=%u [1]=%u\n", classes[0], classes[1]);
return 0;
}
Expand Down
10 changes: 10 additions & 0 deletions drivers/ata/sata_fsl.c
Original file line number Diff line number Diff line change
Expand Up @@ -678,6 +678,15 @@ static unsigned int sata_fsl_dev_classify(struct ata_port *ap)
return ata_dev_classify(&tf);
}

static int sata_fsl_prereset(struct ata_linke *link, unsigned long deadline)
{
/* FIXME: Never skip softreset, sata_fsl_softreset() is
* combination of soft and hard resets. sata_fsl_softreset()
* needs to be splitted into soft and hard resets.
*/
return 0;
}

static int sata_fsl_softreset(struct ata_link *link, unsigned int *class,
unsigned long deadline)
{
Expand Down Expand Up @@ -1157,6 +1166,7 @@ static const struct ata_port_operations sata_fsl_ops = {

.freeze = sata_fsl_freeze,
.thaw = sata_fsl_thaw,
.prereset = sata_fsl_prereset,
.softreset = sata_fsl_softreset,
.post_internal_cmd = sata_fsl_post_internal_cmd,

Expand Down
7 changes: 0 additions & 7 deletions drivers/ata/sata_sil24.c
Original file line number Diff line number Diff line change
Expand Up @@ -663,12 +663,6 @@ static int sil24_softreset(struct ata_link *link, unsigned int *class,

DPRINTK("ENTER\n");

if (ata_link_offline(link)) {
DPRINTK("PHY reports no device\n");
*class = ATA_DEV_NONE;
goto out;
}

/* put the port into known state */
if (sil24_init_port(ap)) {
reason = "port not ready";
Expand All @@ -693,7 +687,6 @@ static int sil24_softreset(struct ata_link *link, unsigned int *class,
sil24_read_tf(ap, 0, &tf);
*class = ata_dev_classify(&tf);

out:
DPRINTK("EXIT, class=%u\n", *class);
return 0;

Expand Down

0 comments on commit 45db2f6

Please sign in to comment.