libata: move PMP SCR access failure during reset to ata_eh_reset()
authorTejun Heo <htejun@gmail.com>
Mon, 7 Apr 2008 13:47:20 +0000 (22:47 +0900)
committerJeff Garzik <jgarzik@redhat.com>
Thu, 17 Apr 2008 19:44:23 +0000 (15:44 -0400)
If PMP fan-out reset fails and SCR isn't accessible, PMP should be
reset.  This used to be tested by sata_pmp_std_hardreset() and
communicated to EH by -ERESTART.  However, this logic is generic and
doesn't really have much to do with specific hardreset implementation.

This patch moves SCR access failure detection logic to ata_eh_reset()
where it belongs.  As this makes sata_pmp_std_hardreset() identical to
sata_std_hardreset(), the function is killed and replaced with the
standard method.

Signed-off-by: Tejun Heo <htejun@gmail.com>
drivers/ata/libata-core.c
drivers/ata/libata-eh.c
drivers/ata/libata-pmp.c
drivers/ata/sata_sil24.c
include/linux/libata.h

index e00b620..2da579b 100644 (file)
@@ -91,7 +91,7 @@ const struct ata_port_operations sata_pmp_port_ops = {
        .inherits               = &sata_port_ops,
 
        .pmp_prereset           = ata_std_prereset,
-       .pmp_hardreset          = sata_pmp_std_hardreset,
+       .pmp_hardreset          = sata_std_hardreset,
        .pmp_postreset          = ata_std_postreset,
        .error_handler          = sata_pmp_error_handler,
 };
@@ -6307,7 +6307,6 @@ EXPORT_SYMBOL_GPL(ata_pci_device_resume);
 #endif /* CONFIG_PCI */
 
 EXPORT_SYMBOL_GPL(sata_pmp_qc_defer_cmd_switch);
-EXPORT_SYMBOL_GPL(sata_pmp_std_hardreset);
 EXPORT_SYMBOL_GPL(sata_pmp_error_handler);
 
 EXPORT_SYMBOL_GPL(__ata_ehi_push_desc);
index 21687bb..d8c4a45 100644 (file)
@@ -2276,6 +2276,11 @@ int ata_eh_reset(struct ata_link *link, int classify,
        return rc;
 
  fail:
+       /* if SCR isn't accessible on a fan-out port, PMP needs to be reset */
+       if (!ata_is_host_link(link) &&
+           sata_scr_read(link, SCR_STATUS, &sstatus))
+               rc = -ERESTART;
+
        if (rc == -ERESTART || try >= max_tries)
                goto out;
 
index 2f8a957..9c99861 100644 (file)
@@ -175,41 +175,6 @@ int sata_pmp_scr_write(struct ata_link *link, int reg, u32 val)
        return 0;
 }
 
-/**
- *     sata_pmp_std_hardreset - standard hardreset method for PMP link
- *     @link: link to be reset
- *     @class: resulting class of attached device
- *     @deadline: deadline jiffies for the operation
- *
- *     Hardreset PMP port @link.  Note that this function doesn't
- *     wait for BSY clearance.  There simply isn't a generic way to
- *     wait the event.  Instead, this function return -EAGAIN thus
- *     telling libata-EH to followup with softreset.
- *
- *     LOCKING:
- *     Kernel thread context (may sleep)
- *
- *     RETURNS:
- *     0 on success, -errno otherwise.
- */
-int sata_pmp_std_hardreset(struct ata_link *link, unsigned int *class,
-                          unsigned long deadline)
-{
-       u32 tmp;
-       int rc;
-
-       DPRINTK("ENTER\n");
-
-       rc = sata_std_hardreset(link, class, deadline);
-
-       /* if SCR isn't accessible, we need to reset the PMP */
-       if (rc && rc != -EAGAIN && sata_scr_read(link, SCR_STATUS, &tmp))
-               rc = -ERESTART;
-
-       DPRINTK("EXIT, rc=%d\n", rc);
-       return rc;
-}
-
 /**
  *     sata_pmp_read_gscr - read GSCR block of SATA PMP
  *     @dev: PMP device
index b83851f..fc9d48c 100644 (file)
@@ -944,7 +944,7 @@ static int sil24_pmp_hardreset(struct ata_link *link, unsigned int *class,
                return rc;
        }
 
-       return sata_pmp_std_hardreset(link, class, deadline);
+       return sata_std_hardreset(link, class, deadline);
 }
 
 static void sil24_freeze(struct ata_port *ap)
index b918837..2b5a0b7 100644 (file)
@@ -1025,8 +1025,6 @@ static inline int ata_acpi_cbl_80wire(struct ata_port *ap,
  * PMP - drivers/ata/libata-pmp.c
  */
 extern int sata_pmp_qc_defer_cmd_switch(struct ata_queued_cmd *qc);
-extern int sata_pmp_std_hardreset(struct ata_link *link, unsigned int *class,
-                                 unsigned long deadline);
 extern void sata_pmp_error_handler(struct ata_port *ap);
 
 /*