1 /* 2 * xHCI host controller driver 3 * 4 * Copyright (C) 2013 Xenia Ragiadakou 5 * 6 * Author: Xenia Ragiadakou 7 * Email : burzalodowa@gmail.com 8 * 9 * This program is free software; you can redistribute it and/or modify 10 * it under the terms of the GNU General Public License version 2 as 11 * published by the Free Software Foundation. 12 */ 13 14 #undef TRACE_SYSTEM 15 #define TRACE_SYSTEM xhci-hcd 16 17 /* 18 * The TRACE_SYSTEM_VAR defaults to TRACE_SYSTEM, but must be a 19 * legitimate C variable. It is not exported to user space. 20 */ 21 #undef TRACE_SYSTEM_VAR 22 #define TRACE_SYSTEM_VAR xhci_hcd 23 24 #if !defined(__XHCI_TRACE_H) || defined(TRACE_HEADER_MULTI_READ) 25 #define __XHCI_TRACE_H 26 27 #include <linux/tracepoint.h> 28 #include "xhci.h" 29 30 #define XHCI_MSG_MAX 500 31 32 DECLARE_EVENT_CLASS(xhci_log_msg, 33 TP_PROTO(struct va_format *vaf), 34 TP_ARGS(vaf), 35 TP_STRUCT__entry(__dynamic_array(char, msg, XHCI_MSG_MAX)), 36 TP_fast_assign( 37 vsnprintf(__get_str(msg), XHCI_MSG_MAX, vaf->fmt, *vaf->va); 38 ), 39 TP_printk("%s", __get_str(msg)) 40 ); 41 42 DEFINE_EVENT(xhci_log_msg, xhci_dbg_address, 43 TP_PROTO(struct va_format *vaf), 44 TP_ARGS(vaf) 45 ); 46 47 DEFINE_EVENT(xhci_log_msg, xhci_dbg_context_change, 48 TP_PROTO(struct va_format *vaf), 49 TP_ARGS(vaf) 50 ); 51 52 DEFINE_EVENT(xhci_log_msg, xhci_dbg_quirks, 53 TP_PROTO(struct va_format *vaf), 54 TP_ARGS(vaf) 55 ); 56 57 DEFINE_EVENT(xhci_log_msg, xhci_dbg_reset_ep, 58 TP_PROTO(struct va_format *vaf), 59 TP_ARGS(vaf) 60 ); 61 62 DEFINE_EVENT(xhci_log_msg, xhci_dbg_cancel_urb, 63 TP_PROTO(struct va_format *vaf), 64 TP_ARGS(vaf) 65 ); 66 67 DEFINE_EVENT(xhci_log_msg, xhci_dbg_init, 68 TP_PROTO(struct va_format *vaf), 69 TP_ARGS(vaf) 70 ); 71 72 DEFINE_EVENT(xhci_log_msg, xhci_dbg_ring_expansion, 73 TP_PROTO(struct va_format *vaf), 74 TP_ARGS(vaf) 75 ); 76 77 DECLARE_EVENT_CLASS(xhci_log_ctx, 78 TP_PROTO(struct xhci_hcd *xhci, struct xhci_container_ctx *ctx, 79 unsigned int ep_num), 80 TP_ARGS(xhci, ctx, ep_num), 81 TP_STRUCT__entry( 82 __field(int, ctx_64) 83 __field(unsigned, ctx_type) 84 __field(dma_addr_t, ctx_dma) 85 __field(u8 *, ctx_va) 86 __field(unsigned, ctx_ep_num) 87 __field(int, slot_id) 88 __dynamic_array(u32, ctx_data, 89 ((HCC_64BYTE_CONTEXT(xhci->hcc_params) + 1) * 8) * 90 ((ctx->type == XHCI_CTX_TYPE_INPUT) + ep_num + 1)) 91 ), 92 TP_fast_assign( 93 struct usb_device *udev; 94 95 udev = to_usb_device(xhci_to_hcd(xhci)->self.controller); 96 __entry->ctx_64 = HCC_64BYTE_CONTEXT(xhci->hcc_params); 97 __entry->ctx_type = ctx->type; 98 __entry->ctx_dma = ctx->dma; 99 __entry->ctx_va = ctx->bytes; 100 __entry->slot_id = udev->slot_id; 101 __entry->ctx_ep_num = ep_num; 102 memcpy(__get_dynamic_array(ctx_data), ctx->bytes, 103 ((HCC_64BYTE_CONTEXT(xhci->hcc_params) + 1) * 32) * 104 ((ctx->type == XHCI_CTX_TYPE_INPUT) + ep_num + 1)); 105 ), 106 TP_printk("ctx_64=%d, ctx_type=%u, ctx_dma=@%llx, ctx_va=@%p", 107 __entry->ctx_64, __entry->ctx_type, 108 (unsigned long long) __entry->ctx_dma, __entry->ctx_va 109 ) 110 ); 111 112 DEFINE_EVENT(xhci_log_ctx, xhci_address_ctx, 113 TP_PROTO(struct xhci_hcd *xhci, struct xhci_container_ctx *ctx, 114 unsigned int ep_num), 115 TP_ARGS(xhci, ctx, ep_num) 116 ); 117 118 DECLARE_EVENT_CLASS(xhci_log_trb, 119 TP_PROTO(struct xhci_ring *ring, struct xhci_generic_trb *trb), 120 TP_ARGS(ring, trb), 121 TP_STRUCT__entry( 122 __field(u32, type) 123 __field(u32, field0) 124 __field(u32, field1) 125 __field(u32, field2) 126 __field(u32, field3) 127 ), 128 TP_fast_assign( 129 __entry->type = ring->type; 130 __entry->field0 = le32_to_cpu(trb->field[0]); 131 __entry->field1 = le32_to_cpu(trb->field[1]); 132 __entry->field2 = le32_to_cpu(trb->field[2]); 133 __entry->field3 = le32_to_cpu(trb->field[3]); 134 ), 135 TP_printk("%s: %s", xhci_ring_type_string(__entry->type), 136 xhci_decode_trb(__entry->field0, __entry->field1, 137 __entry->field2, __entry->field3) 138 ) 139 ); 140 141 DEFINE_EVENT(xhci_log_trb, xhci_handle_event, 142 TP_PROTO(struct xhci_ring *ring, struct xhci_generic_trb *trb), 143 TP_ARGS(ring, trb) 144 ); 145 146 DEFINE_EVENT(xhci_log_trb, xhci_handle_command, 147 TP_PROTO(struct xhci_ring *ring, struct xhci_generic_trb *trb), 148 TP_ARGS(ring, trb) 149 ); 150 151 DEFINE_EVENT(xhci_log_trb, xhci_handle_transfer, 152 TP_PROTO(struct xhci_ring *ring, struct xhci_generic_trb *trb), 153 TP_ARGS(ring, trb) 154 ); 155 156 DEFINE_EVENT(xhci_log_trb, xhci_queue_trb, 157 TP_PROTO(struct xhci_ring *ring, struct xhci_generic_trb *trb), 158 TP_ARGS(ring, trb) 159 ); 160 161 DECLARE_EVENT_CLASS(xhci_log_virt_dev, 162 TP_PROTO(struct xhci_virt_device *vdev), 163 TP_ARGS(vdev), 164 TP_STRUCT__entry( 165 __field(void *, vdev) 166 __field(unsigned long long, out_ctx) 167 __field(unsigned long long, in_ctx) 168 __field(int, devnum) 169 __field(int, state) 170 __field(int, speed) 171 __field(u8, portnum) 172 __field(u8, level) 173 __field(int, slot_id) 174 ), 175 TP_fast_assign( 176 __entry->vdev = vdev; 177 __entry->in_ctx = (unsigned long long) vdev->in_ctx->dma; 178 __entry->out_ctx = (unsigned long long) vdev->out_ctx->dma; 179 __entry->devnum = vdev->udev->devnum; 180 __entry->state = vdev->udev->state; 181 __entry->speed = vdev->udev->speed; 182 __entry->portnum = vdev->udev->portnum; 183 __entry->level = vdev->udev->level; 184 __entry->slot_id = vdev->udev->slot_id; 185 ), 186 TP_printk("vdev %p ctx %llx | %llx num %d state %d speed %d port %d level %d slot %d", 187 __entry->vdev, __entry->in_ctx, __entry->out_ctx, 188 __entry->devnum, __entry->state, __entry->speed, 189 __entry->portnum, __entry->level, __entry->slot_id 190 ) 191 ); 192 193 DEFINE_EVENT(xhci_log_virt_dev, xhci_alloc_virt_device, 194 TP_PROTO(struct xhci_virt_device *vdev), 195 TP_ARGS(vdev) 196 ); 197 198 DEFINE_EVENT(xhci_log_virt_dev, xhci_free_virt_device, 199 TP_PROTO(struct xhci_virt_device *vdev), 200 TP_ARGS(vdev) 201 ); 202 203 DEFINE_EVENT(xhci_log_virt_dev, xhci_setup_device, 204 TP_PROTO(struct xhci_virt_device *vdev), 205 TP_ARGS(vdev) 206 ); 207 208 DEFINE_EVENT(xhci_log_virt_dev, xhci_setup_addressable_virt_device, 209 TP_PROTO(struct xhci_virt_device *vdev), 210 TP_ARGS(vdev) 211 ); 212 213 DEFINE_EVENT(xhci_log_virt_dev, xhci_stop_device, 214 TP_PROTO(struct xhci_virt_device *vdev), 215 TP_ARGS(vdev) 216 ); 217 218 DECLARE_EVENT_CLASS(xhci_log_urb, 219 TP_PROTO(struct urb *urb), 220 TP_ARGS(urb), 221 TP_STRUCT__entry( 222 __field(void *, urb) 223 __field(unsigned int, pipe) 224 __field(unsigned int, stream) 225 __field(int, status) 226 __field(unsigned int, flags) 227 __field(int, num_mapped_sgs) 228 __field(int, num_sgs) 229 __field(int, length) 230 __field(int, actual) 231 __field(int, epnum) 232 __field(int, dir_in) 233 __field(int, type) 234 ), 235 TP_fast_assign( 236 __entry->urb = urb; 237 __entry->pipe = urb->pipe; 238 __entry->stream = urb->stream_id; 239 __entry->status = urb->status; 240 __entry->flags = urb->transfer_flags; 241 __entry->num_mapped_sgs = urb->num_mapped_sgs; 242 __entry->num_sgs = urb->num_sgs; 243 __entry->length = urb->transfer_buffer_length; 244 __entry->actual = urb->actual_length; 245 __entry->epnum = usb_endpoint_num(&urb->ep->desc); 246 __entry->dir_in = usb_endpoint_dir_in(&urb->ep->desc); 247 __entry->type = usb_endpoint_type(&urb->ep->desc); 248 ), 249 TP_printk("ep%d%s-%s: urb %p pipe %u length %d/%d sgs %d/%d stream %d flags %08x", 250 __entry->epnum, __entry->dir_in ? "in" : "out", 251 ({ char *s; 252 switch (__entry->type) { 253 case USB_ENDPOINT_XFER_INT: 254 s = "intr"; 255 break; 256 case USB_ENDPOINT_XFER_CONTROL: 257 s = "control"; 258 break; 259 case USB_ENDPOINT_XFER_BULK: 260 s = "bulk"; 261 break; 262 case USB_ENDPOINT_XFER_ISOC: 263 s = "isoc"; 264 break; 265 default: 266 s = "UNKNOWN"; 267 } s; }), __entry->urb, __entry->pipe, __entry->actual, 268 __entry->length, __entry->num_mapped_sgs, 269 __entry->num_sgs, __entry->stream, __entry->flags 270 ) 271 ); 272 273 DEFINE_EVENT(xhci_log_urb, xhci_urb_enqueue, 274 TP_PROTO(struct urb *urb), 275 TP_ARGS(urb) 276 ); 277 278 DEFINE_EVENT(xhci_log_urb, xhci_urb_giveback, 279 TP_PROTO(struct urb *urb), 280 TP_ARGS(urb) 281 ); 282 283 DEFINE_EVENT(xhci_log_urb, xhci_urb_dequeue, 284 TP_PROTO(struct urb *urb), 285 TP_ARGS(urb) 286 ); 287 288 #endif /* __XHCI_TRACE_H */ 289 290 /* this part must be outside header guard */ 291 292 #undef TRACE_INCLUDE_PATH 293 #define TRACE_INCLUDE_PATH . 294 295 #undef TRACE_INCLUDE_FILE 296 #define TRACE_INCLUDE_FILE xhci-trace 297 298 #include <trace/define_trace.h> 299