uboot-envtools: backport some usefull patches from v2024.04-rc1
[openwrt/staging/robimarko.git] / package / boot / uboot-envtools / patches / 011-fw_env-keep-calling-read-until-whole-flash-block-is-.patch
1 From 9e3003f79d168eac7ee65cd457e3904e2fb4eea8 Mon Sep 17 00:00:00 2001
2 From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
3 Date: Wed, 13 Dec 2023 13:13:54 +0100
4 Subject: [PATCH] fw_env: keep calling read() until whole flash block is read
5 MIME-Version: 1.0
6 Content-Type: text/plain; charset=UTF-8
7 Content-Transfer-Encoding: 8bit
8
9 It's totally valid for read() to provide less bytes than requested
10 maximum. It may happen if there is no more data available yet or source
11 pushes data in small chunks.
12
13 This actually happens when trying to read env data from NVMEM device.
14 Kernel may provide NVMEM content in page size parts (like 4096 B).
15
16 This fixes warnings like:
17 Warning on /sys/bus/nvmem/devices/u-boot-env0/nvmem: Attempted to read 16384 bytes but got 4096
18 Warning on /sys/bus/nvmem/devices/u-boot-env0/nvmem: Attempted to read 12288 bytes but got 4096
19 Warning on /sys/bus/nvmem/devices/u-boot-env0/nvmem: Attempted to read 8192 bytes but got 4096
20
21 Since the main loop in flash_read_buf() is used to read blocks this
22 patch adds a new nested one.
23
24 Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
25 ---
26 tools/env/fw_env.c | 34 +++++++++++++++-------------------
27 1 file changed, 15 insertions(+), 19 deletions(-)
28
29 --- a/tools/env/fw_env.c
30 +++ b/tools/env/fw_env.c
31 @@ -948,29 +948,25 @@ static int flash_read_buf(int dev, int f
32 */
33 lseek(fd, blockstart + block_seek, SEEK_SET);
34
35 - rc = read(fd, buf + processed, readlen);
36 - if (rc == -1) {
37 - fprintf(stderr, "Read error on %s: %s\n",
38 - DEVNAME(dev), strerror(errno));
39 - return -1;
40 - }
41 + while (readlen) {
42 + rc = read(fd, buf + processed, readlen);
43 + if (rc == -1) {
44 + fprintf(stderr, "Read error on %s: %s\n",
45 + DEVNAME(dev), strerror(errno));
46 + return -1;
47 + }
48 #ifdef DEBUG
49 - fprintf(stderr, "Read 0x%x bytes at 0x%llx on %s\n",
50 - rc, (unsigned long long)blockstart + block_seek,
51 - DEVNAME(dev));
52 + fprintf(stderr, "Read 0x%x bytes at 0x%llx on %s\n",
53 + rc, (unsigned long long)blockstart + block_seek,
54 + DEVNAME(dev));
55 #endif
56 - processed += rc;
57 - if (rc != readlen) {
58 - fprintf(stderr,
59 - "Warning on %s: Attempted to read %zd bytes but got %d\n",
60 - DEVNAME(dev), readlen, rc);
61 + processed += rc;
62 readlen -= rc;
63 - block_seek += rc;
64 - } else {
65 - blockstart += blocklen;
66 - readlen = min(blocklen, count - processed);
67 - block_seek = 0;
68 }
69 +
70 + blockstart += blocklen;
71 + readlen = min(blocklen, count - processed);
72 + block_seek = 0;
73 }
74
75 return processed;