mtd: hot spin and code duplication in nand_bcm_umi_bch_read_oobEcc()
Subsystems (2)
PATCH 1/1 mtd: hot spin and code duplication in nand_bcm_umi_bch_read_oobEcc()
In the branch where pagesize equalled NAND_DATA_ACCESS_SIZE, NumToRead wasn't decremented in the `while (numToRead > 11)' loop. Also the first and last while loops were duplicated in both branches.
--- drivers/mtd/nand/nand_bcm_umi.h | 71 ++++++++++++++------------------------- 1 files changed, 25 insertions(+), 46 deletions(-)
drivers/mtd/nand/nand_bcm_umi.h +25 -46
@@ -167,18 +167,27 @@ static inline void nand_bcm_umi_bch_read_oobEcc(uint32_t pageSize,int numToRead =16 ;/* There are 16 bytes per sector in the OOB */ /* ECC is already paused when this function is called */ +if (pageSize !=NAND_DATA_ACCESS_SIZE ) { +/* skip BI */ +#if defined(__KERNEL__) && !defined(STANDALONE ) + *oobp++ =REG_NAND_DATA8 ; +#else +REG_NAND_DATA8 ; +#endif + numToRead--; + } -if (pageSize ==NAND_DATA_ACCESS_SIZE ) { -while (numToRead > numEccBytes) { -/* skip free oob region */ +while (numToRead > numEccBytes) { +/* skip free oob region */ #if defined(__KERNEL__) && !defined(STANDALONE ) - *oobp++ =REG_NAND_DATA8 ; + *oobp++ =REG_NAND_DATA8 ;#else -REG_NAND_DATA8 ; +REG_NAND_DATA8 ;#endif - numToRead--; - } + numToRead--; + } +if (pageSize ==NAND_DATA_ACCESS_SIZE ) {/* read ECC bytes before BI */ nand_bcm_umi_bch_resume_read_ecc_calc ();
@@ -190,6 +199,7 @@ static inline void nand_bcm_umi_bch_read_oobEcc(uint32_t pageSize,#else eccCalc[eccPos++] =REG_NAND_DATA8 ;#endif + numToRead--; }nand_bcm_umi_bch_pause_read_ecc_calc ();
@@ -204,49 +214,18 @@ static inline void nand_bcm_umi_bch_read_oobEcc(uint32_t pageSize, numToRead--; } -/* read ECC bytes */ -nand_bcm_umi_bch_resume_read_ecc_calc (); -while (numToRead) { -#if defined(__KERNEL__) && !defined(STANDALONE ) - *oobp =REG_NAND_DATA8 ; - eccCalc[eccPos++] = *oobp; - oobp++; -#else - eccCalc[eccPos++] =REG_NAND_DATA8 ; -#endif - numToRead--; - } - }else { -/* skip BI */ + } +/* read ECC bytes */ +nand_bcm_umi_bch_resume_read_ecc_calc (); +while (numToRead) {#if defined(__KERNEL__) && !defined(STANDALONE ) - *oobp++ =REG_NAND_DATA8 ; + *oobp =REG_NAND_DATA8 ; + eccCalc[eccPos++] = *oobp; + oobp++;#else -REG_NAND_DATA8 ; + eccCalc[eccPos++] =REG_NAND_DATA8 ;#endif numToRead--; - -while (numToRead > numEccBytes) { -/* skip free oob region */ -#if defined(__KERNEL__) && !defined(STANDALONE ) - *oobp++ =REG_NAND_DATA8 ; -#else -REG_NAND_DATA8 ; -#endif - numToRead--; - } - -/* read ECC bytes */ -nand_bcm_umi_bch_resume_read_ecc_calc (); -while (numToRead) { -#if defined(__KERNEL__) && !defined(STANDALONE ) - *oobp =REG_NAND_DATA8 ; - eccCalc[eccPos++] = *oobp; - oobp++; -#else - eccCalc[eccPos++] =REG_NAND_DATA8 ; -#endif - numToRead--; - } } }
Thanks for identifying the NumToRead bug.
Tested on board. Works.
Quoted 115 lines · Roel Kluin
In the branch where pagesize equalled
NAND_DATA_ACCESS_SIZE, NumToRead wasn't decremented in the `while (numToRead > 11)' loop. Also the first and last while loops were duplicated in both branches.Signed-off-by Roel Kluin <[email protected]>--- drivers/mtd/nand/nand_bcm_umi.h | 71 ++++++++++++++------------------------- 1 files changed, 25 insertions(+), 46 deletions(-)drivers/mtd/nand/nand_bcm_umi.h +25
-46@@ -167,18 +167,27 @@ static inline void nand_bcm_umi_bch_read_oobEcc(uint32_t pageSize,int numToRead =16 ;/* There are 16 bytes per sector in the OOB */ /* ECC is already paused when this function is called */ +if (pageSize !=NAND_DATA_ACCESS_SIZE ) { +/* skip BI */ +#if defined(__KERNEL__) && !defined(STANDALONE ) + *oobp++ =REG_NAND_DATA8 ; +#else +REG_NAND_DATA8 ; +#endif + numToRead--; + } -if (pageSize ==NAND_DATA_ACCESS_SIZE ) { -while (numToRead > numEccBytes) { -/* skip free oob region */ +while (numToRead > numEccBytes) { +/* skip free oob region */ #if defined(__KERNEL__) && !defined(STANDALONE ) - *oobp++ =REG_NAND_DATA8 ; + *oobp++ =REG_NAND_DATA8 ;#else -REG_NAND_DATA8 ; +REG_NAND_DATA8 ;#endif - numToRead--; - } + numToRead--; + } +if (pageSize ==NAND_DATA_ACCESS_SIZE ) {/* read ECC bytes before BI */ nand_bcm_umi_bch_resume_read_ecc_calc ();@@ -190,6 +199,7 @@ static inline void nand_bcm_umi_bch_read_oobEcc(uint32_t pageSize,#else eccCalc[eccPos++] =REG_NAND_DATA8 ;#endif + numToRead--; }nand_bcm_umi_bch_pause_read_ecc_calc ();@@ -204,49 +214,18 @@ static inline void nand_bcm_umi_bch_read_oobEcc(uint32_t pageSize, numToRead--; } -/* read ECC bytes */ -nand_bcm_umi_bch_resume_read_ecc_calc (); -while (numToRead) { -#if defined(__KERNEL__) && !defined(STANDALONE ) - *oobp =REG_NAND_DATA8 ; - eccCalc[eccPos++] = *oobp; - oobp++; -#else - eccCalc[eccPos++] =REG_NAND_DATA8 ; -#endif - numToRead--; - } - }else { -/* skip BI */ + } +/* read ECC bytes */ +nand_bcm_umi_bch_resume_read_ecc_calc (); +while (numToRead) {#if defined(__KERNEL__) && !defined(STANDALONE ) - *oobp++ =REG_NAND_DATA8 ; + *oobp =REG_NAND_DATA8 ; + eccCalc[eccPos++] = *oobp; + oobp++;#else -REG_NAND_DATA8 ; + eccCalc[eccPos++] =REG_NAND_DATA8 ;#endif numToRead--; - -while (numToRead > numEccBytes) { -/* skip free oob region */ -#if defined(__KERNEL__) && !defined(STANDALONE ) - *oobp++ =REG_NAND_DATA8 ; -#else -REG_NAND_DATA8 ; -#endif - numToRead--; - } - -/* read ECC bytes */ -nand_bcm_umi_bch_resume_read_ecc_calc (); -while (numToRead) { -#if defined(__KERNEL__) && !defined(STANDALONE ) - *oobp =REG_NAND_DATA8 ; - eccCalc[eccPos++] = *oobp; - oobp++; -#else - eccCalc[eccPos++] =REG_NAND_DATA8 ; -#endif - numToRead--; - } } }
Signature · 4 lines
Leo Hao Chen ------------------------ Life is short, run long.
Quoted 8 lines · Roel Kluin
In the branch where pagesize equalled
NAND_DATA_ACCESS_SIZE, NumToRead wasn't decremented in the `while (numToRead > 11)' loop. Also the first and last while loops were duplicated in both branches.Signed-off-by Roel Kluin <[email protected]>--- drivers/mtd/nand/nand_bcm_umi.h | 71 ++++++++++++++------------------------- 1 files changed, 25 insertions(+), 46 deletions(-)
Taken to l2-mtd-2.6.git / dunno
Signature · 2 lines
Best Regards, Artem Bityutskiy (Артём Битюцкий)