TP_ARGS(ctx)
 );
 
+DECLARE_EVENT_CLASS(xhci_log_ctrl_ctx,
+       TP_PROTO(struct xhci_input_control_ctx *ctrl_ctx),
+       TP_ARGS(ctrl_ctx),
+       TP_STRUCT__entry(
+               __field(u32, drop)
+               __field(u32, add)
+       ),
+       TP_fast_assign(
+               __entry->drop = le32_to_cpu(ctrl_ctx->drop_flags);
+               __entry->add = le32_to_cpu(ctrl_ctx->add_flags);
+       ),
+       TP_printk("%s", xhci_decode_ctrl_ctx(__entry->drop, __entry->add)
+       )
+);
+
+DEFINE_EVENT(xhci_log_ctrl_ctx, xhci_address_ctrl_ctx,
+       TP_PROTO(struct xhci_input_control_ctx *ctrl_ctx),
+       TP_ARGS(ctrl_ctx)
+);
+
+DEFINE_EVENT(xhci_log_ctrl_ctx, xhci_configure_endpoint_ctrl_ctx,
+       TP_PROTO(struct xhci_input_control_ctx *ctrl_ctx),
+       TP_ARGS(ctrl_ctx)
+);
+
 DECLARE_EVENT_CLASS(xhci_log_ring,
        TP_PROTO(struct xhci_ring *ring),
        TP_ARGS(ring),
 
        }
 
        slot_ctx = xhci_get_slot_ctx(xhci, command->in_ctx);
+
+       trace_xhci_configure_endpoint_ctrl_ctx(ctrl_ctx);
        trace_xhci_configure_endpoint(slot_ctx);
 
        if (!ctx_change)
        trace_xhci_address_ctx(xhci, virt_dev->in_ctx,
                                le32_to_cpu(slot_ctx->dev_info) >> 27);
 
+       trace_xhci_address_ctrl_ctx(ctrl_ctx);
        spin_lock_irqsave(&xhci->lock, flags);
        trace_xhci_setup_device(virt_dev);
        ret = xhci_queue_address_device(xhci, command, virt_dev->in_ctx->dma,
 
        return str;
 }
 
+static inline const char *xhci_decode_ctrl_ctx(unsigned long drop,
+                                              unsigned long add)
+{
+       static char     str[1024];
+       unsigned int    bit;
+       int             ret = 0;
+
+       if (drop) {
+               ret = sprintf(str, "Drop:");
+               for_each_set_bit(bit, &drop, 32)
+                       ret += sprintf(str + ret, " %d%s",
+                                      bit / 2,
+                                      bit % 2 ? "in":"out");
+               ret += sprintf(str + ret, ", ");
+       }
+
+       if (add) {
+               ret += sprintf(str + ret, "Add:%s%s",
+                              (add & SLOT_FLAG) ? " slot":"",
+                              (add & EP0_FLAG) ? " ep0":"");
+               add &= ~(SLOT_FLAG | EP0_FLAG);
+               for_each_set_bit(bit, &add, 32)
+                       ret += sprintf(str + ret, " %d%s",
+                                      bit / 2,
+                                      bit % 2 ? "in":"out");
+       }
+       return str;
+}
+
 static inline const char *xhci_decode_slot_context(u32 info, u32 info2,
                u32 tt_info, u32 state)
 {