diff options
Diffstat (limited to 'drivers/ata/sata_via.c')
-rw-r--r-- | drivers/ata/sata_via.c | 23 |
1 files changed, 20 insertions, 3 deletions
diff --git a/drivers/ata/sata_via.c b/drivers/ata/sata_via.c index 02efd9a83d26..08f65492cc81 100644 --- a/drivers/ata/sata_via.c +++ b/drivers/ata/sata_via.c | |||
@@ -40,11 +40,13 @@ | |||
40 | #include <linux/blkdev.h> | 40 | #include <linux/blkdev.h> |
41 | #include <linux/delay.h> | 41 | #include <linux/delay.h> |
42 | #include <linux/device.h> | 42 | #include <linux/device.h> |
43 | #include <scsi/scsi.h> | ||
44 | #include <scsi/scsi_cmnd.h> | ||
43 | #include <scsi/scsi_host.h> | 45 | #include <scsi/scsi_host.h> |
44 | #include <linux/libata.h> | 46 | #include <linux/libata.h> |
45 | 47 | ||
46 | #define DRV_NAME "sata_via" | 48 | #define DRV_NAME "sata_via" |
47 | #define DRV_VERSION "2.4" | 49 | #define DRV_VERSION "2.6" |
48 | 50 | ||
49 | /* | 51 | /* |
50 | * vt8251 is different from other sata controllers of VIA. It has two | 52 | * vt8251 is different from other sata controllers of VIA. It has two |
@@ -80,6 +82,7 @@ static int vt8251_scr_write(struct ata_link *link, unsigned int scr, u32 val); | |||
80 | static void svia_tf_load(struct ata_port *ap, const struct ata_taskfile *tf); | 82 | static void svia_tf_load(struct ata_port *ap, const struct ata_taskfile *tf); |
81 | static void svia_noop_freeze(struct ata_port *ap); | 83 | static void svia_noop_freeze(struct ata_port *ap); |
82 | static int vt6420_prereset(struct ata_link *link, unsigned long deadline); | 84 | static int vt6420_prereset(struct ata_link *link, unsigned long deadline); |
85 | static void vt6420_bmdma_start(struct ata_queued_cmd *qc); | ||
83 | static int vt6421_pata_cable_detect(struct ata_port *ap); | 86 | static int vt6421_pata_cable_detect(struct ata_port *ap); |
84 | static void vt6421_set_pio_mode(struct ata_port *ap, struct ata_device *adev); | 87 | static void vt6421_set_pio_mode(struct ata_port *ap, struct ata_device *adev); |
85 | static void vt6421_set_dma_mode(struct ata_port *ap, struct ata_device *adev); | 88 | static void vt6421_set_dma_mode(struct ata_port *ap, struct ata_device *adev); |
@@ -121,6 +124,7 @@ static struct ata_port_operations vt6420_sata_ops = { | |||
121 | .inherits = &svia_base_ops, | 124 | .inherits = &svia_base_ops, |
122 | .freeze = svia_noop_freeze, | 125 | .freeze = svia_noop_freeze, |
123 | .prereset = vt6420_prereset, | 126 | .prereset = vt6420_prereset, |
127 | .bmdma_start = vt6420_bmdma_start, | ||
124 | }; | 128 | }; |
125 | 129 | ||
126 | static struct ata_port_operations vt6421_pata_ops = { | 130 | static struct ata_port_operations vt6421_pata_ops = { |
@@ -377,6 +381,17 @@ static int vt6420_prereset(struct ata_link *link, unsigned long deadline) | |||
377 | return 0; | 381 | return 0; |
378 | } | 382 | } |
379 | 383 | ||
384 | static void vt6420_bmdma_start(struct ata_queued_cmd *qc) | ||
385 | { | ||
386 | struct ata_port *ap = qc->ap; | ||
387 | if ((qc->tf.command == ATA_CMD_PACKET) && | ||
388 | (qc->scsicmd->sc_data_direction == DMA_TO_DEVICE)) { | ||
389 | /* Prevents corruption on some ATAPI burners */ | ||
390 | ata_sff_pause(ap); | ||
391 | } | ||
392 | ata_bmdma_start(qc); | ||
393 | } | ||
394 | |||
380 | static int vt6421_pata_cable_detect(struct ata_port *ap) | 395 | static int vt6421_pata_cable_detect(struct ata_port *ap) |
381 | { | 396 | { |
382 | struct pci_dev *pdev = to_pci_dev(ap->host->dev); | 397 | struct pci_dev *pdev = to_pci_dev(ap->host->dev); |
@@ -392,14 +407,16 @@ static void vt6421_set_pio_mode(struct ata_port *ap, struct ata_device *adev) | |||
392 | { | 407 | { |
393 | struct pci_dev *pdev = to_pci_dev(ap->host->dev); | 408 | struct pci_dev *pdev = to_pci_dev(ap->host->dev); |
394 | static const u8 pio_bits[] = { 0xA8, 0x65, 0x65, 0x31, 0x20 }; | 409 | static const u8 pio_bits[] = { 0xA8, 0x65, 0x65, 0x31, 0x20 }; |
395 | pci_write_config_byte(pdev, PATA_PIO_TIMING, pio_bits[adev->pio_mode - XFER_PIO_0]); | 410 | pci_write_config_byte(pdev, PATA_PIO_TIMING - adev->devno, |
411 | pio_bits[adev->pio_mode - XFER_PIO_0]); | ||
396 | } | 412 | } |
397 | 413 | ||
398 | static void vt6421_set_dma_mode(struct ata_port *ap, struct ata_device *adev) | 414 | static void vt6421_set_dma_mode(struct ata_port *ap, struct ata_device *adev) |
399 | { | 415 | { |
400 | struct pci_dev *pdev = to_pci_dev(ap->host->dev); | 416 | struct pci_dev *pdev = to_pci_dev(ap->host->dev); |
401 | static const u8 udma_bits[] = { 0xEE, 0xE8, 0xE6, 0xE4, 0xE2, 0xE1, 0xE0, 0xE0 }; | 417 | static const u8 udma_bits[] = { 0xEE, 0xE8, 0xE6, 0xE4, 0xE2, 0xE1, 0xE0, 0xE0 }; |
402 | pci_write_config_byte(pdev, PATA_UDMA_TIMING, udma_bits[adev->dma_mode - XFER_UDMA_0]); | 418 | pci_write_config_byte(pdev, PATA_UDMA_TIMING - adev->devno, |
419 | udma_bits[adev->dma_mode - XFER_UDMA_0]); | ||
403 | } | 420 | } |
404 | 421 | ||
405 | static const unsigned int svia_bar_sizes[] = { | 422 | static const unsigned int svia_bar_sizes[] = { |