libata: separate out ata_std_postreset() from ata_sff_postreset()
authorTejun Heo <htejun@gmail.com>
Mon, 7 Apr 2008 13:47:18 +0000 (22:47 +0900)
committerJeff Garzik <jgarzik@redhat.com>
Thu, 17 Apr 2008 19:44:22 +0000 (15:44 -0400)
Separate out generic ATA portion from ata_sff_postreset() into
ata_std_postreset() and implement ata_sff_postreset() using the std
version.

ata_base_port_ops now has ata_std_postreset() for its postreset and
ata_sff_port_ops overrides it to ata_sff_postreset().

This change affects pdc_adma, ahci, sata_fsl and sata_sil24.  pdc_adma
now specifies postreset to ata_sff_postreset() explicitly.  sata_fsl
and sata_sil24 now use ata_std_postreset() which makes no difference
to them.  ahci now calls ata_std_postreset() from its own postreset
method, which causes no behavior difference.

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

index c5e4501..939dc1d 100644 (file)
@@ -1444,7 +1444,7 @@ static void ahci_postreset(struct ata_link *link, unsigned int *class)
        void __iomem *port_mmio = ahci_port_base(ap);
        u32 new_tmp, tmp;
 
-       ata_sff_postreset(link, class);
+       ata_std_postreset(link, class);
 
        /* Make sure port's ATAPI bit is set appropriately */
        new_tmp = tmp = readl(port_mmio + PORT_CMD);
index 5f771bb..eaead76 100644 (file)
@@ -76,7 +76,7 @@ const unsigned long sata_deb_timing_long[]            = { 100, 2000, 5000 };
 const struct ata_port_operations ata_base_port_ops = {
        .prereset               = ata_std_prereset,
        .hardreset              = sata_sff_hardreset,
-       .postreset              = ata_sff_postreset,
+       .postreset              = ata_std_postreset,
        .error_handler          = ata_std_error_handler,
 };
 
@@ -3516,7 +3516,7 @@ int sata_link_hardreset(struct ata_link *link, const unsigned long *timing,
 }
 
 /**
- *     ata_sff_postreset - standard postreset callback
+ *     ata_std_postreset - standard postreset callback
  *     @link: the target ata_link
  *     @classes: classes of attached devices
  *
@@ -3527,9 +3527,8 @@ int sata_link_hardreset(struct ata_link *link, const unsigned long *timing,
  *     LOCKING:
  *     Kernel thread context (may sleep)
  */
-void ata_sff_postreset(struct ata_link *link, unsigned int *classes)
+void ata_std_postreset(struct ata_link *link, unsigned int *classes)
 {
-       struct ata_port *ap = link->ap;
        u32 serror;
 
        DPRINTK("ENTER\n");
@@ -3542,22 +3541,6 @@ void ata_sff_postreset(struct ata_link *link, unsigned int *classes)
                sata_scr_write(link, SCR_ERROR, serror);
        link->eh_info.serror = 0;
 
-       /* is double-select really necessary? */
-       if (classes[0] != ATA_DEV_NONE)
-               ap->ops->sff_dev_select(ap, 1);
-       if (classes[1] != ATA_DEV_NONE)
-               ap->ops->sff_dev_select(ap, 0);
-
-       /* bail out if no device is present */
-       if (classes[0] == ATA_DEV_NONE && classes[1] == ATA_DEV_NONE) {
-               DPRINTK("EXIT, no device\n");
-               return;
-       }
-
-       /* set up device control */
-       if (ap->ioaddr.ctl_addr)
-               iowrite8(ap->ctl, ap->ioaddr.ctl_addr);
-
        DPRINTK("EXIT\n");
 }
 
@@ -6096,6 +6079,7 @@ EXPORT_SYMBOL_GPL(sata_link_debounce);
 EXPORT_SYMBOL_GPL(sata_link_resume);
 EXPORT_SYMBOL_GPL(ata_std_prereset);
 EXPORT_SYMBOL_GPL(sata_link_hardreset);
+EXPORT_SYMBOL_GPL(ata_std_postreset);
 EXPORT_SYMBOL_GPL(ata_dev_classify);
 EXPORT_SYMBOL_GPL(ata_dev_pair);
 EXPORT_SYMBOL_GPL(ata_port_disable);
index 9234bc0..e530bac 100644 (file)
@@ -49,6 +49,7 @@ const struct ata_port_operations ata_sff_port_ops = {
        .thaw                   = ata_sff_thaw,
        .prereset               = ata_sff_prereset,
        .softreset              = ata_sff_softreset,
+       .postreset              = ata_sff_postreset,
        .error_handler          = ata_sff_error_handler,
        .post_internal_cmd      = ata_sff_post_internal_cmd,
 
@@ -2031,6 +2032,41 @@ int sata_sff_hardreset(struct ata_link *link, unsigned int *class,
        return 0;
 }
 
+/**
+ *     ata_sff_postreset - SFF postreset callback
+ *     @link: the target SFF ata_link
+ *     @classes: classes of attached devices
+ *
+ *     This function is invoked after a successful reset.  It first
+ *     calls ata_std_postreset() and performs SFF specific postreset
+ *     processing.
+ *
+ *     LOCKING:
+ *     Kernel thread context (may sleep)
+ */
+void ata_sff_postreset(struct ata_link *link, unsigned int *classes)
+{
+       struct ata_port *ap = link->ap;
+
+       ata_std_postreset(link, classes);
+
+       /* is double-select really necessary? */
+       if (classes[0] != ATA_DEV_NONE)
+               ap->ops->sff_dev_select(ap, 1);
+       if (classes[1] != ATA_DEV_NONE)
+               ap->ops->sff_dev_select(ap, 0);
+
+       /* bail out if no device is present */
+       if (classes[0] == ATA_DEV_NONE && classes[1] == ATA_DEV_NONE) {
+               DPRINTK("EXIT, no device\n");
+               return;
+       }
+
+       /* set up device control */
+       if (ap->ioaddr.ctl_addr)
+               iowrite8(ap->ctl, ap->ioaddr.ctl_addr);
+}
+
 /**
  *     ata_sff_error_handler - Stock error handler for BMDMA controller
  *     @ap: port to handle error for
index 595ede5..6e14c27 100644 (file)
@@ -831,6 +831,7 @@ extern int sata_link_resume(struct ata_link *link, const unsigned long *params,
                            unsigned long deadline);
 extern int sata_link_hardreset(struct ata_link *link,
                        const unsigned long *timing, unsigned long deadline);
+extern void ata_std_postreset(struct ata_link *link, unsigned int *classes);
 extern void ata_port_disable(struct ata_port *);
 
 extern struct ata_host *ata_host_alloc(struct device *dev, int max_ports);