Branch data Line data Source code
1 : : // SPDX-License-Identifier: GPL-2.0-or-later
2 : : /*
3 : : * libata-trace.c - trace functions for libata
4 : : *
5 : : * Copyright 2015 Hannes Reinecke
6 : : * Copyright 2015 SUSE Linux GmbH
7 : : */
8 : :
9 : : #include <linux/kernel.h>
10 : : #include <linux/trace_seq.h>
11 : : #include <trace/events/libata.h>
12 : :
13 : : const char *
14 : 0 : libata_trace_parse_status(struct trace_seq *p, unsigned char status)
15 : : {
16 : 0 : const char *ret = trace_seq_buffer_ptr(p);
17 : :
18 : 0 : trace_seq_printf(p, "{ ");
19 [ # # ]: 0 : if (status & ATA_BUSY)
20 : 0 : trace_seq_printf(p, "BUSY ");
21 [ # # ]: 0 : if (status & ATA_DRDY)
22 : 0 : trace_seq_printf(p, "DRDY ");
23 [ # # ]: 0 : if (status & ATA_DF)
24 : 0 : trace_seq_printf(p, "DF ");
25 [ # # ]: 0 : if (status & ATA_DSC)
26 : 0 : trace_seq_printf(p, "DSC ");
27 [ # # ]: 0 : if (status & ATA_DRQ)
28 : 0 : trace_seq_printf(p, "DRQ ");
29 [ # # ]: 0 : if (status & ATA_CORR)
30 : 0 : trace_seq_printf(p, "CORR ");
31 [ # # ]: 0 : if (status & ATA_SENSE)
32 : 0 : trace_seq_printf(p, "SENSE ");
33 [ # # ]: 0 : if (status & ATA_ERR)
34 : 0 : trace_seq_printf(p, "ERR ");
35 : 0 : trace_seq_putc(p, '}');
36 : 0 : trace_seq_putc(p, 0);
37 : :
38 : 0 : return ret;
39 : : }
40 : :
41 : : const char *
42 : 0 : libata_trace_parse_eh_action(struct trace_seq *p, unsigned int eh_action)
43 : : {
44 : 0 : const char *ret = trace_seq_buffer_ptr(p);
45 : :
46 : 0 : trace_seq_printf(p, "%x", eh_action);
47 [ # # ]: 0 : if (eh_action) {
48 : 0 : trace_seq_printf(p, "{ ");
49 [ # # ]: 0 : if (eh_action & ATA_EH_REVALIDATE)
50 : 0 : trace_seq_printf(p, "REVALIDATE ");
51 [ # # ]: 0 : if (eh_action & (ATA_EH_SOFTRESET | ATA_EH_HARDRESET))
52 : 0 : trace_seq_printf(p, "RESET ");
53 [ # # ]: 0 : else if (eh_action & ATA_EH_SOFTRESET)
54 : 0 : trace_seq_printf(p, "SOFTRESET ");
55 [ # # ]: 0 : else if (eh_action & ATA_EH_HARDRESET)
56 : 0 : trace_seq_printf(p, "HARDRESET ");
57 [ # # ]: 0 : if (eh_action & ATA_EH_ENABLE_LINK)
58 : 0 : trace_seq_printf(p, "ENABLE_LINK ");
59 [ # # ]: 0 : if (eh_action & ATA_EH_PARK)
60 : 0 : trace_seq_printf(p, "PARK ");
61 : 0 : trace_seq_putc(p, '}');
62 : : }
63 : 0 : trace_seq_putc(p, 0);
64 : :
65 : 0 : return ret;
66 : : }
67 : :
68 : : const char *
69 : 0 : libata_trace_parse_eh_err_mask(struct trace_seq *p, unsigned int eh_err_mask)
70 : : {
71 : 0 : const char *ret = trace_seq_buffer_ptr(p);
72 : :
73 : 0 : trace_seq_printf(p, "%x", eh_err_mask);
74 [ # # ]: 0 : if (eh_err_mask) {
75 : 0 : trace_seq_printf(p, "{ ");
76 [ # # ]: 0 : if (eh_err_mask & AC_ERR_DEV)
77 : 0 : trace_seq_printf(p, "DEV ");
78 [ # # ]: 0 : if (eh_err_mask & AC_ERR_HSM)
79 : 0 : trace_seq_printf(p, "HSM ");
80 [ # # ]: 0 : if (eh_err_mask & AC_ERR_TIMEOUT)
81 : 0 : trace_seq_printf(p, "TIMEOUT ");
82 [ # # ]: 0 : if (eh_err_mask & AC_ERR_MEDIA)
83 : 0 : trace_seq_printf(p, "MEDIA ");
84 [ # # ]: 0 : if (eh_err_mask & AC_ERR_ATA_BUS)
85 : 0 : trace_seq_printf(p, "ATA_BUS ");
86 [ # # ]: 0 : if (eh_err_mask & AC_ERR_HOST_BUS)
87 : 0 : trace_seq_printf(p, "HOST_BUS ");
88 [ # # ]: 0 : if (eh_err_mask & AC_ERR_SYSTEM)
89 : 0 : trace_seq_printf(p, "SYSTEM ");
90 [ # # ]: 0 : if (eh_err_mask & AC_ERR_INVALID)
91 : 0 : trace_seq_printf(p, "INVALID ");
92 [ # # ]: 0 : if (eh_err_mask & AC_ERR_OTHER)
93 : 0 : trace_seq_printf(p, "OTHER ");
94 [ # # ]: 0 : if (eh_err_mask & AC_ERR_NODEV_HINT)
95 : 0 : trace_seq_printf(p, "NODEV_HINT ");
96 [ # # ]: 0 : if (eh_err_mask & AC_ERR_NCQ)
97 : 0 : trace_seq_printf(p, "NCQ ");
98 : 0 : trace_seq_putc(p, '}');
99 : : }
100 : 0 : trace_seq_putc(p, 0);
101 : :
102 : 0 : return ret;
103 : : }
104 : :
105 : : const char *
106 : 0 : libata_trace_parse_qc_flags(struct trace_seq *p, unsigned int qc_flags)
107 : : {
108 : 0 : const char *ret = trace_seq_buffer_ptr(p);
109 : :
110 : 0 : trace_seq_printf(p, "%x", qc_flags);
111 [ # # ]: 0 : if (qc_flags) {
112 : 0 : trace_seq_printf(p, "{ ");
113 [ # # ]: 0 : if (qc_flags & ATA_QCFLAG_ACTIVE)
114 : 0 : trace_seq_printf(p, "ACTIVE ");
115 [ # # ]: 0 : if (qc_flags & ATA_QCFLAG_DMAMAP)
116 : 0 : trace_seq_printf(p, "DMAMAP ");
117 [ # # ]: 0 : if (qc_flags & ATA_QCFLAG_IO)
118 : 0 : trace_seq_printf(p, "IO ");
119 [ # # ]: 0 : if (qc_flags & ATA_QCFLAG_RESULT_TF)
120 : 0 : trace_seq_printf(p, "RESULT_TF ");
121 [ # # ]: 0 : if (qc_flags & ATA_QCFLAG_CLEAR_EXCL)
122 : 0 : trace_seq_printf(p, "CLEAR_EXCL ");
123 [ # # ]: 0 : if (qc_flags & ATA_QCFLAG_QUIET)
124 : 0 : trace_seq_printf(p, "QUIET ");
125 [ # # ]: 0 : if (qc_flags & ATA_QCFLAG_RETRY)
126 : 0 : trace_seq_printf(p, "RETRY ");
127 [ # # ]: 0 : if (qc_flags & ATA_QCFLAG_FAILED)
128 : 0 : trace_seq_printf(p, "FAILED ");
129 [ # # ]: 0 : if (qc_flags & ATA_QCFLAG_SENSE_VALID)
130 : 0 : trace_seq_printf(p, "SENSE_VALID ");
131 [ # # ]: 0 : if (qc_flags & ATA_QCFLAG_EH_SCHEDULED)
132 : 0 : trace_seq_printf(p, "EH_SCHEDULED ");
133 : 0 : trace_seq_putc(p, '}');
134 : : }
135 : 0 : trace_seq_putc(p, 0);
136 : :
137 : 0 : return ret;
138 : : }
139 : :
140 : : const char *
141 : 0 : libata_trace_parse_subcmd(struct trace_seq *p, unsigned char cmd,
142 : : unsigned char feature, unsigned char hob_nsect)
143 : : {
144 [ # # # # : 0 : const char *ret = trace_seq_buffer_ptr(p);
# # ]
145 : :
146 [ # # # # : 0 : switch (cmd) {
# # ]
147 : 0 : case ATA_CMD_FPDMA_RECV:
148 [ # # # ]: 0 : switch (hob_nsect & 0x5f) {
149 : 0 : case ATA_SUBCMD_FPDMA_RECV_RD_LOG_DMA_EXT:
150 : 0 : trace_seq_printf(p, " READ_LOG_DMA_EXT");
151 : 0 : break;
152 : 0 : case ATA_SUBCMD_FPDMA_RECV_ZAC_MGMT_IN:
153 : 0 : trace_seq_printf(p, " ZAC_MGMT_IN");
154 : 0 : break;
155 : : }
156 : : break;
157 : 0 : case ATA_CMD_FPDMA_SEND:
158 [ # # # ]: 0 : switch (hob_nsect & 0x5f) {
159 : 0 : case ATA_SUBCMD_FPDMA_SEND_WR_LOG_DMA_EXT:
160 : 0 : trace_seq_printf(p, " WRITE_LOG_DMA_EXT");
161 : 0 : break;
162 : 0 : case ATA_SUBCMD_FPDMA_SEND_DSM:
163 : 0 : trace_seq_printf(p, " DATASET_MANAGEMENT");
164 : 0 : break;
165 : : }
166 : : break;
167 : 0 : case ATA_CMD_NCQ_NON_DATA:
168 [ # # # # : 0 : switch (feature) {
# ]
169 : 0 : case ATA_SUBCMD_NCQ_NON_DATA_ABORT_QUEUE:
170 : 0 : trace_seq_printf(p, " ABORT_QUEUE");
171 : 0 : break;
172 : 0 : case ATA_SUBCMD_NCQ_NON_DATA_SET_FEATURES:
173 : 0 : trace_seq_printf(p, " SET_FEATURES");
174 : 0 : break;
175 : 0 : case ATA_SUBCMD_NCQ_NON_DATA_ZERO_EXT:
176 : 0 : trace_seq_printf(p, " ZERO_EXT");
177 : 0 : break;
178 : 0 : case ATA_SUBCMD_NCQ_NON_DATA_ZAC_MGMT_OUT:
179 : 0 : trace_seq_printf(p, " ZAC_MGMT_OUT");
180 : 0 : break;
181 : : }
182 : : break;
183 : 0 : case ATA_CMD_ZAC_MGMT_IN:
184 [ # # ]: 0 : switch (feature) {
185 : 0 : case ATA_SUBCMD_ZAC_MGMT_IN_REPORT_ZONES:
186 : 0 : trace_seq_printf(p, " REPORT_ZONES");
187 : 0 : break;
188 : : }
189 : : break;
190 : 0 : case ATA_CMD_ZAC_MGMT_OUT:
191 [ # # # # : 0 : switch (feature) {
# ]
192 : 0 : case ATA_SUBCMD_ZAC_MGMT_OUT_CLOSE_ZONE:
193 : 0 : trace_seq_printf(p, " CLOSE_ZONE");
194 : 0 : break;
195 : 0 : case ATA_SUBCMD_ZAC_MGMT_OUT_FINISH_ZONE:
196 : 0 : trace_seq_printf(p, " FINISH_ZONE");
197 : 0 : break;
198 : 0 : case ATA_SUBCMD_ZAC_MGMT_OUT_OPEN_ZONE:
199 : 0 : trace_seq_printf(p, " OPEN_ZONE");
200 : 0 : break;
201 : 0 : case ATA_SUBCMD_ZAC_MGMT_OUT_RESET_WRITE_POINTER:
202 : 0 : trace_seq_printf(p, " RESET_WRITE_POINTER");
203 : 0 : break;
204 : : }
205 : : break;
206 : : }
207 : 0 : trace_seq_putc(p, 0);
208 : :
209 : 0 : return ret;
210 : : }
|