> -----Original Message----- > From: Denis Kirjanov [mailto:kirja...@gmail.com] > Sent: Friday, July 18, 2014 7:21 PM > To: Badola Nikhil-B46172 > Cc: linuxppc-dev@lists.ozlabs.org > Subject: Re: [PATCH] powerpc : dma-mapping : Check null condition for dev- > >archdata.dma_ops > > On 7/18/14, Nikhil Badola <nikhil.bad...@freescale.com> 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 <nikhil.bad...@freescale.com> > > --- > > 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 > > Linuxppc-dev@lists.ozlabs.org > > https://lists.ozlabs.org/listinfo/linuxppc-dev > > > -- > Regards, > Denis Regards, Nikhil _______________________________________________ Linuxppc-dev mailing list Linuxppc-dev@lists.ozlabs.org https://lists.ozlabs.org/listinfo/linuxppc-dev