From 1d232f354a9194a7c3a56beaa3346482cc097f80 Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Fri, 18 Jul 2014 14:36:38 +0000 Subject: [PATCH] kernel: mtd: allow partial block erase This fixes error erasing partial mtd partition which does not start on eraseblock boundary and allows using fconfig to configure redboot on devices such as the Gateworks Cambria. Signed-off-by: Maciej Skrzypek SVN-Revision: 41733 --- .../patches-3.10/411-mtd-partial_eraseblock_write.patch | 7 ++++--- .../patches-3.13/411-mtd-partial_eraseblock_write.patch | 7 ++++--- .../patches-3.14/411-mtd-partial_eraseblock_write.patch | 7 ++++--- .../generic/patches-3.3/401-partial_eraseblock_write.patch | 7 ++++--- .../generic/patches-3.6/401-partial_eraseblock_write.patch | 7 ++++--- .../generic/patches-3.8/401-partial_eraseblock_write.patch | 7 ++++--- .../generic/patches-3.9/401-partial_eraseblock_write.patch | 7 ++++--- 7 files changed, 28 insertions(+), 21 deletions(-) diff --git a/target/linux/generic/patches-3.10/411-mtd-partial_eraseblock_write.patch b/target/linux/generic/patches-3.10/411-mtd-partial_eraseblock_write.patch index b7152110b291..940741120703 100644 --- a/target/linux/generic/patches-3.10/411-mtd-partial_eraseblock_write.patch +++ b/target/linux/generic/patches-3.10/411-mtd-partial_eraseblock_write.patch @@ -9,7 +9,7 @@ /* Our partition linked list */ static LIST_HEAD(mtd_partitions); static DEFINE_MUTEX(mtd_partitions_mutex); -@@ -231,13 +233,60 @@ static int part_erase(struct mtd_info *m +@@ -231,13 +233,61 @@ static int part_erase(struct mtd_info *m struct mtd_part *part = PART(mtd); int ret; @@ -33,6 +33,7 @@ + part->master->erasesize, + &readlen, instr->erase_buf); + ++ instr->len += instr->erase_buf_ofs; + instr->partial_start = true; + } else { + mtd_ofs = part->offset + part->mtd.size; @@ -70,7 +71,7 @@ return ret; } -@@ -245,7 +294,25 @@ void mtd_erase_callback(struct erase_inf +@@ -245,7 +295,25 @@ void mtd_erase_callback(struct erase_inf { if (instr->mtd->_erase == part_erase) { struct mtd_part *part = PART(instr->mtd); @@ -96,7 +97,7 @@ if (instr->fail_addr != MTD_FAIL_ADDR_UNKNOWN) instr->fail_addr -= part->offset; instr->addr -= part->offset; -@@ -503,18 +570,24 @@ static struct mtd_part *allocate_partiti +@@ -503,18 +571,24 @@ static struct mtd_part *allocate_partiti if ((slave->mtd.flags & MTD_WRITEABLE) && mtd_mod_by_eb(slave->offset, &slave->mtd)) { /* Doesn't start on a boundary of major erase size */ diff --git a/target/linux/generic/patches-3.13/411-mtd-partial_eraseblock_write.patch b/target/linux/generic/patches-3.13/411-mtd-partial_eraseblock_write.patch index 7facf0db1520..8da080b2ade8 100644 --- a/target/linux/generic/patches-3.13/411-mtd-partial_eraseblock_write.patch +++ b/target/linux/generic/patches-3.13/411-mtd-partial_eraseblock_write.patch @@ -9,7 +9,7 @@ /* Our partition linked list */ static LIST_HEAD(mtd_partitions); static DEFINE_MUTEX(mtd_partitions_mutex); -@@ -231,13 +233,60 @@ static int part_erase(struct mtd_info *m +@@ -231,13 +233,61 @@ static int part_erase(struct mtd_info *m struct mtd_part *part = PART(mtd); int ret; @@ -33,6 +33,7 @@ + part->master->erasesize, + &readlen, instr->erase_buf); + ++ instr->len += instr->erase_buf_ofs; + instr->partial_start = true; + } else { + mtd_ofs = part->offset + part->mtd.size; @@ -70,7 +71,7 @@ return ret; } -@@ -245,7 +294,25 @@ void mtd_erase_callback(struct erase_inf +@@ -245,7 +295,25 @@ void mtd_erase_callback(struct erase_inf { if (instr->mtd->_erase == part_erase) { struct mtd_part *part = PART(instr->mtd); @@ -96,7 +97,7 @@ if (instr->fail_addr != MTD_FAIL_ADDR_UNKNOWN) instr->fail_addr -= part->offset; instr->addr -= part->offset; -@@ -503,18 +570,24 @@ static struct mtd_part *allocate_partiti +@@ -503,18 +571,24 @@ static struct mtd_part *allocate_partiti if ((slave->mtd.flags & MTD_WRITEABLE) && mtd_mod_by_eb(slave->offset, &slave->mtd)) { /* Doesn't start on a boundary of major erase size */ diff --git a/target/linux/generic/patches-3.14/411-mtd-partial_eraseblock_write.patch b/target/linux/generic/patches-3.14/411-mtd-partial_eraseblock_write.patch index 7facf0db1520..8da080b2ade8 100644 --- a/target/linux/generic/patches-3.14/411-mtd-partial_eraseblock_write.patch +++ b/target/linux/generic/patches-3.14/411-mtd-partial_eraseblock_write.patch @@ -9,7 +9,7 @@ /* Our partition linked list */ static LIST_HEAD(mtd_partitions); static DEFINE_MUTEX(mtd_partitions_mutex); -@@ -231,13 +233,60 @@ static int part_erase(struct mtd_info *m +@@ -231,13 +233,61 @@ static int part_erase(struct mtd_info *m struct mtd_part *part = PART(mtd); int ret; @@ -33,6 +33,7 @@ + part->master->erasesize, + &readlen, instr->erase_buf); + ++ instr->len += instr->erase_buf_ofs; + instr->partial_start = true; + } else { + mtd_ofs = part->offset + part->mtd.size; @@ -70,7 +71,7 @@ return ret; } -@@ -245,7 +294,25 @@ void mtd_erase_callback(struct erase_inf +@@ -245,7 +295,25 @@ void mtd_erase_callback(struct erase_inf { if (instr->mtd->_erase == part_erase) { struct mtd_part *part = PART(instr->mtd); @@ -96,7 +97,7 @@ if (instr->fail_addr != MTD_FAIL_ADDR_UNKNOWN) instr->fail_addr -= part->offset; instr->addr -= part->offset; -@@ -503,18 +570,24 @@ static struct mtd_part *allocate_partiti +@@ -503,18 +571,24 @@ static struct mtd_part *allocate_partiti if ((slave->mtd.flags & MTD_WRITEABLE) && mtd_mod_by_eb(slave->offset, &slave->mtd)) { /* Doesn't start on a boundary of major erase size */ diff --git a/target/linux/generic/patches-3.3/401-partial_eraseblock_write.patch b/target/linux/generic/patches-3.3/401-partial_eraseblock_write.patch index 3b22cfcb2599..f9c1c5ea6d93 100644 --- a/target/linux/generic/patches-3.3/401-partial_eraseblock_write.patch +++ b/target/linux/generic/patches-3.3/401-partial_eraseblock_write.patch @@ -9,7 +9,7 @@ /* Our partition linked list */ static LIST_HEAD(mtd_partitions); static DEFINE_MUTEX(mtd_partitions_mutex); -@@ -252,13 +254,60 @@ static int part_erase(struct mtd_info *m +@@ -252,13 +254,61 @@ static int part_erase(struct mtd_info *m return -EROFS; if (instr->addr >= mtd->size) return -EINVAL; @@ -33,6 +33,7 @@ + part->master->erasesize, + &readlen, instr->erase_buf); + ++ instr->len += instr->erase_buf_ofs; + instr->partial_start = true; + } else { + mtd_ofs = part->offset + part->mtd.size; @@ -70,7 +71,7 @@ return ret; } -@@ -266,7 +315,25 @@ void mtd_erase_callback(struct erase_inf +@@ -266,7 +316,25 @@ void mtd_erase_callback(struct erase_inf { if (instr->mtd->erase == part_erase) { struct mtd_part *part = PART(instr->mtd); @@ -96,7 +97,7 @@ if (instr->fail_addr != MTD_FAIL_ADDR_UNKNOWN) instr->fail_addr -= part->offset; instr->addr -= part->offset; -@@ -537,18 +604,24 @@ static struct mtd_part *allocate_partiti +@@ -537,18 +605,24 @@ static struct mtd_part *allocate_partiti if ((slave->mtd.flags & MTD_WRITEABLE) && mtd_mod_by_eb(slave->offset, &slave->mtd)) { /* Doesn't start on a boundary of major erase size */ diff --git a/target/linux/generic/patches-3.6/401-partial_eraseblock_write.patch b/target/linux/generic/patches-3.6/401-partial_eraseblock_write.patch index f2fa3676fbf5..f367e1e9f6f2 100644 --- a/target/linux/generic/patches-3.6/401-partial_eraseblock_write.patch +++ b/target/linux/generic/patches-3.6/401-partial_eraseblock_write.patch @@ -9,7 +9,7 @@ /* Our partition linked list */ static LIST_HEAD(mtd_partitions); static DEFINE_MUTEX(mtd_partitions_mutex); -@@ -230,13 +232,60 @@ static int part_erase(struct mtd_info *m +@@ -230,13 +232,61 @@ static int part_erase(struct mtd_info *m struct mtd_part *part = PART(mtd); int ret; @@ -33,6 +33,7 @@ + part->master->erasesize, + &readlen, instr->erase_buf); + ++ instr->len += instr->erase_buf_ofs; + instr->partial_start = true; + } else { + mtd_ofs = part->offset + part->mtd.size; @@ -70,7 +71,7 @@ return ret; } -@@ -244,7 +293,25 @@ void mtd_erase_callback(struct erase_inf +@@ -244,7 +294,25 @@ void mtd_erase_callback(struct erase_inf { if (instr->mtd->_erase == part_erase) { struct mtd_part *part = PART(instr->mtd); @@ -96,7 +97,7 @@ if (instr->fail_addr != MTD_FAIL_ADDR_UNKNOWN) instr->fail_addr -= part->offset; instr->addr -= part->offset; -@@ -504,18 +571,24 @@ static struct mtd_part *allocate_partiti +@@ -504,18 +572,24 @@ static struct mtd_part *allocate_partiti if ((slave->mtd.flags & MTD_WRITEABLE) && mtd_mod_by_eb(slave->offset, &slave->mtd)) { /* Doesn't start on a boundary of major erase size */ diff --git a/target/linux/generic/patches-3.8/401-partial_eraseblock_write.patch b/target/linux/generic/patches-3.8/401-partial_eraseblock_write.patch index f2fa3676fbf5..f367e1e9f6f2 100644 --- a/target/linux/generic/patches-3.8/401-partial_eraseblock_write.patch +++ b/target/linux/generic/patches-3.8/401-partial_eraseblock_write.patch @@ -9,7 +9,7 @@ /* Our partition linked list */ static LIST_HEAD(mtd_partitions); static DEFINE_MUTEX(mtd_partitions_mutex); -@@ -230,13 +232,60 @@ static int part_erase(struct mtd_info *m +@@ -230,13 +232,61 @@ static int part_erase(struct mtd_info *m struct mtd_part *part = PART(mtd); int ret; @@ -33,6 +33,7 @@ + part->master->erasesize, + &readlen, instr->erase_buf); + ++ instr->len += instr->erase_buf_ofs; + instr->partial_start = true; + } else { + mtd_ofs = part->offset + part->mtd.size; @@ -70,7 +71,7 @@ return ret; } -@@ -244,7 +293,25 @@ void mtd_erase_callback(struct erase_inf +@@ -244,7 +294,25 @@ void mtd_erase_callback(struct erase_inf { if (instr->mtd->_erase == part_erase) { struct mtd_part *part = PART(instr->mtd); @@ -96,7 +97,7 @@ if (instr->fail_addr != MTD_FAIL_ADDR_UNKNOWN) instr->fail_addr -= part->offset; instr->addr -= part->offset; -@@ -504,18 +571,24 @@ static struct mtd_part *allocate_partiti +@@ -504,18 +572,24 @@ static struct mtd_part *allocate_partiti if ((slave->mtd.flags & MTD_WRITEABLE) && mtd_mod_by_eb(slave->offset, &slave->mtd)) { /* Doesn't start on a boundary of major erase size */ diff --git a/target/linux/generic/patches-3.9/401-partial_eraseblock_write.patch b/target/linux/generic/patches-3.9/401-partial_eraseblock_write.patch index f2fa3676fbf5..f367e1e9f6f2 100644 --- a/target/linux/generic/patches-3.9/401-partial_eraseblock_write.patch +++ b/target/linux/generic/patches-3.9/401-partial_eraseblock_write.patch @@ -9,7 +9,7 @@ /* Our partition linked list */ static LIST_HEAD(mtd_partitions); static DEFINE_MUTEX(mtd_partitions_mutex); -@@ -230,13 +232,60 @@ static int part_erase(struct mtd_info *m +@@ -230,13 +232,61 @@ static int part_erase(struct mtd_info *m struct mtd_part *part = PART(mtd); int ret; @@ -33,6 +33,7 @@ + part->master->erasesize, + &readlen, instr->erase_buf); + ++ instr->len += instr->erase_buf_ofs; + instr->partial_start = true; + } else { + mtd_ofs = part->offset + part->mtd.size; @@ -70,7 +71,7 @@ return ret; } -@@ -244,7 +293,25 @@ void mtd_erase_callback(struct erase_inf +@@ -244,7 +294,25 @@ void mtd_erase_callback(struct erase_inf { if (instr->mtd->_erase == part_erase) { struct mtd_part *part = PART(instr->mtd); @@ -96,7 +97,7 @@ if (instr->fail_addr != MTD_FAIL_ADDR_UNKNOWN) instr->fail_addr -= part->offset; instr->addr -= part->offset; -@@ -504,18 +571,24 @@ static struct mtd_part *allocate_partiti +@@ -504,18 +572,24 @@ static struct mtd_part *allocate_partiti if ((slave->mtd.flags & MTD_WRITEABLE) && mtd_mod_by_eb(slave->offset, &slave->mtd)) { /* Doesn't start on a boundary of major erase size */ -- 2.30.2