eeprom.c (0649cd0d4908d9b983a0361b8665938ef25701be) eeprom.c (203e94f6c9ca03e260175ce240f5856507395585)
1/*
2 * (C) Copyright 2000-2010
3 * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
4 *
5 * (C) Copyright 2001 Sysgo Real-Time Solutions, GmbH <www.elinos.com>
6 * Andreas Heppel <aheppel@sysgo.de>
7 *
8 * SPDX-License-Identifier: GPL-2.0+

--- 57 unchanged lines hidden (view full) ---

66}
67
68uchar env_get_char_spec(int index)
69{
70 uchar c;
71 unsigned int off = CONFIG_ENV_OFFSET;
72
73#ifdef CONFIG_ENV_OFFSET_REDUND
1/*
2 * (C) Copyright 2000-2010
3 * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
4 *
5 * (C) Copyright 2001 Sysgo Real-Time Solutions, GmbH <www.elinos.com>
6 * Andreas Heppel <aheppel@sysgo.de>
7 *
8 * SPDX-License-Identifier: GPL-2.0+

--- 57 unchanged lines hidden (view full) ---

66}
67
68uchar env_get_char_spec(int index)
69{
70 uchar c;
71 unsigned int off = CONFIG_ENV_OFFSET;
72
73#ifdef CONFIG_ENV_OFFSET_REDUND
74 if (gd->env_valid == 2)
74 if (gd->env_valid == ENV_REDUND)
75 off = CONFIG_ENV_OFFSET_REDUND;
76#endif
77 eeprom_bus_read(CONFIG_SYS_DEF_EEPROM_ADDR,
78 off + index + offsetof(env_t, data), &c, 1);
79
80 return c;
81}
82

--- 40 unchanged lines hidden (view full) ---

123 if (crc_tmp == crc[i])
124 crc_ok[i] = 1;
125 }
126
127 if (!crc_ok[0] && !crc_ok[1]) {
128 gd->env_addr = 0;
129 gd->env_valid = 0;
130 } else if (crc_ok[0] && !crc_ok[1]) {
75 off = CONFIG_ENV_OFFSET_REDUND;
76#endif
77 eeprom_bus_read(CONFIG_SYS_DEF_EEPROM_ADDR,
78 off + index + offsetof(env_t, data), &c, 1);
79
80 return c;
81}
82

--- 40 unchanged lines hidden (view full) ---

123 if (crc_tmp == crc[i])
124 crc_ok[i] = 1;
125 }
126
127 if (!crc_ok[0] && !crc_ok[1]) {
128 gd->env_addr = 0;
129 gd->env_valid = 0;
130 } else if (crc_ok[0] && !crc_ok[1]) {
131 gd->env_valid = 1;
131 gd->env_valid = ENV_VALID;
132 } else if (!crc_ok[0] && crc_ok[1]) {
132 } else if (!crc_ok[0] && crc_ok[1]) {
133 gd->env_valid = 2;
133 gd->env_valid = ENV_REDUND;
134 } else {
135 /* both ok - check serial */
136 if (flags[0] == ACTIVE_FLAG && flags[1] == OBSOLETE_FLAG)
134 } else {
135 /* both ok - check serial */
136 if (flags[0] == ACTIVE_FLAG && flags[1] == OBSOLETE_FLAG)
137 gd->env_valid = 1;
137 gd->env_valid = ENV_VALID;
138 else if (flags[0] == OBSOLETE_FLAG && flags[1] == ACTIVE_FLAG)
138 else if (flags[0] == OBSOLETE_FLAG && flags[1] == ACTIVE_FLAG)
139 gd->env_valid = 2;
139 gd->env_valid = ENV_REDUND;
140 else if (flags[0] == 0xFF && flags[1] == 0)
140 else if (flags[0] == 0xFF && flags[1] == 0)
141 gd->env_valid = 2;
141 gd->env_valid = ENV_REDUND;
142 else if (flags[1] == 0xFF && flags[0] == 0)
142 else if (flags[1] == 0xFF && flags[0] == 0)
143 gd->env_valid = 1;
143 gd->env_valid = ENV_VALID;
144 else /* flags are equal - almost impossible */
144 else /* flags are equal - almost impossible */
145 gd->env_valid = 1;
145 gd->env_valid = ENV_VALID;
146 }
147
148#else /* CONFIG_ENV_OFFSET_REDUND */
149 ulong crc, len, new;
150 uchar rdbuf[64];
151
152 eeprom_init(-1); /* prepare for EEPROM read/write */
153

--- 11 unchanged lines hidden (view full) ---

165 eeprom_bus_read(CONFIG_SYS_DEF_EEPROM_ADDR,
166 CONFIG_ENV_OFFSET + off, rdbuf, n);
167 new = crc32(new, rdbuf, n);
168 len -= n;
169 off += n;
170 }
171
172 if (crc == new) {
146 }
147
148#else /* CONFIG_ENV_OFFSET_REDUND */
149 ulong crc, len, new;
150 uchar rdbuf[64];
151
152 eeprom_init(-1); /* prepare for EEPROM read/write */
153

--- 11 unchanged lines hidden (view full) ---

165 eeprom_bus_read(CONFIG_SYS_DEF_EEPROM_ADDR,
166 CONFIG_ENV_OFFSET + off, rdbuf, n);
167 new = crc32(new, rdbuf, n);
168 len -= n;
169 off += n;
170 }
171
172 if (crc == new) {
173 gd->env_valid = 1;
173 gd->env_valid = ENV_VALID;
174 } else {
175 gd->env_valid = 0;
176 }
177#endif /* CONFIG_ENV_OFFSET_REDUND */
178
179 off = CONFIG_ENV_OFFSET;
180#ifdef CONFIG_ENV_OFFSET_REDUND
174 } else {
175 gd->env_valid = 0;
176 }
177#endif /* CONFIG_ENV_OFFSET_REDUND */
178
179 off = CONFIG_ENV_OFFSET;
180#ifdef CONFIG_ENV_OFFSET_REDUND
181 if (gd->env_valid == 2)
181 if (gd->env_valid == ENV_REDUND)
182 off = CONFIG_ENV_OFFSET_REDUND;
183#endif
184
185 eeprom_bus_read(CONFIG_SYS_DEF_EEPROM_ADDR,
186 off, (uchar *)buf_env, CONFIG_ENV_SIZE);
187
188 env_import(buf_env, 1);
189}

--- 10 unchanged lines hidden (view full) ---

200
201 BUG_ON(env_ptr != NULL);
202
203 rc = env_export(&env_new);
204 if (rc)
205 return rc;
206
207#ifdef CONFIG_ENV_OFFSET_REDUND
182 off = CONFIG_ENV_OFFSET_REDUND;
183#endif
184
185 eeprom_bus_read(CONFIG_SYS_DEF_EEPROM_ADDR,
186 off, (uchar *)buf_env, CONFIG_ENV_SIZE);
187
188 env_import(buf_env, 1);
189}

--- 10 unchanged lines hidden (view full) ---

200
201 BUG_ON(env_ptr != NULL);
202
203 rc = env_export(&env_new);
204 if (rc)
205 return rc;
206
207#ifdef CONFIG_ENV_OFFSET_REDUND
208 if (gd->env_valid == 1) {
208 if (gd->env_valid == ENV_VALID) {
209 off = CONFIG_ENV_OFFSET_REDUND;
210 off_red = CONFIG_ENV_OFFSET;
211 }
212
213 env_new.flags = ACTIVE_FLAG;
214#endif
215
216 rc = eeprom_bus_write(CONFIG_SYS_DEF_EEPROM_ADDR,
217 off, (uchar *)&env_new, CONFIG_ENV_SIZE);
218
219#ifdef CONFIG_ENV_OFFSET_REDUND
220 if (rc == 0) {
221 eeprom_bus_write(CONFIG_SYS_DEF_EEPROM_ADDR,
222 off_red + offsetof(env_t, flags),
223 (uchar *)&flag_obsolete, 1);
224
209 off = CONFIG_ENV_OFFSET_REDUND;
210 off_red = CONFIG_ENV_OFFSET;
211 }
212
213 env_new.flags = ACTIVE_FLAG;
214#endif
215
216 rc = eeprom_bus_write(CONFIG_SYS_DEF_EEPROM_ADDR,
217 off, (uchar *)&env_new, CONFIG_ENV_SIZE);
218
219#ifdef CONFIG_ENV_OFFSET_REDUND
220 if (rc == 0) {
221 eeprom_bus_write(CONFIG_SYS_DEF_EEPROM_ADDR,
222 off_red + offsetof(env_t, flags),
223 (uchar *)&flag_obsolete, 1);
224
225 if (gd->env_valid == 1)
226 gd->env_valid = 2;
225 if (gd->env_valid == ENV_VALID)
226 gd->env_valid = ENV_REDUND;
227 else
227 else
228 gd->env_valid = 1;
228 gd->env_valid = ENV_VALID;
229 }
230#endif
231 return rc;
232}
233
234/*
235 * Initialize Environment use
236 *
237 * We are still running from ROM, so data use is limited.
238 * Use a (moderately small) buffer on the stack
239 */
240int env_init(void)
241{
242 gd->env_addr = (ulong)&default_environment[0];
229 }
230#endif
231 return rc;
232}
233
234/*
235 * Initialize Environment use
236 *
237 * We are still running from ROM, so data use is limited.
238 * Use a (moderately small) buffer on the stack
239 */
240int env_init(void)
241{
242 gd->env_addr = (ulong)&default_environment[0];
243 gd->env_valid = 1;
243 gd->env_valid = ENV_VALID;
244 return 0;
245}
244 return 0;
245}