Patchwork [U-Boot] cfi_flash - bug with flash banks with different sector numbers

login
register
mail settings
Submitter Martin Krause
Date March 21, 2011, 12:42 p.m.
Message ID <47F3F98010FF784EBEE6526EAAB078D10635EA18@tq-mailsrv.tq-net.de>
Download mbox | patch
Permalink /patch/87765/
State Superseded
Delegated to: Stefan Roese
Headers show

Comments

Martin Krause - March 21, 2011, 12:42 p.m.
Hi list,

I encountered a problem with the cfi_flash driver on a board with
two flash banks with a different number of flash secotrs.

It seems that the function find_sector() which tries to speed up 
successive flash accesses does not take into account the current
flash bank correctly.

I created a patch with a fix (see blow), but since I do not
work with current U-Boot, this patch likely will not apply cleanly
to TOT (but is neccessary, since the bug is still present there).

Best regards,
Martin


From 22454f09e058a3b0b8e86bc4d5566c21e23f5b63 Mon Sep 17 00:00:00 2001
From: Martin Krause <martin.krause@tqs.de>
Date: Mon, 21 Mar 2011 13:08:19 +0100
Subject: [PATCH] cfi_flash: fix bug with flash banks with different
sector numbers

The function find_sector() does not take into account if the flash bank
has changed since the last call. This could lead to illegal accesses
inside
and beyond the flash_info_t info strcture. For example if the current
flash bank has less sectors than the last used flash bank.

This patch adds two cheks. One that insures, that the current sector
does not
exceed the allowed maximum (which is always a good idea). And one that
checks if the current access is to the same flash bank as the last
access.
If not, the search loop will start with sector 0.

Signed-off-by: Martin Krause <martin.krause@tqs.de>
---
 drivers/mtd/cfi_flash.c |    5 +++++
 1 files changed, 5 insertions(+), 0 deletions(-)

        while ((info->start[sector] < addr)
                        && (sector < info->sector_count - 1))
                sector++;
@@ -666,6 +670,7 @@ static flash_sect_t find_sector (flash_info_t *
info, ulong addr)
                sector--;

        saved_sector = sector;
+       saved_info = info;
        return sector;
 }

--
1.6.6.1
Stefan Roese - March 21, 2011, 1:09 p.m.
Hi Martin,

On Monday 21 March 2011 13:42:00 Martin Krause wrote:
> I encountered a problem with the cfi_flash driver on a board with
> two flash banks with a different number of flash secotrs.
> 
> It seems that the function find_sector() which tries to speed up
> successive flash accesses does not take into account the current
> flash bank correctly.
> 
> I created a patch with a fix (see blow), but since I do not
> work with current U-Boot, this patch likely will not apply cleanly
> to TOT (but is neccessary, since the bug is still present there).

First, the patch is line wrapped. Would it be possible for you to take the 
time to rebase it against TOT and send a non line wrapped version?

Thanks.
 
Cheers,
Stefan

--
DENX Software Engineering GmbH,      MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich,  Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-0 Fax: (+49)-8142-66989-80 Email: office@denx.de
Martin Krause - March 21, 2011, 3:15 p.m.
Hi Stefan,

Stefan Roese wrote on Montag, 21. März 2011 14:10:
> Hi Martin,
> 
> On Monday 21 March 2011 13:42:00 Martin Krause wrote:
>> I encountered a problem with the cfi_flash driver on a board with
>> two flash banks with a different number of flash secotrs.
>> 
>> It seems that the function find_sector() which tries to speed up
>> successive flash accesses does not take into account the current
>> flash bank correctly. 
>> 
>> I created a patch with a fix (see blow), but since I do not
>> work with current U-Boot, this patch likely will not apply cleanly
>> to TOT (but is neccessary, since the bug is still present there).
> 
> First, the patch is line wrapped. Would it be possible for

Oh, I forgot dumb M$ outlook.

> you to take the
> time to rebase it against TOT and send a non line wrapped version?

I will do, if the patch otherwise is OK. Since the computer my git 
repo is installed on has no direct connection to the internet, this 
is not as easy as it could be. And I will not be able to test the 
patched TOT U-Boot apart from compiling without errors.

Best regards,
Martin

Patch

diff --git a/drivers/mtd/cfi_flash.c b/drivers/mtd/cfi_flash.c
index 24eb33f..ff1457c 100644
--- a/drivers/mtd/cfi_flash.c
+++ b/drivers/mtd/cfi_flash.c
@@ -653,8 +653,12 @@  static void flash_add_byte (flash_info_t * info,
cfiword_t * cword, uchar c)
 static flash_sect_t find_sector (flash_info_t * info, ulong addr)
 {
        static flash_sect_t saved_sector = 0; /* previously found sector
*/
+       static flash_info_t *saved_info = 0; /* previously used flash
bank */
        flash_sect_t sector = saved_sector;

+       if ((info != saved_info) || (sector >= info->sector_count))
+               sector = 0;
+