ubi: Only read the actual size of the VID header
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
@@ -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
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
@@ -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
@@ -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
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).
Signed-off-by Joe Hershberger <[email protected]>--- 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
PATCH v2 1/2 ubi: Only read the actual size of the VID header
In reply to Joe HershbergerIf 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
@@ -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
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
@@ -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
@@ -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
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
a5ff4f102937a3492bca4a9ff0c341d78813414cin LinuxSigned-off-by Joe Hershberger <[email protected]>
Applied to u-boot-nand-flash
-Scott
PATCH v2 1/2 ubi: Only read the actual size of the VID header
In reply to Joe HershbergerQuoted 13 lines · Joe Hershberger
If sub-page reads are supported, this will save reading unneeded data
Signed-off-by Joe Hershberger <[email protected]>---
drivers/mtd/ubi/io.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)drivers/mtd/ubi/io.c +0
-0
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
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
Signed-off-by Joe Hershberger <[email protected]>---
drivers/mtd/ubi/io.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)drivers/mtd/ubi/io.c +0
-0@@ -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
-1p = (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