Subject: PPC4XX DMA polarity bug in linuxppc-2.6.9

From: Colin Wernham <[email-masked]>
Date: Thu, 09 Dec 2004 10:13:46 +0000

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 
correctly in the DMA controller using the ppc4xx_init_dma_channel() 
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 
function is called twice:

    467  /* clear all polarity signals and then "or" in new signal levels */
    468  polarity &= ~GET_DMA_POLARITY(dmanr);
    469  polarity |= p_dma_ch->polarity;

Fix could be:
    469  polarity |= p_init->polarity;

Is there anyone else using the PPC4XX DMA?

Colin Wernham