On 23/01/17 12:08, Felipe Balbi wrote: > > Hi, > > 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. > > 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 majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html