| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | /* | 
|  | 2 | * Workbit NinjaSCSI-32Bi/UDE PCI/CardBus SCSI Host Bus Adapter driver | 
|  | 3 | * Debug routine | 
|  | 4 | * | 
|  | 5 | * This software may be used and distributed according to the terms of | 
|  | 6 | * the GNU General Public License. | 
|  | 7 | */ | 
|  | 8 |  | 
|  | 9 | /* | 
|  | 10 | * Show the command data of a command | 
|  | 11 | */ | 
|  | 12 | static const char unknown[] = "UNKNOWN"; | 
|  | 13 |  | 
|  | 14 | static const char * group_0_commands[] = { | 
|  | 15 | /* 00-03 */ "Test Unit Ready", "Rezero Unit", unknown, "Request Sense", | 
| Justin P. Mattock | 70f23fd | 2011-05-10 10:16:21 +0200 | [diff] [blame] | 16 | /* 04-07 */ "Format Unit", "Read Block Limits", unknown, "Reassign Blocks", | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 17 | /* 08-0d */ "Read (6)", unknown, "Write (6)", "Seek (6)", unknown, unknown, | 
|  | 18 | /* 0e-12 */ unknown, "Read Reverse", "Write Filemarks", "Space", "Inquiry", | 
|  | 19 | /* 13-16 */ unknown, "Recover Buffered Data", "Mode Select", "Reserve", | 
|  | 20 | /* 17-1b */ "Release", "Copy", "Erase", "Mode Sense", "Start/Stop Unit", | 
|  | 21 | /* 1c-1d */ "Receive Diagnostic", "Send Diagnostic", | 
|  | 22 | /* 1e-1f */ "Prevent/Allow Medium Removal", unknown, | 
|  | 23 | }; | 
|  | 24 |  | 
|  | 25 |  | 
|  | 26 | static const char *group_1_commands[] = { | 
|  | 27 | /* 20-22 */  unknown, unknown, unknown, | 
|  | 28 | /* 23-28 */ unknown, unknown, "Read Capacity", unknown, unknown, "Read (10)", | 
|  | 29 | /* 29-2d */ unknown, "Write (10)", "Seek (10)", unknown, unknown, | 
|  | 30 | /* 2e-31 */ "Write Verify","Verify", "Search High", "Search Equal", | 
|  | 31 | /* 32-34 */ "Search Low", "Set Limits", "Prefetch or Read Position", | 
|  | 32 | /* 35-37 */ "Synchronize Cache","Lock/Unlock Cache", "Read Defect Data", | 
|  | 33 | /* 38-3c */ "Medium Scan", "Compare","Copy Verify", "Write Buffer", "Read Buffer", | 
|  | 34 | /* 3d-3f */ "Update Block", "Read Long",  "Write Long", | 
|  | 35 | }; | 
|  | 36 |  | 
|  | 37 |  | 
|  | 38 | static const char *group_2_commands[] = { | 
|  | 39 | /* 40-41 */ "Change Definition", "Write Same", | 
|  | 40 | /* 42-48 */ "Read Sub-Ch(cd)", "Read TOC", "Read Header(cd)", "Play Audio(cd)", unknown, "Play Audio MSF(cd)", "Play Audio Track/Index(cd)", | 
|  | 41 | /* 49-4f */ "Play Track Relative(10)(cd)", unknown, "Pause/Resume(cd)", "Log Select", "Log Sense", unknown, unknown, | 
|  | 42 | /* 50-55 */ unknown, unknown, unknown, unknown, unknown, "Mode Select (10)", | 
|  | 43 | /* 56-5b */ unknown, unknown, unknown, unknown, "Mode Sense (10)", unknown, | 
|  | 44 | /* 5c-5f */ unknown, unknown, unknown, | 
|  | 45 | }; | 
|  | 46 |  | 
|  | 47 | #define group(opcode) (((opcode) >> 5) & 7) | 
|  | 48 |  | 
|  | 49 | #define RESERVED_GROUP  0 | 
|  | 50 | #define VENDOR_GROUP    1 | 
|  | 51 | #define NOTEXT_GROUP    2 | 
|  | 52 |  | 
|  | 53 | static const char **commands[] = { | 
|  | 54 | group_0_commands, group_1_commands, group_2_commands, | 
|  | 55 | (const char **) RESERVED_GROUP, (const char **) RESERVED_GROUP, | 
|  | 56 | (const char **) NOTEXT_GROUP, (const char **) VENDOR_GROUP, | 
|  | 57 | (const char **) VENDOR_GROUP | 
|  | 58 | }; | 
|  | 59 |  | 
|  | 60 | static const char reserved[] = "RESERVED"; | 
|  | 61 | static const char vendor[] = "VENDOR SPECIFIC"; | 
|  | 62 |  | 
|  | 63 | static void print_opcodek(unsigned char opcode) | 
|  | 64 | { | 
|  | 65 | const char **table = commands[ group(opcode) ]; | 
|  | 66 |  | 
|  | 67 | switch ((unsigned long) table) { | 
|  | 68 | case RESERVED_GROUP: | 
|  | 69 | printk("%s[%02x] ", reserved, opcode); | 
|  | 70 | break; | 
|  | 71 | case NOTEXT_GROUP: | 
|  | 72 | printk("%s(notext)[%02x] ", unknown, opcode); | 
|  | 73 | break; | 
|  | 74 | case VENDOR_GROUP: | 
|  | 75 | printk("%s[%02x] ", vendor, opcode); | 
|  | 76 | break; | 
|  | 77 | default: | 
|  | 78 | if (table[opcode & 0x1f] != unknown) | 
|  | 79 | printk("%s[%02x] ", table[opcode & 0x1f], opcode); | 
|  | 80 | else | 
|  | 81 | printk("%s[%02x] ", unknown, opcode); | 
|  | 82 | break; | 
|  | 83 | } | 
|  | 84 | } | 
|  | 85 |  | 
|  | 86 | static void print_commandk (unsigned char *command) | 
|  | 87 | { | 
|  | 88 | int i,s; | 
|  | 89 | //	printk(KERN_DEBUG); | 
|  | 90 | print_opcodek(command[0]); | 
| Harvey Harrison | cadbd4a | 2008-07-03 23:47:27 -0700 | [diff] [blame] | 91 | /*printk(KERN_DEBUG "%s ", __func__);*/ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 92 | if ((command[0] >> 5) == 6 || | 
|  | 93 | (command[0] >> 5) == 7 ) { | 
|  | 94 | s = 12; /* vender specific */ | 
|  | 95 | } else { | 
|  | 96 | s = COMMAND_SIZE(command[0]); | 
|  | 97 | } | 
|  | 98 |  | 
|  | 99 | for ( i = 1; i < s; ++i) { | 
|  | 100 | printk("%02x ", command[i]); | 
|  | 101 | } | 
|  | 102 |  | 
|  | 103 | switch (s) { | 
|  | 104 | case 6: | 
|  | 105 | printk("LBA=%d len=%d", | 
|  | 106 | (((unsigned int)command[1] & 0x0f) << 16) | | 
|  | 107 | ( (unsigned int)command[2]         <<  8) | | 
|  | 108 | ( (unsigned int)command[3]              ), | 
|  | 109 | (unsigned int)command[4] | 
|  | 110 | ); | 
|  | 111 | break; | 
|  | 112 | case 10: | 
|  | 113 | printk("LBA=%d len=%d", | 
|  | 114 | ((unsigned int)command[2] << 24) | | 
|  | 115 | ((unsigned int)command[3] << 16) | | 
|  | 116 | ((unsigned int)command[4] <<  8) | | 
|  | 117 | ((unsigned int)command[5]      ), | 
|  | 118 | ((unsigned int)command[7] <<  8) | | 
|  | 119 | ((unsigned int)command[8]      ) | 
|  | 120 | ); | 
|  | 121 | break; | 
|  | 122 | case 12: | 
|  | 123 | printk("LBA=%d len=%d", | 
|  | 124 | ((unsigned int)command[2] << 24) | | 
|  | 125 | ((unsigned int)command[3] << 16) | | 
|  | 126 | ((unsigned int)command[4] <<  8) | | 
|  | 127 | ((unsigned int)command[5]      ), | 
|  | 128 | ((unsigned int)command[6] << 24) | | 
|  | 129 | ((unsigned int)command[7] << 16) | | 
|  | 130 | ((unsigned int)command[8] <<  8) | | 
|  | 131 | ((unsigned int)command[9]      ) | 
|  | 132 | ); | 
|  | 133 | break; | 
|  | 134 | default: | 
|  | 135 | break; | 
|  | 136 | } | 
|  | 137 | printk("\n"); | 
|  | 138 | } | 
|  | 139 |  | 
|  | 140 | static void show_command(Scsi_Cmnd *SCpnt) | 
|  | 141 | { | 
|  | 142 | print_commandk(SCpnt->cmnd); | 
|  | 143 | } | 
|  | 144 |  | 
|  | 145 | static void show_busphase(unsigned char stat) | 
|  | 146 | { | 
|  | 147 | switch(stat) { | 
|  | 148 | case BUSPHASE_COMMAND: | 
|  | 149 | printk( "BUSPHASE_COMMAND\n"); | 
|  | 150 | break; | 
|  | 151 | case BUSPHASE_MESSAGE_IN: | 
|  | 152 | printk( "BUSPHASE_MESSAGE_IN\n"); | 
|  | 153 | break; | 
|  | 154 | case BUSPHASE_MESSAGE_OUT: | 
|  | 155 | printk( "BUSPHASE_MESSAGE_OUT\n"); | 
|  | 156 | break; | 
|  | 157 | case BUSPHASE_DATA_IN: | 
|  | 158 | printk( "BUSPHASE_DATA_IN\n"); | 
|  | 159 | break; | 
|  | 160 | case BUSPHASE_DATA_OUT: | 
|  | 161 | printk( "BUSPHASE_DATA_OUT\n"); | 
|  | 162 | break; | 
|  | 163 | case BUSPHASE_STATUS: | 
|  | 164 | printk( "BUSPHASE_STATUS\n"); | 
|  | 165 | break; | 
|  | 166 | case BUSPHASE_SELECT: | 
|  | 167 | printk( "BUSPHASE_SELECT\n"); | 
|  | 168 | break; | 
|  | 169 | default: | 
|  | 170 | printk( "BUSPHASE_other: 0x%x\n", stat); | 
|  | 171 | break; | 
|  | 172 | } | 
|  | 173 | } | 
|  | 174 |  | 
|  | 175 | static void show_autophase(unsigned short i) | 
|  | 176 | { | 
|  | 177 | printk("auto: 0x%x,", i); | 
|  | 178 |  | 
|  | 179 | if(i & COMMAND_PHASE) { | 
|  | 180 | printk(" cmd"); | 
|  | 181 | } | 
|  | 182 | if(i & DATA_IN_PHASE) { | 
|  | 183 | printk(" din"); | 
|  | 184 | } | 
|  | 185 | if(i & DATA_OUT_PHASE) { | 
|  | 186 | printk(" dout"); | 
|  | 187 | } | 
|  | 188 | if(i & MSGOUT_PHASE) { | 
|  | 189 | printk(" mout"); | 
|  | 190 | } | 
|  | 191 | if(i & STATUS_PHASE) { | 
|  | 192 | printk(" stat"); | 
|  | 193 | } | 
|  | 194 | if(i & ILLEGAL_PHASE) { | 
|  | 195 | printk(" ill"); | 
|  | 196 | } | 
|  | 197 | if(i & BUS_FREE_OCCUER) { | 
|  | 198 | printk(" bfree-o"); | 
|  | 199 | } | 
|  | 200 | if(i & MSG_IN_OCCUER) { | 
|  | 201 | printk(" min-o"); | 
|  | 202 | } | 
|  | 203 | if(i & MSG_OUT_OCCUER) { | 
|  | 204 | printk(" mout-o"); | 
|  | 205 | } | 
|  | 206 | if(i & SELECTION_TIMEOUT) { | 
|  | 207 | printk(" sel"); | 
|  | 208 | } | 
|  | 209 | if(i & MSGIN_00_VALID) { | 
|  | 210 | printk(" m0"); | 
|  | 211 | } | 
|  | 212 | if(i & MSGIN_02_VALID) { | 
|  | 213 | printk(" m2"); | 
|  | 214 | } | 
|  | 215 | if(i & MSGIN_03_VALID) { | 
|  | 216 | printk(" m3"); | 
|  | 217 | } | 
|  | 218 | if(i & MSGIN_04_VALID) { | 
|  | 219 | printk(" m4"); | 
|  | 220 | } | 
|  | 221 | if(i & AUTOSCSI_BUSY) { | 
|  | 222 | printk(" busy"); | 
|  | 223 | } | 
|  | 224 |  | 
|  | 225 | printk("\n"); | 
|  | 226 | } | 
|  | 227 |  | 
|  | 228 | static void nsp32_print_register(int base) | 
|  | 229 | { | 
|  | 230 | if (!(NSP32_DEBUG_MASK & NSP32_SPECIAL_PRINT_REGISTER)) | 
|  | 231 | return; | 
|  | 232 |  | 
|  | 233 | printk("Phase=0x%x, ", nsp32_read1(base, SCSI_BUS_MONITOR)); | 
|  | 234 | printk("OldPhase=0x%x, ", nsp32_index_read1(base, OLD_SCSI_PHASE)); | 
|  | 235 | printk("syncreg=0x%x, ", nsp32_read1(base, SYNC_REG)); | 
|  | 236 | printk("ackwidth=0x%x, ", nsp32_read1(base, ACK_WIDTH)); | 
|  | 237 | printk("sgtpaddr=0x%lx, ", nsp32_read4(base, SGT_ADR)); | 
|  | 238 | printk("scsioutlatch=0x%x, ", nsp32_read1(base, SCSI_OUT_LATCH_TARGET_ID)); | 
|  | 239 | printk("msgout=0x%lx, ", nsp32_read4(base, SCSI_MSG_OUT)); | 
|  | 240 | printk("miscrd=0x%x, ", nsp32_index_read2(base, MISC_WR)); | 
|  | 241 | printk("seltimeout=0x%x, ", nsp32_read2(base, SEL_TIME_OUT)); | 
|  | 242 | printk("sreqrate=0x%x, ", nsp32_read1(base, SREQ_SMPL_RATE)); | 
|  | 243 | printk("transStatus=0x%x, ", nsp32_read2(base, TRANSFER_STATUS)); | 
|  | 244 | printk("reselectid=0x%x, ", nsp32_read2(base, COMMAND_CONTROL)); | 
|  | 245 | printk("arbit=0x%x, ", nsp32_read1(base, ARBIT_STATUS)); | 
|  | 246 | printk("BmStart=0x%lx, ", nsp32_read4(base, BM_START_ADR)); | 
|  | 247 | printk("BmCount=0x%lx, ", nsp32_read4(base, BM_CNT)); | 
|  | 248 | printk("SackCnt=0x%lx, ", nsp32_read4(base, SACK_CNT)); | 
|  | 249 | printk("SReqCnt=0x%lx, ", nsp32_read4(base, SREQ_CNT)); | 
|  | 250 | printk("SavedSackCnt=0x%lx, ", nsp32_read4(base, SAVED_SACK_CNT)); | 
|  | 251 | printk("ScsiBusControl=0x%x, ", nsp32_read1(base, SCSI_BUS_CONTROL)); | 
|  | 252 | printk("FifoRestCnt=0x%x, ", nsp32_read2(base, FIFO_REST_CNT)); | 
|  | 253 | printk("CdbIn=0x%x, ", nsp32_read1(base, SCSI_CSB_IN)); | 
|  | 254 | printk("\n"); | 
|  | 255 |  | 
|  | 256 | if (0) { | 
|  | 257 | printk("execph=0x%x, ", nsp32_read2(base, SCSI_EXECUTE_PHASE)); | 
|  | 258 | printk("IrqStatus=0x%x, ", nsp32_read2(base, IRQ_STATUS)); | 
|  | 259 | printk("\n"); | 
|  | 260 | } | 
|  | 261 | } | 
|  | 262 |  | 
|  | 263 | /* end */ |