Skip to contentSkip to conversation

ubi: Only read the actual size of the VID header

PATCH Superseded Joe Hershberger 4 participants 8 messages Nov 1, 2012 – Nov 16, 2012

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

PATCH 1/2 ubi: Only read the actual size of the VID header

If sub-page reads are supported, this will save reading unneeded data

---
 drivers/mtd/ubi/io.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/mtd/ubi/io.c +1 -1
index 8423894..23660e3 100644
@@ -916,7 +916,7 @@ int ubi_io_read_vid_hdr(struct ubi_device *ubi, int pnum,
 
 	p = (char *)vid_hdr - ubi->vid_hdr_shift;
 	err = ubi_io_read(ubi, p, pnum, ubi->vid_hdr_aloffset,
-			  ubi->vid_hdr_alsize);
+			  UBI_VID_HDR_SIZE);
 	if (err) {
 		if (err != UBI_IO_BITFLIPS && err != -EBADMSG)
 			return err;
Signature · 1 line
1.7.11.5
#1 lore raw

PATCH 2/2 nand: Move the sub-page read support enable to a flag

Use a flag instead of a hard-coded macro so that sub-page reads can be enabled in other cases (such as on-die ecc).

---
 drivers/mtd/nand/nand_base.c | 9 +++++++--
 include/linux/mtd/nand.h     | 7 ++++---
 2 files changed, 11 insertions(+), 5 deletions(-)
drivers/mtd/nand/nand_base.c +7 -2
index 71f5027..4f2963b 100644
@@ -1245,7 +1245,8 @@ static int nand_do_read_ops(struct mtd_info *mtd, loff_t from,
 			if (unlikely(ops->mode == MTD_OOB_RAW))
 				ret = chip->ecc.read_page_raw(mtd, chip,
 							      bufpoi, page);
-			else if (!aligned && NAND_SUBPAGE_READ(chip) && !oob)
+			else if (!aligned && NAND_HAS_SUBPAGE_READ(chip) &&
+			    !oob)
 				ret = chip->ecc.read_subpage(mtd, chip,
 							col, bytes, bufpoi);
 			else
@@ -1256,7 +1257,7 @@ static int nand_do_read_ops(struct mtd_info *mtd, loff_t from,
 
 			/* Transfer not aligned data */
 			if (!aligned) {
-				if (!NAND_SUBPAGE_READ(chip) && !oob &&
+				if (!NAND_HAS_SUBPAGE_READ(chip) && !oob &&
 				    !(mtd->ecc_stats.failed - stats.failed))
 					chip->pagebuf = realpage;
 				memcpy(buf, chip->buffers->databuf + col, bytes);
@@ -3149,6 +3150,10 @@ int nand_scan_tail(struct mtd_info *mtd)
 	/* Invalidate the pagebuffer reference */
 	chip->pagebuf = -1;
 
+	/* Large page NAND with SOFT_ECC should support subpage reads */
+	if ((chip->ecc.mode == NAND_ECC_SOFT) && (chip->page_shift > 9))
+		chip->options |= NAND_SUBPAGE_READ;
+
 	/* Fill in remaining MTD driver data */
 	mtd->type = MTD_NANDFLASH;
 	mtd->flags = (chip->options & NAND_ROM) ? MTD_CAP_ROM :
include/linux/mtd/nand.h +4 -3
index f63e04b..e9e9045 100644
@@ -194,6 +194,9 @@ typedef enum {
 /* Device behaves just like nand, but is readonly */
 #define NAND_ROM		0x00000800
 
+/* Device supports subpage reads */
+#define NAND_SUBPAGE_READ       0x00001000
+
 /* Options valid for Samsung large page devices */
 #define NAND_SAMSUNG_LP_OPTIONS \
 	(NAND_NO_PADDING | NAND_CACHEPRG | NAND_COPYBACK)
@@ -203,9 +206,7 @@ typedef enum {
 #define NAND_MUST_PAD(chip) (!(chip->options & NAND_NO_PADDING))
 #define NAND_HAS_CACHEPROG(chip) ((chip->options & NAND_CACHEPRG))
 #define NAND_HAS_COPYBACK(chip) ((chip->options & NAND_COPYBACK))
-/* Large page NAND with SOFT_ECC should support subpage reads */
-#define NAND_SUBPAGE_READ(chip) ((chip->ecc.mode == NAND_ECC_SOFT) \
-					&& (chip->page_shift > 9))
+#define NAND_HAS_SUBPAGE_READ(chip) ((chip->options & NAND_SUBPAGE_READ))
 
 /* Non chip related options */
 /*
Signature · 1 line
1.7.11.5
#2 lore raw

PATCH 2/2 nand: Move the sub-page read support enable to a flag

Quoted 8 lines · Joe Hershberger

Use a flag instead of a hard-coded macro so that sub-page reads can be enabled in other cases (such as on-die ecc).

---
 drivers/mtd/nand/nand_base.c | 9 +++++++--
 include/linux/mtd/nand.h     | 7 ++++---
 2 files changed, 11 insertions(+), 5 deletions(-)

This looks a lot like commit a5ff4f102937a3492bca4a9ff0c341d78813414c in Linux, but I don't see any attribution...

-Scott

#3 lore raw

PATCH v2 1/2 ubi: Only read the actual size of the VID header

In reply to Joe Hershberger

If sub-page reads are supported, this will save reading unneeded data

---

 drivers/mtd/ubi/io.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/mtd/ubi/io.c +1 -1
index 8423894..23660e3 100644
@@ -916,7 +916,7 @@ int ubi_io_read_vid_hdr(struct ubi_device *ubi, int pnum,
 
 	p = (char *)vid_hdr - ubi->vid_hdr_shift;
 	err = ubi_io_read(ubi, p, pnum, ubi->vid_hdr_aloffset,
-			  ubi->vid_hdr_alsize);
+			  UBI_VID_HDR_SIZE);
 	if (err) {
 		if (err != UBI_IO_BITFLIPS && err != -EBADMSG)
 			return err;
Signature · 1 line
1.7.11.5
#4 lore raw

PATCH v2 2/2 nand: Move the sub-page read support enable to a flag

Use a flag instead of a hard-coded macro so that sub-page reads can be enabled in other cases (such as on-die ecc).

This is the same as a5ff4f102937a3492bca4a9ff0c341d78813414c in Linux

---
Changes in v2:
- Added Linux commit ID to commit message

 drivers/mtd/nand/nand_base.c | 9 +++++++--
 include/linux/mtd/nand.h     | 7 ++++---
 2 files changed, 11 insertions(+), 5 deletions(-)
drivers/mtd/nand/nand_base.c +7 -2
index 71f5027..4f2963b 100644
@@ -1245,7 +1245,8 @@ static int nand_do_read_ops(struct mtd_info *mtd, loff_t from,
 			if (unlikely(ops->mode == MTD_OOB_RAW))
 				ret = chip->ecc.read_page_raw(mtd, chip,
 							      bufpoi, page);
-			else if (!aligned && NAND_SUBPAGE_READ(chip) && !oob)
+			else if (!aligned && NAND_HAS_SUBPAGE_READ(chip) &&
+			    !oob)
 				ret = chip->ecc.read_subpage(mtd, chip,
 							col, bytes, bufpoi);
 			else
@@ -1256,7 +1257,7 @@ static int nand_do_read_ops(struct mtd_info *mtd, loff_t from,
 
 			/* Transfer not aligned data */
 			if (!aligned) {
-				if (!NAND_SUBPAGE_READ(chip) && !oob &&
+				if (!NAND_HAS_SUBPAGE_READ(chip) && !oob &&
 				    !(mtd->ecc_stats.failed - stats.failed))
 					chip->pagebuf = realpage;
 				memcpy(buf, chip->buffers->databuf + col, bytes);
@@ -3149,6 +3150,10 @@ int nand_scan_tail(struct mtd_info *mtd)
 	/* Invalidate the pagebuffer reference */
 	chip->pagebuf = -1;
 
+	/* Large page NAND with SOFT_ECC should support subpage reads */
+	if ((chip->ecc.mode == NAND_ECC_SOFT) && (chip->page_shift > 9))
+		chip->options |= NAND_SUBPAGE_READ;
+
 	/* Fill in remaining MTD driver data */
 	mtd->type = MTD_NANDFLASH;
 	mtd->flags = (chip->options & NAND_ROM) ? MTD_CAP_ROM :
include/linux/mtd/nand.h +4 -3
index f63e04b..e9e9045 100644
@@ -194,6 +194,9 @@ typedef enum {
 /* Device behaves just like nand, but is readonly */
 #define NAND_ROM		0x00000800
 
+/* Device supports subpage reads */
+#define NAND_SUBPAGE_READ       0x00001000
+
 /* Options valid for Samsung large page devices */
 #define NAND_SAMSUNG_LP_OPTIONS \
 	(NAND_NO_PADDING | NAND_CACHEPRG | NAND_COPYBACK)
@@ -203,9 +206,7 @@ typedef enum {
 #define NAND_MUST_PAD(chip) (!(chip->options & NAND_NO_PADDING))
 #define NAND_HAS_CACHEPROG(chip) ((chip->options & NAND_CACHEPRG))
 #define NAND_HAS_COPYBACK(chip) ((chip->options & NAND_COPYBACK))
-/* Large page NAND with SOFT_ECC should support subpage reads */
-#define NAND_SUBPAGE_READ(chip) ((chip->ecc.mode == NAND_ECC_SOFT) \
-					&& (chip->page_shift > 9))
+#define NAND_HAS_SUBPAGE_READ(chip) ((chip->options & NAND_SUBPAGE_READ))
 
 /* Non chip related options */
 /*
Signature · 1 line
1.7.11.5
#5 lore raw

PATCH v2 2/2 nand: Move the sub-page read support enable to a flag

Quoted 6 lines · Joe Hershberger

Use a flag instead of a hard-coded macro so that sub-page reads can be enabled in other cases (such as on-die ecc).

This is the same as a5ff4f102937a3492bca4a9ff0c341d78813414c in Linux

Applied to u-boot-nand-flash

-Scott

#6 lore raw

PATCH v2 1/2 ubi: Only read the actual size of the VID header

In reply to Joe Hershberger
Quoted 13 lines · Joe Hershberger

If sub-page reads are supported, this will save reading unneeded data

---

 drivers/mtd/ubi/io.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/mtd/ubi/io.c +0 -0
index 8423894..23660e3 100644

drivers/mtd/ubi/io.c int ubi_io_read_vid_hdr(struct ubi_device *ubi, int pnum, · line 922

Quoted 8 lines
drivers/mtd/ubi/io.c +1 -1
@@ -916,7 +916,7 @@ int ubi_io_read_vid_hdr(struct ubi_device *ubi, int pnum,
 
 	p = (char *)vid_hdr - ubi->vid_hdr_shift;
 	err = ubi_io_read(ubi, p, pnum, ubi->vid_hdr_aloffset,
-			  ubi->vid_hdr_alsize);
+			  UBI_VID_HDR_SIZE);
 	if (err) {
 		if (err != UBI_IO_BITFLIPS && err != -EBADMSG)
 			return err;

Joe, are you pushing this change to Linux as well? I would really like to see Artem commenting on this.

Thanks,
Stefan

#7 lore raw

PATCH v2 1/2 ubi: Only read the actual size of the VID header

Hi Stefan,

Quoted 15 lines · Stefan Roese
Quoted 14 lines · Joe Hershberger

If sub-page reads are supported, this will save reading unneeded data

---

 drivers/mtd/ubi/io.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/mtd/ubi/io.c +0 -0
index 8423894..23660e3 100644
@@ -916,7 +916,7 @@ int ubi_io_read_vid_hdr(struct ubi_device *ubi, int pnum,
 
Quoted 10 lines

drivers/mtd/ubi/io.c int ubi_io_read_vid_hdr(struct ubi_device *ubi, int pnum, · line 922

Quoted 7 lines
drivers/mtd/ubi/io.c +1 -1
      p = (char *)vid_hdr - ubi->vid_hdr_shift;
      err = ubi_io_read(ubi, p, pnum, ubi->vid_hdr_aloffset,
-                       ubi->vid_hdr_alsize);
+                       UBI_VID_HDR_SIZE);
      if (err) {
              if (err != UBI_IO_BITFLIPS && err != -EBADMSG)
                      return err;

Joe, are you pushing this change to Linux as well? I would really like to see Artem commenting on this.

Yes. We will post this to Linux as well.

-Joe