Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- static int part_erase(struct mtd_info *mtd, struct erase_info *instr)
- {
- struct mtd_part *part = mtd_to_part(mtd);
- int ret;
- size_t wrlen = 0;
- u8 *erase_buf = NULL;
- u32 erase_buf_ofs = 0;
- bool partial_start = false;
- if (mtd->flags & MTD_ERASE_PARTIAL) {
- size_t readlen = 0;
- u64 mtd_ofs;
- erase_buf = kmalloc(part->parent->erasesize, GFP_ATOMIC);
- if (!erase_buf)
- return -ENOMEM;
- mtd_ofs = part->offset + instr->addr;
- erase_buf_ofs = do_div(mtd_ofs, part->parent->erasesize);
- if (erase_buf_ofs > 0) {
- instr->addr -= erase_buf_ofs;
- ret = mtd_read(part->parent,
- instr->addr + part->offset,
- part->parent->erasesize,
- &readlen, erase_buf);
- instr->len += erase_buf_ofs;
- partial_start = true;
- } else {
- mtd_ofs = part->offset + part->mtd.size;
- erase_buf_ofs = part->parent->erasesize -
- do_div(mtd_ofs, part->parent->erasesize);
- if (erase_buf_ofs > 0) {
- instr->len += erase_buf_ofs;
- ret = mtd_read(part->parent,
- part->offset + instr->addr +
- instr->len - part->parent->erasesize,
- part->parent->erasesize, &readlen,
- erase_buf);
- } else {
- ret = 0;
- }
- }
- if (ret < 0) {
- kfree(erase_buf);
- return ret;
- }
- }
- instr->addr += part->offset;
- ret = part->parent->_erase(part->parent, instr);
- if (instr->fail_addr != MTD_FAIL_ADDR_UNKNOWN)
- instr->fail_addr -= part->offset;
- instr->addr -= part->offset;
- if (mtd->flags & MTD_ERASE_PARTIAL) {
- if (partial_start) {
- part->parent->_write(part->parent,
- instr->addr, erase_buf_ofs,
- &wrlen, erase_buf);
- instr->addr += erase_buf_ofs;
- } else {
- instr->len -= erase_buf_ofs;
- part->parent->_write(part->parent,
- instr->addr + instr->len,
- erase_buf_ofs, &wrlen,
- erase_buf +
- part->parent->erasesize -
- erase_buf_ofs);
- }
- kfree(erase_buf);
- }
- return ret;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement