tty/module.c
changeset 1570 7a2a58107dd8
parent 1569 61f5f4c35883
child 1571 88167b8589ef
equal deleted inserted replaced
1569:61f5f4c35883 1570:7a2a58107dd8
    43 #include "../master/globals.h"
    43 #include "../master/globals.h"
    44 #include "../include/ectty.h"
    44 #include "../include/ectty.h"
    45 
    45 
    46 /*****************************************************************************/
    46 /*****************************************************************************/
    47 
    47 
       
    48 #define PFX "ec_tty: "
       
    49 
    48 #define EC_TTY_MAX_DEVICES 10
    50 #define EC_TTY_MAX_DEVICES 10
    49 
    51 
    50 /*****************************************************************************/
    52 /*****************************************************************************/
    51 
    53 
    52 char *ec_master_version_str = EC_MASTER_VERSION; /**< Version string. */
    54 char *ec_master_version_str = EC_MASTER_VERSION; /**< Version string. */
       
    55 unsigned int debug_level = 0;
    53 
    56 
    54 static struct tty_driver *tty_driver = NULL;
    57 static struct tty_driver *tty_driver = NULL;
    55 ec_tty_t *ttys[EC_TTY_MAX_DEVICES];
    58 ec_tty_t *ttys[EC_TTY_MAX_DEVICES];
    56 struct semaphore tty_sem;
    59 struct semaphore tty_sem;
    57 
    60 
    62 MODULE_AUTHOR("Florian Pose <fp@igh-essen.com>");
    65 MODULE_AUTHOR("Florian Pose <fp@igh-essen.com>");
    63 MODULE_DESCRIPTION("EtherCAT TTY driver module");
    66 MODULE_DESCRIPTION("EtherCAT TTY driver module");
    64 MODULE_LICENSE("GPL");
    67 MODULE_LICENSE("GPL");
    65 MODULE_VERSION(EC_MASTER_VERSION);
    68 MODULE_VERSION(EC_MASTER_VERSION);
    66 
    69 
    67 unsigned int debug_level = 0;
       
    68 module_param_named(debug_level, debug_level, uint, S_IRUGO);
    70 module_param_named(debug_level, debug_level, uint, S_IRUGO);
    69 MODULE_PARM_DESC(debug_level, "Debug level");
    71 MODULE_PARM_DESC(debug_level, "Debug level");
    70 
    72 
    71 /** \endcond */
    73 /** \endcond */
    72 
    74 
   101  */
   103  */
   102 int __init ec_tty_init_module(void)
   104 int __init ec_tty_init_module(void)
   103 {
   105 {
   104     int i, ret = 0;
   106     int i, ret = 0;
   105 
   107 
   106     EC_INFO("TTY driver %s\n", EC_MASTER_VERSION);
   108     printk(KERN_INFO PFX "TTY driver %s\n", EC_MASTER_VERSION);
   107 
   109 
   108     init_MUTEX(&tty_sem);
   110     init_MUTEX(&tty_sem);
   109 
   111 
   110     for (i = 0; i < EC_TTY_MAX_DEVICES; i++) {
   112     for (i = 0; i < EC_TTY_MAX_DEVICES; i++) {
   111         ttys[i] = NULL;
   113         ttys[i] = NULL;
   112     }
   114     }
   113 
   115 
   114     tty_driver = alloc_tty_driver(EC_TTY_MAX_DEVICES);
   116     tty_driver = alloc_tty_driver(EC_TTY_MAX_DEVICES);
   115     if (!tty_driver) {
   117     if (!tty_driver) {
   116         EC_ERR("Failed to allocate tty driver.\n");
   118         printk(KERN_ERR PFX "Failed to allocate tty driver.\n");
   117         ret = -ENOMEM;
   119         ret = -ENOMEM;
   118         goto out_return;
   120         goto out_return;
   119     }
   121     }
   120 
   122 
   121     tty_driver->owner = THIS_MODULE;
   123     tty_driver->owner = THIS_MODULE;
   130     tty_driver->init_termios.c_cflag = B9600 | CS8 | CREAD | HUPCL | CLOCAL;
   132     tty_driver->init_termios.c_cflag = B9600 | CS8 | CREAD | HUPCL | CLOCAL;
   131     tty_set_operations(tty_driver, &ec_tty_ops);
   133     tty_set_operations(tty_driver, &ec_tty_ops);
   132 
   134 
   133     ret = tty_register_driver(tty_driver);
   135     ret = tty_register_driver(tty_driver);
   134     if (ret) {
   136     if (ret) {
   135         EC_ERR("Failed to register tty driver.\n");
   137         printk(KERN_ERR PFX "Failed to register tty driver.\n");
   136         goto out_put;
   138         goto out_put;
   137     }
   139     }
   138 
   140 
   139     return ret;
   141     return ret;
   140         
   142         
   152  */
   154  */
   153 void __exit ec_tty_cleanup_module(void)
   155 void __exit ec_tty_cleanup_module(void)
   154 {
   156 {
   155     tty_unregister_driver(tty_driver);
   157     tty_unregister_driver(tty_driver);
   156     put_tty_driver(tty_driver);
   158     put_tty_driver(tty_driver);
   157     EC_INFO("TTY module cleaned up.\n");
   159     printk(KERN_INFO PFX "Module unloading.\n");
   158 }
   160 }
   159 
   161 
   160 /*****************************************************************************/
   162 /*****************************************************************************/
   161 
   163 
   162 int ec_tty_init(ec_tty_t *tty, int minor)
   164 int ec_tty_init(ec_tty_t *tty, int minor)
   163 {
   165 {
   164     tty->minor = minor;
   166     tty->minor = minor;
   165 
   167 
   166     tty->dev = tty_register_device(tty_driver, tty->minor, NULL);
   168     tty->dev = tty_register_device(tty_driver, tty->minor, NULL);
   167     if (IS_ERR(tty->dev)) {
   169     if (IS_ERR(tty->dev)) {
   168         EC_ERR("Failed to register tty device.\n");
   170         printk(KERN_ERR PFX "Failed to register tty device.\n");
   169         return PTR_ERR(tty->dev);
   171         return PTR_ERR(tty->dev);
   170     }
   172     }
   171 
   173 
   172     return 0;
   174     return 0;
   173 }
   175 }
   222     for (minor = 0; minor < EC_TTY_MAX_DEVICES; minor++) {
   224     for (minor = 0; minor < EC_TTY_MAX_DEVICES; minor++) {
   223         if (!ttys[minor]) {
   225         if (!ttys[minor]) {
   224             tty = kmalloc(sizeof(ec_tty_t), GFP_KERNEL);
   226             tty = kmalloc(sizeof(ec_tty_t), GFP_KERNEL);
   225             if (!tty) {
   227             if (!tty) {
   226                 up(&tty_sem);
   228                 up(&tty_sem);
   227                 EC_ERR("Failed to allocate memory for tty device.\n");
   229                 printk(KERN_ERR PFX "Failed to allocate memory.\n");
   228                 return ERR_PTR(-ENOMEM);
   230                 return ERR_PTR(-ENOMEM);
   229             }
   231             }
   230 
   232 
   231             ret = ec_tty_init(tty, minor);
   233             ret = ec_tty_init(tty, minor);
   232             if (ret) {
   234             if (ret) {
   240             return tty;
   242             return tty;
   241         }
   243         }
   242     }
   244     }
   243 
   245 
   244     up(&tty_sem);
   246     up(&tty_sem);
       
   247     printk(KERN_ERR PFX "No free interfaces avaliable.\n");
   245     return ERR_PTR(-EBUSY);
   248     return ERR_PTR(-EBUSY);
   246 }
   249 }
   247 
   250 
   248 /*****************************************************************************/
   251 /*****************************************************************************/
   249 
   252 
   250 void ectty_free(ec_tty_t *tty)
   253 void ectty_free(ec_tty_t *tty)
   251 {
   254 {
   252     int minor = tty->minor;
       
   253     ec_tty_clear(tty);
   255     ec_tty_clear(tty);
   254     ttys[minor] = NULL;
   256     ttys[tty->minor] = NULL;
   255     kfree(tty);
   257     kfree(tty);
   256 }
   258 }
   257 
   259 
   258 /*****************************************************************************/
   260 /*****************************************************************************/
   259 
   261