[U-Boot] [PATCH 16/19] fix: nand: Replace hardcoded page chunk size with calculated one
Stefan Roese
sr at denx.de
Wed Sep 19 12:36:39 UTC 2018
On 29.08.2018 10:56, kostap at marvell.com wrote:
> From: Konstantin Porotchkin <kostap at marvell.com>
>
> Replace the hardcoded value of page chink with value that
> depends on flash page size and ECC strength.
> This fixes nand access errors for 2K page flashes with 8-bit ECC.
> Move the initial flash commannd function assignment past the ECC
> structures initialization for eliminating usage of hardcoded page
> chunk size value.
>
> Signed-off-by: Konstantin Porotchkin <kostap at marvell.com>
> Reviewed-by: Igal Liberman <igall at marvell.com>
> Cc: Stefan Roese <sr at denx.de>
> Cc: Simon Glass <sjg at chromium.org>
> ---
> drivers/mtd/nand/pxa3xx_nand.c | 42 ++++++++++++++++++++----------------------
> 1 file changed, 20 insertions(+), 22 deletions(-)
>
> diff --git a/drivers/mtd/nand/pxa3xx_nand.c b/drivers/mtd/nand/pxa3xx_nand.c
> index a7b9864..a7ca28c 100644
> --- a/drivers/mtd/nand/pxa3xx_nand.c
> +++ b/drivers/mtd/nand/pxa3xx_nand.c
> @@ -24,7 +24,6 @@ DECLARE_GLOBAL_DATA_PTR;
> #define TIMEOUT_DRAIN_FIFO 5 /* in ms */
> #define CHIP_DELAY_TIMEOUT 200
> #define NAND_STOP_DELAY 40
> -#define PAGE_CHUNK_SIZE (2048)
>
> /*
> * Define a buffer size for the initial command that detects the flash device:
> @@ -729,7 +728,7 @@ static void set_command_address(struct pxa3xx_nand_info *info,
> unsigned int page_size, uint16_t column, int page_addr)
> {
> /* small page addr setting */
> - if (page_size < PAGE_CHUNK_SIZE) {
> + if (page_size < info->chunk_size) {
> info->ndcb1 = ((page_addr & 0xFFFFFF) << 8)
> | (column & 0xFF);
>
> @@ -839,9 +838,9 @@ static int prepare_set_command(struct pxa3xx_nand_info *info, int command,
> * which is either naked-read or last-read according to the
> * state.
> */
> - if (mtd->writesize == PAGE_CHUNK_SIZE) {
> + if (mtd->writesize == info->chunk_size) {
> info->ndcb0 |= NDCB0_DBC | (NAND_CMD_READSTART << 8);
> - } else if (mtd->writesize > PAGE_CHUNK_SIZE) {
> + } else if (mtd->writesize > info->chunk_size) {
> info->ndcb0 |= NDCB0_DBC | (NAND_CMD_READSTART << 8)
> | NDCB0_LEN_OVRD
> | NDCB0_EXT_CMD_TYPE(ext_cmd_type);
> @@ -861,7 +860,7 @@ static int prepare_set_command(struct pxa3xx_nand_info *info, int command,
> * Multiple page programming needs to execute the initial
> * SEQIN command that sets the page address.
> */
> - if (mtd->writesize > PAGE_CHUNK_SIZE) {
> + if (mtd->writesize > info->chunk_size) {
> info->ndcb0 |= NDCB0_CMD_TYPE(0x1)
> | NDCB0_EXT_CMD_TYPE(ext_cmd_type)
> | addr_cycle
> @@ -886,7 +885,7 @@ static int prepare_set_command(struct pxa3xx_nand_info *info, int command,
> }
>
> /* Second command setting for large pages */
> - if (mtd->writesize > PAGE_CHUNK_SIZE) {
> + if (mtd->writesize > info->chunk_size) {
> /*
> * Multiple page write uses the 'extended command'
> * field. This can be used to issue a command dispatch
> @@ -1312,7 +1311,6 @@ static int pxa3xx_nand_config_ident(struct pxa3xx_nand_info *info)
> struct pxa3xx_nand_platform_data *pdata = info->pdata;
>
> /* Configure default flash values */
> - info->chunk_size = PAGE_CHUNK_SIZE;
> info->reg_ndcr = 0x0; /* enable all interrupts */
> info->reg_ndcr |= (pdata->enable_arbiter) ? NDCR_ND_ARB_EN : 0;
> info->reg_ndcr |= NDCR_RD_ID_CNT(READ_ID_BYTES);
> @@ -1529,21 +1527,6 @@ static int pxa3xx_nand_scan(struct mtd_info *mtd)
> chip->bbt_md = &bbt_mirror_descr;
> #endif
>
> - /*
> - * If the page size is bigger than the FIFO size, let's check
> - * we are given the right variant and then switch to the extended
> - * (aka splitted) command handling,
> - */
> - if (mtd->writesize > PAGE_CHUNK_SIZE) {
> - if (info->variant == PXA3XX_NAND_VARIANT_ARMADA370) {
> - chip->cmdfunc = nand_cmdfunc_extended;
> - } else {
> - dev_err(&info->pdev->dev,
> - "unsupported page size on this variant\n");
> - return -ENODEV;
> - }
> - }
> -
> if (pdata->ecc_strength && pdata->ecc_step_size) {
> ecc_strength = pdata->ecc_strength;
> ecc_step = pdata->ecc_step_size;
> @@ -1563,6 +1546,21 @@ static int pxa3xx_nand_scan(struct mtd_info *mtd)
> if (ret)
> return ret;
>
> + /*
> + * If the page size is bigger than the FIFO size, let's check
> + * we are given the right variant and then switch to the extended
> + * (aka split) command handling,
> + */
> + if (mtd->writesize > info->chunk_size) {
> + if (info->variant == PXA3XX_NAND_VARIANT_ARMADA370) {
> + chip->cmdfunc = nand_cmdfunc_extended;
> + } else {
> + dev_err(&info->pdev->dev,
> + "unsupported page size on this variant\n");
> + return -ENODEV;
> + }
> + }
> +
> /* calculate addressing information */
> if (mtd->writesize >= 2048)
> host->col_addr_cycles = 2;
>
Applied to u-boot-marvell/master
Thanks,
Stefan
More information about the U-Boot
mailing list