18c2ecf20Sopenharmony_ci/*======================================================================== 28c2ecf20Sopenharmony_ci Debug routines for nsp_cs 38c2ecf20Sopenharmony_ci By: YOKOTA Hiroshi <yokota@netlab.is.tsukuba.ac.jp> 48c2ecf20Sopenharmony_ci 58c2ecf20Sopenharmony_ci This software may be used and distributed according to the terms of 68c2ecf20Sopenharmony_ci the GNU General Public License. 78c2ecf20Sopenharmony_ci=========================================================================*/ 88c2ecf20Sopenharmony_ci 98c2ecf20Sopenharmony_ci/* $Id: nsp_debug.c,v 1.3 2003/07/26 14:21:09 elca Exp $ */ 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_ci/* 128c2ecf20Sopenharmony_ci * Show the command data of a command 138c2ecf20Sopenharmony_ci */ 148c2ecf20Sopenharmony_cistatic const char unknown[] = "UNKNOWN"; 158c2ecf20Sopenharmony_ci 168c2ecf20Sopenharmony_cistatic const char * group_0_commands[] = { 178c2ecf20Sopenharmony_ci/* 00-03 */ "Test Unit Ready", "Rezero Unit", unknown, "Request Sense", 188c2ecf20Sopenharmony_ci/* 04-07 */ "Format Unit", "Read Block Limits", unknown, "Reassign Blocks", 198c2ecf20Sopenharmony_ci/* 08-0d */ "Read (6)", unknown, "Write (6)", "Seek (6)", unknown, unknown, 208c2ecf20Sopenharmony_ci/* 0e-12 */ unknown, "Read Reverse", "Write Filemarks", "Space", "Inquiry", 218c2ecf20Sopenharmony_ci/* 13-16 */ unknown, "Recover Buffered Data", "Mode Select", "Reserve", 228c2ecf20Sopenharmony_ci/* 17-1b */ "Release", "Copy", "Erase", "Mode Sense", "Start/Stop Unit", 238c2ecf20Sopenharmony_ci/* 1c-1d */ "Receive Diagnostic", "Send Diagnostic", 248c2ecf20Sopenharmony_ci/* 1e-1f */ "Prevent/Allow Medium Removal", unknown, 258c2ecf20Sopenharmony_ci}; 268c2ecf20Sopenharmony_ci 278c2ecf20Sopenharmony_ci 288c2ecf20Sopenharmony_cistatic const char *group_1_commands[] = { 298c2ecf20Sopenharmony_ci/* 20-22 */ unknown, unknown, unknown, 308c2ecf20Sopenharmony_ci/* 23-28 */ unknown, unknown, "Read Capacity", unknown, unknown, "Read (10)", 318c2ecf20Sopenharmony_ci/* 29-2d */ unknown, "Write (10)", "Seek (10)", unknown, unknown, 328c2ecf20Sopenharmony_ci/* 2e-31 */ "Write Verify","Verify", "Search High", "Search Equal", 338c2ecf20Sopenharmony_ci/* 32-34 */ "Search Low", "Set Limits", "Prefetch or Read Position", 348c2ecf20Sopenharmony_ci/* 35-37 */ "Synchronize Cache","Lock/Unlock Cache", "Read Defect Data", 358c2ecf20Sopenharmony_ci/* 38-3c */ "Medium Scan", "Compare","Copy Verify", "Write Buffer", "Read Buffer", 368c2ecf20Sopenharmony_ci/* 3d-3f */ "Update Block", "Read Long", "Write Long", 378c2ecf20Sopenharmony_ci}; 388c2ecf20Sopenharmony_ci 398c2ecf20Sopenharmony_ci 408c2ecf20Sopenharmony_cistatic const char *group_2_commands[] = { 418c2ecf20Sopenharmony_ci/* 40-41 */ "Change Definition", "Write Same", 428c2ecf20Sopenharmony_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)", 438c2ecf20Sopenharmony_ci/* 49-4f */ "Play Track Relative(10)(cd)", unknown, "Pause/Resume(cd)", "Log Select", "Log Sense", unknown, unknown, 448c2ecf20Sopenharmony_ci/* 50-55 */ unknown, unknown, unknown, unknown, unknown, "Mode Select (10)", 458c2ecf20Sopenharmony_ci/* 56-5b */ unknown, unknown, unknown, unknown, "Mode Sense (10)", unknown, 468c2ecf20Sopenharmony_ci/* 5c-5f */ unknown, unknown, unknown, 478c2ecf20Sopenharmony_ci}; 488c2ecf20Sopenharmony_ci 498c2ecf20Sopenharmony_ci#define group(opcode) (((opcode) >> 5) & 7) 508c2ecf20Sopenharmony_ci 518c2ecf20Sopenharmony_ci#define RESERVED_GROUP 0 528c2ecf20Sopenharmony_ci#define VENDOR_GROUP 1 538c2ecf20Sopenharmony_ci#define NOTEXT_GROUP 2 548c2ecf20Sopenharmony_ci 558c2ecf20Sopenharmony_cistatic const char **commands[] = { 568c2ecf20Sopenharmony_ci group_0_commands, group_1_commands, group_2_commands, 578c2ecf20Sopenharmony_ci (const char **) RESERVED_GROUP, (const char **) RESERVED_GROUP, 588c2ecf20Sopenharmony_ci (const char **) NOTEXT_GROUP, (const char **) VENDOR_GROUP, 598c2ecf20Sopenharmony_ci (const char **) VENDOR_GROUP 608c2ecf20Sopenharmony_ci}; 618c2ecf20Sopenharmony_ci 628c2ecf20Sopenharmony_cistatic const char reserved[] = "RESERVED"; 638c2ecf20Sopenharmony_cistatic const char vendor[] = "VENDOR SPECIFIC"; 648c2ecf20Sopenharmony_ci 658c2ecf20Sopenharmony_cistatic void print_opcodek(unsigned char opcode) 668c2ecf20Sopenharmony_ci{ 678c2ecf20Sopenharmony_ci const char **table = commands[ group(opcode) ]; 688c2ecf20Sopenharmony_ci 698c2ecf20Sopenharmony_ci switch ((unsigned long) table) { 708c2ecf20Sopenharmony_ci case RESERVED_GROUP: 718c2ecf20Sopenharmony_ci printk("%s[%02x] ", reserved, opcode); 728c2ecf20Sopenharmony_ci break; 738c2ecf20Sopenharmony_ci case NOTEXT_GROUP: 748c2ecf20Sopenharmony_ci printk("%s(notext)[%02x] ", unknown, opcode); 758c2ecf20Sopenharmony_ci break; 768c2ecf20Sopenharmony_ci case VENDOR_GROUP: 778c2ecf20Sopenharmony_ci printk("%s[%02x] ", vendor, opcode); 788c2ecf20Sopenharmony_ci break; 798c2ecf20Sopenharmony_ci default: 808c2ecf20Sopenharmony_ci if (table[opcode & 0x1f] != unknown) 818c2ecf20Sopenharmony_ci printk("%s[%02x] ", table[opcode & 0x1f], opcode); 828c2ecf20Sopenharmony_ci else 838c2ecf20Sopenharmony_ci printk("%s[%02x] ", unknown, opcode); 848c2ecf20Sopenharmony_ci break; 858c2ecf20Sopenharmony_ci } 868c2ecf20Sopenharmony_ci} 878c2ecf20Sopenharmony_ci 888c2ecf20Sopenharmony_cistatic void print_commandk (unsigned char *command) 898c2ecf20Sopenharmony_ci{ 908c2ecf20Sopenharmony_ci int i, s; 918c2ecf20Sopenharmony_ci printk(KERN_DEBUG); 928c2ecf20Sopenharmony_ci print_opcodek(command[0]); 938c2ecf20Sopenharmony_ci /*printk(KERN_DEBUG "%s ", __func__);*/ 948c2ecf20Sopenharmony_ci if ((command[0] >> 5) == 6 || 958c2ecf20Sopenharmony_ci (command[0] >> 5) == 7 ) { 968c2ecf20Sopenharmony_ci s = 12; /* vender specific */ 978c2ecf20Sopenharmony_ci } else { 988c2ecf20Sopenharmony_ci s = COMMAND_SIZE(command[0]); 998c2ecf20Sopenharmony_ci } 1008c2ecf20Sopenharmony_ci for ( i = 1; i < s; ++i) { 1018c2ecf20Sopenharmony_ci printk("%02x ", command[i]); 1028c2ecf20Sopenharmony_ci } 1038c2ecf20Sopenharmony_ci 1048c2ecf20Sopenharmony_ci switch (s) { 1058c2ecf20Sopenharmony_ci case 6: 1068c2ecf20Sopenharmony_ci printk("LBA=%d len=%d", 1078c2ecf20Sopenharmony_ci (((unsigned int)command[1] & 0x0f) << 16) | 1088c2ecf20Sopenharmony_ci ( (unsigned int)command[2] << 8) | 1098c2ecf20Sopenharmony_ci ( (unsigned int)command[3] ), 1108c2ecf20Sopenharmony_ci (unsigned int)command[4] 1118c2ecf20Sopenharmony_ci ); 1128c2ecf20Sopenharmony_ci break; 1138c2ecf20Sopenharmony_ci case 10: 1148c2ecf20Sopenharmony_ci printk("LBA=%d len=%d", 1158c2ecf20Sopenharmony_ci ((unsigned int)command[2] << 24) | 1168c2ecf20Sopenharmony_ci ((unsigned int)command[3] << 16) | 1178c2ecf20Sopenharmony_ci ((unsigned int)command[4] << 8) | 1188c2ecf20Sopenharmony_ci ((unsigned int)command[5] ), 1198c2ecf20Sopenharmony_ci ((unsigned int)command[7] << 8) | 1208c2ecf20Sopenharmony_ci ((unsigned int)command[8] ) 1218c2ecf20Sopenharmony_ci ); 1228c2ecf20Sopenharmony_ci break; 1238c2ecf20Sopenharmony_ci case 12: 1248c2ecf20Sopenharmony_ci printk("LBA=%d len=%d", 1258c2ecf20Sopenharmony_ci ((unsigned int)command[2] << 24) | 1268c2ecf20Sopenharmony_ci ((unsigned int)command[3] << 16) | 1278c2ecf20Sopenharmony_ci ((unsigned int)command[4] << 8) | 1288c2ecf20Sopenharmony_ci ((unsigned int)command[5] ), 1298c2ecf20Sopenharmony_ci ((unsigned int)command[6] << 24) | 1308c2ecf20Sopenharmony_ci ((unsigned int)command[7] << 16) | 1318c2ecf20Sopenharmony_ci ((unsigned int)command[8] << 8) | 1328c2ecf20Sopenharmony_ci ((unsigned int)command[9] ) 1338c2ecf20Sopenharmony_ci ); 1348c2ecf20Sopenharmony_ci break; 1358c2ecf20Sopenharmony_ci default: 1368c2ecf20Sopenharmony_ci break; 1378c2ecf20Sopenharmony_ci } 1388c2ecf20Sopenharmony_ci printk("\n"); 1398c2ecf20Sopenharmony_ci} 1408c2ecf20Sopenharmony_ci 1418c2ecf20Sopenharmony_cistatic void show_command(struct scsi_cmnd *SCpnt) 1428c2ecf20Sopenharmony_ci{ 1438c2ecf20Sopenharmony_ci print_commandk(SCpnt->cmnd); 1448c2ecf20Sopenharmony_ci} 1458c2ecf20Sopenharmony_ci 1468c2ecf20Sopenharmony_cistatic void show_phase(struct scsi_cmnd *SCpnt) 1478c2ecf20Sopenharmony_ci{ 1488c2ecf20Sopenharmony_ci int i = SCpnt->SCp.phase; 1498c2ecf20Sopenharmony_ci 1508c2ecf20Sopenharmony_ci char *ph[] = { 1518c2ecf20Sopenharmony_ci "PH_UNDETERMINED", 1528c2ecf20Sopenharmony_ci "PH_ARBSTART", 1538c2ecf20Sopenharmony_ci "PH_SELSTART", 1548c2ecf20Sopenharmony_ci "PH_SELECTED", 1558c2ecf20Sopenharmony_ci "PH_COMMAND", 1568c2ecf20Sopenharmony_ci "PH_DATA", 1578c2ecf20Sopenharmony_ci "PH_STATUS", 1588c2ecf20Sopenharmony_ci "PH_MSG_IN", 1598c2ecf20Sopenharmony_ci "PH_MSG_OUT", 1608c2ecf20Sopenharmony_ci "PH_DISCONNECT", 1618c2ecf20Sopenharmony_ci "PH_RESELECT" 1628c2ecf20Sopenharmony_ci }; 1638c2ecf20Sopenharmony_ci 1648c2ecf20Sopenharmony_ci if ( i < PH_UNDETERMINED || i > PH_RESELECT ) { 1658c2ecf20Sopenharmony_ci printk(KERN_DEBUG "scsi phase: unknown(%d)\n", i); 1668c2ecf20Sopenharmony_ci return; 1678c2ecf20Sopenharmony_ci } 1688c2ecf20Sopenharmony_ci 1698c2ecf20Sopenharmony_ci printk(KERN_DEBUG "scsi phase: %s\n", ph[i]); 1708c2ecf20Sopenharmony_ci 1718c2ecf20Sopenharmony_ci return; 1728c2ecf20Sopenharmony_ci} 1738c2ecf20Sopenharmony_ci 1748c2ecf20Sopenharmony_cistatic void show_busphase(unsigned char stat) 1758c2ecf20Sopenharmony_ci{ 1768c2ecf20Sopenharmony_ci switch(stat) { 1778c2ecf20Sopenharmony_ci case BUSPHASE_COMMAND: 1788c2ecf20Sopenharmony_ci printk(KERN_DEBUG "BUSPHASE_COMMAND\n"); 1798c2ecf20Sopenharmony_ci break; 1808c2ecf20Sopenharmony_ci case BUSPHASE_MESSAGE_IN: 1818c2ecf20Sopenharmony_ci printk(KERN_DEBUG "BUSPHASE_MESSAGE_IN\n"); 1828c2ecf20Sopenharmony_ci break; 1838c2ecf20Sopenharmony_ci case BUSPHASE_MESSAGE_OUT: 1848c2ecf20Sopenharmony_ci printk(KERN_DEBUG "BUSPHASE_MESSAGE_OUT\n"); 1858c2ecf20Sopenharmony_ci break; 1868c2ecf20Sopenharmony_ci case BUSPHASE_DATA_IN: 1878c2ecf20Sopenharmony_ci printk(KERN_DEBUG "BUSPHASE_DATA_IN\n"); 1888c2ecf20Sopenharmony_ci break; 1898c2ecf20Sopenharmony_ci case BUSPHASE_DATA_OUT: 1908c2ecf20Sopenharmony_ci printk(KERN_DEBUG "BUSPHASE_DATA_OUT\n"); 1918c2ecf20Sopenharmony_ci break; 1928c2ecf20Sopenharmony_ci case BUSPHASE_STATUS: 1938c2ecf20Sopenharmony_ci printk(KERN_DEBUG "BUSPHASE_STATUS\n"); 1948c2ecf20Sopenharmony_ci break; 1958c2ecf20Sopenharmony_ci case BUSPHASE_SELECT: 1968c2ecf20Sopenharmony_ci printk(KERN_DEBUG "BUSPHASE_SELECT\n"); 1978c2ecf20Sopenharmony_ci break; 1988c2ecf20Sopenharmony_ci default: 1998c2ecf20Sopenharmony_ci printk(KERN_DEBUG "BUSPHASE_other\n"); 2008c2ecf20Sopenharmony_ci break; 2018c2ecf20Sopenharmony_ci } 2028c2ecf20Sopenharmony_ci} 2038c2ecf20Sopenharmony_ci 2048c2ecf20Sopenharmony_cistatic void show_message(nsp_hw_data *data) 2058c2ecf20Sopenharmony_ci{ 2068c2ecf20Sopenharmony_ci int i; 2078c2ecf20Sopenharmony_ci 2088c2ecf20Sopenharmony_ci printk(KERN_DEBUG "msg:"); 2098c2ecf20Sopenharmony_ci for(i=0; i < data->MsgLen; i++) { 2108c2ecf20Sopenharmony_ci printk(" %02x", data->MsgBuffer[i]); 2118c2ecf20Sopenharmony_ci } 2128c2ecf20Sopenharmony_ci printk("\n"); 2138c2ecf20Sopenharmony_ci} 2148c2ecf20Sopenharmony_ci 2158c2ecf20Sopenharmony_ci/* end */ 216