summaryrefslogtreecommitdiff
path: root/drivers/scsi
diff options
context:
space:
mode:
authorOndrej Zary <linux@rainbow-software.org>2016-01-03 08:06:14 +0300
committerMartin K. Petersen <martin.petersen@oracle.com>2016-01-07 05:43:10 +0300
commitf03946210d67be9a33ad63f6a0eed7cdf8c28334 (patch)
tree2ddf4785f0e09ce9109a1f0f4d2821c3a8bab60a /drivers/scsi
parent3d07d22b3d475ba9b0adfe083c537ee1ada034c8 (diff)
downloadlinux-f03946210d67be9a33ad63f6a0eed7cdf8c28334.tar.xz
ncr5380: Fix pseudo DMA transfers on 53C400
Pseudo-DMA (PDMA) has been broken for ages, resulting in hangs on 53C400-based cards. According to 53C400 datasheet, PDMA transfer length must be a multiple of 128. Check if that's true and use PIO if it's not. This makes PDMA work on 53C400 (Canon FG2-5202). Signed-off-by: Ondrej Zary <linux@rainbow-software.org> Signed-off-by: Finn Thain <fthain@telegraphics.com.au> Reviewed-by: Hannes Reinecke <hare@suse.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Diffstat (limited to 'drivers/scsi')
-rw-r--r--drivers/scsi/g_NCR5380.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/drivers/scsi/g_NCR5380.c b/drivers/scsi/g_NCR5380.c
index cd79ef402d7a..454b565c0417 100644
--- a/drivers/scsi/g_NCR5380.c
+++ b/drivers/scsi/g_NCR5380.c
@@ -702,6 +702,10 @@ static int generic_NCR5380_dma_xfer_len(struct scsi_cmnd *cmd)
!(cmd->SCp.this_residual % transfersize))
transfersize = 32 * 1024;
+ /* 53C400 datasheet: non-modulo-128-byte transfers should use PIO */
+ if (transfersize % 128)
+ transfersize = 0;
+
return transfersize;
}