11da177e4SLinus Torvalds /*
21da177e4SLinus Torvalds * Workbit NinjaSCSI-32Bi/UDE PCI/CardBus SCSI Host Bus Adapter driver
31da177e4SLinus Torvalds * Debug routine
41da177e4SLinus Torvalds *
51da177e4SLinus Torvalds * This software may be used and distributed according to the terms of
61da177e4SLinus Torvalds * the GNU General Public License.
71da177e4SLinus Torvalds */
81da177e4SLinus Torvalds
91da177e4SLinus Torvalds /*
101da177e4SLinus Torvalds * Show the command data of a command
111da177e4SLinus Torvalds */
121da177e4SLinus Torvalds static const char unknown[] = "UNKNOWN";
131da177e4SLinus Torvalds
141da177e4SLinus Torvalds static const char * group_0_commands[] = {
151da177e4SLinus Torvalds /* 00-03 */ "Test Unit Ready", "Rezero Unit", unknown, "Request Sense",
1670f23fd6SJustin P. Mattock /* 04-07 */ "Format Unit", "Read Block Limits", unknown, "Reassign Blocks",
171da177e4SLinus Torvalds /* 08-0d */ "Read (6)", unknown, "Write (6)", "Seek (6)", unknown, unknown,
181da177e4SLinus Torvalds /* 0e-12 */ unknown, "Read Reverse", "Write Filemarks", "Space", "Inquiry",
191da177e4SLinus Torvalds /* 13-16 */ unknown, "Recover Buffered Data", "Mode Select", "Reserve",
201da177e4SLinus Torvalds /* 17-1b */ "Release", "Copy", "Erase", "Mode Sense", "Start/Stop Unit",
211da177e4SLinus Torvalds /* 1c-1d */ "Receive Diagnostic", "Send Diagnostic",
221da177e4SLinus Torvalds /* 1e-1f */ "Prevent/Allow Medium Removal", unknown,
231da177e4SLinus Torvalds };
241da177e4SLinus Torvalds
251da177e4SLinus Torvalds
261da177e4SLinus Torvalds static const char *group_1_commands[] = {
271da177e4SLinus Torvalds /* 20-22 */ unknown, unknown, unknown,
281da177e4SLinus Torvalds /* 23-28 */ unknown, unknown, "Read Capacity", unknown, unknown, "Read (10)",
291da177e4SLinus Torvalds /* 29-2d */ unknown, "Write (10)", "Seek (10)", unknown, unknown,
301da177e4SLinus Torvalds /* 2e-31 */ "Write Verify","Verify", "Search High", "Search Equal",
311da177e4SLinus Torvalds /* 32-34 */ "Search Low", "Set Limits", "Prefetch or Read Position",
321da177e4SLinus Torvalds /* 35-37 */ "Synchronize Cache","Lock/Unlock Cache", "Read Defect Data",
331da177e4SLinus Torvalds /* 38-3c */ "Medium Scan", "Compare","Copy Verify", "Write Buffer", "Read Buffer",
341da177e4SLinus Torvalds /* 3d-3f */ "Update Block", "Read Long", "Write Long",
351da177e4SLinus Torvalds };
361da177e4SLinus Torvalds
371da177e4SLinus Torvalds
381da177e4SLinus Torvalds static const char *group_2_commands[] = {
391da177e4SLinus Torvalds /* 40-41 */ "Change Definition", "Write Same",
401da177e4SLinus Torvalds /* 42-48 */ "Read Sub-Ch(cd)", "Read TOC", "Read Header(cd)", "Play Audio(cd)", unknown, "Play Audio MSF(cd)", "Play Audio Track/Index(cd)",
411da177e4SLinus Torvalds /* 49-4f */ "Play Track Relative(10)(cd)", unknown, "Pause/Resume(cd)", "Log Select", "Log Sense", unknown, unknown,
421da177e4SLinus Torvalds /* 50-55 */ unknown, unknown, unknown, unknown, unknown, "Mode Select (10)",
431da177e4SLinus Torvalds /* 56-5b */ unknown, unknown, unknown, unknown, "Mode Sense (10)", unknown,
441da177e4SLinus Torvalds /* 5c-5f */ unknown, unknown, unknown,
451da177e4SLinus Torvalds };
461da177e4SLinus Torvalds
471da177e4SLinus Torvalds #define group(opcode) (((opcode) >> 5) & 7)
481da177e4SLinus Torvalds
491da177e4SLinus Torvalds #define RESERVED_GROUP 0
501da177e4SLinus Torvalds #define VENDOR_GROUP 1
511da177e4SLinus Torvalds #define NOTEXT_GROUP 2
521da177e4SLinus Torvalds
531da177e4SLinus Torvalds static const char **commands[] = {
541da177e4SLinus Torvalds group_0_commands, group_1_commands, group_2_commands,
551da177e4SLinus Torvalds (const char **) RESERVED_GROUP, (const char **) RESERVED_GROUP,
561da177e4SLinus Torvalds (const char **) NOTEXT_GROUP, (const char **) VENDOR_GROUP,
571da177e4SLinus Torvalds (const char **) VENDOR_GROUP
581da177e4SLinus Torvalds };
591da177e4SLinus Torvalds
601da177e4SLinus Torvalds static const char reserved[] = "RESERVED";
611da177e4SLinus Torvalds static const char vendor[] = "VENDOR SPECIFIC";
621da177e4SLinus Torvalds
print_opcodek(unsigned char opcode)631da177e4SLinus Torvalds static void print_opcodek(unsigned char opcode)
641da177e4SLinus Torvalds {
651da177e4SLinus Torvalds const char **table = commands[ group(opcode) ];
661da177e4SLinus Torvalds
671da177e4SLinus Torvalds switch ((unsigned long) table) {
681da177e4SLinus Torvalds case RESERVED_GROUP:
691da177e4SLinus Torvalds printk("%s[%02x] ", reserved, opcode);
701da177e4SLinus Torvalds break;
711da177e4SLinus Torvalds case NOTEXT_GROUP:
721da177e4SLinus Torvalds printk("%s(notext)[%02x] ", unknown, opcode);
731da177e4SLinus Torvalds break;
741da177e4SLinus Torvalds case VENDOR_GROUP:
751da177e4SLinus Torvalds printk("%s[%02x] ", vendor, opcode);
761da177e4SLinus Torvalds break;
771da177e4SLinus Torvalds default:
781da177e4SLinus Torvalds if (table[opcode & 0x1f] != unknown)
791da177e4SLinus Torvalds printk("%s[%02x] ", table[opcode & 0x1f], opcode);
801da177e4SLinus Torvalds else
811da177e4SLinus Torvalds printk("%s[%02x] ", unknown, opcode);
821da177e4SLinus Torvalds break;
831da177e4SLinus Torvalds }
841da177e4SLinus Torvalds }
851da177e4SLinus Torvalds
print_commandk(unsigned char * command)861da177e4SLinus Torvalds static void print_commandk (unsigned char *command)
871da177e4SLinus Torvalds {
881da177e4SLinus Torvalds int i,s;
891da177e4SLinus Torvalds // printk(KERN_DEBUG);
901da177e4SLinus Torvalds print_opcodek(command[0]);
91cadbd4a5SHarvey Harrison /*printk(KERN_DEBUG "%s ", __func__);*/
921da177e4SLinus Torvalds if ((command[0] >> 5) == 6 ||
931da177e4SLinus Torvalds (command[0] >> 5) == 7 ) {
941da177e4SLinus Torvalds s = 12; /* vender specific */
951da177e4SLinus Torvalds } else {
961da177e4SLinus Torvalds s = COMMAND_SIZE(command[0]);
971da177e4SLinus Torvalds }
981da177e4SLinus Torvalds
991da177e4SLinus Torvalds for ( i = 1; i < s; ++i) {
1001da177e4SLinus Torvalds printk("%02x ", command[i]);
1011da177e4SLinus Torvalds }
1021da177e4SLinus Torvalds
1031da177e4SLinus Torvalds switch (s) {
1041da177e4SLinus Torvalds case 6:
1051da177e4SLinus Torvalds printk("LBA=%d len=%d",
1061da177e4SLinus Torvalds (((unsigned int)command[1] & 0x0f) << 16) |
1071da177e4SLinus Torvalds ( (unsigned int)command[2] << 8) |
1081da177e4SLinus Torvalds ( (unsigned int)command[3] ),
1091da177e4SLinus Torvalds (unsigned int)command[4]
1101da177e4SLinus Torvalds );
1111da177e4SLinus Torvalds break;
1121da177e4SLinus Torvalds case 10:
1131da177e4SLinus Torvalds printk("LBA=%d len=%d",
1141da177e4SLinus Torvalds ((unsigned int)command[2] << 24) |
1151da177e4SLinus Torvalds ((unsigned int)command[3] << 16) |
1161da177e4SLinus Torvalds ((unsigned int)command[4] << 8) |
1171da177e4SLinus Torvalds ((unsigned int)command[5] ),
1181da177e4SLinus Torvalds ((unsigned int)command[7] << 8) |
1191da177e4SLinus Torvalds ((unsigned int)command[8] )
1201da177e4SLinus Torvalds );
1211da177e4SLinus Torvalds break;
1221da177e4SLinus Torvalds case 12:
1231da177e4SLinus Torvalds printk("LBA=%d len=%d",
1241da177e4SLinus Torvalds ((unsigned int)command[2] << 24) |
1251da177e4SLinus Torvalds ((unsigned int)command[3] << 16) |
1261da177e4SLinus Torvalds ((unsigned int)command[4] << 8) |
1271da177e4SLinus Torvalds ((unsigned int)command[5] ),
1281da177e4SLinus Torvalds ((unsigned int)command[6] << 24) |
1291da177e4SLinus Torvalds ((unsigned int)command[7] << 16) |
1301da177e4SLinus Torvalds ((unsigned int)command[8] << 8) |
1311da177e4SLinus Torvalds ((unsigned int)command[9] )
1321da177e4SLinus Torvalds );
1331da177e4SLinus Torvalds break;
1341da177e4SLinus Torvalds default:
1351da177e4SLinus Torvalds break;
1361da177e4SLinus Torvalds }
1371da177e4SLinus Torvalds printk("\n");
1381da177e4SLinus Torvalds }
1391da177e4SLinus Torvalds
show_command(struct scsi_cmnd * SCpnt)140*91ebc1faSJohannes Thumshirn static void show_command(struct scsi_cmnd *SCpnt)
1411da177e4SLinus Torvalds {
1421da177e4SLinus Torvalds print_commandk(SCpnt->cmnd);
1431da177e4SLinus Torvalds }
1441da177e4SLinus Torvalds
show_busphase(unsigned char stat)1451da177e4SLinus Torvalds static void show_busphase(unsigned char stat)
1461da177e4SLinus Torvalds {
1471da177e4SLinus Torvalds switch(stat) {
1481da177e4SLinus Torvalds case BUSPHASE_COMMAND:
1491da177e4SLinus Torvalds printk( "BUSPHASE_COMMAND\n");
1501da177e4SLinus Torvalds break;
1511da177e4SLinus Torvalds case BUSPHASE_MESSAGE_IN:
1521da177e4SLinus Torvalds printk( "BUSPHASE_MESSAGE_IN\n");
1531da177e4SLinus Torvalds break;
1541da177e4SLinus Torvalds case BUSPHASE_MESSAGE_OUT:
1551da177e4SLinus Torvalds printk( "BUSPHASE_MESSAGE_OUT\n");
1561da177e4SLinus Torvalds break;
1571da177e4SLinus Torvalds case BUSPHASE_DATA_IN:
1581da177e4SLinus Torvalds printk( "BUSPHASE_DATA_IN\n");
1591da177e4SLinus Torvalds break;
1601da177e4SLinus Torvalds case BUSPHASE_DATA_OUT:
1611da177e4SLinus Torvalds printk( "BUSPHASE_DATA_OUT\n");
1621da177e4SLinus Torvalds break;
1631da177e4SLinus Torvalds case BUSPHASE_STATUS:
1641da177e4SLinus Torvalds printk( "BUSPHASE_STATUS\n");
1651da177e4SLinus Torvalds break;
1661da177e4SLinus Torvalds case BUSPHASE_SELECT:
1671da177e4SLinus Torvalds printk( "BUSPHASE_SELECT\n");
1681da177e4SLinus Torvalds break;
1691da177e4SLinus Torvalds default:
1701da177e4SLinus Torvalds printk( "BUSPHASE_other: 0x%x\n", stat);
1711da177e4SLinus Torvalds break;
1721da177e4SLinus Torvalds }
1731da177e4SLinus Torvalds }
1741da177e4SLinus Torvalds
show_autophase(unsigned short i)1751da177e4SLinus Torvalds static void show_autophase(unsigned short i)
1761da177e4SLinus Torvalds {
1771da177e4SLinus Torvalds printk("auto: 0x%x,", i);
1781da177e4SLinus Torvalds
1791da177e4SLinus Torvalds if(i & COMMAND_PHASE) {
1801da177e4SLinus Torvalds printk(" cmd");
1811da177e4SLinus Torvalds }
1821da177e4SLinus Torvalds if(i & DATA_IN_PHASE) {
1831da177e4SLinus Torvalds printk(" din");
1841da177e4SLinus Torvalds }
1851da177e4SLinus Torvalds if(i & DATA_OUT_PHASE) {
1861da177e4SLinus Torvalds printk(" dout");
1871da177e4SLinus Torvalds }
1881da177e4SLinus Torvalds if(i & MSGOUT_PHASE) {
1891da177e4SLinus Torvalds printk(" mout");
1901da177e4SLinus Torvalds }
1911da177e4SLinus Torvalds if(i & STATUS_PHASE) {
1921da177e4SLinus Torvalds printk(" stat");
1931da177e4SLinus Torvalds }
1941da177e4SLinus Torvalds if(i & ILLEGAL_PHASE) {
1951da177e4SLinus Torvalds printk(" ill");
1961da177e4SLinus Torvalds }
1971da177e4SLinus Torvalds if(i & BUS_FREE_OCCUER) {
1981da177e4SLinus Torvalds printk(" bfree-o");
1991da177e4SLinus Torvalds }
2001da177e4SLinus Torvalds if(i & MSG_IN_OCCUER) {
2011da177e4SLinus Torvalds printk(" min-o");
2021da177e4SLinus Torvalds }
2031da177e4SLinus Torvalds if(i & MSG_OUT_OCCUER) {
2041da177e4SLinus Torvalds printk(" mout-o");
2051da177e4SLinus Torvalds }
2061da177e4SLinus Torvalds if(i & SELECTION_TIMEOUT) {
2071da177e4SLinus Torvalds printk(" sel");
2081da177e4SLinus Torvalds }
2091da177e4SLinus Torvalds if(i & MSGIN_00_VALID) {
2101da177e4SLinus Torvalds printk(" m0");
2111da177e4SLinus Torvalds }
2121da177e4SLinus Torvalds if(i & MSGIN_02_VALID) {
2131da177e4SLinus Torvalds printk(" m2");
2141da177e4SLinus Torvalds }
2151da177e4SLinus Torvalds if(i & MSGIN_03_VALID) {
2161da177e4SLinus Torvalds printk(" m3");
2171da177e4SLinus Torvalds }
2181da177e4SLinus Torvalds if(i & MSGIN_04_VALID) {
2191da177e4SLinus Torvalds printk(" m4");
2201da177e4SLinus Torvalds }
2211da177e4SLinus Torvalds if(i & AUTOSCSI_BUSY) {
2221da177e4SLinus Torvalds printk(" busy");
2231da177e4SLinus Torvalds }
2241da177e4SLinus Torvalds
2251da177e4SLinus Torvalds printk("\n");
2261da177e4SLinus Torvalds }
2271da177e4SLinus Torvalds
nsp32_print_register(int base)2281da177e4SLinus Torvalds static void nsp32_print_register(int base)
2291da177e4SLinus Torvalds {
2301da177e4SLinus Torvalds if (!(NSP32_DEBUG_MASK & NSP32_SPECIAL_PRINT_REGISTER))
2311da177e4SLinus Torvalds return;
2321da177e4SLinus Torvalds
2331da177e4SLinus Torvalds printk("Phase=0x%x, ", nsp32_read1(base, SCSI_BUS_MONITOR));
2341da177e4SLinus Torvalds printk("OldPhase=0x%x, ", nsp32_index_read1(base, OLD_SCSI_PHASE));
2351da177e4SLinus Torvalds printk("syncreg=0x%x, ", nsp32_read1(base, SYNC_REG));
2361da177e4SLinus Torvalds printk("ackwidth=0x%x, ", nsp32_read1(base, ACK_WIDTH));
2371da177e4SLinus Torvalds printk("sgtpaddr=0x%lx, ", nsp32_read4(base, SGT_ADR));
2381da177e4SLinus Torvalds printk("scsioutlatch=0x%x, ", nsp32_read1(base, SCSI_OUT_LATCH_TARGET_ID));
2391da177e4SLinus Torvalds printk("msgout=0x%lx, ", nsp32_read4(base, SCSI_MSG_OUT));
2401da177e4SLinus Torvalds printk("miscrd=0x%x, ", nsp32_index_read2(base, MISC_WR));
2411da177e4SLinus Torvalds printk("seltimeout=0x%x, ", nsp32_read2(base, SEL_TIME_OUT));
2421da177e4SLinus Torvalds printk("sreqrate=0x%x, ", nsp32_read1(base, SREQ_SMPL_RATE));
2431da177e4SLinus Torvalds printk("transStatus=0x%x, ", nsp32_read2(base, TRANSFER_STATUS));
2441da177e4SLinus Torvalds printk("reselectid=0x%x, ", nsp32_read2(base, COMMAND_CONTROL));
2451da177e4SLinus Torvalds printk("arbit=0x%x, ", nsp32_read1(base, ARBIT_STATUS));
2461da177e4SLinus Torvalds printk("BmStart=0x%lx, ", nsp32_read4(base, BM_START_ADR));
2471da177e4SLinus Torvalds printk("BmCount=0x%lx, ", nsp32_read4(base, BM_CNT));
2481da177e4SLinus Torvalds printk("SackCnt=0x%lx, ", nsp32_read4(base, SACK_CNT));
2491da177e4SLinus Torvalds printk("SReqCnt=0x%lx, ", nsp32_read4(base, SREQ_CNT));
2501da177e4SLinus Torvalds printk("SavedSackCnt=0x%lx, ", nsp32_read4(base, SAVED_SACK_CNT));
2511da177e4SLinus Torvalds printk("ScsiBusControl=0x%x, ", nsp32_read1(base, SCSI_BUS_CONTROL));
2521da177e4SLinus Torvalds printk("FifoRestCnt=0x%x, ", nsp32_read2(base, FIFO_REST_CNT));
2531da177e4SLinus Torvalds printk("CdbIn=0x%x, ", nsp32_read1(base, SCSI_CSB_IN));
2541da177e4SLinus Torvalds printk("\n");
2551da177e4SLinus Torvalds
2561da177e4SLinus Torvalds if (0) {
2571da177e4SLinus Torvalds printk("execph=0x%x, ", nsp32_read2(base, SCSI_EXECUTE_PHASE));
2581da177e4SLinus Torvalds printk("IrqStatus=0x%x, ", nsp32_read2(base, IRQ_STATUS));
2591da177e4SLinus Torvalds printk("\n");
2601da177e4SLinus Torvalds }
2611da177e4SLinus Torvalds }
2621da177e4SLinus Torvalds
2631da177e4SLinus Torvalds /* end */
264