Commit 43ff05e2 authored by Bhupesh Sharma's avatar Bhupesh Sharma Committed by Felipe Balbi

usb: gadget: uvc: Add fix for UVC compliance test suite's assertion 6.1.25 failure

As per the UVC compliance test suite's assertion 6.1.25, the `iFunction`
field of the Interface Association Descriptor (IAD) should the match the
`iInterface` field of the standard Video Control (VC) Interface Descriptor for
this Video Interface Collection (VIC).

This mandatory case is captured in section 3.11 of the
USB Video Class Compliance specification revision 1.1

This patch fixes this test assertion's failure and has been tested on
Linux FC16, WinXP, WIN7 and WIN8 High speed and Super Speed hosts
for successful enumeration.
Signed-off-by: default avatarBhupesh Sharma <bhupesh.sharma@st.com>
[Merged the association and control string descriptors]
Signed-off-by: default avatarLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Tested-by: default avatarBhupesh Sharma <bhupesh.sharma@st.com>
Signed-off-by: default avatarFelipe Balbi <balbi@ti.com>
parent 609a0532
...@@ -51,13 +51,11 @@ MODULE_PARM_DESC(streaming_maxburst, "0 - 15 (ss only)"); ...@@ -51,13 +51,11 @@ MODULE_PARM_DESC(streaming_maxburst, "0 - 15 (ss only)");
/* string IDs are assigned dynamically */ /* string IDs are assigned dynamically */
#define UVC_STRING_ASSOCIATION_IDX 0 #define UVC_STRING_CONTROL_IDX 0
#define UVC_STRING_CONTROL_IDX 1 #define UVC_STRING_STREAMING_IDX 1
#define UVC_STRING_STREAMING_IDX 2
static struct usb_string uvc_en_us_strings[] = { static struct usb_string uvc_en_us_strings[] = {
[UVC_STRING_ASSOCIATION_IDX].s = "UVC Camera", [UVC_STRING_CONTROL_IDX].s = "UVC Camera",
[UVC_STRING_CONTROL_IDX].s = "Video Control",
[UVC_STRING_STREAMING_IDX].s = "Video Streaming", [UVC_STRING_STREAMING_IDX].s = "Video Streaming",
{ } { }
}; };
...@@ -572,7 +570,7 @@ uvc_function_unbind(struct usb_configuration *c, struct usb_function *f) ...@@ -572,7 +570,7 @@ uvc_function_unbind(struct usb_configuration *c, struct usb_function *f)
uvc->control_ep->driver_data = NULL; uvc->control_ep->driver_data = NULL;
uvc->video.ep->driver_data = NULL; uvc->video.ep->driver_data = NULL;
uvc_en_us_strings[UVC_STRING_ASSOCIATION_IDX].id = 0; uvc_en_us_strings[UVC_STRING_CONTROL_IDX].id = 0;
usb_ep_free_request(cdev->gadget->ep0, uvc->control_req); usb_ep_free_request(cdev->gadget->ep0, uvc->control_req);
kfree(uvc->control_buf); kfree(uvc->control_buf);
...@@ -796,12 +794,12 @@ uvc_bind_config(struct usb_configuration *c, ...@@ -796,12 +794,12 @@ uvc_bind_config(struct usb_configuration *c,
* for the first UVC function. UVC functions beyond the first (if any) * for the first UVC function. UVC functions beyond the first (if any)
* will reuse the same IDs. * will reuse the same IDs.
*/ */
if (uvc_en_us_strings[UVC_STRING_ASSOCIATION_IDX].id == 0) { if (uvc_en_us_strings[UVC_STRING_CONTROL_IDX].id == 0) {
ret = usb_string_ids_tab(c->cdev, uvc_en_us_strings); ret = usb_string_ids_tab(c->cdev, uvc_en_us_strings);
if (ret) if (ret)
goto error; goto error;
uvc_iad.iFunction = uvc_iad.iFunction =
uvc_en_us_strings[UVC_STRING_ASSOCIATION_IDX].id; uvc_en_us_strings[UVC_STRING_CONTROL_IDX].id;
uvc_control_intf.iInterface = uvc_control_intf.iInterface =
uvc_en_us_strings[UVC_STRING_CONTROL_IDX].id; uvc_en_us_strings[UVC_STRING_CONTROL_IDX].id;
ret = uvc_en_us_strings[UVC_STRING_STREAMING_IDX].id; ret = uvc_en_us_strings[UVC_STRING_STREAMING_IDX].id;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment