Messages in this thread Patch in this message | | | Date | Wed, 19 May 2010 13:05:00 +0200 | From | Anders Larsen <> | Subject | Re: [PATCH] Fix Oops with Atmel SPI |
| |
On 2010-04-22 00:24:10, Andrew Morton wrote: > Finally.. Wouldn't it be better to just fix the atmel SPI driver so > that it doesn't barf when handed vmalloc'ed memory? Who do we ridicule > about that? <checks, adds cc>
You mean something like this instead?
diff --git a/drivers/spi/atmel_spi.c b/drivers/spi/atmel_spi.c index c4e0442..a9ad5e8 100644 --- a/drivers/spi/atmel_spi.c +++ b/drivers/spi/atmel_spi.c @@ -352,16 +352,30 @@ atmel_spi_dma_map_xfer(struct atmel_spi *as, struct spi_transfer *xfer) xfer->tx_dma = xfer->rx_dma = INVALID_DMA_ADDRESS; if (xfer->tx_buf) { - xfer->tx_dma = dma_map_single(dev, - (void *) xfer->tx_buf, xfer->len, - DMA_TO_DEVICE); + if (is_vmalloc_addr(xfer->tx_buf)) + xfer->tx_dma = dma_map_page(dev, + vmalloc_to_page(xfer->tx_buf), + (unsigned long)xfer->tx_buf & (PAGE_SIZE-1), + xfer->len, + DMA_TO_DEVICE); + else + xfer->tx_dma = dma_map_single(dev, + (void *) xfer->tx_buf, xfer->len, + DMA_TO_DEVICE); if (dma_mapping_error(dev, xfer->tx_dma)) return -ENOMEM; } if (xfer->rx_buf) { - xfer->rx_dma = dma_map_single(dev, - xfer->rx_buf, xfer->len, - DMA_FROM_DEVICE); + if (is_vmalloc_addr(xfer->rx_buf)) + xfer->rx_dma = dma_map_page(dev, + vmalloc_to_page(xfer->rx_buf), + (unsigned long)xfer->rx_buf & (PAGE_SIZE-1), + xfer->len, + DMA_FROM_DEVICE); + else + xfer->rx_dma = dma_map_single(dev, + xfer->rx_buf, xfer->len, + DMA_FROM_DEVICE); if (dma_mapping_error(dev, xfer->rx_dma)) { if (xfer->tx_buf) dma_unmap_single(dev,
| |