--- /dev/null
+From 7f9c9f8e24590e7dcd26ca408458c43df5b83e61 Mon Sep 17 00:00:00 2001
+From: Hugh Daschbach <hugh.daschbach@enmotus.com>
+Date: Fri, 4 Jan 2013 14:39:09 -0800
+Subject: libata: ahci: Add support for Enmotus Bobcat device.
+
+From: Hugh Daschbach <hugh.daschbach@enmotus.com>
+
+commit 7f9c9f8e24590e7dcd26ca408458c43df5b83e61 upstream.
+
+Silicon does not support standard AHCI BAR assignment. Add
+vendor/device exception to force BAR 2.
+
+Signed-off-by: Hugh Daschbach <hugh.daschbach@enmotus.com>
+Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/ata/ahci.c | 8 +++++++-
+ 1 file changed, 7 insertions(+), 1 deletion(-)
+
+--- a/drivers/ata/ahci.c
++++ b/drivers/ata/ahci.c
+@@ -53,6 +53,7 @@
+
+ enum {
+ AHCI_PCI_BAR_STA2X11 = 0,
++ AHCI_PCI_BAR_ENMOTUS = 2,
+ AHCI_PCI_BAR_STANDARD = 5,
+ };
+
+@@ -410,6 +411,9 @@ static const struct pci_device_id ahci_p
+ { PCI_VDEVICE(ASMEDIA, 0x0611), board_ahci }, /* ASM1061 */
+ { PCI_VDEVICE(ASMEDIA, 0x0612), board_ahci }, /* ASM1062 */
+
++ /* Enmotus */
++ { PCI_DEVICE(0x1c44, 0x8000), board_ahci },
++
+ /* Generic, PCI class code for AHCI */
+ { PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID,
+ PCI_CLASS_STORAGE_SATA_AHCI, 0xffffff, board_ahci },
+@@ -1098,9 +1102,11 @@ static int ahci_init_one(struct pci_dev
+ dev_info(&pdev->dev,
+ "PDC42819 can only drive SATA devices with this driver\n");
+
+- /* The Connext uses non-standard BAR */
++ /* Both Connext and Enmotus devices use non-standard BARs */
+ if (pdev->vendor == PCI_VENDOR_ID_STMICRO && pdev->device == 0xCC06)
+ ahci_pci_bar = AHCI_PCI_BAR_STA2X11;
++ else if (pdev->vendor == 0x1c44 && pdev->device == 0x8000)
++ ahci_pci_bar = AHCI_PCI_BAR_ENMOTUS;
+
+ /* acquire resources */
+ rc = pcim_enable_device(pdev);
--- /dev/null
+From 1eaca39a84170b369fe61fb1da3c1e8606859e99 Mon Sep 17 00:00:00 2001
+From: Bian Yu <bianyu@kedacom.com>
+Date: Wed, 12 Dec 2012 22:26:58 -0500
+Subject: libata: ahci: Fix lack of command retry after a success error handler.
+
+From: Bian Yu <bianyu@kedacom.com>
+
+commit 1eaca39a84170b369fe61fb1da3c1e8606859e99 upstream.
+
+It should be a mistake introduced by commit 8d899e70c1b3afff.
+
+qc->flags can't be set AC_ERR_*
+
+Signed-off-by: Bian Yu <bianyu@kedacom.com>
+Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/ata/libata-eh.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/drivers/ata/libata-eh.c
++++ b/drivers/ata/libata-eh.c
+@@ -2094,7 +2094,7 @@ static unsigned int ata_eh_speed_down(st
+ */
+ static inline int ata_eh_worth_retry(struct ata_queued_cmd *qc)
+ {
+- if (qc->flags & AC_ERR_MEDIA)
++ if (qc->err_mask & AC_ERR_MEDIA)
+ return 0; /* don't retry media errors */
+ if (qc->flags & ATA_QCFLAG_IO)
+ return 1; /* otherwise retry anything from fs stack */
--- /dev/null
+From 803739d25c2343da6d2f95eebdcbc08bf67097d4 Mon Sep 17 00:00:00 2001
+From: Shane Huang <shane.huang@amd.com>
+Date: Mon, 17 Dec 2012 23:18:59 +0800
+Subject: libata: replace sata_settings with devslp_timing
+
+From: Shane Huang <shane.huang@amd.com>
+
+commit 803739d25c2343da6d2f95eebdcbc08bf67097d4 upstream.
+
+NCQ capability was used to check availability of SATA Settings page
+from Identify Device Data Log, which contains DevSlp timing variables.
+It does not work on some HDDs and leads to error messages.
+
+IDENTIFY word 78 bit 5(Hardware Feature Control) can't work either
+because it is only the sufficient condition of Identify Device data
+log, not the necessary condition.
+
+This patch replaced ata_device->sata_settings with ->devslp_timing
+to only save DevSlp timing variables(8 bytes), instead of the whole
+SATA Settings page(512 bytes).
+
+Addresses https://bugzilla.kernel.org/show_bug.cgi?id=51881
+
+Reported-by: Borislav Petkov <bp@alien8.de>
+Signed-off-by: Shane Huang <shane.huang@amd.com>
+Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/ata/libahci.c | 6 +++---
+ drivers/ata/libata-core.c | 22 +++++++++++++---------
+ include/linux/ata.h | 8 +++++---
+ include/linux/libata.h | 4 ++--
+ 4 files changed, 23 insertions(+), 17 deletions(-)
+
+--- a/drivers/ata/libahci.c
++++ b/drivers/ata/libahci.c
+@@ -1951,13 +1951,13 @@ static void ahci_set_aggressive_devslp(s
+ /* Use the nominal value 10 ms if the read MDAT is zero,
+ * the nominal value of DETO is 20 ms.
+ */
+- if (dev->sata_settings[ATA_LOG_DEVSLP_VALID] &
++ if (dev->devslp_timing[ATA_LOG_DEVSLP_VALID] &
+ ATA_LOG_DEVSLP_VALID_MASK) {
+- mdat = dev->sata_settings[ATA_LOG_DEVSLP_MDAT] &
++ mdat = dev->devslp_timing[ATA_LOG_DEVSLP_MDAT] &
+ ATA_LOG_DEVSLP_MDAT_MASK;
+ if (!mdat)
+ mdat = 10;
+- deto = dev->sata_settings[ATA_LOG_DEVSLP_DETO];
++ deto = dev->devslp_timing[ATA_LOG_DEVSLP_DETO];
+ if (!deto)
+ deto = 20;
+ } else {
+--- a/drivers/ata/libata-core.c
++++ b/drivers/ata/libata-core.c
+@@ -2324,24 +2324,28 @@ int ata_dev_configure(struct ata_device
+ }
+ }
+
+- /* check and mark DevSlp capability */
+- if (ata_id_has_devslp(dev->id))
+- dev->flags |= ATA_DFLAG_DEVSLP;
+-
+- /* Obtain SATA Settings page from Identify Device Data Log,
+- * which contains DevSlp timing variables etc.
+- * Exclude old devices with ata_id_has_ncq()
++ /* Check and mark DevSlp capability. Get DevSlp timing variables
++ * from SATA Settings page of Identify Device Data Log.
+ */
+- if (ata_id_has_ncq(dev->id)) {
++ if (ata_id_has_devslp(dev->id)) {
++ u8 sata_setting[ATA_SECT_SIZE];
++ int i, j;
++
++ dev->flags |= ATA_DFLAG_DEVSLP;
+ err_mask = ata_read_log_page(dev,
+ ATA_LOG_SATA_ID_DEV_DATA,
+ ATA_LOG_SATA_SETTINGS,
+- dev->sata_settings,
++ sata_setting,
+ 1);
+ if (err_mask)
+ ata_dev_dbg(dev,
+ "failed to get Identify Device Data, Emask 0x%x\n",
+ err_mask);
++ else
++ for (i = 0; i < ATA_LOG_DEVSLP_SIZE; i++) {
++ j = ATA_LOG_DEVSLP_OFFSET + i;
++ dev->devslp_timing[i] = sata_setting[j];
++ }
+ }
+
+ dev->cdb_len = 16;
+--- a/include/linux/ata.h
++++ b/include/linux/ata.h
+@@ -297,10 +297,12 @@ enum {
+ ATA_LOG_SATA_NCQ = 0x10,
+ ATA_LOG_SATA_ID_DEV_DATA = 0x30,
+ ATA_LOG_SATA_SETTINGS = 0x08,
+- ATA_LOG_DEVSLP_MDAT = 0x30,
++ ATA_LOG_DEVSLP_OFFSET = 0x30,
++ ATA_LOG_DEVSLP_SIZE = 0x08,
++ ATA_LOG_DEVSLP_MDAT = 0x00,
+ ATA_LOG_DEVSLP_MDAT_MASK = 0x1F,
+- ATA_LOG_DEVSLP_DETO = 0x31,
+- ATA_LOG_DEVSLP_VALID = 0x37,
++ ATA_LOG_DEVSLP_DETO = 0x01,
++ ATA_LOG_DEVSLP_VALID = 0x07,
+ ATA_LOG_DEVSLP_VALID_MASK = 0x80,
+
+ /* READ/WRITE LONG (obsolete) */
+--- a/include/linux/libata.h
++++ b/include/linux/libata.h
+@@ -652,8 +652,8 @@ struct ata_device {
+ u32 gscr[SATA_PMP_GSCR_DWORDS]; /* PMP GSCR block */
+ };
+
+- /* Identify Device Data Log (30h), SATA Settings (page 08h) */
+- u8 sata_settings[ATA_SECT_SIZE];
++ /* DEVSLP Timing Variables from Identify Device Data Log */
++ u8 devslp_timing[ATA_LOG_DEVSLP_SIZE];
+
+ /* error history */
+ int spdn_cnt;