Message ID | 20211208143311.32178-1-joakim.tjernlund@infinera.com |
---|---|
State | Accepted |
Commit | 08cf1a5e6995697bcf2405ae50826634bc43d78a |
Delegated to: | Tom Rini |
Headers | show |
Series | fw_setenv: Unbreak fw_setenv caused by buggy MEMISLOCKED use | expand |
+Joe Hershberger Jocke On Wed, 2021-12-08 at 15:33 +0100, Joakim Tjernlund wrote: > Commit "fw_setenv: lock the flash only if it was locked before" > checks for Locked status with uninitialized erase data. > Address by moving the test for MEMISLOCKED. > > Fixes: 8a726b852502 ("fw_setenv: lock the flash only if it was locked before") > Signed-off-by: Joakim Tjernlund <joakim.tjernlund@infinera.com> > --- > tools/env/fw_env.c | 15 ++++++++------- > 1 file changed, 8 insertions(+), 7 deletions(-) > > diff --git a/tools/env/fw_env.c b/tools/env/fw_env.c > index e39c39e23a..3da75be783 100644 > --- a/tools/env/fw_env.c > +++ b/tools/env/fw_env.c > @@ -1083,12 +1083,6 @@ 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) { > @@ -1108,6 +1102,10 @@ static int flash_write_buf(int dev, int fd, void *buf, size_t count) > > if (DEVTYPE(dev) != MTD_ABSENT) { > erase.start = blockstart; > + was_locked = ioctl(fd, MEMISLOCKED, &erase); > + /* treat any errors as unlocked flash */ > + if (was_locked < 0) > + was_locked = 0; > if (was_locked) > ioctl(fd, MEMUNLOCK, &erase); > /* These do not need an explicit erase cycle */ > @@ -1163,7 +1161,6 @@ static int flash_flag_obsolete(int dev, int fd, off_t offset) > 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 */ > @@ -1173,6 +1170,10 @@ static int flash_flag_obsolete(int dev, int fd, off_t offset) > DEVNAME(dev)); > return rc; > } > + was_locked = ioctl(fd, MEMISLOCKED, &erase); > + /* treat any errors as unlocked flash */ > + if (was_locked < 0) > + was_locked = 0; > if (was_locked) > ioctl(fd, MEMUNLOCK, &erase); > rc = write(fd, &tmp, sizeof(tmp));
Ping? Maybe just revert commit 8a726b852502 ("fw_setenv: lock the flash only if it was locked before") ?
On Sat, 2021-12-18 at 18:23 +0000, Joakim Tjernlund wrote: > Ping? > Maybe just revert commit 8a726b852502 ("fw_setenv: lock the flash > only if it was locked before") ? > > ________________________________________ > From: Joakim Tjernlund <Joakim.Tjernlund@infinera.com> > Sent: 13 December 2021 18:22 > To: u-boot@lists.denx.de; joe.hershberger@ni.com; fr0st61te@gmail.com > Subject: Re: [PATCH] fw_setenv: Unbreak fw_setenv caused by buggy > MEMISLOCKED use > > +Joe Hershberger > > Jocke > > On Wed, 2021-12-08 at 15:33 +0100, Joakim Tjernlund wrote: > > Commit "fw_setenv: lock the flash only if it was locked before" > > checks for Locked status with uninitialized erase data. > > Address by moving the test for MEMISLOCKED. > > > > Fixes: 8a726b852502 ("fw_setenv: lock the flash only if it was > > locked before") > > Signed-off-by: Joakim Tjernlund <joakim.tjernlund@infinera.com> Joakim, can you provide more detailed description about what you want to fix or revert, please? In which case you see problems with 8a726b852502? Thanks.
On Sun, 2021-12-19 at 14:20 +0000, Ivan Mikhaylov wrote: > On Sat, 2021-12-18 at 18:23 +0000, Joakim Tjernlund wrote: > > Ping? > > Maybe just revert commit 8a726b852502 ("fw_setenv: lock the flash > > only if it was locked before") ? > > > > ________________________________________ > > From: Joakim Tjernlund <Joakim.Tjernlund@infinera.com> > > Sent: 13 December 2021 18:22 > > To: u-boot@lists.denx.de; joe.hershberger@ni.com; fr0st61te@gmail.com > > Subject: Re: [PATCH] fw_setenv: Unbreak fw_setenv caused by buggy > > MEMISLOCKED use > > > > +Joe Hershberger > > > > Jocke > > > > On Wed, 2021-12-08 at 15:33 +0100, Joakim Tjernlund wrote: > > > Commit "fw_setenv: lock the flash only if it was locked before" > > > checks for Locked status with uninitialized erase data. > > > Address by moving the test for MEMISLOCKED. > > > > > > Fixes: 8a726b852502 ("fw_setenv: lock the flash only if it was > > > locked before") > > > Signed-off-by: Joakim Tjernlund <joakim.tjernlund@infinera.com> > > Joakim, can you provide more detailed description about what you want > to fix or revert, please? In which case you see problems with > 8a726b852502? > > Thanks. > We see it when we set a variable to the same value it already had, then we get a locking error from fw_setenv. If you just look 1 min at the code you will see that 8a726b852502 sends garbage to MEMISLOCKED Jocke
On Wed, Dec 08, 2021 at 03:33:11PM +0100, Joakim Tjernlund wrote: > Commit "fw_setenv: lock the flash only if it was locked before" > checks for Locked status with uninitialized erase data. > Address by moving the test for MEMISLOCKED. > > Fixes: 8a726b852502 ("fw_setenv: lock the flash only if it was locked before") > Signed-off-by: Joakim Tjernlund <joakim.tjernlund@infinera.com> Applied to u-boot/master, thanks!
diff --git a/tools/env/fw_env.c b/tools/env/fw_env.c index e39c39e23a..3da75be783 100644 --- a/tools/env/fw_env.c +++ b/tools/env/fw_env.c @@ -1083,12 +1083,6 @@ 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) { @@ -1108,6 +1102,10 @@ static int flash_write_buf(int dev, int fd, void *buf, size_t count) if (DEVTYPE(dev) != MTD_ABSENT) { erase.start = blockstart; + was_locked = ioctl(fd, MEMISLOCKED, &erase); + /* treat any errors as unlocked flash */ + if (was_locked < 0) + was_locked = 0; if (was_locked) ioctl(fd, MEMUNLOCK, &erase); /* These do not need an explicit erase cycle */ @@ -1163,7 +1161,6 @@ static int flash_flag_obsolete(int dev, int fd, off_t offset) 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 */ @@ -1173,6 +1170,10 @@ static int flash_flag_obsolete(int dev, int fd, off_t offset) DEVNAME(dev)); return rc; } + was_locked = ioctl(fd, MEMISLOCKED, &erase); + /* treat any errors as unlocked flash */ + if (was_locked < 0) + was_locked = 0; if (was_locked) ioctl(fd, MEMUNLOCK, &erase); rc = write(fd, &tmp, sizeof(tmp));
Commit "fw_setenv: lock the flash only if it was locked before" checks for Locked status with uninitialized erase data. Address by moving the test for MEMISLOCKED. Fixes: 8a726b852502 ("fw_setenv: lock the flash only if it was locked before") Signed-off-by: Joakim Tjernlund <joakim.tjernlund@infinera.com> --- tools/env/fw_env.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-)