static void mon_text_error(void *data, struct urb *urb, int error) { struct mon_reader_text *rp = data; struct mon_event_text *ep; if (rp->nevents >= EVENT_MAX || (ep = kmem_cache_alloc(rp->e_slab, GFP_ATOMIC)) == NULL) { rp->r.m_bus->cnt_text_lost++; return; } ep->type = 'E'; ep->id = (unsigned long) urb; ep->busnum = urb->dev->bus->busnum; ep->devnum = urb->dev->devnum; ep->epnum = usb_endpoint_num(&urb->ep->desc); ep->xfertype = usb_endpoint_type(&urb->ep->desc); ep->is_in = usb_urb_dir_in(urb); ep->tstamp = mon_get_timestamp(); ep->length = 0; ep->status = error; ep->setup_flag = '-'; ep->data_flag = 'E'; rp->nevents++; list_add_tail(&ep->e_link, &rp->e_list); wake_up(&rp->wait); }
static void mon_text_event(struct mon_reader_text *rp, struct urb *urb, char ev_type) { struct mon_event_text *ep; unsigned int stamp; stamp = mon_get_timestamp(); if (rp->nevents >= EVENT_MAX || (ep = kmem_cache_alloc(rp->e_slab, SLAB_ATOMIC)) == NULL) { rp->r.m_bus->cnt_text_lost++; return; } ep->type = ev_type; ep->pipe = urb->pipe; ep->id = (unsigned long) urb; ep->tstamp = stamp; ep->length = (ev_type == 'S') ? urb->transfer_buffer_length : urb->actual_length; /* Collecting status makes debugging sense for submits, too */ ep->status = urb->status; ep->setup_flag = mon_text_get_setup(ep, urb, ev_type); ep->data_flag = mon_text_get_data(ep, urb, ep->length, ev_type); rp->nevents++; list_add_tail(&ep->e_link, &rp->e_list); wake_up(&rp->wait); }
static void mon_text_event(struct mon_reader_text *rp, struct urb *urb, char ev_type, int status) { struct mon_event_text *ep; unsigned int stamp; struct usb_iso_packet_descriptor *fp; struct mon_iso_desc *dp; int i, ndesc; stamp = mon_get_timestamp(); if (rp->nevents >= EVENT_MAX || (ep = kmem_cache_alloc(rp->e_slab, GFP_ATOMIC)) == NULL) { rp->r.m_bus->cnt_text_lost++; return; } ep->type = ev_type; ep->id = (unsigned long) urb; ep->busnum = urb->dev->bus->busnum; ep->devnum = urb->dev->devnum; ep->epnum = usb_endpoint_num(&urb->ep->desc); ep->xfertype = usb_endpoint_type(&urb->ep->desc); ep->is_in = usb_urb_dir_in(urb); ep->tstamp = stamp; ep->length = (ev_type == 'S') ? urb->transfer_buffer_length : urb->actual_length; /* Collecting status makes debugging sense for submits, too */ ep->status = status; if (ep->xfertype == USB_ENDPOINT_XFER_INT) { ep->interval = urb->interval; } else if (ep->xfertype == USB_ENDPOINT_XFER_ISOC) { ep->interval = urb->interval; ep->start_frame = urb->start_frame; ep->error_count = urb->error_count; } ep->numdesc = urb->number_of_packets; if (ep->xfertype == USB_ENDPOINT_XFER_ISOC && urb->number_of_packets > 0) { if ((ndesc = urb->number_of_packets) > ISODESC_MAX) ndesc = ISODESC_MAX; fp = urb->iso_frame_desc; dp = ep->isodesc; for (i = 0; i < ndesc; i++) { dp->status = fp->status; dp->offset = fp->offset; dp->length = (ev_type == 'S') ? fp->length : fp->actual_length; fp++; dp++; } /* Wasteful, but simple to understand: ISO 'C' is sparse. */ if (ev_type == 'C') ep->length = urb->transfer_buffer_length; } ep->setup_flag = mon_text_get_setup(ep, urb, ev_type, rp->r.m_bus); ep->data_flag = mon_text_get_data(ep, urb, ep->length, ev_type, rp->r.m_bus); rp->nevents++; list_add_tail(&ep->e_link, &rp->e_list); wake_up(&rp->wait); }