mtd: nand_bcm: fix hot spin and code duplication
authorRoel Kluin <roel.kluin@gmail.com>
Fri, 22 Jan 2010 21:22:52 +0000 (22:22 +0100)
committerDavid Woodhouse <David.Woodhouse@intel.com>
Fri, 26 Feb 2010 16:56:35 +0000 (16:56 +0000)
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 <roel.kluin@gmail.com>
Acked-by: Leo Chen <leochen@broadcom.com>
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
drivers/mtd/nand/nand_bcm_umi.h

index 7cec2cd97854d2d0f7867b64f6cb0befc8d60942..198b304d6f7298ce61b049af9d382fcb744b92ca 100644 (file)
@@ -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--;
-               }
        }
 }