Commit 84d25c7d0f91f90e1343253a5826b37016822151
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); |