ncr5380: Disable the DMA errata workaround flag by default
authorFinn Thain <fthain@telegraphics.com.au>
Wed, 23 Mar 2016 10:10:14 +0000 (21:10 +1100)
committerMartin K. Petersen <martin.petersen@oracle.com>
Mon, 11 Apr 2016 20:57:09 +0000 (16:57 -0400)
The only chip that needs the workarounds enabled is an early NMOS
device. That means that the common case is to disable them.

Unfortunately the sense of the flag is such that it has to be set
for the common case.

Rename the flag so that zero can be used to mean "no errata workarounds
needed". This simplifies the code.

Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
Reviewed-by: Hannes Reinecke <hare@suse.com>
Tested-by: Michael Schmitz <schmitzmic@gmail.com>
Tested-by: Ondrej Zary <linux@rainbow-software.org>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/NCR5380.c
drivers/scsi/NCR5380.h
drivers/scsi/arm/cumana_1.c
drivers/scsi/arm/oak.c
drivers/scsi/dtc.c
drivers/scsi/g_NCR5380.c
drivers/scsi/pas16.c
drivers/scsi/t128.c

index 826b63d1aa84c8665d36b46aa032155c52b7d58f..69c73c36b9235163fa13d602403fe7f98391251f 100644 (file)
@@ -457,7 +457,7 @@ static void prepare_info(struct Scsi_Host *instance)
                 instance->base, instance->irq,
                 instance->can_queue, instance->cmd_per_lun,
                 instance->sg_tablesize, instance->this_id,
-                hostdata->flags & FLAG_NO_DMA_FIXUP  ? "NO_DMA_FIXUP "  : "",
+                hostdata->flags & FLAG_DMA_FIXUP     ? "DMA_FIXUP "     : "",
                 hostdata->flags & FLAG_NO_PSEUDO_DMA ? "NO_PSEUDO_DMA " : "",
                 hostdata->flags & FLAG_TOSHIBA_DELAY ? "TOSHIBA_DELAY "  : "",
 #ifdef AUTOPROBE_IRQ
@@ -1480,11 +1480,11 @@ static int NCR5380_transfer_dma(struct Scsi_Host *instance,
         * before the setting of DMA mode to after transfer of the last byte.
         */
 
-       if (hostdata->flags & FLAG_NO_DMA_FIXUP)
+       if (hostdata->flags & FLAG_DMA_FIXUP)
+               NCR5380_write(MODE_REG, MR_BASE | MR_DMA_MODE | MR_MONITOR_BSY);
+       else
                NCR5380_write(MODE_REG, MR_BASE | MR_DMA_MODE | MR_MONITOR_BSY |
                                        MR_ENABLE_EOP_INTR);
-       else
-               NCR5380_write(MODE_REG, MR_BASE | MR_DMA_MODE | MR_MONITOR_BSY);
 
        dprintk(NDEBUG_DMA, "scsi%d : mode reg = 0x%X\n", instance->host_no, NCR5380_read(MODE_REG));
 
@@ -1540,8 +1540,8 @@ static int NCR5380_transfer_dma(struct Scsi_Host *instance,
 
        if (p & SR_IO) {
                foo = NCR5380_pread(instance, d,
-                       hostdata->flags & FLAG_NO_DMA_FIXUP ? c : c - 1);
-               if (!foo && !(hostdata->flags & FLAG_NO_DMA_FIXUP)) {
+                       hostdata->flags & FLAG_DMA_FIXUP ? c - 1 : c);
+               if (!foo && (hostdata->flags & FLAG_DMA_FIXUP)) {
                        /*
                         * The workaround was to transfer fewer bytes than we
                         * intended to with the pseudo-DMA read function, wait for
@@ -1571,7 +1571,7 @@ static int NCR5380_transfer_dma(struct Scsi_Host *instance,
                }
        } else {
                foo = NCR5380_pwrite(instance, d, c);
-               if (!foo && !(hostdata->flags & FLAG_NO_DMA_FIXUP)) {
+               if (!foo && (hostdata->flags & FLAG_DMA_FIXUP)) {
                        /*
                         * Wait for the last byte to be sent.  If REQ is being asserted for
                         * the byte we're interested, we'll ACK it and it will go false.
index 0b03ba25bd660190358d455ea1eddae6ffacb075..7b488a082462b9494ab593f6ca391ff4849e452d 100644 (file)
 #define NO_IRQ         0
 #endif
 
-#define FLAG_NO_DMA_FIXUP              1       /* No DMA errata workarounds */
+#define FLAG_DMA_FIXUP                 1       /* Use DMA errata workarounds */
 #define FLAG_NO_PSEUDO_DMA             8       /* Inhibit DMA */
 #define FLAG_LATE_DMA_SETUP            32      /* Setup NCR before DMA H/W */
 #define FLAG_TAGGED_QUEUING            64      /* as X3T9.2 spelled it */
index 221f18c5df9363c704d8289c2baab4b10dd89db6..76b2d3364d9fceea4d78dfbb1a27a06b56a922c0 100644 (file)
@@ -239,7 +239,7 @@ static int cumanascsi1_probe(struct expansion_card *ec,
 
        host->irq = ec->irq;
 
-       ret = NCR5380_init(host, 0);
+       ret = NCR5380_init(host, FLAG_DMA_FIXUP);
        if (ret)
                goto out_unmap;
 
index 1fab1d1896b1a7e81a53d2dc664e6f52a712b6d4..8d8426535e6d19a6ff3548a22ba9f33fa4bb7d5e 100644 (file)
@@ -143,7 +143,7 @@ static int oakscsi_probe(struct expansion_card *ec, const struct ecard_id *id)
        host->irq = NO_IRQ;
        host->n_io_port = 255;
 
-       ret = NCR5380_init(host, 0);
+       ret = NCR5380_init(host, FLAG_DMA_FIXUP);
        if (ret)
                goto out_unmap;
 
index 6c736b071cf4bcbaf8f5fb68b19192dc039dd293..30919f42759afcfa2de4697e6793266506cd1963 100644 (file)
@@ -229,7 +229,7 @@ found:
                instance->base = addr;
                ((struct NCR5380_hostdata *)(instance)->hostdata)->base = base;
 
-               if (NCR5380_init(instance, FLAG_NO_DMA_FIXUP))
+               if (NCR5380_init(instance, 0))
                        goto out_unregister;
 
                NCR5380_maybe_reset_bus(instance);
index b8fc26d9231d2e88d96880f71f90949fb2a05c2f..aaeb6b6b4b16f8ee8c0619a11605d6dd8d052bf4 100644 (file)
@@ -348,23 +348,17 @@ static int __init generic_NCR5380_detect(struct scsi_host_template *tpnt)
                flags = 0;
                switch (overrides[current_override].board) {
                case BOARD_NCR5380:
-                       flags = FLAG_NO_PSEUDO_DMA;
-                       break;
-               case BOARD_NCR53C400:
-                       flags = FLAG_NO_DMA_FIXUP;
+                       flags = FLAG_NO_PSEUDO_DMA | FLAG_DMA_FIXUP;
                        break;
                case BOARD_NCR53C400A:
-                       flags = FLAG_NO_DMA_FIXUP;
                        ports = ncr_53c400a_ports;
                        magic = ncr_53c400a_magic;
                        break;
                case BOARD_HP_C2502:
-                       flags = FLAG_NO_DMA_FIXUP;
                        ports = ncr_53c400a_ports;
                        magic = hp_c2502_magic;
                        break;
                case BOARD_DTC3181E:
-                       flags = FLAG_NO_DMA_FIXUP;
                        ports = dtc_3181e_ports;
                        magic = ncr_53c400a_magic;
                        break;
index 512037e27783d6192f1cea65b41eefb5fbaa9db4..7589fea01186765c46b0d33306fe85a78aa9f9ee 100644 (file)
@@ -377,7 +377,7 @@ static int __init pas16_detect(struct scsi_host_template *tpnt)
                
        instance->io_port = io_port;
 
-       if (NCR5380_init(instance, 0))
+       if (NCR5380_init(instance, FLAG_DMA_FIXUP))
                goto out_unregister;
 
        NCR5380_maybe_reset_bus(instance);
index 4615fda60dbdf6477ff28566740f59f6f51975ea..6cb8bdd2f4e6de3f597cf4981054c4cf0da5b0c5 100644 (file)
@@ -210,7 +210,7 @@ found:
        instance->base = base;
        ((struct NCR5380_hostdata *)instance->hostdata)->base = p;
 
-       if (NCR5380_init(instance, 0))
+       if (NCR5380_init(instance, FLAG_DMA_FIXUP))
                goto out_unregister;
 
        NCR5380_maybe_reset_bus(instance);