1
2
3
4
5
6
7
8
9
10
11
12
13
14static const char unknown[] = "UNKNOWN";
15
16static const char * group_0_commands[] = {
17 "Test Unit Ready", "Rezero Unit", unknown, "Request Sense",
18 "Format Unit", "Read Block Limits", unknown, "Reassign Blocks",
19 "Read (6)", unknown, "Write (6)", "Seek (6)", unknown, unknown,
20 unknown, "Read Reverse", "Write Filemarks", "Space", "Inquiry",
21 unknown, "Recover Buffered Data", "Mode Select", "Reserve",
22 "Release", "Copy", "Erase", "Mode Sense", "Start/Stop Unit",
23 "Receive Diagnostic", "Send Diagnostic",
24 "Prevent/Allow Medium Removal", unknown,
25};
26
27
28static const char *group_1_commands[] = {
29 unknown, unknown, unknown,
30 unknown, unknown, "Read Capacity", unknown, unknown, "Read (10)",
31 unknown, "Write (10)", "Seek (10)", unknown, unknown,
32 "Write Verify","Verify", "Search High", "Search Equal",
33 "Search Low", "Set Limits", "Prefetch or Read Position",
34 "Synchronize Cache","Lock/Unlock Cache", "Read Defect Data",
35 "Medium Scan", "Compare","Copy Verify", "Write Buffer", "Read Buffer",
36 "Update Block", "Read Long", "Write Long",
37};
38
39
40static const char *group_2_commands[] = {
41 "Change Definition", "Write Same",
42 "Read Sub-Ch(cd)", "Read TOC", "Read Header(cd)", "Play Audio(cd)", unknown, "Play Audio MSF(cd)", "Play Audio Track/Index(cd)",
43 "Play Track Relative(10)(cd)", unknown, "Pause/Resume(cd)", "Log Select", "Log Sense", unknown, unknown,
44 unknown, unknown, unknown, unknown, unknown, "Mode Select (10)",
45 unknown, unknown, unknown, unknown, "Mode Sense (10)", unknown,
46 unknown, unknown, unknown,
47};
48
49#define group(opcode) (((opcode) >> 5) & 7)
50
51#define RESERVED_GROUP 0
52#define VENDOR_GROUP 1
53#define NOTEXT_GROUP 2
54
55static const char **commands[] = {
56 group_0_commands, group_1_commands, group_2_commands,
57 (const char **) RESERVED_GROUP, (const char **) RESERVED_GROUP,
58 (const char **) NOTEXT_GROUP, (const char **) VENDOR_GROUP,
59 (const char **) VENDOR_GROUP
60};
61
62static const char reserved[] = "RESERVED";
63static const char vendor[] = "VENDOR SPECIFIC";
64
65static void print_opcodek(unsigned char opcode)
66{
67 const char **table = commands[ group(opcode) ];
68
69 switch ((unsigned long) table) {
70 case RESERVED_GROUP:
71 printk("%s[%02x] ", reserved, opcode);
72 break;
73 case NOTEXT_GROUP:
74 printk("%s(notext)[%02x] ", unknown, opcode);
75 break;
76 case VENDOR_GROUP:
77 printk("%s[%02x] ", vendor, opcode);
78 break;
79 default:
80 if (table[opcode & 0x1f] != unknown)
81 printk("%s[%02x] ", table[opcode & 0x1f], opcode);
82 else
83 printk("%s[%02x] ", unknown, opcode);
84 break;
85 }
86}
87
88static void print_commandk (unsigned char *command)
89{
90 int i, s;
91 printk(KERN_DEBUG);
92 print_opcodek(command[0]);
93
94 if ((command[0] >> 5) == 6 ||
95 (command[0] >> 5) == 7 ) {
96 s = 12;
97 } else {
98 s = COMMAND_SIZE(command[0]);
99 }
100 for ( i = 1; i < s; ++i) {
101 printk("%02x ", command[i]);
102 }
103
104 switch (s) {
105 case 6:
106 printk("LBA=%d len=%d",
107 (((unsigned int)command[1] & 0x0f) << 16) |
108 ( (unsigned int)command[2] << 8) |
109 ( (unsigned int)command[3] ),
110 (unsigned int)command[4]
111 );
112 break;
113 case 10:
114 printk("LBA=%d len=%d",
115 ((unsigned int)command[2] << 24) |
116 ((unsigned int)command[3] << 16) |
117 ((unsigned int)command[4] << 8) |
118 ((unsigned int)command[5] ),
119 ((unsigned int)command[7] << 8) |
120 ((unsigned int)command[8] )
121 );
122 break;
123 case 12:
124 printk("LBA=%d len=%d",
125 ((unsigned int)command[2] << 24) |
126 ((unsigned int)command[3] << 16) |
127 ((unsigned int)command[4] << 8) |
128 ((unsigned int)command[5] ),
129 ((unsigned int)command[6] << 24) |
130 ((unsigned int)command[7] << 16) |
131 ((unsigned int)command[8] << 8) |
132 ((unsigned int)command[9] )
133 );
134 break;
135 default:
136 break;
137 }
138 printk("\n");
139}
140
141static void show_command(struct scsi_cmnd *SCpnt)
142{
143 print_commandk(SCpnt->cmnd);
144}
145
146static void show_phase(struct scsi_cmnd *SCpnt)
147{
148 int i = SCpnt->SCp.phase;
149
150 char *ph[] = {
151 "PH_UNDETERMINED",
152 "PH_ARBSTART",
153 "PH_SELSTART",
154 "PH_SELECTED",
155 "PH_COMMAND",
156 "PH_DATA",
157 "PH_STATUS",
158 "PH_MSG_IN",
159 "PH_MSG_OUT",
160 "PH_DISCONNECT",
161 "PH_RESELECT"
162 };
163
164 if ( i < PH_UNDETERMINED || i > PH_RESELECT ) {
165 printk(KERN_DEBUG "scsi phase: unknown(%d)\n", i);
166 return;
167 }
168
169 printk(KERN_DEBUG "scsi phase: %s\n", ph[i]);
170
171 return;
172}
173
174static void show_busphase(unsigned char stat)
175{
176 switch(stat) {
177 case BUSPHASE_COMMAND:
178 printk(KERN_DEBUG "BUSPHASE_COMMAND\n");
179 break;
180 case BUSPHASE_MESSAGE_IN:
181 printk(KERN_DEBUG "BUSPHASE_MESSAGE_IN\n");
182 break;
183 case BUSPHASE_MESSAGE_OUT:
184 printk(KERN_DEBUG "BUSPHASE_MESSAGE_OUT\n");
185 break;
186 case BUSPHASE_DATA_IN:
187 printk(KERN_DEBUG "BUSPHASE_DATA_IN\n");
188 break;
189 case BUSPHASE_DATA_OUT:
190 printk(KERN_DEBUG "BUSPHASE_DATA_OUT\n");
191 break;
192 case BUSPHASE_STATUS:
193 printk(KERN_DEBUG "BUSPHASE_STATUS\n");
194 break;
195 case BUSPHASE_SELECT:
196 printk(KERN_DEBUG "BUSPHASE_SELECT\n");
197 break;
198 default:
199 printk(KERN_DEBUG "BUSPHASE_other\n");
200 break;
201 }
202}
203
204static void show_message(nsp_hw_data *data)
205{
206 int i;
207
208 printk(KERN_DEBUG "msg:");
209 for(i=0; i < data->MsgLen; i++) {
210 printk(" %02x", data->MsgBuffer[i]);
211 }
212 printk("\n");
213}
214
215
216