Merge branch 'upstream'
[deliverable/linux.git] / drivers / scsi / libata-core.c
index 5fdc3143ed15694fd0d5c96c321ee8b29fd6aee7..56537293ad4139661f8583ce2c41c71c5182e238 100644 (file)
@@ -62,8 +62,9 @@
 #include "libata.h"
 
 static unsigned int ata_dev_init_params(struct ata_port *ap,
-                                       struct ata_device *dev);
-static void ata_set_mode(struct ata_port *ap);
+                                       struct ata_device *dev,
+                                       u16 heads,
+                                       u16 sectors);
 static unsigned int ata_dev_set_xfermode(struct ata_port *ap,
                                         struct ata_device *dev);
 static void ata_dev_xfermask(struct ata_port *ap, struct ata_device *dev);
@@ -276,7 +277,7 @@ static void ata_unpack_xfermask(unsigned int xfer_mask,
 }
 
 static const struct ata_xfer_ent {
-       unsigned int shift, bits;
+       int shift, bits;
        u8 base;
 } ata_xfer_tbl[] = {
        { ATA_SHIFT_PIO, ATA_BITS_PIO, XFER_PIO_0 },
@@ -395,9 +396,21 @@ static const char *ata_mode_string(unsigned int xfer_mask)
        return "<n/a>";
 }
 
-static void ata_dev_disable(struct ata_port *ap, struct ata_device *dev)
+static const char *sata_spd_string(unsigned int spd)
 {
-       if (ata_dev_present(dev)) {
+       static const char * const spd_str[] = {
+               "1.5 Gbps",
+               "3.0 Gbps",
+       };
+
+       if (spd == 0 || (spd - 1) >= ARRAY_SIZE(spd_str))
+               return "<unknown>";
+       return spd_str[spd - 1];
+}
+
+void ata_dev_disable(struct ata_port *ap, struct ata_device *dev)
+{
+       if (ata_dev_enabled(dev)) {
                printk(KERN_WARNING "ata%u: dev %u disabled\n",
                       ap->id, dev->devno);
                dev->class++;
@@ -947,6 +960,7 @@ void ata_qc_complete_internal(struct ata_queued_cmd *qc)
  *     @ap: Port to which the command is sent
  *     @dev: Device to which the command is sent
  *     @tf: Taskfile registers for the command and the result
+ *     @cdb: CDB for packet command
  *     @dma_dir: Data tranfer direction of the command
  *     @buf: Data buffer of the command
  *     @buflen: Length of data buffer
@@ -961,10 +975,9 @@ void ata_qc_complete_internal(struct ata_queued_cmd *qc)
  *     None.  Should be called with kernel context, might sleep.
  */
 
-static unsigned
-ata_exec_internal(struct ata_port *ap, struct ata_device *dev,
-                 struct ata_taskfile *tf,
-                 int dma_dir, void *buf, unsigned int buflen)
+unsigned ata_exec_internal(struct ata_port *ap, struct ata_device *dev,
+                          struct ata_taskfile *tf, const u8 *cdb,
+                          int dma_dir, void *buf, unsigned int buflen)
 {
        u8 command = tf->command;
        struct ata_queued_cmd *qc;
@@ -978,6 +991,8 @@ ata_exec_internal(struct ata_port *ap, struct ata_device *dev,
        BUG_ON(qc == NULL);
 
        qc->tf = *tf;
+       if (cdb)
+               memcpy(qc->cdb, cdb, ATAPI_CDB_LEN);
        qc->dma_dir = dma_dir;
        if (dma_dir != DMA_NONE) {
                ata_sg_init_one(qc, buf, buflen);
@@ -987,9 +1002,7 @@ ata_exec_internal(struct ata_port *ap, struct ata_device *dev,
        qc->private_data = &wait;
        qc->complete_fn = ata_qc_complete_internal;
 
-       qc->err_mask = ata_qc_issue(qc);
-       if (qc->err_mask)
-               ata_qc_complete(qc);
+       ata_qc_issue(qc);
 
        spin_unlock_irqrestore(&ap->host_set->lock, flags);
 
@@ -1030,7 +1043,7 @@ ata_exec_internal(struct ata_port *ap, struct ata_device *dev,
         *
         * Kill the following code as soon as those drivers are fixed.
         */
-       if (ap->flags & ATA_FLAG_PORT_DISABLED) {
+       if (ap->flags & ATA_FLAG_DISABLED) {
                err_mask |= AC_ERR_SYSTEM;
                ata_port_probe(ap);
        }
@@ -1129,7 +1142,7 @@ static int ata_dev_read_id(struct ata_port *ap, struct ata_device *dev,
 
        tf.protocol = ATA_PROT_PIO;
 
-       err_mask = ata_exec_internal(ap, dev, &tf, DMA_FROM_DEVICE,
+       err_mask = ata_exec_internal(ap, dev, &tf, NULL, DMA_FROM_DEVICE,
                                     id, sizeof(id[0]) * ATA_ID_WORDS);
        if (err_mask) {
                rc = -EIO;
@@ -1140,7 +1153,7 @@ static int ata_dev_read_id(struct ata_port *ap, struct ata_device *dev,
        swap_buf_le16(id, ATA_ID_WORDS);
 
        /* sanity check */
-       if ((class == ATA_DEV_ATA) != ata_id_is_ata(id)) {
+       if ((class == ATA_DEV_ATA) != (ata_id_is_ata(id) | ata_id_is_cfa(id))) {
                rc = -EINVAL;
                reason = "device reports illegal type";
                goto err_out;
@@ -1156,7 +1169,7 @@ static int ata_dev_read_id(struct ata_port *ap, struct ata_device *dev,
                 * Some drives were very specific about that exact sequence.
                 */
                if (ata_id_major_version(id) < 4 || !ata_id_has_lba(id)) {
-                       err_mask = ata_dev_init_params(ap, dev);
+                       err_mask = ata_dev_init_params(ap, dev, id[3], id[6]);
                        if (err_mask) {
                                rc = -EIO;
                                reason = "INIT_DEV_PARAMS failed";
@@ -1210,7 +1223,7 @@ static int ata_dev_configure(struct ata_port *ap, struct ata_device *dev,
        unsigned int xfer_mask;
        int i, rc;
 
-       if (!ata_dev_present(dev)) {
+       if (!ata_dev_enabled(dev)) {
                DPRINTK("ENTER/EXIT (host %u, dev %u) -- nodev\n",
                        ap->id, dev->devno);
                return 0;
@@ -1226,7 +1239,7 @@ static int ata_dev_configure(struct ata_port *ap, struct ata_device *dev,
                       id[84], id[85], id[86], id[87], id[88]);
 
        /* initialize to-be-configured parameters */
-       dev->flags = 0;
+       dev->flags &= ~ATA_DFLAG_CFG_MASK;
        dev->max_sectors = 0;
        dev->cdb_len = 0;
        dev->n_sectors = 0;
@@ -1303,6 +1316,8 @@ static int ata_dev_configure(struct ata_port *ap, struct ata_device *dev,
 
        /* ATAPI-specific feature tests */
        else if (dev->class == ATA_DEV_ATAPI) {
+               char *cdb_intr_string = "";
+
                rc = atapi_cdb_len(id);
                if ((rc < 12) || (rc > ATAPI_CDB_LEN)) {
                        printk(KERN_WARNING "ata%u: unsupported CDB len\n", ap->id);
@@ -1311,13 +1326,16 @@ static int ata_dev_configure(struct ata_port *ap, struct ata_device *dev,
                }
                dev->cdb_len = (unsigned int) rc;
 
-               if (ata_id_cdb_intr(dev->id))
+               if (ata_id_cdb_intr(dev->id)) {
                        dev->flags |= ATA_DFLAG_CDB_INTR;
+                       cdb_intr_string = ", CDB intr";
+               }
 
                /* print device info to dmesg */
                if (print_info)
-                       printk(KERN_INFO "ata%u: dev %u ATAPI, max %s\n",
-                              ap->id, dev->devno, ata_mode_string(xfer_mask));
+                       printk(KERN_INFO "ata%u: dev %u ATAPI, max %s%s\n",
+                              ap->id, dev->devno, ata_mode_string(xfer_mask),
+                              cdb_intr_string);
        }
 
        ap->host->max_cmd_len = 0;
@@ -1358,16 +1376,24 @@ err_out_nosup:
  *     PCI/etc. bus probe sem.
  *
  *     RETURNS:
- *     Zero on success, non-zero on error.
+ *     Zero on success, negative errno otherwise.
  */
 
 static int ata_bus_probe(struct ata_port *ap)
 {
        unsigned int classes[ATA_MAX_DEVICES];
-       unsigned int i, rc, found = 0;
+       int tries[ATA_MAX_DEVICES];
+       int i, rc, down_xfermask;
+       struct ata_device *dev;
 
        ata_port_probe(ap);
 
+       for (i = 0; i < ATA_MAX_DEVICES; i++)
+               tries[i] = ATA_PROBE_MAX_TRIES;
+
+ retry:
+       down_xfermask = 0;
+
        /* reset and determine device classes */
        for (i = 0; i < ATA_MAX_DEVICES; i++)
                classes[i] = ATA_DEV_UNKNOWN;
@@ -1381,7 +1407,7 @@ static int ata_bus_probe(struct ata_port *ap)
        } else {
                ap->ops->phy_reset(ap);
 
-               if (!(ap->flags & ATA_FLAG_PORT_DISABLED))
+               if (!(ap->flags & ATA_FLAG_DISABLED))
                        for (i = 0; i < ATA_MAX_DEVICES; i++)
                                classes[i] = ap->device[i].class;
 
@@ -1394,39 +1420,74 @@ static int ata_bus_probe(struct ata_port *ap)
 
        /* read IDENTIFY page and configure devices */
        for (i = 0; i < ATA_MAX_DEVICES; i++) {
-               struct ata_device *dev = &ap->device[i];
-
+               dev = &ap->device[i];
                dev->class = classes[i];
 
-               if (!ata_dev_present(dev))
-                       continue;
-
-               WARN_ON(dev->id != NULL);
-               if (ata_dev_read_id(ap, dev, &dev->class, 1, &dev->id)) {
-                       dev->class = ATA_DEV_NONE;
-                       continue;
+               if (!tries[i]) {
+                       ata_down_xfermask_limit(ap, dev, 1);
+                       ata_dev_disable(ap, dev);
                }
 
-               if (ata_dev_configure(ap, dev, 1)) {
-                       ata_dev_disable(ap, dev);
+               if (!ata_dev_enabled(dev))
                        continue;
-               }
 
-               found = 1;
-       }
+               kfree(dev->id);
+               dev->id = NULL;
+               rc = ata_dev_read_id(ap, dev, &dev->class, 1, &dev->id);
+               if (rc)
+                       goto fail;
 
-       if (!found)
-               goto err_out_disable;
+               rc = ata_dev_configure(ap, dev, 1);
+               if (rc)
+                       goto fail;
+       }
 
-       ata_set_mode(ap);
-       if (ap->flags & ATA_FLAG_PORT_DISABLED)
-               goto err_out_disable;
+       /* configure transfer mode */
+       if (ap->ops->set_mode) {
+               /* FIXME: make ->set_mode handle no device case and
+                * return error code and failing device on failure as
+                * ata_set_mode() does.
+                */
+               for (i = 0; i < ATA_MAX_DEVICES; i++)
+                       if (ata_dev_enabled(&ap->device[i])) {
+                               ap->ops->set_mode(ap);
+                               break;
+                       }
+               rc = 0;
+       } else {
+               rc = ata_set_mode(ap, &dev);
+               if (rc) {
+                       down_xfermask = 1;
+                       goto fail;
+               }
+       }
 
-       return 0;
+       for (i = 0; i < ATA_MAX_DEVICES; i++)
+               if (ata_dev_enabled(&ap->device[i]))
+                       return 0;
 
-err_out_disable:
+       /* no device present, disable port */
+       ata_port_disable(ap);
        ap->ops->port_disable(ap);
-       return -1;
+       return -ENODEV;
+
+ fail:
+       switch (rc) {
+       case -EINVAL:
+       case -ENODEV:
+               tries[dev->devno] = 0;
+               break;
+       case -EIO:
+               ata_down_sata_spd_limit(ap);
+               /* fall through */
+       default:
+               tries[dev->devno]--;
+               if (down_xfermask &&
+                   ata_down_xfermask_limit(ap, dev, tries[dev->devno] == 1))
+                       tries[dev->devno] = 0;
+       }
+
+       goto retry;
 }
 
 /**
@@ -1442,7 +1503,7 @@ err_out_disable:
 
 void ata_port_probe(struct ata_port *ap)
 {
-       ap->flags &= ~ATA_FLAG_PORT_DISABLED;
+       ap->flags &= ~ATA_FLAG_DISABLED;
 }
 
 /**
@@ -1456,27 +1517,23 @@ void ata_port_probe(struct ata_port *ap)
  */
 static void sata_print_link_status(struct ata_port *ap)
 {
-       u32 sstatus, tmp;
-       const char *speed;
+       u32 sstatus, scontrol, tmp;
 
        if (!ap->ops->scr_read)
                return;
 
        sstatus = scr_read(ap, SCR_STATUS);
+       scontrol = scr_read(ap, SCR_CONTROL);
 
        if (sata_dev_present(ap)) {
                tmp = (sstatus >> 4) & 0xf;
-               if (tmp & (1 << 0))
-                       speed = "1.5";
-               else if (tmp & (1 << 1))
-                       speed = "3.0";
-               else
-                       speed = "<unknown>";
-               printk(KERN_INFO "ata%u: SATA link up %s Gbps (SStatus %X)\n",
-                      ap->id, speed, sstatus);
+               printk(KERN_INFO
+                      "ata%u: SATA link up %s (SStatus %X SControl %X)\n",
+                      ap->id, sata_spd_string(tmp), sstatus, scontrol);
        } else {
-               printk(KERN_INFO "ata%u: SATA link down (SStatus %X)\n",
-                      ap->id, sstatus);
+               printk(KERN_INFO
+                      "ata%u: SATA link down (SStatus %X SControl %X)\n",
+                      ap->id, sstatus, scontrol);
        }
 }
 
@@ -1523,7 +1580,7 @@ void __sata_phy_reset(struct ata_port *ap)
        else
                ata_port_disable(ap);
 
-       if (ap->flags & ATA_FLAG_PORT_DISABLED)
+       if (ap->flags & ATA_FLAG_DISABLED)
                return;
 
        if (ata_busy_sleep(ap, ATA_TMOUT_BOOT_QUICK, ATA_TMOUT_BOOT)) {
@@ -1548,7 +1605,7 @@ void __sata_phy_reset(struct ata_port *ap)
 void sata_phy_reset(struct ata_port *ap)
 {
        __sata_phy_reset(ap);
-       if (ap->flags & ATA_FLAG_PORT_DISABLED)
+       if (ap->flags & ATA_FLAG_DISABLED)
                return;
        ata_bus_reset(ap);
 }
@@ -1565,7 +1622,7 @@ void sata_phy_reset(struct ata_port *ap)
 struct ata_device *ata_dev_pair(struct ata_port *ap, struct ata_device *adev)
 {
        struct ata_device *pair = &ap->device[1 - adev->devno];
-       if (!ata_dev_present(pair))
+       if (!ata_dev_enabled(pair))
                return NULL;
        return pair;
 }
@@ -1587,7 +1644,121 @@ void ata_port_disable(struct ata_port *ap)
 {
        ap->device[0].class = ATA_DEV_NONE;
        ap->device[1].class = ATA_DEV_NONE;
-       ap->flags |= ATA_FLAG_PORT_DISABLED;
+       ap->flags |= ATA_FLAG_DISABLED;
+}
+
+/**
+ *     ata_down_sata_spd_limit - adjust SATA spd limit downward
+ *     @ap: Port to adjust SATA spd limit for
+ *
+ *     Adjust SATA spd limit of @ap downward.  Note that this
+ *     function only adjusts the limit.  The change must be applied
+ *     using ata_set_sata_spd().
+ *
+ *     LOCKING:
+ *     Inherited from caller.
+ *
+ *     RETURNS:
+ *     0 on success, negative errno on failure
+ */
+int ata_down_sata_spd_limit(struct ata_port *ap)
+{
+       u32 spd, mask;
+       int highbit;
+
+       if (ap->cbl != ATA_CBL_SATA || !ap->ops->scr_read)
+               return -EOPNOTSUPP;
+
+       mask = ap->sata_spd_limit;
+       if (mask <= 1)
+               return -EINVAL;
+       highbit = fls(mask) - 1;
+       mask &= ~(1 << highbit);
+
+       spd = (scr_read(ap, SCR_STATUS) >> 4) & 0xf;
+       if (spd <= 1)
+               return -EINVAL;
+       spd--;
+       mask &= (1 << spd) - 1;
+       if (!mask)
+               return -EINVAL;
+
+       ap->sata_spd_limit = mask;
+
+       printk(KERN_WARNING "ata%u: limiting SATA link speed to %s\n",
+              ap->id, sata_spd_string(fls(mask)));
+
+       return 0;
+}
+
+static int __ata_set_sata_spd_needed(struct ata_port *ap, u32 *scontrol)
+{
+       u32 spd, limit;
+
+       if (ap->sata_spd_limit == UINT_MAX)
+               limit = 0;
+       else
+               limit = fls(ap->sata_spd_limit);
+
+       spd = (*scontrol >> 4) & 0xf;
+       *scontrol = (*scontrol & ~0xf0) | ((limit & 0xf) << 4);
+
+       return spd != limit;
+}
+
+/**
+ *     ata_set_sata_spd_needed - is SATA spd configuration needed
+ *     @ap: Port in question
+ *
+ *     Test whether the spd limit in SControl matches
+ *     @ap->sata_spd_limit.  This function is used to determine
+ *     whether hardreset is necessary to apply SATA spd
+ *     configuration.
+ *
+ *     LOCKING:
+ *     Inherited from caller.
+ *
+ *     RETURNS:
+ *     1 if SATA spd configuration is needed, 0 otherwise.
+ */
+int ata_set_sata_spd_needed(struct ata_port *ap)
+{
+       u32 scontrol;
+
+       if (ap->cbl != ATA_CBL_SATA || !ap->ops->scr_read)
+               return 0;
+
+       scontrol = scr_read(ap, SCR_CONTROL);
+
+       return __ata_set_sata_spd_needed(ap, &scontrol);
+}
+
+/**
+ *     ata_set_sata_spd - set SATA spd according to spd limit
+ *     @ap: Port to set SATA spd for
+ *
+ *     Set SATA spd of @ap according to sata_spd_limit.
+ *
+ *     LOCKING:
+ *     Inherited from caller.
+ *
+ *     RETURNS:
+ *     0 if spd doesn't need to be changed, 1 if spd has been
+ *     changed.  -EOPNOTSUPP if SCR registers are inaccessible.
+ */
+static int ata_set_sata_spd(struct ata_port *ap)
+{
+       u32 scontrol;
+
+       if (ap->cbl != ATA_CBL_SATA || !ap->ops->scr_read)
+               return -EOPNOTSUPP;
+
+       scontrol = scr_read(ap, SCR_CONTROL);
+       if (!__ata_set_sata_spd_needed(ap, &scontrol))
+               return 0;
+
+       scr_write(ap, SCR_CONTROL, scontrol);
+       return 1;
 }
 
 /*
@@ -1738,11 +1909,62 @@ int ata_timing_compute(struct ata_device *adev, unsigned short speed,
        return 0;
 }
 
+/**
+ *     ata_down_xfermask_limit - adjust dev xfer masks downward
+ *     @ap: Port associated with device @dev
+ *     @dev: Device to adjust xfer masks
+ *     @force_pio0: Force PIO0
+ *
+ *     Adjust xfer masks of @dev downward.  Note that this function
+ *     does not apply the change.  Invoking ata_set_mode() afterwards
+ *     will apply the limit.
+ *
+ *     LOCKING:
+ *     Inherited from caller.
+ *
+ *     RETURNS:
+ *     0 on success, negative errno on failure
+ */
+int ata_down_xfermask_limit(struct ata_port *ap, struct ata_device *dev,
+                           int force_pio0)
+{
+       unsigned long xfer_mask;
+       int highbit;
+
+       xfer_mask = ata_pack_xfermask(dev->pio_mask, dev->mwdma_mask,
+                                     dev->udma_mask);
+
+       if (!xfer_mask)
+               goto fail;
+       /* don't gear down to MWDMA from UDMA, go directly to PIO */
+       if (xfer_mask & ATA_MASK_UDMA)
+               xfer_mask &= ~ATA_MASK_MWDMA;
+
+       highbit = fls(xfer_mask) - 1;
+       xfer_mask &= ~(1 << highbit);
+       if (force_pio0)
+               xfer_mask &= 1 << ATA_SHIFT_PIO;
+       if (!xfer_mask)
+               goto fail;
+
+       ata_unpack_xfermask(xfer_mask, &dev->pio_mask, &dev->mwdma_mask,
+                           &dev->udma_mask);
+
+       printk(KERN_WARNING "ata%u: dev %u limiting speed to %s\n",
+              ap->id, dev->devno, ata_mode_string(xfer_mask));
+
+       return 0;
+
+ fail:
+       return -EINVAL;
+}
+
 static int ata_dev_set_mode(struct ata_port *ap, struct ata_device *dev)
 {
        unsigned int err_mask;
        int rc;
 
+       dev->flags &= ~ATA_DFLAG_PIO;
        if (dev->xfer_shift == ATA_SHIFT_PIO)
                dev->flags |= ATA_DFLAG_PIO;
 
@@ -1755,12 +1977,8 @@ static int ata_dev_set_mode(struct ata_port *ap, struct ata_device *dev)
        }
 
        rc = ata_dev_revalidate(ap, dev, 0);
-       if (rc) {
-               printk(KERN_ERR
-                      "ata%u: failed to revalidate after set xfermode\n",
-                      ap->id);
+       if (rc)
                return rc;
-       }
 
        DPRINTK("xfer_shift=%u, xfer_mode=0x%x\n",
                dev->xfer_shift, (int)dev->xfer_mode);
@@ -1771,104 +1989,107 @@ static int ata_dev_set_mode(struct ata_port *ap, struct ata_device *dev)
        return 0;
 }
 
-static int ata_host_set_pio(struct ata_port *ap)
-{
-       int i;
-
-       for (i = 0; i < ATA_MAX_DEVICES; i++) {
-               struct ata_device *dev = &ap->device[i];
-
-               if (!ata_dev_present(dev))
-                       continue;
-
-               if (!dev->pio_mode) {
-                       printk(KERN_WARNING "ata%u: no PIO support for device %d.\n", ap->id, i);
-                       return -1;
-               }
-
-               dev->xfer_mode = dev->pio_mode;
-               dev->xfer_shift = ATA_SHIFT_PIO;
-               if (ap->ops->set_piomode)
-                       ap->ops->set_piomode(ap, dev);
-       }
-
-       return 0;
-}
-
-static void ata_host_set_dma(struct ata_port *ap)
-{
-       int i;
-
-       for (i = 0; i < ATA_MAX_DEVICES; i++) {
-               struct ata_device *dev = &ap->device[i];
-
-               if (!ata_dev_present(dev) || !dev->dma_mode)
-                       continue;
-
-               dev->xfer_mode = dev->dma_mode;
-               dev->xfer_shift = ata_xfer_mode2shift(dev->dma_mode);
-               if (ap->ops->set_dmamode)
-                       ap->ops->set_dmamode(ap, dev);
-       }
-}
-
 /**
  *     ata_set_mode - Program timings and issue SET FEATURES - XFER
  *     @ap: port on which timings will be programmed
+ *     @r_failed_dev: out paramter for failed device
  *
- *     Set ATA device disk transfer mode (PIO3, UDMA6, etc.).
+ *     Set ATA device disk transfer mode (PIO3, UDMA6, etc.).  If
+ *     ata_set_mode() fails, pointer to the failing device is
+ *     returned in @r_failed_dev.
  *
  *     LOCKING:
  *     PCI/etc. bus probe sem.
+ *
+ *     RETURNS:
+ *     0 on success, negative errno otherwise
  */
-static void ata_set_mode(struct ata_port *ap)
+int ata_set_mode(struct ata_port *ap, struct ata_device **r_failed_dev)
 {
-       int i, rc;
+       struct ata_device *dev;
+       int i, rc = 0, used_dma = 0, found = 0;
 
        /* step 1: calculate xfer_mask */
        for (i = 0; i < ATA_MAX_DEVICES; i++) {
-               struct ata_device *dev = &ap->device[i];
                unsigned int pio_mask, dma_mask;
 
-               if (!ata_dev_present(dev))
+               dev = &ap->device[i];
+
+               if (!ata_dev_enabled(dev))
                        continue;
 
                ata_dev_xfermask(ap, dev);
 
-               /* TODO: let LLDD filter dev->*_mask here */
-
                pio_mask = ata_pack_xfermask(dev->pio_mask, 0, 0);
                dma_mask = ata_pack_xfermask(0, dev->mwdma_mask, dev->udma_mask);
                dev->pio_mode = ata_xfer_mask2mode(pio_mask);
                dev->dma_mode = ata_xfer_mask2mode(dma_mask);
+
+               found = 1;
+               if (dev->dma_mode)
+                       used_dma = 1;
        }
+       if (!found)
+               goto out;
 
        /* step 2: always set host PIO timings */
-       rc = ata_host_set_pio(ap);
-       if (rc)
-               goto err_out;
+       for (i = 0; i < ATA_MAX_DEVICES; i++) {
+               dev = &ap->device[i];
+               if (!ata_dev_enabled(dev))
+                       continue;
+
+               if (!dev->pio_mode) {
+                       printk(KERN_WARNING "ata%u: dev %u no PIO support\n",
+                              ap->id, dev->devno);
+                       rc = -EINVAL;
+                       goto out;
+               }
+
+               dev->xfer_mode = dev->pio_mode;
+               dev->xfer_shift = ATA_SHIFT_PIO;
+               if (ap->ops->set_piomode)
+                       ap->ops->set_piomode(ap, dev);
+       }
 
        /* step 3: set host DMA timings */
-       ata_host_set_dma(ap);
+       for (i = 0; i < ATA_MAX_DEVICES; i++) {
+               dev = &ap->device[i];
+
+               if (!ata_dev_enabled(dev) || !dev->dma_mode)
+                       continue;
+
+               dev->xfer_mode = dev->dma_mode;
+               dev->xfer_shift = ata_xfer_mode2shift(dev->dma_mode);
+               if (ap->ops->set_dmamode)
+                       ap->ops->set_dmamode(ap, dev);
+       }
 
        /* step 4: update devices' xfer mode */
        for (i = 0; i < ATA_MAX_DEVICES; i++) {
-               struct ata_device *dev = &ap->device[i];
+               dev = &ap->device[i];
 
-               if (!ata_dev_present(dev))
+               if (!ata_dev_enabled(dev))
                        continue;
 
-               if (ata_dev_set_mode(ap, dev))
-                       goto err_out;
+               rc = ata_dev_set_mode(ap, dev);
+               if (rc)
+                       goto out;
        }
 
+       /* Record simplex status. If we selected DMA then the other
+        * host channels are not permitted to do so.
+        */
+       if (used_dma && (ap->host_set->flags & ATA_HOST_SIMPLEX))
+               ap->host_set->simplex_claimed = 1;
+
+       /* step5: chip specific finalisation */
        if (ap->ops->post_set_mode)
                ap->ops->post_set_mode(ap);
 
-       return;
-
-err_out:
-       ata_port_disable(ap);
+ out:
+       if (rc)
+               *r_failed_dev = dev;
+       return rc;
 }
 
 /**
@@ -2017,13 +2238,12 @@ static unsigned int ata_bus_softreset(struct ata_port *ap,
         */
        msleep(150);
 
-
        /* Before we perform post reset processing we want to see if
-          the bus shows 0xFF because the odd clown forgets the D7 pulldown
-          resistor */
-
+        * the bus shows 0xFF because the odd clown forgets the D7
+        * pulldown resistor.
+        */
        if (ata_check_status(ap) == 0xFF)
-               return 1;       /* Positive is failure for some reason */
+               return AC_ERR_OTHER;
 
        ata_bus_post_reset(ap, devmask);
 
@@ -2047,7 +2267,7 @@ static unsigned int ata_bus_softreset(struct ata_port *ap,
  *     Obtains host_set lock.
  *
  *     SIDE EFFECTS:
- *     Sets ATA_FLAG_PORT_DISABLED if bus reset fails.
+ *     Sets ATA_FLAG_DISABLED if bus reset fails.
  */
 
 void ata_bus_reset(struct ata_port *ap)
@@ -2124,9 +2344,11 @@ err_out:
 static int sata_phy_resume(struct ata_port *ap)
 {
        unsigned long timeout = jiffies + (HZ * 5);
-       u32 sstatus;
+       u32 scontrol, sstatus;
 
-       scr_write_flush(ap, SCR_CONTROL, 0x300);
+       scontrol = scr_read(ap, SCR_CONTROL);
+       scontrol = (scontrol & 0x0f0) | 0x300;
+       scr_write_flush(ap, SCR_CONTROL, scontrol);
 
        /* Wait for phy to become ready, if necessary. */
        do {
@@ -2152,10 +2374,17 @@ static int sata_phy_resume(struct ata_port *ap)
  *     so makes reset sequence different from the original
  *     ->phy_reset implementation and Jeff nervous.  :-P
  */
-extern void ata_std_probeinit(struct ata_port *ap)
+void ata_std_probeinit(struct ata_port *ap)
 {
-       if (ap->flags & ATA_FLAG_SATA && ap->ops->scr_read) {
+       if ((ap->flags & ATA_FLAG_SATA) && ap->ops->scr_read) {
+               u32 spd;
+
                sata_phy_resume(ap);
+
+               spd = (scr_read(ap, SCR_CONTROL) & 0xf0) >> 4;
+               if (spd)
+                       ap->sata_spd_limit &= (1 << spd) - 1;
+
                if (sata_dev_present(ap))
                        ata_busy_sleep(ap, ATA_TMOUT_BOOT_QUICK, ATA_TMOUT_BOOT);
        }
@@ -2239,18 +2468,34 @@ int ata_std_softreset(struct ata_port *ap, int verbose, unsigned int *classes)
  */
 int sata_std_hardreset(struct ata_port *ap, int verbose, unsigned int *class)
 {
+       u32 scontrol;
+
        DPRINTK("ENTER\n");
 
-       /* Issue phy wake/reset */
-       scr_write_flush(ap, SCR_CONTROL, 0x301);
+       if (ata_set_sata_spd_needed(ap)) {
+               /* SATA spec says nothing about how to reconfigure
+                * spd.  To be on the safe side, turn off phy during
+                * reconfiguration.  This works for at least ICH7 AHCI
+                * and Sil3124.
+                */
+               scontrol = scr_read(ap, SCR_CONTROL);
+               scontrol = (scontrol & 0x0f0) | 0x302;
+               scr_write_flush(ap, SCR_CONTROL, scontrol);
 
-       /*
-        * Couldn't find anything in SATA I/II specs, but AHCI-1.1
+               ata_set_sata_spd(ap);
+       }
+
+       /* issue phy wake/reset */
+       scontrol = scr_read(ap, SCR_CONTROL);
+       scontrol = (scontrol & 0x0f0) | 0x301;
+       scr_write_flush(ap, SCR_CONTROL, scontrol);
+
+       /* Couldn't find anything in SATA I/II specs, but AHCI-1.1
         * 10.4.2 says at least 1 ms.
         */
        msleep(1);
 
-       /* Bring phy back */
+       /* bring phy back */
        sata_phy_resume(ap);
 
        /* TODO: phy layer with polling, timeouts, etc. */
@@ -2357,16 +2602,16 @@ int ata_std_probe_reset(struct ata_port *ap, unsigned int *classes)
                                     ata_std_postreset, classes);
 }
 
-static int do_probe_reset(struct ata_port *ap, ata_reset_fn_t reset,
-                         ata_postreset_fn_t postreset,
-                         unsigned int *classes)
+int ata_do_reset(struct ata_port *ap,
+                ata_reset_fn_t reset, ata_postreset_fn_t postreset,
+                int verbose, unsigned int *classes)
 {
        int i, rc;
 
        for (i = 0; i < ATA_MAX_DEVICES; i++)
                classes[i] = ATA_DEV_UNKNOWN;
 
-       rc = reset(ap, 0, classes);
+       rc = reset(ap, verbose, classes);
        if (rc)
                return rc;
 
@@ -2386,7 +2631,7 @@ static int do_probe_reset(struct ata_port *ap, ata_reset_fn_t reset,
        if (postreset)
                postreset(ap, classes);
 
-       return classes[0] != ATA_DEV_UNKNOWN ? 0 : -ENODEV;
+       return 0;
 }
 
 /**
@@ -2430,22 +2675,46 @@ int ata_drive_probe_reset(struct ata_port *ap, ata_probeinit_fn_t probeinit,
        if (probeinit)
                probeinit(ap);
 
-       if (softreset) {
-               rc = do_probe_reset(ap, softreset, postreset, classes);
-               if (rc == 0)
-                       return 0;
+       if (softreset && !ata_set_sata_spd_needed(ap)) {
+               rc = ata_do_reset(ap, softreset, postreset, 0, classes);
+               if (rc == 0 && classes[0] != ATA_DEV_UNKNOWN)
+                       goto done;
+               printk(KERN_INFO "ata%u: softreset failed, will try "
+                      "hardreset in 5 secs\n", ap->id);
+               ssleep(5);
        }
 
        if (!hardreset)
-               return rc;
+               goto done;
 
-       rc = do_probe_reset(ap, hardreset, postreset, classes);
-       if (rc == 0 || rc != -ENODEV)
-               return rc;
+       while (1) {
+               rc = ata_do_reset(ap, hardreset, postreset, 0, classes);
+               if (rc == 0) {
+                       if (classes[0] != ATA_DEV_UNKNOWN)
+                               goto done;
+                       break;
+               }
 
-       if (softreset)
-               rc = do_probe_reset(ap, softreset, postreset, classes);
+               if (ata_down_sata_spd_limit(ap))
+                       goto done;
 
+               printk(KERN_INFO "ata%u: hardreset failed, will retry "
+                      "in 5 secs\n", ap->id);
+               ssleep(5);
+       }
+
+       if (softreset) {
+               printk(KERN_INFO "ata%u: hardreset succeeded without "
+                      "classification, will retry softreset in 5 secs\n",
+                      ap->id);
+               ssleep(5);
+
+               rc = ata_do_reset(ap, softreset, postreset, 0, classes);
+       }
+
+ done:
+       if (rc == 0 && classes[0] == ATA_DEV_UNKNOWN)
+               rc = -ENODEV;
        return rc;
 }
 
@@ -2529,15 +2798,14 @@ static int ata_dev_same_device(struct ata_port *ap, struct ata_device *dev,
 int ata_dev_revalidate(struct ata_port *ap, struct ata_device *dev,
                       int post_reset)
 {
-       unsigned int class;
-       u16 *id;
+       unsigned int class = dev->class;
+       u16 *id = NULL;
        int rc;
 
-       if (!ata_dev_present(dev))
-               return -ENODEV;
-
-       class = dev->class;
-       id = NULL;
+       if (!ata_dev_enabled(dev)) {
+               rc = -ENODEV;
+               goto fail;
+       }
 
        /* allocate & read ID data */
        rc = ata_dev_read_id(ap, dev, &class, post_reset, &id);
@@ -2554,7 +2822,9 @@ int ata_dev_revalidate(struct ata_port *ap, struct ata_device *dev,
        dev->id = id;
 
        /* configure device according to the new ID */
-       return ata_dev_configure(ap, dev, 0);
+       rc = ata_dev_configure(ap, dev, 0);
+       if (rc == 0)
+               return 0;
 
  fail:
        printk(KERN_ERR "ata%u: dev %u revalidation failed (errno=%d)\n",
@@ -2643,24 +2913,44 @@ static int ata_dma_blacklisted(const struct ata_device *dev)
  *     known limits including host controller limits, device
  *     blacklist, etc...
  *
+ *     FIXME: The current implementation limits all transfer modes to
+ *     the fastest of the lowested device on the port.  This is not
+ *     required on most controllers.
+ *
  *     LOCKING:
  *     None.
  */
 static void ata_dev_xfermask(struct ata_port *ap, struct ata_device *dev)
 {
+       struct ata_host_set *hs = ap->host_set;
        unsigned long xfer_mask;
        int i;
 
-       xfer_mask = ata_pack_xfermask(ap->pio_mask, ap->mwdma_mask,
-                                     ap->udma_mask);
+       xfer_mask = ata_pack_xfermask(ap->pio_mask,
+                                     ap->mwdma_mask, ap->udma_mask);
 
-       /* use port-wide xfermask for now */
+       /* Apply cable rule here.  Don't apply it early because when
+        * we handle hot plug the cable type can itself change.
+        */
+       if (ap->cbl == ATA_CBL_PATA40)
+               xfer_mask &= ~(0xF8 << ATA_SHIFT_UDMA);
+
+       /* FIXME: Use port-wide xfermask for now */
        for (i = 0; i < ATA_MAX_DEVICES; i++) {
                struct ata_device *d = &ap->device[i];
-               if (!ata_dev_present(d))
+
+               if (ata_dev_absent(d))
                        continue;
-               xfer_mask &= ata_pack_xfermask(d->pio_mask, d->mwdma_mask,
-                                              d->udma_mask);
+
+               if (ata_dev_disabled(d)) {
+                       /* to avoid violating device selection timing */
+                       xfer_mask &= ata_pack_xfermask(d->pio_mask,
+                                                      UINT_MAX, UINT_MAX);
+                       continue;
+               }
+
+               xfer_mask &= ata_pack_xfermask(d->pio_mask,
+                                              d->mwdma_mask, d->udma_mask);
                xfer_mask &= ata_id_xfermask(d->id);
                if (ata_dma_blacklisted(d))
                        xfer_mask &= ~(ATA_MASK_MWDMA | ATA_MASK_UDMA);
@@ -2670,8 +2960,16 @@ static void ata_dev_xfermask(struct ata_port *ap, struct ata_device *dev)
                printk(KERN_WARNING "ata%u: dev %u is on DMA blacklist, "
                       "disabling DMA\n", ap->id, dev->devno);
 
-       ata_unpack_xfermask(xfer_mask, &dev->pio_mask, &dev->mwdma_mask,
-                           &dev->udma_mask);
+       if (hs->flags & ATA_HOST_SIMPLEX) {
+               if (hs->simplex_claimed)
+                       xfer_mask &= ~(ATA_MASK_MWDMA | ATA_MASK_UDMA);
+       }
+
+       if (ap->ops->mode_filter)
+               xfer_mask = ap->ops->mode_filter(ap, dev, xfer_mask);
+
+       ata_unpack_xfermask(xfer_mask, &dev->pio_mask,
+                           &dev->mwdma_mask, &dev->udma_mask);
 }
 
 /**
@@ -2705,7 +3003,7 @@ static unsigned int ata_dev_set_xfermode(struct ata_port *ap,
        tf.protocol = ATA_PROT_NODATA;
        tf.nsect = dev->xfer_mode;
 
-       err_mask = ata_exec_internal(ap, dev, &tf, DMA_NONE, NULL, 0);
+       err_mask = ata_exec_internal(ap, dev, &tf, NULL, DMA_NONE, NULL, 0);
 
        DPRINTK("EXIT, err_mask=%x\n", err_mask);
        return err_mask;
@@ -2724,16 +3022,16 @@ static unsigned int ata_dev_set_xfermode(struct ata_port *ap,
  */
 
 static unsigned int ata_dev_init_params(struct ata_port *ap,
-                                       struct ata_device *dev)
+                                       struct ata_device *dev,
+                                       u16 heads,
+                                       u16 sectors)
 {
        struct ata_taskfile tf;
        unsigned int err_mask;
-       u16 sectors = dev->id[6];
-       u16 heads   = dev->id[3];
 
        /* Number of sectors per track 1-255. Number of heads 1-16 */
        if (sectors < 1 || sectors > 255 || heads < 1 || heads > 16)
-               return 0;
+               return AC_ERR_INVALID;
 
        /* set up init dev params taskfile */
        DPRINTK("init dev params \n");
@@ -2745,7 +3043,7 @@ static unsigned int ata_dev_init_params(struct ata_port *ap,
        tf.nsect = sectors;
        tf.device |= (heads - 1) & 0x0f; /* max head = num. of heads - 1 */
 
-       err_mask = ata_exec_internal(ap, dev, &tf, DMA_NONE, NULL, 0);
+       err_mask = ata_exec_internal(ap, dev, &tf, NULL, DMA_NONE, NULL, 0);
 
        DPRINTK("EXIT, err_mask=%x\n", err_mask);
        return err_mask;
@@ -3611,13 +3909,16 @@ fsm_start:
 
                /* Device should not ask for data transfer (DRQ=1)
                 * when it finds something wrong.
-                * Anyway, we respect DRQ here and let HSM go on
-                * without changing hsm_task_state to HSM_ST_ERR.
+                * We ignore DRQ here and stop the HSM by
+                * changing hsm_task_state to HSM_ST_ERR and
+                * let the EH abort the command or reset the device.
                 */
                if (unlikely(status & (ATA_ERR | ATA_DF))) {
                        printk(KERN_WARNING "ata%d: DRQ=1 with device error, dev_stat 0x%X\n",
                               ap->id, status);
                        qc->err_mask |= AC_ERR_DEV;
+                       ap->hsm_task_state = HSM_ST_ERR;
+                       goto fsm_start;
                }
 
                /* Send the CDB (atapi) or the first data block (ata pio out).
@@ -3664,13 +3965,16 @@ fsm_start:
 
                        /* Device should not ask for data transfer (DRQ=1)
                         * when it finds something wrong.
-                        * Anyway, we respect DRQ here and let HSM go on
-                        * without changing hsm_task_state to HSM_ST_ERR.
+                        * We ignore DRQ here and stop the HSM by
+                        * changing hsm_task_state to HSM_ST_ERR and
+                        * let the EH abort the command or reset the device.
                         */
                        if (unlikely(status & (ATA_ERR | ATA_DF))) {
                                printk(KERN_WARNING "ata%d: DRQ=1 with device error, dev_stat 0x%X\n",
                                       ap->id, status);
                                qc->err_mask |= AC_ERR_DEV;
+                               ap->hsm_task_state = HSM_ST_ERR;
+                               goto fsm_start;
                        }
 
                        atapi_pio_bytes(qc);
@@ -3688,20 +3992,32 @@ fsm_start:
                                goto fsm_start;
                        }
 
-                       /* Some devices may ask for data transfer (DRQ=1)
-                        * alone with ERR=1 for PIO reads.
-                        * We respect DRQ here and let HSM go on without
-                        * changing hsm_task_state to HSM_ST_ERR.
+                       /* For PIO reads, some devices may ask for
+                        * data transfer (DRQ=1) alone with ERR=1.
+                        * We respect DRQ here and transfer one
+                        * block of junk data before changing the
+                        * hsm_task_state to HSM_ST_ERR.
+                        *
+                        * For PIO writes, ERR=1 DRQ=1 doesn't make
+                        * sense since the data block has been
+                        * transferred to the device.
                         */
                        if (unlikely(status & (ATA_ERR | ATA_DF))) {
-                               /* For writes, ERR=1 DRQ=1 doesn't make
-                                * sense since the data block has been
-                                * transferred to the device.
-                                */
-                               WARN_ON(qc->tf.flags & ATA_TFLAG_WRITE);
-
                                /* data might be corrputed */
                                qc->err_mask |= AC_ERR_DEV;
+
+                               if (!(qc->tf.flags & ATA_TFLAG_WRITE)) {
+                                       ata_pio_sectors(qc);
+                                       ata_altstatus(ap);
+                                       status = ata_wait_idle(ap);
+                               }
+
+                               /* ata_pio_sectors() might change the
+                                * state to HSM_ST_LAST. so, the state
+                                * is changed after ata_pio_sectors().
+                                */
+                               ap->hsm_task_state = HSM_ST_ERR;
+                               goto fsm_start;
                        }
 
                        ata_pio_sectors(qc);
@@ -3773,8 +4089,8 @@ fsm_start:
 
 static void ata_pio_task(void *_data)
 {
-       struct ata_port *ap = _data;
-       struct ata_queued_cmd *qc;
+       struct ata_queued_cmd *qc = _data;
+       struct ata_port *ap = qc->ap;
        u8 status;
        int poll_next;
 
@@ -3811,101 +4127,6 @@ fsm_start:
                goto fsm_start;
 }
 
-/**
- *     ata_qc_timeout - Handle timeout of queued command
- *     @qc: Command that timed out
- *
- *     Some part of the kernel (currently, only the SCSI layer)
- *     has noticed that the active command on port @ap has not
- *     completed after a specified length of time.  Handle this
- *     condition by disabling DMA (if necessary) and completing
- *     transactions, with error if necessary.
- *
- *     This also handles the case of the "lost interrupt", where
- *     for some reason (possibly hardware bug, possibly driver bug)
- *     an interrupt was not delivered to the driver, even though the
- *     transaction completed successfully.
- *
- *     LOCKING:
- *     Inherited from SCSI layer (none, can sleep)
- */
-
-static void ata_qc_timeout(struct ata_queued_cmd *qc)
-{
-       struct ata_port *ap = qc->ap;
-       struct ata_host_set *host_set = ap->host_set;
-       u8 host_stat = 0, drv_stat;
-       unsigned long flags;
-
-       DPRINTK("ENTER\n");
-
-       ap->hsm_task_state = HSM_ST_IDLE;
-
-       spin_lock_irqsave(&host_set->lock, flags);
-
-       switch (qc->tf.protocol) {
-
-       case ATA_PROT_DMA:
-       case ATA_PROT_ATAPI_DMA:
-               host_stat = ap->ops->bmdma_status(ap);
-
-               /* before we do anything else, clear DMA-Start bit */
-               ap->ops->bmdma_stop(qc);
-
-               /* fall through */
-
-       default:
-               ata_altstatus(ap);
-               drv_stat = ata_chk_status(ap);
-
-               /* ack bmdma irq events */
-               ap->ops->irq_clear(ap);
-
-               printk(KERN_ERR "ata%u: command 0x%x timeout, stat 0x%x host_stat 0x%x\n",
-                      ap->id, qc->tf.command, drv_stat, host_stat);
-
-               ap->hsm_task_state = HSM_ST_IDLE;
-
-               /* complete taskfile transaction */
-               qc->err_mask |= AC_ERR_TIMEOUT;
-               break;
-       }
-
-       spin_unlock_irqrestore(&host_set->lock, flags);
-
-       ata_eh_qc_complete(qc);
-
-       DPRINTK("EXIT\n");
-}
-
-/**
- *     ata_eng_timeout - Handle timeout of queued command
- *     @ap: Port on which timed-out command is active
- *
- *     Some part of the kernel (currently, only the SCSI layer)
- *     has noticed that the active command on port @ap has not
- *     completed after a specified length of time.  Handle this
- *     condition by disabling DMA (if necessary) and completing
- *     transactions, with error if necessary.
- *
- *     This also handles the case of the "lost interrupt", where
- *     for some reason (possibly hardware bug, possibly driver bug)
- *     an interrupt was not delivered to the driver, even though the
- *     transaction completed successfully.
- *
- *     LOCKING:
- *     Inherited from SCSI layer (none, can sleep)
- */
-
-void ata_eng_timeout(struct ata_port *ap)
-{
-       DPRINTK("ENTER\n");
-
-       ata_qc_timeout(ata_qc_from_tag(ap, ap->active_tag));
-
-       DPRINTK("EXIT\n");
-}
-
 /**
  *     ata_qc_new - Request an available ATA command, for queueing
  *     @ap: Port associated with device @dev
@@ -4037,15 +4258,14 @@ static inline int ata_should_dma_map(struct ata_queued_cmd *qc)
  *
  *     LOCKING:
  *     spin_lock_irqsave(host_set lock)
- *
- *     RETURNS:
- *     Zero on success, AC_ERR_* mask on failure
  */
-
-unsigned int ata_qc_issue(struct ata_queued_cmd *qc)
+void ata_qc_issue(struct ata_queued_cmd *qc)
 {
        struct ata_port *ap = qc->ap;
 
+       qc->ap->active_tag = qc->tag;
+       qc->flags |= ATA_QCFLAG_ACTIVE;
+
        if (ata_should_dma_map(qc)) {
                if (qc->flags & ATA_QCFLAG_SG) {
                        if (ata_sg_setup(qc))
@@ -4060,17 +4280,18 @@ unsigned int ata_qc_issue(struct ata_queued_cmd *qc)
 
        ap->ops->qc_prep(qc);
 
-       qc->ap->active_tag = qc->tag;
-       qc->flags |= ATA_QCFLAG_ACTIVE;
-
-       return ap->ops->qc_issue(qc);
+       qc->err_mask |= ap->ops->qc_issue(qc);
+       if (unlikely(qc->err_mask))
+               goto err;
+       return;
 
 sg_err:
        qc->flags &= ~ATA_QCFLAG_DMAMAP;
-       return AC_ERR_SYSTEM;
+       qc->err_mask |= AC_ERR_SYSTEM;
+err:
+       ata_qc_complete(qc);
 }
 
-
 /**
  *     ata_qc_issue_prot - issue taskfile to device in proto-dependent manner
  *     @qc: command to issue to device
@@ -4327,7 +4548,7 @@ irqreturn_t ata_interrupt (int irq, void *dev_instance, struct pt_regs *regs)
 
                ap = host_set->ports[i];
                if (ap &&
-                   !(ap->flags & ATA_FLAG_PORT_DISABLED)) {
+                   !(ap->flags & ATA_FLAG_DISABLED)) {
                        struct ata_queued_cmd *qc;
 
                        qc = ata_qc_from_tag(ap, ap->active_tag);
@@ -4359,7 +4580,7 @@ static int ata_do_simple_cmd(struct ata_port *ap, struct ata_device *dev,
        tf.flags |= ATA_TFLAG_DEVICE;
        tf.protocol = ATA_PROT_NODATA;
 
-       err = ata_exec_internal(ap, dev, &tf, DMA_NONE, NULL, 0);
+       err = ata_exec_internal(ap, dev, &tf, NULL, DMA_NONE, NULL, 0);
        if (err)
                printk(KERN_ERR "%s: ata command failed: %d\n",
                                __FUNCTION__, err);
@@ -4405,10 +4626,12 @@ static int ata_start_drive(struct ata_port *ap, struct ata_device *dev)
 int ata_device_resume(struct ata_port *ap, struct ata_device *dev)
 {
        if (ap->flags & ATA_FLAG_SUSPENDED) {
+               struct ata_device *failed_dev;
                ap->flags &= ~ATA_FLAG_SUSPENDED;
-               ata_set_mode(ap);
+               while (ata_set_mode(ap, &failed_dev))
+                       ata_dev_disable(ap, failed_dev);
        }
-       if (!ata_dev_present(dev))
+       if (!ata_dev_enabled(dev))
                return 0;
        if (dev->class == ATA_DEV_ATA)
                ata_start_drive(ap, dev);
@@ -4426,7 +4649,7 @@ int ata_device_resume(struct ata_port *ap, struct ata_device *dev)
  */
 int ata_device_suspend(struct ata_port *ap, struct ata_device *dev, pm_message_t state)
 {
-       if (!ata_dev_present(dev))
+       if (!ata_dev_enabled(dev))
                return 0;
        if (dev->class == ATA_DEV_ATA)
                ata_flush_cache(ap, dev);
@@ -4546,7 +4769,7 @@ static void ata_host_init(struct ata_port *ap, struct Scsi_Host *host,
        host->unique_id = ata_unique_id++;
        host->max_cmd_len = 12;
 
-       ap->flags = ATA_FLAG_PORT_DISABLED;
+       ap->flags = ATA_FLAG_DISABLED;
        ap->id = host->unique_id;
        ap->host = host;
        ap->ctl = ATA_DEVCTL_OBS;
@@ -4561,6 +4784,7 @@ static void ata_host_init(struct ata_port *ap, struct Scsi_Host *host,
        ap->flags |= ent->host_flags;
        ap->ops = ent->port_ops;
        ap->cbl = ATA_CBL_NONE;
+       ap->sata_spd_limit = UINT_MAX;
        ap->active_tag = ATA_TAG_POISON;
        ap->last_ctl = 0xFF;
 
@@ -4675,6 +4899,7 @@ int ata_device_add(const struct ata_probe_ent *ent)
        host_set->mmio_base = ent->mmio_base;
        host_set->private_data = ent->private_data;
        host_set->ops = ent->port_ops;
+       host_set->flags = ent->host_set_flags;
 
        /* register each port bound to this device */
        for (i = 0; i < ent->n_ports; i++) {
@@ -5015,7 +5240,6 @@ EXPORT_SYMBOL_GPL(ata_sg_init);
 EXPORT_SYMBOL_GPL(ata_sg_init_one);
 EXPORT_SYMBOL_GPL(__ata_qc_complete);
 EXPORT_SYMBOL_GPL(ata_qc_issue_prot);
-EXPORT_SYMBOL_GPL(ata_eng_timeout);
 EXPORT_SYMBOL_GPL(ata_tf_load);
 EXPORT_SYMBOL_GPL(ata_tf_read);
 EXPORT_SYMBOL_GPL(ata_noop_dev_select);
@@ -5055,15 +5279,12 @@ EXPORT_SYMBOL_GPL(ata_busy_sleep);
 EXPORT_SYMBOL_GPL(ata_port_queue_task);
 EXPORT_SYMBOL_GPL(ata_scsi_ioctl);
 EXPORT_SYMBOL_GPL(ata_scsi_queuecmd);
-EXPORT_SYMBOL_GPL(ata_scsi_error);
 EXPORT_SYMBOL_GPL(ata_scsi_slave_config);
 EXPORT_SYMBOL_GPL(ata_scsi_release);
 EXPORT_SYMBOL_GPL(ata_host_intr);
 EXPORT_SYMBOL_GPL(ata_id_string);
 EXPORT_SYMBOL_GPL(ata_id_c_string);
 EXPORT_SYMBOL_GPL(ata_scsi_simulate);
-EXPORT_SYMBOL_GPL(ata_eh_qc_complete);
-EXPORT_SYMBOL_GPL(ata_eh_qc_retry);
 
 EXPORT_SYMBOL_GPL(ata_pio_need_iordy);
 EXPORT_SYMBOL_GPL(ata_timing_compute);
@@ -5085,3 +5306,8 @@ EXPORT_SYMBOL_GPL(ata_device_suspend);
 EXPORT_SYMBOL_GPL(ata_device_resume);
 EXPORT_SYMBOL_GPL(ata_scsi_device_suspend);
 EXPORT_SYMBOL_GPL(ata_scsi_device_resume);
+
+EXPORT_SYMBOL_GPL(ata_scsi_error);
+EXPORT_SYMBOL_GPL(ata_eng_timeout);
+EXPORT_SYMBOL_GPL(ata_eh_qc_complete);
+EXPORT_SYMBOL_GPL(ata_eh_qc_retry);
This page took 0.144156 seconds and 5 git commands to generate.