18c2ecf20Sopenharmony_ci/*
28c2ecf20Sopenharmony_ci * Workbit NinjaSCSI-32Bi/UDE PCI/CardBus SCSI Host Bus Adapter driver
38c2ecf20Sopenharmony_ci * Debug routine
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/*
108c2ecf20Sopenharmony_ci * Show the command data of a command
118c2ecf20Sopenharmony_ci */
128c2ecf20Sopenharmony_cistatic const char unknown[] = "UNKNOWN";
138c2ecf20Sopenharmony_ci
148c2ecf20Sopenharmony_cistatic const char * group_0_commands[] = {
158c2ecf20Sopenharmony_ci/* 00-03 */ "Test Unit Ready", "Rezero Unit", unknown, "Request Sense",
168c2ecf20Sopenharmony_ci/* 04-07 */ "Format Unit", "Read Block Limits", unknown, "Reassign Blocks",
178c2ecf20Sopenharmony_ci/* 08-0d */ "Read (6)", unknown, "Write (6)", "Seek (6)", unknown, unknown,
188c2ecf20Sopenharmony_ci/* 0e-12 */ unknown, "Read Reverse", "Write Filemarks", "Space", "Inquiry",
198c2ecf20Sopenharmony_ci/* 13-16 */ unknown, "Recover Buffered Data", "Mode Select", "Reserve",
208c2ecf20Sopenharmony_ci/* 17-1b */ "Release", "Copy", "Erase", "Mode Sense", "Start/Stop Unit",
218c2ecf20Sopenharmony_ci/* 1c-1d */ "Receive Diagnostic", "Send Diagnostic",
228c2ecf20Sopenharmony_ci/* 1e-1f */ "Prevent/Allow Medium Removal", unknown,
238c2ecf20Sopenharmony_ci};
248c2ecf20Sopenharmony_ci
258c2ecf20Sopenharmony_ci
268c2ecf20Sopenharmony_cistatic const char *group_1_commands[] = {
278c2ecf20Sopenharmony_ci/* 20-22 */  unknown, unknown, unknown,
288c2ecf20Sopenharmony_ci/* 23-28 */ unknown, unknown, "Read Capacity", unknown, unknown, "Read (10)",
298c2ecf20Sopenharmony_ci/* 29-2d */ unknown, "Write (10)", "Seek (10)", unknown, unknown,
308c2ecf20Sopenharmony_ci/* 2e-31 */ "Write Verify","Verify", "Search High", "Search Equal",
318c2ecf20Sopenharmony_ci/* 32-34 */ "Search Low", "Set Limits", "Prefetch or Read Position",
328c2ecf20Sopenharmony_ci/* 35-37 */ "Synchronize Cache","Lock/Unlock Cache", "Read Defect Data",
338c2ecf20Sopenharmony_ci/* 38-3c */ "Medium Scan", "Compare","Copy Verify", "Write Buffer", "Read Buffer",
348c2ecf20Sopenharmony_ci/* 3d-3f */ "Update Block", "Read Long",  "Write Long",
358c2ecf20Sopenharmony_ci};
368c2ecf20Sopenharmony_ci
378c2ecf20Sopenharmony_ci
388c2ecf20Sopenharmony_cistatic const char *group_2_commands[] = {
398c2ecf20Sopenharmony_ci/* 40-41 */ "Change Definition", "Write Same",
408c2ecf20Sopenharmony_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)",
418c2ecf20Sopenharmony_ci/* 49-4f */ "Play Track Relative(10)(cd)", unknown, "Pause/Resume(cd)", "Log Select", "Log Sense", unknown, unknown,
428c2ecf20Sopenharmony_ci/* 50-55 */ unknown, unknown, unknown, unknown, unknown, "Mode Select (10)",
438c2ecf20Sopenharmony_ci/* 56-5b */ unknown, unknown, unknown, unknown, "Mode Sense (10)", unknown,
448c2ecf20Sopenharmony_ci/* 5c-5f */ unknown, unknown, unknown,
458c2ecf20Sopenharmony_ci};
468c2ecf20Sopenharmony_ci
478c2ecf20Sopenharmony_ci#define group(opcode) (((opcode) >> 5) & 7)
488c2ecf20Sopenharmony_ci
498c2ecf20Sopenharmony_ci#define RESERVED_GROUP  0
508c2ecf20Sopenharmony_ci#define VENDOR_GROUP    1
518c2ecf20Sopenharmony_ci#define NOTEXT_GROUP    2
528c2ecf20Sopenharmony_ci
538c2ecf20Sopenharmony_cistatic const char **commands[] = {
548c2ecf20Sopenharmony_ci    group_0_commands, group_1_commands, group_2_commands,
558c2ecf20Sopenharmony_ci    (const char **) RESERVED_GROUP, (const char **) RESERVED_GROUP,
568c2ecf20Sopenharmony_ci    (const char **) NOTEXT_GROUP, (const char **) VENDOR_GROUP,
578c2ecf20Sopenharmony_ci    (const char **) VENDOR_GROUP
588c2ecf20Sopenharmony_ci};
598c2ecf20Sopenharmony_ci
608c2ecf20Sopenharmony_cistatic const char reserved[] = "RESERVED";
618c2ecf20Sopenharmony_cistatic const char vendor[] = "VENDOR SPECIFIC";
628c2ecf20Sopenharmony_ci
638c2ecf20Sopenharmony_cistatic void print_opcodek(unsigned char opcode)
648c2ecf20Sopenharmony_ci{
658c2ecf20Sopenharmony_ci	const char **table = commands[ group(opcode) ];
668c2ecf20Sopenharmony_ci
678c2ecf20Sopenharmony_ci	switch ((unsigned long) table) {
688c2ecf20Sopenharmony_ci	case RESERVED_GROUP:
698c2ecf20Sopenharmony_ci		printk("%s[%02x] ", reserved, opcode);
708c2ecf20Sopenharmony_ci		break;
718c2ecf20Sopenharmony_ci	case NOTEXT_GROUP:
728c2ecf20Sopenharmony_ci		printk("%s(notext)[%02x] ", unknown, opcode);
738c2ecf20Sopenharmony_ci		break;
748c2ecf20Sopenharmony_ci	case VENDOR_GROUP:
758c2ecf20Sopenharmony_ci		printk("%s[%02x] ", vendor, opcode);
768c2ecf20Sopenharmony_ci		break;
778c2ecf20Sopenharmony_ci	default:
788c2ecf20Sopenharmony_ci		if (table[opcode & 0x1f] != unknown)
798c2ecf20Sopenharmony_ci			printk("%s[%02x] ", table[opcode & 0x1f], opcode);
808c2ecf20Sopenharmony_ci		else
818c2ecf20Sopenharmony_ci			printk("%s[%02x] ", unknown, opcode);
828c2ecf20Sopenharmony_ci		break;
838c2ecf20Sopenharmony_ci	}
848c2ecf20Sopenharmony_ci}
858c2ecf20Sopenharmony_ci
868c2ecf20Sopenharmony_cistatic void print_commandk (unsigned char *command)
878c2ecf20Sopenharmony_ci{
888c2ecf20Sopenharmony_ci	int i,s;
898c2ecf20Sopenharmony_ci//	printk(KERN_DEBUG);
908c2ecf20Sopenharmony_ci	print_opcodek(command[0]);
918c2ecf20Sopenharmony_ci	/*printk(KERN_DEBUG "%s ", __func__);*/
928c2ecf20Sopenharmony_ci	if ((command[0] >> 5) == 6 ||
938c2ecf20Sopenharmony_ci	    (command[0] >> 5) == 7 ) {
948c2ecf20Sopenharmony_ci		s = 12; /* vender specific */
958c2ecf20Sopenharmony_ci	} else {
968c2ecf20Sopenharmony_ci		s = COMMAND_SIZE(command[0]);
978c2ecf20Sopenharmony_ci	}
988c2ecf20Sopenharmony_ci
998c2ecf20Sopenharmony_ci	for ( i = 1; i < s; ++i) {
1008c2ecf20Sopenharmony_ci		printk("%02x ", command[i]);
1018c2ecf20Sopenharmony_ci	}
1028c2ecf20Sopenharmony_ci
1038c2ecf20Sopenharmony_ci	switch (s) {
1048c2ecf20Sopenharmony_ci	case 6:
1058c2ecf20Sopenharmony_ci		printk("LBA=%d len=%d",
1068c2ecf20Sopenharmony_ci		       (((unsigned int)command[1] & 0x0f) << 16) |
1078c2ecf20Sopenharmony_ci		       ( (unsigned int)command[2]         <<  8) |
1088c2ecf20Sopenharmony_ci		       ( (unsigned int)command[3]              ),
1098c2ecf20Sopenharmony_ci		       (unsigned int)command[4]
1108c2ecf20Sopenharmony_ci			);
1118c2ecf20Sopenharmony_ci		break;
1128c2ecf20Sopenharmony_ci	case 10:
1138c2ecf20Sopenharmony_ci		printk("LBA=%d len=%d",
1148c2ecf20Sopenharmony_ci		       ((unsigned int)command[2] << 24) |
1158c2ecf20Sopenharmony_ci		       ((unsigned int)command[3] << 16) |
1168c2ecf20Sopenharmony_ci		       ((unsigned int)command[4] <<  8) |
1178c2ecf20Sopenharmony_ci		       ((unsigned int)command[5]      ),
1188c2ecf20Sopenharmony_ci		       ((unsigned int)command[7] <<  8) |
1198c2ecf20Sopenharmony_ci		       ((unsigned int)command[8]      )
1208c2ecf20Sopenharmony_ci		       );
1218c2ecf20Sopenharmony_ci		break;
1228c2ecf20Sopenharmony_ci	case 12:
1238c2ecf20Sopenharmony_ci		printk("LBA=%d len=%d",
1248c2ecf20Sopenharmony_ci		       ((unsigned int)command[2] << 24) |
1258c2ecf20Sopenharmony_ci		       ((unsigned int)command[3] << 16) |
1268c2ecf20Sopenharmony_ci		       ((unsigned int)command[4] <<  8) |
1278c2ecf20Sopenharmony_ci		       ((unsigned int)command[5]      ),
1288c2ecf20Sopenharmony_ci		       ((unsigned int)command[6] << 24) |
1298c2ecf20Sopenharmony_ci		       ((unsigned int)command[7] << 16) |
1308c2ecf20Sopenharmony_ci		       ((unsigned int)command[8] <<  8) |
1318c2ecf20Sopenharmony_ci		       ((unsigned int)command[9]      )
1328c2ecf20Sopenharmony_ci		       );
1338c2ecf20Sopenharmony_ci		break;
1348c2ecf20Sopenharmony_ci	default:
1358c2ecf20Sopenharmony_ci		break;
1368c2ecf20Sopenharmony_ci	}
1378c2ecf20Sopenharmony_ci	printk("\n");
1388c2ecf20Sopenharmony_ci}
1398c2ecf20Sopenharmony_ci
1408c2ecf20Sopenharmony_cistatic void show_command(struct scsi_cmnd *SCpnt)
1418c2ecf20Sopenharmony_ci{
1428c2ecf20Sopenharmony_ci	print_commandk(SCpnt->cmnd);
1438c2ecf20Sopenharmony_ci}
1448c2ecf20Sopenharmony_ci
1458c2ecf20Sopenharmony_cistatic void show_busphase(unsigned char stat)
1468c2ecf20Sopenharmony_ci{
1478c2ecf20Sopenharmony_ci	switch(stat) {
1488c2ecf20Sopenharmony_ci	case BUSPHASE_COMMAND:
1498c2ecf20Sopenharmony_ci		printk( "BUSPHASE_COMMAND\n");
1508c2ecf20Sopenharmony_ci		break;
1518c2ecf20Sopenharmony_ci	case BUSPHASE_MESSAGE_IN:
1528c2ecf20Sopenharmony_ci		printk( "BUSPHASE_MESSAGE_IN\n");
1538c2ecf20Sopenharmony_ci		break;
1548c2ecf20Sopenharmony_ci	case BUSPHASE_MESSAGE_OUT:
1558c2ecf20Sopenharmony_ci		printk( "BUSPHASE_MESSAGE_OUT\n");
1568c2ecf20Sopenharmony_ci		break;
1578c2ecf20Sopenharmony_ci	case BUSPHASE_DATA_IN:
1588c2ecf20Sopenharmony_ci		printk( "BUSPHASE_DATA_IN\n");
1598c2ecf20Sopenharmony_ci		break;
1608c2ecf20Sopenharmony_ci	case BUSPHASE_DATA_OUT:
1618c2ecf20Sopenharmony_ci		printk( "BUSPHASE_DATA_OUT\n");
1628c2ecf20Sopenharmony_ci		break;
1638c2ecf20Sopenharmony_ci	case BUSPHASE_STATUS:
1648c2ecf20Sopenharmony_ci		printk( "BUSPHASE_STATUS\n");
1658c2ecf20Sopenharmony_ci		break;
1668c2ecf20Sopenharmony_ci	case BUSPHASE_SELECT:
1678c2ecf20Sopenharmony_ci		printk( "BUSPHASE_SELECT\n");
1688c2ecf20Sopenharmony_ci		break;
1698c2ecf20Sopenharmony_ci	default:
1708c2ecf20Sopenharmony_ci		printk( "BUSPHASE_other: 0x%x\n", stat);
1718c2ecf20Sopenharmony_ci		break;
1728c2ecf20Sopenharmony_ci	}
1738c2ecf20Sopenharmony_ci}
1748c2ecf20Sopenharmony_ci
1758c2ecf20Sopenharmony_cistatic void show_autophase(unsigned short i)
1768c2ecf20Sopenharmony_ci{
1778c2ecf20Sopenharmony_ci	printk("auto: 0x%x,", i);
1788c2ecf20Sopenharmony_ci
1798c2ecf20Sopenharmony_ci	if(i & COMMAND_PHASE) {
1808c2ecf20Sopenharmony_ci		printk(" cmd");
1818c2ecf20Sopenharmony_ci	}
1828c2ecf20Sopenharmony_ci	if(i & DATA_IN_PHASE) {
1838c2ecf20Sopenharmony_ci		printk(" din");
1848c2ecf20Sopenharmony_ci	}
1858c2ecf20Sopenharmony_ci	if(i & DATA_OUT_PHASE) {
1868c2ecf20Sopenharmony_ci		printk(" dout");
1878c2ecf20Sopenharmony_ci	}
1888c2ecf20Sopenharmony_ci	if(i & MSGOUT_PHASE) {
1898c2ecf20Sopenharmony_ci		printk(" mout");
1908c2ecf20Sopenharmony_ci	}
1918c2ecf20Sopenharmony_ci	if(i & STATUS_PHASE) {
1928c2ecf20Sopenharmony_ci		printk(" stat");
1938c2ecf20Sopenharmony_ci	}
1948c2ecf20Sopenharmony_ci	if(i & ILLEGAL_PHASE) {
1958c2ecf20Sopenharmony_ci		printk(" ill");
1968c2ecf20Sopenharmony_ci	}
1978c2ecf20Sopenharmony_ci	if(i & BUS_FREE_OCCUER) {
1988c2ecf20Sopenharmony_ci		printk(" bfree-o");
1998c2ecf20Sopenharmony_ci	}
2008c2ecf20Sopenharmony_ci	if(i & MSG_IN_OCCUER) {
2018c2ecf20Sopenharmony_ci		printk(" min-o");
2028c2ecf20Sopenharmony_ci	}
2038c2ecf20Sopenharmony_ci	if(i & MSG_OUT_OCCUER) {
2048c2ecf20Sopenharmony_ci		printk(" mout-o");
2058c2ecf20Sopenharmony_ci	}
2068c2ecf20Sopenharmony_ci	if(i & SELECTION_TIMEOUT) {
2078c2ecf20Sopenharmony_ci		printk(" sel");
2088c2ecf20Sopenharmony_ci	}
2098c2ecf20Sopenharmony_ci	if(i & MSGIN_00_VALID) {
2108c2ecf20Sopenharmony_ci		printk(" m0");
2118c2ecf20Sopenharmony_ci	}
2128c2ecf20Sopenharmony_ci	if(i & MSGIN_02_VALID) {
2138c2ecf20Sopenharmony_ci		printk(" m2");
2148c2ecf20Sopenharmony_ci	}
2158c2ecf20Sopenharmony_ci	if(i & MSGIN_03_VALID) {
2168c2ecf20Sopenharmony_ci		printk(" m3");
2178c2ecf20Sopenharmony_ci	}
2188c2ecf20Sopenharmony_ci	if(i & MSGIN_04_VALID) {
2198c2ecf20Sopenharmony_ci		printk(" m4");
2208c2ecf20Sopenharmony_ci	}
2218c2ecf20Sopenharmony_ci	if(i & AUTOSCSI_BUSY) {
2228c2ecf20Sopenharmony_ci		printk(" busy");
2238c2ecf20Sopenharmony_ci	}
2248c2ecf20Sopenharmony_ci
2258c2ecf20Sopenharmony_ci	printk("\n");
2268c2ecf20Sopenharmony_ci}
2278c2ecf20Sopenharmony_ci
2288c2ecf20Sopenharmony_cistatic void nsp32_print_register(int base)
2298c2ecf20Sopenharmony_ci{
2308c2ecf20Sopenharmony_ci	if (!(NSP32_DEBUG_MASK & NSP32_SPECIAL_PRINT_REGISTER))
2318c2ecf20Sopenharmony_ci		return;
2328c2ecf20Sopenharmony_ci
2338c2ecf20Sopenharmony_ci	printk("Phase=0x%x, ", nsp32_read1(base, SCSI_BUS_MONITOR));
2348c2ecf20Sopenharmony_ci	printk("OldPhase=0x%x, ", nsp32_index_read1(base, OLD_SCSI_PHASE));
2358c2ecf20Sopenharmony_ci	printk("syncreg=0x%x, ", nsp32_read1(base, SYNC_REG));
2368c2ecf20Sopenharmony_ci	printk("ackwidth=0x%x, ", nsp32_read1(base, ACK_WIDTH));
2378c2ecf20Sopenharmony_ci	printk("sgtpaddr=0x%lx, ", nsp32_read4(base, SGT_ADR));
2388c2ecf20Sopenharmony_ci	printk("scsioutlatch=0x%x, ", nsp32_read1(base, SCSI_OUT_LATCH_TARGET_ID));
2398c2ecf20Sopenharmony_ci	printk("msgout=0x%lx, ", nsp32_read4(base, SCSI_MSG_OUT));
2408c2ecf20Sopenharmony_ci	printk("miscrd=0x%x, ", nsp32_index_read2(base, MISC_WR));
2418c2ecf20Sopenharmony_ci	printk("seltimeout=0x%x, ", nsp32_read2(base, SEL_TIME_OUT));
2428c2ecf20Sopenharmony_ci	printk("sreqrate=0x%x, ", nsp32_read1(base, SREQ_SMPL_RATE));
2438c2ecf20Sopenharmony_ci	printk("transStatus=0x%x, ", nsp32_read2(base, TRANSFER_STATUS));
2448c2ecf20Sopenharmony_ci	printk("reselectid=0x%x, ", nsp32_read2(base, COMMAND_CONTROL));
2458c2ecf20Sopenharmony_ci	printk("arbit=0x%x, ", nsp32_read1(base, ARBIT_STATUS));
2468c2ecf20Sopenharmony_ci	printk("BmStart=0x%lx, ", nsp32_read4(base, BM_START_ADR));
2478c2ecf20Sopenharmony_ci	printk("BmCount=0x%lx, ", nsp32_read4(base, BM_CNT));
2488c2ecf20Sopenharmony_ci	printk("SackCnt=0x%lx, ", nsp32_read4(base, SACK_CNT));
2498c2ecf20Sopenharmony_ci	printk("SReqCnt=0x%lx, ", nsp32_read4(base, SREQ_CNT));
2508c2ecf20Sopenharmony_ci	printk("SavedSackCnt=0x%lx, ", nsp32_read4(base, SAVED_SACK_CNT));
2518c2ecf20Sopenharmony_ci	printk("ScsiBusControl=0x%x, ", nsp32_read1(base, SCSI_BUS_CONTROL));
2528c2ecf20Sopenharmony_ci	printk("FifoRestCnt=0x%x, ", nsp32_read2(base, FIFO_REST_CNT));
2538c2ecf20Sopenharmony_ci	printk("CdbIn=0x%x, ", nsp32_read1(base, SCSI_CSB_IN));
2548c2ecf20Sopenharmony_ci	printk("\n");
2558c2ecf20Sopenharmony_ci
2568c2ecf20Sopenharmony_ci	if (0) {
2578c2ecf20Sopenharmony_ci		printk("execph=0x%x, ", nsp32_read2(base, SCSI_EXECUTE_PHASE));
2588c2ecf20Sopenharmony_ci		printk("IrqStatus=0x%x, ", nsp32_read2(base, IRQ_STATUS));
2598c2ecf20Sopenharmony_ci		printk("\n");
2608c2ecf20Sopenharmony_ci	}
2618c2ecf20Sopenharmony_ci}
2628c2ecf20Sopenharmony_ci
2638c2ecf20Sopenharmony_ci/* end */
264