|
@@ -2155,11 +2155,12 @@ out:
|
|
|
* @chip: nand chip info structure
|
|
|
* @buf: data buffer
|
|
|
* @oob_required: must write chip->oob_poi to OOB
|
|
|
+ * @page: page number to write
|
|
|
*
|
|
|
* Not for syndrome calculating ECC controllers, which use a special oob layout.
|
|
|
*/
|
|
|
static int nand_write_page_raw(struct mtd_info *mtd, struct nand_chip *chip,
|
|
|
- const uint8_t *buf, int oob_required)
|
|
|
+ const uint8_t *buf, int oob_required, int page)
|
|
|
{
|
|
|
chip->write_buf(mtd, buf, mtd->writesize);
|
|
|
if (oob_required)
|
|
@@ -2174,12 +2175,14 @@ static int nand_write_page_raw(struct mtd_info *mtd, struct nand_chip *chip,
|
|
|
* @chip: nand chip info structure
|
|
|
* @buf: data buffer
|
|
|
* @oob_required: must write chip->oob_poi to OOB
|
|
|
+ * @page: page number to write
|
|
|
*
|
|
|
* We need a special oob layout and handling even when ECC isn't checked.
|
|
|
*/
|
|
|
static int nand_write_page_raw_syndrome(struct mtd_info *mtd,
|
|
|
struct nand_chip *chip,
|
|
|
- const uint8_t *buf, int oob_required)
|
|
|
+ const uint8_t *buf, int oob_required,
|
|
|
+ int page)
|
|
|
{
|
|
|
int eccsize = chip->ecc.size;
|
|
|
int eccbytes = chip->ecc.bytes;
|
|
@@ -2216,9 +2219,11 @@ static int nand_write_page_raw_syndrome(struct mtd_info *mtd,
|
|
|
* @chip: nand chip info structure
|
|
|
* @buf: data buffer
|
|
|
* @oob_required: must write chip->oob_poi to OOB
|
|
|
+ * @page: page number to write
|
|
|
*/
|
|
|
static int nand_write_page_swecc(struct mtd_info *mtd, struct nand_chip *chip,
|
|
|
- const uint8_t *buf, int oob_required)
|
|
|
+ const uint8_t *buf, int oob_required,
|
|
|
+ int page)
|
|
|
{
|
|
|
int i, eccsize = chip->ecc.size;
|
|
|
int eccbytes = chip->ecc.bytes;
|
|
@@ -2234,7 +2239,7 @@ static int 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];
|
|
|
|
|
|
- return chip->ecc.write_page_raw(mtd, chip, buf, 1);
|
|
|
+ return chip->ecc.write_page_raw(mtd, chip, buf, 1, page);
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -2243,9 +2248,11 @@ static int nand_write_page_swecc(struct mtd_info *mtd, struct nand_chip *chip,
|
|
|
* @chip: nand chip info structure
|
|
|
* @buf: data buffer
|
|
|
* @oob_required: must write chip->oob_poi to OOB
|
|
|
+ * @page: page number to write
|
|
|
*/
|
|
|
static int nand_write_page_hwecc(struct mtd_info *mtd, struct nand_chip *chip,
|
|
|
- const uint8_t *buf, int oob_required)
|
|
|
+ const uint8_t *buf, int oob_required,
|
|
|
+ int page)
|
|
|
{
|
|
|
int i, eccsize = chip->ecc.size;
|
|
|
int eccbytes = chip->ecc.bytes;
|
|
@@ -2277,11 +2284,12 @@ static int nand_write_page_hwecc(struct mtd_info *mtd, struct nand_chip *chip,
|
|
|
* @data_len: data length
|
|
|
* @buf: data buffer
|
|
|
* @oob_required: must write chip->oob_poi to OOB
|
|
|
+ * @page: page number to write
|
|
|
*/
|
|
|
static int nand_write_subpage_hwecc(struct mtd_info *mtd,
|
|
|
struct nand_chip *chip, uint32_t offset,
|
|
|
uint32_t data_len, const uint8_t *buf,
|
|
|
- int oob_required)
|
|
|
+ int oob_required, int page)
|
|
|
{
|
|
|
uint8_t *oob_buf = chip->oob_poi;
|
|
|
uint8_t *ecc_calc = chip->buffers->ecccalc;
|
|
@@ -2336,13 +2344,15 @@ static int nand_write_subpage_hwecc(struct mtd_info *mtd,
|
|
|
* @chip: nand chip info structure
|
|
|
* @buf: data buffer
|
|
|
* @oob_required: must write chip->oob_poi to OOB
|
|
|
+ * @page: page number to write
|
|
|
*
|
|
|
* The hw generator calculates the error syndrome automatically. Therefore we
|
|
|
* need a special oob layout and handling.
|
|
|
*/
|
|
|
static int nand_write_page_syndrome(struct mtd_info *mtd,
|
|
|
struct nand_chip *chip,
|
|
|
- const uint8_t *buf, int oob_required)
|
|
|
+ const uint8_t *buf, int oob_required,
|
|
|
+ int page)
|
|
|
{
|
|
|
int i, eccsize = chip->ecc.size;
|
|
|
int eccbytes = chip->ecc.bytes;
|
|
@@ -2406,12 +2416,13 @@ static int nand_write_page(struct mtd_info *mtd, struct nand_chip *chip,
|
|
|
|
|
|
if (unlikely(raw))
|
|
|
status = chip->ecc.write_page_raw(mtd, chip, buf,
|
|
|
- oob_required);
|
|
|
+ oob_required, page);
|
|
|
else if (subpage)
|
|
|
status = chip->ecc.write_subpage(mtd, chip, offset, data_len,
|
|
|
- buf, oob_required);
|
|
|
+ buf, oob_required, page);
|
|
|
else
|
|
|
- status = chip->ecc.write_page(mtd, chip, buf, oob_required);
|
|
|
+ status = chip->ecc.write_page(mtd, chip, buf, oob_required,
|
|
|
+ page);
|
|
|
|
|
|
if (status < 0)
|
|
|
return status;
|