Staging: comedi: Added some validation of comedi module parameter values.
[linux-block.git] / drivers / staging / comedi / comedi_fops.c
index 018c964396dfdd941e66070393b1bdfe059b6341..1464f550a5af61fa1359ff61002db20a8f85daa7 100644 (file)
@@ -59,6 +59,12 @@ int comedi_debug;
 module_param(comedi_debug, int, 0644);
 #endif
 
+int comedi_autoconfig = 1;
+module_param(comedi_autoconfig, bool, 0444);
+
+int comedi_num_legacy_minors = 0;
+module_param(comedi_num_legacy_minors, int, 0444);
+
 static DEFINE_SPINLOCK(comedi_file_info_table_lock);
 static struct comedi_device_file_info
     *comedi_file_info_table[COMEDI_NUM_MINORS];
@@ -1893,7 +1899,7 @@ static void comedi_cleanup_legacy_minors(void)
 {
        unsigned i;
 
-       for (i = 0; i < COMEDI_NUM_LEGACY_MINORS; i++)
+       for (i = 0; i < comedi_num_legacy_minors; i++)
                comedi_free_board_minor(i);
 }
 
@@ -1905,6 +1911,22 @@ static int __init comedi_init(void)
        printk(KERN_INFO "comedi: version " COMEDI_RELEASE
               " - http://www.comedi.org\n");
 
+       if (comedi_num_legacy_minors < 0 ||
+           comedi_num_legacy_minors > COMEDI_NUM_BOARD_MINORS) {
+               printk(KERN_ERR "comedi: error: invalid value for module "
+                      "parameter \"comedi_num_legacy_minors\".  Valid values "
+                      "are 0 through %i.\n", COMEDI_NUM_BOARD_MINORS);
+               return -EINVAL;
+       }
+
+       /*
+        * comedi is unusable if both comedi_autoconfig and
+        * comedi_num_legacy_minors are zero, so we might as well adjust the
+        * defaults in that case
+        */
+       if (comedi_autoconfig == 0 && comedi_num_legacy_minors == 0)
+               comedi_num_legacy_minors = 16;
+
        memset(comedi_file_info_table, 0,
               sizeof(struct comedi_device_file_info *) * COMEDI_NUM_MINORS);
 
@@ -1933,7 +1955,7 @@ static int __init comedi_init(void)
        comedi_proc_init();
 
        /* create devices files for legacy/manual use */
-       for (i = 0; i < COMEDI_NUM_LEGACY_MINORS; i++) {
+       for (i = 0; i < comedi_num_legacy_minors; i++) {
                int minor;
                minor = comedi_alloc_board_minor(NULL);
                if (minor < 0) {
@@ -2182,7 +2204,7 @@ int comedi_alloc_subdevice_minor(comedi_device *dev, comedi_subdevice *s)
        info->read_subdevice = s;
        info->write_subdevice = s;
        comedi_spin_lock_irqsave(&comedi_file_info_table_lock, flags);
-       for (i = COMEDI_FIRST_SUBDEVICE_MINOR; i < COMEDI_NUM_BOARD_MINORS; ++i) {
+       for (i = COMEDI_FIRST_SUBDEVICE_MINOR; i < COMEDI_NUM_MINORS; ++i) {
                if (comedi_file_info_table[i] == NULL) {
                        comedi_file_info_table[i] = info;
                        break;