mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2025-03-10 17:48:41 +07:00
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: Álvaro Fernández Rojas <noltari@gmail.com> Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com> Link: https://lore.kernel.org/linux-mtd/20200512075733.745374-3-noltari@gmail.com
This commit is contained in:
parent
130bbde480
commit
d00358d7a1
@ -1099,33 +1099,30 @@ static int brcmnand_hamming_ooblayout_free(struct mtd_info *mtd, int section,
|
||||
struct brcmnand_cfg *cfg = &host->hwcfg;
|
||||
int sas = cfg->spare_area_size << 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;
|
||||
|
||||
oobregion->offset = (section / 2) * sas;
|
||||
next = (section * sas);
|
||||
if (section < sectors)
|
||||
next += 6;
|
||||
|
||||
if (section & 1) {
|
||||
oobregion->offset += 9;
|
||||
oobregion->length = 7;
|
||||
if (section) {
|
||||
oobregion->offset = ((section - 1) * sas) + 9;
|
||||
} 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) {
|
||||
oobregion->offset += 2;
|
||||
oobregion->length -= 2;
|
||||
} else {
|
||||
oobregion->length--;
|
||||
}
|
||||
if (cfg->page_size > 512) {
|
||||
/* Large page NAND uses first 2 bytes for BBI */
|
||||
oobregion->offset = 2;
|
||||
} else {
|
||||
/* Small page NAND uses last byte before ECC for BBI */
|
||||
oobregion->offset = 0;
|
||||
next--;
|
||||
}
|
||||
}
|
||||
|
||||
oobregion->length = next - oobregion->offset;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user