[ PATCH V2 4/7] MTD : add the common code for GPMI controller driver
Russell King - ARM Linux
linux at arm.linux.org.uk
Fri Mar 25 20:01:48 EDT 2011
On Fri, Mar 25, 2011 at 06:22:58PM +0800, Huang Shijie wrote:
> +/* Can we use the upper's buffer directly for DMA? */
> +void prepare_data_dma(struct gpmi_nfc_data *this, enum dma_data_direction dr)
> +{
> + struct mil *mil = &this->mil;
> + struct scatterlist *sgl = &mil->data_sgl;
> + int ret;
> +
> + mil->direct_dma_map_ok = true;
> +
> + /* first try to map the upper buffer directly */
> + sg_init_one(sgl, mil->upper_buf, mil->upper_len);
> + ret = dma_map_sg(this->dev, sgl, 1, dr);
> + if (ret == 0) {
> + /* We have to use our own DMA buffer. */
> + sg_init_one(sgl, mil->data_buffer_dma, PAGE_SIZE);
> + ret = dma_map_sg(this->dev, sgl, 1, dr);
> + BUG_ON(ret == 0);
> +
> + if (dr == DMA_TO_DEVICE)
> + memcpy(mil->data_buffer_dma, mil->upper_buf,
> + mil->upper_len);
Buggy. Ensure data is present in the buffers _before_ mapping.
> + case DMA_FOR_READ_DATA:
> + if (mil->direct_dma_map_ok == false)
> + memcpy(mil->upper_buf, (char *)mil->data_buffer_dma,
> + mil->upper_len);
> + dma_unmap_sg(this->dev, &mil->data_sgl, 1, DMA_FROM_DEVICE);
Buggy. Only read data from buffers _after_ unmapping.
More information about the linux-mtd
mailing list