From: Sascha Hauer <s.hauer@pengutronix.de>
To: Barebox List <barebox@lists.infradead.org>
Subject: [PATCH 04/11] imx-bbu-nand-fcb: Use mtd-peb API to write firmware
Date: Tue, 15 Mar 2016 12:19:07 +0100 [thread overview]
Message-ID: <1458040754-32240-5-git-send-email-s.hauer@pengutronix.de> (raw)
In-Reply-To: <1458040754-32240-1-git-send-email-s.hauer@pengutronix.de>
With this patch we verify the firmware written to the NAND and thus
can react on write failures. We torture the block and if it went
bad we mark it as bad.
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
---
common/imx-bbu-nand-fcb.c | 44 +++++++++++++++++++++++++++++++++++---------
1 file changed, 35 insertions(+), 9 deletions(-)
diff --git a/common/imx-bbu-nand-fcb.c b/common/imx-bbu-nand-fcb.c
index 26b0b29..f1fc404 100644
--- a/common/imx-bbu-nand-fcb.c
+++ b/common/imx-bbu-nand-fcb.c
@@ -33,6 +33,7 @@
#include <linux/mtd/mtd.h>
#include <linux/stat.h>
#include <io.h>
+#include <mtd/mtd-peb.h>
struct dbbt_block {
uint32_t Checksum;
@@ -300,6 +301,27 @@ static int imx_bbu_erase(struct mtd_info *mtd)
return 0;
}
+static int mtd_peb_write_block(struct mtd_info *mtd, void *buf, int block, int len)
+{
+ int ret;
+ int retries = 0;
+
+ if (mtd_peb_is_bad(mtd, block))
+ return -EINVAL;
+again:
+ ret = mtd_peb_write(mtd, buf, block, 0, len);
+ if (!ret)
+ return 0;
+
+ if (ret == -EBADMSG) {
+ ret = mtd_peb_torture(mtd, block);
+ if (!ret && retries++ < 3)
+ goto again;
+ }
+
+ return ret;
+}
+
/**
* imx_bbu_firmware_max_blocks - get max number of blocks for firmware
* @mtd: The mtd device
@@ -332,10 +354,8 @@ static int imx_bbu_write_firmware(struct mtd_info *mtd, unsigned num, void *buf,
size_t len)
{
int ret;
- size_t written;
int num_blocks = imx_bbu_firmware_max_blocks(mtd);
int block = imx_bbu_firmware_start_block(mtd, num);
- uint64_t offset = block * mtd->erasesize;
pr_info("writing firmware %d to block %d (ofs 0x%08x)\n",
num, block, block * mtd->erasesize);
@@ -346,21 +366,27 @@ static int imx_bbu_write_firmware(struct mtd_info *mtd, unsigned num, void *buf,
if (!num_blocks)
return -ENOSPC;
- pr_debug("writing %p at 0x%08llx, left 0x%08x\n",
- buf, offset, len);
+ pr_debug("writing %p peb %d, left 0x%08x\n",
+ buf, block, len);
- if (mtd_block_isbad(mtd, offset)) {
- pr_debug("write skip block @ 0x%08llx\n", offset);
- offset += mtd->erasesize;
+ if (mtd_peb_is_bad(mtd, block)) {
+ pr_debug("skipping block %d\n", block);
+ num_blocks--;
+ block++;
+ continue;
+ }
+
+ ret = mtd_peb_write_block(mtd, buf, block, now);
+
+ if (ret == -EIO) {
block++;
+ num_blocks--;
continue;
}
- ret = mtd_write(mtd, offset, now, &written, buf);
if (ret)
return ret;
- offset += now;
len -= now;
buf += now;
block++;
--
2.7.0
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
next prev parent reply other threads:[~2016-03-15 11:19 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-03-15 11:19 i.MX NAND Boot: Make update robust against power failures Sascha Hauer
2016-03-15 11:19 ` [PATCH 01/11] bbu: Allow to refresh/repair images Sascha Hauer
2016-03-15 11:19 ` [PATCH 02/11] mtd: nand: export nand_check_erased_buf Sascha Hauer
2016-03-15 11:19 ` [PATCH 03/11] imx-bbu-nand-fcb: factor out layout functions Sascha Hauer
2016-03-15 11:19 ` Sascha Hauer [this message]
2016-03-15 11:19 ` [PATCH 05/11] imx-bbu-nand-fcb: factor out a fcb write function Sascha Hauer
2016-03-15 11:19 ` [PATCH 06/11] imx-bbu-nand-fcb: erase on demand Sascha Hauer
2016-03-15 11:19 ` [PATCH 07/11] imx-bbu-nand-fcb: Only write FCBs/DBBTs when necessary Sascha Hauer
2016-03-15 11:19 ` [PATCH 08/11] imx-bbu-nand-fcb: When writing firmware return new bad blocks Sascha Hauer
2016-03-15 11:19 ` [PATCH 09/11] imx-bbu-nand-fcb: Print error when writing blocks fails Sascha Hauer
2016-03-15 11:19 ` [PATCH 10/11] imx-bbu-nand-fcb: Make robust against power cuts Sascha Hauer
2016-03-15 11:19 ` [PATCH 11/11] imx-bbu-nand-fcb: Print error message when out of pebs Sascha Hauer
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1458040754-32240-5-git-send-email-s.hauer@pengutronix.de \
--to=s.hauer@pengutronix.de \
--cc=barebox@lists.infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox