An explanation of the purpose of this patch is available in the patch "scsi: Introduce the scsi_status union". Cc: Russell King <linux@xxxxxxxxxxxxxxx> Signed-off-by: Bart Van Assche <bvanassche@xxxxxxx> --- drivers/scsi/arm/acornscsi.c | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/drivers/scsi/arm/acornscsi.c b/drivers/scsi/arm/acornscsi.c index 912828d1dcad..dd111ec4d7db 100644 --- a/drivers/scsi/arm/acornscsi.c +++ b/drivers/scsi/arm/acornscsi.c @@ -168,7 +168,7 @@ unsigned int sdtr_period = SDTR_PERIOD; unsigned int sdtr_size = SDTR_SIZE; static void acornscsi_done(AS_Host *host, struct scsi_cmnd **SCpntp, - unsigned int result); + enum host_status result); static int acornscsi_reconnect_finish(AS_Host *host); static void acornscsi_dma_cleanup(AS_Host *host); static void acornscsi_abortcmd(AS_Host *host, unsigned char tag); @@ -773,14 +773,13 @@ intr_ret_t acornscsi_kick(AS_Host *host) return INTR_PROCESSING; } -/* - * Function: void acornscsi_done(AS_Host *host, struct scsi_cmnd **SCpntp, unsigned int result) - * Purpose : complete processing for command - * Params : host - interface that completed - * result - driver byte of result +/** + * acornscsi_done - complete processing for command + * @host: interface that completed + * @result: host status byte (DID_...) */ static void acornscsi_done(AS_Host *host, struct scsi_cmnd **SCpntp, - unsigned int result) + enum host_status result) { struct scsi_cmnd *SCpnt = *SCpntp; @@ -794,7 +793,9 @@ static void acornscsi_done(AS_Host *host, struct scsi_cmnd **SCpntp, acornscsi_dma_cleanup(host); - SCpnt->result = result << 16 | host->scsi.SCp.Message << 8 | host->scsi.SCp.Status; + SCpnt->status = (union scsi_status){ + .b.host = result, .b.msg = host->scsi.SCp.Message, + .b.status = host->scsi.SCp.Status}; /* * In theory, this should not happen. In practice, it seems to. @@ -833,7 +834,7 @@ static void acornscsi_done(AS_Host *host, struct scsi_cmnd **SCpntp, xfer_warn = 0; if (xfer_warn) { - switch (status_byte(SCpnt->result)) { + switch (status_byte(SCpnt->status)) { case CHECK_CONDITION: case COMMAND_TERMINATED: case BUSY: @@ -844,7 +845,7 @@ static void acornscsi_done(AS_Host *host, struct scsi_cmnd **SCpntp, default: scmd_printk(KERN_ERR, SCpnt, "incomplete data transfer detected: " - "result=%08X", SCpnt->result); + "result=%08X", SCpnt->status.combined); scsi_print_command(SCpnt); acornscsi_dumpdma(host, "done"); acornscsi_dumplog(host, SCpnt->device->id); @@ -2470,7 +2471,7 @@ static int acornscsi_queuecmd_lck(struct scsi_cmnd *SCpnt, if (acornscsi_cmdtype(SCpnt->cmnd[0]) == CMD_WRITE && (NO_WRITE & (1 << SCpnt->device->id))) { printk(KERN_CRIT "scsi%d.%c: WRITE attempted with NO_WRITE flag set\n", host->host->host_no, '0' + SCpnt->device->id); - SCpnt->result = DID_NO_CONNECT << 16; + SCpnt->status.combined = DID_NO_CONNECT << 16; done(SCpnt); return 0; } @@ -2478,7 +2479,7 @@ static int acornscsi_queuecmd_lck(struct scsi_cmnd *SCpnt, SCpnt->scsi_done = done; SCpnt->host_scribble = NULL; - SCpnt->result = 0; + SCpnt->status.combined = 0; SCpnt->tag = 0; SCpnt->SCp.phase = (int)acornscsi_datadirection(SCpnt->cmnd[0]); SCpnt->SCp.sent_command = 0; @@ -2492,7 +2493,7 @@ static int acornscsi_queuecmd_lck(struct scsi_cmnd *SCpnt, unsigned long flags; if (!queue_add_cmd_ordered(&host->queues.issue, SCpnt)) { - SCpnt->result = DID_ERROR << 16; + SCpnt->status.combined = DID_ERROR << 16; done(SCpnt); return 0; } @@ -2523,7 +2524,7 @@ static inline void acornscsi_reportstatus(struct scsi_cmnd **SCpntp1, if (SCpnt) { *SCpntp1 = NULL; - SCpnt->result = result; + SCpnt->status.combined = result; SCpnt->scsi_done(SCpnt); }