mtd: gpmi: allocate a proper buffer for non ECC read/write

Linux-MTD Mailing List linux-mtd at lists.infradead.org
Tue Jan 28 00:59:07 EST 2014


Gitweb:     http://git.infradead.org/?p=mtd-2.6.git;a=commit;h=06f216c83c25adadc231469d51ab133afdfe110a
Commit:     06f216c83c25adadc231469d51ab133afdfe110a
Parent:     464e906737d6eba2fe63e913e0df4306423b4f61
Author:     Huang Shijie <shijie8 at gmail.com>
AuthorDate: Wed Dec 18 23:40:59 2013 +0800
Committer:  Brian Norris <computersforpeace at gmail.com>
CommitDate: Mon Jan 27 21:55:02 2014 -0800

    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 at gmail.com>
    Signed-off-by: Brian Norris <computersforpeace at gmail.com>
---
 drivers/mtd/nand/gpmi-nand/gpmi-nand.c | 13 +++++++++++--
 1 file changed, 11 insertions(+), 2 deletions(-)

diff --git a/drivers/mtd/nand/gpmi-nand/gpmi-nand.c b/drivers/mtd/nand/gpmi-nand/gpmi-nand.c
index e2f5820..d1d13d8 100644
--- a/drivers/mtd/nand/gpmi-nand/gpmi-nand.c
+++ b/drivers/mtd/nand/gpmi-nand/gpmi-nand.c
@@ -783,14 +783,23 @@ static int gpmi_alloc_dma_buffer(struct gpmi_nand_data *this)
 {
 	struct bch_geometry *geo = &this->bch_geometry;
 	struct device *dev = this->dev;
+	struct mtd_info *mtd = &this->mtd;
 
 	/* [1] Allocate a command buffer. PAGE_SIZE is enough. */
 	this->cmd_buffer = kzalloc(PAGE_SIZE, GFP_DMA | GFP_KERNEL);
 	if (this->cmd_buffer == NULL)
 		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)
 		goto error_alloc;
 



More information about the linux-mtd-cvs mailing list