Re: CSW endpoint status returned STALL after BOT MSC Reset

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Thanks for the quick patch..I will test it.

On Wed, Oct 30, 2013 at 10:02 PM, Alan Stern <stern@xxxxxxxxxxxxxxxxxxx> 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, &params);
>                 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 majordomo@xxxxxxxxxxxxxxx
> 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 majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux