]> err.no Git - linux-2.6/commitdiff
Merge /spare/repo/linux-2.6 into upstream
authorJeff Garzik <jeff@garzik.org>
Tue, 29 Aug 2006 21:55:59 +0000 (17:55 -0400)
committerJeff Garzik <jeff@garzik.org>
Tue, 29 Aug 2006 21:55:59 +0000 (17:55 -0400)
39 files changed:
Documentation/DocBook/libata.tmpl
drivers/Kconfig
drivers/Makefile
drivers/ata/Kconfig [new file with mode: 0644]
drivers/ata/Makefile [new file with mode: 0644]
drivers/ata/ahci.c [moved from drivers/scsi/ahci.c with 79% similarity]
drivers/ata/ata_piix.c [moved from drivers/scsi/ata_piix.c with 93% similarity]
drivers/ata/libata-core.c [moved from drivers/scsi/libata-core.c with 92% similarity]
drivers/ata/libata-eh.c [moved from drivers/scsi/libata-eh.c with 99% similarity]
drivers/ata/libata-scsi.c [moved from drivers/scsi/libata-scsi.c with 94% similarity]
drivers/ata/libata-sff.c [moved from drivers/scsi/libata-bmdma.c with 89% similarity]
drivers/ata/libata.h [moved from drivers/scsi/libata.h with 94% similarity]
drivers/ata/pdc_adma.c [moved from drivers/scsi/pdc_adma.c with 93% similarity]
drivers/ata/sata_mv.c [moved from drivers/scsi/sata_mv.c with 96% similarity]
drivers/ata/sata_nv.c [moved from drivers/scsi/sata_nv.c with 91% similarity]
drivers/ata/sata_promise.c [moved from drivers/scsi/sata_promise.c with 93% similarity]
drivers/ata/sata_promise.h [moved from drivers/scsi/sata_promise.h with 100% similarity]
drivers/ata/sata_qstor.c [moved from drivers/scsi/sata_qstor.c with 93% similarity]
drivers/ata/sata_sil.c [moved from drivers/scsi/sata_sil.c with 93% similarity]
drivers/ata/sata_sil24.c [moved from drivers/scsi/sata_sil24.c with 95% similarity]
drivers/ata/sata_sis.c [moved from drivers/scsi/sata_sis.c with 94% similarity]
drivers/ata/sata_svw.c [moved from drivers/scsi/sata_svw.c with 98% similarity]
drivers/ata/sata_sx4.c [moved from drivers/scsi/sata_sx4.c with 96% similarity]
drivers/ata/sata_uli.c [moved from drivers/scsi/sata_uli.c with 96% similarity]
drivers/ata/sata_via.c [moved from drivers/scsi/sata_via.c with 98% similarity]
drivers/ata/sata_vsc.c [moved from drivers/scsi/sata_vsc.c with 97% similarity]
drivers/pci/quirks.c
drivers/scsi/Kconfig
drivers/scsi/Makefile
include/asm-alpha/libata-portmap.h [new file with mode: 0644]
include/asm-generic/libata-portmap.h [new file with mode: 0644]
include/asm-i386/libata-portmap.h [new file with mode: 0644]
include/asm-ia64/libata-portmap.h [new file with mode: 0644]
include/asm-powerpc/libata-portmap.h [new file with mode: 0644]
include/asm-sparc/libata-portmap.h [new file with mode: 0644]
include/asm-sparc64/libata-portmap.h [new file with mode: 0644]
include/asm-x86_64/libata-portmap.h [new file with mode: 0644]
include/linux/ata.h
include/linux/libata.h

index e97c3231454173e938f9554929420c441683a9de..065e8dc23e3adb4bd3d5d659ddf2a80741261b3a 100644 (file)
@@ -868,18 +868,18 @@ and other resources, etc.
 
   <chapter id="libataExt">
      <title>libata Library</title>
-!Edrivers/scsi/libata-core.c
+!Edrivers/ata/libata-core.c
   </chapter>
 
   <chapter id="libataInt">
      <title>libata Core Internals</title>
-!Idrivers/scsi/libata-core.c
+!Idrivers/ata/libata-core.c
   </chapter>
 
   <chapter id="libataScsiInt">
      <title>libata SCSI translation/emulation</title>
-!Edrivers/scsi/libata-scsi.c
-!Idrivers/scsi/libata-scsi.c
+!Edrivers/ata/libata-scsi.c
+!Idrivers/ata/libata-scsi.c
   </chapter>
 
   <chapter id="ataExceptions">
@@ -1600,12 +1600,12 @@ and other resources, etc.
 
   <chapter id="PiixInt">
      <title>ata_piix Internals</title>
-!Idrivers/scsi/ata_piix.c
+!Idrivers/ata/ata_piix.c
   </chapter>
 
   <chapter id="SILInt">
      <title>sata_sil Internals</title>
-!Idrivers/scsi/sata_sil.c
+!Idrivers/ata/sata_sil.c
   </chapter>
 
   <chapter id="libataThanks">
index 8b11cebe65df5ad396f8fb975e158466f9dd859b..263e86ddc1a4d0740b3e524ced6703d3a991f3d2 100644 (file)
@@ -18,6 +18,8 @@ source "drivers/ide/Kconfig"
 
 source "drivers/scsi/Kconfig"
 
+source "drivers/ata/Kconfig"
+
 source "drivers/cdrom/Kconfig"
 
 source "drivers/md/Kconfig"
index fc2d744a4e4a75e3960589df663a84650c9a85b7..4ac14dab3079f8b8910a19d733d1ba2692d41c0b 100644 (file)
@@ -34,6 +34,7 @@ obj-$(CONFIG_PPC_PMAC)                += macintosh/
 obj-$(CONFIG_IDE)              += ide/
 obj-$(CONFIG_FC4)              += fc4/
 obj-$(CONFIG_SCSI)             += scsi/
+obj-$(CONFIG_ATA)              += ata/
 obj-$(CONFIG_FUSION)           += message/
 obj-$(CONFIG_IEEE1394)         += ieee1394/
 obj-y                          += cdrom/
diff --git a/drivers/ata/Kconfig b/drivers/ata/Kconfig
new file mode 100644 (file)
index 0000000..13027d5
--- /dev/null
@@ -0,0 +1,150 @@
+#
+# SATA/PATA driver configuration
+#
+
+menu "Serial ATA (prod) and Parallel ATA (experimental) drivers"
+
+config ATA
+       tristate "ATA device support"
+       select SCSI
+       ---help---
+         If you want to use a ATA hard disk, ATA tape drive, ATA CD-ROM or
+         any other ATA device under Linux, say Y and make sure that you know
+         the name of your ATA host adapter (the card inside your computer
+         that "speaks" the ATA protocol, also called ATA controller),
+         because you will be asked for it.
+
+if ATA
+
+config SATA_AHCI
+       tristate "AHCI SATA support"
+       depends on PCI
+       help
+         This option enables support for AHCI Serial ATA.
+
+         If unsure, say N.
+
+config SATA_SVW
+       tristate "ServerWorks Frodo / Apple K2 SATA support"
+       depends on PCI
+       help
+         This option enables support for Broadcom/Serverworks/Apple K2
+         SATA support.
+
+         If unsure, say N.
+
+config ATA_PIIX
+       tristate "Intel PIIX/ICH SATA support"
+       depends on PCI
+       help
+         This option enables support for ICH5/6/7/8 Serial ATA.
+         If PATA support was enabled previously, this enables
+         support for select Intel PIIX/ICH PATA host controllers.
+
+         If unsure, say N.
+
+config SATA_MV
+       tristate "Marvell SATA support (HIGHLY EXPERIMENTAL)"
+       depends on PCI && EXPERIMENTAL
+       help
+         This option enables support for the Marvell Serial ATA family.
+         Currently supports 88SX[56]0[48][01] chips.
+
+         If unsure, say N.
+
+config SATA_NV
+       tristate "NVIDIA SATA support"
+       depends on PCI
+       help
+         This option enables support for NVIDIA Serial ATA.
+
+         If unsure, say N.
+
+config PDC_ADMA
+       tristate "Pacific Digital ADMA support"
+       depends on PCI
+       help
+         This option enables support for Pacific Digital ADMA controllers
+
+         If unsure, say N.
+
+config SATA_QSTOR
+       tristate "Pacific Digital SATA QStor support"
+       depends on PCI
+       help
+         This option enables support for Pacific Digital Serial ATA QStor.
+
+         If unsure, say N.
+
+config SATA_PROMISE
+       tristate "Promise SATA TX2/TX4 support"
+       depends on PCI
+       help
+         This option enables support for Promise Serial ATA TX2/TX4.
+
+         If unsure, say N.
+
+config SATA_SX4
+       tristate "Promise SATA SX4 support"
+       depends on PCI && EXPERIMENTAL
+       help
+         This option enables support for Promise Serial ATA SX4.
+
+         If unsure, say N.
+
+config SATA_SIL
+       tristate "Silicon Image SATA support"
+       depends on PCI
+       help
+         This option enables support for Silicon Image Serial ATA.
+
+         If unsure, say N.
+
+config SATA_SIL24
+       tristate "Silicon Image 3124/3132 SATA support"
+       depends on PCI
+       help
+         This option enables support for Silicon Image 3124/3132 Serial ATA.
+
+         If unsure, say N.
+
+config SATA_SIS
+       tristate "SiS 964/180 SATA support"
+       depends on PCI
+       help
+         This option enables support for SiS Serial ATA 964/180.
+
+         If unsure, say N.
+
+config SATA_ULI
+       tristate "ULi Electronics SATA support"
+       depends on PCI
+       help
+         This option enables support for ULi Electronics SATA.
+
+         If unsure, say N.
+
+config SATA_VIA
+       tristate "VIA SATA support"
+       depends on PCI
+       help
+         This option enables support for VIA Serial ATA.
+
+         If unsure, say N.
+
+config SATA_VITESSE
+       tristate "VITESSE VSC-7174 / INTEL 31244 SATA support"
+       depends on PCI
+       help
+         This option enables support for Vitesse VSC7174 and Intel 31244 Serial ATA.
+
+         If unsure, say N.
+
+config SATA_INTEL_COMBINED
+       bool
+       depends on IDE=y && !BLK_DEV_IDE_SATA && (SATA_AHCI || ATA_PIIX)
+       default y
+
+endif
+endmenu
+
diff --git a/drivers/ata/Makefile b/drivers/ata/Makefile
new file mode 100644 (file)
index 0000000..e260e3f
--- /dev/null
@@ -0,0 +1,21 @@
+
+obj-$(CONFIG_ATA)              += libata.o
+
+obj-$(CONFIG_SATA_AHCI)                += ahci.o
+obj-$(CONFIG_SATA_SVW)         += sata_svw.o
+obj-$(CONFIG_ATA_PIIX)         += ata_piix.o
+obj-$(CONFIG_SATA_PROMISE)     += sata_promise.o
+obj-$(CONFIG_SATA_QSTOR)       += sata_qstor.o
+obj-$(CONFIG_SATA_SIL)         += sata_sil.o
+obj-$(CONFIG_SATA_SIL24)       += sata_sil24.o
+obj-$(CONFIG_SATA_VIA)         += sata_via.o
+obj-$(CONFIG_SATA_VITESSE)     += sata_vsc.o
+obj-$(CONFIG_SATA_SIS)         += sata_sis.o
+obj-$(CONFIG_SATA_SX4)         += sata_sx4.o
+obj-$(CONFIG_SATA_NV)          += sata_nv.o
+obj-$(CONFIG_SATA_ULI)         += sata_uli.o
+obj-$(CONFIG_SATA_MV)          += sata_mv.o
+obj-$(CONFIG_PDC_ADMA)         += pdc_adma.o
+
+libata-objs    := libata-core.o libata-scsi.o libata-sff.o libata-eh.o
+
similarity index 79%
rename from drivers/scsi/ahci.c
rename to drivers/ata/ahci.c
index 904c25fb4ba4a26678bf81e9b8bc4315714bed5f..3f1106fdaed15b9f520d235db0bf4431e614469a 100644 (file)
@@ -92,7 +92,9 @@ enum {
        HOST_AHCI_EN            = (1 << 31), /* AHCI enabled */
 
        /* HOST_CAP bits */
+       HOST_CAP_SSC            = (1 << 14), /* Slumber capable */
        HOST_CAP_CLO            = (1 << 24), /* Command List Override support */
+       HOST_CAP_SSS            = (1 << 27), /* Staggered Spin-up */
        HOST_CAP_NCQ            = (1 << 30), /* Native Command Queueing */
        HOST_CAP_64             = (1 << 31), /* PCI DAC (64-bit DMA) support */
 
@@ -155,6 +157,7 @@ enum {
        PORT_CMD_SPIN_UP        = (1 << 1), /* Spin up device */
        PORT_CMD_START          = (1 << 0), /* Enable port DMA engine */
 
+       PORT_CMD_ICC_MASK       = (0xf << 28), /* i/f ICC state mask */
        PORT_CMD_ICC_ACTIVE     = (0x1 << 28), /* Put i/f in active state */
        PORT_CMD_ICC_PARTIAL    = (0x2 << 28), /* Put i/f in partial state */
        PORT_CMD_ICC_SLUMBER    = (0x6 << 28), /* Put i/f in slumber state */
@@ -212,6 +215,10 @@ static void ahci_freeze(struct ata_port *ap);
 static void ahci_thaw(struct ata_port *ap);
 static void ahci_error_handler(struct ata_port *ap);
 static void ahci_post_internal_cmd(struct ata_queued_cmd *qc);
+static int ahci_port_suspend(struct ata_port *ap, pm_message_t mesg);
+static int ahci_port_resume(struct ata_port *ap);
+static int ahci_pci_device_suspend(struct pci_dev *pdev, pm_message_t mesg);
+static int ahci_pci_device_resume(struct pci_dev *pdev);
 static void ahci_remove_one (struct pci_dev *pdev);
 
 static struct scsi_host_template ahci_sht = {
@@ -231,6 +238,8 @@ static struct scsi_host_template ahci_sht = {
        .slave_configure        = ata_scsi_slave_config,
        .slave_destroy          = ata_scsi_slave_destroy,
        .bios_param             = ata_std_bios_param,
+       .suspend                = ata_scsi_device_suspend,
+       .resume                 = ata_scsi_device_resume,
 };
 
 static const struct ata_port_operations ahci_ops = {
@@ -257,6 +266,9 @@ static const struct ata_port_operations ahci_ops = {
        .error_handler          = ahci_error_handler,
        .post_internal_cmd      = ahci_post_internal_cmd,
 
+       .port_suspend           = ahci_port_suspend,
+       .port_resume            = ahci_port_resume,
+
        .port_start             = ahci_port_start,
        .port_stop              = ahci_port_stop,
 };
@@ -265,7 +277,7 @@ static const struct ata_port_info ahci_port_info[] = {
        /* board_ahci */
        {
                .sht            = &ahci_sht,
-               .host_flags     = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY |
+               .flags          = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY |
                                  ATA_FLAG_MMIO | ATA_FLAG_PIO_DMA |
                                  ATA_FLAG_SKIP_D2H_BSY,
                .pio_mask       = 0x1f, /* pio0-4 */
@@ -275,7 +287,7 @@ static const struct ata_port_info ahci_port_info[] = {
        /* board_ahci_vt8251 */
        {
                .sht            = &ahci_sht,
-               .host_flags     = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY |
+               .flags          = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY |
                                  ATA_FLAG_MMIO | ATA_FLAG_PIO_DMA |
                                  ATA_FLAG_SKIP_D2H_BSY |
                                  AHCI_FLAG_RESET_NEEDS_CLO | AHCI_FLAG_NO_NCQ,
@@ -350,6 +362,14 @@ static const struct pci_device_id ahci_pci_tbl[] = {
        { PCI_VENDOR_ID_NVIDIA, 0x044f, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
          board_ahci },         /* MCP65 */
 
+       /* SiS */
+       { PCI_VENDOR_ID_SI, 0x1184, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+         board_ahci }, /* SiS 966 */
+       { PCI_VENDOR_ID_SI, 0x1185, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+         board_ahci }, /* SiS 966 */
+       { PCI_VENDOR_ID_SI, 0x0186, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+         board_ahci }, /* SiS 968 */
+
        { }     /* terminate list */
 };
 
@@ -358,6 +378,8 @@ static struct pci_driver ahci_pci_driver = {
        .name                   = DRV_NAME,
        .id_table               = ahci_pci_tbl,
        .probe                  = ahci_init_one,
+       .suspend                = ahci_pci_device_suspend,
+       .resume                 = ahci_pci_device_resume,
        .remove                 = ahci_remove_one,
 };
 
@@ -372,177 +394,288 @@ static inline void __iomem *ahci_port_base (void __iomem *base, unsigned int por
        return (void __iomem *) ahci_port_base_ul((unsigned long)base, port);
 }
 
-static int ahci_port_start(struct ata_port *ap)
+static u32 ahci_scr_read (struct ata_port *ap, unsigned int sc_reg_in)
 {
-       struct device *dev = ap->host_set->dev;
-       struct ahci_host_priv *hpriv = ap->host_set->private_data;
-       struct ahci_port_priv *pp;
-       void __iomem *mmio = ap->host_set->mmio_base;
-       void __iomem *port_mmio = ahci_port_base(mmio, ap->port_no);
-       void *mem;
-       dma_addr_t mem_dma;
-       int rc;
-
-       pp = kmalloc(sizeof(*pp), GFP_KERNEL);
-       if (!pp)
-               return -ENOMEM;
-       memset(pp, 0, sizeof(*pp));
+       unsigned int sc_reg;
 
-       rc = ata_pad_alloc(ap, dev);
-       if (rc) {
-               kfree(pp);
-               return rc;
+       switch (sc_reg_in) {
+       case SCR_STATUS:        sc_reg = 0; break;
+       case SCR_CONTROL:       sc_reg = 1; break;
+       case SCR_ERROR:         sc_reg = 2; break;
+       case SCR_ACTIVE:        sc_reg = 3; break;
+       default:
+               return 0xffffffffU;
        }
 
-       mem = dma_alloc_coherent(dev, AHCI_PORT_PRIV_DMA_SZ, &mem_dma, GFP_KERNEL);
-       if (!mem) {
-               ata_pad_free(ap, dev);
-               kfree(pp);
-               return -ENOMEM;
-       }
-       memset(mem, 0, AHCI_PORT_PRIV_DMA_SZ);
+       return readl((void __iomem *) ap->ioaddr.scr_addr + (sc_reg * 4));
+}
 
-       /*
-        * First item in chunk of DMA memory: 32-slot command table,
-        * 32 bytes each in size
-        */
-       pp->cmd_slot = mem;
-       pp->cmd_slot_dma = mem_dma;
 
-       mem += AHCI_CMD_SLOT_SZ;
-       mem_dma += AHCI_CMD_SLOT_SZ;
+static void ahci_scr_write (struct ata_port *ap, unsigned int sc_reg_in,
+                              u32 val)
+{
+       unsigned int sc_reg;
 
-       /*
-        * Second item: Received-FIS area
-        */
-       pp->rx_fis = mem;
-       pp->rx_fis_dma = mem_dma;
+       switch (sc_reg_in) {
+       case SCR_STATUS:        sc_reg = 0; break;
+       case SCR_CONTROL:       sc_reg = 1; break;
+       case SCR_ERROR:         sc_reg = 2; break;
+       case SCR_ACTIVE:        sc_reg = 3; break;
+       default:
+               return;
+       }
 
-       mem += AHCI_RX_FIS_SZ;
-       mem_dma += AHCI_RX_FIS_SZ;
+       writel(val, (void __iomem *) ap->ioaddr.scr_addr + (sc_reg * 4));
+}
 
-       /*
-        * Third item: data area for storing a single command
-        * and its scatter-gather table
-        */
-       pp->cmd_tbl = mem;
-       pp->cmd_tbl_dma = mem_dma;
+static void ahci_start_engine(void __iomem *port_mmio)
+{
+       u32 tmp;
 
-       ap->private_data = pp;
+       /* start DMA */
+       tmp = readl(port_mmio + PORT_CMD);
+       tmp |= PORT_CMD_START;
+       writel(tmp, port_mmio + PORT_CMD);
+       readl(port_mmio + PORT_CMD); /* flush */
+}
 
-       if (hpriv->cap & HOST_CAP_64)
-               writel((pp->cmd_slot_dma >> 16) >> 16, port_mmio + PORT_LST_ADDR_HI);
-       writel(pp->cmd_slot_dma & 0xffffffff, port_mmio + PORT_LST_ADDR);
-       readl(port_mmio + PORT_LST_ADDR); /* flush */
+static int ahci_stop_engine(void __iomem *port_mmio)
+{
+       u32 tmp;
 
-       if (hpriv->cap & HOST_CAP_64)
-               writel((pp->rx_fis_dma >> 16) >> 16, port_mmio + PORT_FIS_ADDR_HI);
-       writel(pp->rx_fis_dma & 0xffffffff, port_mmio + PORT_FIS_ADDR);
-       readl(port_mmio + PORT_FIS_ADDR); /* flush */
+       tmp = readl(port_mmio + PORT_CMD);
 
-       writel(PORT_CMD_ICC_ACTIVE | PORT_CMD_FIS_RX |
-              PORT_CMD_POWER_ON | PORT_CMD_SPIN_UP |
-              PORT_CMD_START, port_mmio + PORT_CMD);
-       readl(port_mmio + PORT_CMD); /* flush */
+       /* check if the HBA is idle */
+       if ((tmp & (PORT_CMD_START | PORT_CMD_LIST_ON)) == 0)
+               return 0;
+
+       /* setting HBA to idle */
+       tmp &= ~PORT_CMD_START;
+       writel(tmp, port_mmio + PORT_CMD);
+
+       /* wait for engine to stop. This could be as long as 500 msec */
+       tmp = ata_wait_register(port_mmio + PORT_CMD,
+                               PORT_CMD_LIST_ON, PORT_CMD_LIST_ON, 1, 500);
+       if (tmp & PORT_CMD_LIST_ON)
+               return -EIO;
 
        return 0;
 }
 
+static void ahci_start_fis_rx(void __iomem *port_mmio, u32 cap,
+                             dma_addr_t cmd_slot_dma, dma_addr_t rx_fis_dma)
+{
+       u32 tmp;
 
-static void ahci_port_stop(struct ata_port *ap)
+       /* set FIS registers */
+       if (cap & HOST_CAP_64)
+               writel((cmd_slot_dma >> 16) >> 16, port_mmio + PORT_LST_ADDR_HI);
+       writel(cmd_slot_dma & 0xffffffff, port_mmio + PORT_LST_ADDR);
+
+       if (cap & HOST_CAP_64)
+               writel((rx_fis_dma >> 16) >> 16, port_mmio + PORT_FIS_ADDR_HI);
+       writel(rx_fis_dma & 0xffffffff, port_mmio + PORT_FIS_ADDR);
+
+       /* enable FIS reception */
+       tmp = readl(port_mmio + PORT_CMD);
+       tmp |= PORT_CMD_FIS_RX;
+       writel(tmp, port_mmio + PORT_CMD);
+
+       /* flush */
+       readl(port_mmio + PORT_CMD);
+}
+
+static int ahci_stop_fis_rx(void __iomem *port_mmio)
 {
-       struct device *dev = ap->host_set->dev;
-       struct ahci_port_priv *pp = ap->private_data;
-       void __iomem *mmio = ap->host_set->mmio_base;
-       void __iomem *port_mmio = ahci_port_base(mmio, ap->port_no);
        u32 tmp;
 
+       /* disable FIS reception */
        tmp = readl(port_mmio + PORT_CMD);
-       tmp &= ~(PORT_CMD_START | PORT_CMD_FIS_RX);
+       tmp &= ~PORT_CMD_FIS_RX;
        writel(tmp, port_mmio + PORT_CMD);
-       readl(port_mmio + PORT_CMD); /* flush */
 
-       /* spec says 500 msecs for each PORT_CMD_{START,FIS_RX} bit, so
-        * this is slightly incorrect.
-        */
-       msleep(500);
+       /* wait for completion, spec says 500ms, give it 1000 */
+       tmp = ata_wait_register(port_mmio + PORT_CMD, PORT_CMD_FIS_ON,
+                               PORT_CMD_FIS_ON, 10, 1000);
+       if (tmp & PORT_CMD_FIS_ON)
+               return -EBUSY;
 
-       ap->private_data = NULL;
-       dma_free_coherent(dev, AHCI_PORT_PRIV_DMA_SZ,
-                         pp->cmd_slot, pp->cmd_slot_dma);
-       ata_pad_free(ap, dev);
-       kfree(pp);
+       return 0;
 }
 
-static u32 ahci_scr_read (struct ata_port *ap, unsigned int sc_reg_in)
+static void ahci_power_up(void __iomem *port_mmio, u32 cap)
 {
-       unsigned int sc_reg;
+       u32 cmd;
 
-       switch (sc_reg_in) {
-       case SCR_STATUS:        sc_reg = 0; break;
-       case SCR_CONTROL:       sc_reg = 1; break;
-       case SCR_ERROR:         sc_reg = 2; break;
-       case SCR_ACTIVE:        sc_reg = 3; break;
-       default:
-               return 0xffffffffU;
+       cmd = readl(port_mmio + PORT_CMD) & ~PORT_CMD_ICC_MASK;
+
+       /* spin up device */
+       if (cap & HOST_CAP_SSS) {
+               cmd |= PORT_CMD_SPIN_UP;
+               writel(cmd, port_mmio + PORT_CMD);
        }
 
-       return readl((void __iomem *) ap->ioaddr.scr_addr + (sc_reg * 4));
+       /* wake up link */
+       writel(cmd | PORT_CMD_ICC_ACTIVE, port_mmio + PORT_CMD);
 }
 
+static void ahci_power_down(void __iomem *port_mmio, u32 cap)
+{
+       u32 cmd, scontrol;
 
-static void ahci_scr_write (struct ata_port *ap, unsigned int sc_reg_in,
-                              u32 val)
+       cmd = readl(port_mmio + PORT_CMD) & ~PORT_CMD_ICC_MASK;
+
+       if (cap & HOST_CAP_SSC) {
+               /* enable transitions to slumber mode */
+               scontrol = readl(port_mmio + PORT_SCR_CTL);
+               if ((scontrol & 0x0f00) > 0x100) {
+                       scontrol &= ~0xf00;
+                       writel(scontrol, port_mmio + PORT_SCR_CTL);
+               }
+
+               /* put device into slumber mode */
+               writel(cmd | PORT_CMD_ICC_SLUMBER, port_mmio + PORT_CMD);
+
+               /* wait for the transition to complete */
+               ata_wait_register(port_mmio + PORT_CMD, PORT_CMD_ICC_SLUMBER,
+                                 PORT_CMD_ICC_SLUMBER, 1, 50);
+       }
+
+       /* put device into listen mode */
+       if (cap & HOST_CAP_SSS) {
+               /* first set PxSCTL.DET to 0 */
+               scontrol = readl(port_mmio + PORT_SCR_CTL);
+               scontrol &= ~0xf;
+               writel(scontrol, port_mmio + PORT_SCR_CTL);
+
+               /* then set PxCMD.SUD to 0 */
+               cmd &= ~PORT_CMD_SPIN_UP;
+               writel(cmd, port_mmio + PORT_CMD);
+       }
+}
+
+static void ahci_init_port(void __iomem *port_mmio, u32 cap,
+                          dma_addr_t cmd_slot_dma, dma_addr_t rx_fis_dma)
 {
-       unsigned int sc_reg;
+       /* power up */
+       ahci_power_up(port_mmio, cap);
 
-       switch (sc_reg_in) {
-       case SCR_STATUS:        sc_reg = 0; break;
-       case SCR_CONTROL:       sc_reg = 1; break;
-       case SCR_ERROR:         sc_reg = 2; break;
-       case SCR_ACTIVE:        sc_reg = 3; break;
-       default:
-               return;
+       /* enable FIS reception */
+       ahci_start_fis_rx(port_mmio, cap, cmd_slot_dma, rx_fis_dma);
+
+       /* enable DMA */
+       ahci_start_engine(port_mmio);
+}
+
+static int ahci_deinit_port(void __iomem *port_mmio, u32 cap, const char **emsg)
+{
+       int rc;
+
+       /* disable DMA */
+       rc = ahci_stop_engine(port_mmio);
+       if (rc) {
+               *emsg = "failed to stop engine";
+               return rc;
        }
 
-       writel(val, (void __iomem *) ap->ioaddr.scr_addr + (sc_reg * 4));
+       /* disable FIS reception */
+       rc = ahci_stop_fis_rx(port_mmio);
+       if (rc) {
+               *emsg = "failed stop FIS RX";
+               return rc;
+       }
+
+       /* put device into slumber mode */
+       ahci_power_down(port_mmio, cap);
+
+       return 0;
 }
 
-static int ahci_stop_engine(struct ata_port *ap)
+static int ahci_reset_controller(void __iomem *mmio, struct pci_dev *pdev)
 {
-       void __iomem *mmio = ap->host_set->mmio_base;
-       void __iomem *port_mmio = ahci_port_base(mmio, ap->port_no);
-       int work;
-       u32 tmp;
+       u32 cap_save, tmp;
 
-       tmp = readl(port_mmio + PORT_CMD);
-       tmp &= ~PORT_CMD_START;
-       writel(tmp, port_mmio + PORT_CMD);
+       cap_save = readl(mmio + HOST_CAP);
+       cap_save &= ( (1<<28) | (1<<17) );
+       cap_save |= (1 << 27);
+
+       /* global controller reset */
+       tmp = readl(mmio + HOST_CTL);
+       if ((tmp & HOST_RESET) == 0) {
+               writel(tmp | HOST_RESET, mmio + HOST_CTL);
+               readl(mmio + HOST_CTL); /* flush */
+       }
 
-       /* wait for engine to stop.  TODO: this could be
-        * as long as 500 msec
+       /* reset must complete within 1 second, or
+        * the hardware should be considered fried.
         */
-       work = 1000;
-       while (work-- > 0) {
-               tmp = readl(port_mmio + PORT_CMD);
-               if ((tmp & PORT_CMD_LIST_ON) == 0)
-                       return 0;
-               udelay(10);
+       ssleep(1);
+
+       tmp = readl(mmio + HOST_CTL);
+       if (tmp & HOST_RESET) {
+               dev_printk(KERN_ERR, &pdev->dev,
+                          "controller reset failed (0x%x)\n", tmp);
+               return -EIO;
        }
 
-       return -EIO;
+       writel(HOST_AHCI_EN, mmio + HOST_CTL);
+       (void) readl(mmio + HOST_CTL);  /* flush */
+       writel(cap_save, mmio + HOST_CAP);
+       writel(0xf, mmio + HOST_PORTS_IMPL);
+       (void) readl(mmio + HOST_PORTS_IMPL);   /* flush */
+
+       if (pdev->vendor == PCI_VENDOR_ID_INTEL) {
+               u16 tmp16;
+
+               /* configure PCS */
+               pci_read_config_word(pdev, 0x92, &tmp16);
+               tmp16 |= 0xf;
+               pci_write_config_word(pdev, 0x92, tmp16);
+       }
+
+       return 0;
 }
 
-static void ahci_start_engine(struct ata_port *ap)
+static void ahci_init_controller(void __iomem *mmio, struct pci_dev *pdev,
+                                int n_ports, u32 cap)
 {
-       void __iomem *mmio = ap->host_set->mmio_base;
-       void __iomem *port_mmio = ahci_port_base(mmio, ap->port_no);
+       int i, rc;
        u32 tmp;
 
-       tmp = readl(port_mmio + PORT_CMD);
-       tmp |= PORT_CMD_START;
-       writel(tmp, port_mmio + PORT_CMD);
-       readl(port_mmio + PORT_CMD); /* flush */
+       for (i = 0; i < n_ports; i++) {
+               void __iomem *port_mmio = ahci_port_base(mmio, i);
+               const char *emsg = NULL;
+
+#if 0 /* BIOSen initialize this incorrectly */
+               if (!(hpriv->port_map & (1 << i)))
+                       continue;
+#endif
+
+               /* make sure port is not active */
+               rc = ahci_deinit_port(port_mmio, cap, &emsg);
+               if (rc)
+                       dev_printk(KERN_WARNING, &pdev->dev,
+                                  "%s (%d)\n", emsg, rc);
+
+               /* clear SError */
+               tmp = readl(port_mmio + PORT_SCR_ERR);
+               VPRINTK("PORT_SCR_ERR 0x%x\n", tmp);
+               writel(tmp, port_mmio + PORT_SCR_ERR);
+
+               /* clear port IRQ */
+               tmp = readl(port_mmio + PORT_IRQ_STAT);
+               VPRINTK("PORT_IRQ_STAT 0x%x\n", tmp);
+               if (tmp)
+                       writel(tmp, port_mmio + PORT_IRQ_STAT);
+
+               writel(1 << i, mmio + HOST_IRQ_STAT);
+       }
+
+       tmp = readl(mmio + HOST_CTL);
+       VPRINTK("HOST_CTL 0x%x\n", tmp);
+       writel(tmp | HOST_IRQ_EN, mmio + HOST_CTL);
+       tmp = readl(mmio + HOST_CTL);
+       VPRINTK("HOST_CTL 0x%x\n", tmp);
 }
 
 static unsigned int ahci_dev_classify(struct ata_port *ap)
@@ -576,7 +709,7 @@ static void ahci_fill_cmd_slot(struct ahci_port_priv *pp, unsigned int tag,
 static int ahci_clo(struct ata_port *ap)
 {
        void __iomem *port_mmio = (void __iomem *) ap->ioaddr.cmd_addr;
-       struct ahci_host_priv *hpriv = ap->host_set->private_data;
+       struct ahci_host_priv *hpriv = ap->host->private_data;
        u32 tmp;
 
        if (!(hpriv->cap & HOST_CAP_CLO))
@@ -608,7 +741,7 @@ static int ahci_prereset(struct ata_port *ap)
 static int ahci_softreset(struct ata_port *ap, unsigned int *class)
 {
        struct ahci_port_priv *pp = ap->private_data;
-       void __iomem *mmio = ap->host_set->mmio_base;
+       void __iomem *mmio = ap->host->mmio_base;
        void __iomem *port_mmio = ahci_port_base(mmio, ap->port_no);
        const u32 cmd_fis_len = 5; /* five dwords */
        const char *reason = NULL;
@@ -626,7 +759,7 @@ static int ahci_softreset(struct ata_port *ap, unsigned int *class)
        }
 
        /* prepare for SRST (AHCI-1.1 10.4.1) */
-       rc = ahci_stop_engine(ap);
+       rc = ahci_stop_engine(port_mmio);
        if (rc) {
                reason = "failed to stop engine";
                goto fail_restart;
@@ -647,7 +780,7 @@ static int ahci_softreset(struct ata_port *ap, unsigned int *class)
        }
 
        /* restart engine */
-       ahci_start_engine(ap);
+       ahci_start_engine(port_mmio);
 
        ata_tf_init(ap->device, &tf);
        fis = pp->cmd_tbl;
@@ -706,7 +839,7 @@ static int ahci_softreset(struct ata_port *ap, unsigned int *class)
        return 0;
 
  fail_restart:
-       ahci_start_engine(ap);
+       ahci_start_engine(port_mmio);
  fail:
        ata_port_printk(ap, KERN_ERR, "softreset failed (%s)\n", reason);
        return rc;
@@ -717,11 +850,13 @@ static int ahci_hardreset(struct ata_port *ap, unsigned int *class)
        struct ahci_port_priv *pp = ap->private_data;
        u8 *d2h_fis = pp->rx_fis + RX_FIS_D2H_REG;
        struct ata_taskfile tf;
+       void __iomem *mmio = ap->host->mmio_base;
+       void __iomem *port_mmio = ahci_port_base(mmio, ap->port_no);
        int rc;
 
        DPRINTK("ENTER\n");
 
-       ahci_stop_engine(ap);
+       ahci_stop_engine(port_mmio);
 
        /* clear D2H reception area to properly wait for D2H FIS */
        ata_tf_init(ap->device, &tf);
@@ -730,7 +865,7 @@ static int ahci_hardreset(struct ata_port *ap, unsigned int *class)
 
        rc = sata_std_hardreset(ap, class);
 
-       ahci_start_engine(ap);
+       ahci_start_engine(port_mmio);
 
        if (rc == 0 && ata_port_online(ap))
                *class = ahci_dev_classify(ap);
@@ -904,7 +1039,7 @@ static void ahci_error_intr(struct ata_port *ap, u32 irq_stat)
 
 static void ahci_host_intr(struct ata_port *ap)
 {
-       void __iomem *mmio = ap->host_set->mmio_base;
+       void __iomem *mmio = ap->host->mmio_base;
        void __iomem *port_mmio = ahci_port_base(mmio, ap->port_no);
        struct ata_eh_info *ehi = &ap->eh_info;
        u32 status, qc_active;
@@ -956,7 +1091,7 @@ static void ahci_irq_clear(struct ata_port *ap)
 
 static irqreturn_t ahci_interrupt(int irq, void *dev_instance, struct pt_regs *regs)
 {
-       struct ata_host_set *host_set = dev_instance;
+       struct ata_host *host = dev_instance;
        struct ahci_host_priv *hpriv;
        unsigned int i, handled = 0;
        void __iomem *mmio;
@@ -964,8 +1099,8 @@ static irqreturn_t ahci_interrupt(int irq, void *dev_instance, struct pt_regs *r
 
        VPRINTK("ENTER\n");
 
-       hpriv = host_set->private_data;
-       mmio = host_set->mmio_base;
+       hpriv = host->private_data;
+       mmio = host->mmio_base;
 
        /* sigh.  0xffffffff is a valid return from h/w */
        irq_stat = readl(mmio + HOST_IRQ_STAT);
@@ -973,22 +1108,22 @@ static irqreturn_t ahci_interrupt(int irq, void *dev_instance, struct pt_regs *r
        if (!irq_stat)
                return IRQ_NONE;
 
-        spin_lock(&host_set->lock);
+        spin_lock(&host->lock);
 
-        for (i = 0; i < host_set->n_ports; i++) {
+        for (i = 0; i < host->n_ports; i++) {
                struct ata_port *ap;
 
                if (!(irq_stat & (1 << i)))
                        continue;
 
-               ap = host_set->ports[i];
+               ap = host->ports[i];
                if (ap) {
                        ahci_host_intr(ap);
                        VPRINTK("port %u\n", i);
                } else {
                        VPRINTK("port %u (no irq)\n", i);
                        if (ata_ratelimit())
-                               dev_printk(KERN_WARNING, host_set->dev,
+                               dev_printk(KERN_WARNING, host->dev,
                                        "interrupt on disabled port %u\n", i);
                }
 
@@ -1000,7 +1135,7 @@ static irqreturn_t ahci_interrupt(int irq, void *dev_instance, struct pt_regs *r
                handled = 1;
        }
 
-       spin_unlock(&host_set->lock);
+       spin_unlock(&host->lock);
 
        VPRINTK("EXIT\n");
 
@@ -1022,7 +1157,7 @@ static unsigned int ahci_qc_issue(struct ata_queued_cmd *qc)
 
 static void ahci_freeze(struct ata_port *ap)
 {
-       void __iomem *mmio = ap->host_set->mmio_base;
+       void __iomem *mmio = ap->host->mmio_base;
        void __iomem *port_mmio = ahci_port_base(mmio, ap->port_no);
 
        /* turn IRQ off */
@@ -1031,7 +1166,7 @@ static void ahci_freeze(struct ata_port *ap)
 
 static void ahci_thaw(struct ata_port *ap)
 {
-       void __iomem *mmio = ap->host_set->mmio_base;
+       void __iomem *mmio = ap->host->mmio_base;
        void __iomem *port_mmio = ahci_port_base(mmio, ap->port_no);
        u32 tmp;
 
@@ -1046,10 +1181,13 @@ static void ahci_thaw(struct ata_port *ap)
 
 static void ahci_error_handler(struct ata_port *ap)
 {
+       void __iomem *mmio = ap->host->mmio_base;
+       void __iomem *port_mmio = ahci_port_base(mmio, ap->port_no);
+
        if (!(ap->pflags & ATA_PFLAG_FROZEN)) {
                /* restart engine */
-               ahci_stop_engine(ap);
-               ahci_start_engine(ap);
+               ahci_stop_engine(port_mmio);
+               ahci_start_engine(port_mmio);
        }
 
        /* perform recovery */
@@ -1060,15 +1198,176 @@ static void ahci_error_handler(struct ata_port *ap)
 static void ahci_post_internal_cmd(struct ata_queued_cmd *qc)
 {
        struct ata_port *ap = qc->ap;
+       void __iomem *mmio = ap->host->mmio_base;
+       void __iomem *port_mmio = ahci_port_base(mmio, ap->port_no);
 
        if (qc->flags & ATA_QCFLAG_FAILED)
                qc->err_mask |= AC_ERR_OTHER;
 
        if (qc->err_mask) {
                /* make DMA engine forget about the failed command */
-               ahci_stop_engine(ap);
-               ahci_start_engine(ap);
+               ahci_stop_engine(port_mmio);
+               ahci_start_engine(port_mmio);
+       }
+}
+
+static int ahci_port_suspend(struct ata_port *ap, pm_message_t mesg)
+{
+       struct ahci_host_priv *hpriv = ap->host->private_data;
+       struct ahci_port_priv *pp = ap->private_data;
+       void __iomem *mmio = ap->host->mmio_base;
+       void __iomem *port_mmio = ahci_port_base(mmio, ap->port_no);
+       const char *emsg = NULL;
+       int rc;
+
+       rc = ahci_deinit_port(port_mmio, hpriv->cap, &emsg);
+       if (rc) {
+               ata_port_printk(ap, KERN_ERR, "%s (%d)\n", emsg, rc);
+               ahci_init_port(port_mmio, hpriv->cap,
+                              pp->cmd_slot_dma, pp->rx_fis_dma);
+       }
+
+       return rc;
+}
+
+static int ahci_port_resume(struct ata_port *ap)
+{
+       struct ahci_port_priv *pp = ap->private_data;
+       struct ahci_host_priv *hpriv = ap->host->private_data;
+       void __iomem *mmio = ap->host->mmio_base;
+       void __iomem *port_mmio = ahci_port_base(mmio, ap->port_no);
+
+       ahci_init_port(port_mmio, hpriv->cap, pp->cmd_slot_dma, pp->rx_fis_dma);
+
+       return 0;
+}
+
+static int ahci_pci_device_suspend(struct pci_dev *pdev, pm_message_t mesg)
+{
+       struct ata_host *host = dev_get_drvdata(&pdev->dev);
+       void __iomem *mmio = host->mmio_base;
+       u32 ctl;
+
+       if (mesg.event == PM_EVENT_SUSPEND) {
+               /* AHCI spec rev1.1 section 8.3.3:
+                * Software must disable interrupts prior to requesting a
+                * transition of the HBA to D3 state.
+                */
+               ctl = readl(mmio + HOST_CTL);
+               ctl &= ~HOST_IRQ_EN;
+               writel(ctl, mmio + HOST_CTL);
+               readl(mmio + HOST_CTL); /* flush */
+       }
+
+       return ata_pci_device_suspend(pdev, mesg);
+}
+
+static int ahci_pci_device_resume(struct pci_dev *pdev)
+{
+       struct ata_host *host = dev_get_drvdata(&pdev->dev);
+       struct ahci_host_priv *hpriv = host->private_data;
+       void __iomem *mmio = host->mmio_base;
+       int rc;
+
+       ata_pci_device_do_resume(pdev);
+
+       if (pdev->dev.power.power_state.event == PM_EVENT_SUSPEND) {
+               rc = ahci_reset_controller(mmio, pdev);
+               if (rc)
+                       return rc;
+
+               ahci_init_controller(mmio, pdev, host->n_ports, hpriv->cap);
        }
+
+       ata_host_resume(host);
+
+       return 0;
+}
+
+static int ahci_port_start(struct ata_port *ap)
+{
+       struct device *dev = ap->host->dev;
+       struct ahci_host_priv *hpriv = ap->host->private_data;
+       struct ahci_port_priv *pp;
+       void __iomem *mmio = ap->host->mmio_base;
+       void __iomem *port_mmio = ahci_port_base(mmio, ap->port_no);
+       void *mem;
+       dma_addr_t mem_dma;
+       int rc;
+
+       pp = kmalloc(sizeof(*pp), GFP_KERNEL);
+       if (!pp)
+               return -ENOMEM;
+       memset(pp, 0, sizeof(*pp));
+
+       rc = ata_pad_alloc(ap, dev);
+       if (rc) {
+               kfree(pp);
+               return rc;
+       }
+
+       mem = dma_alloc_coherent(dev, AHCI_PORT_PRIV_DMA_SZ, &mem_dma, GFP_KERNEL);
+       if (!mem) {
+               ata_pad_free(ap, dev);
+               kfree(pp);
+               return -ENOMEM;
+       }
+       memset(mem, 0, AHCI_PORT_PRIV_DMA_SZ);
+
+       /*
+        * First item in chunk of DMA memory: 32-slot command table,
+        * 32 bytes each in size
+        */
+       pp->cmd_slot = mem;
+       pp->cmd_slot_dma = mem_dma;
+
+       mem += AHCI_CMD_SLOT_SZ;
+       mem_dma += AHCI_CMD_SLOT_SZ;
+
+       /*
+        * Second item: Received-FIS area
+        */
+       pp->rx_fis = mem;
+       pp->rx_fis_dma = mem_dma;
+
+       mem += AHCI_RX_FIS_SZ;
+       mem_dma += AHCI_RX_FIS_SZ;
+
+       /*
+        * Third item: data area for storing a single command
+        * and its scatter-gather table
+        */
+       pp->cmd_tbl = mem;
+       pp->cmd_tbl_dma = mem_dma;
+
+       ap->private_data = pp;
+
+       /* initialize port */
+       ahci_init_port(port_mmio, hpriv->cap, pp->cmd_slot_dma, pp->rx_fis_dma);
+
+       return 0;
+}
+
+static void ahci_port_stop(struct ata_port *ap)
+{
+       struct device *dev = ap->host->dev;
+       struct ahci_host_priv *hpriv = ap->host->private_data;
+       struct ahci_port_priv *pp = ap->private_data;
+       void __iomem *mmio = ap->host->mmio_base;
+       void __iomem *port_mmio = ahci_port_base(mmio, ap->port_no);
+       const char *emsg = NULL;
+       int rc;
+
+       /* de-initialize port */
+       rc = ahci_deinit_port(port_mmio, hpriv->cap, &emsg);
+       if (rc)
+               ata_port_printk(ap, KERN_WARNING, "%s (%d)\n", emsg, rc);
+
+       ap->private_data = NULL;
+       dma_free_coherent(dev, AHCI_PORT_PRIV_DMA_SZ,
+                         pp->cmd_slot, pp->cmd_slot_dma);
+       ata_pad_free(ap, dev);
+       kfree(pp);
 }
 
 static void ahci_setup_port(struct ata_ioports *port, unsigned long base,
@@ -1089,47 +1388,12 @@ static int ahci_host_init(struct ata_probe_ent *probe_ent)
        struct ahci_host_priv *hpriv = probe_ent->private_data;
        struct pci_dev *pdev = to_pci_dev(probe_ent->dev);
        void __iomem *mmio = probe_ent->mmio_base;
-       u32 tmp, cap_save;
-       unsigned int i, j, using_dac;
+       unsigned int i, using_dac;
        int rc;
-       void __iomem *port_mmio;
-
-       cap_save = readl(mmio + HOST_CAP);
-       cap_save &= ( (1<<28) | (1<<17) );
-       cap_save |= (1 << 27);
 
-       /* global controller reset */
-       tmp = readl(mmio + HOST_CTL);
-       if ((tmp & HOST_RESET) == 0) {
-               writel(tmp | HOST_RESET, mmio + HOST_CTL);
-               readl(mmio + HOST_CTL); /* flush */
-       }
-
-       /* reset must complete within 1 second, or
-        * the hardware should be considered fried.
-        */
-       ssleep(1);
-
-       tmp = readl(mmio + HOST_CTL);
-       if (tmp & HOST_RESET) {
-               dev_printk(KERN_ERR, &pdev->dev,
-                          "controller reset failed (0x%x)\n", tmp);
-               return -EIO;
-       }
-
-       writel(HOST_AHCI_EN, mmio + HOST_CTL);
-       (void) readl(mmio + HOST_CTL);  /* flush */
-       writel(cap_save, mmio + HOST_CAP);
-       writel(0xf, mmio + HOST_PORTS_IMPL);
-       (void) readl(mmio + HOST_PORTS_IMPL);   /* flush */
-
-       if (pdev->vendor == PCI_VENDOR_ID_INTEL) {
-               u16 tmp16;
-
-               pci_read_config_word(pdev, 0x92, &tmp16);
-               tmp16 |= 0xf;
-               pci_write_config_word(pdev, 0x92, tmp16);
-       }
+       rc = ahci_reset_controller(mmio, pdev);
+       if (rc)
+               return rc;
 
        hpriv->cap = readl(mmio + HOST_CAP);
        hpriv->port_map = readl(mmio + HOST_PORTS_IMPL);
@@ -1165,63 +1429,10 @@ static int ahci_host_init(struct ata_probe_ent *probe_ent)
                }
        }
 
-       for (i = 0; i < probe_ent->n_ports; i++) {
-#if 0 /* BIOSen initialize this incorrectly */
-               if (!(hpriv->port_map & (1 << i)))
-                       continue;
-#endif
-
-               port_mmio = ahci_port_base(mmio, i);
-               VPRINTK("mmio %p  port_mmio %p\n", mmio, port_mmio);
-
-               ahci_setup_port(&probe_ent->port[i],
-                               (unsigned long) mmio, i);
+       for (i = 0; i < probe_ent->n_ports; i++)
+               ahci_setup_port(&probe_ent->port[i], (unsigned long) mmio, i);
 
-               /* make sure port is not active */
-               tmp = readl(port_mmio + PORT_CMD);
-               VPRINTK("PORT_CMD 0x%x\n", tmp);
-               if (tmp & (PORT_CMD_LIST_ON | PORT_CMD_FIS_ON |
-                          PORT_CMD_FIS_RX | PORT_CMD_START)) {
-                       tmp &= ~(PORT_CMD_LIST_ON | PORT_CMD_FIS_ON |
-                                PORT_CMD_FIS_RX | PORT_CMD_START);
-                       writel(tmp, port_mmio + PORT_CMD);
-                       readl(port_mmio + PORT_CMD); /* flush */
-
-                       /* spec says 500 msecs for each bit, so
-                        * this is slightly incorrect.
-                        */
-                       msleep(500);
-               }
-
-               writel(PORT_CMD_SPIN_UP, port_mmio + PORT_CMD);
-
-               j = 0;
-               while (j < 100) {
-                       msleep(10);
-                       tmp = readl(port_mmio + PORT_SCR_STAT);
-                       if ((tmp & 0xf) == 0x3)
-                               break;
-                       j++;
-               }
-
-               tmp = readl(port_mmio + PORT_SCR_ERR);
-               VPRINTK("PORT_SCR_ERR 0x%x\n", tmp);
-               writel(tmp, port_mmio + PORT_SCR_ERR);
-
-               /* ack any pending irq events for this port */
-               tmp = readl(port_mmio + PORT_IRQ_STAT);
-               VPRINTK("PORT_IRQ_STAT 0x%x\n", tmp);
-               if (tmp)
-                       writel(tmp, port_mmio + PORT_IRQ_STAT);
-
-               writel(1 << i, mmio + HOST_IRQ_STAT);
-       }
-
-       tmp = readl(mmio + HOST_CTL);
-       VPRINTK("HOST_CTL 0x%x\n", tmp);
-       writel(tmp | HOST_IRQ_EN, mmio + HOST_CTL);
-       tmp = readl(mmio + HOST_CTL);
-       VPRINTK("HOST_CTL 0x%x\n", tmp);
+       ahci_init_controller(mmio, pdev, probe_ent->n_ports, hpriv->cap);
 
        pci_set_master(pdev);
 
@@ -1370,7 +1581,7 @@ static int ahci_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
        memset(hpriv, 0, sizeof(*hpriv));
 
        probe_ent->sht          = ahci_port_info[board_idx].sht;
-       probe_ent->host_flags   = ahci_port_info[board_idx].host_flags;
+       probe_ent->port_flags   = ahci_port_info[board_idx].flags;
        probe_ent->pio_mask     = ahci_port_info[board_idx].pio_mask;
        probe_ent->udma_mask    = ahci_port_info[board_idx].udma_mask;
        probe_ent->port_ops     = ahci_port_info[board_idx].port_ops;
@@ -1388,9 +1599,9 @@ static int ahci_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
        if (rc)
                goto err_out_hpriv;
 
-       if (!(probe_ent->host_flags & AHCI_FLAG_NO_NCQ) &&
+       if (!(probe_ent->port_flags & AHCI_FLAG_NO_NCQ) &&
            (hpriv->cap & HOST_CAP_NCQ))
-               probe_ent->host_flags |= ATA_FLAG_NCQ;
+               probe_ent->port_flags |= ATA_FLAG_NCQ;
 
        ahci_print_info(probe_ent);
 
@@ -1421,27 +1632,27 @@ err_out:
 static void ahci_remove_one (struct pci_dev *pdev)
 {
        struct device *dev = pci_dev_to_dev(pdev);
-       struct ata_host_set *host_set = dev_get_drvdata(dev);
-       struct ahci_host_priv *hpriv = host_set->private_data;
+       struct ata_host *host = dev_get_drvdata(dev);
+       struct ahci_host_priv *hpriv = host->private_data;
        unsigned int i;
        int have_msi;
 
-       for (i = 0; i < host_set->n_ports; i++)
-               ata_port_detach(host_set->ports[i]);
+       for (i = 0; i < host->n_ports; i++)
+               ata_port_detach(host->ports[i]);
 
        have_msi = hpriv->flags & AHCI_FLAG_MSI;
-       free_irq(host_set->irq, host_set);
+       free_irq(host->irq, host);
 
-       for (i = 0; i < host_set->n_ports; i++) {
-               struct ata_port *ap = host_set->ports[i];
+       for (i = 0; i < host->n_ports; i++) {
+               struct ata_port *ap = host->ports[i];
 
-               ata_scsi_release(ap->host);
-               scsi_host_put(ap->host);
+               ata_scsi_release(ap->scsi_host);
+               scsi_host_put(ap->scsi_host);
        }
 
        kfree(hpriv);
-       pci_iounmap(pdev, host_set->mmio_base);
-       kfree(host_set);
+       pci_iounmap(pdev, host->mmio_base);
+       kfree(host);
 
        if (have_msi)
                pci_disable_msi(pdev);
@@ -1454,7 +1665,7 @@ static void ahci_remove_one (struct pci_dev *pdev)
 
 static int __init ahci_init(void)
 {
-       return pci_module_init(&ahci_pci_driver);
+       return pci_register_driver(&ahci_pci_driver);
 }
 
 static void __exit ahci_exit(void)
similarity index 93%
rename from drivers/scsi/ata_piix.c
rename to drivers/ata/ata_piix.c
index 2d20caf377f565a041263a85052e01bd95ade153..22b2dba90b9a34ff0c2add8af4100b6ccef64b8e 100644 (file)
@@ -151,7 +151,7 @@ struct piix_host_priv {
 
 static int piix_init_one (struct pci_dev *pdev,
                                    const struct pci_device_id *ent);
-static void piix_host_stop(struct ata_host_set *host_set);
+static void piix_host_stop(struct ata_host *host);
 static void piix_set_piomode (struct ata_port *ap, struct ata_device *adev);
 static void piix_set_dmamode (struct ata_port *ap, struct ata_device *adev);
 static void piix_pata_error_handler(struct ata_port *ap);
@@ -362,7 +362,7 @@ static struct ata_port_info piix_port_info[] = {
        /* piix4_pata */
        {
                .sht            = &piix_sht,
-               .host_flags     = ATA_FLAG_SLAVE_POSS,
+               .flags          = ATA_FLAG_SLAVE_POSS,
                .pio_mask       = 0x1f, /* pio0-4 */
 #if 0
                .mwdma_mask     = 0x06, /* mwdma1-2 */
@@ -376,7 +376,7 @@ static struct ata_port_info piix_port_info[] = {
        /* ich5_pata */
        {
                .sht            = &piix_sht,
-               .host_flags     = ATA_FLAG_SLAVE_POSS | PIIX_FLAG_CHECKINTR,
+               .flags          = ATA_FLAG_SLAVE_POSS | PIIX_FLAG_CHECKINTR,
                .pio_mask       = 0x1f, /* pio0-4 */
 #if 0
                .mwdma_mask     = 0x06, /* mwdma1-2 */
@@ -390,7 +390,7 @@ static struct ata_port_info piix_port_info[] = {
        /* ich5_sata */
        {
                .sht            = &piix_sht,
-               .host_flags     = ATA_FLAG_SATA | PIIX_FLAG_CHECKINTR |
+               .flags          = ATA_FLAG_SATA | PIIX_FLAG_CHECKINTR |
                                  PIIX_FLAG_IGNORE_PCS,
                .pio_mask       = 0x1f, /* pio0-4 */
                .mwdma_mask     = 0x07, /* mwdma0-2 */
@@ -401,7 +401,7 @@ static struct ata_port_info piix_port_info[] = {
        /* i6300esb_sata */
        {
                .sht            = &piix_sht,
-               .host_flags     = ATA_FLAG_SATA |
+               .flags          = ATA_FLAG_SATA |
                                  PIIX_FLAG_CHECKINTR | PIIX_FLAG_IGNORE_PCS,
                .pio_mask       = 0x1f, /* pio0-4 */
                .mwdma_mask     = 0x07, /* mwdma0-2 */
@@ -412,7 +412,7 @@ static struct ata_port_info piix_port_info[] = {
        /* ich6_sata */
        {
                .sht            = &piix_sht,
-               .host_flags     = ATA_FLAG_SATA |
+               .flags          = ATA_FLAG_SATA |
                                  PIIX_FLAG_CHECKINTR | PIIX_FLAG_SCR,
                .pio_mask       = 0x1f, /* pio0-4 */
                .mwdma_mask     = 0x07, /* mwdma0-2 */
@@ -423,7 +423,7 @@ static struct ata_port_info piix_port_info[] = {
        /* ich6_sata_ahci */
        {
                .sht            = &piix_sht,
-               .host_flags     = ATA_FLAG_SATA |
+               .flags          = ATA_FLAG_SATA |
                                  PIIX_FLAG_CHECKINTR | PIIX_FLAG_SCR |
                                  PIIX_FLAG_AHCI,
                .pio_mask       = 0x1f, /* pio0-4 */
@@ -435,7 +435,7 @@ static struct ata_port_info piix_port_info[] = {
        /* ich6m_sata_ahci */
        {
                .sht            = &piix_sht,
-               .host_flags     = ATA_FLAG_SATA |
+               .flags          = ATA_FLAG_SATA |
                                  PIIX_FLAG_CHECKINTR | PIIX_FLAG_SCR |
                                  PIIX_FLAG_AHCI,
                .pio_mask       = 0x1f, /* pio0-4 */
@@ -447,7 +447,7 @@ static struct ata_port_info piix_port_info[] = {
        /* ich8_sata_ahci */
        {
                .sht            = &piix_sht,
-               .host_flags     = ATA_FLAG_SATA |
+               .flags          = ATA_FLAG_SATA |
                                  PIIX_FLAG_CHECKINTR | PIIX_FLAG_SCR |
                                  PIIX_FLAG_AHCI,
                .pio_mask       = 0x1f, /* pio0-4 */
@@ -485,7 +485,7 @@ MODULE_PARM_DESC(force_pcs, "force honoring or ignoring PCS to work around "
  */
 static void piix_pata_cbl_detect(struct ata_port *ap)
 {
-       struct pci_dev *pdev = to_pci_dev(ap->host_set->dev);
+       struct pci_dev *pdev = to_pci_dev(ap->host->dev);
        u8 tmp, mask;
 
        /* no 80c support in host controller? */
@@ -493,7 +493,7 @@ static void piix_pata_cbl_detect(struct ata_port *ap)
                goto cbl40;
 
        /* check BIOS cable detect results */
-       mask = ap->hard_port_no == 0 ? PIIX_80C_PRI : PIIX_80C_SEC;
+       mask = ap->port_no == 0 ? PIIX_80C_PRI : PIIX_80C_SEC;
        pci_read_config_byte(pdev, PIIX_IOCFG, &tmp);
        if ((tmp & mask) == 0)
                goto cbl40;
@@ -517,9 +517,9 @@ cbl40:
  */
 static int piix_pata_prereset(struct ata_port *ap)
 {
-       struct pci_dev *pdev = to_pci_dev(ap->host_set->dev);
+       struct pci_dev *pdev = to_pci_dev(ap->host->dev);
 
-       if (!pci_test_config_bits(pdev, &piix_enable_bits[ap->hard_port_no])) {
+       if (!pci_test_config_bits(pdev, &piix_enable_bits[ap->port_no])) {
                ata_port_printk(ap, KERN_INFO, "port disabled. ignoring.\n");
                ap->eh_context.i.action &= ~ATA_EH_RESET_MASK;
                return 0;
@@ -551,10 +551,10 @@ static void piix_pata_error_handler(struct ata_port *ap)
  */
 static unsigned int piix_sata_present_mask(struct ata_port *ap)
 {
-       struct pci_dev *pdev = to_pci_dev(ap->host_set->dev);
-       struct piix_host_priv *hpriv = ap->host_set->private_data;
+       struct pci_dev *pdev = to_pci_dev(ap->host->dev);
+       struct piix_host_priv *hpriv = ap->host->private_data;
        const unsigned int *map = hpriv->map;
-       int base = 2 * ap->hard_port_no;
+       int base = 2 * ap->port_no;
        unsigned int present_mask = 0;
        int port, i;
        u16 pcs;
@@ -631,9 +631,9 @@ static void piix_sata_error_handler(struct ata_port *ap)
 static void piix_set_piomode (struct ata_port *ap, struct ata_device *adev)
 {
        unsigned int pio        = adev->pio_mode - XFER_PIO_0;
-       struct pci_dev *dev     = to_pci_dev(ap->host_set->dev);
+       struct pci_dev *dev     = to_pci_dev(ap->host->dev);
        unsigned int is_slave   = (adev->devno != 0);
-       unsigned int master_port= ap->hard_port_no ? 0x42 : 0x40;
+       unsigned int master_port= ap->port_no ? 0x42 : 0x40;
        unsigned int slave_port = 0x44;
        u16 master_data;
        u8 slave_data;
@@ -651,10 +651,10 @@ static void piix_set_piomode (struct ata_port *ap, struct ata_device *adev)
                /* enable PPE, IE and TIME */
                master_data |= 0x0070;
                pci_read_config_byte(dev, slave_port, &slave_data);
-               slave_data &= (ap->hard_port_no ? 0x0f : 0xf0);
+               slave_data &= (ap->port_no ? 0x0f : 0xf0);
                slave_data |=
                        (timings[pio][0] << 2) |
-                       (timings[pio][1] << (ap->hard_port_no ? 4 : 0));
+                       (timings[pio][1] << (ap->port_no ? 4 : 0));
        } else {
                master_data &= 0xccf8;
                /* enable PPE, IE and TIME */
@@ -683,10 +683,10 @@ static void piix_set_piomode (struct ata_port *ap, struct ata_device *adev)
 static void piix_set_dmamode (struct ata_port *ap, struct ata_device *adev)
 {
        unsigned int udma       = adev->dma_mode; /* FIXME: MWDMA too */
-       struct pci_dev *dev     = to_pci_dev(ap->host_set->dev);
-       u8 maslave              = ap->hard_port_no ? 0x42 : 0x40;
+       struct pci_dev *dev     = to_pci_dev(ap->host->dev);
+       u8 maslave              = ap->port_no ? 0x42 : 0x40;
        u8 speed                = udma;
-       unsigned int drive_dn   = (ap->hard_port_no ? 2 : 0) + adev->devno;
+       unsigned int drive_dn   = (ap->port_no ? 2 : 0) + adev->devno;
        int a_speed             = 3 << (drive_dn * 4);
        int u_flag              = 1 << drive_dn;
        int v_flag              = 0x01 << drive_dn;
@@ -835,13 +835,13 @@ static void __devinit piix_init_pcs(struct pci_dev *pdev,
        if (force_pcs == 1) {
                dev_printk(KERN_INFO, &pdev->dev,
                           "force ignoring PCS (0x%x)\n", new_pcs);
-               pinfo[0].host_flags |= PIIX_FLAG_IGNORE_PCS;
-               pinfo[1].host_flags |= PIIX_FLAG_IGNORE_PCS;
+               pinfo[0].flags |= PIIX_FLAG_IGNORE_PCS;
+               pinfo[1].flags |= PIIX_FLAG_IGNORE_PCS;
        } else if (force_pcs == 2) {
                dev_printk(KERN_INFO, &pdev->dev,
                           "force honoring PCS (0x%x)\n", new_pcs);
-               pinfo[0].host_flags &= ~PIIX_FLAG_IGNORE_PCS;
-               pinfo[1].host_flags &= ~PIIX_FLAG_IGNORE_PCS;
+               pinfo[0].flags &= ~PIIX_FLAG_IGNORE_PCS;
+               pinfo[1].flags &= ~PIIX_FLAG_IGNORE_PCS;
        }
 }
 
@@ -881,7 +881,7 @@ static void __devinit piix_init_sata_map(struct pci_dev *pdev,
                default:
                        printk(" P%d", map[i]);
                        if (i & 1)
-                               pinfo[i / 2].host_flags |= ATA_FLAG_SLAVE_POSS;
+                               pinfo[i / 2].flags |= ATA_FLAG_SLAVE_POSS;
                        break;
                }
        }
@@ -916,7 +916,7 @@ static int piix_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
        struct ata_port_info port_info[2];
        struct ata_port_info *ppinfo[2] = { &port_info[0], &port_info[1] };
        struct piix_host_priv *hpriv;
-       unsigned long host_flags;
+       unsigned long port_flags;
 
        if (!printed_version++)
                dev_printk(KERN_DEBUG, &pdev->dev,
@@ -935,9 +935,9 @@ static int piix_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
        port_info[0].private_data = hpriv;
        port_info[1].private_data = hpriv;
 
-       host_flags = port_info[0].host_flags;
+       port_flags = port_info[0].flags;
 
-       if (host_flags & PIIX_FLAG_AHCI) {
+       if (port_flags & PIIX_FLAG_AHCI) {
                u8 tmp;
                pci_read_config_byte(pdev, PIIX_SCC, &tmp);
                if (tmp == PIIX_AHCI_DEVICE) {
@@ -948,7 +948,7 @@ static int piix_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
        }
 
        /* Initialize SATA map */
-       if (host_flags & ATA_FLAG_SATA) {
+       if (port_flags & ATA_FLAG_SATA) {
                piix_init_sata_map(pdev, port_info,
                                   piix_map_db_table[ent->driver_data]);
                piix_init_pcs(pdev, port_info,
@@ -961,7 +961,7 @@ static int piix_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
         * MSI is disabled (and it is disabled, as we don't use
         * message-signalled interrupts currently).
         */
-       if (host_flags & PIIX_FLAG_CHECKINTR)
+       if (port_flags & PIIX_FLAG_CHECKINTR)
                pci_intx(pdev, 1);
 
        if (piix_check_450nx_errata(pdev)) {
@@ -976,19 +976,21 @@ static int piix_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
        return ata_pci_init_one(pdev, ppinfo, 2);
 }
 
-static void piix_host_stop(struct ata_host_set *host_set)
+static void piix_host_stop(struct ata_host *host)
 {
-       if (host_set->next == NULL)
-               kfree(host_set->private_data);
-       ata_host_stop(host_set);
+       struct piix_host_priv *hpriv = host->private_data;
+
+       ata_host_stop(host);
+
+       kfree(hpriv);
 }
 
 static int __init piix_init(void)
 {
        int rc;
 
-       DPRINTK("pci_module_init\n");
-       rc = pci_module_init(&piix_pci_driver);
+       DPRINTK("pci_register_driver\n");
+       rc = pci_register_driver(&piix_pci_driver);
        if (rc)
                return rc;
 
similarity index 92%
rename from drivers/scsi/libata-core.c
rename to drivers/ata/libata-core.c
index 73dd6c8deedec5d6f6e0f846bdeedce44f76ff69..1c9315401f7ad561e7385b0dcf57bc70ac3cae1f 100644 (file)
@@ -50,7 +50,6 @@
 #include <linux/jiffies.h>
 #include <linux/scatterlist.h>
 #include <scsi/scsi.h>
-#include "scsi_priv.h"
 #include <scsi/scsi_cmnd.h>
 #include <scsi/scsi_host.h>
 #include <linux/libata.h>
@@ -387,9 +386,13 @@ static const char *ata_mode_string(unsigned int xfer_mask)
                "PIO2",
                "PIO3",
                "PIO4",
+               "PIO5",
+               "PIO6",
                "MWDMA0",
                "MWDMA1",
                "MWDMA2",
+               "MWDMA3",
+               "MWDMA4",
                "UDMA/16",
                "UDMA/25",
                "UDMA/33",
@@ -876,6 +879,23 @@ static unsigned int ata_id_xfermask(const u16 *id)
 
        mwdma_mask = id[ATA_ID_MWDMA_MODES] & 0x07;
 
+       if (ata_id_is_cfa(id)) {
+               /*
+                *      Process compact flash extended modes
+                */
+               int pio = id[163] & 0x7;
+               int dma = (id[163] >> 3) & 7;
+
+               if (pio)
+                       pio_mask |= (1 << 5);
+               if (pio > 1)
+                       pio_mask |= (1 << 6);
+               if (dma)
+                       mwdma_mask |= (1 << 3);
+               if (dma > 1)
+                       mwdma_mask |= (1 << 4);
+       }
+
        udma_mask = 0;
        if (id[ATA_ID_FIELD_VALID] & (1 << 2))
                udma_mask = id[ATA_ID_UDMA_MODES] & 0xff;
@@ -1315,7 +1335,7 @@ static void ata_dev_config_ncq(struct ata_device *dev,
        }
 
        if (ap->flags & ATA_FLAG_NCQ) {
-               hdepth = min(ap->host->can_queue, ATA_MAX_QUEUE - 1);
+               hdepth = min(ap->scsi_host->can_queue, ATA_MAX_QUEUE - 1);
                dev->flags |= ATA_DFLAG_NCQ;
        }
 
@@ -1329,12 +1349,13 @@ static void ata_set_port_max_cmd_len(struct ata_port *ap)
 {
        int i;
 
-       if (ap->host) {
-               ap->host->max_cmd_len = 0;
+       if (ap->scsi_host) {
+               unsigned int len = 0;
+
                for (i = 0; i < ATA_MAX_DEVICES; i++)
-                       ap->host->max_cmd_len = max_t(unsigned int,
-                                                     ap->host->max_cmd_len,
-                                                     ap->device[i].cdb_len);
+                       len = max(len, ap->device[i].cdb_len);
+
+               ap->scsi_host->max_cmd_len = len;
        }
 }
 
@@ -1357,6 +1378,7 @@ int ata_dev_configure(struct ata_device *dev, int print_info)
        struct ata_port *ap = dev->ap;
        const u16 *id = dev->id;
        unsigned int xfer_mask;
+       char revbuf[7];         /* XYZ-99\0 */
        int rc;
 
        if (!ata_dev_enabled(dev) && ata_msg_info(ap)) {
@@ -1400,6 +1422,15 @@ int ata_dev_configure(struct ata_device *dev, int print_info)
 
        /* ATA-specific feature tests */
        if (dev->class == ATA_DEV_ATA) {
+               if (ata_id_is_cfa(id)) {
+                       if (id[162] & 1) /* CPRM may make this media unusable */
+                               ata_dev_printk(dev, KERN_WARNING, "ata%u: device %u  supports DRM functions and may not be fully accessable.\n",
+                                       ap->id, dev->devno);
+                       snprintf(revbuf, 7, "CFA");
+               }
+               else
+                       snprintf(revbuf, 7, "ATA-%d",  ata_id_major_version(id));
+
                dev->n_sectors = ata_id_n_sectors(id);
 
                if (ata_id_has_lba(id)) {
@@ -1418,9 +1449,9 @@ int ata_dev_configure(struct ata_device *dev, int print_info)
 
                        /* print device info to dmesg */
                        if (ata_msg_drv(ap) && print_info)
-                               ata_dev_printk(dev, KERN_INFO, "ATA-%d, "
+                               ata_dev_printk(dev, KERN_INFO, "%s, "
                                        "max %s, %Lu sectors: %s %s\n",
-                                       ata_id_major_version(id),
+                                       revbuf,
                                        ata_mode_string(xfer_mask),
                                        (unsigned long long)dev->n_sectors,
                                        lba_desc, ncq_desc);
@@ -1441,9 +1472,9 @@ int ata_dev_configure(struct ata_device *dev, int print_info)
 
                        /* print device info to dmesg */
                        if (ata_msg_drv(ap) && print_info)
-                               ata_dev_printk(dev, KERN_INFO, "ATA-%d, "
+                               ata_dev_printk(dev, KERN_INFO, "%s, "
                                        "max %s, %Lu sectors: CHS %u/%u/%u\n",
-                                       ata_id_major_version(id),
+                                       revbuf,
                                        ata_mode_string(xfer_mask),
                                        (unsigned long long)dev->n_sectors,
                                        dev->cylinders, dev->heads,
@@ -1528,7 +1559,7 @@ err_out_nosup:
  *     Zero on success, negative errno otherwise.
  */
 
-static int ata_bus_probe(struct ata_port *ap)
+int ata_bus_probe(struct ata_port *ap)
 {
        unsigned int classes[ATA_MAX_DEVICES];
        int tries[ATA_MAX_DEVICES];
@@ -1632,7 +1663,7 @@ static int ata_bus_probe(struct ata_port *ap)
  *     Modify @ap data structure such that the system
  *     thinks that the entire port is enabled.
  *
- *     LOCKING: host_set lock, or some other form of
+ *     LOCKING: host lock, or some other form of
  *     serialization.
  */
 
@@ -1770,7 +1801,7 @@ struct ata_device *ata_dev_pair(struct ata_device *adev)
  *     never attempt to probe or communicate with devices
  *     on this port.
  *
- *     LOCKING: host_set lock, or some other form of
+ *     LOCKING: host lock, or some other form of
  *     serialization.
  */
 
@@ -1901,10 +1932,11 @@ int sata_set_spd(struct ata_port *ap)
  * drivers/ide/ide-timing.h and was originally written by Vojtech Pavlik
  */
 /*
- * PIO 0-5, MWDMA 0-2 and UDMA 0-6 timings (in nanoseconds).
+ * PIO 0-4, MWDMA 0-2 and UDMA 0-6 timings (in nanoseconds).
  * These were taken from ATA/ATAPI-6 standard, rev 0a, except
- * for PIO 5, which is a nonstandard extension and UDMA6, which
- * is currently supported only by Maxtor drives.
+ * for UDMA6, which is currently supported only by Maxtor drives.
+ *
+ * For PIO 5/6 MWDMA 3/4 see the CFA specification 3.0.
  */
 
 static const struct ata_timing ata_timing[] = {
@@ -1914,6 +1946,8 @@ static const struct ata_timing ata_timing[] = {
        { XFER_UDMA_4,     0,   0,   0,   0,   0,   0,   0,  30 },
        { XFER_UDMA_3,     0,   0,   0,   0,   0,   0,   0,  45 },
 
+       { XFER_MW_DMA_4,  25,   0,   0,   0,  55,  20,  80,   0 },
+       { XFER_MW_DMA_3,  25,   0,   0,   0,  65,  25, 100,   0 },
        { XFER_UDMA_2,     0,   0,   0,   0,   0,   0,   0,  60 },
        { XFER_UDMA_1,     0,   0,   0,   0,   0,   0,   0,  80 },
        { XFER_UDMA_0,     0,   0,   0,   0,   0,   0,   0, 120 },
@@ -1928,7 +1962,8 @@ static const struct ata_timing ata_timing[] = {
        { XFER_SW_DMA_1,  90,   0,   0,   0, 240, 240, 480,   0 },
        { XFER_SW_DMA_0, 120,   0,   0,   0, 480, 480, 960,   0 },
 
-/*     { XFER_PIO_5,     20,  50,  30, 100,  50,  30, 100,   0 }, */
+       { XFER_PIO_6,     10,  55,  20,  80,  55,  20,  80,   0 },
+       { XFER_PIO_5,     15,  65,  25, 100,  65,  25, 100,   0 },
        { XFER_PIO_4,     25,  70,  25, 120,  70,  25, 120,   0 },
        { XFER_PIO_3,     30,  80,  70, 180,  80,  70, 180,   0 },
 
@@ -2224,8 +2259,8 @@ int ata_set_mode(struct ata_port *ap, struct ata_device **r_failed_dev)
        /* 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;
+       if (used_dma && (ap->host->flags & ATA_HOST_SIMPLEX))
+               ap->host->simplex_claimed = 1;
 
        /* step5: chip specific finalisation */
        if (ap->ops->post_set_mode)
@@ -2247,7 +2282,7 @@ int ata_set_mode(struct ata_port *ap, struct ata_device **r_failed_dev)
  *     other threads.
  *
  *     LOCKING:
- *     spin_lock_irqsave(host_set lock)
+ *     spin_lock_irqsave(host lock)
  */
 
 static inline void ata_tf_to_host(struct ata_port *ap,
@@ -2411,7 +2446,7 @@ static unsigned int ata_bus_softreset(struct ata_port *ap,
  *
  *     LOCKING:
  *     PCI/etc. bus probe sem.
- *     Obtains host_set lock.
+ *     Obtains host lock.
  *
  *     SIDE EFFECTS:
  *     Sets ATA_FLAG_DISABLED if bus reset fails.
@@ -3040,20 +3075,16 @@ 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_device *dev)
 {
        struct ata_port *ap = dev->ap;
-       struct ata_host_set *hs = ap->host_set;
+       struct ata_host *host = ap->host;
        unsigned long xfer_mask;
-       int i;
 
+       /* controller modes available */
        xfer_mask = ata_pack_xfermask(ap->pio_mask,
                                      ap->mwdma_mask, ap->udma_mask);
 
@@ -3063,34 +3094,31 @@ static void ata_dev_xfermask(struct ata_device *dev)
        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_absent(d))
-                       continue;
-
-               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(dev->pio_mask,
+                                      dev->mwdma_mask, dev->udma_mask);
+       xfer_mask &= ata_id_xfermask(dev->id);
 
-               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);
+       /*
+        *      CFA Advanced TrueIDE timings are not allowed on a shared
+        *      cable
+        */
+       if (ata_dev_pair(dev)) {
+               /* No PIO5 or PIO6 */
+               xfer_mask &= ~(0x03 << (ATA_SHIFT_PIO + 5));
+               /* No MWDMA3 or MWDMA 4 */
+               xfer_mask &= ~(0x03 << (ATA_SHIFT_MWDMA + 3));
        }
 
-       if (ata_dma_blacklisted(dev))
+       if (ata_dma_blacklisted(dev)) {
+               xfer_mask &= ~(ATA_MASK_MWDMA | ATA_MASK_UDMA);
                ata_dev_printk(dev, KERN_WARNING,
                               "device is on DMA blacklist, disabling DMA\n");
+       }
 
-       if (hs->flags & ATA_HOST_SIMPLEX) {
-               if (hs->simplex_claimed)
-                       xfer_mask &= ~(ATA_MASK_MWDMA | ATA_MASK_UDMA);
+       if ((host->flags & ATA_HOST_SIMPLEX) && host->simplex_claimed) {
+               xfer_mask &= ~(ATA_MASK_MWDMA | ATA_MASK_UDMA);
+               ata_dev_printk(dev, KERN_WARNING, "simplex DMA is claimed by "
+                              "other device, disabling DMA\n");
        }
 
        if (ap->ops->mode_filter)
@@ -3180,7 +3208,7 @@ static unsigned int ata_dev_init_params(struct ata_device *dev,
  *     Unmap all mapped DMA memory associated with this command.
  *
  *     LOCKING:
- *     spin_lock_irqsave(host_set lock)
+ *     spin_lock_irqsave(host lock)
  */
 
 static void ata_sg_clean(struct ata_queued_cmd *qc)
@@ -3240,7 +3268,7 @@ static void ata_sg_clean(struct ata_queued_cmd *qc)
  *     associated with the current disk command.
  *
  *     LOCKING:
- *     spin_lock_irqsave(host_set lock)
+ *     spin_lock_irqsave(host lock)
  *
  */
 static void ata_fill_sg(struct ata_queued_cmd *qc)
@@ -3292,7 +3320,7 @@ static void ata_fill_sg(struct ata_queued_cmd *qc)
  *     supplied PACKET command.
  *
  *     LOCKING:
- *     spin_lock_irqsave(host_set lock)
+ *     spin_lock_irqsave(host lock)
  *
  *     RETURNS: 0 when ATAPI DMA can be used
  *               nonzero otherwise
@@ -3314,7 +3342,7 @@ int ata_check_atapi_dma(struct ata_queued_cmd *qc)
  *     Prepare ATA taskfile for submission.
  *
  *     LOCKING:
- *     spin_lock_irqsave(host_set lock)
+ *     spin_lock_irqsave(host lock)
  */
 void ata_qc_prep(struct ata_queued_cmd *qc)
 {
@@ -3336,7 +3364,7 @@ void ata_noop_qc_prep(struct ata_queued_cmd *qc) { }
  *     to point to a single memory buffer, @buf of byte length @buflen.
  *
  *     LOCKING:
- *     spin_lock_irqsave(host_set lock)
+ *     spin_lock_irqsave(host lock)
  */
 
 void ata_sg_init_one(struct ata_queued_cmd *qc, void *buf, unsigned int buflen)
@@ -3367,7 +3395,7 @@ void ata_sg_init_one(struct ata_queued_cmd *qc, void *buf, unsigned int buflen)
  *     elements.
  *
  *     LOCKING:
- *     spin_lock_irqsave(host_set lock)
+ *     spin_lock_irqsave(host lock)
  */
 
 void ata_sg_init(struct ata_queued_cmd *qc, struct scatterlist *sg,
@@ -3386,7 +3414,7 @@ void ata_sg_init(struct ata_queued_cmd *qc, struct scatterlist *sg,
  *     DMA-map the memory buffer associated with queued_cmd @qc.
  *
  *     LOCKING:
- *     spin_lock_irqsave(host_set lock)
+ *     spin_lock_irqsave(host lock)
  *
  *     RETURNS:
  *     Zero on success, negative on error.
@@ -3455,7 +3483,7 @@ skip_map:
  *     DMA-map the scatter-gather table associated with queued_cmd @qc.
  *
  *     LOCKING:
- *     spin_lock_irqsave(host_set lock)
+ *     spin_lock_irqsave(host lock)
  *
  *     RETURNS:
  *     Zero on success, negative on error.
@@ -3964,7 +3992,7 @@ static inline int ata_hsm_ok_in_wq(struct ata_port *ap, struct ata_queued_cmd *q
  *     Finish @qc which is running on standard HSM.
  *
  *     LOCKING:
- *     If @in_wq is zero, spin_lock_irqsave(host_set lock).
+ *     If @in_wq is zero, spin_lock_irqsave(host lock).
  *     Otherwise, none on entry and grabs host lock.
  */
 static void ata_hsm_qc_complete(struct ata_queued_cmd *qc, int in_wq)
@@ -3976,8 +4004,8 @@ static void ata_hsm_qc_complete(struct ata_queued_cmd *qc, int in_wq)
                if (in_wq) {
                        spin_lock_irqsave(ap->lock, flags);
 
-                       /* EH might have kicked in while host_set lock
-                        * is released.
+                       /* EH might have kicked in while host lock is
+                        * released.
                         */
                        qc = ata_qc_from_tag(ap, qc->tag);
                        if (qc) {
@@ -4342,7 +4370,7 @@ struct ata_queued_cmd *ata_qc_new_init(struct ata_device *dev)
  *     in case something prevents using it.
  *
  *     LOCKING:
- *     spin_lock_irqsave(host_set lock)
+ *     spin_lock_irqsave(host lock)
  */
 void ata_qc_free(struct ata_queued_cmd *qc)
 {
@@ -4395,7 +4423,7 @@ void __ata_qc_complete(struct ata_queued_cmd *qc)
  *     command has completed, with either an ok or not-ok status.
  *
  *     LOCKING:
- *     spin_lock_irqsave(host_set lock)
+ *     spin_lock_irqsave(host lock)
  */
 void ata_qc_complete(struct ata_queued_cmd *qc)
 {
@@ -4458,7 +4486,7 @@ void ata_qc_complete(struct ata_queued_cmd *qc)
  *     and commands are completed accordingly.
  *
  *     LOCKING:
- *     spin_lock_irqsave(host_set lock)
+ *     spin_lock_irqsave(host lock)
  *
  *     RETURNS:
  *     Number of completed commands on success, -errno otherwise.
@@ -4529,7 +4557,7 @@ static inline int ata_should_dma_map(struct ata_queued_cmd *qc)
  *     writing the taskfile to hardware, starting the command.
  *
  *     LOCKING:
- *     spin_lock_irqsave(host_set lock)
+ *     spin_lock_irqsave(host lock)
  */
 void ata_qc_issue(struct ata_queued_cmd *qc)
 {
@@ -4590,7 +4618,7 @@ err:
  *     May be used as the qc_issue() entry in ata_port_operations.
  *
  *     LOCKING:
- *     spin_lock_irqsave(host_set lock)
+ *     spin_lock_irqsave(host lock)
  *
  *     RETURNS:
  *     Zero on success, AC_ERR_* mask on failure
@@ -4719,7 +4747,7 @@ unsigned int ata_qc_issue_prot(struct ata_queued_cmd *qc)
  *     handled via polling with interrupts disabled (nIEN bit).
  *
  *     LOCKING:
- *     spin_lock_irqsave(host_set lock)
+ *     spin_lock_irqsave(host lock)
  *
  *     RETURNS:
  *     One if interrupt was handled, zero if not (shared irq).
@@ -4806,14 +4834,14 @@ idle_irq:
 /**
  *     ata_interrupt - Default ATA host interrupt handler
  *     @irq: irq line (unused)
- *     @dev_instance: pointer to our ata_host_set information structure
+ *     @dev_instance: pointer to our ata_host information structure
  *     @regs: unused
  *
  *     Default interrupt handler for PCI IDE devices.  Calls
  *     ata_host_intr() for each port that is not disabled.
  *
  *     LOCKING:
- *     Obtains host_set lock during operation.
+ *     Obtains host lock during operation.
  *
  *     RETURNS:
  *     IRQ_NONE or IRQ_HANDLED.
@@ -4821,18 +4849,18 @@ idle_irq:
 
 irqreturn_t ata_interrupt (int irq, void *dev_instance, struct pt_regs *regs)
 {
-       struct ata_host_set *host_set = dev_instance;
+       struct ata_host *host = dev_instance;
        unsigned int i;
        unsigned int handled = 0;
        unsigned long flags;
 
        /* TODO: make _irqsave conditional on x86 PCI IDE legacy mode */
-       spin_lock_irqsave(&host_set->lock, flags);
+       spin_lock_irqsave(&host->lock, flags);
 
-       for (i = 0; i < host_set->n_ports; i++) {
+       for (i = 0; i < host->n_ports; i++) {
                struct ata_port *ap;
 
-               ap = host_set->ports[i];
+               ap = host->ports[i];
                if (ap &&
                    !(ap->flags & ATA_FLAG_DISABLED)) {
                        struct ata_queued_cmd *qc;
@@ -4844,7 +4872,7 @@ irqreturn_t ata_interrupt (int irq, void *dev_instance, struct pt_regs *regs)
                }
        }
 
-       spin_unlock_irqrestore(&host_set->lock, flags);
+       spin_unlock_irqrestore(&host->lock, flags);
 
        return IRQ_RETVAL(handled);
 }
@@ -5009,15 +5037,15 @@ int ata_flush_cache(struct ata_device *dev)
        return 0;
 }
 
-static int ata_host_set_request_pm(struct ata_host_set *host_set,
-                                  pm_message_t mesg, unsigned int action,
-                                  unsigned int ehi_flags, int wait)
+static int ata_host_request_pm(struct ata_host *host, pm_message_t mesg,
+                              unsigned int action, unsigned int ehi_flags,
+                              int wait)
 {
        unsigned long flags;
        int i, rc;
 
-       for (i = 0; i < host_set->n_ports; i++) {
-               struct ata_port *ap = host_set->ports[i];
+       for (i = 0; i < host->n_ports; i++) {
+               struct ata_port *ap = host->ports[i];
 
                /* Previous resume operation might still be in
                 * progress.  Wait for PM_PENDING to clear.
@@ -5057,11 +5085,11 @@ static int ata_host_set_request_pm(struct ata_host_set *host_set,
 }
 
 /**
- *     ata_host_set_suspend - suspend host_set
- *     @host_set: host_set to suspend
+ *     ata_host_suspend - suspend host
+ *     @host: host to suspend
  *     @mesg: PM message
  *
- *     Suspend @host_set.  Actual operation is performed by EH.  This
+ *     Suspend @host.  Actual operation is performed by EH.  This
  *     function requests EH to perform PM operations and waits for EH
  *     to finish.
  *
@@ -5071,11 +5099,11 @@ static int ata_host_set_request_pm(struct ata_host_set *host_set,
  *     RETURNS:
  *     0 on success, -errno on failure.
  */
-int ata_host_set_suspend(struct ata_host_set *host_set, pm_message_t mesg)
+int ata_host_suspend(struct ata_host *host, pm_message_t mesg)
 {
        int i, j, rc;
 
-       rc = ata_host_set_request_pm(host_set, mesg, 0, ATA_EHI_QUIET, 1);
+       rc = ata_host_request_pm(host, mesg, 0, ATA_EHI_QUIET, 1);
        if (rc)
                goto fail;
 
@@ -5083,8 +5111,8 @@ int ata_host_set_suspend(struct ata_host_set *host_set, pm_message_t mesg)
         * This happens if hotplug occurs between completion of device
         * suspension and here.
         */
-       for (i = 0; i < host_set->n_ports; i++) {
-               struct ata_port *ap = host_set->ports[i];
+       for (i = 0; i < host->n_ports; i++) {
+               struct ata_port *ap = host->ports[i];
 
                for (j = 0; j < ATA_MAX_DEVICES; j++) {
                        struct ata_device *dev = &ap->device[j];
@@ -5099,30 +5127,30 @@ int ata_host_set_suspend(struct ata_host_set *host_set, pm_message_t mesg)
                }
        }
 
-       host_set->dev->power.power_state = mesg;
+       host->dev->power.power_state = mesg;
        return 0;
 
  fail:
-       ata_host_set_resume(host_set);
+       ata_host_resume(host);
        return rc;
 }
 
 /**
- *     ata_host_set_resume - resume host_set
- *     @host_set: host_set to resume
+ *     ata_host_resume - resume host
+ *     @host: host to resume
  *
- *     Resume @host_set.  Actual operation is performed by EH.  This
+ *     Resume @host.  Actual operation is performed by EH.  This
  *     function requests EH to perform PM operations and returns.
  *     Note that all resume operations are performed parallely.
  *
  *     LOCKING:
  *     Kernel thread context (may sleep).
  */
-void ata_host_set_resume(struct ata_host_set *host_set)
+void ata_host_resume(struct ata_host *host)
 {
-       ata_host_set_request_pm(host_set, PMSG_ON, ATA_EH_SOFTRESET,
-                               ATA_EHI_NO_AUTOPSY | ATA_EHI_QUIET, 0);
-       host_set->dev->power.power_state = PMSG_ON;
+       ata_host_request_pm(host, PMSG_ON, ATA_EH_SOFTRESET,
+                           ATA_EHI_NO_AUTOPSY | ATA_EHI_QUIET, 0);
+       host->dev->power.power_state = PMSG_ON;
 }
 
 /**
@@ -5179,10 +5207,10 @@ void ata_port_stop (struct ata_port *ap)
        ata_pad_free(ap, dev);
 }
 
-void ata_host_stop (struct ata_host_set *host_set)
+void ata_host_stop (struct ata_host *host)
 {
-       if (host_set->mmio_base)
-               iounmap(host_set->mmio_base);
+       if (host->mmio_base)
+               iounmap(host->mmio_base);
 }
 
 /**
@@ -5204,7 +5232,7 @@ void ata_dev_init(struct ata_device *dev)
 
        /* High bits of dev->flags are used to record warm plug
         * requests which occur asynchronously.  Synchronize using
-        * host_set lock.
+        * host lock.
         */
        spin_lock_irqsave(ap->lock, flags);
        dev->flags &= ~ATA_DFLAG_INIT_MASK;
@@ -5218,45 +5246,33 @@ void ata_dev_init(struct ata_device *dev)
 }
 
 /**
- *     ata_host_init - Initialize an ata_port structure
+ *     ata_port_init - Initialize an ata_port structure
  *     @ap: Structure to initialize
- *     @host: associated SCSI mid-layer structure
- *     @host_set: Collection of hosts to which @ap belongs
+ *     @host: Collection of hosts to which @ap belongs
  *     @ent: Probe information provided by low-level driver
  *     @port_no: Port number associated with this ata_port
  *
- *     Initialize a new ata_port structure, and its associated
- *     scsi_host.
+ *     Initialize a new ata_port structure.
  *
  *     LOCKING:
  *     Inherited from caller.
  */
-static void ata_host_init(struct ata_port *ap, struct Scsi_Host *host,
-                         struct ata_host_set *host_set,
-                         const struct ata_probe_ent *ent, unsigned int port_no)
+void ata_port_init(struct ata_port *ap, struct ata_host *host,
+                  const struct ata_probe_ent *ent, unsigned int port_no)
 {
        unsigned int i;
 
-       host->max_id = 16;
-       host->max_lun = 1;
-       host->max_channel = 1;
-       host->unique_id = ata_unique_id++;
-       host->max_cmd_len = 12;
-
-       ap->lock = &host_set->lock;
+       ap->lock = &host->lock;
        ap->flags = ATA_FLAG_DISABLED;
-       ap->id = host->unique_id;
-       ap->host = host;
+       ap->id = ata_unique_id++;
        ap->ctl = ATA_DEVCTL_OBS;
-       ap->host_set = host_set;
+       ap->host = host;
        ap->dev = ent->dev;
        ap->port_no = port_no;
-       ap->hard_port_no =
-               ent->legacy_mode ? ent->hard_port_no : port_no;
        ap->pio_mask = ent->pio_mask;
        ap->mwdma_mask = ent->mwdma_mask;
        ap->udma_mask = ent->udma_mask;
-       ap->flags |= ent->host_flags;
+       ap->flags |= ent->port_flags;
        ap->ops = ent->port_ops;
        ap->hw_sata_spd_limit = UINT_MAX;
        ap->active_tag = ATA_TAG_POISON;
@@ -5298,9 +5314,30 @@ static void ata_host_init(struct ata_port *ap, struct Scsi_Host *host,
 }
 
 /**
- *     ata_host_add - Attach low-level ATA driver to system
+ *     ata_port_init_shost - Initialize SCSI host associated with ATA port
+ *     @ap: ATA port to initialize SCSI host for
+ *     @shost: SCSI host associated with @ap
+ *
+ *     Initialize SCSI host @shost associated with ATA port @ap.
+ *
+ *     LOCKING:
+ *     Inherited from caller.
+ */
+static void ata_port_init_shost(struct ata_port *ap, struct Scsi_Host *shost)
+{
+       ap->scsi_host = shost;
+
+       shost->unique_id = ap->id;
+       shost->max_id = 16;
+       shost->max_lun = 1;
+       shost->max_channel = 1;
+       shost->max_cmd_len = 12;
+}
+
+/**
+ *     ata_port_add - Attach low-level ATA driver to system
  *     @ent: Information provided by low-level driver
- *     @host_set: Collections of ports to which we add
+ *     @host: Collections of ports to which we add
  *     @port_no: Port number associated with this host
  *
  *     Attach low-level ATA driver to system.
@@ -5311,43 +5348,55 @@ static void ata_host_init(struct ata_port *ap, struct Scsi_Host *host,
  *     RETURNS:
  *     New ata_port on success, for NULL on error.
  */
-
-static struct ata_port * ata_host_add(const struct ata_probe_ent *ent,
-                                     struct ata_host_set *host_set,
+static struct ata_port * ata_port_add(const struct ata_probe_ent *ent,
+                                     struct ata_host *host,
                                      unsigned int port_no)
 {
-       struct Scsi_Host *host;
+       struct Scsi_Host *shost;
        struct ata_port *ap;
-       int rc;
 
        DPRINTK("ENTER\n");
 
        if (!ent->port_ops->error_handler &&
-           !(ent->host_flags & (ATA_FLAG_SATA_RESET | ATA_FLAG_SRST))) {
+           !(ent->port_flags & (ATA_FLAG_SATA_RESET | ATA_FLAG_SRST))) {
                printk(KERN_ERR "ata%u: no reset mechanism available\n",
                       port_no);
                return NULL;
        }
 
-       host = scsi_host_alloc(ent->sht, sizeof(struct ata_port));
-       if (!host)
+       shost = scsi_host_alloc(ent->sht, sizeof(struct ata_port));
+       if (!shost)
                return NULL;
 
-       host->transportt = &ata_scsi_transport_template;
-
-       ap = ata_shost_to_port(host);
+       shost->transportt = &ata_scsi_transport_template;
 
-       ata_host_init(ap, host, host_set, ent, port_no);
+       ap = ata_shost_to_port(shost);
 
-       rc = ap->ops->port_start(ap);
-       if (rc)
-               goto err_out;
+       ata_port_init(ap, host, ent, port_no);
+       ata_port_init_shost(ap, shost);
 
        return ap;
+}
 
-err_out:
-       scsi_host_put(host);
-       return NULL;
+/**
+ *     ata_sas_host_init - Initialize a host struct
+ *     @host:  host to initialize
+ *     @dev:   device host is attached to
+ *     @flags: host flags
+ *     @ops:   port_ops
+ *
+ *     LOCKING:
+ *     PCI/etc. bus probe sem.
+ *
+ */
+
+void ata_host_init(struct ata_host *host, struct device *dev,
+                  unsigned long flags, const struct ata_port_operations *ops)
+{
+       spin_lock_init(&host->lock);
+       host->dev = dev;
+       host->flags = flags;
+       host->ops = ops;
 }
 
 /**
@@ -5370,78 +5419,106 @@ err_out:
  */
 int ata_device_add(const struct ata_probe_ent *ent)
 {
-       unsigned int count = 0, i;
+       unsigned int i;
        struct device *dev = ent->dev;
-       struct ata_host_set *host_set;
+       struct ata_host *host;
        int rc;
 
        DPRINTK("ENTER\n");
        /* alloc a container for our list of ATA ports (buses) */
-       host_set = kzalloc(sizeof(struct ata_host_set) +
-                          (ent->n_ports * sizeof(void *)), GFP_KERNEL);
-       if (!host_set)
+       host = kzalloc(sizeof(struct ata_host) +
+                      (ent->n_ports * sizeof(void *)), GFP_KERNEL);
+       if (!host)
                return 0;
-       spin_lock_init(&host_set->lock);
 
-       host_set->dev = dev;
-       host_set->n_ports = ent->n_ports;
-       host_set->irq = ent->irq;
-       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;
+       ata_host_init(host, dev, ent->_host_flags, ent->port_ops);
+       host->n_ports = ent->n_ports;
+       host->irq = ent->irq;
+       host->irq2 = ent->irq2;
+       host->mmio_base = ent->mmio_base;
+       host->private_data = ent->private_data;
 
        /* register each port bound to this device */
-       for (i = 0; i < ent->n_ports; i++) {
+       for (i = 0; i < host->n_ports; i++) {
                struct ata_port *ap;
                unsigned long xfer_mode_mask;
+               int irq_line = ent->irq;
 
-               ap = ata_host_add(ent, host_set, i);
+               ap = ata_port_add(ent, host, i);
                if (!ap)
                        goto err_out;
 
-               host_set->ports[i] = ap;
+               host->ports[i] = ap;
+
+               /* dummy? */
+               if (ent->dummy_port_mask & (1 << i)) {
+                       ata_port_printk(ap, KERN_INFO, "DUMMY\n");
+                       ap->ops = &ata_dummy_port_ops;
+                       continue;
+               }
+
+               /* start port */
+               rc = ap->ops->port_start(ap);
+               if (rc) {
+                       host->ports[i] = NULL;
+                       scsi_host_put(ap->scsi_host);
+                       goto err_out;
+               }
+
+               /* Report the secondary IRQ for second channel legacy */
+               if (i == 1 && ent->irq2)
+                       irq_line = ent->irq2;
+
                xfer_mode_mask =(ap->udma_mask << ATA_SHIFT_UDMA) |
                                (ap->mwdma_mask << ATA_SHIFT_MWDMA) |
                                (ap->pio_mask << ATA_SHIFT_PIO);
 
                /* print per-port info to dmesg */
                ata_port_printk(ap, KERN_INFO, "%cATA max %s cmd 0x%lX "
-                               "ctl 0x%lX bmdma 0x%lX irq %lu\n",
+                               "ctl 0x%lX bmdma 0x%lX irq %d\n",
                                ap->flags & ATA_FLAG_SATA ? 'S' : 'P',
                                ata_mode_string(xfer_mode_mask),
                                ap->ioaddr.cmd_addr,
                                ap->ioaddr.ctl_addr,
                                ap->ioaddr.bmdma_addr,
-                               ent->irq);
+                               irq_line);
 
                ata_chk_status(ap);
-               host_set->ops->irq_clear(ap);
+               host->ops->irq_clear(ap);
                ata_eh_freeze_port(ap); /* freeze port before requesting IRQ */
-               count++;
        }
 
-       if (!count)
-               goto err_free_ret;
-
-       /* obtain irq, that is shared between channels */
+       /* obtain irq, that may be shared between channels */
        rc = request_irq(ent->irq, ent->port_ops->irq_handler, ent->irq_flags,
-                        DRV_NAME, host_set);
+                        DRV_NAME, host);
        if (rc) {
                dev_printk(KERN_ERR, dev, "irq %lu request failed: %d\n",
                           ent->irq, rc);
                goto err_out;
        }
 
+       /* do we have a second IRQ for the other channel, eg legacy mode */
+       if (ent->irq2) {
+               /* We will get weird core code crashes later if this is true
+                  so trap it now */
+               BUG_ON(ent->irq == ent->irq2);
+
+               rc = request_irq(ent->irq2, ent->port_ops->irq_handler, ent->irq_flags,
+                        DRV_NAME, host);
+               if (rc) {
+                       dev_printk(KERN_ERR, dev, "irq %lu request failed: %d\n",
+                                  ent->irq2, rc);
+                       goto err_out_free_irq;
+               }
+       }
+
        /* perform each probe synchronously */
        DPRINTK("probe begin\n");
-       for (i = 0; i < count; i++) {
-               struct ata_port *ap;
+       for (i = 0; i < host->n_ports; i++) {
+               struct ata_port *ap = host->ports[i];
                u32 scontrol;
                int rc;
 
-               ap = host_set->ports[i];
-
                /* init sata_spd_limit to the current value */
                if (sata_scr_read(ap, SCR_CONTROL, &scontrol) == 0) {
                        int spd = (scontrol >> 4) & 0xf;
@@ -5449,7 +5526,7 @@ int ata_device_add(const struct ata_probe_ent *ent)
                }
                ap->sata_spd_limit = ap->hw_sata_spd_limit;
 
-               rc = scsi_add_host(ap->host, dev);
+               rc = scsi_add_host(ap->scsi_host, dev);
                if (rc) {
                        ata_port_printk(ap, KERN_ERR, "scsi_add_host failed\n");
                        /* FIXME: do something useful here */
@@ -5497,27 +5574,29 @@ int ata_device_add(const struct ata_probe_ent *ent)
 
        /* probes are done, now scan each port's disk(s) */
        DPRINTK("host probe begin\n");
-       for (i = 0; i < count; i++) {
-               struct ata_port *ap = host_set->ports[i];
+       for (i = 0; i < host->n_ports; i++) {
+               struct ata_port *ap = host->ports[i];
 
                ata_scsi_scan_host(ap);
        }
 
-       dev_set_drvdata(dev, host_set);
+       dev_set_drvdata(dev, host);
 
        VPRINTK("EXIT, returning %u\n", ent->n_ports);
        return ent->n_ports; /* success */
 
+err_out_free_irq:
+       free_irq(ent->irq, host);
 err_out:
-       for (i = 0; i < count; i++) {
-               struct ata_port *ap = host_set->ports[i];
+       for (i = 0; i < host->n_ports; i++) {
+               struct ata_port *ap = host->ports[i];
                if (ap) {
                        ap->ops->port_stop(ap);
-                       scsi_host_put(ap->host);
+                       scsi_host_put(ap->scsi_host);
                }
        }
-err_free_ret:
-       kfree(host_set);
+
+       kfree(host);
        VPRINTK("EXIT, returning 0\n");
        return 0;
 }
@@ -5577,12 +5656,12 @@ void ata_port_detach(struct ata_port *ap)
 
  skip_eh:
        /* remove the associated SCSI host */
-       scsi_remove_host(ap->host);
+       scsi_remove_host(ap->scsi_host);
 }
 
 /**
- *     ata_host_set_remove - PCI layer callback for device removal
- *     @host_set: ATA host set that was removed
+ *     ata_host_remove - PCI layer callback for device removal
+ *     @host: ATA host set that was removed
  *
  *     Unregister all objects associated with this host set. Free those
  *     objects.
@@ -5591,36 +5670,39 @@ void ata_port_detach(struct ata_port *ap)
  *     Inherited from calling layer (may sleep).
  */
 
-void ata_host_set_remove(struct ata_host_set *host_set)
+void ata_host_remove(struct ata_host *host)
 {
        unsigned int i;
 
-       for (i = 0; i < host_set->n_ports; i++)
-               ata_port_detach(host_set->ports[i]);
+       for (i = 0; i < host->n_ports; i++)
+               ata_port_detach(host->ports[i]);
 
-       free_irq(host_set->irq, host_set);
+       free_irq(host->irq, host);
+       if (host->irq2)
+               free_irq(host->irq2, host);
 
-       for (i = 0; i < host_set->n_ports; i++) {
-               struct ata_port *ap = host_set->ports[i];
+       for (i = 0; i < host->n_ports; i++) {
+               struct ata_port *ap = host->ports[i];
 
-               ata_scsi_release(ap->host);
+               ata_scsi_release(ap->scsi_host);
 
                if ((ap->flags & ATA_FLAG_NO_LEGACY) == 0) {
                        struct ata_ioports *ioaddr = &ap->ioaddr;
 
-                       if (ioaddr->cmd_addr == 0x1f0)
-                               release_region(0x1f0, 8);
-                       else if (ioaddr->cmd_addr == 0x170)
-                               release_region(0x170, 8);
+                       /* FIXME: Add -ac IDE pci mods to remove these special cases */
+                       if (ioaddr->cmd_addr == ATA_PRIMARY_CMD)
+                               release_region(ATA_PRIMARY_CMD, 8);
+                       else if (ioaddr->cmd_addr == ATA_SECONDARY_CMD)
+                               release_region(ATA_SECONDARY_CMD, 8);
                }
 
-               scsi_host_put(ap->host);
+               scsi_host_put(ap->scsi_host);
        }
 
-       if (host_set->ops->host_stop)
-               host_set->ops->host_stop(host_set);
+       if (host->ops->host_stop)
+               host->ops->host_stop(host);
 
-       kfree(host_set);
+       kfree(host);
 }
 
 /**
@@ -5637,9 +5719,9 @@ void ata_host_set_remove(struct ata_host_set *host_set)
  *     One.
  */
 
-int ata_scsi_release(struct Scsi_Host *host)
+int ata_scsi_release(struct Scsi_Host *shost)
 {
-       struct ata_port *ap = ata_shost_to_port(host);
+       struct ata_port *ap = ata_shost_to_port(shost);
 
        DPRINTK("ENTER\n");
 
@@ -5650,6 +5732,31 @@ int ata_scsi_release(struct Scsi_Host *host)
        return 1;
 }
 
+struct ata_probe_ent *
+ata_probe_ent_alloc(struct device *dev, const struct ata_port_info *port)
+{
+       struct ata_probe_ent *probe_ent;
+
+       probe_ent = kzalloc(sizeof(*probe_ent), GFP_KERNEL);
+       if (!probe_ent) {
+               printk(KERN_ERR DRV_NAME "(%s): out of memory\n",
+                      kobject_name(&(dev->kobj)));
+               return NULL;
+       }
+
+       INIT_LIST_HEAD(&probe_ent->node);
+       probe_ent->dev = dev;
+
+       probe_ent->sht = port->sht;
+       probe_ent->port_flags = port->flags;
+       probe_ent->pio_mask = port->pio_mask;
+       probe_ent->mwdma_mask = port->mwdma_mask;
+       probe_ent->udma_mask = port->udma_mask;
+       probe_ent->port_ops = port->port_ops;
+
+       return probe_ent;
+}
+
 /**
  *     ata_std_ports - initialize ioaddr with standard port offsets.
  *     @ioaddr: IO address structure to be initialized
@@ -5679,11 +5786,11 @@ void ata_std_ports(struct ata_ioports *ioaddr)
 
 #ifdef CONFIG_PCI
 
-void ata_pci_host_stop (struct ata_host_set *host_set)
+void ata_pci_host_stop (struct ata_host *host)
 {
-       struct pci_dev *pdev = to_pci_dev(host_set->dev);
+       struct pci_dev *pdev = to_pci_dev(host->dev);
 
-       pci_iounmap(pdev, host_set->mmio_base);
+       pci_iounmap(pdev, host->mmio_base);
 }
 
 /**
@@ -5703,12 +5810,9 @@ void ata_pci_host_stop (struct ata_host_set *host_set)
 void ata_pci_remove_one (struct pci_dev *pdev)
 {
        struct device *dev = pci_dev_to_dev(pdev);
-       struct ata_host_set *host_set = dev_get_drvdata(dev);
-       struct ata_host_set *host_set2 = host_set->next;
+       struct ata_host *host = dev_get_drvdata(dev);
 
-       ata_host_set_remove(host_set);
-       if (host_set2)
-               ata_host_set_remove(host_set2);
+       ata_host_remove(host);
 
        pci_release_regions(pdev);
        pci_disable_device(pdev);
@@ -5749,11 +5853,11 @@ int pci_test_config_bits(struct pci_dev *pdev, const struct pci_bits *bits)
        return (tmp == bits->val) ? 1 : 0;
 }
 
-void ata_pci_device_do_suspend(struct pci_dev *pdev, pm_message_t state)
+void ata_pci_device_do_suspend(struct pci_dev *pdev, pm_message_t mesg)
 {
        pci_save_state(pdev);
 
-       if (state.event == PM_EVENT_SUSPEND) {
+       if (mesg.event == PM_EVENT_SUSPEND) {
                pci_disable_device(pdev);
                pci_set_power_state(pdev, PCI_D3hot);
        }
@@ -5767,37 +5871,26 @@ void ata_pci_device_do_resume(struct pci_dev *pdev)
        pci_set_master(pdev);
 }
 
-int ata_pci_device_suspend(struct pci_dev *pdev, pm_message_t state)
+int ata_pci_device_suspend(struct pci_dev *pdev, pm_message_t mesg)
 {
-       struct ata_host_set *host_set = dev_get_drvdata(&pdev->dev);
+       struct ata_host *host = dev_get_drvdata(&pdev->dev);
        int rc = 0;
 
-       rc = ata_host_set_suspend(host_set, state);
+       rc = ata_host_suspend(host, mesg);
        if (rc)
                return rc;
 
-       if (host_set->next) {
-               rc = ata_host_set_suspend(host_set->next, state);
-               if (rc) {
-                       ata_host_set_resume(host_set);
-                       return rc;
-               }
-       }
-
-       ata_pci_device_do_suspend(pdev, state);
+       ata_pci_device_do_suspend(pdev, mesg);
 
        return 0;
 }
 
 int ata_pci_device_resume(struct pci_dev *pdev)
 {
-       struct ata_host_set *host_set = dev_get_drvdata(&pdev->dev);
+       struct ata_host *host = dev_get_drvdata(&pdev->dev);
 
        ata_pci_device_do_resume(pdev);
-       ata_host_set_resume(host_set);
-       if (host_set->next)
-               ata_host_set_resume(host_set->next);
-
+       ata_host_resume(host);
        return 0;
 }
 #endif /* CONFIG_PCI */
@@ -5896,6 +5989,39 @@ u32 ata_wait_register(void __iomem *reg, u32 mask, u32 val,
        return tmp;
 }
 
+/*
+ * Dummy port_ops
+ */
+static void ata_dummy_noret(struct ata_port *ap)       { }
+static int ata_dummy_ret0(struct ata_port *ap)         { return 0; }
+static void ata_dummy_qc_noret(struct ata_queued_cmd *qc) { }
+
+static u8 ata_dummy_check_status(struct ata_port *ap)
+{
+       return ATA_DRDY;
+}
+
+static unsigned int ata_dummy_qc_issue(struct ata_queued_cmd *qc)
+{
+       return AC_ERR_SYSTEM;
+}
+
+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,
+       .qc_prep                = ata_noop_qc_prep,
+       .qc_issue               = ata_dummy_qc_issue,
+       .freeze                 = ata_dummy_noret,
+       .thaw                   = ata_dummy_noret,
+       .error_handler          = ata_dummy_noret,
+       .post_internal_cmd      = ata_dummy_qc_noret,
+       .irq_clear              = ata_dummy_noret,
+       .port_start             = ata_dummy_ret0,
+       .port_stop              = ata_dummy_noret,
+};
+
 /*
  * libata is essentially a library of internal helper functions for
  * low-level ATA host controller drivers.  As such, the API/ABI is
@@ -5906,11 +6032,13 @@ u32 ata_wait_register(void __iomem *reg, u32 mask, u32 val,
 EXPORT_SYMBOL_GPL(sata_deb_timing_normal);
 EXPORT_SYMBOL_GPL(sata_deb_timing_hotplug);
 EXPORT_SYMBOL_GPL(sata_deb_timing_long);
+EXPORT_SYMBOL_GPL(ata_dummy_port_ops);
 EXPORT_SYMBOL_GPL(ata_std_bios_param);
 EXPORT_SYMBOL_GPL(ata_std_ports);
+EXPORT_SYMBOL_GPL(ata_host_init);
 EXPORT_SYMBOL_GPL(ata_device_add);
 EXPORT_SYMBOL_GPL(ata_port_detach);
-EXPORT_SYMBOL_GPL(ata_host_set_remove);
+EXPORT_SYMBOL_GPL(ata_host_remove);
 EXPORT_SYMBOL_GPL(ata_sg_init);
 EXPORT_SYMBOL_GPL(ata_sg_init_one);
 EXPORT_SYMBOL_GPL(ata_hsm_move);
@@ -5977,8 +6105,8 @@ EXPORT_SYMBOL_GPL(sata_scr_write);
 EXPORT_SYMBOL_GPL(sata_scr_write_flush);
 EXPORT_SYMBOL_GPL(ata_port_online);
 EXPORT_SYMBOL_GPL(ata_port_offline);
-EXPORT_SYMBOL_GPL(ata_host_set_suspend);
-EXPORT_SYMBOL_GPL(ata_host_set_resume);
+EXPORT_SYMBOL_GPL(ata_host_suspend);
+EXPORT_SYMBOL_GPL(ata_host_resume);
 EXPORT_SYMBOL_GPL(ata_id_string);
 EXPORT_SYMBOL_GPL(ata_id_c_string);
 EXPORT_SYMBOL_GPL(ata_scsi_simulate);
similarity index 99%
rename from drivers/scsi/libata-eh.c
rename to drivers/ata/libata-eh.c
index 29f59345305d93e7181ad599594710b22963792f..b1b510493c2db24610b65bfeb0bdb7086d8e8de5 100644 (file)
@@ -39,7 +39,7 @@
 #include <scsi/scsi_eh.h>
 #include <scsi/scsi_device.h>
 #include <scsi/scsi_cmnd.h>
-#include "scsi_transport_api.h"
+#include "../scsi/scsi_transport_api.h"
 
 #include <linux/libata.h>
 
@@ -200,7 +200,7 @@ void ata_scsi_error(struct Scsi_Host *host)
        /* synchronize with port task */
        ata_port_flush_task(ap);
 
-       /* synchronize with host_set lock and sort out timeouts */
+       /* synchronize with host lock and sort out timeouts */
 
        /* For new EH, all qcs are finished in one of three ways -
         * normal completion, error completion, and SCSI timeout.
@@ -377,7 +377,7 @@ void ata_port_wait_eh(struct ata_port *ap)
        spin_unlock_irqrestore(ap->lock, flags);
 
        /* make sure SCSI EH is complete */
-       if (scsi_host_in_recovery(ap->host)) {
+       if (scsi_host_in_recovery(ap->scsi_host)) {
                msleep(10);
                goto retry;
        }
@@ -486,7 +486,7 @@ void ata_eng_timeout(struct ata_port *ap)
  *     other commands are drained.
  *
  *     LOCKING:
- *     spin_lock_irqsave(host_set lock)
+ *     spin_lock_irqsave(host lock)
  */
 void ata_qc_schedule_eh(struct ata_queued_cmd *qc)
 {
@@ -513,14 +513,14 @@ void ata_qc_schedule_eh(struct ata_queued_cmd *qc)
  *     all commands are drained.
  *
  *     LOCKING:
- *     spin_lock_irqsave(host_set lock)
+ *     spin_lock_irqsave(host lock)
  */
 void ata_port_schedule_eh(struct ata_port *ap)
 {
        WARN_ON(!ap->ops->error_handler);
 
        ap->pflags |= ATA_PFLAG_EH_PENDING;
-       scsi_schedule_eh(ap->host);
+       scsi_schedule_eh(ap->scsi_host);
 
        DPRINTK("port EH scheduled\n");
 }
@@ -532,7 +532,7 @@ void ata_port_schedule_eh(struct ata_port *ap)
  *     Abort all active qc's of @ap and schedule EH.
  *
  *     LOCKING:
- *     spin_lock_irqsave(host_set lock)
+ *     spin_lock_irqsave(host lock)
  *
  *     RETURNS:
  *     Number of aborted qc's.
@@ -575,7 +575,7 @@ int ata_port_abort(struct ata_port *ap)
  *     is frozen.
  *
  *     LOCKING:
- *     spin_lock_irqsave(host_set lock)
+ *     spin_lock_irqsave(host lock)
  */
 static void __ata_port_freeze(struct ata_port *ap)
 {
@@ -596,7 +596,7 @@ static void __ata_port_freeze(struct ata_port *ap)
  *     Abort and freeze @ap.
  *
  *     LOCKING:
- *     spin_lock_irqsave(host_set lock)
+ *     spin_lock_irqsave(host lock)
  *
  *     RETURNS:
  *     Number of aborted commands.
similarity index 94%
rename from drivers/scsi/libata-scsi.c
rename to drivers/ata/libata-scsi.c
index e92c31d698ff6c983b7a817afe190d10a7f1de6c..3986ec8741b4157ba46e1415f0487cb05b4fb8d0 100644 (file)
@@ -321,7 +321,7 @@ int ata_scsi_ioctl(struct scsi_device *scsidev, int cmd, void __user *arg)
  *     current command.
  *
  *     LOCKING:
- *     spin_lock_irqsave(host_set lock)
+ *     spin_lock_irqsave(host lock)
  *
  *     RETURNS:
  *     Command allocated, or %NULL if none available.
@@ -400,7 +400,7 @@ void ata_dump_status(unsigned id, struct ata_taskfile *tf)
 /**
  *     ata_scsi_device_suspend - suspend ATA device associated with sdev
  *     @sdev: the SCSI device to suspend
- *     @state: target power management state
+ *     @mesg: target power management message
  *
  *     Request suspend EH action on the ATA device associated with
  *     @sdev and wait for the operation to complete.
@@ -411,7 +411,7 @@ void ata_dump_status(unsigned id, struct ata_taskfile *tf)
  *     RETURNS:
  *     0 on success, -errno otherwise.
  */
-int ata_scsi_device_suspend(struct scsi_device *sdev, pm_message_t state)
+int ata_scsi_device_suspend(struct scsi_device *sdev, pm_message_t mesg)
 {
        struct ata_port *ap = ata_shost_to_port(sdev->host);
        struct ata_device *dev = ata_scsi_find_dev(ap, sdev);
@@ -438,7 +438,7 @@ int ata_scsi_device_suspend(struct scsi_device *sdev, pm_message_t state)
 
        /* request suspend */
        action = ATA_EH_SUSPEND;
-       if (state.event != PM_EVENT_SUSPEND)
+       if (mesg.event != PM_EVENT_SUSPEND)
                action |= ATA_EH_PM_FREEZE;
        ap->eh_info.dev_action[dev->devno] |= action;
        ap->eh_info.flags |= ATA_EHI_QUIET;
@@ -463,7 +463,7 @@ int ata_scsi_device_suspend(struct scsi_device *sdev, pm_message_t state)
        spin_unlock_irqrestore(ap->lock, flags);
  out:
        if (rc == 0)
-               sdev->sdev_gendev.power.power_state = state;
+               sdev->sdev_gendev.power.power_state = mesg;
        return rc;
 }
 
@@ -537,7 +537,7 @@ int ata_scsi_device_resume(struct scsi_device *sdev)
  *     format sense blocks.
  *
  *     LOCKING:
- *     spin_lock_irqsave(host_set lock)
+ *     spin_lock_irqsave(host lock)
  */
 void ata_to_sense_error(unsigned id, u8 drv_stat, u8 drv_err, u8 *sk, u8 *asc,
                        u8 *ascq, int verbose)
@@ -649,7 +649,7 @@ void ata_to_sense_error(unsigned id, u8 drv_stat, u8 drv_err, u8 *sk, u8 *asc,
  *     block. Clear sense key, ASC & ASCQ if there is no error.
  *
  *     LOCKING:
- *     spin_lock_irqsave(host_set lock)
+ *     spin_lock_irqsave(host lock)
  */
 void ata_gen_ata_desc_sense(struct ata_queued_cmd *qc)
 {
@@ -918,7 +918,7 @@ int ata_scsi_change_queue_depth(struct scsi_device *sdev, int queue_depth)
  *     [See SAT revision 5 at www.t10.org]
  *
  *     LOCKING:
- *     spin_lock_irqsave(host_set lock)
+ *     spin_lock_irqsave(host lock)
  *
  *     RETURNS:
  *     Zero on success, non-zero on error.
@@ -986,7 +986,7 @@ invalid_fld:
  *     FLUSH CACHE EXT.
  *
  *     LOCKING:
- *     spin_lock_irqsave(host_set lock)
+ *     spin_lock_irqsave(host lock)
  *
  *     RETURNS:
  *     Zero on success, non-zero on error.
@@ -1109,7 +1109,7 @@ static void scsi_16_lba_len(const u8 *scsicmd, u64 *plba, u32 *plen)
  *     Converts SCSI VERIFY command to an ATA READ VERIFY command.
  *
  *     LOCKING:
- *     spin_lock_irqsave(host_set lock)
+ *     spin_lock_irqsave(host lock)
  *
  *     RETURNS:
  *     Zero on success, non-zero on error.
@@ -1233,7 +1233,7 @@ nothing_to_do:
  *     %WRITE_16 are currently supported.
  *
  *     LOCKING:
- *     spin_lock_irqsave(host_set lock)
+ *     spin_lock_irqsave(host lock)
  *
  *     RETURNS:
  *     Zero on success, non-zero on error.
@@ -1467,7 +1467,7 @@ static void ata_scsi_qc_complete(struct ata_queued_cmd *qc)
  *     issued to @dev.
  *
  *     LOCKING:
- *     spin_lock_irqsave(host_set lock)
+ *     spin_lock_irqsave(host lock)
  *
  *     RETURNS:
  *     1 if deferring is needed, 0 otherwise.
@@ -1510,7 +1510,7 @@ static int ata_scmd_need_defer(struct ata_device *dev, int is_io)
  *     termination.
  *
  *     LOCKING:
- *     spin_lock_irqsave(host_set lock)
+ *     spin_lock_irqsave(host lock)
  *
  *     RETURNS:
  *     0 on success, SCSI_ML_QUEUE_DEVICE_BUSY if the command
@@ -1589,7 +1589,7 @@ defer:
  *     Maps buffer contained within SCSI command @cmd.
  *
  *     LOCKING:
- *     spin_lock_irqsave(host_set lock)
+ *     spin_lock_irqsave(host lock)
  *
  *     RETURNS:
  *     Length of response buffer.
@@ -1623,7 +1623,7 @@ static unsigned int ata_scsi_rbuf_get(struct scsi_cmnd *cmd, u8 **buf_out)
  *     Unmaps response buffer contained within @cmd.
  *
  *     LOCKING:
- *     spin_lock_irqsave(host_set lock)
+ *     spin_lock_irqsave(host lock)
  */
 
 static inline void ata_scsi_rbuf_put(struct scsi_cmnd *cmd, u8 *buf)
@@ -1649,7 +1649,7 @@ static inline void ata_scsi_rbuf_put(struct scsi_cmnd *cmd, u8 *buf)
  *     and sense buffer are assumed to be set).
  *
  *     LOCKING:
- *     spin_lock_irqsave(host_set lock)
+ *     spin_lock_irqsave(host lock)
  */
 
 void ata_scsi_rbuf_fill(struct ata_scsi_args *args,
@@ -1680,7 +1680,7 @@ void ata_scsi_rbuf_fill(struct ata_scsi_args *args,
  *     with non-VPD INQUIRY command output.
  *
  *     LOCKING:
- *     spin_lock_irqsave(host_set lock)
+ *     spin_lock_irqsave(host lock)
  */
 
 unsigned int ata_scsiop_inq_std(struct ata_scsi_args *args, u8 *rbuf,
@@ -1736,7 +1736,7 @@ unsigned int ata_scsiop_inq_std(struct ata_scsi_args *args, u8 *rbuf,
  *     Returns list of inquiry VPD pages available.
  *
  *     LOCKING:
- *     spin_lock_irqsave(host_set lock)
+ *     spin_lock_irqsave(host lock)
  */
 
 unsigned int ata_scsiop_inq_00(struct ata_scsi_args *args, u8 *rbuf,
@@ -1764,7 +1764,7 @@ unsigned int ata_scsiop_inq_00(struct ata_scsi_args *args, u8 *rbuf,
  *     Returns ATA device serial number.
  *
  *     LOCKING:
- *     spin_lock_irqsave(host_set lock)
+ *     spin_lock_irqsave(host lock)
  */
 
 unsigned int ata_scsiop_inq_80(struct ata_scsi_args *args, u8 *rbuf,
@@ -1797,7 +1797,7 @@ unsigned int ata_scsiop_inq_80(struct ata_scsi_args *args, u8 *rbuf,
  *        name ("ATA     "), model and serial numbers.
  *
  *     LOCKING:
- *     spin_lock_irqsave(host_set lock)
+ *     spin_lock_irqsave(host lock)
  */
 
 unsigned int ata_scsiop_inq_83(struct ata_scsi_args *args, u8 *rbuf,
@@ -1849,7 +1849,7 @@ unsigned int ata_scsiop_inq_83(struct ata_scsi_args *args, u8 *rbuf,
  *     that the caller should successfully complete this SCSI command.
  *
  *     LOCKING:
- *     spin_lock_irqsave(host_set lock)
+ *     spin_lock_irqsave(host lock)
  */
 
 unsigned int ata_scsiop_noop(struct ata_scsi_args *args, u8 *rbuf,
@@ -1990,7 +1990,7 @@ static int ata_dev_supports_fua(u16 *id)
  *     descriptor for other device types.
  *
  *     LOCKING:
- *     spin_lock_irqsave(host_set lock)
+ *     spin_lock_irqsave(host lock)
  */
 
 unsigned int ata_scsiop_mode_sense(struct ata_scsi_args *args, u8 *rbuf,
@@ -2129,7 +2129,7 @@ saving_not_supp:
  *     Simulate READ CAPACITY commands.
  *
  *     LOCKING:
- *     spin_lock_irqsave(host_set lock)
+ *     spin_lock_irqsave(host lock)
  */
 
 unsigned int ata_scsiop_read_cap(struct ata_scsi_args *args, u8 *rbuf,
@@ -2204,7 +2204,7 @@ unsigned int ata_scsiop_read_cap(struct ata_scsi_args *args, u8 *rbuf,
  *     Simulate REPORT LUNS command.
  *
  *     LOCKING:
- *     spin_lock_irqsave(host_set lock)
+ *     spin_lock_irqsave(host lock)
  */
 
 unsigned int ata_scsiop_report_luns(struct ata_scsi_args *args, u8 *rbuf,
@@ -2256,7 +2256,7 @@ void ata_scsi_set_sense(struct scsi_cmnd *cmd, u8 sk, u8 asc, u8 ascq)
  *     and the specified additional sense codes.
  *
  *     LOCKING:
- *     spin_lock_irqsave(host_set lock)
+ *     spin_lock_irqsave(host lock)
  */
 
 void ata_scsi_badcmd(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *), u8 asc, u8 ascq)
@@ -2421,7 +2421,7 @@ static void atapi_qc_complete(struct ata_queued_cmd *qc)
  *     @scsicmd: SCSI CDB associated with this PACKET command
  *
  *     LOCKING:
- *     spin_lock_irqsave(host_set lock)
+ *     spin_lock_irqsave(host lock)
  *
  *     RETURNS:
  *     Zero on success, non-zero on failure.
@@ -2500,7 +2500,7 @@ static struct ata_device * __ata_scsi_find_dev(struct ata_port *ap,
  *     Determine if commands should be sent to the specified device.
  *
  *     LOCKING:
- *     spin_lock_irqsave(host_set lock)
+ *     spin_lock_irqsave(host lock)
  *
  *     RETURNS:
  *     0 if commands are not allowed / 1 if commands are allowed
@@ -2534,7 +2534,7 @@ static int ata_scsi_dev_enabled(struct ata_device *dev)
  *     SCSI command to be sent.
  *
  *     LOCKING:
- *     spin_lock_irqsave(host_set lock)
+ *     spin_lock_irqsave(host lock)
  *
  *     RETURNS:
  *     Associated ATA device, or %NULL if not found.
@@ -2808,7 +2808,7 @@ static inline int __ata_scsi_queuecmd(struct scsi_cmnd *cmd,
  *     ATA and ATAPI devices appearing as SCSI devices.
  *
  *     LOCKING:
- *     Releases scsi-layer-held lock, and obtains host_set lock.
+ *     Releases scsi-layer-held lock, and obtains host lock.
  *
  *     RETURNS:
  *     Return value from __ata_scsi_queuecmd() if @cmd can be queued,
@@ -2852,7 +2852,7 @@ int ata_scsi_queuecmd(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *))
  *     that can be handled internally.
  *
  *     LOCKING:
- *     spin_lock_irqsave(host_set lock)
+ *     spin_lock_irqsave(host lock)
  */
 
 void ata_scsi_simulate(struct ata_device *dev, struct scsi_cmnd *cmd,
@@ -2944,7 +2944,7 @@ void ata_scsi_scan_host(struct ata_port *ap)
                if (!ata_dev_enabled(dev) || dev->sdev)
                        continue;
 
-               sdev = __scsi_add_device(ap->host, 0, i, 0, NULL);
+               sdev = __scsi_add_device(ap->scsi_host, 0, i, 0, NULL);
                if (!IS_ERR(sdev)) {
                        dev->sdev = sdev;
                        scsi_device_put(sdev);
@@ -2958,11 +2958,11 @@ void ata_scsi_scan_host(struct ata_port *ap)
  *
  *     This function is called from ata_eh_hotplug() and responsible
  *     for taking the SCSI device attached to @dev offline.  This
- *     function is called with host_set lock which protects dev->sdev
+ *     function is called with host lock which protects dev->sdev
  *     against clearing.
  *
  *     LOCKING:
- *     spin_lock_irqsave(host_set lock)
+ *     spin_lock_irqsave(host lock)
  *
  *     RETURNS:
  *     1 if attached SCSI device exists, 0 otherwise.
@@ -2998,16 +2998,16 @@ static void ata_scsi_remove_dev(struct ata_device *dev)
         * be removed if there is __scsi_device_get() interface which
         * increments reference counts regardless of device state.
         */
-       mutex_lock(&ap->host->scan_mutex);
+       mutex_lock(&ap->scsi_host->scan_mutex);
        spin_lock_irqsave(ap->lock, flags);
 
-       /* clearing dev->sdev is protected by host_set lock */
+       /* clearing dev->sdev is protected by host lock */
        sdev = dev->sdev;
        dev->sdev = NULL;
 
        if (sdev) {
                /* If user initiated unplug races with us, sdev can go
-                * away underneath us after the host_set lock and
+                * away underneath us after the host lock and
                 * scan_mutex are released.  Hold onto it.
                 */
                if (scsi_device_get(sdev) == 0) {
@@ -3024,7 +3024,7 @@ static void ata_scsi_remove_dev(struct ata_device *dev)
        }
 
        spin_unlock_irqrestore(ap->lock, flags);
-       mutex_unlock(&ap->host->scan_mutex);
+       mutex_unlock(&ap->scsi_host->scan_mutex);
 
        if (sdev) {
                ata_dev_printk(dev, KERN_INFO, "detaching (SCSI %s)\n",
@@ -3171,3 +3171,152 @@ void ata_scsi_dev_rescan(void *data)
                        scsi_rescan_device(&(dev->sdev->sdev_gendev));
        }
 }
+
+/**
+ *     ata_sas_port_alloc - Allocate port for a SAS attached SATA device
+ *     @pdev: PCI device that the scsi device is attached to
+ *     @port_info: Information from low-level host driver
+ *     @shost: SCSI host that the scsi device is attached to
+ *
+ *     LOCKING:
+ *     PCI/etc. bus probe sem.
+ *
+ *     RETURNS:
+ *     ata_port pointer on success / NULL on failure.
+ */
+
+struct ata_port *ata_sas_port_alloc(struct ata_host *host,
+                                   struct ata_port_info *port_info,
+                                   struct Scsi_Host *shost)
+{
+       struct ata_port *ap = kzalloc(sizeof(*ap), GFP_KERNEL);
+       struct ata_probe_ent *ent;
+
+       if (!ap)
+               return NULL;
+
+       ent = ata_probe_ent_alloc(host->dev, port_info);
+       if (!ent) {
+               kfree(ap);
+               return NULL;
+       }
+
+       ata_port_init(ap, host, ent, 0);
+       ap->lock = shost->host_lock;
+       kfree(ent);
+       return ap;
+}
+EXPORT_SYMBOL_GPL(ata_sas_port_alloc);
+
+/**
+ *     ata_sas_port_start - Set port up for dma.
+ *     @ap: Port to initialize
+ *
+ *     Called just after data structures for each port are
+ *     initialized.  Allocates DMA pad.
+ *
+ *     May be used as the port_start() entry in ata_port_operations.
+ *
+ *     LOCKING:
+ *     Inherited from caller.
+ */
+int ata_sas_port_start(struct ata_port *ap)
+{
+       return ata_pad_alloc(ap, ap->dev);
+}
+EXPORT_SYMBOL_GPL(ata_sas_port_start);
+
+/**
+ *     ata_port_stop - Undo ata_sas_port_start()
+ *     @ap: Port to shut down
+ *
+ *     Frees the DMA pad.
+ *
+ *     May be used as the port_stop() entry in ata_port_operations.
+ *
+ *     LOCKING:
+ *     Inherited from caller.
+ */
+
+void ata_sas_port_stop(struct ata_port *ap)
+{
+       ata_pad_free(ap, ap->dev);
+}
+EXPORT_SYMBOL_GPL(ata_sas_port_stop);
+
+/**
+ *     ata_sas_port_init - Initialize a SATA device
+ *     @ap: SATA port to initialize
+ *
+ *     LOCKING:
+ *     PCI/etc. bus probe sem.
+ *
+ *     RETURNS:
+ *     Zero on success, non-zero on error.
+ */
+
+int ata_sas_port_init(struct ata_port *ap)
+{
+       int rc = ap->ops->port_start(ap);
+
+       if (!rc)
+               rc = ata_bus_probe(ap);
+
+       return rc;
+}
+EXPORT_SYMBOL_GPL(ata_sas_port_init);
+
+/**
+ *     ata_sas_port_destroy - Destroy a SATA port allocated by ata_sas_port_alloc
+ *     @ap: SATA port to destroy
+ *
+ */
+
+void ata_sas_port_destroy(struct ata_port *ap)
+{
+       ap->ops->port_stop(ap);
+       kfree(ap);
+}
+EXPORT_SYMBOL_GPL(ata_sas_port_destroy);
+
+/**
+ *     ata_sas_slave_configure - Default slave_config routine for libata devices
+ *     @sdev: SCSI device to configure
+ *     @ap: ATA port to which SCSI device is attached
+ *
+ *     RETURNS:
+ *     Zero.
+ */
+
+int ata_sas_slave_configure(struct scsi_device *sdev, struct ata_port *ap)
+{
+       ata_scsi_sdev_config(sdev);
+       ata_scsi_dev_config(sdev, ap->device);
+       return 0;
+}
+EXPORT_SYMBOL_GPL(ata_sas_slave_configure);
+
+/**
+ *     ata_sas_queuecmd - Issue SCSI cdb to libata-managed device
+ *     @cmd: SCSI command to be sent
+ *     @done: Completion function, called when command is complete
+ *     @ap:    ATA port to which the command is being sent
+ *
+ *     RETURNS:
+ *     Zero.
+ */
+
+int ata_sas_queuecmd(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *),
+                    struct ata_port *ap)
+{
+       ata_scsi_dump_cdb(ap, cmd);
+
+       if (likely(ata_scsi_dev_enabled(ap->device)))
+               __ata_scsi_queuecmd(cmd, done, ap->device);
+       else {
+               cmd->result = (DID_BAD_TARGET << 16);
+               done(cmd);
+       }
+       return 0;
+}
+EXPORT_SYMBOL_GPL(ata_sas_queuecmd);
similarity index 89%
rename from drivers/scsi/libata-bmdma.c
rename to drivers/ata/libata-sff.c
index 9ce221f25954426af69ce124bb11a4beaf0feff2..760502859821e25cde08e3501e83237ea0294169 100644 (file)
@@ -193,7 +193,7 @@ void ata_tf_load(struct ata_port *ap, const struct ata_taskfile *tf)
  *     synchronization with interrupt handler / other threads.
  *
  *     LOCKING:
- *     spin_lock_irqsave(host_set lock)
+ *     spin_lock_irqsave(host lock)
  */
 
 static void ata_exec_command_pio(struct ata_port *ap, const struct ata_taskfile *tf)
@@ -216,7 +216,7 @@ static void ata_exec_command_pio(struct ata_port *ap, const struct ata_taskfile
  *     FIXME: missing write posting for 400nS delay enforcement
  *
  *     LOCKING:
- *     spin_lock_irqsave(host_set lock)
+ *     spin_lock_irqsave(host lock)
  */
 
 static void ata_exec_command_mmio(struct ata_port *ap, const struct ata_taskfile *tf)
@@ -237,7 +237,7 @@ static void ata_exec_command_mmio(struct ata_port *ap, const struct ata_taskfile
  *     synchronization with interrupt handler / other threads.
  *
  *     LOCKING:
- *     spin_lock_irqsave(host_set lock)
+ *     spin_lock_irqsave(host lock)
  */
 void ata_exec_command(struct ata_port *ap, const struct ata_taskfile *tf)
 {
@@ -422,7 +422,7 @@ u8 ata_altstatus(struct ata_port *ap)
  *     @qc: Info associated with this ATA transaction.
  *
  *     LOCKING:
- *     spin_lock_irqsave(host_set lock)
+ *     spin_lock_irqsave(host lock)
  */
 
 static void ata_bmdma_setup_mmio (struct ata_queued_cmd *qc)
@@ -452,7 +452,7 @@ static void ata_bmdma_setup_mmio (struct ata_queued_cmd *qc)
  *     @qc: Info associated with this ATA transaction.
  *
  *     LOCKING:
- *     spin_lock_irqsave(host_set lock)
+ *     spin_lock_irqsave(host lock)
  */
 
 static void ata_bmdma_start_mmio (struct ata_queued_cmd *qc)
@@ -483,7 +483,7 @@ static void ata_bmdma_start_mmio (struct ata_queued_cmd *qc)
  *     @qc: Info associated with this ATA transaction.
  *
  *     LOCKING:
- *     spin_lock_irqsave(host_set lock)
+ *     spin_lock_irqsave(host lock)
  */
 
 static void ata_bmdma_setup_pio (struct ata_queued_cmd *qc)
@@ -511,7 +511,7 @@ static void ata_bmdma_setup_pio (struct ata_queued_cmd *qc)
  *     @qc: Info associated with this ATA transaction.
  *
  *     LOCKING:
- *     spin_lock_irqsave(host_set lock)
+ *     spin_lock_irqsave(host lock)
  */
 
 static void ata_bmdma_start_pio (struct ata_queued_cmd *qc)
@@ -535,7 +535,7 @@ static void ata_bmdma_start_pio (struct ata_queued_cmd *qc)
  *     May be used as the bmdma_start() entry in ata_port_operations.
  *
  *     LOCKING:
- *     spin_lock_irqsave(host_set lock)
+ *     spin_lock_irqsave(host lock)
  */
 void ata_bmdma_start(struct ata_queued_cmd *qc)
 {
@@ -557,7 +557,7 @@ void ata_bmdma_start(struct ata_queued_cmd *qc)
  *     May be used as the bmdma_setup() entry in ata_port_operations.
  *
  *     LOCKING:
- *     spin_lock_irqsave(host_set lock)
+ *     spin_lock_irqsave(host lock)
  */
 void ata_bmdma_setup(struct ata_queued_cmd *qc)
 {
@@ -577,7 +577,7 @@ void ata_bmdma_setup(struct ata_queued_cmd *qc)
  *     May be used as the irq_clear() entry in ata_port_operations.
  *
  *     LOCKING:
- *     spin_lock_irqsave(host_set lock)
+ *     spin_lock_irqsave(host lock)
  */
 
 void ata_bmdma_irq_clear(struct ata_port *ap)
@@ -605,7 +605,7 @@ void ata_bmdma_irq_clear(struct ata_port *ap)
  *     May be used as the bmdma_status() entry in ata_port_operations.
  *
  *     LOCKING:
- *     spin_lock_irqsave(host_set lock)
+ *     spin_lock_irqsave(host lock)
  */
 
 u8 ata_bmdma_status(struct ata_port *ap)
@@ -629,7 +629,7 @@ u8 ata_bmdma_status(struct ata_port *ap)
  *     May be used as the bmdma_stop() entry in ata_port_operations.
  *
  *     LOCKING:
- *     spin_lock_irqsave(host_set lock)
+ *     spin_lock_irqsave(host lock)
  */
 
 void ata_bmdma_stop(struct ata_queued_cmd *qc)
@@ -797,32 +797,6 @@ void ata_bmdma_post_internal_cmd(struct ata_queued_cmd *qc)
 }
 
 #ifdef CONFIG_PCI
-static struct ata_probe_ent *
-ata_probe_ent_alloc(struct device *dev, const struct ata_port_info *port)
-{
-       struct ata_probe_ent *probe_ent;
-
-       probe_ent = kzalloc(sizeof(*probe_ent), GFP_KERNEL);
-       if (!probe_ent) {
-               printk(KERN_ERR DRV_NAME "(%s): out of memory\n",
-                      kobject_name(&(dev->kobj)));
-               return NULL;
-       }
-
-       INIT_LIST_HEAD(&probe_ent->node);
-       probe_ent->dev = dev;
-
-       probe_ent->sht = port->sht;
-       probe_ent->host_flags = port->host_flags;
-       probe_ent->pio_mask = port->pio_mask;
-       probe_ent->mwdma_mask = port->mwdma_mask;
-       probe_ent->udma_mask = port->udma_mask;
-       probe_ent->port_ops = port->port_ops;
-
-       return probe_ent;
-}
-
-
 /**
  *     ata_pci_init_native_mode - Initialize native-mode driver
  *     @pdev:  pci device to be initialized
@@ -864,7 +838,7 @@ ata_pci_init_native_mode(struct pci_dev *pdev, struct ata_port_info **port, int
                bmdma = pci_resource_start(pdev, 4);
                if (bmdma) {
                        if (inb(bmdma + 2) & 0x80)
-                               probe_ent->host_set_flags |= ATA_HOST_SIMPLEX;
+                               probe_ent->_host_flags |= ATA_HOST_SIMPLEX;
                        probe_ent->port[p].bmdma_addr = bmdma;
                }
                ata_std_ports(&probe_ent->port[p]);
@@ -880,7 +854,7 @@ ata_pci_init_native_mode(struct pci_dev *pdev, struct ata_port_info **port, int
                if (bmdma) {
                        bmdma += 8;
                        if(inb(bmdma + 2) & 0x80)
-                       probe_ent->host_set_flags |= ATA_HOST_SIMPLEX;
+                               probe_ent->_host_flags |= ATA_HOST_SIMPLEX;
                        probe_ent->port[p].bmdma_addr = bmdma;
                }
                ata_std_ports(&probe_ent->port[p]);
@@ -893,44 +867,48 @@ ata_pci_init_native_mode(struct pci_dev *pdev, struct ata_port_info **port, int
 
 
 static struct ata_probe_ent *ata_pci_init_legacy_port(struct pci_dev *pdev,
-                               struct ata_port_info *port, int port_num)
+                               struct ata_port_info **port, int port_mask)
 {
        struct ata_probe_ent *probe_ent;
-       unsigned long bmdma;
+       unsigned long bmdma = pci_resource_start(pdev, 4);
 
-       probe_ent = ata_probe_ent_alloc(pci_dev_to_dev(pdev), port);
+       probe_ent = ata_probe_ent_alloc(pci_dev_to_dev(pdev), port[0]);
        if (!probe_ent)
                return NULL;
 
-       probe_ent->legacy_mode = 1;
-       probe_ent->n_ports = 1;
-       probe_ent->hard_port_no = port_num;
-       probe_ent->private_data = port->private_data;
-
-       switch(port_num)
-       {
-               case 0:
-                       probe_ent->irq = 14;
-                       probe_ent->port[0].cmd_addr = 0x1f0;
-                       probe_ent->port[0].altstatus_addr =
-                       probe_ent->port[0].ctl_addr = 0x3f6;
-                       break;
-               case 1:
-                       probe_ent->irq = 15;
-                       probe_ent->port[0].cmd_addr = 0x170;
-                       probe_ent->port[0].altstatus_addr =
-                       probe_ent->port[0].ctl_addr = 0x376;
-                       break;
-       }
+       probe_ent->n_ports = 2;
+       probe_ent->private_data = port[0]->private_data;
 
-       bmdma = pci_resource_start(pdev, 4);
-       if (bmdma != 0) {
-               bmdma += 8 * port_num;
-               probe_ent->port[0].bmdma_addr = bmdma;
-               if (inb(bmdma + 2) & 0x80)
-                       probe_ent->host_set_flags |= ATA_HOST_SIMPLEX;
-       }
-       ata_std_ports(&probe_ent->port[0]);
+       if (port_mask & ATA_PORT_PRIMARY) {
+               probe_ent->irq = 14;
+               probe_ent->port[0].cmd_addr = ATA_PRIMARY_CMD;
+               probe_ent->port[0].altstatus_addr =
+               probe_ent->port[0].ctl_addr = ATA_PRIMARY_CTL;
+               if (bmdma) {
+                       probe_ent->port[0].bmdma_addr = bmdma;
+                       if (inb(bmdma + 2) & 0x80)
+                               probe_ent->_host_flags |= ATA_HOST_SIMPLEX;
+               }
+               ata_std_ports(&probe_ent->port[0]);
+       } else
+               probe_ent->dummy_port_mask |= ATA_PORT_PRIMARY;
+
+       if (port_mask & ATA_PORT_SECONDARY) {
+               if (probe_ent->irq)
+                       probe_ent->irq2 = 15;
+               else
+                       probe_ent->irq = 15;
+               probe_ent->port[1].cmd_addr = ATA_SECONDARY_CMD;
+               probe_ent->port[1].altstatus_addr =
+               probe_ent->port[1].ctl_addr = ATA_SECONDARY_CTL;
+               if (bmdma) {
+                       probe_ent->port[1].bmdma_addr = bmdma + 8;
+                       if (inb(bmdma + 10) & 0x80)
+                               probe_ent->_host_flags |= ATA_HOST_SIMPLEX;
+               }
+               ata_std_ports(&probe_ent->port[1]);
+       } else
+               probe_ent->dummy_port_mask |= ATA_PORT_SECONDARY;
 
        return probe_ent;
 }
@@ -950,6 +928,10 @@ static struct ata_probe_ent *ata_pci_init_legacy_port(struct pci_dev *pdev,
  *     regions, sets the dma mask, enables bus master mode, and calls
  *     ata_device_add()
  *
+ *     ASSUMPTION:
+ *     Nobody makes a single channel controller that appears solely as
+ *     the secondary legacy port on PCI.
+ *
  *     LOCKING:
  *     Inherited from PCI layer (may sleep).
  *
@@ -960,7 +942,7 @@ static struct ata_probe_ent *ata_pci_init_legacy_port(struct pci_dev *pdev,
 int ata_pci_init_one (struct pci_dev *pdev, struct ata_port_info **port_info,
                      unsigned int n_ports)
 {
-       struct ata_probe_ent *probe_ent = NULL, *probe_ent2 = NULL;
+       struct ata_probe_ent *probe_ent = NULL;
        struct ata_port_info *port[2];
        u8 tmp8, mask;
        unsigned int legacy_mode = 0;
@@ -975,7 +957,7 @@ int ata_pci_init_one (struct pci_dev *pdev, struct ata_port_info **port_info,
        else
                port[1] = port[0];
 
-       if ((port[0]->host_flags & ATA_FLAG_NO_LEGACY) == 0
+       if ((port[0]->flags & ATA_FLAG_NO_LEGACY) == 0
            && (pdev->class >> 8) == PCI_CLASS_STORAGE_IDE) {
                /* TODO: What if one channel is in native mode ... */
                pci_read_config_byte(pdev, PCI_CLASS_PROG, &tmp8);
@@ -1009,35 +991,34 @@ int ata_pci_init_one (struct pci_dev *pdev, struct ata_port_info **port_info,
                goto err_out;
        }
 
-       /* FIXME: Should use platform specific mappers for legacy port ranges */
        if (legacy_mode) {
-               if (!request_region(0x1f0, 8, "libata")) {
+               if (!request_region(ATA_PRIMARY_CMD, 8, "libata")) {
                        struct resource *conflict, res;
-                       res.start = 0x1f0;
-                       res.end = 0x1f0 + 8 - 1;
+                       res.start = ATA_PRIMARY_CMD;
+                       res.end = ATA_PRIMARY_CMD + 8 - 1;
                        conflict = ____request_resource(&ioport_resource, &res);
                        if (!strcmp(conflict->name, "libata"))
-                               legacy_mode |= (1 << 0);
+                               legacy_mode |= ATA_PORT_PRIMARY;
                        else {
                                disable_dev_on_err = 0;
-                               printk(KERN_WARNING "ata: 0x1f0 IDE port busy\n");
+                               printk(KERN_WARNING "ata: 0x%0X IDE port busy\n", ATA_PRIMARY_CMD);
                        }
                } else
-                       legacy_mode |= (1 << 0);
+                       legacy_mode |= ATA_PORT_PRIMARY;
 
-               if (!request_region(0x170, 8, "libata")) {
+               if (!request_region(ATA_SECONDARY_CMD, 8, "libata")) {
                        struct resource *conflict, res;
-                       res.start = 0x170;
-                       res.end = 0x170 + 8 - 1;
+                       res.start = ATA_SECONDARY_CMD;
+                       res.end = ATA_SECONDARY_CMD + 8 - 1;
                        conflict = ____request_resource(&ioport_resource, &res);
                        if (!strcmp(conflict->name, "libata"))
-                               legacy_mode |= (1 << 1);
+                               legacy_mode |= ATA_PORT_SECONDARY;
                        else {
                                disable_dev_on_err = 0;
-                               printk(KERN_WARNING "ata: 0x170 IDE port busy\n");
+                               printk(KERN_WARNING "ata: 0x%X IDE port busy\n", ATA_SECONDARY_CMD);
                        }
                } else
-                       legacy_mode |= (1 << 1);
+                       legacy_mode |= ATA_PORT_SECONDARY;
        }
 
        /* we have legacy mode, but all ports are unavailable */
@@ -1055,17 +1036,14 @@ int ata_pci_init_one (struct pci_dev *pdev, struct ata_port_info **port_info,
                goto err_out_regions;
 
        if (legacy_mode) {
-               if (legacy_mode & (1 << 0))
-                       probe_ent = ata_pci_init_legacy_port(pdev, port[0], 0);
-               if (legacy_mode & (1 << 1))
-                       probe_ent2 = ata_pci_init_legacy_port(pdev, port[1], 1);
+               probe_ent = ata_pci_init_legacy_port(pdev, port, legacy_mode);
        } else {
                if (n_ports == 2)
                        probe_ent = ata_pci_init_native_mode(pdev, port, ATA_PORT_PRIMARY | ATA_PORT_SECONDARY);
                else
                        probe_ent = ata_pci_init_native_mode(pdev, port, ATA_PORT_PRIMARY);
        }
-       if (!probe_ent && !probe_ent2) {
+       if (!probe_ent) {
                rc = -ENOMEM;
                goto err_out_regions;
        }
@@ -1073,35 +1051,17 @@ int ata_pci_init_one (struct pci_dev *pdev, struct ata_port_info **port_info,
        pci_set_master(pdev);
 
        /* FIXME: check ata_device_add return */
-       if (legacy_mode) {
-               struct device *dev = &pdev->dev;
-               struct ata_host_set *host_set = NULL;
-
-               if (legacy_mode & (1 << 0)) {
-                       ata_device_add(probe_ent);
-                       host_set = dev_get_drvdata(dev);
-               }
-
-               if (legacy_mode & (1 << 1)) {
-                       ata_device_add(probe_ent2);
-                       if (host_set) {
-                               host_set->next = dev_get_drvdata(dev);
-                               dev_set_drvdata(dev, host_set);
-                       }
-               }
-       } else
-               ata_device_add(probe_ent);
+       ata_device_add(probe_ent);
 
        kfree(probe_ent);
-       kfree(probe_ent2);
 
        return 0;
 
 err_out_regions:
-       if (legacy_mode & (1 << 0))
-               release_region(0x1f0, 8);
-       if (legacy_mode & (1 << 1))
-               release_region(0x170, 8);
+       if (legacy_mode & ATA_PORT_PRIMARY)
+               release_region(ATA_PRIMARY_CMD, 8);
+       if (legacy_mode & ATA_PORT_SECONDARY)
+               release_region(ATA_SECONDARY_CMD, 8);
        pci_release_regions(pdev);
 err_out:
        if (disable_dev_on_err)
similarity index 94%
rename from drivers/scsi/libata.h
rename to drivers/ata/libata.h
index c325679d9b545dc666496b941f91128d39a38546..a5ecb71390a919863029896fe68df162416c63b3 100644 (file)
@@ -69,6 +69,10 @@ extern int ata_flush_cache(struct ata_device *dev);
 extern void ata_dev_init(struct ata_device *dev);
 extern int ata_task_ioctl(struct scsi_device *scsidev, void __user *arg);
 extern int ata_cmd_ioctl(struct scsi_device *scsidev, void __user *arg);
+extern void ata_port_init(struct ata_port *ap, struct ata_host *host,
+                         const struct ata_probe_ent *ent, unsigned int port_no);
+extern struct ata_probe_ent *ata_probe_ent_alloc(struct device *dev,
+                                                const struct ata_port_info *port);
 
 
 /* libata-scsi.c */
@@ -107,6 +111,7 @@ extern void ata_scsi_rbuf_fill(struct ata_scsi_args *args,
                                            u8 *rbuf, unsigned int buflen));
 extern void ata_schedule_scsi_eh(struct Scsi_Host *shost);
 extern void ata_scsi_dev_rescan(void *data);
+extern int ata_bus_probe(struct ata_port *ap);
 
 /* libata-eh.c */
 extern enum scsi_eh_timer_return ata_scsi_timed_out(struct scsi_cmnd *cmd);
similarity index 93%
rename from drivers/scsi/pdc_adma.c
rename to drivers/ata/pdc_adma.c
index efc8fff1d25084ab1bce1b603cb5a6ebfbc81f57..912211ada8167319adda82f2e6026b8c0fd46a06 100644 (file)
@@ -127,7 +127,7 @@ static int adma_ata_init_one (struct pci_dev *pdev,
 static irqreturn_t adma_intr (int irq, void *dev_instance,
                                struct pt_regs *regs);
 static int adma_port_start(struct ata_port *ap);
-static void adma_host_stop(struct ata_host_set *host_set);
+static void adma_host_stop(struct ata_host *host);
 static void adma_port_stop(struct ata_port *ap);
 static void adma_phy_reset(struct ata_port *ap);
 static void adma_qc_prep(struct ata_queued_cmd *qc);
@@ -182,7 +182,7 @@ static struct ata_port_info adma_port_info[] = {
        /* board_1841_idx */
        {
                .sht            = &adma_ata_sht,
-               .host_flags     = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST |
+               .flags          = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST |
                                  ATA_FLAG_NO_LEGACY | ATA_FLAG_MMIO |
                                  ATA_FLAG_PIO_POLLING,
                .pio_mask       = 0x10, /* pio4 */
@@ -237,7 +237,7 @@ static void adma_reset_engine(void __iomem *chan)
 static void adma_reinit_engine(struct ata_port *ap)
 {
        struct adma_port_priv *pp = ap->private_data;
-       void __iomem *mmio_base = ap->host_set->mmio_base;
+       void __iomem *mmio_base = ap->host->mmio_base;
        void __iomem *chan = ADMA_REGS(mmio_base, ap->port_no);
 
        /* mask/clear ATA interrupts */
@@ -265,7 +265,7 @@ static void adma_reinit_engine(struct ata_port *ap)
 
 static inline void adma_enter_reg_mode(struct ata_port *ap)
 {
-       void __iomem *chan = ADMA_REGS(ap->host_set->mmio_base, ap->port_no);
+       void __iomem *chan = ADMA_REGS(ap->host->mmio_base, ap->port_no);
 
        writew(aPIOMD4, chan + ADMA_CONTROL);
        readb(chan + ADMA_STATUS);      /* flush */
@@ -412,7 +412,7 @@ static void adma_qc_prep(struct ata_queued_cmd *qc)
 static inline void adma_packet_start(struct ata_queued_cmd *qc)
 {
        struct ata_port *ap = qc->ap;
-       void __iomem *chan = ADMA_REGS(ap->host_set->mmio_base, ap->port_no);
+       void __iomem *chan = ADMA_REGS(ap->host->mmio_base, ap->port_no);
 
        VPRINTK("ENTER, ap %p\n", ap);
 
@@ -442,13 +442,13 @@ static unsigned int adma_qc_issue(struct ata_queued_cmd *qc)
        return ata_qc_issue_prot(qc);
 }
 
-static inline unsigned int adma_intr_pkt(struct ata_host_set *host_set)
+static inline unsigned int adma_intr_pkt(struct ata_host *host)
 {
        unsigned int handled = 0, port_no;
-       u8 __iomem *mmio_base = host_set->mmio_base;
+       u8 __iomem *mmio_base = host->mmio_base;
 
-       for (port_no = 0; port_no < host_set->n_ports; ++port_no) {
-               struct ata_port *ap = host_set->ports[port_no];
+       for (port_no = 0; port_no < host->n_ports; ++port_no) {
+               struct ata_port *ap = host->ports[port_no];
                struct adma_port_priv *pp;
                struct ata_queued_cmd *qc;
                void __iomem *chan = ADMA_REGS(mmio_base, port_no);
@@ -476,13 +476,13 @@ static inline unsigned int adma_intr_pkt(struct ata_host_set *host_set)
        return handled;
 }
 
-static inline unsigned int adma_intr_mmio(struct ata_host_set *host_set)
+static inline unsigned int adma_intr_mmio(struct ata_host *host)
 {
        unsigned int handled = 0, port_no;
 
-       for (port_no = 0; port_no < host_set->n_ports; ++port_no) {
+       for (port_no = 0; port_no < host->n_ports; ++port_no) {
                struct ata_port *ap;
-               ap = host_set->ports[port_no];
+               ap = host->ports[port_no];
                if (ap && (!(ap->flags & ATA_FLAG_DISABLED))) {
                        struct ata_queued_cmd *qc;
                        struct adma_port_priv *pp = ap->private_data;
@@ -511,14 +511,14 @@ static inline unsigned int adma_intr_mmio(struct ata_host_set *host_set)
 
 static irqreturn_t adma_intr(int irq, void *dev_instance, struct pt_regs *regs)
 {
-       struct ata_host_set *host_set = dev_instance;
+       struct ata_host *host = dev_instance;
        unsigned int handled = 0;
 
        VPRINTK("ENTER\n");
 
-       spin_lock(&host_set->lock);
-       handled  = adma_intr_pkt(host_set) | adma_intr_mmio(host_set);
-       spin_unlock(&host_set->lock);
+       spin_lock(&host->lock);
+       handled  = adma_intr_pkt(host) | adma_intr_mmio(host);
+       spin_unlock(&host->lock);
 
        VPRINTK("EXIT\n");
 
@@ -544,7 +544,7 @@ static void adma_ata_setup_port(struct ata_ioports *port, unsigned long base)
 
 static int adma_port_start(struct ata_port *ap)
 {
-       struct device *dev = ap->host_set->dev;
+       struct device *dev = ap->host->dev;
        struct adma_port_priv *pp;
        int rc;
 
@@ -582,10 +582,10 @@ err_out:
 
 static void adma_port_stop(struct ata_port *ap)
 {
-       struct device *dev = ap->host_set->dev;
+       struct device *dev = ap->host->dev;
        struct adma_port_priv *pp = ap->private_data;
 
-       adma_reset_engine(ADMA_REGS(ap->host_set->mmio_base, ap->port_no));
+       adma_reset_engine(ADMA_REGS(ap->host->mmio_base, ap->port_no));
        if (pp != NULL) {
                ap->private_data = NULL;
                if (pp->pkt != NULL)
@@ -596,14 +596,14 @@ static void adma_port_stop(struct ata_port *ap)
        ata_port_stop(ap);
 }
 
-static void adma_host_stop(struct ata_host_set *host_set)
+static void adma_host_stop(struct ata_host *host)
 {
        unsigned int port_no;
 
        for (port_no = 0; port_no < ADMA_PORTS; ++port_no)
-               adma_reset_engine(ADMA_REGS(host_set->mmio_base, port_no));
+               adma_reset_engine(ADMA_REGS(host->mmio_base, port_no));
 
-       ata_pci_host_stop(host_set);
+       ata_pci_host_stop(host);
 }
 
 static void adma_host_init(unsigned int chip_id,
@@ -684,7 +684,7 @@ static int adma_ata_init_one(struct pci_dev *pdev,
        INIT_LIST_HEAD(&probe_ent->node);
 
        probe_ent->sht          = adma_port_info[board_idx].sht;
-       probe_ent->host_flags   = adma_port_info[board_idx].host_flags;
+       probe_ent->port_flags   = adma_port_info[board_idx].flags;
        probe_ent->pio_mask     = adma_port_info[board_idx].pio_mask;
        probe_ent->mwdma_mask   = adma_port_info[board_idx].mwdma_mask;
        probe_ent->udma_mask    = adma_port_info[board_idx].udma_mask;
@@ -722,7 +722,7 @@ err_out:
 
 static int __init adma_ata_init(void)
 {
-       return pci_module_init(&adma_ata_pci_driver);
+       return pci_register_driver(&adma_ata_pci_driver);
 }
 
 static void __exit adma_ata_exit(void)
similarity index 96%
rename from drivers/scsi/sata_mv.c
rename to drivers/ata/sata_mv.c
index 1053c7c76b7db9fc3b3218b1173d217fda1198d4..34f1939b44c90860213b103b59d7670d9ab3ae20 100644 (file)
@@ -342,7 +342,7 @@ static u32 mv5_scr_read(struct ata_port *ap, unsigned int sc_reg_in);
 static void mv5_scr_write(struct ata_port *ap, unsigned int sc_reg_in, u32 val);
 static void mv_phy_reset(struct ata_port *ap);
 static void __mv_phy_reset(struct ata_port *ap, int can_sleep);
-static void mv_host_stop(struct ata_host_set *host_set);
+static void mv_host_stop(struct ata_host *host);
 static int mv_port_start(struct ata_port *ap);
 static void mv_port_stop(struct ata_port *ap);
 static void mv_qc_prep(struct ata_queued_cmd *qc);
@@ -480,35 +480,35 @@ static const struct ata_port_operations mv_iie_ops = {
 static const struct ata_port_info mv_port_info[] = {
        {  /* chip_504x */
                .sht            = &mv_sht,
-               .host_flags     = MV_COMMON_FLAGS,
+               .flags          = MV_COMMON_FLAGS,
                .pio_mask       = 0x1f, /* pio0-4 */
                .udma_mask      = 0x7f, /* udma0-6 */
                .port_ops       = &mv5_ops,
        },
        {  /* chip_508x */
                .sht            = &mv_sht,
-               .host_flags     = (MV_COMMON_FLAGS | MV_FLAG_DUAL_HC),
+               .flags          = (MV_COMMON_FLAGS | MV_FLAG_DUAL_HC),
                .pio_mask       = 0x1f, /* pio0-4 */
                .udma_mask      = 0x7f, /* udma0-6 */
                .port_ops       = &mv5_ops,
        },
        {  /* chip_5080 */
                .sht            = &mv_sht,
-               .host_flags     = (MV_COMMON_FLAGS | MV_FLAG_DUAL_HC),
+               .flags          = (MV_COMMON_FLAGS | MV_FLAG_DUAL_HC),
                .pio_mask       = 0x1f, /* pio0-4 */
                .udma_mask      = 0x7f, /* udma0-6 */
                .port_ops       = &mv5_ops,
        },
        {  /* chip_604x */
                .sht            = &mv_sht,
-               .host_flags     = (MV_COMMON_FLAGS | MV_6XXX_FLAGS),
+               .flags          = (MV_COMMON_FLAGS | MV_6XXX_FLAGS),
                .pio_mask       = 0x1f, /* pio0-4 */
                .udma_mask      = 0x7f, /* udma0-6 */
                .port_ops       = &mv6_ops,
        },
        {  /* chip_608x */
                .sht            = &mv_sht,
-               .host_flags     = (MV_COMMON_FLAGS | MV_6XXX_FLAGS |
+               .flags          = (MV_COMMON_FLAGS | MV_6XXX_FLAGS |
                                   MV_FLAG_DUAL_HC),
                .pio_mask       = 0x1f, /* pio0-4 */
                .udma_mask      = 0x7f, /* udma0-6 */
@@ -516,14 +516,14 @@ static const struct ata_port_info mv_port_info[] = {
        },
        {  /* chip_6042 */
                .sht            = &mv_sht,
-               .host_flags     = (MV_COMMON_FLAGS | MV_6XXX_FLAGS),
+               .flags          = (MV_COMMON_FLAGS | MV_6XXX_FLAGS),
                .pio_mask       = 0x1f, /* pio0-4 */
                .udma_mask      = 0x7f, /* udma0-6 */
                .port_ops       = &mv_iie_ops,
        },
        {  /* chip_7042 */
                .sht            = &mv_sht,
-               .host_flags     = (MV_COMMON_FLAGS | MV_6XXX_FLAGS |
+               .flags          = (MV_COMMON_FLAGS | MV_6XXX_FLAGS |
                                   MV_FLAG_DUAL_HC),
                .pio_mask       = 0x1f, /* pio0-4 */
                .udma_mask      = 0x7f, /* udma0-6 */
@@ -618,12 +618,12 @@ static inline void __iomem *mv_port_base(void __iomem *base, unsigned int port)
 
 static inline void __iomem *mv_ap_base(struct ata_port *ap)
 {
-       return mv_port_base(ap->host_set->mmio_base, ap->port_no);
+       return mv_port_base(ap->host->mmio_base, ap->port_no);
 }
 
-static inline int mv_get_hc_count(unsigned long host_flags)
+static inline int mv_get_hc_count(unsigned long port_flags)
 {
-       return ((host_flags & MV_FLAG_DUAL_HC) ? 2 : 1);
+       return ((port_flags & MV_FLAG_DUAL_HC) ? 2 : 1);
 }
 
 static void mv_irq_clear(struct ata_port *ap)
@@ -809,7 +809,7 @@ static void mv_scr_write(struct ata_port *ap, unsigned int sc_reg_in, u32 val)
 
 /**
  *      mv_host_stop - Host specific cleanup/stop routine.
- *      @host_set: host data structure
+ *      @host: host data structure
  *
  *      Disable ints, cleanup host memory, call general purpose
  *      host_stop.
@@ -817,10 +817,10 @@ static void mv_scr_write(struct ata_port *ap, unsigned int sc_reg_in, u32 val)
  *      LOCKING:
  *      Inherited from caller.
  */
-static void mv_host_stop(struct ata_host_set *host_set)
+static void mv_host_stop(struct ata_host *host)
 {
-       struct mv_host_priv *hpriv = host_set->private_data;
-       struct pci_dev *pdev = to_pci_dev(host_set->dev);
+       struct mv_host_priv *hpriv = host->private_data;
+       struct pci_dev *pdev = to_pci_dev(host->dev);
 
        if (hpriv->hp_flags & MV_HP_FLAG_MSI) {
                pci_disable_msi(pdev);
@@ -828,7 +828,7 @@ static void mv_host_stop(struct ata_host_set *host_set)
                pci_intx(pdev, 0);
        }
        kfree(hpriv);
-       ata_host_stop(host_set);
+       ata_host_stop(host);
 }
 
 static inline void mv_priv_free(struct mv_port_priv *pp, struct device *dev)
@@ -875,8 +875,8 @@ static void mv_edma_cfg(struct mv_host_priv *hpriv, void __iomem *port_mmio)
  */
 static int mv_port_start(struct ata_port *ap)
 {
-       struct device *dev = ap->host_set->dev;
-       struct mv_host_priv *hpriv = ap->host_set->private_data;
+       struct device *dev = ap->host->dev;
+       struct mv_host_priv *hpriv = ap->host->private_data;
        struct mv_port_priv *pp;
        void __iomem *port_mmio = mv_ap_base(ap);
        void *mem;
@@ -965,17 +965,17 @@ err_out:
  *      Stop DMA, cleanup port memory.
  *
  *      LOCKING:
- *      This routine uses the host_set lock to protect the DMA stop.
+ *      This routine uses the host lock to protect the DMA stop.
  */
 static void mv_port_stop(struct ata_port *ap)
 {
-       struct device *dev = ap->host_set->dev;
+       struct device *dev = ap->host->dev;
        struct mv_port_priv *pp = ap->private_data;
        unsigned long flags;
 
-       spin_lock_irqsave(&ap->host_set->lock, flags);
+       spin_lock_irqsave(&ap->host->lock, flags);
        mv_stop_dma(ap);
-       spin_unlock_irqrestore(&ap->host_set->lock, flags);
+       spin_unlock_irqrestore(&ap->host->lock, flags);
 
        ap->private_data = NULL;
        ata_pad_free(ap, dev);
@@ -1330,7 +1330,7 @@ static void mv_err_intr(struct ata_port *ap, int reset_allowed)
 
 /**
  *      mv_host_intr - Handle all interrupts on the given host controller
- *      @host_set: host specific structure
+ *      @host: host specific structure
  *      @relevant: port error bits relevant to this host controller
  *      @hc: which host controller we're to look at
  *
@@ -1344,10 +1344,9 @@ static void mv_err_intr(struct ata_port *ap, int reset_allowed)
  *      LOCKING:
  *      Inherited from caller.
  */
-static void mv_host_intr(struct ata_host_set *host_set, u32 relevant,
-                        unsigned int hc)
+static void mv_host_intr(struct ata_host *host, u32 relevant, unsigned int hc)
 {
-       void __iomem *mmio = host_set->mmio_base;
+       void __iomem *mmio = host->mmio_base;
        void __iomem *hc_mmio = mv_hc_base(mmio, hc);
        struct ata_queued_cmd *qc;
        u32 hc_irq_cause;
@@ -1371,7 +1370,7 @@ static void mv_host_intr(struct ata_host_set *host_set, u32 relevant,
 
        for (port = port0; port < port0 + MV_PORTS_PER_HC; port++) {
                u8 ata_status = 0;
-               struct ata_port *ap = host_set->ports[port];
+               struct ata_port *ap = host->ports[port];
                struct mv_port_priv *pp = ap->private_data;
 
                hard_port = mv_hardport_from_port(port); /* range 0..3 */
@@ -1444,15 +1443,15 @@ static void mv_host_intr(struct ata_host_set *host_set, u32 relevant,
  *      reported here.
  *
  *      LOCKING:
- *      This routine holds the host_set lock while processing pending
+ *      This routine holds the host lock while processing pending
  *      interrupts.
  */
 static irqreturn_t mv_interrupt(int irq, void *dev_instance,
                                struct pt_regs *regs)
 {
-       struct ata_host_set *host_set = dev_instance;
+       struct ata_host *host = dev_instance;
        unsigned int hc, handled = 0, n_hcs;
-       void __iomem *mmio = host_set->mmio_base;
+       void __iomem *mmio = host->mmio_base;
        struct mv_host_priv *hpriv;
        u32 irq_stat;
 
@@ -1465,18 +1464,18 @@ static irqreturn_t mv_interrupt(int irq, void *dev_instance,
                return IRQ_NONE;
        }
 
-       n_hcs = mv_get_hc_count(host_set->ports[0]->flags);
-       spin_lock(&host_set->lock);
+       n_hcs = mv_get_hc_count(host->ports[0]->flags);
+       spin_lock(&host->lock);
 
        for (hc = 0; hc < n_hcs; hc++) {
                u32 relevant = irq_stat & (HC0_IRQ_PEND << (hc * HC_SHIFT));
                if (relevant) {
-                       mv_host_intr(host_set, relevant, hc);
+                       mv_host_intr(host, relevant, hc);
                        handled++;
                }
        }
 
-       hpriv = host_set->private_data;
+       hpriv = host->private_data;
        if (IS_60XX(hpriv)) {
                /* deal with the interrupt coalescing bits */
                if (irq_stat & (TRAN_LO_DONE | TRAN_HI_DONE | PORTS_0_7_COAL_DONE)) {
@@ -1491,12 +1490,12 @@ static irqreturn_t mv_interrupt(int irq, void *dev_instance,
                       readl(mmio + PCI_IRQ_CAUSE_OFS));
 
                DPRINTK("All regs @ PCI error\n");
-               mv_dump_all_regs(mmio, -1, to_pci_dev(host_set->dev));
+               mv_dump_all_regs(mmio, -1, to_pci_dev(host->dev));
 
                writelfl(0, mmio + PCI_IRQ_CAUSE_OFS);
                handled++;
        }
-       spin_unlock(&host_set->lock);
+       spin_unlock(&host->lock);
 
        return IRQ_RETVAL(handled);
 }
@@ -1528,7 +1527,7 @@ static unsigned int mv5_scr_offset(unsigned int sc_reg_in)
 
 static u32 mv5_scr_read(struct ata_port *ap, unsigned int sc_reg_in)
 {
-       void __iomem *mmio = mv5_phy_base(ap->host_set->mmio_base, ap->port_no);
+       void __iomem *mmio = mv5_phy_base(ap->host->mmio_base, ap->port_no);
        unsigned int ofs = mv5_scr_offset(sc_reg_in);
 
        if (ofs != 0xffffffffU)
@@ -1539,7 +1538,7 @@ static u32 mv5_scr_read(struct ata_port *ap, unsigned int sc_reg_in)
 
 static void mv5_scr_write(struct ata_port *ap, unsigned int sc_reg_in, u32 val)
 {
-       void __iomem *mmio = mv5_phy_base(ap->host_set->mmio_base, ap->port_no);
+       void __iomem *mmio = mv5_phy_base(ap->host->mmio_base, ap->port_no);
        unsigned int ofs = mv5_scr_offset(sc_reg_in);
 
        if (ofs != 0xffffffffU)
@@ -1904,8 +1903,8 @@ static void mv_channel_reset(struct mv_host_priv *hpriv, void __iomem *mmio,
 
 static void mv_stop_and_reset(struct ata_port *ap)
 {
-       struct mv_host_priv *hpriv = ap->host_set->private_data;
-       void __iomem *mmio = ap->host_set->mmio_base;
+       struct mv_host_priv *hpriv = ap->host->private_data;
+       void __iomem *mmio = ap->host->mmio_base;
 
        mv_stop_dma(ap);
 
@@ -1936,7 +1935,7 @@ static inline void __msleep(unsigned int msec, int can_sleep)
 static void __mv_phy_reset(struct ata_port *ap, int can_sleep)
 {
        struct mv_port_priv *pp = ap->private_data;
-       struct mv_host_priv *hpriv = ap->host_set->private_data;
+       struct mv_host_priv *hpriv = ap->host->private_data;
        void __iomem *port_mmio = mv_ap_base(ap);
        struct ata_taskfile tf;
        struct ata_device *dev = &ap->device[0];
@@ -2035,7 +2034,7 @@ static void mv_phy_reset(struct ata_port *ap)
  *      chip/bus, fail the command, and move on.
  *
  *      LOCKING:
- *      This routine holds the host_set lock while failing the command.
+ *      This routine holds the host lock while failing the command.
  */
 static void mv_eng_timeout(struct ata_port *ap)
 {
@@ -2044,18 +2043,17 @@ static void mv_eng_timeout(struct ata_port *ap)
 
        ata_port_printk(ap, KERN_ERR, "Entering mv_eng_timeout\n");
        DPRINTK("All regs @ start of eng_timeout\n");
-       mv_dump_all_regs(ap->host_set->mmio_base, ap->port_no,
-                        to_pci_dev(ap->host_set->dev));
+       mv_dump_all_regs(ap->host->mmio_base, ap->port_no,
+                        to_pci_dev(ap->host->dev));
 
        qc = ata_qc_from_tag(ap, ap->active_tag);
         printk(KERN_ERR "mmio_base %p ap %p qc %p scsi_cmnd %p &cmnd %p\n",
-              ap->host_set->mmio_base, ap, qc, qc->scsicmd,
-              &qc->scsicmd->cmnd);
+              ap->host->mmio_base, ap, qc, qc->scsicmd, &qc->scsicmd->cmnd);
 
-       spin_lock_irqsave(&ap->host_set->lock, flags);
+       spin_lock_irqsave(&ap->host->lock, flags);
        mv_err_intr(ap, 0);
        mv_stop_and_reset(ap);
-       spin_unlock_irqrestore(&ap->host_set->lock, flags);
+       spin_unlock_irqrestore(&ap->host->lock, flags);
 
        WARN_ON(!(qc->flags & ATA_QCFLAG_ACTIVE));
        if (qc->flags & ATA_QCFLAG_ACTIVE) {
@@ -2236,7 +2234,7 @@ static int mv_init_host(struct pci_dev *pdev, struct ata_probe_ent *probe_ent,
        if (rc)
                goto done;
 
-       n_hc = mv_get_hc_count(probe_ent->host_flags);
+       n_hc = mv_get_hc_count(probe_ent->port_flags);
        probe_ent->n_ports = MV_PORTS_PER_HC * n_hc;
 
        for (port = 0; port < probe_ent->n_ports; port++)
@@ -2389,7 +2387,7 @@ static int mv_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
        memset(hpriv, 0, sizeof(*hpriv));
 
        probe_ent->sht = mv_port_info[board_idx].sht;
-       probe_ent->host_flags = mv_port_info[board_idx].host_flags;
+       probe_ent->port_flags = mv_port_info[board_idx].flags;
        probe_ent->pio_mask = mv_port_info[board_idx].pio_mask;
        probe_ent->udma_mask = mv_port_info[board_idx].udma_mask;
        probe_ent->port_ops = mv_port_info[board_idx].port_ops;
@@ -2447,7 +2445,7 @@ err_out:
 
 static int __init mv_init(void)
 {
-       return pci_module_init(&mv_pci_driver);
+       return pci_register_driver(&mv_pci_driver);
 }
 
 static void __exit mv_exit(void)
similarity index 91%
rename from drivers/scsi/sata_nv.c
rename to drivers/ata/sata_nv.c
index 56da25581f31a345486229e187bd7077784f6949..27c22feebf306170ea278000637548ec9c1b1993 100644 (file)
@@ -81,7 +81,7 @@ enum {
 };
 
 static int nv_init_one (struct pci_dev *pdev, const struct pci_device_id *ent);
-static void nv_ck804_host_stop(struct ata_host_set *host_set);
+static void nv_ck804_host_stop(struct ata_host *host);
 static irqreturn_t nv_generic_interrupt(int irq, void *dev_instance,
                                        struct pt_regs *regs);
 static irqreturn_t nv_nf2_interrupt(int irq, void *dev_instance,
@@ -257,7 +257,7 @@ static struct ata_port_info nv_port_info[] = {
        /* generic */
        {
                .sht            = &nv_sht,
-               .host_flags     = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY,
+               .flags          = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY,
                .pio_mask       = NV_PIO_MASK,
                .mwdma_mask     = NV_MWDMA_MASK,
                .udma_mask      = NV_UDMA_MASK,
@@ -266,7 +266,7 @@ static struct ata_port_info nv_port_info[] = {
        /* nforce2/3 */
        {
                .sht            = &nv_sht,
-               .host_flags     = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY,
+               .flags          = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY,
                .pio_mask       = NV_PIO_MASK,
                .mwdma_mask     = NV_MWDMA_MASK,
                .udma_mask      = NV_UDMA_MASK,
@@ -275,7 +275,7 @@ static struct ata_port_info nv_port_info[] = {
        /* ck804 */
        {
                .sht            = &nv_sht,
-               .host_flags     = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY,
+               .flags          = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY,
                .pio_mask       = NV_PIO_MASK,
                .mwdma_mask     = NV_MWDMA_MASK,
                .udma_mask      = NV_UDMA_MASK,
@@ -292,17 +292,17 @@ MODULE_VERSION(DRV_VERSION);
 static irqreturn_t nv_generic_interrupt(int irq, void *dev_instance,
                                        struct pt_regs *regs)
 {
-       struct ata_host_set *host_set = dev_instance;
+       struct ata_host *host = dev_instance;
        unsigned int i;
        unsigned int handled = 0;
        unsigned long flags;
 
-       spin_lock_irqsave(&host_set->lock, flags);
+       spin_lock_irqsave(&host->lock, flags);
 
-       for (i = 0; i < host_set->n_ports; i++) {
+       for (i = 0; i < host->n_ports; i++) {
                struct ata_port *ap;
 
-               ap = host_set->ports[i];
+               ap = host->ports[i];
                if (ap &&
                    !(ap->flags & ATA_FLAG_DISABLED)) {
                        struct ata_queued_cmd *qc;
@@ -318,7 +318,7 @@ static irqreturn_t nv_generic_interrupt(int irq, void *dev_instance,
 
        }
 
-       spin_unlock_irqrestore(&host_set->lock, flags);
+       spin_unlock_irqrestore(&host->lock, flags);
 
        return IRQ_RETVAL(handled);
 }
@@ -354,12 +354,12 @@ static int nv_host_intr(struct ata_port *ap, u8 irq_stat)
        return 1;
 }
 
-static irqreturn_t nv_do_interrupt(struct ata_host_set *host_set, u8 irq_stat)
+static irqreturn_t nv_do_interrupt(struct ata_host *host, u8 irq_stat)
 {
        int i, handled = 0;
 
-       for (i = 0; i < host_set->n_ports; i++) {
-               struct ata_port *ap = host_set->ports[i];
+       for (i = 0; i < host->n_ports; i++) {
+               struct ata_port *ap = host->ports[i];
 
                if (ap && !(ap->flags & ATA_FLAG_DISABLED))
                        handled += nv_host_intr(ap, irq_stat);
@@ -373,14 +373,14 @@ static irqreturn_t nv_do_interrupt(struct ata_host_set *host_set, u8 irq_stat)
 static irqreturn_t nv_nf2_interrupt(int irq, void *dev_instance,
                                    struct pt_regs *regs)
 {
-       struct ata_host_set *host_set = dev_instance;
+       struct ata_host *host = dev_instance;
        u8 irq_stat;
        irqreturn_t ret;
 
-       spin_lock(&host_set->lock);
-       irq_stat = inb(host_set->ports[0]->ioaddr.scr_addr + NV_INT_STATUS);
-       ret = nv_do_interrupt(host_set, irq_stat);
-       spin_unlock(&host_set->lock);
+       spin_lock(&host->lock);
+       irq_stat = inb(host->ports[0]->ioaddr.scr_addr + NV_INT_STATUS);
+       ret = nv_do_interrupt(host, irq_stat);
+       spin_unlock(&host->lock);
 
        return ret;
 }
@@ -388,14 +388,14 @@ static irqreturn_t nv_nf2_interrupt(int irq, void *dev_instance,
 static irqreturn_t nv_ck804_interrupt(int irq, void *dev_instance,
                                      struct pt_regs *regs)
 {
-       struct ata_host_set *host_set = dev_instance;
+       struct ata_host *host = dev_instance;
        u8 irq_stat;
        irqreturn_t ret;
 
-       spin_lock(&host_set->lock);
-       irq_stat = readb(host_set->mmio_base + NV_INT_STATUS_CK804);
-       ret = nv_do_interrupt(host_set, irq_stat);
-       spin_unlock(&host_set->lock);
+       spin_lock(&host->lock);
+       irq_stat = readb(host->mmio_base + NV_INT_STATUS_CK804);
+       ret = nv_do_interrupt(host, irq_stat);
+       spin_unlock(&host->lock);
 
        return ret;
 }
@@ -418,7 +418,7 @@ static void nv_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val)
 
 static void nv_nf2_freeze(struct ata_port *ap)
 {
-       unsigned long scr_addr = ap->host_set->ports[0]->ioaddr.scr_addr;
+       unsigned long scr_addr = ap->host->ports[0]->ioaddr.scr_addr;
        int shift = ap->port_no * NV_INT_PORT_SHIFT;
        u8 mask;
 
@@ -429,7 +429,7 @@ static void nv_nf2_freeze(struct ata_port *ap)
 
 static void nv_nf2_thaw(struct ata_port *ap)
 {
-       unsigned long scr_addr = ap->host_set->ports[0]->ioaddr.scr_addr;
+       unsigned long scr_addr = ap->host->ports[0]->ioaddr.scr_addr;
        int shift = ap->port_no * NV_INT_PORT_SHIFT;
        u8 mask;
 
@@ -442,7 +442,7 @@ static void nv_nf2_thaw(struct ata_port *ap)
 
 static void nv_ck804_freeze(struct ata_port *ap)
 {
-       void __iomem *mmio_base = ap->host_set->mmio_base;
+       void __iomem *mmio_base = ap->host->mmio_base;
        int shift = ap->port_no * NV_INT_PORT_SHIFT;
        u8 mask;
 
@@ -453,7 +453,7 @@ static void nv_ck804_freeze(struct ata_port *ap)
 
 static void nv_ck804_thaw(struct ata_port *ap)
 {
-       void __iomem *mmio_base = ap->host_set->mmio_base;
+       void __iomem *mmio_base = ap->host->mmio_base;
        int shift = ap->port_no * NV_INT_PORT_SHIFT;
        u8 mask;
 
@@ -568,9 +568,9 @@ err_out:
        return rc;
 }
 
-static void nv_ck804_host_stop(struct ata_host_set *host_set)
+static void nv_ck804_host_stop(struct ata_host *host)
 {
-       struct pci_dev *pdev = to_pci_dev(host_set->dev);
+       struct pci_dev *pdev = to_pci_dev(host->dev);
        u8 regval;
 
        /* disable SATA space for CK804 */
@@ -578,12 +578,12 @@ static void nv_ck804_host_stop(struct ata_host_set *host_set)
        regval &= ~NV_MCP_SATA_CFG_20_SATA_SPACE_EN;
        pci_write_config_byte(pdev, NV_MCP_SATA_CFG_20, regval);
 
-       ata_pci_host_stop(host_set);
+       ata_pci_host_stop(host);
 }
 
 static int __init nv_init(void)
 {
-       return pci_module_init(&nv_pci_driver);
+       return pci_register_driver(&nv_pci_driver);
 }
 
 static void __exit nv_exit(void)
similarity index 93%
rename from drivers/scsi/sata_promise.c
rename to drivers/ata/sata_promise.c
index 4776f4e55839022303c8dba80e7ca4ec76ddf368..d627812ea73d3bf5d81629d3a94be308de950d2e 100644 (file)
@@ -104,7 +104,7 @@ static void pdc_tf_load_mmio(struct ata_port *ap, const struct ata_taskfile *tf)
 static void pdc_exec_command_mmio(struct ata_port *ap, const struct ata_taskfile *tf);
 static void pdc_irq_clear(struct ata_port *ap);
 static unsigned int pdc_qc_issue_prot(struct ata_queued_cmd *qc);
-static void pdc_host_stop(struct ata_host_set *host_set);
+static void pdc_host_stop(struct ata_host *host);
 
 
 static struct scsi_host_template pdc_ata_sht = {
@@ -175,7 +175,7 @@ static const struct ata_port_info pdc_port_info[] = {
        /* board_2037x */
        {
                .sht            = &pdc_ata_sht,
-               .host_flags     = PDC_COMMON_FLAGS | ATA_FLAG_SATA,
+               .flags          = PDC_COMMON_FLAGS | ATA_FLAG_SATA,
                .pio_mask       = 0x1f, /* pio0-4 */
                .mwdma_mask     = 0x07, /* mwdma0-2 */
                .udma_mask      = 0x7f, /* udma0-6 ; FIXME */
@@ -185,7 +185,7 @@ static const struct ata_port_info pdc_port_info[] = {
        /* board_20319 */
        {
                .sht            = &pdc_ata_sht,
-               .host_flags     = PDC_COMMON_FLAGS | ATA_FLAG_SATA,
+               .flags          = PDC_COMMON_FLAGS | ATA_FLAG_SATA,
                .pio_mask       = 0x1f, /* pio0-4 */
                .mwdma_mask     = 0x07, /* mwdma0-2 */
                .udma_mask      = 0x7f, /* udma0-6 ; FIXME */
@@ -195,7 +195,7 @@ static const struct ata_port_info pdc_port_info[] = {
        /* board_20619 */
        {
                .sht            = &pdc_ata_sht,
-               .host_flags     = PDC_COMMON_FLAGS | ATA_FLAG_SLAVE_POSS,
+               .flags          = PDC_COMMON_FLAGS | ATA_FLAG_SLAVE_POSS,
                .pio_mask       = 0x1f, /* pio0-4 */
                .mwdma_mask     = 0x07, /* mwdma0-2 */
                .udma_mask      = 0x7f, /* udma0-6 ; FIXME */
@@ -205,7 +205,7 @@ static const struct ata_port_info pdc_port_info[] = {
        /* board_20771 */
        {
                .sht            = &pdc_ata_sht,
-               .host_flags     = PDC_COMMON_FLAGS | ATA_FLAG_SATA,
+               .flags          = PDC_COMMON_FLAGS | ATA_FLAG_SATA,
                .pio_mask       = 0x1f, /* pio0-4 */
                .mwdma_mask     = 0x07, /* mwdma0-2 */
                .udma_mask      = 0x7f, /* udma0-6 ; FIXME */
@@ -215,7 +215,7 @@ static const struct ata_port_info pdc_port_info[] = {
        /* board_2057x */
        {
                .sht            = &pdc_ata_sht,
-               .host_flags     = PDC_COMMON_FLAGS | ATA_FLAG_SATA,
+               .flags          = PDC_COMMON_FLAGS | ATA_FLAG_SATA,
                .pio_mask       = 0x1f, /* pio0-4 */
                .mwdma_mask     = 0x07, /* mwdma0-2 */
                .udma_mask      = 0x7f, /* udma0-6 ; FIXME */
@@ -225,7 +225,7 @@ static const struct ata_port_info pdc_port_info[] = {
        /* board_40518 */
        {
                .sht            = &pdc_ata_sht,
-               .host_flags     = PDC_COMMON_FLAGS | ATA_FLAG_SATA,
+               .flags          = PDC_COMMON_FLAGS | ATA_FLAG_SATA,
                .pio_mask       = 0x1f, /* pio0-4 */
                .mwdma_mask     = 0x07, /* mwdma0-2 */
                .udma_mask      = 0x7f, /* udma0-6 ; FIXME */
@@ -292,7 +292,7 @@ static struct pci_driver pdc_ata_pci_driver = {
 
 static int pdc_port_start(struct ata_port *ap)
 {
-       struct device *dev = ap->host_set->dev;
+       struct device *dev = ap->host->dev;
        struct pdc_port_priv *pp;
        int rc;
 
@@ -326,7 +326,7 @@ err_out:
 
 static void pdc_port_stop(struct ata_port *ap)
 {
-       struct device *dev = ap->host_set->dev;
+       struct device *dev = ap->host->dev;
        struct pdc_port_priv *pp = ap->private_data;
 
        ap->private_data = NULL;
@@ -336,11 +336,11 @@ static void pdc_port_stop(struct ata_port *ap)
 }
 
 
-static void pdc_host_stop(struct ata_host_set *host_set)
+static void pdc_host_stop(struct ata_host *host)
 {
-       struct pdc_host_priv *hp = host_set->private_data;
+       struct pdc_host_priv *hp = host->private_data;
 
-       ata_pci_host_stop(host_set);
+       ata_pci_host_stop(host);
 
        kfree(hp);
 }
@@ -443,14 +443,14 @@ static void pdc_qc_prep(struct ata_queued_cmd *qc)
 
 static void pdc_eng_timeout(struct ata_port *ap)
 {
-       struct ata_host_set *host_set = ap->host_set;
+       struct ata_host *host = ap->host;
        u8 drv_stat;
        struct ata_queued_cmd *qc;
        unsigned long flags;
 
        DPRINTK("ENTER\n");
 
-       spin_lock_irqsave(&host_set->lock, flags);
+       spin_lock_irqsave(&host->lock, flags);
 
        qc = ata_qc_from_tag(ap, ap->active_tag);
 
@@ -473,7 +473,7 @@ static void pdc_eng_timeout(struct ata_port *ap)
                break;
        }
 
-       spin_unlock_irqrestore(&host_set->lock, flags);
+       spin_unlock_irqrestore(&host->lock, flags);
        ata_eh_qc_complete(qc);
        DPRINTK("EXIT\n");
 }
@@ -509,15 +509,15 @@ static inline unsigned int pdc_host_intr( struct ata_port *ap,
 
 static void pdc_irq_clear(struct ata_port *ap)
 {
-       struct ata_host_set *host_set = ap->host_set;
-       void __iomem *mmio = host_set->mmio_base;
+       struct ata_host *host = ap->host;
+       void __iomem *mmio = host->mmio_base;
 
        readl(mmio + PDC_INT_SEQMASK);
 }
 
 static irqreturn_t pdc_interrupt (int irq, void *dev_instance, struct pt_regs *regs)
 {
-       struct ata_host_set *host_set = dev_instance;
+       struct ata_host *host = dev_instance;
        struct ata_port *ap;
        u32 mask = 0;
        unsigned int i, tmp;
@@ -526,12 +526,12 @@ static irqreturn_t pdc_interrupt (int irq, void *dev_instance, struct pt_regs *r
 
        VPRINTK("ENTER\n");
 
-       if (!host_set || !host_set->mmio_base) {
+       if (!host || !host->mmio_base) {
                VPRINTK("QUICK EXIT\n");
                return IRQ_NONE;
        }
 
-       mmio_base = host_set->mmio_base;
+       mmio_base = host->mmio_base;
 
        /* reading should also clear interrupts */
        mask = readl(mmio_base + PDC_INT_SEQMASK);
@@ -541,7 +541,7 @@ static irqreturn_t pdc_interrupt (int irq, void *dev_instance, struct pt_regs *r
                return IRQ_NONE;
        }
 
-       spin_lock(&host_set->lock);
+       spin_lock(&host->lock);
 
        mask &= 0xffff;         /* only 16 tags possible */
        if (!mask) {
@@ -551,9 +551,9 @@ static irqreturn_t pdc_interrupt (int irq, void *dev_instance, struct pt_regs *r
 
        writel(mask, mmio_base + PDC_INT_SEQMASK);
 
-       for (i = 0; i < host_set->n_ports; i++) {
+       for (i = 0; i < host->n_ports; i++) {
                VPRINTK("port %u\n", i);
-               ap = host_set->ports[i];
+               ap = host->ports[i];
                tmp = mask & (1 << (i + 1));
                if (tmp && ap &&
                    !(ap->flags & ATA_FLAG_DISABLED)) {
@@ -568,7 +568,7 @@ static irqreturn_t pdc_interrupt (int irq, void *dev_instance, struct pt_regs *r
        VPRINTK("EXIT\n");
 
 done_irq:
-       spin_unlock(&host_set->lock);
+       spin_unlock(&host->lock);
        return IRQ_RETVAL(handled);
 }
 
@@ -581,8 +581,8 @@ static inline void pdc_packet_start(struct ata_queued_cmd *qc)
 
        VPRINTK("ENTER, ap %p\n", ap);
 
-       writel(0x00000001, ap->host_set->mmio_base + (seq * 4));
-       readl(ap->host_set->mmio_base + (seq * 4));     /* flush */
+       writel(0x00000001, ap->host->mmio_base + (seq * 4));
+       readl(ap->host->mmio_base + (seq * 4)); /* flush */
 
        pp->pkt[2] = seq;
        wmb();                  /* flush PRD, pkt writes */
@@ -743,7 +743,7 @@ static int pdc_ata_init_one (struct pci_dev *pdev, const struct pci_device_id *e
        probe_ent->private_data = hp;
 
        probe_ent->sht          = pdc_port_info[board_idx].sht;
-       probe_ent->host_flags   = pdc_port_info[board_idx].host_flags;
+       probe_ent->port_flags   = pdc_port_info[board_idx].flags;
        probe_ent->pio_mask     = pdc_port_info[board_idx].pio_mask;
        probe_ent->mwdma_mask   = pdc_port_info[board_idx].mwdma_mask;
        probe_ent->udma_mask    = pdc_port_info[board_idx].udma_mask;
@@ -824,7 +824,7 @@ err_out:
 
 static int __init pdc_ata_init(void)
 {
-       return pci_module_init(&pdc_ata_pci_driver);
+       return pci_register_driver(&pdc_ata_pci_driver);
 }
 
 
similarity index 93%
rename from drivers/scsi/sata_qstor.c
rename to drivers/ata/sata_qstor.c
index d374c1db0cf312b63f59cf9ae1f044fc1e33d9c6..fa29dfe2a7b528de2eef33f648ddfb05a7225856 100644 (file)
@@ -116,7 +116,7 @@ static void qs_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val);
 static int qs_ata_init_one (struct pci_dev *pdev, const struct pci_device_id *ent);
 static irqreturn_t qs_intr (int irq, void *dev_instance, struct pt_regs *regs);
 static int qs_port_start(struct ata_port *ap);
-static void qs_host_stop(struct ata_host_set *host_set);
+static void qs_host_stop(struct ata_host *host);
 static void qs_port_stop(struct ata_port *ap);
 static void qs_phy_reset(struct ata_port *ap);
 static void qs_qc_prep(struct ata_queued_cmd *qc);
@@ -174,7 +174,7 @@ static const struct ata_port_info qs_port_info[] = {
        /* board_2068_idx */
        {
                .sht            = &qs_ata_sht,
-               .host_flags     = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY |
+               .flags          = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY |
                                  ATA_FLAG_SATA_RESET |
                                  //FIXME ATA_FLAG_SRST |
                                  ATA_FLAG_MMIO | ATA_FLAG_PIO_POLLING,
@@ -220,7 +220,7 @@ static void qs_irq_clear(struct ata_port *ap)
 
 static inline void qs_enter_reg_mode(struct ata_port *ap)
 {
-       u8 __iomem *chan = ap->host_set->mmio_base + (ap->port_no * 0x4000);
+       u8 __iomem *chan = ap->host->mmio_base + (ap->port_no * 0x4000);
 
        writeb(QS_CTR0_REG, chan + QS_CCT_CTR0);
        readb(chan + QS_CCT_CTR0);        /* flush */
@@ -228,7 +228,7 @@ static inline void qs_enter_reg_mode(struct ata_port *ap)
 
 static inline void qs_reset_channel_logic(struct ata_port *ap)
 {
-       u8 __iomem *chan = ap->host_set->mmio_base + (ap->port_no * 0x4000);
+       u8 __iomem *chan = ap->host->mmio_base + (ap->port_no * 0x4000);
 
        writeb(QS_CTR1_RCHN, chan + QS_CCT_CTR1);
        readb(chan + QS_CCT_CTR0);        /* flush */
@@ -342,7 +342,7 @@ static void qs_qc_prep(struct ata_queued_cmd *qc)
 static inline void qs_packet_start(struct ata_queued_cmd *qc)
 {
        struct ata_port *ap = qc->ap;
-       u8 __iomem *chan = ap->host_set->mmio_base + (ap->port_no * 0x4000);
+       u8 __iomem *chan = ap->host->mmio_base + (ap->port_no * 0x4000);
 
        VPRINTK("ENTER, ap %p\n", ap);
 
@@ -375,11 +375,11 @@ static unsigned int qs_qc_issue(struct ata_queued_cmd *qc)
        return ata_qc_issue_prot(qc);
 }
 
-static inline unsigned int qs_intr_pkt(struct ata_host_set *host_set)
+static inline unsigned int qs_intr_pkt(struct ata_host *host)
 {
        unsigned int handled = 0;
        u8 sFFE;
-       u8 __iomem *mmio_base = host_set->mmio_base;
+       u8 __iomem *mmio_base = host->mmio_base;
 
        do {
                u32 sff0 = readl(mmio_base + QS_HST_SFF);
@@ -391,7 +391,7 @@ static inline unsigned int qs_intr_pkt(struct ata_host_set *host_set)
                        u8 sDST = sff0 >> 16;   /* dev status */
                        u8 sHST = sff1 & 0x3f;  /* host status */
                        unsigned int port_no = (sff1 >> 8) & 0x03;
-                       struct ata_port *ap = host_set->ports[port_no];
+                       struct ata_port *ap = host->ports[port_no];
 
                        DPRINTK("SFF=%08x%08x: sCHAN=%u sHST=%d sDST=%02x\n",
                                        sff1, sff0, port_no, sHST, sDST);
@@ -421,13 +421,13 @@ static inline unsigned int qs_intr_pkt(struct ata_host_set *host_set)
        return handled;
 }
 
-static inline unsigned int qs_intr_mmio(struct ata_host_set *host_set)
+static inline unsigned int qs_intr_mmio(struct ata_host *host)
 {
        unsigned int handled = 0, port_no;
 
-       for (port_no = 0; port_no < host_set->n_ports; ++port_no) {
+       for (port_no = 0; port_no < host->n_ports; ++port_no) {
                struct ata_port *ap;
-               ap = host_set->ports[port_no];
+               ap = host->ports[port_no];
                if (ap &&
                    !(ap->flags & ATA_FLAG_DISABLED)) {
                        struct ata_queued_cmd *qc;
@@ -457,14 +457,14 @@ static inline unsigned int qs_intr_mmio(struct ata_host_set *host_set)
 
 static irqreturn_t qs_intr(int irq, void *dev_instance, struct pt_regs *regs)
 {
-       struct ata_host_set *host_set = dev_instance;
+       struct ata_host *host = dev_instance;
        unsigned int handled = 0;
 
        VPRINTK("ENTER\n");
 
-       spin_lock(&host_set->lock);
-       handled  = qs_intr_pkt(host_set) | qs_intr_mmio(host_set);
-       spin_unlock(&host_set->lock);
+       spin_lock(&host->lock);
+       handled  = qs_intr_pkt(host) | qs_intr_mmio(host);
+       spin_unlock(&host->lock);
 
        VPRINTK("EXIT\n");
 
@@ -491,9 +491,9 @@ static void qs_ata_setup_port(struct ata_ioports *port, unsigned long base)
 
 static int qs_port_start(struct ata_port *ap)
 {
-       struct device *dev = ap->host_set->dev;
+       struct device *dev = ap->host->dev;
        struct qs_port_priv *pp;
-       void __iomem *mmio_base = ap->host_set->mmio_base;
+       void __iomem *mmio_base = ap->host->mmio_base;
        void __iomem *chan = mmio_base + (ap->port_no * 0x4000);
        u64 addr;
        int rc;
@@ -530,7 +530,7 @@ err_out:
 
 static void qs_port_stop(struct ata_port *ap)
 {
-       struct device *dev = ap->host_set->dev;
+       struct device *dev = ap->host->dev;
        struct qs_port_priv *pp = ap->private_data;
 
        if (pp != NULL) {
@@ -543,10 +543,10 @@ static void qs_port_stop(struct ata_port *ap)
        ata_port_stop(ap);
 }
 
-static void qs_host_stop(struct ata_host_set *host_set)
+static void qs_host_stop(struct ata_host *host)
 {
-       void __iomem *mmio_base = host_set->mmio_base;
-       struct pci_dev *pdev = to_pci_dev(host_set->dev);
+       void __iomem *mmio_base = host->mmio_base;
+       struct pci_dev *pdev = to_pci_dev(host->dev);
 
        writeb(0, mmio_base + QS_HCT_CTRL); /* disable host interrupts */
        writeb(QS_CNFG3_GSRST, mmio_base + QS_HCF_CNFG3); /* global reset */
@@ -673,7 +673,7 @@ static int qs_ata_init_one(struct pci_dev *pdev,
        INIT_LIST_HEAD(&probe_ent->node);
 
        probe_ent->sht          = qs_port_info[board_idx].sht;
-       probe_ent->host_flags   = qs_port_info[board_idx].host_flags;
+       probe_ent->port_flags   = qs_port_info[board_idx].flags;
        probe_ent->pio_mask     = qs_port_info[board_idx].pio_mask;
        probe_ent->mwdma_mask   = qs_port_info[board_idx].mwdma_mask;
        probe_ent->udma_mask    = qs_port_info[board_idx].udma_mask;
@@ -712,7 +712,7 @@ err_out:
 
 static int __init qs_ata_init(void)
 {
-       return pci_module_init(&qs_ata_pci_driver);
+       return pci_register_driver(&qs_ata_pci_driver);
 }
 
 static void __exit qs_ata_exit(void)
similarity index 93%
rename from drivers/scsi/sata_sil.c
rename to drivers/ata/sata_sil.c
index d0a85073ebf7c7ecfc9872f5b9f3a94aa13e396a..c63dbabc0cd9637d73478a0044981660870c1498 100644 (file)
@@ -56,7 +56,7 @@ enum {
        SIL_FLAG_RERR_ON_DMA_ACT = (1 << 29),
        SIL_FLAG_MOD15WRITE     = (1 << 30),
 
-       SIL_DFL_HOST_FLAGS      = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY |
+       SIL_DFL_PORT_FLAGS      = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY |
                                  ATA_FLAG_MMIO | ATA_FLAG_HRST_TO_RESUME,
 
        /*
@@ -109,7 +109,9 @@ enum {
 };
 
 static int sil_init_one (struct pci_dev *pdev, const struct pci_device_id *ent);
+#ifdef CONFIG_PM
 static int sil_pci_device_resume(struct pci_dev *pdev);
+#endif
 static void sil_dev_config(struct ata_port *ap, struct ata_device *dev);
 static u32 sil_scr_read (struct ata_port *ap, unsigned int sc_reg);
 static void sil_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val);
@@ -141,12 +143,8 @@ static const struct sil_drivelist {
        { "ST330013AS",         SIL_QUIRK_MOD15WRITE },
        { "ST340017AS",         SIL_QUIRK_MOD15WRITE },
        { "ST360015AS",         SIL_QUIRK_MOD15WRITE },
-       { "ST380013AS",         SIL_QUIRK_MOD15WRITE },
        { "ST380023AS",         SIL_QUIRK_MOD15WRITE },
        { "ST3120023AS",        SIL_QUIRK_MOD15WRITE },
-       { "ST3160023AS",        SIL_QUIRK_MOD15WRITE },
-       { "ST3120026AS",        SIL_QUIRK_MOD15WRITE },
-       { "ST3200822AS",        SIL_QUIRK_MOD15WRITE },
        { "ST340014ASL",        SIL_QUIRK_MOD15WRITE },
        { "ST360014ASL",        SIL_QUIRK_MOD15WRITE },
        { "ST380011ASL",        SIL_QUIRK_MOD15WRITE },
@@ -161,8 +159,10 @@ static struct pci_driver sil_pci_driver = {
        .id_table               = sil_pci_tbl,
        .probe                  = sil_init_one,
        .remove                 = ata_pci_remove_one,
+#ifdef CONFIG_PM
        .suspend                = ata_pci_device_suspend,
        .resume                 = sil_pci_device_resume,
+#endif
 };
 
 static struct scsi_host_template sil_sht = {
@@ -218,7 +218,7 @@ static const struct ata_port_info sil_port_info[] = {
        /* sil_3112 */
        {
                .sht            = &sil_sht,
-               .host_flags     = SIL_DFL_HOST_FLAGS | SIL_FLAG_MOD15WRITE,
+               .flags          = SIL_DFL_PORT_FLAGS | SIL_FLAG_MOD15WRITE,
                .pio_mask       = 0x1f,                 /* pio0-4 */
                .mwdma_mask     = 0x07,                 /* mwdma0-2 */
                .udma_mask      = 0x3f,                 /* udma0-5 */
@@ -227,7 +227,7 @@ static const struct ata_port_info sil_port_info[] = {
        /* sil_3112_no_sata_irq */
        {
                .sht            = &sil_sht,
-               .host_flags     = SIL_DFL_HOST_FLAGS | SIL_FLAG_MOD15WRITE |
+               .flags          = SIL_DFL_PORT_FLAGS | SIL_FLAG_MOD15WRITE |
                                  SIL_FLAG_NO_SATA_IRQ,
                .pio_mask       = 0x1f,                 /* pio0-4 */
                .mwdma_mask     = 0x07,                 /* mwdma0-2 */
@@ -237,7 +237,7 @@ static const struct ata_port_info sil_port_info[] = {
        /* sil_3512 */
        {
                .sht            = &sil_sht,
-               .host_flags     = SIL_DFL_HOST_FLAGS | SIL_FLAG_RERR_ON_DMA_ACT,
+               .flags          = SIL_DFL_PORT_FLAGS | SIL_FLAG_RERR_ON_DMA_ACT,
                .pio_mask       = 0x1f,                 /* pio0-4 */
                .mwdma_mask     = 0x07,                 /* mwdma0-2 */
                .udma_mask      = 0x3f,                 /* udma0-5 */
@@ -246,7 +246,7 @@ static const struct ata_port_info sil_port_info[] = {
        /* sil_3114 */
        {
                .sht            = &sil_sht,
-               .host_flags     = SIL_DFL_HOST_FLAGS | SIL_FLAG_RERR_ON_DMA_ACT,
+               .flags          = SIL_DFL_PORT_FLAGS | SIL_FLAG_RERR_ON_DMA_ACT,
                .pio_mask       = 0x1f,                 /* pio0-4 */
                .mwdma_mask     = 0x07,                 /* mwdma0-2 */
                .udma_mask      = 0x3f,                 /* udma0-5 */
@@ -295,10 +295,9 @@ static unsigned char sil_get_device_cache_line(struct pci_dev *pdev)
 
 static void sil_post_set_mode (struct ata_port *ap)
 {
-       struct ata_host_set *host_set = ap->host_set;
+       struct ata_host *host = ap->host;
        struct ata_device *dev;
-       void __iomem *addr =
-               host_set->mmio_base + sil_port[ap->port_no].xfer_mode;
+       void __iomem *addr = host->mmio_base + sil_port[ap->port_no].xfer_mode;
        u32 tmp, dev_mode[2];
        unsigned int i;
 
@@ -440,15 +439,15 @@ static void sil_host_intr(struct ata_port *ap, u32 bmdma2)
 static irqreturn_t sil_interrupt(int irq, void *dev_instance,
                                 struct pt_regs *regs)
 {
-       struct ata_host_set *host_set = dev_instance;
-       void __iomem *mmio_base = host_set->mmio_base;
+       struct ata_host *host = dev_instance;
+       void __iomem *mmio_base = host->mmio_base;
        int handled = 0;
        int i;
 
-       spin_lock(&host_set->lock);
+       spin_lock(&host->lock);
 
-       for (i = 0; i < host_set->n_ports; i++) {
-               struct ata_port *ap = host_set->ports[i];
+       for (i = 0; i < host->n_ports; i++) {
+               struct ata_port *ap = host->ports[i];
                u32 bmdma2 = readl(mmio_base + sil_port[ap->port_no].bmdma2);
 
                if (unlikely(!ap || ap->flags & ATA_FLAG_DISABLED))
@@ -466,14 +465,14 @@ static irqreturn_t sil_interrupt(int irq, void *dev_instance,
                handled = 1;
        }
 
-       spin_unlock(&host_set->lock);
+       spin_unlock(&host->lock);
 
        return IRQ_RETVAL(handled);
 }
 
 static void sil_freeze(struct ata_port *ap)
 {
-       void __iomem *mmio_base = ap->host_set->mmio_base;
+       void __iomem *mmio_base = ap->host->mmio_base;
        u32 tmp;
 
        /* global IRQ mask doesn't block SATA IRQ, turn off explicitly */
@@ -488,7 +487,7 @@ static void sil_freeze(struct ata_port *ap)
 
 static void sil_thaw(struct ata_port *ap)
 {
-       void __iomem *mmio_base = ap->host_set->mmio_base;
+       void __iomem *mmio_base = ap->host->mmio_base;
        u32 tmp;
 
        /* clear IRQ */
@@ -567,7 +566,7 @@ static void sil_dev_config(struct ata_port *ap, struct ata_device *dev)
 }
 
 static void sil_init_controller(struct pci_dev *pdev,
-                               int n_ports, unsigned long host_flags,
+                               int n_ports, unsigned long port_flags,
                                void __iomem *mmio_base)
 {
        u8 cls;
@@ -587,7 +586,7 @@ static void sil_init_controller(struct pci_dev *pdev,
                           "cache line size not set.  Driver may not function\n");
 
        /* Apply R_ERR on DMA activate FIS errata workaround */
-       if (host_flags & SIL_FLAG_RERR_ON_DMA_ACT) {
+       if (port_flags & SIL_FLAG_RERR_ON_DMA_ACT) {
                int cnt;
 
                for (i = 0, cnt = 0; i < n_ports; i++) {
@@ -658,7 +657,7 @@ static int sil_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
        probe_ent->udma_mask = sil_port_info[ent->driver_data].udma_mask;
                probe_ent->irq = pdev->irq;
                probe_ent->irq_flags = IRQF_SHARED;
-       probe_ent->host_flags = sil_port_info[ent->driver_data].host_flags;
+       probe_ent->port_flags = sil_port_info[ent->driver_data].flags;
 
        mmio_base = pci_iomap(pdev, 5, 0);
        if (mmio_base == NULL) {
@@ -679,7 +678,7 @@ static int sil_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
                ata_std_ports(&probe_ent->port[i]);
        }
 
-       sil_init_controller(pdev, probe_ent->n_ports, probe_ent->host_flags,
+       sil_init_controller(pdev, probe_ent->n_ports, probe_ent->port_flags,
                            mmio_base);
 
        pci_set_master(pdev);
@@ -700,21 +699,23 @@ err_out:
        return rc;
 }
 
+#ifdef CONFIG_PM
 static int sil_pci_device_resume(struct pci_dev *pdev)
 {
-       struct ata_host_set *host_set = dev_get_drvdata(&pdev->dev);
+       struct ata_host *host = dev_get_drvdata(&pdev->dev);
 
        ata_pci_device_do_resume(pdev);
-       sil_init_controller(pdev, host_set->n_ports, host_set->ports[0]->flags,
-                           host_set->mmio_base);
-       ata_host_set_resume(host_set);
+       sil_init_controller(pdev, host->n_ports, host->ports[0]->flags,
+                           host->mmio_base);
+       ata_host_resume(host);
 
        return 0;
 }
+#endif
 
 static int __init sil_init(void)
 {
-       return pci_module_init(&sil_pci_driver);
+       return pci_register_driver(&sil_pci_driver);
 }
 
 static void __exit sil_exit(void)
similarity index 95%
rename from drivers/scsi/sata_sil24.c
rename to drivers/ata/sata_sil24.c
index 3f368c7d3ef90be120a98410ce842628ef201ef9..39cb07baebae96ea0aa6594b6da8b1f11e189913 100644 (file)
@@ -316,7 +316,7 @@ struct sil24_port_priv {
        struct ata_taskfile tf;                 /* Cached taskfile registers */
 };
 
-/* ap->host_set->private_data */
+/* ap->host->private_data */
 struct sil24_host_priv {
        void __iomem *host_base;        /* global controller control (128 bytes @BAR0) */
        void __iomem *port_base;        /* port registers (4 * 8192 bytes @BAR2) */
@@ -337,9 +337,11 @@ static void sil24_error_handler(struct ata_port *ap);
 static void sil24_post_internal_cmd(struct ata_queued_cmd *qc);
 static int sil24_port_start(struct ata_port *ap);
 static void sil24_port_stop(struct ata_port *ap);
-static void sil24_host_stop(struct ata_host_set *host_set);
+static void sil24_host_stop(struct ata_host *host);
 static int sil24_init_one(struct pci_dev *pdev, const struct pci_device_id *ent);
+#ifdef CONFIG_PM
 static int sil24_pci_device_resume(struct pci_dev *pdev);
+#endif
 
 static const struct pci_device_id sil24_pci_tbl[] = {
        { 0x1095, 0x3124, PCI_ANY_ID, PCI_ANY_ID, 0, 0, BID_SIL3124 },
@@ -355,8 +357,10 @@ static struct pci_driver sil24_pci_driver = {
        .id_table               = sil24_pci_tbl,
        .probe                  = sil24_init_one,
        .remove                 = ata_pci_remove_one, /* safe? */
+#ifdef CONFIG_PM
        .suspend                = ata_pci_device_suspend,
        .resume                 = sil24_pci_device_resume,
+#endif
 };
 
 static struct scsi_host_template sil24_sht = {
@@ -411,7 +415,7 @@ static const struct ata_port_operations sil24_ops = {
 };
 
 /*
- * Use bits 30-31 of host_flags to encode available port numbers.
+ * Use bits 30-31 of port_flags to encode available port numbers.
  * Current maxium is 4.
  */
 #define SIL24_NPORTS2FLAG(nports)      ((((unsigned)(nports) - 1) & 0x3) << 30)
@@ -421,7 +425,7 @@ static struct ata_port_info sil24_port_info[] = {
        /* sil_3124 */
        {
                .sht            = &sil24_sht,
-               .host_flags     = SIL24_COMMON_FLAGS | SIL24_NPORTS2FLAG(4) |
+               .flags          = SIL24_COMMON_FLAGS | SIL24_NPORTS2FLAG(4) |
                                  SIL24_FLAG_PCIX_IRQ_WOC,
                .pio_mask       = 0x1f,                 /* pio0-4 */
                .mwdma_mask     = 0x07,                 /* mwdma0-2 */
@@ -431,7 +435,7 @@ static struct ata_port_info sil24_port_info[] = {
        /* sil_3132 */
        {
                .sht            = &sil24_sht,
-               .host_flags     = SIL24_COMMON_FLAGS | SIL24_NPORTS2FLAG(2),
+               .flags          = SIL24_COMMON_FLAGS | SIL24_NPORTS2FLAG(2),
                .pio_mask       = 0x1f,                 /* pio0-4 */
                .mwdma_mask     = 0x07,                 /* mwdma0-2 */
                .udma_mask      = 0x3f,                 /* udma0-5 */
@@ -440,7 +444,7 @@ static struct ata_port_info sil24_port_info[] = {
        /* sil_3131/sil_3531 */
        {
                .sht            = &sil24_sht,
-               .host_flags     = SIL24_COMMON_FLAGS | SIL24_NPORTS2FLAG(1),
+               .flags          = SIL24_COMMON_FLAGS | SIL24_NPORTS2FLAG(1),
                .pio_mask       = 0x1f,                 /* pio0-4 */
                .mwdma_mask     = 0x07,                 /* mwdma0-2 */
                .udma_mask      = 0x3f,                 /* udma0-5 */
@@ -867,8 +871,8 @@ static inline void sil24_host_intr(struct ata_port *ap)
 
 static irqreturn_t sil24_interrupt(int irq, void *dev_instance, struct pt_regs *regs)
 {
-       struct ata_host_set *host_set = dev_instance;
-       struct sil24_host_priv *hpriv = host_set->private_data;
+       struct ata_host *host = dev_instance;
+       struct sil24_host_priv *hpriv = host->private_data;
        unsigned handled = 0;
        u32 status;
        int i;
@@ -884,20 +888,20 @@ static irqreturn_t sil24_interrupt(int irq, void *dev_instance, struct pt_regs *
        if (!(status & IRQ_STAT_4PORTS))
                goto out;
 
-       spin_lock(&host_set->lock);
+       spin_lock(&host->lock);
 
-       for (i = 0; i < host_set->n_ports; i++)
+       for (i = 0; i < host->n_ports; i++)
                if (status & (1 << i)) {
-                       struct ata_port *ap = host_set->ports[i];
+                       struct ata_port *ap = host->ports[i];
                        if (ap && !(ap->flags & ATA_FLAG_DISABLED)) {
-                               sil24_host_intr(host_set->ports[i]);
+                               sil24_host_intr(host->ports[i]);
                                handled++;
                        } else
                                printk(KERN_ERR DRV_NAME
                                       ": interrupt from disabled port %d\n", i);
                }
 
-       spin_unlock(&host_set->lock);
+       spin_unlock(&host->lock);
  out:
        return IRQ_RETVAL(handled);
 }
@@ -937,7 +941,7 @@ static inline void sil24_cblk_free(struct sil24_port_priv *pp, struct device *de
 
 static int sil24_port_start(struct ata_port *ap)
 {
-       struct device *dev = ap->host_set->dev;
+       struct device *dev = ap->host->dev;
        struct sil24_port_priv *pp;
        union sil24_cmd_block *cb;
        size_t cb_size = sizeof(*cb) * SIL24_MAX_CMDS;
@@ -976,7 +980,7 @@ err_out:
 
 static void sil24_port_stop(struct ata_port *ap)
 {
-       struct device *dev = ap->host_set->dev;
+       struct device *dev = ap->host->dev;
        struct sil24_port_priv *pp = ap->private_data;
 
        sil24_cblk_free(pp, dev);
@@ -984,10 +988,10 @@ static void sil24_port_stop(struct ata_port *ap)
        kfree(pp);
 }
 
-static void sil24_host_stop(struct ata_host_set *host_set)
+static void sil24_host_stop(struct ata_host *host)
 {
-       struct sil24_host_priv *hpriv = host_set->private_data;
-       struct pci_dev *pdev = to_pci_dev(host_set->dev);
+       struct sil24_host_priv *hpriv = host->private_data;
+       struct pci_dev *pdev = to_pci_dev(host->dev);
 
        pci_iounmap(pdev, hpriv->host_base);
        pci_iounmap(pdev, hpriv->port_base);
@@ -995,7 +999,7 @@ static void sil24_host_stop(struct ata_host_set *host_set)
 }
 
 static void sil24_init_controller(struct pci_dev *pdev, int n_ports,
-                                 unsigned long host_flags,
+                                 unsigned long port_flags,
                                  void __iomem *host_base,
                                  void __iomem *port_base)
 {
@@ -1028,7 +1032,7 @@ static void sil24_init_controller(struct pci_dev *pdev, int n_ports,
                }
 
                /* Configure IRQ WoC */
-               if (host_flags & SIL24_FLAG_PCIX_IRQ_WOC)
+               if (port_flags & SIL24_FLAG_PCIX_IRQ_WOC)
                        writel(PORT_CS_IRQ_WOC, port + PORT_CTRL_STAT);
                else
                        writel(PORT_CS_IRQ_WOC, port + PORT_CTRL_CLR);
@@ -1097,12 +1101,12 @@ static int sil24_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
        INIT_LIST_HEAD(&probe_ent->node);
 
        probe_ent->sht          = pinfo->sht;
-       probe_ent->host_flags   = pinfo->host_flags;
+       probe_ent->port_flags   = pinfo->flags;
        probe_ent->pio_mask     = pinfo->pio_mask;
        probe_ent->mwdma_mask   = pinfo->mwdma_mask;
        probe_ent->udma_mask    = pinfo->udma_mask;
        probe_ent->port_ops     = pinfo->port_ops;
-       probe_ent->n_ports      = SIL24_FLAG2NPORTS(pinfo->host_flags);
+       probe_ent->n_ports      = SIL24_FLAG2NPORTS(pinfo->flags);
 
        probe_ent->irq = pdev->irq;
        probe_ent->irq_flags = IRQF_SHARED;
@@ -1140,14 +1144,14 @@ static int sil24_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
        }
 
        /* Apply workaround for completion IRQ loss on PCI-X errata */
-       if (probe_ent->host_flags & SIL24_FLAG_PCIX_IRQ_WOC) {
+       if (probe_ent->port_flags & SIL24_FLAG_PCIX_IRQ_WOC) {
                tmp = readl(host_base + HOST_CTRL);
                if (tmp & (HOST_CTRL_TRDY | HOST_CTRL_STOP | HOST_CTRL_DEVSEL))
                        dev_printk(KERN_INFO, &pdev->dev,
                                   "Applying completion IRQ loss on PCI-X "
                                   "errata fix\n");
                else
-                       probe_ent->host_flags &= ~SIL24_FLAG_PCIX_IRQ_WOC;
+                       probe_ent->port_flags &= ~SIL24_FLAG_PCIX_IRQ_WOC;
        }
 
        for (i = 0; i < probe_ent->n_ports; i++) {
@@ -1160,7 +1164,7 @@ static int sil24_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
                ata_std_ports(&probe_ent->port[i]);
        }
 
-       sil24_init_controller(pdev, probe_ent->n_ports, probe_ent->host_flags,
+       sil24_init_controller(pdev, probe_ent->n_ports, probe_ent->port_flags,
                              host_base, port_base);
 
        pci_set_master(pdev);
@@ -1184,28 +1188,29 @@ static int sil24_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
        return rc;
 }
 
+#ifdef CONFIG_PM
 static int sil24_pci_device_resume(struct pci_dev *pdev)
 {
-       struct ata_host_set *host_set = dev_get_drvdata(&pdev->dev);
-       struct sil24_host_priv *hpriv = host_set->private_data;
+       struct ata_host *host = dev_get_drvdata(&pdev->dev);
+       struct sil24_host_priv *hpriv = host->private_data;
 
        ata_pci_device_do_resume(pdev);
 
        if (pdev->dev.power.power_state.event == PM_EVENT_SUSPEND)
                writel(HOST_CTRL_GLOBAL_RST, hpriv->host_base + HOST_CTRL);
 
-       sil24_init_controller(pdev, host_set->n_ports,
-                             host_set->ports[0]->flags,
+       sil24_init_controller(pdev, host->n_ports, host->ports[0]->flags,
                              hpriv->host_base, hpriv->port_base);
 
-       ata_host_set_resume(host_set);
+       ata_host_resume(host);
 
        return 0;
 }
+#endif
 
 static int __init sil24_init(void)
 {
-       return pci_module_init(&sil24_pci_driver);
+       return pci_register_driver(&sil24_pci_driver);
 }
 
 static void __exit sil24_exit(void)
similarity index 94%
rename from drivers/scsi/sata_sis.c
rename to drivers/ata/sata_sis.c
index ee6b5df41d309833d1ffdbdd2e9cd1bc0fd2330b..9b17375d8056fe16e0f9b877d00091dfda7885eb 100644 (file)
@@ -128,7 +128,7 @@ static const struct ata_port_operations sis_ops = {
 
 static struct ata_port_info sis_port_info = {
        .sht            = &sis_sht,
-       .host_flags     = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY,
+       .flags          = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY,
        .pio_mask       = 0x1f,
        .mwdma_mask     = 0x7,
        .udma_mask      = 0x7f,
@@ -158,7 +158,7 @@ static unsigned int get_scr_cfg_addr(unsigned int port_no, unsigned int sc_reg,
 
 static u32 sis_scr_cfg_read (struct ata_port *ap, unsigned int sc_reg)
 {
-       struct pci_dev *pdev = to_pci_dev(ap->host_set->dev);
+       struct pci_dev *pdev = to_pci_dev(ap->host->dev);
        unsigned int cfg_addr = get_scr_cfg_addr(ap->port_no, sc_reg, pdev->device);
        u32 val, val2 = 0;
        u8 pmr;
@@ -178,7 +178,7 @@ static u32 sis_scr_cfg_read (struct ata_port *ap, unsigned int sc_reg)
 
 static void sis_scr_cfg_write (struct ata_port *ap, unsigned int scr, u32 val)
 {
-       struct pci_dev *pdev = to_pci_dev(ap->host_set->dev);
+       struct pci_dev *pdev = to_pci_dev(ap->host->dev);
        unsigned int cfg_addr = get_scr_cfg_addr(ap->port_no, scr, pdev->device);
        u8 pmr;
 
@@ -195,7 +195,7 @@ static void sis_scr_cfg_write (struct ata_port *ap, unsigned int scr, u32 val)
 
 static u32 sis_scr_read (struct ata_port *ap, unsigned int sc_reg)
 {
-       struct pci_dev *pdev = to_pci_dev(ap->host_set->dev);
+       struct pci_dev *pdev = to_pci_dev(ap->host->dev);
        u32 val, val2 = 0;
        u8 pmr;
 
@@ -217,7 +217,7 @@ static u32 sis_scr_read (struct ata_port *ap, unsigned int sc_reg)
 
 static void sis_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val)
 {
-       struct pci_dev *pdev = to_pci_dev(ap->host_set->dev);
+       struct pci_dev *pdev = to_pci_dev(ap->host->dev);
        u8 pmr;
 
        if (sc_reg > SCR_CONTROL)
@@ -275,17 +275,17 @@ static int sis_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
        /* check and see if the SCRs are in IO space or PCI cfg space */
        pci_read_config_dword(pdev, SIS_GENCTL, &genctl);
        if ((genctl & GENCTL_IOMAPPED_SCR) == 0)
-               probe_ent->host_flags |= SIS_FLAG_CFGSCR;
+               probe_ent->port_flags |= SIS_FLAG_CFGSCR;
 
        /* if hardware thinks SCRs are in IO space, but there are
         * no IO resources assigned, change to PCI cfg space.
         */
-       if ((!(probe_ent->host_flags & SIS_FLAG_CFGSCR)) &&
+       if ((!(probe_ent->port_flags & SIS_FLAG_CFGSCR)) &&
            ((pci_resource_start(pdev, SIS_SCR_PCI_BAR) == 0) ||
             (pci_resource_len(pdev, SIS_SCR_PCI_BAR) < 128))) {
                genctl &= ~GENCTL_IOMAPPED_SCR;
                pci_write_config_dword(pdev, SIS_GENCTL, genctl);
-               probe_ent->host_flags |= SIS_FLAG_CFGSCR;
+               probe_ent->port_flags |= SIS_FLAG_CFGSCR;
        }
 
        pci_read_config_byte(pdev, SIS_PMR, &pmr);
@@ -306,7 +306,7 @@ static int sis_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
                port2_start = 0x20;
        }
 
-       if (!(probe_ent->host_flags & SIS_FLAG_CFGSCR)) {
+       if (!(probe_ent->port_flags & SIS_FLAG_CFGSCR)) {
                probe_ent->port[0].scr_addr =
                        pci_resource_start(pdev, SIS_SCR_PCI_BAR);
                probe_ent->port[1].scr_addr =
@@ -334,7 +334,7 @@ err_out:
 
 static int __init sis_init(void)
 {
-       return pci_module_init(&sis_pci_driver);
+       return pci_register_driver(&sis_pci_driver);
 }
 
 static void __exit sis_exit(void)
similarity index 98%
rename from drivers/scsi/sata_svw.c
rename to drivers/ata/sata_svw.c
index 7d0858095e1fed49324d2ac20787e95fc83768ef..2a7e3495cf160b506dd2b9a7ee10b4e8a949c75d 100644 (file)
@@ -169,7 +169,7 @@ static void k2_sata_tf_read(struct ata_port *ap, struct ata_taskfile *tf)
  *     @qc: Info associated with this ATA transaction.
  *
  *     LOCKING:
- *     spin_lock_irqsave(host_set lock)
+ *     spin_lock_irqsave(host lock)
  */
 
 static void k2_bmdma_setup_mmio (struct ata_queued_cmd *qc)
@@ -199,7 +199,7 @@ static void k2_bmdma_setup_mmio (struct ata_queued_cmd *qc)
  *     @qc: Info associated with this ATA transaction.
  *
  *     LOCKING:
- *     spin_lock_irqsave(host_set lock)
+ *     spin_lock_irqsave(host lock)
  */
 
 static void k2_bmdma_start_mmio (struct ata_queued_cmd *qc)
@@ -261,12 +261,12 @@ static int k2_sata_proc_info(struct Scsi_Host *shost, char *page, char **start,
                return 0;
 
        /* Find the OF node for the PCI device proper */
-       np = pci_device_to_OF_node(to_pci_dev(ap->host_set->dev));
+       np = pci_device_to_OF_node(to_pci_dev(ap->host->dev));
        if (np == NULL)
                return 0;
 
        /* Match it to a port node */
-       index = (ap == ap->host_set->ports[0]) ? 0 : 1;
+       index = (ap == ap->host->ports[0]) ? 0 : 1;
        for (np = np->child; np != NULL; np = np->sibling) {
                u32 *reg = (u32 *)get_property(np, "reg", NULL);
                if (!reg)
@@ -423,7 +423,7 @@ static int k2_sata_init_one (struct pci_dev *pdev, const struct pci_device_id *e
        writel(0x0, mmio_base + K2_SATA_SIM_OFFSET);
 
        probe_ent->sht = &k2_sata_sht;
-       probe_ent->host_flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY |
+       probe_ent->port_flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY |
                                ATA_FLAG_MMIO;
        probe_ent->port_ops = &k2_sata_ops;
        probe_ent->n_ports = 4;
@@ -488,7 +488,7 @@ static struct pci_driver k2_sata_pci_driver = {
 
 static int __init k2_sata_init(void)
 {
-       return pci_module_init(&k2_sata_pci_driver);
+       return pci_register_driver(&k2_sata_pci_driver);
 }
 
 
similarity index 96%
rename from drivers/scsi/sata_sx4.c
rename to drivers/ata/sata_sx4.c
index ccc8cad24f7dc20ef599ecdaf8f745d8df57fe55..091867e10ea3fcb6463fa794f0e10ec1bc1a8fb2 100644 (file)
@@ -160,7 +160,7 @@ static void pdc_port_stop(struct ata_port *ap);
 static void pdc20621_qc_prep(struct ata_queued_cmd *qc);
 static void pdc_tf_load_mmio(struct ata_port *ap, const struct ata_taskfile *tf);
 static void pdc_exec_command_mmio(struct ata_port *ap, const struct ata_taskfile *tf);
-static void pdc20621_host_stop(struct ata_host_set *host_set);
+static void pdc20621_host_stop(struct ata_host *host);
 static unsigned int pdc20621_dimm_init(struct ata_probe_ent *pe);
 static int pdc20621_detect_dimm(struct ata_probe_ent *pe);
 static unsigned int pdc20621_i2c_read(struct ata_probe_ent *pe,
@@ -218,7 +218,7 @@ static const struct ata_port_info pdc_port_info[] = {
        /* board_20621 */
        {
                .sht            = &pdc_sata_sht,
-               .host_flags     = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY |
+               .flags          = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY |
                                  ATA_FLAG_SRST | ATA_FLAG_MMIO |
                                  ATA_FLAG_NO_ATAPI | ATA_FLAG_PIO_POLLING,
                .pio_mask       = 0x1f, /* pio0-4 */
@@ -244,21 +244,21 @@ static struct pci_driver pdc_sata_pci_driver = {
 };
 
 
-static void pdc20621_host_stop(struct ata_host_set *host_set)
+static void pdc20621_host_stop(struct ata_host *host)
 {
-       struct pci_dev *pdev = to_pci_dev(host_set->dev);
-       struct pdc_host_priv *hpriv = host_set->private_data;
+       struct pci_dev *pdev = to_pci_dev(host->dev);
+       struct pdc_host_priv *hpriv = host->private_data;
        void __iomem *dimm_mmio = hpriv->dimm_mmio;
 
        pci_iounmap(pdev, dimm_mmio);
        kfree(hpriv);
 
-       pci_iounmap(pdev, host_set->mmio_base);
+       pci_iounmap(pdev, host->mmio_base);
 }
 
 static int pdc_port_start(struct ata_port *ap)
 {
-       struct device *dev = ap->host_set->dev;
+       struct device *dev = ap->host->dev;
        struct pdc_port_priv *pp;
        int rc;
 
@@ -293,7 +293,7 @@ err_out:
 
 static void pdc_port_stop(struct ata_port *ap)
 {
-       struct device *dev = ap->host_set->dev;
+       struct device *dev = ap->host->dev;
        struct pdc_port_priv *pp = ap->private_data;
 
        ap->private_data = NULL;
@@ -453,8 +453,8 @@ static void pdc20621_dma_prep(struct ata_queued_cmd *qc)
        struct scatterlist *sg;
        struct ata_port *ap = qc->ap;
        struct pdc_port_priv *pp = ap->private_data;
-       void __iomem *mmio = ap->host_set->mmio_base;
-       struct pdc_host_priv *hpriv = ap->host_set->private_data;
+       void __iomem *mmio = ap->host->mmio_base;
+       struct pdc_host_priv *hpriv = ap->host->private_data;
        void __iomem *dimm_mmio = hpriv->dimm_mmio;
        unsigned int portno = ap->port_no;
        unsigned int i, idx, total_len = 0, sgt_len;
@@ -514,8 +514,8 @@ static void pdc20621_nodata_prep(struct ata_queued_cmd *qc)
 {
        struct ata_port *ap = qc->ap;
        struct pdc_port_priv *pp = ap->private_data;
-       void __iomem *mmio = ap->host_set->mmio_base;
-       struct pdc_host_priv *hpriv = ap->host_set->private_data;
+       void __iomem *mmio = ap->host->mmio_base;
+       struct pdc_host_priv *hpriv = ap->host->private_data;
        void __iomem *dimm_mmio = hpriv->dimm_mmio;
        unsigned int portno = ap->port_no;
        unsigned int i;
@@ -565,8 +565,8 @@ static void __pdc20621_push_hdma(struct ata_queued_cmd *qc,
                                 u32 pkt_ofs)
 {
        struct ata_port *ap = qc->ap;
-       struct ata_host_set *host_set = ap->host_set;
-       void __iomem *mmio = host_set->mmio_base;
+       struct ata_host *host = ap->host;
+       void __iomem *mmio = host->mmio_base;
 
        /* hard-code chip #0 */
        mmio += PDC_CHIP0_OFS;
@@ -583,7 +583,7 @@ static void pdc20621_push_hdma(struct ata_queued_cmd *qc,
                                u32 pkt_ofs)
 {
        struct ata_port *ap = qc->ap;
-       struct pdc_host_priv *pp = ap->host_set->private_data;
+       struct pdc_host_priv *pp = ap->host->private_data;
        unsigned int idx = pp->hdma_prod & PDC_HDMA_Q_MASK;
 
        if (!pp->doing_hdma) {
@@ -601,7 +601,7 @@ static void pdc20621_push_hdma(struct ata_queued_cmd *qc,
 static void pdc20621_pop_hdma(struct ata_queued_cmd *qc)
 {
        struct ata_port *ap = qc->ap;
-       struct pdc_host_priv *pp = ap->host_set->private_data;
+       struct pdc_host_priv *pp = ap->host->private_data;
        unsigned int idx = pp->hdma_cons & PDC_HDMA_Q_MASK;
 
        /* if nothing on queue, we're done */
@@ -620,7 +620,7 @@ static void pdc20621_dump_hdma(struct ata_queued_cmd *qc)
 {
        struct ata_port *ap = qc->ap;
        unsigned int port_no = ap->port_no;
-       struct pdc_host_priv *hpriv = ap->host_set->private_data;
+       struct pdc_host_priv *hpriv = ap->host->private_data;
        void *dimm_mmio = hpriv->dimm_mmio;
 
        dimm_mmio += (port_no * PDC_DIMM_WINDOW_STEP);
@@ -638,9 +638,9 @@ static inline void pdc20621_dump_hdma(struct ata_queued_cmd *qc) { }
 static void pdc20621_packet_start(struct ata_queued_cmd *qc)
 {
        struct ata_port *ap = qc->ap;
-       struct ata_host_set *host_set = ap->host_set;
+       struct ata_host *host = ap->host;
        unsigned int port_no = ap->port_no;
-       void __iomem *mmio = host_set->mmio_base;
+       void __iomem *mmio = host->mmio_base;
        unsigned int rw = (qc->tf.flags & ATA_TFLAG_WRITE);
        u8 seq = (u8) (port_no + 1);
        unsigned int port_ofs;
@@ -781,8 +781,8 @@ static inline unsigned int pdc20621_host_intr( struct ata_port *ap,
 
 static void pdc20621_irq_clear(struct ata_port *ap)
 {
-       struct ata_host_set *host_set = ap->host_set;
-       void __iomem *mmio = host_set->mmio_base;
+       struct ata_host *host = ap->host;
+       void __iomem *mmio = host->mmio_base;
 
        mmio += PDC_CHIP0_OFS;
 
@@ -791,7 +791,7 @@ static void pdc20621_irq_clear(struct ata_port *ap)
 
 static irqreturn_t pdc20621_interrupt (int irq, void *dev_instance, struct pt_regs *regs)
 {
-       struct ata_host_set *host_set = dev_instance;
+       struct ata_host *host = dev_instance;
        struct ata_port *ap;
        u32 mask = 0;
        unsigned int i, tmp, port_no;
@@ -800,12 +800,12 @@ static irqreturn_t pdc20621_interrupt (int irq, void *dev_instance, struct pt_re
 
        VPRINTK("ENTER\n");
 
-       if (!host_set || !host_set->mmio_base) {
+       if (!host || !host->mmio_base) {
                VPRINTK("QUICK EXIT\n");
                return IRQ_NONE;
        }
 
-       mmio_base = host_set->mmio_base;
+       mmio_base = host->mmio_base;
 
        /* reading should also clear interrupts */
        mmio_base += PDC_CHIP0_OFS;
@@ -822,16 +822,16 @@ static irqreturn_t pdc20621_interrupt (int irq, void *dev_instance, struct pt_re
                return IRQ_NONE;
        }
 
-        spin_lock(&host_set->lock);
+        spin_lock(&host->lock);
 
         for (i = 1; i < 9; i++) {
                port_no = i - 1;
                if (port_no > 3)
                        port_no -= 4;
-               if (port_no >= host_set->n_ports)
+               if (port_no >= host->n_ports)
                        ap = NULL;
                else
-                       ap = host_set->ports[port_no];
+                       ap = host->ports[port_no];
                tmp = mask & (1 << i);
                VPRINTK("seq %u, port_no %u, ap %p, tmp %x\n", i, port_no, ap, tmp);
                if (tmp && ap &&
@@ -845,7 +845,7 @@ static irqreturn_t pdc20621_interrupt (int irq, void *dev_instance, struct pt_re
                }
        }
 
-        spin_unlock(&host_set->lock);
+        spin_unlock(&host->lock);
 
        VPRINTK("mask == 0x%x\n", mask);
 
@@ -857,13 +857,13 @@ static irqreturn_t pdc20621_interrupt (int irq, void *dev_instance, struct pt_re
 static void pdc_eng_timeout(struct ata_port *ap)
 {
        u8 drv_stat;
-       struct ata_host_set *host_set = ap->host_set;
+       struct ata_host *host = ap->host;
        struct ata_queued_cmd *qc;
        unsigned long flags;
 
        DPRINTK("ENTER\n");
 
-       spin_lock_irqsave(&host_set->lock, flags);
+       spin_lock_irqsave(&host->lock, flags);
 
        qc = ata_qc_from_tag(ap, ap->active_tag);
 
@@ -885,7 +885,7 @@ static void pdc_eng_timeout(struct ata_port *ap)
                break;
        }
 
-       spin_unlock_irqrestore(&host_set->lock, flags);
+       spin_unlock_irqrestore(&host->lock, flags);
        ata_eh_qc_complete(qc);
        DPRINTK("EXIT\n");
 }
@@ -1429,7 +1429,7 @@ static int pdc_sata_init_one (struct pci_dev *pdev, const struct pci_device_id *
        hpriv->dimm_mmio = dimm_mmio;
 
        probe_ent->sht          = pdc_port_info[board_idx].sht;
-       probe_ent->host_flags   = pdc_port_info[board_idx].host_flags;
+       probe_ent->port_flags   = pdc_port_info[board_idx].flags;
        probe_ent->pio_mask     = pdc_port_info[board_idx].pio_mask;
        probe_ent->mwdma_mask   = pdc_port_info[board_idx].mwdma_mask;
        probe_ent->udma_mask    = pdc_port_info[board_idx].udma_mask;
@@ -1482,7 +1482,7 @@ err_out:
 
 static int __init pdc_sata_init(void)
 {
-       return pci_module_init(&pdc_sata_pci_driver);
+       return pci_register_driver(&pdc_sata_pci_driver);
 }
 
 
similarity index 96%
rename from drivers/scsi/sata_uli.c
rename to drivers/ata/sata_uli.c
index 33cdb4867ef13bd222b92695bf2317eb741d8f67..8fc6e800011a7c9a5c0cafcdcb025a4cd647554c 100644 (file)
@@ -128,7 +128,7 @@ static const struct ata_port_operations uli_ops = {
 
 static struct ata_port_info uli_port_info = {
        .sht            = &uli_sht,
-       .host_flags     = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY,
+       .flags          = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY,
        .pio_mask       = 0x1f,         /* pio0-4 */
        .udma_mask      = 0x7f,         /* udma0-6 */
        .port_ops       = &uli_ops,
@@ -143,13 +143,13 @@ MODULE_VERSION(DRV_VERSION);
 
 static unsigned int get_scr_cfg_addr(struct ata_port *ap, unsigned int sc_reg)
 {
-       struct uli_priv *hpriv = ap->host_set->private_data;
+       struct uli_priv *hpriv = ap->host->private_data;
        return hpriv->scr_cfg_addr[ap->port_no] + (4 * sc_reg);
 }
 
 static u32 uli_scr_cfg_read (struct ata_port *ap, unsigned int sc_reg)
 {
-       struct pci_dev *pdev = to_pci_dev(ap->host_set->dev);
+       struct pci_dev *pdev = to_pci_dev(ap->host->dev);
        unsigned int cfg_addr = get_scr_cfg_addr(ap, sc_reg);
        u32 val;
 
@@ -159,7 +159,7 @@ static u32 uli_scr_cfg_read (struct ata_port *ap, unsigned int sc_reg)
 
 static void uli_scr_cfg_write (struct ata_port *ap, unsigned int scr, u32 val)
 {
-       struct pci_dev *pdev = to_pci_dev(ap->host_set->dev);
+       struct pci_dev *pdev = to_pci_dev(ap->host->dev);
        unsigned int cfg_addr = get_scr_cfg_addr(ap, scr);
 
        pci_write_config_dword(pdev, cfg_addr, val);
@@ -287,7 +287,7 @@ err_out:
 
 static int __init uli_init(void)
 {
-       return pci_module_init(&uli_pci_driver);
+       return pci_register_driver(&uli_pci_driver);
 }
 
 static void __exit uli_exit(void)
similarity index 98%
rename from drivers/scsi/sata_via.c
rename to drivers/ata/sata_via.c
index 01d40369a8a52d080e5b61be93f0158a896d1420..7f087aef99de25a0838c063bccb462a1626d955a 100644 (file)
@@ -77,6 +77,7 @@ static void svia_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val);
 static void vt6420_error_handler(struct ata_port *ap);
 
 static const struct pci_device_id svia_pci_tbl[] = {
+       { 0x1106, 0x0591, PCI_ANY_ID, PCI_ANY_ID, 0, 0, vt6420 },
        { 0x1106, 0x3149, PCI_ANY_ID, PCI_ANY_ID, 0, 0, vt6420 },
        { 0x1106, 0x3249, PCI_ANY_ID, PCI_ANY_ID, 0, 0, vt6421 },
 
@@ -175,7 +176,7 @@ static const struct ata_port_operations vt6421_sata_ops = {
 
 static struct ata_port_info vt6420_port_info = {
        .sht            = &svia_sht,
-       .host_flags     = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY,
+       .flags          = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY,
        .pio_mask       = 0x1f,
        .mwdma_mask     = 0x07,
        .udma_mask      = 0x7f,
@@ -345,7 +346,7 @@ static struct ata_probe_ent *vt6421_init_probe_ent(struct pci_dev *pdev)
        INIT_LIST_HEAD(&probe_ent->node);
 
        probe_ent->sht          = &svia_sht;
-       probe_ent->host_flags   = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY;
+       probe_ent->port_flags   = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY;
        probe_ent->port_ops     = &vt6421_sata_ops;
        probe_ent->n_ports      = N_PORTS;
        probe_ent->irq          = pdev->irq;
@@ -488,7 +489,7 @@ err_out:
 
 static int __init svia_init(void)
 {
-       return pci_module_init(&svia_pci_driver);
+       return pci_register_driver(&svia_pci_driver);
 }
 
 static void __exit svia_exit(void)
similarity index 97%
rename from drivers/scsi/sata_vsc.c
rename to drivers/ata/sata_vsc.c
index ad37871594f5baed6f6ecbb1ce860c15da08d230..d0d92f33de5476ad3d6fa1d187503c6e9cfa74bd 100644 (file)
@@ -123,7 +123,7 @@ static void vsc_intr_mask_update(struct ata_port *ap, u8 ctl)
        void __iomem *mask_addr;
        u8 mask;
 
-       mask_addr = ap->host_set->mmio_base +
+       mask_addr = ap->host->mmio_base +
                VSC_SATA_INT_MASK_OFFSET + ap->port_no;
        mask = readb(mask_addr);
        if (ctl & ATA_NIEN)
@@ -206,20 +206,20 @@ static void vsc_sata_tf_read(struct ata_port *ap, struct ata_taskfile *tf)
 static irqreturn_t vsc_sata_interrupt (int irq, void *dev_instance,
                                       struct pt_regs *regs)
 {
-       struct ata_host_set *host_set = dev_instance;
+       struct ata_host *host = dev_instance;
        unsigned int i;
        unsigned int handled = 0;
        u32 int_status;
 
-       spin_lock(&host_set->lock);
+       spin_lock(&host->lock);
 
-       int_status = readl(host_set->mmio_base + VSC_SATA_INT_STAT_OFFSET);
+       int_status = readl(host->mmio_base + VSC_SATA_INT_STAT_OFFSET);
 
-       for (i = 0; i < host_set->n_ports; i++) {
+       for (i = 0; i < host->n_ports; i++) {
                if (int_status & ((u32) 0xFF << (8 * i))) {
                        struct ata_port *ap;
 
-                       ap = host_set->ports[i];
+                       ap = host->ports[i];
 
                        if (is_vsc_sata_int_err(i, int_status)) {
                                u32 err_status;
@@ -259,7 +259,7 @@ static irqreturn_t vsc_sata_interrupt (int irq, void *dev_instance,
                }
        }
 
-       spin_unlock(&host_set->lock);
+       spin_unlock(&host->lock);
 
        return IRQ_RETVAL(handled);
 }
@@ -395,7 +395,7 @@ static int __devinit vsc_sata_init_one (struct pci_dev *pdev, const struct pci_d
        pci_write_config_byte(pdev, PCI_CACHE_LINE_SIZE, 0x80);
 
        probe_ent->sht = &vsc_sata_sht;
-       probe_ent->host_flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY |
+       probe_ent->port_flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY |
                                ATA_FLAG_MMIO;
        probe_ent->port_ops = &vsc_sata_ops;
        probe_ent->n_ports = 4;
@@ -462,7 +462,7 @@ static struct pci_driver vsc_sata_pci_driver = {
 
 static int __init vsc_sata_init(void)
 {
-       return pci_module_init(&vsc_sata_pci_driver);
+       return pci_register_driver(&vsc_sata_pci_driver);
 }
 
 
index 73177429fe741a87ac2ede3ebd8a747bbd75f288..b4970387a16f14b9e0e9af14587caaf73807e2e9 100644 (file)
@@ -1209,7 +1209,7 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SI,        PCI_DEVICE_ID_SI_962,           quirk_sis_96x_
 DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SI,     PCI_DEVICE_ID_SI_963,           quirk_sis_96x_smbus );
 DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SI,     PCI_DEVICE_ID_SI_LPC,           quirk_sis_96x_smbus );
 
-#if defined(CONFIG_SCSI_SATA) || defined(CONFIG_SCSI_SATA_MODULE)
+#if defined(CONFIG_ATA) || defined(CONFIG_ATA_MODULE)
 
 /*
  *     If we are using libata we can drive this chip properly but must
@@ -1299,7 +1299,7 @@ static int __init combined_setup(char *str)
 }
 __setup("combined_mode=", combined_setup);
 
-#ifdef CONFIG_SCSI_SATA_INTEL_COMBINED
+#ifdef CONFIG_SATA_INTEL_COMBINED
 static void __devinit quirk_intel_ide_combined(struct pci_dev *pdev)
 {
        u8 prog, comb, tmp;
@@ -1392,7 +1392,7 @@ static void __devinit quirk_intel_ide_combined(struct pci_dev *pdev)
                request_region(0x170, 8, "libata");     /* port 1 */
 }
 DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL,    PCI_ANY_ID,      quirk_intel_ide_combined );
-#endif /* CONFIG_SCSI_SATA_INTEL_COMBINED */
+#endif /* CONFIG_SATA_INTEL_COMBINED */
 
 
 int pcie_mch_quirk;
index 96a81cd17617aaa95fe7bad50875488182f65081..2df4d15c963432624c1e05c61d8a5ed0bd0e153d 100644 (file)
@@ -471,67 +471,6 @@ config SCSI_IN2000
 
 source "drivers/scsi/megaraid/Kconfig.megaraid"
 
-config SCSI_SATA
-       tristate "Serial ATA (SATA) support"
-       depends on SCSI
-       help
-         This driver family supports Serial ATA host controllers
-         and devices.
-
-         If unsure, say N.
-
-config SCSI_SATA_AHCI
-       tristate "AHCI SATA support"
-       depends on SCSI_SATA && PCI
-       help
-         This option enables support for AHCI Serial ATA.
-
-         If unsure, say N.
-
-config SCSI_SATA_SVW
-       tristate "ServerWorks Frodo / Apple K2 SATA support"
-       depends on SCSI_SATA && PCI
-       help
-         This option enables support for Broadcom/Serverworks/Apple K2
-         SATA support.
-
-         If unsure, say N.
-
-config SCSI_ATA_PIIX
-       tristate "Intel PIIX/ICH SATA support"
-       depends on SCSI_SATA && PCI
-       help
-         This option enables support for ICH5/6/7/8 Serial ATA.
-         If PATA support was enabled previously, this enables
-         support for select Intel PIIX/ICH PATA host controllers.
-
-         If unsure, say N.
-
-config SCSI_SATA_MV
-       tristate "Marvell SATA support (HIGHLY EXPERIMENTAL)"
-       depends on SCSI_SATA && PCI && EXPERIMENTAL
-       help
-         This option enables support for the Marvell Serial ATA family.
-         Currently supports 88SX[56]0[48][01] chips.
-
-         If unsure, say N.
-
-config SCSI_SATA_NV
-       tristate "NVIDIA SATA support"
-       depends on SCSI_SATA && PCI && EXPERIMENTAL
-       help
-         This option enables support for NVIDIA Serial ATA.
-
-         If unsure, say N.
-
-config SCSI_PDC_ADMA
-       tristate "Pacific Digital ADMA support"
-       depends on SCSI_SATA && PCI
-       help
-         This option enables support for Pacific Digital ADMA controllers
-
-         If unsure, say N.
-
 config SCSI_HPTIOP
        tristate "HighPoint RocketRAID 3xxx Controller support"
        depends on SCSI && PCI
@@ -542,83 +481,6 @@ config SCSI_HPTIOP
          To compile this driver as a module, choose M here; the module
          will be called hptiop. If unsure, say N.
 
-config SCSI_SATA_QSTOR
-       tristate "Pacific Digital SATA QStor support"
-       depends on SCSI_SATA && PCI
-       help
-         This option enables support for Pacific Digital Serial ATA QStor.
-
-         If unsure, say N.
-
-config SCSI_SATA_PROMISE
-       tristate "Promise SATA TX2/TX4 support"
-       depends on SCSI_SATA && PCI
-       help
-         This option enables support for Promise Serial ATA TX2/TX4.
-
-         If unsure, say N.
-
-config SCSI_SATA_SX4
-       tristate "Promise SATA SX4 support"
-       depends on SCSI_SATA && PCI && EXPERIMENTAL
-       help
-         This option enables support for Promise Serial ATA SX4.
-
-         If unsure, say N.
-
-config SCSI_SATA_SIL
-       tristate "Silicon Image SATA support"
-       depends on SCSI_SATA && PCI && EXPERIMENTAL
-       help
-         This option enables support for Silicon Image Serial ATA.
-
-         If unsure, say N.
-
-config SCSI_SATA_SIL24
-       tristate "Silicon Image 3124/3132 SATA support"
-       depends on SCSI_SATA && PCI && EXPERIMENTAL
-       help
-         This option enables support for Silicon Image 3124/3132 Serial ATA.
-
-         If unsure, say N.
-
-config SCSI_SATA_SIS
-       tristate "SiS 964/180 SATA support"
-       depends on SCSI_SATA && PCI && EXPERIMENTAL
-       help
-         This option enables support for SiS Serial ATA 964/180.
-
-         If unsure, say N.
-
-config SCSI_SATA_ULI
-       tristate "ULi Electronics SATA support"
-       depends on SCSI_SATA && PCI && EXPERIMENTAL
-       help
-         This option enables support for ULi Electronics SATA.
-
-         If unsure, say N.
-
-config SCSI_SATA_VIA
-       tristate "VIA SATA support"
-       depends on SCSI_SATA && PCI
-       help
-         This option enables support for VIA Serial ATA.
-
-         If unsure, say N.
-
-config SCSI_SATA_VITESSE
-       tristate "VITESSE VSC-7174 / INTEL 31244 SATA support"
-       depends on SCSI_SATA && PCI
-       help
-         This option enables support for Vitesse VSC7174 and Intel 31244 Serial ATA.
-
-         If unsure, say N.
-
-config SCSI_SATA_INTEL_COMBINED
-       bool
-       depends on IDE=y && !BLK_DEV_IDE_SATA && (SCSI_SATA_AHCI || SCSI_ATA_PIIX)
-       default y
-
 config SCSI_BUSLOGIC
        tristate "BusLogic SCSI support"
        depends on (PCI || ISA || MCA) && SCSI && ISA_DMA_API
index ebd0cf00bf3e6a9f359f3765d0adc592a72a6ef6..b678f957cfe2c424f8564dce935df8d51b83f92f 100644 (file)
@@ -122,21 +122,6 @@ obj-$(CONFIG_SCSI_LASI700) += 53c700.o lasi700.o
 obj-$(CONFIG_SCSI_NSP32)       += nsp32.o
 obj-$(CONFIG_SCSI_IPR)         += ipr.o
 obj-$(CONFIG_SCSI_IBMVSCSI)    += ibmvscsi/
-obj-$(CONFIG_SCSI_SATA_AHCI)   += libata.o ahci.o
-obj-$(CONFIG_SCSI_SATA_SVW)    += libata.o sata_svw.o
-obj-$(CONFIG_SCSI_ATA_PIIX)    += libata.o ata_piix.o
-obj-$(CONFIG_SCSI_SATA_PROMISE)        += libata.o sata_promise.o
-obj-$(CONFIG_SCSI_SATA_QSTOR)  += libata.o sata_qstor.o
-obj-$(CONFIG_SCSI_SATA_SIL)    += libata.o sata_sil.o
-obj-$(CONFIG_SCSI_SATA_SIL24)  += libata.o sata_sil24.o
-obj-$(CONFIG_SCSI_SATA_VIA)    += libata.o sata_via.o
-obj-$(CONFIG_SCSI_SATA_VITESSE)        += libata.o sata_vsc.o
-obj-$(CONFIG_SCSI_SATA_SIS)    += libata.o sata_sis.o
-obj-$(CONFIG_SCSI_SATA_SX4)    += libata.o sata_sx4.o
-obj-$(CONFIG_SCSI_SATA_NV)     += libata.o sata_nv.o
-obj-$(CONFIG_SCSI_SATA_ULI)    += libata.o sata_uli.o
-obj-$(CONFIG_SCSI_SATA_MV)     += libata.o sata_mv.o
-obj-$(CONFIG_SCSI_PDC_ADMA)    += libata.o pdc_adma.o
 obj-$(CONFIG_SCSI_HPTIOP)      += hptiop.o
 
 obj-$(CONFIG_ARM)              += arm/
@@ -166,7 +151,6 @@ ncr53c8xx-flags-$(CONFIG_SCSI_ZALON) \
 CFLAGS_ncr53c8xx.o     := $(ncr53c8xx-flags-y) $(ncr53c8xx-flags-m)
 zalon7xx-objs  := zalon.o ncr53c8xx.o
 NCR_Q720_mod-objs      := NCR_Q720.o ncr53c8xx.o
-libata-objs    := libata-core.o libata-scsi.o libata-bmdma.o libata-eh.o
 oktagon_esp_mod-objs   := oktagon_esp.o oktagon_io.o
 
 # Files generated that shall be removed upon make clean
diff --git a/include/asm-alpha/libata-portmap.h b/include/asm-alpha/libata-portmap.h
new file mode 100644 (file)
index 0000000..75484ef
--- /dev/null
@@ -0,0 +1 @@
+#include <asm-generic/libata-portmap.h>
diff --git a/include/asm-generic/libata-portmap.h b/include/asm-generic/libata-portmap.h
new file mode 100644 (file)
index 0000000..9202fd0
--- /dev/null
@@ -0,0 +1,12 @@
+#ifndef __ASM_GENERIC_LIBATA_PORTMAP_H
+#define __ASM_GENERIC_LIBATA_PORTMAP_H
+
+#define ATA_PRIMARY_CMD                0x1F0
+#define ATA_PRIMARY_CTL                0x3F6
+#define ATA_PRIMARY_IRQ                14
+
+#define ATA_SECONDARY_CMD      0x170
+#define ATA_SECONDARY_CTL      0x376
+#define ATA_SECONDARY_IRQ      15
+
+#endif
diff --git a/include/asm-i386/libata-portmap.h b/include/asm-i386/libata-portmap.h
new file mode 100644 (file)
index 0000000..75484ef
--- /dev/null
@@ -0,0 +1 @@
+#include <asm-generic/libata-portmap.h>
diff --git a/include/asm-ia64/libata-portmap.h b/include/asm-ia64/libata-portmap.h
new file mode 100644 (file)
index 0000000..75484ef
--- /dev/null
@@ -0,0 +1 @@
+#include <asm-generic/libata-portmap.h>
diff --git a/include/asm-powerpc/libata-portmap.h b/include/asm-powerpc/libata-portmap.h
new file mode 100644 (file)
index 0000000..75484ef
--- /dev/null
@@ -0,0 +1 @@
+#include <asm-generic/libata-portmap.h>
diff --git a/include/asm-sparc/libata-portmap.h b/include/asm-sparc/libata-portmap.h
new file mode 100644 (file)
index 0000000..75484ef
--- /dev/null
@@ -0,0 +1 @@
+#include <asm-generic/libata-portmap.h>
diff --git a/include/asm-sparc64/libata-portmap.h b/include/asm-sparc64/libata-portmap.h
new file mode 100644 (file)
index 0000000..75484ef
--- /dev/null
@@ -0,0 +1 @@
+#include <asm-generic/libata-portmap.h>
diff --git a/include/asm-x86_64/libata-portmap.h b/include/asm-x86_64/libata-portmap.h
new file mode 100644 (file)
index 0000000..75484ef
--- /dev/null
@@ -0,0 +1 @@
+#include <asm-generic/libata-portmap.h>
index 3671af869696d9dec5f21535d02af8d33ed078dd..991b858acc308c458229e200a75e45c8207d42f8 100644 (file)
@@ -40,6 +40,8 @@ enum {
        ATA_MAX_DEVICES         = 2,    /* per bus/port */
        ATA_MAX_PRD             = 256,  /* we could make these 256/256 */
        ATA_SECT_SIZE           = 512,
+       ATA_MAX_SECTORS         = 256,
+       ATA_MAX_SECTORS_LBA48   = 65535,/* TODO: 65536? */
 
        ATA_ID_WORDS            = 256,
        ATA_ID_SERNO_OFS        = 10,
@@ -168,12 +170,16 @@ enum {
        XFER_UDMA_2             = 0x42,
        XFER_UDMA_1             = 0x41,
        XFER_UDMA_0             = 0x40,
+       XFER_MW_DMA_4           = 0x24, /* CFA only */
+       XFER_MW_DMA_3           = 0x23, /* CFA only */
        XFER_MW_DMA_2           = 0x22,
        XFER_MW_DMA_1           = 0x21,
        XFER_MW_DMA_0           = 0x20,
        XFER_SW_DMA_2           = 0x12,
        XFER_SW_DMA_1           = 0x11,
        XFER_SW_DMA_0           = 0x10,
+       XFER_PIO_6              = 0x0E, /* CFA only */
+       XFER_PIO_5              = 0x0D, /* CFA only */
        XFER_PIO_4              = 0x0C,
        XFER_PIO_3              = 0x0B,
        XFER_PIO_2              = 0x0A,
@@ -272,7 +278,6 @@ struct ata_taskfile {
 };
 
 #define ata_id_is_ata(id)      (((id)[0] & (1 << 15)) == 0)
-#define ata_id_is_cfa(id)      ((id)[0] == 0x848A)
 #define ata_id_is_sata(id)     ((id)[93] == 0)
 #define ata_id_rahead_enabled(id) ((id)[85] & (1 << 6))
 #define ata_id_wcache_enabled(id) ((id)[85] & (1 << 5))
@@ -304,6 +309,9 @@ static inline unsigned int ata_id_major_version(const u16 *id)
 {
        unsigned int mver;
 
+       if (id[ATA_ID_MAJOR_VER] == 0xFFFF)
+               return 0;
+
        for (mver = 14; mver >= 1; mver--)
                if (id[ATA_ID_MAJOR_VER] & (1 << mver))
                        break;
@@ -322,6 +330,18 @@ static inline int ata_id_current_chs_valid(const u16 *id)
                id[56];    /* sectors in current translation */
 }
 
+static inline int ata_id_is_cfa(const u16 *id)
+{
+       u16 v = id[0];
+       if (v == 0x848A)        /* Standard CF */
+               return 1;
+       /* Could be CF hiding as standard ATA */
+       if (ata_id_major_version(id) >= 3 &&  id[82] != 0xFFFF &&
+                       (id[82] & ( 1 << 2)))
+               return 1;
+       return 0;
+}
+
 static inline int atapi_cdb_len(const u16 *dev_id)
 {
        u16 tmp = dev_id[0] & 0x3;
index 66c3100c2b94c19dc2eb581e000ce5fce24deb75..563885cb099520d5c0e410e0bafcdf12172f3d92 100644 (file)
@@ -36,6 +36,8 @@
 #include <linux/workqueue.h>
 #include <scsi/scsi_host.h>
 
+#include <asm/libata-portmap.h>
+
 /*
  * compile-time options: to be removed as soon as all the drivers are
  * converted to the new debugging mechanism
@@ -112,8 +114,6 @@ enum {
        /* tag ATA_MAX_QUEUE - 1 is reserved for internal commands */
        ATA_MAX_QUEUE           = 32,
        ATA_TAG_INTERNAL        = ATA_MAX_QUEUE - 1,
-       ATA_MAX_SECTORS         = 200,  /* FIXME */
-       ATA_MAX_SECTORS_LBA48   = 65535,
        ATA_MAX_BUS             = 2,
        ATA_DEF_BUSY_WAIT       = 10000,
        ATA_SHORT_PAUSE         = (HZ >> 6) + 1,
@@ -197,7 +197,7 @@ enum {
        ATA_QCFLAG_EH_SCHEDULED = (1 << 18), /* EH scheduled (obsolete) */
 
        /* host set flags */
-       ATA_HOST_SIMPLEX        = (1 << 0),     /* Host is simplex, one DMA channel per host_set only */
+       ATA_HOST_SIMPLEX        = (1 << 0),     /* Host is simplex, one DMA channel per host only */
        
        /* various lengths of time */
        ATA_TMOUT_BOOT          = 30 * HZ,      /* heuristic */
@@ -225,8 +225,8 @@ enum {
        /* encoding various smaller bitmaps into a single
         * unsigned int bitmap
         */
-       ATA_BITS_PIO            = 5,
-       ATA_BITS_MWDMA          = 3,
+       ATA_BITS_PIO            = 7,
+       ATA_BITS_MWDMA          = 5,
        ATA_BITS_UDMA           = 8,
 
        ATA_SHIFT_PIO           = 0,
@@ -350,23 +350,24 @@ struct ata_probe_ent {
        struct scsi_host_template *sht;
        struct ata_ioports      port[ATA_MAX_PORTS];
        unsigned int            n_ports;
-       unsigned int            hard_port_no;
+       unsigned int            dummy_port_mask;
        unsigned int            pio_mask;
        unsigned int            mwdma_mask;
        unsigned int            udma_mask;
-       unsigned int            legacy_mode;
        unsigned long           irq;
+       unsigned long           irq2;
        unsigned int            irq_flags;
-       unsigned long           host_flags;
-       unsigned long           host_set_flags;
+       unsigned long           port_flags;
+       unsigned long           _host_flags;
        void __iomem            *mmio_base;
        void                    *private_data;
 };
 
-struct ata_host_set {
+struct ata_host {
        spinlock_t              lock;
        struct device           *dev;
        unsigned long           irq;
+       unsigned long           irq2;
        void __iomem            *mmio_base;
        unsigned int            n_ports;
        void                    *private_data;
@@ -374,7 +375,6 @@ struct ata_host_set {
        unsigned long           flags;
        int                     simplex_claimed;        /* Keep seperate in case we
                                                           ever need to do this locked */
-       struct ata_host_set     *next;          /* for legacy mode */
        struct ata_port         *ports[0];
 };
 
@@ -420,7 +420,7 @@ struct ata_queued_cmd {
        void                    *private_data;
 };
 
-struct ata_host_stats {
+struct ata_port_stats {
        unsigned long           unhandled_irq;
        unsigned long           idle_irq;
        unsigned long           rw_reqbuf;
@@ -498,14 +498,13 @@ struct ata_eh_context {
 };
 
 struct ata_port {
-       struct Scsi_Host        *host;  /* our co-allocated scsi host */
+       struct Scsi_Host        *scsi_host; /* our co-allocated scsi host */
        const struct ata_port_operations *ops;
        spinlock_t              *lock;
        unsigned long           flags;  /* ATA_FLAG_xxx */
        unsigned int            pflags; /* ATA_PFLAG_xxx */
        unsigned int            id;     /* unique id req'd by scsi midlyr */
        unsigned int            port_no; /* unique port #; from zero */
-       unsigned int            hard_port_no;   /* hardware port #; from zero */
 
        struct ata_prd          *prd;    /* our SG list */
        dma_addr_t              prd_dma; /* and its DMA mapping */
@@ -524,7 +523,7 @@ struct ata_port {
        unsigned int            hw_sata_spd_limit;
        unsigned int            sata_spd_limit; /* SATA PHY speed limit */
 
-       /* record runtime error info, protected by host_set lock */
+       /* record runtime error info, protected by host lock */
        struct ata_eh_info      eh_info;
        /* EH context owned by EH */
        struct ata_eh_context   eh_context;
@@ -538,8 +537,8 @@ struct ata_port {
        unsigned int            active_tag;
        u32                     sactive;
 
-       struct ata_host_stats   stats;
-       struct ata_host_set     *host_set;
+       struct ata_port_stats   stats;
+       struct ata_host         *host;
        struct device           *dev;
 
        struct work_struct      port_task;
@@ -615,7 +614,7 @@ struct ata_port_operations {
        int (*port_start) (struct ata_port *ap);
        void (*port_stop) (struct ata_port *ap);
 
-       void (*host_stop) (struct ata_host_set *host_set);
+       void (*host_stop) (struct ata_host *host);
 
        void (*bmdma_stop) (struct ata_queued_cmd *qc);
        u8   (*bmdma_status) (struct ata_port *ap);
@@ -623,7 +622,7 @@ struct ata_port_operations {
 
 struct ata_port_info {
        struct scsi_host_template       *sht;
-       unsigned long           host_flags;
+       unsigned long           flags;
        unsigned long           pio_mask;
        unsigned long           mwdma_mask;
        unsigned long           udma_mask;
@@ -649,6 +648,8 @@ extern const unsigned long sata_deb_timing_normal[];
 extern const unsigned long sata_deb_timing_hotplug[];
 extern const unsigned long sata_deb_timing_long[];
 
+extern const struct ata_port_operations ata_dummy_port_ops;
+
 static inline const unsigned long *
 sata_ehc_deb_timing(struct ata_eh_context *ehc)
 {
@@ -658,6 +659,11 @@ sata_ehc_deb_timing(struct ata_eh_context *ehc)
                return sata_deb_timing_normal;
 }
 
+static inline int ata_port_is_dummy(struct ata_port *ap)
+{
+       return ap->ops == &ata_dummy_port_ops;
+}
+
 extern void ata_port_probe(struct ata_port *);
 extern void __sata_phy_reset(struct ata_port *ap);
 extern void sata_phy_reset(struct ata_port *ap);
@@ -676,19 +682,30 @@ extern void ata_std_ports(struct ata_ioports *ioaddr);
 extern int ata_pci_init_one (struct pci_dev *pdev, struct ata_port_info **port_info,
                             unsigned int n_ports);
 extern void ata_pci_remove_one (struct pci_dev *pdev);
-extern void ata_pci_device_do_suspend(struct pci_dev *pdev, pm_message_t state);
+extern void ata_pci_device_do_suspend(struct pci_dev *pdev, pm_message_t mesg);
 extern void ata_pci_device_do_resume(struct pci_dev *pdev);
-extern int ata_pci_device_suspend(struct pci_dev *pdev, pm_message_t state);
+extern int ata_pci_device_suspend(struct pci_dev *pdev, pm_message_t mesg);
 extern int ata_pci_device_resume(struct pci_dev *pdev);
 extern int ata_pci_clear_simplex(struct pci_dev *pdev);
 #endif /* CONFIG_PCI */
 extern int ata_device_add(const struct ata_probe_ent *ent);
 extern void ata_port_detach(struct ata_port *ap);
-extern void ata_host_set_remove(struct ata_host_set *host_set);
+extern void ata_host_init(struct ata_host *, struct device *,
+                         unsigned long, const struct ata_port_operations *);
+extern void ata_host_remove(struct ata_host *host);
 extern int ata_scsi_detect(struct scsi_host_template *sht);
 extern int ata_scsi_ioctl(struct scsi_device *dev, int cmd, void __user *arg);
 extern int ata_scsi_queuecmd(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *));
 extern int ata_scsi_release(struct Scsi_Host *host);
+extern void ata_sas_port_destroy(struct ata_port *);
+extern struct ata_port *ata_sas_port_alloc(struct ata_host *,
+                                          struct ata_port_info *, struct Scsi_Host *);
+extern int ata_sas_port_init(struct ata_port *);
+extern int ata_sas_port_start(struct ata_port *ap);
+extern void ata_sas_port_stop(struct ata_port *ap);
+extern int ata_sas_slave_configure(struct scsi_device *, struct ata_port *);
+extern int ata_sas_queuecmd(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *),
+                           struct ata_port *ap);
 extern unsigned int ata_host_intr(struct ata_port *ap, struct ata_queued_cmd *qc);
 extern int sata_scr_valid(struct ata_port *ap);
 extern int sata_scr_read(struct ata_port *ap, int reg, u32 *val);
@@ -697,10 +714,9 @@ extern int sata_scr_write_flush(struct ata_port *ap, int reg, u32 val);
 extern int ata_port_online(struct ata_port *ap);
 extern int ata_port_offline(struct ata_port *ap);
 extern int ata_scsi_device_resume(struct scsi_device *);
-extern int ata_scsi_device_suspend(struct scsi_device *, pm_message_t state);
-extern int ata_host_set_suspend(struct ata_host_set *host_set,
-                               pm_message_t mesg);
-extern void ata_host_set_resume(struct ata_host_set *host_set);
+extern int ata_scsi_device_suspend(struct scsi_device *, pm_message_t mesg);
+extern int ata_host_suspend(struct ata_host *host, pm_message_t mesg);
+extern void ata_host_resume(struct ata_host *host);
 extern int ata_ratelimit(void);
 extern unsigned int ata_busy_sleep(struct ata_port *ap,
                                   unsigned long timeout_pat,
@@ -725,7 +741,7 @@ extern u8 ata_altstatus(struct ata_port *ap);
 extern void ata_exec_command(struct ata_port *ap, const struct ata_taskfile *tf);
 extern int ata_port_start (struct ata_port *ap);
 extern void ata_port_stop (struct ata_port *ap);
-extern void ata_host_stop (struct ata_host_set *host_set);
+extern void ata_host_stop (struct ata_host *host);
 extern irqreturn_t ata_interrupt (int irq, void *dev_instance, struct pt_regs *regs);
 extern void ata_mmio_data_xfer(struct ata_device *adev, unsigned char *buf,
                               unsigned int buflen, int write_data);
@@ -811,7 +827,7 @@ struct pci_bits {
        unsigned long           val;
 };
 
-extern void ata_pci_host_stop (struct ata_host_set *host_set);
+extern void ata_pci_host_stop (struct ata_host *host);
 extern struct ata_probe_ent *
 ata_pci_init_native_mode(struct pci_dev *pdev, struct ata_port_info **port, int portmask);
 extern int pci_test_config_bits(struct pci_dev *pdev, const struct pci_bits *bits);