1 /* 2 * libata-trace.c - trace functions for libata 3 * 4 * Copyright 2015 Hannes Reinecke 5 * Copyright 2015 SUSE Linux GmbH 6 * 7 * This program is free software; you can redistribute it and/or modify 8 * it under the terms of the GNU General Public License as published by 9 * the Free Software Foundation; either version 2, or (at your option) 10 * any later version. 11 * 12 * This program is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 * GNU General Public License for more details. 16 * 17 * You should have received a copy of the GNU General Public License 18 * along with this program; see the file COPYING. If not, write to 19 * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 20 */ 21 22 #include <linux/kernel.h> 23 #include <linux/trace_seq.h> 24 #include <trace/events/libata.h> 25 26 const char * 27 libata_trace_parse_status(struct trace_seq *p, unsigned char status) 28 { 29 const char *ret = trace_seq_buffer_ptr(p); 30 31 trace_seq_printf(p, "{ "); 32 if (status & ATA_BUSY) 33 trace_seq_printf(p, "BUSY "); 34 if (status & ATA_DRDY) 35 trace_seq_printf(p, "DRDY "); 36 if (status & ATA_DF) 37 trace_seq_printf(p, "DF "); 38 if (status & ATA_DSC) 39 trace_seq_printf(p, "DSC "); 40 if (status & ATA_DRQ) 41 trace_seq_printf(p, "DRQ "); 42 if (status & ATA_CORR) 43 trace_seq_printf(p, "CORR "); 44 if (status & ATA_SENSE) 45 trace_seq_printf(p, "SENSE "); 46 if (status & ATA_ERR) 47 trace_seq_printf(p, "ERR "); 48 trace_seq_putc(p, '}'); 49 trace_seq_putc(p, 0); 50 51 return ret; 52 } 53 54 const char * 55 libata_trace_parse_eh_action(struct trace_seq *p, unsigned int eh_action) 56 { 57 const char *ret = trace_seq_buffer_ptr(p); 58 59 trace_seq_printf(p, "%x", eh_action); 60 if (eh_action) { 61 trace_seq_printf(p, "{ "); 62 if (eh_action & ATA_EH_REVALIDATE) 63 trace_seq_printf(p, "REVALIDATE "); 64 if (eh_action & (ATA_EH_SOFTRESET | ATA_EH_HARDRESET)) 65 trace_seq_printf(p, "RESET "); 66 else if (eh_action & ATA_EH_SOFTRESET) 67 trace_seq_printf(p, "SOFTRESET "); 68 else if (eh_action & ATA_EH_HARDRESET) 69 trace_seq_printf(p, "HARDRESET "); 70 if (eh_action & ATA_EH_ENABLE_LINK) 71 trace_seq_printf(p, "ENABLE_LINK "); 72 if (eh_action & ATA_EH_PARK) 73 trace_seq_printf(p, "PARK "); 74 trace_seq_putc(p, '}'); 75 } 76 trace_seq_putc(p, 0); 77 78 return ret; 79 } 80 81 const char * 82 libata_trace_parse_eh_err_mask(struct trace_seq *p, unsigned int eh_err_mask) 83 { 84 const char *ret = trace_seq_buffer_ptr(p); 85 86 trace_seq_printf(p, "%x", eh_err_mask); 87 if (eh_err_mask) { 88 trace_seq_printf(p, "{ "); 89 if (eh_err_mask & AC_ERR_DEV) 90 trace_seq_printf(p, "DEV "); 91 if (eh_err_mask & AC_ERR_HSM) 92 trace_seq_printf(p, "HSM "); 93 if (eh_err_mask & AC_ERR_TIMEOUT) 94 trace_seq_printf(p, "TIMEOUT "); 95 if (eh_err_mask & AC_ERR_MEDIA) 96 trace_seq_printf(p, "MEDIA "); 97 if (eh_err_mask & AC_ERR_ATA_BUS) 98 trace_seq_printf(p, "ATA_BUS "); 99 if (eh_err_mask & AC_ERR_HOST_BUS) 100 trace_seq_printf(p, "HOST_BUS "); 101 if (eh_err_mask & AC_ERR_SYSTEM) 102 trace_seq_printf(p, "SYSTEM "); 103 if (eh_err_mask & AC_ERR_INVALID) 104 trace_seq_printf(p, "INVALID "); 105 if (eh_err_mask & AC_ERR_OTHER) 106 trace_seq_printf(p, "OTHER "); 107 if (eh_err_mask & AC_ERR_NODEV_HINT) 108 trace_seq_printf(p, "NODEV_HINT "); 109 if (eh_err_mask & AC_ERR_NCQ) 110 trace_seq_printf(p, "NCQ "); 111 trace_seq_putc(p, '}'); 112 } 113 trace_seq_putc(p, 0); 114 115 return ret; 116 } 117 118 const char * 119 libata_trace_parse_qc_flags(struct trace_seq *p, unsigned int qc_flags) 120 { 121 const char *ret = trace_seq_buffer_ptr(p); 122 123 trace_seq_printf(p, "%x", qc_flags); 124 if (qc_flags) { 125 trace_seq_printf(p, "{ "); 126 if (qc_flags & ATA_QCFLAG_ACTIVE) 127 trace_seq_printf(p, "ACTIVE "); 128 if (qc_flags & ATA_QCFLAG_DMAMAP) 129 trace_seq_printf(p, "DMAMAP "); 130 if (qc_flags & ATA_QCFLAG_IO) 131 trace_seq_printf(p, "IO "); 132 if (qc_flags & ATA_QCFLAG_RESULT_TF) 133 trace_seq_printf(p, "RESULT_TF "); 134 if (qc_flags & ATA_QCFLAG_CLEAR_EXCL) 135 trace_seq_printf(p, "CLEAR_EXCL "); 136 if (qc_flags & ATA_QCFLAG_QUIET) 137 trace_seq_printf(p, "QUIET "); 138 if (qc_flags & ATA_QCFLAG_RETRY) 139 trace_seq_printf(p, "RETRY "); 140 if (qc_flags & ATA_QCFLAG_FAILED) 141 trace_seq_printf(p, "FAILED "); 142 if (qc_flags & ATA_QCFLAG_SENSE_VALID) 143 trace_seq_printf(p, "SENSE_VALID "); 144 if (qc_flags & ATA_QCFLAG_EH_SCHEDULED) 145 trace_seq_printf(p, "EH_SCHEDULED "); 146 trace_seq_putc(p, '}'); 147 } 148 trace_seq_putc(p, 0); 149 150 return ret; 151 } 152