Skip to contentSkip to conversation

clarify and improve calculation in nand_read_subpage

PATCH New Werner Almesberger 1 participant 1 message Nov 7, 2008

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 clarify and improve calculation in nand_read_subpage

clarify-nand-ecc-access.patch

The ECC access calculation in nand_read_subpage is quite hard to understand. This patch makes it more readable.

There is a small change in what the algorithm does: while if (eccpos[(start_step + num_steps) * chip->ecc.bytes] & (busw - 1)) looks at the position of the ECC byte following the bytes we're currently reading,
aligned_len = ALIGN(eccfrag_len+(pos-aligned_pos), busw); only looks at their length plus the additional data we have to read due to aligning the start position.

The latter is more correct than the former, since the next ECC byte could be located anywhere and its location therefore may not give the alignment information we seek.

The change also saves 44 bytes on ARM.

---

drivers/mtd/nand/nand_base.c +6 -6
Index: ktrack/drivers/mtd/nand/nand_base.c
===================================================================
@@ -851,12 +851,12 @@
 	} else {
 		/* send the command to read the particular ecc bytes */
 		/* take care about buswidth alignment in read_buf */
-		aligned_pos = eccpos[start_step * chip->ecc.bytes] & ~(busw - 1);
-		aligned_len = eccfrag_len;
-		if (eccpos[start_step * chip->ecc.bytes] & (busw - 1))
-			aligned_len++;
-		if (eccpos[(start_step + num_steps) * chip->ecc.bytes] & (busw - 1))
-			aligned_len++;
+
+		int pos;
+
+		pos = eccpos[start_step * chip->ecc.bytes];
+		aligned_pos = pos & ~(busw - 1);
+		aligned_len = ALIGN(eccfrag_len+(pos-aligned_pos), busw);
 
 		chip->cmdfunc(mtd, NAND_CMD_RNDOUT, mtd->writesize + aligned_pos, -1);
 		chip->read_buf(mtd, &chip->oob_poi[aligned_pos], aligned_len);