mtd: gpmi: allocate a proper buffer for non ECC read/write
The @data_buffer_dma buffer is used for non ECC read/write. Currently, the length of the buffer is PAGE_SIZE, but the NAND chip may has 8K page or 16K page. So we have to extend it for the large page NAND chips. The gpmi_alloc_dma_buffer will be called twice. The first time is to allocate a temporary buffer for scanning the NAND chip; The second time is to allocate a buffer to store the real page content. This patch allocates a buffer of PAGE_SIZE size for scanning the NAND chip when gpmi_alloc_dma_buffer is called the first time, and allocates a buffer of the real NAND page size for the second time gpmi_alloc_dma_buffer is called. Signed-off-by: Huang Shijie <shijie8@gmail.com> Signed-off-by: Brian Norris <computersforpeace@gmail.com>
This commit is contained in:
parent
464e906737
commit
06f216c83c
1 changed files with 11 additions and 2 deletions
|
@ -783,14 +783,23 @@ static int gpmi_alloc_dma_buffer(struct gpmi_nand_data *this)
|
||||||
{
|
{
|
||||||
struct bch_geometry *geo = &this->bch_geometry;
|
struct bch_geometry *geo = &this->bch_geometry;
|
||||||
struct device *dev = this->dev;
|
struct device *dev = this->dev;
|
||||||
|
struct mtd_info *mtd = &this->mtd;
|
||||||
|
|
||||||
/* [1] Allocate a command buffer. PAGE_SIZE is enough. */
|
/* [1] Allocate a command buffer. PAGE_SIZE is enough. */
|
||||||
this->cmd_buffer = kzalloc(PAGE_SIZE, GFP_DMA | GFP_KERNEL);
|
this->cmd_buffer = kzalloc(PAGE_SIZE, GFP_DMA | GFP_KERNEL);
|
||||||
if (this->cmd_buffer == NULL)
|
if (this->cmd_buffer == NULL)
|
||||||
goto error_alloc;
|
goto error_alloc;
|
||||||
|
|
||||||
/* [2] Allocate a read/write data buffer. PAGE_SIZE is enough. */
|
/*
|
||||||
this->data_buffer_dma = kzalloc(PAGE_SIZE, GFP_DMA | GFP_KERNEL);
|
* [2] Allocate a read/write data buffer.
|
||||||
|
* The gpmi_alloc_dma_buffer can be called twice.
|
||||||
|
* We allocate a PAGE_SIZE length buffer if gpmi_alloc_dma_buffer
|
||||||
|
* is called before the nand_scan_ident; and we allocate a buffer
|
||||||
|
* of the real NAND page size when the gpmi_alloc_dma_buffer is
|
||||||
|
* called after the nand_scan_ident.
|
||||||
|
*/
|
||||||
|
this->data_buffer_dma = kzalloc(mtd->writesize ?: PAGE_SIZE,
|
||||||
|
GFP_DMA | GFP_KERNEL);
|
||||||
if (this->data_buffer_dma == NULL)
|
if (this->data_buffer_dma == NULL)
|
||||||
goto error_alloc;
|
goto error_alloc;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue