diff options
author | Rafał Miłecki <zajec5@gmail.com> | 2016-01-02 00:33:48 +0000 |
---|---|---|
committer | Rafał Miłecki <zajec5@gmail.com> | 2016-01-02 00:33:48 +0000 |
commit | 5f1b0d9459b58331544dd60b509401dfad96ca98 (patch) | |
tree | ed355da63ce1e2f092d904fb2541367e2dc1f2ad /target/linux/generic/patches-3.18 | |
parent | 7a9b8836c1aa6ad66c542a29cec4c874795a8317 (diff) | |
download | master-187ad058-5f1b0d9459b58331544dd60b509401dfad96ca98.tar.gz master-187ad058-5f1b0d9459b58331544dd60b509401dfad96ca98.tar.bz2 master-187ad058-5f1b0d9459b58331544dd60b509401dfad96ca98.zip |
kernel: make bcm47xxpart work with TRX flashed at bad block(s)
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@48061 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'target/linux/generic/patches-3.18')
2 files changed, 101 insertions, 1 deletions
diff --git a/target/linux/generic/patches-3.18/431-mtd-bcm47xxpart-check-for-bad-blocks-when-calculatin.patch b/target/linux/generic/patches-3.18/431-mtd-bcm47xxpart-check-for-bad-blocks-when-calculatin.patch new file mode 100644 index 0000000000..6adac77669 --- /dev/null +++ b/target/linux/generic/patches-3.18/431-mtd-bcm47xxpart-check-for-bad-blocks-when-calculatin.patch @@ -0,0 +1,100 @@ +From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com> +Date: Sat, 2 Jan 2016 01:04:52 +0100 +Subject: [PATCH] mtd: bcm47xxpart: check for bad blocks when calculating + offsets +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Signed-off-by: Rafał Miłecki <zajec5@gmail.com> +--- + drivers/mtd/bcm47xxpart.c | 50 +++++++++++++++++++++++++++++++++++++---------- + 1 file changed, 40 insertions(+), 10 deletions(-) + +--- a/drivers/mtd/bcm47xxpart.c ++++ b/drivers/mtd/bcm47xxpart.c +@@ -61,6 +61,34 @@ static void bcm47xxpart_add_part(struct mtd_partition *part, const char *name, + part->mask_flags = mask_flags; + } + ++/* ++ * Calculate real end offset (address) for a given amount of data. It checks ++ * all blocks skipping bad ones. ++ */ ++static size_t bcm47xxpart_real_offset(struct mtd_info *master, size_t offset, ++ size_t bytes) ++{ ++ size_t real_offset = offset; ++ ++ if (mtd_block_isbad(master, real_offset)) ++ pr_warn("Base offset shouldn't be at bad block"); ++ ++ while (bytes >= master->erasesize) { ++ bytes -= master->erasesize; ++ real_offset += master->erasesize; ++ while (mtd_block_isbad(master, real_offset)) { ++ real_offset += master->erasesize; ++ ++ if (real_offset >= master->size) ++ return real_offset - master->erasesize; ++ } ++ } ++ ++ real_offset += bytes; ++ ++ return real_offset; ++} ++ + static const char *bcm47xxpart_trx_data_part_name(struct mtd_info *master, + size_t offset) + { +@@ -182,6 +210,8 @@ static int bcm47xxpart_parse(struct mtd_info *master, + + /* TRX */ + if (buf[0x000 / 4] == TRX_MAGIC) { ++ uint32_t tmp; ++ + if (BCM47XXPART_MAX_PARTS - curr_part < 4) { + pr_warn("Not enough partitions left to register trx, scanning stopped!\n"); + break; +@@ -196,18 +226,18 @@ static int bcm47xxpart_parse(struct mtd_info *master, + i = 0; + /* We have LZMA loader if offset[2] points to sth */ + if (trx->offset[2]) { ++ tmp = bcm47xxpart_real_offset(master, offset, ++ trx->offset[i]); + bcm47xxpart_add_part(&parts[curr_part++], +- "loader", +- offset + trx->offset[i], +- 0); ++ "loader", tmp, 0); + i++; + } + + if (trx->offset[i]) { ++ tmp = bcm47xxpart_real_offset(master, offset, ++ trx->offset[i]); + bcm47xxpart_add_part(&parts[curr_part++], +- "linux", +- offset + trx->offset[i], +- 0); ++ "linux", tmp, 0); + i++; + } + +@@ -219,11 +249,11 @@ static int bcm47xxpart_parse(struct mtd_info *master, + if (trx->offset[i]) { + const char *name; + +- name = bcm47xxpart_trx_data_part_name(master, offset + trx->offset[i]); ++ tmp = bcm47xxpart_real_offset(master, offset, ++ trx->offset[i]); ++ name = bcm47xxpart_trx_data_part_name(master, tmp); + bcm47xxpart_add_part(&parts[curr_part++], +- name, +- offset + trx->offset[i], +- 0); ++ name, tmp, 0); + i++; + } + diff --git a/target/linux/generic/patches-3.18/432-mtd-bcm47xxpart-detect-T_Meter-partition.patch b/target/linux/generic/patches-3.18/432-mtd-bcm47xxpart-detect-T_Meter-partition.patch index a3b7c1f71f..9e5ca91e55 100644 --- a/target/linux/generic/patches-3.18/432-mtd-bcm47xxpart-detect-T_Meter-partition.patch +++ b/target/linux/generic/patches-3.18/432-mtd-bcm47xxpart-detect-T_Meter-partition.patch @@ -24,7 +24,7 @@ Signed-off-by: Rafał Miłecki <zajec5@gmail.com> #define ML_MAGIC1 0x39685a42 #define ML_MAGIC2 0x26594131 #define TRX_MAGIC 0x30524448 -@@ -179,6 +180,15 @@ static int bcm47xxpart_parse(struct mtd_ +@@ -207,6 +208,15 @@ static int bcm47xxpart_parse(struct mtd_ MTD_WRITEABLE); continue; } |