| From 3e448e13a662fb20145916636127995cbf37eb83 Mon Sep 17 00:00:00 2001 |
| From: Krzysztof Opasiak <k.opasiak@samsung.com> |
| Date: Thu, 1 Dec 2016 19:14:37 +0100 |
| Subject: usbip: vudc: fix: Clear already_seen flag also for ep0 |
| |
| From: Krzysztof Opasiak <k.opasiak@samsung.com> |
| |
| commit 3e448e13a662fb20145916636127995cbf37eb83 upstream. |
| |
| ep_list inside gadget structure doesn't contain ep0. |
| It is stored separately in ep0 field. |
| |
| This causes an urb hang if gadget driver decides to |
| delay setup handling. On host side this is visible as |
| timeout error when setting configuration. |
| |
| This bug can be reproduced using for example any gadget |
| with mass storage function. |
| |
| Fixes: abdb29574322 ("usbip: vudc: Add vudc_transfer") |
| Signed-off-by: Krzysztof Opasiak <k.opasiak@samsung.com> |
| Acked-by: Shuah Khan <shuahkh@osg.samsung.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/usb/usbip/vudc_transfer.c | 2 ++ |
| 1 file changed, 2 insertions(+) |
| |
| --- a/drivers/usb/usbip/vudc_transfer.c |
| +++ b/drivers/usb/usbip/vudc_transfer.c |
| @@ -339,6 +339,8 @@ static void v_timer(unsigned long _vudc) |
| total = timer->frame_limit; |
| } |
| |
| + /* We have to clear ep0 flags separately as it's not on the list */ |
| + udc->ep[0].already_seen = 0; |
| list_for_each_entry(_ep, &udc->gadget.ep_list, ep_list) { |
| ep = to_vep(_ep); |
| ep->already_seen = 0; |