diff mbox

[2/2] mtd/nand: Fix IFC driver to support 2K NAND page

Message ID 1325134779-3571-3-git-send-email-prabhakar@freescale.com
State New, archived
Headers show

Commit Message

Prabhakar Kushwaha Dec. 29, 2011, 4:59 a.m. UTC
1) OOB area should be updated irrespective of NAND page size. Earlier it was
updated only for 512byte NAND page.

2) During OOB update fbcr should be equal to OOB size.

Signed-off-by: Poonam Aggrwal <poonam.aggrwal@freescale.com>
Signed-off-by: Prabhakar Kushwaha <prabhakar@freescale.com>
---
 git://git.kernel.org/pub/scm/linux/kernel/git/galak/powerpc.git (branch next)

 Tested on P1010RDB

 drivers/mtd/nand/fsl_ifc_nand.c |   20 ++++++++------------
 1 files changed, 8 insertions(+), 12 deletions(-)

Comments

Scott Wood Jan. 3, 2012, 7:49 p.m. UTC | #1
On 12/28/2011 10:59 PM, Prabhakar Kushwaha wrote:
> 1) OOB area should be updated irrespective of NAND page size. Earlier it was
> updated only for 512byte NAND page.
> 
> 2) During OOB update fbcr should be equal to OOB size.
> 
> Signed-off-by: Poonam Aggrwal <poonam.aggrwal@freescale.com>
> Signed-off-by: Prabhakar Kushwaha <prabhakar@freescale.com>
> ---
>  git://git.kernel.org/pub/scm/linux/kernel/git/galak/powerpc.git (branch next)

The IFC driver hasn't been merged into that tree that I can see.

>  Tested on P1010RDB
> 
>  drivers/mtd/nand/fsl_ifc_nand.c |   20 ++++++++------------
>  1 files changed, 8 insertions(+), 12 deletions(-)
> 
> diff --git a/drivers/mtd/nand/fsl_ifc_nand.c b/drivers/mtd/nand/fsl_ifc_nand.c
> index 2df7206..2c02168 100644
> --- a/drivers/mtd/nand/fsl_ifc_nand.c
> +++ b/drivers/mtd/nand/fsl_ifc_nand.c
> @@ -439,20 +439,16 @@ static void fsl_ifc_cmdfunc(struct mtd_info *mtd, unsigned int command,
>  			out_be32(&ifc->ifc_nand.nand_fir1,
>  				 (IFC_FIR_OP_CW1 << IFC_NAND_FIR1_OP5_SHIFT));
>  
> -			if (column >= mtd->writesize) {
> -				/* OOB area --> READOOB */
> -				column -= mtd->writesize;
> -				nand_fcr0 |= NAND_CMD_READOOB <<
> -						IFC_NAND_FCR0_CMD0_SHIFT;
> -				ifc_nand_ctrl->oob = 1;
> -			} else if (column < 256)
> +			if (column < 256)
>  				/* First 256 bytes --> READ0 */
>  				nand_fcr0 |=
>  				NAND_CMD_READ0 << IFC_NAND_FCR0_CMD0_SHIFT;
> -			else
> -				/* Second 256 bytes --> READ1 */
> -				nand_fcr0 |=
> -				NAND_CMD_READ1 << IFC_NAND_FCR0_CMD0_SHIFT;
> +		}
> +
> +		if (column >= mtd->writesize) {
> +			/* OOB area --> READOOB */
> +			column -= mtd->writesize;
> +			ifc_nand_ctrl->oob = 1;
>  		}

Where is NAND_CMD_READOOB going to be set in the small-page case?

The small-page code should read something like:

	if (column >= mtd->writesize) {
		nand_fcr0 |=
			NAND_CMD_READOOB << IFC_NAND_FCR0_CMD0_SHIFT;
	} else {
		nand_fcr0 |=
			NAND_CMD_READ0 << IFC_NAND_FCR0_CMD0_SHIFT;
	}

It looks like we can get rid of ctrl->column, BTW.

-Scott
Prabhakar Kushwaha Jan. 4, 2012, 4:58 a.m. UTC | #2
On Wednesday 04 January 2012 01:19 AM, Scott Wood wrote:
> On 12/28/2011 10:59 PM, Prabhakar Kushwaha wrote:
>> 1) OOB area should be updated irrespective of NAND page size. Earlier it was
>> updated only for 512byte NAND page.
>>
>> 2) During OOB update fbcr should be equal to OOB size.
>>
>> Signed-off-by: Poonam Aggrwal<poonam.aggrwal@freescale.com>
>> Signed-off-by: Prabhakar Kushwaha<prabhakar@freescale.com>
>> ---
>>   git://git.kernel.org/pub/scm/linux/kernel/git/galak/powerpc.git (branch next)
> The IFC driver hasn't been merged into that tree that I can see.

This patch is created on top of IFC driver patch (already floated in 
mailing list). Please find there link:

http://patchwork.ozlabs.org/patch/133315/
http://patchwork.ozlabs.org/patch/133316/


>>   Tested on P1010RDB
>>
>>   drivers/mtd/nand/fsl_ifc_nand.c |   20 ++++++++------------
>>   1 files changed, 8 insertions(+), 12 deletions(-)
>>
>> diff --git a/drivers/mtd/nand/fsl_ifc_nand.c b/drivers/mtd/nand/fsl_ifc_nand.c
>> index 2df7206..2c02168 100644
>> --- a/drivers/mtd/nand/fsl_ifc_nand.c
>> +++ b/drivers/mtd/nand/fsl_ifc_nand.c
>> @@ -439,20 +439,16 @@ static void fsl_ifc_cmdfunc(struct mtd_info *mtd, unsigned int command,
>>   			out_be32(&ifc->ifc_nand.nand_fir1,
>>   				 (IFC_FIR_OP_CW1<<  IFC_NAND_FIR1_OP5_SHIFT));
>>
>> -			if (column>= mtd->writesize) {
>> -				/* OOB area -->  READOOB */
>> -				column -= mtd->writesize;
>> -				nand_fcr0 |= NAND_CMD_READOOB<<
>> -						IFC_NAND_FCR0_CMD0_SHIFT;
>> -				ifc_nand_ctrl->oob = 1;
>> -			} else if (column<  256)
>> +			if (column<  256)
>>   				/* First 256 bytes -->  READ0 */
>>   				nand_fcr0 |=
>>   				NAND_CMD_READ0<<  IFC_NAND_FCR0_CMD0_SHIFT;
>> -			else
>> -				/* Second 256 bytes -->  READ1 */
>> -				nand_fcr0 |=
>> -				NAND_CMD_READ1<<  IFC_NAND_FCR0_CMD0_SHIFT;
>> +		}
>> +
>> +		if (column>= mtd->writesize) {
>> +			/* OOB area -->  READOOB */
>> +			column -= mtd->writesize;
>> +			ifc_nand_ctrl->oob = 1;
>>   		}
> Where is NAND_CMD_READOOB going to be set in the small-page case?

2K NAND flash does not require NAND_CMD_READOOB. So i thought same 
should be applied to 512byte NAND. but i am wrong.
Thanks for pointing it out :)

>
> The small-page code should read something like:
>
> 	if (column>= mtd->writesize) {
> 		nand_fcr0 |=
> 			NAND_CMD_READOOB<<  IFC_NAND_FCR0_CMD0_SHIFT;
> 	} else {
> 		nand_fcr0 |=
> 			NAND_CMD_READ0<<  IFC_NAND_FCR0_CMD0_SHIFT;
> 	}
>
> It looks like we can get rid of ctrl->column, BTW.
>

  I will take care this in next patch release

--Prabhakar
diff mbox

Patch

diff --git a/drivers/mtd/nand/fsl_ifc_nand.c b/drivers/mtd/nand/fsl_ifc_nand.c
index 2df7206..2c02168 100644
--- a/drivers/mtd/nand/fsl_ifc_nand.c
+++ b/drivers/mtd/nand/fsl_ifc_nand.c
@@ -439,20 +439,16 @@  static void fsl_ifc_cmdfunc(struct mtd_info *mtd, unsigned int command,
 			out_be32(&ifc->ifc_nand.nand_fir1,
 				 (IFC_FIR_OP_CW1 << IFC_NAND_FIR1_OP5_SHIFT));
 
-			if (column >= mtd->writesize) {
-				/* OOB area --> READOOB */
-				column -= mtd->writesize;
-				nand_fcr0 |= NAND_CMD_READOOB <<
-						IFC_NAND_FCR0_CMD0_SHIFT;
-				ifc_nand_ctrl->oob = 1;
-			} else if (column < 256)
+			if (column < 256)
 				/* First 256 bytes --> READ0 */
 				nand_fcr0 |=
 				NAND_CMD_READ0 << IFC_NAND_FCR0_CMD0_SHIFT;
-			else
-				/* Second 256 bytes --> READ1 */
-				nand_fcr0 |=
-				NAND_CMD_READ1 << IFC_NAND_FCR0_CMD0_SHIFT;
+		}
+
+		if (column >= mtd->writesize) {
+			/* OOB area --> READOOB */
+			column -= mtd->writesize;
+			ifc_nand_ctrl->oob = 1;
 		}
 
 		out_be32(&ifc->ifc_nand.nand_fcr0, nand_fcr0);
@@ -465,7 +461,7 @@  static void fsl_ifc_cmdfunc(struct mtd_info *mtd, unsigned int command,
 		int full_page;
 		if (ifc_nand_ctrl->oob) {
 			out_be32(&ifc->ifc_nand.nand_fbcr,
-					ifc_nand_ctrl->index);
+				ifc_nand_ctrl->index - ifc_nand_ctrl->column);
 			full_page = 0;
 		} else {
 			out_be32(&ifc->ifc_nand.nand_fbcr, 0);