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; }
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; }
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; }