Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

scsi: ncr53c8xx: Use SAM status values

Use SAM status values instead of the driver-defined ones. This also fixes
a potential bug as the driver-defined values declare 'COMMAND TERMINATED'
with a value of 0x20, whereas SCSI-II defines it with a value of 0x22.

Link: https://lore.kernel.org/r/20210113090500.129644-36-hare@suse.de
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Hannes Reinecke <hare@suse.de>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>

authored by

Hannes Reinecke and committed by
Martin K. Petersen
491152c7 aced5500

+46 -53
+46 -37
drivers/scsi/ncr53c8xx.c
··· 148 148 #define DEBUG_FLAGS SCSI_NCR_DEBUG_FLAGS 149 149 #endif 150 150 151 + /* 152 + * Locally used status flag 153 + */ 154 + #define SAM_STAT_ILLEGAL 0xff 155 + 151 156 static inline struct list_head *ncr_list_pop(struct list_head *head) 152 157 { 153 158 if (!list_empty(head)) { ··· 1002 997 /* 1003 998 ** Other definitions 1004 999 */ 1005 - 1006 - #define ScsiResult(host_code, scsi_code) (((host_code) << 16) + ((scsi_code) & 0x7f)) 1007 1000 1008 1001 #define initverbose (driver_setup.verbose) 1009 1002 #define bootverbose (np->verbose) ··· 2433 2430 */ 2434 2431 SCR_FROM_REG (SS_REG), 2435 2432 0, 2436 - SCR_CALL ^ IFFALSE (DATA (S_GOOD)), 2433 + SCR_CALL ^ IFFALSE (DATA (SAM_STAT_GOOD)), 2437 2434 PADDRH (bad_status), 2438 2435 2439 2436 #ifndef SCSI_NCR_CCB_DONE_SUPPORT ··· 2882 2879 8, 2883 2880 SCR_TO_REG (HS_REG), 2884 2881 0, 2885 - SCR_LOAD_REG (SS_REG, S_GOOD), 2882 + SCR_LOAD_REG (SS_REG, SAM_STAT_GOOD), 2886 2883 0, 2887 2884 SCR_JUMP, 2888 2885 PADDR (cleanup_ok), ··· 3344 3341 PADDRH (reset), 3345 3342 }/*-------------------------< BAD_STATUS >-----------------*/,{ 3346 3343 /* 3347 - ** If command resulted in either QUEUE FULL, 3344 + ** If command resulted in either TASK_SET FULL, 3348 3345 ** CHECK CONDITION or COMMAND TERMINATED, 3349 3346 ** call the C code. 3350 3347 */ 3351 - SCR_INT ^ IFTRUE (DATA (S_QUEUE_FULL)), 3348 + SCR_INT ^ IFTRUE (DATA (SAM_STAT_TASK_SET_FULL)), 3352 3349 SIR_BAD_STATUS, 3353 - SCR_INT ^ IFTRUE (DATA (S_CHECK_COND)), 3350 + SCR_INT ^ IFTRUE (DATA (SAM_STAT_CHECK_CONDITION)), 3354 3351 SIR_BAD_STATUS, 3355 - SCR_INT ^ IFTRUE (DATA (S_TERMINATED)), 3352 + SCR_INT ^ IFTRUE (DATA (SAM_STAT_COMMAND_TERMINATED)), 3356 3353 SIR_BAD_STATUS, 3357 3354 SCR_RETURN, 3358 3355 0, ··· 4374 4371 */ 4375 4372 cp->actualquirks = 0; 4376 4373 cp->host_status = cp->nego_status ? HS_NEGOTIATE : HS_BUSY; 4377 - cp->scsi_status = S_ILLEGAL; 4374 + cp->scsi_status = SAM_STAT_ILLEGAL; 4378 4375 cp->parity_status = 0; 4379 4376 4380 4377 cp->xerr_status = XE_OK; ··· 4605 4602 * in order to keep it alive. 4606 4603 */ 4607 4604 if (!found && sync_reset && !retrieve_from_waiting_list(0, np, cmd)) { 4608 - cmd->result = DID_RESET << 16; 4605 + set_host_byte(cmd, DID_RESET); 4609 4606 ncr_queue_done_cmd(np, cmd); 4610 4607 } 4611 4608 ··· 4633 4630 * First, look for the scsi command in the waiting list 4634 4631 */ 4635 4632 if (remove_from_waiting_list(np, cmd)) { 4636 - cmd->result = ScsiResult(DID_ABORT, 0); 4633 + set_host_byte(cmd, DID_ABORT); 4637 4634 ncr_queue_done_cmd(np, cmd); 4638 4635 return SCSI_ABORT_SUCCESS; 4639 4636 } ··· 4898 4895 ** Print out any error for debugging purpose. 4899 4896 */ 4900 4897 if (DEBUG_FLAGS & (DEBUG_RESULT|DEBUG_TINY)) { 4901 - if (cp->host_status!=HS_COMPLETE || cp->scsi_status!=S_GOOD) { 4898 + if (cp->host_status != HS_COMPLETE || 4899 + cp->scsi_status != SAM_STAT_GOOD) { 4902 4900 PRINT_ADDR(cmd, "ERROR: cmd=%x host_status=%x " 4903 4901 "scsi_status=%x\n", cmd->cmnd[0], 4904 4902 cp->host_status, cp->scsi_status); ··· 4909 4905 /* 4910 4906 ** Check the status. 4911 4907 */ 4908 + cmd->result = 0; 4912 4909 if ( (cp->host_status == HS_COMPLETE) 4913 - && (cp->scsi_status == S_GOOD || 4914 - cp->scsi_status == S_COND_MET)) { 4910 + && (cp->scsi_status == SAM_STAT_GOOD || 4911 + cp->scsi_status == SAM_STAT_CONDITION_MET)) { 4915 4912 /* 4916 4913 * All went well (GOOD status). 4917 - * CONDITION MET status is returned on 4914 + * CONDITION MET status is returned on 4918 4915 * `Pre-Fetch' or `Search data' success. 4919 4916 */ 4920 - cmd->result = ScsiResult(DID_OK, cp->scsi_status); 4917 + set_status_byte(cmd, cp->scsi_status); 4921 4918 4922 4919 /* 4923 4920 ** @RESID@ ··· 4949 4944 } 4950 4945 } 4951 4946 } else if ((cp->host_status == HS_COMPLETE) 4952 - && (cp->scsi_status == S_CHECK_COND)) { 4947 + && (cp->scsi_status == SAM_STAT_CHECK_CONDITION)) { 4953 4948 /* 4954 4949 ** Check condition code 4955 4950 */ 4956 - cmd->result = DID_OK << 16 | S_CHECK_COND; 4951 + set_status_byte(cmd, SAM_STAT_CHECK_CONDITION); 4957 4952 4958 4953 /* 4959 4954 ** Copy back sense data to caller's buffer. ··· 4970 4965 printk (".\n"); 4971 4966 } 4972 4967 } else if ((cp->host_status == HS_COMPLETE) 4973 - && (cp->scsi_status == S_CONFLICT)) { 4968 + && (cp->scsi_status == SAM_STAT_RESERVATION_CONFLICT)) { 4974 4969 /* 4975 4970 ** Reservation Conflict condition code 4976 4971 */ 4977 - cmd->result = DID_OK << 16 | S_CONFLICT; 4978 - 4972 + set_status_byte(cmd, SAM_STAT_RESERVATION_CONFLICT); 4973 + 4979 4974 } else if ((cp->host_status == HS_COMPLETE) 4980 - && (cp->scsi_status == S_BUSY || 4981 - cp->scsi_status == S_QUEUE_FULL)) { 4975 + && (cp->scsi_status == SAM_STAT_BUSY || 4976 + cp->scsi_status == SAM_STAT_TASK_SET_FULL)) { 4982 4977 4983 4978 /* 4984 4979 ** Target is busy. 4985 4980 */ 4986 - cmd->result = ScsiResult(DID_OK, cp->scsi_status); 4981 + set_status_byte(cmd, cp->scsi_status); 4987 4982 4988 4983 } else if ((cp->host_status == HS_SEL_TIMEOUT) 4989 4984 || (cp->host_status == HS_TIMEOUT)) { ··· 4991 4986 /* 4992 4987 ** No response 4993 4988 */ 4994 - cmd->result = ScsiResult(DID_TIME_OUT, cp->scsi_status); 4989 + set_status_byte(cmd, cp->scsi_status); 4990 + set_host_byte(cmd, DID_TIME_OUT); 4995 4991 4996 4992 } else if (cp->host_status == HS_RESET) { 4997 4993 4998 4994 /* 4999 4995 ** SCSI bus reset 5000 4996 */ 5001 - cmd->result = ScsiResult(DID_RESET, cp->scsi_status); 4997 + set_status_byte(cmd, sp->scsi_status); 4998 + set_host_byte(cmd, DID_RESET); 5002 4999 5003 5000 } else if (cp->host_status == HS_ABORTED) { 5004 5001 5005 5002 /* 5006 5003 ** Transfer aborted 5007 5004 */ 5008 - cmd->result = ScsiResult(DID_ABORT, cp->scsi_status); 5005 + set_status_byte(cmd, cp->scsi_status); 5006 + set_host_byte(cmd, DID_ABORT); 5009 5007 5010 5008 } else { 5011 5009 ··· 5018 5010 PRINT_ADDR(cmd, "COMMAND FAILED (%x %x) @%p.\n", 5019 5011 cp->host_status, cp->scsi_status, cp); 5020 5012 5021 - cmd->result = ScsiResult(DID_ERROR, cp->scsi_status); 5013 + set_status_byte(cmd, cp->scsi_status); 5014 + set_host_byte(cmd, DID_ERROR); 5022 5015 } 5023 5016 5024 5017 /* ··· 5035 5026 5036 5027 if (cp->host_status==HS_COMPLETE) { 5037 5028 switch (cp->scsi_status) { 5038 - case S_GOOD: 5029 + case SAM_STAT_GOOD: 5039 5030 printk (" GOOD"); 5040 5031 break; 5041 - case S_CHECK_COND: 5032 + case SAM_STAT_CHECK_CONDITION: 5042 5033 printk (" SENSE:"); 5043 5034 p = (u_char*) &cmd->sense_buffer; 5044 5035 for (i=0; i<14; i++) ··· 6573 6564 6574 6565 switch(s_status) { 6575 6566 default: /* Just for safety, should never happen */ 6576 - case S_QUEUE_FULL: 6567 + case SAM_STAT_TASK_SET_FULL: 6577 6568 /* 6578 6569 ** Decrease number of tags to the number of 6579 6570 ** disconnected commands. ··· 6597 6588 */ 6598 6589 cp->phys.header.savep = cp->startp; 6599 6590 cp->host_status = HS_BUSY; 6600 - cp->scsi_status = S_ILLEGAL; 6591 + cp->scsi_status = SAM_STAT_ILLEGAL; 6601 6592 6602 6593 ncr_put_start_queue(np, cp); 6603 6594 if (disc_cnt) 6604 6595 INB (nc_ctest2); /* Clear SIGP */ 6605 6596 OUTL_DSP (NCB_SCRIPT_PHYS (np, reselect)); 6606 6597 return; 6607 - case S_TERMINATED: 6608 - case S_CHECK_COND: 6598 + case SAM_STAT_COMMAND_TERMINATED: 6599 + case SAM_STAT_CHECK_CONDIION: 6609 6600 /* 6610 6601 ** If we were requesting sense, give up. 6611 6602 */ ··· 6655 6646 cp->phys.header.wlastp = startp; 6656 6647 6657 6648 cp->host_status = HS_BUSY; 6658 - cp->scsi_status = S_ILLEGAL; 6649 + cp->scsi_status = SAM_STAT_ILLEGAL; 6659 6650 cp->auto_sense = s_status; 6660 6651 6661 6652 cp->start.schedule.l_paddr = ··· 8044 8035 spin_lock_irqsave(&np->smp_lock, flags); 8045 8036 8046 8037 if ((sts = ncr_queue_command(np, cmd)) != DID_OK) { 8047 - cmd->result = sts << 16; 8038 + set_host_byte(cmd, sts; 8048 8039 #ifdef DEBUG_NCR53C8XX 8049 8040 printk("ncr53c8xx : command not queued - result=%d\n", sts); 8050 8041 #endif ··· 8235 8226 #ifdef DEBUG_WAITING_LIST 8236 8227 printk("%s: cmd %lx done forced sts=%d\n", ncr_name(np), (u_long) wcmd, sts); 8237 8228 #endif 8238 - wcmd->result = sts << 16; 8229 + set_host_byte(wcmd, sts); 8239 8230 ncr_queue_done_cmd(np, wcmd); 8240 8231 } 8241 8232 }
-16
drivers/scsi/ncr53c8xx.h
··· 1239 1239 */ 1240 1240 1241 1241 /* 1242 - ** Status 1243 - */ 1244 - 1245 - #define S_GOOD (0x00) 1246 - #define S_CHECK_COND (0x02) 1247 - #define S_COND_MET (0x04) 1248 - #define S_BUSY (0x08) 1249 - #define S_INT (0x10) 1250 - #define S_INT_COND_MET (0x14) 1251 - #define S_CONFLICT (0x18) 1252 - #define S_TERMINATED (0x20) 1253 - #define S_QUEUE_FULL (0x28) 1254 - #define S_ILLEGAL (0xff) 1255 - #define S_SENSE (0x80) 1256 - 1257 - /* 1258 1242 * End of ncrreg from FreeBSD 1259 1243 */ 1260 1244