/* show_timestamp: displays the timestamp buffer */ static ssize_t show_timestamp(struct file *file, char __user *ubuf, size_t count, loff_t *ppos) { unsigned long flags; unsigned i; unsigned j = 0; char *buf; int ret = 0; if (!record_timestamp) return 0; buf = kzalloc(sizeof(char) * 4 * DEBUG_BUF_SIZE, GFP_KERNEL); if (!buf) return -ENOMEM; read_lock_irqsave(&dbg_data.lck, flags); i = dbg_data.idx; for (dbg_inc(&i); i != dbg_data.idx; dbg_inc(&i)) { if (!strnlen(dbg_data.buf[i], DBG_DATA_MSG)) continue; j += scnprintf(buf + j, (4 * DEBUG_BUF_SIZE) - j, "%s\n", dbg_data.buf[i]); } read_unlock_irqrestore(&dbg_data.lck, flags); ret = simple_read_from_buffer(ubuf, count, ppos, buf, j); kfree(buf); return ret; }
static int ehci_hsic_msm_ctrl_events_show(struct seq_file *s, void *unused) { unsigned long flags; unsigned i; read_lock_irqsave(&dbg_hsic_ctrl.lck, flags); i = dbg_hsic_ctrl.idx; for (dbg_inc(&i); i != dbg_hsic_ctrl.idx; dbg_inc(&i)) { if (!strnlen(dbg_hsic_ctrl.buf[i], DBG_MSG_LEN)) continue; seq_printf(s, "%s\n", dbg_hsic_ctrl.buf[i]); } read_unlock_irqrestore(&dbg_hsic_ctrl.lck, flags); return 0; }
/** * dbg_timestamp - Stores timestamp values of a SKB life cycle * to debug buffer * @event: "UL": Uplink Data * @skb: SKB used to store timestamp values to debug buffer */ static void dbg_timestamp(char *event, struct sk_buff * skb) { unsigned long flags; struct timestamp_info *info = (struct timestamp_info *)skb->cb; if (!record_timestamp) return; write_lock_irqsave(&dbg_data.lck, flags); scnprintf(dbg_data.buf[dbg_data.idx], DBG_DATA_MSG, "%p %u[%s] %u %u %u %u %u %u\n", skb, skb->len, event, info->created, info->rx_queued, info->rx_done, info->rx_done_sent, info->tx_queued, get_timestamp()); dbg_inc(&dbg_data.idx); write_unlock_irqrestore(&dbg_data.lck, flags); }
static void dbg_log_event(struct urb *urb, char * event, unsigned extra) { unsigned long flags; int ep_addr; char tbuf[TIME_BUF_LEN]; if (!enable_dbg_log) return; if (!urb) { write_lock_irqsave(&dbg_hsic_ctrl.lck, flags); scnprintf(dbg_hsic_ctrl.buf[dbg_hsic_ctrl.idx], DBG_MSG_LEN, "%s: %s : %u\n", get_timestamp(tbuf), event, extra); dbg_inc(&dbg_hsic_ctrl.idx); write_unlock_irqrestore(&dbg_hsic_ctrl.lck, flags); return; } ep_addr = urb->ep->desc.bEndpointAddress; if (!allow_dbg_log(ep_addr)) return; if ((ep_addr & 0x0f) == 0x0) { /*submit event*/ if (!str_to_event(event)) { write_lock_irqsave(&dbg_hsic_ctrl.lck, flags); scnprintf(dbg_hsic_ctrl.buf[dbg_hsic_ctrl.idx], DBG_MSG_LEN, "%s: [%s : %p]:[%s] " "%02x %02x %04x %04x %04x %u %d\n", get_timestamp(tbuf), event, urb, (ep_addr & USB_DIR_IN) ? "in" : "out", urb->setup_packet[0], urb->setup_packet[1], (urb->setup_packet[3] << 8) | urb->setup_packet[2], (urb->setup_packet[5] << 8) | urb->setup_packet[4], (urb->setup_packet[7] << 8) | urb->setup_packet[6], urb->transfer_buffer_length, urb->status); dbg_inc(&dbg_hsic_ctrl.idx); write_unlock_irqrestore(&dbg_hsic_ctrl.lck, flags); } else { write_lock_irqsave(&dbg_hsic_ctrl.lck, flags); scnprintf(dbg_hsic_ctrl.buf[dbg_hsic_ctrl.idx], DBG_MSG_LEN, "%s: [%s : %p]:[%s] %u %d\n", get_timestamp(tbuf), event, urb, (ep_addr & USB_DIR_IN) ? "in" : "out", urb->actual_length, extra); dbg_inc(&dbg_hsic_ctrl.idx); write_unlock_irqrestore(&dbg_hsic_ctrl.lck, flags); } } else { write_lock_irqsave(&dbg_hsic_data.lck, flags); scnprintf(dbg_hsic_data.buf[dbg_hsic_data.idx], DBG_MSG_LEN, "%s: [%s : %p]:ep%d[%s] %u %d\n", get_timestamp(tbuf), event, urb, ep_addr & 0x0f, (ep_addr & USB_DIR_IN) ? "in" : "out", str_to_event(event) ? urb->actual_length : urb->transfer_buffer_length, str_to_event(event) ? extra : urb->status); dbg_inc(&dbg_hsic_data.idx); write_unlock_irqrestore(&dbg_hsic_data.lck, flags); } }
void __maybe_unused xhci_dbg_log_event(struct dbg_data *d, struct urb *urb, char *event, unsigned extra) { unsigned long flags; int ep_addr; char tbuf[TIME_BUF_LEN]; char dbuf[HEX_DUMP_LEN]; if (!d->log_events) return; if (!urb) { write_lock_irqsave(&d->ctrl_lck, flags); scnprintf(d->ctrl_buf[d->ctrl_idx], DBG_MSG_LEN, "%s: %s : %d", get_timestamp(tbuf), event, extra); dbg_inc(&d->ctrl_idx); write_unlock_irqrestore(&d->ctrl_lck, flags); return; } ep_addr = urb->ep->desc.bEndpointAddress; if (!check_log_mask(d, ep_addr, urb)) return; if ((ep_addr & 0x0f) == 0x0) { /*submit event*/ if (!xhci_str_to_event(event)) { write_lock_irqsave(&d->ctrl_lck, flags); scnprintf(d->ctrl_buf[d->ctrl_idx], DBG_MSG_LEN, "%s: [%s : %p]:[%s] " "%02x %02x %04x %04x %04x %u %d %s", get_timestamp(tbuf), event, urb, usb_urb_dir_in(urb) ? "in" : "out", urb->setup_packet[0], urb->setup_packet[1], (urb->setup_packet[3] << 8) | urb->setup_packet[2], (urb->setup_packet[5] << 8) | urb->setup_packet[4], (urb->setup_packet[7] << 8) | urb->setup_packet[6], urb->transfer_buffer_length, extra, d->log_payload ? get_hex_data(dbuf, urb, xhci_str_to_event(event), extra, 16) : ""); dbg_inc(&d->ctrl_idx); write_unlock_irqrestore(&d->ctrl_lck, flags); } else { write_lock_irqsave(&d->ctrl_lck, flags); scnprintf(d->ctrl_buf[d->ctrl_idx], DBG_MSG_LEN, "%s: [%s : %p]:[%s] %u %d %s", get_timestamp(tbuf), event, urb, usb_urb_dir_in(urb) ? "in" : "out", urb->actual_length, extra, d->log_payload ? get_hex_data(dbuf, urb, xhci_str_to_event(event), extra, 16) : ""); dbg_inc(&d->ctrl_idx); write_unlock_irqrestore(&d->ctrl_lck, flags); } } else { write_lock_irqsave(&d->data_lck, flags); scnprintf(d->data_buf[d->data_idx], DBG_MSG_LEN, "%s: [%s : %p]:ep%d[%s] %u %d %s", get_timestamp(tbuf), event, urb, ep_addr & 0x0f, usb_urb_dir_in(urb) ? "in" : "out", xhci_str_to_event(event) ? urb->actual_length : urb->transfer_buffer_length, extra, d->log_payload ? get_hex_data(dbuf, urb, xhci_str_to_event(event), extra, 32) : ""); dbg_inc(&d->data_idx); write_unlock_irqrestore(&d->data_lck, flags); } }