// SPDX-License-Identifier: GPL-2.0 /* usb-urb.c is part of the DVB USB library. * * Copyright (C) 2004-6 Patrick Boettcher (patrick.boettcher@posteo.de) * see dvb-usb-init.c for copyright information. * * This file keeps functions for initializing and handling the * BULK and ISOC USB data transfers in a generic way. * Can be used for DVB-only and also, that's the plan, for * Hybrid USB devices (analog and DVB).
*/ #include"dvb-usb-common.h"
/* URB stuff for streaming */ staticvoid usb_urb_complete(struct urb *urb)
{ struct usb_data_stream *stream = urb->context; int ptype = usb_pipetype(urb->pipe); int i;
u8 *b;
switch (urb->status) { case 0: /* success */ case -ETIMEDOUT: /* NAK */ break; case -ECONNRESET: /* kill */ case -ENOENT: case -ESHUTDOWN: return; default: /* error */
deb_ts("urb completion error %d.\n", urb->status); break;
}
b = (u8 *) urb->transfer_buffer; switch (ptype) { case PIPE_ISOCHRONOUS: for (i = 0; i < urb->number_of_packets; i++) {
if (urb->iso_frame_desc[i].status != 0)
deb_ts("iso frame descriptor has an error: %d\n",urb->iso_frame_desc[i].status); elseif (urb->iso_frame_desc[i].actual_length > 0)
stream->complete(stream, b + urb->iso_frame_desc[i].offset, urb->iso_frame_desc[i].actual_length);
urb->iso_frame_desc[i].status = 0;
urb->iso_frame_desc[i].actual_length = 0;
}
debug_dump(b,20,deb_uxfer); break; case PIPE_BULK: if (urb->actual_length > 0)
stream->complete(stream, b, urb->actual_length); break; default:
err("unknown endpoint type in completion handler."); return;
}
usb_submit_urb(urb,GFP_ATOMIC);
}
int usb_urb_kill(struct usb_data_stream *stream)
{ int i; for (i = 0; i < stream->urbs_submitted; i++) {
deb_ts("killing URB no. %d.\n",i);
int usb_urb_submit(struct usb_data_stream *stream)
{ int i,ret; for (i = 0; i < stream->urbs_initialized; i++) {
deb_ts("submitting URB no. %d\n",i); if ((ret = usb_submit_urb(stream->urb_list[i],GFP_ATOMIC))) {
err("could not submit URB no. %d - get them all back",i);
usb_urb_kill(stream); return ret;
}
stream->urbs_submitted++;
} return 0;
}
if (stream->complete == NULL) {
err("there is no data callback - this doesn't make sense."); return -EINVAL;
}
switch (stream->props.type) { case USB_BULK: return usb_bulk_urb_init(stream); case USB_ISOC: return usb_isoc_urb_init(stream); default:
err("unknown URB-type for data transfer."); return -EINVAL;
}
}
int usb_urb_exit(struct usb_data_stream *stream)
{ int i;
usb_urb_kill(stream);
for (i = 0; i < stream->urbs_initialized; i++) { if (stream->urb_list[i] != NULL) {
deb_mem("freeing URB no. %d.\n",i); /* free the URBs */
usb_free_urb(stream->urb_list[i]);
}
}
stream->urbs_initialized = 0;
usb_free_stream_buffers(stream); return 0;
}
Messung V0.5
¤ Dauer der Verarbeitung: 0.11 Sekunden
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.