Hi Philip, i probably will not solve your problem but i wont to take a look on it. Can you please apply attached debug patch and send me the log. this patch was made on top of fd2b6dd22743f7c96f7c6e97d49ff5f4b422e741
Make sure you have CONFIG_DYNAMIC_DEBUG=y enabled. To start dynamic debug you need do as root: echo "module uvcvideo +p" > /sys/kernel/debug/dynamic_debug/control echo "func uvc_video_decode_end -p" > /sys/kernel/debug/dynamic_debug/control echo "func uvc_video_decode_start -p" > /sys/kernel/debug/dynamic_debug/control echo "func uvc_video_decode_data -p" > /sys/kernel/debug/dynamic_debug/control echo "func uvc_video_decode_isoc -p" > /sys/kernel/debug/dynamic_debug/control echo "func uvc_video_complete -p" > /sys/kernel/debug/dynamic_debug/control echo "func uvc_v4l2_do_ioctl -p" > /sys/kernel/debug/dynamic_debug/control and start video with this, it will make onlöy one shot: gst-launch-0.10 -v v4l2src num-buffers=1 ! jpegdec ! ffmpegcolorspace ! autovideosink Am Sonntag, den 06.03.2011, 17:30 -0500 schrieb Philip Gladstone: > It turned out that my kernel had an old uvcvideo module which didn't > have the right debug log messages, and so I'm in the process of > upgrading to a current kernel version. So far, I've managed to render my > machine unbootable [it is a little embedded linux box]. > > Philip > > On 3/6/2011 6:14 AM, Laurent Pinchart wrote: > > Hi Philip, > > > > On Sunday 20 February 2011 21:57:24 Philip Gladstone wrote: > >> I attached two C910s to a small linux box, and ran into the 'Failed to > >> submit URB' problem. > >> > >> When I look at the descriptors for this camera, I think I understand the > >> problem. I'm capturing at 5 Mpixels and I'm trying two cameras. > >> > >> VideoStreaming Interface Descriptor: > >> bLength 38 > >> bDescriptorType 36 > >> bDescriptorSubtype 7 (FRAME_MJPEG) > >> bFrameIndex 28 > >> bmCapabilities 0x01 > >> Still image supported > >> wWidth 2592 > >> wHeight 1944 > >> dwMinBitRate 403107840 > >> dwMaxBitRate 806215680 > >> dwMaxVideoFrameBufferSize 10077696 > >> dwDefaultFrameInterval 1000000 > >> bFrameIntervalType 3 > >> dwFrameInterval( 0) 1000000 > >> dwFrameInterval( 1) 1333333 > >> dwFrameInterval( 2) 2000000 > >> > >> The video frame size is set to 10Mb. This is surprisingly large as > >> actual frames captured with MJPEG on this camera are typically 500kb or > >> less. When I checked the descriptor for the uncompressed version of the > >> same frame, it came back with the same value of dwMaxVideoFrameBufferSize > >> (effectively 16 bits per pixel). The values for min/max bit rate are > >> (correctly) calculated from the frame intervals and the buffer size. > > > > The uvcvideo driver doesn't use the dwMaxVideoFrameBufferSize field to > > compute > > the required bandwidth but queries the device at runtime instead. > > > > You can enable the UVC_TRACE_VIDEO trace flag to get the driver to print the > > bandwidth requested by the device to the kernel log. > > > >> Typical JPEG compression gets down to 1 bit per pixel, and 2 bits is > >> very unusual. > >> > >> What I want to know is what the impact would be of defining a new QUIRK > >> that overrode the frame buffer size for compressed frames and calculated > >> them at (say) 2 bits per pixel? > >> > >> Do other webcams get this right? > > > > You would be surprised by how many webcams get things wrong. > > > -- Regards, Alexey
diff --git a/drivers/media/video/uvc/uvc_driver.c b/drivers/media/video/uvc/uvc_driver.c index e41285a..f00a317 100644 --- a/drivers/media/video/uvc/uvc_driver.c +++ b/drivers/media/video/uvc/uvc_driver.c @@ -303,9 +303,9 @@ static int uvc_parse_format(struct uvc_device *dev, case UVC_VS_FORMAT_FRAME_BASED: n = buffer[2] == UVC_VS_FORMAT_UNCOMPRESSED ? 27 : 28; if (buflen < n) { - uvc_trace(UVC_TRACE_DESCR, "device %d videostreaming " - "interface %d FORMAT error\n", - dev->udev->devnum, + pr_debug("%s: device %d videostreaming " + "interface %d FORMAT error.", + __func__, dev->udev->devnum, alts->desc.bInterfaceNumber); return -EINVAL; } @@ -337,9 +337,9 @@ static int uvc_parse_format(struct uvc_device *dev, case UVC_VS_FORMAT_MJPEG: if (buflen < 11) { - uvc_trace(UVC_TRACE_DESCR, "device %d videostreaming " - "interface %d FORMAT error\n", - dev->udev->devnum, + pr_debug("%s: device %d videostreaming " + "interface %d FORMAT error.", + __func__, dev->udev->devnum, alts->desc.bInterfaceNumber); return -EINVAL; } @@ -353,9 +353,9 @@ static int uvc_parse_format(struct uvc_device *dev, case UVC_VS_FORMAT_DV: if (buflen < 9) { - uvc_trace(UVC_TRACE_DESCR, "device %d videostreaming " - "interface %d FORMAT error\n", - dev->udev->devnum, + pr_debug("%s: device %d videostreaming " + "interface %d FORMAT error", + __func__, dev->udev->devnum, alts->desc.bInterfaceNumber); return -EINVAL; } @@ -371,9 +371,9 @@ static int uvc_parse_format(struct uvc_device *dev, strlcpy(format->name, "HD-DV", sizeof format->name); break; default: - uvc_trace(UVC_TRACE_DESCR, "device %d videostreaming " - "interface %d: unknown DV format %u\n", - dev->udev->devnum, + pr_debug("%s: device %d videostreaming " + "interface %d: unknown DV format %u.", + __func__, dev->udev->devnum, alts->desc.bInterfaceNumber, buffer[8]); return -EINVAL; } @@ -400,14 +400,14 @@ static int uvc_parse_format(struct uvc_device *dev, case UVC_VS_FORMAT_STREAM_BASED: /* Not supported yet. */ default: - uvc_trace(UVC_TRACE_DESCR, "device %d videostreaming " - "interface %d unsupported format %u\n", - dev->udev->devnum, alts->desc.bInterfaceNumber, - buffer[2]); + pr_debug("%s: device %d videostreaming " + "interface %d unsupported format %u.", + __func__, dev->udev->devnum, + alts->desc.bInterfaceNumber, buffer[2]); return -EINVAL; } - uvc_trace(UVC_TRACE_DESCR, "Found format %s.\n", format->name); + pr_debug("%s: Found format %s.", __func__, format->name); buflen -= buffer[0]; buffer += buffer[0]; @@ -426,8 +426,9 @@ static int uvc_parse_format(struct uvc_device *dev, n = n ? n : 3; if (buflen < 26 + 4*n) { - uvc_trace(UVC_TRACE_DESCR, "device %d videostreaming " - "interface %d FRAME error\n", dev->udev->devnum, + pr_debug("%s: device %d videostreaming " + "interface %d FRAME error.", + __func__, dev->udev->devnum, alts->desc.bInterfaceNumber); return -EINVAL; } @@ -489,8 +490,8 @@ static int uvc_parse_format(struct uvc_device *dev, frame->dwDefaultFrameInterval; } - uvc_trace(UVC_TRACE_DESCR, "- %ux%u (%u.%u fps)\n", - frame->wWidth, frame->wHeight, + pr_debug("%s: - %ux%u (%u.%u fps)", + __func__, frame->wWidth, frame->wHeight, 10000000/frame->dwDefaultFrameInterval, (100000000/frame->dwDefaultFrameInterval)%10); @@ -508,9 +509,9 @@ static int uvc_parse_format(struct uvc_device *dev, if (buflen > 2 && buffer[1] == USB_DT_CS_INTERFACE && buffer[2] == UVC_VS_COLORFORMAT) { if (buflen < 6) { - uvc_trace(UVC_TRACE_DESCR, "device %d videostreaming " - "interface %d COLORFORMAT error\n", - dev->udev->devnum, + pr_debug("%s: device %d videostreaming " + "interface %d COLORFORMAT error.", + __func__, dev->udev->devnum, alts->desc.bInterfaceNumber); return -EINVAL; } @@ -541,15 +542,16 @@ static int uvc_parse_streaming(struct uvc_device *dev, if (intf->cur_altsetting->desc.bInterfaceSubClass != UVC_SC_VIDEOSTREAMING) { - uvc_trace(UVC_TRACE_DESCR, "device %d interface %d isn't a " - "video streaming interface\n", dev->udev->devnum, + pr_debug("%s: device %d interface %d isn't a " + "video streaming interface", __func__, + dev->udev->devnum, intf->altsetting[0].desc.bInterfaceNumber); return -EINVAL; } if (usb_driver_claim_interface(&uvc_driver.driver, intf, dev)) { - uvc_trace(UVC_TRACE_DESCR, "device %d interface %d is already " - "claimed\n", dev->udev->devnum, + pr_debug("%s: device %d interface %d is already " + "claimed.", __func__, dev->udev->devnum, intf->altsetting[0].desc.bInterfaceNumber); return -EINVAL; } @@ -577,8 +579,9 @@ static int uvc_parse_streaming(struct uvc_device *dev, if (ep->extralen > 2 && ep->extra[1] == USB_DT_CS_INTERFACE) { - uvc_trace(UVC_TRACE_DESCR, "trying extra data " - "from endpoint %u.\n", i); + pr_debug("%s: trying extra data " + "from endpoint %u.", + __func__, i); buffer = alts->endpoint[i].extra; buflen = alts->endpoint[i].extralen; break; @@ -593,8 +596,8 @@ static int uvc_parse_streaming(struct uvc_device *dev, } if (buflen <= 2) { - uvc_trace(UVC_TRACE_DESCR, "no class-specific streaming " - "interface descriptors found.\n"); + pr_debug("%s: no class-specific streaming " + "interface descriptors found.", __func__); goto error; } @@ -611,9 +614,9 @@ static int uvc_parse_streaming(struct uvc_device *dev, break; default: - uvc_trace(UVC_TRACE_DESCR, "device %d videostreaming interface " - "%d HEADER descriptor not found.\n", dev->udev->devnum, - alts->desc.bInterfaceNumber); + pr_debug("%s: device %d videostreaming interface " + "%d HEADER descriptor not found.", __func__, + dev->udev->devnum, alts->desc.bInterfaceNumber); goto error; } @@ -621,9 +624,10 @@ static int uvc_parse_streaming(struct uvc_device *dev, n = buflen >= size ? buffer[size-1] : 0; if (buflen < size + p*n) { - uvc_trace(UVC_TRACE_DESCR, "device %d videostreaming " - "interface %d HEADER descriptor is invalid.\n", - dev->udev->devnum, alts->desc.bInterfaceNumber); + pr_debug("%s: device %d videostreaming " + "interface %d HEADER descriptor is invalid.", + __func__, dev->udev->devnum, + alts->desc.bInterfaceNumber); goto error; } @@ -673,9 +677,9 @@ static int uvc_parse_streaming(struct uvc_device *dev, case UVC_VS_FORMAT_MPEG2TS: case UVC_VS_FORMAT_STREAM_BASED: - uvc_trace(UVC_TRACE_DESCR, "device %d videostreaming " - "interface %d FORMAT %u is not supported.\n", - dev->udev->devnum, + pr_debug("%s: device %d videostreaming " + "interface %d FORMAT %u is not supported.", + __func__, dev->udev->devnum, alts->desc.bInterfaceNumber, _buffer[2]); break; @@ -698,9 +702,10 @@ static int uvc_parse_streaming(struct uvc_device *dev, } if (nformats == 0) { - uvc_trace(UVC_TRACE_DESCR, "device %d videostreaming interface " - "%d has no supported formats defined.\n", - dev->udev->devnum, alts->desc.bInterfaceNumber); + pr_debug("%s: device %d videostreaming interface " + "%d has no supported formats defined.", + __func__, dev->udev->devnum, + alts->desc.bInterfaceNumber); goto error; } @@ -747,9 +752,10 @@ static int uvc_parse_streaming(struct uvc_device *dev, } if (buflen) - uvc_trace(UVC_TRACE_DESCR, "device %d videostreaming interface " - "%d has %u bytes of trailing descriptor garbage.\n", - dev->udev->devnum, alts->desc.bInterfaceNumber, buflen); + pr_debug("%s: device %d videostreaming interface " + "%d has %u bytes of trailing descriptor garbage.", + __func__, dev->udev->devnum, + alts->desc.bInterfaceNumber, buflen); /* Parse the alternate settings to find the maximum bandwidth. */ for (i = 0; i < intf->num_altsetting; ++i) { @@ -845,9 +851,10 @@ static int uvc_parse_vendor_control(struct uvc_device *dev, n = buflen >= 25 + p ? buffer[22+p] : 0; if (buflen < 25 + p + 2*n) { - uvc_trace(UVC_TRACE_DESCR, "device %d videocontrol " - "interface %d EXTENSION_UNIT error\n", - udev->devnum, alts->desc.bInterfaceNumber); + pr_debug("%s: device %d videocontrol " + "interface %d EXTENSION_UNIT error.", + __func__, udev->devnum, + alts->desc.bInterfaceNumber); break; } @@ -894,9 +901,9 @@ static int uvc_parse_standard_control(struct uvc_device *dev, n = buflen >= 12 ? buffer[11] : 0; if (buflen < 12 || buflen < 12 + n) { - uvc_trace(UVC_TRACE_DESCR, "device %d videocontrol " - "interface %d HEADER error\n", udev->devnum, - alts->desc.bInterfaceNumber); + pr_debug("%s: device %d videocontrol " + "interface %d HEADER error", __func__, + udev->devnum, alts->desc.bInterfaceNumber); return -EINVAL; } @@ -907,9 +914,9 @@ static int uvc_parse_standard_control(struct uvc_device *dev, for (i = 0; i < n; ++i) { intf = usb_ifnum_to_if(udev, buffer[12+i]); if (intf == NULL) { - uvc_trace(UVC_TRACE_DESCR, "device %d " - "interface %d doesn't exists\n", - udev->devnum, i); + pr_debug("%s: device %d " + "interface %d doesn't exists.", + __func__, udev->devnum, i); continue; } @@ -919,9 +926,10 @@ static int uvc_parse_standard_control(struct uvc_device *dev, case UVC_VC_INPUT_TERMINAL: if (buflen < 8) { - uvc_trace(UVC_TRACE_DESCR, "device %d videocontrol " - "interface %d INPUT_TERMINAL error\n", - udev->devnum, alts->desc.bInterfaceNumber); + pr_debug("%s: device %d videocontrol " + "interface %d INPUT_TERMINAL error.", + __func__, udev->devnum, + alts->desc.bInterfaceNumber); return -EINVAL; } @@ -930,11 +938,11 @@ static int uvc_parse_standard_control(struct uvc_device *dev, */ type = get_unaligned_le16(&buffer[4]); if ((type & 0xff00) == 0) { - uvc_trace(UVC_TRACE_DESCR, "device %d videocontrol " - "interface %d INPUT_TERMINAL %d has invalid " - "type 0x%04x, skipping\n", udev->devnum, - alts->desc.bInterfaceNumber, - buffer[3], type); + pr_debug("%s: device %d videocontrol " + "interface %d INPUT_TERMINAL %d has invalid " + "type 0x%04x, skipping.", __func__, + udev->devnum, alts->desc.bInterfaceNumber, + buffer[3], type); return 0; } @@ -953,9 +961,10 @@ static int uvc_parse_standard_control(struct uvc_device *dev, } if (buflen < len + n + p) { - uvc_trace(UVC_TRACE_DESCR, "device %d videocontrol " - "interface %d INPUT_TERMINAL error\n", - udev->devnum, alts->desc.bInterfaceNumber); + pr_debug("%s: device %d videocontrol " + "interface %d INPUT_TERMINAL error", + __func__, udev->devnum, + alts->desc.bInterfaceNumber); return -EINVAL; } @@ -1000,9 +1009,10 @@ static int uvc_parse_standard_control(struct uvc_device *dev, case UVC_VC_OUTPUT_TERMINAL: if (buflen < 9) { - uvc_trace(UVC_TRACE_DESCR, "device %d videocontrol " - "interface %d OUTPUT_TERMINAL error\n", - udev->devnum, alts->desc.bInterfaceNumber); + pr_debug("%s: device %d videocontrol " + "interface %d OUTPUT_TERMINAL error", + __func__, udev->devnum, + alts->desc.bInterfaceNumber); return -EINVAL; } @@ -1011,10 +1021,11 @@ static int uvc_parse_standard_control(struct uvc_device *dev, */ type = get_unaligned_le16(&buffer[4]); if ((type & 0xff00) == 0) { - uvc_trace(UVC_TRACE_DESCR, "device %d videocontrol " - "interface %d OUTPUT_TERMINAL %d has invalid " - "type 0x%04x, skipping\n", udev->devnum, - alts->desc.bInterfaceNumber, buffer[3], type); + pr_debug("%s: device %d videocontrol " + "interface %d OUTPUT_TERMINAL %d has invalid " + "type 0x%04x, skipping.", __func__, + udev->devnum, alts->desc.bInterfaceNumber, + buffer[3], type); return 0; } @@ -1038,9 +1049,10 @@ static int uvc_parse_standard_control(struct uvc_device *dev, p = buflen >= 5 ? buffer[4] : 0; if (buflen < 5 || buflen < 6 + p) { - uvc_trace(UVC_TRACE_DESCR, "device %d videocontrol " - "interface %d SELECTOR_UNIT error\n", - udev->devnum, alts->desc.bInterfaceNumber); + pr_debug("%s: device %d videocontrol " + "interface %d SELECTOR_UNIT error.", + __func__, udev->devnum, + alts->desc.bInterfaceNumber); return -EINVAL; } @@ -1064,9 +1076,10 @@ static int uvc_parse_standard_control(struct uvc_device *dev, p = dev->uvc_version >= 0x0110 ? 10 : 9; if (buflen < p + n) { - uvc_trace(UVC_TRACE_DESCR, "device %d videocontrol " - "interface %d PROCESSING_UNIT error\n", - udev->devnum, alts->desc.bInterfaceNumber); + pr_debug("%s: device %d videocontrol " + "interface %d PROCESSING_UNIT error.", + __func__, udev->devnum, + alts->desc.bInterfaceNumber); return -EINVAL; } @@ -1097,9 +1110,10 @@ static int uvc_parse_standard_control(struct uvc_device *dev, n = buflen >= 24 + p ? buffer[22+p] : 0; if (buflen < 24 + p + n) { - uvc_trace(UVC_TRACE_DESCR, "device %d videocontrol " - "interface %d EXTENSION_UNIT error\n", - udev->devnum, alts->desc.bInterfaceNumber); + pr_debug("%s: device %d videocontrol " + "interface %d EXTENSION_UNIT error.", + __func__, udev->devnum, + alts->desc.bInterfaceNumber); return -EINVAL; } @@ -1124,8 +1138,8 @@ static int uvc_parse_standard_control(struct uvc_device *dev, break; default: - uvc_trace(UVC_TRACE_DESCR, "Found an unknown CS_INTERFACE " - "descriptor (%u)\n", buffer[2]); + pr_debug("%s: Found an unknown CS_INTERFACE " + "descriptor (%u)", __func__, buffer[2]); break; } @@ -1170,8 +1184,9 @@ next_descriptor: if (usb_endpoint_is_int_in(desc) && le16_to_cpu(desc->wMaxPacketSize) >= 8 && desc->bInterval != 0) { - uvc_trace(UVC_TRACE_DESCR, "Found a Status endpoint " - "(addr %02x).\n", desc->bEndpointAddress); + pr_debug("%s: Found a Status endpoint " + "(addr %02x).", __func__, + desc->bEndpointAddress); dev->int_ep = ep; } } @@ -1218,8 +1233,8 @@ static int uvc_scan_chain_entity(struct uvc_video_chain *chain, printk(" <- XU %d", entity->id); if (entity->bNrInPins != 1) { - uvc_trace(UVC_TRACE_DESCR, "Extension unit %d has more " - "than 1 input pin.\n", entity->id); + pr_debug("%s: Extension unit %d has more " + "than 1 input pin.", __func__, entity->id); return -1; } @@ -1230,8 +1245,8 @@ static int uvc_scan_chain_entity(struct uvc_video_chain *chain, printk(" <- PU %d", entity->id); if (chain->processing != NULL) { - uvc_trace(UVC_TRACE_DESCR, "Found multiple " - "Processing Units in chain.\n"); + pr_debug("%s: Found multiple " + "Processing Units in chain.", __func__); return -1; } @@ -1247,8 +1262,8 @@ static int uvc_scan_chain_entity(struct uvc_video_chain *chain, break; if (chain->selector != NULL) { - uvc_trace(UVC_TRACE_DESCR, "Found multiple Selector " - "Units in chain.\n"); + pr_debug("%s: Found multiple Selector " + "Units in chain.", __func__); return -1; } @@ -1275,8 +1290,9 @@ static int uvc_scan_chain_entity(struct uvc_video_chain *chain, break; default: - uvc_trace(UVC_TRACE_DESCR, "Unsupported entity type " - "0x%04x found in chain.\n", UVC_ENTITY_TYPE(entity)); + pr_debug("%s: Unsupported entity type " + "0x%04x found in chain.", __func__, + UVC_ENTITY_TYPE(entity)); return -1; } @@ -1305,9 +1321,9 @@ static int uvc_scan_chain_forward(struct uvc_video_chain *chain, switch (UVC_ENTITY_TYPE(forward)) { case UVC_VC_EXTENSION_UNIT: if (forward->bNrInPins != 1) { - uvc_trace(UVC_TRACE_DESCR, "Extension unit %d " - "has more than 1 input pin.\n", - entity->id); + pr_debug("%s: Extension unit %d " + "has more than 1 input pin.", + __func__, entity->id); return -EINVAL; } @@ -1326,8 +1342,9 @@ static int uvc_scan_chain_forward(struct uvc_video_chain *chain, case UVC_OTT_MEDIA_TRANSPORT_OUTPUT: case UVC_TT_STREAMING: if (UVC_ENTITY_IS_ITERM(forward)) { - uvc_trace(UVC_TRACE_DESCR, "Unsupported input " - "terminal %u.\n", forward->id); + pr_debug("%s: Unsupported input " + "terminal %u.", __func__, + forward->id); return -EINVAL; } @@ -1376,9 +1393,10 @@ static int uvc_scan_chain_backward(struct uvc_video_chain *chain, id = entity->baSourceID[i]; term = uvc_entity_by_id(chain->dev, id); if (term == NULL || !UVC_ENTITY_IS_ITERM(term)) { - uvc_trace(UVC_TRACE_DESCR, "Selector unit %d " - "input %d isn't connected to an " - "input terminal\n", entity->id, i); + pr_debug("%s: Selector unit %d " + "input %d isn't connected to an " + "input terminal.", __func__, + entity->id, i); return -1; } @@ -1413,8 +1431,8 @@ static int uvc_scan_chain_backward(struct uvc_video_chain *chain, entity = uvc_entity_by_id(chain->dev, id); if (entity == NULL) { - uvc_trace(UVC_TRACE_DESCR, "Found reference to " - "unknown entity %d.\n", id); + pr_debug("%s: Found reference to " + "unknown entity %d.", __func__, id); return -EINVAL; } @@ -1427,7 +1445,7 @@ static int uvc_scan_chain(struct uvc_video_chain *chain, { struct uvc_entity *entity, *prev; - uvc_trace(UVC_TRACE_PROBE, "Scanning UVC chain:"); + pr_debug("%s: Scanning UVC chain.", __func__); entity = term; prev = NULL; @@ -1435,8 +1453,9 @@ static int uvc_scan_chain(struct uvc_video_chain *chain, while (entity != NULL) { /* Entity must not be part of an existing chain */ if (entity->chain.next || entity->chain.prev) { - uvc_trace(UVC_TRACE_DESCR, "Found reference to " - "entity %d already in chain.\n", entity->id); + pr_debug("%s: Found reference to " + "entity %d already in chain.", __func__, + entity->id); return -EINVAL; } @@ -1528,14 +1547,15 @@ static int uvc_scan_device(struct uvc_device *dev) continue; } - uvc_trace(UVC_TRACE_PROBE, "Found a valid video chain (%s).\n", - uvc_print_chain(chain)); + pr_debug("%s: Found a valid video chain (%s).", + __func__, uvc_print_chain(chain)); list_add_tail(&chain->list, &dev->chains); } if (list_empty(&dev->chains)) { - uvc_printk(KERN_INFO, "No valid video chain found.\n"); + uvc_printk(KERN_INFO, "%s: No valid video chain found.\n", + __func__); return -1; } @@ -1646,16 +1666,16 @@ static int uvc_register_video(struct uvc_device *dev, */ ret = uvc_video_init(stream); if (ret < 0) { - uvc_printk(KERN_ERR, "Failed to initialize the device " - "(%d).\n", ret); + uvc_printk(KERN_ERR, "%s: Failed to initialize the device " + "(%d).\n", __func__, ret); return ret; } /* Register the device with V4L. */ vdev = video_device_alloc(); if (vdev == NULL) { - uvc_printk(KERN_ERR, "Failed to allocate video device (%d).\n", - ret); + uvc_printk(KERN_ERR, "%s: Failed to allocate " + "video device (%d).\n", __func__, ret); return -ENOMEM; } @@ -1676,8 +1696,8 @@ static int uvc_register_video(struct uvc_device *dev, ret = video_register_device(vdev, VFL_TYPE_GRABBER, -1); if (ret < 0) { - uvc_printk(KERN_ERR, "Failed to register video device (%d).\n", - ret); + uvc_printk(KERN_ERR, "%s: Failed to register " + "video device (%d).\n", __func__, ret); stream->vdev = NULL; video_device_release(vdev); return ret; @@ -1703,8 +1723,9 @@ static int uvc_register_terms(struct uvc_device *dev, stream = uvc_stream_by_id(dev, term->id); if (stream == NULL) { - uvc_printk(KERN_INFO, "No streaming interface found " - "for terminal %u.", term->id); + uvc_printk(KERN_INFO, "%s: No streaming interface " + "found for terminal %u.", + __func__, term->id); continue; } @@ -1743,12 +1764,12 @@ static int uvc_probe(struct usb_interface *intf, int ret; if (id->idVendor && id->idProduct) - uvc_trace(UVC_TRACE_PROBE, "Probing known UVC device %s " - "(%04x:%04x)\n", udev->devpath, id->idVendor, - id->idProduct); + pr_debug("%s: Probing known UVC device %s " + "(%04x:%04x).", __func__, udev->devpath, + id->idVendor, id->idProduct); else - uvc_trace(UVC_TRACE_PROBE, "Probing generic UVC device %s\n", - udev->devpath); + pr_debug("%s: Probing generic UVC device %s.", + __func__, udev->devpath); /* Allocate memory for the device and initialize it. */ if ((dev = kzalloc(sizeof *dev, GFP_KERNEL)) == NULL) @@ -1777,12 +1798,13 @@ static int uvc_probe(struct usb_interface *intf, /* Parse the Video Class control descriptor. */ if (uvc_parse_control(dev) < 0) { - uvc_trace(UVC_TRACE_PROBE, "Unable to parse UVC " - "descriptors.\n"); + pr_debug("%s: Unable to parse UVC " + "descriptors.", __func__); goto error; } - uvc_printk(KERN_INFO, "Found UVC %u.%02x device %s (%04x:%04x)\n", + pr_info("%s: Found UVC %u.%02x device %s (%04x:%04x)\n", + __func__, dev->uvc_version >> 8, dev->uvc_version & 0xff, udev->product ? udev->product : "<unnamed>", le16_to_cpu(udev->descriptor.idVendor), @@ -1817,7 +1839,7 @@ static int uvc_probe(struct usb_interface *intf, "supported.\n", ret); } - uvc_trace(UVC_TRACE_PROBE, "UVC device initialized.\n"); + pr_debug("%s: UVC device initialized.", __func__); usb_enable_autosuspend(udev); return 0; @@ -1849,8 +1871,8 @@ static int uvc_suspend(struct usb_interface *intf, pm_message_t message) struct uvc_device *dev = usb_get_intfdata(intf); struct uvc_streaming *stream; - uvc_trace(UVC_TRACE_SUSPEND, "Suspending interface %u\n", - intf->cur_altsetting->desc.bInterfaceNumber); + pr_debug("%s: Suspending interface %u.", __func__, + intf->cur_altsetting->desc.bInterfaceNumber); /* Controls are cached on the fly so they don't need to be saved. */ if (intf->cur_altsetting->desc.bInterfaceSubClass == @@ -1862,8 +1884,8 @@ static int uvc_suspend(struct usb_interface *intf, pm_message_t message) return uvc_video_suspend(stream); } - uvc_trace(UVC_TRACE_SUSPEND, "Suspend: video streaming USB interface " - "mismatch.\n"); + pr_debug("%s: video streaming USB interface " + "mismatch.", __func__); return -EINVAL; } @@ -1872,7 +1894,7 @@ static int __uvc_resume(struct usb_interface *intf, int reset) struct uvc_device *dev = usb_get_intfdata(intf); struct uvc_streaming *stream; - uvc_trace(UVC_TRACE_SUSPEND, "Resuming interface %u\n", + pr_debug("%s: Resuming interface %u.", __func__, intf->cur_altsetting->desc.bInterfaceNumber); if (intf->cur_altsetting->desc.bInterfaceSubClass == @@ -1892,8 +1914,8 @@ static int __uvc_resume(struct usb_interface *intf, int reset) return uvc_video_resume(stream); } - uvc_trace(UVC_TRACE_SUSPEND, "Resume: video streaming USB interface " - "mismatch.\n"); + pr_debug("%s: video streaming USB interface " + "mismatch.", __func__); return -EINVAL; } 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..99e8648 100644 --- a/drivers/media/video/uvc/uvc_video.c +++ b/drivers/media/video/uvc/uvc_video.c @@ -73,6 +73,9 @@ int uvc_query_ctrl(struct uvc_device *dev, __u8 query, __u8 unit, { int ret; + pr_debug("%s: query: %s; UVC control %u; unit %u.", __func__, + uvc_query_name(query), cs, unit); + ret = __uvc_query_ctrl(dev, query, unit, intfnum, cs, data, size, UVC_CTRL_CONTROL_TIMEOUT); if (ret != size) { @@ -91,6 +94,7 @@ static void uvc_fixup_video_ctrl(struct uvc_streaming *stream, struct uvc_format *format; struct uvc_frame *frame = NULL; unsigned int i; + u32 interval; if (ctrl->bFormatIndex <= 0 || ctrl->bFormatIndex > stream->nformats) @@ -108,21 +112,29 @@ static void uvc_fixup_video_ctrl(struct uvc_streaming *stream, if (frame == NULL) return; + interval = (ctrl->dwFrameInterval > 100000) + ? ctrl->dwFrameInterval + : frame->dwFrameInterval[0]; + + pr_debug("%s: %s %ux%u@%u(fps)", __func__, + format->name, frame->wWidth, + frame->wHeight, 10000000/interval); + 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 && stream->intf->num_altsetting > 1) { - u32 interval; u32 bandwidth; - interval = (ctrl->dwFrameInterval > 100000) - ? ctrl->dwFrameInterval - : frame->dwFrameInterval[0]; /* Compute a bandwidth estimation by multiplying the frame * size by the number of video frames per second, divide the @@ -146,6 +158,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; } } @@ -193,9 +208,10 @@ static int uvc_get_video_ctrl(struct uvc_streaming *stream, ret = -EIO; goto out; } else if (ret != size) { - uvc_printk(KERN_ERR, "Failed to query (%u) UVC %s control : " - "%d (exp. %u).\n", query, probe ? "probe" : "commit", - ret, size); + pr_err("%s: Failed to query (%u) UVC %s control : " + "%d (exp. %u).\n", __func__, + query, probe ? "probe" : "commit", + ret, size); ret = -EIO; goto out; } @@ -233,6 +249,21 @@ static int uvc_get_video_ctrl(struct uvc_streaming *stream, uvc_fixup_video_ctrl(stream, ctrl); ret = 0; + pr_debug("%s: %s; bmHint: %u; bFormatIndex: %u; bFrameIndex: %u; " + "dwFrameInterval: %u; wKeyFrameRate: %u; " + "wCompQuality: %u; wCompWindowSize: %u; wDelay: %u; " + "dwMaxVideoFrameSize %u; dwMaxPayloadTransferSize: %u", + __func__, uvc_query_name(query), 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 +276,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 +338,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 @@ -311,8 +359,6 @@ int uvc_probe_video(struct uvc_streaming *stream, ret = uvc_get_video_ctrl(stream, &probe_max, 1, UVC_GET_MAX); if (ret < 0) goto done; - - probe->wCompQuality = probe_max.wCompQuality; } for (i = 0; i < 2; ++i) { @@ -340,6 +386,11 @@ int uvc_probe_video(struct uvc_streaming *stream, probe->wPFrameRate = probe_min.wPFrameRate; probe->wCompQuality = probe_max.wCompQuality; probe->wCompWindowSize = probe_min.wCompWindowSize; + pr_debug("%s: set copressions parameters. wKeyFrameRate: %u " + "wPFrameRate: %u; wCompQuality: %u; " + "wCompWindowSize: %u.", __func__, probe->wKeyFrameRate, + probe->wPFrameRate, probe->wCompQuality, + probe->wCompWindowSize); } done: @@ -349,6 +400,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 +458,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 +470,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 +503,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 +540,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 +558,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 +572,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 +580,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 +608,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 +623,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 +650,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 +701,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 +767,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 +814,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 +855,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 +885,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 +912,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 +932,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 +960,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 +1014,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 +1065,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 +1084,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 +1113,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 +1167,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 +1191,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 +1233,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 +1329,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);
_______________________________________________ Linux-uvc-devel mailing list Linux-uvc-devel@lists.berlios.de https://lists.berlios.de/mailman/listinfo/linux-uvc-devel