Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 #undef TRACE_SYSTEM
0003 #define TRACE_SYSTEM scsi
0004 
0005 #if !defined(_TRACE_SCSI_H) || defined(TRACE_HEADER_MULTI_READ)
0006 #define _TRACE_SCSI_H
0007 
0008 #include <scsi/scsi_cmnd.h>
0009 #include <scsi/scsi_host.h>
0010 #include <linux/tracepoint.h>
0011 #include <linux/trace_seq.h>
0012 
0013 #define scsi_opcode_name(opcode)    { opcode, #opcode }
0014 #define show_opcode_name(val)                   \
0015     __print_symbolic(val,                   \
0016         scsi_opcode_name(TEST_UNIT_READY),      \
0017         scsi_opcode_name(REZERO_UNIT),          \
0018         scsi_opcode_name(REQUEST_SENSE),        \
0019         scsi_opcode_name(FORMAT_UNIT),          \
0020         scsi_opcode_name(READ_BLOCK_LIMITS),        \
0021         scsi_opcode_name(REASSIGN_BLOCKS),      \
0022         scsi_opcode_name(INITIALIZE_ELEMENT_STATUS),    \
0023         scsi_opcode_name(READ_6),           \
0024         scsi_opcode_name(WRITE_6),          \
0025         scsi_opcode_name(SEEK_6),           \
0026         scsi_opcode_name(READ_REVERSE),         \
0027         scsi_opcode_name(WRITE_FILEMARKS),      \
0028         scsi_opcode_name(SPACE),            \
0029         scsi_opcode_name(INQUIRY),          \
0030         scsi_opcode_name(RECOVER_BUFFERED_DATA),    \
0031         scsi_opcode_name(MODE_SELECT),          \
0032         scsi_opcode_name(RESERVE),          \
0033         scsi_opcode_name(RELEASE),          \
0034         scsi_opcode_name(COPY),             \
0035         scsi_opcode_name(ERASE),            \
0036         scsi_opcode_name(MODE_SENSE),           \
0037         scsi_opcode_name(START_STOP),           \
0038         scsi_opcode_name(RECEIVE_DIAGNOSTIC),       \
0039         scsi_opcode_name(SEND_DIAGNOSTIC),      \
0040         scsi_opcode_name(ALLOW_MEDIUM_REMOVAL),     \
0041         scsi_opcode_name(SET_WINDOW),           \
0042         scsi_opcode_name(READ_CAPACITY),        \
0043         scsi_opcode_name(READ_10),          \
0044         scsi_opcode_name(WRITE_10),         \
0045         scsi_opcode_name(SEEK_10),          \
0046         scsi_opcode_name(POSITION_TO_ELEMENT),      \
0047         scsi_opcode_name(WRITE_VERIFY),         \
0048         scsi_opcode_name(VERIFY),           \
0049         scsi_opcode_name(SEARCH_HIGH),          \
0050         scsi_opcode_name(SEARCH_EQUAL),         \
0051         scsi_opcode_name(SEARCH_LOW),           \
0052         scsi_opcode_name(SET_LIMITS),           \
0053         scsi_opcode_name(PRE_FETCH),            \
0054         scsi_opcode_name(READ_POSITION),        \
0055         scsi_opcode_name(SYNCHRONIZE_CACHE),        \
0056         scsi_opcode_name(LOCK_UNLOCK_CACHE),        \
0057         scsi_opcode_name(READ_DEFECT_DATA),     \
0058         scsi_opcode_name(MEDIUM_SCAN),          \
0059         scsi_opcode_name(COMPARE),          \
0060         scsi_opcode_name(COPY_VERIFY),          \
0061         scsi_opcode_name(WRITE_BUFFER),         \
0062         scsi_opcode_name(READ_BUFFER),          \
0063         scsi_opcode_name(UPDATE_BLOCK),         \
0064         scsi_opcode_name(READ_LONG),            \
0065         scsi_opcode_name(WRITE_LONG),           \
0066         scsi_opcode_name(CHANGE_DEFINITION),        \
0067         scsi_opcode_name(WRITE_SAME),           \
0068         scsi_opcode_name(UNMAP),            \
0069         scsi_opcode_name(READ_TOC),         \
0070         scsi_opcode_name(LOG_SELECT),           \
0071         scsi_opcode_name(LOG_SENSE),            \
0072         scsi_opcode_name(XDWRITEREAD_10),       \
0073         scsi_opcode_name(MODE_SELECT_10),       \
0074         scsi_opcode_name(RESERVE_10),           \
0075         scsi_opcode_name(RELEASE_10),           \
0076         scsi_opcode_name(MODE_SENSE_10),        \
0077         scsi_opcode_name(PERSISTENT_RESERVE_IN),    \
0078         scsi_opcode_name(PERSISTENT_RESERVE_OUT),   \
0079         scsi_opcode_name(VARIABLE_LENGTH_CMD),      \
0080         scsi_opcode_name(REPORT_LUNS),          \
0081         scsi_opcode_name(MAINTENANCE_IN),       \
0082         scsi_opcode_name(MAINTENANCE_OUT),      \
0083         scsi_opcode_name(MOVE_MEDIUM),          \
0084         scsi_opcode_name(EXCHANGE_MEDIUM),      \
0085         scsi_opcode_name(READ_12),          \
0086         scsi_opcode_name(WRITE_12),         \
0087         scsi_opcode_name(WRITE_VERIFY_12),      \
0088         scsi_opcode_name(SEARCH_HIGH_12),       \
0089         scsi_opcode_name(SEARCH_EQUAL_12),      \
0090         scsi_opcode_name(SEARCH_LOW_12),        \
0091         scsi_opcode_name(READ_ELEMENT_STATUS),      \
0092         scsi_opcode_name(SEND_VOLUME_TAG),      \
0093         scsi_opcode_name(WRITE_LONG_2),         \
0094         scsi_opcode_name(READ_16),          \
0095         scsi_opcode_name(WRITE_16),         \
0096         scsi_opcode_name(VERIFY_16),            \
0097         scsi_opcode_name(WRITE_SAME_16),        \
0098         scsi_opcode_name(ZBC_OUT),          \
0099         scsi_opcode_name(ZBC_IN),           \
0100         scsi_opcode_name(SERVICE_ACTION_IN_16),     \
0101         scsi_opcode_name(READ_32),          \
0102         scsi_opcode_name(WRITE_32),         \
0103         scsi_opcode_name(WRITE_SAME_32),        \
0104         scsi_opcode_name(ATA_16),           \
0105         scsi_opcode_name(ATA_12))
0106 
0107 #define scsi_hostbyte_name(result)  { result, #result }
0108 #define show_hostbyte_name(val)                 \
0109     __print_symbolic(val,                   \
0110         scsi_hostbyte_name(DID_OK),         \
0111         scsi_hostbyte_name(DID_NO_CONNECT),     \
0112         scsi_hostbyte_name(DID_BUS_BUSY),       \
0113         scsi_hostbyte_name(DID_TIME_OUT),       \
0114         scsi_hostbyte_name(DID_BAD_TARGET),     \
0115         scsi_hostbyte_name(DID_ABORT),          \
0116         scsi_hostbyte_name(DID_PARITY),         \
0117         scsi_hostbyte_name(DID_ERROR),          \
0118         scsi_hostbyte_name(DID_RESET),          \
0119         scsi_hostbyte_name(DID_BAD_INTR),       \
0120         scsi_hostbyte_name(DID_PASSTHROUGH),        \
0121         scsi_hostbyte_name(DID_SOFT_ERROR),     \
0122         scsi_hostbyte_name(DID_IMM_RETRY),      \
0123         scsi_hostbyte_name(DID_REQUEUE),        \
0124         scsi_hostbyte_name(DID_TRANSPORT_DISRUPTED),    \
0125         scsi_hostbyte_name(DID_TRANSPORT_FAILFAST))
0126 
0127 #define scsi_statusbyte_name(result)    { result, #result }
0128 #define show_statusbyte_name(val)               \
0129     __print_symbolic(val,                   \
0130         scsi_statusbyte_name(SAM_STAT_GOOD),        \
0131         scsi_statusbyte_name(SAM_STAT_CHECK_CONDITION), \
0132         scsi_statusbyte_name(SAM_STAT_CONDITION_MET),   \
0133         scsi_statusbyte_name(SAM_STAT_BUSY),        \
0134         scsi_statusbyte_name(SAM_STAT_INTERMEDIATE),    \
0135         scsi_statusbyte_name(SAM_STAT_INTERMEDIATE_CONDITION_MET), \
0136         scsi_statusbyte_name(SAM_STAT_RESERVATION_CONFLICT),    \
0137         scsi_statusbyte_name(SAM_STAT_COMMAND_TERMINATED),  \
0138         scsi_statusbyte_name(SAM_STAT_TASK_SET_FULL),   \
0139         scsi_statusbyte_name(SAM_STAT_ACA_ACTIVE),  \
0140         scsi_statusbyte_name(SAM_STAT_TASK_ABORTED))
0141 
0142 #define scsi_prot_op_name(result)   { result, #result }
0143 #define show_prot_op_name(val)                  \
0144     __print_symbolic(val,                   \
0145         scsi_prot_op_name(SCSI_PROT_NORMAL),        \
0146         scsi_prot_op_name(SCSI_PROT_READ_INSERT),   \
0147         scsi_prot_op_name(SCSI_PROT_WRITE_STRIP),   \
0148         scsi_prot_op_name(SCSI_PROT_READ_STRIP),    \
0149         scsi_prot_op_name(SCSI_PROT_WRITE_INSERT),  \
0150         scsi_prot_op_name(SCSI_PROT_READ_PASS),     \
0151         scsi_prot_op_name(SCSI_PROT_WRITE_PASS))
0152 
0153 const char *scsi_trace_parse_cdb(struct trace_seq*, unsigned char*, int);
0154 #define __parse_cdb(cdb, len) scsi_trace_parse_cdb(p, cdb, len)
0155 
0156 TRACE_EVENT(scsi_dispatch_cmd_start,
0157 
0158     TP_PROTO(struct scsi_cmnd *cmd),
0159 
0160     TP_ARGS(cmd),
0161 
0162     TP_STRUCT__entry(
0163         __field( unsigned int,  host_no )
0164         __field( unsigned int,  channel )
0165         __field( unsigned int,  id  )
0166         __field( unsigned int,  lun )
0167         __field( unsigned int,  opcode  )
0168         __field( unsigned int,  cmd_len )
0169         __field( int,   driver_tag)
0170         __field( int,   scheduler_tag)
0171         __field( unsigned int,  data_sglen )
0172         __field( unsigned int,  prot_sglen )
0173         __field( unsigned char, prot_op )
0174         __dynamic_array(unsigned char,  cmnd, cmd->cmd_len)
0175     ),
0176 
0177     TP_fast_assign(
0178         __entry->host_no    = cmd->device->host->host_no;
0179         __entry->channel    = cmd->device->channel;
0180         __entry->id     = cmd->device->id;
0181         __entry->lun        = cmd->device->lun;
0182         __entry->opcode     = cmd->cmnd[0];
0183         __entry->cmd_len    = cmd->cmd_len;
0184         __entry->driver_tag = scsi_cmd_to_rq(cmd)->tag;
0185         __entry->scheduler_tag  = scsi_cmd_to_rq(cmd)->internal_tag;
0186         __entry->data_sglen = scsi_sg_count(cmd);
0187         __entry->prot_sglen = scsi_prot_sg_count(cmd);
0188         __entry->prot_op    = scsi_get_prot_op(cmd);
0189         memcpy(__get_dynamic_array(cmnd), cmd->cmnd, cmd->cmd_len);
0190     ),
0191 
0192     TP_printk("host_no=%u channel=%u id=%u lun=%u data_sgl=%u prot_sgl=%u" \
0193           " prot_op=%s driver_tag=%d scheduler_tag=%d cmnd=(%s %s raw=%s)",
0194           __entry->host_no, __entry->channel, __entry->id,
0195           __entry->lun, __entry->data_sglen, __entry->prot_sglen,
0196           show_prot_op_name(__entry->prot_op), __entry->driver_tag,
0197           __entry->scheduler_tag, show_opcode_name(__entry->opcode),
0198           __parse_cdb(__get_dynamic_array(cmnd), __entry->cmd_len),
0199           __print_hex(__get_dynamic_array(cmnd), __entry->cmd_len))
0200 );
0201 
0202 TRACE_EVENT(scsi_dispatch_cmd_error,
0203 
0204     TP_PROTO(struct scsi_cmnd *cmd, int rtn),
0205 
0206     TP_ARGS(cmd, rtn),
0207 
0208     TP_STRUCT__entry(
0209         __field( unsigned int,  host_no )
0210         __field( unsigned int,  channel )
0211         __field( unsigned int,  id  )
0212         __field( unsigned int,  lun )
0213         __field( int,       rtn )
0214         __field( unsigned int,  opcode  )
0215         __field( unsigned int,  cmd_len )
0216         __field( int,   driver_tag)
0217         __field( int,   scheduler_tag)
0218         __field( unsigned int,  data_sglen )
0219         __field( unsigned int,  prot_sglen )
0220         __field( unsigned char, prot_op )
0221         __dynamic_array(unsigned char,  cmnd, cmd->cmd_len)
0222     ),
0223 
0224     TP_fast_assign(
0225         __entry->host_no    = cmd->device->host->host_no;
0226         __entry->channel    = cmd->device->channel;
0227         __entry->id     = cmd->device->id;
0228         __entry->lun        = cmd->device->lun;
0229         __entry->rtn        = rtn;
0230         __entry->opcode     = cmd->cmnd[0];
0231         __entry->cmd_len    = cmd->cmd_len;
0232         __entry->driver_tag = scsi_cmd_to_rq(cmd)->tag;
0233         __entry->scheduler_tag  = scsi_cmd_to_rq(cmd)->internal_tag;
0234         __entry->data_sglen = scsi_sg_count(cmd);
0235         __entry->prot_sglen = scsi_prot_sg_count(cmd);
0236         __entry->prot_op    = scsi_get_prot_op(cmd);
0237         memcpy(__get_dynamic_array(cmnd), cmd->cmnd, cmd->cmd_len);
0238     ),
0239 
0240     TP_printk("host_no=%u channel=%u id=%u lun=%u data_sgl=%u prot_sgl=%u" \
0241           " prot_op=%s driver_tag=%d scheduler_tag=%d cmnd=(%s %s raw=%s)" \
0242           " rtn=%d",
0243           __entry->host_no, __entry->channel, __entry->id,
0244           __entry->lun, __entry->data_sglen, __entry->prot_sglen,
0245           show_prot_op_name(__entry->prot_op), __entry->driver_tag,
0246           __entry->scheduler_tag, show_opcode_name(__entry->opcode),
0247           __parse_cdb(__get_dynamic_array(cmnd), __entry->cmd_len),
0248           __print_hex(__get_dynamic_array(cmnd), __entry->cmd_len),
0249           __entry->rtn)
0250 );
0251 
0252 DECLARE_EVENT_CLASS(scsi_cmd_done_timeout_template,
0253 
0254     TP_PROTO(struct scsi_cmnd *cmd),
0255 
0256     TP_ARGS(cmd),
0257 
0258     TP_STRUCT__entry(
0259         __field( unsigned int,  host_no )
0260         __field( unsigned int,  channel )
0261         __field( unsigned int,  id  )
0262         __field( unsigned int,  lun )
0263         __field( int,       result  )
0264         __field( unsigned int,  opcode  )
0265         __field( unsigned int,  cmd_len )
0266         __field( int,   driver_tag)
0267         __field( int,   scheduler_tag)
0268         __field( unsigned int,  data_sglen )
0269         __field( unsigned int,  prot_sglen )
0270         __field( unsigned char, prot_op )
0271         __dynamic_array(unsigned char,  cmnd, cmd->cmd_len)
0272     ),
0273 
0274     TP_fast_assign(
0275         __entry->host_no    = cmd->device->host->host_no;
0276         __entry->channel    = cmd->device->channel;
0277         __entry->id     = cmd->device->id;
0278         __entry->lun        = cmd->device->lun;
0279         __entry->result     = cmd->result;
0280         __entry->opcode     = cmd->cmnd[0];
0281         __entry->cmd_len    = cmd->cmd_len;
0282         __entry->driver_tag = scsi_cmd_to_rq(cmd)->tag;
0283         __entry->scheduler_tag  = scsi_cmd_to_rq(cmd)->internal_tag;
0284         __entry->data_sglen = scsi_sg_count(cmd);
0285         __entry->prot_sglen = scsi_prot_sg_count(cmd);
0286         __entry->prot_op    = scsi_get_prot_op(cmd);
0287         memcpy(__get_dynamic_array(cmnd), cmd->cmnd, cmd->cmd_len);
0288     ),
0289 
0290     TP_printk("host_no=%u channel=%u id=%u lun=%u data_sgl=%u prot_sgl=%u " \
0291           "prot_op=%s driver_tag=%d scheduler_tag=%d cmnd=(%s %s raw=%s) " \
0292           "result=(driver=%s host=%s message=%s status=%s)",
0293           __entry->host_no, __entry->channel, __entry->id,
0294           __entry->lun, __entry->data_sglen, __entry->prot_sglen,
0295           show_prot_op_name(__entry->prot_op), __entry->driver_tag,
0296           __entry->scheduler_tag, show_opcode_name(__entry->opcode),
0297           __parse_cdb(__get_dynamic_array(cmnd), __entry->cmd_len),
0298           __print_hex(__get_dynamic_array(cmnd), __entry->cmd_len),
0299           "DRIVER_OK",
0300           show_hostbyte_name(((__entry->result) >> 16) & 0xff),
0301           "COMMAND_COMPLETE",
0302           show_statusbyte_name(__entry->result & 0xff))
0303 );
0304 
0305 DEFINE_EVENT(scsi_cmd_done_timeout_template, scsi_dispatch_cmd_done,
0306          TP_PROTO(struct scsi_cmnd *cmd),
0307          TP_ARGS(cmd));
0308 
0309 DEFINE_EVENT(scsi_cmd_done_timeout_template, scsi_dispatch_cmd_timeout,
0310          TP_PROTO(struct scsi_cmnd *cmd),
0311          TP_ARGS(cmd));
0312 
0313 TRACE_EVENT(scsi_eh_wakeup,
0314 
0315     TP_PROTO(struct Scsi_Host *shost),
0316 
0317     TP_ARGS(shost),
0318 
0319     TP_STRUCT__entry(
0320         __field( unsigned int,  host_no )
0321     ),
0322 
0323     TP_fast_assign(
0324         __entry->host_no    = shost->host_no;
0325     ),
0326 
0327     TP_printk("host_no=%u", __entry->host_no)
0328 );
0329 
0330 #endif /*  _TRACE_SCSI_H */
0331 
0332 /* This part must be outside protection */
0333 #include <trace/define_trace.h>