2020-08-24 15:26:42

by Alex Dewar

[permalink] [raw]
Subject: [PATCH] staging: emxx_udc: Fix passing of NULL to dma_alloc_coherent()

In nbu2ss_eq_queue() memory is allocated with dma_alloc_coherent(),
though, strangely, NULL is passed as the struct device* argument. Pass
the UDC's device instead.

Build-tested on x86 only.

Fixes: 33aa8d45a4fe ("staging: emxx_udc: Add Emma Mobile USB Gadget driver")
Signed-off-by: Alex Dewar <[email protected]>
---

So I *think* this is the right fix, but I don't have the hardware so
I've only been able to build-test it. My worry is that I could be
passing in the wrong struct device* here, which would squelch the
warning without fixing the breakage.

Can someone cleverer than me tell me if this makes sense?

- Alex
---
drivers/staging/emxx_udc/emxx_udc.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/staging/emxx_udc/emxx_udc.c b/drivers/staging/emxx_udc/emxx_udc.c
index 03929b9d3a8b..09e91449c08c 100644
--- a/drivers/staging/emxx_udc/emxx_udc.c
+++ b/drivers/staging/emxx_udc/emxx_udc.c
@@ -2593,7 +2593,7 @@ static int nbu2ss_ep_queue(struct usb_ep *_ep,

if (req->unaligned) {
if (!ep->virt_buf)
- ep->virt_buf = dma_alloc_coherent(NULL, PAGE_SIZE,
+ ep->virt_buf = dma_alloc_coherent(udc->dev, PAGE_SIZE,
&ep->phys_buf,
GFP_ATOMIC | GFP_DMA);
if (ep->epnum > 0) {
--
2.28.0


2020-08-24 15:58:20

by Alex Dewar

[permalink] [raw]
Subject: Re: [PATCH] staging: emxx_udc: Fix passing of NULL to dma_alloc_coherent()

On Mon, Aug 24, 2020 at 04:19:17PM +0100, Alex Dewar wrote:
> In nbu2ss_eq_queue() memory is allocated with dma_alloc_coherent(),
> though, strangely, NULL is passed as the struct device* argument. Pass
> the UDC's device instead.
>
> Build-tested on x86 only.
>
> Fixes: 33aa8d45a4fe ("staging: emxx_udc: Add Emma Mobile USB Gadget driver")
> Signed-off-by: Alex Dewar <[email protected]>
> ---
>
> So I *think* this is the right fix, but I don't have the hardware so
> I've only been able to build-test it. My worry is that I could be
> passing in the wrong struct device* here, which would squelch the
> warning without fixing the breakage.
>
> Can someone cleverer than me tell me if this makes sense?
>
> - Alex

PS -- I meant to put an RFC in the subject line and an extra tag:
Reported-by: Dan Carpenter <[email protected]>

> ---
> drivers/staging/emxx_udc/emxx_udc.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/drivers/staging/emxx_udc/emxx_udc.c b/drivers/staging/emxx_udc/emxx_udc.c
> index 03929b9d3a8b..09e91449c08c 100644
> --- a/drivers/staging/emxx_udc/emxx_udc.c
> +++ b/drivers/staging/emxx_udc/emxx_udc.c
> @@ -2593,7 +2593,7 @@ static int nbu2ss_ep_queue(struct usb_ep *_ep,
>
> if (req->unaligned) {
> if (!ep->virt_buf)
> - ep->virt_buf = dma_alloc_coherent(NULL, PAGE_SIZE,
> + ep->virt_buf = dma_alloc_coherent(udc->dev, PAGE_SIZE,
> &ep->phys_buf,
> GFP_ATOMIC | GFP_DMA);
> if (ep->epnum > 0) {
> --
> 2.28.0
>

2020-08-25 07:41:58

by Dan Carpenter

[permalink] [raw]
Subject: Re: [PATCH] staging: emxx_udc: Fix passing of NULL to dma_alloc_coherent()

On Mon, Aug 24, 2020 at 04:57:12PM +0100, Alex Dewar wrote:
> On Mon, Aug 24, 2020 at 04:19:17PM +0100, Alex Dewar wrote:
> > In nbu2ss_eq_queue() memory is allocated with dma_alloc_coherent(),
> > though, strangely, NULL is passed as the struct device* argument. Pass
> > the UDC's device instead.

I think passing NULL was always wrong, but it used to not cause an Oops.
This was changed a year or two ago.

> >
> > Build-tested on x86 only.
> >
> > Fixes: 33aa8d45a4fe ("staging: emxx_udc: Add Emma Mobile USB Gadget driver")
> > Signed-off-by: Alex Dewar <[email protected]>
> > ---
> >
> > So I *think* this is the right fix, but I don't have the hardware so
> > I've only been able to build-test it. My worry is that I could be
> > passing in the wrong struct device* here, which would squelch the
> > warning without fixing the breakage.
> >
> > Can someone cleverer than me tell me if this makes sense?
> >
> > - Alex
>
> PS -- I meant to put an RFC in the subject line and an extra tag:
> Reported-by: Dan Carpenter <[email protected]>
>

I don't know which dev pointer we're supposed to pass... It would be
good to find someone to test the patch but if not then applying your
patch is reasonable.

But could you search through the file and update the rest as well.
The dma_free_coherent() needs to be updated and there was a second
dma_alloc_coherent() in the bug report.

regards,
dan carpenter

2020-08-25 08:17:18

by Alex Dewar

[permalink] [raw]
Subject: Re: [PATCH] staging: emxx_udc: Fix passing of NULL to dma_alloc_coherent()

On Tue, Aug 25, 2020 at 10:37:13AM +0300, Dan Carpenter wrote:
> On Mon, Aug 24, 2020 at 04:57:12PM +0100, Alex Dewar wrote:
> > On Mon, Aug 24, 2020 at 04:19:17PM +0100, Alex Dewar wrote:
> > > In nbu2ss_eq_queue() memory is allocated with dma_alloc_coherent(),
> > > though, strangely, NULL is passed as the struct device* argument. Pass
> > > the UDC's device instead.
>
> I think passing NULL was always wrong, but it used to not cause an Oops.
> This was changed a year or two ago.
>
> > >
> > > Build-tested on x86 only.
> > >
> > > Fixes: 33aa8d45a4fe ("staging: emxx_udc: Add Emma Mobile USB Gadget driver")
> > > Signed-off-by: Alex Dewar <[email protected]>
> > > ---
> > >
> > > So I *think* this is the right fix, but I don't have the hardware so
> > > I've only been able to build-test it. My worry is that I could be
> > > passing in the wrong struct device* here, which would squelch the
> > > warning without fixing the breakage.
> > >
> > > Can someone cleverer than me tell me if this makes sense?
> > >
> > > - Alex
> >
> > PS -- I meant to put an RFC in the subject line and an extra tag:
> > Reported-by: Dan Carpenter <[email protected]>
> >
>
> I don't know which dev pointer we're supposed to pass... It would be
> good to find someone to test the patch but if not then applying your
> patch is reasonable.
>
> But could you search through the file and update the rest as well.
> The dma_free_coherent() needs to be updated and there was a second
> dma_alloc_coherent() in the bug report.
>
> regards,
> dan carpenter
>

I can only find the one instance of dma_alloc_coherent(). Was it by any
chance a different warning about the same call....?

2020-08-25 08:33:31

by Dan Carpenter

[permalink] [raw]
Subject: Re: [PATCH] staging: emxx_udc: Fix passing of NULL to dma_alloc_coherent()

On Tue, Aug 25, 2020 at 09:14:59AM +0100, Alex Dewar wrote:
> On Tue, Aug 25, 2020 at 10:37:13AM +0300, Dan Carpenter wrote:
> > On Mon, Aug 24, 2020 at 04:57:12PM +0100, Alex Dewar wrote:
> > > On Mon, Aug 24, 2020 at 04:19:17PM +0100, Alex Dewar wrote:
> > > > In nbu2ss_eq_queue() memory is allocated with dma_alloc_coherent(),
> > > > though, strangely, NULL is passed as the struct device* argument. Pass
> > > > the UDC's device instead.
> >
> > I think passing NULL was always wrong, but it used to not cause an Oops.
> > This was changed a year or two ago.
> >
> > > >
> > > > Build-tested on x86 only.
> > > >
> > > > Fixes: 33aa8d45a4fe ("staging: emxx_udc: Add Emma Mobile USB Gadget driver")
> > > > Signed-off-by: Alex Dewar <[email protected]>
> > > > ---
> > > >
> > > > So I *think* this is the right fix, but I don't have the hardware so
> > > > I've only been able to build-test it. My worry is that I could be
> > > > passing in the wrong struct device* here, which would squelch the
> > > > warning without fixing the breakage.
> > > >
> > > > Can someone cleverer than me tell me if this makes sense?
> > > >
> > > > - Alex
> > >
> > > PS -- I meant to put an RFC in the subject line and an extra tag:
> > > Reported-by: Dan Carpenter <[email protected]>
> > >
> >
> > I don't know which dev pointer we're supposed to pass... It would be
> > good to find someone to test the patch but if not then applying your
> > patch is reasonable.
> >
> > But could you search through the file and update the rest as well.
> > The dma_free_coherent() needs to be updated and there was a second
> > dma_alloc_coherent() in the bug report.
> >
> > regards,
> > dan carpenter
> >
>
> I can only find the one instance of dma_alloc_coherent(). Was it by any
> chance a different warning about the same call....?

Ah.... It was warning about the dma_free_coherent().

regards,
dan carpenter

2020-08-25 12:15:15

by Alex Dewar

[permalink] [raw]
Subject: [PATCH v2] staging: emxx_udc: Fix passing of NULL to dma_alloc_coherent()

In nbu2ss_eq_queue() memory is allocated with dma_alloc_coherent(),
though, strangely, NULL is passed as the struct device* argument. Pass
the UDC's device instead. Fix up the corresponding call to
dma_free_coherent() in the same way.

Build-tested on x86 only.

Fixes: 33aa8d45a4fe ("staging: emxx_udc: Add Emma Mobile USB Gadget driver")
Reported-by: Dan Carpenter <[email protected]>
Signed-off-by: Alex Dewar <[email protected]>
---
v2: also fix call to dma_free_coherent() (Dan)

@Magnus: I noticed you contributed this code back in 2014... I don't
suppose you happen to have the hardware lying around to test this so we
can get a Tested-by....? :)
---
drivers/staging/emxx_udc/emxx_udc.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/staging/emxx_udc/emxx_udc.c b/drivers/staging/emxx_udc/emxx_udc.c
index 03929b9d3a8bc..d0725bc8b48a4 100644
--- a/drivers/staging/emxx_udc/emxx_udc.c
+++ b/drivers/staging/emxx_udc/emxx_udc.c
@@ -2593,7 +2593,7 @@ static int nbu2ss_ep_queue(struct usb_ep *_ep,

if (req->unaligned) {
if (!ep->virt_buf)
- ep->virt_buf = dma_alloc_coherent(NULL, PAGE_SIZE,
+ ep->virt_buf = dma_alloc_coherent(udc->dev, PAGE_SIZE,
&ep->phys_buf,
GFP_ATOMIC | GFP_DMA);
if (ep->epnum > 0) {
@@ -3148,7 +3148,7 @@ static int nbu2ss_drv_remove(struct platform_device *pdev)
for (i = 0; i < NUM_ENDPOINTS; i++) {
ep = &udc->ep[i];
if (ep->virt_buf)
- dma_free_coherent(NULL, PAGE_SIZE, (void *)ep->virt_buf,
+ dma_free_coherent(udc->dev, PAGE_SIZE, (void *)ep->virt_buf,
ep->phys_buf);
}

--
2.28.0