| From: Joakim Tjernlund <joakim.tjernlund@infinera.com> |
| Date: Wed, 6 Jun 2018 12:13:27 +0200 |
| Subject: mtd: cfi_cmdset_0002: Use right chip in do_ppb_xxlock() |
| |
| commit f93aa8c4de307069c270b2d81741961162bead6c upstream. |
| |
| 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: 1648eaaa1575 ("mtd: cfi_cmdset_0002: Support Persistent Protection Bits (PPB) locking") |
| Signed-off-by: Joakim Tjernlund <joakim.tjernlund@infinera.com> |
| Signed-off-by: Boris Brezillon <boris.brezillon@bootlin.com> |
| Signed-off-by: Ben Hutchings <ben@decadent.org.uk> |
| --- |
| drivers/mtd/chips/cfi_cmdset_0002.c | 9 +++++---- |
| 1 file changed, 5 insertions(+), 4 deletions(-) |
| |
| --- a/drivers/mtd/chips/cfi_cmdset_0002.c |
| +++ b/drivers/mtd/chips/cfi_cmdset_0002.c |
| @@ -2224,8 +2224,9 @@ static int __maybe_unused do_ppb_xxlock( |
| unsigned long timeo; |
| int ret; |
| |
| + adr += chip->start; |
| mutex_lock(&chip->mutex); |
| - ret = get_chip(map, chip, adr + chip->start, FL_LOCKING); |
| + ret = get_chip(map, chip, adr, FL_LOCKING); |
| if (ret) { |
| mutex_unlock(&chip->mutex); |
| return ret; |
| @@ -2243,8 +2244,8 @@ static int __maybe_unused do_ppb_xxlock( |
| |
| if (thunk == DO_XXLOCK_ONEBLOCK_LOCK) { |
| chip->state = FL_LOCKING; |
| - map_write(map, CMD(0xA0), chip->start + adr); |
| - map_write(map, CMD(0x00), chip->start + adr); |
| + map_write(map, CMD(0xA0), adr); |
| + map_write(map, CMD(0x00), adr); |
| } else if (thunk == DO_XXLOCK_ONEBLOCK_UNLOCK) { |
| /* |
| * Unlocking of one specific sector is not supported, so we |
| @@ -2282,7 +2283,7 @@ static int __maybe_unused do_ppb_xxlock( |
| map_write(map, CMD(0x00), chip->start); |
| |
| chip->state = FL_READY; |
| - put_chip(map, chip, adr + chip->start); |
| + put_chip(map, chip, adr); |
| mutex_unlock(&chip->mutex); |
| |
| return ret; |