Commit 84d25c7d0f91f90e1343253a5826b37016822151

Authored by Marco Aurelio da Costa
1 parent c5a9bd66

Added parameter 'pairs' to select the number of pair of ports

Default value is 4
Showing 1 changed file with 20 additions and 7 deletions
module/tty0tty.c
@@ -51,9 +51,12 @@ MODULE_AUTHOR( DRIVER_AUTHOR ); @@ -51,9 +51,12 @@ MODULE_AUTHOR( DRIVER_AUTHOR );
51 MODULE_DESCRIPTION( DRIVER_DESC ); 51 MODULE_DESCRIPTION( DRIVER_DESC );
52 MODULE_LICENSE("GPL"); 52 MODULE_LICENSE("GPL");
53 53
  54 +short pairs = 4; //Default number of pairs of devices
  55 +module_param(pairs, short, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP);
  56 +MODULE_PARM_DESC(pairs, "Number of pairs of devices to be created, maximum of 128");
  57 +
54 58
55 #define TTY0TTY_MAJOR 240 /* experimental range */ 59 #define TTY0TTY_MAJOR 240 /* experimental range */
56 -#define TTY0TTY_MINORS 8 /* device number, always even*/  
57 60
58 /* fake UART values */ 61 /* fake UART values */
59 //out 62 //out
@@ -67,7 +70,7 @@ MODULE_LICENSE("GPL"); @@ -67,7 +70,7 @@ MODULE_LICENSE("GPL");
67 #define MSR_RI 0x80 70 #define MSR_RI 0x80
68 71
69 72
70 -static struct tty_port tport[TTY0TTY_MINORS]; 73 +static struct tty_port *tport;
71 74
72 struct tty0tty_serial { 75 struct tty0tty_serial {
73 struct tty_struct *tty; /* pointer to the tty for this device */ 76 struct tty_struct *tty; /* pointer to the tty for this device */
@@ -85,7 +88,7 @@ struct tty0tty_serial { @@ -85,7 +88,7 @@ struct tty0tty_serial {
85 88
86 }; 89 };
87 90
88 -static struct tty0tty_serial *tty0tty_table[TTY0TTY_MINORS]; /* initially all NULL */ 91 +static struct tty0tty_serial **tty0tty_table; /* initially all NULL */
89 92
90 93
91 static int tty0tty_open(struct tty_struct *tty, struct file *file) 94 static int tty0tty_open(struct tty_struct *tty, struct file *file)
@@ -623,12 +626,20 @@ static int __init tty0tty_init(void) @@ -623,12 +626,20 @@ static int __init tty0tty_init(void)
623 { 626 {
624 int retval; 627 int retval;
625 int i; 628 int i;
  629 + if (pairs > 128) pairs = 128;
  630 + if (pairs < 1) pairs = 1;
  631 + tport = kmalloc(2*pairs*sizeof(struct tty_port),GFP_KERNEL);
  632 + tty0tty_table = kmalloc(2*pairs*sizeof(struct tty0tty_serial*),GFP_KERNEL);
626 633
  634 + for(i=0;i<2*pairs;i++)
  635 + {
  636 + tty0tty_table[i] = NULL;
  637 + }
627 #ifdef SCULL_DEBUG 638 #ifdef SCULL_DEBUG
628 printk(KERN_DEBUG "%s - \n", __FUNCTION__); 639 printk(KERN_DEBUG "%s - \n", __FUNCTION__);
629 #endif 640 #endif
630 /* allocate the tty driver */ 641 /* allocate the tty driver */
631 - tty0tty_tty_driver = alloc_tty_driver(TTY0TTY_MINORS); 642 + tty0tty_tty_driver = alloc_tty_driver(2*pairs);
632 if (!tty0tty_tty_driver) 643 if (!tty0tty_tty_driver)
633 return -ENOMEM; 644 return -ENOMEM;
634 645
@@ -653,7 +664,7 @@ static int __init tty0tty_init(void) @@ -653,7 +664,7 @@ static int __init tty0tty_init(void)
653 664
654 tty_set_operations(tty0tty_tty_driver, &serial_ops); 665 tty_set_operations(tty0tty_tty_driver, &serial_ops);
655 666
656 - for(i=0;i<TTY0TTY_MINORS;i++) 667 + for(i=0;i<2*pairs;i++)
657 { 668 {
658 tty_port_init(&tport[i]); 669 tty_port_init(&tport[i]);
659 #if LINUX_VERSION_CODE >= KERNEL_VERSION(3,7,0) 670 #if LINUX_VERSION_CODE >= KERNEL_VERSION(3,7,0)
@@ -680,7 +691,7 @@ static void __exit tty0tty_exit(void) @@ -680,7 +691,7 @@ static void __exit tty0tty_exit(void)
680 #ifdef SCULL_DEBUG 691 #ifdef SCULL_DEBUG
681 printk(KERN_DEBUG "%s - \n", __FUNCTION__); 692 printk(KERN_DEBUG "%s - \n", __FUNCTION__);
682 #endif 693 #endif
683 - for (i = 0; i < TTY0TTY_MINORS; ++i) 694 + for (i = 0; i < 2*pairs; ++i)
684 { 695 {
685 #if LINUX_VERSION_CODE >= KERNEL_VERSION(3,7,0) 696 #if LINUX_VERSION_CODE >= KERNEL_VERSION(3,7,0)
686 tty_port_destroy(&tport[i]); 697 tty_port_destroy(&tport[i]);
@@ -690,7 +701,7 @@ static void __exit tty0tty_exit(void) @@ -690,7 +701,7 @@ static void __exit tty0tty_exit(void)
690 tty_unregister_driver(tty0tty_tty_driver); 701 tty_unregister_driver(tty0tty_tty_driver);
691 702
692 /* shut down all of the timers and free the memory */ 703 /* shut down all of the timers and free the memory */
693 - for (i = 0; i < TTY0TTY_MINORS; ++i) { 704 + for (i = 0; i < 2*pairs; ++i) {
694 tty0tty = tty0tty_table[i]; 705 tty0tty = tty0tty_table[i];
695 if (tty0tty) { 706 if (tty0tty) {
696 /* close the port */ 707 /* close the port */
@@ -702,6 +713,8 @@ static void __exit tty0tty_exit(void) @@ -702,6 +713,8 @@ static void __exit tty0tty_exit(void)
702 tty0tty_table[i] = NULL; 713 tty0tty_table[i] = NULL;
703 } 714 }
704 } 715 }
  716 + kfree(tport);
  717 + kfree(tty0tty_table);
705 } 718 }
706 719
707 module_init(tty0tty_init); 720 module_init(tty0tty_init);