A PDMA error is handled in the core driver by setting the device's
'borken' flag and aborting the command. Unfortunately, do_abort() is not
dependable. Perform a SCSI bus reset instead, to make sure that the
command fails and gets retried.

Cc: Michael Schmitz <schmitz...@gmail.com>
Cc: sta...@vger.kernel.org # v4.20+
Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
Tested-by: Stan Johnson <user...@yahoo.com>
Signed-off-by: Finn Thain <fth...@telegraphics.com.au>
---
 drivers/scsi/NCR5380.c | 6 ++----
 1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/drivers/scsi/NCR5380.c b/drivers/scsi/NCR5380.c
index 08e3ea8159b3..d9fa9cf2fd8b 100644
--- a/drivers/scsi/NCR5380.c
+++ b/drivers/scsi/NCR5380.c
@@ -1761,10 +1761,8 @@ static void NCR5380_information_transfer(struct 
Scsi_Host *instance)
                                                scmd_printk(KERN_INFO, cmd,
                                                        "switching to slow 
handshake\n");
                                                cmd->device->borken = 1;
-                                               sink = 1;
-                                               do_abort(instance);
-                                               cmd->result = DID_ERROR << 16;
-                                               /* XXX - need to source or sink 
data here, as appropriate */
+                                               do_reset(instance);
+                                               bus_reset_cleanup(instance);
                                        }
                                } else {
                                        /* Transfer a small chunk so that the
-- 
2.21.0

Reply via email to