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