Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-or-later
0002 /*
0003  * libata-trace.c - trace functions for libata
0004  *
0005  * Copyright 2015 Hannes Reinecke
0006  * Copyright 2015 SUSE Linux GmbH
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 }