scsi: aha152x: Modify done() to use separate status bytes
authorHannes Reinecke <hare@suse.de>
Tue, 27 Apr 2021 08:30:35 +0000 (10:30 +0200)
committerMartin K. Petersen <martin.petersen@oracle.com>
Tue, 1 Jun 2021 02:48:23 +0000 (22:48 -0400)
Instead of passing in the combined SCSI result values, split them off into
separate status, message, and host byte values.

Link: https://lore.kernel.org/r/20210427083046.31620-30-hare@suse.de
Signed-off-by: Hannes Reinecke <hare@suse.de>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/aha152x.c

index d8e19af..f59d11f 100644 (file)
@@ -619,7 +619,8 @@ static struct {
 static irqreturn_t intr(int irq, void *dev_id);
 static void reset_ports(struct Scsi_Host *shpnt);
 static void aha152x_error(struct Scsi_Host *shpnt, char *msg);
-static void done(struct Scsi_Host *shpnt, int error);
+static void done(struct Scsi_Host *shpnt, unsigned char status_byte,
+                unsigned char msg_byte, unsigned char host_byte);
 
 /* diagnostics */
 static void show_command(struct scsi_cmnd * ptr);
@@ -1271,7 +1272,8 @@ static int aha152x_biosparam(struct scsi_device *sdev, struct block_device *bdev
  *  Internal done function
  *
  */
-static void done(struct Scsi_Host *shpnt, int error)
+static void done(struct Scsi_Host *shpnt, unsigned char status_byte,
+                unsigned char msg_byte, unsigned char host_byte)
 {
        if (CURRENT_SC) {
                if(DONE_SC)
@@ -1281,7 +1283,9 @@ static void done(struct Scsi_Host *shpnt, int error)
 
                DONE_SC = CURRENT_SC;
                CURRENT_SC = NULL;
-               DONE_SC->result = error;
+               DONE_SC->result = status_byte;
+               set_msg_byte(DONE_SC, msg_byte);
+               set_host_byte(DONE_SC, host_byte);
        } else
                printk(KERN_ERR "aha152x: done() called outside of command\n");
 }
@@ -1376,13 +1380,16 @@ static void busfree_run(struct Scsi_Host *shpnt)
 
                if(CURRENT_SC->SCp.phase & completed) {
                        /* target sent COMMAND COMPLETE */
-                       done(shpnt, (CURRENT_SC->SCp.Status & 0xff) | ((CURRENT_SC->SCp.Message & 0xff) << 8) | (DID_OK << 16));
+                       done(shpnt, CURRENT_SC->SCp.Status,
+                            CURRENT_SC->SCp.Message, DID_OK);
 
                } else if(CURRENT_SC->SCp.phase & aborted) {
-                       done(shpnt, (CURRENT_SC->SCp.Status & 0xff) | ((CURRENT_SC->SCp.Message & 0xff) << 8) | (DID_ABORT << 16));
+                       done(shpnt, CURRENT_SC->SCp.Status,
+                            CURRENT_SC->SCp.Message, DID_ABORT);
 
                } else if(CURRENT_SC->SCp.phase & resetted) {
-                       done(shpnt, (CURRENT_SC->SCp.Status & 0xff) | ((CURRENT_SC->SCp.Message & 0xff) << 8) | (DID_RESET << 16));
+                       done(shpnt, CURRENT_SC->SCp.Status,
+                            CURRENT_SC->SCp.Message, DID_RESET);
 
                } else if(CURRENT_SC->SCp.phase & disconnected) {
                        /* target sent DISCONNECT */
@@ -1394,7 +1401,8 @@ static void busfree_run(struct Scsi_Host *shpnt)
                        CURRENT_SC = NULL;
 
                } else {
-                       done(shpnt, DID_ERROR << 16);
+                       done(shpnt, SAM_STAT_GOOD,
+                            COMMAND_COMPLETE, DID_ERROR);
                }
 #if defined(AHA152X_STAT)
        } else {
@@ -1515,7 +1523,8 @@ static void seldo_run(struct Scsi_Host *shpnt)
        if (TESTLO(SSTAT0, SELDO)) {
                scmd_printk(KERN_ERR, CURRENT_SC,
                            "aha152x: passing bus free condition\n");
-               done(shpnt, DID_NO_CONNECT << 16);
+               done(shpnt, SAM_STAT_GOOD,
+                    COMMAND_COMPLETE, DID_NO_CONNECT);
                return;
        }
 
@@ -1552,12 +1561,15 @@ static void selto_run(struct Scsi_Host *shpnt)
        CURRENT_SC->SCp.phase &= ~selecting;
 
        if (CURRENT_SC->SCp.phase & aborted)
-               done(shpnt, DID_ABORT << 16);
+               done(shpnt, SAM_STAT_GOOD,
+                    COMMAND_COMPLETE, DID_ABORT);
        else if (TESTLO(SSTAT0, SELINGO))
-               done(shpnt, DID_BUS_BUSY << 16);
+               done(shpnt, SAM_STAT_GOOD,
+                    COMMAND_COMPLETE, DID_BUS_BUSY);
        else
                /* ARBITRATION won, but SELECTION failed */
-               done(shpnt, DID_NO_CONNECT << 16);
+               done(shpnt, SAM_STAT_GOOD,
+                    COMMAND_COMPLETE, DID_NO_CONNECT);
 }
 
 /*
@@ -1891,7 +1903,8 @@ static void cmd_init(struct Scsi_Host *shpnt)
        if (CURRENT_SC->SCp.sent_command) {
                scmd_printk(KERN_ERR, CURRENT_SC,
                            "command already sent\n");
-               done(shpnt, DID_ERROR << 16);
+               done(shpnt, SAM_STAT_GOOD,
+                    COMMAND_COMPLETE, DID_ERROR);
                return;
        }
 
@@ -2231,7 +2244,8 @@ static int update_state(struct Scsi_Host *shpnt)
 static void parerr_run(struct Scsi_Host *shpnt)
 {
        scmd_printk(KERN_ERR, CURRENT_SC, "parity error\n");
-       done(shpnt, DID_PARITY << 16);
+       done(shpnt, SAM_STAT_GOOD,
+            COMMAND_COMPLETE, DID_PARITY);
 }
 
 /*
@@ -2262,7 +2276,8 @@ static void rsti_run(struct Scsi_Host *shpnt)
        }
 
        if(CURRENT_SC && !CURRENT_SC->device->soft_reset)
-               done(shpnt, DID_RESET << 16 );
+               done(shpnt, SAM_STAT_GOOD,
+                    COMMAND_COMPLETE, DID_RESET);
 }