it make possible use of fine tunable system. We can set exact verbosity. Use case:
this will enablle all message in module uvcvideo: echo "module uvcvideo +p" > /sys/kernel/debug/dynamic_debug/control this will disable message of function uvc_v4l2_do_ioctl: echo "func uvc_v4l2_do_ioctl -p" > /sys/kernel/debug/dynamic_debug/control Signed-off-by: Alexey Fisher <bug-tr...@fisher-privat.net> --- drivers/media/video/uvc/uvc_queue.c | 8 ++- drivers/media/video/uvc/uvc_v4l2.c | 2 + drivers/media/video/uvc/uvc_video.c | 137 ++++++++++++++++++++++++++++------- 3 files changed, 120 insertions(+), 27 deletions(-) diff --git a/drivers/media/video/uvc/uvc_queue.c b/drivers/media/video/uvc/uvc_queue.c index 36f3c58..19e6cba 100644 --- a/drivers/media/video/uvc/uvc_queue.c +++ b/drivers/media/video/uvc/uvc_queue.c @@ -137,6 +137,9 @@ int uvc_alloc_buffers(struct uvc_video_queue *queue, unsigned int nbuffers, void *mem = NULL; int ret; + pr_debug("%s: nbuffers %u; buflength: %u", __func__, + nbuffers, buflength); + if (nbuffers > UVC_MAX_VIDEO_BUFFERS) nbuffers = UVC_MAX_VIDEO_BUFFERS; @@ -347,8 +350,9 @@ int uvc_dequeue_buffer(struct uvc_video_queue *queue, if ((ret = uvc_queue_waiton(buf, nonblocking)) < 0) goto done; - uvc_trace(UVC_TRACE_CAPTURE, "Dequeuing buffer %u (%u, %u bytes).\n", - buf->buf.index, buf->state, buf->buf.bytesused); + pr_debug("%s: Dequeuing buffer %u (%u, %u/%u bytes).", __func__, + buf->buf.index, buf->state, + buf->buf.length, buf->buf.bytesused); switch (buf->state) { case UVC_BUF_STATE_ERROR: diff --git a/drivers/media/video/uvc/uvc_v4l2.c b/drivers/media/video/uvc/uvc_v4l2.c index fa89ebf..3ba2563 100644 --- a/drivers/media/video/uvc/uvc_v4l2.c +++ b/drivers/media/video/uvc/uvc_v4l2.c @@ -559,6 +559,8 @@ static long uvc_v4l2_do_ioctl(struct file *file, unsigned int cmd, void *arg) struct uvc_streaming *stream = handle->stream; long ret = 0; + pr_debug("%s: cmd: %u", __func__, cmd); + switch (cmd) { /* Query capabilities */ case VIDIOC_QUERYCAP: diff --git a/drivers/media/video/uvc/uvc_video.c b/drivers/media/video/uvc/uvc_video.c index 43f955e..9a95a62 100644 --- a/drivers/media/video/uvc/uvc_video.c +++ b/drivers/media/video/uvc/uvc_video.c @@ -73,6 +73,8 @@ int uvc_query_ctrl(struct uvc_device *dev, __u8 query, __u8 unit, { int ret; + pr_debug("%s", __func__); + ret = __uvc_query_ctrl(dev, query, unit, intfnum, cs, data, size, UVC_CTRL_CONTROL_TIMEOUT); if (ret != size) { @@ -92,6 +94,8 @@ static void uvc_fixup_video_ctrl(struct uvc_streaming *stream, struct uvc_frame *frame = NULL; unsigned int i; + pr_debug("%s", __func__); + if (ctrl->bFormatIndex <= 0 || ctrl->bFormatIndex > stream->nformats) return; @@ -110,9 +114,13 @@ static void uvc_fixup_video_ctrl(struct uvc_streaming *stream, if (!(format->flags & UVC_FMT_FLAG_COMPRESSED) || (ctrl->dwMaxVideoFrameSize == 0 && - stream->dev->uvc_version < 0x0110)) + stream->dev->uvc_version < 0x0110)) { + pr_debug("%s: rewrite dwMaxVideoFrameSize=%u to %u.", + __func__, ctrl->dwMaxVideoFrameSize, + frame->dwMaxVideoFrameBufferSize); ctrl->dwMaxVideoFrameSize = frame->dwMaxVideoFrameBufferSize; + } if (!(format->flags & UVC_FMT_FLAG_COMPRESSED) && stream->dev->quirks & UVC_QUIRK_FIX_BANDWIDTH && @@ -146,6 +154,9 @@ static void uvc_fixup_video_ctrl(struct uvc_streaming *stream, */ bandwidth = max_t(u32, bandwidth, 1024); + pr_debug("%s: rewrite dwMaxPayloadTransferSize=%u to %u.", + __func__, ctrl->dwMaxPayloadTransferSize, bandwidth); + ctrl->dwMaxPayloadTransferSize = bandwidth; } } @@ -157,6 +168,8 @@ static int uvc_get_video_ctrl(struct uvc_streaming *stream, __u16 size; int ret; + pr_debug("%s", __func__); + size = stream->dev->uvc_version >= 0x0110 ? 34 : 26; if ((stream->dev->quirks & UVC_QUIRK_PROBE_DEF) && query == UVC_GET_DEF) @@ -233,6 +246,20 @@ static int uvc_get_video_ctrl(struct uvc_streaming *stream, uvc_fixup_video_ctrl(stream, ctrl); ret = 0; + pr_debug("%s: bmHint: %u; bFormatIndex: %u; bFrameIndex: %u; " + "dwFrameInterval: %u; wKeyFrameRate: %u; " + "wCompQuality: %u; wCompWindowSize: %u; wDelay: %u; " + "dwMaxVideoFrameSize %u; dwMaxPayloadTransferSize: %u", + __func__, ctrl->bmHint, + ctrl->bFormatIndex, + ctrl->bFrameIndex, + ctrl->dwFrameInterval, + ctrl->wKeyFrameRate, + ctrl->wCompQuality, + ctrl->wCompWindowSize, + ctrl->wDelay, + ctrl->dwMaxVideoFrameSize, + ctrl->dwMaxPayloadTransferSize); out: kfree(data); return ret; @@ -245,6 +272,21 @@ static int uvc_set_video_ctrl(struct uvc_streaming *stream, __u16 size; int ret; + pr_debug("%s: bmHint: %u; bFormatIndex: %u; bFrameIndex: %u; " + "dwFrameInterval: %u; wKeyFrameRate: %u; " + "wCompQuality: %u; wCompWindowSize: %u; wDelay: %u; " + "dwMaxVideoFrameSize %u; dwMaxPayloadTransferSize: %u", + __func__, ctrl->bmHint, + ctrl->bFormatIndex, + ctrl->bFrameIndex, + ctrl->dwFrameInterval, + ctrl->wKeyFrameRate, + ctrl->wCompQuality, + ctrl->wCompWindowSize, + ctrl->wDelay, + ctrl->dwMaxVideoFrameSize, + ctrl->dwMaxPayloadTransferSize); + size = stream->dev->uvc_version >= 0x0110 ? 34 : 26; data = kzalloc(size, GFP_KERNEL); if (data == NULL) @@ -292,6 +334,8 @@ int uvc_probe_video(struct uvc_streaming *stream, unsigned int i; int ret; + pr_debug("%s", __func__); + /* Perform probing. The device should adjust the requested values * according to its capabilities. However, some devices, namely the * first generation UVC Logitech webcams, don't implement the Video @@ -349,6 +393,7 @@ done: int uvc_commit_video(struct uvc_streaming *stream, struct uvc_streaming_control *probe) { + pr_debug("%s", __func__); return uvc_set_video_ctrl(stream, probe, 0); } @@ -406,6 +451,8 @@ static int uvc_video_decode_start(struct uvc_streaming *stream, { __u8 fid; + pr_debug("%s", __func__); + /* Sanity checks: * - packet must be at least 2 bytes long * - bHeaderLength value must be at least 2 bytes (see above) @@ -416,8 +463,8 @@ static int uvc_video_decode_start(struct uvc_streaming *stream, /* Skip payloads marked with the error bit ("error frames"). */ if (data[1] & UVC_STREAM_ERR) { - uvc_trace(UVC_TRACE_FRAME, "Dropping payload (error bit " - "set).\n"); + pr_debug("%s: Dropping payload (error bit " + "set).", __func__); return -ENODATA; } @@ -449,8 +496,8 @@ static int uvc_video_decode_start(struct uvc_streaming *stream, struct timespec ts; if (fid == stream->last_fid) { - uvc_trace(UVC_TRACE_FRAME, "Dropping payload (out of " - "sync).\n"); + pr_debug("%s: Dropping payload (out of " + "sync).", __func__); if ((stream->dev->quirks & UVC_QUIRK_STREAM_NO_FID) && (data[1] & UVC_STREAM_EOF)) stream->last_fid ^= UVC_STREAM_FID; @@ -486,8 +533,8 @@ static int uvc_video_decode_start(struct uvc_streaming *stream, * previous payload had the EOF bit set. */ if (fid != stream->last_fid && buf->buf.bytesused != 0) { - uvc_trace(UVC_TRACE_FRAME, "Frame complete (FID bit " - "toggled).\n"); + pr_debug("%s: Frame complete (FID bit " + "toggled).", __func__); buf->state = UVC_BUF_STATE_READY; return -EAGAIN; } @@ -504,6 +551,8 @@ static void uvc_video_decode_data(struct uvc_streaming *stream, unsigned int maxlen, nbytes; void *mem; + pr_debug("%s", __func__); + if (len <= 0) return; @@ -516,7 +565,7 @@ static void uvc_video_decode_data(struct uvc_streaming *stream, /* Complete the current frame if the buffer size was exceeded. */ if (len > maxlen) { - uvc_trace(UVC_TRACE_FRAME, "Frame complete (overflow).\n"); + pr_debug("%s: Frame complete (overflow).", __func__); buf->state = UVC_BUF_STATE_READY; } } @@ -524,11 +573,14 @@ static void uvc_video_decode_data(struct uvc_streaming *stream, static void uvc_video_decode_end(struct uvc_streaming *stream, struct uvc_buffer *buf, const __u8 *data, int len) { + + pr_debug("%s", __func__); + /* Mark the buffer as done if the EOF marker is set. */ if (data[1] & UVC_STREAM_EOF && buf->buf.bytesused != 0) { - uvc_trace(UVC_TRACE_FRAME, "Frame complete (EOF found).\n"); + pr_debug("%s: Frame complete (EOF found).", __func__); if (data[0] == len) - uvc_trace(UVC_TRACE_FRAME, "EOF in empty payload.\n"); + pr_debug("%s: EOF in empty payload.", __func__); buf->state = UVC_BUF_STATE_READY; if (stream->dev->quirks & UVC_QUIRK_STREAM_NO_FID) stream->last_fid ^= UVC_STREAM_FID; @@ -549,6 +601,8 @@ static void uvc_video_decode_end(struct uvc_streaming *stream, static int uvc_video_encode_header(struct uvc_streaming *stream, struct uvc_buffer *buf, __u8 *data, int len) { + pr_debug("%s", __func__); + data[0] = 2; /* Header length */ data[1] = UVC_STREAM_EOH | UVC_STREAM_EOF | (stream->last_fid & UVC_STREAM_FID); @@ -562,6 +616,8 @@ static int uvc_video_encode_data(struct uvc_streaming *stream, unsigned int nbytes; void *mem; + pr_debug("%s", __func__); + /* Copy video data to the URB buffer. */ mem = queue->mem + buf->buf.m.offset + queue->buf_used; nbytes = min((unsigned int)len, buf->buf.bytesused - queue->buf_used); @@ -587,10 +643,13 @@ static void uvc_video_decode_isoc(struct urb *urb, struct uvc_streaming *stream, u8 *mem; int ret, i; + pr_debug("%s", __func__); + for (i = 0; i < urb->number_of_packets; ++i) { if (urb->iso_frame_desc[i].status < 0) { - uvc_trace(UVC_TRACE_FRAME, "USB isochronous frame " - "lost (%d).\n", urb->iso_frame_desc[i].status); + pr_debug("%s: USB isochronous frame " + "lost (%d).", __func__, + urb->iso_frame_desc[i].status); /* Mark the buffer as faulty. */ if (buf != NULL) buf->error = 1; @@ -635,6 +694,8 @@ static void uvc_video_decode_bulk(struct urb *urb, struct uvc_streaming *stream, u8 *mem; int len, ret; + pr_debug("%s", __func__); + if (urb->actual_length == 0) return; @@ -699,6 +760,8 @@ static void uvc_video_encode_bulk(struct urb *urb, struct uvc_streaming *stream, u8 *mem = urb->transfer_buffer; int len = stream->urb_size, ret; + pr_debug("%s", __func__); + if (buf == NULL) { urb->transfer_buffer_length = 0; return; @@ -744,6 +807,8 @@ static void uvc_video_complete(struct urb *urb) unsigned long flags; int ret; + pr_debug("%s", __func__); + switch (urb->status) { case 0: break; @@ -783,6 +848,8 @@ static void uvc_free_urb_buffers(struct uvc_streaming *stream) { unsigned int i; + pr_debug("%s", __func__); + for (i = 0; i < UVC_URBS; ++i) { if (stream->urb_buffer[i]) { usb_free_coherent(stream->dev->udev, stream->urb_size, @@ -811,6 +878,8 @@ static int uvc_alloc_urb_buffers(struct uvc_streaming *stream, unsigned int npackets; unsigned int i; + pr_debug("%s", __func__); + /* Buffers are already allocated, bail out. */ if (stream->urb_size) return stream->urb_size / psize; @@ -836,15 +905,15 @@ static int uvc_alloc_urb_buffers(struct uvc_streaming *stream, } if (i == UVC_URBS) { - uvc_trace(UVC_TRACE_VIDEO, "Allocated %u URB buffers " - "of %ux%u bytes each.\n", UVC_URBS, npackets, - psize); + pr_debug("%s: Allocated %u URB buffers " + "of %ux%u bytes each.", __func__, + UVC_URBS, npackets, psize); return npackets; } } - uvc_trace(UVC_TRACE_VIDEO, "Failed to allocate URB buffers (%u bytes " - "per packet).\n", psize); + pr_debug("%s: Failed to allocate URB buffers (%u bytes " + "per packet).", __func__, psize); return 0; } @@ -856,6 +925,8 @@ static void uvc_uninit_video(struct uvc_streaming *stream, int free_buffers) struct urb *urb; unsigned int i; + pr_debug("%s", __func__); + for (i = 0; i < UVC_URBS; ++i) { urb = stream->urb[i]; if (urb == NULL) @@ -882,6 +953,8 @@ static int uvc_init_video_isoc(struct uvc_streaming *stream, u16 psize; u32 size; + pr_debug("%s", __func__); + psize = le16_to_cpu(ep->desc.wMaxPacketSize); psize = (psize & 0x07ff) * (1 + ((psize >> 11) & 3)); size = stream->ctrl.dwMaxVideoFrameSize; @@ -934,6 +1007,8 @@ static int uvc_init_video_bulk(struct uvc_streaming *stream, u16 psize; u32 size; + pr_debug("%s", __func__); + psize = le16_to_cpu(ep->desc.wMaxPacketSize) & 0x07ff; size = stream->ctrl.dwMaxPayloadTransferSize; stream->bulk.max_payload_size = size; @@ -983,6 +1058,8 @@ static int uvc_init_video(struct uvc_streaming *stream, gfp_t gfp_flags) unsigned int i; int ret; + pr_debug("%s", __func__); + stream->sequence = -1; stream->last_fid = -1; stream->bulk.header_size = 0; @@ -1000,12 +1077,12 @@ static int uvc_init_video(struct uvc_streaming *stream, gfp_t gfp_flags) bandwidth = stream->ctrl.dwMaxPayloadTransferSize; if (bandwidth == 0) { - uvc_trace(UVC_TRACE_VIDEO, "Device requested null " - "bandwidth, defaulting to lowest.\n"); + pr_debug("%s: Device requested null " + "bandwidth, defaulting to lowest.", __func__); bandwidth = 1; } else { - uvc_trace(UVC_TRACE_VIDEO, "Device requested %u " - "B/frame bandwidth.\n", bandwidth); + pr_debug("%s: Device requested %u " + "B/frame bandwidth.", __func__, bandwidth); } for (i = 0; i < intf->num_altsetting; ++i) { @@ -1029,13 +1106,14 @@ static int uvc_init_video(struct uvc_streaming *stream, gfp_t gfp_flags) } if (best_ep == NULL) { - uvc_trace(UVC_TRACE_VIDEO, "No fast enough alt setting " - "for requested bandwidth.\n"); + pr_debug("%s: No fast enough alt setting " + "for requested bandwidth.", __func__); return -EIO; } - uvc_trace(UVC_TRACE_VIDEO, "Selecting alternate setting %u " - "(%u B/frame bandwidth).\n", altsetting, best_psize); + pr_debug("%s: Selecting alternate setting %u " + "(%u B/frame bandwidth).", __func__, + altsetting, best_psize); ret = usb_set_interface(stream->dev->udev, intfnum, altsetting); if (ret < 0) @@ -1082,6 +1160,9 @@ static int uvc_init_video(struct uvc_streaming *stream, gfp_t gfp_flags) */ int uvc_video_suspend(struct uvc_streaming *stream) { + + pr_debug("%s", __func__); + if (!uvc_queue_streaming(&stream->queue)) return 0; @@ -1103,6 +1184,8 @@ int uvc_video_resume(struct uvc_streaming *stream) { int ret; + pr_debug("%s", __func__); + stream->frozen = 0; ret = uvc_commit_video(stream, &stream->ctrl); @@ -1143,6 +1226,8 @@ int uvc_video_init(struct uvc_streaming *stream) unsigned int i; int ret; + pr_debug("%s", __func__); + if (stream->nformats == 0) { uvc_printk(KERN_INFO, "No supported video formats found.\n"); return -EINVAL; @@ -1237,6 +1322,8 @@ int uvc_video_enable(struct uvc_streaming *stream, int enable) { int ret; + pr_debug("%s", __func__); + if (!enable) { uvc_uninit_video(stream, 1); usb_set_interface(stream->dev->udev, stream->intfnum, 0); -- 1.7.1 _______________________________________________ Linux-uvc-devel mailing list Linux-uvc-devel@lists.berlios.de https://lists.berlios.de/mailman/listinfo/linux-uvc-devel