diff options
Diffstat (limited to 'drivers/ata')
-rw-r--r-- | drivers/ata/Kconfig | 6 | ||||
-rw-r--r-- | drivers/ata/libahci.c | 21 | ||||
-rw-r--r-- | drivers/ata/libata-core.c | 6 | ||||
-rw-r--r-- | drivers/ata/libata-scsi.c | 29 | ||||
-rw-r--r-- | drivers/ata/pata_macio.c | 10 | ||||
-rw-r--r-- | drivers/ata/sata_nv.c | 2 | ||||
-rw-r--r-- | drivers/ata/sata_sil24.c | 24 | ||||
-rw-r--r-- | drivers/ata/sata_via.c | 27 |
8 files changed, 87 insertions, 38 deletions
diff --git a/drivers/ata/Kconfig b/drivers/ata/Kconfig index 73f883333a0d..aa85a98d3a4f 100644 --- a/drivers/ata/Kconfig +++ b/drivers/ata/Kconfig | |||
@@ -168,10 +168,10 @@ config ATA_BMDMA | |||
168 | default y | 168 | default y |
169 | help | 169 | help |
170 | This option adds support for SFF ATA controllers with BMDMA | 170 | This option adds support for SFF ATA controllers with BMDMA |
171 | capability. BMDMA stands for bus-master DMA and the | 171 | capability. BMDMA stands for bus-master DMA and is the |
172 | de-facto DMA interface for SFF controllers. | 172 | de facto DMA interface for SFF controllers. |
173 | 173 | ||
174 | If unuser, say Y. | 174 | If unsure, say Y. |
175 | 175 | ||
176 | if ATA_BMDMA | 176 | if ATA_BMDMA |
177 | 177 | ||
diff --git a/drivers/ata/libahci.c b/drivers/ata/libahci.c index 1984a6e89e84..261f86d102e8 100644 --- a/drivers/ata/libahci.c +++ b/drivers/ata/libahci.c | |||
@@ -541,29 +541,11 @@ static int ahci_scr_write(struct ata_link *link, unsigned int sc_reg, u32 val) | |||
541 | return -EINVAL; | 541 | return -EINVAL; |
542 | } | 542 | } |
543 | 543 | ||
544 | static int ahci_is_device_present(void __iomem *port_mmio) | ||
545 | { | ||
546 | u8 status = readl(port_mmio + PORT_TFDATA) & 0xff; | ||
547 | |||
548 | /* Make sure PxTFD.STS.BSY and PxTFD.STS.DRQ are 0 */ | ||
549 | if (status & (ATA_BUSY | ATA_DRQ)) | ||
550 | return 0; | ||
551 | |||
552 | /* Make sure PxSSTS.DET is 3h */ | ||
553 | status = readl(port_mmio + PORT_SCR_STAT) & 0xf; | ||
554 | if (status != 3) | ||
555 | return 0; | ||
556 | return 1; | ||
557 | } | ||
558 | |||
559 | void ahci_start_engine(struct ata_port *ap) | 544 | void ahci_start_engine(struct ata_port *ap) |
560 | { | 545 | { |
561 | void __iomem *port_mmio = ahci_port_base(ap); | 546 | void __iomem *port_mmio = ahci_port_base(ap); |
562 | u32 tmp; | 547 | u32 tmp; |
563 | 548 | ||
564 | if (!ahci_is_device_present(port_mmio)) | ||
565 | return; | ||
566 | |||
567 | /* start DMA */ | 549 | /* start DMA */ |
568 | tmp = readl(port_mmio + PORT_CMD); | 550 | tmp = readl(port_mmio + PORT_CMD); |
569 | tmp |= PORT_CMD_START; | 551 | tmp |= PORT_CMD_START; |
@@ -1892,6 +1874,9 @@ static void ahci_error_handler(struct ata_port *ap) | |||
1892 | } | 1874 | } |
1893 | 1875 | ||
1894 | sata_pmp_error_handler(ap); | 1876 | sata_pmp_error_handler(ap); |
1877 | |||
1878 | if (!ata_dev_enabled(ap->link.device)) | ||
1879 | ahci_stop_engine(ap); | ||
1895 | } | 1880 | } |
1896 | 1881 | ||
1897 | static void ahci_post_internal_cmd(struct ata_queued_cmd *qc) | 1882 | static void ahci_post_internal_cmd(struct ata_queued_cmd *qc) |
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index 06b7e49e039c..ddf8e4862787 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c | |||
@@ -4119,9 +4119,8 @@ int ata_dev_revalidate(struct ata_device *dev, unsigned int new_class, | |||
4119 | dev->n_sectors > n_sectors && dev->n_sectors == n_native_sectors) { | 4119 | dev->n_sectors > n_sectors && dev->n_sectors == n_native_sectors) { |
4120 | ata_dev_printk(dev, KERN_WARNING, | 4120 | ata_dev_printk(dev, KERN_WARNING, |
4121 | "new n_sectors matches native, probably " | 4121 | "new n_sectors matches native, probably " |
4122 | "late HPA unlock, continuing\n"); | 4122 | "late HPA unlock, n_sectors updated\n"); |
4123 | /* keep using the old n_sectors */ | 4123 | /* use the larger n_sectors */ |
4124 | dev->n_sectors = n_sectors; | ||
4125 | return 0; | 4124 | return 0; |
4126 | } | 4125 | } |
4127 | 4126 | ||
@@ -6669,6 +6668,7 @@ EXPORT_SYMBOL_GPL(ata_dummy_port_info); | |||
6669 | EXPORT_SYMBOL_GPL(ata_link_next); | 6668 | EXPORT_SYMBOL_GPL(ata_link_next); |
6670 | EXPORT_SYMBOL_GPL(ata_dev_next); | 6669 | EXPORT_SYMBOL_GPL(ata_dev_next); |
6671 | EXPORT_SYMBOL_GPL(ata_std_bios_param); | 6670 | EXPORT_SYMBOL_GPL(ata_std_bios_param); |
6671 | EXPORT_SYMBOL_GPL(ata_scsi_unlock_native_capacity); | ||
6672 | EXPORT_SYMBOL_GPL(ata_host_init); | 6672 | EXPORT_SYMBOL_GPL(ata_host_init); |
6673 | EXPORT_SYMBOL_GPL(ata_host_alloc); | 6673 | EXPORT_SYMBOL_GPL(ata_host_alloc); |
6674 | EXPORT_SYMBOL_GPL(ata_host_alloc_pinfo); | 6674 | EXPORT_SYMBOL_GPL(ata_host_alloc_pinfo); |
diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c index cfa9dd3d7253..a54273d2c3c6 100644 --- a/drivers/ata/libata-scsi.c +++ b/drivers/ata/libata-scsi.c | |||
@@ -415,6 +415,35 @@ int ata_std_bios_param(struct scsi_device *sdev, struct block_device *bdev, | |||
415 | } | 415 | } |
416 | 416 | ||
417 | /** | 417 | /** |
418 | * ata_scsi_unlock_native_capacity - unlock native capacity | ||
419 | * @sdev: SCSI device to adjust device capacity for | ||
420 | * | ||
421 | * This function is called if a partition on @sdev extends beyond | ||
422 | * the end of the device. It requests EH to unlock HPA. | ||
423 | * | ||
424 | * LOCKING: | ||
425 | * Defined by the SCSI layer. Might sleep. | ||
426 | */ | ||
427 | void ata_scsi_unlock_native_capacity(struct scsi_device *sdev) | ||
428 | { | ||
429 | struct ata_port *ap = ata_shost_to_port(sdev->host); | ||
430 | struct ata_device *dev; | ||
431 | unsigned long flags; | ||
432 | |||
433 | spin_lock_irqsave(ap->lock, flags); | ||
434 | |||
435 | dev = ata_scsi_find_dev(ap, sdev); | ||
436 | if (dev && dev->n_sectors < dev->n_native_sectors) { | ||
437 | dev->flags |= ATA_DFLAG_UNLOCK_HPA; | ||
438 | dev->link->eh_info.action |= ATA_EH_RESET; | ||
439 | ata_port_schedule_eh(ap); | ||
440 | } | ||
441 | |||
442 | spin_unlock_irqrestore(ap->lock, flags); | ||
443 | ata_port_wait_eh(ap); | ||
444 | } | ||
445 | |||
446 | /** | ||
418 | * ata_get_identity - Handler for HDIO_GET_IDENTITY ioctl | 447 | * ata_get_identity - Handler for HDIO_GET_IDENTITY ioctl |
419 | * @ap: target port | 448 | * @ap: target port |
420 | * @sdev: SCSI device to get identify data for | 449 | * @sdev: SCSI device to get identify data for |
diff --git a/drivers/ata/pata_macio.c b/drivers/ata/pata_macio.c index 76640ac76888..75b49d01780b 100644 --- a/drivers/ata/pata_macio.c +++ b/drivers/ata/pata_macio.c | |||
@@ -1355,8 +1355,11 @@ static struct of_device_id pata_macio_match[] = | |||
1355 | 1355 | ||
1356 | static struct macio_driver pata_macio_driver = | 1356 | static struct macio_driver pata_macio_driver = |
1357 | { | 1357 | { |
1358 | .name = "pata-macio", | 1358 | .driver = { |
1359 | .match_table = pata_macio_match, | 1359 | .name = "pata-macio", |
1360 | .owner = THIS_MODULE, | ||
1361 | .of_match_table = pata_macio_match, | ||
1362 | }, | ||
1360 | .probe = pata_macio_attach, | 1363 | .probe = pata_macio_attach, |
1361 | .remove = pata_macio_detach, | 1364 | .remove = pata_macio_detach, |
1362 | #ifdef CONFIG_PM | 1365 | #ifdef CONFIG_PM |
@@ -1366,9 +1369,6 @@ static struct macio_driver pata_macio_driver = | |||
1366 | #ifdef CONFIG_PMAC_MEDIABAY | 1369 | #ifdef CONFIG_PMAC_MEDIABAY |
1367 | .mediabay_event = pata_macio_mb_event, | 1370 | .mediabay_event = pata_macio_mb_event, |
1368 | #endif | 1371 | #endif |
1369 | .driver = { | ||
1370 | .owner = THIS_MODULE, | ||
1371 | }, | ||
1372 | }; | 1372 | }; |
1373 | 1373 | ||
1374 | static const struct pci_device_id pata_macio_pci_match[] = { | 1374 | static const struct pci_device_id pata_macio_pci_match[] = { |
diff --git a/drivers/ata/sata_nv.c b/drivers/ata/sata_nv.c index 6fd114784116..21161136cad0 100644 --- a/drivers/ata/sata_nv.c +++ b/drivers/ata/sata_nv.c | |||
@@ -1669,7 +1669,6 @@ static void nv_mcp55_freeze(struct ata_port *ap) | |||
1669 | mask = readl(mmio_base + NV_INT_ENABLE_MCP55); | 1669 | mask = readl(mmio_base + NV_INT_ENABLE_MCP55); |
1670 | mask &= ~(NV_INT_ALL_MCP55 << shift); | 1670 | mask &= ~(NV_INT_ALL_MCP55 << shift); |
1671 | writel(mask, mmio_base + NV_INT_ENABLE_MCP55); | 1671 | writel(mask, mmio_base + NV_INT_ENABLE_MCP55); |
1672 | ata_sff_freeze(ap); | ||
1673 | } | 1672 | } |
1674 | 1673 | ||
1675 | static void nv_mcp55_thaw(struct ata_port *ap) | 1674 | static void nv_mcp55_thaw(struct ata_port *ap) |
@@ -1683,7 +1682,6 @@ static void nv_mcp55_thaw(struct ata_port *ap) | |||
1683 | mask = readl(mmio_base + NV_INT_ENABLE_MCP55); | 1682 | mask = readl(mmio_base + NV_INT_ENABLE_MCP55); |
1684 | mask |= (NV_INT_MASK_MCP55 << shift); | 1683 | mask |= (NV_INT_MASK_MCP55 << shift); |
1685 | writel(mask, mmio_base + NV_INT_ENABLE_MCP55); | 1684 | writel(mask, mmio_base + NV_INT_ENABLE_MCP55); |
1686 | ata_sff_thaw(ap); | ||
1687 | } | 1685 | } |
1688 | 1686 | ||
1689 | static void nv_adma_error_handler(struct ata_port *ap) | 1687 | static void nv_adma_error_handler(struct ata_port *ap) |
diff --git a/drivers/ata/sata_sil24.c b/drivers/ata/sata_sil24.c index e9250514734b..be7726d7686d 100644 --- a/drivers/ata/sata_sil24.c +++ b/drivers/ata/sata_sil24.c | |||
@@ -539,12 +539,12 @@ static void sil24_config_port(struct ata_port *ap) | |||
539 | writel(PORT_CS_IRQ_WOC, port + PORT_CTRL_CLR); | 539 | writel(PORT_CS_IRQ_WOC, port + PORT_CTRL_CLR); |
540 | 540 | ||
541 | /* zero error counters. */ | 541 | /* zero error counters. */ |
542 | writel(0x8000, port + PORT_DECODE_ERR_THRESH); | 542 | writew(0x8000, port + PORT_DECODE_ERR_THRESH); |
543 | writel(0x8000, port + PORT_CRC_ERR_THRESH); | 543 | writew(0x8000, port + PORT_CRC_ERR_THRESH); |
544 | writel(0x8000, port + PORT_HSHK_ERR_THRESH); | 544 | writew(0x8000, port + PORT_HSHK_ERR_THRESH); |
545 | writel(0x0000, port + PORT_DECODE_ERR_CNT); | 545 | writew(0x0000, port + PORT_DECODE_ERR_CNT); |
546 | writel(0x0000, port + PORT_CRC_ERR_CNT); | 546 | writew(0x0000, port + PORT_CRC_ERR_CNT); |
547 | writel(0x0000, port + PORT_HSHK_ERR_CNT); | 547 | writew(0x0000, port + PORT_HSHK_ERR_CNT); |
548 | 548 | ||
549 | /* always use 64bit activation */ | 549 | /* always use 64bit activation */ |
550 | writel(PORT_CS_32BIT_ACTV, port + PORT_CTRL_CLR); | 550 | writel(PORT_CS_32BIT_ACTV, port + PORT_CTRL_CLR); |
@@ -622,6 +622,11 @@ static int sil24_exec_polled_cmd(struct ata_port *ap, int pmp, | |||
622 | irq_enabled = readl(port + PORT_IRQ_ENABLE_SET); | 622 | irq_enabled = readl(port + PORT_IRQ_ENABLE_SET); |
623 | writel(PORT_IRQ_COMPLETE | PORT_IRQ_ERROR, port + PORT_IRQ_ENABLE_CLR); | 623 | writel(PORT_IRQ_COMPLETE | PORT_IRQ_ERROR, port + PORT_IRQ_ENABLE_CLR); |
624 | 624 | ||
625 | /* | ||
626 | * The barrier is required to ensure that writes to cmd_block reach | ||
627 | * the memory before the write to PORT_CMD_ACTIVATE. | ||
628 | */ | ||
629 | wmb(); | ||
625 | writel((u32)paddr, port + PORT_CMD_ACTIVATE); | 630 | writel((u32)paddr, port + PORT_CMD_ACTIVATE); |
626 | writel((u64)paddr >> 32, port + PORT_CMD_ACTIVATE + 4); | 631 | writel((u64)paddr >> 32, port + PORT_CMD_ACTIVATE + 4); |
627 | 632 | ||
@@ -865,7 +870,7 @@ static void sil24_qc_prep(struct ata_queued_cmd *qc) | |||
865 | } else { | 870 | } else { |
866 | prb = &cb->atapi.prb; | 871 | prb = &cb->atapi.prb; |
867 | sge = cb->atapi.sge; | 872 | sge = cb->atapi.sge; |
868 | memset(cb->atapi.cdb, 0, 32); | 873 | memset(cb->atapi.cdb, 0, sizeof(cb->atapi.cdb)); |
869 | memcpy(cb->atapi.cdb, qc->cdb, qc->dev->cdb_len); | 874 | memcpy(cb->atapi.cdb, qc->cdb, qc->dev->cdb_len); |
870 | 875 | ||
871 | if (ata_is_data(qc->tf.protocol)) { | 876 | if (ata_is_data(qc->tf.protocol)) { |
@@ -895,6 +900,11 @@ static unsigned int sil24_qc_issue(struct ata_queued_cmd *qc) | |||
895 | paddr = pp->cmd_block_dma + tag * sizeof(*pp->cmd_block); | 900 | paddr = pp->cmd_block_dma + tag * sizeof(*pp->cmd_block); |
896 | activate = port + PORT_CMD_ACTIVATE + tag * 8; | 901 | activate = port + PORT_CMD_ACTIVATE + tag * 8; |
897 | 902 | ||
903 | /* | ||
904 | * The barrier is required to ensure that writes to cmd_block reach | ||
905 | * the memory before the write to PORT_CMD_ACTIVATE. | ||
906 | */ | ||
907 | wmb(); | ||
898 | writel((u32)paddr, activate); | 908 | writel((u32)paddr, activate); |
899 | writel((u64)paddr >> 32, activate + 4); | 909 | writel((u64)paddr >> 32, activate + 4); |
900 | 910 | ||
diff --git a/drivers/ata/sata_via.c b/drivers/ata/sata_via.c index 101d8c219caf..4730c42a5ee5 100644 --- a/drivers/ata/sata_via.c +++ b/drivers/ata/sata_via.c | |||
@@ -575,6 +575,33 @@ static void svia_configure(struct pci_dev *pdev) | |||
575 | tmp8 |= NATIVE_MODE_ALL; | 575 | tmp8 |= NATIVE_MODE_ALL; |
576 | pci_write_config_byte(pdev, SATA_NATIVE_MODE, tmp8); | 576 | pci_write_config_byte(pdev, SATA_NATIVE_MODE, tmp8); |
577 | } | 577 | } |
578 | |||
579 | /* | ||
580 | * vt6421 has problems talking to some drives. The following | ||
581 | * is the fix from Joseph Chan <JosephChan@via.com.tw>. | ||
582 | * | ||
583 | * When host issues HOLD, device may send up to 20DW of data | ||
584 | * before acknowledging it with HOLDA and the host should be | ||
585 | * able to buffer them in FIFO. Unfortunately, some WD drives | ||
586 | * send upto 40DW before acknowledging HOLD and, in the | ||
587 | * default configuration, this ends up overflowing vt6421's | ||
588 | * FIFO, making the controller abort the transaction with | ||
589 | * R_ERR. | ||
590 | * | ||
591 | * Rx52[2] is the internal 128DW FIFO Flow control watermark | ||
592 | * adjusting mechanism enable bit and the default value 0 | ||
593 | * means host will issue HOLD to device when the left FIFO | ||
594 | * size goes below 32DW. Setting it to 1 makes the watermark | ||
595 | * 64DW. | ||
596 | * | ||
597 | * https://bugzilla.kernel.org/show_bug.cgi?id=15173 | ||
598 | * http://article.gmane.org/gmane.linux.ide/46352 | ||
599 | */ | ||
600 | if (pdev->device == 0x3249) { | ||
601 | pci_read_config_byte(pdev, 0x52, &tmp8); | ||
602 | tmp8 |= 1 << 2; | ||
603 | pci_write_config_byte(pdev, 0x52, tmp8); | ||
604 | } | ||
578 | } | 605 | } |
579 | 606 | ||
580 | static int svia_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) | 607 | static int svia_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) |