Re: [U-Boot] [PATCH 16/19] fix: nand: Replace hardcoded page chunk size with calculated one

2018-09-19 Thread Stefan Roese

On 29.08.2018 10:56, kos...@marvell.com wrote:

From: Konstantin Porotchkin 

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 
Reviewed-by: Igal Liberman 
Cc: Stefan Roese 
Cc: Simon Glass 
---
  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_FIFO5   /* 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 & 0xFF) << 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 = _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(>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 

[U-Boot] [PATCH 16/19] fix: nand: Replace hardcoded page chunk size with calculated one

2018-08-29 Thread kostap
From: Konstantin Porotchkin 

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 
Reviewed-by: Igal Liberman 
Cc: Stefan Roese 
Cc: Simon Glass 
---
 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 */
 #defineCHIP_DELAY_TIMEOUT  200
 #define NAND_STOP_DELAY40
-#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 & 0xFF) << 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 = _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(>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) {