0001
0002
0003
0004
0005
0006
0007
0008
0009 #include <linux/kernel.h>
0010 #include <linux/trace_seq.h>
0011 #include <trace/events/libata.h>
0012
0013 const char *
0014 libata_trace_parse_status(struct trace_seq *p, unsigned char status)
0015 {
0016 const char *ret = trace_seq_buffer_ptr(p);
0017
0018 trace_seq_printf(p, "{ ");
0019 if (status & ATA_BUSY)
0020 trace_seq_printf(p, "BUSY ");
0021 if (status & ATA_DRDY)
0022 trace_seq_printf(p, "DRDY ");
0023 if (status & ATA_DF)
0024 trace_seq_printf(p, "DF ");
0025 if (status & ATA_DSC)
0026 trace_seq_printf(p, "DSC ");
0027 if (status & ATA_DRQ)
0028 trace_seq_printf(p, "DRQ ");
0029 if (status & ATA_CORR)
0030 trace_seq_printf(p, "CORR ");
0031 if (status & ATA_SENSE)
0032 trace_seq_printf(p, "SENSE ");
0033 if (status & ATA_ERR)
0034 trace_seq_printf(p, "ERR ");
0035 trace_seq_putc(p, '}');
0036 trace_seq_putc(p, 0);
0037
0038 return ret;
0039 }
0040
0041 const char *
0042 libata_trace_parse_host_stat(struct trace_seq *p, unsigned char host_stat)
0043 {
0044 const char *ret = trace_seq_buffer_ptr(p);
0045
0046 trace_seq_printf(p, "{ ");
0047 if (host_stat & ATA_DMA_INTR)
0048 trace_seq_printf(p, "INTR ");
0049 if (host_stat & ATA_DMA_ERR)
0050 trace_seq_printf(p, "ERR ");
0051 if (host_stat & ATA_DMA_ACTIVE)
0052 trace_seq_printf(p, "ACTIVE ");
0053 trace_seq_putc(p, '}');
0054 trace_seq_putc(p, 0);
0055
0056 return ret;
0057 }
0058
0059 const char *
0060 libata_trace_parse_eh_action(struct trace_seq *p, unsigned int eh_action)
0061 {
0062 const char *ret = trace_seq_buffer_ptr(p);
0063
0064 trace_seq_printf(p, "%x", eh_action);
0065 if (eh_action) {
0066 trace_seq_printf(p, "{ ");
0067 if (eh_action & ATA_EH_REVALIDATE)
0068 trace_seq_printf(p, "REVALIDATE ");
0069 if (eh_action & (ATA_EH_SOFTRESET | ATA_EH_HARDRESET))
0070 trace_seq_printf(p, "RESET ");
0071 else if (eh_action & ATA_EH_SOFTRESET)
0072 trace_seq_printf(p, "SOFTRESET ");
0073 else if (eh_action & ATA_EH_HARDRESET)
0074 trace_seq_printf(p, "HARDRESET ");
0075 if (eh_action & ATA_EH_ENABLE_LINK)
0076 trace_seq_printf(p, "ENABLE_LINK ");
0077 if (eh_action & ATA_EH_PARK)
0078 trace_seq_printf(p, "PARK ");
0079 trace_seq_putc(p, '}');
0080 }
0081 trace_seq_putc(p, 0);
0082
0083 return ret;
0084 }
0085
0086 const char *
0087 libata_trace_parse_eh_err_mask(struct trace_seq *p, unsigned int eh_err_mask)
0088 {
0089 const char *ret = trace_seq_buffer_ptr(p);
0090
0091 trace_seq_printf(p, "%x", eh_err_mask);
0092 if (eh_err_mask) {
0093 trace_seq_printf(p, "{ ");
0094 if (eh_err_mask & AC_ERR_DEV)
0095 trace_seq_printf(p, "DEV ");
0096 if (eh_err_mask & AC_ERR_HSM)
0097 trace_seq_printf(p, "HSM ");
0098 if (eh_err_mask & AC_ERR_TIMEOUT)
0099 trace_seq_printf(p, "TIMEOUT ");
0100 if (eh_err_mask & AC_ERR_MEDIA)
0101 trace_seq_printf(p, "MEDIA ");
0102 if (eh_err_mask & AC_ERR_ATA_BUS)
0103 trace_seq_printf(p, "ATA_BUS ");
0104 if (eh_err_mask & AC_ERR_HOST_BUS)
0105 trace_seq_printf(p, "HOST_BUS ");
0106 if (eh_err_mask & AC_ERR_SYSTEM)
0107 trace_seq_printf(p, "SYSTEM ");
0108 if (eh_err_mask & AC_ERR_INVALID)
0109 trace_seq_printf(p, "INVALID ");
0110 if (eh_err_mask & AC_ERR_OTHER)
0111 trace_seq_printf(p, "OTHER ");
0112 if (eh_err_mask & AC_ERR_NODEV_HINT)
0113 trace_seq_printf(p, "NODEV_HINT ");
0114 if (eh_err_mask & AC_ERR_NCQ)
0115 trace_seq_printf(p, "NCQ ");
0116 trace_seq_putc(p, '}');
0117 }
0118 trace_seq_putc(p, 0);
0119
0120 return ret;
0121 }
0122
0123 const char *
0124 libata_trace_parse_qc_flags(struct trace_seq *p, unsigned int qc_flags)
0125 {
0126 const char *ret = trace_seq_buffer_ptr(p);
0127
0128 trace_seq_printf(p, "%x", qc_flags);
0129 if (qc_flags) {
0130 trace_seq_printf(p, "{ ");
0131 if (qc_flags & ATA_QCFLAG_ACTIVE)
0132 trace_seq_printf(p, "ACTIVE ");
0133 if (qc_flags & ATA_QCFLAG_DMAMAP)
0134 trace_seq_printf(p, "DMAMAP ");
0135 if (qc_flags & ATA_QCFLAG_IO)
0136 trace_seq_printf(p, "IO ");
0137 if (qc_flags & ATA_QCFLAG_RESULT_TF)
0138 trace_seq_printf(p, "RESULT_TF ");
0139 if (qc_flags & ATA_QCFLAG_CLEAR_EXCL)
0140 trace_seq_printf(p, "CLEAR_EXCL ");
0141 if (qc_flags & ATA_QCFLAG_QUIET)
0142 trace_seq_printf(p, "QUIET ");
0143 if (qc_flags & ATA_QCFLAG_RETRY)
0144 trace_seq_printf(p, "RETRY ");
0145 if (qc_flags & ATA_QCFLAG_FAILED)
0146 trace_seq_printf(p, "FAILED ");
0147 if (qc_flags & ATA_QCFLAG_SENSE_VALID)
0148 trace_seq_printf(p, "SENSE_VALID ");
0149 if (qc_flags & ATA_QCFLAG_EH_SCHEDULED)
0150 trace_seq_printf(p, "EH_SCHEDULED ");
0151 trace_seq_putc(p, '}');
0152 }
0153 trace_seq_putc(p, 0);
0154
0155 return ret;
0156 }
0157
0158 const char *
0159 libata_trace_parse_tf_flags(struct trace_seq *p, unsigned int tf_flags)
0160 {
0161 const char *ret = trace_seq_buffer_ptr(p);
0162
0163 trace_seq_printf(p, "%x", tf_flags);
0164 if (tf_flags) {
0165 trace_seq_printf(p, "{ ");
0166 if (tf_flags & ATA_TFLAG_LBA48)
0167 trace_seq_printf(p, "LBA48 ");
0168 if (tf_flags & ATA_TFLAG_ISADDR)
0169 trace_seq_printf(p, "ISADDR ");
0170 if (tf_flags & ATA_TFLAG_DEVICE)
0171 trace_seq_printf(p, "DEV ");
0172 if (tf_flags & ATA_TFLAG_WRITE)
0173 trace_seq_printf(p, "WRITE ");
0174 if (tf_flags & ATA_TFLAG_LBA)
0175 trace_seq_printf(p, "LBA ");
0176 if (tf_flags & ATA_TFLAG_FUA)
0177 trace_seq_printf(p, "FUA ");
0178 if (tf_flags & ATA_TFLAG_POLLING)
0179 trace_seq_printf(p, "POLL ");
0180 trace_seq_putc(p, '}');
0181 }
0182 trace_seq_putc(p, 0);
0183
0184 return ret;
0185 }
0186
0187 const char *
0188 libata_trace_parse_subcmd(struct trace_seq *p, unsigned char cmd,
0189 unsigned char feature, unsigned char hob_nsect)
0190 {
0191 const char *ret = trace_seq_buffer_ptr(p);
0192
0193 switch (cmd) {
0194 case ATA_CMD_FPDMA_RECV:
0195 switch (hob_nsect & 0x5f) {
0196 case ATA_SUBCMD_FPDMA_RECV_RD_LOG_DMA_EXT:
0197 trace_seq_printf(p, " READ_LOG_DMA_EXT");
0198 break;
0199 case ATA_SUBCMD_FPDMA_RECV_ZAC_MGMT_IN:
0200 trace_seq_printf(p, " ZAC_MGMT_IN");
0201 break;
0202 }
0203 break;
0204 case ATA_CMD_FPDMA_SEND:
0205 switch (hob_nsect & 0x5f) {
0206 case ATA_SUBCMD_FPDMA_SEND_WR_LOG_DMA_EXT:
0207 trace_seq_printf(p, " WRITE_LOG_DMA_EXT");
0208 break;
0209 case ATA_SUBCMD_FPDMA_SEND_DSM:
0210 trace_seq_printf(p, " DATASET_MANAGEMENT");
0211 break;
0212 }
0213 break;
0214 case ATA_CMD_NCQ_NON_DATA:
0215 switch (feature) {
0216 case ATA_SUBCMD_NCQ_NON_DATA_ABORT_QUEUE:
0217 trace_seq_printf(p, " ABORT_QUEUE");
0218 break;
0219 case ATA_SUBCMD_NCQ_NON_DATA_SET_FEATURES:
0220 trace_seq_printf(p, " SET_FEATURES");
0221 break;
0222 case ATA_SUBCMD_NCQ_NON_DATA_ZERO_EXT:
0223 trace_seq_printf(p, " ZERO_EXT");
0224 break;
0225 case ATA_SUBCMD_NCQ_NON_DATA_ZAC_MGMT_OUT:
0226 trace_seq_printf(p, " ZAC_MGMT_OUT");
0227 break;
0228 }
0229 break;
0230 case ATA_CMD_ZAC_MGMT_IN:
0231 switch (feature) {
0232 case ATA_SUBCMD_ZAC_MGMT_IN_REPORT_ZONES:
0233 trace_seq_printf(p, " REPORT_ZONES");
0234 break;
0235 }
0236 break;
0237 case ATA_CMD_ZAC_MGMT_OUT:
0238 switch (feature) {
0239 case ATA_SUBCMD_ZAC_MGMT_OUT_CLOSE_ZONE:
0240 trace_seq_printf(p, " CLOSE_ZONE");
0241 break;
0242 case ATA_SUBCMD_ZAC_MGMT_OUT_FINISH_ZONE:
0243 trace_seq_printf(p, " FINISH_ZONE");
0244 break;
0245 case ATA_SUBCMD_ZAC_MGMT_OUT_OPEN_ZONE:
0246 trace_seq_printf(p, " OPEN_ZONE");
0247 break;
0248 case ATA_SUBCMD_ZAC_MGMT_OUT_RESET_WRITE_POINTER:
0249 trace_seq_printf(p, " RESET_WRITE_POINTER");
0250 break;
0251 }
0252 break;
0253 }
0254 trace_seq_putc(p, 0);
0255
0256 return ret;
0257 }