]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
scsi: NCR5380: Handle PDMA failure reliably
authorFinn Thain <fthain@telegraphics.com.au>
Sun, 9 Jun 2019 01:19:11 +0000 (11:19 +1000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 26 Jul 2019 07:12:52 +0000 (09:12 +0200)
commit f9dfed1c785734b95b08d67600e05d2092508ab0 upstream.

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 <schmitzmic@gmail.com>
Cc: stable@vger.kernel.org # v4.20+
Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
Tested-by: Stan Johnson <userm57@yahoo.com>
Tested-by: Michael Schmitz <schmitzmic@gmail.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/scsi/NCR5380.c

index e69d46d19119b36ca72ffd0e8b681b0d6af262c1..b1a663d67aea13df689595a2c172b6a44f038ffb 100644 (file)
@@ -1762,10 +1762,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