[U-Boot] Bricked when trying to attach UBI

Holger Brunck holger.brunck at keymile.com
Thu Dec 20 13:44:03 CET 2012


Hi Luca,

On 12/19/2012 06:37 PM, Luca Ceresoli wrote:
> I had some days ago, but I double-checked now as you suggested. Indeed
> there is an important difference: attach_by_scanning() (build.c) calls
> ubi_wl_init_scan() and ubi_eba_init_scan() just like Linux does, but in
> a swapped order!
> 
> This swap dates back to:
> 
> commit d63894654df72b010de2abb4b3f07d0d755f65b6
> Author: Holger Brunck <holger.brunck at keymile.com>
> Date:   Mon Oct 10 13:08:19 2011 +0200
> 
>     UBI: init eba tables before wl when attaching a device
> 
>     This fixes that u-boot gets stuck when a bitflip was detected
>     during "ubi part <ubi_device>". If a bitflip was detected UBI tries
>     to copy the PEB to a different place. This needs that the eba table
>     are initialized, but this was done after the wear levelling worker
>     detects the bitflip. So changes the initialisation of these two
>     tasks in u-boot.
> 
>     This is a u-boot specific patch and not needed in the linux layer,
>     because due to commit 1b1f9a9d00447d
>     UBI: Ensure that "background thread" operations are really executed
>     we schedule these tasks in place and not as in linux after the inital
>     task which schedule this new task is finished.
> 
>     Signed-off-by: Holger Brunck <holger.brunck at keymile.com>
>     cc: Stefan Roese <sr at denx.de>
>     Signed-off-by: Stefan Roese <sr at denx.de>
> 
> I tried reverting that commit and... surprise! U-Boot can now attach UBI
> and boot properly!
> 

:-(

> But the cited commit actually fixed a bug that bite our board a few
> months back, so it should not be reverted without thinking twice. Now
> it apparently introduced another bug. :-(
> 

yes definetely.

I didn't read the whole thread, so I don't know what your exact problem is. On
my boards the ubi layer seems to work fine on latest u-boot. But I see a general
problem we have in the ubi layer in u-boot. I try to summarize my view:

The UBI layer was initialy copied from the linux implementation. But the linux
implementation relies for some tasks e.g. fix correctable errors on a background
thread. Due to the fact that u-boot is single threaded there was one commit
which wants to take care that these background tasks are really executed (CC-ing
the author):
commit 1b1f9a9d00  UBI: Ensure that "background thread" operations are really
executed

U-boot executes this background taks immediately but the linux implementation
executes this tasks later with the help of some synchronisation mechanism.
Therefore we have a different order executing these tasks. My fix did now a
change in the initialisation order of eba tables and the wear leveling thread,
to address my problem. But now it seems to cause a new problem on your side.

So the synchronisation mechanism in u-boot for the ubi tasks which are running
on linux in background is incorrect. But how this could be fixed needs to have
some deeper analyses.

Regards
Holger



More information about the U-Boot mailing list