spi: pxa2xx_spi.c fix DMA mapping sequence
PATCH 1/1 spi: pxa2xx_spi.c fix DMA mapping sequence
From: Ned Forrester <nforrester-/[email protected]>
Fixes a bug in pxa2xx_spi.c when operating in direct memory access (DMA) mode. The transmit and receive buffers are allowed to be the same or to overlap, but pxa2xx_spi.c fails if this is attempted in DMA mode because it performs mapping of the rx and tx buffers in the wrong order. By mapping DMA_FROM_DEVICE before DMA_TO_DEVICE, it invalidates the cache before flushing it. The patch corrects the order of mapping. This bug exists in all versions of pxa2xx_spi.c
A version of this patch has been tested on kernel 2.6.20 using verification of loopback data with: random transfer length, random bits-per-word, random positive offsets (both larger and smaller than transfer length) between the start of the rx and tx buffers, and varying clock rates.
This patch applies to kernels 2.6.27 and 2.6.28. A separate patch is required for 2.6.20 through 2.6.26.
---
drivers/spi/pxa2xx_spi.c | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-)
drivers/spi/pxa2xx_spi.c +11 -12
@@ -352,21 +352,20 @@ static int map_dma_buffers(struct driver }else drv_data->tx_map_len = drv_data->len; -/* Stream map the rx buffer */ - drv_data->rx_dma =dma_map_single (dev, drv_data->rx, - drv_data->rx_map_len, -DMA_FROM_DEVICE ); -if (dma_mapping_error (dev, drv_data->rx_dma)) -return 0 ; - -/* Stream map the tx buffer */ +/* Stream map the tx buffer. Always do DMA_TO_DEVICE first, +* because we want to flush the cache before invalidating it, +* in case the tx and rx buffers overlap */ drv_data->tx_dma =dma_map_single (dev, drv_data->tx, - drv_data->tx_map_len, -DMA_TO_DEVICE ); + drv_data->tx_map_len,DMA_TO_DEVICE ); +if (dma_mapping_error (dev, drv_data->tx_dma)) +return 0 ; -if (dma_mapping_error (dev, drv_data->tx_dma)) { -dma_unmap_single (dev, drv_data->rx_dma, +/* Stream map the rx buffer */ + drv_data->rx_dma =dma_map_single (dev, drv_data->rx, drv_data->rx_map_len,DMA_FROM_DEVICE ); +if (dma_mapping_error (dev, drv_data->rx_dma)) { +dma_unmap_single (dev, drv_data->tx_dma, + drv_data->tx_map_len,DMA_TO_DEVICE );return 0 ; }
Signature · 14 lines
Ned Forrester nforrester-/[email protected] Oceanographic Systems Lab 508-289-2226 Applied Ocean Physics and Engineering Dept. Woods Hole Oceanographic Institution Woods Hole, MA 02543, USA http://www.whoi.edu/sbl/liteSite.do?litesiteid=7212 http://www.whoi.edu/hpb/Site.do?id=1532 http://www.whoi.edu/page.do?pid=10079 ------------------------------------------------------------------------- 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=/
A message that is not in the archive (sent off-list or not yet received): 491F3C1A.1030402-/[email protected]
Quoted 9 lines · Ned Forrester
From: Ned Forrester <nforrester-/[email protected]>
Fixes a bug in
pxa2xx_spi.cwhen operating in direct memory access (DMA) mode. The transmit and receive buffers are allowed to be the same or to overlap, butpxa2xx_spi.cfails if this is attempted in DMA mode because it performs mapping of the rx and tx buffers in the wrong order. By mappingDMA_FROM_DEVICEbeforeDMA_TO_DEVICE, it invalidates the cache before flushing it. The patch corrects the order of mapping. This bug exists in all versions ofpxa2xx_spi.c
David,
Assuming that you accept this patch, may I attach your Ack: and forward this to stable along with a version for kernels older than 2.6.27, or would you prefer to forward this to stable directly and for me to also post the the older patch to spi-devel-general for your attention?
Signature · 14 lines
Ned Forrester nforrester-/[email protected] Oceanographic Systems Lab 508-289-2226 Applied Ocean Physics and Engineering Dept. Woods Hole Oceanographic Institution Woods Hole, MA 02543, USA http://www.whoi.edu/sbl/liteSite.do?litesiteid=7212 http://www.whoi.edu/hpb/Site.do?id=1532 http://www.whoi.edu/page.do?pid=10079 ------------------------------------------------------------------------- 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=/
A message that is not in the archive (sent off-list or not yet received): 491F3D4E.8080502-/[email protected]
Quoted 5 lines · Ned Forrester
Assuming that you accept this patch, may I attach your Ack: and forward this to stable along with a version for kernels older than 2.6.27, or would you prefer to forward this to stable directly and for me to also post the the older patch to spi-devel-general for your attention?
I sent it along with some cosmetic tweaks (comments) ... thanks!
Let me see the patch, then I'll ack ... note that you should hold off sending that until the 2.6.27-stable patch gets sent.
- Dave
-------------------------------------------------------------------------
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=/