mtd: cfi_cmdset_0002: Use right chip in do_ppb_xxlock()
do_ppb_xxlock() fails to add chip->start when querying for lock status
(and chip_ready test), which caused false status reports.
Fix that by adding adr += chip->start and adjust call sites
accordingly.
Fixes: 1648eaaa15
("mtd: cfi_cmdset_0002: Support Persistent Protection Bits (PPB) locking")
Cc: stable@vger.kernel.org
Signed-off-by: Joakim Tjernlund <joakim.tjernlund@infinera.com>
Signed-off-by: Boris Brezillon <boris.brezillon@bootlin.com>
This commit is contained in:
parent
fe3dd97dd6
commit
f93aa8c4de
|
@ -2544,8 +2544,9 @@ static int __maybe_unused do_ppb_xxlock(struct map_info *map,
|
||||||
unsigned long timeo;
|
unsigned long timeo;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
adr += chip->start;
|
||||||
mutex_lock(&chip->mutex);
|
mutex_lock(&chip->mutex);
|
||||||
ret = get_chip(map, chip, adr + chip->start, FL_LOCKING);
|
ret = get_chip(map, chip, adr, FL_LOCKING);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
mutex_unlock(&chip->mutex);
|
mutex_unlock(&chip->mutex);
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -2563,8 +2564,8 @@ static int __maybe_unused do_ppb_xxlock(struct map_info *map,
|
||||||
|
|
||||||
if (thunk == DO_XXLOCK_ONEBLOCK_LOCK) {
|
if (thunk == DO_XXLOCK_ONEBLOCK_LOCK) {
|
||||||
chip->state = FL_LOCKING;
|
chip->state = FL_LOCKING;
|
||||||
map_write(map, CMD(0xA0), chip->start + adr);
|
map_write(map, CMD(0xA0), adr);
|
||||||
map_write(map, CMD(0x00), chip->start + adr);
|
map_write(map, CMD(0x00), adr);
|
||||||
} else if (thunk == DO_XXLOCK_ONEBLOCK_UNLOCK) {
|
} else if (thunk == DO_XXLOCK_ONEBLOCK_UNLOCK) {
|
||||||
/*
|
/*
|
||||||
* Unlocking of one specific sector is not supported, so we
|
* Unlocking of one specific sector is not supported, so we
|
||||||
|
@ -2602,7 +2603,7 @@ static int __maybe_unused do_ppb_xxlock(struct map_info *map,
|
||||||
map_write(map, CMD(0x00), chip->start);
|
map_write(map, CMD(0x00), chip->start);
|
||||||
|
|
||||||
chip->state = FL_READY;
|
chip->state = FL_READY;
|
||||||
put_chip(map, chip, adr + chip->start);
|
put_chip(map, chip, adr);
|
||||||
mutex_unlock(&chip->mutex);
|
mutex_unlock(&chip->mutex);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
|
Loading…
Reference in New Issue