equal
deleted
inserted
replaced
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 |