Message ID | b90a30f7bd24024be3f1b08e6045cb57b734aa4a.1524596473.git.paul.elder@ideasonboard.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
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 --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);
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(+)