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 b7152110b2..9407411207 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 7facf0db15..8da080b2ad 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 7facf0db15..8da080b2ad 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 3b22cfcb25..f9c1c5ea6d 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 f2fa3676fb..f367e1e9f6 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 f2fa3676fb..f367e1e9f6 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 f2fa3676fb..f367e1e9f6 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 */