]> git.ipfire.org Git - people/ms/u-boot.git/commitdiff
Merge git://git.denx.de/u-boot-ubi
authorTom Rini <trini@konsulko.com>
Mon, 19 Feb 2018 14:50:37 +0000 (09:50 -0500)
committerTom Rini <trini@konsulko.com>
Mon, 19 Feb 2018 14:50:37 +0000 (09:50 -0500)
drivers/mtd/ubi/build.c
drivers/mtd/ubi/ubi.h
drivers/mtd/ubi/wl.c

index baf4e2d25b4c1c1f2bea6921bad905e642f2388b..d81bd434acaee4095731fdf6b11ba5a10559ff2a 100644 (file)
@@ -1060,15 +1060,7 @@ int ubi_attach_mtd_dev(struct mtd_info *mtd, int ubi_num,
 #ifndef __UBOOT__
        wake_up_process(ubi->bgt_thread);
 #else
-       /*
-        * U-Boot special: We have no bgt_thread in U-Boot!
-        * So just call do_work() here directly.
-        */
-       err = do_work(ubi);
-       if (err) {
-               ubi_err(ubi, "%s: work failed with error code %d",
-                       ubi->bgt_name, err);
-       }
+       ubi_do_worker(ubi);
 #endif
 
        spin_unlock(&ubi->wl_lock);
index 540f721e1baa5efa07ec1b0d8c3ecd41f8219270..3337201fb007b4c8a6504d109b1ac3820d2dae8e 100644 (file)
@@ -1119,6 +1119,6 @@ static inline int idx2vol_id(const struct ubi_device *ubi, int idx)
 }
 
 #ifdef __UBOOT__
-int do_work(struct ubi_device *ubi);
+void ubi_do_worker(struct ubi_device *ubi);
 #endif
 #endif /* !__UBI_UBI_H__ */
index e823ca56f23a723444c8af6dc494267a355cf418..0de2a4a5f8d8e6ade8fc2f286d52e3f7e601848e 100644 (file)
@@ -191,11 +191,7 @@ static void wl_entry_destroy(struct ubi_device *ubi, struct ubi_wl_entry *e)
  * This function returns zero in case of success and a negative error code in
  * case of failure.
  */
-#ifndef __UBOOT__
 static int do_work(struct ubi_device *ubi)
-#else
-int do_work(struct ubi_device *ubi)
-#endif
 {
        int err;
        struct ubi_work *wrk;
@@ -528,6 +524,33 @@ repeat:
        spin_unlock(&ubi->wl_lock);
 }
 
+#ifdef __UBOOT__
+void ubi_do_worker(struct ubi_device *ubi)
+{
+       int err;
+
+       if (list_empty(&ubi->works) || ubi->ro_mode ||
+           !ubi->thread_enabled || ubi_dbg_is_bgt_disabled(ubi))
+               return;
+
+       spin_lock(&ubi->wl_lock);
+       while (!list_empty(&ubi->works)) {
+               /*
+                * call do_work, which executes exactly one work form the queue,
+                * including removeing it from the work queue.
+                */
+               spin_unlock(&ubi->wl_lock);
+               err = do_work(ubi);
+               spin_lock(&ubi->wl_lock);
+               if (err) {
+                       ubi_err(ubi, "%s: work failed with error code %d",
+                               ubi->bgt_name, err);
+               }
+       }
+       spin_unlock(&ubi->wl_lock);
+}
+#endif
+
 /**
  * __schedule_ubi_work - schedule a work.
  * @ubi: UBI device description object
@@ -545,17 +568,6 @@ static void __schedule_ubi_work(struct ubi_device *ubi, struct ubi_work *wrk)
 #ifndef __UBOOT__
        if (ubi->thread_enabled && !ubi_dbg_is_bgt_disabled(ubi))
                wake_up_process(ubi->bgt_thread);
-#else
-       int err;
-       /*
-        * U-Boot special: We have no bgt_thread in U-Boot!
-        * So just call do_work() here directly.
-        */
-       err = do_work(ubi);
-       if (err) {
-               ubi_err(ubi, "%s: work failed with error code %d",
-                       ubi->bgt_name, err);
-       }
 #endif
        spin_unlock(&ubi->wl_lock);
 }
@@ -610,6 +622,10 @@ static int schedule_erase(struct ubi_device *ubi, struct ubi_wl_entry *e,
        wl_wrk->torture = torture;
 
        schedule_ubi_work(ubi, wl_wrk);
+
+#ifdef __UBOOT__
+       ubi_do_worker(ubi);
+#endif
        return 0;
 }
 
@@ -1011,8 +1027,15 @@ static int ensure_wear_leveling(struct ubi_device *ubi, int nested)
        wrk->func = &wear_leveling_worker;
        if (nested)
                __schedule_ubi_work(ubi, wrk);
+#ifndef __UBOOT__
        else
                schedule_ubi_work(ubi, wrk);
+#else
+       else {
+               schedule_ubi_work(ubi, wrk);
+               ubi_do_worker(ubi);
+       }
+#endif
        return err;
 
 out_cancel: