]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/ata/libata-core.c
Merge branch 'upstream-linus' of master.kernel.org:/pub/scm/linux/kernel/git/jgarzik...
[linux-2.6-omap-h63xx.git] / drivers / ata / libata-core.c
index 3da642bd2ee281e77c641aa55c16f72d372a93c8..629eadbd0ec09c17f538ace9ffd7921161679eac 100644 (file)
@@ -59,8 +59,6 @@
 
 #include "libata.h"
 
-#define DRV_VERSION    "2.21"  /* must be exactly four chars */
-
 
 /* debounce timing parameters in msecs { interval, duration, timeout } */
 const unsigned long sata_deb_timing_normal[]           = {   5,  100, 2000 };
@@ -70,6 +68,7 @@ const unsigned long sata_deb_timing_long[]            = { 100, 2000, 5000 };
 static unsigned int ata_dev_init_params(struct ata_device *dev,
                                        u16 heads, u16 sectors);
 static unsigned int ata_dev_set_xfermode(struct ata_device *dev);
+static unsigned int ata_dev_set_AN(struct ata_device *dev, u8 enable);
 static void ata_dev_xfermask(struct ata_device *dev);
 static unsigned long ata_dev_blacklisted(const struct ata_device *dev);
 
@@ -86,6 +85,10 @@ int atapi_dmadir = 0;
 module_param(atapi_dmadir, int, 0444);
 MODULE_PARM_DESC(atapi_dmadir, "Enable ATAPI DMADIR bridge support (0=off, 1=on)");
 
+int atapi_passthru16 = 1;
+module_param(atapi_passthru16, int, 0444);
+MODULE_PARM_DESC(atapi_passthru16, "Enable ATA_16 passthru for ATAPI devices; on by default (0=off, 1=on)");
+
 int libata_fua = 0;
 module_param_named(fua, libata_fua, int, 0444);
 MODULE_PARM_DESC(fua, "FUA support (0=off, 1=on)");
@@ -94,13 +97,17 @@ static int ata_ignore_hpa = 0;
 module_param_named(ignore_hpa, ata_ignore_hpa, int, 0644);
 MODULE_PARM_DESC(ignore_hpa, "Ignore HPA limit (0=keep BIOS limits, 1=ignore limits, using full disk)");
 
+static int libata_dma_mask = ATA_DMA_MASK_ATA|ATA_DMA_MASK_ATAPI|ATA_DMA_MASK_CFA;
+module_param_named(dma, libata_dma_mask, int, 0444);
+MODULE_PARM_DESC(dma, "DMA enable/disable (0x1==ATA, 0x2==ATAPI, 0x4==CF)");
+
 static int ata_probe_timeout = ATA_TMOUT_INTERNAL / HZ;
 module_param(ata_probe_timeout, int, 0444);
 MODULE_PARM_DESC(ata_probe_timeout, "Set ATA probing timeout (seconds)");
 
-int libata_noacpi = 1;
+int libata_noacpi = 0;
 module_param_named(noacpi, libata_noacpi, int, 0444);
-MODULE_PARM_DESC(noacpi, "Disables the use of ACPI in suspend/resume when set");
+MODULE_PARM_DESC(noacpi, "Disables the use of ACPI in probe/suspend/resume when set");
 
 MODULE_AUTHOR("Jeff Garzik");
 MODULE_DESCRIPTION("Library module for ATA devices");
@@ -667,37 +674,57 @@ static unsigned int ata_devchk(struct ata_port *ap, unsigned int device)
  *     None.
  *
  *     RETURNS:
- *     Device type, %ATA_DEV_ATA, %ATA_DEV_ATAPI, or %ATA_DEV_UNKNOWN
- *     the event of failure.
+ *     Device type, %ATA_DEV_ATA, %ATA_DEV_ATAPI, %ATA_DEV_PMP or
+ *     %ATA_DEV_UNKNOWN the event of failure.
  */
-
 unsigned int ata_dev_classify(const struct ata_taskfile *tf)
 {
        /* Apple's open source Darwin code hints that some devices only
         * put a proper signature into the LBA mid/high registers,
         * So, we only check those.  It's sufficient for uniqueness.
+        *
+        * ATA/ATAPI-7 (d1532v1r1: Feb. 19, 2003) specified separate
+        * signatures for ATA and ATAPI devices attached on SerialATA,
+        * 0x3c/0xc3 and 0x69/0x96 respectively.  However, SerialATA
+        * spec has never mentioned about using different signatures
+        * for ATA/ATAPI devices.  Then, Serial ATA II: Port
+        * Multiplier specification began to use 0x69/0x96 to identify
+        * port multpliers and 0x3c/0xc3 to identify SEMB device.
+        * ATA/ATAPI-7 dropped descriptions about 0x3c/0xc3 and
+        * 0x69/0x96 shortly and described them as reserved for
+        * SerialATA.
+        *
+        * We follow the current spec and consider that 0x69/0x96
+        * identifies a port multiplier and 0x3c/0xc3 a SEMB device.
         */
-
-       if (((tf->lbam == 0) && (tf->lbah == 0)) ||
-           ((tf->lbam == 0x3c) && (tf->lbah == 0xc3))) {
+       if ((tf->lbam == 0) && (tf->lbah == 0)) {
                DPRINTK("found ATA device by sig\n");
                return ATA_DEV_ATA;
        }
 
-       if (((tf->lbam == 0x14) && (tf->lbah == 0xeb)) ||
-           ((tf->lbam == 0x69) && (tf->lbah == 0x96))) {
+       if ((tf->lbam == 0x14) && (tf->lbah == 0xeb)) {
                DPRINTK("found ATAPI device by sig\n");
                return ATA_DEV_ATAPI;
        }
 
+       if ((tf->lbam == 0x69) && (tf->lbah == 0x96)) {
+               DPRINTK("found PMP device by sig\n");
+               return ATA_DEV_PMP;
+       }
+
+       if ((tf->lbam == 0x3c) && (tf->lbah == 0xc3)) {
+               printk("ata: SEMB device ignored\n");
+               return ATA_DEV_SEMB_UNSUP; /* not yet */
+       }
+
        DPRINTK("unknown device\n");
        return ATA_DEV_UNKNOWN;
 }
 
 /**
  *     ata_dev_try_classify - Parse returned ATA device signature
- *     @ap: ATA channel to examine
- *     @device: Device to examine (starting at zero)
+ *     @dev: ATA device to classify (starting at zero)
+ *     @present: device seems present
  *     @r_err: Value of error register on completion
  *
  *     After an event -- SRST, E.D.D., or SATA COMRESET -- occurs,
@@ -715,15 +742,15 @@ unsigned int ata_dev_classify(const struct ata_taskfile *tf)
  *     RETURNS:
  *     Device type - %ATA_DEV_ATA, %ATA_DEV_ATAPI or %ATA_DEV_NONE.
  */
-
-unsigned int
-ata_dev_try_classify(struct ata_port *ap, unsigned int device, u8 *r_err)
+unsigned int ata_dev_try_classify(struct ata_device *dev, int present,
+                                 u8 *r_err)
 {
+       struct ata_port *ap = dev->link->ap;
        struct ata_taskfile tf;
        unsigned int class;
        u8 err;
 
-       ap->ops->dev_select(ap, device);
+       ap->ops->dev_select(ap, dev->devno);
 
        memset(&tf, 0, sizeof(tf));
 
@@ -733,12 +760,12 @@ ata_dev_try_classify(struct ata_port *ap, unsigned int device, u8 *r_err)
                *r_err = err;
 
        /* see if device passed diags: if master then continue and warn later */
-       if (err == 0 && device == 0)
+       if (err == 0 && dev->devno == 0)
                /* diagnostic fail : do nothing _YET_ */
-               ap->link.device[device].horkage |= ATA_HORKAGE_DIAGNOSTIC;
+               dev->horkage |= ATA_HORKAGE_DIAGNOSTIC;
        else if (err == 1)
                /* do nothing */ ;
-       else if ((device == 0) && (err == 0x81))
+       else if ((dev->devno == 0) && (err == 0x81))
                /* do nothing */ ;
        else
                return ATA_DEV_NONE;
@@ -746,10 +773,20 @@ ata_dev_try_classify(struct ata_port *ap, unsigned int device, u8 *r_err)
        /* determine if device is ATA or ATAPI */
        class = ata_dev_classify(&tf);
 
-       if (class == ATA_DEV_UNKNOWN)
-               return ATA_DEV_NONE;
-       if ((class == ATA_DEV_ATA) && (ata_chk_status(ap) == 0))
-               return ATA_DEV_NONE;
+       if (class == ATA_DEV_UNKNOWN) {
+               /* If the device failed diagnostic, it's likely to
+                * have reported incorrect device signature too.
+                * Assume ATA device if the device seems present but
+                * device signature is invalid with diagnostic
+                * failure.
+                */
+               if (present && (dev->horkage & ATA_HORKAGE_DIAGNOSTIC))
+                       class = ATA_DEV_ATA;
+               else
+                       class = ATA_DEV_NONE;
+       } else if ((class == ATA_DEV_ATA) && (ata_chk_status(ap) == 0))
+               class = ATA_DEV_NONE;
+
        return class;
 }
 
@@ -816,6 +853,21 @@ void ata_id_c_string(const u16 *id, unsigned char *s,
        *p = '\0';
 }
 
+static u64 ata_id_n_sectors(const u16 *id)
+{
+       if (ata_id_has_lba(id)) {
+               if (ata_id_has_lba48(id))
+                       return ata_id_u64(id, 100);
+               else
+                       return ata_id_u32(id, 60);
+       } else {
+               if (ata_id_current_chs_valid(id))
+                       return ata_id_u32(id, 57);
+               else
+                       return id[1] * id[3] * id[6];
+       }
+}
+
 static u64 ata_tf_to_lba48(struct ata_taskfile *tf)
 {
        u64 sectors = 0;
@@ -843,129 +895,110 @@ static u64 ata_tf_to_lba(struct ata_taskfile *tf)
 }
 
 /**
- *     ata_read_native_max_address_ext -       LBA48 native max query
- *     @dev: Device to query
+ *     ata_read_native_max_address - Read native max address
+ *     @dev: target device
+ *     @max_sectors: out parameter for the result native max address
  *
- *     Perform an LBA48 size query upon the device in question. Return the
- *     actual LBA48 size or zero if the command fails.
- */
-
-static u64 ata_read_native_max_address_ext(struct ata_device *dev)
-{
-       unsigned int err;
-       struct ata_taskfile tf;
-
-       ata_tf_init(dev, &tf);
-
-       tf.command = ATA_CMD_READ_NATIVE_MAX_EXT;
-       tf.flags |= ATA_TFLAG_DEVICE | ATA_TFLAG_LBA48 | ATA_TFLAG_ISADDR;
-       tf.protocol |= ATA_PROT_NODATA;
-       tf.device |= 0x40;
-
-       err = ata_exec_internal(dev, &tf, NULL, DMA_NONE, NULL, 0);
-       if (err)
-               return 0;
-
-       return ata_tf_to_lba48(&tf);
-}
-
-/**
- *     ata_read_native_max_address     -       LBA28 native max query
- *     @dev: Device to query
+ *     Perform an LBA48 or LBA28 native size query upon the device in
+ *     question.
  *
- *     Performa an LBA28 size query upon the device in question. Return the
- *     actual LBA28 size or zero if the command fails.
+ *     RETURNS:
+ *     0 on success, -EACCES if command is aborted by the drive.
+ *     -EIO on other errors.
  */
-
-static u64 ata_read_native_max_address(struct ata_device *dev)
+static int ata_read_native_max_address(struct ata_device *dev, u64 *max_sectors)
 {
-       unsigned int err;
+       unsigned int err_mask;
        struct ata_taskfile tf;
+       int lba48 = ata_id_has_lba48(dev->id);
 
        ata_tf_init(dev, &tf);
 
-       tf.command = ATA_CMD_READ_NATIVE_MAX;
+       /* always clear all address registers */
        tf.flags |= ATA_TFLAG_DEVICE | ATA_TFLAG_ISADDR;
+
+       if (lba48) {
+               tf.command = ATA_CMD_READ_NATIVE_MAX_EXT;
+               tf.flags |= ATA_TFLAG_LBA48;
+       } else
+               tf.command = ATA_CMD_READ_NATIVE_MAX;
+
        tf.protocol |= ATA_PROT_NODATA;
-       tf.device |= 0x40;
+       tf.device |= ATA_LBA;
 
-       err = ata_exec_internal(dev, &tf, NULL, DMA_NONE, NULL, 0);
-       if (err)
-               return 0;
+       err_mask = ata_exec_internal(dev, &tf, NULL, DMA_NONE, NULL, 0, 0);
+       if (err_mask) {
+               ata_dev_printk(dev, KERN_WARNING, "failed to read native "
+                              "max address (err_mask=0x%x)\n", err_mask);
+               if (err_mask == AC_ERR_DEV && (tf.feature & ATA_ABORTED))
+                       return -EACCES;
+               return -EIO;
+       }
 
-       return ata_tf_to_lba(&tf);
+       if (lba48)
+               *max_sectors = ata_tf_to_lba48(&tf);
+       else
+               *max_sectors = ata_tf_to_lba(&tf);
+        if (dev->horkage & ATA_HORKAGE_HPA_SIZE)
+               (*max_sectors)--;
+       return 0;
 }
 
 /**
- *     ata_set_native_max_address_ext  -       LBA48 native max set
- *     @dev: Device to query
+ *     ata_set_max_sectors - Set max sectors
+ *     @dev: target device
  *     @new_sectors: new max sectors value to set for the device
  *
- *     Perform an LBA48 size set max upon the device in question. Return the
- *     actual LBA48 size or zero if the command fails.
+ *     Set max sectors of @dev to @new_sectors.
+ *
+ *     RETURNS:
+ *     0 on success, -EACCES if command is aborted or denied (due to
+ *     previous non-volatile SET_MAX) by the drive.  -EIO on other
+ *     errors.
  */
-
-static u64 ata_set_native_max_address_ext(struct ata_device *dev, u64 new_sectors)
+static int ata_set_max_sectors(struct ata_device *dev, u64 new_sectors)
 {
-       unsigned int err;
+       unsigned int err_mask;
        struct ata_taskfile tf;
+       int lba48 = ata_id_has_lba48(dev->id);
 
        new_sectors--;
 
        ata_tf_init(dev, &tf);
 
-       tf.command = ATA_CMD_SET_MAX_EXT;
-       tf.flags |= ATA_TFLAG_DEVICE | ATA_TFLAG_LBA48 | ATA_TFLAG_ISADDR;
-       tf.protocol |= ATA_PROT_NODATA;
-       tf.device |= 0x40;
-
-       tf.lbal = (new_sectors >> 0) & 0xff;
-       tf.lbam = (new_sectors >> 8) & 0xff;
-       tf.lbah = (new_sectors >> 16) & 0xff;
-
-       tf.hob_lbal = (new_sectors >> 24) & 0xff;
-       tf.hob_lbam = (new_sectors >> 32) & 0xff;
-       tf.hob_lbah = (new_sectors >> 40) & 0xff;
-
-       err = ata_exec_internal(dev, &tf, NULL, DMA_NONE, NULL, 0);
-       if (err)
-               return 0;
-
-       return ata_tf_to_lba48(&tf);
-}
-
-/**
- *     ata_set_native_max_address      -       LBA28 native max set
- *     @dev: Device to query
- *     @new_sectors: new max sectors value to set for the device
- *
- *     Perform an LBA28 size set max upon the device in question. Return the
- *     actual LBA28 size or zero if the command fails.
- */
+       tf.flags |= ATA_TFLAG_DEVICE | ATA_TFLAG_ISADDR;
 
-static u64 ata_set_native_max_address(struct ata_device *dev, u64 new_sectors)
-{
-       unsigned int err;
-       struct ata_taskfile tf;
+       if (lba48) {
+               tf.command = ATA_CMD_SET_MAX_EXT;
+               tf.flags |= ATA_TFLAG_LBA48;
 
-       new_sectors--;
+               tf.hob_lbal = (new_sectors >> 24) & 0xff;
+               tf.hob_lbam = (new_sectors >> 32) & 0xff;
+               tf.hob_lbah = (new_sectors >> 40) & 0xff;
+       } else {
+               tf.command = ATA_CMD_SET_MAX;
 
-       ata_tf_init(dev, &tf);
+               tf.device |= (new_sectors >> 24) & 0xf;
+       }
 
-       tf.command = ATA_CMD_SET_MAX;
-       tf.flags |= ATA_TFLAG_DEVICE | ATA_TFLAG_ISADDR;
        tf.protocol |= ATA_PROT_NODATA;
+       tf.device |= ATA_LBA;
 
        tf.lbal = (new_sectors >> 0) & 0xff;
        tf.lbam = (new_sectors >> 8) & 0xff;
        tf.lbah = (new_sectors >> 16) & 0xff;
-       tf.device |= ((new_sectors >> 24) & 0x0f) | 0x40;
 
-       err = ata_exec_internal(dev, &tf, NULL, DMA_NONE, NULL, 0);
-       if (err)
-               return 0;
+       err_mask = ata_exec_internal(dev, &tf, NULL, DMA_NONE, NULL, 0, 0);
+       if (err_mask) {
+               ata_dev_printk(dev, KERN_WARNING, "failed to set "
+                              "max address (err_mask=0x%x)\n", err_mask);
+               if (err_mask == AC_ERR_DEV &&
+                   (tf.feature & (ATA_ABORTED | ATA_IDNF)))
+                       return -EACCES;
+               return -EIO;
+       }
 
-       return ata_tf_to_lba(&tf);
+       return 0;
 }
 
 /**
@@ -975,60 +1008,93 @@ static u64 ata_set_native_max_address(struct ata_device *dev, u64 new_sectors)
  *     Read the size of an LBA28 or LBA48 disk with HPA features and resize
  *     it if required to the full size of the media. The caller must check
  *     the drive has the HPA feature set enabled.
+ *
+ *     RETURNS:
+ *     0 on success, -errno on failure.
  */
-
-static u64 ata_hpa_resize(struct ata_device *dev)
+static int ata_hpa_resize(struct ata_device *dev)
 {
-       u64 sectors = dev->n_sectors;
-       u64 hpa_sectors;
+       struct ata_eh_context *ehc = &dev->link->eh_context;
+       int print_info = ehc->i.flags & ATA_EHI_PRINTINFO;
+       u64 sectors = ata_id_n_sectors(dev->id);
+       u64 native_sectors;
+       int rc;
 
-       if (ata_id_has_lba48(dev->id))
-               hpa_sectors = ata_read_native_max_address_ext(dev);
-       else
-               hpa_sectors = ata_read_native_max_address(dev);
+       /* do we need to do it? */
+       if (dev->class != ATA_DEV_ATA ||
+           !ata_id_has_lba(dev->id) || !ata_id_hpa_enabled(dev->id) ||
+           (dev->horkage & ATA_HORKAGE_BROKEN_HPA))
+               return 0;
 
-       if (hpa_sectors > sectors) {
-               ata_dev_printk(dev, KERN_INFO,
-                       "Host Protected Area detected:\n"
-                       "\tcurrent size: %lld sectors\n"
-                       "\tnative size: %lld sectors\n",
-                       (long long)sectors, (long long)hpa_sectors);
-
-               if (ata_ignore_hpa) {
-                       if (ata_id_has_lba48(dev->id))
-                               hpa_sectors = ata_set_native_max_address_ext(dev, hpa_sectors);
-                       else
-                               hpa_sectors = ata_set_native_max_address(dev,
-                                                               hpa_sectors);
-
-                       if (hpa_sectors) {
-                               ata_dev_printk(dev, KERN_INFO, "native size "
-                                       "increased to %lld sectors\n",
-                                       (long long)hpa_sectors);
-                               return hpa_sectors;
-                       }
+       /* read native max address */
+       rc = ata_read_native_max_address(dev, &native_sectors);
+       if (rc) {
+               /* If HPA isn't going to be unlocked, skip HPA
+                * resizing from the next try.
+                */
+               if (!ata_ignore_hpa) {
+                       ata_dev_printk(dev, KERN_WARNING, "HPA support seems "
+                                      "broken, will skip HPA handling\n");
+                       dev->horkage |= ATA_HORKAGE_BROKEN_HPA;
+
+                       /* we can continue if device aborted the command */
+                       if (rc == -EACCES)
+                               rc = 0;
                }
-       } else if (hpa_sectors < sectors)
-               ata_dev_printk(dev, KERN_WARNING, "%s 1: hpa sectors (%lld) "
-                              "is smaller than sectors (%lld)\n", __FUNCTION__,
-                              (long long)hpa_sectors, (long long)sectors);
 
-       return sectors;
-}
+               return rc;
+       }
 
-static u64 ata_id_n_sectors(const u16 *id)
-{
-       if (ata_id_has_lba(id)) {
-               if (ata_id_has_lba48(id))
-                       return ata_id_u64(id, 100);
-               else
-                       return ata_id_u32(id, 60);
-       } else {
-               if (ata_id_current_chs_valid(id))
-                       return ata_id_u32(id, 57);
-               else
-                       return id[1] * id[3] * id[6];
+       /* nothing to do? */
+       if (native_sectors <= sectors || !ata_ignore_hpa) {
+               if (!print_info || native_sectors == sectors)
+                       return 0;
+
+               if (native_sectors > sectors)
+                       ata_dev_printk(dev, KERN_INFO,
+                               "HPA detected: current %llu, native %llu\n",
+                               (unsigned long long)sectors,
+                               (unsigned long long)native_sectors);
+               else if (native_sectors < sectors)
+                       ata_dev_printk(dev, KERN_WARNING,
+                               "native sectors (%llu) is smaller than "
+                               "sectors (%llu)\n",
+                               (unsigned long long)native_sectors,
+                               (unsigned long long)sectors);
+               return 0;
        }
+
+       /* let's unlock HPA */
+       rc = ata_set_max_sectors(dev, native_sectors);
+       if (rc == -EACCES) {
+               /* if device aborted the command, skip HPA resizing */
+               ata_dev_printk(dev, KERN_WARNING, "device aborted resize "
+                              "(%llu -> %llu), skipping HPA handling\n",
+                              (unsigned long long)sectors,
+                              (unsigned long long)native_sectors);
+               dev->horkage |= ATA_HORKAGE_BROKEN_HPA;
+               return 0;
+       } else if (rc)
+               return rc;
+
+       /* re-read IDENTIFY data */
+       rc = ata_dev_reread_id(dev, 0);
+       if (rc) {
+               ata_dev_printk(dev, KERN_ERR, "failed to re-read IDENTIFY "
+                              "data after HPA resizing\n");
+               return rc;
+       }
+
+       if (print_info) {
+               u64 new_sectors = ata_id_n_sectors(dev->id);
+               ata_dev_printk(dev, KERN_INFO,
+                       "HPA unlocked: %llu -> %llu, native %llu\n",
+                       (unsigned long long)sectors,
+                       (unsigned long long)new_sectors,
+                       (unsigned long long)native_sectors);
+       }
+
+       return 0;
 }
 
 /**
@@ -1326,8 +1392,9 @@ static void ata_qc_complete_internal(struct ata_queued_cmd *qc)
  *     @tf: Taskfile registers for the command and the result
  *     @cdb: CDB for packet command
  *     @dma_dir: Data tranfer direction of the command
- *     @sg: sg list for the data buffer of the command
+ *     @sgl: sg list for the data buffer of the command
  *     @n_elem: Number of sg entries
+ *     @timeout: Timeout in msecs (0 for default)
  *
  *     Executes libata internal command with timeout.  @tf contains
  *     command on entry and result on return.  Timeout and error
@@ -1343,8 +1410,8 @@ static void ata_qc_complete_internal(struct ata_queued_cmd *qc)
  */
 unsigned ata_exec_internal_sg(struct ata_device *dev,
                              struct ata_taskfile *tf, const u8 *cdb,
-                             int dma_dir, struct scatterlist *sg,
-                             unsigned int n_elem)
+                             int dma_dir, struct scatterlist *sgl,
+                             unsigned int n_elem, unsigned long timeout)
 {
        struct ata_link *link = dev->link;
        struct ata_port *ap = link->ap;
@@ -1352,6 +1419,7 @@ unsigned ata_exec_internal_sg(struct ata_device *dev,
        struct ata_queued_cmd *qc;
        unsigned int tag, preempted_tag;
        u32 preempted_sactive, preempted_qc_active;
+       int preempted_nr_active_links;
        DECLARE_COMPLETION_ONSTACK(wait);
        unsigned long flags;
        unsigned int err_mask;
@@ -1390,9 +1458,11 @@ unsigned ata_exec_internal_sg(struct ata_device *dev,
        preempted_tag = link->active_tag;
        preempted_sactive = link->sactive;
        preempted_qc_active = ap->qc_active;
+       preempted_nr_active_links = ap->nr_active_links;
        link->active_tag = ATA_TAG_POISON;
        link->sactive = 0;
        ap->qc_active = 0;
+       ap->nr_active_links = 0;
 
        /* prepare & issue qc */
        qc->tf = *tf;
@@ -1402,11 +1472,12 @@ unsigned ata_exec_internal_sg(struct ata_device *dev,
        qc->dma_dir = dma_dir;
        if (dma_dir != DMA_NONE) {
                unsigned int i, buflen = 0;
+               struct scatterlist *sg;
 
-               for (i = 0; i < n_elem; i++)
-                       buflen += sg[i].length;
+               for_each_sg(sgl, sg, n_elem, i)
+                       buflen += sg->length;
 
-               ata_sg_init(qc, sg, n_elem);
+               ata_sg_init(qc, sgl, n_elem);
                qc->nbytes = buflen;
        }
 
@@ -1417,7 +1488,10 @@ unsigned ata_exec_internal_sg(struct ata_device *dev,
 
        spin_unlock_irqrestore(ap->lock, flags);
 
-       rc = wait_for_completion_timeout(&wait, ata_probe_timeout);
+       if (!timeout)
+               timeout = ata_probe_timeout * 1000 / HZ;
+
+       rc = wait_for_completion_timeout(&wait, msecs_to_jiffies(timeout));
 
        ata_port_flush_task(ap);
 
@@ -1471,6 +1545,7 @@ unsigned ata_exec_internal_sg(struct ata_device *dev,
        link->active_tag = preempted_tag;
        link->sactive = preempted_sactive;
        ap->qc_active = preempted_qc_active;
+       ap->nr_active_links = preempted_nr_active_links;
 
        /* XXX - Some LLDDs (sata_mv) disable port on command failure.
         * Until those drivers are fixed, we detect the condition
@@ -1501,6 +1576,7 @@ unsigned ata_exec_internal_sg(struct ata_device *dev,
  *     @dma_dir: Data tranfer direction of the command
  *     @buf: Data buffer of the command
  *     @buflen: Length of data buffer
+ *     @timeout: Timeout in msecs (0 for default)
  *
  *     Wrapper around ata_exec_internal_sg() which takes simple
  *     buffer instead of sg list.
@@ -1513,7 +1589,8 @@ unsigned ata_exec_internal_sg(struct ata_device *dev,
  */
 unsigned ata_exec_internal(struct ata_device *dev,
                           struct ata_taskfile *tf, const u8 *cdb,
-                          int dma_dir, void *buf, unsigned int buflen)
+                          int dma_dir, void *buf, unsigned int buflen,
+                          unsigned long timeout)
 {
        struct scatterlist *psg = NULL, sg;
        unsigned int n_elem = 0;
@@ -1525,7 +1602,8 @@ unsigned ata_exec_internal(struct ata_device *dev,
                n_elem++;
        }
 
-       return ata_exec_internal_sg(dev, tf, cdb, dma_dir, psg, n_elem);
+       return ata_exec_internal_sg(dev, tf, cdb, dma_dir, psg, n_elem,
+                                   timeout);
 }
 
 /**
@@ -1552,7 +1630,7 @@ unsigned int ata_do_simple_cmd(struct ata_device *dev, u8 cmd)
        tf.flags |= ATA_TFLAG_DEVICE;
        tf.protocol = ATA_PROT_NODATA;
 
-       return ata_exec_internal(dev, &tf, NULL, DMA_NONE, NULL, 0);
+       return ata_exec_internal(dev, &tf, NULL, DMA_NONE, NULL, 0, 0);
 }
 
 /**
@@ -1614,6 +1692,9 @@ static u32 ata_pio_mask_no_iordy(const struct ata_device *adev)
  *     devices.  This function also issues ATA_CMD_INIT_DEV_PARAMS
  *     for pre-ATA4 drives.
  *
+ *     FIXME: ATA_CMD_ID_ATA is optional for early drives and right
+ *     now we abort if we hit that case. 
+ *
  *     LOCKING:
  *     Kernel thread context (may sleep)
  *
@@ -1664,7 +1745,7 @@ int ata_dev_read_id(struct ata_device *dev, unsigned int *p_class,
        tf.flags |= ATA_TFLAG_POLLING;
 
        err_mask = ata_exec_internal(dev, &tf, NULL, DMA_FROM_DEVICE,
-                                    id, sizeof(id[0]) * ATA_ID_WORDS);
+                                    id, sizeof(id[0]) * ATA_ID_WORDS, 0);
        if (err_mask) {
                if (err_mask & AC_ERR_NODEV_HINT) {
                        DPRINTK("ata%u.%d: NODEV after polling detection\n",
@@ -1723,7 +1804,8 @@ int ata_dev_read_id(struct ata_device *dev, unsigned int *p_class,
                tf.feature = SETFEATURES_SPINUP;
                tf.protocol = ATA_PROT_NODATA;
                tf.flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE;
-               err_mask = ata_exec_internal(dev, &tf, NULL, DMA_NONE, NULL, 0);
+               err_mask = ata_exec_internal(dev, &tf, NULL,
+                                            DMA_NONE, NULL, 0, 0);
                if (err_mask && id[2] != 0x738c) {
                        rc = -EIO;
                        reason = "SPINUP failed";
@@ -1741,10 +1823,13 @@ int ata_dev_read_id(struct ata_device *dev, unsigned int *p_class,
                /*
                 * The exact sequence expected by certain pre-ATA4 drives is:
                 * SRST RESET
-                * IDENTIFY
-                * INITIALIZE DEVICE PARAMETERS
+                * IDENTIFY (optional in early ATA)
+                * INITIALIZE DEVICE PARAMETERS (later IDE and ATA)
                 * anything else..
                 * Some drives were very specific about that exact sequence.
+                *
+                * Note that ATA4 says lba is mandatory so the second check
+                * shoud never trigger.
                 */
                if (ata_id_major_version(id) < 4 || !ata_id_has_lba(id)) {
                        err_mask = ata_dev_init_params(dev, id[3], id[6]);
@@ -1846,6 +1931,11 @@ int ata_dev_configure(struct ata_device *dev)
        if (rc)
                return rc;
 
+       /* massage HPA, do it early as it might change IDENTIFY data */
+       rc = ata_hpa_resize(dev);
+       if (rc)
+               return rc;
+
        /* print device capabilities */
        if (ata_msg_probe(ap))
                ata_dev_printk(dev, KERN_DEBUG,
@@ -1913,10 +2003,6 @@ int ata_dev_configure(struct ata_device *dev)
                                        dev->flags |= ATA_DFLAG_FLUSH_EXT;
                        }
 
-                       if (!(dev->horkage & ATA_HORKAGE_BROKEN_HPA) &&
-                           ata_id_hpa_enabled(dev->id))
-                               dev->n_sectors = ata_hpa_resize(dev);
-
                        /* config NCQ */
                        ata_dev_config_ncq(dev, ncq_desc, sizeof(ncq_desc));
 
@@ -1965,7 +2051,9 @@ int ata_dev_configure(struct ata_device *dev)
 
        /* ATAPI-specific feature tests */
        else if (dev->class == ATA_DEV_ATAPI) {
-               char *cdb_intr_string = "";
+               const char *cdb_intr_string = "";
+               const char *atapi_an_string = "";
+               u32 sntf;
 
                rc = atapi_cdb_len(id);
                if ((rc < 12) || (rc > ATAPI_CDB_LEN)) {
@@ -1977,6 +2065,28 @@ int ata_dev_configure(struct ata_device *dev)
                }
                dev->cdb_len = (unsigned int) rc;
 
+               /* Enable ATAPI AN if both the host and device have
+                * the support.  If PMP is attached, SNTF is required
+                * to enable ATAPI AN to discern between PHY status
+                * changed notifications and ATAPI ANs.
+                */
+               if ((ap->flags & ATA_FLAG_AN) && ata_id_has_atapi_AN(id) &&
+                   (!ap->nr_pmp_links ||
+                    sata_scr_read(&ap->link, SCR_NOTIFICATION, &sntf) == 0)) {
+                       unsigned int err_mask;
+
+                       /* issue SET feature command to turn this on */
+                       err_mask = ata_dev_set_AN(dev, SETFEATURES_SATA_ENABLE);
+                       if (err_mask)
+                               ata_dev_printk(dev, KERN_ERR,
+                                       "failed to enable ATAPI AN "
+                                       "(err_mask=0x%x)\n", err_mask);
+                       else {
+                               dev->flags |= ATA_DFLAG_AN;
+                               atapi_an_string = ", ATAPI AN";
+                       }
+               }
+
                if (ata_id_cdb_intr(dev->id)) {
                        dev->flags |= ATA_DFLAG_CDB_INTR;
                        cdb_intr_string = ", CDB intr";
@@ -1985,10 +2095,10 @@ int ata_dev_configure(struct ata_device *dev)
                /* print device info to dmesg */
                if (ata_msg_drv(ap) && print_info)
                        ata_dev_printk(dev, KERN_INFO,
-                                      "ATAPI: %s, %s, max %s%s\n",
+                                      "ATAPI: %s, %s, max %s%s%s\n",
                                       modelbuf, fwrevbuf,
                                       ata_mode_string(xfer_mask),
-                                      cdb_intr_string);
+                                      cdb_intr_string, atapi_an_string);
        }
 
        /* determine max_sectors */
@@ -2156,6 +2266,17 @@ int ata_bus_probe(struct ata_port *ap)
        if (ap->ops->cable_detect)
                ap->cbl = ap->ops->cable_detect(ap);
 
+       /* We may have SATA bridge glue hiding here irrespective of the
+          reported cable types and sensed types */
+       ata_link_for_each_dev(dev, &ap->link) {
+               if (!ata_dev_enabled(dev))
+                       continue;
+               /* SATA drives indicate we have a bridge. We don't know which
+                  end of the link the bridge is which is a problem */
+               if (ata_id_is_sata(dev->id))
+                       ap->cbl = ATA_CBL_SATA;
+       }
+
        /* After the identify sequence we can now set up the devices. We do
           this in the normal order so that the user doesn't get confused */
 
@@ -2181,7 +2302,6 @@ int ata_bus_probe(struct ata_port *ap)
 
        /* no device present, disable port */
        ata_port_disable(ap);
-       ap->ops->port_disable(ap);
        return -ENODEV;
 
  fail:
@@ -2759,7 +2879,11 @@ static int ata_dev_set_mode(struct ata_device *dev)
        /* Old CFA may refuse this command, which is just fine */
        if (dev->xfer_shift == ATA_SHIFT_PIO && ata_id_is_cfa(dev->id))
                err_mask &= ~AC_ERR_DEV;
-
+       /* Some very old devices and some bad newer ones fail any kind of
+          SET_XFERMODE request but support PIO0-2 timings and no IORDY */
+       if (dev->xfer_shift == ATA_SHIFT_PIO && !ata_id_has_iordy(dev->id) &&
+                       dev->pio_mode <= XFER_PIO_2)
+               err_mask &= ~AC_ERR_DEV;
        if (err_mask) {
                ata_dev_printk(dev, KERN_ERR, "failed to set xfermode "
                               "(err_mask=0x%x)\n", err_mask);
@@ -2767,7 +2891,7 @@ static int ata_dev_set_mode(struct ata_device *dev)
        }
 
        ehc->i.flags |= ATA_EHI_POST_SETMODE;
-       rc = ata_dev_revalidate(dev, 0);
+       rc = ata_dev_revalidate(dev, ATA_DEV_UNKNOWN, 0);
        ehc->i.flags &= ~ATA_EHI_POST_SETMODE;
        if (rc)
                return rc;
@@ -2806,14 +2930,27 @@ int ata_do_set_mode(struct ata_link *link, struct ata_device **r_failed_dev)
        /* step 1: calculate xfer_mask */
        ata_link_for_each_dev(dev, link) {
                unsigned int pio_mask, dma_mask;
+               unsigned int mode_mask;
 
                if (!ata_dev_enabled(dev))
                        continue;
 
+               mode_mask = ATA_DMA_MASK_ATA;
+               if (dev->class == ATA_DEV_ATAPI)
+                       mode_mask = ATA_DMA_MASK_ATAPI;
+               else if (ata_id_is_cfa(dev->id))
+                       mode_mask = ATA_DMA_MASK_CFA;
+
                ata_dev_xfermask(dev);
 
                pio_mask = ata_pack_xfermask(dev->pio_mask, 0, 0);
                dma_mask = ata_pack_xfermask(0, dev->mwdma_mask, dev->udma_mask);
+
+               if (libata_dma_mask & mode_mask)
+                       dma_mask = ata_pack_xfermask(0, dev->mwdma_mask, dev->udma_mask);
+               else
+                       dma_mask = 0;
+
                dev->pio_mode = ata_xfer_mask2mode(pio_mask);
                dev->dma_mode = ata_xfer_mask2mode(dma_mask);
 
@@ -3081,6 +3218,8 @@ static int ata_bus_softreset(struct ata_port *ap, unsigned int devmask,
                             unsigned long deadline)
 {
        struct ata_ioports *ioaddr = &ap->ioaddr;
+       struct ata_device *dev;
+       int i = 0;
 
        DPRINTK("ata%u: bus reset via SRST\n", ap->print_id);
 
@@ -3091,6 +3230,25 @@ static int ata_bus_softreset(struct ata_port *ap, unsigned int devmask,
        udelay(20);     /* FIXME: flush */
        iowrite8(ap->ctl, ioaddr->ctl_addr);
 
+       /* If we issued an SRST then an ATA drive (not ATAPI)
+        * may have changed configuration and be in PIO0 timing. If
+        * we did a hard reset (or are coming from power on) this is
+        * true for ATA or ATAPI. Until we've set a suitable controller
+        * mode we should not touch the bus as we may be talking too fast.
+        */
+
+       ata_link_for_each_dev(dev, &ap->link)
+               dev->pio_mode = XFER_PIO_0;
+
+       /* If the controller has a pio mode setup function then use
+          it to set the chipset to rights. Don't touch the DMA setup
+          as that will be dealt with when revalidating */
+       if (ap->ops->set_piomode) {
+               ata_link_for_each_dev(dev, &ap->link)
+                       if (devmask & (1 << i++))
+                               ap->ops->set_piomode(ap, dev);
+       }
+
        /* spec mandates ">= 2ms" before checking status.
         * We wait 150ms, because that was the magic delay used for
         * ATAPI devices in Hale Landis's ATADRVR, for the period of time
@@ -3171,9 +3329,9 @@ void ata_bus_reset(struct ata_port *ap)
        /*
         * determine by signature whether we have ATA or ATAPI devices
         */
-       device[0].class = ata_dev_try_classify(ap, 0, &err);
+       device[0].class = ata_dev_try_classify(&device[0], dev0, &err);
        if ((slave_possible) && (err != 0x81))
-               device[1].class = ata_dev_try_classify(ap, 1, &err);
+               device[1].class = ata_dev_try_classify(&device[1], dev1, &err);
 
        /* is double-select really necessary? */
        if (device[1].class != ATA_DEV_NONE)
@@ -3196,7 +3354,7 @@ void ata_bus_reset(struct ata_port *ap)
 
 err_out:
        ata_port_printk(ap, KERN_ERR, "disabling port\n");
-       ap->ops->port_disable(ap);
+       ata_port_disable(ap);
 
        DPRINTK("EXIT\n");
 }
@@ -3335,6 +3493,12 @@ int ata_std_prereset(struct ata_link *link, unsigned long deadline)
            (link->flags & ATA_LFLAG_HRST_TO_RESUME))
                ehc->i.action |= ATA_EH_HARDRESET;
 
+       /* Some PMPs don't work with only SRST, force hardreset if PMP
+        * is supported.
+        */
+       if (ap->flags & ATA_FLAG_PMP)
+               ehc->i.action |= ATA_EH_HARDRESET;
+
        /* if we're about to do hardreset, nothing more to do */
        if (ehc->i.action & ATA_EH_HARDRESET)
                return 0;
@@ -3412,9 +3576,11 @@ int ata_std_softreset(struct ata_link *link, unsigned int *classes,
        }
 
        /* determine by signature whether we have ATA or ATAPI devices */
-       classes[0] = ata_dev_try_classify(ap, 0, &err);
+       classes[0] = ata_dev_try_classify(&link->device[0],
+                                         devmask & (1 << 0), &err);
        if (slave_possible && err != 0x81)
-               classes[1] = ata_dev_try_classify(ap, 1, &err);
+               classes[1] = ata_dev_try_classify(&link->device[1],
+                                                 devmask & (1 << 1), &err);
 
  out:
        DPRINTK("EXIT, classes[0]=%u [1]=%u\n", classes[0], classes[1]);
@@ -3523,6 +3689,16 @@ int sata_std_hardreset(struct ata_link *link, unsigned int *class,
        /* wait a while before checking status, see SRST for more info */
        msleep(150);
 
+       /* If PMP is supported, we have to do follow-up SRST.  Note
+        * that some PMPs don't send D2H Reg FIS after hardreset at
+        * all if the first port is empty.  Wait for it just for a
+        * second and request follow-up SRST.
+        */
+       if (ap->flags & ATA_FLAG_PMP) {
+               ata_wait_ready(ap, jiffies + HZ);
+               return -EAGAIN;
+       }
+
        rc = ata_wait_ready(ap, deadline);
        /* link occupied, -ENODEV too is an error */
        if (rc) {
@@ -3533,7 +3709,7 @@ int sata_std_hardreset(struct ata_link *link, unsigned int *class,
 
        ap->ops->dev_select(ap, 0);     /* probably unnecessary */
 
-       *class = ata_dev_try_classify(ap, 0, NULL);
+       *class = ata_dev_try_classify(link->device, 1, NULL);
 
        DPRINTK("EXIT, class=%u\n", *class);
        return 0;
@@ -3669,6 +3845,7 @@ int ata_dev_reread_id(struct ata_device *dev, unsigned int readid_flags)
 /**
  *     ata_dev_revalidate - Revalidate ATA device
  *     @dev: device to revalidate
+ *     @new_class: new class code
  *     @readid_flags: read ID flags
  *
  *     Re-read IDENTIFY page, make sure @dev is still attached to the
@@ -3680,7 +3857,8 @@ int ata_dev_reread_id(struct ata_device *dev, unsigned int readid_flags)
  *     RETURNS:
  *     0 on success, negative errno otherwise
  */
-int ata_dev_revalidate(struct ata_device *dev, unsigned int readid_flags)
+int ata_dev_revalidate(struct ata_device *dev, unsigned int new_class,
+                      unsigned int readid_flags)
 {
        u64 n_sectors = dev->n_sectors;
        int rc;
@@ -3688,6 +3866,15 @@ int ata_dev_revalidate(struct ata_device *dev, unsigned int readid_flags)
        if (!ata_dev_enabled(dev))
                return -ENODEV;
 
+       /* fail early if !ATA && !ATAPI to avoid issuing [P]IDENTIFY to PMP */
+       if (ata_class_enabled(new_class) &&
+           new_class != ATA_DEV_ATA && new_class != ATA_DEV_ATAPI) {
+               ata_dev_printk(dev, KERN_INFO, "class mismatch %u != %u\n",
+                              dev->class, new_class);
+               rc = -ENODEV;
+               goto fail;
+       }
+
        /* re-read ID */
        rc = ata_dev_reread_id(dev, readid_flags);
        if (rc)
@@ -3761,6 +3948,9 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = {
        { "IOMEGA  ZIP 250       ATAPI", NULL,  ATA_HORKAGE_NODMA }, /* temporary fix */
        { "IOMEGA  ZIP 250       ATAPI       Floppy",
                                NULL,           ATA_HORKAGE_NODMA },
+       /* Odd clown on sil3726/4726 PMPs */
+       { "Config  Disk",       NULL,           ATA_HORKAGE_NODMA |
+                                               ATA_HORKAGE_SKIP_PM },
 
        /* Weird ATAPI devices */
        { "TORiSAN DVD-ROM DRD-N216", NULL,     ATA_HORKAGE_MAX_SEC_128 },
@@ -3773,16 +3963,12 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = {
        /* http://thread.gmane.org/gmane.linux.ide/14907 */
        { "FUJITSU MHT2060BH",  NULL,           ATA_HORKAGE_NONCQ },
        /* NCQ is broken */
-       { "Maxtor 6L250S0",     "BANC1G10",     ATA_HORKAGE_NONCQ },
-       { "Maxtor 6B200M0",     "BANC1BM0",     ATA_HORKAGE_NONCQ },
-       { "Maxtor 6B200M0",     "BANC1B10",     ATA_HORKAGE_NONCQ },
-       { "Maxtor 7B250S0",     "BANC1B70",     ATA_HORKAGE_NONCQ, },
-       { "Maxtor 7B300S0",     "BANC1B70",     ATA_HORKAGE_NONCQ },
+       { "Maxtor *",           "BANC*",        ATA_HORKAGE_NONCQ },
        { "Maxtor 7V300F0",     "VA111630",     ATA_HORKAGE_NONCQ },
-       { "HITACHI HDS7250SASUN500G 0621KTAWSD", "K2AOAJ0AHITACHI",
-        ATA_HORKAGE_NONCQ },
-       /* NCQ hard hangs device under heavier load, needs hard power cycle */
-       { "Maxtor 6B250S0",     "BANC1B70",     ATA_HORKAGE_NONCQ },
+       { "HITACHI HDS7250SASUN500G*", NULL,    ATA_HORKAGE_NONCQ },
+       { "HITACHI HDS7225SBSUN250G*", NULL,    ATA_HORKAGE_NONCQ },
+       { "ST380817AS",         "3.42",         ATA_HORKAGE_NONCQ },
+
        /* Blacklist entries taken from Silicon Image 3124/3132
           Windows driver .inf file - also several Linux problem reports */
        { "HTS541060G9SA00",    "MB3OC60D",     ATA_HORKAGE_NONCQ, },
@@ -3791,11 +3977,17 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = {
        /* Drives which do spurious command completion */
        { "HTS541680J9SA00",    "SB2IC7EP",     ATA_HORKAGE_NONCQ, },
        { "HTS541612J9SA00",    "SBDIC7JP",     ATA_HORKAGE_NONCQ, },
+       { "HDT722516DLA380",    "V43OA96A",     ATA_HORKAGE_NONCQ, },
        { "Hitachi HTS541616J9SA00", "SB4OC70P", ATA_HORKAGE_NONCQ, },
        { "WDC WD740ADFD-00NLR1", NULL,         ATA_HORKAGE_NONCQ, },
+       { "WDC WD3200AAJS-00RYA0", "12.01B01",  ATA_HORKAGE_NONCQ, },
        { "FUJITSU MHV2080BH",  "00840028",     ATA_HORKAGE_NONCQ, },
+       { "ST9120822AS",        "3.CLF",        ATA_HORKAGE_NONCQ, },
        { "ST9160821AS",        "3.CLF",        ATA_HORKAGE_NONCQ, },
-       { "ST3160812AS",        "3.AD",         ATA_HORKAGE_NONCQ, },
+       { "ST9160821AS",        "3.ALD",        ATA_HORKAGE_NONCQ, },
+       { "ST9160821AS",        "3.CCD",        ATA_HORKAGE_NONCQ, },
+       { "ST3160812AS",        "3.ADJ",        ATA_HORKAGE_NONCQ, },
+       { "ST980813AS",         "3.ADB",        ATA_HORKAGE_NONCQ, },
        { "SAMSUNG HD401LJ",    "ZZ100-15",     ATA_HORKAGE_NONCQ, },
 
        /* devices which puke on READ_NATIVE_MAX */
@@ -3804,10 +3996,37 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = {
        { "WDC WD2500JD-00HBB0", "WD-WMAL71490727", ATA_HORKAGE_BROKEN_HPA },
        { "MAXTOR 6L080L4",     "A93.0500",     ATA_HORKAGE_BROKEN_HPA },
 
+       /* Devices which report 1 sector over size HPA */
+       { "ST340823A",          NULL,           ATA_HORKAGE_HPA_SIZE, },
+       { "ST320413A",          NULL,           ATA_HORKAGE_HPA_SIZE, },
+
        /* End Marker */
        { }
 };
 
+int strn_pattern_cmp(const char *patt, const char *name, int wildchar)
+{
+       const char *p;
+       int len;
+
+       /*
+        * check for trailing wildcard: *\0
+        */
+       p = strchr(patt, wildchar);
+       if (p && ((*(p + 1)) == 0))
+               len = p - patt;
+       else {
+               len = strlen(name);
+               if (!len) {
+                       if (!*patt)
+                               return 0;
+                       return -1;
+               }
+       }
+
+       return strncmp(patt, name, len);
+}
+
 static unsigned long ata_dev_blacklisted(const struct ata_device *dev)
 {
        unsigned char model_num[ATA_ID_PROD_LEN + 1];
@@ -3818,10 +4037,10 @@ static unsigned long ata_dev_blacklisted(const struct ata_device *dev)
        ata_id_c_string(dev->id, model_rev, ATA_ID_FW_REV, sizeof(model_rev));
 
        while (ad->model_num) {
-               if (!strcmp(ad->model_num, model_num)) {
+               if (!strn_pattern_cmp(ad->model_num, model_num, '*')) {
                        if (ad->model_rev == NULL)
                                return ad->horkage;
-                       if (!strcmp(ad->model_rev, model_rev))
+                       if (!strn_pattern_cmp(ad->model_rev, model_rev, '*'))
                                return ad->horkage;
                }
                ad++;
@@ -3954,7 +4173,43 @@ static unsigned int ata_dev_set_xfermode(struct ata_device *dev)
        tf.protocol = ATA_PROT_NODATA;
        tf.nsect = dev->xfer_mode;
 
-       err_mask = ata_exec_internal(dev, &tf, NULL, DMA_NONE, NULL, 0);
+       err_mask = ata_exec_internal(dev, &tf, NULL, DMA_NONE, NULL, 0, 0);
+
+       DPRINTK("EXIT, err_mask=%x\n", err_mask);
+       return err_mask;
+}
+
+/**
+ *     ata_dev_set_AN - Issue SET FEATURES - SATA FEATURES
+ *     @dev: Device to which command will be sent
+ *     @enable: Whether to enable or disable the feature
+ *
+ *     Issue SET FEATURES - SATA FEATURES command to device @dev
+ *     on port @ap with sector count set to indicate Asynchronous
+ *     Notification feature
+ *
+ *     LOCKING:
+ *     PCI/etc. bus probe sem.
+ *
+ *     RETURNS:
+ *     0 on success, AC_ERR_* mask otherwise.
+ */
+static unsigned int ata_dev_set_AN(struct ata_device *dev, u8 enable)
+{
+       struct ata_taskfile tf;
+       unsigned int err_mask;
+
+       /* set up set-features taskfile */
+       DPRINTK("set features - SATA features\n");
+
+       ata_tf_init(dev, &tf);
+       tf.command = ATA_CMD_SET_FEATURES;
+       tf.feature = enable;
+       tf.flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE;
+       tf.protocol = ATA_PROT_NODATA;
+       tf.nsect = SATA_AN;
+
+       err_mask = ata_exec_internal(dev, &tf, NULL, DMA_NONE, NULL, 0, 0);
 
        DPRINTK("EXIT, err_mask=%x\n", err_mask);
        return err_mask;
@@ -3992,7 +4247,7 @@ static unsigned int ata_dev_init_params(struct ata_device *dev,
        tf.nsect = sectors;
        tf.device |= (heads - 1) & 0x0f; /* max head = num. of heads - 1 */
 
-       err_mask = ata_exec_internal(dev, &tf, NULL, DMA_NONE, NULL, 0);
+       err_mask = ata_exec_internal(dev, &tf, NULL, DMA_NONE, NULL, 0, 0);
        /* A clean abort indicates an original or just out of spec drive
           and we should continue as we issue the setup based on the
           drive reported working geometry */
@@ -4038,7 +4293,7 @@ void ata_sg_clean(struct ata_queued_cmd *qc)
                if (qc->n_elem)
                        dma_unmap_sg(ap->dev, sg, qc->n_elem, dir);
                /* restore last sg */
-               sg[qc->orig_n_elem - 1].length += qc->pad_len;
+               sg_last(sg, qc->orig_n_elem)->length += qc->pad_len;
                if (pad_buf) {
                        struct scatterlist *psg = &qc->pad_sgent;
                        void *addr = kmap_atomic(psg->page, KM_IRQ0);
@@ -4205,6 +4460,36 @@ int ata_check_atapi_dma(struct ata_queued_cmd *qc)
        return 0;
 }
 
+/**
+ *     ata_std_qc_defer - Check whether a qc needs to be deferred
+ *     @qc: ATA command in question
+ *
+ *     Non-NCQ commands cannot run with any other command, NCQ or
+ *     not.  As upper layer only knows the queue depth, we are
+ *     responsible for maintaining exclusion.  This function checks
+ *     whether a new command @qc can be issued.
+ *
+ *     LOCKING:
+ *     spin_lock_irqsave(host lock)
+ *
+ *     RETURNS:
+ *     ATA_DEFER_* if deferring is needed, 0 otherwise.
+ */
+int ata_std_qc_defer(struct ata_queued_cmd *qc)
+{
+       struct ata_link *link = qc->dev->link;
+
+       if (qc->tf.protocol == ATA_PROT_NCQ) {
+               if (!ata_tag_valid(link->active_tag))
+                       return 0;
+       } else {
+               if (!ata_tag_valid(link->active_tag) && !link->sactive)
+                       return 0;
+       }
+
+       return ATA_DEFER_LINK;
+}
+
 /**
  *     ata_qc_prep - Prepare taskfile for submission
  *     @qc: Metadata associated with taskfile to be prepared
@@ -4263,6 +4548,7 @@ void ata_sg_init_one(struct ata_queued_cmd *qc, void *buf, unsigned int buflen)
        qc->orig_n_elem = 1;
        qc->buf_virt = buf;
        qc->nbytes = buflen;
+       qc->cursg = qc->__sg;
 
        sg_init_one(&qc->sgent, buf, buflen);
 }
@@ -4288,6 +4574,7 @@ void ata_sg_init(struct ata_queued_cmd *qc, struct scatterlist *sg,
        qc->__sg = sg;
        qc->n_elem = n_elem;
        qc->orig_n_elem = n_elem;
+       qc->cursg = qc->__sg;
 }
 
 /**
@@ -4377,7 +4664,7 @@ static int ata_sg_setup(struct ata_queued_cmd *qc)
 {
        struct ata_port *ap = qc->ap;
        struct scatterlist *sg = qc->__sg;
-       struct scatterlist *lsg = &sg[qc->n_elem - 1];
+       struct scatterlist *lsg = sg_last(qc->__sg, qc->n_elem);
        int n_elem, pre_n_elem, dir, trim_sg = 0;
 
        VPRINTK("ENTER, ata%u\n", ap->print_id);
@@ -4541,7 +4828,6 @@ void ata_data_xfer_noirq(struct ata_device *adev, unsigned char *buf,
 static void ata_pio_sector(struct ata_queued_cmd *qc)
 {
        int do_write = (qc->tf.flags & ATA_TFLAG_WRITE);
-       struct scatterlist *sg = qc->__sg;
        struct ata_port *ap = qc->ap;
        struct page *page;
        unsigned int offset;
@@ -4550,8 +4836,8 @@ static void ata_pio_sector(struct ata_queued_cmd *qc)
        if (qc->curbytes == qc->nbytes - qc->sect_size)
                ap->hsm_task_state = HSM_ST_LAST;
 
-       page = sg[qc->cursg].page;
-       offset = sg[qc->cursg].offset + qc->cursg_ofs;
+       page = qc->cursg->page;
+       offset = qc->cursg->offset + qc->cursg_ofs;
 
        /* get the current page and offset */
        page = nth_page(page, (offset >> PAGE_SHIFT));
@@ -4579,8 +4865,8 @@ static void ata_pio_sector(struct ata_queued_cmd *qc)
        qc->curbytes += qc->sect_size;
        qc->cursg_ofs += qc->sect_size;
 
-       if (qc->cursg_ofs == (&sg[qc->cursg])->length) {
-               qc->cursg++;
+       if (qc->cursg_ofs == qc->cursg->length) {
+               qc->cursg = sg_next(qc->cursg);
                qc->cursg_ofs = 0;
        }
 }
@@ -4610,6 +4896,8 @@ static void ata_pio_sectors(struct ata_queued_cmd *qc)
                        ata_pio_sector(qc);
        } else
                ata_pio_sector(qc);
+
+       ata_altstatus(qc->ap); /* flush */
 }
 
 /**
@@ -4664,16 +4952,18 @@ static void __atapi_pio_bytes(struct ata_queued_cmd *qc, unsigned int bytes)
 {
        int do_write = (qc->tf.flags & ATA_TFLAG_WRITE);
        struct scatterlist *sg = qc->__sg;
+       struct scatterlist *lsg = sg_last(qc->__sg, qc->n_elem);
        struct ata_port *ap = qc->ap;
        struct page *page;
        unsigned char *buf;
        unsigned int offset, count;
+       int no_more_sg = 0;
 
        if (qc->curbytes + bytes >= qc->nbytes)
                ap->hsm_task_state = HSM_ST_LAST;
 
 next_sg:
-       if (unlikely(qc->cursg >= qc->n_elem)) {
+       if (unlikely(no_more_sg)) {
                /*
                 * The end of qc->sg is reached and the device expects
                 * more data to transfer. In order not to overrun qc->sg
@@ -4696,7 +4986,7 @@ next_sg:
                return;
        }
 
-       sg = &qc->__sg[qc->cursg];
+       sg = qc->cursg;
 
        page = sg->page;
        offset = sg->offset + qc->cursg_ofs;
@@ -4735,7 +5025,10 @@ next_sg:
        qc->cursg_ofs += count;
 
        if (qc->cursg_ofs == sg->length) {
-               qc->cursg++;
+               if (qc->cursg == lsg)
+                       no_more_sg = 1;
+
+               qc->cursg = sg_next(qc->cursg);
                qc->cursg_ofs = 0;
        }
 
@@ -4784,6 +5077,7 @@ static void atapi_pio_bytes(struct ata_queued_cmd *qc)
        VPRINTK("ata%u: xfering %d bytes\n", ap->print_id, bytes);
 
        __atapi_pio_bytes(qc, bytes);
+       ata_altstatus(ap); /* flush */
 
        return;
 
@@ -4955,7 +5249,6 @@ fsm_start:
                         */
                        ap->hsm_task_state = HSM_ST;
                        ata_pio_sectors(qc);
-                       ata_altstatus(ap); /* flush */
                } else
                        /* send CDB */
                        atapi_send_cdb(ap, qc);
@@ -5036,7 +5329,6 @@ fsm_start:
 
                                if (!(qc->tf.flags & ATA_TFLAG_WRITE)) {
                                        ata_pio_sectors(qc);
-                                       ata_altstatus(ap);
                                        status = ata_wait_idle(ap);
                                }
 
@@ -5056,13 +5348,11 @@ fsm_start:
                        if (ap->hsm_task_state == HSM_ST_LAST &&
                            (!(qc->tf.flags & ATA_TFLAG_WRITE))) {
                                /* all data read */
-                               ata_altstatus(ap);
                                status = ata_wait_idle(ap);
                                goto fsm_start;
                        }
                }
 
-               ata_altstatus(ap); /* flush */
                poll_next = 1;
                break;
 
@@ -5239,10 +5529,19 @@ void __ata_qc_complete(struct ata_queued_cmd *qc)
                ata_sg_clean(qc);
 
        /* command should be marked inactive atomically with qc completion */
-       if (qc->tf.protocol == ATA_PROT_NCQ)
+       if (qc->tf.protocol == ATA_PROT_NCQ) {
                link->sactive &= ~(1 << qc->tag);
-       else
+               if (!link->sactive)
+                       ap->nr_active_links--;
+       } else {
                link->active_tag = ATA_TAG_POISON;
+               ap->nr_active_links--;
+       }
+
+       /* clear exclusive status */
+       if (unlikely(qc->flags & ATA_QCFLAG_CLEAR_EXCL &&
+                    ap->excl_link == link))
+               ap->excl_link = NULL;
 
        /* atapi: mark qc as inactive to prevent the interrupt handler
         * from completing the command twice later, before the error handler
@@ -5421,9 +5720,14 @@ void ata_qc_issue(struct ata_queued_cmd *qc)
 
        if (qc->tf.protocol == ATA_PROT_NCQ) {
                WARN_ON(link->sactive & (1 << qc->tag));
+
+               if (!link->sactive)
+                       ap->nr_active_links++;
                link->sactive |= 1 << qc->tag;
        } else {
                WARN_ON(link->sactive);
+
+               ap->nr_active_links++;
                link->active_tag = qc->tag;
        }
 
@@ -5681,7 +5985,8 @@ idle_irq:
 
 #ifdef ATA_IRQ_TRAP
        if ((ap->stats.idle_irq % 1000) == 0) {
-               ap->ops->irq_ack(ap, 0); /* debug trap */
+               ata_chk_status(ap);
+               ap->ops->irq_clear(ap);
                ata_port_printk(ap, KERN_WARNING, "irq trap\n");
                return 1;
        }
@@ -5760,22 +6065,26 @@ int sata_scr_valid(struct ata_link *link)
  *     @val: Place to store read value
  *
  *     Read SCR register @reg of @link into *@val.  This function is
- *     guaranteed to succeed if the cable type of the port is SATA
- *     and the port implements ->scr_read.
+ *     guaranteed to succeed if @link is ap->link, the cable type of
+ *     the port is SATA and the port implements ->scr_read.
  *
  *     LOCKING:
- *     None.
+ *     None if @link is ap->link.  Kernel thread context otherwise.
  *
  *     RETURNS:
  *     0 on success, negative errno on failure.
  */
 int sata_scr_read(struct ata_link *link, int reg, u32 *val)
 {
-       struct ata_port *ap = link->ap;
+       if (ata_is_host_link(link)) {
+               struct ata_port *ap = link->ap;
 
-       if (sata_scr_valid(link))
-               return ap->ops->scr_read(ap, reg, val);
-       return -EOPNOTSUPP;
+               if (sata_scr_valid(link))
+                       return ap->ops->scr_read(ap, reg, val);
+               return -EOPNOTSUPP;
+       }
+
+       return sata_pmp_scr_read(link, reg, val);
 }
 
 /**
@@ -5785,22 +6094,26 @@ int sata_scr_read(struct ata_link *link, int reg, u32 *val)
  *     @val: value to write
  *
  *     Write @val to SCR register @reg of @link.  This function is
- *     guaranteed to succeed if the cable type of the port is SATA
- *     and the port implements ->scr_read.
+ *     guaranteed to succeed if @link is ap->link, the cable type of
+ *     the port is SATA and the port implements ->scr_read.
  *
  *     LOCKING:
- *     None.
+ *     None if @link is ap->link.  Kernel thread context otherwise.
  *
  *     RETURNS:
  *     0 on success, negative errno on failure.
  */
 int sata_scr_write(struct ata_link *link, int reg, u32 val)
 {
-       struct ata_port *ap = link->ap;
+       if (ata_is_host_link(link)) {
+               struct ata_port *ap = link->ap;
+
+               if (sata_scr_valid(link))
+                       return ap->ops->scr_write(ap, reg, val);
+               return -EOPNOTSUPP;
+       }
 
-       if (sata_scr_valid(link))
-               return ap->ops->scr_write(ap, reg, val);
-       return -EOPNOTSUPP;
+       return sata_pmp_scr_write(link, reg, val);
 }
 
 /**
@@ -5813,23 +6126,27 @@ int sata_scr_write(struct ata_link *link, int reg, u32 val)
  *     function performs flush after writing to the register.
  *
  *     LOCKING:
- *     None.
+ *     None if @link is ap->link.  Kernel thread context otherwise.
  *
  *     RETURNS:
  *     0 on success, negative errno on failure.
  */
 int sata_scr_write_flush(struct ata_link *link, int reg, u32 val)
 {
-       struct ata_port *ap = link->ap;
-       int rc;
+       if (ata_is_host_link(link)) {
+               struct ata_port *ap = link->ap;
+               int rc;
 
-       if (sata_scr_valid(link)) {
-               rc = ap->ops->scr_write(ap, reg, val);
-               if (rc == 0)
-                       rc = ap->ops->scr_read(ap, reg, &val);
-               return rc;
+               if (sata_scr_valid(link)) {
+                       rc = ap->ops->scr_write(ap, reg, val);
+                       if (rc == 0)
+                               rc = ap->ops->scr_read(ap, reg, &val);
+                       return rc;
+               }
+               return -EOPNOTSUPP;
        }
-       return -EOPNOTSUPP;
+
+       return sata_pmp_scr_write(link, reg, val);
 }
 
 /**
@@ -5893,6 +6210,10 @@ int ata_flush_cache(struct ata_device *dev)
        else
                cmd = ATA_CMD_FLUSH;
 
+       /* This is wrong. On a failed flush we get back the LBA of the lost
+          sector and we should (assuming it wasn't aborted as unknown) issue
+          a further flush command to continue the writeback until it 
+          does not error */
        err_mask = ata_do_simple_cmd(dev, cmd);
        if (err_mask) {
                ata_dev_printk(dev, KERN_ERR, "failed to flush cache\n");
@@ -5912,6 +6233,7 @@ static int ata_host_request_pm(struct ata_host *host, pm_message_t mesg,
 
        for (i = 0; i < host->n_ports; i++) {
                struct ata_port *ap = host->ports[i];
+               struct ata_link *link;
 
                /* Previous resume operation might still be in
                 * progress.  Wait for PM_PENDING to clear.
@@ -5931,8 +6253,10 @@ static int ata_host_request_pm(struct ata_host *host, pm_message_t mesg,
                }
 
                ap->pflags |= ATA_PFLAG_PM_PENDING;
-               ap->link.eh_info.action |= action;
-               ap->link.eh_info.flags |= ehi_flags;
+               __ata_port_for_each_link(link, ap) {
+                       link->eh_info.action |= action;
+                       link->eh_info.flags |= ehi_flags;
+               }
 
                ata_port_schedule_eh(ap);
 
@@ -6064,13 +6388,14 @@ void ata_dev_init(struct ata_device *dev)
  *     ata_link_init - Initialize an ata_link structure
  *     @ap: ATA port link is attached to
  *     @link: Link structure to initialize
+ *     @pmp: Port multiplier port number
  *
  *     Initialize @link.
  *
  *     LOCKING:
  *     Kernel thread context (may sleep)
  */
-static void ata_link_init(struct ata_port *ap, struct ata_link *link)
+void ata_link_init(struct ata_port *ap, struct ata_link *link, int pmp)
 {
        int i;
 
@@ -6078,6 +6403,7 @@ static void ata_link_init(struct ata_port *ap, struct ata_link *link)
        memset(link, 0, offsetof(struct ata_link, device[0]));
 
        link->ap = ap;
+       link->pmp = pmp;
        link->active_tag = ATA_TAG_POISON;
        link->hw_sata_spd_limit = UINT_MAX;
 
@@ -6104,7 +6430,7 @@ static void ata_link_init(struct ata_port *ap, struct ata_link *link)
  *     RETURNS:
  *     0 on success, -errno on failure.
  */
-static int sata_link_init_spd(struct ata_link *link)
+int sata_link_init_spd(struct ata_link *link)
 {
        u32 scontrol, spd;
        int rc;
@@ -6173,7 +6499,7 @@ struct ata_port *ata_port_alloc(struct ata_host *host)
 
        ap->cbl = ATA_CBL_NONE;
 
-       ata_link_init(ap, &ap->link);
+       ata_link_init(ap, &ap->link, 0);
 
 #ifdef ATA_IRQ_TRAP
        ap->stats.unhandled_irq = 1;
@@ -6209,6 +6535,7 @@ static void ata_host_release(struct device *gendev, void *res)
                if (ap->scsi_host)
                        scsi_host_put(ap->scsi_host);
 
+               kfree(ap->pmp_link);
                kfree(ap);
                host->ports[i] = NULL;
        }
@@ -6455,7 +6782,6 @@ int ata_host_register(struct ata_host *host, struct scsi_host_template *sht)
        /* set cable, sata_spd_limit and report */
        for (i = 0; i < host->n_ports; i++) {
                struct ata_port *ap = host->ports[i];
-               int irq_line;
                unsigned long xfer_mask;
 
                /* set SATA cable type if still unset */
@@ -6465,25 +6791,18 @@ int ata_host_register(struct ata_host *host, struct scsi_host_template *sht)
                /* init sata_spd_limit to the current value */
                sata_link_init_spd(&ap->link);
 
-               /* report the secondary IRQ for second channel legacy */
-               irq_line = host->irq;
-               if (i == 1 && host->irq2)
-                       irq_line = host->irq2;
-
+               /* print per-port info to dmesg */
                xfer_mask = ata_pack_xfermask(ap->pio_mask, ap->mwdma_mask,
                                              ap->udma_mask);
 
-               /* print per-port info to dmesg */
-               if (!ata_port_is_dummy(ap))
-                       ata_port_printk(ap, KERN_INFO, "%cATA max %s cmd 0x%p "
-                                       "ctl 0x%p bmdma 0x%p irq %d\n",
+               if (!ata_port_is_dummy(ap)) {
+                       ata_port_printk(ap, KERN_INFO,
+                                       "%cATA max %s %s\n",
                                        (ap->flags & ATA_FLAG_SATA) ? 'S' : 'P',
                                        ata_mode_string(xfer_mask),
-                                       ap->ioaddr.cmd_addr,
-                                       ap->ioaddr.ctl_addr,
-                                       ap->ioaddr.bmdma_addr,
-                                       irq_line);
-               else
+                                       ap->link.eh_info.desc);
+                       ata_ehi_clear_desc(&ap->link.eh_info);
+               } else
                        ata_port_printk(ap, KERN_INFO, "DUMMY\n");
        }
 
@@ -6566,7 +6885,7 @@ int ata_host_activate(struct ata_host *host, int irq,
                      irq_handler_t irq_handler, unsigned long irq_flags,
                      struct scsi_host_template *sht)
 {
-       int rc;
+       int i, rc;
 
        rc = ata_host_start(host);
        if (rc)
@@ -6577,8 +6896,8 @@ int ata_host_activate(struct ata_host *host, int irq,
        if (rc)
                return rc;
 
-       /* Used to print device info at probe */
-       host->irq = irq;
+       for (i = 0; i < host->n_ports; i++)
+               ata_port_desc(host->ports[i], "irq %d", irq);
 
        rc = ata_host_register(host, sht);
        /* if failed, just free the IRQ and leave ports alone */
@@ -6602,6 +6921,7 @@ int ata_host_activate(struct ata_host *host, int irq,
 void ata_port_detach(struct ata_port *ap)
 {
        unsigned long flags;
+       struct ata_link *link;
        struct ata_device *dev;
 
        if (!ap->ops->error_handler)
@@ -6619,8 +6939,10 @@ void ata_port_detach(struct ata_port *ap)
         */
        spin_lock_irqsave(ap->lock, flags);
 
-       ata_link_for_each_dev(dev, &ap->link)
-               ata_dev_disable(dev);
+       ata_port_for_each_link(link, ap) {
+               ata_link_for_each_dev(dev, link)
+                       ata_dev_disable(dev);
+       }
 
        spin_unlock_irqrestore(ap->lock, flags);
 
@@ -6699,7 +7021,7 @@ void ata_std_ports(struct ata_ioports *ioaddr)
  */
 void ata_pci_remove_one(struct pci_dev *pdev)
 {
-       struct device *dev = pci_dev_to_dev(pdev);
+       struct device *dev = &pdev->dev;
        struct ata_host *host = dev_get_drvdata(dev);
 
        ata_host_detach(host);
@@ -6907,7 +7229,6 @@ static unsigned int ata_dummy_qc_issue(struct ata_queued_cmd *qc)
 }
 
 const struct ata_port_operations ata_dummy_port_ops = {
-       .port_disable           = ata_port_disable,
        .check_status           = ata_dummy_check_status,
        .check_altstatus        = ata_dummy_check_status,
        .dev_select             = ata_noop_dev_select,
@@ -6969,6 +7290,7 @@ EXPORT_SYMBOL_GPL(ata_interrupt);
 EXPORT_SYMBOL_GPL(ata_do_set_mode);
 EXPORT_SYMBOL_GPL(ata_data_xfer);
 EXPORT_SYMBOL_GPL(ata_data_xfer_noirq);
+EXPORT_SYMBOL_GPL(ata_std_qc_defer);
 EXPORT_SYMBOL_GPL(ata_qc_prep);
 EXPORT_SYMBOL_GPL(ata_dumb_qc_prep);
 EXPORT_SYMBOL_GPL(ata_noop_qc_prep);
@@ -7045,22 +7367,31 @@ EXPORT_SYMBOL_GPL(ata_pci_default_filter);
 EXPORT_SYMBOL_GPL(ata_pci_clear_simplex);
 #endif /* CONFIG_PCI */
 
+EXPORT_SYMBOL_GPL(sata_pmp_qc_defer_cmd_switch);
+EXPORT_SYMBOL_GPL(sata_pmp_std_prereset);
+EXPORT_SYMBOL_GPL(sata_pmp_std_hardreset);
+EXPORT_SYMBOL_GPL(sata_pmp_std_postreset);
+EXPORT_SYMBOL_GPL(sata_pmp_do_eh);
+
 EXPORT_SYMBOL_GPL(__ata_ehi_push_desc);
 EXPORT_SYMBOL_GPL(ata_ehi_push_desc);
 EXPORT_SYMBOL_GPL(ata_ehi_clear_desc);
+EXPORT_SYMBOL_GPL(ata_port_desc);
+#ifdef CONFIG_PCI
+EXPORT_SYMBOL_GPL(ata_port_pbar_desc);
+#endif /* CONFIG_PCI */
 EXPORT_SYMBOL_GPL(ata_eng_timeout);
 EXPORT_SYMBOL_GPL(ata_port_schedule_eh);
+EXPORT_SYMBOL_GPL(ata_link_abort);
 EXPORT_SYMBOL_GPL(ata_port_abort);
 EXPORT_SYMBOL_GPL(ata_port_freeze);
+EXPORT_SYMBOL_GPL(sata_async_notification);
 EXPORT_SYMBOL_GPL(ata_eh_freeze_port);
 EXPORT_SYMBOL_GPL(ata_eh_thaw_port);
 EXPORT_SYMBOL_GPL(ata_eh_qc_complete);
 EXPORT_SYMBOL_GPL(ata_eh_qc_retry);
 EXPORT_SYMBOL_GPL(ata_do_eh);
 EXPORT_SYMBOL_GPL(ata_irq_on);
-EXPORT_SYMBOL_GPL(ata_dummy_irq_on);
-EXPORT_SYMBOL_GPL(ata_irq_ack);
-EXPORT_SYMBOL_GPL(ata_dummy_irq_ack);
 EXPORT_SYMBOL_GPL(ata_dev_try_classify);
 
 EXPORT_SYMBOL_GPL(ata_cable_40wire);