aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/ata/pata_legacy.c13
-rw-r--r--drivers/ata/pata_via.c74
-rw-r--r--drivers/ata/sata_mv.c58
3 files changed, 122 insertions, 23 deletions
diff --git a/drivers/ata/pata_legacy.c b/drivers/ata/pata_legacy.c
index 6f985bed8cbb..f72c6c5b820f 100644
--- a/drivers/ata/pata_legacy.c
+++ b/drivers/ata/pata_legacy.c
@@ -285,10 +285,11 @@ static unsigned int pdc_data_xfer_vlb(struct ata_device *dev,
285 unsigned char *buf, unsigned int buflen, int rw) 285 unsigned char *buf, unsigned int buflen, int rw)
286{ 286{
287 int slop = buflen & 3; 287 int slop = buflen & 3;
288 struct ata_port *ap = dev->link->ap;
289
288 /* 32bit I/O capable *and* we need to write a whole number of dwords */ 290 /* 32bit I/O capable *and* we need to write a whole number of dwords */
289 if (ata_id_has_dword_io(dev->id) && (slop == 0 || slop == 3) 291 if (ata_id_has_dword_io(dev->id) && (slop == 0 || slop == 3)
290 && (ap->pflags & ATA_PFLAG_PIO32)) { 292 && (ap->pflags & ATA_PFLAG_PIO32)) {
291 struct ata_port *ap = dev->link->ap;
292 unsigned long flags; 293 unsigned long flags;
293 294
294 local_irq_save(flags); 295 local_irq_save(flags);
@@ -866,7 +867,7 @@ static struct legacy_controller controllers[] = {
866 0, 0, NULL }, 867 0, 0, NULL },
867 {"PDC20230", &pdc20230_port_ops, 0x7, 868 {"PDC20230", &pdc20230_port_ops, 0x7,
868 ATA_FLAG_NO_IORDY, 869 ATA_FLAG_NO_IORDY,
869 ATA_PFLAG_PIO32 | ATA_PFLAG_PIO32_CHANGE, NULL }, 870 ATA_PFLAG_PIO32 | ATA_PFLAG_PIO32CHANGE, NULL },
870 {"HT6560A", &ht6560a_port_ops, 0x07, 871 {"HT6560A", &ht6560a_port_ops, 0x07,
871 ATA_FLAG_NO_IORDY, 0, NULL }, 872 ATA_FLAG_NO_IORDY, 0, NULL },
872 {"HT6560B", &ht6560b_port_ops, 0x1F, 873 {"HT6560B", &ht6560b_port_ops, 0x1F,
@@ -877,13 +878,13 @@ static struct legacy_controller controllers[] = {
877 0, 0, NULL }, 878 0, 0, NULL },
878 {"QDI6500", &qdi6500_port_ops, 0x07, 879 {"QDI6500", &qdi6500_port_ops, 0x07,
879 ATA_FLAG_NO_IORDY, 880 ATA_FLAG_NO_IORDY,
880 ATA_PFLAG_PIO32 | ATA_PFLAG_PIO32_CHANGE, qdi_port }, 881 ATA_PFLAG_PIO32 | ATA_PFLAG_PIO32CHANGE, qdi_port },
881 {"QDI6580", &qdi6580_port_ops, 0x1F, 882 {"QDI6580", &qdi6580_port_ops, 0x1F,
882 0, ATA_PFLAG_PIO32 | ATA_PFLAG_PIO32_CHANGE, qdi_port }, 883 0, ATA_PFLAG_PIO32 | ATA_PFLAG_PIO32CHANGE, qdi_port },
883 {"QDI6580DP", &qdi6580dp_port_ops, 0x1F, 884 {"QDI6580DP", &qdi6580dp_port_ops, 0x1F,
884 0, ATA_PFLAG_PIO32 | ATA_PFLAG_PIO32_CHANGE, qdi_port }, 885 0, ATA_PFLAG_PIO32 | ATA_PFLAG_PIO32CHANGE, qdi_port },
885 {"W83759A", &winbond_port_ops, 0x1F, 886 {"W83759A", &winbond_port_ops, 0x1F,
886 0, ATA_PFLAG_PIO32 | ATA_PFLAG_PIO32_CHANGE, 887 0, ATA_PFLAG_PIO32 | ATA_PFLAG_PIO32CHANGE,
887 winbond_port } 888 winbond_port }
888}; 889};
889 890
diff --git a/drivers/ata/pata_via.c b/drivers/ata/pata_via.c
index b08e6e0f82b6..45657cacec43 100644
--- a/drivers/ata/pata_via.c
+++ b/drivers/ata/pata_via.c
@@ -62,7 +62,7 @@
62#include <linux/dmi.h> 62#include <linux/dmi.h>
63 63
64#define DRV_NAME "pata_via" 64#define DRV_NAME "pata_via"
65#define DRV_VERSION "0.3.3" 65#define DRV_VERSION "0.3.4"
66 66
67/* 67/*
68 * The following comes directly from Vojtech Pavlik's ide/pci/via82cxxx 68 * The following comes directly from Vojtech Pavlik's ide/pci/via82cxxx
@@ -136,6 +136,9 @@ static const struct via_isa_bridge {
136 { NULL } 136 { NULL }
137}; 137};
138 138
139struct via_port {
140 u8 cached_device;
141};
139 142
140/* 143/*
141 * Cable special cases 144 * Cable special cases
@@ -346,14 +349,70 @@ static void via_set_dmamode(struct ata_port *ap, struct ata_device *adev)
346 */ 349 */
347static void via_tf_load(struct ata_port *ap, const struct ata_taskfile *tf) 350static void via_tf_load(struct ata_port *ap, const struct ata_taskfile *tf)
348{ 351{
349 struct ata_taskfile tmp_tf; 352 struct ata_ioports *ioaddr = &ap->ioaddr;
353 struct via_port *vp = ap->private_data;
354 unsigned int is_addr = tf->flags & ATA_TFLAG_ISADDR;
355 int newctl = 0;
356
357 if (tf->ctl != ap->last_ctl) {
358 iowrite8(tf->ctl, ioaddr->ctl_addr);
359 ap->last_ctl = tf->ctl;
360 ata_wait_idle(ap);
361 newctl = 1;
362 }
363
364 if (tf->flags & ATA_TFLAG_DEVICE) {
365 iowrite8(tf->device, ioaddr->device_addr);
366 vp->cached_device = tf->device;
367 } else if (newctl)
368 iowrite8(vp->cached_device, ioaddr->device_addr);
369
370 if (is_addr && (tf->flags & ATA_TFLAG_LBA48)) {
371 WARN_ON_ONCE(!ioaddr->ctl_addr);
372 iowrite8(tf->hob_feature, ioaddr->feature_addr);
373 iowrite8(tf->hob_nsect, ioaddr->nsect_addr);
374 iowrite8(tf->hob_lbal, ioaddr->lbal_addr);
375 iowrite8(tf->hob_lbam, ioaddr->lbam_addr);
376 iowrite8(tf->hob_lbah, ioaddr->lbah_addr);
377 VPRINTK("hob: feat 0x%X nsect 0x%X, lba 0x%X 0x%X 0x%X\n",
378 tf->hob_feature,
379 tf->hob_nsect,
380 tf->hob_lbal,
381 tf->hob_lbam,
382 tf->hob_lbah);
383 }
350 384
351 if (ap->ctl != ap->last_ctl && !(tf->flags & ATA_TFLAG_DEVICE)) { 385 if (is_addr) {
352 tmp_tf = *tf; 386 iowrite8(tf->feature, ioaddr->feature_addr);
353 tmp_tf.flags |= ATA_TFLAG_DEVICE; 387 iowrite8(tf->nsect, ioaddr->nsect_addr);
354 tf = &tmp_tf; 388 iowrite8(tf->lbal, ioaddr->lbal_addr);
389 iowrite8(tf->lbam, ioaddr->lbam_addr);
390 iowrite8(tf->lbah, ioaddr->lbah_addr);
391 VPRINTK("feat 0x%X nsect 0x%X lba 0x%X 0x%X 0x%X\n",
392 tf->feature,
393 tf->nsect,
394 tf->lbal,
395 tf->lbam,
396 tf->lbah);
355 } 397 }
356 ata_sff_tf_load(ap, tf); 398
399 ata_wait_idle(ap);
400}
401
402static int via_port_start(struct ata_port *ap)
403{
404 struct via_port *vp;
405 struct pci_dev *pdev = to_pci_dev(ap->host->dev);
406
407 int ret = ata_sff_port_start(ap);
408 if (ret < 0)
409 return ret;
410
411 vp = devm_kzalloc(&pdev->dev, sizeof(struct via_port), GFP_KERNEL);
412 if (vp == NULL)
413 return -ENOMEM;
414 ap->private_data = vp;
415 return 0;
357} 416}
358 417
359static struct scsi_host_template via_sht = { 418static struct scsi_host_template via_sht = {
@@ -367,6 +426,7 @@ static struct ata_port_operations via_port_ops = {
367 .set_dmamode = via_set_dmamode, 426 .set_dmamode = via_set_dmamode,
368 .prereset = via_pre_reset, 427 .prereset = via_pre_reset,
369 .sff_tf_load = via_tf_load, 428 .sff_tf_load = via_tf_load,
429 .port_start = via_port_start,
370}; 430};
371 431
372static struct ata_port_operations via_port_ops_noirq = { 432static struct ata_port_operations via_port_ops_noirq = {
diff --git a/drivers/ata/sata_mv.c b/drivers/ata/sata_mv.c
index 37ae5dc1070c..870dcfd82357 100644
--- a/drivers/ata/sata_mv.c
+++ b/drivers/ata/sata_mv.c
@@ -1881,6 +1881,39 @@ static u8 mv_bmdma_status(struct ata_port *ap)
1881 return status; 1881 return status;
1882} 1882}
1883 1883
1884static void mv_rw_multi_errata_sata24(struct ata_queued_cmd *qc)
1885{
1886 struct ata_taskfile *tf = &qc->tf;
1887 /*
1888 * Workaround for 88SX60x1 FEr SATA#24.
1889 *
1890 * Chip may corrupt WRITEs if multi_count >= 4kB.
1891 * Note that READs are unaffected.
1892 *
1893 * It's not clear if this errata really means "4K bytes",
1894 * or if it always happens for multi_count > 7
1895 * regardless of device sector_size.
1896 *
1897 * So, for safety, any write with multi_count > 7
1898 * gets converted here into a regular PIO write instead:
1899 */
1900 if ((tf->flags & ATA_TFLAG_WRITE) && is_multi_taskfile(tf)) {
1901 if (qc->dev->multi_count > 7) {
1902 switch (tf->command) {
1903 case ATA_CMD_WRITE_MULTI:
1904 tf->command = ATA_CMD_PIO_WRITE;
1905 break;