In some cases with unaligned addresses the loop would not abort.
Instead, use the calculated sector numbers in a for-loop.

Based on a patch by Sascha Hauer <[email protected]>.

Signed-off-by: Jan Luebbe <[email protected]>
---
 drivers/nor/m25p80.c |   12 ++++--------
 1 file changed, 4 insertions(+), 8 deletions(-)

diff --git a/drivers/nor/m25p80.c b/drivers/nor/m25p80.c
index 1440227..b4dfbfa 100644
--- a/drivers/nor/m25p80.c
+++ b/drivers/nor/m25p80.c
@@ -200,7 +200,7 @@ static ssize_t m25p80_erase(struct cdev *cdev, size_t 
count, loff_t offset)
        u32 addr, len;
        u32 start_sector;
        u32 end_sector;
-       u32 progress = 0;
+       u32 cur_sector;
        int eraseshift = ffs(flash->erasesize) - 1;
 
        dev_dbg(&flash->spi->dev, "%s %s 0x%llx, len %lld\n",
@@ -232,17 +232,13 @@ static ssize_t m25p80_erase(struct cdev *cdev, size_t 
count, loff_t offset)
 
        /* "sector"-at-a-time erase */
        } else {
-               while (len) {
+               for (cur_sector = start_sector; cur_sector <= end_sector; 
cur_sector++) {
                        if (ctrlc())
                                return -EINTR;
-                       if (erase_sector(flash, addr))
+                       if (erase_sector(flash, cur_sector << eraseshift))
                                return -EIO;
 
-                       show_progress(++progress);
-                       if (len <= flash->erasesize)
-                               break;
-                       addr += flash->erasesize;
-                       len -= flash->erasesize;
+                       show_progress(cur_sector - start_sector + 1);
                }
        }
 
-- 
1.7.10


_______________________________________________
barebox mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/barebox

Reply via email to