0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014 static const char unknown[] = "UNKNOWN";
0015
0016 static const char * group_0_commands[] = {
0017 "Test Unit Ready", "Rezero Unit", unknown, "Request Sense",
0018 "Format Unit", "Read Block Limits", unknown, "Reassign Blocks",
0019 "Read (6)", unknown, "Write (6)", "Seek (6)", unknown, unknown,
0020 unknown, "Read Reverse", "Write Filemarks", "Space", "Inquiry",
0021 unknown, "Recover Buffered Data", "Mode Select", "Reserve",
0022 "Release", "Copy", "Erase", "Mode Sense", "Start/Stop Unit",
0023 "Receive Diagnostic", "Send Diagnostic",
0024 "Prevent/Allow Medium Removal", unknown,
0025 };
0026
0027
0028 static const char *group_1_commands[] = {
0029 unknown, unknown, unknown,
0030 unknown, unknown, "Read Capacity", unknown, unknown, "Read (10)",
0031 unknown, "Write (10)", "Seek (10)", unknown, unknown,
0032 "Write Verify","Verify", "Search High", "Search Equal",
0033 "Search Low", "Set Limits", "Prefetch or Read Position",
0034 "Synchronize Cache","Lock/Unlock Cache", "Read Defect Data",
0035 "Medium Scan", "Compare","Copy Verify", "Write Buffer", "Read Buffer",
0036 "Update Block", "Read Long", "Write Long",
0037 };
0038
0039
0040 static const char *group_2_commands[] = {
0041 "Change Definition", "Write Same",
0042 "Read Sub-Ch(cd)", "Read TOC", "Read Header(cd)", "Play Audio(cd)", unknown, "Play Audio MSF(cd)", "Play Audio Track/Index(cd)",
0043 "Play Track Relative(10)(cd)", unknown, "Pause/Resume(cd)", "Log Select", "Log Sense", unknown, unknown,
0044 unknown, unknown, unknown, unknown, unknown, "Mode Select (10)",
0045 unknown, unknown, unknown, unknown, "Mode Sense (10)", unknown,
0046 unknown, unknown, unknown,
0047 };
0048
0049 #define group(opcode) (((opcode) >> 5) & 7)
0050
0051 #define RESERVED_GROUP 0
0052 #define VENDOR_GROUP 1
0053 #define NOTEXT_GROUP 2
0054
0055 static const char **commands[] = {
0056 group_0_commands, group_1_commands, group_2_commands,
0057 (const char **) RESERVED_GROUP, (const char **) RESERVED_GROUP,
0058 (const char **) NOTEXT_GROUP, (const char **) VENDOR_GROUP,
0059 (const char **) VENDOR_GROUP
0060 };
0061
0062 static const char reserved[] = "RESERVED";
0063 static const char vendor[] = "VENDOR SPECIFIC";
0064
0065 static void print_opcodek(unsigned char opcode)
0066 {
0067 const char **table = commands[ group(opcode) ];
0068
0069 switch ((unsigned long) table) {
0070 case RESERVED_GROUP:
0071 printk("%s[%02x] ", reserved, opcode);
0072 break;
0073 case NOTEXT_GROUP:
0074 printk("%s(notext)[%02x] ", unknown, opcode);
0075 break;
0076 case VENDOR_GROUP:
0077 printk("%s[%02x] ", vendor, opcode);
0078 break;
0079 default:
0080 if (table[opcode & 0x1f] != unknown)
0081 printk("%s[%02x] ", table[opcode & 0x1f], opcode);
0082 else
0083 printk("%s[%02x] ", unknown, opcode);
0084 break;
0085 }
0086 }
0087
0088 static void print_commandk (unsigned char *command)
0089 {
0090 int i, s;
0091 printk(KERN_DEBUG);
0092 print_opcodek(command[0]);
0093
0094 if ((command[0] >> 5) == 6 ||
0095 (command[0] >> 5) == 7 ) {
0096 s = 12;
0097 } else {
0098 s = COMMAND_SIZE(command[0]);
0099 }
0100 for ( i = 1; i < s; ++i) {
0101 printk("%02x ", command[i]);
0102 }
0103
0104 switch (s) {
0105 case 6:
0106 printk("LBA=%d len=%d",
0107 (((unsigned int)command[1] & 0x0f) << 16) |
0108 ( (unsigned int)command[2] << 8) |
0109 ( (unsigned int)command[3] ),
0110 (unsigned int)command[4]
0111 );
0112 break;
0113 case 10:
0114 printk("LBA=%d len=%d",
0115 ((unsigned int)command[2] << 24) |
0116 ((unsigned int)command[3] << 16) |
0117 ((unsigned int)command[4] << 8) |
0118 ((unsigned int)command[5] ),
0119 ((unsigned int)command[7] << 8) |
0120 ((unsigned int)command[8] )
0121 );
0122 break;
0123 case 12:
0124 printk("LBA=%d len=%d",
0125 ((unsigned int)command[2] << 24) |
0126 ((unsigned int)command[3] << 16) |
0127 ((unsigned int)command[4] << 8) |
0128 ((unsigned int)command[5] ),
0129 ((unsigned int)command[6] << 24) |
0130 ((unsigned int)command[7] << 16) |
0131 ((unsigned int)command[8] << 8) |
0132 ((unsigned int)command[9] )
0133 );
0134 break;
0135 default:
0136 break;
0137 }
0138 printk("\n");
0139 }
0140
0141 static void show_command(struct scsi_cmnd *SCpnt)
0142 {
0143 print_commandk(SCpnt->cmnd);
0144 }
0145
0146 static void show_phase(struct scsi_cmnd *SCpnt)
0147 {
0148 int i = nsp_scsi_pointer(SCpnt)->phase;
0149
0150 char *ph[] = {
0151 "PH_UNDETERMINED",
0152 "PH_ARBSTART",
0153 "PH_SELSTART",
0154 "PH_SELECTED",
0155 "PH_COMMAND",
0156 "PH_DATA",
0157 "PH_STATUS",
0158 "PH_MSG_IN",
0159 "PH_MSG_OUT",
0160 "PH_DISCONNECT",
0161 "PH_RESELECT"
0162 };
0163
0164 if ( i < PH_UNDETERMINED || i > PH_RESELECT ) {
0165 printk(KERN_DEBUG "scsi phase: unknown(%d)\n", i);
0166 return;
0167 }
0168
0169 printk(KERN_DEBUG "scsi phase: %s\n", ph[i]);
0170
0171 return;
0172 }
0173
0174 static void show_busphase(unsigned char stat)
0175 {
0176 switch(stat) {
0177 case BUSPHASE_COMMAND:
0178 printk(KERN_DEBUG "BUSPHASE_COMMAND\n");
0179 break;
0180 case BUSPHASE_MESSAGE_IN:
0181 printk(KERN_DEBUG "BUSPHASE_MESSAGE_IN\n");
0182 break;
0183 case BUSPHASE_MESSAGE_OUT:
0184 printk(KERN_DEBUG "BUSPHASE_MESSAGE_OUT\n");
0185 break;
0186 case BUSPHASE_DATA_IN:
0187 printk(KERN_DEBUG "BUSPHASE_DATA_IN\n");
0188 break;
0189 case BUSPHASE_DATA_OUT:
0190 printk(KERN_DEBUG "BUSPHASE_DATA_OUT\n");
0191 break;
0192 case BUSPHASE_STATUS:
0193 printk(KERN_DEBUG "BUSPHASE_STATUS\n");
0194 break;
0195 case BUSPHASE_SELECT:
0196 printk(KERN_DEBUG "BUSPHASE_SELECT\n");
0197 break;
0198 default:
0199 printk(KERN_DEBUG "BUSPHASE_other\n");
0200 break;
0201 }
0202 }
0203
0204 static void show_message(nsp_hw_data *data)
0205 {
0206 int i;
0207
0208 printk(KERN_DEBUG "msg:");
0209 for(i=0; i < data->MsgLen; i++) {
0210 printk(" %02x", data->MsgBuffer[i]);
0211 }
0212 printk("\n");
0213 }
0214
0215