|
@@ -2064,11 +2064,9 @@ static int qcom_nandc_write_page_raw(struct mtd_info *mtd,
|
|
/*
|
|
/*
|
|
* implements ecc->write_oob()
|
|
* implements ecc->write_oob()
|
|
*
|
|
*
|
|
- * the NAND controller cannot write only data or only oob within a codeword,
|
|
|
|
- * since ecc is calculated for the combined codeword. we first copy the
|
|
|
|
- * entire contents for the last codeword(data + oob), replace the old oob
|
|
|
|
- * with the new one in chip->oob_poi, and then write the entire codeword.
|
|
|
|
- * this read-copy-write operation results in a slight performance loss.
|
|
|
|
|
|
+ * the NAND controller cannot write only data or only OOB within a codeword
|
|
|
|
+ * since ECC is calculated for the combined codeword. So update the OOB from
|
|
|
|
+ * chip->oob_poi, and pad the data area with OxFF before writing.
|
|
*/
|
|
*/
|
|
static int qcom_nandc_write_oob(struct mtd_info *mtd, struct nand_chip *chip,
|
|
static int qcom_nandc_write_oob(struct mtd_info *mtd, struct nand_chip *chip,
|
|
int page)
|
|
int page)
|
|
@@ -2081,19 +2079,13 @@ static int qcom_nandc_write_oob(struct mtd_info *mtd, struct nand_chip *chip,
|
|
int ret;
|
|
int ret;
|
|
|
|
|
|
host->use_ecc = true;
|
|
host->use_ecc = true;
|
|
-
|
|
|
|
- clear_bam_transaction(nandc);
|
|
|
|
- ret = copy_last_cw(host, page);
|
|
|
|
- if (ret)
|
|
|
|
- return ret;
|
|
|
|
-
|
|
|
|
- clear_read_regs(nandc);
|
|
|
|
clear_bam_transaction(nandc);
|
|
clear_bam_transaction(nandc);
|
|
|
|
|
|
/* calculate the data and oob size for the last codeword/step */
|
|
/* calculate the data and oob size for the last codeword/step */
|
|
data_size = ecc->size - ((ecc->steps - 1) << 2);
|
|
data_size = ecc->size - ((ecc->steps - 1) << 2);
|
|
oob_size = mtd->oobavail;
|
|
oob_size = mtd->oobavail;
|
|
|
|
|
|
|
|
+ memset(nandc->data_buffer, 0xff, host->cw_data);
|
|
/* override new oob content to last codeword */
|
|
/* override new oob content to last codeword */
|
|
mtd_ooblayout_get_databytes(mtd, nandc->data_buffer + data_size, oob,
|
|
mtd_ooblayout_get_databytes(mtd, nandc->data_buffer + data_size, oob,
|
|
0, mtd->oobavail);
|
|
0, mtd->oobavail);
|