diff options
-rw-r--r-- | drivers/ata/libata-core.c | 13 | ||||
-rw-r--r-- | drivers/ata/pata_via.c | 12 | ||||
-rw-r--r-- | include/linux/libata.h | 1 |
3 files changed, 10 insertions, 16 deletions
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index af625147df62..4733f009c7c9 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c | |||
@@ -3933,10 +3933,13 @@ static unsigned int ata_dev_set_xfermode(struct ata_device *dev) | |||
3933 | /* set up set-features taskfile */ | 3933 | /* set up set-features taskfile */ |
3934 | DPRINTK("set features - xfer mode\n"); | 3934 | DPRINTK("set features - xfer mode\n"); |
3935 | 3935 | ||
3936 | /* Some controllers and ATAPI devices show flaky interrupt | ||
3937 | * behavior after setting xfer mode. Use polling instead. | ||
3938 | */ | ||
3936 | ata_tf_init(dev, &tf); | 3939 | ata_tf_init(dev, &tf); |
3937 | tf.command = ATA_CMD_SET_FEATURES; | 3940 | tf.command = ATA_CMD_SET_FEATURES; |
3938 | tf.feature = SETFEATURES_XFER; | 3941 | tf.feature = SETFEATURES_XFER; |
3939 | tf.flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE; | 3942 | tf.flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE | ATA_TFLAG_POLLING; |
3940 | tf.protocol = ATA_PROT_NODATA; | 3943 | tf.protocol = ATA_PROT_NODATA; |
3941 | tf.nsect = dev->xfer_mode; | 3944 | tf.nsect = dev->xfer_mode; |
3942 | 3945 | ||
@@ -5414,14 +5417,6 @@ unsigned int ata_qc_issue_prot(struct ata_queued_cmd *qc) | |||
5414 | } | 5417 | } |
5415 | } | 5418 | } |
5416 | 5419 | ||
5417 | /* Some controllers show flaky interrupt behavior after | ||
5418 | * setting xfer mode. Use polling instead. | ||
5419 | */ | ||
5420 | if (unlikely(qc->tf.command == ATA_CMD_SET_FEATURES && | ||
5421 | qc->tf.feature == SETFEATURES_XFER) && | ||
5422 | (ap->flags & ATA_FLAG_SETXFER_POLLING)) | ||
5423 | qc->tf.flags |= ATA_TFLAG_POLLING; | ||
5424 | |||
5425 | /* select the device */ | 5420 | /* select the device */ |
5426 | ata_dev_select(ap, qc->dev->devno, 1, 0); | 5421 | ata_dev_select(ap, qc->dev->devno, 1, 0); |
5427 | 5422 | ||
diff --git a/drivers/ata/pata_via.c b/drivers/ata/pata_via.c index a8462f1e890b..63eca299c62b 100644 --- a/drivers/ata/pata_via.c +++ b/drivers/ata/pata_via.c | |||
@@ -452,7 +452,7 @@ static int via_init_one(struct pci_dev *pdev, const struct pci_device_id *id) | |||
452 | /* Early VIA without UDMA support */ | 452 | /* Early VIA without UDMA support */ |
453 | static const struct ata_port_info via_mwdma_info = { | 453 | static const struct ata_port_info via_mwdma_info = { |
454 | .sht = &via_sht, | 454 | .sht = &via_sht, |
455 | .flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SETXFER_POLLING, | 455 | .flags = ATA_FLAG_SLAVE_POSS, |
456 | .pio_mask = 0x1f, | 456 | .pio_mask = 0x1f, |
457 | .mwdma_mask = 0x07, | 457 | .mwdma_mask = 0x07, |
458 | .port_ops = &via_port_ops | 458 | .port_ops = &via_port_ops |
@@ -460,7 +460,7 @@ static int via_init_one(struct pci_dev *pdev, const struct pci_device_id *id) | |||
460 | /* Ditto with IRQ masking required */ | 460 | /* Ditto with IRQ masking required */ |
461 | static const struct ata_port_info via_mwdma_info_borked = { | 461 | static const struct ata_port_info via_mwdma_info_borked = { |
462 | .sht = &via_sht, | 462 | .sht = &via_sht, |
463 | .flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SETXFER_POLLING, | 463 | .flags = ATA_FLAG_SLAVE_POSS, |
464 | .pio_mask = 0x1f, | 464 | .pio_mask = 0x1f, |
465 | .mwdma_mask = 0x07, | 465 | .mwdma_mask = 0x07, |
466 | .port_ops = &via_port_ops_noirq, | 466 | .port_ops = &via_port_ops_noirq, |
@@ -468,7 +468,7 @@ static int via_init_one(struct pci_dev *pdev, const struct pci_device_id *id) | |||
468 | /* VIA UDMA 33 devices (and borked 66) */ | 468 | /* VIA UDMA 33 devices (and borked 66) */ |
469 | static const struct ata_port_info via_udma33_info = { | 469 | static const struct ata_port_info via_udma33_info = { |
470 | .sht = &via_sht, | 470 | .sht = &via_sht, |
471 | .flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SETXFER_POLLING, | 471 | .flags = ATA_FLAG_SLAVE_POSS, |
472 | .pio_mask = 0x1f, | 472 | .pio_mask = 0x1f, |
473 | .mwdma_mask = 0x07, | 473 | .mwdma_mask = 0x07, |
474 | .udma_mask = 0x7, | 474 | .udma_mask = 0x7, |
@@ -477,7 +477,7 @@ static int via_init_one(struct pci_dev *pdev, const struct pci_device_id *id) | |||
477 | /* VIA UDMA 66 devices */ | 477 | /* VIA UDMA 66 devices */ |
478 | static const struct ata_port_info via_udma66_info = { | 478 | static const struct ata_port_info via_udma66_info = { |
479 | .sht = &via_sht, | 479 | .sht = &via_sht, |
480 | .flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SETXFER_POLLING, | 480 | .flags = ATA_FLAG_SLAVE_POSS, |
481 | .pio_mask = 0x1f, | 481 | .pio_mask = 0x1f, |
482 | .mwdma_mask = 0x07, | 482 | .mwdma_mask = 0x07, |
483 | .udma_mask = 0x1f, | 483 | .udma_mask = 0x1f, |
@@ -486,7 +486,7 @@ static int via_init_one(struct pci_dev *pdev, const struct pci_device_id *id) | |||
486 | /* VIA UDMA 100 devices */ | 486 | /* VIA UDMA 100 devices */ |
487 | static const struct ata_port_info via_udma100_info = { | 487 | static const struct ata_port_info via_udma100_info = { |
488 | .sht = &via_sht, | 488 | .sht = &via_sht, |
489 | .flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SETXFER_POLLING, | 489 | .flags = ATA_FLAG_SLAVE_POSS, |
490 | .pio_mask = 0x1f, | 490 | .pio_mask = 0x1f, |
491 | .mwdma_mask = 0x07, | 491 | .mwdma_mask = 0x07, |
492 | .udma_mask = 0x3f, | 492 | .udma_mask = 0x3f, |
@@ -495,7 +495,7 @@ static int via_init_one(struct pci_dev *pdev, const struct pci_device_id *id) | |||
495 | /* UDMA133 with bad AST (All current 133) */ | 495 | /* UDMA133 with bad AST (All current 133) */ |
496 | static const struct ata_port_info via_udma133_info = { | 496 | static const struct ata_port_info via_udma133_info = { |
497 | .sht = &via_sht, | 497 | .sht = &via_sht, |
498 | .flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SETXFER_POLLING, | 498 | .flags = ATA_FLAG_SLAVE_POSS, |
499 | .pio_mask = 0x1f, | 499 | .pio_mask = 0x1f, |
500 | .mwdma_mask = 0x07, | 500 | .mwdma_mask = 0x07, |
501 | .udma_mask = 0x7f, /* FIXME: should check north bridge */ | 501 | .udma_mask = 0x7f, /* FIXME: should check north bridge */ |
diff --git a/include/linux/libata.h b/include/linux/libata.h index 85f7b1bd1482..a6a3113120a4 100644 --- a/include/linux/libata.h +++ b/include/linux/libata.h | |||
@@ -171,7 +171,6 @@ enum { | |||
171 | ATA_FLAG_SKIP_D2H_BSY = (1 << 12), /* can't wait for the first D2H | 171 | ATA_FLAG_SKIP_D2H_BSY = (1 << 12), /* can't wait for the first D2H |
172 | * Register FIS clearing BSY */ | 172 | * Register FIS clearing BSY */ |
173 | ATA_FLAG_DEBUGMSG = (1 << 13), | 173 | ATA_FLAG_DEBUGMSG = (1 << 13), |
174 | ATA_FLAG_SETXFER_POLLING= (1 << 14), /* use polling for SETXFER */ | ||
175 | ATA_FLAG_IGN_SIMPLEX = (1 << 15), /* ignore SIMPLEX */ | 174 | ATA_FLAG_IGN_SIMPLEX = (1 << 15), /* ignore SIMPLEX */ |
176 | ATA_FLAG_NO_IORDY = (1 << 16), /* controller lacks iordy */ | 175 | ATA_FLAG_NO_IORDY = (1 << 16), /* controller lacks iordy */ |
177 | ATA_FLAG_ACPI_SATA = (1 << 17), /* need native SATA ACPI layout */ | 176 | ATA_FLAG_ACPI_SATA = (1 << 17), /* need native SATA ACPI layout */ |