tree:
https://github.com/bvanassche/linux scsi-for-next
head: 82fed99944bad457ee009b37605e043e617280fd
commit: ead328d8360e918f3c8b83454fb19fec6f2f122b [31/36] Use struct scsi_status more
widely
config: x86_64-randconfig-a002-20210412 (attached as .config)
compiler: clang version 13.0.0 (
https://github.com/llvm/llvm-project
9829f5e6b1bca9b61efc629770d28bb9014dec45)
reproduce (this is a W=1 build):
wget
https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O
~/bin/make.cross
chmod +x ~/bin/make.cross
# install x86_64 cross compiling tool for clang build
# apt-get install binutils-x86-64-linux-gnu
#
https://github.com/bvanassche/linux/commit/ead328d8360e918f3c8b83454fb19f...
git remote add bvanassche
https://github.com/bvanassche/linux
git fetch --no-tags bvanassche scsi-for-next
git checkout ead328d8360e918f3c8b83454fb19fec6f2f122b
# save the attached .config to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=x86_64
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp(a)intel.com>
All errors (new ones prefixed by >>):
> drivers/scsi/53c700.c:984:6: error: member reference base type
'__u8' (aka 'unsigned char') is not a structure or union
if(status_byte(hostdata->status[0]) == CHECK_CONDITION ||
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/scsi/scsi.h:136:38: note: expanded from macro 'status_byte'
#define status_byte(result) ((result).b.status >> 1)
~~~~~~~~^~
drivers/scsi/53c700.c:985:6: error: member reference base type '__u8' (aka
'unsigned char') is not a structure or union
status_byte(hostdata->status[0]) == COMMAND_TERMINATED) {
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/scsi/scsi.h:136:38: note: expanded from macro 'status_byte'
#define status_byte(result) ((result).b.status >> 1)
~~~~~~~~^~
2 errors generated.
vim +984 drivers/scsi/53c700.c
^1da177e4c3f415 Linus Torvalds 2005-04-16 961
^1da177e4c3f415 Linus Torvalds 2005-04-16 962 STATIC __u32
^1da177e4c3f415 Linus Torvalds 2005-04-16 963 process_script_interrupt(__u32 dsps,
__u32 dsp, struct scsi_cmnd *SCp,
^1da177e4c3f415 Linus Torvalds 2005-04-16 964 struct Scsi_Host *host,
^1da177e4c3f415 Linus Torvalds 2005-04-16 965 struct NCR_700_Host_Parameters
*hostdata)
^1da177e4c3f415 Linus Torvalds 2005-04-16 966 {
^1da177e4c3f415 Linus Torvalds 2005-04-16 967 __u32 resume_offset = 0;
^1da177e4c3f415 Linus Torvalds 2005-04-16 968 __u8 pun = 0xff, lun=0xff;
^1da177e4c3f415 Linus Torvalds 2005-04-16 969
^1da177e4c3f415 Linus Torvalds 2005-04-16 970 if(SCp != NULL) {
^1da177e4c3f415 Linus Torvalds 2005-04-16 971 pun = SCp->device->id;
^1da177e4c3f415 Linus Torvalds 2005-04-16 972 lun = SCp->device->lun;
^1da177e4c3f415 Linus Torvalds 2005-04-16 973 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 974
^1da177e4c3f415 Linus Torvalds 2005-04-16 975 if(dsps ==
A_GOOD_STATUS_AFTER_STATUS) {
^1da177e4c3f415 Linus Torvalds 2005-04-16 976 DEBUG((" COMMAND COMPLETE,
status=%02x\n",
^1da177e4c3f415 Linus Torvalds 2005-04-16 977 hostdata->status[0]));
^1da177e4c3f415 Linus Torvalds 2005-04-16 978 /* OK, if TCQ still under
negotiation, we now know it works */
^1da177e4c3f415 Linus Torvalds 2005-04-16 979 if
(NCR_700_get_tag_neg_state(SCp->device) == NCR_700_DURING_TAG_NEGOTIATION)
^1da177e4c3f415 Linus Torvalds 2005-04-16 980
NCR_700_set_tag_neg_state(SCp->device,
^1da177e4c3f415 Linus Torvalds 2005-04-16 981
NCR_700_FINISHED_TAG_NEGOTIATION);
^1da177e4c3f415 Linus Torvalds 2005-04-16 982
ac5669bf79d976f ganjisheng 2021-03-16 983 /* check for contingent allegiance
conditions */
^1da177e4c3f415 Linus Torvalds 2005-04-16 @984
if(status_byte(hostdata->status[0]) == CHECK_CONDITION ||
^1da177e4c3f415 Linus Torvalds 2005-04-16 985
status_byte(hostdata->status[0]) == COMMAND_TERMINATED) {
^1da177e4c3f415 Linus Torvalds 2005-04-16 986 struct NCR_700_command_slot *slot
=
^1da177e4c3f415 Linus Torvalds 2005-04-16 987 (struct NCR_700_command_slot
*)SCp->host_scribble;
0f13fc09db68de9 James Bottomley 2006-06-29 988 if(slot->flags ==
NCR_700_FLAG_AUTOSENSE) {
^1da177e4c3f415 Linus Torvalds 2005-04-16 989 /* OOPS: bad device, returning
another
^1da177e4c3f415 Linus Torvalds 2005-04-16 990 * contingent allegiance condition
*/
017560fca496f72 Jeff Garzik 2005-10-24 991 scmd_printk(KERN_ERR, SCp,
017560fca496f72 Jeff Garzik 2005-10-24 992 "broken device is looping in
contingent allegiance: ignoring\n");
^1da177e4c3f415 Linus Torvalds 2005-04-16 993 NCR_700_scsi_done(hostdata, SCp,
hostdata->status[0]);
^1da177e4c3f415 Linus Torvalds 2005-04-16 994 } else {
0f13fc09db68de9 James Bottomley 2006-06-29 995 char *cmnd =
0f13fc09db68de9 James Bottomley 2006-06-29 996
NCR_700_get_sense_cmnd(SCp->device);
^1da177e4c3f415 Linus Torvalds 2005-04-16 997 #ifdef NCR_DEBUG
^1da177e4c3f415 Linus Torvalds 2005-04-16 998 scsi_print_command(SCp);
^1da177e4c3f415 Linus Torvalds 2005-04-16 999 printk(" cmd %p has status
%d, requesting sense\n",
^1da177e4c3f415 Linus Torvalds 2005-04-16 1000 SCp,
hostdata->status[0]);
^1da177e4c3f415 Linus Torvalds 2005-04-16 1001 #endif
^1da177e4c3f415 Linus Torvalds 2005-04-16 1002 /* we can destroy the command
here
^1da177e4c3f415 Linus Torvalds 2005-04-16 1003 * because the contingent
allegiance
^1da177e4c3f415 Linus Torvalds 2005-04-16 1004 * condition will cause a retry
which
^1da177e4c3f415 Linus Torvalds 2005-04-16 1005 * will re-copy the command from
the
^1da177e4c3f415 Linus Torvalds 2005-04-16 1006 * saved data_cmnd. We also unmap
any
^1da177e4c3f415 Linus Torvalds 2005-04-16 1007 * data associated with the
command
^1da177e4c3f415 Linus Torvalds 2005-04-16 1008 * here */
^1da177e4c3f415 Linus Torvalds 2005-04-16 1009 NCR_700_unmap(hostdata, SCp,
slot);
67d59dfdeb21df2 James Bottomley 2006-06-13 1010 dma_unmap_single(hostdata->dev,
slot->pCmd,
64a87b244b92976 Boaz Harrosh 2008-04-30 1011 MAX_COMMAND_SIZE,
67d59dfdeb21df2 James Bottomley 2006-06-13 1012 DMA_TO_DEVICE);
67d59dfdeb21df2 James Bottomley 2006-06-13 1013
0f13fc09db68de9 James Bottomley 2006-06-29 1014 cmnd[0] = REQUEST_SENSE;
9cb78c16f5dadef Hannes Reinecke 2014-06-25 1015 cmnd[1] = (lun & 0x7) <<
5;
0f13fc09db68de9 James Bottomley 2006-06-29 1016 cmnd[2] = 0;
0f13fc09db68de9 James Bottomley 2006-06-29 1017 cmnd[3] = 0;
b80ca4f7ee36c26 FUJITA Tomonori 2008-01-13 1018 cmnd[4] = SCSI_SENSE_BUFFERSIZE;
0f13fc09db68de9 James Bottomley 2006-06-29 1019 cmnd[5] = 0;
^1da177e4c3f415 Linus Torvalds 2005-04-16 1020 /* Here's a quiet hack: the
^1da177e4c3f415 Linus Torvalds 2005-04-16 1021 * REQUEST_SENSE command is six
bytes,
^1da177e4c3f415 Linus Torvalds 2005-04-16 1022 * so store a flag indicating
that
^1da177e4c3f415 Linus Torvalds 2005-04-16 1023 * this was an internal sense
request
^1da177e4c3f415 Linus Torvalds 2005-04-16 1024 * and the original status at the
end
^1da177e4c3f415 Linus Torvalds 2005-04-16 1025 * of the command */
0f13fc09db68de9 James Bottomley 2006-06-29 1026 cmnd[6] =
NCR_700_INTERNAL_SENSE_MAGIC;
0f13fc09db68de9 James Bottomley 2006-06-29 1027 cmnd[7] = hostdata->status[0];
c603d04ef6826a2 James Bottomley 2006-12-01 1028 cmnd[8] = SCp->cmd_len;
c603d04ef6826a2 James Bottomley 2006-12-01 1029 SCp->cmd_len = 6; /* command
length for
c603d04ef6826a2 James Bottomley 2006-12-01 1030 * REQUEST_SENSE */
0f13fc09db68de9 James Bottomley 2006-06-29 1031 slot->pCmd =
dma_map_single(hostdata->dev, cmnd, MAX_COMMAND_SIZE, DMA_TO_DEVICE);
b80ca4f7ee36c26 FUJITA Tomonori 2008-01-13 1032 slot->dma_handle =
dma_map_single(hostdata->dev, SCp->sense_buffer, SCSI_SENSE_BUFFERSIZE,
DMA_FROM_DEVICE);
b80ca4f7ee36c26 FUJITA Tomonori 2008-01-13 1033 slot->SG[0].ins =
bS_to_host(SCRIPT_MOVE_DATA_IN | SCSI_SENSE_BUFFERSIZE);
^1da177e4c3f415 Linus Torvalds 2005-04-16 1034 slot->SG[0].pAddr =
bS_to_host(slot->dma_handle);
^1da177e4c3f415 Linus Torvalds 2005-04-16 1035 slot->SG[1].ins =
bS_to_host(SCRIPT_RETURN);
^1da177e4c3f415 Linus Torvalds 2005-04-16 1036 slot->SG[1].pAddr = 0;
^1da177e4c3f415 Linus Torvalds 2005-04-16 1037 slot->resume_offset =
hostdata->pScript;
91af2dd255ac928 Christoph Hellwig 2020-08-18 1038 dma_sync_to_dev(hostdata,
slot->SG, sizeof(slot->SG[0])*2);
91af2dd255ac928 Christoph Hellwig 2020-08-18 1039 dma_sync_from_dev(hostdata,
SCp->sense_buffer, SCSI_SENSE_BUFFERSIZE);
^1da177e4c3f415 Linus Torvalds 2005-04-16 1040
^1da177e4c3f415 Linus Torvalds 2005-04-16 1041 /* queue the command for reissue
*/
^1da177e4c3f415 Linus Torvalds 2005-04-16 1042 slot->state =
NCR_700_SLOT_QUEUED;
67d59dfdeb21df2 James Bottomley 2006-06-13 1043 slot->flags =
NCR_700_FLAG_AUTOSENSE;
^1da177e4c3f415 Linus Torvalds 2005-04-16 1044 hostdata->state =
NCR_700_HOST_FREE;
^1da177e4c3f415 Linus Torvalds 2005-04-16 1045 hostdata->cmd = NULL;
^1da177e4c3f415 Linus Torvalds 2005-04-16 1046 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 1047 } else {
^1da177e4c3f415 Linus Torvalds 2005-04-16 1048 // Currently rely on the mid layer
evaluation
^1da177e4c3f415 Linus Torvalds 2005-04-16 1049 // of the tag queuing capability
^1da177e4c3f415 Linus Torvalds 2005-04-16 1050 //
^1da177e4c3f415 Linus Torvalds 2005-04-16 1051
//if(status_byte(hostdata->status[0]) == GOOD &&
^1da177e4c3f415 Linus Torvalds 2005-04-16 1052 // SCp->cmnd[0] == INQUIRY
&& SCp->use_sg == 0) {
^1da177e4c3f415 Linus Torvalds 2005-04-16 1053 // /* Piggy back the tag queueing
support
^1da177e4c3f415 Linus Torvalds 2005-04-16 1054 // * on this command */
^1da177e4c3f415 Linus Torvalds 2005-04-16 1055
// dma_sync_single_for_cpu(hostdata->dev,
^1da177e4c3f415 Linus Torvalds 2005-04-16 1056 // slot->dma_handle,
^1da177e4c3f415 Linus Torvalds 2005-04-16 1057 // SCp->request_bufflen,
^1da177e4c3f415 Linus Torvalds 2005-04-16 1058 // DMA_FROM_DEVICE);
^1da177e4c3f415 Linus Torvalds 2005-04-16 1059 // if(((char
*)SCp->request_buffer)[7] & 0x02) {
017560fca496f72 Jeff Garzik 2005-10-24 1060 // scmd_printk(KERN_INFO, SCp,
017560fca496f72 Jeff Garzik 2005-10-24 1061 // "Enabling Tag Command
Queuing\n");
017560fca496f72 Jeff Garzik 2005-10-24 1062 // hostdata->tag_negotiated |=
(1<<scmd_id(SCp));
^1da177e4c3f415 Linus Torvalds 2005-04-16 1063
// NCR_700_set_flag(SCp->device, NCR_700_DEV_BEGIN_TAG_QUEUEING);
^1da177e4c3f415 Linus Torvalds 2005-04-16 1064 // } else {
^1da177e4c3f415 Linus Torvalds 2005-04-16 1065
// NCR_700_clear_flag(SCp->device, NCR_700_DEV_BEGIN_TAG_QUEUEING);
017560fca496f72 Jeff Garzik 2005-10-24 1066 // hostdata->tag_negotiated
&= ~(1<<scmd_id(SCp));
^1da177e4c3f415 Linus Torvalds 2005-04-16 1067 // }
^1da177e4c3f415 Linus Torvalds 2005-04-16 1068 //}
^1da177e4c3f415 Linus Torvalds 2005-04-16 1069 NCR_700_scsi_done(hostdata, SCp,
hostdata->status[0]);
^1da177e4c3f415 Linus Torvalds 2005-04-16 1070 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 1071 } else if((dsps & 0xfffff0f0) ==
A_UNEXPECTED_PHASE) {
^1da177e4c3f415 Linus Torvalds 2005-04-16 1072 __u8 i = (dsps & 0xf00) >>
8;
^1da177e4c3f415 Linus Torvalds 2005-04-16 1073
017560fca496f72 Jeff Garzik 2005-10-24 1074 scmd_printk(KERN_ERR, SCp,
"UNEXPECTED PHASE %s (%s)\n",
^1da177e4c3f415 Linus Torvalds 2005-04-16 1075 NCR_700_phase[i],
^1da177e4c3f415 Linus Torvalds 2005-04-16 1076
sbcl_to_string(NCR_700_readb(host, SBCL_REG)));
017560fca496f72 Jeff Garzik 2005-10-24 1077 scmd_printk(KERN_ERR, SCp, "
len = %d, cmd =",
017560fca496f72 Jeff Garzik 2005-10-24 1078 SCp->cmd_len);
^1da177e4c3f415 Linus Torvalds 2005-04-16 1079 scsi_print_command(SCp);
^1da177e4c3f415 Linus Torvalds 2005-04-16 1080
^1da177e4c3f415 Linus Torvalds 2005-04-16 1081 NCR_700_internal_bus_reset(host);
^1da177e4c3f415 Linus Torvalds 2005-04-16 1082 } else if((dsps & 0xfffff000) ==
A_FATAL) {
^1da177e4c3f415 Linus Torvalds 2005-04-16 1083 int i = (dsps & 0xfff);
^1da177e4c3f415 Linus Torvalds 2005-04-16 1084
^1da177e4c3f415 Linus Torvalds 2005-04-16 1085 printk(KERN_ERR "scsi%d:
(%d:%d) FATAL ERROR: %s\n",
^1da177e4c3f415 Linus Torvalds 2005-04-16 1086 host->host_no, pun, lun,
NCR_700_fatal_messages[i]);
^1da177e4c3f415 Linus Torvalds 2005-04-16 1087 if(dsps ==
A_FATAL_ILLEGAL_MSG_LENGTH) {
^1da177e4c3f415 Linus Torvalds 2005-04-16 1088 printk(KERN_ERR " msg
begins %02x %02x\n",
^1da177e4c3f415 Linus Torvalds 2005-04-16 1089 hostdata->msgin[0],
hostdata->msgin[1]);
^1da177e4c3f415 Linus Torvalds 2005-04-16 1090 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 1091 NCR_700_internal_bus_reset(host);
^1da177e4c3f415 Linus Torvalds 2005-04-16 1092 } else if((dsps & 0xfffff0f0) ==
A_DISCONNECT) {
^1da177e4c3f415 Linus Torvalds 2005-04-16 1093 #ifdef NCR_700_DEBUG
^1da177e4c3f415 Linus Torvalds 2005-04-16 1094 __u8 i = (dsps & 0xf00) >>
8;
^1da177e4c3f415 Linus Torvalds 2005-04-16 1095
^1da177e4c3f415 Linus Torvalds 2005-04-16 1096 printk("scsi%d: (%d:%d),
DISCONNECTED (%d) %s\n",
^1da177e4c3f415 Linus Torvalds 2005-04-16 1097 host->host_no, pun, lun,
^1da177e4c3f415 Linus Torvalds 2005-04-16 1098 i, NCR_700_phase[i]);
^1da177e4c3f415 Linus Torvalds 2005-04-16 1099 #endif
^1da177e4c3f415 Linus Torvalds 2005-04-16 1100 save_for_reselection(hostdata, SCp,
dsp);
^1da177e4c3f415 Linus Torvalds 2005-04-16 1101
^1da177e4c3f415 Linus Torvalds 2005-04-16 1102 } else if(dsps ==
A_RESELECTION_IDENTIFIED) {
^1da177e4c3f415 Linus Torvalds 2005-04-16 1103 __u8 lun;
^1da177e4c3f415 Linus Torvalds 2005-04-16 1104 struct NCR_700_command_slot *slot;
^1da177e4c3f415 Linus Torvalds 2005-04-16 1105 __u8 reselection_id =
hostdata->reselection_id;
^1da177e4c3f415 Linus Torvalds 2005-04-16 1106 struct scsi_device *SDp;
^1da177e4c3f415 Linus Torvalds 2005-04-16 1107
^1da177e4c3f415 Linus Torvalds 2005-04-16 1108 lun = hostdata->msgin[0] &
0x1f;
^1da177e4c3f415 Linus Torvalds 2005-04-16 1109
^1da177e4c3f415 Linus Torvalds 2005-04-16 1110 hostdata->reselection_id = 0xff;
^1da177e4c3f415 Linus Torvalds 2005-04-16 1111 DEBUG(("scsi%d: (%d:%d)
RESELECTED!\n",
^1da177e4c3f415 Linus Torvalds 2005-04-16 1112 host->host_no,
reselection_id, lun));
^1da177e4c3f415 Linus Torvalds 2005-04-16 1113 /* clear the reselection indicator
*/
^1da177e4c3f415 Linus Torvalds 2005-04-16 1114 SDp = __scsi_device_lookup(host, 0,
reselection_id, lun);
^1da177e4c3f415 Linus Torvalds 2005-04-16 1115 if(unlikely(SDp == NULL)) {
^1da177e4c3f415 Linus Torvalds 2005-04-16 1116 printk(KERN_ERR "scsi%d:
(%d:%d) HAS NO device\n",
^1da177e4c3f415 Linus Torvalds 2005-04-16 1117 host->host_no,
reselection_id, lun);
^1da177e4c3f415 Linus Torvalds 2005-04-16 1118 BUG();
^1da177e4c3f415 Linus Torvalds 2005-04-16 1119 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 1120 if(hostdata->msgin[1] ==
A_SIMPLE_TAG_MSG) {
64d513ac31bd02a Christoph Hellwig 2015-10-08 1121 struct scsi_cmnd *SCp;
64d513ac31bd02a Christoph Hellwig 2015-10-08 1122
64d513ac31bd02a Christoph Hellwig 2015-10-08 1123 SCp =
scsi_host_find_tag(SDp->host, hostdata->msgin[2]);
^1da177e4c3f415 Linus Torvalds 2005-04-16 1124 if(unlikely(SCp == NULL)) {
^1da177e4c3f415 Linus Torvalds 2005-04-16 1125 printk(KERN_ERR "scsi%d:
(%d:%d) no saved request for tag %d\n",
^1da177e4c3f415 Linus Torvalds 2005-04-16 1126 host->host_no,
reselection_id, lun, hostdata->msgin[2]);
^1da177e4c3f415 Linus Torvalds 2005-04-16 1127 BUG();
^1da177e4c3f415 Linus Torvalds 2005-04-16 1128 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 1129
^1da177e4c3f415 Linus Torvalds 2005-04-16 1130 slot = (struct NCR_700_command_slot
*)SCp->host_scribble;
017560fca496f72 Jeff Garzik 2005-10-24 1131 DDEBUG(KERN_DEBUG, SDp,
017560fca496f72 Jeff Garzik 2005-10-24 1132 "reselection is tag %d, slot
%p(%d)\n",
017560fca496f72 Jeff Garzik 2005-10-24 1133 hostdata->msgin[2], slot,
slot->tag);
^1da177e4c3f415 Linus Torvalds 2005-04-16 1134 } else {
68350a886e7df02 Christoph Hellwig 2016-07-11 1135 struct NCR_700_Device_Parameters *p
= SDp->hostdata;
68350a886e7df02 Christoph Hellwig 2016-07-11 1136 struct scsi_cmnd *SCp =
p->current_cmnd;
64d513ac31bd02a Christoph Hellwig 2015-10-08 1137
^1da177e4c3f415 Linus Torvalds 2005-04-16 1138 if(unlikely(SCp == NULL)) {
017560fca496f72 Jeff Garzik 2005-10-24 1139 sdev_printk(KERN_ERR, SDp,
017560fca496f72 Jeff Garzik 2005-10-24 1140 "no saved request for
untagged cmd\n");
^1da177e4c3f415 Linus Torvalds 2005-04-16 1141 BUG();
^1da177e4c3f415 Linus Torvalds 2005-04-16 1142 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 1143 slot = (struct NCR_700_command_slot
*)SCp->host_scribble;
^1da177e4c3f415 Linus Torvalds 2005-04-16 1144 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 1145
^1da177e4c3f415 Linus Torvalds 2005-04-16 1146 if(slot == NULL) {
^1da177e4c3f415 Linus Torvalds 2005-04-16 1147 printk(KERN_ERR "scsi%d:
(%d:%d) RESELECTED but no saved command (MSG = %02x %02x %02x)!!\n",
^1da177e4c3f415 Linus Torvalds 2005-04-16 1148 host->host_no,
reselection_id, lun,
^1da177e4c3f415 Linus Torvalds 2005-04-16 1149 hostdata->msgin[0],
hostdata->msgin[1],
^1da177e4c3f415 Linus Torvalds 2005-04-16 1150 hostdata->msgin[2]);
^1da177e4c3f415 Linus Torvalds 2005-04-16 1151 } else {
^1da177e4c3f415 Linus Torvalds 2005-04-16 1152 if(hostdata->state !=
NCR_700_HOST_BUSY)
^1da177e4c3f415 Linus Torvalds 2005-04-16 1153 printk(KERN_ERR "scsi%d:
FATAL, host not busy during valid reselection!\n",
^1da177e4c3f415 Linus Torvalds 2005-04-16 1154 host->host_no);
^1da177e4c3f415 Linus Torvalds 2005-04-16 1155 resume_offset =
slot->resume_offset;
^1da177e4c3f415 Linus Torvalds 2005-04-16 1156 hostdata->cmd = slot->cmnd;
^1da177e4c3f415 Linus Torvalds 2005-04-16 1157
^1da177e4c3f415 Linus Torvalds 2005-04-16 1158 /* re-patch for this command */
91af2dd255ac928 Christoph Hellwig 2020-08-18 1159 script_patch_32_abs(hostdata,
hostdata->script,
d3fa72e4556ec1f Ralf Baechle 2006-12-06 1160 CommandAddress,
slot->pCmd);
91af2dd255ac928 Christoph Hellwig 2020-08-18 1161 script_patch_16(hostdata,
hostdata->script,
^1da177e4c3f415 Linus Torvalds 2005-04-16 1162 CommandCount,
slot->cmnd->cmd_len);
91af2dd255ac928 Christoph Hellwig 2020-08-18 1163 script_patch_32_abs(hostdata,
hostdata->script,
d3fa72e4556ec1f Ralf Baechle 2006-12-06 1164
SGScriptStartAddress,
^1da177e4c3f415 Linus Torvalds 2005-04-16 1165
to32bit(&slot->pSG[0].ins));
^1da177e4c3f415 Linus Torvalds 2005-04-16 1166
^1da177e4c3f415 Linus Torvalds 2005-04-16 1167 /* Note: setting SXFER only works
if we're
^1da177e4c3f415 Linus Torvalds 2005-04-16 1168 * still in the MESSAGE phase, so
it is vital
^1da177e4c3f415 Linus Torvalds 2005-04-16 1169 * that ACK is still asserted when
we process
^1da177e4c3f415 Linus Torvalds 2005-04-16 1170 * the reselection message. The
resume offset
^1da177e4c3f415 Linus Torvalds 2005-04-16 1171 * should therefore always clear
ACK */
^1da177e4c3f415 Linus Torvalds 2005-04-16 1172
NCR_700_writeb(NCR_700_get_SXFER(hostdata->cmd->device),
^1da177e4c3f415 Linus Torvalds 2005-04-16 1173 host, SXFER_REG);
91af2dd255ac928 Christoph Hellwig 2020-08-18 1174 dma_sync_from_dev(hostdata,
hostdata->msgin,
91af2dd255ac928 Christoph Hellwig 2020-08-18 1175 MSG_ARRAY_SIZE);
91af2dd255ac928 Christoph Hellwig 2020-08-18 1176 dma_sync_to_dev(hostdata,
hostdata->msgout,
91af2dd255ac928 Christoph Hellwig 2020-08-18 1177 MSG_ARRAY_SIZE);
^1da177e4c3f415 Linus Torvalds 2005-04-16 1178 /* I'm just being paranoid
here, the command should
^1da177e4c3f415 Linus Torvalds 2005-04-16 1179 * already have been flushed from
the cache */
91af2dd255ac928 Christoph Hellwig 2020-08-18 1180 dma_sync_to_dev(hostdata,
slot->cmnd->cmnd,
91af2dd255ac928 Christoph Hellwig 2020-08-18 1181
slot->cmnd->cmd_len);
^1da177e4c3f415 Linus Torvalds 2005-04-16 1182
^1da177e4c3f415 Linus Torvalds 2005-04-16 1183
^1da177e4c3f415 Linus Torvalds 2005-04-16 1184
^1da177e4c3f415 Linus Torvalds 2005-04-16 1185 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 1186 } else if(dsps ==
A_RESELECTED_DURING_SELECTION) {
^1da177e4c3f415 Linus Torvalds 2005-04-16 1187
^1da177e4c3f415 Linus Torvalds 2005-04-16 1188 /* This section is full of debugging
code because I've
^1da177e4c3f415 Linus Torvalds 2005-04-16 1189 * never managed to reach it. I
think what happens is
^1da177e4c3f415 Linus Torvalds 2005-04-16 1190 * that, because the 700 runs with
selection
^1da177e4c3f415 Linus Torvalds 2005-04-16 1191 * interrupts enabled the whole time
that we take a
^1da177e4c3f415 Linus Torvalds 2005-04-16 1192 * selection interrupt before we
manage to get to the
^1da177e4c3f415 Linus Torvalds 2005-04-16 1193 * reselected script interrupt */
^1da177e4c3f415 Linus Torvalds 2005-04-16 1194
^1da177e4c3f415 Linus Torvalds 2005-04-16 1195 __u8 reselection_id =
NCR_700_readb(host, SFBR_REG);
^1da177e4c3f415 Linus Torvalds 2005-04-16 1196 struct NCR_700_command_slot *slot;
^1da177e4c3f415 Linus Torvalds 2005-04-16 1197
^1da177e4c3f415 Linus Torvalds 2005-04-16 1198 /* Take out our own ID */
^1da177e4c3f415 Linus Torvalds 2005-04-16 1199 reselection_id &=
~(1<<host->this_id);
^1da177e4c3f415 Linus Torvalds 2005-04-16 1200
^1da177e4c3f415 Linus Torvalds 2005-04-16 1201 /* I've never seen this happen,
so keep this as a printk rather
^1da177e4c3f415 Linus Torvalds 2005-04-16 1202 * than a debug */
^1da177e4c3f415 Linus Torvalds 2005-04-16 1203 printk(KERN_INFO "scsi%d:
(%d:%d) RESELECTION DURING SELECTION, dsp=%08x[%04x] state=%d, count=%d\n",
^1da177e4c3f415 Linus Torvalds 2005-04-16 1204 host->host_no,
reselection_id, lun, dsp, dsp - hostdata->pScript, hostdata->state,
hostdata->command_slot_count);
^1da177e4c3f415 Linus Torvalds 2005-04-16 1205
^1da177e4c3f415 Linus Torvalds 2005-04-16 1206 {
^1da177e4c3f415 Linus Torvalds 2005-04-16 1207 /* FIXME: DEBUGGING CODE */
^1da177e4c3f415 Linus Torvalds 2005-04-16 1208 __u32 SG =
(__u32)bS_to_cpu(hostdata->script[A_SGScriptStartAddress_used[0]]);
^1da177e4c3f415 Linus Torvalds 2005-04-16 1209 int i;
^1da177e4c3f415 Linus Torvalds 2005-04-16 1210
^1da177e4c3f415 Linus Torvalds 2005-04-16 1211 for(i=0; i<
NCR_700_COMMAND_SLOTS_PER_HOST; i++) {
^1da177e4c3f415 Linus Torvalds 2005-04-16 1212 if(SG >=
to32bit(&hostdata->slots[i].pSG[0])
^1da177e4c3f415 Linus Torvalds 2005-04-16 1213 && SG <=
to32bit(&hostdata->slots[i].pSG[NCR_700_SG_SEGMENTS]))
^1da177e4c3f415 Linus Torvalds 2005-04-16 1214 break;
^1da177e4c3f415 Linus Torvalds 2005-04-16 1215 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 1216 printk(KERN_INFO "IDENTIFIED
SG segment as being %08x in slot %p, cmd %p, slot->resume_offset=%08x\n", SG,
&hostdata->slots[i], hostdata->slots[i].cmnd,
hostdata->slots[i].resume_offset);
^1da177e4c3f415 Linus Torvalds 2005-04-16 1217 SCp = hostdata->slots[i].cmnd;
^1da177e4c3f415 Linus Torvalds 2005-04-16 1218 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 1219
^1da177e4c3f415 Linus Torvalds 2005-04-16 1220 if(SCp != NULL) {
^1da177e4c3f415 Linus Torvalds 2005-04-16 1221 slot = (struct NCR_700_command_slot
*)SCp->host_scribble;
^1da177e4c3f415 Linus Torvalds 2005-04-16 1222 /* change slot from busy to queued
to redo command */
^1da177e4c3f415 Linus Torvalds 2005-04-16 1223 slot->state =
NCR_700_SLOT_QUEUED;
^1da177e4c3f415 Linus Torvalds 2005-04-16 1224 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 1225 hostdata->cmd = NULL;
^1da177e4c3f415 Linus Torvalds 2005-04-16 1226
^1da177e4c3f415 Linus Torvalds 2005-04-16 1227 if(reselection_id == 0) {
^1da177e4c3f415 Linus Torvalds 2005-04-16 1228 if(hostdata->reselection_id ==
0xff) {
^1da177e4c3f415 Linus Torvalds 2005-04-16 1229 printk(KERN_ERR "scsi%d:
Invalid reselection during selection!!\n", host->host_no);
^1da177e4c3f415 Linus Torvalds 2005-04-16 1230 return 0;
^1da177e4c3f415 Linus Torvalds 2005-04-16 1231 } else {
^1da177e4c3f415 Linus Torvalds 2005-04-16 1232 printk(KERN_ERR "scsi%d:
script reselected and we took a selection interrupt\n",
^1da177e4c3f415 Linus Torvalds 2005-04-16 1233 host->host_no);
^1da177e4c3f415 Linus Torvalds 2005-04-16 1234 reselection_id =
hostdata->reselection_id;
^1da177e4c3f415 Linus Torvalds 2005-04-16 1235 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 1236 } else {
^1da177e4c3f415 Linus Torvalds 2005-04-16 1237
^1da177e4c3f415 Linus Torvalds 2005-04-16 1238 /* convert to real ID */
^1da177e4c3f415 Linus Torvalds 2005-04-16 1239 reselection_id =
bitmap_to_number(reselection_id);
^1da177e4c3f415 Linus Torvalds 2005-04-16 1240 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 1241 hostdata->reselection_id =
reselection_id;
^1da177e4c3f415 Linus Torvalds 2005-04-16 1242 /* just in case we have a stale
simple tag message, clear it */
^1da177e4c3f415 Linus Torvalds 2005-04-16 1243 hostdata->msgin[1] = 0;
91af2dd255ac928 Christoph Hellwig 2020-08-18 1244 dma_sync_to_dev(hostdata,
hostdata->msgin, MSG_ARRAY_SIZE);
^1da177e4c3f415 Linus Torvalds 2005-04-16 1245 if(hostdata->tag_negotiated &
(1<<reselection_id)) {
^1da177e4c3f415 Linus Torvalds 2005-04-16 1246 resume_offset =
hostdata->pScript + Ent_GetReselectionWithTag;
^1da177e4c3f415 Linus Torvalds 2005-04-16 1247 } else {
^1da177e4c3f415 Linus Torvalds 2005-04-16 1248 resume_offset =
hostdata->pScript + Ent_GetReselectionData;
^1da177e4c3f415 Linus Torvalds 2005-04-16 1249 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 1250 } else if(dsps ==
A_COMPLETED_SELECTION_AS_TARGET) {
^1da177e4c3f415 Linus Torvalds 2005-04-16 1251 /* we've just disconnected from
the bus, do nothing since
^1da177e4c3f415 Linus Torvalds 2005-04-16 1252 * a return here will re-run the
queued command slot
^1da177e4c3f415 Linus Torvalds 2005-04-16 1253 * that may have been interrupted by
the initial selection */
^1da177e4c3f415 Linus Torvalds 2005-04-16 1254 DEBUG((" SELECTION
COMPLETED\n"));
^1da177e4c3f415 Linus Torvalds 2005-04-16 1255 } else if((dsps & 0xfffff0f0) ==
A_MSG_IN) {
^1da177e4c3f415 Linus Torvalds 2005-04-16 1256 resume_offset =
process_message(host, hostdata, SCp,
^1da177e4c3f415 Linus Torvalds 2005-04-16 1257 dsp, dsps);
^1da177e4c3f415 Linus Torvalds 2005-04-16 1258 } else if((dsps & 0xfffff000) ==
0) {
^1da177e4c3f415 Linus Torvalds 2005-04-16 1259 __u8 i = (dsps & 0xf0) >>
4, j = (dsps & 0xf00) >> 8;
^1da177e4c3f415 Linus Torvalds 2005-04-16 1260 printk(KERN_ERR "scsi%d:
(%d:%d), unhandled script condition %s %s at %04x\n",
^1da177e4c3f415 Linus Torvalds 2005-04-16 1261 host->host_no, pun, lun,
NCR_700_condition[i],
^1da177e4c3f415 Linus Torvalds 2005-04-16 1262 NCR_700_phase[j], dsp -
hostdata->pScript);
^1da177e4c3f415 Linus Torvalds 2005-04-16 1263 if(SCp != NULL) {
3258a4d5690880a FUJITA Tomonori 2007-05-14 1264 struct scatterlist *sg;
^1da177e4c3f415 Linus Torvalds 2005-04-16 1265
3258a4d5690880a FUJITA Tomonori 2007-05-14 1266 scsi_print_command(SCp);
3258a4d5690880a FUJITA Tomonori 2007-05-14 1267 scsi_for_each_sg(SCp, sg,
scsi_sg_count(SCp) + 1, i) {
3258a4d5690880a FUJITA Tomonori 2007-05-14 1268 printk(KERN_INFO "
SG[%d].length = %d, move_insn=%08x, addr %08x\n", i, sg->length, ((struct
NCR_700_command_slot *)SCp->host_scribble)->SG[i].ins, ((struct NCR_700_command_slot
*)SCp->host_scribble)->SG[i].pAddr);
^1da177e4c3f415 Linus Torvalds 2005-04-16 1269 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 1270 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 1271 NCR_700_internal_bus_reset(host);
^1da177e4c3f415 Linus Torvalds 2005-04-16 1272 } else if((dsps & 0xfffff000) ==
A_DEBUG_INTERRUPT) {
^1da177e4c3f415 Linus Torvalds 2005-04-16 1273 printk(KERN_NOTICE "scsi%d
(%d:%d) DEBUG INTERRUPT %d AT %08x[%04x], continuing\n",
^1da177e4c3f415 Linus Torvalds 2005-04-16 1274 host->host_no, pun, lun,
dsps & 0xfff, dsp, dsp - hostdata->pScript);
^1da177e4c3f415 Linus Torvalds 2005-04-16 1275 resume_offset = dsp;
^1da177e4c3f415 Linus Torvalds 2005-04-16 1276 } else {
^1da177e4c3f415 Linus Torvalds 2005-04-16 1277 printk(KERN_ERR "scsi%d:
(%d:%d), unidentified script interrupt 0x%x at %04x\n",
^1da177e4c3f415 Linus Torvalds 2005-04-16 1278 host->host_no, pun, lun,
dsps, dsp - hostdata->pScript);
^1da177e4c3f415 Linus Torvalds 2005-04-16 1279 NCR_700_internal_bus_reset(host);
^1da177e4c3f415 Linus Torvalds 2005-04-16 1280 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 1281 return resume_offset;
^1da177e4c3f415 Linus Torvalds 2005-04-16 1282 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 1283
:::::: The code at line 984 was first introduced by commit
:::::: 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 Linux-2.6.12-rc2
:::::: TO: Linus Torvalds <torvalds(a)ppc970.osdl.org>
:::::: CC: Linus Torvalds <torvalds(a)ppc970.osdl.org>
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org