On 23/01/17 12:08, Felipe Balbi wrote:
> 
> Hi,
> 
> Bryan O'Donoghue <pure.lo...@nexus-software.ie> writes:
>> - DWC_USB3_NUM indicates the number of Device mode single directional
>>   endpoints, including OUT and IN endpoint 0.
>>
>> - DWC_USB3_NUM_IN_EPS indicates the maximum number of Device mode IN
>>   endpoints active at any time, including control endpoint 0.
>>
>> It's possible to configure RTL such that DWC_USB3_NUM_EPS is equal to
>> DWC_USB3_NUM_IN_EPS.
>>
>> dwc3-core calculates the number of OUT endpoints as DWC_USB3_NUM minus
>> DWC_USB3_NUM_IN_EPS. If RTL has been configured with DWC_USB3_NUM_IN_EPS
>> equal to DWC_USB3_NUM then dwc3-core will calculate the number of OUT
>> endpoints as zero.
>>
>> For example a from dwc3_core_num_eps() shows:
>> [    1.565000]  /usb0@f01d0000: found 8 IN and 0 OUT endpoints
>>
>> This patch works around this case by detecting when DWC_USB3_NUM_EPS is
>> equal to DWC3_USB3_NUM_IN_EPS and over-rides the calculation of the number
>> of OUT and IN endpoints to make dwc->num_in_eps equal to half
>> DWC_USB3_NUM_EPS.
>>
>> If DWC_USB3_NUM_EPS is equal to DWC3_USB3_NUM_IN_EPS and the endpoint count
>> is an odd number then dwc->num_out_eps will be assigned the extra endpoint.
> 
> sorry, now that I spent some more time with this. Isn't something like
> below solving all problems?
> 
> diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c
> index 369bab16a824..68c9c84b7216 100644
> --- a/drivers/usb/dwc3/core.c
> +++ b/drivers/usb/dwc3/core.c
> @@ -397,8 +397,7 @@ static void dwc3_core_num_eps(struct dwc3 *dwc)
>  {
>       struct dwc3_hwparams    *parms = &dwc->hwparams;
>  
> -     dwc->num_in_eps = DWC3_NUM_IN_EPS(parms);
> -     dwc->num_out_eps = DWC3_NUM_EPS(parms) - dwc->num_in_eps;
> +     dwc->num_eps = DWC3_NUM_EPS(parms);
>  }
>  
>  static void dwc3_cache_hwparams(struct dwc3 *dwc)
> diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
> index 0a664d8eba3f..8c187df0aa42 100644
> --- a/drivers/usb/dwc3/gadget.c
> +++ b/drivers/usb/dwc3/gadget.c
> @@ -2001,23 +2002,7 @@ static int dwc3_gadget_init_hw_endpoints(struct dwc3 
> *dwc,
>  
>  static int dwc3_gadget_init_endpoints(struct dwc3 *dwc)
>  {
> -     int                             ret;
> -
> -     INIT_LIST_HEAD(&dwc->gadget.ep_list);
> -
> -     ret = dwc3_gadget_init_hw_endpoints(dwc, dwc->num_out_eps, 0);
> -     if (ret < 0) {
> -             dev_err(dwc->dev, "failed to initialize OUT endpoints\n");
> -             return ret;
> -     }
> -
> -     ret = dwc3_gadget_init_hw_endpoints(dwc, dwc->num_in_eps, 1);
> -     if (ret < 0) {
> -             dev_err(dwc->dev, "failed to initialize IN endpoints\n");
> -             return ret;
> -     }
> -
> -     return 0;
> +     return dwc3_gadget_init_hw_endpoints(dwc, dwc->num_eps);

Well I hadn't considered that level of change myself but, it should work.

>  
>  static void dwc3_gadget_free_endpoints(struct dwc3 *dwc)
> 
> (clearly this won't compile... It's just to illustrate)
> 
> The HW actually already tells us total number of endpoints and according
> to John, they can all behave in either direction. Can you test it out
> and finish it up as a proper patch?

Sure no problem.

> 
> I'll make sure to fix up the "maximum number of IN endpoints enabled at
> one time" for v4.12.
> 
> thanks
> 

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to