1
2
3
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
55static const struct tty_port_client_operations default_client_ops = {
56 .receive_buf = tty_port_default_receive_buf,
57 .write_wakeup = tty_port_default_wakeup,
58};
59
60void tty_port_init(struct tty_port *port)
61{
62 memset(port, 0, sizeof(*port));
63 tty_buffer_init(port);
64 init_waitqueue_head(&port->open_wait);
65 init_waitqueue_head(&port->delta_msr_wait);
66 mutex_init(&port->mutex);
67 mutex_init(&port->buf_mutex);
68 spin_lock_init(&port->lock);
69 port->close_delay = (50 * HZ) / 100;
70 port->closing_wait = (3000 * HZ) / 100;
71 port->client_ops = &default_client_ops;
72 kref_init(&port->kref);
73}
74EXPORT_SYMBOL(tty_port_init);
75
76
77
78
79
80
81
82
83
84
85
86
87void tty_port_link_device(struct tty_port *port,
88 struct tty_driver *driver, unsigned index)
89{
90 if (WARN_ON(index >= driver->num))
91 return;
92 driver->ports[index] = port;
93}
94EXPORT_SYMBOL_GPL(tty_port_link_device);
95
96
97
98
99
100
101
102
103
104
105
106
107struct device *tty_port_register_device(struct tty_port *port,
108 struct tty_driver *driver, unsigned index,
109 struct device *device)
110{
111 return tty_port_register_device_attr(port, driver, index, device, NULL, NULL);
112}
113EXPORT_SYMBOL_GPL(tty_port_register_device);
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128struct device *tty_port_register_device_attr(struct tty_port *port,
129 struct tty_driver *driver, unsigned index,
130 struct device *device, void *drvdata,
131 const struct attribute_group **attr_grp)
132{
133 tty_port_link_device(port, driver, index);
134 return tty_register_device_attr(driver, index, device, drvdata,
135 attr_grp);
136}
137EXPORT_SYMBOL_GPL(tty_port_register_device_attr);
138
139
140
141
142
143
144
145
146
147
148
149
150
151struct device *tty_port_register_device_attr_serdev(struct tty_port *port,
152 struct tty_driver *driver, unsigned index,
153 struct device *device, void *drvdata,
154 const struct attribute_group **attr_grp)
155{
156 struct device *dev;
157
158 tty_port_link_device(port, driver, index);
159
160 dev = serdev_tty_port_register(port, device, driver, index);
161 if (PTR_ERR(dev) != -ENODEV) {
162
163 return dev;
164 }
165
166 return tty_register_device_attr(driver, index, device, drvdata,
167 attr_grp);
168}
169EXPORT_SYMBOL_GPL(tty_port_register_device_attr_serdev);
170
171
172
173
174
175
176
177
178
179
180
181struct device *tty_port_register_device_serdev(struct tty_port *port,
182 struct tty_driver *driver, unsigned index,
183 struct device *device)
184{
185 return tty_port_register_device_attr_serdev(port, driver, index,
186 device, NULL, NULL);
187}
188EXPORT_SYMBOL_GPL(tty_port_register_device_serdev);
189
190
191
192
193
194
195
196
197
198
199
200void tty_port_unregister_device(struct tty_port *port,
201 struct tty_driver *driver, unsigned index)
202{
203 int ret;
204
205 ret = serdev_tty_port_unregister(port);
206 if (ret == 0)
207 return;
208
209 tty_unregister_device(driver, index);
210}
211EXPORT_SYMBOL_GPL(tty_port_unregister_device);
212
213int tty_port_alloc_xmit_buf(struct tty_port *port)
214{
215
216 mutex_lock(&port->buf_mutex);
217 if (port->xmit_buf == NULL)
218 port->xmit_buf = (unsigned char *)get_zeroed_page(GFP_KERNEL);
219 mutex_unlock(&port->buf_mutex);
220 if (port->xmit_buf == NULL)
221 return -ENOMEM;
222 return 0;
223}
224EXPORT_SYMBOL(tty_port_alloc_xmit_buf);
225
226void tty_port_free_xmit_buf(struct tty_port *port)
227{
228 mutex_lock(&port->buf_mutex);
229 if (port->xmit_buf != NULL) {
230 free_page((unsigned long)port->xmit_buf);
231 port->xmit_buf = NULL;
232 }
233 mutex_unlock(&port->buf_mutex);
234}
235EXPORT_SYMBOL(tty_port_free_xmit_buf);
236
237
238
239
240
241
242
243
244
245void tty_port_destroy(struct tty_port *port)
246{
247 tty_buffer_cancel_work(port);
248 tty_buffer_free_all(port);
249}
250EXPORT_SYMBOL(tty_port_destroy);
251
252static void tty_port_destructor(struct kref *kref)
253{
254 struct tty_port *port = container_of(kref, struct tty_port, kref);
255
256
257 if (WARN_ON(port->itty))
258 return;
259 if (port->xmit_buf)
260 free_page((unsigned long)port->xmit_buf);
261 tty_port_destroy(port);
262 if (port->ops && port->ops->destruct)
263 port->ops->destruct(port);
264 else
265 kfree(port);
266}
267
268void tty_port_put(struct tty_port *port)
269{
270 if (port)
271 kref_put(&port->kref, tty_port_destructor);
272}
273EXPORT_SYMBOL(tty_port_put);
274
275
276
277
278
279
280
281
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
297
298
299
300
301
302
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
325
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
339
340
341
342
343
344
345
346
347void tty_port_hangup(struct tty_port *port)
348{
349 struct tty_struct *tty;
350 unsigned long flags;
351
352 spin_lock_irqsave(&port->lock, flags);
353 port->count = 0;
354 tty = port->tty;
355 if (tty)
356 set_bit(TTY_IO_ERROR, &tty->flags);
357 port->tty = NULL;
358 spin_unlock_irqrestore(&port->lock, flags);
359 tty_port_set_active(port, 0);
360 tty_port_shutdown(port, tty);
361 tty_kref_put(tty);
362 wake_up_interruptible(&port->open_wait);
363 wake_up_interruptible(&port->delta_msr_wait);
364}
365EXPORT_SYMBOL(tty_port_hangup);
366
367
368
369
370
371
372
373void tty_port_tty_hangup(struct tty_port *port, bool check_clocal)
374{
375 struct tty_struct *tty = tty_port_tty_get(port);
376
377 if (tty && (!check_clocal || !C_CLOCAL(tty)))
378 tty_hangup(tty);
379 tty_kref_put(tty);
380}
381EXPORT_SYMBOL_GPL(tty_port_tty_hangup);
382
383
384
385
386
387
388void tty_port_tty_wakeup(struct tty_port *port)
389{
390 port->client_ops->write_wakeup(port);
391}
392EXPORT_SYMBOL_GPL(tty_port_tty_wakeup);
393
394
395
396
397
398
399
400
401
402
403int tty_port_carrier_raised(struct tty_port *port)
404{
405 if (port->ops->carrier_raised == NULL)
406 return 1;
407 return port->ops->carrier_raised(port);
408}
409EXPORT_SYMBOL(tty_port_carrier_raised);
410
411
412
413
414
415
416
417
418
419
420void tty_port_raise_dtr_rts(struct tty_port *port)
421{
422 if (port->ops->dtr_rts)
423 port->ops->dtr_rts(port, 1);
424}
425EXPORT_SYMBOL(tty_port_raise_dtr_rts);
426
427
428
429
430
431
432
433
434
435
436void tty_port_lower_dtr_rts(struct tty_port *port)
437{
438 if (port->ops->dtr_rts)
439 port->ops->dtr_rts(port, 0);
440}
441EXPORT_SYMBOL(tty_port_lower_dtr_rts);
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468int tty_port_block_til_ready(struct tty_port *port,
469 struct tty_struct *tty, struct file *filp)
470{
471 int do_clocal = 0, retval;
472 unsigned long flags;
473 DEFINE_WAIT(wait);
474
475
476
477 if (tty_io_error(tty)) {
478 tty_port_set_active(port, 1);
479 return 0;
480 }
481 if (filp == NULL || (filp->f_flags & O_NONBLOCK)) {
482
483 if (C_BAUD(tty))
484 tty_port_raise_dtr_rts(port);
485 tty_port_set_active(port, 1);
486 return 0;
487 }
488
489 if (C_CLOCAL(tty))
490 do_clocal = 1;
491
492
493
494
495
496 retval = 0;
497
498
499 spin_lock_irqsave(&port->lock, flags);
500 port->count--;
501 port->blocked_open++;
502 spin_unlock_irqrestore(&port->lock, flags);
503
504 while (1) {
505
506 if (C_BAUD(tty) && tty_port_initialized(port))
507 tty_port_raise_dtr_rts(port);
508
509 prepare_to_wait(&port->open_wait, &wait, TASK_INTERRUPTIBLE);
510
511
512 if (tty_hung_up_p(filp) || !tty_port_initialized(port)) {
513 if (port->flags & ASYNC_HUP_NOTIFY)
514 retval = -EAGAIN;
515 else
516 retval = -ERESTARTSYS;
517 break;
518 }
519
520
521
522
523
524
525 if (do_clocal || tty_port_carrier_raised(port))
526 break;
527 if (signal_pending(current)) {
528 retval = -ERESTARTSYS;
529 break;
530 }
531 tty_unlock(tty);
532 schedule();
533 tty_lock(tty);
534 }
535 finish_wait(&port->open_wait, &wait);
536
537
538
539 spin_lock_irqsave(&port->lock, flags);
540 if (!tty_hung_up_p(filp))
541 port->count++;
542 port->blocked_open--;
543 spin_unlock_irqrestore(&port->lock, flags);
544 if (retval == 0)
545 tty_port_set_active(port, 1);
546 return retval;
547}
548EXPORT_SYMBOL(tty_port_block_til_ready);
549
550static void tty_port_drain_delay(struct tty_port *port, struct tty_struct *tty)
551{
552 unsigned int bps = tty_get_baud_rate(tty);
553 long timeout;
554
555 if (bps > 1200) {
556 timeout = (HZ * 10 * port->drain_delay) / bps;
557 timeout = max_t(long, timeout, HZ / 10);
558 } else {
559 timeout = 2 * HZ;
560 }
561 schedule_timeout_interruptible(timeout);
562}
563
564
565int tty_port_close_start(struct tty_port *port,
566 struct tty_struct *tty, struct file *filp)
567{
568 unsigned long flags;
569
570 if (tty_hung_up_p(filp))
571 return 0;
572
573 spin_lock_irqsave(&port->lock, flags);
574 if (tty->count == 1 && port->count != 1) {
575 tty_warn(tty, "%s: tty->count = 1 port count = %d\n", __func__,
576 port->count);
577 port->count = 1;
578 }
579 if (--port->count < 0) {
580 tty_warn(tty, "%s: bad port count (%d)\n", __func__,
581 port->count);
582 port->count = 0;
583 }
584
585 if (port->count) {
586 spin_unlock_irqrestore(&port->lock, flags);
587 return 0;
588 }
589 spin_unlock_irqrestore(&port->lock, flags);
590
591 tty->closing = 1;
592
593 if (tty_port_initialized(port)) {
594
595 if (tty->flow_stopped)
596 tty_driver_flush_buffer(tty);
597 if (port->closing_wait != ASYNC_CLOSING_WAIT_NONE)
598 tty_wait_until_sent(tty, port->closing_wait);
599 if (port->drain_delay)
600 tty_port_drain_delay(port, tty);
601 }
602
603 tty_ldisc_flush(tty);
604
605
606 return 1;
607}
608EXPORT_SYMBOL(tty_port_close_start);
609
610
611void tty_port_close_end(struct tty_port *port, struct tty_struct *tty)
612{
613 unsigned long flags;
614
615 tty_ldisc_flush(tty);
616 tty->closing = 0;
617
618 spin_lock_irqsave(&port->lock, flags);
619
620 if (port->blocked_open) {
621 spin_unlock_irqrestore(&port->lock, flags);
622 if (port->close_delay)
623 msleep_interruptible(jiffies_to_msecs(port->close_delay));
624 spin_lock_irqsave(&port->lock, flags);
625 wake_up_interruptible(&port->open_wait);
626 }
627 spin_unlock_irqrestore(&port->lock, flags);
628 tty_port_set_active(port, 0);
629}
630EXPORT_SYMBOL(tty_port_close_end);
631
632
633
634
635
636
637void tty_port_close(struct tty_port *port, struct tty_struct *tty,
638 struct file *filp)
639{
640 if (tty_port_close_start(port, tty, filp) == 0)
641 return;
642 tty_port_shutdown(port, tty);
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
651
652
653
654
655
656
657
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
669
670
671
672
673
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
685
686
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 if (retval) {
696 mutex_unlock(&port->mutex);
697 return retval;
698 }
699 }
700 tty_port_set_initialized(port, 1);
701 }
702 mutex_unlock(&port->mutex);
703 return tty_port_block_til_ready(port, tty, filp);
704}
705
706EXPORT_SYMBOL(tty_port_open);
707