[U-Boot] [PATCH V2 3/6] mv_egiga: bugfix: DMA issue fixed using volatile

Prafulla Wadaskar prafulla at marvell.com
Fri Jul 9 13:11:49 CEST 2010


 

> -----Original Message-----
> From: Albert ARIBAUD [mailto:albert.aribaud at free.fr] 
> Sent: Friday, July 09, 2010 3:24 PM
> To: Prafulla Wadaskar
> Cc: u-boot at lists.denx.de
> Subject: Re: [PATCH V2 3/6] mv_egiga: bugfix: DMA issue fixed 
> using volatile
> 
Snip..
> >> diff --git a/drivers/net/mv_egiga.h b/drivers/net/mv_egiga.h
> >> index 61c3157..c49bf40 100644
> >> --- a/drivers/net/mv_egiga.h
> >> +++ b/drivers/net/mv_egiga.h
> >> @@ -342,108 +342,108 @@
> >>
> >>   /* structures represents Controller registers */
> >>   struct mv_egiga_barsz {
> >> -	u32 bar;
> >> -	u32 size;
> >> +	volatile u32 bar;
> >> +	volatile u32 size;
> >
> > May be, making all volatile solves problem at your end, 
> that does not mean it is solution.
> > Mostly all registers are accessed as volatile 
> (readl/writel), register pointers are also volatile.
> >
> > I agree with you and suspect some code related to DMA pipes 
> initialization has problem that's breaking it's functionality 
> on Orion5X.
> >
> > I think we should debug on this to fix the bug correctly.
> >
> > Regards..
> > Prafulla . .
> 
> I have debugged the issue when it happened and found out that 
> the it is 
> not really about doing volatile accesses, but about doing accesses 
> out-of-order: the compiler intermixes writes from adjacent 
> source code 
> lines, which causes the write to the DMA start bit to occur before 
> writes to the descriptors are done. Apparently qualifying the struct 
> members volatile has an effect or write order that 
> readl/writel have not.

You can use volatile qualifier for the variables in DMA specific code instead of modifying structures,
Try to use memory barrier or something like that-
Some ref : http://gcc.gnu.org/ml/gcc/2003-04/msg01180.html
may be someone c-expert on the list can suggest better

Regards..
Prafulla . .
> 


More information about the U-Boot mailing list