Commit d00358d7 authored by Álvaro Fernández Rojas's avatar Álvaro Fernández Rojas Committed by Miquel Raynal

mtd: rawnand: brcmnand: improve hamming oob layout

The current code generates 8 oob sections:
S1	1-5
ECC	6-8
S2	9-15
S3	16-21
ECC	22-24
S4	25-31
S5	32-37
ECC	38-40
S6	41-47
S7	48-53
ECC	54-56
S8	57-63

Change it by merging continuous sections:
S1	1-5
ECC	6-8
S2	9-21
ECC	22-24
S3	25-37
ECC	38-40
S4	41-53
ECC	54-56
S5	57-63
Signed-off-by: default avatarÁlvaro Fernández Rojas <noltari@gmail.com>
Signed-off-by: default avatarMiquel Raynal <miquel.raynal@bootlin.com>
Link: https://lore.kernel.org/linux-mtd/20200512075733.745374-3-noltari@gmail.com
parent 130bbde4
...@@ -1099,33 +1099,30 @@ static int brcmnand_hamming_ooblayout_free(struct mtd_info *mtd, int section, ...@@ -1099,33 +1099,30 @@ static int brcmnand_hamming_ooblayout_free(struct mtd_info *mtd, int section,
struct brcmnand_cfg *cfg = &host->hwcfg; struct brcmnand_cfg *cfg = &host->hwcfg;
int sas = cfg->spare_area_size << cfg->sector_size_1k; int sas = cfg->spare_area_size << cfg->sector_size_1k;
int sectors = cfg->page_size / (512 << cfg->sector_size_1k); int sectors = cfg->page_size / (512 << cfg->sector_size_1k);
u32 next;
if (section >= sectors * 2) if (section > sectors)
return -ERANGE; return -ERANGE;
oobregion->offset = (section / 2) * sas; next = (section * sas);
if (section < sectors)
next += 6;
if (section & 1) { if (section) {
oobregion->offset += 9; oobregion->offset = ((section - 1) * sas) + 9;
oobregion->length = 7;
} else { } else {
oobregion->length = 6;
/* First sector of each page may have BBI */
if (!section) {
/*
* Small-page NAND use byte 6 for BBI while large-page
* NAND use bytes 0 and 1.
*/
if (cfg->page_size > 512) { if (cfg->page_size > 512) {
oobregion->offset += 2; /* Large page NAND uses first 2 bytes for BBI */
oobregion->length -= 2; oobregion->offset = 2;
} else { } else {
oobregion->length--; /* Small page NAND uses last byte before ECC for BBI */
} oobregion->offset = 0;
next--;
} }
} }
oobregion->length = next - oobregion->offset;
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment