Распечатка 4.4 Имитация функции erase

Предыдущая  Содержание  Следующая V*D*V

Распечатка 4.4

 

static int dummy_flash_erase_one_block(struct map_info *map,

                   struct flchip *chip, unsigned long addr)

{

  DECLARE_WAITQUEUE(wait, current);

again:

  spin_lock(chip->mutex);

 

  if(chip->state != FL_READY)

  {

    set_current_state(TASK_UNINTERRUPTIBLE);

    add_wait_queue(&chip->wq, &wait);

    spin_unlock(chip->mutex);

    schedule();

    remove_wait_queue(&chip->wq, &wait);

    if(signal_pending(current))

      return -EINTR;

    goto again;

  }

 

  chip->state = FL_ERASING;

  addr += chip->start;

  ERASE_FLASH_SECTOR(map, chip->start, addr);

 

  spin_unlock(chip->mutex);

  schedule_timeout(chip->erase_time);

  if(signal_pending(current))

    return -EINTR;

 

  /* Мы пробуждены после превышения времени ожидания.

     Захватываем мьютекс для обработки */

  spin_lock(chip->mutex);

 

  /* Добавьте любые проверки на то, был ли стёрт сектор флеш-памяти. */

 

  /* Предполагаем, что здесь стирание флеш-памяти было завершено */

  chip->state = FL_READY;

  wake_up(&chip->wq);

  spin_unlock(chip->mutex);

  return 0;

}

 

static int dummy_flash_erase(struct mtd_info *mtd,

                             struct erase_info *instr)

{

  struct map_info *map = mtd->priv;

  struct dummy_private_info_struct *priv = map->fldrv_priv;

  int chipnum = 0;

  unsigned long addr;

  int len;

  int ret;

 

  /* Сначала проверяем на ошибки */

  if( (instr->addr > mtd->size) ||

      ((instr->addr + instr->len) > mtd->size) ||

      instr->addr & (mtd->erasesize -1)))

    return -EINVAL;

 

  /* Ищем номер для первой микросхемы */

  chipnum = (instr->addr >> priv->chipshift);

  addr = instr->addr & ((1 << priv->chipshift) - 1);

  len = instr->len;

  while(len)

  {

    if( (ret = dummy_flash_erase_one_block(map,

                      &priv->chips[chipnum], addr)) < 0)

      return ret;

 

    addr += mtd->erasesize;

    len -= mtd->erasesize;

    if(addr >> priv->chipshift)

    {

      addr = 0;

      chipnum++;

    }

  }

 

  instr->state = MTD_ERASE_DONE;

  if(instr->callback)

    instr->callback(instr);

  return 0;

}

 

Предыдущая  Содержание  Следующая