From mboxrd@z Thu Jan 1 00:00:00 1970 From: Heiko Schocher Date: Thu, 21 Apr 2016 12:09:34 +0200 Subject: [U-Boot] [PATCH] mtd, ubi: set free_count to zero before walking through erase list In-Reply-To: <20160421105846.696b0eff@bbrezillon> References: <1454410475-29929-1-git-send-email-hs@denx.de> <20160421105846.696b0eff@bbrezillon> Message-ID: <5718A6DE.6040109@denx.de> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de Hello Boris, Am 21.04.2016 um 10:58 schrieb Boris Brezillon: > On Tue, 2 Feb 2016 11:54:35 +0100 > Heiko Schocher wrote: > >> Set free_count to zero before walking through ai->erase list >> in wl_init(). >> >> As U-Boot has no workqueue/threads, it immediately calls >> erase_worker(), which increase for each erased block >> free_count. Without this patch, free_count gets after >> this initialized to zero in wl_init(), so the free_count >> variable always has the maybe wrong value 0. >> >> Detected this behaviour on the dxr2 board, where the >> UBI fastmap gets not written when attaching/dettaching >> on an empty NAND. It drops instead the error message: >> >> could not find any anchor PEB >> >> With this patch, fastmap gets written on dettach. > > I ran into the same problem, and produced the exact same patch to > fix it, so > > Reviewed-by: Boris Brezillon Thanks! I did not yet found time, to investigate this problem deeper, sorry. The real reason to me seems, on an empty nand flash, we call scan_all() which calls scan_peb() which calls ubi_io_read_ec_hdr() which returns UBI_IO_FF as the nand is empty. This adds the PEB to the erase list, and here comes the difference between U-Boot and linux, we have no threads in U-Boot, so we call the erase_worker function immediately ... which increments the "ubi->free_count" variable ... after that it get set to "ubi->free_count = 0" ... which leads into the error we see ... No idea, if the correct fix not would be to move this erase_worker call after the attach phase ended, as Richard suggested, or if this fix is also valid ... Do you have some time to check such a fix as Richard suggested? bye, Heiko > >> >> Signed-off-by: Heiko Schocher >> --- >> added Richard to this EMail, as maybe this could be a problem >> in linux too ... ? >> >> drivers/mtd/ubi/wl.c | 2 +- >> 1 file changed, 1 insertion(+), 1 deletion(-) >> >> diff --git a/drivers/mtd/ubi/wl.c b/drivers/mtd/ubi/wl.c >> index 507b091..e823ca5 100644 >> --- a/drivers/mtd/ubi/wl.c >> +++ b/drivers/mtd/ubi/wl.c >> @@ -1528,6 +1528,7 @@ int ubi_wl_init(struct ubi_device *ubi, struct ubi_attach_info *ai) >> INIT_LIST_HEAD(&ubi->pq[i]); >> ubi->pq_head = 0; >> >> + ubi->free_count = 0; >> list_for_each_entry_safe(aeb, tmp, &ai->erase, u.list) { >> cond_resched(); >> >> @@ -1546,7 +1547,6 @@ int ubi_wl_init(struct ubi_device *ubi, struct ubi_attach_info *ai) >> found_pebs++; >> } >> >> - ubi->free_count = 0; >> list_for_each_entry(aeb, &ai->free, u.list) { >> cond_resched(); >> > > > -- DENX Software Engineering GmbH, Managing Director: Wolfgang Denk HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany