summaryrefslogtreecommitdiffstats
path: root/target/linux/sunxi/patches-4.1/114-mtd-randomizer-into-nand-framework.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/sunxi/patches-4.1/114-mtd-randomizer-into-nand-framework.patch')
-rw-r--r--target/linux/sunxi/patches-4.1/114-mtd-randomizer-into-nand-framework.patch84
1 files changed, 40 insertions, 44 deletions
diff --git a/target/linux/sunxi/patches-4.1/114-mtd-randomizer-into-nand-framework.patch b/target/linux/sunxi/patches-4.1/114-mtd-randomizer-into-nand-framework.patch
index 7d1bdbd9aa..173bd1eb49 100644
--- a/target/linux/sunxi/patches-4.1/114-mtd-randomizer-into-nand-framework.patch
+++ b/target/linux/sunxi/patches-4.1/114-mtd-randomizer-into-nand-framework.patch
@@ -34,11 +34,9 @@ Signed-off-by: Hans de Goede <hdegoede@redhat.com>
include/linux/mtd/nand.h | 98 +++++++++++++++
2 files changed, 321 insertions(+), 55 deletions(-)
-diff --git a/drivers/mtd/nand/nand_base.c b/drivers/mtd/nand/nand_base.c
-index 8a5d12e..577cb9e 100644
--- a/drivers/mtd/nand/nand_base.c
+++ b/drivers/mtd/nand/nand_base.c
-@@ -1102,6 +1102,62 @@ int nand_lock(struct mtd_info *mtd, loff_t ofs, uint64_t len)
+@@ -1102,6 +1102,62 @@ out:
EXPORT_SYMBOL(nand_lock);
/**
@@ -119,7 +117,7 @@ index 8a5d12e..577cb9e 100644
return 0;
}
-@@ -1270,28 +1331,40 @@ static int nand_read_page_raw_syndrome(struct mtd_info *mtd,
+@@ -1270,28 +1331,40 @@ static int nand_read_page_raw_syndrome(s
int eccbytes = chip->cur_ecc->bytes;
uint8_t *oob = chip->oob_poi;
int steps, size;
@@ -166,7 +164,7 @@ index 8a5d12e..577cb9e 100644
return 0;
}
-@@ -1380,7 +1453,8 @@ static int nand_read_subpage(struct mtd_info *mtd, struct nand_chip *chip,
+@@ -1380,7 +1453,8 @@ static int nand_read_subpage(struct mtd_
chip->cmdfunc(mtd, NAND_CMD_RNDOUT, data_col_addr, -1);
p = bufpoi + data_col_addr;
@@ -176,7 +174,7 @@ index 8a5d12e..577cb9e 100644
/* Calculate ECC */
for (i = 0; i < eccfrag_len;
-@@ -1399,7 +1473,8 @@ static int nand_read_subpage(struct mtd_info *mtd, struct nand_chip *chip,
+@@ -1399,7 +1473,8 @@ static int nand_read_subpage(struct mtd_
}
if (gaps) {
chip->cmdfunc(mtd, NAND_CMD_RNDOUT, mtd->writesize, -1);
@@ -186,7 +184,7 @@ index 8a5d12e..577cb9e 100644
} else {
/*
* Send the command to read the particular ECC bytes take care
-@@ -1415,7 +1490,8 @@ static int nand_read_subpage(struct mtd_info *mtd, struct nand_chip *chip,
+@@ -1415,7 +1490,8 @@ static int nand_read_subpage(struct mtd_
chip->cmdfunc(mtd, NAND_CMD_RNDOUT,
mtd->writesize + aligned_pos, -1);
@@ -196,7 +194,7 @@ index 8a5d12e..577cb9e 100644
}
for (i = 0; i < eccfrag_len; i++)
-@@ -1436,6 +1512,7 @@ static int nand_read_subpage(struct mtd_info *mtd, struct nand_chip *chip,
+@@ -1436,6 +1512,7 @@ static int nand_read_subpage(struct mtd_
max_bitflips = max_t(unsigned int, max_bitflips, stat);
}
}
@@ -204,7 +202,7 @@ index 8a5d12e..577cb9e 100644
return max_bitflips;
}
-@@ -1460,13 +1537,17 @@ static int nand_read_page_hwecc(struct mtd_info *mtd, struct nand_chip *chip,
+@@ -1460,13 +1537,17 @@ static int nand_read_page_hwecc(struct m
uint8_t *ecc_code = chip->buffers->ecccode;
uint32_t *eccpos = chip->cur_ecc->layout->eccpos;
unsigned int max_bitflips = 0;
@@ -224,7 +222,7 @@ index 8a5d12e..577cb9e 100644
for (i = 0; i < chip->cur_ecc->total; i++)
ecc_code[i] = chip->oob_poi[eccpos[i]];
-@@ -1486,6 +1567,7 @@ static int nand_read_page_hwecc(struct mtd_info *mtd, struct nand_chip *chip,
+@@ -1486,6 +1567,7 @@ static int nand_read_page_hwecc(struct m
max_bitflips = max_t(unsigned int, max_bitflips, stat);
}
}
@@ -232,7 +230,7 @@ index 8a5d12e..577cb9e 100644
return max_bitflips;
}
-@@ -1514,11 +1596,14 @@ static int nand_read_page_hwecc_oob_first(struct mtd_info *mtd,
+@@ -1514,11 +1596,14 @@ static int nand_read_page_hwecc_oob_firs
uint32_t *eccpos = chip->cur_ecc->layout->eccpos;
uint8_t *ecc_calc = chip->buffers->ecccalc;
unsigned int max_bitflips = 0;
@@ -248,7 +246,7 @@ index 8a5d12e..577cb9e 100644
for (i = 0; i < chip->cur_ecc->total; i++)
ecc_code[i] = chip->oob_poi[eccpos[i]];
-@@ -1527,7 +1612,8 @@ static int nand_read_page_hwecc_oob_first(struct mtd_info *mtd,
+@@ -1527,7 +1612,8 @@ static int nand_read_page_hwecc_oob_firs
int stat;
chip->cur_ecc->hwctl(mtd, NAND_ECC_READ);
@@ -258,7 +256,7 @@ index 8a5d12e..577cb9e 100644
chip->cur_ecc->calculate(mtd, p, &ecc_calc[i]);
stat = chip->cur_ecc->correct(mtd, p, &ecc_code[i], NULL);
-@@ -1538,6 +1624,7 @@ static int nand_read_page_hwecc_oob_first(struct mtd_info *mtd,
+@@ -1538,6 +1624,7 @@ static int nand_read_page_hwecc_oob_firs
max_bitflips = max_t(unsigned int, max_bitflips, stat);
}
}
@@ -266,7 +264,7 @@ index 8a5d12e..577cb9e 100644
return max_bitflips;
}
-@@ -1561,20 +1648,27 @@ static int nand_read_page_syndrome(struct mtd_info *mtd, struct nand_chip *chip,
+@@ -1561,20 +1648,27 @@ static int nand_read_page_syndrome(struc
uint8_t *p = buf;
uint8_t *oob = chip->oob_poi;
unsigned int max_bitflips = 0;
@@ -297,7 +295,7 @@ index 8a5d12e..577cb9e 100644
stat = chip->cur_ecc->correct(mtd, p, oob, NULL);
if (stat < 0) {
-@@ -1587,29 +1681,36 @@ static int nand_read_page_syndrome(struct mtd_info *mtd, struct nand_chip *chip,
+@@ -1587,29 +1681,36 @@ static int nand_read_page_syndrome(struc
oob += eccbytes;
if (chip->cur_ecc->postpad) {
@@ -339,7 +337,7 @@ index 8a5d12e..577cb9e 100644
switch (ops->mode) {
case MTD_OPS_PLACE_OOB:
-@@ -1737,6 +1838,7 @@ static int nand_do_read_ops(struct mtd_info *mtd, loff_t from,
+@@ -1737,6 +1838,7 @@ read_retry:
* Now read the page into the buffer. Absent an error,
* the read methods return max bitflips per ecc step.
*/
@@ -347,7 +345,7 @@ index 8a5d12e..577cb9e 100644
if (unlikely(ops->mode == MTD_OPS_RAW))
ret = chip->cur_ecc->read_page_raw(mtd, chip,
bufpoi,
-@@ -1753,6 +1855,8 @@ static int nand_do_read_ops(struct mtd_info *mtd, loff_t from,
+@@ -1753,6 +1855,8 @@ read_retry:
bufpoi,
oob_required,
page);
@@ -356,7 +354,7 @@ index 8a5d12e..577cb9e 100644
if (ret < 0) {
if (use_bufpoi)
/* Invalidate page cache */
-@@ -1780,8 +1884,8 @@ static int nand_do_read_ops(struct mtd_info *mtd, loff_t from,
+@@ -1780,8 +1884,8 @@ read_retry:
int toread = min(oobreadlen, max_oobsize);
if (toread) {
@@ -367,7 +365,7 @@ index 8a5d12e..577cb9e 100644
oobreadlen -= toread;
}
}
-@@ -1909,12 +2013,15 @@ static int nand_part_read(struct mtd_info *mtd, loff_t from, size_t len,
+@@ -1909,12 +2013,15 @@ static int nand_part_read(struct mtd_inf
nand_get_device(part->master, FL_READING);
if (part->ecc)
chip->cur_ecc = part->ecc;
@@ -383,7 +381,7 @@ index 8a5d12e..577cb9e 100644
chip->cur_ecc = &chip->ecc;
nand_release_device(part->master);
return ret;
-@@ -1930,7 +2037,9 @@ static int nand_read_oob_std(struct mtd_info *mtd, struct nand_chip *chip,
+@@ -1930,7 +2037,9 @@ static int nand_read_oob_std(struct mtd_
int page)
{
chip->cmdfunc(mtd, NAND_CMD_READOOB, 0, page);
@@ -394,7 +392,7 @@ index 8a5d12e..577cb9e 100644
return 0;
}
-@@ -1949,7 +2058,7 @@ static int nand_read_oob_syndrome(struct mtd_info *mtd, struct nand_chip *chip,
+@@ -1949,7 +2058,7 @@ static int nand_read_oob_syndrome(struct
chip->cur_ecc->postpad;
int eccsize = chip->cur_ecc->size;
uint8_t *bufpoi = chip->oob_poi;
@@ -403,7 +401,7 @@ index 8a5d12e..577cb9e 100644
chip->cmdfunc(mtd, NAND_CMD_READ0, chip->cur_ecc->size, page);
for (i = 0; i < chip->cur_ecc->steps; i++) {
-@@ -1962,12 +2071,17 @@ static int nand_read_oob_syndrome(struct mtd_info *mtd, struct nand_chip *chip,
+@@ -1962,12 +2071,17 @@ static int nand_read_oob_syndrome(struct
} else
sndrnd = 1;
toread = min_t(int, length, chunk);
@@ -424,7 +422,7 @@ index 8a5d12e..577cb9e 100644
return 0;
}
-@@ -1986,7 +2100,9 @@ static int nand_write_oob_std(struct mtd_info *mtd, struct nand_chip *chip,
+@@ -1986,7 +2100,9 @@ static int nand_write_oob_std(struct mtd
int length = mtd->oobsize;
chip->cmdfunc(mtd, NAND_CMD_SEQIN, mtd->writesize, page);
@@ -435,7 +433,7 @@ index 8a5d12e..577cb9e 100644
/* Send command to program the OOB data */
chip->cmdfunc(mtd, NAND_CMD_PAGEPROG, -1, -1);
-@@ -2042,12 +2158,18 @@ static int nand_write_oob_syndrome(struct mtd_info *mtd,
+@@ -2042,12 +2158,18 @@ static int nand_write_oob_syndrome(struc
} else
sndcmd = 1;
len = min_t(int, length, chunk);
@@ -457,7 +455,7 @@ index 8a5d12e..577cb9e 100644
chip->cmdfunc(mtd, NAND_CMD_PAGEPROG, -1, -1);
status = chip->waitfunc(mtd, chip);
-@@ -2116,7 +2238,7 @@ static int nand_do_read_oob(struct mtd_info *mtd, loff_t from,
+@@ -2116,7 +2238,7 @@ static int nand_do_read_oob(struct mtd_i
break;
len = min(len, readlen);
@@ -466,7 +464,7 @@ index 8a5d12e..577cb9e 100644
if (chip->options & NAND_NEED_READRDY) {
/* Apply delay or wait for ready/busy pin */
-@@ -2226,6 +2348,8 @@ static int nand_part_read_oob(struct mtd_info *mtd, loff_t from,
+@@ -2226,6 +2348,8 @@ static int nand_part_read_oob(struct mtd
nand_get_device(part->master, FL_READING);
if (part->ecc)
chip->cur_ecc = part->ecc;
@@ -475,7 +473,7 @@ index 8a5d12e..577cb9e 100644
switch (ops->mode) {
case MTD_OPS_PLACE_OOB:
-@@ -2243,6 +2367,7 @@ static int nand_part_read_oob(struct mtd_info *mtd, loff_t from,
+@@ -2243,6 +2367,7 @@ static int nand_part_read_oob(struct mtd
ret = nand_do_read_ops(part->master, from, ops);
out:
@@ -483,7 +481,7 @@ index 8a5d12e..577cb9e 100644
chip->cur_ecc = &chip->ecc;
nand_release_device(part->master);
return ret;
-@@ -2261,9 +2386,11 @@ static int nand_part_read_oob(struct mtd_info *mtd, loff_t from,
+@@ -2261,9 +2386,11 @@ out:
static int nand_write_page_raw(struct mtd_info *mtd, struct nand_chip *chip,
const uint8_t *buf, int oob_required)
{
@@ -498,7 +496,7 @@ index 8a5d12e..577cb9e 100644
return 0;
}
-@@ -2285,28 +2412,39 @@ static int nand_write_page_raw_syndrome(struct mtd_info *mtd,
+@@ -2285,28 +2412,39 @@ static int nand_write_page_raw_syndrome(
int eccbytes = chip->cur_ecc->bytes;
uint8_t *oob = chip->oob_poi;
int steps, size;
@@ -544,7 +542,7 @@ index 8a5d12e..577cb9e 100644
return 0;
}
-@@ -2353,17 +2491,21 @@ static int nand_write_page_hwecc(struct mtd_info *mtd, struct nand_chip *chip,
+@@ -2353,17 +2491,21 @@ static int nand_write_page_hwecc(struct
uint8_t *ecc_calc = chip->buffers->ecccalc;
const uint8_t *p = buf;
uint32_t *eccpos = chip->cur_ecc->layout->eccpos;
@@ -568,7 +566,7 @@ index 8a5d12e..577cb9e 100644
return 0;
}
-@@ -2399,7 +2541,9 @@ static int nand_write_subpage_hwecc(struct mtd_info *mtd,
+@@ -2399,7 +2541,9 @@ static int nand_write_subpage_hwecc(stru
chip->cur_ecc->hwctl(mtd, NAND_ECC_WRITE);
/* write data (untouched subpages already masked by 0xFF) */
@@ -579,7 +577,7 @@ index 8a5d12e..577cb9e 100644
/* mask ECC of un-touched subpages by padding 0xFF */
if ((step < start_step) || (step > end_step))
-@@ -2424,7 +2568,8 @@ static int nand_write_subpage_hwecc(struct mtd_info *mtd,
+@@ -2424,7 +2568,8 @@ static int nand_write_subpage_hwecc(stru
chip->oob_poi[eccpos[i]] = ecc_calc[i];
/* write OOB buffer to NAND device */
@@ -589,7 +587,7 @@ index 8a5d12e..577cb9e 100644
return 0;
}
-@@ -2449,31 +2594,42 @@ static int nand_write_page_syndrome(struct mtd_info *mtd,
+@@ -2449,31 +2594,42 @@ static int nand_write_page_syndrome(stru
int eccsteps = chip->cur_ecc->steps;
const uint8_t *p = buf;
uint8_t *oob = chip->oob_poi;
@@ -638,7 +636,7 @@ index 8a5d12e..577cb9e 100644
return 0;
}
-@@ -2504,6 +2660,7 @@ static int nand_write_page(struct mtd_info *mtd, struct nand_chip *chip,
+@@ -2504,6 +2660,7 @@ static int nand_write_page(struct mtd_in
chip->cmdfunc(mtd, NAND_CMD_SEQIN, 0x00, page);
@@ -646,7 +644,7 @@ index 8a5d12e..577cb9e 100644
if (unlikely(raw))
status = chip->cur_ecc->write_page_raw(mtd, chip, buf,
oob_required);
-@@ -2514,6 +2671,7 @@ static int nand_write_page(struct mtd_info *mtd, struct nand_chip *chip,
+@@ -2514,6 +2671,7 @@ static int nand_write_page(struct mtd_in
else
status = chip->cur_ecc->write_page(mtd, chip, buf,
oob_required);
@@ -654,7 +652,7 @@ index 8a5d12e..577cb9e 100644
if (status < 0)
return status;
-@@ -2803,6 +2961,8 @@ static int panic_nand_part_write(struct mtd_info *mtd, loff_t to, size_t len,
+@@ -2803,6 +2961,8 @@ static int panic_nand_part_write(struct
panic_nand_get_device(chip, part->master, FL_WRITING);
if (part->ecc)
chip->cur_ecc = part->ecc;
@@ -663,7 +661,7 @@ index 8a5d12e..577cb9e 100644
ops.len = len;
ops.datbuf = (uint8_t *)buf;
-@@ -2811,6 +2971,7 @@ static int panic_nand_part_write(struct mtd_info *mtd, loff_t to, size_t len,
+@@ -2811,6 +2971,7 @@ static int panic_nand_part_write(struct
ret = nand_do_write_ops(part->master, to, &ops);
@@ -671,7 +669,7 @@ index 8a5d12e..577cb9e 100644
chip->cur_ecc = &chip->ecc;
*retlen = ops.retlen;
return ret;
-@@ -2865,12 +3026,15 @@ static int nand_part_write(struct mtd_info *mtd, loff_t to, size_t len,
+@@ -2865,12 +3026,15 @@ static int nand_part_write(struct mtd_in
nand_get_device(part->master, FL_WRITING);
if (part->ecc)
chip->cur_ecc = part->ecc;
@@ -687,7 +685,7 @@ index 8a5d12e..577cb9e 100644
chip->cur_ecc = &chip->ecc;
nand_release_device(part->master);
return ret;
-@@ -3032,6 +3196,8 @@ static int nand_part_write_oob(struct mtd_info *mtd, loff_t to,
+@@ -3032,6 +3196,8 @@ static int nand_part_write_oob(struct mt
nand_get_device(part->master, FL_WRITING);
if (part->ecc)
chip->cur_ecc = part->ecc;
@@ -696,7 +694,7 @@ index 8a5d12e..577cb9e 100644
switch (ops->mode) {
case MTD_OPS_PLACE_OOB:
-@@ -3049,6 +3215,7 @@ static int nand_part_write_oob(struct mtd_info *mtd, loff_t to,
+@@ -3049,6 +3215,7 @@ static int nand_part_write_oob(struct mt
ret = nand_do_write_ops(part->master, to, ops);
out:
@@ -712,11 +710,9 @@ index 8a5d12e..577cb9e 100644
/* Allow subpage writes up to ecc.steps. Not possible for MLC flash */
if (!(chip->options & NAND_NO_SUBPAGE_WRITE) && nand_is_slc(chip)) {
-diff --git a/include/linux/mtd/nand.h b/include/linux/mtd/nand.h
-index 4f7ca8d..6cbd06a3 100644
--- a/include/linux/mtd/nand.h
+++ b/include/linux/mtd/nand.h
-@@ -539,6 +539,64 @@ void nand_page_set_status(struct mtd_info *mtd, int page,
+@@ -539,6 +539,64 @@ void nand_page_set_status(struct mtd_inf
int nand_pst_create(struct mtd_info *mtd);
@@ -807,7 +803,7 @@ index 4f7ca8d..6cbd06a3 100644
void (*release)(struct nand_part *part);
};
-@@ -902,6 +965,41 @@ extern int nand_erase_nand(struct mtd_info *mtd, struct erase_info *instr,
+@@ -902,6 +965,41 @@ extern int nand_erase_nand(struct mtd_in
extern int nand_do_read(struct mtd_info *mtd, loff_t from, size_t len,
size_t *retlen, uint8_t *buf);