PPC4XX DMA polarity bug in linuxppc-2.6.9
From: Colin Wernham <hidden>
Date: 2004-12-10 09:16:46
[a copy of this has also been posted on linuxppc-dev]
I believe that there is a PPC4xx DMA driver bug in the following kernel, =
file and function:
linuxppc-2.6.9,
/arch/ppc/syslib/ppc4xx_dma.c,
ppc4xx_init_dma_channel()
Symptoms are:
DMA does not work as the polarity bits (DMA Req, Ack, EOT) are not set=20
correctly in the DMA controller using the ppc4xx_init_dma_channel()=20
function call, but when this is called twice in succession, then it does =
work.
Cause is (I believe):
/arch/ppc/syslib/ppc4xx_dma.c:
On line 469 the old polarity bits in p_dma_ch are ORed in when it should =
be ORing in the new polarity bits from p_init. p_init is then saved into =
p_dma_ch. This means that it only gets correctly programmed when the=20
function is called twice:
467 /* clear all polarity signals and then "or" in new signal =
levels */
468 polarity &=3D ~GET_DMA_POLARITY(dmanr);
469 polarity |=3D p_dma_ch->polarity;
Fix should be:
469 polarity |=3D p_init->polarity;
Is there anyone else using the PPC4XX DMA?
Colin Wernham