diff --git a/target/linux/generic/pending-4.14/490-ubi-auto-attach-mtd-device-named-ubi-or-data-on-boot.patch b/target/linux/generic/pending-4.14/490-ubi-auto-attach-mtd-device-named-ubi-or-data-on-boot.patch index aa4dc12201..66da310e84 100644 --- a/target/linux/generic/pending-4.14/490-ubi-auto-attach-mtd-device-named-ubi-or-data-on-boot.patch +++ b/target/linux/generic/pending-4.14/490-ubi-auto-attach-mtd-device-named-ubi-or-data-on-boot.patch @@ -8,7 +8,7 @@ Signed-off-by: Daniel Golle --- a/drivers/mtd/ubi/build.c +++ b/drivers/mtd/ubi/build.c -@@ -1171,6 +1171,54 @@ static struct mtd_info * __init open_mtd +@@ -1171,6 +1171,68 @@ static struct mtd_info * __init open_mtd return mtd; } @@ -20,6 +20,7 @@ Signed-off-by: Daniel Golle +{ + int err; + struct mtd_info *mtd; ++ loff_t offset = 0; + size_t len; + char magic[4]; + @@ -31,9 +32,22 @@ Signed-off-by: Daniel Golle + if (IS_ERR(mtd)) + return; + ++ /* get the first not bad block */ ++ if (mtd_can_have_bb(mtd)) ++ while (mtd_block_isbad(mtd, offset)) { ++ offset += mtd->erasesize; ++ ++ if (offset > mtd->size) { ++ pr_err("UBI error: Failed to find a non-bad " ++ "block on mtd%d\n", mtd->index); ++ goto cleanup; ++ } ++ } ++ + /* check for a valid ubi magic if read from flash was successful */ -+ err = mtd_read(mtd, 0, 4, &len, (void *) magic); -+ if (!err && len == 4 && strncmp(magic, "UBI#", 4)) { ++ err = mtd_read(mtd, offset, 4, &len, (void *) magic); ++ if ((!err || mtd_is_bitflip(err)) && ++ len == 4 && strncmp(magic, "UBI#", 4)) { + pr_err("UBI error: no valid UBI magic found inside mtd%d\n", mtd->index); + goto cleanup; + } @@ -63,7 +77,7 @@ Signed-off-by: Daniel Golle static int __init ubi_init(void) { int err, i, k; -@@ -1254,6 +1302,12 @@ static int __init ubi_init(void) +@@ -1254,6 +1316,12 @@ static int __init ubi_init(void) } } diff --git a/target/linux/generic/pending-4.9/490-ubi-auto-attach-mtd-device-named-ubi-or-data-on-boot.patch b/target/linux/generic/pending-4.9/490-ubi-auto-attach-mtd-device-named-ubi-or-data-on-boot.patch index 1436e486dd..8b923d17d6 100644 --- a/target/linux/generic/pending-4.9/490-ubi-auto-attach-mtd-device-named-ubi-or-data-on-boot.patch +++ b/target/linux/generic/pending-4.9/490-ubi-auto-attach-mtd-device-named-ubi-or-data-on-boot.patch @@ -8,7 +8,7 @@ Signed-off-by: Daniel Golle --- a/drivers/mtd/ubi/build.c +++ b/drivers/mtd/ubi/build.c -@@ -1226,6 +1226,54 @@ static struct mtd_info * __init open_mtd +@@ -1226,6 +1226,68 @@ static struct mtd_info * __init open_mtd return mtd; } @@ -20,6 +20,7 @@ Signed-off-by: Daniel Golle +{ + int err; + struct mtd_info *mtd; ++ loff_t offset = 0; + size_t len; + char magic[4]; + @@ -31,9 +32,22 @@ Signed-off-by: Daniel Golle + if (IS_ERR(mtd)) + return; + ++ /* get the first not bad block */ ++ if (mtd_can_have_bb(mtd)) ++ while (mtd_block_isbad(mtd, offset)) { ++ offset += mtd->erasesize; ++ ++ if (offset > mtd->size) { ++ pr_err("UBI error: Failed to find a non-bad " ++ "block on mtd%d\n", mtd->index); ++ goto cleanup; ++ } ++ } ++ + /* check for a valid ubi magic if read from flash was successful */ -+ err = mtd_read(mtd, 0, 4, &len, (void *) magic); -+ if (!err && len == 4 && strncmp(magic, "UBI#", 4)) { ++ err = mtd_read(mtd, offset, 4, &len, (void *) magic); ++ if ((!err || mtd_is_bitflip(err)) && ++ len == 4 && strncmp(magic, "UBI#", 4)) { + pr_err("UBI error: no valid UBI magic found inside mtd%d\n", mtd->index); + goto cleanup; + } @@ -63,7 +77,7 @@ Signed-off-by: Daniel Golle static int __init ubi_init(void) { int err, i, k; -@@ -1309,6 +1357,12 @@ static int __init ubi_init(void) +@@ -1309,6 +1371,12 @@ static int __init ubi_init(void) } }