1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0 2*4882a593Smuzhiyun /** 3*4882a593Smuzhiyun * udc.c - Core UDC Framework 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright (C) 2016 Intel Corporation 6*4882a593Smuzhiyun * Author: Felipe Balbi <felipe.balbi@linux.intel.com> 7*4882a593Smuzhiyun */ 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun #undef TRACE_SYSTEM 10*4882a593Smuzhiyun #define TRACE_SYSTEM gadget 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun #if !defined(__UDC_TRACE_H) || defined(TRACE_HEADER_MULTI_READ) 13*4882a593Smuzhiyun #define __UDC_TRACE_H 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun #include <linux/types.h> 16*4882a593Smuzhiyun #include <linux/tracepoint.h> 17*4882a593Smuzhiyun #include <asm/byteorder.h> 18*4882a593Smuzhiyun #include <linux/usb/gadget.h> 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun DECLARE_EVENT_CLASS(udc_log_gadget, 21*4882a593Smuzhiyun TP_PROTO(struct usb_gadget *g, int ret), 22*4882a593Smuzhiyun TP_ARGS(g, ret), 23*4882a593Smuzhiyun TP_STRUCT__entry( 24*4882a593Smuzhiyun __field(enum usb_device_speed, speed) 25*4882a593Smuzhiyun __field(enum usb_device_speed, max_speed) 26*4882a593Smuzhiyun __field(enum usb_device_state, state) 27*4882a593Smuzhiyun __field(unsigned, mA) 28*4882a593Smuzhiyun __field(unsigned, sg_supported) 29*4882a593Smuzhiyun __field(unsigned, is_otg) 30*4882a593Smuzhiyun __field(unsigned, is_a_peripheral) 31*4882a593Smuzhiyun __field(unsigned, b_hnp_enable) 32*4882a593Smuzhiyun __field(unsigned, a_hnp_support) 33*4882a593Smuzhiyun __field(unsigned, hnp_polling_support) 34*4882a593Smuzhiyun __field(unsigned, host_request_flag) 35*4882a593Smuzhiyun __field(unsigned, quirk_ep_out_aligned_size) 36*4882a593Smuzhiyun __field(unsigned, quirk_altset_not_supp) 37*4882a593Smuzhiyun __field(unsigned, quirk_stall_not_supp) 38*4882a593Smuzhiyun __field(unsigned, quirk_zlp_not_supp) 39*4882a593Smuzhiyun __field(unsigned, is_selfpowered) 40*4882a593Smuzhiyun __field(unsigned, deactivated) 41*4882a593Smuzhiyun __field(unsigned, connected) 42*4882a593Smuzhiyun __field(int, ret) 43*4882a593Smuzhiyun ), 44*4882a593Smuzhiyun TP_fast_assign( 45*4882a593Smuzhiyun __entry->speed = g->speed; 46*4882a593Smuzhiyun __entry->max_speed = g->max_speed; 47*4882a593Smuzhiyun __entry->state = g->state; 48*4882a593Smuzhiyun __entry->mA = g->mA; 49*4882a593Smuzhiyun __entry->sg_supported = g->sg_supported; 50*4882a593Smuzhiyun __entry->is_otg = g->is_otg; 51*4882a593Smuzhiyun __entry->is_a_peripheral = g->is_a_peripheral; 52*4882a593Smuzhiyun __entry->b_hnp_enable = g->b_hnp_enable; 53*4882a593Smuzhiyun __entry->a_hnp_support = g->a_hnp_support; 54*4882a593Smuzhiyun __entry->hnp_polling_support = g->hnp_polling_support; 55*4882a593Smuzhiyun __entry->host_request_flag = g->host_request_flag; 56*4882a593Smuzhiyun __entry->quirk_ep_out_aligned_size = g->quirk_ep_out_aligned_size; 57*4882a593Smuzhiyun __entry->quirk_altset_not_supp = g->quirk_altset_not_supp; 58*4882a593Smuzhiyun __entry->quirk_stall_not_supp = g->quirk_stall_not_supp; 59*4882a593Smuzhiyun __entry->quirk_zlp_not_supp = g->quirk_zlp_not_supp; 60*4882a593Smuzhiyun __entry->is_selfpowered = g->is_selfpowered; 61*4882a593Smuzhiyun __entry->deactivated = g->deactivated; 62*4882a593Smuzhiyun __entry->connected = g->connected; 63*4882a593Smuzhiyun __entry->ret = ret; 64*4882a593Smuzhiyun ), 65*4882a593Smuzhiyun TP_printk("speed %d/%d state %d %dmA [%s%s%s%s%s%s%s%s%s%s%s%s%s%s] --> %d", 66*4882a593Smuzhiyun __entry->speed, __entry->max_speed, __entry->state, __entry->mA, 67*4882a593Smuzhiyun __entry->sg_supported ? "sg:" : "", 68*4882a593Smuzhiyun __entry->is_otg ? "OTG:" : "", 69*4882a593Smuzhiyun __entry->is_a_peripheral ? "a_peripheral:" : "", 70*4882a593Smuzhiyun __entry->b_hnp_enable ? "b_hnp:" : "", 71*4882a593Smuzhiyun __entry->a_hnp_support ? "a_hnp:" : "", 72*4882a593Smuzhiyun __entry->hnp_polling_support ? "hnp_poll:" : "", 73*4882a593Smuzhiyun __entry->host_request_flag ? "hostreq:" : "", 74*4882a593Smuzhiyun __entry->quirk_ep_out_aligned_size ? "out_aligned:" : "", 75*4882a593Smuzhiyun __entry->quirk_altset_not_supp ? "no_altset:" : "", 76*4882a593Smuzhiyun __entry->quirk_stall_not_supp ? "no_stall:" : "", 77*4882a593Smuzhiyun __entry->quirk_zlp_not_supp ? "no_zlp" : "", 78*4882a593Smuzhiyun __entry->is_selfpowered ? "self-powered:" : "bus-powered:", 79*4882a593Smuzhiyun __entry->deactivated ? "deactivated:" : "activated:", 80*4882a593Smuzhiyun __entry->connected ? "connected" : "disconnected", 81*4882a593Smuzhiyun __entry->ret) 82*4882a593Smuzhiyun ); 83*4882a593Smuzhiyun 84*4882a593Smuzhiyun DEFINE_EVENT(udc_log_gadget, usb_gadget_frame_number, 85*4882a593Smuzhiyun TP_PROTO(struct usb_gadget *g, int ret), 86*4882a593Smuzhiyun TP_ARGS(g, ret) 87*4882a593Smuzhiyun ); 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun DEFINE_EVENT(udc_log_gadget, usb_gadget_wakeup, 90*4882a593Smuzhiyun TP_PROTO(struct usb_gadget *g, int ret), 91*4882a593Smuzhiyun TP_ARGS(g, ret) 92*4882a593Smuzhiyun ); 93*4882a593Smuzhiyun 94*4882a593Smuzhiyun DEFINE_EVENT(udc_log_gadget, usb_gadget_set_selfpowered, 95*4882a593Smuzhiyun TP_PROTO(struct usb_gadget *g, int ret), 96*4882a593Smuzhiyun TP_ARGS(g, ret) 97*4882a593Smuzhiyun ); 98*4882a593Smuzhiyun 99*4882a593Smuzhiyun DEFINE_EVENT(udc_log_gadget, usb_gadget_clear_selfpowered, 100*4882a593Smuzhiyun TP_PROTO(struct usb_gadget *g, int ret), 101*4882a593Smuzhiyun TP_ARGS(g, ret) 102*4882a593Smuzhiyun ); 103*4882a593Smuzhiyun 104*4882a593Smuzhiyun DEFINE_EVENT(udc_log_gadget, usb_gadget_vbus_connect, 105*4882a593Smuzhiyun TP_PROTO(struct usb_gadget *g, int ret), 106*4882a593Smuzhiyun TP_ARGS(g, ret) 107*4882a593Smuzhiyun ); 108*4882a593Smuzhiyun 109*4882a593Smuzhiyun DEFINE_EVENT(udc_log_gadget, usb_gadget_vbus_draw, 110*4882a593Smuzhiyun TP_PROTO(struct usb_gadget *g, int ret), 111*4882a593Smuzhiyun TP_ARGS(g, ret) 112*4882a593Smuzhiyun ); 113*4882a593Smuzhiyun 114*4882a593Smuzhiyun DEFINE_EVENT(udc_log_gadget, usb_gadget_vbus_disconnect, 115*4882a593Smuzhiyun TP_PROTO(struct usb_gadget *g, int ret), 116*4882a593Smuzhiyun TP_ARGS(g, ret) 117*4882a593Smuzhiyun ); 118*4882a593Smuzhiyun 119*4882a593Smuzhiyun DEFINE_EVENT(udc_log_gadget, usb_gadget_connect, 120*4882a593Smuzhiyun TP_PROTO(struct usb_gadget *g, int ret), 121*4882a593Smuzhiyun TP_ARGS(g, ret) 122*4882a593Smuzhiyun ); 123*4882a593Smuzhiyun 124*4882a593Smuzhiyun DEFINE_EVENT(udc_log_gadget, usb_gadget_disconnect, 125*4882a593Smuzhiyun TP_PROTO(struct usb_gadget *g, int ret), 126*4882a593Smuzhiyun TP_ARGS(g, ret) 127*4882a593Smuzhiyun ); 128*4882a593Smuzhiyun 129*4882a593Smuzhiyun DEFINE_EVENT(udc_log_gadget, usb_gadget_deactivate, 130*4882a593Smuzhiyun TP_PROTO(struct usb_gadget *g, int ret), 131*4882a593Smuzhiyun TP_ARGS(g, ret) 132*4882a593Smuzhiyun ); 133*4882a593Smuzhiyun 134*4882a593Smuzhiyun DEFINE_EVENT(udc_log_gadget, usb_gadget_activate, 135*4882a593Smuzhiyun TP_PROTO(struct usb_gadget *g, int ret), 136*4882a593Smuzhiyun TP_ARGS(g, ret) 137*4882a593Smuzhiyun ); 138*4882a593Smuzhiyun 139*4882a593Smuzhiyun DECLARE_EVENT_CLASS(udc_log_ep, 140*4882a593Smuzhiyun TP_PROTO(struct usb_ep *ep, int ret), 141*4882a593Smuzhiyun TP_ARGS(ep, ret), 142*4882a593Smuzhiyun TP_STRUCT__entry( 143*4882a593Smuzhiyun __dynamic_array(char, name, UDC_TRACE_STR_MAX) 144*4882a593Smuzhiyun __field(unsigned, maxpacket) 145*4882a593Smuzhiyun __field(unsigned, maxpacket_limit) 146*4882a593Smuzhiyun __field(unsigned, max_streams) 147*4882a593Smuzhiyun __field(unsigned, mult) 148*4882a593Smuzhiyun __field(unsigned, maxburst) 149*4882a593Smuzhiyun __field(u8, address) 150*4882a593Smuzhiyun __field(bool, claimed) 151*4882a593Smuzhiyun __field(bool, enabled) 152*4882a593Smuzhiyun __field(int, ret) 153*4882a593Smuzhiyun ), 154*4882a593Smuzhiyun TP_fast_assign( 155*4882a593Smuzhiyun snprintf(__get_str(name), UDC_TRACE_STR_MAX, "%s", ep->name); 156*4882a593Smuzhiyun __entry->maxpacket = ep->maxpacket; 157*4882a593Smuzhiyun __entry->maxpacket_limit = ep->maxpacket_limit; 158*4882a593Smuzhiyun __entry->max_streams = ep->max_streams; 159*4882a593Smuzhiyun __entry->mult = ep->mult; 160*4882a593Smuzhiyun __entry->maxburst = ep->maxburst; 161*4882a593Smuzhiyun __entry->address = ep->address, 162*4882a593Smuzhiyun __entry->claimed = ep->claimed; 163*4882a593Smuzhiyun __entry->enabled = ep->enabled; 164*4882a593Smuzhiyun __entry->ret = ret; 165*4882a593Smuzhiyun ), 166*4882a593Smuzhiyun TP_printk("%s: mps %d/%d streams %d mult %d burst %d addr %02x %s%s --> %d", 167*4882a593Smuzhiyun __get_str(name), __entry->maxpacket, __entry->maxpacket_limit, 168*4882a593Smuzhiyun __entry->max_streams, __entry->mult, __entry->maxburst, 169*4882a593Smuzhiyun __entry->address, __entry->claimed ? "claimed:" : "released:", 170*4882a593Smuzhiyun __entry->enabled ? "enabled" : "disabled", ret) 171*4882a593Smuzhiyun ); 172*4882a593Smuzhiyun 173*4882a593Smuzhiyun DEFINE_EVENT(udc_log_ep, usb_ep_set_maxpacket_limit, 174*4882a593Smuzhiyun TP_PROTO(struct usb_ep *ep, int ret), 175*4882a593Smuzhiyun TP_ARGS(ep, ret) 176*4882a593Smuzhiyun ); 177*4882a593Smuzhiyun 178*4882a593Smuzhiyun DEFINE_EVENT(udc_log_ep, usb_ep_enable, 179*4882a593Smuzhiyun TP_PROTO(struct usb_ep *ep, int ret), 180*4882a593Smuzhiyun TP_ARGS(ep, ret) 181*4882a593Smuzhiyun ); 182*4882a593Smuzhiyun 183*4882a593Smuzhiyun DEFINE_EVENT(udc_log_ep, usb_ep_disable, 184*4882a593Smuzhiyun TP_PROTO(struct usb_ep *ep, int ret), 185*4882a593Smuzhiyun TP_ARGS(ep, ret) 186*4882a593Smuzhiyun ); 187*4882a593Smuzhiyun 188*4882a593Smuzhiyun DEFINE_EVENT(udc_log_ep, usb_ep_set_halt, 189*4882a593Smuzhiyun TP_PROTO(struct usb_ep *ep, int ret), 190*4882a593Smuzhiyun TP_ARGS(ep, ret) 191*4882a593Smuzhiyun ); 192*4882a593Smuzhiyun 193*4882a593Smuzhiyun DEFINE_EVENT(udc_log_ep, usb_ep_clear_halt, 194*4882a593Smuzhiyun TP_PROTO(struct usb_ep *ep, int ret), 195*4882a593Smuzhiyun TP_ARGS(ep, ret) 196*4882a593Smuzhiyun ); 197*4882a593Smuzhiyun 198*4882a593Smuzhiyun DEFINE_EVENT(udc_log_ep, usb_ep_set_wedge, 199*4882a593Smuzhiyun TP_PROTO(struct usb_ep *ep, int ret), 200*4882a593Smuzhiyun TP_ARGS(ep, ret) 201*4882a593Smuzhiyun ); 202*4882a593Smuzhiyun 203*4882a593Smuzhiyun DEFINE_EVENT(udc_log_ep, usb_ep_fifo_status, 204*4882a593Smuzhiyun TP_PROTO(struct usb_ep *ep, int ret), 205*4882a593Smuzhiyun TP_ARGS(ep, ret) 206*4882a593Smuzhiyun ); 207*4882a593Smuzhiyun 208*4882a593Smuzhiyun DEFINE_EVENT(udc_log_ep, usb_ep_fifo_flush, 209*4882a593Smuzhiyun TP_PROTO(struct usb_ep *ep, int ret), 210*4882a593Smuzhiyun TP_ARGS(ep, ret) 211*4882a593Smuzhiyun ); 212*4882a593Smuzhiyun 213*4882a593Smuzhiyun DECLARE_EVENT_CLASS(udc_log_req, 214*4882a593Smuzhiyun TP_PROTO(struct usb_ep *ep, struct usb_request *req, int ret), 215*4882a593Smuzhiyun TP_ARGS(ep, req, ret), 216*4882a593Smuzhiyun TP_STRUCT__entry( 217*4882a593Smuzhiyun __dynamic_array(char, name, UDC_TRACE_STR_MAX) 218*4882a593Smuzhiyun __field(unsigned, length) 219*4882a593Smuzhiyun __field(unsigned, actual) 220*4882a593Smuzhiyun __field(unsigned, num_sgs) 221*4882a593Smuzhiyun __field(unsigned, num_mapped_sgs) 222*4882a593Smuzhiyun __field(unsigned, stream_id) 223*4882a593Smuzhiyun __field(unsigned, no_interrupt) 224*4882a593Smuzhiyun __field(unsigned, zero) 225*4882a593Smuzhiyun __field(unsigned, short_not_ok) 226*4882a593Smuzhiyun __field(int, status) 227*4882a593Smuzhiyun __field(int, ret) 228*4882a593Smuzhiyun __field(struct usb_request *, req) 229*4882a593Smuzhiyun ), 230*4882a593Smuzhiyun TP_fast_assign( 231*4882a593Smuzhiyun snprintf(__get_str(name), UDC_TRACE_STR_MAX, "%s", ep->name); 232*4882a593Smuzhiyun __entry->length = req->length; 233*4882a593Smuzhiyun __entry->actual = req->actual; 234*4882a593Smuzhiyun __entry->num_sgs = req->num_sgs; 235*4882a593Smuzhiyun __entry->num_mapped_sgs = req->num_mapped_sgs; 236*4882a593Smuzhiyun __entry->stream_id = req->stream_id; 237*4882a593Smuzhiyun __entry->no_interrupt = req->no_interrupt; 238*4882a593Smuzhiyun __entry->zero = req->zero; 239*4882a593Smuzhiyun __entry->short_not_ok = req->short_not_ok; 240*4882a593Smuzhiyun __entry->status = req->status; 241*4882a593Smuzhiyun __entry->ret = ret; 242*4882a593Smuzhiyun __entry->req = req; 243*4882a593Smuzhiyun ), 244*4882a593Smuzhiyun TP_printk("%s: req %p length %d/%d sgs %d/%d stream %d %s%s%s status %d --> %d", 245*4882a593Smuzhiyun __get_str(name),__entry->req, __entry->actual, __entry->length, 246*4882a593Smuzhiyun __entry->num_mapped_sgs, __entry->num_sgs, __entry->stream_id, 247*4882a593Smuzhiyun __entry->zero ? "Z" : "z", 248*4882a593Smuzhiyun __entry->short_not_ok ? "S" : "s", 249*4882a593Smuzhiyun __entry->no_interrupt ? "i" : "I", 250*4882a593Smuzhiyun __entry->status, __entry->ret 251*4882a593Smuzhiyun ) 252*4882a593Smuzhiyun ); 253*4882a593Smuzhiyun 254*4882a593Smuzhiyun DEFINE_EVENT(udc_log_req, usb_ep_alloc_request, 255*4882a593Smuzhiyun TP_PROTO(struct usb_ep *ep, struct usb_request *req, int ret), 256*4882a593Smuzhiyun TP_ARGS(ep, req, ret) 257*4882a593Smuzhiyun ); 258*4882a593Smuzhiyun 259*4882a593Smuzhiyun DEFINE_EVENT(udc_log_req, usb_ep_free_request, 260*4882a593Smuzhiyun TP_PROTO(struct usb_ep *ep, struct usb_request *req, int ret), 261*4882a593Smuzhiyun TP_ARGS(ep, req, ret) 262*4882a593Smuzhiyun ); 263*4882a593Smuzhiyun 264*4882a593Smuzhiyun DEFINE_EVENT(udc_log_req, usb_ep_queue, 265*4882a593Smuzhiyun TP_PROTO(struct usb_ep *ep, struct usb_request *req, int ret), 266*4882a593Smuzhiyun TP_ARGS(ep, req, ret) 267*4882a593Smuzhiyun ); 268*4882a593Smuzhiyun 269*4882a593Smuzhiyun DEFINE_EVENT(udc_log_req, usb_ep_dequeue, 270*4882a593Smuzhiyun TP_PROTO(struct usb_ep *ep, struct usb_request *req, int ret), 271*4882a593Smuzhiyun TP_ARGS(ep, req, ret) 272*4882a593Smuzhiyun ); 273*4882a593Smuzhiyun 274*4882a593Smuzhiyun DEFINE_EVENT(udc_log_req, usb_gadget_giveback_request, 275*4882a593Smuzhiyun TP_PROTO(struct usb_ep *ep, struct usb_request *req, int ret), 276*4882a593Smuzhiyun TP_ARGS(ep, req, ret) 277*4882a593Smuzhiyun ); 278*4882a593Smuzhiyun 279*4882a593Smuzhiyun #endif /* __UDC_TRACE_H */ 280*4882a593Smuzhiyun 281*4882a593Smuzhiyun /* this part has to be here */ 282*4882a593Smuzhiyun 283*4882a593Smuzhiyun #undef TRACE_INCLUDE_PATH 284*4882a593Smuzhiyun #define TRACE_INCLUDE_PATH . 285*4882a593Smuzhiyun 286*4882a593Smuzhiyun #undef TRACE_INCLUDE_FILE 287*4882a593Smuzhiyun #define TRACE_INCLUDE_FILE trace 288*4882a593Smuzhiyun 289*4882a593Smuzhiyun #include <trace/define_trace.h> 290