diff mbox series

[v9,04/10] usb: dwc3: core: Skip setting event buffers for host only controllers

Message ID 20230621043628.21485-5-quic_kriskura@quicinc.com
State Superseded
Headers show
Series Add multiport support for DWC3 controllers | expand

Commit Message

Krishna Kurapati June 21, 2023, 4:36 a.m. UTC
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@kernel.org>
Signed-off-by: Krishna Kurapati <quic_kriskura@quicinc.com>
---
 drivers/usb/dwc3/core.c | 11 +++++++++++
 1 file changed, 11 insertions(+)

Comments

Thinh Nguyen June 23, 2023, 10:27 p.m. UTC | #1
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@kernel.org>
> Signed-off-by: Krishna Kurapati <quic_kriskura@quicinc.com>
> ---
>  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.

Thanks,
Thinh

>  
>  	evt = dwc3_alloc_one_event_buffer(dwc, length);
>  	if (IS_ERR(evt)) {
> @@ -507,6 +512,9 @@ int dwc3_event_buffers_setup(struct dwc3 *dwc)
>  {
>  	struct dwc3_event_buffer	*evt;
>  
> +	if (!dwc->ev_buf)
> +		return 0;
> +
>  	evt = dwc->ev_buf;
>  	evt->lpos = 0;
>  	dwc3_writel(dwc->regs, DWC3_GEVNTADRLO(0),
> @@ -524,6 +532,9 @@ void dwc3_event_buffers_cleanup(struct dwc3 *dwc)
>  {
>  	struct dwc3_event_buffer	*evt;
>  
> +	if (!dwc->ev_buf)
> +		return;
> +
>  	evt = dwc->ev_buf;
>  
>  	evt->lpos = 0;
> -- 
> 2.40.0
>
Krishna Kurapati June 24, 2023, 7:20 a.m. UTC | #2
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@kernel.org>
>> Signed-off-by: Krishna Kurapati <quic_kriskura@quicinc.com>
>> ---
>>   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).

   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,

>>   
>>   	evt = dwc3_alloc_one_event_buffer(dwc, length);
>>   	if (IS_ERR(evt)) {
>> @@ -507,6 +512,9 @@ int dwc3_event_buffers_setup(struct dwc3 *dwc)
>>   {
>>   	struct dwc3_event_buffer	*evt;
>>   
>> +	if (!dwc->ev_buf)
>> +		return 0;
>> +
>>   	evt = dwc->ev_buf;
>>   	evt->lpos = 0;
>>   	dwc3_writel(dwc->regs, DWC3_GEVNTADRLO(0),
>> @@ -524,6 +532,9 @@ void dwc3_event_buffers_cleanup(struct dwc3 *dwc)
>>   {
>>   	struct dwc3_event_buffer	*evt;
>>   
>> +	if (!dwc->ev_buf)
>> +		return;
>> +
>>   	evt = dwc->ev_buf;
>>   
>>   	evt->lpos = 0;
>> -- 
>> 2.40.0
Thinh Nguyen June 26, 2023, 11:34 p.m. UTC | #3
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@kernel.org>
> > > Signed-off-by: Krishna Kurapati <quic_kriskura@quicinc.com>
> > > ---
> > >   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
Thinh Nguyen June 26, 2023, 11:46 p.m. UTC | #4
On Mon, Jun 26, 2023, Thinh Nguyen wrote:
> 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@kernel.org>
> > > > Signed-off-by: Krishna Kurapati <quic_kriskura@quicinc.com>
> > > > ---
> > > >   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);
> 

Actually, please ignore. there's already a document there, I missed that
for some reason. What you did is fine. Though, I don't see the condition
for ev_buf = NULL anywhere. Can you add that for clarity?

Thanks,
Thinh
Krishna Kurapati July 2, 2023, 6:45 p.m. UTC | #5
On 6/27/2023 5:16 AM, Thinh Nguyen wrote:
> On Mon, Jun 26, 2023, Thinh Nguyen wrote:
>> 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@kernel.org>
>>>>> Signed-off-by: Krishna Kurapati <quic_kriskura@quicinc.com>
>>>>> ---
>>>>>    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);
>>
> 
> Actually, please ignore. there's already a document there, I missed that
> for some reason. What you did is fine. Though, I don't see the condition
> for ev_buf = NULL anywhere. Can you add that for clarity?
> 
> Thanks,
> Thinh

Hi Thinh,

  Did you mean adding "dwc->ev_buf = NULL" specifically ?

Regards,
Krishna,
Thinh Nguyen July 5, 2023, 10:40 p.m. UTC | #6
On Mon, Jul 03, 2023, Krishna Kurapati PSSNV wrote:
> 
> 
> On 6/27/2023 5:16 AM, Thinh Nguyen wrote:
> > On Mon, Jun 26, 2023, Thinh Nguyen wrote:
> > > 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@kernel.org>
> > > > > > Signed-off-by: Krishna Kurapati <quic_kriskura@quicinc.com>
> > > > > > ---
> > > > > >    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);
> > > 
> > 
> > Actually, please ignore. there's already a document there, I missed that
> > for some reason. What you did is fine. Though, I don't see the condition
> > for ev_buf = NULL anywhere. Can you add that for clarity?
> > 
> > Thanks,
> > Thinh
> 
> Hi Thinh,
> 
>  Did you mean adding "dwc->ev_buf = NULL" specifically ?
> 

Yes, please initialize dwc->ev_buf to NULL somewhere if it's host mode.

Thanks,
Thinh
diff mbox series

Patch

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;
 
 	evt = dwc3_alloc_one_event_buffer(dwc, length);
 	if (IS_ERR(evt)) {
@@ -507,6 +512,9 @@  int dwc3_event_buffers_setup(struct dwc3 *dwc)
 {
 	struct dwc3_event_buffer	*evt;
 
+	if (!dwc->ev_buf)
+		return 0;
+
 	evt = dwc->ev_buf;
 	evt->lpos = 0;
 	dwc3_writel(dwc->regs, DWC3_GEVNTADRLO(0),
@@ -524,6 +532,9 @@  void dwc3_event_buffers_cleanup(struct dwc3 *dwc)
 {
 	struct dwc3_event_buffer	*evt;
 
+	if (!dwc->ev_buf)
+		return;
+
 	evt = dwc->ev_buf;
 
 	evt->lpos = 0;