1/*======================================================================== 2 Debug routines for nsp_cs 3 By: YOKOTA Hiroshi <yokota@netlab.is.tsukuba.ac.jp> 4 5 This software may be used and distributed according to the terms of 6 the GNU General Public License. 7=========================================================================*/ 8 9/* $Id: nsp_debug.c,v 1.3 2003/07/26 14:21:09 elca Exp $ */ 10 11/* 12 * Show the command data of a command 13 */ 14static const char unknown[] = "UNKNOWN"; 15 16static const char * group_0_commands[] = { 17/* 00-03 */ "Test Unit Ready", "Rezero Unit", unknown, "Request Sense", 18/* 04-07 */ "Format Unit", "Read Block Limits", unknown, "Reassign Blocks", 19/* 08-0d */ "Read (6)", unknown, "Write (6)", "Seek (6)", unknown, unknown, 20/* 0e-12 */ unknown, "Read Reverse", "Write Filemarks", "Space", "Inquiry", 21/* 13-16 */ unknown, "Recover Buffered Data", "Mode Select", "Reserve", 22/* 17-1b */ "Release", "Copy", "Erase", "Mode Sense", "Start/Stop Unit", 23/* 1c-1d */ "Receive Diagnostic", "Send Diagnostic", 24/* 1e-1f */ "Prevent/Allow Medium Removal", unknown, 25}; 26 27 28static const char *group_1_commands[] = { 29/* 20-22 */ unknown, unknown, unknown, 30/* 23-28 */ unknown, unknown, "Read Capacity", unknown, unknown, "Read (10)", 31/* 29-2d */ unknown, "Write (10)", "Seek (10)", unknown, unknown, 32/* 2e-31 */ "Write Verify","Verify", "Search High", "Search Equal", 33/* 32-34 */ "Search Low", "Set Limits", "Prefetch or Read Position", 34/* 35-37 */ "Synchronize Cache","Lock/Unlock Cache", "Read Defect Data", 35/* 38-3c */ "Medium Scan", "Compare","Copy Verify", "Write Buffer", "Read Buffer", 36/* 3d-3f */ "Update Block", "Read Long", "Write Long", 37}; 38 39 40static const char *group_2_commands[] = { 41/* 40-41 */ "Change Definition", "Write Same", 42/* 42-48 */ "Read Sub-Ch(cd)", "Read TOC", "Read Header(cd)", "Play Audio(cd)", unknown, "Play Audio MSF(cd)", "Play Audio Track/Index(cd)", 43/* 49-4f */ "Play Track Relative(10)(cd)", unknown, "Pause/Resume(cd)", "Log Select", "Log Sense", unknown, unknown, 44/* 50-55 */ unknown, unknown, unknown, unknown, unknown, "Mode Select (10)", 45/* 56-5b */ unknown, unknown, unknown, unknown, "Mode Sense (10)", unknown, 46/* 5c-5f */ unknown, unknown, unknown, 47}; 48 49#define group(opcode) (((opcode) >> 5) & 7) 50 51#define RESERVED_GROUP 0 52#define VENDOR_GROUP 1 53#define NOTEXT_GROUP 2 54 55static const char **commands[] = { 56 group_0_commands, group_1_commands, group_2_commands, 57 (const char **) RESERVED_GROUP, (const char **) RESERVED_GROUP, 58 (const char **) NOTEXT_GROUP, (const char **) VENDOR_GROUP, 59 (const char **) VENDOR_GROUP 60}; 61 62static const char reserved[] = "RESERVED"; 63static const char vendor[] = "VENDOR SPECIFIC"; 64 65static void print_opcodek(unsigned char opcode) 66{ 67 const char **table = commands[ group(opcode) ]; 68 69 switch ((unsigned long) table) { 70 case RESERVED_GROUP: 71 printk("%s[%02x] ", reserved, opcode); 72 break; 73 case NOTEXT_GROUP: 74 printk("%s(notext)[%02x] ", unknown, opcode); 75 break; 76 case VENDOR_GROUP: 77 printk("%s[%02x] ", vendor, opcode); 78 break; 79 default: 80 if (table[opcode & 0x1f] != unknown) 81 printk("%s[%02x] ", table[opcode & 0x1f], opcode); 82 else 83 printk("%s[%02x] ", unknown, opcode); 84 break; 85 } 86} 87 88static void print_commandk (unsigned char *command) 89{ 90 int i, s; 91 printk(KERN_DEBUG); 92 print_opcodek(command[0]); 93 /*printk(KERN_DEBUG "%s ", __func__);*/ 94 if ((command[0] >> 5) == 6 || 95 (command[0] >> 5) == 7 ) { 96 s = 12; /* vender specific */ 97 } else { 98 s = COMMAND_SIZE(command[0]); 99 } 100 for ( i = 1; i < s; ++i) { 101 printk("%02x ", command[i]); 102 } 103 104 switch (s) { 105 case 6: 106 printk("LBA=%d len=%d", 107 (((unsigned int)command[1] & 0x0f) << 16) | 108 ( (unsigned int)command[2] << 8) | 109 ( (unsigned int)command[3] ), 110 (unsigned int)command[4] 111 ); 112 break; 113 case 10: 114 printk("LBA=%d len=%d", 115 ((unsigned int)command[2] << 24) | 116 ((unsigned int)command[3] << 16) | 117 ((unsigned int)command[4] << 8) | 118 ((unsigned int)command[5] ), 119 ((unsigned int)command[7] << 8) | 120 ((unsigned int)command[8] ) 121 ); 122 break; 123 case 12: 124 printk("LBA=%d len=%d", 125 ((unsigned int)command[2] << 24) | 126 ((unsigned int)command[3] << 16) | 127 ((unsigned int)command[4] << 8) | 128 ((unsigned int)command[5] ), 129 ((unsigned int)command[6] << 24) | 130 ((unsigned int)command[7] << 16) | 131 ((unsigned int)command[8] << 8) | 132 ((unsigned int)command[9] ) 133 ); 134 break; 135 default: 136 break; 137 } 138 printk("\n"); 139} 140 141static void show_command(struct scsi_cmnd *SCpnt) 142{ 143 print_commandk(SCpnt->cmnd); 144} 145 146static void show_phase(struct scsi_cmnd *SCpnt) 147{ 148 int i = SCpnt->SCp.phase; 149 150 char *ph[] = { 151 "PH_UNDETERMINED", 152 "PH_ARBSTART", 153 "PH_SELSTART", 154 "PH_SELECTED", 155 "PH_COMMAND", 156 "PH_DATA", 157 "PH_STATUS", 158 "PH_MSG_IN", 159 "PH_MSG_OUT", 160 "PH_DISCONNECT", 161 "PH_RESELECT" 162 }; 163 164 if ( i < PH_UNDETERMINED || i > PH_RESELECT ) { 165 printk(KERN_DEBUG "scsi phase: unknown(%d)\n", i); 166 return; 167 } 168 169 printk(KERN_DEBUG "scsi phase: %s\n", ph[i]); 170 171 return; 172} 173 174static void show_busphase(unsigned char stat) 175{ 176 switch(stat) { 177 case BUSPHASE_COMMAND: 178 printk(KERN_DEBUG "BUSPHASE_COMMAND\n"); 179 break; 180 case BUSPHASE_MESSAGE_IN: 181 printk(KERN_DEBUG "BUSPHASE_MESSAGE_IN\n"); 182 break; 183 case BUSPHASE_MESSAGE_OUT: 184 printk(KERN_DEBUG "BUSPHASE_MESSAGE_OUT\n"); 185 break; 186 case BUSPHASE_DATA_IN: 187 printk(KERN_DEBUG "BUSPHASE_DATA_IN\n"); 188 break; 189 case BUSPHASE_DATA_OUT: 190 printk(KERN_DEBUG "BUSPHASE_DATA_OUT\n"); 191 break; 192 case BUSPHASE_STATUS: 193 printk(KERN_DEBUG "BUSPHASE_STATUS\n"); 194 break; 195 case BUSPHASE_SELECT: 196 printk(KERN_DEBUG "BUSPHASE_SELECT\n"); 197 break; 198 default: 199 printk(KERN_DEBUG "BUSPHASE_other\n"); 200 break; 201 } 202} 203 204static void show_message(nsp_hw_data *data) 205{ 206 int i; 207 208 printk(KERN_DEBUG "msg:"); 209 for(i=0; i < data->MsgLen; i++) { 210 printk(" %02x", data->MsgBuffer[i]); 211 } 212 printk("\n"); 213} 214 215/* end */ 216