u-boot-env flash region lock/unlock may affect other regions than u-boot-env, fw_setenv does this in a way 'Lock it in any cases'. Change this to 'lock it if it was locked before'.
Signed-off-by: Ivan Mikhaylov <fr0st6...@gmail.com> --- tools/env/fw_env.c | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/tools/env/fw_env.c b/tools/env/fw_env.c index 381739d28d..3c01f52f3b 100644 --- a/tools/env/fw_env.c +++ b/tools/env/fw_env.c @@ -989,6 +989,7 @@ static int flash_write_buf(int dev, int fd, void *buf, size_t count) of the data */ loff_t blockstart; /* running start of the current block - MEMGETBADBLOCK needs 64 bits */ + int was_locked; /* flash lock flag */ int rc; /* @@ -1074,6 +1075,12 @@ static int flash_write_buf(int dev, int fd, void *buf, size_t count) } erase.length = erasesize; + if (DEVTYPE(dev) != MTD_ABSENT) { + was_locked = ioctl(fd, MEMISLOCKED, &erase); + /* treat any errors as unlocked flash */ + if (was_locked < 0) + was_locked = 0; + } /* This only runs once on NOR flash and SPI-dataflash */ while (processed < write_total) { @@ -1093,7 +1100,8 @@ static int flash_write_buf(int dev, int fd, void *buf, size_t count) if (DEVTYPE(dev) != MTD_ABSENT) { erase.start = blockstart; - ioctl(fd, MEMUNLOCK, &erase); + if (was_locked) + ioctl(fd, MEMUNLOCK, &erase); /* These do not need an explicit erase cycle */ if (DEVTYPE(dev) != MTD_DATAFLASH) if (ioctl(fd, MEMERASE, &erase) != 0) { @@ -1121,8 +1129,10 @@ static int flash_write_buf(int dev, int fd, void *buf, size_t count) return -1; } - if (DEVTYPE(dev) != MTD_ABSENT) - ioctl(fd, MEMLOCK, &erase); + if (DEVTYPE(dev) != MTD_ABSENT) { + if (was_locked) + ioctl(fd, MEMLOCK, &erase); + } processed += erasesize; block_seek = 0; @@ -1143,7 +1153,9 @@ static int flash_flag_obsolete(int dev, int fd, off_t offset) int rc; struct erase_info_user erase; char tmp = ENV_REDUND_OBSOLETE; + int was_locked; /* flash lock flag */ + was_locked = ioctl(fd, MEMISLOCKED, &erase); erase.start = DEVOFFSET(dev); erase.length = DEVESIZE(dev); /* This relies on the fact, that ENV_REDUND_OBSOLETE == 0 */ @@ -1153,9 +1165,11 @@ static int flash_flag_obsolete(int dev, int fd, off_t offset) DEVNAME(dev)); return rc; } - ioctl(fd, MEMUNLOCK, &erase); + if (was_locked) + ioctl(fd, MEMUNLOCK, &erase); rc = write(fd, &tmp, sizeof(tmp)); - ioctl(fd, MEMLOCK, &erase); + if (was_locked) + ioctl(fd, MEMLOCK, &erase); if (rc < 0) perror("Could not set obsolete flag"); -- 2.21.1