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