Index: uvc_video.c
===================================================================
--- uvc_video.c	(revision 65)
+++ uvc_video.c	(working copy)
@@ -38,8 +38,24 @@
 			      : usb_sndctrlpipe(dev->udev, 0);
 	type |= (query & 0x80) ? USB_DIR_IN : USB_DIR_OUT;
 
+#ifndef QUERY_CTRL_RETRIES
 	ret = usb_control_msg(dev->udev, pipe, query, type, cs << 8,
 			unit << 8 | intfnum, data, size, UVC_CTRL_TIMEOUT);
+#else
+	{
+	int tries = 1 + QUERY_CTRL_RETRIES;
+	ret = 0;
+	while (tries--) {
+		ret = usb_control_msg(dev->udev, pipe, query, type, cs << 8,
+				unit << 8 | intfnum, data, size, UVC_CTRL_TIMEOUT);
+		if(ret >= 0 || ret != -EPIPE)
+			break;
+		uvc_printk(KERN_ERR, "Failed to query (%u) UVC control %u "
+			"(unit %u) : %d. Retrying %d more times ...\n",
+			query, cs, unit, ret, tries);
+	}
+	}
+#endif /* QUERY_CTRL_RETRIES */
 
 	if (ret != size) {
 		uvc_printk(KERN_ERR, "Failed to query (%u) UVC control %u "
Index: uvcvideo.h
===================================================================
--- uvcvideo.h	(revision 65)
+++ uvcvideo.h	(working copy)
@@ -233,6 +233,8 @@
 #define UVC_MAX_VIDEO_BUFFERS	32
 
 #define UVC_CTRL_TIMEOUT	300
+/* Number of retries for stalled control requests */
+#define QUERY_CTRL_RETRIES	3
 
 /* ------------------------------------------------------------------------
  * Structures.
