From: Jens Gehrlein Date: Tue, 16 Dec 2008 16:25:55 +0000 (+0100) Subject: CFI: increase performance of function find_sector() X-Git-Tag: v2009.03-rc1~167^2~1 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=0f8e851e897b535959a0781171910cd97f33c30c;p=u-boot CFI: increase performance of function find_sector() Tested on TQM5200S-BD with Samsung K8P2815UQB Signed-off-by: Jens Gehrlein Signed-off-by: Stefan Roese --- diff --git a/drivers/mtd/cfi_flash.c b/drivers/mtd/cfi_flash.c index 1bd0e2b99a..bc5e1514e4 100644 --- a/drivers/mtd/cfi_flash.c +++ b/drivers/mtd/cfi_flash.c @@ -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) { - 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; }