diff mbox series

[15/42] NCR5380: use SCSI result accessors

Message ID 20210421174749.11221-16-hare@suse.de
State New
Headers show
Series SCSI result cleanup, part 2 | expand

Commit Message

Hannes Reinecke April 21, 2021, 5:47 p.m. UTC
Use accessors to set the SCSI result.

Signed-off-by: Hannes Reinecke <hare@suse.de>
---
 drivers/scsi/NCR5380.c | 28 ++++++++++++++--------------
 1 file changed, 14 insertions(+), 14 deletions(-)

Comments

Bart Van Assche April 21, 2021, 9:11 p.m. UTC | #1
On 4/21/21 10:47 AM, Hannes Reinecke wrote:
> Use accessors to set the SCSI result.
> 
> Signed-off-by: Hannes Reinecke <hare@suse.de>
> ---
>   drivers/scsi/NCR5380.c | 28 ++++++++++++++--------------
>   1 file changed, 14 insertions(+), 14 deletions(-)
> 
> diff --git a/drivers/scsi/NCR5380.c b/drivers/scsi/NCR5380.c
> index d7594b794d3c..855edda9db41 100644
> --- a/drivers/scsi/NCR5380.c
> +++ b/drivers/scsi/NCR5380.c
> @@ -538,7 +538,7 @@ static void complete_cmd(struct Scsi_Host *instance,
>   
>   	if (hostdata->sensing == cmd) {
>   		/* Autosense processing ends here */
> -		if (status_byte(cmd->result) != GOOD) {
> +		if (get_status_byte(cmd) != SAM_STAT_GOOD) {
>   			scsi_eh_restore_cmnd(cmd, &hostdata->ses);
>   		} else {
>   			scsi_eh_restore_cmnd(cmd, &hostdata->ses);

Do all SCSI devices from the nineties report SCSI status values with the 
lower bit set to 0? If so, can the status_byte() macro be removed entirely?

Thanks,

Bart.
Hannes Reinecke April 22, 2021, 6:37 a.m. UTC | #2
On 4/21/21 11:11 PM, Bart Van Assche wrote:
> On 4/21/21 10:47 AM, Hannes Reinecke wrote:

>> Use accessors to set the SCSI result.

>>

>> Signed-off-by: Hannes Reinecke <hare@suse.de>

>> ---

>>   drivers/scsi/NCR5380.c | 28 ++++++++++++++--------------

>>   1 file changed, 14 insertions(+), 14 deletions(-)

>>

>> diff --git a/drivers/scsi/NCR5380.c b/drivers/scsi/NCR5380.c

>> index d7594b794d3c..855edda9db41 100644

>> --- a/drivers/scsi/NCR5380.c

>> +++ b/drivers/scsi/NCR5380.c

>> @@ -538,7 +538,7 @@ static void complete_cmd(struct Scsi_Host *instance,

>>       if (hostdata->sensing == cmd) {

>>           /* Autosense processing ends here */

>> -        if (status_byte(cmd->result) != GOOD) {

>> +        if (get_status_byte(cmd) != SAM_STAT_GOOD) {

>>               scsi_eh_restore_cmnd(cmd, &hostdata->ses);

>>           } else {

>>               scsi_eh_restore_cmnd(cmd, &hostdata->ses);

> 

> Do all SCSI devices from the nineties report SCSI status values with the 

> lower bit set to 0? If so, can the status_byte() macro be removed entirely?

> 

As indicated in the previous reply, yes, that is the plan (removing the 
status_byte() macro). And the drivers will have to report SCSI status 
values with the lower bit cleared, otherwise the linux SCSI status codes 
would never have worked in the first place.

So I'll be adding a new patch for dropping the 'status_byte()' macro in 
the next round.

Cheers,

Hannes
-- 
Dr. Hannes Reinecke                Kernel Storage Architect
hare@suse.de                              +49 911 74053 688
SUSE Software Solutions GmbH, Maxfeldstr. 5, 90409 Nürnberg
HRB 36809 (AG Nürnberg), Geschäftsführer: Felix Imendörffer
Finn Thain April 22, 2021, 9:36 a.m. UTC | #3
On Wed, 21 Apr 2021, Hannes Reinecke wrote:

> Use accessors to set the SCSI result.

> 

> Signed-off-by: Hannes Reinecke <hare@suse.de>

> ---

>  drivers/scsi/NCR5380.c | 28 ++++++++++++++--------------

>  1 file changed, 14 insertions(+), 14 deletions(-)

> 

> diff --git a/drivers/scsi/NCR5380.c b/drivers/scsi/NCR5380.c

> index d7594b794d3c..855edda9db41 100644

> --- a/drivers/scsi/NCR5380.c

> +++ b/drivers/scsi/NCR5380.c

> @@ -538,7 +538,7 @@ static void complete_cmd(struct Scsi_Host *instance,

>  

>  	if (hostdata->sensing == cmd) {

>  		/* Autosense processing ends here */

> -		if (status_byte(cmd->result) != GOOD) {

> +		if (get_status_byte(cmd) != SAM_STAT_GOOD) {

>  			scsi_eh_restore_cmnd(cmd, &hostdata->ses);

>  		} else {

>  			scsi_eh_restore_cmnd(cmd, &hostdata->ses);

> @@ -567,18 +567,19 @@ static int NCR5380_queue_command(struct Scsi_Host *instance,

>  	struct NCR5380_cmd *ncmd = scsi_cmd_priv(cmd);

>  	unsigned long flags;

>  

> +	set_host_byte(cmd, DID_OK);

> +	set_status_byte(cmd, SAM_STAT_GOOD);

>  #if (NDEBUG & NDEBUG_NO_WRITE)

>  	switch (cmd->cmnd[0]) {

>  	case WRITE_6:

>  	case WRITE_10:

>  		shost_printk(KERN_DEBUG, instance, "WRITE attempted with NDEBUG_NO_WRITE set\n");

> -		cmd->result = (DID_ERROR << 16);

> +		set_host_byte(cmd, DID_ERROR);

>  		cmd->scsi_done(cmd);

>  		return 0;

>  	}

>  #endif /* (NDEBUG & NDEBUG_NO_WRITE) */

>  

> -	cmd->result = 0;

>  


Please remove the superfluous blank line.
Bart Van Assche April 22, 2021, 4:10 p.m. UTC | #4
On 4/21/21 11:37 PM, Hannes Reinecke wrote:
> On 4/21/21 11:11 PM, Bart Van Assche wrote:

>> Do all SCSI devices from the nineties report SCSI status values with

>> the lower bit set to 0? If so, can the status_byte() macro be removed

>> entirely?

>>

> As indicated in the previous reply, yes, that is the plan (removing the

> status_byte() macro). And the drivers will have to report SCSI status

> values with the lower bit cleared, otherwise the linux SCSI status codes

> would never have worked in the first place.


Please elaborate the above further. My understanding is that SCSI-2
defines bits 0, 6 and 7 of the status byte as reserved while SAM-2
specifies that these bits must be zero for the status codes that also
have been defined in SCSI-2. Is it safe to assume that all SCSI-2
devices set the reserved bits to zero?

Thanks,

Bart.
Hannes Reinecke April 26, 2021, 8:30 a.m. UTC | #5
On 4/22/21 6:10 PM, Bart Van Assche wrote:
> On 4/21/21 11:37 PM, Hannes Reinecke wrote:

>> On 4/21/21 11:11 PM, Bart Van Assche wrote:

>>> Do all SCSI devices from the nineties report SCSI status values with

>>> the lower bit set to 0? If so, can the status_byte() macro be removed

>>> entirely?

>>>

>> As indicated in the previous reply, yes, that is the plan (removing the

>> status_byte() macro). And the drivers will have to report SCSI status

>> values with the lower bit cleared, otherwise the linux SCSI status codes

>> would never have worked in the first place.

> 

> Please elaborate the above further. My understanding is that SCSI-2

> defines bits 0, 6 and 7 of the status byte as reserved while SAM-2

> specifies that these bits must be zero for the status codes that also

> have been defined in SCSI-2. Is it safe to assume that all SCSI-2

> devices set the reserved bits to zero?

> 

Yes. At least we haven't encountered any devices which do.
And are quite unlikely to find any new or unknown SCSI-2 devices, as the
market for SCSI parallel drives is _quite_ small :-)

Cheers,

Hannes
-- 
Dr. Hannes Reinecke		        Kernel Storage Architect
hare@suse.de			               +49 911 74053 688
SUSE Software Solutions Germany GmbH, 90409 Nürnberg
GF: F. Imendörffer, HRB 36809 (AG Nürnberg)
diff mbox series

Patch

diff --git a/drivers/scsi/NCR5380.c b/drivers/scsi/NCR5380.c
index d7594b794d3c..855edda9db41 100644
--- a/drivers/scsi/NCR5380.c
+++ b/drivers/scsi/NCR5380.c
@@ -538,7 +538,7 @@  static void complete_cmd(struct Scsi_Host *instance,
 
 	if (hostdata->sensing == cmd) {
 		/* Autosense processing ends here */
-		if (status_byte(cmd->result) != GOOD) {
+		if (get_status_byte(cmd) != SAM_STAT_GOOD) {
 			scsi_eh_restore_cmnd(cmd, &hostdata->ses);
 		} else {
 			scsi_eh_restore_cmnd(cmd, &hostdata->ses);
@@ -567,18 +567,19 @@  static int NCR5380_queue_command(struct Scsi_Host *instance,
 	struct NCR5380_cmd *ncmd = scsi_cmd_priv(cmd);
 	unsigned long flags;
 
+	set_host_byte(cmd, DID_OK);
+	set_status_byte(cmd, SAM_STAT_GOOD);
 #if (NDEBUG & NDEBUG_NO_WRITE)
 	switch (cmd->cmnd[0]) {
 	case WRITE_6:
 	case WRITE_10:
 		shost_printk(KERN_DEBUG, instance, "WRITE attempted with NDEBUG_NO_WRITE set\n");
-		cmd->result = (DID_ERROR << 16);
+		set_host_byte(cmd, DID_ERROR);
 		cmd->scsi_done(cmd);
 		return 0;
 	}
 #endif /* (NDEBUG & NDEBUG_NO_WRITE) */
 
-	cmd->result = 0;
 
 	spin_lock_irqsave(&hostdata->lock, flags);
 
@@ -1154,7 +1155,7 @@  static bool NCR5380_select(struct Scsi_Host *instance, struct scsi_cmnd *cmd)
 		if (!hostdata->selecting)
 			return false;
 
-		cmd->result = DID_BAD_TARGET << 16;
+		set_host_byte(cmd, DID_BAD_TARGET);
 		complete_cmd(instance, cmd);
 		dsprintk(NDEBUG_SELECTION, instance,
 			"target did not respond within 250ms\n");
@@ -1203,7 +1204,7 @@  static bool NCR5380_select(struct Scsi_Host *instance, struct scsi_cmnd *cmd)
 	NCR5380_transfer_pio(instance, &phase, &len, &data, 0);
 	if (len) {
 		NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
-		cmd->result = DID_ERROR << 16;
+		set_host_byte(cmd, DID_ERROR);
 		complete_cmd(instance, cmd);
 		dsprintk(NDEBUG_SELECTION, instance, "IDENTIFY message transfer failed\n");
 		ret = false;
@@ -1743,7 +1744,7 @@  static void NCR5380_information_transfer(struct Scsi_Host *instance)
 				shost_printk(KERN_DEBUG, instance, "NDEBUG_NO_DATAOUT set, attempted DATAOUT aborted\n");
 				sink = 1;
 				do_abort(instance, 0);
-				cmd->result = DID_ERROR << 16;
+				set_host_byte(cmd, DID_ERROR);
 				complete_cmd(instance, cmd);
 				hostdata->connected = NULL;
 				hostdata->busy[scmd_id(cmd)] &= ~(1 << cmd->device->lun);
@@ -1826,9 +1827,8 @@  static void NCR5380_information_transfer(struct Scsi_Host *instance)
 					hostdata->connected = NULL;
 					hostdata->busy[scmd_id(cmd)] &= ~(1 << cmd->device->lun);
 
-					cmd->result &= ~0xffff;
-					cmd->result |= cmd->SCp.Status;
-					cmd->result |= cmd->SCp.Message << 8;
+					set_msg_byte(cmd, cmd->SCp.Message);
+					set_status_byte(cmd, cmd->SCp.Status);
 
 					set_resid_from_SCp(cmd);
 
@@ -1980,7 +1980,7 @@  static void NCR5380_information_transfer(struct Scsi_Host *instance)
 				if (msgout == ABORT) {
 					hostdata->connected = NULL;
 					hostdata->busy[scmd_id(cmd)] &= ~(1 << cmd->device->lun);
-					cmd->result = DID_ERROR << 16;
+					set_host_byte(cmd, DID_ERROR);
 					complete_cmd(instance, cmd);
 					return;
 				}
@@ -2261,7 +2261,7 @@  static int NCR5380_abort(struct scsi_cmnd *cmd)
 	if (list_del_cmd(&hostdata->unissued, cmd)) {
 		dsprintk(NDEBUG_ABORT, instance,
 		         "abort: removed %p from issue queue\n", cmd);
-		cmd->result = DID_ABORT << 16;
+		set_host_byte(cmd, DID_ABORT);
 		cmd->scsi_done(cmd); /* No tag or busy flag to worry about */
 		goto out;
 	}
@@ -2270,7 +2270,7 @@  static int NCR5380_abort(struct scsi_cmnd *cmd)
 		dsprintk(NDEBUG_ABORT, instance,
 		         "abort: cmd %p == selecting\n", cmd);
 		hostdata->selecting = NULL;
-		cmd->result = DID_ABORT << 16;
+		set_host_byte(cmd, DID_ABORT);
 		complete_cmd(instance, cmd);
 		goto out;
 	}
@@ -2341,7 +2341,7 @@  static void bus_reset_cleanup(struct Scsi_Host *instance)
 	 */
 
 	if (hostdata->selecting) {
-		hostdata->selecting->result = DID_RESET << 16;
+		set_host_byte(hostdata->selecting, DID_RESET);
 		complete_cmd(instance, hostdata->selecting);
 		hostdata->selecting = NULL;
 	}
@@ -2399,7 +2399,7 @@  static int NCR5380_host_reset(struct scsi_cmnd *cmd)
 	list_for_each_entry(ncmd, &hostdata->unissued, list) {
 		struct scsi_cmnd *scmd = NCR5380_to_scmd(ncmd);
 
-		scmd->result = DID_RESET << 16;
+		set_host_byte(scmd, DID_RESET);
 		scmd->scsi_done(scmd);
 	}
 	INIT_LIST_HEAD(&hostdata->unissued);