|
@@ -774,17 +774,26 @@ static void flash_add_byte (flash_info_t * info, cfiword_t * cword, uchar c)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
-/* loop through the sectors from the highest address when the passed
|
|
|
|
- * address is greater or equal to the sector address we have a match
|
|
|
|
|
|
+/*
|
|
|
|
+ * Loop through the sector table starting from the previously found sector.
|
|
|
|
+ * Searches forwards or backwards, dependent on the passed address.
|
|
*/
|
|
*/
|
|
static flash_sect_t find_sector (flash_info_t * info, ulong addr)
|
|
static flash_sect_t find_sector (flash_info_t * info, ulong addr)
|
|
{
|
|
{
|
|
- flash_sect_t sector;
|
|
|
|
|
|
+ static flash_sect_t saved_sector = 0; /* previously found sector */
|
|
|
|
+ flash_sect_t sector = saved_sector;
|
|
|
|
|
|
- for (sector = info->sector_count - 1; sector >= 0; sector--) {
|
|
|
|
- if (addr >= info->start[sector])
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
|
|
+ while ((info->start[sector] < addr)
|
|
|
|
+ && (sector < info->sector_count - 1))
|
|
|
|
+ sector++;
|
|
|
|
+ while ((info->start[sector] > addr) && (sector > 0))
|
|
|
|
+ /*
|
|
|
|
+ * also decrements the sector in case of an overshot
|
|
|
|
+ * in the first loop
|
|
|
|
+ */
|
|
|
|
+ sector--;
|
|
|
|
+
|
|
|
|
+ saved_sector = sector;
|
|
return sector;
|
|
return sector;
|
|
}
|
|
}
|
|
|
|
|