static int rd_configure_device(struct se_device *dev) { struct rd_dev *rd_dev = RD_DEV(dev); struct rd_host *rd_host = dev->se_hba->hba_ptr; int ret; if (!(rd_dev->rd_flags & RDF_HAS_PAGE_COUNT)) { pr_debug("Missing rd_pages= parameter\n"); return -EINVAL; } ret = rd_build_device_space(rd_dev); if (ret < 0) goto fail; dev->dev_attrib.hw_block_size = RD_BLOCKSIZE; dev->dev_attrib.hw_max_sectors = UINT_MAX; dev->dev_attrib.hw_queue_depth = RD_MAX_DEVICE_QUEUE_DEPTH; rd_dev->rd_dev_id = rd_host->rd_host_dev_id_count++; pr_debug("CORE_RD[%u] - Added TCM MEMCPY Ramdisk Device ID: %u of" " %u pages in %u tables, %lu total bytes\n", rd_host->rd_host_id, rd_dev->rd_dev_id, rd_dev->rd_page_count, rd_dev->sg_table_count, (unsigned long)(rd_dev->rd_page_count * PAGE_SIZE)); return 0; fail: rd_release_device_space(rd_dev); return ret; }
/* rd_create_virtdevice(): * * */ static struct se_device *rd_create_virtdevice( struct se_hba *hba, struct se_subsystem_dev *se_dev, void *p, int rd_direct) { struct se_device *dev; struct se_dev_limits dev_limits; struct rd_dev *rd_dev = p; struct rd_host *rd_host = hba->hba_ptr; int dev_flags = 0, ret; char prod[16], rev[4]; memset(&dev_limits, 0, sizeof(struct se_dev_limits)); ret = rd_build_device_space(rd_dev); if (ret < 0) goto fail; snprintf(prod, 16, "RAMDISK-%s", (rd_dev->rd_direct) ? "DR" : "MCP"); snprintf(rev, 4, "%s", (rd_dev->rd_direct) ? RD_DR_VERSION : RD_MCP_VERSION); dev_limits.limits.logical_block_size = RD_BLOCKSIZE; dev_limits.limits.max_hw_sectors = RD_MAX_SECTORS; dev_limits.limits.max_sectors = RD_MAX_SECTORS; dev_limits.hw_queue_depth = RD_MAX_DEVICE_QUEUE_DEPTH; dev_limits.queue_depth = RD_DEVICE_QUEUE_DEPTH; dev = transport_add_device_to_core_hba(hba, &rd_mcp_template, se_dev, dev_flags, rd_dev, &dev_limits, prod, rev); if (!dev) goto fail; rd_dev->rd_dev_id = rd_host->rd_host_dev_id_count++; rd_dev->rd_queue_depth = dev->queue_depth; pr_debug("CORE_RD[%u] - Added TCM %s Ramdisk Device ID: %u of" " %u pages in %u tables, %lu total bytes\n", rd_host->rd_host_id, (!rd_dev->rd_direct) ? "MEMCPY" : "DIRECT", rd_dev->rd_dev_id, rd_dev->rd_page_count, rd_dev->sg_table_count, (unsigned long)(rd_dev->rd_page_count * PAGE_SIZE)); return dev; fail: rd_release_device_space(rd_dev); return ERR_PTR(ret); }