On Sat, Jun 24, 2023, Krishna Kurapati PSSNV wrote: > > > On 6/24/2023 3:57 AM, Thinh Nguyen wrote: > > On Wed, Jun 21, 2023, Krishna Kurapati wrote: > > > On some SoC's like SA8295P where the tertiary controller is host-only > > > capable, GEVTADDRHI/LO, GEVTSIZ, GEVTCOUNT registers are not accessible. > > > Trying to access them leads to a crash. > > > > > > For DRD/Peripheral supported controllers, event buffer setup is done > > > again in gadget_pullup. Skip setup or cleanup of event buffers if > > > controller is host-only capable. > > > > > > Suggested-by: Johan Hovold <johan@xxxxxxxxxx> > > > Signed-off-by: Krishna Kurapati <quic_kriskura@xxxxxxxxxxx> > > > --- > > > drivers/usb/dwc3/core.c | 11 +++++++++++ > > > 1 file changed, 11 insertions(+) > > > > > > diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c > > > index 32ec05fc242b..e1ebae54454f 100644 > > > --- a/drivers/usb/dwc3/core.c > > > +++ b/drivers/usb/dwc3/core.c > > > @@ -486,6 +486,11 @@ static void dwc3_free_event_buffers(struct dwc3 *dwc) > > > static int dwc3_alloc_event_buffers(struct dwc3 *dwc, unsigned int length) > > > { > > > struct dwc3_event_buffer *evt; > > > + unsigned int hw_mode; > > > + > > > + hw_mode = DWC3_GHWPARAMS0_MODE(dwc->hwparams.hwparams0); > > > + if (hw_mode == DWC3_GHWPARAMS0_MODE_HOST) > > > + return 0; > > > > This is a little awkward. Returning 0 here indicates that this function > > was successful, and the event buffers were allocated based on the > > function name. Do this check outside of dwc3_alloc_one_event_buffer() > > and specifically set dwc->ev_buf = NULL if that's the case. > > > Hi Thinh, > > Apologies, I didn't understand the comment properly. > > I thought we were supposed to return 0 here if we fulfill the goal of this > function (allocate if we are drd/gadget and don't allocate if we are host > mode only). The name of the function implies that it returns 0 if it allocated the event buffer. If there are multiple conditions to the function returning 0 here, then we should document it. > > If we return a non zero error here, probe would fail as this call will be > done only for host only controllers during probe and nowhere else. > > Are you suggesting we move this check to dwc3_alloc_one_event_buffer call > ? > > Regards, > Krishna, > I'm suggesting to move the check to the caller of dwc3_alloc_one_event_buffer(). Something like this so that it's self-documented: diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c index 0beaab932e7d..bba82792bf6f 100644 --- a/drivers/usb/dwc3/core.c +++ b/drivers/usb/dwc3/core.c @@ -1773,6 +1773,7 @@ static int dwc3_probe(struct platform_device *pdev) struct resource *res, dwc_res; void __iomem *regs; struct dwc3 *dwc; + unsigned int hw_mode; int ret; dwc = devm_kzalloc(dev, sizeof(*dwc), GFP_KERNEL); @@ -1854,11 +1855,16 @@ static int dwc3_probe(struct platform_device *pdev) pm_runtime_forbid(dev); - ret = dwc3_alloc_event_buffers(dwc, DWC3_EVENT_BUFFERS_SIZE); - if (ret) { - dev_err(dwc->dev, "failed to allocate event buffers\n"); - ret = -ENOMEM; - goto err_allow_rpm; + hw_mode = DWC3_GHWPARAMS0_MODE(dwc->hwparams.hwparams0); + if (hw_mode == DWC3_GHWPARAMS0_MODE_HOST) { + dwc->ev_buf = NULL; + } else { + ret = dwc3_alloc_event_buffers(dwc, DWC3_EVENT_BUFFERS_SIZE); + if (ret) { + dev_err(dwc->dev, "failed to allocate event buffers\n"); + ret = -ENOMEM; + goto err_allow_rpm; + } } dwc->edev = dwc3_get_extcon(dwc); -- Thanks, Thinh