> -----Original Message-----
> From: Denis Kirjanov [mailto:[email protected]]
> Sent: Friday, July 18, 2014 7:21 PM
> To: Badola Nikhil-B46172
> Cc: [email protected]
> Subject: Re: [PATCH] powerpc : dma-mapping : Check null condition for dev-
> >archdata.dma_ops
> 
> On 7/18/14, Nikhil Badola <[email protected]> wrote:
> > Modifies get_dma_ops() implementation on ppc arch to check null
> > condition
>  which means that dma is not supported.
> 
> Could you please describe the use case where the ops is null.

The use case in which ops are null is while running USB in Gadget and Otg mode.

For PPC architecture, whenever a platform device is registered, pdev->dev is 
assigned dma_ops. 
In USB, one single chipidea platform device is registered for any mode (host, 
gadget or otg)
whose dev, as explained above, has dma_ops set and this dev is assigned to  
ci->dev(dev of chipidea struct)
which is used by host controller device. That is why we don't need the above 
null case checking in
host mode. But when we run usb in gadget/otg mode, the device structure used is 
ci->gadget.dev
which does not have dma_ops set and it crashes when dma transaction starts when 
it calls get_dma_ops()
which returns NULL.

A similar approach is used in ARM architecture which checks for null condition 
and returns 
common dma_ops
> 
> > for dev->archdata.dma_ops; returns common dma_direct_ops structure in
> > case its NULL
> >
> > Signed-off-by: Nikhil Badola <[email protected]>
> > ---
> >  arch/powerpc/include/asm/dma-mapping.h | 6 ++++--
> >  1 file changed, 4 insertions(+), 2 deletions(-)
> >
> > diff --git a/arch/powerpc/include/asm/dma-mapping.h
> > b/arch/powerpc/include/asm/dma-mapping.h
> > index 150866b..d73bae8 100644
> > --- a/arch/powerpc/include/asm/dma-mapping.h
> > +++ b/arch/powerpc/include/asm/dma-mapping.h
> > @@ -86,10 +86,12 @@ static inline struct dma_map_ops
> > *get_dma_ops(struct device *dev)
> >      */
> >     if (unlikely(dev == NULL))
> >             return NULL;
> > -
> > -   return dev->archdata.dma_ops;
> > +   if (dev->archdata.dma_ops)
> > +           return dev->archdata.dma_ops;
> > +   return &dma_direct_ops;
> >  }
> >
> > +
> >  static inline void set_dma_ops(struct device *dev, struct dma_map_ops
> > *ops)  {
> >     dev->archdata.dma_ops = ops;
> > --
> > 1.7.11.7
> >
> > _______________________________________________
> > Linuxppc-dev mailing list
> > [email protected]
> > https://lists.ozlabs.org/listinfo/linuxppc-dev
> 
> 
> --
> Regards,
> Denis

Regards,
Nikhil
_______________________________________________
Linuxppc-dev mailing list
[email protected]
https://lists.ozlabs.org/listinfo/linuxppc-dev

Reply via email to