示例#1
0
文件: ltp_block_dev.c 项目: 1587/ltp
static int tc01(void)
{
	int major1, major2;
	int pass = 1;

	prk_info("Test Case 1: register_blkdev() with auto allocating "
		"major numbers (major=0)\n");

	major1 = register_blkdev(0, BLK_DEV_NAME);
	prk_debug("major1 = %i\n", major1);

	major2 = register_blkdev(0, BLK_DEV_NAME);
	prk_debug("major2 = %i\n", major2);

	if (major1 >= 0) {
		unregister_blkdev(major1, BLK_DEV_NAME);
	} else {
		pass = 0;
		prk_debug("1st call to register_blkdev() failed, error %i\n",
			major1);
	}

	if (major2 >= 0) {
		unregister_blkdev(major2, BLK_DEV_NAME);
	} else {
		pass = 0;
		prk_debug("2nd call to register_blkdev() failed, error %i\n",
			major2);
	}

	prk_info("Test Case Result: %s\n", result_str(pass));
	return pass;
}
示例#2
0
文件: ltp_block_dev.c 项目: kraj/ltp
static int tc05(void)
{
	int major, pass = 16;
	unsigned int i, test_major[2] = {512, UINT_MAX};

	prk_info("Test Case 5: register_blkdev() with major=%u/%u\n",
		 test_major[0], test_major[1]);

	for (i = 0; i < sizeof(test_major) / sizeof(unsigned int); i++) {
		major = register_blkdev(test_major[i], BLK_DEV_NAME);
		prk_debug("major = %i\n", major);

		if (major == 0) {
			unregister_blkdev(test_major[i], BLK_DEV_NAME);
#ifdef BLKDEV_MAJOR_MAX
			pass = 0;
#endif
		} else {
			prk_debug("register_blkdev() with major %u got error %i\n",
				  test_major[i], major);
#ifndef BLKDEV_MAJOR_MAX
			pass = 0;
#endif
		}
	}

	prk_info("Test Case Result: %s\n", result_str(pass));
	return pass;
}
示例#3
0
文件: ltp_block_dev.c 项目: kraj/ltp
static int tc04(void)
{
	int major, pass = 8;
	unsigned int i, test_major[2] = {256, 511};

	prk_info("Test Case 4: register_blkdev() with major=%u/%u\n",
		 test_major[0], test_major[1]);

	for (i = 0; i < sizeof(test_major) / sizeof(unsigned int); i++) {
		major = register_blkdev(test_major[i], BLK_DEV_NAME);
		prk_debug("major = %i\n", major);

		if (major == 0) {
			unregister_blkdev(test_major[i], BLK_DEV_NAME);
		} else if (major == -EBUSY) {
			prk_debug("device was busy, register_blkdev() with major %u skipped\n",
				  test_major[i]);
		} else {
			pass = 0;
			prk_debug("register_blkdev() with major %u got error %i\n",
				  test_major[i], major);
		}
	}

	prk_info("Test Case Result: %s\n", result_str(pass));
	return pass;
}
示例#4
0
文件: rw_block.c 项目: drewt/Telos
void register_block_driver(unsigned int major, const char *name,
		struct block_device *(*get_device)(unsigned int),
		struct file_operations *fops)
{
	blkdev[major].get_device = get_device;
	register_blkdev(major, name, fops ? fops : &blkdev_generic_fops);
}
示例#5
0
static int __init ramblock_init(void)
{
    /* 1. Allocate gendisk struct */
    ramblock_disk = alloc_disk(16);

    /* 2. Configure */
    /* 2.1 Allocate/Configure a queue which supporting read/write capabilities */
	if (!(ramblock_queue = blk_init_queue(do_ramblock_request, &ramblock_lock)))
		return -ENOMEM;
	ramblock_disk->queue = ramblock_queue;


    /* 2.2 Configure other properties: such as volume, etc */
    major = register_blkdev(0, "ramblock");
    
	ramblock_disk->major = major;
	ramblock_disk->first_minor = 0;
	sprintf(ramblock_disk->disk_name, "ramblock");
	ramblock_disk->fops = &ramblock_fops;
	set_capacity(ramblock_disk, RAMBLOCK_SIZE / 512);  /* 512 bytes per sector */


    /* 3. Register */
    add_disk(ramblock_disk);
    
    return 0;
}
示例#6
0
static int __init tzmem_blkdev_init(void)
{
#ifdef MTEE_TZMEM_DBG
	pr_warn("====> tzmem_blkdev_init\n");
#endif

	if (register_blkdev(IO_NODE_MAJOR_TZMEM, DEV_TZMEM)) {
		pr_debug(MTEE_TZMEM_TAG "[%s] tzmem_blkdev_init: register_blkdev error\n", MODULE_NAME);
		return -EFAULT;
	}

	tz_client_dev = MKDEV(IO_NODE_MAJOR_TZMEM, IO_NODE_MINOR_TZMEM);
	blk_register_region(tz_client_dev, IO_NODE_NUMBER_TZMEM,
		THIS_MODULE, tzmem_blk_probe, NULL, NULL);

#if 0
	/* create /dev/tzmem automaticly */
	pTzClass = class_create(THIS_MODULE, DEV_TZMEM);
	if (IS_ERR(pTzClass)) {
		int ret = PTR_ERR(pTzClass);
		pr_debug(MTEE_TZMEM_TAG "[%s] could not create class for the device, ret:%d\n", MODULE_NAME, ret);
		return ret;
	}
	pTzDevice = device_create(pTzClass, NULL, tz_client_dev, NULL, DEV_TZMEM);
#endif

	return 0;
}
示例#7
0
static int __init local_init(void)
{
    int r;

    /* allocate a slab for the dm_ios */
    _io_cache = KMEM_CACHE(dm_io, 0);
    if (!_io_cache)
        return -ENOMEM;

    /* allocate a slab for the target ios */
    _tio_cache = KMEM_CACHE(dm_target_io, 0);
    if (!_tio_cache) {
        kmem_cache_destroy(_io_cache);
        return -ENOMEM;
    }

    _major = major;
    r = register_blkdev(_major, _name);
    if (r < 0) {
        kmem_cache_destroy(_tio_cache);
        kmem_cache_destroy(_io_cache);
        return r;
    }

    if (!_major)
        _major = r;

    return 0;
}
示例#8
0
/* ---------------------------------------------------------------------
 * Module init/exit routines
 */
static int __init ace_init(void)
{
	int rc;

	ace_major = register_blkdev(ace_major, "xsysace");
	if (ace_major <= 0) {
		rc = -ENOMEM;
		goto err_blk;
	}

	rc = ace_of_register();
	if (rc)
		goto err_of;

	pr_debug("xsysace: registering platform binding\n");
	rc = platform_driver_register(&ace_platform_driver);
	if (rc)
		goto err_plat;

	pr_info("Xilinx SystemACE device driver, major=%i\n", ace_major);
	return 0;

err_plat:
	ace_of_unregister();
err_of:
	unregister_blkdev(ace_major, "xsysace");
err_blk:
	printk(KERN_ERR "xsysace: registration failed; err=%i\n", rc);
	return rc;
}
示例#9
0
int
zvol_init(void)
{
	int error;

	zvol_taskq = taskq_create(ZVOL_DRIVER, zvol_threads, maxclsyspri,
		                  zvol_threads, INT_MAX, TASKQ_PREPOPULATE);
	if (zvol_taskq == NULL) {
		printk(KERN_INFO "ZFS: taskq_create() failed\n");
		return (-ENOMEM);
	}

	error = register_blkdev(zvol_major, ZVOL_DRIVER);
	if (error) {
		printk(KERN_INFO "ZFS: register_blkdev() failed %d\n", error);
		taskq_destroy(zvol_taskq);
		return (error);
	}

	blk_register_region(MKDEV(zvol_major, 0), 1UL << MINORBITS,
	                    THIS_MODULE, zvol_probe, NULL, NULL);

	mutex_init(&zvol_state_lock, NULL, MUTEX_DEFAULT, NULL);
	list_create(&zvol_state_list, sizeof (zvol_state_t),
	            offsetof(zvol_state_t, zv_next));

	(void) zvol_create_minors(NULL);

	return (0);
}
示例#10
0
static int __init osprd_init(void)
{
	int i, r;

	// shut up the compiler
	(void) for_each_open_file;
#ifndef osp_spin_lock
	(void) osp_spin_lock;
	(void) osp_spin_unlock;
#endif

	/* Register the block device name. */
	if (register_blkdev(OSPRD_MAJOR, "osprd") < 0) {
		printk(KERN_WARNING "osprd: unable to get major number\n");
		return -EBUSY;
	}

	/* Initialize the device structures. */
	for (i = r = 0; i < NOSPRD; i++)
		if (setup_device(&osprds[i], i) < 0)
			r = -EINVAL;

	if (r < 0) {
		printk(KERN_EMERG "osprd: can't set up device structures\n");
		osprd_exit();
		return -EBUSY;
	} else
		return 0;
}
示例#11
0
static int ramblock_init(void)
{
	/* 1. 分配一个gendisk结构体 */
	ramblock_disk = alloc_disk(16); /* 次设备号个数: 分区个数+1 */

	/* 2. 设置 */
	/* 2.1 分配/设置队列: 提供读写能力 */
	ramblock_queue = blk_init_queue(do_ramblock_request, &ramblock_lock);
	ramblock_disk->queue = ramblock_queue;
	
	/* 2.2 设置其他属性: 比如容量 */
	major = register_blkdev(0, "ramblock");  /* cat /proc/devices */	
	ramblock_disk->major       = major;
	ramblock_disk->first_minor = 0;
	sprintf(ramblock_disk->disk_name, "ramblock");
	ramblock_disk->fops        = &ramblock_fops;
	set_capacity(ramblock_disk, RAMBLOCK_SIZE / 512);

	/* 3. 硬件相关操作 */
	ramblock_buf = kzalloc(RAMBLOCK_SIZE, GFP_KERNEL);

	/* 4. 注册 */
	add_disk(ramblock_disk);

	return 0;
}
示例#12
0
static int __init sbull_init(void)
{
	int i;
	/*
	* Get registered.
	*/
	sbull_major = register_blkdev(sbull_major, "sbull");
	if (sbull_major <= 0) {
	   printk(KERN_WARNING "sbull: unable to get major number\n");
	   return -EBUSY;
	}
	/*
	* Allocate the device array, and initialize each one.
	*/
	Devices = kmalloc(ndevices*sizeof (struct sbull_dev), GFP_KERNEL);
	if (Devices == NULL)
	   goto out_unregister;
	for (i = 0; i < ndevices; i++) 
	   setup_device(Devices + i, i);
	    
	return 0;

	out_unregister:
	unregister_blkdev(sbull_major, "sbd");
	return -ENOMEM;
}
示例#13
0
文件: trd.c 项目: tridge/junkcode
static int trd_init(void)
{
	int i;

	trd_pages = (TRD_SIZE + (PAGE_SIZE-1)) >> PAGE_SHIFT;

	if (register_blkdev(MAJOR_NR, DEVICE_NAME, &trd_fops)) {
		printk(KERN_ERR DEVICE_NAME ": Unable to register_blkdev(%d)\n", MAJOR_NR);
		return -EBUSY;
	}

	blk_queue_make_request(BLK_DEFAULT_QUEUE(MAJOR_NR), trd_make_request);
	for (i=0;i<MAX_DEVS;i++) {
		trd_blocksizes[i] = TRD_BLOCK_SIZE;
		trd_blk_sizes[i] = trd_size;
	}

	blksize_size[MAJOR_NR] = trd_blocksizes;
	blk_size[MAJOR_NR] = trd_blk_sizes;

	printk(KERN_DEBUG DEVICE_NAME ": trd initialised size=%dk\n", 
	       trd_size);

	return 0;
}
示例#14
0
static int __init ramhd_init(void)
{
	int i;

	ramhd_space_init();
	alloc_ramdev();

	ramhd_major = register_blkdev(0, RAMHD_NAME);

	for (i=0; i<RAMHD_MAX_DEVICE; i++)
	{
		rdev[i]->data = sdisk[i];
		rdev[i]->queue = blk_alloc_queue(GFP_KERNEL);
		blk_queue_make_request(rdev[i]->queue, ramhd_make_request);
		rdev[i]->gd = alloc_disk(RAMHD_MAX_PARTITIONS);
		rdev[i]->gd->major = ramhd_major;
		rdev[i]->gd->first_minor = i*RAMHD_MAX_PARTITIONS;
		rdev[i]->gd->fops = &ramhd_fops;
		rdev[i]->gd->queue = rdev[i]->queue;
		rdev[i]->gd->private_data = rdev[i];
		sprintf(rdev[i]->gd->disk_name, "ramhd%c", 'a'+i);
		rdev[i]->gd->flags |= GENHD_FL_SUPPRESS_PARTITION_INFO;
		set_capacity(rdev[i]->gd, RAMHD_SECTOR_TOTAL);
		add_disk(rdev[i]->gd);
	}
	return 0;
}
示例#15
0
static int __init imgrement_init(void)
{
    char* err;
    struct imgrement_device *dev;

    imgrement_device = kzalloc(sizeof(struct imgrement_device), GFP_KERNEL);
    _astgo(imgrement_device != NULL, "Error allocating", err, init_error);
    dev = imgrement_device;

    dev->major = register_blkdev(0, DRIVER_NAME);
    _astgo(dev->major > 0, "Error register block device", err, init_error);

    dev->base_dev = blkdev_get_by_path("/dev/sdb", FMODE_READ, NULL);
    _astgo(dev->base_dev != NULL, "Error getting base block device", err, init_error);

    dev->base_queue = bdev_get_queue(dev->base_dev);
    _astgo(dev->base_queue != NULL, "Error getting queue", err, init_error);
    dev->orig_req_fn = dev->base_queue->make_request_fn;
    dev->base_queue->make_request_fn = trace_request_fn;

    LOG("%s trace initialization succeeded", dev->base_dev->bd_disk->disk_name);
    return 0;

init_error:
    LOG_VAR(err);
    imgrement_exit();
    return -1;
}
示例#16
0
static int ramblock_init(void)
{
    major = register_blkdev(0, "ramblock");
	
	/* 1.分配一个gendisk结构体 */
	/* 这里的16表示分区的个数 15个分区 */
    ramblock_gendisk = alloc_disk(16);
	
	/* 2. 设置 */
    ramblock_gendisk->major = major;
    ramblock_gendisk->first_minor = 0;
	sprintf(ramblock_gendisk->disk_name, "ramblock");
    ramblock_gendisk->fops = &ramblock_fops;

	/* 2.1 分配/设置队列:提供读写能力 */
    ramblock_request_queue = blk_init_queue(do_ramblock_request, &ramblock_lock);
    ramblock_gendisk->queue = ramblock_request_queue;
	
	/* 2.2 设置其它属性:比如容量 */
	set_capacity(ramblock_gendisk, RAMBLOCK_SIZE / 512);

	/* 3. 硬件相关操作 */
	if (NULL == (ramblock_buf = kzalloc(RAMBLOCK_SIZE, GFP_KERNEL)))
		return -ENOMEM;
	
	/* 4. 注册 */
    add_disk(ramblock_gendisk);
	
	return 0;
}
示例#17
0
/* ---------------------------------------------------------------------
 * Module init/exit routines
 */
static int __init dm3730logic_cf_init(void)
{
	int rc;

	// printk(KERN_INFO "%s:%d\n", __FUNCTION__, __LINE__);

	cf_major = register_blkdev(cf_major, "omap-cf");
	if (cf_major <= 0) {
		rc = -ENOMEM;
		goto err_blk;
	}

#if defined(CONFIG_DEBUG_FS) && defined(DEBUG)
	(void)debugfs_create_file("cf-debug", S_IRUGO | S_IFREG, NULL,
				NULL, &dm3730logic_cf_debug_fops);
#endif

	pr_info("omap-cf: registering platform binding\n");
	rc = platform_driver_register(&dm3730logic_cf_platform_driver);
	if (rc)
		goto err_plat;

	printk(KERN_INFO "DM3730 SOM LV memory CompactFlash device driver, major=%i\n", cf_major);

	return 0;

err_plat:
	unregister_blkdev(cf_major, "dm3730logic-cf");
err_blk:
	printk(KERN_ERR "omap-cf: registration failed; err=%i\n", rc);
	return rc;
}
示例#18
0
int __init init_mtdblock(void)
{
	int i;

	if (register_blkdev(MAJOR_NR,DEVICE_NAME,&mtd_fops)) {
		printk(KERN_NOTICE "Can't allocate major number %d for Memory Technology Devices.\n",
		       MTD_BLOCK_MAJOR);
		return -EAGAIN;
	}
	DEBUG(MTD_DEBUG_LEVEL3,
		"init_mtdblock: allocated major number %d (read only).\n", 
		MTD_BLOCK_MAJOR);
	
	/* We fill it in at open() time. */
	for (i=0; i< MAX_MTD_DEVICES; i++) {
		mtd_sizes[i] = 0;
	}
	
	/* Allow the block size to default to BLOCK_SIZE. */
	blksize_size[MAJOR_NR] = NULL;
	blk_size[MAJOR_NR] = mtd_sizes;
	
	blk_init_queue(BLK_DEFAULT_QUEUE(MAJOR_NR), &mtdblock_request);
	return 0;
}
示例#19
0
文件: zvol.c 项目: alek-p/zfs
int
zvol_init(void)
{
	int error;

	list_create(&zvol_state_list, sizeof (zvol_state_t),
	    offsetof(zvol_state_t, zv_next));
	mutex_init(&zvol_state_lock, NULL, MUTEX_DEFAULT, NULL);

	error = register_blkdev(zvol_major, ZVOL_DRIVER);
	if (error) {
		printk(KERN_INFO "ZFS: register_blkdev() failed %d\n", error);
		goto out;
	}

	blk_register_region(MKDEV(zvol_major, 0), 1UL << MINORBITS,
	    THIS_MODULE, zvol_probe, NULL, NULL);

	return (0);

out:
	mutex_destroy(&zvol_state_lock);
	list_destroy(&zvol_state_list);

	return (SET_ERROR(error));
}
static int __init block_demo_init(void)
{
    spin_lock_init(&g_lock);
    int err = register_blkdev(BLK_DEV_MAJOR,"blk-dev-demo");
    if(err != 0)
    {
        Log("[Error] register_blkdev failed.");
        return -1;
    }
    gp_blk_dev_disk = alloc_disk(1);
    if(!gp_blk_dev_disk)
    {
        Log("[Error] alloc_disk failed.");
        err = -1;
        goto FAIL_ALLOC_DISK;
    }

    gp_blk_dev_disk->major = BLK_DEV_MAJOR;
    gp_blk_dev_disk->first_minor = 0;
    
    sprintf(gp_blk_dev_disk->disk_name,DISK_NAME);
    set_capacity(gp_blk_dev_disk, DISK_SIZE >> 9);
	
	gp_blk_dev_disk->fops = &g_mem_fops;
    gp_blk_dev_disk->queue = blk_init_queue(mem_block_requeut_fn,&g_lock);
	
    add_disk(gp_blk_dev_disk);

    return 0;
FAIL_ALLOC_DISK:
    unregister_blkdev(BLK_DEV_MAJOR,"blk-dev-demo");
    return err;
}
示例#21
0
文件: dm.c 项目: wxlong/Test
static __init int local_init(void)
{
	int r;

	/* allocate a slab for the dm_ios */
	_io_cache = kmem_cache_create("dm_io",
				      sizeof(struct dm_io), 0, 0, NULL, NULL);
	if (!_io_cache)
		return -ENOMEM;

	/* allocate a slab for the target ios */
	_tio_cache = kmem_cache_create("dm_tio", sizeof(struct target_io),
				       0, 0, NULL, NULL);
	if (!_tio_cache) {
		kmem_cache_destroy(_io_cache);
		return -ENOMEM;
	}

	_major = major;
	r = register_blkdev(_major, _name);
	if (r < 0) {
		kmem_cache_destroy(_tio_cache);
		kmem_cache_destroy(_io_cache);
		return r;
	}

	if (!_major)
		_major = r;

	return 0;
}
示例#22
0
/*init west bridge block device */
static int cyasblkdev_blk_initialize(void)
{
	struct cyasblkdev_blk_data *bd;
	int res;

	DBGPRN_FUNC_NAME;

	res = register_blkdev(major, "cyasblkdev");

	if (res < 0) {
		#ifndef WESTBRIDGE_NDEBUG
		cy_as_hal_print_message(KERN_WARNING
			"%s unable to get major %d for cyasblkdev media: %d\n",
			__func__, major, res);
		#endif
		return res;
	}

	if (major == 0)
		major = res;

	#ifndef WESTBRIDGE_NDEBUG
	cy_as_hal_print_message(
		"%s cyasblkdev registered with major number: %d\n",
		__func__, major);
	#endif

	bd = cyasblkdev_blk_alloc();
	if (IS_ERR(bd))
		return PTR_ERR(bd);

	return 0;
}
示例#23
0
文件: ndasblock.c 项目: aeppert/km
static int __init ndas_init(void)
{
	int retval = 0;
	struct ndas_dev *dev;

	func();

	retval = register_blkdev(0, "myndas");
	if (retval <= 0) {
		printk(KERN_ERR "ndas: failed to register device\n");
		return retval;
	} else {
		major_number = retval;
		printk(KERN_INFO "ndas: register device major number %d\n", major_number);
	}

	/* init block device */
	dev = kmalloc(sizeof(struct ndas_dev), GFP_KERNEL);
	if (dev == NULL) {
		printk(KERN_ERR "ndas: failed to allocate memory for device\n");
		goto err1;
	}
	memset(dev, sizeof(struct ndas_dev), 0);
	spin_lock_init(&dev->lock);
	Device = dev;

	/* init queue */
	dev->queue = blk_init_queue(ndas_request, &dev->lock);
	if (dev->queue == NULL) {
		printk(KERN_ERR "ndas: failed to allocate memory for queue\n");
		goto err2;
	}
	blk_queue_logical_block_size(dev->queue, HARDSECT_SIZE);
	dev->queue->queuedata = dev;

	/* gendisk structure */
	dev->gd = alloc_disk(NDAS_MINORS);
	if (dev->gd == NULL) {
		printk(KERN_ERR "ndas: failed to allocate memory for gendisk\n");
		goto err3;
	}
	dev->gd->major = major_number;
	dev->gd->first_minor = 0;
	dev->gd->fops = &blk_ops;
	dev->gd->queue = dev->queue;
	dev->gd->private_data = dev;
	set_capacity(dev->gd, NSECTOR * (HARDSECT_SIZE / KERNEL_SECTOR_SIZE));
	snprintf(dev->gd->disk_name, 6, "myndas");
	add_disk(dev->gd);
	return 0;
err3:
	blk_cleanup_queue(dev->queue);
err2:
	kfree(dev);
err1:
	Device = NULL;
	unregister_blkdev(major_number, "ndas");
	return -ENOMEM;
}
示例#24
0
文件: ltp_block_dev.c 项目: 1587/ltp
static int tc03(void)
{
	int major, major2, major3;
	int pass = 4;

	prk_info("Test Case 3: register_blkdev() with major != 0\n");

	/* autosearch for a free major number */
	major = register_blkdev(0, BLK_DEV_NAME);
	prk_debug("major = %i\n", major);

	if (major > 0) {
		unregister_blkdev(major, BLK_DEV_NAME);

		/* expected to return 0 */
		major2 = register_blkdev(major, BLK_DEV_NAME);

		/* this call has to fail with EBUSY return value */
		major3 = register_blkdev(major, BLK_DEV_NAME);

		if (major2 == 0) {
			unregister_blkdev(major, BLK_DEV_NAME);
		} else {
			pass = 0;
			prk_debug("1st call to register_blkdev() with major=%i "
				"failed with error %i\n", major, major2);
		}

		if (major3 == 0) {
			unregister_blkdev(major, BLK_DEV_NAME);
			pass = 0;
		} else {
			if (major3 != -EBUSY)
				pass = 0;
			prk_debug("2nd call to register_blkdev() with major=%i "
				"failed with error %i\n", major, major3);
		}

	} else {
		pass = 0;
		prk_debug("register_blkdev() failed with error %i\n", major);
	}

	prk_info("Test Case Result: %s\n", result_str(pass));
	return pass;
}
示例#25
0
static int __init ramblk_init(void)
{
	int ramblk_major;
	struct request_queue *rq; //unuseful
	ramblk_major = register_blkdev(0, "firo-ramblk");
	if (ramblk_major < 0){
		printk("blk major is over!\n");
		return -EBUSY
	}
示例#26
0
static int __init mbd_init(void)
{
	int err = -ENOMEM;
	int i;

	for (i = 0; i < MAX_MBD; i++) {
		struct gendisk *disk = alloc_disk(1);
		if (!disk)
			goto out;
		mbd_dev[i].disk = disk;
		/*
		 * The new linux 2.5 block layer implementation requires
		 * every gendisk to have its very own request_queue struct.
		 * These structs are big so we dynamically allocate them.
		 */
		disk->queue = blk_init_queue(do_mbd_request, &mbd_lock);
		if (!disk->queue) {
			put_disk(disk);
			goto out;
		}
	}

	if (register_blkdev(MAJOR_NR, "mbd")) {
		err = -EIO;
		goto out;
	}
#ifdef MODULE
	printk("mambo bogus disk: registered device at major %d\n", MAJOR_NR);
#else
	printk("mambo bogus disk: compiled in with kernel\n");
#endif

	devfs_mk_dir("mambobd");
	for (i = 0; i < MAX_MBD; i++) {	/* load defaults */
		struct gendisk *disk = mbd_dev[i].disk;
		mbd_dev[i].initialized = 0;
		mbd_dev[i].refcnt = 0;
		mbd_dev[i].flags = 0;
		disk->major = MAJOR_NR;
		disk->first_minor = i;
		disk->fops = &mbd_fops;
		disk->private_data = &mbd_dev[i];
		sprintf(disk->disk_name, "mambobd%d", i);
		sprintf(disk->devfs_name, "mambobd%d", i);
		set_capacity(disk, 0x7ffffc00ULL << 1);	/* 2 TB */
		add_disk(disk);
	}

	return 0;
      out:
	while (i--) {
		if (mbd_dev[i].disk->queue)
			blk_cleanup_queue(mbd_dev[i].disk->queue);
		put_disk(mbd_dev[i].disk);
	}
	return -EIO;
}
示例#27
0
static int memcon_init(void)
{
	int ret;

	memset(&raid_drv, 0, sizeof(raid_drv));
	raid_drv.driver_mem_size = 53872u;

#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 20)
	raid_drv.ioreq_slab = kmem_cache_create("io_request",
		sizeof(struct io_request), 0, SLAB_HWCACHE_ALIGN, NULL, NULL);
#else
	raid_drv.ioreq_slab = kmem_cache_create("io_request",
		sizeof(struct io_request), 0, SLAB_HWCACHE_ALIGN, NULL);
#endif
	if (!raid_drv.ioreq_slab) {
		DPRINTK(ERR, "memcon init: ioreq slab init failed\n");
		ret = -ENOMEM;
		goto failed_create_ioreq_slab;
	}

	ret = pblaze_virt_bus_register();
	if (ret) {
		DPRINTK(ERR, "memcon: unable to register bus\n");
		goto failed_register_virbus;
	}

	raid_drv.major = register_blkdev(raid_drv.major, "memcon");
	if (unlikely(raid_drv.major < 0)) {
		DPRINTK(ERR, "memcon: unable to get major number\n");
		ret = raid_drv.major;
		goto failed_register_blkdev;
	}

	init_MUTEX(&raid_drv.sem);
	INIT_LIST_HEAD(&raid_list);
	spin_lock_init(&raid_list_lock);

	ret = pci_register_driver(&pblaze_pcie_driver);
	if (ret < 0) {
		DPRINTK(ERR, "pci_register_driver failed\n");
		goto failed_register_driver;
	}

	DPRINTK(DEBUG, "memcon init success\n");
	return 0;

failed_register_driver:
	unregister_blkdev(raid_drv.major, "memcon");
failed_register_blkdev:
	pblaze_virt_bus_unregister();
failed_register_virbus:
	kmem_cache_destroy(raid_drv.ioreq_slab);
failed_create_ioreq_slab:
	return ret;
}
示例#28
0
/**
* @brief 	SD driver initial function.
* @return 	SUCCESS/ERROR_ID.
*/
static int __init gp_sdcard_init(void)
{
	int i;
	/* ----- Get registered. ----- */
	sd_major = register_blkdev(sd_major, "sdcard");
	if (sd_major <= 0) 
	{
		DERROR(KERN_WARNING "SD card : unable to get major number\n");
		return -EBUSY;
	}
	/* ----- Allocate the device array, and initialize each one. ----- */
	sd_info = kmalloc(SD_NUM*sizeof (gpSDInfo_t), GFP_KERNEL);
	if (sd_info == NULL)
		goto out_unregister;
	/* ----- Initial SD information ----- */
	for(i=0; i<SD_NUM; i++)
	{
		gpSDInfo_t *sd = &sd_info[i];
		/* ----- Clear memory ----- */
		memset (sd, 0, sizeof (gpSDInfo_t));
		sd->device_id = i;
		/* ----- Initial spinlock ----- */
		spin_lock_init(&sd->lock);
		spin_lock_init(&sd->hal_lock);
		/* ----- Initial work queue ----- */
		INIT_WORK(&sd->init, gp_sdcard_work_init);
		INIT_WORK(&sd->uninit, gp_sdcard_work_uninit);
		if(i==0)
		{
			/* ----- request IO function ----- */
			sd->sd_func = gp_board_get_config("sd0",gp_board_sd_t);
			/* ----- Initial dma module ----- */
			sd->dma_param.module = SD0;
		}
		else
		{
			/* ----- request IO function ----- */
			sd->sd_func = gp_board_get_config("sd1",gp_board_sd_t);
			/* ----- Initial dma module ----- */
			sd->dma_param.module = SD1;
		}
		/* ----- Init timer ----- */
		init_timer(&sd->timer);
		sd->timer.data = (unsigned long) sd;
		sd->timer.function = gp_sdcard_timer_fn;
		sd->timer.expires = jiffies + SD_CD_POLL;
		add_timer(&sd->timer);
	}
	gp_sdio_init();
	return 0;
out_unregister:
	unregister_blkdev(sd_major, "sdcard");
	return -ENOMEM;
}
示例#29
0
文件: xsysace.c 项目: cilynx/dd-wrt
/* ---------------------------------------------------------------------
 * Module init/exit routines
 */
static int __init ace_init(void)
{
	ace_major = register_blkdev(ace_major, "xsysace");
	if (ace_major <= 0) {
		printk(KERN_WARNING "xsysace: register_blkdev() failed\n");
		return ace_major;
	}

	pr_debug("Registering Xilinx SystemACE driver, major=%i\n", ace_major);
	return driver_register(&ace_driver);
}
示例#30
0
static __init void romdisk_init(void)
{
	struct blkdev * dev;
	struct romdisk * romdisk;
	u64_t size, rem;

	dev = malloc(sizeof(struct blkdev));
	if(!dev)
		return;

	romdisk = malloc(sizeof(struct romdisk));
	if(!romdisk)
	{
		free(dev);
		return;
	}

	snprintf(romdisk->name, 32, "romdisk");
	romdisk->start = (void *)__romdisk_start;
	romdisk->end = (void *)__romdisk_end;
	romdisk->busy = FALSE;

	if((romdisk->end - romdisk->start) <= 0)
	{
		free(romdisk);
		free(dev);
		return;
	}

	size = (u64_t)(romdisk->end - romdisk->start);
	rem = div64_64(&size, SZ_512);
	if(rem > 0)
		size++;

	romdisk->busy	= FALSE;

	dev->name		= romdisk->name;
	dev->type		= BLK_DEV_ROMDISK;
	dev->blksz		= SZ_512;
	dev->blkcnt		= size;
	dev->open 		= romdisk_open;
	dev->read 		= romdisk_read;
	dev->write		= romdisk_write;
	dev->ioctl 		= romdisk_ioctl;
	dev->close		= romdisk_close;
	dev->driver	 = romdisk;

	if(!register_blkdev(dev))
	{
		free(romdisk);
		free(dev);
		return;
	}
}