162306a36Sopenharmony_ci/*======================================================================== 262306a36Sopenharmony_ci Debug routines for nsp_cs 362306a36Sopenharmony_ci By: YOKOTA Hiroshi <yokota@netlab.is.tsukuba.ac.jp> 462306a36Sopenharmony_ci 562306a36Sopenharmony_ci This software may be used and distributed according to the terms of 662306a36Sopenharmony_ci the GNU General Public License. 762306a36Sopenharmony_ci=========================================================================*/ 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci/* $Id: nsp_debug.c,v 1.3 2003/07/26 14:21:09 elca Exp $ */ 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci/* 1262306a36Sopenharmony_ci * Show the command data of a command 1362306a36Sopenharmony_ci */ 1462306a36Sopenharmony_cistatic const char unknown[] = "UNKNOWN"; 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_cistatic const char * group_0_commands[] = { 1762306a36Sopenharmony_ci/* 00-03 */ "Test Unit Ready", "Rezero Unit", unknown, "Request Sense", 1862306a36Sopenharmony_ci/* 04-07 */ "Format Unit", "Read Block Limits", unknown, "Reassign Blocks", 1962306a36Sopenharmony_ci/* 08-0d */ "Read (6)", unknown, "Write (6)", "Seek (6)", unknown, unknown, 2062306a36Sopenharmony_ci/* 0e-12 */ unknown, "Read Reverse", "Write Filemarks", "Space", "Inquiry", 2162306a36Sopenharmony_ci/* 13-16 */ unknown, "Recover Buffered Data", "Mode Select", "Reserve", 2262306a36Sopenharmony_ci/* 17-1b */ "Release", "Copy", "Erase", "Mode Sense", "Start/Stop Unit", 2362306a36Sopenharmony_ci/* 1c-1d */ "Receive Diagnostic", "Send Diagnostic", 2462306a36Sopenharmony_ci/* 1e-1f */ "Prevent/Allow Medium Removal", unknown, 2562306a36Sopenharmony_ci}; 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_cistatic const char *group_1_commands[] = { 2962306a36Sopenharmony_ci/* 20-22 */ unknown, unknown, unknown, 3062306a36Sopenharmony_ci/* 23-28 */ unknown, unknown, "Read Capacity", unknown, unknown, "Read (10)", 3162306a36Sopenharmony_ci/* 29-2d */ unknown, "Write (10)", "Seek (10)", unknown, unknown, 3262306a36Sopenharmony_ci/* 2e-31 */ "Write Verify","Verify", "Search High", "Search Equal", 3362306a36Sopenharmony_ci/* 32-34 */ "Search Low", "Set Limits", "Prefetch or Read Position", 3462306a36Sopenharmony_ci/* 35-37 */ "Synchronize Cache","Lock/Unlock Cache", "Read Defect Data", 3562306a36Sopenharmony_ci/* 38-3c */ "Medium Scan", "Compare","Copy Verify", "Write Buffer", "Read Buffer", 3662306a36Sopenharmony_ci/* 3d-3f */ "Update Block", "Read Long", "Write Long", 3762306a36Sopenharmony_ci}; 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_cistatic const char *group_2_commands[] = { 4162306a36Sopenharmony_ci/* 40-41 */ "Change Definition", "Write Same", 4262306a36Sopenharmony_ci/* 42-48 */ "Read Sub-Ch(cd)", "Read TOC", "Read Header(cd)", "Play Audio(cd)", unknown, "Play Audio MSF(cd)", "Play Audio Track/Index(cd)", 4362306a36Sopenharmony_ci/* 49-4f */ "Play Track Relative(10)(cd)", unknown, "Pause/Resume(cd)", "Log Select", "Log Sense", unknown, unknown, 4462306a36Sopenharmony_ci/* 50-55 */ unknown, unknown, unknown, unknown, unknown, "Mode Select (10)", 4562306a36Sopenharmony_ci/* 56-5b */ unknown, unknown, unknown, unknown, "Mode Sense (10)", unknown, 4662306a36Sopenharmony_ci/* 5c-5f */ unknown, unknown, unknown, 4762306a36Sopenharmony_ci}; 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_ci#define group(opcode) (((opcode) >> 5) & 7) 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ci#define RESERVED_GROUP 0 5262306a36Sopenharmony_ci#define VENDOR_GROUP 1 5362306a36Sopenharmony_ci#define NOTEXT_GROUP 2 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_cistatic const char **commands[] = { 5662306a36Sopenharmony_ci group_0_commands, group_1_commands, group_2_commands, 5762306a36Sopenharmony_ci (const char **) RESERVED_GROUP, (const char **) RESERVED_GROUP, 5862306a36Sopenharmony_ci (const char **) NOTEXT_GROUP, (const char **) VENDOR_GROUP, 5962306a36Sopenharmony_ci (const char **) VENDOR_GROUP 6062306a36Sopenharmony_ci}; 6162306a36Sopenharmony_ci 6262306a36Sopenharmony_cistatic const char reserved[] = "RESERVED"; 6362306a36Sopenharmony_cistatic const char vendor[] = "VENDOR SPECIFIC"; 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_cistatic void print_opcodek(unsigned char opcode) 6662306a36Sopenharmony_ci{ 6762306a36Sopenharmony_ci const char **table = commands[ group(opcode) ]; 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_ci switch ((unsigned long) table) { 7062306a36Sopenharmony_ci case RESERVED_GROUP: 7162306a36Sopenharmony_ci printk("%s[%02x] ", reserved, opcode); 7262306a36Sopenharmony_ci break; 7362306a36Sopenharmony_ci case NOTEXT_GROUP: 7462306a36Sopenharmony_ci printk("%s(notext)[%02x] ", unknown, opcode); 7562306a36Sopenharmony_ci break; 7662306a36Sopenharmony_ci case VENDOR_GROUP: 7762306a36Sopenharmony_ci printk("%s[%02x] ", vendor, opcode); 7862306a36Sopenharmony_ci break; 7962306a36Sopenharmony_ci default: 8062306a36Sopenharmony_ci if (table[opcode & 0x1f] != unknown) 8162306a36Sopenharmony_ci printk("%s[%02x] ", table[opcode & 0x1f], opcode); 8262306a36Sopenharmony_ci else 8362306a36Sopenharmony_ci printk("%s[%02x] ", unknown, opcode); 8462306a36Sopenharmony_ci break; 8562306a36Sopenharmony_ci } 8662306a36Sopenharmony_ci} 8762306a36Sopenharmony_ci 8862306a36Sopenharmony_cistatic void print_commandk (unsigned char *command) 8962306a36Sopenharmony_ci{ 9062306a36Sopenharmony_ci int i, s; 9162306a36Sopenharmony_ci printk(KERN_DEBUG); 9262306a36Sopenharmony_ci print_opcodek(command[0]); 9362306a36Sopenharmony_ci /*printk(KERN_DEBUG "%s ", __func__);*/ 9462306a36Sopenharmony_ci if ((command[0] >> 5) == 6 || 9562306a36Sopenharmony_ci (command[0] >> 5) == 7 ) { 9662306a36Sopenharmony_ci s = 12; /* vender specific */ 9762306a36Sopenharmony_ci } else { 9862306a36Sopenharmony_ci s = COMMAND_SIZE(command[0]); 9962306a36Sopenharmony_ci } 10062306a36Sopenharmony_ci for ( i = 1; i < s; ++i) { 10162306a36Sopenharmony_ci printk("%02x ", command[i]); 10262306a36Sopenharmony_ci } 10362306a36Sopenharmony_ci 10462306a36Sopenharmony_ci switch (s) { 10562306a36Sopenharmony_ci case 6: 10662306a36Sopenharmony_ci printk("LBA=%d len=%d", 10762306a36Sopenharmony_ci (((unsigned int)command[1] & 0x0f) << 16) | 10862306a36Sopenharmony_ci ( (unsigned int)command[2] << 8) | 10962306a36Sopenharmony_ci ( (unsigned int)command[3] ), 11062306a36Sopenharmony_ci (unsigned int)command[4] 11162306a36Sopenharmony_ci ); 11262306a36Sopenharmony_ci break; 11362306a36Sopenharmony_ci case 10: 11462306a36Sopenharmony_ci printk("LBA=%d len=%d", 11562306a36Sopenharmony_ci ((unsigned int)command[2] << 24) | 11662306a36Sopenharmony_ci ((unsigned int)command[3] << 16) | 11762306a36Sopenharmony_ci ((unsigned int)command[4] << 8) | 11862306a36Sopenharmony_ci ((unsigned int)command[5] ), 11962306a36Sopenharmony_ci ((unsigned int)command[7] << 8) | 12062306a36Sopenharmony_ci ((unsigned int)command[8] ) 12162306a36Sopenharmony_ci ); 12262306a36Sopenharmony_ci break; 12362306a36Sopenharmony_ci case 12: 12462306a36Sopenharmony_ci printk("LBA=%d len=%d", 12562306a36Sopenharmony_ci ((unsigned int)command[2] << 24) | 12662306a36Sopenharmony_ci ((unsigned int)command[3] << 16) | 12762306a36Sopenharmony_ci ((unsigned int)command[4] << 8) | 12862306a36Sopenharmony_ci ((unsigned int)command[5] ), 12962306a36Sopenharmony_ci ((unsigned int)command[6] << 24) | 13062306a36Sopenharmony_ci ((unsigned int)command[7] << 16) | 13162306a36Sopenharmony_ci ((unsigned int)command[8] << 8) | 13262306a36Sopenharmony_ci ((unsigned int)command[9] ) 13362306a36Sopenharmony_ci ); 13462306a36Sopenharmony_ci break; 13562306a36Sopenharmony_ci default: 13662306a36Sopenharmony_ci break; 13762306a36Sopenharmony_ci } 13862306a36Sopenharmony_ci printk("\n"); 13962306a36Sopenharmony_ci} 14062306a36Sopenharmony_ci 14162306a36Sopenharmony_cistatic void show_command(struct scsi_cmnd *SCpnt) 14262306a36Sopenharmony_ci{ 14362306a36Sopenharmony_ci print_commandk(SCpnt->cmnd); 14462306a36Sopenharmony_ci} 14562306a36Sopenharmony_ci 14662306a36Sopenharmony_cistatic void show_phase(struct scsi_cmnd *SCpnt) 14762306a36Sopenharmony_ci{ 14862306a36Sopenharmony_ci int i = nsp_scsi_pointer(SCpnt)->phase; 14962306a36Sopenharmony_ci 15062306a36Sopenharmony_ci char *ph[] = { 15162306a36Sopenharmony_ci "PH_UNDETERMINED", 15262306a36Sopenharmony_ci "PH_ARBSTART", 15362306a36Sopenharmony_ci "PH_SELSTART", 15462306a36Sopenharmony_ci "PH_SELECTED", 15562306a36Sopenharmony_ci "PH_COMMAND", 15662306a36Sopenharmony_ci "PH_DATA", 15762306a36Sopenharmony_ci "PH_STATUS", 15862306a36Sopenharmony_ci "PH_MSG_IN", 15962306a36Sopenharmony_ci "PH_MSG_OUT", 16062306a36Sopenharmony_ci "PH_DISCONNECT", 16162306a36Sopenharmony_ci "PH_RESELECT" 16262306a36Sopenharmony_ci }; 16362306a36Sopenharmony_ci 16462306a36Sopenharmony_ci if ( i < PH_UNDETERMINED || i > PH_RESELECT ) { 16562306a36Sopenharmony_ci printk(KERN_DEBUG "scsi phase: unknown(%d)\n", i); 16662306a36Sopenharmony_ci return; 16762306a36Sopenharmony_ci } 16862306a36Sopenharmony_ci 16962306a36Sopenharmony_ci printk(KERN_DEBUG "scsi phase: %s\n", ph[i]); 17062306a36Sopenharmony_ci 17162306a36Sopenharmony_ci return; 17262306a36Sopenharmony_ci} 17362306a36Sopenharmony_ci 17462306a36Sopenharmony_cistatic void show_busphase(unsigned char stat) 17562306a36Sopenharmony_ci{ 17662306a36Sopenharmony_ci switch(stat) { 17762306a36Sopenharmony_ci case BUSPHASE_COMMAND: 17862306a36Sopenharmony_ci printk(KERN_DEBUG "BUSPHASE_COMMAND\n"); 17962306a36Sopenharmony_ci break; 18062306a36Sopenharmony_ci case BUSPHASE_MESSAGE_IN: 18162306a36Sopenharmony_ci printk(KERN_DEBUG "BUSPHASE_MESSAGE_IN\n"); 18262306a36Sopenharmony_ci break; 18362306a36Sopenharmony_ci case BUSPHASE_MESSAGE_OUT: 18462306a36Sopenharmony_ci printk(KERN_DEBUG "BUSPHASE_MESSAGE_OUT\n"); 18562306a36Sopenharmony_ci break; 18662306a36Sopenharmony_ci case BUSPHASE_DATA_IN: 18762306a36Sopenharmony_ci printk(KERN_DEBUG "BUSPHASE_DATA_IN\n"); 18862306a36Sopenharmony_ci break; 18962306a36Sopenharmony_ci case BUSPHASE_DATA_OUT: 19062306a36Sopenharmony_ci printk(KERN_DEBUG "BUSPHASE_DATA_OUT\n"); 19162306a36Sopenharmony_ci break; 19262306a36Sopenharmony_ci case BUSPHASE_STATUS: 19362306a36Sopenharmony_ci printk(KERN_DEBUG "BUSPHASE_STATUS\n"); 19462306a36Sopenharmony_ci break; 19562306a36Sopenharmony_ci case BUSPHASE_SELECT: 19662306a36Sopenharmony_ci printk(KERN_DEBUG "BUSPHASE_SELECT\n"); 19762306a36Sopenharmony_ci break; 19862306a36Sopenharmony_ci default: 19962306a36Sopenharmony_ci printk(KERN_DEBUG "BUSPHASE_other\n"); 20062306a36Sopenharmony_ci break; 20162306a36Sopenharmony_ci } 20262306a36Sopenharmony_ci} 20362306a36Sopenharmony_ci 20462306a36Sopenharmony_cistatic void show_message(nsp_hw_data *data) 20562306a36Sopenharmony_ci{ 20662306a36Sopenharmony_ci int i; 20762306a36Sopenharmony_ci 20862306a36Sopenharmony_ci printk(KERN_DEBUG "msg:"); 20962306a36Sopenharmony_ci for(i=0; i < data->MsgLen; i++) { 21062306a36Sopenharmony_ci printk(" %02x", data->MsgBuffer[i]); 21162306a36Sopenharmony_ci } 21262306a36Sopenharmony_ci printk("\n"); 21362306a36Sopenharmony_ci} 21462306a36Sopenharmony_ci 21562306a36Sopenharmony_ci/* end */ 216