0001
0002
0003
0004
0005
0006
0007 #include <asm/unaligned.h>
0008 #include "trace.h"
0009
0010 static const char *nvmet_trace_admin_identify(struct trace_seq *p, u8 *cdw10)
0011 {
0012 const char *ret = trace_seq_buffer_ptr(p);
0013 u8 cns = cdw10[0];
0014 u16 ctrlid = get_unaligned_le16(cdw10 + 2);
0015
0016 trace_seq_printf(p, "cns=%u, ctrlid=%u", cns, ctrlid);
0017 trace_seq_putc(p, 0);
0018
0019 return ret;
0020 }
0021
0022 static const char *nvmet_trace_admin_get_features(struct trace_seq *p,
0023 u8 *cdw10)
0024 {
0025 const char *ret = trace_seq_buffer_ptr(p);
0026 u8 fid = cdw10[0];
0027 u8 sel = cdw10[1] & 0x7;
0028 u32 cdw11 = get_unaligned_le32(cdw10 + 4);
0029
0030 trace_seq_printf(p, "fid=0x%x, sel=0x%x, cdw11=0x%x", fid, sel, cdw11);
0031 trace_seq_putc(p, 0);
0032
0033 return ret;
0034 }
0035
0036 static const char *nvmet_trace_get_lba_status(struct trace_seq *p,
0037 u8 *cdw10)
0038 {
0039 const char *ret = trace_seq_buffer_ptr(p);
0040 u64 slba = get_unaligned_le64(cdw10);
0041 u32 mndw = get_unaligned_le32(cdw10 + 8);
0042 u16 rl = get_unaligned_le16(cdw10 + 12);
0043 u8 atype = cdw10[15];
0044
0045 trace_seq_printf(p, "slba=0x%llx, mndw=0x%x, rl=0x%x, atype=%u",
0046 slba, mndw, rl, atype);
0047 trace_seq_putc(p, 0);
0048
0049 return ret;
0050 }
0051
0052 static const char *nvmet_trace_admin_set_features(struct trace_seq *p,
0053 u8 *cdw10)
0054 {
0055 const char *ret = trace_seq_buffer_ptr(p);
0056 u8 fid = cdw10[0];
0057 u8 sv = cdw10[3] & 0x8;
0058 u32 cdw11 = get_unaligned_le32(cdw10 + 4);
0059
0060 trace_seq_printf(p, "fid=0x%x, sv=0x%x, cdw11=0x%x", fid, sv, cdw11);
0061 trace_seq_putc(p, 0);
0062
0063 return ret;
0064 }
0065
0066 static const char *nvmet_trace_read_write(struct trace_seq *p, u8 *cdw10)
0067 {
0068 const char *ret = trace_seq_buffer_ptr(p);
0069 u64 slba = get_unaligned_le64(cdw10);
0070 u16 length = get_unaligned_le16(cdw10 + 8);
0071 u16 control = get_unaligned_le16(cdw10 + 10);
0072 u32 dsmgmt = get_unaligned_le32(cdw10 + 12);
0073 u32 reftag = get_unaligned_le32(cdw10 + 16);
0074
0075 trace_seq_printf(p,
0076 "slba=%llu, len=%u, ctrl=0x%x, dsmgmt=%u, reftag=%u",
0077 slba, length, control, dsmgmt, reftag);
0078 trace_seq_putc(p, 0);
0079
0080 return ret;
0081 }
0082
0083 static const char *nvmet_trace_dsm(struct trace_seq *p, u8 *cdw10)
0084 {
0085 const char *ret = trace_seq_buffer_ptr(p);
0086
0087 trace_seq_printf(p, "nr=%u, attributes=%u",
0088 get_unaligned_le32(cdw10),
0089 get_unaligned_le32(cdw10 + 4));
0090 trace_seq_putc(p, 0);
0091
0092 return ret;
0093 }
0094
0095 static const char *nvmet_trace_common(struct trace_seq *p, u8 *cdw10)
0096 {
0097 const char *ret = trace_seq_buffer_ptr(p);
0098
0099 trace_seq_printf(p, "cdw10=%*ph", 24, cdw10);
0100 trace_seq_putc(p, 0);
0101
0102 return ret;
0103 }
0104
0105 const char *nvmet_trace_parse_admin_cmd(struct trace_seq *p,
0106 u8 opcode, u8 *cdw10)
0107 {
0108 switch (opcode) {
0109 case nvme_admin_identify:
0110 return nvmet_trace_admin_identify(p, cdw10);
0111 case nvme_admin_set_features:
0112 return nvmet_trace_admin_set_features(p, cdw10);
0113 case nvme_admin_get_features:
0114 return nvmet_trace_admin_get_features(p, cdw10);
0115 case nvme_admin_get_lba_status:
0116 return nvmet_trace_get_lba_status(p, cdw10);
0117 default:
0118 return nvmet_trace_common(p, cdw10);
0119 }
0120 }
0121
0122 const char *nvmet_trace_parse_nvm_cmd(struct trace_seq *p,
0123 u8 opcode, u8 *cdw10)
0124 {
0125 switch (opcode) {
0126 case nvme_cmd_read:
0127 case nvme_cmd_write:
0128 case nvme_cmd_write_zeroes:
0129 return nvmet_trace_read_write(p, cdw10);
0130 case nvme_cmd_dsm:
0131 return nvmet_trace_dsm(p, cdw10);
0132 default:
0133 return nvmet_trace_common(p, cdw10);
0134 }
0135 }
0136
0137 static const char *nvmet_trace_fabrics_property_set(struct trace_seq *p,
0138 u8 *spc)
0139 {
0140 const char *ret = trace_seq_buffer_ptr(p);
0141 u8 attrib = spc[0];
0142 u32 ofst = get_unaligned_le32(spc + 4);
0143 u64 value = get_unaligned_le64(spc + 8);
0144
0145 trace_seq_printf(p, "attrib=%u, ofst=0x%x, value=0x%llx",
0146 attrib, ofst, value);
0147 trace_seq_putc(p, 0);
0148 return ret;
0149 }
0150
0151 static const char *nvmet_trace_fabrics_connect(struct trace_seq *p,
0152 u8 *spc)
0153 {
0154 const char *ret = trace_seq_buffer_ptr(p);
0155 u16 recfmt = get_unaligned_le16(spc);
0156 u16 qid = get_unaligned_le16(spc + 2);
0157 u16 sqsize = get_unaligned_le16(spc + 4);
0158 u8 cattr = spc[6];
0159 u32 kato = get_unaligned_le32(spc + 8);
0160
0161 trace_seq_printf(p, "recfmt=%u, qid=%u, sqsize=%u, cattr=%u, kato=%u",
0162 recfmt, qid, sqsize, cattr, kato);
0163 trace_seq_putc(p, 0);
0164 return ret;
0165 }
0166
0167 static const char *nvmet_trace_fabrics_property_get(struct trace_seq *p,
0168 u8 *spc)
0169 {
0170 const char *ret = trace_seq_buffer_ptr(p);
0171 u8 attrib = spc[0];
0172 u32 ofst = get_unaligned_le32(spc + 4);
0173
0174 trace_seq_printf(p, "attrib=%u, ofst=0x%x", attrib, ofst);
0175 trace_seq_putc(p, 0);
0176 return ret;
0177 }
0178
0179 static const char *nvmet_trace_fabrics_common(struct trace_seq *p, u8 *spc)
0180 {
0181 const char *ret = trace_seq_buffer_ptr(p);
0182
0183 trace_seq_printf(p, "specific=%*ph", 24, spc);
0184 trace_seq_putc(p, 0);
0185 return ret;
0186 }
0187
0188 const char *nvmet_trace_parse_fabrics_cmd(struct trace_seq *p,
0189 u8 fctype, u8 *spc)
0190 {
0191 switch (fctype) {
0192 case nvme_fabrics_type_property_set:
0193 return nvmet_trace_fabrics_property_set(p, spc);
0194 case nvme_fabrics_type_connect:
0195 return nvmet_trace_fabrics_connect(p, spc);
0196 case nvme_fabrics_type_property_get:
0197 return nvmet_trace_fabrics_property_get(p, spc);
0198 default:
0199 return nvmet_trace_fabrics_common(p, spc);
0200 }
0201 }
0202
0203 const char *nvmet_trace_disk_name(struct trace_seq *p, char *name)
0204 {
0205 const char *ret = trace_seq_buffer_ptr(p);
0206
0207 if (*name)
0208 trace_seq_printf(p, "disk=%s, ", name);
0209 trace_seq_putc(p, 0);
0210
0211 return ret;
0212 }
0213
0214 const char *nvmet_trace_ctrl_name(struct trace_seq *p, struct nvmet_ctrl *ctrl)
0215 {
0216 const char *ret = trace_seq_buffer_ptr(p);
0217
0218
0219
0220
0221
0222
0223
0224
0225
0226
0227 if (ctrl)
0228 trace_seq_printf(p, "%d", ctrl->cntlid);
0229 else
0230 trace_seq_printf(p, "_");
0231 trace_seq_putc(p, 0);
0232
0233 return ret;
0234 }
0235