12b27bdccSThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only
2bf816235SKei Tokunaga /*
3bf816235SKei Tokunaga * Copyright (C) 2010 FUJITSU LIMITED
4bf816235SKei Tokunaga * Copyright (C) 2010 Tomohiro Kusumi <kusumi.tomohiro@jp.fujitsu.com>
5bf816235SKei Tokunaga */
6bf816235SKei Tokunaga #include <linux/kernel.h>
7bf816235SKei Tokunaga #include <linux/trace_seq.h>
85141f16aSHannes Reinecke #include <asm/unaligned.h>
9bf816235SKei Tokunaga #include <trace/events/scsi.h>
10bf816235SKei Tokunaga
11c446c1f9SMartin K. Petersen #define SERVICE_ACTION16(cdb) (cdb[1] & 0x1f)
12b1335f5bSBart Van Assche #define SERVICE_ACTION32(cdb) (get_unaligned_be16(&cdb[8]))
13bf816235SKei Tokunaga
14bf816235SKei Tokunaga static const char *
15bf816235SKei Tokunaga scsi_trace_misc(struct trace_seq *, unsigned char *, int);
16bf816235SKei Tokunaga
17bf816235SKei Tokunaga static const char *
scsi_trace_rw6(struct trace_seq * p,unsigned char * cdb,int len)18bf816235SKei Tokunaga scsi_trace_rw6(struct trace_seq *p, unsigned char *cdb, int len)
19bf816235SKei Tokunaga {
207b039cb4SSteven Rostedt (Red Hat) const char *ret = trace_seq_buffer_ptr(p);
21*3cef5948SBart Van Assche u32 lba, txlen;
22bf816235SKei Tokunaga
23*3cef5948SBart Van Assche lba = get_unaligned_be24(&cdb[1]) & 0x1fffff;
24f6b8540fSBart Van Assche /*
25f6b8540fSBart Van Assche * From SBC-2: a TRANSFER LENGTH field set to zero specifies that 256
26f6b8540fSBart Van Assche * logical blocks shall be read (READ(6)) or written (WRITE(6)).
27f6b8540fSBart Van Assche */
28f6b8540fSBart Van Assche txlen = cdb[4] ? cdb[4] : 256;
29bf816235SKei Tokunaga
30f6b8540fSBart Van Assche trace_seq_printf(p, "lba=%u txlen=%u", lba, txlen);
31bf816235SKei Tokunaga trace_seq_putc(p, 0);
32bf816235SKei Tokunaga
33bf816235SKei Tokunaga return ret;
34bf816235SKei Tokunaga }
35bf816235SKei Tokunaga
36bf816235SKei Tokunaga static const char *
scsi_trace_rw10(struct trace_seq * p,unsigned char * cdb,int len)37bf816235SKei Tokunaga scsi_trace_rw10(struct trace_seq *p, unsigned char *cdb, int len)
38bf816235SKei Tokunaga {
397b039cb4SSteven Rostedt (Red Hat) const char *ret = trace_seq_buffer_ptr(p);
40b1335f5bSBart Van Assche u32 lba, txlen;
41bf816235SKei Tokunaga
42b1335f5bSBart Van Assche lba = get_unaligned_be32(&cdb[2]);
43b1335f5bSBart Van Assche txlen = get_unaligned_be16(&cdb[7]);
44bf816235SKei Tokunaga
45b1335f5bSBart Van Assche trace_seq_printf(p, "lba=%u txlen=%u protect=%u", lba, txlen,
46c446c1f9SMartin K. Petersen cdb[1] >> 5);
47c498bf1aSMartin K. Petersen
48c498bf1aSMartin K. Petersen if (cdb[0] == WRITE_SAME)
49c498bf1aSMartin K. Petersen trace_seq_printf(p, " unmap=%u", cdb[1] >> 3 & 1);
50c498bf1aSMartin K. Petersen
51bf816235SKei Tokunaga trace_seq_putc(p, 0);
52bf816235SKei Tokunaga
53bf816235SKei Tokunaga return ret;
54bf816235SKei Tokunaga }
55bf816235SKei Tokunaga
56bf816235SKei Tokunaga static const char *
scsi_trace_rw12(struct trace_seq * p,unsigned char * cdb,int len)57bf816235SKei Tokunaga scsi_trace_rw12(struct trace_seq *p, unsigned char *cdb, int len)
58bf816235SKei Tokunaga {
597b039cb4SSteven Rostedt (Red Hat) const char *ret = trace_seq_buffer_ptr(p);
60b1335f5bSBart Van Assche u32 lba, txlen;
61bf816235SKei Tokunaga
62b1335f5bSBart Van Assche lba = get_unaligned_be32(&cdb[2]);
63b1335f5bSBart Van Assche txlen = get_unaligned_be32(&cdb[6]);
64bf816235SKei Tokunaga
65b1335f5bSBart Van Assche trace_seq_printf(p, "lba=%u txlen=%u protect=%u", lba, txlen,
66c446c1f9SMartin K. Petersen cdb[1] >> 5);
67bf816235SKei Tokunaga trace_seq_putc(p, 0);
68bf816235SKei Tokunaga
69bf816235SKei Tokunaga return ret;
70bf816235SKei Tokunaga }
71bf816235SKei Tokunaga
72bf816235SKei Tokunaga static const char *
scsi_trace_rw16(struct trace_seq * p,unsigned char * cdb,int len)73bf816235SKei Tokunaga scsi_trace_rw16(struct trace_seq *p, unsigned char *cdb, int len)
74bf816235SKei Tokunaga {
757b039cb4SSteven Rostedt (Red Hat) const char *ret = trace_seq_buffer_ptr(p);
76b1335f5bSBart Van Assche u64 lba;
77b1335f5bSBart Van Assche u32 txlen;
78bf816235SKei Tokunaga
79b1335f5bSBart Van Assche lba = get_unaligned_be64(&cdb[2]);
80b1335f5bSBart Van Assche txlen = get_unaligned_be32(&cdb[10]);
81bf816235SKei Tokunaga
82b1335f5bSBart Van Assche trace_seq_printf(p, "lba=%llu txlen=%u protect=%u", lba, txlen,
83c446c1f9SMartin K. Petersen cdb[1] >> 5);
84c446c1f9SMartin K. Petersen
85c446c1f9SMartin K. Petersen if (cdb[0] == WRITE_SAME_16)
86c446c1f9SMartin K. Petersen trace_seq_printf(p, " unmap=%u", cdb[1] >> 3 & 1);
87c446c1f9SMartin K. Petersen
88bf816235SKei Tokunaga trace_seq_putc(p, 0);
89bf816235SKei Tokunaga
90bf816235SKei Tokunaga return ret;
91bf816235SKei Tokunaga }
92bf816235SKei Tokunaga
93bf816235SKei Tokunaga static const char *
scsi_trace_rw32(struct trace_seq * p,unsigned char * cdb,int len)94bf816235SKei Tokunaga scsi_trace_rw32(struct trace_seq *p, unsigned char *cdb, int len)
95bf816235SKei Tokunaga {
967b039cb4SSteven Rostedt (Red Hat) const char *ret = trace_seq_buffer_ptr(p), *cmd;
97b1335f5bSBart Van Assche u64 lba;
98b1335f5bSBart Van Assche u32 ei_lbrt, txlen;
99c446c1f9SMartin K. Petersen
100c446c1f9SMartin K. Petersen switch (SERVICE_ACTION32(cdb)) {
101c446c1f9SMartin K. Petersen case READ_32:
102c446c1f9SMartin K. Petersen cmd = "READ";
103c446c1f9SMartin K. Petersen break;
104c446c1f9SMartin K. Petersen case VERIFY_32:
105c446c1f9SMartin K. Petersen cmd = "VERIFY";
106c446c1f9SMartin K. Petersen break;
107c446c1f9SMartin K. Petersen case WRITE_32:
108c446c1f9SMartin K. Petersen cmd = "WRITE";
109c446c1f9SMartin K. Petersen break;
110c446c1f9SMartin K. Petersen case WRITE_SAME_32:
111c446c1f9SMartin K. Petersen cmd = "WRITE_SAME";
112c446c1f9SMartin K. Petersen break;
113c446c1f9SMartin K. Petersen default:
11491c40f24SRasmus Villemoes trace_seq_puts(p, "UNKNOWN");
115c446c1f9SMartin K. Petersen goto out;
116c446c1f9SMartin K. Petersen }
117bf816235SKei Tokunaga
118b1335f5bSBart Van Assche lba = get_unaligned_be64(&cdb[12]);
119b1335f5bSBart Van Assche ei_lbrt = get_unaligned_be32(&cdb[20]);
120b1335f5bSBart Van Assche txlen = get_unaligned_be32(&cdb[28]);
121bf816235SKei Tokunaga
122b1335f5bSBart Van Assche trace_seq_printf(p, "%s_32 lba=%llu txlen=%u protect=%u ei_lbrt=%u",
123b1335f5bSBart Van Assche cmd, lba, txlen, cdb[10] >> 5, ei_lbrt);
124bf816235SKei Tokunaga
125c446c1f9SMartin K. Petersen if (SERVICE_ACTION32(cdb) == WRITE_SAME_32)
126c446c1f9SMartin K. Petersen trace_seq_printf(p, " unmap=%u", cdb[10] >> 3 & 1);
127c446c1f9SMartin K. Petersen
128c446c1f9SMartin K. Petersen out:
129c446c1f9SMartin K. Petersen trace_seq_putc(p, 0);
130c446c1f9SMartin K. Petersen
131c446c1f9SMartin K. Petersen return ret;
132c446c1f9SMartin K. Petersen }
133c446c1f9SMartin K. Petersen
134c446c1f9SMartin K. Petersen static const char *
scsi_trace_unmap(struct trace_seq * p,unsigned char * cdb,int len)135c446c1f9SMartin K. Petersen scsi_trace_unmap(struct trace_seq *p, unsigned char *cdb, int len)
136c446c1f9SMartin K. Petersen {
1377b039cb4SSteven Rostedt (Red Hat) const char *ret = trace_seq_buffer_ptr(p);
138b1335f5bSBart Van Assche unsigned int regions = get_unaligned_be16(&cdb[7]);
139c446c1f9SMartin K. Petersen
140c446c1f9SMartin K. Petersen trace_seq_printf(p, "regions=%u", (regions - 8) / 16);
141c446c1f9SMartin K. Petersen trace_seq_putc(p, 0);
142c446c1f9SMartin K. Petersen
143c446c1f9SMartin K. Petersen return ret;
144c446c1f9SMartin K. Petersen }
145c446c1f9SMartin K. Petersen
146c446c1f9SMartin K. Petersen static const char *
scsi_trace_service_action_in(struct trace_seq * p,unsigned char * cdb,int len)147c446c1f9SMartin K. Petersen scsi_trace_service_action_in(struct trace_seq *p, unsigned char *cdb, int len)
148c446c1f9SMartin K. Petersen {
1497b039cb4SSteven Rostedt (Red Hat) const char *ret = trace_seq_buffer_ptr(p), *cmd;
150b1335f5bSBart Van Assche u64 lba;
151b1335f5bSBart Van Assche u32 alloc_len;
152c446c1f9SMartin K. Petersen
153c446c1f9SMartin K. Petersen switch (SERVICE_ACTION16(cdb)) {
154c446c1f9SMartin K. Petersen case SAI_READ_CAPACITY_16:
155c446c1f9SMartin K. Petersen cmd = "READ_CAPACITY_16";
156c446c1f9SMartin K. Petersen break;
157c446c1f9SMartin K. Petersen case SAI_GET_LBA_STATUS:
158c446c1f9SMartin K. Petersen cmd = "GET_LBA_STATUS";
159c446c1f9SMartin K. Petersen break;
160c446c1f9SMartin K. Petersen default:
16191c40f24SRasmus Villemoes trace_seq_puts(p, "UNKNOWN");
162c446c1f9SMartin K. Petersen goto out;
163c446c1f9SMartin K. Petersen }
164c446c1f9SMartin K. Petersen
165b1335f5bSBart Van Assche lba = get_unaligned_be64(&cdb[2]);
166b1335f5bSBart Van Assche alloc_len = get_unaligned_be32(&cdb[10]);
167c446c1f9SMartin K. Petersen
168b1335f5bSBart Van Assche trace_seq_printf(p, "%s lba=%llu alloc_len=%u", cmd, lba, alloc_len);
169c446c1f9SMartin K. Petersen
170c446c1f9SMartin K. Petersen out:
171bf816235SKei Tokunaga trace_seq_putc(p, 0);
172bf816235SKei Tokunaga
173bf816235SKei Tokunaga return ret;
174bf816235SKei Tokunaga }
175bf816235SKei Tokunaga
176bf816235SKei Tokunaga static const char *
scsi_trace_maintenance_in(struct trace_seq * p,unsigned char * cdb,int len)1775141f16aSHannes Reinecke scsi_trace_maintenance_in(struct trace_seq *p, unsigned char *cdb, int len)
1785141f16aSHannes Reinecke {
1795141f16aSHannes Reinecke const char *ret = trace_seq_buffer_ptr(p), *cmd;
1805141f16aSHannes Reinecke u32 alloc_len;
1815141f16aSHannes Reinecke
1825141f16aSHannes Reinecke switch (SERVICE_ACTION16(cdb)) {
1835141f16aSHannes Reinecke case MI_REPORT_IDENTIFYING_INFORMATION:
1845141f16aSHannes Reinecke cmd = "REPORT_IDENTIFYING_INFORMATION";
1855141f16aSHannes Reinecke break;
1865141f16aSHannes Reinecke case MI_REPORT_TARGET_PGS:
1875141f16aSHannes Reinecke cmd = "REPORT_TARGET_PORT_GROUPS";
1885141f16aSHannes Reinecke break;
1895141f16aSHannes Reinecke case MI_REPORT_ALIASES:
1905141f16aSHannes Reinecke cmd = "REPORT_ALIASES";
1915141f16aSHannes Reinecke break;
1925141f16aSHannes Reinecke case MI_REPORT_SUPPORTED_OPERATION_CODES:
1935141f16aSHannes Reinecke cmd = "REPORT_SUPPORTED_OPERATION_CODES";
1945141f16aSHannes Reinecke break;
1955141f16aSHannes Reinecke case MI_REPORT_SUPPORTED_TASK_MANAGEMENT_FUNCTIONS:
1965141f16aSHannes Reinecke cmd = "REPORT_SUPPORTED_TASK_MANAGEMENT_FUNCTIONS";
1975141f16aSHannes Reinecke break;
1985141f16aSHannes Reinecke case MI_REPORT_PRIORITY:
1995141f16aSHannes Reinecke cmd = "REPORT_PRIORITY";
2005141f16aSHannes Reinecke break;
2015141f16aSHannes Reinecke case MI_REPORT_TIMESTAMP:
2025141f16aSHannes Reinecke cmd = "REPORT_TIMESTAMP";
2035141f16aSHannes Reinecke break;
2045141f16aSHannes Reinecke case MI_MANAGEMENT_PROTOCOL_IN:
2055141f16aSHannes Reinecke cmd = "MANAGEMENT_PROTOCOL_IN";
2065141f16aSHannes Reinecke break;
2075141f16aSHannes Reinecke default:
2085141f16aSHannes Reinecke trace_seq_puts(p, "UNKNOWN");
2095141f16aSHannes Reinecke goto out;
2105141f16aSHannes Reinecke }
2115141f16aSHannes Reinecke
2125141f16aSHannes Reinecke alloc_len = get_unaligned_be32(&cdb[6]);
2135141f16aSHannes Reinecke
2145141f16aSHannes Reinecke trace_seq_printf(p, "%s alloc_len=%u", cmd, alloc_len);
2155141f16aSHannes Reinecke
2165141f16aSHannes Reinecke out:
2175141f16aSHannes Reinecke trace_seq_putc(p, 0);
2185141f16aSHannes Reinecke
2195141f16aSHannes Reinecke return ret;
2205141f16aSHannes Reinecke }
2215141f16aSHannes Reinecke
2225141f16aSHannes Reinecke static const char *
scsi_trace_maintenance_out(struct trace_seq * p,unsigned char * cdb,int len)2235141f16aSHannes Reinecke scsi_trace_maintenance_out(struct trace_seq *p, unsigned char *cdb, int len)
2245141f16aSHannes Reinecke {
2255141f16aSHannes Reinecke const char *ret = trace_seq_buffer_ptr(p), *cmd;
2265141f16aSHannes Reinecke u32 alloc_len;
2275141f16aSHannes Reinecke
2285141f16aSHannes Reinecke switch (SERVICE_ACTION16(cdb)) {
2295141f16aSHannes Reinecke case MO_SET_IDENTIFYING_INFORMATION:
2305141f16aSHannes Reinecke cmd = "SET_IDENTIFYING_INFORMATION";
2315141f16aSHannes Reinecke break;
2325141f16aSHannes Reinecke case MO_SET_TARGET_PGS:
2335141f16aSHannes Reinecke cmd = "SET_TARGET_PORT_GROUPS";
2345141f16aSHannes Reinecke break;
2355141f16aSHannes Reinecke case MO_CHANGE_ALIASES:
2365141f16aSHannes Reinecke cmd = "CHANGE_ALIASES";
2375141f16aSHannes Reinecke break;
2385141f16aSHannes Reinecke case MO_SET_PRIORITY:
2395141f16aSHannes Reinecke cmd = "SET_PRIORITY";
2405141f16aSHannes Reinecke break;
2415141f16aSHannes Reinecke case MO_SET_TIMESTAMP:
2425141f16aSHannes Reinecke cmd = "SET_TIMESTAMP";
2435141f16aSHannes Reinecke break;
2445141f16aSHannes Reinecke case MO_MANAGEMENT_PROTOCOL_OUT:
2455141f16aSHannes Reinecke cmd = "MANAGEMENT_PROTOCOL_OUT";
2465141f16aSHannes Reinecke break;
2475141f16aSHannes Reinecke default:
2485141f16aSHannes Reinecke trace_seq_puts(p, "UNKNOWN");
2495141f16aSHannes Reinecke goto out;
2505141f16aSHannes Reinecke }
2515141f16aSHannes Reinecke
2525141f16aSHannes Reinecke alloc_len = get_unaligned_be32(&cdb[6]);
2535141f16aSHannes Reinecke
2545141f16aSHannes Reinecke trace_seq_printf(p, "%s alloc_len=%u", cmd, alloc_len);
2555141f16aSHannes Reinecke
2565141f16aSHannes Reinecke out:
2575141f16aSHannes Reinecke trace_seq_putc(p, 0);
2585141f16aSHannes Reinecke
2595141f16aSHannes Reinecke return ret;
2605141f16aSHannes Reinecke }
2615141f16aSHannes Reinecke
2625141f16aSHannes Reinecke static const char *
scsi_trace_zbc_in(struct trace_seq * p,unsigned char * cdb,int len)2630008f1e7SHannes Reinecke scsi_trace_zbc_in(struct trace_seq *p, unsigned char *cdb, int len)
2640008f1e7SHannes Reinecke {
2650008f1e7SHannes Reinecke const char *ret = trace_seq_buffer_ptr(p), *cmd;
2660008f1e7SHannes Reinecke u64 zone_id;
2670008f1e7SHannes Reinecke u32 alloc_len;
2680008f1e7SHannes Reinecke u8 options;
2690008f1e7SHannes Reinecke
2700008f1e7SHannes Reinecke switch (SERVICE_ACTION16(cdb)) {
2710008f1e7SHannes Reinecke case ZI_REPORT_ZONES:
2720008f1e7SHannes Reinecke cmd = "REPORT_ZONES";
2730008f1e7SHannes Reinecke break;
2740008f1e7SHannes Reinecke default:
2750008f1e7SHannes Reinecke trace_seq_puts(p, "UNKNOWN");
2760008f1e7SHannes Reinecke goto out;
2770008f1e7SHannes Reinecke }
2780008f1e7SHannes Reinecke
2790008f1e7SHannes Reinecke zone_id = get_unaligned_be64(&cdb[2]);
2800008f1e7SHannes Reinecke alloc_len = get_unaligned_be32(&cdb[10]);
2810008f1e7SHannes Reinecke options = cdb[14] & 0x3f;
2820008f1e7SHannes Reinecke
2830008f1e7SHannes Reinecke trace_seq_printf(p, "%s zone=%llu alloc_len=%u options=%u partial=%u",
2840008f1e7SHannes Reinecke cmd, (unsigned long long)zone_id, alloc_len,
2850008f1e7SHannes Reinecke options, (cdb[14] >> 7) & 1);
2860008f1e7SHannes Reinecke
2870008f1e7SHannes Reinecke out:
2880008f1e7SHannes Reinecke trace_seq_putc(p, 0);
2890008f1e7SHannes Reinecke
2900008f1e7SHannes Reinecke return ret;
2910008f1e7SHannes Reinecke }
2920008f1e7SHannes Reinecke
2930008f1e7SHannes Reinecke static const char *
scsi_trace_zbc_out(struct trace_seq * p,unsigned char * cdb,int len)2940008f1e7SHannes Reinecke scsi_trace_zbc_out(struct trace_seq *p, unsigned char *cdb, int len)
2950008f1e7SHannes Reinecke {
2960008f1e7SHannes Reinecke const char *ret = trace_seq_buffer_ptr(p), *cmd;
2970008f1e7SHannes Reinecke u64 zone_id;
2980008f1e7SHannes Reinecke
2990008f1e7SHannes Reinecke switch (SERVICE_ACTION16(cdb)) {
3000008f1e7SHannes Reinecke case ZO_CLOSE_ZONE:
3010008f1e7SHannes Reinecke cmd = "CLOSE_ZONE";
3020008f1e7SHannes Reinecke break;
3030008f1e7SHannes Reinecke case ZO_FINISH_ZONE:
3040008f1e7SHannes Reinecke cmd = "FINISH_ZONE";
3050008f1e7SHannes Reinecke break;
3060008f1e7SHannes Reinecke case ZO_OPEN_ZONE:
3070008f1e7SHannes Reinecke cmd = "OPEN_ZONE";
3080008f1e7SHannes Reinecke break;
3090008f1e7SHannes Reinecke case ZO_RESET_WRITE_POINTER:
3100008f1e7SHannes Reinecke cmd = "RESET_WRITE_POINTER";
3110008f1e7SHannes Reinecke break;
3120008f1e7SHannes Reinecke default:
3130008f1e7SHannes Reinecke trace_seq_puts(p, "UNKNOWN");
3140008f1e7SHannes Reinecke goto out;
3150008f1e7SHannes Reinecke }
3160008f1e7SHannes Reinecke
3170008f1e7SHannes Reinecke zone_id = get_unaligned_be64(&cdb[2]);
3180008f1e7SHannes Reinecke
3190008f1e7SHannes Reinecke trace_seq_printf(p, "%s zone=%llu all=%u", cmd,
3200008f1e7SHannes Reinecke (unsigned long long)zone_id, cdb[14] & 1);
3210008f1e7SHannes Reinecke
3220008f1e7SHannes Reinecke out:
3230008f1e7SHannes Reinecke trace_seq_putc(p, 0);
3240008f1e7SHannes Reinecke
3250008f1e7SHannes Reinecke return ret;
3260008f1e7SHannes Reinecke }
3270008f1e7SHannes Reinecke
3280008f1e7SHannes Reinecke static const char *
scsi_trace_varlen(struct trace_seq * p,unsigned char * cdb,int len)329bf816235SKei Tokunaga scsi_trace_varlen(struct trace_seq *p, unsigned char *cdb, int len)
330bf816235SKei Tokunaga {
331c446c1f9SMartin K. Petersen switch (SERVICE_ACTION32(cdb)) {
332bf816235SKei Tokunaga case READ_32:
333c446c1f9SMartin K. Petersen case VERIFY_32:
334bf816235SKei Tokunaga case WRITE_32:
335c446c1f9SMartin K. Petersen case WRITE_SAME_32:
336bf816235SKei Tokunaga return scsi_trace_rw32(p, cdb, len);
337bf816235SKei Tokunaga default:
338bf816235SKei Tokunaga return scsi_trace_misc(p, cdb, len);
339bf816235SKei Tokunaga }
340bf816235SKei Tokunaga }
341bf816235SKei Tokunaga
342bf816235SKei Tokunaga static const char *
scsi_trace_misc(struct trace_seq * p,unsigned char * cdb,int len)343bf816235SKei Tokunaga scsi_trace_misc(struct trace_seq *p, unsigned char *cdb, int len)
344bf816235SKei Tokunaga {
3457b039cb4SSteven Rostedt (Red Hat) const char *ret = trace_seq_buffer_ptr(p);
346bf816235SKei Tokunaga
347f50332ffSRasmus Villemoes trace_seq_putc(p, '-');
348bf816235SKei Tokunaga trace_seq_putc(p, 0);
349bf816235SKei Tokunaga
350bf816235SKei Tokunaga return ret;
351bf816235SKei Tokunaga }
352bf816235SKei Tokunaga
353bf816235SKei Tokunaga const char *
scsi_trace_parse_cdb(struct trace_seq * p,unsigned char * cdb,int len)354bf816235SKei Tokunaga scsi_trace_parse_cdb(struct trace_seq *p, unsigned char *cdb, int len)
355bf816235SKei Tokunaga {
356bf816235SKei Tokunaga switch (cdb[0]) {
357bf816235SKei Tokunaga case READ_6:
358bf816235SKei Tokunaga case WRITE_6:
359bf816235SKei Tokunaga return scsi_trace_rw6(p, cdb, len);
360bf816235SKei Tokunaga case READ_10:
361c446c1f9SMartin K. Petersen case VERIFY:
362bf816235SKei Tokunaga case WRITE_10:
363c446c1f9SMartin K. Petersen case WRITE_SAME:
364bf816235SKei Tokunaga return scsi_trace_rw10(p, cdb, len);
365bf816235SKei Tokunaga case READ_12:
366c446c1f9SMartin K. Petersen case VERIFY_12:
367bf816235SKei Tokunaga case WRITE_12:
368bf816235SKei Tokunaga return scsi_trace_rw12(p, cdb, len);
369bf816235SKei Tokunaga case READ_16:
370c446c1f9SMartin K. Petersen case VERIFY_16:
371bf816235SKei Tokunaga case WRITE_16:
372c446c1f9SMartin K. Petersen case WRITE_SAME_16:
373bf816235SKei Tokunaga return scsi_trace_rw16(p, cdb, len);
374c446c1f9SMartin K. Petersen case UNMAP:
375c446c1f9SMartin K. Petersen return scsi_trace_unmap(p, cdb, len);
376eb846d9fSHannes Reinecke case SERVICE_ACTION_IN_16:
377c446c1f9SMartin K. Petersen return scsi_trace_service_action_in(p, cdb, len);
378bf816235SKei Tokunaga case VARIABLE_LENGTH_CMD:
379bf816235SKei Tokunaga return scsi_trace_varlen(p, cdb, len);
3805141f16aSHannes Reinecke case MAINTENANCE_IN:
3815141f16aSHannes Reinecke return scsi_trace_maintenance_in(p, cdb, len);
3825141f16aSHannes Reinecke case MAINTENANCE_OUT:
3835141f16aSHannes Reinecke return scsi_trace_maintenance_out(p, cdb, len);
3840008f1e7SHannes Reinecke case ZBC_IN:
3850008f1e7SHannes Reinecke return scsi_trace_zbc_in(p, cdb, len);
3860008f1e7SHannes Reinecke case ZBC_OUT:
3870008f1e7SHannes Reinecke return scsi_trace_zbc_out(p, cdb, len);
388bf816235SKei Tokunaga default:
389bf816235SKei Tokunaga return scsi_trace_misc(p, cdb, len);
390bf816235SKei Tokunaga }
391bf816235SKei Tokunaga }
392