* primarily support access from Tcl scripts or from GDB.
*/
-struct flash_bank *flash_banks;
+static struct flash_bank *flash_banks;
int flash_driver_erase(struct flash_bank *bank, int first, int last)
{
int retval;
bool updated = false;
- /* NOTE: "first == last" means protect just that sector */
+ /* NOTE: "first == last" means (un?)protect just that sector.
+ code including Lower level ddrivers may rely on this "first <= last"
+ * invariant.
+ */
/* callers may not supply illegal parameters ... */
if (first < 0 || first > last || last >= bank->num_sectors)
* speeds at least some things up.
*/
scan:
- for (int i = first; i < last; i++) {
+ for (int i = first; i <= last; i++) {
struct flash_sector *sector = bank->sectors + i;
/* Only filter requests to protect the already-protected, or
* REVISIT we could handle discontiguous regions by issuing
* more than one driver request. How much would that matter?
*/
- if (i == first) {
+ if (i == first && i != last) {
updated = true;
first++;
- } else if (i == last) {
+ } else if (i == last && i != first) {
updated = true;
last--;
}
goto scan;
}
- /* Single sector, already protected? Nothing to do! */
- if (first == last)
+ /* Single sector, already protected? Nothing to do!
+ * We may have trimmed our parameters into this degenerate case.
+ *
+ * FIXME repeating the "is_protected==set" test is a giveaway that
+ * this fast-exit belongs earlier, in the trim-it-down loop; mve.
+ * */
+ if (first == last && bank->sectors[first].is_protected == set)
return ERROR_OK;
+ /* Note that we don't pass illegal parameters to drivers; any
+ * trimming just turns one valid range into another one.
+ */
retval = bank->driver->protect(bank, set, first, last);
if (retval != ERROR_OK)
{
run_size += image->sections[++section_last].size;
run_size += pad_bytes;
- LOG_INFO("Padding image section %d with %d bytes", section_last-1, pad_bytes);
+ if (pad_bytes > 0)
+ LOG_INFO("Padding image section %d with %d bytes", section_last-1, pad_bytes);
}
/* fit the run into bank constraints */