static int attach_bbt(struct mtd_info *mtd, void *bbt) { struct nand_chip *chip = mtd->priv; chip->bbt_td->options |= NAND_BBT_WRITE | NAND_BBT_CREATE; chip->bbt_md->options |= NAND_BBT_WRITE | NAND_BBT_CREATE; free(chip->bbt); chip->bbt = bbt; return nand_update_bbt(mtd, 0); }
static int jz_sfcnand_block_markbad(struct mtd_info *mtd, loff_t ofs) { struct nand_chip *chip = mtd->priv; uint8_t buf[2] = { 0, 0 }; int block, res, ret = 0, i = 0; int write_oob = !(chip->bbt_options & NAND_BBT_NO_OOB_BBM); /* Write bad block marker to OOB */ if (write_oob) { struct mtd_oob_ops ops; loff_t wr_ofs = ofs; ops.datbuf = NULL; ops.oobbuf = buf; ops.ooboffs = chip->badblockpos; if (chip->options & NAND_BUSWIDTH_16) { ops.ooboffs &= ~0x01; ops.len = ops.ooblen = 2; } else { ops.len = ops.ooblen = 1; } ops.mode = MTD_OPS_PLACE_OOB; /* Write to first/last page(s) if necessary */ if (chip->bbt_options & NAND_BBT_SCANLASTPAGE) wr_ofs += mtd->erasesize - mtd->writesize; do { res = sfcnand_write_oob(mtd, wr_ofs, &ops); if (!ret) ret = res; i++; wr_ofs += mtd->writesize; } while ((chip->bbt_options & NAND_BBT_SCAN2NDPAGE) && i < 2); } /* Update flash-based bad block table */ if (chip->bbt_options & NAND_BBT_USE_FLASH) { res = nand_update_bbt(mtd, ofs); if (!ret) ret = res; } if (!ret) mtd->ecc_stats.badblocks++; return ret; }