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

Commit d86d4370 authored by Alexey Korolev's avatar Alexey Korolev Committed by Linus Torvalds
Browse files

[PATCH] cfi_cmdset_0001: fix range for cache invalidation



I found an issue in cfi_cmdset0001.c.  It is related to cache region
invalidation in the buffered write procedure.

The code performs cache invalidation from "cmd_addr" to "cmd_adr + len" in
do_write_buffer() while we modify region from "adr" to "adr+len".

This issue affects writes + reads of data by small chunks.

Signed-off-by: default avatarNicolas Pitre <nico@cam.org>
Acked-by: default avatarThomas Gleixner <tglx@linutronix.de>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 7d4c8e56
Loading
Loading
Loading
Loading
+7 −7
Original line number Diff line number Diff line
@@ -1019,8 +1019,8 @@ static void __xipram xip_udelay(struct map_info *map, struct flchip *chip,
#define XIP_INVAL_CACHED_RANGE(map, from, size)  \
	INVALIDATE_CACHED_RANGE(map, from, size)

#define INVALIDATE_CACHE_UDELAY(map, chip, adr, len, usec)  \
	UDELAY(map, chip, adr, usec)
#define INVALIDATE_CACHE_UDELAY(map, chip, cmd_adr, adr, len, usec)  \
	UDELAY(map, chip, cmd_adr, usec)

/*
 * Extra notes:
@@ -1052,7 +1052,7 @@ do { \
	spin_lock(chip->mutex);  \
} while (0)

#define INVALIDATE_CACHE_UDELAY(map, chip, adr, len, usec)  \
#define INVALIDATE_CACHE_UDELAY(map, chip, cmd_adr, adr, len, usec)  \
do {  \
	spin_unlock(chip->mutex);  \
	INVALIDATE_CACHED_RANGE(map, adr, len);  \
@@ -1284,7 +1284,7 @@ static int __xipram do_write_oneword(struct map_info *map, struct flchip *chip,
	map_write(map, datum, adr);
	chip->state = mode;

	INVALIDATE_CACHE_UDELAY(map, chip,
	INVALIDATE_CACHE_UDELAY(map, chip, adr,
				adr, map_bankwidth(map),
				chip->word_write_time);

@@ -1572,8 +1572,8 @@ static int __xipram do_write_buffer(struct map_info *map, struct flchip *chip,
	map_write(map, CMD(0xd0), cmd_adr);
	chip->state = FL_WRITING;

	INVALIDATE_CACHE_UDELAY(map, chip,
				cmd_adr, len,
	INVALIDATE_CACHE_UDELAY(map, chip, cmd_adr,
				adr, len,
				chip->buffer_write_time);

	timeo = jiffies + (HZ/2);
@@ -1744,7 +1744,7 @@ static int __xipram do_erase_oneblock(struct map_info *map, struct flchip *chip,
	chip->state = FL_ERASING;
	chip->erase_suspended = 0;

	INVALIDATE_CACHE_UDELAY(map, chip,
	INVALIDATE_CACHE_UDELAY(map, chip, adr,
				adr, len,
				chip->erase_time*1000/2);