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