[PATCH] libata: new ->probe_reset operation
authorTejun Heo <htejun@gmail.com>
Tue, 24 Jan 2006 08:05:22 +0000 (17:05 +0900)
committerJeff Garzik <jgarzik@pobox.com>
Fri, 27 Jan 2006 04:20:14 +0000 (23:20 -0500)
Add new ->probe_reset operation to ata_port_operations obsoleting
->phy_reset.  The main difference from ->phy_reset is that the new
operation is not allowed to manipulate libata internals directly.
It's not allowed to configure or disable the port or devices.  It can
only succeed or fail and classify attached devices into passed
@classes.

This change gives more control to higher level and eases sharing reset
methods with EH.

Signed-off-by: Tejun Heo <htejun@gmail.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
drivers/scsi/libata-core.c
include/linux/libata.h

index 1f78e246f5e07577a4b621e7bd7d6abb8bfb0589..147e1461062df7d3b6ad9d3bc3e1e9b0c723f286 100644 (file)
@@ -1485,7 +1485,24 @@ static int ata_bus_probe(struct ata_port *ap)
 {
        unsigned int i, found = 0;
 
-       ap->ops->phy_reset(ap);
+       if (ap->ops->probe_reset) {
+               unsigned int classes[ATA_MAX_DEVICES];
+               int rc;
+
+               ata_port_probe(ap);
+
+               rc = ap->ops->probe_reset(ap, classes);
+               if (rc == 0) {
+                       for (i = 0; i < ATA_MAX_DEVICES; i++)
+                               ap->device[i].class = classes[i];
+               } else {
+                       printk(KERN_ERR "ata%u: probe reset failed, "
+                              "disabling port\n", ap->id);
+                       ata_port_disable(ap);
+               }
+       } else
+               ap->ops->phy_reset(ap);
+
        if (ap->flags & ATA_FLAG_PORT_DISABLED)
                goto err_out;
 
index 45646f6ebbf5adfe17537d5e2d61bebff69ef766..a84d1c3a5429dcb18dbd80d7e4b8ab0c176d2328 100644 (file)
@@ -148,9 +148,9 @@ enum {
        ATA_FLAG_PORT_DISABLED  = (1 << 2), /* port is disabled, ignore it */
        ATA_FLAG_SATA           = (1 << 3),
        ATA_FLAG_NO_LEGACY      = (1 << 4), /* no legacy mode check */
-       ATA_FLAG_SRST           = (1 << 5), /* use ATA SRST, not E.D.D. */
+       ATA_FLAG_SRST           = (1 << 5), /* (obsolete) use ATA SRST, not E.D.D. */
        ATA_FLAG_MMIO           = (1 << 6), /* use MMIO, not PIO */
-       ATA_FLAG_SATA_RESET     = (1 << 7), /* use COMRESET */
+       ATA_FLAG_SATA_RESET     = (1 << 7), /* (obsolete) use COMRESET */
        ATA_FLAG_PIO_DMA        = (1 << 8), /* PIO cmds via DMA */
        ATA_FLAG_NOINTR         = (1 << 9), /* FIXME: Remove this once
                                             * proper HSM is in place. */
@@ -419,7 +419,9 @@ struct ata_port_operations {
        u8   (*check_altstatus)(struct ata_port *ap);
        void (*dev_select)(struct ata_port *ap, unsigned int device);
 
-       void (*phy_reset) (struct ata_port *ap);
+       void (*phy_reset) (struct ata_port *ap); /* obsolete */
+       int (*probe_reset) (struct ata_port *ap, unsigned int *classes);
+
        void (*post_set_mode) (struct ata_port *ap);
 
        int (*check_atapi_dma) (struct ata_queued_cmd *qc);