3 * Copyright 1999 Digi International (www.digi.com)
4 * Gene Olson <Gene_Olson at digi dot com>
5 * James Puzzo <jamesp at digi dot com>
7 * Scott Kilau <scottk at digi dot com>
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2, or (at your option)
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY, EXPRESS OR IMPLIED; without even the
16 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
17 * PURPOSE. See the GNU General Public License for more details.
29 * This file implements the tty driver functionality for the
30 * RealPort driver software.
39 #include <linux/slab.h>
40 #include <linux/tty.h>
41 #include <linux/tty_flip.h>
42 #include <linux/sched.h>
43 #include <linux/uaccess.h>
45 #include "dgrp_common.h"
47 #ifndef _POSIX_VDISABLE
48 #define _POSIX_VDISABLE ('\0')
52 * forward declarations
55 static void drp_param(struct ch_struct
*);
56 static void dgrp_tty_close(struct tty_struct
*, struct file
*);
58 /* ioctl helper functions */
59 static int set_modem_info(struct ch_struct
*, unsigned int, unsigned int *);
60 static int get_modem_info(struct ch_struct
*, unsigned int *);
61 static void dgrp_set_custom_speed(struct ch_struct
*, int);
62 static int dgrp_tty_digigetedelay(struct tty_struct
*, int *);
63 static int dgrp_tty_digisetedelay(struct tty_struct
*, int *);
64 static int dgrp_send_break(struct ch_struct
*, int);
66 static ushort
tty_to_ch_flags(struct tty_struct
*, char);
67 static tcflag_t
ch_to_tty_flags(unsigned short, char);
69 static void dgrp_tty_input_start(struct tty_struct
*);
70 static void dgrp_tty_input_stop(struct tty_struct
*);
72 static void drp_wmove(struct ch_struct
*, int, void*, int);
74 static int dgrp_tty_open(struct tty_struct
*, struct file
*);
75 static void dgrp_tty_close(struct tty_struct
*, struct file
*);
76 static int dgrp_tty_write(struct tty_struct
*, const unsigned char *, int);
77 static int dgrp_tty_write_room(struct tty_struct
*);
78 static void dgrp_tty_flush_buffer(struct tty_struct
*);
79 static int dgrp_tty_chars_in_buffer(struct tty_struct
*);
80 static int dgrp_tty_ioctl(struct tty_struct
*, unsigned int, unsigned long);
81 static void dgrp_tty_set_termios(struct tty_struct
*, struct ktermios
*);
82 static void dgrp_tty_stop(struct tty_struct
*);
83 static void dgrp_tty_start(struct tty_struct
*);
84 static void dgrp_tty_throttle(struct tty_struct
*);
85 static void dgrp_tty_unthrottle(struct tty_struct
*);
86 static void dgrp_tty_hangup(struct tty_struct
*);
87 static int dgrp_tty_put_char(struct tty_struct
*, unsigned char);
88 static int dgrp_tty_tiocmget(struct tty_struct
*);
89 static int dgrp_tty_tiocmset(struct tty_struct
*, unsigned int, unsigned int);
90 static int dgrp_tty_send_break(struct tty_struct
*, int);
91 static void dgrp_tty_send_xchar(struct tty_struct
*, char);
96 #define SERIAL_TYPE_NORMAL 1
97 #define SERIAL_TYPE_CALLOUT 2
98 #define SERIAL_TYPE_XPRINT 3
102 * tty globals/statics
106 #define PORTSERVER_DIVIDEND 1843200
109 * Default transparent print information.
111 static struct digi_struct digi_init
= {
112 .digi_flags
= DIGI_COOK
, /* Flags */
113 .digi_maxcps
= 100, /* Max CPS */
114 .digi_maxchar
= 50, /* Max chars in print queue */
115 .digi_bufsize
= 100, /* Printer buffer size */
116 .digi_onlen
= 4, /* size of printer on string */
117 .digi_offlen
= 4, /* size of printer off string */
118 .digi_onstr
= "\033[5i", /* ANSI printer on string */
119 .digi_offstr
= "\033[4i", /* ANSI printer off string */
120 .digi_term
= "ansi" /* default terminal type */
124 * Define a local default termios struct. All ports will be created
125 * with this termios initially.
127 * This defines a raw port at 9600 baud, 8 data bits, no parity,
130 static struct ktermios DefaultTermios
= {
131 .c_iflag
= (ICRNL
| IXON
),
132 .c_oflag
= (OPOST
| ONLCR
),
133 .c_cflag
= (B9600
| CS8
| CREAD
| HUPCL
| CLOCAL
),
134 .c_lflag
= (ISIG
| ICANON
| ECHO
| ECHOE
| ECHOK
| ECHOCTL
140 /* Define our tty operations struct */
141 static const struct tty_operations dgrp_tty_ops
= {
142 .open
= dgrp_tty_open
,
143 .close
= dgrp_tty_close
,
144 .write
= dgrp_tty_write
,
145 .write_room
= dgrp_tty_write_room
,
146 .flush_buffer
= dgrp_tty_flush_buffer
,
147 .chars_in_buffer
= dgrp_tty_chars_in_buffer
,
149 .ioctl
= dgrp_tty_ioctl
,
150 .set_termios
= dgrp_tty_set_termios
,
151 .stop
= dgrp_tty_stop
,
152 .start
= dgrp_tty_start
,
153 .throttle
= dgrp_tty_throttle
,
154 .unthrottle
= dgrp_tty_unthrottle
,
155 .hangup
= dgrp_tty_hangup
,
156 .put_char
= dgrp_tty_put_char
,
157 .tiocmget
= dgrp_tty_tiocmget
,
158 .tiocmset
= dgrp_tty_tiocmset
,
159 .break_ctl
= dgrp_tty_send_break
,
160 .send_xchar
= dgrp_tty_send_xchar
164 static int calc_baud_rate(struct un_struct
*un
)
174 static struct baud_rates baud_rates
[] = {
197 brate
= C_BAUD(un
->un_tty
);
199 for (i
= 0; baud_rates
[i
].rate
; i
++) {
200 if (baud_rates
[i
].cflag
== brate
)
204 return baud_rates
[i
].rate
;
207 static int calc_fastbaud_rate(struct un_struct
*un
, struct ktermios
*uts
)
212 ulong bauds
[2][16] = {
214 0, 57600, 76800, 115200,
215 131657, 153600, 230400, 460800,
216 921600, 1200, 1800, 2400,
217 4800, 9600, 19200, 38400 },
218 { /* fastbaud & CBAUDEX */
219 0, 57600, 115200, 230400,
220 460800, 150, 200, 921600,
221 600, 1200, 1800, 2400,
222 4800, 9600, 19200, 38400 }
225 brate
= C_BAUD(un
->un_tty
) & 0xff;
227 i
= (uts
->c_cflag
& CBAUDEX
) ? 1 : 0;
230 if ((i
>= 0) && (i
< 2) && (brate
>= 0) && (brate
< 16))
231 brate
= bauds
[i
][brate
];
239 * drp_param() -- send parameter values to be sent to the node
240 * @ch: channel structure of port to modify
242 * Interprets the tty and modem changes made by an application
243 * program (by examining the termios structures) and sets up
244 * parameter values to be sent to the node.
246 static void drp_param(struct ch_struct
*ch
)
248 struct nd_struct
*nd
;
249 struct un_struct
*un
;
254 struct ktermios
*tts
, *pts
, *uts
;
259 * If the terminal device is open, use it to set up all tty
260 * modes and functions. Otherwise use the printer device.
263 if (ch
->ch_tun
.un_open_count
) {
266 tts
= &ch
->ch_tun
.un_tty
->termios
;
269 * If both devices are open, copy critical line
270 * parameters from the tty device to the printer,
271 * so that if the tty is closed, the printer will
272 * continue without disruption.
275 if (ch
->ch_pun
.un_open_count
) {
277 pts
= &ch
->ch_pun
.un_tty
->termios
;
280 (pts
->c_cflag
^ tts
->c_cflag
) &
281 (CBAUD
| CSIZE
| CSTOPB
| CREAD
| PARENB
|
282 PARODD
| HUPCL
| CLOCAL
);
285 (pts
->c_iflag
^ tts
->c_iflag
) &
286 (IGNBRK
| BRKINT
| IGNPAR
| PARMRK
| INPCK
|
287 ISTRIP
| IXON
| IXANY
| IXOFF
);
289 pts
->c_cc
[VSTART
] = tts
->c_cc
[VSTART
];
290 pts
->c_cc
[VSTOP
] = tts
->c_cc
[VSTOP
];
292 } else if (ch
->ch_pun
.un_open_count
== 0) {
293 pr_warn("%s - ch_pun.un_open_count shouldn't be 0\n",
300 uts
= &un
->un_tty
->termios
;
303 * Determine if FAST writes can be performed.
306 if ((ch
->ch_digi
.digi_flags
& DIGI_COOK
) != 0 &&
307 (ch
->ch_tun
.un_open_count
!= 0) &&
308 !((un
->un_tty
)->ldisc
->ops
->flags
& LDISC_FLAG_DEFINED
) &&
309 !(L_XCASE(un
->un_tty
))) {
310 ch
->ch_flag
|= CH_FAST_WRITE
;
312 ch
->ch_flag
&= ~CH_FAST_WRITE
;
316 * If FAST writes can be performed, and OPOST is on in the
317 * terminal device, do OPOST handling in the server.
320 if ((ch
->ch_flag
& CH_FAST_WRITE
) &&
321 O_OPOST(un
->un_tty
) != 0) {
322 int oflag
= tty_to_ch_flags(un
->un_tty
, 'o');
324 /* add to ch_ocook any processing flags set in the termio */
325 ch
->ch_ocook
|= oflag
& (OF_OLCUC
|
332 * the hpux driver clears any flags set in ch_ocook
333 * from the termios oflag. It is STILL reported though
337 oflag
= ch_to_tty_flags(ch
->ch_ocook
, 'o');
338 uts
->c_oflag
&= ~oflag
;
341 /* clear the ch->ch_ocook flag */
342 int oflag
= ch_to_tty_flags(ch
->ch_ocook
, 'o');
343 uts
->c_oflag
|= oflag
;
347 ch
->ch_oflag
= ch
->ch_ocook
;
350 ch
->ch_flag
&= ~CH_FAST_READ
;
353 * Generate channel flags
356 if (C_BAUD(un
->un_tty
) == B0
) {
357 if (!(ch
->ch_flag
& CH_BAUD0
)) {
358 /* TODO : the HPUX driver flushes line */
359 /* TODO : discipline, I assume I don't have to */
361 ch
->ch_tout
= ch
->ch_tin
;
362 ch
->ch_rout
= ch
->ch_rin
;
364 ch
->ch_break_time
= 0;
366 ch
->ch_send
|= RR_TX_FLUSH
| RR_RX_FLUSH
;
368 ch
->ch_mout
&= ~(DM_DTR
| DM_RTS
);
370 ch
->ch_flag
|= CH_BAUD0
;
372 } else if (ch
->ch_custom_speed
) {
373 ch
->ch_brate
= PORTSERVER_DIVIDEND
/ ch
->ch_custom_speed
;
375 if (ch
->ch_flag
& CH_BAUD0
) {
376 ch
->ch_mout
|= DM_DTR
| DM_RTS
;
378 ch
->ch_flag
&= ~CH_BAUD0
;
384 * If FASTBAUD isn't on, we can scan the new baud rate list
387 * However, if FASTBAUD is on, we must go to the old
388 * baud rate mapping that existed many many moons ago,
389 * for compatibility reasons.
392 if (!(ch
->ch_digi
.digi_flags
& DIGI_FAST
))
393 brate
= calc_baud_rate(un
);
395 brate
= calc_fastbaud_rate(un
, uts
);
400 ch
->ch_brate
= PORTSERVER_DIVIDEND
/ brate
;
402 if (ch
->ch_flag
& CH_BAUD0
) {
403 ch
->ch_mout
|= DM_DTR
| DM_RTS
;
405 ch
->ch_flag
&= ~CH_BAUD0
;
410 * Generate channel cflags from the termio.
413 ch
->ch_cflag
= tty_to_ch_flags(un
->un_tty
, 'c');
416 * Generate channel iflags from the termio.
419 iflag
= (int) tty_to_ch_flags(un
->un_tty
, 'i');
421 if (START_CHAR(un
->un_tty
) == _POSIX_VDISABLE
||
422 STOP_CHAR(un
->un_tty
) == _POSIX_VDISABLE
) {
423 iflag
&= ~(IF_IXON
| IF_IXANY
| IF_IXOFF
);
426 ch
->ch_iflag
= iflag
;
429 * Generate flow control characters
433 * From the POSIX.1 spec (7.1.2.6): "If {_POSIX_VDISABLE}
434 * is defined for the terminal device file, and the value
435 * of one of the changeable special control characters (see
436 * 7.1.1.9) is {_POSIX_VDISABLE}, that function shall be
437 * disabled, that is, no input data shall be recognized as
438 * the disabled special character."
440 * OK, so we don't ever assign S/DXB XON or XOFF to _POSIX_VDISABLE.
443 if (uts
->c_cc
[VSTART
] != _POSIX_VDISABLE
)
444 ch
->ch_xon
= uts
->c_cc
[VSTART
];
445 if (uts
->c_cc
[VSTOP
] != _POSIX_VDISABLE
)
446 ch
->ch_xoff
= uts
->c_cc
[VSTOP
];
448 ch
->ch_lnext
= (uts
->c_cc
[VLNEXT
] == _POSIX_VDISABLE
? 0 :
452 * Also, if either c_cc[START] or c_cc[STOP] is set to
453 * _POSIX_VDISABLE, we can't really do software flow
454 * control--in either direction--so we turn it off as
455 * far as S/DXB is concerned. In essence, if you disable
456 * one, you disable the other too.
458 if ((uts
->c_cc
[VSTART
] == _POSIX_VDISABLE
) ||
459 (uts
->c_cc
[VSTOP
] == _POSIX_VDISABLE
))
460 ch
->ch_iflag
&= ~(IF_IXOFF
| IF_IXON
);
468 if (ch
->ch_digi
.digi_flags
& DIGI_AIXON
)
471 if ((ch
->ch_xxon
== _POSIX_VDISABLE
) ||
472 (ch
->ch_xxoff
== _POSIX_VDISABLE
))
475 ch
->ch_xflag
= xflag
;
479 * Figure effective DCD value.
482 if (C_CLOCAL(un
->un_tty
))
483 ch
->ch_flag
|= CH_CLOCAL
;
485 ch
->ch_flag
&= ~CH_CLOCAL
;
488 * Check modem signals
494 * Get hardware handshake value.
499 if (C_CRTSCTS(un
->un_tty
))
500 mflow
|= (DM_RTS
| DM_CTS
);
502 if (ch
->ch_digi
.digi_flags
& RTSPACE
)
505 if (ch
->ch_digi
.digi_flags
& DTRPACE
)
508 if (ch
->ch_digi
.digi_flags
& CTSPACE
)
511 if (ch
->ch_digi
.digi_flags
& DSRPACE
)
514 if (ch
->ch_digi
.digi_flags
& DCDPACE
)
517 if (ch
->ch_digi
.digi_flags
& DIGI_RTS_TOGGLE
)
518 mflow
|= DM_RTS_TOGGLE
;
520 ch
->ch_mflow
= mflow
;
523 * Send the changes to the server.
526 ch
->ch_flag
|= CH_PARAM
;
527 (ch
->ch_nd
)->nd_tx_work
= 1;
529 if (waitqueue_active(&ch
->ch_flag_wait
))
530 wake_up_interruptible(&ch
->ch_flag_wait
);
534 * This function is just used as a callback for timeouts
535 * waiting on the ch_sleep flag.
537 static void wake_up_drp_sleep_timer(unsigned long ptr
)
539 struct ch_struct
*ch
= (struct ch_struct
*) ptr
;
541 wake_up(&ch
->ch_sleep
);
546 * Set up our own sleep that can't be cancelled
547 * until our timeout occurs.
549 static void drp_my_sleep(struct ch_struct
*ch
)
551 struct timer_list drp_wakeup_timer
;
552 DECLARE_WAITQUEUE(wait
, current
);
555 * First make sure we're ready to receive the wakeup.
558 add_wait_queue(&ch
->ch_sleep
, &wait
);
559 current
->state
= TASK_UNINTERRUPTIBLE
;
562 * Since we are uninterruptible, set a timer to
563 * unset the uninterruptable state in 1 second.
566 init_timer(&drp_wakeup_timer
);
567 drp_wakeup_timer
.function
= wake_up_drp_sleep_timer
;
568 drp_wakeup_timer
.data
= (unsigned long) ch
;
569 drp_wakeup_timer
.expires
= jiffies
+ (1 * HZ
);
570 add_timer(&drp_wakeup_timer
);
574 del_timer(&drp_wakeup_timer
);
576 remove_wait_queue(&ch
->ch_sleep
, &wait
);
583 * -EBUSY - this is a callout device and the normal device is active
584 * - there is an error in opening the tty
585 * -ENODEV - the channel does not exist
586 * -EAGAIN - we are in the middle of hanging up or closing
587 * - IMMEDIATE_OPEN fails
589 * - if the port is outside physical range
590 * -EINTR - the open is interrupted
593 static int dgrp_tty_open(struct tty_struct
*tty
, struct file
*file
)
596 struct nd_struct
*nd
;
597 struct ch_struct
*ch
;
598 struct un_struct
*un
;
605 int counts_were_incremented
= 0;
607 DECLARE_WAITQUEUE(wait
, current
);
610 * Do some initial checks to see if the node and port exist
613 nd
= nd_struct_get(MAJOR(tty_devnum(tty
)));
614 port
= PORT_NUM(MINOR(tty_devnum(tty
)));
615 category
= OPEN_CATEGORY(MINOR(tty_devnum(tty
)));
620 if (port
>= CHAN_MAX
)
624 * The channel exists.
627 ch
= nd
->nd_chan
+ port
;
629 un
= IS_PRINT(MINOR(tty_devnum(tty
))) ? &ch
->ch_pun
: &ch
->ch_tun
;
631 tty
->driver_data
= un
;
634 * If we are in the middle of hanging up,
635 * then return an error
637 if (tty_hung_up_p(file
)) {
638 retval
= ((un
->un_flag
& UN_HUP_NOTIFY
) ?
639 -EAGAIN
: -ERESTARTSYS
);
644 * If the port is in the middle of closing, then block
645 * until it is done, then try again.
647 retval
= wait_event_interruptible(un
->un_close_wait
,
648 ((un
->un_flag
& UN_CLOSING
) == 0));
654 * If the port is in the middle of a reopen after a network disconnect,
655 * wait until it is done, then try again.
657 retval
= wait_event_interruptible(ch
->ch_flag_wait
,
658 ((ch
->ch_flag
& CH_PORT_GONE
) == 0));
664 * If this is a callout device, then just make sure the normal
665 * device isn't being used.
668 if (tty
->driver
->subtype
== SERIAL_TYPE_CALLOUT
) {
669 if (un
->un_flag
& UN_NORMAL_ACTIVE
) {
673 un
->un_flag
|= UN_CALLOUT_ACTIVE
;
678 * Loop waiting until the open can be successfully completed.
681 spin_lock_irqsave(&nd
->nd_lock
, lock_flags
);
689 * Determine the open type from the flags provided.
693 * If the port is not enabled, then exit
695 if (test_bit(TTY_IO_ERROR
, &tty
->flags
)) {
696 /* there was an error in opening the tty */
697 if (un
->un_flag
& UN_CALLOUT_ACTIVE
)
700 un
->un_flag
|= UN_NORMAL_ACTIVE
;
704 if (file
->f_flags
& O_NONBLOCK
) {
707 * if the O_NONBLOCK is set, errors on read and write
708 * must return -EAGAIN immediately and NOT sleep
711 otype
= OTYPE_IMMEDIATE
;
712 delay_error
= -EAGAIN
;
714 } else if (!OPEN_WAIT_AVAIL(category
) ||
715 (file
->f_flags
& O_NDELAY
) != 0) {
716 otype
= OTYPE_IMMEDIATE
;
717 delay_error
= -EBUSY
;
719 } else if (!OPEN_WAIT_CARRIER(category
) ||
720 ((ch
->ch_digi
.digi_flags
& DIGI_FORCEDCD
) != 0) ||
722 otype
= OTYPE_PERSISTENT
;
726 otype
= OTYPE_INCOMING
;
731 * Handle port currently outside physical port range.
734 if (port
>= nd
->nd_chan_count
) {
735 if (otype
== OTYPE_IMMEDIATE
) {
736 retval
= (nd
->nd_state
== NS_READY
) ?
743 * Handle port not currently open.
746 else if (ch
->ch_open_count
== 0) {
748 * Return an error when an Incoming Open
749 * response indicates the port is busy.
752 if (ch
->ch_open_error
!= 0 && otype
== ch
->ch_otype
) {
753 retval
= (ch
->ch_open_error
<= 2) ?
754 delay_error
: -ENXIO
;
759 * Fail any new Immediate open if we do not have
760 * a normal connection to the server.
763 if (nd
->nd_state
!= NS_READY
&&
764 otype
== OTYPE_IMMEDIATE
) {
770 * If a Realport open of the correct type has
771 * succeeded, complete the open.
774 if (ch
->ch_state
== CS_READY
&& ch
->ch_otype
== otype
)
779 * Handle port already open and active as a device
783 else if ((ch
->ch_category
== category
) ||
784 IS_PRINT(MINOR(tty_devnum(tty
)))) {
786 * Fail if opening the device now would
787 * violate exclusive use.
789 unf
= ch
->ch_tun
.un_flag
| ch
->ch_pun
.un_flag
;
791 if ((file
->f_flags
& O_EXCL
) || (unf
& UN_EXCL
)) {
797 * If the open device is in the hangup state, all
798 * system calls fail except close().
801 /* TODO : check on hangup_p calls */
803 if (ch
->ch_flag
& CH_HANGUP
) {
809 * If the port is ready, and carrier is ignored
810 * or present, then complete the open.
813 if (ch
->ch_state
== CS_READY
&&
814 (otype
!= OTYPE_INCOMING
||
815 ch
->ch_flag
& CH_VIRT_CD
))
822 * Handle port active with a different category device.
826 if (otype
== OTYPE_IMMEDIATE
) {
827 retval
= delay_error
;
833 * Wait until conditions change, then take another
837 ch
->ch_wait_count
[otype
]++;
840 ch
->ch_wait_carrier
++;
843 * Prepare the task to accept the wakeup, then
844 * release our locks and release control.
847 add_wait_queue(&ch
->ch_flag_wait
, &wait
);
848 current
->state
= TASK_INTERRUPTIBLE
;
850 spin_unlock_irqrestore(&nd
->nd_lock
, lock_flags
);
853 * Give up control, we'll come back if we're
854 * interrupted or are woken up.
857 remove_wait_queue(&ch
->ch_flag_wait
, &wait
);
859 spin_lock_irqsave(&nd
->nd_lock
, lock_flags
);
861 current
->state
= TASK_RUNNING
;
863 ch
->ch_wait_count
[otype
]--;
866 ch
->ch_wait_carrier
--;
870 if (signal_pending(current
)) {
877 * The open has succeeded. No turning back.
879 counts_were_incremented
= 1;
884 * Initialize the channel, if it's not already open.
887 if (ch
->ch_open_count
== 1) {
890 ch
->ch_category
= category
;
891 ch
->ch_pscan_state
= 0;
893 /* TODO : find out what PS-1 bug Gene was referring to */
894 /* TODO : in the following comment. */
896 ch
->ch_send
= RR_TX_START
| RR_RX_START
; /* PS-1 bug */
899 ch
->ch_s_mlast
& DM_CD
||
900 ch
->ch_digi
.digi_flags
& DIGI_FORCEDCD
)
901 ch
->ch_flag
|= CH_VIRT_CD
;
902 else if (OPEN_FORCES_CARRIER(category
))
903 ch
->ch_flag
|= CH_VIRT_CD
;
908 * Initialize the unit, if it is not already open.
911 if (un
->un_open_count
== 1) {
913 * Since all terminal options are always sticky in Linux,
914 * we don't need the UN_STICKY flag to be handled specially.
916 /* clears all the digi flags, leaves serial flags */
917 un
->un_flag
&= ~UN_DIGI_MASK
;
919 if (file
->f_flags
& O_EXCL
)
920 un
->un_flag
|= UN_EXCL
;
922 /* TODO : include "session" and "pgrp" */
925 * In Linux, all terminal parameters are intended to be sticky.
926 * as a result, we "remove" the code which once reset the ports
934 un
->un_flag
|= UN_INITIALIZED
;
940 spin_unlock_irqrestore(&nd
->nd_lock
, lock_flags
);
944 * Linux does a close for every open, even failed ones!
946 if (!counts_were_incremented
) {
952 dev_err(tty
->dev
, "tty open bad return (%i)\n", retval
);
961 * dgrp_tty_close() -- close function for tty_operations
963 static void dgrp_tty_close(struct tty_struct
*tty
, struct file
*file
)
965 struct ch_struct
*ch
;
966 struct un_struct
*un
;
967 struct nd_struct
*nd
;
974 int sent_printer_offstr
= 0;
976 port
= PORT_NUM(MINOR(tty_devnum(tty
)));
978 un
= tty
->driver_data
;
993 spin_lock_irqsave(&nd
->nd_lock
, lock_flags
);
996 /* Used to be on channel basis, now we check on a unit basis. */
997 if (un
->un_open_count
!= 1)
1001 * OK, its the last close on the unit
1003 un
->un_flag
|= UN_CLOSING
;
1006 * Notify the discipline to only process XON/XOFF characters.
1011 * Wait for output to drain only if this is
1012 * the last close against the channel
1015 if (ch
->ch_open_count
== 1) {
1017 * If its the print device, we need to ensure at all costs that
1018 * the offstr will fit. If it won't, flush our tbuf.
1020 if (IS_PRINT(MINOR(tty_devnum(tty
))) &&
1021 (((ch
->ch_tout
- ch
->ch_tin
- 1) & TBUF_MASK
) <
1022 ch
->ch_digi
.digi_offlen
))
1023 ch
->ch_tin
= ch
->ch_tout
;
1026 * Turn off the printer. Don't bother checking to see if its
1027 * IS_PRINT... Since this is the last close the flag is going
1028 * to be cleared, so we MUST make sure the offstr gets inserted
1032 if ((ch
->ch_flag
& CH_PRON
) != 0) {
1033 drp_wmove(ch
, 0, ch
->ch_digi
.digi_offstr
,
1034 ch
->ch_digi
.digi_offlen
);
1035 ch
->ch_flag
&= ~CH_PRON
;
1036 sent_printer_offstr
= 1;
1041 * Wait until either the output queue has drained, or we see
1042 * absolutely no progress for 15 seconds.
1045 tpos
= ch
->ch_s_tpos
;
1047 waketime
= jiffies
+ 15 * HZ
;
1052 * Make sure the port still exists.
1055 if (port
>= nd
->nd_chan_count
) {
1060 if (signal_pending(current
)) {
1066 * If the port is idle (not opened on the server), we have
1067 * no way of draining/flushing/closing the port on that server.
1068 * So break out of loop.
1070 if (ch
->ch_state
== CS_IDLE
)
1076 * Exit if the queues for this unit are empty,
1077 * and either the other unit is still open or all
1081 if ((un
->un_tty
)->ops
->chars_in_buffer
?
1082 ((un
->un_tty
)->ops
->chars_in_buffer
)(un
->un_tty
) == 0 : 1) {
1085 * We don't need to wait for a buffer to drain
1086 * if the other unit is open.
1089 if (ch
->ch_open_count
!= un
->un_open_count
)
1093 * The wait is complete when all queues are
1094 * drained, and any break in progress is complete.
1097 if (ch
->ch_tin
== ch
->ch_tout
&&
1098 ch
->ch_s_tin
== ch
->ch_s_tpos
&&
1099 (ch
->ch_send
& RR_TX_BREAK
) == 0) {
1105 * Flush TX data and exit the wait if NDELAY is set,
1106 * or this is not a DIGI printer, and the close timeout
1110 if ((file
->f_flags
& (O_NDELAY
| O_NONBLOCK
)) ||
1111 ((long)(jiffies
- waketime
) >= 0 &&
1112 (ch
->ch_digi
.digi_flags
& DIGI_PRINTER
) == 0)) {
1115 * If we sent the printer off string, we cannot
1116 * flush our internal buffers, or we might lose
1119 if (!sent_printer_offstr
)
1120 dgrp_tty_flush_buffer(tty
);
1122 tty_ldisc_flush(tty
);
1127 * Otherwise take a short nap.
1130 ch
->ch_flag
|= CH_DRAIN
;
1132 spin_unlock_irqrestore(&nd
->nd_lock
, lock_flags
);
1134 schedule_timeout_interruptible(1);
1135 s
= signal_pending(current
);
1137 spin_lock_irqsave(&nd
->nd_lock
, lock_flags
);
1141 * If we had sent the printer off string, we now have
1144 * The system won't let us sleep since we got an error
1145 * back from sleep, presumably because the user did
1147 * But we need to ensure that the offstr gets sent!
1148 * Thus, we have to do something else besides sleeping.
1150 * 1) Make this task uninterruptable.
1151 * 2) Set up a timer to go off in 1 sec.
1152 * 3) Act as tho we just got out of the sleep above.
1154 * Thankfully, in the real world, this just
1158 if (sent_printer_offstr
) {
1159 spin_unlock_irqrestore(&nd
->nd_lock
,
1162 spin_lock_irqsave(&nd
->nd_lock
, lock_flags
);
1170 * Restart the wait if any progress is seen.
1173 if (ch
->ch_s_tpos
!= tpos
) {
1174 tpos
= ch
->ch_s_tpos
;
1176 /* TODO: this gives us timeout problems with nist ?? */
1177 waketime
= jiffies
+ 15 * HZ
;
1182 * Close the line discipline
1185 /* this is done in tty_io.c */
1186 /* if ((un->un_tty)->ldisc.close)
1187 * ((un->un_tty)->ldisc.close)(un->un_tty);
1190 /* don't do this here */
1191 /* un->un_flag = 0; */
1194 * Flush the receive buffer on terminal unit close only.
1197 if (!IS_PRINT(MINOR(tty_devnum(tty
))))
1198 ch
->ch_rout
= ch
->ch_rin
;
1202 * Don't permit the close to happen until we get any pending
1203 * sync request responses.
1204 * There could be other ports depending upon the response as well.
1206 * Also, don't permit the close to happen until any parameter
1207 * changes have been sent out from the state machine as well.
1208 * This is required because of a ditty -a race with -HUPCL
1209 * We MUST make sure all channel parameters have been sent to the
1210 * Portserver before sending a close.
1213 if ((err
!= 1) && (ch
->ch_state
!= CS_IDLE
)) {
1214 spin_unlock_irqrestore(&nd
->nd_lock
, lock_flags
);
1215 s
= wait_event_interruptible(ch
->ch_flag_wait
,
1216 ((ch
->ch_flag
& (CH_WAITING_SYNC
| CH_PARAM
)) == 0));
1217 spin_lock_irqsave(&nd
->nd_lock
, lock_flags
);
1221 * Cleanup the channel if last unit open.
1224 if (ch
->ch_open_count
== 1) {
1226 ch
->ch_category
= 0;
1229 ch
->ch_tout
= ch
->ch_tin
;
1230 /* (un->un_tty)->device = 0; */
1232 if (ch
->ch_state
== CS_READY
)
1233 ch
->ch_state
= CS_SEND_CLOSE
;
1237 * Send the changes to the server
1239 if (ch
->ch_state
!= CS_IDLE
) {
1240 ch
->ch_flag
|= CH_PARAM
;
1241 wake_up_interruptible(&ch
->ch_flag_wait
);
1245 nd
->nd_tx_ready
= 1;
1250 if (ch
->ch_open_count
<= 0)
1252 "%s - unexpected value for ch->ch_open_count: %i\n",
1253 __func__
, ch
->ch_open_count
);
1255 ch
->ch_open_count
--;
1257 if (un
->un_open_count
<= 0)
1259 "%s - unexpected value for un->un_open_count: %i\n",
1260 __func__
, un
->un_open_count
);
1262 un
->un_open_count
--;
1264 un
->un_flag
&= ~(UN_NORMAL_ACTIVE
| UN_CALLOUT_ACTIVE
| UN_CLOSING
);
1265 if (waitqueue_active(&un
->un_close_wait
))
1266 wake_up_interruptible(&un
->un_close_wait
);
1268 spin_unlock_irqrestore(&nd
->nd_lock
, lock_flags
);
1274 static void drp_wmove(struct ch_struct
*ch
, int from_user
, void *buf
, int count
)
1279 ch
->ch_nd
->nd_tx_work
= 1;
1281 n
= TBUF_MAX
- ch
->ch_tin
;
1285 ret
= copy_from_user(ch
->ch_tbuf
+ ch
->ch_tin
,
1286 (void __user
*) buf
, n
);
1288 memcpy(ch
->ch_tbuf
+ ch
->ch_tin
, buf
, n
);
1290 buf
= (char *) buf
+ n
;
1296 ret
= copy_from_user(ch
->ch_tbuf
+ ch
->ch_tin
,
1297 (void __user
*) buf
, count
);
1299 memcpy(ch
->ch_tbuf
+ ch
->ch_tin
, buf
, count
);
1301 ch
->ch_tin
+= count
;
1305 static int dgrp_calculate_txprint_bounds(struct ch_struct
*ch
, int space
,
1310 unsigned short tmax
= 0;
1313 * If the terminal device is busy, reschedule when
1314 * the terminal device becomes idle.
1317 if (ch
->ch_tun
.un_open_count
!= 0 &&
1318 ch
->ch_tun
.un_tty
->ops
->chars_in_buffer
&&
1319 ((ch
->ch_tun
.un_tty
->ops
->chars_in_buffer
)(ch
->ch_tun
.un_tty
) != 0)) {
1320 *un_flag
= UN_PWAIT
;
1325 * Assure that whenever there is printer data in the output
1326 * buffer, there always remains enough space after it to
1327 * turn the printer off.
1329 space
-= ch
->ch_digi
.digi_offlen
;
1332 *un_flag
= UN_EMPTY
;
1337 * We measure printer CPS speed by incrementing
1338 * ch_cpstime by (HZ / digi_maxcps) for every
1339 * character we output, restricting output so
1340 * that ch_cpstime never exceeds lbolt.
1342 * However if output has not been done for some
1343 * time, lbolt will grow to very much larger than
1344 * ch_cpstime, which would allow essentially
1345 * unlimited amounts of output until ch_cpstime
1346 * finally caught up. To avoid this, we adjust
1347 * cps_time when necessary so the difference
1348 * between lbolt and ch_cpstime never results
1349 * in sending more than digi_bufsize characters.
1351 * This nicely models a printer with an internal
1352 * buffer of digi_bufsize characters.
1354 * Get the time between lbolt and ch->ch_cpstime;
1357 tt
= jiffies
- ch
->ch_cpstime
;
1360 * Compute the time required to send digi_bufsize
1364 mt
= HZ
* ch
->ch_digi
.digi_bufsize
/ ch
->ch_digi
.digi_maxcps
;
1367 * Compute the number of characters that can be sent
1368 * without violating the time constraint. If the
1369 * direct calculation of this number is bigger than
1370 * digi_bufsize, limit the number to digi_bufsize,
1371 * and adjust cpstime to match.
1374 if ((clock_t)(tt
+ HZ
) > (clock_t)(mt
+ HZ
)) {
1375 tmax
= ch
->ch_digi
.digi_bufsize
;
1376 ch
->ch_cpstime
= jiffies
- mt
;
1378 tmax
= ch
->ch_digi
.digi_maxcps
* tt
/ HZ
;
1382 * If the time constraint now binds, limit the transmit
1383 * count accordingly, and tentatively arrange to be
1384 * rescheduled based on time.
1393 * Compute the total number of characters we can
1394 * output before the total number of characters known
1395 * to be in the output queue exceeds digi_maxchar.
1398 tmax
= (ch
->ch_digi
.digi_maxchar
-
1399 ((ch
->ch_tin
- ch
->ch_tout
) & TBUF_MASK
) -
1400 ((ch
->ch_s_tin
- ch
->ch_s_tpos
) & 0xffff));
1404 * If the digi_maxchar constraint now holds, limit
1405 * the transmit count accordingly, and arrange to
1406 * be rescheduled when the queue becomes empty.
1410 *un_flag
= UN_EMPTY
;
1415 *un_flag
|= UN_EMPTY
;
1421 static int dgrp_tty_write(struct tty_struct
*tty
,
1422 const unsigned char *buf
,
1425 struct nd_struct
*nd
;
1426 struct un_struct
*un
;
1427 struct ch_struct
*ch
;
1438 un
= tty
->driver_data
;
1451 * Ignore the request if the channel is not ready.
1453 if (ch
->ch_state
!= CS_READY
)
1456 spin_lock_irqsave(&dgrp_poll_data
.poll_lock
, lock_flags
);
1459 * Ignore the request if output is blocked.
1461 if ((un
->un_flag
& (UN_EMPTY
| UN_LOW
| UN_TIME
| UN_PWAIT
)) != 0) {
1467 * Also ignore the request if DPA has this port open,
1468 * and is flow controlled on reading more data.
1470 if (nd
->nd_dpa_debug
&& nd
->nd_dpa_flag
& DPA_WAIT_SPACE
&&
1471 nd
->nd_dpa_port
== MINOR(tty_devnum(ch
->ch_tun
.un_tty
))) {
1477 * Limit amount we will write to the amount of space
1478 * available in the channel buffer.
1482 space
= (ch
->ch_tout
- ch
->ch_tin
- 1) & TBUF_MASK
;
1485 * Handle the printer device.
1490 if (IS_PRINT(MINOR(tty_devnum(tty
)))) {
1493 unsigned short tmax
= 0;
1496 * If the terminal device is busy, reschedule when
1497 * the terminal device becomes idle.
1500 if (ch
->ch_tun
.un_open_count
!= 0 &&
1501 ((ch
->ch_tun
.un_tty
->ops
->chars_in_buffer
)(ch
->ch_tun
.un_tty
) != 0)) {
1502 un
->un_flag
|= UN_PWAIT
;
1508 * Assure that whenever there is printer data in the output
1509 * buffer, there always remains enough space after it to
1510 * turn the printer off.
1512 space
-= ch
->ch_digi
.digi_offlen
;
1515 * Output the printer on string.
1518 if ((ch
->ch_flag
& CH_PRON
) == 0) {
1519 space
-= ch
->ch_digi
.digi_onlen
;
1522 un
->un_flag
|= UN_EMPTY
;
1523 (ch
->ch_nd
)->nd_tx_work
= 1;
1528 drp_wmove(ch
, 0, ch
->ch_digi
.digi_onstr
,
1529 ch
->ch_digi
.digi_onlen
);
1531 ch
->ch_flag
|= CH_PRON
;
1535 * We measure printer CPS speed by incrementing
1536 * ch_cpstime by (HZ / digi_maxcps) for every
1537 * character we output, restricting output so
1538 * that ch_cpstime never exceeds lbolt.
1540 * However if output has not been done for some
1541 * time, lbolt will grow to very much larger than
1542 * ch_cpstime, which would allow essentially
1543 * unlimited amounts of output until ch_cpstime
1544 * finally caught up. To avoid this, we adjust
1545 * cps_time when necessary so the difference
1546 * between lbolt and ch_cpstime never results
1547 * in sending more than digi_bufsize characters.
1549 * This nicely models a printer with an internal
1550 * buffer of digi_bufsize characters.
1552 * Get the time between lbolt and ch->ch_cpstime;
1555 tt
= jiffies
- ch
->ch_cpstime
;
1558 * Compute the time required to send digi_bufsize
1562 mt
= HZ
* ch
->ch_digi
.digi_bufsize
/ ch
->ch_digi
.digi_maxcps
;
1565 * Compute the number of characters that can be sent
1566 * without violating the time constraint. If the
1567 * direct calculation of this number is bigger than
1568 * digi_bufsize, limit the number to digi_bufsize,
1569 * and adjust cpstime to match.
1572 if ((clock_t)(tt
+ HZ
) > (clock_t)(mt
+ HZ
)) {
1573 tmax
= ch
->ch_digi
.digi_bufsize
;
1574 ch
->ch_cpstime
= jiffies
- mt
;
1576 tmax
= ch
->ch_digi
.digi_maxcps
* tt
/ HZ
;
1580 * If the time constraint now binds, limit the transmit
1581 * count accordingly, and tentatively arrange to be
1582 * rescheduled based on time.
1591 * Compute the total number of characters we can
1592 * output before the total number of characters known
1593 * to be in the output queue exceeds digi_maxchar.
1596 tmax
= (ch
->ch_digi
.digi_maxchar
-
1597 ((ch
->ch_tin
- ch
->ch_tout
) & TBUF_MASK
) -
1598 ((ch
->ch_s_tin
- ch
->ch_s_tpos
) & 0xffff));
1602 * If the digi_maxchar constraint now holds, limit
1603 * the transmit count accordingly, and arrange to
1604 * be rescheduled when the queue becomes empty.
1614 * Handle the terminal device.
1619 * If the printer device is on, turn it off.
1622 if ((ch
->ch_flag
& CH_PRON
) != 0) {
1624 space
-= ch
->ch_digi
.digi_offlen
;
1626 drp_wmove(ch
, 0, ch
->ch_digi
.digi_offstr
,
1627 ch
->ch_digi
.digi_offlen
);
1629 ch
->ch_flag
&= ~CH_PRON
;
1634 * If space is 0 and its because the ch->tbuf
1635 * is full, then Linux will handle a callback when queue
1636 * space becomes available.
1637 * tty_write returns count = 0
1641 /* the linux tty_io.c handles this if we return 0 */
1642 /* if (fp->flags & O_NONBLOCK) return -EAGAIN; */
1644 un
->un_flag
|= UN_EMPTY
;
1645 (ch
->ch_nd
)->nd_tx_work
= 1;
1650 count
= min(count
, space
);
1657 * Copy the buffer contents to the ch_tbuf
1658 * being careful to wrap around the circular queue
1661 t
= TBUF_MAX
- ch
->ch_tin
;
1665 memcpy(ch
->ch_tbuf
+ ch
->ch_tin
, buf
, t
);
1666 if (nd
->nd_dpa_debug
&& nd
->nd_dpa_port
== PORT_NUM(MINOR(tty_devnum(un
->un_tty
))))
1667 dgrp_dpa_data(nd
, 0, (char *) buf
, t
);
1674 memcpy(ch
->ch_tbuf
+ ch
->ch_tin
, buf
, n
);
1675 if (nd
->nd_dpa_debug
&& nd
->nd_dpa_port
== PORT_NUM(MINOR(tty_devnum(un
->un_tty
))))
1676 dgrp_dpa_data(nd
, 0, (char *) buf
, n
);
1682 (ch
->ch_nd
)->nd_tx_work
= 1;
1683 if (ch
->ch_edelay
!= DGRP_RTIME
) {
1684 (ch
->ch_nd
)->nd_tx_ready
= 1;
1685 wake_up_interruptible(&nd
->nd_tx_waitq
);
1689 ch
->ch_txcount
+= count
;
1691 if (IS_PRINT(MINOR(tty_devnum(tty
)))) {
1694 * Adjust ch_cpstime to account
1695 * for the characters just output.
1698 if (sendcount
> 0) {
1699 int cc
= HZ
* sendcount
+ ch
->ch_cpsrem
;
1701 ch
->ch_cpstime
+= cc
/ ch
->ch_digi
.digi_maxcps
;
1702 ch
->ch_cpsrem
= cc
% ch
->ch_digi
.digi_maxcps
;
1706 * If we are now waiting on time, schedule ourself
1707 * back when we'll be able to send a block of
1708 * digi_maxchar characters.
1711 if ((un_flag
& UN_TIME
) != 0) {
1712 ch
->ch_waketime
= (ch
->ch_cpstime
+
1713 (ch
->ch_digi
.digi_maxchar
* HZ
/
1714 ch
->ch_digi
.digi_maxcps
));
1719 * If the printer unit is waiting for completion
1720 * of terminal output, get him going again.
1723 if ((ch
->ch_pun
.un_flag
& UN_PWAIT
) != 0)
1724 (ch
->ch_nd
)->nd_tx_work
= 1;
1727 spin_unlock_irqrestore(&dgrp_poll_data
.poll_lock
, lock_flags
);
1734 * Put a character into ch->ch_buf
1736 * - used by the line discipline for OPOST processing
1739 static int dgrp_tty_put_char(struct tty_struct
*tty
, unsigned char new_char
)
1741 struct un_struct
*un
;
1742 struct ch_struct
*ch
;
1750 un
= tty
->driver_data
;
1758 if (ch
->ch_state
!= CS_READY
)
1761 spin_lock_irqsave(&dgrp_poll_data
.poll_lock
, lock_flags
);
1765 * If space is 0 and its because the ch->tbuf
1766 * Warn and dump the character, there isn't anything else
1767 * we can do about it. David_Fries@digi.com
1770 space
= (ch
->ch_tout
- ch
->ch_tin
- 1) & TBUF_MASK
;
1775 * Output the printer on string if device is TXPrint.
1777 if (IS_PRINT(MINOR(tty_devnum(tty
))) && (ch
->ch_flag
& CH_PRON
) == 0) {
1778 if (space
< ch
->ch_digi
.digi_onlen
) {
1782 space
-= ch
->ch_digi
.digi_onlen
;
1783 drp_wmove(ch
, 0, ch
->ch_digi
.digi_onstr
,
1784 ch
->ch_digi
.digi_onlen
);
1785 ch
->ch_flag
|= CH_PRON
;
1789 * Output the printer off string if device is NOT TXPrint.
1792 if (!IS_PRINT(MINOR(tty_devnum(tty
))) &&
1793 ((ch
->ch_flag
& CH_PRON
) != 0)) {
1794 if (space
< ch
->ch_digi
.digi_offlen
) {
1799 space
-= ch
->ch_digi
.digi_offlen
;
1800 drp_wmove(ch
, 0, ch
->ch_digi
.digi_offstr
,
1801 ch
->ch_digi
.digi_offlen
);
1802 ch
->ch_flag
&= ~CH_PRON
;
1811 * Copy the character to the ch_tbuf being
1812 * careful to wrap around the circular queue
1814 ch
->ch_tbuf
[ch
->ch_tin
] = new_char
;
1815 ch
->ch_tin
= (1 + ch
->ch_tin
) & TBUF_MASK
;
1817 if (IS_PRINT(MINOR(tty_devnum(tty
)))) {
1820 * Adjust ch_cpstime to account
1821 * for the character just output.
1824 int cc
= HZ
+ ch
->ch_cpsrem
;
1826 ch
->ch_cpstime
+= cc
/ ch
->ch_digi
.digi_maxcps
;
1827 ch
->ch_cpsrem
= cc
% ch
->ch_digi
.digi_maxcps
;
1830 * If we are now waiting on time, schedule ourself
1831 * back when we'll be able to send a block of
1832 * digi_maxchar characters.
1835 ch
->ch_waketime
= (ch
->ch_cpstime
+
1836 (ch
->ch_digi
.digi_maxchar
* HZ
/
1837 ch
->ch_digi
.digi_maxcps
));
1842 (ch
->ch_nd
)->nd_tx_work
= 1;
1846 spin_unlock_irqrestore(&dgrp_poll_data
.poll_lock
, lock_flags
);
1853 * Flush TX buffer (make in == out)
1855 * check tty_ioctl.c -- this is called after TCOFLUSH
1857 static void dgrp_tty_flush_buffer(struct tty_struct
*tty
)
1859 struct un_struct
*un
;
1860 struct ch_struct
*ch
;
1864 un
= tty
->driver_data
;
1872 ch
->ch_tout
= ch
->ch_tin
;
1873 /* do NOT do this here! */
1874 /* ch->ch_s_tpos = ch->ch_s_tin = 0; */
1876 /* send the flush output command now */
1877 ch
->ch_send
|= RR_TX_FLUSH
;
1878 (ch
->ch_nd
)->nd_tx_ready
= 1;
1879 (ch
->ch_nd
)->nd_tx_work
= 1;
1880 wake_up_interruptible(&(ch
->ch_nd
)->nd_tx_waitq
);
1882 if (waitqueue_active(&tty
->write_wait
))
1883 wake_up_interruptible(&tty
->write_wait
);
1890 * Return space available in Tx buffer
1891 * count = ( ch->ch_tout - ch->ch_tin ) mod (TBUF_MAX - 1)
1893 static int dgrp_tty_write_room(struct tty_struct
*tty
)
1895 struct un_struct
*un
;
1896 struct ch_struct
*ch
;
1902 un
= tty
->driver_data
;
1910 count
= (ch
->ch_tout
- ch
->ch_tin
- 1) & TBUF_MASK
;
1912 /* We *MUST* check this, and return 0 if the Printer Unit cannot
1913 * take any more data within its time constraints... If we don't
1914 * return 0 and the printer has hit it time constraint, the ld will
1915 * call us back doing a put_char, which cannot be rejected!!!
1917 if (IS_PRINT(MINOR(tty_devnum(tty
)))) {
1919 count
= dgrp_calculate_txprint_bounds(ch
, count
, &un_flag
);
1923 ch
->ch_pun
.un_flag
|= un_flag
;
1924 (ch
->ch_nd
)->nd_tx_work
= 1;
1931 * Return number of characters that have not been transmitted yet.
1932 * chars_in_buffer = ( ch->ch_tin - ch->ch_tout ) mod (TBUF_MAX - 1)
1933 * + ( ch->ch_s_tin - ch->ch_s_tout ) mod (0xffff)
1934 * = number of characters "in transit"
1936 * Remember that sequence number math is always with a sixteen bit
1937 * mask, not the TBUF_MASK.
1940 static int dgrp_tty_chars_in_buffer(struct tty_struct
*tty
)
1942 struct un_struct
*un
;
1943 struct ch_struct
*ch
;
1950 un
= tty
->driver_data
;
1958 count1
= count
= (ch
->ch_tin
- ch
->ch_tout
) & TBUF_MASK
;
1959 count
+= (ch
->ch_s_tin
- ch
->ch_s_tpos
) & 0xffff;
1960 /* one for tbuf, one for the PS */
1963 * If we are busy transmitting add 1
1965 count
+= un
->un_tbusy
;
1971 /*****************************************************************************
1973 * Helper applications for dgrp_tty_ioctl()
1975 *****************************************************************************
1980 * ch_to_tty_flags() -- convert channel flags to termio flags
1981 * @ch_flag: Digi channel flags
1982 * @flagtype: type of ch_flag (iflag, oflag or cflag)
1984 * take the channel flags of the specified type and return the
1985 * corresponding termio flag
1987 static tcflag_t
ch_to_tty_flags(ushort ch_flag
, char flagtype
)
1989 tcflag_t retval
= 0;
1993 retval
= ((ch_flag
& IF_IGNBRK
) ? IGNBRK
: 0)
1994 | ((ch_flag
& IF_BRKINT
) ? BRKINT
: 0)
1995 | ((ch_flag
& IF_IGNPAR
) ? IGNPAR
: 0)
1996 | ((ch_flag
& IF_PARMRK
) ? PARMRK
: 0)
1997 | ((ch_flag
& IF_INPCK
) ? INPCK
: 0)
1998 | ((ch_flag
& IF_ISTRIP
) ? ISTRIP
: 0)
1999 | ((ch_flag
& IF_IXON
) ? IXON
: 0)
2000 | ((ch_flag
& IF_IXANY
) ? IXANY
: 0)
2001 | ((ch_flag
& IF_IXOFF
) ? IXOFF
: 0);
2005 retval
= ((ch_flag
& OF_OLCUC
) ? OLCUC
: 0)
2006 | ((ch_flag
& OF_ONLCR
) ? ONLCR
: 0)
2007 | ((ch_flag
& OF_OCRNL
) ? OCRNL
: 0)
2008 | ((ch_flag
& OF_ONOCR
) ? ONOCR
: 0)
2009 | ((ch_flag
& OF_ONLRET
) ? ONLRET
: 0)
2010 /* | ((ch_flag & OF_OTAB3) ? OFILL : 0) */
2011 | ((ch_flag
& OF_TABDLY
) ? TABDLY
: 0);
2015 retval
= ((ch_flag
& CF_CSTOPB
) ? CSTOPB
: 0)
2016 | ((ch_flag
& CF_CREAD
) ? CREAD
: 0)
2017 | ((ch_flag
& CF_PARENB
) ? PARENB
: 0)
2018 | ((ch_flag
& CF_PARODD
) ? PARODD
: 0)
2019 | ((ch_flag
& CF_HUPCL
) ? HUPCL
: 0);
2021 switch (ch_flag
& CF_CSIZE
) {
2052 * tty_to_ch_flags() -- convert termio flags to digi channel flags
2053 * @tty: pointer to a TTY structure holding flag to be converted
2054 * @flagtype: identifies which flag (iflags, oflags, or cflags) should
2057 * take the termio flag of the specified type and return the
2058 * corresponding Digi version of the flags
2060 static ushort
tty_to_ch_flags(struct tty_struct
*tty
, char flagtype
)
2067 tflag
= tty
->termios
.c_iflag
;
2068 retval
= (I_IGNBRK(tty
) ? IF_IGNBRK
: 0)
2069 | (I_BRKINT(tty
) ? IF_BRKINT
: 0)
2070 | (I_IGNPAR(tty
) ? IF_IGNPAR
: 0)
2071 | (I_PARMRK(tty
) ? IF_PARMRK
: 0)
2072 | (I_INPCK(tty
) ? IF_INPCK
: 0)
2073 | (I_ISTRIP(tty
) ? IF_ISTRIP
: 0)
2074 | (I_IXON(tty
) ? IF_IXON
: 0)
2075 | (I_IXANY(tty
) ? IF_IXANY
: 0)
2076 | (I_IXOFF(tty
) ? IF_IXOFF
: 0);
2079 tflag
= tty
->termios
.c_oflag
;
2081 * If OPOST is set, then do the post processing in the
2082 * firmware by setting all the processing flags on.
2083 * If ~OPOST, then make sure we are not doing any
2084 * output processing!!
2089 retval
= (O_OLCUC(tty
) ? OF_OLCUC
: 0)
2090 | (O_ONLCR(tty
) ? OF_ONLCR
: 0)
2091 | (O_OCRNL(tty
) ? OF_OCRNL
: 0)
2092 | (O_ONOCR(tty
) ? OF_ONOCR
: 0)
2093 | (O_ONLRET(tty
) ? OF_ONLRET
: 0)
2094 /* | (O_OFILL(tty) ? OF_TAB3 : 0) */
2095 | (O_TABDLY(tty
) ? OF_TABDLY
: 0);
2098 tflag
= tty
->termios
.c_cflag
;
2099 retval
= (C_CSTOPB(tty
) ? CF_CSTOPB
: 0)
2100 | (C_CREAD(tty
) ? CF_CREAD
: 0)
2101 | (C_PARENB(tty
) ? CF_PARENB
: 0)
2102 | (C_PARODD(tty
) ? CF_PARODD
: 0)
2103 | (C_HUPCL(tty
) ? CF_HUPCL
: 0);
2104 switch (C_CSIZE(tty
)) {
2134 static int dgrp_tty_send_break(struct tty_struct
*tty
, int msec
)
2136 struct un_struct
*un
;
2137 struct ch_struct
*ch
;
2143 un
= tty
->driver_data
;
2151 dgrp_send_break(ch
, msec
);
2157 * This routine sends a break character out the serial port.
2159 * duration is in 1/1000's of a second
2161 static int dgrp_send_break(struct ch_struct
*ch
, int msec
)
2165 wait_event_interruptible(ch
->ch_flag_wait
,
2166 ((ch
->ch_flag
& CH_TX_BREAK
) == 0));
2167 ch
->ch_break_time
+= max(msec
, 250);
2168 ch
->ch_send
|= RR_TX_BREAK
;
2169 ch
->ch_flag
|= CH_TX_BREAK
;
2170 (ch
->ch_nd
)->nd_tx_work
= 1;
2172 x
= (msec
* HZ
) / 1000;
2173 wake_up_interruptible(&(ch
->ch_nd
)->nd_tx_waitq
);
2180 * Return modem signals to ld.
2182 static int dgrp_tty_tiocmget(struct tty_struct
*tty
)
2185 struct un_struct
*un
= tty
->driver_data
;
2186 struct ch_struct
*ch
;
2195 mlast
= ((ch
->ch_s_mlast
& ~(DM_RTS
| DM_DTR
)) |
2196 (ch
->ch_mout
& (DM_RTS
| DM_DTR
)));
2198 /* defined in /usr/include/asm/termios.h */
2199 mlast
= ((mlast
& DM_RTS
) ? TIOCM_RTS
: 0)
2200 | ((mlast
& DM_DTR
) ? TIOCM_DTR
: 0)
2201 | ((mlast
& DM_CD
) ? TIOCM_CAR
: 0)
2202 | ((mlast
& DM_RI
) ? TIOCM_RNG
: 0)
2203 | ((mlast
& DM_DSR
) ? TIOCM_DSR
: 0)
2204 | ((mlast
& DM_CTS
) ? TIOCM_CTS
: 0);
2213 static int dgrp_tty_tiocmset(struct tty_struct
*tty
,
2214 unsigned int set
, unsigned int clear
)
2217 struct un_struct
*un
= tty
->driver_data
;
2218 struct ch_struct
*ch
;
2227 if (set
& TIOCM_RTS
)
2228 ch
->ch_mout
|= DM_RTS
;
2230 if (set
& TIOCM_DTR
)
2231 ch
->ch_mout
|= DM_DTR
;
2233 if (clear
& TIOCM_RTS
)
2234 ch
->ch_mout
&= ~(DM_RTS
);
2236 if (clear
& TIOCM_DTR
)
2237 ch
->ch_mout
&= ~(DM_DTR
);
2239 spin_lock_irqsave(&(ch
->ch_nd
)->nd_lock
, lock_flags
);
2240 ch
->ch_flag
|= CH_PARAM
;
2241 (ch
->ch_nd
)->nd_tx_work
= 1;
2242 wake_up_interruptible(&ch
->ch_flag_wait
);
2244 spin_unlock_irqrestore(&(ch
->ch_nd
)->nd_lock
, lock_flags
);
2252 * Get current modem status
2254 static int get_modem_info(struct ch_struct
*ch
, unsigned int *value
)
2258 mlast
= ((ch
->ch_s_mlast
& ~(DM_RTS
| DM_DTR
)) |
2259 (ch
->ch_mout
& (DM_RTS
| DM_DTR
)));
2261 /* defined in /usr/include/asm/termios.h */
2262 mlast
= ((mlast
& DM_RTS
) ? TIOCM_RTS
: 0)
2263 | ((mlast
& DM_DTR
) ? TIOCM_DTR
: 0)
2264 | ((mlast
& DM_CD
) ? TIOCM_CAR
: 0)
2265 | ((mlast
& DM_RI
) ? TIOCM_RNG
: 0)
2266 | ((mlast
& DM_DSR
) ? TIOCM_DSR
: 0)
2267 | ((mlast
& DM_CTS
) ? TIOCM_CTS
: 0);
2268 return put_user(mlast
, (unsigned int __user
*) value
);
2274 static int set_modem_info(struct ch_struct
*ch
, unsigned int command
,
2275 unsigned int *value
)
2282 error
= access_ok(VERIFY_READ
, (void __user
*) value
, sizeof(int));
2286 if (get_user(arg
, (unsigned int __user
*) value
))
2288 mval
|= ((arg
& TIOCM_RTS
) ? DM_RTS
: 0)
2289 | ((arg
& TIOCM_DTR
) ? DM_DTR
: 0);
2292 case TIOCMBIS
: /* set flags */
2293 ch
->ch_mout
|= mval
;
2295 case TIOCMBIC
: /* clear flags */
2296 ch
->ch_mout
&= ~mval
;
2305 spin_lock_irqsave(&(ch
->ch_nd
)->nd_lock
, lock_flags
);
2307 ch
->ch_flag
|= CH_PARAM
;
2308 (ch
->ch_nd
)->nd_tx_work
= 1;
2309 wake_up_interruptible(&ch
->ch_flag_wait
);
2311 spin_unlock_irqrestore(&(ch
->ch_nd
)->nd_lock
, lock_flags
);
2318 * Assign the custom baud rate to the channel structure
2320 static void dgrp_set_custom_speed(struct ch_struct
*ch
, int newrate
)
2326 int deltahigh
, deltalow
;
2332 * Since the divisor is stored in a 16-bit integer, we make sure
2333 * we don't allow any rates smaller than a 16-bit integer would allow.
2334 * And of course, rates above the dividend won't fly.
2336 if (newrate
&& newrate
< ((PORTSERVER_DIVIDEND
/ 0xFFFF) + 1))
2337 newrate
= ((PORTSERVER_DIVIDEND
/ 0xFFFF) + 1);
2338 if (newrate
&& newrate
> PORTSERVER_DIVIDEND
)
2339 newrate
= PORTSERVER_DIVIDEND
;
2341 while (newrate
> 0) {
2342 testdiv
= PORTSERVER_DIVIDEND
/ newrate
;
2345 * If we try to figure out what rate the PortServer would use
2346 * with the test divisor, it will be either equal or higher
2347 * than the requested baud rate. If we then determine the
2348 * rate with a divisor one higher, we will get the next lower
2349 * supported rate below the requested.
2351 testrate_high
= PORTSERVER_DIVIDEND
/ testdiv
;
2352 testrate_low
= PORTSERVER_DIVIDEND
/ (testdiv
+ 1);
2355 * If the rate for the requested divisor is correct, just
2356 * use it and be done.
2358 if (testrate_high
== newrate
)
2362 * Otherwise, pick the rate that is closer (i.e. whichever rate
2363 * has a smaller delta).
2365 deltahigh
= testrate_high
- newrate
;
2366 deltalow
= newrate
- testrate_low
;
2368 if (deltahigh
< deltalow
)
2369 newrate
= testrate_high
;
2371 newrate
= testrate_low
;
2376 ch
->ch_custom_speed
= newrate
;
2385 # dgrp_tty_digiseta()
2387 * Ioctl to set the information from ditty.
2389 * NOTE: DIGI_IXON, DSRPACE, DCDPACE, and DTRPACE are unsupported. JAR 990922
2391 static int dgrp_tty_digiseta(struct tty_struct
*tty
,
2392 struct digi_struct
*new_info
)
2394 struct un_struct
*un
= tty
->driver_data
;
2395 struct ch_struct
*ch
;
2404 if (copy_from_user(&ch
->ch_digi
, (void __user
*) new_info
,
2405 sizeof(struct digi_struct
)))
2408 if ((ch
->ch_digi
.digi_flags
& RTSPACE
) ||
2409 (ch
->ch_digi
.digi_flags
& CTSPACE
))
2410 tty
->termios
.c_cflag
|= CRTSCTS
;
2412 tty
->termios
.c_cflag
&= ~CRTSCTS
;
2414 if (ch
->ch_digi
.digi_maxcps
< 1)
2415 ch
->ch_digi
.digi_maxcps
= 1;
2417 if (ch
->ch_digi
.digi_maxcps
> 10000)
2418 ch
->ch_digi
.digi_maxcps
= 10000;
2420 if (ch
->ch_digi
.digi_bufsize
< 10)
2421 ch
->ch_digi
.digi_bufsize
= 10;
2423 if (ch
->ch_digi
.digi_maxchar
< 1)
2424 ch
->ch_digi
.digi_maxchar
= 1;
2426 if (ch
->ch_digi
.digi_maxchar
> ch
->ch_digi
.digi_bufsize
)
2427 ch
->ch_digi
.digi_maxchar
= ch
->ch_digi
.digi_bufsize
;
2429 if (ch
->ch_digi
.digi_onlen
> DIGI_PLEN
)
2430 ch
->ch_digi
.digi_onlen
= DIGI_PLEN
;
2432 if (ch
->ch_digi
.digi_offlen
> DIGI_PLEN
)
2433 ch
->ch_digi
.digi_offlen
= DIGI_PLEN
;
2435 /* make the changes now */
2444 * dgrp_tty_digigetedelay()
2446 * Ioctl to get the current edelay setting.
2451 static int dgrp_tty_digigetedelay(struct tty_struct
*tty
, int *retinfo
)
2453 struct un_struct
*un
;
2454 struct ch_struct
*ch
;
2460 if (!tty
|| tty
->magic
!= TTY_MAGIC
)
2463 un
= tty
->driver_data
;
2472 tmp
= ch
->ch_edelay
;
2474 if (copy_to_user((void __user
*) retinfo
, &tmp
, sizeof(*retinfo
)))
2482 * dgrp_tty_digisetedelay()
2484 * Ioctl to set the EDELAY setting
2487 static int dgrp_tty_digisetedelay(struct tty_struct
*tty
, int *new_info
)
2489 struct un_struct
*un
;
2490 struct ch_struct
*ch
;
2493 if (!tty
|| tty
->magic
!= TTY_MAGIC
)
2496 un
= tty
->driver_data
;
2505 if (copy_from_user(&new_digi
, (void __user
*)new_info
, sizeof(int)))
2508 ch
->ch_edelay
= new_digi
;
2510 /* make the changes now */
2518 * The usual assortment of ioctl's
2520 * note: use tty_check_change to make sure that we are not
2521 * changing the state of a terminal when we are not a process
2522 * in the forground. See tty_io.c
2523 * rc = tty_check_change(tty);
2524 * if (rc) return rc;
2526 static int dgrp_tty_ioctl(struct tty_struct
*tty
, unsigned int cmd
,
2529 struct un_struct
*un
;
2530 struct ch_struct
*ch
;
2532 struct digiflow_struct dflow
;
2537 un
= tty
->driver_data
;
2548 * Here are all the standard ioctl's that we MUST implement
2553 * TCSBRK is SVID version: non-zero arg --> no break
2554 * this behaviour is exploited by tcdrain().
2556 * According to POSIX.1 spec (7.2.2.1.2) breaks should be
2557 * between 0.25 and 0.5 seconds
2560 rc
= tty_check_change(tty
);
2563 tty_wait_until_sent(tty
, 0);
2566 rc
= dgrp_send_break(ch
, 250); /* 1/4 second */
2568 if (dgrp_tty_chars_in_buffer(tty
) != 0)
2574 /* support for POSIX tcsendbreak()
2576 * According to POSIX.1 spec (7.2.2.1.2) breaks should be
2577 * between 0.25 and 0.5 seconds so we'll ask for something
2578 * in the middle: 0.375 seconds.
2580 rc
= tty_check_change(tty
);
2583 tty_wait_until_sent(tty
, 0);
2585 rc
= dgrp_send_break(ch
, arg
? arg
*250 : 250);
2587 if (dgrp_tty_chars_in_buffer(tty
) != 0)
2592 rc
= tty_check_change(tty
);
2595 tty_wait_until_sent(tty
, 0);
2598 * RealPort doesn't support turning on a break unconditionally.
2599 * The RealPort device will stop sending a break automatically
2600 * after the specified time value that we send in.
2602 rc
= dgrp_send_break(ch
, 250); /* 1/4 second */
2604 if (dgrp_tty_chars_in_buffer(tty
) != 0)
2610 * RealPort doesn't support turning off a break unconditionally.
2611 * The RealPort device will stop sending a break automatically
2612 * after the specified time value that was sent when turning on
2618 rc
= access_ok(VERIFY_WRITE
, (void __user
*) arg
,
2619 sizeof(unsigned int));
2622 return get_modem_info(ch
, (unsigned int *) arg
);
2627 return set_modem_info(ch
, cmd
, (unsigned int *) arg
);
2630 * Here are any additional ioctl's that we want to implement
2635 * The linux tty driver doesn't have a flush
2636 * input routine for the driver, assuming all backed
2637 * up data is in the line disc. buffers. However,
2638 * we all know that's not the case. Here, we
2639 * act on the ioctl, but then lie and say we didn't
2640 * so the line discipline will process the flush
2643 rc
= tty_check_change(tty
);
2650 /* only flush input if this is the only open unit */
2651 if (!IS_PRINT(MINOR(tty_devnum(tty
)))) {
2652 ch
->ch_rout
= ch
->ch_rin
;
2653 ch
->ch_send
|= RR_RX_FLUSH
;
2654 (ch
->ch_nd
)->nd_tx_work
= 1;
2655 (ch
->ch_nd
)->nd_tx_ready
= 1;
2656 wake_up_interruptible(&(ch
->ch_nd
)->nd_tx_waitq
);
2658 if (arg
== TCIFLUSH
)
2661 case TCOFLUSH
: /* flush output, or the receive buffer */
2663 * This is handled in the tty_ioctl.c code
2664 * calling tty_flush_buffer
2669 /* POSIX.1 says return EINVAL if we got a bad arg */
2672 /* pretend we didn't recognize this IOCTL */
2673 return -ENOIOCTLCMD
;
2678 /*****************************************
2680 TCSETA TCSETA - set the termios
2681 TCSETAF TCSETAF - wait for drain first, then set termios
2682 TCSETAW TCSETAW - wait for drain, flush the input queue, then set termios
2683 - looking at the tty_ioctl code, these command all call our
2684 tty_set_termios at the driver's end, when a TCSETA* is sent,
2685 it is expecting the tty to have a termio structure,
2686 NOT a termios structure. These two structures differ in size
2687 and the tty_ioctl code does a conversion before processing them both.
2688 - we should treat the TCSETAW TCSETAF ioctls the same, and let
2689 the tty_ioctl code do the conversion stuff.
2694 - the associated tty structure has a termios structure.
2695 *****************************************/
2699 return -ENOIOCTLCMD
;
2706 * The linux tty driver doesn't have a flush
2707 * input routine for the driver, assuming all backed
2708 * up data is in the line disc. buffers. However,
2709 * we all know that's not the case. Here, we
2710 * act on the ioctl, but then lie and say we didn't
2711 * so the line discipline will process the flush
2716 * Also, now that we have TXPrint, we have to check
2717 * if this is the TXPrint device and the terminal
2718 * device is open. If so, do NOT run check_change,
2719 * as the terminal device is ALWAYS the parent.
2721 if (!IS_PRINT(MINOR(tty_devnum(tty
))) ||
2722 !ch
->ch_tun
.un_open_count
) {
2723 rc
= tty_check_change(tty
);
2728 /* wait for all the characters in tbuf to drain */
2729 tty_wait_until_sent(tty
, 0);
2731 if ((cmd
== TCSETSF
) || (cmd
== TCSETAF
)) {
2732 /* flush the contents of the rbuf queue */
2733 /* TODO: check if this is print device? */
2734 ch
->ch_send
|= RR_RX_FLUSH
;
2735 (ch
->ch_nd
)->nd_tx_ready
= 1;
2736 (ch
->ch_nd
)->nd_tx_work
= 1;
2737 wake_up_interruptible(&(ch
->ch_nd
)->nd_tx_waitq
);
2738 /* do we need to do this? just to be safe! */
2739 ch
->ch_rout
= ch
->ch_rin
;
2742 /* pretend we didn't recognize this */
2743 return -ENOIOCTLCMD
;
2747 * The Linux Line Discipline (LD) would do this for us if we
2748 * let it, but we have the special firmware options to do this
2749 * the "right way" regardless of hardware or software flow
2750 * control so we'll do it outselves instead of letting the LD
2753 rc
= tty_check_change(tty
);
2759 dgrp_tty_start(tty
);
2765 dgrp_tty_input_start(tty
);
2768 dgrp_tty_input_stop(tty
);
2775 /* get information for ditty */
2776 if (copy_to_user((struct digi_struct __user
*) arg
,
2777 &ch
->ch_digi
, sizeof(struct digi_struct
)))
2783 /* wait for all the characters in tbuf to drain */
2784 tty_wait_until_sent(tty
, 0);
2786 if (cmd
== DIGI_SETAF
) {
2787 /* flush the contents of the rbuf queue */
2788 /* send down a packet with RR_RX_FLUSH set */
2789 ch
->ch_send
|= RR_RX_FLUSH
;
2790 (ch
->ch_nd
)->nd_tx_ready
= 1;
2791 (ch
->ch_nd
)->nd_tx_work
= 1;
2792 wake_up_interruptible(&(ch
->ch_nd
)->nd_tx_waitq
);
2793 /* do we need to do this? just to be safe! */
2794 ch
->ch_rout
= ch
->ch_rin
;
2797 /* pretend we didn't recognize this */
2800 return dgrp_tty_digiseta(tty
, (struct digi_struct
*) arg
);
2803 return dgrp_tty_digisetedelay(tty
, (int *) arg
);
2806 return dgrp_tty_digigetedelay(tty
, (int *) arg
);
2810 if (cmd
== (DIGI_GETFLOW
)) {
2811 dflow
.startc
= tty
->termios
.c_cc
[VSTART
];
2812 dflow
.stopc
= tty
->termios
.c_cc
[VSTOP
];
2814 dflow
.startc
= ch
->ch_xxon
;
2815 dflow
.stopc
= ch
->ch_xxoff
;
2818 if (copy_to_user((char __user
*)arg
, &dflow
, sizeof(dflow
)))
2825 if (copy_from_user(&dflow
, (char __user
*)arg
, sizeof(dflow
)))
2828 if (cmd
== (DIGI_SETFLOW
)) {
2829 tty
->termios
.c_cc
[VSTART
] = dflow
.startc
;
2830 tty
->termios
.c_cc
[VSTOP
] = dflow
.stopc
;
2832 ch
->ch_xxon
= dflow
.startc
;
2833 ch
->ch_xxoff
= dflow
.stopc
;
2837 case DIGI_GETCUSTOMBAUD
:
2838 if (put_user(ch
->ch_custom_speed
, (unsigned int __user
*) arg
))
2842 case DIGI_SETCUSTOMBAUD
:
2846 if (get_user(new_rate
, (unsigned int __user
*) arg
))
2848 dgrp_set_custom_speed(ch
, new_rate
);
2854 return -ENOIOCTLCMD
;
2861 * This routine allows the tty driver to be notified when
2862 * the device's termios setting have changed. Note that we
2863 * should be prepared to accept the case where old == NULL
2864 * and try to do something rational.
2866 * So we need to make sure that our copies of ch_oflag,
2867 * ch_clag, and ch_iflag reflect the tty->termios flags.
2869 static void dgrp_tty_set_termios(struct tty_struct
*tty
, struct ktermios
*old
)
2871 struct ktermios
*ts
;
2872 struct ch_struct
*ch
;
2873 struct un_struct
*un
;
2875 /* seems silly, but we have to check all these! */
2879 un
= tty
->driver_data
;
2891 /* the CLOCAL flag has just been set */
2892 if (!(old
->c_cflag
& CLOCAL
) && C_CLOCAL(tty
))
2893 wake_up_interruptible(&un
->un_open_wait
);
2898 * Throttle receiving data. We just set a bit and stop reading
2899 * data out of the channel buffer. It will back up and the
2900 * FEP will do whatever is necessary to stop the far end.
2902 static void dgrp_tty_throttle(struct tty_struct
*tty
)
2904 struct ch_struct
*ch
;
2909 ch
= ((struct un_struct
*) tty
->driver_data
)->un_ch
;
2913 ch
->ch_flag
|= CH_RXSTOP
;
2917 static void dgrp_tty_unthrottle(struct tty_struct
*tty
)
2919 struct ch_struct
*ch
;
2924 ch
= ((struct un_struct
*) tty
->driver_data
)->un_ch
;
2928 ch
->ch_flag
&= ~CH_RXSTOP
;
2932 * Stop the transmitter
2934 static void dgrp_tty_stop(struct tty_struct
*tty
)
2936 struct ch_struct
*ch
;
2941 ch
= ((struct un_struct
*) tty
->driver_data
)->un_ch
;
2945 ch
->ch_send
|= RR_TX_STOP
;
2946 ch
->ch_send
&= ~RR_TX_START
;
2948 /* make the change NOW! */
2949 (ch
->ch_nd
)->nd_tx_ready
= 1;
2950 if (waitqueue_active(&(ch
->ch_nd
)->nd_tx_waitq
))
2951 wake_up_interruptible(&(ch
->ch_nd
)->nd_tx_waitq
);
2955 * Start the transmitter
2957 static void dgrp_tty_start(struct tty_struct
*tty
)
2959 struct ch_struct
*ch
;
2964 ch
= ((struct un_struct
*) tty
->driver_data
)->un_ch
;
2968 /* TODO: don't do anything if the transmitter is not stopped */
2970 ch
->ch_send
|= RR_TX_START
;
2971 ch
->ch_send
&= ~RR_TX_STOP
;
2973 /* make the change NOW! */
2974 (ch
->ch_nd
)->nd_tx_ready
= 1;
2975 (ch
->ch_nd
)->nd_tx_work
= 1;
2976 if (waitqueue_active(&(ch
->ch_nd
)->nd_tx_waitq
))
2977 wake_up_interruptible(&(ch
->ch_nd
)->nd_tx_waitq
);
2984 static void dgrp_tty_input_stop(struct tty_struct
*tty
)
2986 struct ch_struct
*ch
;
2991 ch
= ((struct un_struct
*) tty
->driver_data
)->un_ch
;
2995 ch
->ch_send
|= RR_RX_STOP
;
2996 ch
->ch_send
&= ~RR_RX_START
;
2997 (ch
->ch_nd
)->nd_tx_ready
= 1;
2998 if (waitqueue_active(&(ch
->ch_nd
)->nd_tx_waitq
))
2999 wake_up_interruptible(&(ch
->ch_nd
)->nd_tx_waitq
);
3004 static void dgrp_tty_send_xchar(struct tty_struct
*tty
, char c
)
3006 struct un_struct
*un
;
3007 struct ch_struct
*ch
;
3012 un
= tty
->driver_data
;
3019 if (c
== STOP_CHAR(tty
))
3020 ch
->ch_send
|= RR_RX_STOP
;
3021 else if (c
== START_CHAR(tty
))
3022 ch
->ch_send
|= RR_RX_START
;
3024 ch
->ch_nd
->nd_tx_ready
= 1;
3025 ch
->ch_nd
->nd_tx_work
= 1;
3031 static void dgrp_tty_input_start(struct tty_struct
*tty
)
3033 struct ch_struct
*ch
;
3038 ch
= ((struct un_struct
*) tty
->driver_data
)->un_ch
;
3042 ch
->ch_send
|= RR_RX_START
;
3043 ch
->ch_send
&= ~RR_RX_STOP
;
3044 (ch
->ch_nd
)->nd_tx_ready
= 1;
3045 (ch
->ch_nd
)->nd_tx_work
= 1;
3046 if (waitqueue_active(&(ch
->ch_nd
)->nd_tx_waitq
))
3047 wake_up_interruptible(&(ch
->ch_nd
)->nd_tx_waitq
);
3053 * Hangup the port. Like a close, but don't wait for output
3056 * How do we close all the channels that are open?
3058 static void dgrp_tty_hangup(struct tty_struct
*tty
)
3060 struct ch_struct
*ch
;
3061 struct nd_struct
*nd
;
3062 struct un_struct
*un
;
3067 un
= tty
->driver_data
;
3079 ch
->ch_mout
&= ~DM_DTR
;
3080 /* Don't do this here */
3081 /* ch->ch_flag |= CH_HANGUP; */
3082 ch
->ch_nd
->nd_tx_ready
= 1;
3083 ch
->ch_nd
->nd_tx_work
= 1;
3084 if (waitqueue_active(&ch
->ch_flag_wait
))
3085 wake_up_interruptible(&ch
->ch_flag_wait
);
3090 /************************************************************************/
3092 /* TTY Initialization/Cleanup Functions */
3094 /************************************************************************/
3097 * Uninitialize the TTY portion of the supplied node. Free all
3098 * memory and resources associated with this node. Do it in reverse
3099 * allocation order: this might possibly result in less fragmentation
3100 * of memory, though I don't know this for sure.
3103 dgrp_tty_uninit(struct nd_struct
*nd
)
3108 ID_TO_CHAR(nd
->nd_ID
, id
);
3110 if (nd
->nd_ttdriver_flags
& SERIAL_TTDRV_REG
) {
3111 tty_unregister_driver(nd
->nd_serial_ttdriver
);
3113 kfree(nd
->nd_serial_ttdriver
->ttys
);
3114 nd
->nd_serial_ttdriver
->ttys
= NULL
;
3116 put_tty_driver(nd
->nd_serial_ttdriver
);
3117 nd
->nd_ttdriver_flags
&= ~SERIAL_TTDRV_REG
;
3120 if (nd
->nd_ttdriver_flags
& CALLOUT_TTDRV_REG
) {
3121 tty_unregister_driver(nd
->nd_callout_ttdriver
);
3123 kfree(nd
->nd_callout_ttdriver
->ttys
);
3124 nd
->nd_callout_ttdriver
->ttys
= NULL
;
3126 put_tty_driver(nd
->nd_callout_ttdriver
);
3127 nd
->nd_ttdriver_flags
&= ~CALLOUT_TTDRV_REG
;
3130 if (nd
->nd_ttdriver_flags
& XPRINT_TTDRV_REG
) {
3131 tty_unregister_driver(nd
->nd_xprint_ttdriver
);
3133 kfree(nd
->nd_xprint_ttdriver
->ttys
);
3134 nd
->nd_xprint_ttdriver
->ttys
= NULL
;
3136 put_tty_driver(nd
->nd_xprint_ttdriver
);
3137 nd
->nd_ttdriver_flags
&= ~XPRINT_TTDRV_REG
;
3139 for (i
= 0; i
< CHAN_MAX
; i
++)
3140 tty_port_destroy(&nd
->nd_chan
[i
].port
);
3146 * Initialize the TTY portion of the supplied node.
3149 dgrp_tty_init(struct nd_struct
*nd
)
3155 ID_TO_CHAR(nd
->nd_ID
, id
);
3158 * Initialize the TTDRIVER structures.
3161 nd
->nd_serial_ttdriver
= alloc_tty_driver(CHAN_MAX
);
3162 if (!nd
->nd_serial_ttdriver
)
3165 sprintf(nd
->nd_serial_name
, "tty_dgrp_%s_", id
);
3167 nd
->nd_serial_ttdriver
->owner
= THIS_MODULE
;
3168 nd
->nd_serial_ttdriver
->name
= nd
->nd_serial_name
;
3169 nd
->nd_serial_ttdriver
->name_base
= 0;
3170 nd
->nd_serial_ttdriver
->major
= 0;
3171 nd
->nd_serial_ttdriver
->minor_start
= 0;
3172 nd
->nd_serial_ttdriver
->type
= TTY_DRIVER_TYPE_SERIAL
;
3173 nd
->nd_serial_ttdriver
->subtype
= SERIAL_TYPE_NORMAL
;
3174 nd
->nd_serial_ttdriver
->init_termios
= DefaultTermios
;
3175 nd
->nd_serial_ttdriver
->driver_name
= "dgrp";
3176 nd
->nd_serial_ttdriver
->flags
= (TTY_DRIVER_REAL_RAW
|
3177 TTY_DRIVER_DYNAMIC_DEV
|
3178 TTY_DRIVER_HARDWARE_BREAK
);
3180 /* The kernel wants space to store pointers to tty_structs. */
3181 nd
->nd_serial_ttdriver
->ttys
=
3182 kzalloc(CHAN_MAX
* sizeof(struct tty_struct
*), GFP_KERNEL
);
3183 if (!nd
->nd_serial_ttdriver
->ttys
)
3186 tty_set_operations(nd
->nd_serial_ttdriver
, &dgrp_tty_ops
);
3188 if (!(nd
->nd_ttdriver_flags
& SERIAL_TTDRV_REG
)) {
3190 * Register tty devices
3192 rc
= tty_register_driver(nd
->nd_serial_ttdriver
);
3195 * If errno is EBUSY, this means there are no more
3196 * slots available to have us auto-majored.
3197 * (Which is currently supported up to 256)
3199 * We can still request majors above 256,
3200 * we just have to do it manually.
3204 int max_majors
= 1U << (32 - MINORBITS
);
3205 for (i
= 256; i
< max_majors
; i
++) {
3206 nd
->nd_serial_ttdriver
->major
= i
;
3207 rc
= tty_register_driver(nd
->nd_serial_ttdriver
);
3211 /* Really fail now, since we ran out
3212 * of majors to try. */
3213 if (i
== max_majors
)
3220 nd
->nd_ttdriver_flags
|= SERIAL_TTDRV_REG
;
3223 nd
->nd_callout_ttdriver
= alloc_tty_driver(CHAN_MAX
);
3224 if (!nd
->nd_callout_ttdriver
)
3227 sprintf(nd
->nd_callout_name
, "cu_dgrp_%s_", id
);
3229 nd
->nd_callout_ttdriver
->owner
= THIS_MODULE
;
3230 nd
->nd_callout_ttdriver
->name
= nd
->nd_callout_name
;
3231 nd
->nd_callout_ttdriver
->name_base
= 0;
3232 nd
->nd_callout_ttdriver
->major
= nd
->nd_serial_ttdriver
->major
;
3233 nd
->nd_callout_ttdriver
->minor_start
= 0x40;
3234 nd
->nd_callout_ttdriver
->type
= TTY_DRIVER_TYPE_SERIAL
;
3235 nd
->nd_callout_ttdriver
->subtype
= SERIAL_TYPE_CALLOUT
;
3236 nd
->nd_callout_ttdriver
->init_termios
= DefaultTermios
;
3237 nd
->nd_callout_ttdriver
->driver_name
= "dgrp";
3238 nd
->nd_callout_ttdriver
->flags
= (TTY_DRIVER_REAL_RAW
|
3239 TTY_DRIVER_DYNAMIC_DEV
|
3240 TTY_DRIVER_HARDWARE_BREAK
);
3242 /* The kernel wants space to store pointers to tty_structs. */
3243 nd
->nd_callout_ttdriver
->ttys
=
3244 kzalloc(CHAN_MAX
* sizeof(struct tty_struct
*), GFP_KERNEL
);
3245 if (!nd
->nd_callout_ttdriver
->ttys
)
3248 tty_set_operations(nd
->nd_callout_ttdriver
, &dgrp_tty_ops
);
3250 if (dgrp_register_cudevices
) {
3251 if (!(nd
->nd_ttdriver_flags
& CALLOUT_TTDRV_REG
)) {
3253 * Register cu devices
3255 rc
= tty_register_driver(nd
->nd_callout_ttdriver
);
3258 nd
->nd_ttdriver_flags
|= CALLOUT_TTDRV_REG
;
3263 nd
->nd_xprint_ttdriver
= alloc_tty_driver(CHAN_MAX
);
3264 if (!nd
->nd_xprint_ttdriver
)
3267 sprintf(nd
->nd_xprint_name
, "pr_dgrp_%s_", id
);
3269 nd
->nd_xprint_ttdriver
->owner
= THIS_MODULE
;
3270 nd
->nd_xprint_ttdriver
->name
= nd
->nd_xprint_name
;
3271 nd
->nd_xprint_ttdriver
->name_base
= 0;
3272 nd
->nd_xprint_ttdriver
->major
= nd
->nd_serial_ttdriver
->major
;
3273 nd
->nd_xprint_ttdriver
->minor_start
= 0x80;
3274 nd
->nd_xprint_ttdriver
->type
= TTY_DRIVER_TYPE_SERIAL
;
3275 nd
->nd_xprint_ttdriver
->subtype
= SERIAL_TYPE_XPRINT
;
3276 nd
->nd_xprint_ttdriver
->init_termios
= DefaultTermios
;
3277 nd
->nd_xprint_ttdriver
->driver_name
= "dgrp";
3278 nd
->nd_xprint_ttdriver
->flags
= (TTY_DRIVER_REAL_RAW
|
3279 TTY_DRIVER_DYNAMIC_DEV
|
3280 TTY_DRIVER_HARDWARE_BREAK
);
3282 /* The kernel wants space to store pointers to tty_structs. */
3283 nd
->nd_xprint_ttdriver
->ttys
=
3284 kzalloc(CHAN_MAX
* sizeof(struct tty_struct
*), GFP_KERNEL
);
3285 if (!nd
->nd_xprint_ttdriver
->ttys
)
3288 tty_set_operations(nd
->nd_xprint_ttdriver
, &dgrp_tty_ops
);
3290 if (dgrp_register_prdevices
) {
3291 if (!(nd
->nd_ttdriver_flags
& XPRINT_TTDRV_REG
)) {
3293 * Register transparent print devices
3295 rc
= tty_register_driver(nd
->nd_xprint_ttdriver
);
3298 nd
->nd_ttdriver_flags
|= XPRINT_TTDRV_REG
;
3302 for (i
= 0; i
< CHAN_MAX
; i
++) {
3303 struct ch_struct
*ch
= nd
->nd_chan
+ i
;
3306 ch
->ch_digi
= digi_init
;
3307 ch
->ch_edelay
= 100;
3308 ch
->ch_custom_speed
= 0;
3310 ch
->ch_tun
.un_ch
= ch
;
3311 ch
->ch_pun
.un_ch
= ch
;
3312 ch
->ch_tun
.un_type
= SERIAL_TYPE_NORMAL
;
3313 ch
->ch_pun
.un_type
= SERIAL_TYPE_XPRINT
;
3315 init_waitqueue_head(&(ch
->ch_flag_wait
));
3316 init_waitqueue_head(&(ch
->ch_sleep
));
3318 init_waitqueue_head(&(ch
->ch_tun
.un_open_wait
));
3319 init_waitqueue_head(&(ch
->ch_tun
.un_close_wait
));
3321 init_waitqueue_head(&(ch
->ch_pun
.un_open_wait
));
3322 init_waitqueue_head(&(ch
->ch_pun
.un_close_wait
));
3323 tty_port_init(&ch
->port
);