libata: move link onlineness check out of softreset methods
authorTejun Heo <htejun@gmail.com>
Mon, 7 Apr 2008 16:46:56 +0000 (01:46 +0900)
committerJeff Garzik <jgarzik@redhat.com>
Thu, 17 Apr 2008 19:44:25 +0000 (15:44 -0400)
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>
drivers/ata/ahci.c
drivers/ata/libata-core.c
drivers/ata/libata-eh.c
drivers/ata/libata-sff.c
drivers/ata/pata_bf54x.c
drivers/ata/pata_scc.c
drivers/ata/sata_fsl.c
drivers/ata/sata_sil24.c

index 0de6432ee0266a49e02342bd2c38587c815a7e27..739ba3f222e851407cd97dcc2ed52ac509e32edc 100644 (file)
@@ -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)
index 3401248180c9d2bea36a2fa67cab7f5ec4667684..f60988f5e01b823c3bc4c5fd2f1767967b50c42f 100644 (file)
@@ -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;
 }
 
index 88cdc4938beaca421d66929ce76f03202f399f1c..ecbb8e90cb8d1afb76f7314956d1bdd5566d764c 100644 (file)
@@ -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)
index 8e6c78ac70f86af21c0e0790e977cfb86ee6499b..15499522e6427392fe80f5fe47f35573d9479d81 100644 (file)
@@ -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);
@@ -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;
 }
index d98bd7455e6b58dc4cd64e6d5c29a09cdc80e982..0a5ad98635b1c0005bd3847055b241ff30d80409 100644 (file)
@@ -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);
@@ -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;
 }
 
index 7bdea8a4ca7e6c06dc8df2a01a9be5634b53902f..e965b251ca24dd923b421d628f264046bde76462 100644 (file)
@@ -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);
@@ -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;
 }
index 9c4e6a6698c2e833ba0017db6955473455455955..fddd346b1d5728c289d1a9a44ae5ab8c2de37412 100644 (file)
@@ -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)
 {
@@ -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,
 
index 20757fa6115d871521aba78ed57bdef74f1daf3b..27a110110077847b65e630cd11896b2e6195f75b 100644 (file)
@@ -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";
@@ -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;