Merge branch 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jgarzi...
authorLinus Torvalds <torvalds@woody.linux-foundation.org>
Sun, 24 Feb 2008 05:40:32 +0000 (21:40 -0800)
committerLinus Torvalds <torvalds@woody.linux-foundation.org>
Sun, 24 Feb 2008 05:40:32 +0000 (21:40 -0800)
* 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jgarzik/libata-dev:
  libata-core: fix kernel-doc warning
  sata_fsl: fix build with ATA_VERBOSE_DEBUG
  [libata] ahci: AMD SB700/SB800 SATA support 64bit DMA
  libata-pmp: clear hob for pmp register accesses
  libata: automatically use DMADIR if drive/bridge requires it
  power_state: get rid of write-only variable in SATA
  pata_atiixp: Use 255 sector limit

drivers/ata/ahci.c
drivers/ata/libata-core.c
drivers/ata/libata-pmp.c
drivers/ata/libata-scsi.c
drivers/ata/pata_atiixp.c
drivers/ata/sata_fsl.c
include/linux/ata.h
include/linux/libata.h

index 6dd12f7019a006cefc64a7a5b1b10d3b7a747160..1db93b6190744015e251c5d428b58a762cf3c39a 100644 (file)
@@ -85,6 +85,7 @@ enum {
        board_ahci_ign_iferr    = 2,
        board_ahci_sb600        = 3,
        board_ahci_mv           = 4,
+       board_ahci_sb700        = 5,
 
        /* global controller registers */
        HOST_CAP                = 0x00, /* host capabilities */
@@ -442,6 +443,16 @@ static const struct ata_port_info ahci_port_info[] = {
                .udma_mask      = ATA_UDMA6,
                .port_ops       = &ahci_ops,
        },
+       /* board_ahci_sb700 */
+       {
+               AHCI_HFLAGS     (AHCI_HFLAG_IGN_SERR_INTERNAL |
+                                AHCI_HFLAG_NO_PMP),
+               .flags          = AHCI_FLAG_COMMON,
+               .link_flags     = AHCI_LFLAG_COMMON,
+               .pio_mask       = 0x1f, /* pio0-4 */
+               .udma_mask      = ATA_UDMA6,
+               .port_ops       = &ahci_ops,
+       },
 };
 
 static const struct pci_device_id ahci_pci_tbl[] = {
@@ -484,12 +495,12 @@ static const struct pci_device_id ahci_pci_tbl[] = {
 
        /* ATI */
        { PCI_VDEVICE(ATI, 0x4380), board_ahci_sb600 }, /* ATI SB600 */
-       { PCI_VDEVICE(ATI, 0x4390), board_ahci_sb600 }, /* ATI SB700/800 */
-       { PCI_VDEVICE(ATI, 0x4391), board_ahci_sb600 }, /* ATI SB700/800 */
-       { PCI_VDEVICE(ATI, 0x4392), board_ahci_sb600 }, /* ATI SB700/800 */
-       { PCI_VDEVICE(ATI, 0x4393), board_ahci_sb600 }, /* ATI SB700/800 */
-       { PCI_VDEVICE(ATI, 0x4394), board_ahci_sb600 }, /* ATI SB700/800 */
-       { PCI_VDEVICE(ATI, 0x4395), board_ahci_sb600 }, /* ATI SB700/800 */
+       { PCI_VDEVICE(ATI, 0x4390), board_ahci_sb700 }, /* ATI SB700/800 */
+       { PCI_VDEVICE(ATI, 0x4391), board_ahci_sb700 }, /* ATI SB700/800 */
+       { PCI_VDEVICE(ATI, 0x4392), board_ahci_sb700 }, /* ATI SB700/800 */
+       { PCI_VDEVICE(ATI, 0x4393), board_ahci_sb700 }, /* ATI SB700/800 */
+       { PCI_VDEVICE(ATI, 0x4394), board_ahci_sb700 }, /* ATI SB700/800 */
+       { PCI_VDEVICE(ATI, 0x4395), board_ahci_sb700 }, /* ATI SB700/800 */
 
        /* VIA */
        { PCI_VDEVICE(VIA, 0x3349), board_ahci_vt8251 }, /* VIA VT8251 */
index 4cf8662df99ea875feb85ffa7f743f48423def45..fbc24358ada030bf3cc329682ee617374229dd3a 100644 (file)
@@ -153,7 +153,7 @@ MODULE_VERSION(DRV_VERSION);
 
 /**
  *     ata_force_cbl - force cable type according to libata.force
- *     @link: ATA link of interest
+ *     @ap: ATA port of interest
  *
  *     Force cable type according to libata.force and whine about it.
  *     The last entry which has matching port number is used, so it
@@ -2396,6 +2396,7 @@ int ata_dev_configure(struct ata_device *dev)
        else if (dev->class == ATA_DEV_ATAPI) {
                const char *cdb_intr_string = "";
                const char *atapi_an_string = "";
+               const char *dma_dir_string = "";
                u32 sntf;
 
                rc = atapi_cdb_len(id);
@@ -2436,13 +2437,19 @@ int ata_dev_configure(struct ata_device *dev)
                        cdb_intr_string = ", CDB intr";
                }
 
+               if (atapi_dmadir || atapi_id_dmadir(dev->id)) {
+                       dev->flags |= ATA_DFLAG_DMADIR;
+                       dma_dir_string = ", DMADIR";
+               }
+
                /* print device info to dmesg */
                if (ata_msg_drv(ap) && print_info)
                        ata_dev_printk(dev, KERN_INFO,
-                                      "ATAPI: %s, %s, max %s%s%s\n",
+                                      "ATAPI: %s, %s, max %s%s%s%s\n",
                                       modelbuf, fwrevbuf,
                                       ata_mode_string(xfer_mask),
-                                      cdb_intr_string, atapi_an_string);
+                                      cdb_intr_string, atapi_an_string,
+                                      dma_dir_string);
        }
 
        /* determine max_sectors */
@@ -6560,8 +6567,6 @@ int ata_host_suspend(struct ata_host *host, pm_message_t mesg)
        ata_lpm_enable(host);
 
        rc = ata_host_request_pm(host, mesg, 0, ATA_EHI_QUIET, 1);
-       if (rc == 0)
-               host->dev->power.power_state = mesg;
        return rc;
 }
 
@@ -6580,7 +6585,6 @@ void ata_host_resume(struct ata_host *host)
 {
        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;
 
        /* reenable link pm */
        ata_lpm_disable(host);
index caef2bbd4a8a1525be252d6cfcf627901e52e261..d91f5090ba9d0d062e70d324b4e6566295e93d55 100644 (file)
@@ -35,7 +35,7 @@ static unsigned int sata_pmp_read(struct ata_link *link, int reg, u32 *r_val)
        ata_tf_init(pmp_dev, &tf);
        tf.command = ATA_CMD_PMP_READ;
        tf.protocol = ATA_PROT_NODATA;
-       tf.flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE;
+       tf.flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE | ATA_TFLAG_LBA48;
        tf.feature = reg;
        tf.device = link->pmp;
 
@@ -71,7 +71,7 @@ static unsigned int sata_pmp_write(struct ata_link *link, int reg, u32 val)
        ata_tf_init(pmp_dev, &tf);
        tf.command = ATA_CMD_PMP_WRITE;
        tf.protocol = ATA_PROT_NODATA;
-       tf.flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE;
+       tf.flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE | ATA_TFLAG_LBA48;
        tf.feature = reg;
        tf.device = link->pmp;
        tf.nsect = val & 0xff;
index f888babc8283cc3512c2932769ff9bfc50a570de..0562b0a49f3b2acc474c3145ee0f48911eefe349 100644 (file)
@@ -2582,7 +2582,8 @@ static unsigned int atapi_xlat(struct ata_queued_cmd *qc)
                qc->tf.protocol = ATAPI_PROT_DMA;
                qc->tf.feature |= ATAPI_PKT_DMA;
 
-               if (atapi_dmadir && (scmd->sc_data_direction != DMA_TO_DEVICE))
+               if ((dev->flags & ATA_DFLAG_DMADIR) &&
+                   (scmd->sc_data_direction != DMA_TO_DEVICE))
                        /* some SATA bridges need us to indicate data xfer direction */
                        qc->tf.feature |= ATAPI_DMADIR;
        }
index 9623f52955306d690ff7f78713ff24a7f6de08db..408bdc1a9776508584ce49f09ba754465462f98a 100644 (file)
@@ -227,7 +227,7 @@ static struct scsi_host_template atiixp_sht = {
        .queuecommand           = ata_scsi_queuecmd,
        .can_queue              = ATA_DEF_QUEUE,
        .this_id                = ATA_SHT_THIS_ID,
-       .sg_tablesize           = LIBATA_MAX_PRD,
+       .sg_tablesize           = LIBATA_DUMB_MAX_PRD,
        .cmd_per_lun            = ATA_SHT_CMD_PER_LUN,
        .emulated               = ATA_SHT_EMULATED,
        .use_clustering         = ATA_SHT_USE_CLUSTERING,
@@ -259,7 +259,7 @@ static struct ata_port_operations atiixp_port_ops = {
        .bmdma_stop     = atiixp_bmdma_stop,
        .bmdma_status   = ata_bmdma_status,
 
-       .qc_prep        = ata_qc_prep,
+       .qc_prep        = ata_dumb_qc_prep,
        .qc_issue       = ata_qc_issue_prot,
 
        .data_xfer      = ata_data_xfer,
index 9323dd0c7d8deefdfa202379e3aeeef174e15e32..07791a7a48a59577067e59150613905f30640eb8 100644 (file)
@@ -335,7 +335,7 @@ static unsigned int sata_fsl_fill_sg(struct ata_queued_cmd *qc, void *cmd_desc,
        dma_addr_t indirect_ext_segment_paddr;
        unsigned int si;
 
-       VPRINTK("SATA FSL : cd = 0x%x, prd = 0x%x\n", cmd_desc, prd);
+       VPRINTK("SATA FSL : cd = 0x%p, prd = 0x%p\n", cmd_desc, prd);
 
        indirect_ext_segment_paddr = cmd_desc_paddr +
            SATA_FSL_CMD_DESC_OFFSET_TO_PRDT + SATA_FSL_MAX_PRD_DIRECT * 16;
@@ -459,7 +459,8 @@ static unsigned int sata_fsl_qc_issue(struct ata_queued_cmd *qc)
        VPRINTK("CE=0x%x, DE=0x%x, CC=0x%x, CmdStat = 0x%x\n",
                ioread32(CE + hcr_base),
                ioread32(DE + hcr_base),
-               ioread32(CC + hcr_base), ioread32(COMMANDSTAT + csr_base));
+               ioread32(CC + hcr_base),
+               ioread32(COMMANDSTAT + host_priv->csr_base));
 
        return 0;
 }
@@ -522,7 +523,8 @@ static void sata_fsl_freeze(struct ata_port *ap)
                ioread32(CQ + hcr_base),
                ioread32(CA + hcr_base),
                ioread32(CE + hcr_base), ioread32(DE + hcr_base));
-       VPRINTK("CmdStat = 0x%x\n", ioread32(csr_base + COMMANDSTAT));
+       VPRINTK("CmdStat = 0x%x\n",
+               ioread32(host_priv->csr_base + COMMANDSTAT));
 
        /* disable interrupts on the controller/port */
        temp = ioread32(hcr_base + HCONTROL);
index 78bbacaed8c4a4f2521f552432d2b4baf2dfc226..1c622e2b0504749e7fdc59b7406a12a1819f6651 100644 (file)
@@ -659,6 +659,11 @@ static inline int atapi_command_packet_set(const u16 *dev_id)
        return (dev_id[0] >> 8) & 0x1f;
 }
 
+static inline int atapi_id_dmadir(const u16 *dev_id)
+{
+       return ata_id_major_version(dev_id) >= 7 && (dev_id[62] & 0x8000);
+}
+
 static inline int is_multi_taskfile(struct ata_taskfile *tf)
 {
        return (tf->command == ATA_CMD_READ_MULTI) ||
index ce7603a73156b15490d054e4374fe1560d04a57f..a05f600136426c74455f2739169be4fec4c9497f 100644 (file)
@@ -138,6 +138,7 @@ enum {
        ATA_DFLAG_AN            = (1 << 7), /* AN configured */
        ATA_DFLAG_HIPM          = (1 << 8), /* device supports HIPM */
        ATA_DFLAG_DIPM          = (1 << 9), /* device supports DIPM */
+       ATA_DFLAG_DMADIR        = (1 << 10), /* device requires DMADIR */
        ATA_DFLAG_CFG_MASK      = (1 << 12) - 1,
 
        ATA_DFLAG_PIO           = (1 << 12), /* device limited to PIO mode */