ARM: S3C64XX: DMA: Protect buffer pointers while manipulation
Ensure the DMA buffer points are not updated from another source during the process of enquing a buffer. Signed-off-by: Jassi Brar <jassi.brar@samsung.com> [ben-linux@fluff.org: Updated patch comment] Signed-off-by: Ben Dooks <ben-linux@fluff.org>
This commit is contained in:
@@ -339,6 +339,7 @@ int s3c2410_dma_enqueue(unsigned int channel, void *id,
|
|||||||
struct s3c64xx_dma_buff *next;
|
struct s3c64xx_dma_buff *next;
|
||||||
struct s3c64xx_dma_buff *buff;
|
struct s3c64xx_dma_buff *buff;
|
||||||
struct pl080s_lli *lli;
|
struct pl080s_lli *lli;
|
||||||
|
unsigned long flags;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
WARN_ON(!chan);
|
WARN_ON(!chan);
|
||||||
@@ -366,6 +367,8 @@ int s3c2410_dma_enqueue(unsigned int channel, void *id,
|
|||||||
|
|
||||||
s3c64xx_dma_fill_lli(chan, lli, data, size);
|
s3c64xx_dma_fill_lli(chan, lli, data, size);
|
||||||
|
|
||||||
|
local_irq_save(flags);
|
||||||
|
|
||||||
if ((next = chan->next) != NULL) {
|
if ((next = chan->next) != NULL) {
|
||||||
struct s3c64xx_dma_buff *end = chan->end;
|
struct s3c64xx_dma_buff *end = chan->end;
|
||||||
struct pl080s_lli *endlli = end->lli;
|
struct pl080s_lli *endlli = end->lli;
|
||||||
@@ -397,6 +400,8 @@ int s3c2410_dma_enqueue(unsigned int channel, void *id,
|
|||||||
s3c64xx_lli_to_regs(chan, lli);
|
s3c64xx_lli_to_regs(chan, lli);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
local_irq_restore(flags);
|
||||||
|
|
||||||
show_lli(lli);
|
show_lli(lli);
|
||||||
|
|
||||||
dbg_showchan(chan);
|
dbg_showchan(chan);
|
||||||
|
Reference in New Issue
Block a user