netifd: update to the latest version, fixes a bridge handling corner case on config...
[openwrt/svn-archive/archive.git] / package / boot / uboot-envtools / patches / 115-writing-environment-for-mtd-devices.patch
1 tools/fw_env: fix writing environment for mtd devices
2
3 Signed-off-by: Oliver Metz <oliver@freetz.org>
4 ---
5 tools/env/fw_env.c | 71 ++++++++++++++++++++++++++++++++----------------------
6 1 file changed, 42 insertions(+), 29 deletions(-)
7
8 --- a/tools/env/fw_env.c
9 +++ b/tools/env/fw_env.c
10 @@ -743,27 +743,39 @@ static int flash_write_buf (int dev, int
11 MEMGETBADBLOCK needs 64 bits */
12 int rc;
13
14 - blocklen = DEVESIZE (dev);
15 + /*
16 + * For mtd devices only offset and size of the environment do matter
17 + */
18 + if (mtd_type == MTD_ABSENT) {
19 + blocklen = count;
20 + top_of_range = offset + count;
21 + erase_len = blocklen;
22 + blockstart = offset;
23 + block_seek = 0;
24 + write_total = blocklen;
25 + } else {
26 + blocklen = DEVESIZE (dev);
27
28 - top_of_range = ((DEVOFFSET(dev) / blocklen) +
29 - ENVSECTORS (dev)) * blocklen;
30 + top_of_range = ((DEVOFFSET(dev) / blocklen) +
31 + ENVSECTORS (dev)) * blocklen;
32
33 - erase_offset = (offset / blocklen) * blocklen;
34 + erase_offset = (offset / blocklen) * blocklen;
35
36 - /* Maximum area we may use */
37 - erase_len = top_of_range - erase_offset;
38 + /* Maximum area we may use */
39 + erase_len = top_of_range - erase_offset;
40
41 - blockstart = erase_offset;
42 - /* Offset inside a block */
43 - block_seek = offset - erase_offset;
44 + blockstart = erase_offset;
45 + /* Offset inside a block */
46 + block_seek = offset - erase_offset;
47
48 - /*
49 - * Data size we actually have to write: from the start of the block
50 - * to the start of the data, then count bytes of data, and to the
51 - * end of the block
52 - */
53 - write_total = ((block_seek + count + blocklen - 1) /
54 - blocklen) * blocklen;
55 + /*
56 + * Data size we actually write: from the start of the block
57 + * to the start of the data, then count bytes of data, and to the
58 + * end of the block
59 + */
60 + write_total = ((block_seek + count + blocklen - 1) /
61 + blocklen) * blocklen;
62 + }
63
64 /*
65 * Support data anywhere within erase sectors: read out the complete
66 @@ -834,17 +846,18 @@ static int flash_write_buf (int dev, int
67 continue;
68 }
69
70 - erase.start = blockstart;
71 - ioctl (fd, MEMUNLOCK, &erase);
72 - /* These do not need an explicit erase cycle */
73 - if (mtd_type != MTD_ABSENT &&
74 - mtd_type != MTD_DATAFLASH)
75 - if (ioctl (fd, MEMERASE, &erase) != 0) {
76 - fprintf (stderr, "MTD erase error on %s: %s\n",
77 - DEVNAME (dev),
78 - strerror (errno));
79 - return -1;
80 - }
81 + if (mtd_type != MTD_ABSENT) {
82 + erase.start = blockstart;
83 + ioctl (fd, MEMUNLOCK, &erase);
84 + /* These do not need an explicit erase cycle */
85 + if (mtd_type != MTD_DATAFLASH)
86 + if (ioctl (fd, MEMERASE, &erase) != 0) {
87 + fprintf (stderr, "MTD erase error on %s: %s\n",
88 + DEVNAME (dev),
89 + strerror (errno));
90 + return -1;
91 + }
92 + }
93
94 if (lseek (fd, blockstart, SEEK_SET) == -1) {
95 fprintf (stderr,
96 @@ -862,8 +875,8 @@ static int flash_write_buf (int dev, int
97 DEVNAME (dev), strerror (errno));
98 return -1;
99 }
100 -
101 - ioctl (fd, MEMLOCK, &erase);
102 + if (mtd_type != MTD_ABSENT)
103 + ioctl (fd, MEMLOCK, &erase);
104
105 processed += blocklen;
106 block_seek = 0;