]> rtime.felk.cvut.cz Git - linux-imx.git/blob - drivers/tty/tty_port.c
virtio-scsi: Fix virtqueue affinity setup
[linux-imx.git] / drivers / tty / tty_port.c
1 /*
2  * Tty port functions
3  */
4
5 #include <linux/types.h>
6 #include <linux/errno.h>
7 #include <linux/tty.h>
8 #include <linux/tty_driver.h>
9 #include <linux/tty_flip.h>
10 #include <linux/serial.h>
11 #include <linux/timer.h>
12 #include <linux/string.h>
13 #include <linux/slab.h>
14 #include <linux/sched.h>
15 #include <linux/init.h>
16 #include <linux/wait.h>
17 #include <linux/bitops.h>
18 #include <linux/delay.h>
19 #include <linux/module.h>
20
21 void tty_port_init(struct tty_port *port)
22 {
23         memset(port, 0, sizeof(*port));
24         tty_buffer_init(port);
25         init_waitqueue_head(&port->open_wait);
26         init_waitqueue_head(&port->close_wait);
27         init_waitqueue_head(&port->delta_msr_wait);
28         mutex_init(&port->mutex);
29         mutex_init(&port->buf_mutex);
30         spin_lock_init(&port->lock);
31         port->close_delay = (50 * HZ) / 100;
32         port->closing_wait = (3000 * HZ) / 100;
33         kref_init(&port->kref);
34 }
35 EXPORT_SYMBOL(tty_port_init);
36
37 /**
38  * tty_port_link_device - link tty and tty_port
39  * @port: tty_port of the device
40  * @driver: tty_driver for this device
41  * @index: index of the tty
42  *
43  * Provide the tty layer wit ha link from a tty (specified by @index) to a
44  * tty_port (@port). Use this only if neither tty_port_register_device nor
45  * tty_port_install is used in the driver. If used, this has to be called before
46  * tty_register_driver.
47  */
48 void tty_port_link_device(struct tty_port *port,
49                 struct tty_driver *driver, unsigned index)
50 {
51         if (WARN_ON(index >= driver->num))
52                 return;
53         driver->ports[index] = port;
54 }
55 EXPORT_SYMBOL_GPL(tty_port_link_device);
56
57 /**
58  * tty_port_register_device - register tty device
59  * @port: tty_port of the device
60  * @driver: tty_driver for this device
61  * @index: index of the tty
62  * @device: parent if exists, otherwise NULL
63  *
64  * It is the same as tty_register_device except the provided @port is linked to
65  * a concrete tty specified by @index. Use this or tty_port_install (or both).
66  * Call tty_port_link_device as a last resort.
67  */
68 struct device *tty_port_register_device(struct tty_port *port,
69                 struct tty_driver *driver, unsigned index,
70                 struct device *device)
71 {
72         tty_port_link_device(port, driver, index);
73         return tty_register_device(driver, index, device);
74 }
75 EXPORT_SYMBOL_GPL(tty_port_register_device);
76
77 /**
78  * tty_port_register_device_attr - register tty device
79  * @port: tty_port of the device
80  * @driver: tty_driver for this device
81  * @index: index of the tty
82  * @device: parent if exists, otherwise NULL
83  * @drvdata: Driver data to be set to device.
84  * @attr_grp: Attribute group to be set on device.
85  *
86  * It is the same as tty_register_device_attr except the provided @port is
87  * linked to a concrete tty specified by @index. Use this or tty_port_install
88  * (or both). Call tty_port_link_device as a last resort.
89  */
90 struct device *tty_port_register_device_attr(struct tty_port *port,
91                 struct tty_driver *driver, unsigned index,
92                 struct device *device, void *drvdata,
93                 const struct attribute_group **attr_grp)
94 {
95         tty_port_link_device(port, driver, index);
96         return tty_register_device_attr(driver, index, device, drvdata,
97                         attr_grp);
98 }
99 EXPORT_SYMBOL_GPL(tty_port_register_device_attr);
100
101 int tty_port_alloc_xmit_buf(struct tty_port *port)
102 {
103         /* We may sleep in get_zeroed_page() */
104         mutex_lock(&port->buf_mutex);
105         if (port->xmit_buf == NULL)
106                 port->xmit_buf = (unsigned char *)get_zeroed_page(GFP_KERNEL);
107         mutex_unlock(&port->buf_mutex);
108         if (port->xmit_buf == NULL)
109                 return -ENOMEM;
110         return 0;
111 }
112 EXPORT_SYMBOL(tty_port_alloc_xmit_buf);
113
114 void tty_port_free_xmit_buf(struct tty_port *port)
115 {
116         mutex_lock(&port->buf_mutex);
117         if (port->xmit_buf != NULL) {
118                 free_page((unsigned long)port->xmit_buf);
119                 port->xmit_buf = NULL;
120         }
121         mutex_unlock(&port->buf_mutex);
122 }
123 EXPORT_SYMBOL(tty_port_free_xmit_buf);
124
125 /**
126  * tty_port_destroy -- destroy inited port
127  * @port: tty port to be doestroyed
128  *
129  * When a port was initialized using tty_port_init, one has to destroy the
130  * port by this function. Either indirectly by using tty_port refcounting
131  * (tty_port_put) or directly if refcounting is not used.
132  */
133 void tty_port_destroy(struct tty_port *port)
134 {
135         cancel_work_sync(&port->buf.work);
136         tty_buffer_free_all(port);
137 }
138 EXPORT_SYMBOL(tty_port_destroy);
139
140 static void tty_port_destructor(struct kref *kref)
141 {
142         struct tty_port *port = container_of(kref, struct tty_port, kref);
143         if (port->xmit_buf)
144                 free_page((unsigned long)port->xmit_buf);
145         tty_port_destroy(port);
146         if (port->ops && port->ops->destruct)
147                 port->ops->destruct(port);
148         else
149                 kfree(port);
150 }
151
152 void tty_port_put(struct tty_port *port)
153 {
154         if (port)
155                 kref_put(&port->kref, tty_port_destructor);
156 }
157 EXPORT_SYMBOL(tty_port_put);
158
159 /**
160  *      tty_port_tty_get        -       get a tty reference
161  *      @port: tty port
162  *
163  *      Return a refcount protected tty instance or NULL if the port is not
164  *      associated with a tty (eg due to close or hangup)
165  */
166
167 struct tty_struct *tty_port_tty_get(struct tty_port *port)
168 {
169         unsigned long flags;
170         struct tty_struct *tty;
171
172         spin_lock_irqsave(&port->lock, flags);
173         tty = tty_kref_get(port->tty);
174         spin_unlock_irqrestore(&port->lock, flags);
175         return tty;
176 }
177 EXPORT_SYMBOL(tty_port_tty_get);
178
179 /**
180  *      tty_port_tty_set        -       set the tty of a port
181  *      @port: tty port
182  *      @tty: the tty
183  *
184  *      Associate the port and tty pair. Manages any internal refcounts.
185  *      Pass NULL to deassociate a port
186  */
187
188 void tty_port_tty_set(struct tty_port *port, struct tty_struct *tty)
189 {
190         unsigned long flags;
191
192         spin_lock_irqsave(&port->lock, flags);
193         if (port->tty)
194                 tty_kref_put(port->tty);
195         port->tty = tty_kref_get(tty);
196         spin_unlock_irqrestore(&port->lock, flags);
197 }
198 EXPORT_SYMBOL(tty_port_tty_set);
199
200 static void tty_port_shutdown(struct tty_port *port, struct tty_struct *tty)
201 {
202         mutex_lock(&port->mutex);
203         if (port->console)
204                 goto out;
205
206         if (test_and_clear_bit(ASYNCB_INITIALIZED, &port->flags)) {
207                 /*
208                  * Drop DTR/RTS if HUPCL is set. This causes any attached
209                  * modem to hang up the line.
210                  */
211                 if (tty && C_HUPCL(tty))
212                         tty_port_lower_dtr_rts(port);
213
214                 if (port->ops->shutdown)
215                         port->ops->shutdown(port);
216         }
217 out:
218         mutex_unlock(&port->mutex);
219 }
220
221 /**
222  *      tty_port_hangup         -       hangup helper
223  *      @port: tty port
224  *
225  *      Perform port level tty hangup flag and count changes. Drop the tty
226  *      reference.
227  */
228
229 void tty_port_hangup(struct tty_port *port)
230 {
231         struct tty_struct *tty;
232         unsigned long flags;
233
234         spin_lock_irqsave(&port->lock, flags);
235         port->count = 0;
236         port->flags &= ~ASYNC_NORMAL_ACTIVE;
237         tty = port->tty;
238         if (tty)
239                 set_bit(TTY_IO_ERROR, &tty->flags);
240         port->tty = NULL;
241         spin_unlock_irqrestore(&port->lock, flags);
242         tty_port_shutdown(port, tty);
243         tty_kref_put(tty);
244         wake_up_interruptible(&port->open_wait);
245         wake_up_interruptible(&port->delta_msr_wait);
246 }
247 EXPORT_SYMBOL(tty_port_hangup);
248
249 /**
250  * tty_port_tty_hangup - helper to hang up a tty
251  *
252  * @port: tty port
253  * @check_clocal: hang only ttys with CLOCAL unset?
254  */
255 void tty_port_tty_hangup(struct tty_port *port, bool check_clocal)
256 {
257         struct tty_struct *tty = tty_port_tty_get(port);
258
259         if (tty && (!check_clocal || !C_CLOCAL(tty))) {
260                 tty_hangup(tty);
261                 tty_kref_put(tty);
262         }
263 }
264 EXPORT_SYMBOL_GPL(tty_port_tty_hangup);
265
266 /**
267  * tty_port_tty_wakeup - helper to wake up a tty
268  *
269  * @port: tty port
270  */
271 void tty_port_tty_wakeup(struct tty_port *port)
272 {
273         struct tty_struct *tty = tty_port_tty_get(port);
274
275         if (tty) {
276                 tty_wakeup(tty);
277                 tty_kref_put(tty);
278         }
279 }
280 EXPORT_SYMBOL_GPL(tty_port_tty_wakeup);
281
282 /**
283  *      tty_port_carrier_raised -       carrier raised check
284  *      @port: tty port
285  *
286  *      Wrapper for the carrier detect logic. For the moment this is used
287  *      to hide some internal details. This will eventually become entirely
288  *      internal to the tty port.
289  */
290
291 int tty_port_carrier_raised(struct tty_port *port)
292 {
293         if (port->ops->carrier_raised == NULL)
294                 return 1;
295         return port->ops->carrier_raised(port);
296 }
297 EXPORT_SYMBOL(tty_port_carrier_raised);
298
299 /**
300  *      tty_port_raise_dtr_rts  -       Raise DTR/RTS
301  *      @port: tty port
302  *
303  *      Wrapper for the DTR/RTS raise logic. For the moment this is used
304  *      to hide some internal details. This will eventually become entirely
305  *      internal to the tty port.
306  */
307
308 void tty_port_raise_dtr_rts(struct tty_port *port)
309 {
310         if (port->ops->dtr_rts)
311                 port->ops->dtr_rts(port, 1);
312 }
313 EXPORT_SYMBOL(tty_port_raise_dtr_rts);
314
315 /**
316  *      tty_port_lower_dtr_rts  -       Lower DTR/RTS
317  *      @port: tty port
318  *
319  *      Wrapper for the DTR/RTS raise logic. For the moment this is used
320  *      to hide some internal details. This will eventually become entirely
321  *      internal to the tty port.
322  */
323
324 void tty_port_lower_dtr_rts(struct tty_port *port)
325 {
326         if (port->ops->dtr_rts)
327                 port->ops->dtr_rts(port, 0);
328 }
329 EXPORT_SYMBOL(tty_port_lower_dtr_rts);
330
331 /**
332  *      tty_port_block_til_ready        -       Waiting logic for tty open
333  *      @port: the tty port being opened
334  *      @tty: the tty device being bound
335  *      @filp: the file pointer of the opener
336  *
337  *      Implement the core POSIX/SuS tty behaviour when opening a tty device.
338  *      Handles:
339  *              - hangup (both before and during)
340  *              - non blocking open
341  *              - rts/dtr/dcd
342  *              - signals
343  *              - port flags and counts
344  *
345  *      The passed tty_port must implement the carrier_raised method if it can
346  *      do carrier detect and the dtr_rts method if it supports software
347  *      management of these lines. Note that the dtr/rts raise is done each
348  *      iteration as a hangup may have previously dropped them while we wait.
349  */
350
351 int tty_port_block_til_ready(struct tty_port *port,
352                                 struct tty_struct *tty, struct file *filp)
353 {
354         int do_clocal = 0, retval;
355         unsigned long flags;
356         DEFINE_WAIT(wait);
357
358         /* block if port is in the process of being closed */
359         if (tty_hung_up_p(filp) || port->flags & ASYNC_CLOSING) {
360                 wait_event_interruptible_tty(tty, port->close_wait,
361                                 !(port->flags & ASYNC_CLOSING));
362                 if (port->flags & ASYNC_HUP_NOTIFY)
363                         return -EAGAIN;
364                 else
365                         return -ERESTARTSYS;
366         }
367
368         /* if non-blocking mode is set we can pass directly to open unless
369            the port has just hung up or is in another error state */
370         if (tty->flags & (1 << TTY_IO_ERROR)) {
371                 port->flags |= ASYNC_NORMAL_ACTIVE;
372                 return 0;
373         }
374         if (filp->f_flags & O_NONBLOCK) {
375                 /* Indicate we are open */
376                 if (tty->termios.c_cflag & CBAUD)
377                         tty_port_raise_dtr_rts(port);
378                 port->flags |= ASYNC_NORMAL_ACTIVE;
379                 return 0;
380         }
381
382         if (C_CLOCAL(tty))
383                 do_clocal = 1;
384
385         /* Block waiting until we can proceed. We may need to wait for the
386            carrier, but we must also wait for any close that is in progress
387            before the next open may complete */
388
389         retval = 0;
390
391         /* The port lock protects the port counts */
392         spin_lock_irqsave(&port->lock, flags);
393         if (!tty_hung_up_p(filp))
394                 port->count--;
395         port->blocked_open++;
396         spin_unlock_irqrestore(&port->lock, flags);
397
398         while (1) {
399                 /* Indicate we are open */
400                 if (C_BAUD(tty) && test_bit(ASYNCB_INITIALIZED, &port->flags))
401                         tty_port_raise_dtr_rts(port);
402
403                 prepare_to_wait(&port->open_wait, &wait, TASK_INTERRUPTIBLE);
404                 /* Check for a hangup or uninitialised port.
405                                                         Return accordingly */
406                 if (tty_hung_up_p(filp) || !(port->flags & ASYNC_INITIALIZED)) {
407                         if (port->flags & ASYNC_HUP_NOTIFY)
408                                 retval = -EAGAIN;
409                         else
410                                 retval = -ERESTARTSYS;
411                         break;
412                 }
413                 /*
414                  * Probe the carrier. For devices with no carrier detect
415                  * tty_port_carrier_raised will always return true.
416                  * Never ask drivers if CLOCAL is set, this causes troubles
417                  * on some hardware.
418                  */
419                 if (!(port->flags & ASYNC_CLOSING) &&
420                                 (do_clocal || tty_port_carrier_raised(port)))
421                         break;
422                 if (signal_pending(current)) {
423                         retval = -ERESTARTSYS;
424                         break;
425                 }
426                 tty_unlock(tty);
427                 schedule();
428                 tty_lock(tty);
429         }
430         finish_wait(&port->open_wait, &wait);
431
432         /* Update counts. A parallel hangup will have set count to zero and
433            we must not mess that up further */
434         spin_lock_irqsave(&port->lock, flags);
435         if (!tty_hung_up_p(filp))
436                 port->count++;
437         port->blocked_open--;
438         if (retval == 0)
439                 port->flags |= ASYNC_NORMAL_ACTIVE;
440         spin_unlock_irqrestore(&port->lock, flags);
441         return retval;
442 }
443 EXPORT_SYMBOL(tty_port_block_til_ready);
444
445 static void tty_port_drain_delay(struct tty_port *port, struct tty_struct *tty)
446 {
447         unsigned int bps = tty_get_baud_rate(tty);
448         long timeout;
449
450         if (bps > 1200) {
451                 timeout = (HZ * 10 * port->drain_delay) / bps;
452                 timeout = max_t(long, timeout, HZ / 10);
453         } else {
454                 timeout = 2 * HZ;
455         }
456         schedule_timeout_interruptible(timeout);
457 }
458
459 int tty_port_close_start(struct tty_port *port,
460                                 struct tty_struct *tty, struct file *filp)
461 {
462         unsigned long flags;
463
464         spin_lock_irqsave(&port->lock, flags);
465         if (tty_hung_up_p(filp)) {
466                 spin_unlock_irqrestore(&port->lock, flags);
467                 return 0;
468         }
469
470         if (tty->count == 1 && port->count != 1) {
471                 printk(KERN_WARNING
472                     "tty_port_close_start: tty->count = 1 port count = %d.\n",
473                                                                 port->count);
474                 port->count = 1;
475         }
476         if (--port->count < 0) {
477                 printk(KERN_WARNING "tty_port_close_start: count = %d\n",
478                                                                 port->count);
479                 port->count = 0;
480         }
481
482         if (port->count) {
483                 spin_unlock_irqrestore(&port->lock, flags);
484                 if (port->ops->drop)
485                         port->ops->drop(port);
486                 return 0;
487         }
488         set_bit(ASYNCB_CLOSING, &port->flags);
489         tty->closing = 1;
490         spin_unlock_irqrestore(&port->lock, flags);
491
492         if (test_bit(ASYNCB_INITIALIZED, &port->flags)) {
493                 /* Don't block on a stalled port, just pull the chain */
494                 if (tty->flow_stopped)
495                         tty_driver_flush_buffer(tty);
496                 if (port->closing_wait != ASYNC_CLOSING_WAIT_NONE)
497                         tty_wait_until_sent_from_close(tty, port->closing_wait);
498                 if (port->drain_delay)
499                         tty_port_drain_delay(port, tty);
500         }
501         /* Flush the ldisc buffering */
502         tty_ldisc_flush(tty);
503
504         /* Don't call port->drop for the last reference. Callers will want
505            to drop the last active reference in ->shutdown() or the tty
506            shutdown path */
507         return 1;
508 }
509 EXPORT_SYMBOL(tty_port_close_start);
510
511 void tty_port_close_end(struct tty_port *port, struct tty_struct *tty)
512 {
513         unsigned long flags;
514
515         spin_lock_irqsave(&port->lock, flags);
516         tty->closing = 0;
517
518         if (port->blocked_open) {
519                 spin_unlock_irqrestore(&port->lock, flags);
520                 if (port->close_delay) {
521                         msleep_interruptible(
522                                 jiffies_to_msecs(port->close_delay));
523                 }
524                 spin_lock_irqsave(&port->lock, flags);
525                 wake_up_interruptible(&port->open_wait);
526         }
527         port->flags &= ~(ASYNC_NORMAL_ACTIVE | ASYNC_CLOSING);
528         wake_up_interruptible(&port->close_wait);
529         spin_unlock_irqrestore(&port->lock, flags);
530 }
531 EXPORT_SYMBOL(tty_port_close_end);
532
533 void tty_port_close(struct tty_port *port, struct tty_struct *tty,
534                                                         struct file *filp)
535 {
536         if (tty_port_close_start(port, tty, filp) == 0)
537                 return;
538         tty_port_shutdown(port, tty);
539         set_bit(TTY_IO_ERROR, &tty->flags);
540         tty_port_close_end(port, tty);
541         tty_port_tty_set(port, NULL);
542 }
543 EXPORT_SYMBOL(tty_port_close);
544
545 /**
546  * tty_port_install - generic tty->ops->install handler
547  * @port: tty_port of the device
548  * @driver: tty_driver for this device
549  * @tty: tty to be installed
550  *
551  * It is the same as tty_standard_install except the provided @port is linked
552  * to a concrete tty specified by @tty. Use this or tty_port_register_device
553  * (or both). Call tty_port_link_device as a last resort.
554  */
555 int tty_port_install(struct tty_port *port, struct tty_driver *driver,
556                 struct tty_struct *tty)
557 {
558         tty->port = port;
559         return tty_standard_install(driver, tty);
560 }
561 EXPORT_SYMBOL_GPL(tty_port_install);
562
563 int tty_port_open(struct tty_port *port, struct tty_struct *tty,
564                                                         struct file *filp)
565 {
566         spin_lock_irq(&port->lock);
567         if (!tty_hung_up_p(filp))
568                 ++port->count;
569         spin_unlock_irq(&port->lock);
570         tty_port_tty_set(port, tty);
571
572         /*
573          * Do the device-specific open only if the hardware isn't
574          * already initialized. Serialize open and shutdown using the
575          * port mutex.
576          */
577
578         mutex_lock(&port->mutex);
579
580         if (!test_bit(ASYNCB_INITIALIZED, &port->flags)) {
581                 clear_bit(TTY_IO_ERROR, &tty->flags);
582                 if (port->ops->activate) {
583                         int retval = port->ops->activate(port, tty);
584                         if (retval) {
585                                 mutex_unlock(&port->mutex);
586                                 return retval;
587                         }
588                 }
589                 set_bit(ASYNCB_INITIALIZED, &port->flags);
590         }
591         mutex_unlock(&port->mutex);
592         return tty_port_block_til_ready(port, tty, filp);
593 }
594
595 EXPORT_SYMBOL(tty_port_open);