RE: [PATCH] powerpc : dma-mapping : Check null condition for dev->archdata.dma_ops
From: nikhil.badola@freescale.com <hidden>
Date: 2014-07-21 09:47:58
-----Original Message----- From: Denis Kirjanov [mailto:kirjanov@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=
-
quoted
archdata.dma_ops=20 On 7/18/14, Nikhil Badola [off-list ref] wrote:quoted
Modifies get_dma_ops() implementation on ppc arch to check null conditionwhich means that dma is not supported. =20 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 m= ode. For PPC architecture, whenever a platform device is registered, pdev->dev i= s=20 assigned dma_ops.=20 In USB, one single chipidea platform device is registered for any mode (hos= t, 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 abov= e null case checking in host mode. But when we run usb in gadget/otg mode, the device structure use= d 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 condit= ion and returns=20 common dma_ops
=20quoted
for dev->archdata.dma_ops; returns common dma_direct_ops structure in case its NULL Signed-off-by: Nikhil Badola <redacted> --- arch/powerpc/include/asm/dma-mapping.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)diff --git a/arch/powerpc/include/asm/dma-mapping.hb/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 =3D=3D 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 =3D ops; -- 1.7.11.7 _______________________________________________ Linuxppc-dev mailing list Linuxppc-dev@lists.ozlabs.org https://lists.ozlabs.org/listinfo/linuxppc-dev=20 =20 -- Regards, Denis
Regards, Nikhil