Exemple #1
0
int
rtems_blkdev_ioctl(rtems_disk_device *dd, uint32_t req, void *argp)
{
    rtems_status_code  sc;
    int                rc = 0;

    switch (req)
    {
        case RTEMS_BLKIO_GETMEDIABLKSIZE:
            *(uint32_t *) argp = dd->media_block_size;
            break;

        case RTEMS_BLKIO_GETBLKSIZE:
            *(uint32_t *) argp = dd->block_size;
            break;

        case RTEMS_BLKIO_SETBLKSIZE:
            sc = rtems_bdbuf_set_block_size(dd, *(uint32_t *) argp);
            if (sc != RTEMS_SUCCESSFUL) {
                errno = EIO;
                rc = -1;
            }
            break;

        case RTEMS_BLKIO_GETSIZE:
            *(rtems_blkdev_bnum *) argp = dd->size;
            break;

        case RTEMS_BLKIO_SYNCDEV:
            sc = rtems_bdbuf_syncdev(dd);
            if (sc != RTEMS_SUCCESSFUL) {
                errno = EIO;
                rc = -1;
            }
            break;

        case RTEMS_BLKIO_GETDISKDEV:
            *(rtems_disk_device **) argp = dd;
            break;

        case RTEMS_BLKIO_PURGEDEV:
            rtems_bdbuf_purge_dev(dd);
            break;

        case RTEMS_BLKIO_GETDEVSTATS:
            rtems_bdbuf_get_device_stats(dd, (rtems_blkdev_stats *) argp);
            break;

        case RTEMS_BLKIO_RESETDEVSTATS:
            rtems_bdbuf_reset_device_stats(dd);
            break;

        default:
            errno = EINVAL;
            rc = -1;
            break;
    }

    return rc;
}
Exemple #2
0
rtems_status_code rtems_blkdev_create(
  const char *device,
  uint32_t block_size,
  rtems_blkdev_bnum block_count,
  rtems_block_device_ioctl handler,
  void *driver_data
)
{
  rtems_status_code sc = RTEMS_SUCCESSFUL;

  if (block_count > 0) {
    rtems_blkdev_imfs_context *ctx = calloc(1, sizeof(*ctx));

    if (ctx != NULL) {
      rtems_disk_device *dd = &ctx->dd;

      ctx->fd = -1;

      dd->phys_dev = dd;
      dd->size = block_count;
      dd->media_block_size = block_size;
      dd->ioctl = handler;
      dd->driver_data = driver_data;

      if ((*handler)(dd, RTEMS_BLKIO_CAPABILITIES, &dd->capabilities) != 0) {
        dd->capabilities = 0;
      }

      sc = rtems_bdbuf_set_block_size(dd, block_size);
      if (sc == RTEMS_SUCCESSFUL) {
        int rv = IMFS_make_generic_node(
          device,
          S_IFBLK | S_IRWXU | S_IRWXG | S_IRWXO,
          &rtems_blkdev_imfs_control,
          ctx
        );

        if (rv != 0) {
          free(ctx);
          sc = RTEMS_UNSATISFIED;
        }
      } else {
        free(ctx);
      }
    } else {
      sc = RTEMS_NO_MEMORY;
    }
  } else {
    sc = RTEMS_INVALID_NUMBER;
  }

  return sc;
}
Exemple #3
0
rtems_status_code rtems_disk_create_phys(
  dev_t dev,
  uint32_t block_size,
  rtems_blkdev_bnum block_count,
  rtems_block_device_ioctl handler,
  void *driver_data,
  const char *name
)
{
  rtems_disk_device *dd = NULL;
  rtems_status_code sc = RTEMS_SUCCESSFUL;

  if (handler == NULL) {
    return RTEMS_INVALID_ADDRESS;
  }

  sc = disk_lock();
  if (sc != RTEMS_SUCCESSFUL) {
    return sc;
  }

  sc = create_disk(dev, name, &dd);
  if (sc != RTEMS_SUCCESSFUL) {
    disk_unlock();

    return sc;
  }

  dd->phys_dev = dd;
  dd->start = 0;
  dd->size = block_count;
  dd->media_block_size = block_size;
  dd->ioctl = handler;
  dd->driver_data = driver_data;

  if ((*handler)(dd, RTEMS_BLKIO_CAPABILITIES, &dd->capabilities) < 0) {
    dd->capabilities = 0;
  }

  sc = rtems_bdbuf_set_block_size(dd, block_size);
  if (sc != RTEMS_SUCCESSFUL) {
    dd->ioctl = null_handler;
    rtems_disk_delete(dev);
    disk_unlock();

    return sc;
  }

  disk_unlock();

  return RTEMS_SUCCESSFUL;
}