diff options
| author | Huang Shijie <shijie8@gmail.com> | 2013-12-18 10:40:59 -0500 |
|---|---|---|
| committer | Brian Norris <computersforpeace@gmail.com> | 2014-01-28 00:55:02 -0500 |
| commit | 06f216c83c25adadc231469d51ab133afdfe110a (patch) | |
| tree | 8635f2d05abd664390fa94f39559e0e2a21e629d | |
| parent | 464e906737d6eba2fe63e913e0df4306423b4f61 (diff) | |
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>
| -rw-r--r-- | drivers/mtd/nand/gpmi-nand/gpmi-nand.c | 13 |
1 files 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 e2f58207c779..d1d13d86b7e0 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) | |||
| 783 | { | 783 | { |
| 784 | struct bch_geometry *geo = &this->bch_geometry; | 784 | struct bch_geometry *geo = &this->bch_geometry; |
| 785 | struct device *dev = this->dev; | 785 | struct device *dev = this->dev; |
| 786 | struct mtd_info *mtd = &this->mtd; | ||
| 786 | 787 | ||
| 787 | /* [1] Allocate a command buffer. PAGE_SIZE is enough. */ | 788 | /* [1] Allocate a command buffer. PAGE_SIZE is enough. */ |
| 788 | this->cmd_buffer = kzalloc(PAGE_SIZE, GFP_DMA | GFP_KERNEL); | 789 | this->cmd_buffer = kzalloc(PAGE_SIZE, GFP_DMA | GFP_KERNEL); |
| 789 | if (this->cmd_buffer == NULL) | 790 | if (this->cmd_buffer == NULL) |
| 790 | goto error_alloc; | 791 | goto error_alloc; |
| 791 | 792 | ||
| 792 | /* [2] Allocate a read/write data buffer. PAGE_SIZE is enough. */ | 793 | /* |
| 793 | this->data_buffer_dma = kzalloc(PAGE_SIZE, GFP_DMA | GFP_KERNEL); | 794 | * [2] Allocate a read/write data buffer. |
| 795 | * The gpmi_alloc_dma_buffer can be called twice. | ||
| 796 | * We allocate a PAGE_SIZE length buffer if gpmi_alloc_dma_buffer | ||
| 797 | * is called before the nand_scan_ident; and we allocate a buffer | ||
| 798 | * of the real NAND page size when the gpmi_alloc_dma_buffer is | ||
| 799 | * called after the nand_scan_ident. | ||
| 800 | */ | ||
| 801 | this->data_buffer_dma = kzalloc(mtd->writesize ?: PAGE_SIZE, | ||
| 802 | GFP_DMA | GFP_KERNEL); | ||
| 794 | if (this->data_buffer_dma == NULL) | 803 | if (this->data_buffer_dma == NULL) |
| 795 | goto error_alloc; | 804 | goto error_alloc; |
| 796 | 805 | ||
