|
@@ -1911,12 +1911,14 @@ out:
|
|
|
*
|
|
|
* Not for syndrome calculating ECC controllers, which use a special oob layout.
|
|
|
*/
|
|
|
-static void nand_write_page_raw(struct mtd_info *mtd, struct nand_chip *chip,
|
|
|
+static int nand_write_page_raw(struct mtd_info *mtd, struct nand_chip *chip,
|
|
|
const uint8_t *buf, int oob_required)
|
|
|
{
|
|
|
chip->write_buf(mtd, buf, mtd->writesize);
|
|
|
if (oob_required)
|
|
|
chip->write_buf(mtd, chip->oob_poi, mtd->oobsize);
|
|
|
+
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -1928,7 +1930,7 @@ static void nand_write_page_raw(struct mtd_info *mtd, struct nand_chip *chip,
|
|
|
*
|
|
|
* We need a special oob layout and handling even when ECC isn't checked.
|
|
|
*/
|
|
|
-static void nand_write_page_raw_syndrome(struct mtd_info *mtd,
|
|
|
+static int nand_write_page_raw_syndrome(struct mtd_info *mtd,
|
|
|
struct nand_chip *chip,
|
|
|
const uint8_t *buf, int oob_required)
|
|
|
{
|
|
@@ -1958,6 +1960,8 @@ static void nand_write_page_raw_syndrome(struct mtd_info *mtd,
|
|
|
size = mtd->oobsize - (oob - chip->oob_poi);
|
|
|
if (size)
|
|
|
chip->write_buf(mtd, oob, size);
|
|
|
+
|
|
|
+ return 0;
|
|
|
}
|
|
|
/**
|
|
|
* nand_write_page_swecc - [REPLACEABLE] software ECC based page write function
|
|
@@ -1966,7 +1970,7 @@ static void nand_write_page_raw_syndrome(struct mtd_info *mtd,
|
|
|
* @buf: data buffer
|
|
|
* @oob_required: must write chip->oob_poi to OOB
|
|
|
*/
|
|
|
-static void nand_write_page_swecc(struct mtd_info *mtd, struct nand_chip *chip,
|
|
|
+static int nand_write_page_swecc(struct mtd_info *mtd, struct nand_chip *chip,
|
|
|
const uint8_t *buf, int oob_required)
|
|
|
{
|
|
|
int i, eccsize = chip->ecc.size;
|
|
@@ -1983,7 +1987,7 @@ static void nand_write_page_swecc(struct mtd_info *mtd, struct nand_chip *chip,
|
|
|
for (i = 0; i < chip->ecc.total; i++)
|
|
|
chip->oob_poi[eccpos[i]] = ecc_calc[i];
|
|
|
|
|
|
- chip->ecc.write_page_raw(mtd, chip, buf, 1);
|
|
|
+ return chip->ecc.write_page_raw(mtd, chip, buf, 1);
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -1993,7 +1997,7 @@ static void nand_write_page_swecc(struct mtd_info *mtd, struct nand_chip *chip,
|
|
|
* @buf: data buffer
|
|
|
* @oob_required: must write chip->oob_poi to OOB
|
|
|
*/
|
|
|
-static void nand_write_page_hwecc(struct mtd_info *mtd, struct nand_chip *chip,
|
|
|
+static int nand_write_page_hwecc(struct mtd_info *mtd, struct nand_chip *chip,
|
|
|
const uint8_t *buf, int oob_required)
|
|
|
{
|
|
|
int i, eccsize = chip->ecc.size;
|
|
@@ -2013,6 +2017,8 @@ static void nand_write_page_hwecc(struct mtd_info *mtd, struct nand_chip *chip,
|
|
|
chip->oob_poi[eccpos[i]] = ecc_calc[i];
|
|
|
|
|
|
chip->write_buf(mtd, chip->oob_poi, mtd->oobsize);
|
|
|
+
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -2025,7 +2031,7 @@ static void nand_write_page_hwecc(struct mtd_info *mtd, struct nand_chip *chip,
|
|
|
* The hw generator calculates the error syndrome automatically. Therefore we
|
|
|
* need a special oob layout and handling.
|
|
|
*/
|
|
|
-static void nand_write_page_syndrome(struct mtd_info *mtd,
|
|
|
+static int nand_write_page_syndrome(struct mtd_info *mtd,
|
|
|
struct nand_chip *chip,
|
|
|
const uint8_t *buf, int oob_required)
|
|
|
{
|
|
@@ -2059,6 +2065,8 @@ static void nand_write_page_syndrome(struct mtd_info *mtd,
|
|
|
i = mtd->oobsize - (oob - chip->oob_poi);
|
|
|
if (i)
|
|
|
chip->write_buf(mtd, oob, i);
|
|
|
+
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -2080,9 +2088,12 @@ static int nand_write_page(struct mtd_info *mtd, struct nand_chip *chip,
|
|
|
chip->cmdfunc(mtd, NAND_CMD_SEQIN, 0x00, page);
|
|
|
|
|
|
if (unlikely(raw))
|
|
|
- chip->ecc.write_page_raw(mtd, chip, buf, oob_required);
|
|
|
+ status = chip->ecc.write_page_raw(mtd, chip, buf, oob_required);
|
|
|
else
|
|
|
- chip->ecc.write_page(mtd, chip, buf, oob_required);
|
|
|
+ status = chip->ecc.write_page(mtd, chip, buf, oob_required);
|
|
|
+
|
|
|
+ if (status < 0)
|
|
|
+ return status;
|
|
|
|
|
|
/*
|
|
|
* Cached progamming disabled for now. Not sure if it's worth the
|