vserver 2.0 rc7
[linux-2.6.git] / drivers / scsi / ahci.c
index 9bf037e..fc5263c 100644 (file)
@@ -32,6 +32,7 @@
 #include <linux/delay.h>
 #include <linux/interrupt.h>
 #include <linux/sched.h>
+#include <linux/dma-mapping.h>
 #include "scsi.h"
 #include <scsi/scsi_host.h>
 #include <linux/libata.h>
@@ -177,6 +178,7 @@ static void ahci_eng_timeout(struct ata_port *ap);
 static int ahci_port_start(struct ata_port *ap);
 static void ahci_port_stop(struct ata_port *ap);
 static void ahci_host_stop(struct ata_host_set *host_set);
+static void ahci_tf_read(struct ata_port *ap, struct ata_taskfile *tf);
 static void ahci_qc_prep(struct ata_queued_cmd *qc);
 static u8 ahci_check_status(struct ata_port *ap);
 static u8 ahci_check_err(struct ata_port *ap);
@@ -199,6 +201,7 @@ static Scsi_Host_Template ahci_sht = {
        .dma_boundary           = AHCI_DMA_BOUNDARY,
        .slave_configure        = ata_scsi_slave_config,
        .bios_param             = ata_std_bios_param,
+       .ordered_flush          = 1,
 };
 
 static struct ata_port_operations ahci_ops = {
@@ -209,6 +212,8 @@ static struct ata_port_operations ahci_ops = {
        .check_err              = ahci_check_err,
        .dev_select             = ata_noop_dev_select,
 
+       .tf_read                = ahci_tf_read,
+
        .phy_reset              = ahci_phy_reset,
 
        .qc_prep                = ahci_qc_prep,
@@ -249,12 +254,16 @@ static struct pci_device_id ahci_pci_tbl[] = {
          board_ahci }, /* ICH7 */
        { PCI_VENDOR_ID_INTEL, 0x27c5, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
          board_ahci }, /* ICH7M */
-       { PCI_VENDOR_ID_INTEL, 0x27c2, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
-         board_ahci }, /* ICH7R */
        { PCI_VENDOR_ID_INTEL, 0x27c3, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
          board_ahci }, /* ICH7R */
        { PCI_VENDOR_ID_AL, 0x5288, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
          board_ahci }, /* ULi M5288 */
+       { PCI_VENDOR_ID_INTEL, 0x2681, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+         board_ahci }, /* ESB2 */
+       { PCI_VENDOR_ID_INTEL, 0x2682, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+         board_ahci }, /* ESB2 */
+       { PCI_VENDOR_ID_INTEL, 0x2683, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+         board_ahci }, /* ESB2 */
        { }     /* terminate list */
 };
 
@@ -281,6 +290,8 @@ static void ahci_host_stop(struct ata_host_set *host_set)
 {
        struct ahci_host_priv *hpriv = host_set->private_data;
        kfree(hpriv);
+
+       ata_host_stop(host_set);
 }
 
 static int ahci_port_start(struct ata_port *ap)
@@ -462,6 +473,14 @@ static u8 ahci_check_err(struct ata_port *ap)
        return (readl(mmio + PORT_TFDATA) >> 8) & 0xFF;
 }
 
+static void ahci_tf_read(struct ata_port *ap, struct ata_taskfile *tf)
+{
+       struct ahci_port_priv *pp = ap->private_data;
+       u8 *d2h_fis = pp->rx_fis + RX_FIS_D2H_REG;
+
+       ata_tf_from_fis(d2h_fis, tf);
+}
+
 static void ahci_fill_sg(struct ata_queued_cmd *qc)
 {
        struct ahci_port_priv *pp = qc->ap->private_data;
@@ -538,7 +557,7 @@ static void ahci_intr_error(struct ata_port *ap, u32 irq_stat)
 
        /* stop DMA */
        tmp = readl(port_mmio + PORT_CMD);
-       tmp &= PORT_CMD_START | PORT_CMD_FIS_RX;
+       tmp &= ~PORT_CMD_START;
        writel(tmp, port_mmio + PORT_CMD);
 
        /* wait for engine to stop.  TODO: this could be
@@ -570,11 +589,11 @@ static void ahci_intr_error(struct ata_port *ap, u32 irq_stat)
 
        /* re-start DMA */
        tmp = readl(port_mmio + PORT_CMD);
-       tmp |= PORT_CMD_START | PORT_CMD_FIS_RX;
+       tmp |= PORT_CMD_START;
        writel(tmp, port_mmio + PORT_CMD);
        readl(port_mmio + PORT_CMD); /* flush */
 
-       printk(KERN_WARNING "ata%u: error occurred, port reset\n", ap->port_no);
+       printk(KERN_WARNING "ata%u: error occurred, port reset\n", ap->id);
 }
 
 static void ahci_eng_timeout(struct ata_port *ap)
@@ -766,10 +785,10 @@ static int ahci_host_init(struct ata_probe_ent *probe_ent)
 
        using_dac = hpriv->cap & HOST_CAP_64;
        if (using_dac &&
-           !pci_set_dma_mask(pdev, 0xffffffffffffffffULL)) {
-               rc = pci_set_consistent_dma_mask(pdev, 0xffffffffffffffffULL);
+           !pci_set_dma_mask(pdev, DMA_64BIT_MASK)) {
+               rc = pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK);
                if (rc) {
-                       rc = pci_set_consistent_dma_mask(pdev, 0xffffffffULL);
+                       rc = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK);
                        if (rc) {
                                printk(KERN_ERR DRV_NAME "(%s): 64-bit DMA enable failed\n",
                                        pci_name(pdev));
@@ -779,13 +798,13 @@ static int ahci_host_init(struct ata_probe_ent *probe_ent)
 
                hpriv->flags |= HOST_CAP_64;
        } else {
-               rc = pci_set_dma_mask(pdev, 0xffffffffULL);
+               rc = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
                if (rc) {
                        printk(KERN_ERR DRV_NAME "(%s): 32-bit DMA enable failed\n",
                                pci_name(pdev));
                        return rc;
                }
-               rc = pci_set_consistent_dma_mask(pdev, 0xffffffffULL);
+               rc = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK);
                if (rc) {
                        printk(KERN_ERR DRV_NAME "(%s): 32-bit consistent DMA enable failed\n",
                                pci_name(pdev));