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.1.1.1 2008/10/15 03:26:55 james26_jang 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, "Reasssign 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 __FUNCTION__ " ");*/ 94 for ( i = 1, s = COMMAND_SIZE(command[0]); i < s; ++i) { 95 printk("%02x ", command[i]); 96 } 97 switch (COMMAND_SIZE(command[0])) { 98 case 6: 99 printk("LBA=%d len=%d", 100 (((unsigned int)command[1] & 0x0f) << 16) | 101 ( (unsigned int)command[2] << 8) | 102 ( (unsigned int)command[3] ), 103 (unsigned int)command[4] 104 ); 105 break; 106 case 10: 107 printk("LBA=%d len=%d", 108 ((unsigned int)command[2] << 24) | 109 ((unsigned int)command[3] << 16) | 110 ((unsigned int)command[4] << 8) | 111 ((unsigned int)command[5] ), 112 ((unsigned int)command[7] << 8) | 113 ((unsigned int)command[8] ) 114 ); 115 break; 116 case 12: 117 printk("LBA=%d len=%d", 118 ((unsigned int)command[2] << 24) | 119 ((unsigned int)command[3] << 16) | 120 ((unsigned int)command[4] << 8) | 121 ((unsigned int)command[5] ), 122 ((unsigned int)command[6] << 24) | 123 ((unsigned int)command[7] << 16) | 124 ((unsigned int)command[8] << 8) | 125 ((unsigned int)command[9] ) 126 ); 127 break; 128 default: 129 break; 130 } 131 printk("\n"); 132} 133 134static void show_command(Scsi_Cmnd *ptr) 135{ 136 print_commandk(ptr->cmnd); 137} 138 139static void show_phase(Scsi_Cmnd *SCpnt) 140{ 141 int i = SCpnt->SCp.phase; 142 143 char *ph[] = { 144 "PH_UNDETERMINED", 145 "PH_ARBSTART", 146 "PH_SELSTART", 147 "PH_SELECTED", 148 "PH_COMMAND", 149 "PH_DATA", 150 "PH_STATUS", 151 "PH_MSG_IN", 152 "PH_MSG_OUT", 153 "PH_DISCONNECT", 154 "PH_RESELECT" 155 }; 156 157 if ( i < PH_UNDETERMINED || i > PH_RESELECT ) { 158 printk(KERN_DEBUG "scsi phase: unknown(%d)\n", i); 159 return; 160 } 161 162 printk(KERN_DEBUG "scsi phase: %s\n", ph[i]); 163 164 return; 165} 166 167static void show_busphase(unsigned char stat) 168{ 169 switch(stat) { 170 case BUSPHASE_COMMAND: 171 printk(KERN_DEBUG "BUSPHASE_COMMAND\n"); 172 break; 173 case BUSPHASE_MESSAGE_IN: 174 printk(KERN_DEBUG "BUSPHASE_MESSAGE_IN\n"); 175 break; 176 case BUSPHASE_MESSAGE_OUT: 177 printk(KERN_DEBUG "BUSPHASE_MESSAGE_OUT\n"); 178 break; 179 case BUSPHASE_DATA_IN: 180 printk(KERN_DEBUG "BUSPHASE_DATA_IN\n"); 181 break; 182 case BUSPHASE_DATA_OUT: 183 printk(KERN_DEBUG "BUSPHASE_DATA_OUT\n"); 184 break; 185 case BUSPHASE_STATUS: 186 printk(KERN_DEBUG "BUSPHASE_STATUS\n"); 187 break; 188 case BUSPHASE_SELECT: 189 printk(KERN_DEBUG "BUSPHASE_SELECT\n"); 190 break; 191 default: 192 printk(KERN_DEBUG "BUSPHASE_other\n"); 193 break; 194 } 195} 196 197static void show_message(nsp_hw_data *data) 198{ 199 int i; 200 201 printk(KERN_DEBUG "msg:"); 202 for(i=0; i < data->MsgLen; i++) { 203 printk(" %02x", data->MsgBuffer[i]); 204 } 205 printk("\n"); 206} 207 208/* end */ 209