From: "Kenneth Chen" Even though there is a CONFIG_MAX_RAW_DEVS option, it doesn't actually increase the number of raw devices beyond 256 because during the char registration, it uses the standard register_chrdev() interface which has hard coded 256 minor in it. Here is a patch that fix this problem by using register_chrdev_region() and cdev_(init/add/del) functions. --- 25-akpm/drivers/char/raw.c | 25 +++++++++++++++++++++++-- 1 files changed, 23 insertions(+), 2 deletions(-) diff -puN drivers/char/raw.c~more-raw-devices drivers/char/raw.c --- 25/drivers/char/raw.c~more-raw-devices 2004-03-15 22:04:45.549998112 -0800 +++ 25-akpm/drivers/char/raw.c 2004-03-15 22:04:45.552997656 -0800 @@ -17,6 +17,7 @@ #include #include #include +#include #include @@ -260,11 +261,26 @@ static struct file_operations raw_ctl_fo .owner = THIS_MODULE, }; +static struct cdev raw_cdev = { + .kobj = {.name = "raw", }, + .owner = THIS_MODULE, +}; + static int __init raw_init(void) { int i; + dev_t dev = MKDEV(RAW_MAJOR, 0); + + if (register_chrdev_region(dev, MAX_RAW_MINORS, "raw")) + goto error; + + cdev_init(&raw_cdev, &raw_fops); + if (cdev_add(&raw_cdev, dev, MAX_RAW_MINORS)) { + kobject_put(&raw_cdev.kobj); + unregister_chrdev_region(dev, MAX_RAW_MINORS); + goto error; + } - register_chrdev(RAW_MAJOR, "raw", &raw_fops); devfs_mk_cdev(MKDEV(RAW_MAJOR, 0), S_IFCHR | S_IRUGO | S_IWUGO, "raw/rawctl"); @@ -273,6 +289,10 @@ static int __init raw_init(void) S_IFCHR | S_IRUGO | S_IWUGO, "raw/raw%d", i); return 0; + +error: + printk(KERN_ERR "error register raw device\n"); + return 1; } static void __exit raw_exit(void) @@ -283,7 +303,8 @@ static void __exit raw_exit(void) devfs_remove("raw/raw%d", i); devfs_remove("raw/rawctl"); devfs_remove("raw"); - unregister_chrdev(RAW_MAJOR, "raw"); + cdev_del(&raw_cdev); + unregister_chrdev_region(MKDEV(RAW_MAJOR, 0), MAX_RAW_MINORS); } module_init(raw_init); _