diff mbox

[v2,3/3] usb: gadget: uvc: disable stream when disconnected

Message ID b90a30f7bd24024be3f1b08e6045cb57b734aa4a.1524596473.git.paul.elder@ideasonboard.com (mailing list archive)
State New, archived
Headers show

Commit Message

Paul Elder April 24, 2018, 8:59 p.m. UTC
Down the call stack from the ioctl handler for VIDIOC_STREAMON,
uvc_video_alloc_requests contains a BUG_ON, which in the high level,
triggers when VIDIOC_STREAMON ioctl is issued without VIDIOC_STREAMOFF
being issued previously.

This can also be triggered by starting the stream and then physically
disconnecting usb. To fix this, do the streamoff procedures on usb
disconnect.

Signed-off-by: Paul Elder <paul.elder@ideasonboard.com>
---
Changes in v2: Nothing

 drivers/usb/gadget/function/f_uvc.c | 3 +++
 1 file changed, 3 insertions(+)

Comments

Laurent Pinchart May 21, 2018, 8:10 a.m. UTC | #1
Hi Paul,

Thank you for the patch.

On Tuesday, 24 April 2018 23:59:36 EEST Paul Elder wrote:
> Down the call stack from the ioctl handler for VIDIOC_STREAMON,
> uvc_video_alloc_requests contains a BUG_ON, which in the high level,
> triggers when VIDIOC_STREAMON ioctl is issued without VIDIOC_STREAMOFF
> being issued previously.
> 
> This can also be triggered by starting the stream and then physically
> disconnecting usb. To fix this, do the streamoff procedures on usb
> disconnect.
> 
> Signed-off-by: Paul Elder <paul.elder@ideasonboard.com>
> ---
> Changes in v2: Nothing
> 
>  drivers/usb/gadget/function/f_uvc.c | 3 +++
>  1 file changed, 3 insertions(+)
> 
> diff --git a/drivers/usb/gadget/function/f_uvc.c
> b/drivers/usb/gadget/function/f_uvc.c index fa34dcbe1197..5bb79888e3f7
> 100644
> --- a/drivers/usb/gadget/function/f_uvc.c
> +++ b/drivers/usb/gadget/function/f_uvc.c
> @@ -374,9 +374,12 @@ uvc_function_disable(struct usb_function *f)
>  {
>  	struct uvc_device *uvc = to_uvc(f);
>  	struct v4l2_event v4l2_event;
> +	struct uvc_video *video = &uvc->video;
> 
>  	INFO(f->config->cdev, "uvc_function_disable\n");
> 
> +	uvcg_video_enable(video, 0);
> +

As commented in my reply to patch 2/3, you will need to protect this with 
proper locking. You now have at least four events dealing with states and 
buffers allocation (VIDIOC_STREAMON, VIDIOC_STREAMOFF, uvc_function_set_alt 
and uvc_function_disable).

>  	memset(&v4l2_event, 0, sizeof(v4l2_event));
>  	v4l2_event.type = UVC_EVENT_DISCONNECT;
>  	v4l2_event_queue(&uvc->vdev, &v4l2_event);
diff mbox

Patch

diff --git a/drivers/usb/gadget/function/f_uvc.c b/drivers/usb/gadget/function/f_uvc.c
index fa34dcbe1197..5bb79888e3f7 100644
--- a/drivers/usb/gadget/function/f_uvc.c
+++ b/drivers/usb/gadget/function/f_uvc.c
@@ -374,9 +374,12 @@  uvc_function_disable(struct usb_function *f)
 {
 	struct uvc_device *uvc = to_uvc(f);
 	struct v4l2_event v4l2_event;
+	struct uvc_video *video = &uvc->video;
 
 	INFO(f->config->cdev, "uvc_function_disable\n");
 
+	uvcg_video_enable(video, 0);
+
 	memset(&v4l2_event, 0, sizeof(v4l2_event));
 	v4l2_event.type = UVC_EVENT_DISCONNECT;
 	v4l2_event_queue(&uvc->vdev, &v4l2_event);