xref: /openbmc/linux/drivers/scsi/scsi_trace.c (revision ead5d1f4d877e92c051e1a1ade623d0d30e71619)
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