diff options
| author | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-06-27 13:00:23 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-06-27 13:00:23 -0400 |
| commit | 75ca0d22668a36fc83e17407d369b528a22c562c (patch) | |
| tree | 81934436cdeb95d4a51d95481a1c6b973609d38e | |
| parent | 7af5f532a23c421ab9a70b1a9a78c722d26d95ff (diff) | |
| parent | 40a1d531f6c894b298e784fd2090d87633e4989a (diff) | |
Merge branch 'upstream-linus' of master.kernel.org:/pub/scm/linux/kernel/git/jgarzik/libata-dev
* 'upstream-linus' of master.kernel.org:/pub/scm/linux/kernel/git/jgarzik/libata-dev:
libata: kill ATA_HORKAGE_DMA_RW_ONLY
libata: use PIO for non-16 byte aligned ATAPI commands
libata: call ata_check_atapi_dma() with qc better prepared
libata: fix infinite EH waiting bug
libata: fix ata_dev_disable()
pata_it821x: fix section mismatch warning
libata: remove unused variable from ata_eh_reset()
libata: be less verbose about hpa
libata: kill non-sense warning message
libata: kill the infamous abnormal status message
HPT374 is UDMA100 not UDMA133
| -rw-r--r-- | drivers/ata/libata-core.c | 56 | ||||
| -rw-r--r-- | drivers/ata/libata-eh.c | 7 | ||||
| -rw-r--r-- | drivers/ata/libata-scsi.c | 20 | ||||
| -rw-r--r-- | drivers/ata/pata_hpt37x.c | 4 | ||||
| -rw-r--r-- | drivers/ata/pata_it821x.c | 2 | ||||
| -rw-r--r-- | include/linux/libata.h | 9 |
6 files changed, 35 insertions, 63 deletions
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index adfae9d1ceb1..bfc59a104728 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c | |||
| @@ -600,8 +600,9 @@ static const char *sata_spd_string(unsigned int spd) | |||
| 600 | 600 | ||
| 601 | void ata_dev_disable(struct ata_device *dev) | 601 | void ata_dev_disable(struct ata_device *dev) |
| 602 | { | 602 | { |
| 603 | if (ata_dev_enabled(dev) && ata_msg_drv(dev->ap)) { | 603 | if (ata_dev_enabled(dev)) { |
| 604 | ata_dev_printk(dev, KERN_WARNING, "disabled\n"); | 604 | if (ata_msg_drv(dev->ap)) |
| 605 | ata_dev_printk(dev, KERN_WARNING, "disabled\n"); | ||
| 605 | ata_down_xfermask_limit(dev, ATA_DNXFER_FORCE_PIO0 | | 606 | ata_down_xfermask_limit(dev, ATA_DNXFER_FORCE_PIO0 | |
| 606 | ATA_DNXFER_QUIET); | 607 | ATA_DNXFER_QUIET); |
| 607 | dev->class++; | 608 | dev->class++; |
| @@ -983,11 +984,6 @@ static u64 ata_hpa_resize(struct ata_device *dev) | |||
| 983 | else | 984 | else |
| 984 | hpa_sectors = ata_read_native_max_address(dev); | 985 | hpa_sectors = ata_read_native_max_address(dev); |
| 985 | 986 | ||
| 986 | /* if no hpa, both should be equal */ | ||
| 987 | ata_dev_printk(dev, KERN_INFO, "%s 1: sectors = %lld, " | ||
| 988 | "hpa_sectors = %lld\n", | ||
| 989 | __FUNCTION__, (long long)sectors, (long long)hpa_sectors); | ||
| 990 | |||
| 991 | if (hpa_sectors > sectors) { | 987 | if (hpa_sectors > sectors) { |
| 992 | ata_dev_printk(dev, KERN_INFO, | 988 | ata_dev_printk(dev, KERN_INFO, |
| 993 | "Host Protected Area detected:\n" | 989 | "Host Protected Area detected:\n" |
| @@ -1009,7 +1005,11 @@ static u64 ata_hpa_resize(struct ata_device *dev) | |||
| 1009 | return hpa_sectors; | 1005 | return hpa_sectors; |
| 1010 | } | 1006 | } |
| 1011 | } | 1007 | } |
| 1012 | } | 1008 | } else if (hpa_sectors < sectors) |
| 1009 | ata_dev_printk(dev, KERN_WARNING, "%s 1: hpa sectors (%lld) " | ||
| 1010 | "is smaller than sectors (%lld)\n", __FUNCTION__, | ||
| 1011 | (long long)hpa_sectors, (long long)sectors); | ||
| 1012 | |||
| 1013 | return sectors; | 1013 | return sectors; |
| 1014 | } | 1014 | } |
| 1015 | 1015 | ||
| @@ -2046,10 +2046,6 @@ int ata_dev_configure(struct ata_device *dev) | |||
| 2046 | dev->max_sectors = min_t(unsigned int, ATA_MAX_SECTORS_128, | 2046 | dev->max_sectors = min_t(unsigned int, ATA_MAX_SECTORS_128, |
| 2047 | dev->max_sectors); | 2047 | dev->max_sectors); |
| 2048 | 2048 | ||
| 2049 | /* limit ATAPI DMA to R/W commands only */ | ||
| 2050 | if (ata_device_blacklisted(dev) & ATA_HORKAGE_DMA_RW_ONLY) | ||
| 2051 | dev->horkage |= ATA_HORKAGE_DMA_RW_ONLY; | ||
| 2052 | |||
| 2053 | if (ap->ops->dev_config) | 2049 | if (ap->ops->dev_config) |
| 2054 | ap->ops->dev_config(dev); | 2050 | ap->ops->dev_config(dev); |
| 2055 | 2051 | ||
| @@ -3780,8 +3776,7 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = { | |||
| 3780 | { "IOMEGA ZIP 250 ATAPI", NULL, ATA_HORKAGE_NODMA }, /* temporary fix */ | 3776 | { "IOMEGA ZIP 250 ATAPI", NULL, ATA_HORKAGE_NODMA }, /* temporary fix */ |
| 3781 | 3777 | ||
| 3782 | /* Weird ATAPI devices */ | 3778 | /* Weird ATAPI devices */ |
| 3783 | { "TORiSAN DVD-ROM DRD-N216", NULL, ATA_HORKAGE_MAX_SEC_128 | | 3779 | { "TORiSAN DVD-ROM DRD-N216", NULL, ATA_HORKAGE_MAX_SEC_128 }, |
| 3784 | ATA_HORKAGE_DMA_RW_ONLY }, | ||
| 3785 | 3780 | ||
| 3786 | /* Devices we expect to fail diagnostics */ | 3781 | /* Devices we expect to fail diagnostics */ |
| 3787 | 3782 | ||
| @@ -4109,6 +4104,7 @@ static void ata_fill_sg(struct ata_queued_cmd *qc) | |||
| 4109 | if (idx) | 4104 | if (idx) |
| 4110 | ap->prd[idx - 1].flags_len |= cpu_to_le32(ATA_PRD_EOT); | 4105 | ap->prd[idx - 1].flags_len |= cpu_to_le32(ATA_PRD_EOT); |
| 4111 | } | 4106 | } |
| 4107 | |||
| 4112 | /** | 4108 | /** |
| 4113 | * ata_check_atapi_dma - Check whether ATAPI DMA can be supported | 4109 | * ata_check_atapi_dma - Check whether ATAPI DMA can be supported |
| 4114 | * @qc: Metadata associated with taskfile to check | 4110 | * @qc: Metadata associated with taskfile to check |
| @@ -4126,33 +4122,19 @@ static void ata_fill_sg(struct ata_queued_cmd *qc) | |||
| 4126 | int ata_check_atapi_dma(struct ata_queued_cmd *qc) | 4122 | int ata_check_atapi_dma(struct ata_queued_cmd *qc) |
| 4127 | { | 4123 | { |
| 4128 | struct ata_port *ap = qc->ap; | 4124 | struct ata_port *ap = qc->ap; |
| 4129 | int rc = 0; /* Assume ATAPI DMA is OK by default */ | 4125 | |
| 4130 | 4126 | /* Don't allow DMA if it isn't multiple of 16 bytes. Quite a | |
| 4131 | /* some drives can only do ATAPI DMA on read/write */ | 4127 | * few ATAPI devices choke on such DMA requests. |
| 4132 | if (unlikely(qc->dev->horkage & ATA_HORKAGE_DMA_RW_ONLY)) { | 4128 | */ |
| 4133 | struct scsi_cmnd *cmd = qc->scsicmd; | 4129 | if (unlikely(qc->nbytes & 15)) |
| 4134 | u8 *scsicmd = cmd->cmnd; | 4130 | return 1; |
| 4135 | |||
| 4136 | switch (scsicmd[0]) { | ||
| 4137 | case READ_10: | ||
| 4138 | case WRITE_10: | ||
| 4139 | case READ_12: | ||
| 4140 | case WRITE_12: | ||
| 4141 | case READ_6: | ||
| 4142 | case WRITE_6: | ||
| 4143 | /* atapi dma maybe ok */ | ||
| 4144 | break; | ||
| 4145 | default: | ||
| 4146 | /* turn off atapi dma */ | ||
| 4147 | return 1; | ||
| 4148 | } | ||
| 4149 | } | ||
| 4150 | 4131 | ||
| 4151 | if (ap->ops->check_atapi_dma) | 4132 | if (ap->ops->check_atapi_dma) |
| 4152 | rc = ap->ops->check_atapi_dma(qc); | 4133 | return ap->ops->check_atapi_dma(qc); |
| 4153 | 4134 | ||
| 4154 | return rc; | 4135 | return 0; |
| 4155 | } | 4136 | } |
| 4137 | |||
| 4156 | /** | 4138 | /** |
| 4157 | * ata_qc_prep - Prepare taskfile for submission | 4139 | * ata_qc_prep - Prepare taskfile for submission |
| 4158 | * @qc: Metadata associated with taskfile to be prepared | 4140 | * @qc: Metadata associated with taskfile to be prepared |
diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c index d8070989a39f..f7582c9c320e 100644 --- a/drivers/ata/libata-eh.c +++ b/drivers/ata/libata-eh.c | |||
| @@ -336,6 +336,7 @@ void ata_scsi_error(struct Scsi_Host *host) | |||
| 336 | } | 336 | } |
| 337 | ata_port_printk(ap, KERN_ERR, "EH pending after %d " | 337 | ata_port_printk(ap, KERN_ERR, "EH pending after %d " |
| 338 | "tries, giving up\n", ATA_EH_MAX_REPEAT); | 338 | "tries, giving up\n", ATA_EH_MAX_REPEAT); |
| 339 | ap->pflags &= ~ATA_PFLAG_EH_PENDING; | ||
| 339 | } | 340 | } |
| 340 | 341 | ||
| 341 | /* this run is complete, make sure EH info is clear */ | 342 | /* this run is complete, make sure EH info is clear */ |
| @@ -1616,7 +1617,7 @@ static int ata_eh_reset(struct ata_port *ap, int classify, | |||
| 1616 | unsigned long deadline; | 1617 | unsigned long deadline; |
| 1617 | unsigned int action; | 1618 | unsigned int action; |
| 1618 | ata_reset_fn_t reset; | 1619 | ata_reset_fn_t reset; |
| 1619 | int i, did_followup_srst, rc; | 1620 | int i, rc; |
| 1620 | 1621 | ||
| 1621 | /* about to reset */ | 1622 | /* about to reset */ |
| 1622 | ata_eh_about_to_do(ap, NULL, ehc->i.action & ATA_EH_RESET_MASK); | 1623 | ata_eh_about_to_do(ap, NULL, ehc->i.action & ATA_EH_RESET_MASK); |
| @@ -1665,8 +1666,6 @@ static int ata_eh_reset(struct ata_port *ap, int classify, | |||
| 1665 | 1666 | ||
| 1666 | /* did prereset() screw up? if so, fix up to avoid oopsing */ | 1667 | /* did prereset() screw up? if so, fix up to avoid oopsing */ |
| 1667 | if (!reset) { | 1668 | if (!reset) { |
| 1668 | ata_port_printk(ap, KERN_ERR, "BUG: prereset() requested " | ||
| 1669 | "invalid reset type\n"); | ||
| 1670 | if (softreset) | 1669 | if (softreset) |
| 1671 | reset = softreset; | 1670 | reset = softreset; |
| 1672 | else | 1671 | else |
| @@ -1689,11 +1688,9 @@ static int ata_eh_reset(struct ata_port *ap, int classify, | |||
| 1689 | 1688 | ||
| 1690 | rc = ata_do_reset(ap, reset, classes, deadline); | 1689 | rc = ata_do_reset(ap, reset, classes, deadline); |
| 1691 | 1690 | ||
| 1692 | did_followup_srst = 0; | ||
| 1693 | if (reset == hardreset && | 1691 | if (reset == hardreset && |
| 1694 | ata_eh_followup_srst_needed(rc, classify, classes)) { | 1692 | ata_eh_followup_srst_needed(rc, classify, classes)) { |
| 1695 | /* okay, let's do follow-up softreset */ | 1693 | /* okay, let's do follow-up softreset */ |
| 1696 | did_followup_srst = 1; | ||
| 1697 | reset = softreset; | 1694 | reset = softreset; |
| 1698 | 1695 | ||
| 1699 | if (!reset) { | 1696 | if (!reset) { |
diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c index c228df298bd8..4ddf00c8c5f5 100644 --- a/drivers/ata/libata-scsi.c +++ b/drivers/ata/libata-scsi.c | |||
| @@ -2384,11 +2384,6 @@ static unsigned int atapi_xlat(struct ata_queued_cmd *qc) | |||
| 2384 | int using_pio = (dev->flags & ATA_DFLAG_PIO); | 2384 | int using_pio = (dev->flags & ATA_DFLAG_PIO); |
| 2385 | int nodata = (scmd->sc_data_direction == DMA_NONE); | 2385 | int nodata = (scmd->sc_data_direction == DMA_NONE); |
| 2386 | 2386 | ||
| 2387 | if (!using_pio) | ||
| 2388 | /* Check whether ATAPI DMA is safe */ | ||
| 2389 | if (ata_check_atapi_dma(qc)) | ||
| 2390 | using_pio = 1; | ||
| 2391 | |||
| 2392 | memset(qc->cdb, 0, dev->cdb_len); | 2387 | memset(qc->cdb, 0, dev->cdb_len); |
| 2393 | memcpy(qc->cdb, scmd->cmnd, scmd->cmd_len); | 2388 | memcpy(qc->cdb, scmd->cmnd, scmd->cmd_len); |
| 2394 | 2389 | ||
| @@ -2401,19 +2396,22 @@ static unsigned int atapi_xlat(struct ata_queued_cmd *qc) | |||
| 2401 | } | 2396 | } |
| 2402 | 2397 | ||
| 2403 | qc->tf.command = ATA_CMD_PACKET; | 2398 | qc->tf.command = ATA_CMD_PACKET; |
| 2399 | qc->nbytes = scmd->request_bufflen; | ||
| 2400 | |||
| 2401 | /* check whether ATAPI DMA is safe */ | ||
| 2402 | if (!using_pio && ata_check_atapi_dma(qc)) | ||
| 2403 | using_pio = 1; | ||
| 2404 | 2404 | ||
| 2405 | /* no data, or PIO data xfer */ | ||
| 2406 | if (using_pio || nodata) { | 2405 | if (using_pio || nodata) { |
| 2406 | /* no data, or PIO data xfer */ | ||
| 2407 | if (nodata) | 2407 | if (nodata) |
| 2408 | qc->tf.protocol = ATA_PROT_ATAPI_NODATA; | 2408 | qc->tf.protocol = ATA_PROT_ATAPI_NODATA; |
| 2409 | else | 2409 | else |
| 2410 | qc->tf.protocol = ATA_PROT_ATAPI; | 2410 | qc->tf.protocol = ATA_PROT_ATAPI; |
| 2411 | qc->tf.lbam = (8 * 1024) & 0xff; | 2411 | qc->tf.lbam = (8 * 1024) & 0xff; |
| 2412 | qc->tf.lbah = (8 * 1024) >> 8; | 2412 | qc->tf.lbah = (8 * 1024) >> 8; |
| 2413 | } | 2413 | } else { |
| 2414 | 2414 | /* DMA data xfer */ | |
| 2415 | /* DMA data xfer */ | ||
| 2416 | else { | ||
| 2417 | qc->tf.protocol = ATA_PROT_ATAPI_DMA; | 2415 | qc->tf.protocol = ATA_PROT_ATAPI_DMA; |
| 2418 | qc->tf.feature |= ATAPI_PKT_DMA; | 2416 | qc->tf.feature |= ATAPI_PKT_DMA; |
| 2419 | 2417 | ||
| @@ -2422,8 +2420,6 @@ static unsigned int atapi_xlat(struct ata_queued_cmd *qc) | |||
| 2422 | qc->tf.feature |= ATAPI_DMADIR; | 2420 | qc->tf.feature |= ATAPI_DMADIR; |
| 2423 | } | 2421 | } |
| 2424 | 2422 | ||
| 2425 | qc->nbytes = scmd->request_bufflen; | ||
| 2426 | |||
| 2427 | return 0; | 2423 | return 0; |
| 2428 | } | 2424 | } |
| 2429 | 2425 | ||
diff --git a/drivers/ata/pata_hpt37x.c b/drivers/ata/pata_hpt37x.c index 6446735a46e0..a8c0cbeca399 100644 --- a/drivers/ata/pata_hpt37x.c +++ b/drivers/ata/pata_hpt37x.c | |||
| @@ -931,13 +931,13 @@ static int hpt37x_init_one(struct pci_dev *dev, const struct pci_device_id *id) | |||
| 931 | .udma_mask = 0x7f, | 931 | .udma_mask = 0x7f, |
| 932 | .port_ops = &hpt372_port_ops | 932 | .port_ops = &hpt372_port_ops |
| 933 | }; | 933 | }; |
| 934 | /* HPT374 - UDMA133 */ | 934 | /* HPT374 - UDMA100 */ |
| 935 | static const struct ata_port_info info_hpt374 = { | 935 | static const struct ata_port_info info_hpt374 = { |
| 936 | .sht = &hpt37x_sht, | 936 | .sht = &hpt37x_sht, |
| 937 | .flags = ATA_FLAG_SLAVE_POSS|ATA_FLAG_SRST, | 937 | .flags = ATA_FLAG_SLAVE_POSS|ATA_FLAG_SRST, |
| 938 | .pio_mask = 0x1f, | 938 | .pio_mask = 0x1f, |
| 939 | .mwdma_mask = 0x07, | 939 | .mwdma_mask = 0x07, |
| 940 | .udma_mask = 0x7f, | 940 | .udma_mask = 0x3f, |
| 941 | .port_ops = &hpt374_port_ops | 941 | .port_ops = &hpt374_port_ops |
| 942 | }; | 942 | }; |
| 943 | 943 | ||
diff --git a/drivers/ata/pata_it821x.c b/drivers/ata/pata_it821x.c index dab4e7cf8cda..12c6e08cc4d1 100644 --- a/drivers/ata/pata_it821x.c +++ b/drivers/ata/pata_it821x.c | |||
| @@ -690,7 +690,7 @@ static struct ata_port_operations it821x_passthru_port_ops = { | |||
| 690 | .port_start = it821x_port_start, | 690 | .port_start = it821x_port_start, |
| 691 | }; | 691 | }; |
| 692 | 692 | ||
| 693 | static void __devinit it821x_disable_raid(struct pci_dev *pdev) | 693 | static void it821x_disable_raid(struct pci_dev *pdev) |
| 694 | { | 694 | { |
| 695 | /* Reset local CPU, and set BIOS not ready */ | 695 | /* Reset local CPU, and set BIOS not ready */ |
| 696 | pci_write_config_byte(pdev, 0x5E, 0x01); | 696 | pci_write_config_byte(pdev, 0x5E, 0x01); |
diff --git a/include/linux/libata.h b/include/linux/libata.h index 745c4f9b4caa..620da7be07b7 100644 --- a/include/linux/libata.h +++ b/include/linux/libata.h | |||
| @@ -298,7 +298,6 @@ enum { | |||
| 298 | ATA_HORKAGE_NODMA = (1 << 1), /* DMA problems */ | 298 | ATA_HORKAGE_NODMA = (1 << 1), /* DMA problems */ |
| 299 | ATA_HORKAGE_NONCQ = (1 << 2), /* Don't use NCQ */ | 299 | ATA_HORKAGE_NONCQ = (1 << 2), /* Don't use NCQ */ |
| 300 | ATA_HORKAGE_MAX_SEC_128 = (1 << 3), /* Limit max sects to 128 */ | 300 | ATA_HORKAGE_MAX_SEC_128 = (1 << 3), /* Limit max sects to 128 */ |
| 301 | ATA_HORKAGE_DMA_RW_ONLY = (1 << 4), /* ATAPI DMA for RW only */ | ||
| 302 | }; | 301 | }; |
| 303 | 302 | ||
| 304 | enum hsm_task_states { | 303 | enum hsm_task_states { |
| @@ -1088,11 +1087,9 @@ static inline u8 ata_wait_idle(struct ata_port *ap) | |||
| 1088 | { | 1087 | { |
| 1089 | u8 status = ata_busy_wait(ap, ATA_BUSY | ATA_DRQ, 1000); | 1088 | u8 status = ata_busy_wait(ap, ATA_BUSY | ATA_DRQ, 1000); |
| 1090 | 1089 | ||
| 1091 | if (status != 0xff && (status & (ATA_BUSY | ATA_DRQ))) { | 1090 | if (status != 0xff && (status & (ATA_BUSY | ATA_DRQ))) |
| 1092 | if (ata_msg_warn(ap)) | 1091 | DPRINTK("ATA: abnormal status 0x%X on port 0x%p\n", |
| 1093 | printk(KERN_WARNING "ATA: abnormal status 0x%X on port 0x%p\n", | 1092 | status, ap->ioaddr.status_addr); |
| 1094 | status, ap->ioaddr.status_addr); | ||
| 1095 | } | ||
| 1096 | 1093 | ||
| 1097 | return status; | 1094 | return status; |
| 1098 | } | 1095 | } |
