[Bugfix][API-1313]after flash_erase system_a, can't startup
Only Configure: No
Affected branch: MR3.0-merged
Affected module: ab backup
Is it affected on both ZXIC and MTK: only MTK
Self-test: Yes
Doc Update: No
Change-Id: I8d52b2e82f239de34c90bed1a26525bd30e95ebb
(cherry picked from commit 1d74df46ce16aa6a283b775a88f543507ef11734)
diff --git a/src/kernel/linux/v4.19/drivers/lynq_bootctrl/lynq_bootctrl.c b/src/kernel/linux/v4.19/drivers/lynq_bootctrl/lynq_bootctrl.c
index f7169a1..cdb9ae0 100755
--- a/src/kernel/linux/v4.19/drivers/lynq_bootctrl/lynq_bootctrl.c
+++ b/src/kernel/linux/v4.19/drivers/lynq_bootctrl/lynq_bootctrl.c
@@ -19,11 +19,15 @@
int bootctrl_write_metadata(AvbABData *bctrl)
{
- int err;
+ int err, ret;
ssize_t sz, size;
- char *buf = (char *)bctrl;
+ char *buffer = NULL;
+ char *buf = NULL;
+ AvbABData *metadata;
struct mtd_info *mtd = NULL;
- loff_t pos = OFFSETOF_SLOT_SUFFIX;
+ struct erase_info ei = {0};
+ size_t misc_erasesize = 0;
+ //loff_t pos = 0;
if(bctrl == NULL)
{
@@ -43,11 +47,50 @@
printk("ERROR: pointer: %d.", err);
return err;
}
-
- size = sizeof(AvbABData);
-
+ misc_erasesize = mtd->erasesize;
+//malloc buffer
+ buffer = (char *)kmalloc(misc_erasesize, GFP_KERNEL);
+ if(buffer == NULL)
+ {
+ printk("ERROR: kmalloc error!");
+ return -1;
+ }
+ buf = buffer;
+ size = misc_erasesize;
+//read one erasesize
do {
- err = mtd_write(mtd, pos, size, &sz, buf);
+ ret = mtd_read(mtd, 0, size, &sz, buf);
+ if (sz == 0)
+ {
+ break;
+ }
+ else if (sz < 0)
+ {
+ printk("BOOTCTRL:Error reading metadata file: %ld\n", sz);
+ kfree(buffer);
+ return sz;
+ }
+ size -= sz;
+ buf += sz;
+ } while(size > 0);
+
+ printk("BOOTCTRL: end of read block");
+ size = misc_erasesize;
+ ei.addr = 0;
+ ei.len = mtd->erasesize * 1;
+ err = mtd_erase(mtd, &ei);
+ if(err != 0)
+ {
+ printk("ERROR: mtd_erase: %d.", err);
+ kfree(buffer);
+ return err;
+ }
+ metadata = (AvbABData *)(buffer + OFFSETOF_SLOT_SUFFIX);
+ memcpy(metadata, bctrl, sizeof(AvbABData));
+ buf = buffer;
+//write one erasesize
+ do {
+ err = mtd_write(mtd, 0, size, &sz, buf);
if (err == 0)
{
@@ -56,12 +99,14 @@
else if (err < 0)
{
printk("Error Writing metadata file\n");
+ kfree(buffer);
return err;
}
size -= sz;
buf += sz;
} while(size > 0);
printk("BOOTCTRL:write new info to metadata\n");
+ kfree(buffer);
return 0;
}