| From 27c569721ab26d617b5d6b36c9ef37c0d4055888 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Fri, 10 Aug 2018 15:44:57 +0300 |
| Subject: usb: gadget: uvc: Only halt video streaming endpoint in bulk mode |
| |
| From: Laurent Pinchart <laurent.pinchart@ideasonboard.com> |
| |
| [ Upstream commit 8dbf9c7abefd5c1434a956d5c6b25e11183061a3 ] |
| |
| When USB requests for video data fail to be submitted, the driver |
| signals a problem to the host by halting the video streaming endpoint. |
| This is only valid in bulk mode, as isochronous transfers have no |
| handshake phase and can't thus report a stall. The usb_ep_set_halt() |
| call returns an error when using isochronous endpoints, which we happily |
| ignore, but some UDCs complain in the kernel log. Fix this by only |
| trying to halt the endpoint in bulk mode. |
| |
| Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> |
| Reviewed-by: Paul Elder <paul.elder@ideasonboard.com> |
| Tested-by: Paul Elder <paul.elder@ideasonboard.com> |
| Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/usb/gadget/function/uvc_video.c | 4 +++- |
| 1 file changed, 3 insertions(+), 1 deletion(-) |
| |
| diff --git a/drivers/usb/gadget/function/uvc_video.c b/drivers/usb/gadget/function/uvc_video.c |
| index a95c8e2364edc..2c9821ec836e7 100644 |
| --- a/drivers/usb/gadget/function/uvc_video.c |
| +++ b/drivers/usb/gadget/function/uvc_video.c |
| @@ -132,7 +132,9 @@ static int uvcg_video_ep_queue(struct uvc_video *video, struct usb_request *req) |
| ret = usb_ep_queue(video->ep, req, GFP_ATOMIC); |
| if (ret < 0) { |
| printk(KERN_INFO "Failed to queue request (%d).\n", ret); |
| - usb_ep_set_halt(video->ep); |
| + /* Isochronous endpoints can't be halted. */ |
| + if (usb_endpoint_xfer_bulk(video->ep->desc)) |
| + usb_ep_set_halt(video->ep); |
| } |
| |
| return ret; |
| -- |
| 2.20.1 |
| |