mtd: spinand: Fix MTD_OPS_AUTO_OOB requests
The initial change breaking the logic is commit3d1f08b032
("mtd: spinand: Use the external ECC engine logic") It inadvertently dropped proper OOB support while doing something else. Shortly later, half of it got re-integrated by commit868cbe2a6d
("mtd: spinand: Fix OOB read") (pointing by the way to a more early change which had nothing to do with the issue). Problem is, this commit failed to revert the faulty change entirely and missed the logic handling MTD_OPS_AUTO_OOB requests. Let's fix this mess by re-inserting the missing part now. Fixes:868cbe2a6d
("mtd: spinand: Fix OOB read") Reported-by: Felix Fietkau <nbd@nbd.name> Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com> Link: https://lore.kernel.org/linux-mtd/20210107083813.24283-1-miquel.raynal@bootlin.com
This commit is contained in:
parent
18f6261430
commit
e708789c4a
@ -343,6 +343,7 @@ static int spinand_read_from_cache_op(struct spinand_device *spinand,
|
||||
const struct nand_page_io_req *req)
|
||||
{
|
||||
struct nand_device *nand = spinand_to_nand(spinand);
|
||||
struct mtd_info *mtd = spinand_to_mtd(spinand);
|
||||
struct spi_mem_dirmap_desc *rdesc;
|
||||
unsigned int nbytes = 0;
|
||||
void *buf = NULL;
|
||||
@ -382,9 +383,16 @@ static int spinand_read_from_cache_op(struct spinand_device *spinand,
|
||||
memcpy(req->databuf.in, spinand->databuf + req->dataoffs,
|
||||
req->datalen);
|
||||
|
||||
if (req->ooblen)
|
||||
memcpy(req->oobbuf.in, spinand->oobbuf + req->ooboffs,
|
||||
req->ooblen);
|
||||
if (req->ooblen) {
|
||||
if (req->mode == MTD_OPS_AUTO_OOB)
|
||||
mtd_ooblayout_get_databytes(mtd, req->oobbuf.in,
|
||||
spinand->oobbuf,
|
||||
req->ooboffs,
|
||||
req->ooblen);
|
||||
else
|
||||
memcpy(req->oobbuf.in, spinand->oobbuf + req->ooboffs,
|
||||
req->ooblen);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user