scsi: NCR5380: Call scsi_set_resid() on command completion
authorFinn Thain <fthain@telegraphics.com.au>
Sat, 16 Nov 2019 03:36:57 +0000 (14:36 +1100)
committerMartin K. Petersen <martin.petersen@oracle.com>
Wed, 20 Nov 2019 02:37:34 +0000 (21:37 -0500)
Most NCR5380 drivers calculate the residual for every data transfer.
(A few drivers just set it to zero.) Pass this quantity back to the scsi
mid-layer on command completion.

Cc: Michael Schmitz <schmitzmic@gmail.com>
Cc: Ondrej Zary <linux@zary.sk>
Link: https://lore.kernel.org/r/1f26ead9dd0dc053fcd27979d69a7ca74b6589b4.1573875417.git.fthain@telegraphics.com.au
Reviewed-and-tested-by: Michael Schmitz <schmitzmic@gmail.com>
Tested-by: Ondrej Zary <linux@zary.sk>
Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/NCR5380.c

index 536426f..b040b83 100644 (file)
@@ -172,6 +172,19 @@ static inline void advance_sg_buffer(struct scsi_cmnd *cmd)
        }
 }
 
+static inline void set_resid_from_SCp(struct scsi_cmnd *cmd)
+{
+       int resid = cmd->SCp.this_residual;
+       struct scatterlist *s = cmd->SCp.buffer;
+
+       if (s)
+               while (!sg_is_last(s)) {
+                       s = sg_next(s);
+                       resid += s->length;
+               }
+       scsi_set_resid(cmd, resid);
+}
+
 /**
  * NCR5380_poll_politely2 - wait for two chip register values
  * @hostdata: host private data
@@ -1803,6 +1816,8 @@ static void NCR5380_information_transfer(struct Scsi_Host *instance)
                                        cmd->result |= cmd->SCp.Status;
                                        cmd->result |= cmd->SCp.Message << 8;
 
+                                       set_resid_from_SCp(cmd);
+
                                        if (cmd->cmnd[0] == REQUEST_SENSE)
                                                complete_cmd(instance, cmd);
                                        else {