Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 646fd127 authored by Massimo Cirillo's avatar Massimo Cirillo Committed by Linus Torvalds
Browse files

cache invalidation error for buffered write



The bug causes corruptions of data read from flash.

The original code performs cache invalidation from "adr" to "adr + len"
in do_write_buffer().  Since len and adr could be updated in the code
before invalidation - it causes improper setting of cache invalidation
regions.

Signed-off-by: default avatarMassimo Cirillo <maxcir@gmail.com>
Signed-off-by: default avatarGiuseppe D'Eliseo <giuseppedeliseo@gmail.com>
Acked-by: default avatarNicolas Pitre <nico@cam.org>
Acked-by: default avatarJörn Engel <joern@logfs.org>
Signed-off-by: default avatarDavid Woohouse <dwmw2@infradead.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 7c48c56e
Loading
Loading
Loading
Loading
+5 −2
Original line number Diff line number Diff line
@@ -1504,9 +1504,12 @@ static int __xipram do_write_buffer(struct map_info *map, struct flchip *chip,
	int ret, wbufsize, word_gap, words;
	const struct kvec *vec;
	unsigned long vec_seek;
	unsigned long initial_adr;
	int initial_len = len;

	wbufsize = cfi_interleave(cfi) << cfi->cfiq->MaxBufWriteSize;
	adr += chip->start;
	initial_adr = adr;
	cmd_adr = adr & ~(wbufsize-1);

	/* Let's determine this according to the interleave only once */
@@ -1519,7 +1522,7 @@ static int __xipram do_write_buffer(struct map_info *map, struct flchip *chip,
		return ret;
	}

	XIP_INVAL_CACHED_RANGE(map, adr, len);
	XIP_INVAL_CACHED_RANGE(map, initial_adr, initial_len);
	ENABLE_VPP(map);
	xip_disable(map, chip, cmd_adr);

@@ -1610,7 +1613,7 @@ static int __xipram do_write_buffer(struct map_info *map, struct flchip *chip,
	chip->state = FL_WRITING;

	ret = INVAL_CACHE_AND_WAIT(map, chip, cmd_adr,
				   adr, len,
				   initial_adr, initial_len,
				   chip->buffer_write_time);
	if (ret) {
		map_write(map, CMD(0x70), cmd_adr);