Exemplo n.º 1
0
/* write data to the underlying device */
static int blkmtd_write(struct mtd_info *mtd, loff_t to, size_t len,
                        size_t *retlen, const u_char *buf)
{
    struct blkmtd_dev *dev = mtd->priv;
    int err;

    if(!len)
        return 0;

    DEBUG(2, "blkmtd: write: dev = `%s' to = %ld len = %d buf = %p\n",
          mtd->name+9, (long int)to, len, buf);

    if(to >= mtd->size) {
        return -ENOSPC;
    }

    if(to + len > mtd->size) {
        len = mtd->size - to;
    }

    err = write_pages(dev, buf, to, len, retlen);
    if(err > 0)
        err = 0;
    DEBUG(2, "blkmtd: write: end, err = %d\n", err);
    return err;
}
Exemplo n.º 2
0
/* erase a specified part of the device */
static int blkmtd_erase(struct mtd_info *mtd, struct erase_info *instr)
{
    struct blkmtd_dev *dev = mtd->priv;
    struct mtd_erase_region_info *einfo = mtd->eraseregions;
    int numregions = mtd->numeraseregions;
    size_t from;
    u_long len;
    int err = -EIO;
    int retlen;

    instr->state = MTD_ERASING;
    from = instr->addr;
    len = instr->len;

    /* check erase region has valid start and length */
    DEBUG(2, "blkmtd: erase: dev = `%s' from = 0x%x len = 0x%lx\n",
          mtd->name+9, from, len);
    while(numregions) {
        DEBUG(3, "blkmtd: checking erase region = 0x%08X size = 0x%X num = 0x%x\n",
              einfo->offset, einfo->erasesize, einfo->numblocks);
        if(from >= einfo->offset
                && from < einfo->offset + (einfo->erasesize * einfo->numblocks)) {
            if(len == einfo->erasesize
                    && ( (from - einfo->offset) % einfo->erasesize == 0))
                break;
        }
        numregions--;
        einfo++;
    }

    if(!numregions) {
        /* Not a valid erase block */
        err("erase: invalid erase request 0x%lX @ 0x%08X", len, from);
        instr->state = MTD_ERASE_FAILED;
        err = -EIO;
    }

    if(instr->state != MTD_ERASE_FAILED) {
        /* do the erase */
        DEBUG(3, "Doing erase from = %d len = %ld\n", from, len);
        err = write_pages(dev, NULL, from, len, &retlen);
        if(err || retlen != len) {
            err("erase failed err = %d", err);
            instr->state = MTD_ERASE_FAILED;
        } else {
            instr->state = MTD_ERASE_DONE;
        }
    }

    DEBUG(3, "blkmtd: erase: checking callback\n");
    if (instr->callback) {
        (*(instr->callback))(instr);
    }
    DEBUG(2, "blkmtd: erase: finished (err = %d)\n", err);
    return err;
}
Exemplo n.º 3
0
void
xtr_oggbase_c::write_queued_frame(bool eos) {
  if (-1 == m_queued_granulepos)
    return;

  ogg_packet op;

  op.b_o_s      = 0;
  op.e_o_s      = eos ? 1 : 0;
  op.packetno   = m_packetno;
  op.packet     = m_queued_frame->get_buffer();
  op.bytes      = m_queued_frame->get_size();
  op.granulepos = m_queued_granulepos;

  ++m_packetno;

  ogg_stream_packetin(&m_os, &op);
  write_pages();

  m_queued_granulepos = -1;
  m_queued_frame.reset();
}