Thanks for the quick patch..I will test it.
On Wed, Oct 30, 2013 at 10:02 PM, Alan Stern <[email protected]> wrote:
> On Wed, 30 Oct 2013, Alan Stern wrote:
>
>> I think you have found a bug in the dwc3 driver.
>
>> At this point, because the IGNORE_BULK_OUT bit is set, g_mass_storage
>> issues a usb_ep_clear_halt() call for the bulk-in (CSW) endpoint.
>> This tells the dwc3 driver to change the endpoint's status back to 0:
>>
>> if (test_and_clear_bit(IGNORE_BULK_OUT,
>> &common->fsg->atomic_bitflags))
>> usb_ep_clear_halt(common->fsg->bulk_in);
>>
>> > INFO Retrieving status on CBW endpoint
>> > INFO CBW endpoint status = 0x0
>> > INFO Retrieving status on CSW endpoint
>> > INFO CSW endpoint status = 0x1
>>
>> But the status is still set to 1. Clearly this is a bug in dwc3.
>
> And indeed it is. The dwc3 driver does not implement the wedge method
> correctly. This patch should fix it. Let me know how it works.
>
> Alan Stern
>
>
>
> Index: usb-3.12/drivers/usb/dwc3/ep0.c
> ===================================================================
> --- usb-3.12.orig/drivers/usb/dwc3/ep0.c
> +++ usb-3.12/drivers/usb/dwc3/ep0.c
> @@ -459,6 +459,8 @@ static int dwc3_ep0_handle_feature(struc
> dep = dwc3_wIndex_to_dep(dwc, wIndex);
> if (!dep)
> return -EINVAL;
> + if (set == 0 && (dep->flags & DWC3_EP_WEDGE))
> + break;
This is fine.
But I do not see any way to unwedge ep0. dwc3_gadget_ep0_set_halt
ignores *value*
argument and will not handle a gadget driver's clear halt status request.
However, I do no see any gadget driver wedging ep0, so may be it will not hurt.
> ret = __dwc3_gadget_ep_set_halt(dep, set);
> if (ret)
> return -EINVAL;
> Index: usb-3.12/drivers/usb/dwc3/gadget.c
> ===================================================================
> --- usb-3.12.orig/drivers/usb/dwc3/gadget.c
> +++ usb-3.12/drivers/usb/dwc3/gadget.c
> @@ -1200,9 +1200,6 @@ int __dwc3_gadget_ep_set_halt(struct dwc
> else
> dep->flags |= DWC3_EP_STALL;
> } else {
> - if (dep->flags & DWC3_EP_WEDGE)
> - return 0;
> -
> ret = dwc3_send_gadget_ep_cmd(dwc, dep->number,
> DWC3_DEPCMD_CLEARSTALL, ¶ms);
> if (ret)
> @@ -1210,7 +1207,7 @@ int __dwc3_gadget_ep_set_halt(struct dwc
> value ? "set" : "clear",
> dep->name);
> else
> - dep->flags &= ~DWC3_EP_STALL;
> + dep->flags &= ~(DWC3_EP_STALL | DWC3_EP_WEDGE);
> }
>
> return ret;
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-usb" in
> the body of a message to [email protected]
> More majordomo info at http://vger.kernel.org/majordomo-info.html
Thanks for your kind help.
Regards
Pratyush
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html