[ PATCH V2 4/7] MTD : add the common code for GPMI controller driver
From: Huang Shijie <hidden>
Date: 2011-03-28 02:04:14
Hi:
On Fri, Mar 25, 2011 at 06:22:58PM +0800, Huang Shijie wrote:quoted
+/* 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.
thanks.
quoted
+ 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.
thanks. Best Regards Huang Shijie