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

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

Распечатка 4.2

 

static inline int dummy_flash_read_one_chip(struct map_info *map,

       struct flchip *chip, loff_t addr, size_t len, u_char *buf)

{

  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;

  }

 

  addr += chip->start;

  chip->state = FL_READY;

  map_copy_from(map, buf, addr, len);

  wake_up(&chip->wq);

  spin_unlock(chip->mutex);

  return 0;

}

 

static int dummy_flash_read(struct mtd_info *mtd, loff_t from,

                       size_t len,size_t *retlen, u_char *buf)

{

  struct map_info *map = mtd->priv;

  struct dummy_private_info_struct *priv = map->fldrv_priv;

  int chipnum = 0;

  int ret = 0;

  unsigned int ofs;

  *retlen = 0;

 

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

  chipnum = (from >> priv->chipshift);

  ofs = from & ((1 << priv->chipshift) - 1);

  while(len)

  {

    unsigned long to_read;

    if(chipnum >= priv->number_of_chips)

      break;

 

    /* Проверяем, правильно ли переходит чтение на следующую микросхему */

    if( (len + ofs - 1) >> priv->chipshift)

      to_read = (1 << priv->chipshift) - ofs;

    else

      to_read = len;

    if( (ret = dummy_flash_read_one_chip(map, &priv->chips[chipnum],

                                       ofs, to_read, buf)))

      break;

 

    *retlen += to_read;

    len -= to_read;

    buf += to_read;

    ofs=0;

    chipnum++;

  }

  return ret;

}

 

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