Re: [PATCH v2] usb: dwc3: handle DWC_USB3_NUM == DWC_USB3_NUM_IN_EPS

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

 



On 1/24/2017 12:53 AM, Felipe Balbi wrote:
>
> Hi,
>
> John Youn <John.Youn@xxxxxxxxxxxx> writes:
>>>> Bryan O'Donoghue <pure.logic@xxxxxxxxxxxxxxxxx> 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.
>>>
>>
>> It should work for ASICS.
>>
>> But it won't work for our FPGA platform. It needs to work the
>> existing, more limited, way. You can check this with the
>> GHWPARAMS6.EN_FPGA.
>
> Can you clarify a little more? Why wouldn't above work for FPGA?
>

Actually my mistake, this should still work fine as long as you are
predefining the number and direction the same as before.

See DWC_USB3_EN_LOG_PHYS_EP_SUPT for the FPGA configuration.

This configuration should be enabled (the default), but can be
disabled for FPGA configs to meet timing and save space. Looks like
DWC3 driver is currently programming as if this is always disabled,
which should be fine, it will just be more limiting than necessary.

Regards,
John
--
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