spi: au1550_spi full duplex dma fix
PATCH 1/1 spi: au1550_spi full duplex dma fix
From: Jan Nikitenko <[email protected]>
Fix unsafe order in dma mapping operation: always flush data from the cache *BEFORE* invalidating it, to allow full duplex transfers where the same buffer may be used for both writes and reads. Tested with mmc-spi.
Signed-off-by Jan Nikitenko <[email protected]>
Signed-off-by David Brownell <[email protected]>
---
This looks like the last of these particular DMA fixes. (For 2.6.28-final please.)
drivers/spi/au1550_spi.c | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-)
drivers/spi/au1550_spi.c +16 -10
@@ -369,10 +369,23 @@ static int au1550_spi_dma_txrxb(struct s dma_rx_addr = t->rx_dma;/* -* check if buffers are already dma mapped, map them otherwise +* check if buffers are already dma mapped, map them otherwise: +* - first map the TX buffer, so cache data gets written to memory +* - then map the RX buffer, so that cache entries (with +* soon-to-be-stale data) get removed * use rx buffer in place of tx if tx buffer was not provided * use temp rx buffer (preallocated or realloc to fit) for rx dma */ +if (t->tx_buf) { +if (t->tx_dma ==0 ) {/* if DMA_ADDR_INVALID, map it */ + dma_tx_addr =dma_map_single (hw->dev, + (void *)t->tx_buf, + t->len,DMA_TO_DEVICE ); +if (dma_mapping_error (hw->dev, dma_tx_addr)) +dev_err (hw->dev,"tx dma map error\n" ); + } + } +if (t->rx_buf) {if (t->rx_dma ==0 ) {/* if DMA_ADDR_INVALID, map it */ dma_rx_addr = dma_map_single(hw->dev,
@@ -396,15 +409,8 @@ static int au1550_spi_dma_txrxb(struct sdma_sync_single_for_device (hw->dev, dma_rx_addr, t->len,DMA_FROM_DEVICE ); } -if (t->tx_buf) { -if (t->tx_dma ==0 ) {/* if DMA_ADDR_INVALID, map it */ - dma_tx_addr =dma_map_single (hw->dev, - (void *)t->tx_buf, - t->len,DMA_TO_DEVICE ); -if (dma_mapping_error (hw->dev, dma_tx_addr)) -dev_err (hw->dev,"tx dma map error\n" ); - } - }else { + +if (!t->tx_buf) {dma_sync_single_for_device (hw->dev, dma_rx_addr, t->len,DMA_BIDIRECTIONAL ); hw->tx = hw->rx;
-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge Build the coolest Linux based applications with Moblin SDK & win great prizes Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/