Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mason/linux...
[firefly-linux-kernel-4.4.55.git] / drivers / staging / dgrp / dgrp_tty.c
1 /*
2  *
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>
6  *     Jeff Randall
7  *     Scott Kilau   <scottk at digi dot com>
8  *
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)
12  * any later version.
13  *
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.
18  *
19  */
20
21 /*
22  *
23  *  Filename:
24  *
25  *     dgrp_tty.c
26  *
27  *  Description:
28  *
29  *     This file implements the tty driver functionality for the
30  *     RealPort driver software.
31  *
32  *  Author:
33  *
34  *     James A. Puzzo
35  *     Ann-Marie Westgate
36  *
37  */
38
39 #include <linux/slab.h>
40 #include <linux/tty.h>
41 #include <linux/tty_flip.h>
42 #include <linux/device.h>
43 #include <linux/sched.h>
44 #include <linux/uaccess.h>
45
46 #include "dgrp_common.h"
47
48 #ifndef _POSIX_VDISABLE
49 #define   _POSIX_VDISABLE ('\0')
50 #endif
51
52 /*
53  *      forward declarations
54  */
55
56 static void drp_param(struct ch_struct *);
57 static void dgrp_tty_close(struct tty_struct *, struct file *);
58
59 /* ioctl helper functions */
60 static int set_modem_info(struct ch_struct *, unsigned int, unsigned int *);
61 static int get_modem_info(struct ch_struct *, unsigned int *);
62 static void dgrp_set_custom_speed(struct ch_struct *, int);
63 static int dgrp_tty_digigetedelay(struct tty_struct *, int *);
64 static int dgrp_tty_digisetedelay(struct tty_struct *, int *);
65 static int dgrp_send_break(struct ch_struct *, int);
66
67 static ushort  tty_to_ch_flags(struct tty_struct *, char);
68 static tcflag_t ch_to_tty_flags(unsigned short, char);
69
70 static void dgrp_tty_input_start(struct tty_struct *);
71 static void dgrp_tty_input_stop(struct tty_struct *);
72
73 static void drp_wmove(struct ch_struct *, int, void*, int);
74
75 static int dgrp_tty_open(struct tty_struct *, struct file *);
76 static void dgrp_tty_close(struct tty_struct *, struct file *);
77 static int dgrp_tty_write(struct tty_struct *, const unsigned char *, int);
78 static int dgrp_tty_write_room(struct tty_struct *);
79 static void dgrp_tty_flush_buffer(struct tty_struct *);
80 static int dgrp_tty_chars_in_buffer(struct tty_struct *);
81 static int dgrp_tty_ioctl(struct tty_struct *, unsigned int, unsigned long);
82 static void dgrp_tty_set_termios(struct tty_struct *, struct ktermios *);
83 static void dgrp_tty_stop(struct tty_struct *);
84 static void dgrp_tty_start(struct tty_struct *);
85 static void dgrp_tty_throttle(struct tty_struct *);
86 static void dgrp_tty_unthrottle(struct tty_struct *);
87 static void dgrp_tty_hangup(struct tty_struct *);
88 static int dgrp_tty_put_char(struct tty_struct *, unsigned char);
89 static int dgrp_tty_tiocmget(struct tty_struct *);
90 static int dgrp_tty_tiocmset(struct tty_struct *, unsigned int, unsigned int);
91 static int dgrp_tty_send_break(struct tty_struct *, int);
92 static void dgrp_tty_send_xchar(struct tty_struct *, char);
93
94 /*
95  *      tty defines
96  */
97 #define SERIAL_TYPE_NORMAL      1
98 #define SERIAL_TYPE_CALLOUT     2
99 #define SERIAL_TYPE_XPRINT      3
100
101
102 /*
103  *      tty globals/statics
104  */
105
106
107 #define PORTSERVER_DIVIDEND     1843200
108
109 /*
110  *  Default transparent print information.
111  */
112 static struct digi_struct digi_init = {
113         .digi_flags   = DIGI_COOK,      /* Flags                        */
114         .digi_maxcps  = 100,            /* Max CPS                      */
115         .digi_maxchar = 50,             /* Max chars in print queue     */
116         .digi_bufsize = 100,            /* Printer buffer size          */
117         .digi_onlen   = 4,              /* size of printer on string    */
118         .digi_offlen  = 4,              /* size of printer off string   */
119         .digi_onstr   = "\033[5i",      /* ANSI printer on string       */
120         .digi_offstr  = "\033[4i",      /* ANSI printer off string      */
121         .digi_term    = "ansi"          /* default terminal type        */
122 };
123
124 /*
125  *      Define a local default termios struct. All ports will be created
126  *      with this termios initially.
127  *
128  *      This defines a raw port at 9600 baud, 8 data bits, no parity,
129  *      1 stop bit.
130  */
131 static struct ktermios DefaultTermios = {
132         .c_iflag = (ICRNL | IXON),
133         .c_oflag = (OPOST | ONLCR),
134         .c_cflag = (B9600 | CS8 | CREAD | HUPCL | CLOCAL),
135         .c_lflag = (ISIG | ICANON | ECHO | ECHOE | ECHOK | ECHOCTL
136                     | ECHOKE | IEXTEN),
137         .c_cc    = INIT_C_CC,
138         .c_line  = 0,
139 };
140
141 /* Define our tty operations struct */
142 static const struct tty_operations dgrp_tty_ops = {
143         .open            = dgrp_tty_open,
144         .close           = dgrp_tty_close,
145         .write           = dgrp_tty_write,
146         .write_room      = dgrp_tty_write_room,
147         .flush_buffer    = dgrp_tty_flush_buffer,
148         .chars_in_buffer = dgrp_tty_chars_in_buffer,
149         .flush_chars     = NULL,
150         .ioctl           = dgrp_tty_ioctl,
151         .set_termios     = dgrp_tty_set_termios,
152         .stop            = dgrp_tty_stop,
153         .start           = dgrp_tty_start,
154         .throttle        = dgrp_tty_throttle,
155         .unthrottle      = dgrp_tty_unthrottle,
156         .hangup          = dgrp_tty_hangup,
157         .put_char        = dgrp_tty_put_char,
158         .tiocmget        = dgrp_tty_tiocmget,
159         .tiocmset        = dgrp_tty_tiocmset,
160         .break_ctl       = dgrp_tty_send_break,
161         .send_xchar      = dgrp_tty_send_xchar
162 };
163
164
165 static int calc_baud_rate(struct un_struct *un)
166 {
167         int i;
168         int brate;
169
170         struct baud_rates {
171                 unsigned int rate;
172                 unsigned int cflag;
173         };
174
175         static struct baud_rates baud_rates[] = {
176                 { 921600, B921600 },
177                 { 460800, B460800 },
178                 { 230400, B230400 },
179                 { 115200, B115200 },
180                 {  57600, B57600  },
181                 {  38400, B38400  },
182                 {  19200, B19200  },
183                 {   9600, B9600   },
184                 {   4800, B4800   },
185                 {   2400, B2400   },
186                 {   1200, B1200   },
187                 {    600, B600    },
188                 {    300, B300    },
189                 {    200, B200    },
190                 {    150, B150    },
191                 {    134, B134    },
192                 {    110, B110    },
193                 {     75, B75     },
194                 {     50, B50     },
195                 {      0, B9600  }
196         };
197
198         brate = C_BAUD(un->un_tty);
199
200         for (i = 0; baud_rates[i].rate; i++) {
201                 if (baud_rates[i].cflag == brate)
202                         break;
203         }
204
205         return baud_rates[i].rate;
206 }
207
208 static int calc_fastbaud_rate(struct un_struct *un, struct ktermios *uts)
209 {
210         int i;
211         int brate;
212
213         ulong bauds[2][16] = {
214                 { /* fastbaud*/
215                         0,      57600,   76800, 115200,
216                         131657, 153600, 230400, 460800,
217                         921600, 1200,   1800,   2400,
218                         4800,   9600,   19200,  38400 },
219                 { /* fastbaud & CBAUDEX */
220                         0,      57600,  115200, 230400,
221                         460800, 150,    200,    921600,
222                         600,    1200,   1800,   2400,
223                         4800,   9600,   19200,  38400 }
224         };
225
226         brate = C_BAUD(un->un_tty) & 0xff;
227
228         i = (uts->c_cflag & CBAUDEX) ? 1 : 0;
229
230
231         if ((i >= 0) && (i < 2) && (brate >= 0) && (brate < 16))
232                 brate = bauds[i][brate];
233         else
234                 brate = 0;
235
236         return brate;
237 }
238
239 /**
240  * drp_param() -- send parameter values to be sent to the node
241  * @ch: channel structure of port to modify
242  *
243  * Interprets the tty and modem changes made by an application
244  * program (by examining the termios structures) and sets up
245  * parameter values to be sent to the node.
246  */
247 static void drp_param(struct ch_struct *ch)
248 {
249         struct nd_struct *nd;
250         struct un_struct *un;
251         int   brate;
252         int   mflow;
253         int   xflag;
254         int   iflag;
255         struct ktermios *tts, *pts, *uts;
256
257         nd = ch->ch_nd;
258
259         /*
260          *  If the terminal device is open, use it to set up all tty
261          *  modes and functions.  Otherwise use the printer device.
262          */
263
264         if (ch->ch_tun.un_open_count) {
265
266                 un = &ch->ch_tun;
267                 tts = &ch->ch_tun.un_tty->termios;
268
269                 /*
270                  *  If both devices are open, copy critical line
271                  *  parameters from the tty device to the printer,
272                  *  so that if the tty is closed, the printer will
273                  *  continue without disruption.
274                  */
275
276                 if (ch->ch_pun.un_open_count) {
277
278                         pts = &ch->ch_pun.un_tty->termios;
279
280                         pts->c_cflag ^=
281                                 (pts->c_cflag ^ tts->c_cflag) &
282                                 (CBAUD  | CSIZE | CSTOPB | CREAD | PARENB |
283                                  PARODD | HUPCL | CLOCAL);
284
285                         pts->c_iflag ^=
286                                 (pts->c_iflag ^ tts->c_iflag) &
287                                 (IGNBRK | BRKINT | IGNPAR | PARMRK | INPCK |
288                                  ISTRIP | IXON   | IXANY  | IXOFF);
289
290                         pts->c_cc[VSTART] = tts->c_cc[VSTART];
291                         pts->c_cc[VSTOP] = tts->c_cc[VSTOP];
292                 }
293         } else if (ch->ch_pun.un_open_count == 0) {
294                 pr_warn("%s - ch_pun.un_open_count shouldn't be 0\n",
295                        __func__);
296                 return;
297         } else {
298                 un = &ch->ch_pun;
299         }
300
301         uts = &un->un_tty->termios;
302
303         /*
304          * Determine if FAST writes can be performed.
305          */
306
307         if ((ch->ch_digi.digi_flags & DIGI_COOK) != 0 &&
308             (ch->ch_tun.un_open_count != 0)  &&
309             !((un->un_tty)->ldisc->ops->flags & LDISC_FLAG_DEFINED) &&
310             !(L_XCASE(un->un_tty))) {
311                 ch->ch_flag |= CH_FAST_WRITE;
312         } else {
313                 ch->ch_flag &= ~CH_FAST_WRITE;
314         }
315
316         /*
317          *  If FAST writes can be performed, and OPOST is on in the
318          *  terminal device, do OPOST handling in the server.
319          */
320
321         if ((ch->ch_flag & CH_FAST_WRITE) &&
322               O_OPOST(un->un_tty) != 0) {
323                 int oflag = tty_to_ch_flags(un->un_tty, 'o');
324
325                 /* add to ch_ocook any processing flags set in the termio */
326                 ch->ch_ocook |= oflag & (OF_OLCUC |
327                                          OF_ONLCR |
328                                          OF_OCRNL |
329                                          OF_ONLRET |
330                                          OF_TABDLY);
331
332                 /*
333                  * the hpux driver clears any flags set in ch_ocook
334                  * from the termios oflag.  It is STILL reported though
335                  * by a TCGETA
336                  */
337
338                 oflag = ch_to_tty_flags(ch->ch_ocook, 'o');
339                 uts->c_oflag &= ~oflag;
340
341         } else {
342                 /* clear the ch->ch_ocook flag */
343                 int oflag = ch_to_tty_flags(ch->ch_ocook, 'o');
344                 uts->c_oflag |= oflag;
345                 ch->ch_ocook = 0;
346         }
347
348         ch->ch_oflag = ch->ch_ocook;
349
350
351         ch->ch_flag &= ~CH_FAST_READ;
352
353         /*
354          *  Generate channel flags
355          */
356
357         if (C_BAUD(un->un_tty) == B0) {
358                 if (!(ch->ch_flag & CH_BAUD0)) {
359                         /* TODO : the HPUX driver flushes line */
360                         /* TODO : discipline, I assume I don't have to */
361
362                         ch->ch_tout = ch->ch_tin;
363                         ch->ch_rout = ch->ch_rin;
364
365                         ch->ch_break_time = 0;
366
367                         ch->ch_send |= RR_TX_FLUSH | RR_RX_FLUSH;
368
369                         ch->ch_mout &= ~(DM_DTR | DM_RTS);
370
371                         ch->ch_flag |= CH_BAUD0;
372                 }
373         } else if (ch->ch_custom_speed) {
374                 ch->ch_brate = PORTSERVER_DIVIDEND / ch->ch_custom_speed ;
375
376                 if (ch->ch_flag & CH_BAUD0) {
377                         ch->ch_mout |= DM_DTR | DM_RTS;
378
379                         ch->ch_flag &= ~CH_BAUD0;
380                 }
381         } else {
382                 /*
383                  * Baud rate mapping.
384                  *
385                  * If FASTBAUD isn't on, we can scan the new baud rate list
386                  * as required.
387                  *
388                  * However, if FASTBAUD is on, we must go to the old
389                  * baud rate mapping that existed many many moons ago,
390                  * for compatibility reasons.
391                  */
392
393                 if (!(ch->ch_digi.digi_flags & DIGI_FAST))
394                         brate = calc_baud_rate(un);
395                 else
396                         brate = calc_fastbaud_rate(un, uts);
397
398                 if (brate == 0)
399                         brate = 9600;
400
401                 ch->ch_brate = PORTSERVER_DIVIDEND / brate;
402
403                 if (ch->ch_flag & CH_BAUD0) {
404                         ch->ch_mout |= DM_DTR | DM_RTS;
405
406                         ch->ch_flag &= ~CH_BAUD0;
407                 }
408         }
409
410         /*
411          *  Generate channel cflags from the termio.
412          */
413
414         ch->ch_cflag = tty_to_ch_flags(un->un_tty, 'c');
415
416         /*
417          *  Generate channel iflags from the termio.
418          */
419
420         iflag = (int) tty_to_ch_flags(un->un_tty, 'i');
421
422         if (START_CHAR(un->un_tty) == _POSIX_VDISABLE ||
423             STOP_CHAR(un->un_tty) == _POSIX_VDISABLE) {
424                 iflag &= ~(IF_IXON | IF_IXANY | IF_IXOFF);
425         }
426
427         ch->ch_iflag = iflag;
428
429         /*
430          *  Generate flow control characters
431          */
432
433         /*
434          * From the POSIX.1 spec (7.1.2.6): "If {_POSIX_VDISABLE}
435          * is defined for the terminal device file, and the value
436          * of one of the changeable special control characters (see
437          * 7.1.1.9) is {_POSIX_VDISABLE}, that function shall be
438          * disabled, that is, no input data shall be recognized as
439          * the disabled special character."
440          *
441          * OK, so we don't ever assign S/DXB XON or XOFF to _POSIX_VDISABLE.
442          */
443
444         if (uts->c_cc[VSTART] != _POSIX_VDISABLE)
445                 ch->ch_xon = uts->c_cc[VSTART];
446         if (uts->c_cc[VSTOP] != _POSIX_VDISABLE)
447                 ch->ch_xoff = uts->c_cc[VSTOP];
448
449         ch->ch_lnext = (uts->c_cc[VLNEXT] == _POSIX_VDISABLE ? 0 :
450                         uts->c_cc[VLNEXT]);
451
452         /*
453          * Also, if either c_cc[START] or c_cc[STOP] is set to
454          * _POSIX_VDISABLE, we can't really do software flow
455          * control--in either direction--so we turn it off as
456          * far as S/DXB is concerned.  In essence, if you disable
457          * one, you disable the other too.
458          */
459         if ((uts->c_cc[VSTART] == _POSIX_VDISABLE) ||
460             (uts->c_cc[VSTOP] == _POSIX_VDISABLE))
461                 ch->ch_iflag &= ~(IF_IXOFF | IF_IXON);
462
463         /*
464          *  Update xflags.
465          */
466
467         xflag = 0;
468
469         if (ch->ch_digi.digi_flags & DIGI_AIXON)
470                 xflag = XF_XIXON;
471
472         if ((ch->ch_xxon == _POSIX_VDISABLE) ||
473             (ch->ch_xxoff == _POSIX_VDISABLE))
474                 xflag &= ~XF_XIXON;
475
476         ch->ch_xflag = xflag;
477
478
479         /*
480          *  Figure effective DCD value.
481          */
482
483         if (C_CLOCAL(un->un_tty))
484                 ch->ch_flag |= CH_CLOCAL;
485         else
486                 ch->ch_flag &= ~CH_CLOCAL;
487
488         /*
489          *  Check modem signals
490          */
491
492         dgrp_carrier(ch);
493
494         /*
495          *  Get hardware handshake value.
496          */
497
498         mflow = 0;
499
500         if (C_CRTSCTS(un->un_tty))
501                 mflow |= (DM_RTS | DM_CTS);
502
503         if (ch->ch_digi.digi_flags & RTSPACE)
504                 mflow |= DM_RTS;
505
506         if (ch->ch_digi.digi_flags & DTRPACE)
507                 mflow |= DM_DTR;
508
509         if (ch->ch_digi.digi_flags & CTSPACE)
510                 mflow |= DM_CTS;
511
512         if (ch->ch_digi.digi_flags & DSRPACE)
513                 mflow |= DM_DSR;
514
515         if (ch->ch_digi.digi_flags & DCDPACE)
516                 mflow |= DM_CD;
517
518         if (ch->ch_digi.digi_flags & DIGI_RTS_TOGGLE)
519                 mflow |= DM_RTS_TOGGLE;
520
521         ch->ch_mflow = mflow;
522
523         /*
524          *  Send the changes to the server.
525          */
526
527         ch->ch_flag |= CH_PARAM;
528         (ch->ch_nd)->nd_tx_work = 1;
529
530         if (waitqueue_active(&ch->ch_flag_wait))
531                 wake_up_interruptible(&ch->ch_flag_wait);
532 }
533
534 /*
535  * This function is just used as a callback for timeouts
536  * waiting on the ch_sleep flag.
537  */
538 static void wake_up_drp_sleep_timer(unsigned long ptr)
539 {
540         struct ch_struct *ch = (struct ch_struct *) ptr;
541         if (ch)
542                 wake_up(&ch->ch_sleep);
543 }
544
545
546 /*
547  * Set up our own sleep that can't be cancelled
548  * until our timeout occurs.
549  */
550 static void drp_my_sleep(struct ch_struct *ch)
551 {
552         struct timer_list drp_wakeup_timer;
553         DECLARE_WAITQUEUE(wait, current);
554
555         /*
556          * First make sure we're ready to receive the wakeup.
557          */
558
559         add_wait_queue(&ch->ch_sleep, &wait);
560         current->state = TASK_UNINTERRUPTIBLE;
561
562         /*
563          * Since we are uninterruptible, set a timer to
564          * unset the uninterruptable state in 1 second.
565          */
566
567         init_timer(&drp_wakeup_timer);
568         drp_wakeup_timer.function = wake_up_drp_sleep_timer;
569         drp_wakeup_timer.data = (unsigned long) ch;
570         drp_wakeup_timer.expires = jiffies + (1 * HZ);
571         add_timer(&drp_wakeup_timer);
572
573         schedule();
574
575         del_timer(&drp_wakeup_timer);
576
577         remove_wait_queue(&ch->ch_sleep, &wait);
578 }
579
580 /*
581  * dgrp_tty_open()
582  *
583  * returns:
584  *    -EBUSY    - this is a callout device and the normal device is active
585  *              - there is an error in opening the tty
586  *    -ENODEV   - the channel does not exist
587  *    -EAGAIN   - we are in the middle of hanging up or closing
588  *              - IMMEDIATE_OPEN fails
589  *    -ENXIO or -EAGAIN
590  *              - if the port is outside physical range
591  *    -EINTR    - the open is interrupted
592  *
593  */
594 static int dgrp_tty_open(struct tty_struct *tty, struct file *file)
595 {
596         int    retval = 0;
597         struct nd_struct  *nd;
598         struct ch_struct *ch;
599         struct un_struct  *un;
600         int    port;
601         int    delay_error;
602         int    otype;
603         int    unf;
604         int    wait_carrier;
605         int    category;
606         int    counts_were_incremented = 0;
607         ulong lock_flags;
608         DECLARE_WAITQUEUE(wait, current);
609
610         /*
611          * Do some initial checks to see if the node and port exist
612          */
613
614         nd = nd_struct_get(MAJOR(tty_devnum(tty)));
615         port = PORT_NUM(MINOR(tty_devnum(tty)));
616         category = OPEN_CATEGORY(MINOR(tty_devnum(tty)));
617
618         if (!nd)
619                 return -ENODEV;
620
621         if (port >= CHAN_MAX)
622                 return -ENODEV;
623
624         /*
625          *  The channel exists.
626          */
627
628         ch = nd->nd_chan + port;
629
630         un = IS_PRINT(MINOR(tty_devnum(tty))) ? &ch->ch_pun : &ch->ch_tun;
631         un->un_tty = tty;
632         tty->driver_data = un;
633
634         /*
635          * If we are in the middle of hanging up,
636          * then return an error
637          */
638         if (tty_hung_up_p(file)) {
639                 retval = ((un->un_flag & UN_HUP_NOTIFY) ?
640                            -EAGAIN : -ERESTARTSYS);
641                 goto done;
642         }
643
644         /*
645          * If the port is in the middle of closing, then block
646          * until it is done, then try again.
647          */
648         retval = wait_event_interruptible(un->un_close_wait,
649                         ((un->un_flag & UN_CLOSING) == 0));
650
651         if (retval)
652                 goto done;
653
654         /*
655          * If the port is in the middle of a reopen after a network disconnect,
656          * wait until it is done, then try again.
657          */
658         retval = wait_event_interruptible(ch->ch_flag_wait,
659                         ((ch->ch_flag & CH_PORT_GONE) == 0));
660
661         if (retval)
662                 goto done;
663
664         /*
665          * If this is a callout device, then just make sure the normal
666          * device isn't being used.
667          */
668
669         if (tty->driver->subtype == SERIAL_TYPE_CALLOUT) {
670                 if (un->un_flag & UN_NORMAL_ACTIVE) {
671                         retval = -EBUSY;
672                         goto done;
673                 } else {
674                         un->un_flag |= UN_CALLOUT_ACTIVE;
675                 }
676         }
677
678         /*
679          *  Loop waiting until the open can be successfully completed.
680          */
681
682         spin_lock_irqsave(&nd->nd_lock, lock_flags);
683
684         nd->nd_tx_work = 1;
685
686         for (;;) {
687                 wait_carrier = 0;
688
689                 /*
690                  * Determine the open type from the flags provided.
691                  */
692
693                 /*
694                  * If the port is not enabled, then exit
695                  */
696                 if (test_bit(TTY_IO_ERROR, &tty->flags)) {
697                         /* there was an error in opening the tty */
698                         if (un->un_flag & UN_CALLOUT_ACTIVE)
699                                 retval = -EBUSY;
700                         else
701                                 un->un_flag |= UN_NORMAL_ACTIVE;
702                         goto unlock;
703                 }
704
705                 if (file->f_flags & O_NONBLOCK) {
706
707                         /*
708                          * if the O_NONBLOCK is set, errors on read and write
709                          * must return -EAGAIN immediately and NOT sleep
710                          * on the waitqs.
711                          */
712                         otype = OTYPE_IMMEDIATE;
713                         delay_error = -EAGAIN;
714
715                 } else if (!OPEN_WAIT_AVAIL(category) ||
716                           (file->f_flags & O_NDELAY) != 0) {
717                         otype = OTYPE_IMMEDIATE;
718                         delay_error = -EBUSY;
719
720                 } else if (!OPEN_WAIT_CARRIER(category) ||
721                           ((ch->ch_digi.digi_flags & DIGI_FORCEDCD) != 0) ||
722                           C_CLOCAL(tty)) {
723                         otype = OTYPE_PERSISTENT;
724                         delay_error = 0;
725
726                 } else {
727                         otype = OTYPE_INCOMING;
728                         delay_error = 0;
729                 }
730
731                 /*
732                  * Handle port currently outside physical port range.
733                  */
734
735                 if (port >= nd->nd_chan_count) {
736                         if (otype == OTYPE_IMMEDIATE) {
737                                 retval = (nd->nd_state == NS_READY) ?
738                                                 -ENXIO : -EAGAIN;
739                                 goto unlock;
740                         }
741                 }
742
743                 /*
744                  *  Handle port not currently open.
745                  */
746
747                 else if (ch->ch_open_count == 0) {
748                         /*
749                          * Return an error when an Incoming Open
750                          * response indicates the port is busy.
751                          */
752
753                         if (ch->ch_open_error != 0 && otype == ch->ch_otype) {
754                                 retval = (ch->ch_open_error <= 2) ?
755                                           delay_error : -ENXIO ;
756                                 goto unlock;
757                         }
758
759                         /*
760                          * Fail any new Immediate open if we do not have
761                          * a normal connection to the server.
762                          */
763
764                         if (nd->nd_state != NS_READY &&
765                             otype == OTYPE_IMMEDIATE) {
766                                 retval = -EAGAIN;
767                                 goto unlock;
768                         }
769
770                         /*
771                          * If a Realport open of the correct type has
772                          * succeeded, complete the open.
773                          */
774
775                         if (ch->ch_state == CS_READY && ch->ch_otype == otype)
776                                 break;
777                 }
778
779                 /*
780                  * Handle port already open and active as a device
781                  * of same category.
782                  */
783
784                 else if ((ch->ch_category == category) ||
785                           IS_PRINT(MINOR(tty_devnum(tty)))) {
786                         /*
787                          * Fail if opening the device now would
788                          * violate exclusive use.
789                          */
790                         unf = ch->ch_tun.un_flag | ch->ch_pun.un_flag;
791
792                         if ((file->f_flags & O_EXCL) || (unf & UN_EXCL)) {
793                                 retval = -EBUSY;
794                                 goto unlock;
795                         }
796
797                         /*
798                          * If the open device is in the hangup state, all
799                          * system calls fail except close().
800                          */
801
802                         /* TODO : check on hangup_p calls */
803
804                         if (ch->ch_flag & CH_HANGUP) {
805                                 retval = -ENXIO;
806                                 goto unlock;
807                         }
808
809                         /*
810                          * If the port is ready, and carrier is ignored
811                          * or present, then complete the open.
812                          */
813
814                         if (ch->ch_state == CS_READY &&
815                             (otype != OTYPE_INCOMING ||
816                             ch->ch_flag & CH_VIRT_CD))
817                                 break;
818
819                         wait_carrier = 1;
820                 }
821
822                 /*
823                  *  Handle port active with a different category device.
824                  */
825
826                 else {
827                         if (otype == OTYPE_IMMEDIATE) {
828                                 retval = delay_error;
829                                 goto unlock;
830                         }
831                 }
832
833                 /*
834                  * Wait until conditions change, then take another
835                  * try at the open.
836                  */
837
838                 ch->ch_wait_count[otype]++;
839
840                 if (wait_carrier)
841                         ch->ch_wait_carrier++;
842
843                 /*
844                  * Prepare the task to accept the wakeup, then
845                  * release our locks and release control.
846                  */
847
848                 add_wait_queue(&ch->ch_flag_wait, &wait);
849                 current->state = TASK_INTERRUPTIBLE;
850
851                 spin_unlock_irqrestore(&nd->nd_lock, lock_flags);
852
853                 /*
854                  * Give up control, we'll come back if we're
855                  * interrupted or are woken up.
856                  */
857                 schedule();
858                 remove_wait_queue(&ch->ch_flag_wait, &wait);
859
860                 spin_lock_irqsave(&nd->nd_lock, lock_flags);
861
862                 current->state = TASK_RUNNING;
863
864                 ch->ch_wait_count[otype]--;
865
866                 if (wait_carrier)
867                         ch->ch_wait_carrier--;
868
869                 nd->nd_tx_work = 1;
870
871                 if (signal_pending(current)) {
872                         retval = -EINTR;
873                         goto unlock;
874                 }
875         } /* end for(;;) */
876
877         /*
878          *  The open has succeeded.  No turning back.
879          */
880         counts_were_incremented = 1;
881         un->un_open_count++;
882         ch->ch_open_count++;
883
884         /*
885          * Initialize the channel, if it's not already open.
886          */
887
888         if (ch->ch_open_count == 1) {
889                 ch->ch_flag = 0;
890                 ch->ch_inwait = 0;
891                 ch->ch_category = category;
892                 ch->ch_pscan_state = 0;
893
894                 /* TODO : find out what PS-1 bug Gene was referring to */
895                 /* TODO : in the following comment. */
896
897                 ch->ch_send = RR_TX_START | RR_RX_START;  /* PS-1 bug */
898
899                 if (C_CLOCAL(tty) ||
900                     ch->ch_s_mlast & DM_CD ||
901                     ch->ch_digi.digi_flags & DIGI_FORCEDCD)
902                         ch->ch_flag |= CH_VIRT_CD;
903                 else if (OPEN_FORCES_CARRIER(category))
904                         ch->ch_flag |= CH_VIRT_CD;
905
906         }
907
908         /*
909          *  Initialize the unit, if it is not already open.
910          */
911
912         if (un->un_open_count == 1) {
913                 /*
914                  *  Since all terminal options are always sticky in Linux,
915                  *  we don't need the UN_STICKY flag to be handled specially.
916                  */
917                 /* clears all the digi flags, leaves serial flags */
918                 un->un_flag &= ~UN_DIGI_MASK;
919
920                 if (file->f_flags & O_EXCL)
921                         un->un_flag |= UN_EXCL;
922
923                 /* TODO : include "session" and "pgrp" */
924
925                 /*
926                  *  In Linux, all terminal parameters are intended to be sticky.
927                  *  as a result, we "remove" the code which once reset the ports
928                  *  to sane values.
929                  */
930
931                 drp_param(ch);
932
933         }
934
935         un->un_flag |= UN_INITIALIZED;
936
937         retval = 0;
938
939 unlock:
940
941         spin_unlock_irqrestore(&nd->nd_lock, lock_flags);
942
943 done:
944         /*
945          * Linux does a close for every open, even failed ones!
946          */
947         if (!counts_were_incremented) {
948                 un->un_open_count++;
949                 ch->ch_open_count++;
950         }
951
952         if (retval)
953                 dev_err(tty->dev, "tty open bad return (%i)\n", retval);
954
955         return retval;
956 }
957
958
959
960
961 /*
962  * dgrp_tty_close() -- close function for tty_operations
963  */
964 static void dgrp_tty_close(struct tty_struct *tty, struct file *file)
965 {
966         struct ch_struct *ch;
967         struct un_struct *un;
968         struct nd_struct *nd;
969         int     tpos;
970         int     port;
971         int     err = 0;
972         int     s = 0;
973         ulong  waketime;
974         ulong  lock_flags;
975         int sent_printer_offstr = 0;
976
977         port = PORT_NUM(MINOR(tty_devnum(tty)));
978
979         un = tty->driver_data;
980
981         if (!un)
982                 return;
983
984         ch = un->un_ch;
985
986         if (!ch)
987                 return;
988
989         nd = ch->ch_nd;
990
991         if (!nd)
992                 return;
993
994         spin_lock_irqsave(&nd->nd_lock, lock_flags);
995
996
997         /* Used to be on channel basis, now we check on a unit basis. */
998         if (un->un_open_count != 1)
999                 goto unlock;
1000
1001         /*
1002          * OK, its the last close on the unit
1003          */
1004         un->un_flag |= UN_CLOSING;
1005
1006         /*
1007          * Notify the discipline to only process XON/XOFF characters.
1008          */
1009         tty->closing = 1;
1010
1011         /*
1012          * Wait for output to drain only if this is
1013          * the last close against the channel
1014          */
1015
1016         if (ch->ch_open_count == 1) {
1017                 /*
1018                  * If its the print device, we need to ensure at all costs that
1019                  * the offstr will fit. If it won't, flush our tbuf.
1020                  */
1021                 if (IS_PRINT(MINOR(tty_devnum(tty))) &&
1022                     (((ch->ch_tout - ch->ch_tin - 1) & TBUF_MASK) <
1023                     ch->ch_digi.digi_offlen))
1024                         ch->ch_tin = ch->ch_tout;
1025
1026                 /*
1027                  * Turn off the printer.  Don't bother checking to see if its
1028                  * IS_PRINT... Since this is the last close the flag is going
1029                  * to be cleared, so we MUST make sure the offstr gets inserted
1030                  * into tbuf.
1031                  */
1032
1033                 if ((ch->ch_flag & CH_PRON) != 0) {
1034                         drp_wmove(ch, 0, ch->ch_digi.digi_offstr,
1035                                   ch->ch_digi.digi_offlen);
1036                         ch->ch_flag &= ~CH_PRON;
1037                         sent_printer_offstr = 1;
1038                 }
1039         }
1040
1041         /*
1042          *  Wait until either the output queue has drained, or we see
1043          *  absolutely no progress for 15 seconds.
1044          */
1045
1046         tpos = ch->ch_s_tpos;
1047
1048         waketime = jiffies + 15 * HZ;
1049
1050         for (;;) {
1051
1052                 /*
1053                  *  Make sure the port still exists.
1054                  */
1055
1056                 if (port >= nd->nd_chan_count) {
1057                         err = 1;
1058                         break;
1059                 }
1060
1061                 if (signal_pending(current)) {
1062                         err = 1;
1063                         break;
1064                 }
1065
1066                 /*
1067                  * If the port is idle (not opened on the server), we have
1068                  * no way of draining/flushing/closing the port on that server.
1069                  * So break out of loop.
1070                  */
1071                 if (ch->ch_state == CS_IDLE)
1072                         break;
1073
1074                 nd->nd_tx_work = 1;
1075
1076                 /*
1077                  *  Exit if the queues for this unit are empty,
1078                  *  and either the other unit is still open or all
1079                  *  data has drained.
1080                  */
1081
1082                 if ((un->un_tty)->ops->chars_in_buffer ?
1083                     ((un->un_tty)->ops->chars_in_buffer)(un->un_tty) == 0 : 1) {
1084
1085                         /*
1086                          * We don't need to wait for a buffer to drain
1087                          * if the other unit is open.
1088                          */
1089
1090                         if (ch->ch_open_count != un->un_open_count)
1091                                 break;
1092
1093                         /*
1094                          *  The wait is complete when all queues are
1095                          *  drained, and any break in progress is complete.
1096                          */
1097
1098                         if (ch->ch_tin == ch->ch_tout &&
1099                             ch->ch_s_tin == ch->ch_s_tpos &&
1100                             (ch->ch_send & RR_TX_BREAK) == 0) {
1101                                 break;
1102                         }
1103                 }
1104
1105                 /*
1106                  * Flush TX data and exit the wait if NDELAY is set,
1107                  * or this is not a DIGI printer, and the close timeout
1108                  * expires.
1109                  */
1110
1111                 if ((file->f_flags & (O_NDELAY | O_NONBLOCK)) ||
1112                     ((long)(jiffies - waketime) >= 0 &&
1113                       (ch->ch_digi.digi_flags & DIGI_PRINTER) == 0)) {
1114
1115                                 /*
1116                                  * If we sent the printer off string, we cannot
1117                                  * flush our internal buffers, or we might lose
1118                                  * the offstr.
1119                                  */
1120                                 if (!sent_printer_offstr)
1121                                         dgrp_tty_flush_buffer(tty);
1122
1123                                 tty_ldisc_flush(tty);
1124                                 break;
1125                 }
1126
1127                 /*
1128                  *  Otherwise take a short nap.
1129                  */
1130
1131                 ch->ch_flag |= CH_DRAIN;
1132
1133                 spin_unlock_irqrestore(&nd->nd_lock, lock_flags);
1134
1135                 schedule_timeout_interruptible(1);
1136                 s = signal_pending(current);
1137
1138                 spin_lock_irqsave(&nd->nd_lock, lock_flags);
1139
1140                 if (s) {
1141                         /*
1142                          * If we had sent the printer off string, we now have
1143                          * some problems.
1144                          *
1145                          * The system won't let us sleep since we got an error
1146                          * back from sleep, presumably because the user did
1147                          * a ctrl-c...
1148                          * But we need to ensure that the offstr gets sent!
1149                          * Thus, we have to do something else besides sleeping.
1150                          * The plan:
1151                          * 1) Make this task uninterruptable.
1152                          * 2) Set up a timer to go off in 1 sec.
1153                          * 3) Act as tho we just got out of the sleep above.
1154                          *
1155                          * Thankfully, in the real world, this just
1156                          * never happens.
1157                          */
1158
1159                         if (sent_printer_offstr) {
1160                                 spin_unlock_irqrestore(&nd->nd_lock,
1161                                                        lock_flags);
1162                                 drp_my_sleep(ch);
1163                                 spin_lock_irqsave(&nd->nd_lock, lock_flags);
1164                         } else {
1165                                 err = 1;
1166                                 break;
1167                         }
1168                 }
1169
1170                 /*
1171                  *  Restart the wait if any progress is seen.
1172                  */
1173
1174                 if (ch->ch_s_tpos != tpos) {
1175                         tpos = ch->ch_s_tpos;
1176
1177                         /* TODO:  this gives us timeout problems with nist ?? */
1178                         waketime = jiffies + 15 * HZ;
1179                 }
1180         }
1181
1182         /*
1183          *  Close the line discipline
1184          */
1185
1186         /* this is done in tty_io.c */
1187         /* if ((un->un_tty)->ldisc.close)
1188          *      ((un->un_tty)->ldisc.close)(un->un_tty);
1189          */
1190
1191         /* don't do this here */
1192         /* un->un_flag = 0; */
1193
1194         /*
1195          *  Flush the receive buffer on terminal unit close only.
1196          */
1197
1198         if (!IS_PRINT(MINOR(tty_devnum(tty))))
1199                 ch->ch_rout = ch->ch_rin;
1200
1201
1202         /*
1203          * Don't permit the close to happen until we get any pending
1204          * sync request responses.
1205          * There could be other ports depending upon the response as well.
1206          *
1207          * Also, don't permit the close to happen until any parameter
1208          * changes have been sent out from the state machine as well.
1209          * This is required because of a ditty -a race with -HUPCL
1210          * We MUST make sure all channel parameters have been sent to the
1211          * Portserver before sending a close.
1212          */
1213
1214         if ((err != 1) && (ch->ch_state != CS_IDLE)) {
1215                 spin_unlock_irqrestore(&nd->nd_lock, lock_flags);
1216                 s = wait_event_interruptible(ch->ch_flag_wait,
1217                         ((ch->ch_flag & (CH_WAITING_SYNC | CH_PARAM)) == 0));
1218                 spin_lock_irqsave(&nd->nd_lock, lock_flags);
1219         }
1220
1221         /*
1222          * Cleanup the channel if last unit open.
1223          */
1224
1225         if (ch->ch_open_count == 1) {
1226                 ch->ch_flag = 0;
1227                 ch->ch_category = 0;
1228                 ch->ch_send = 0;
1229                 ch->ch_expect = 0;
1230                 ch->ch_tout = ch->ch_tin;
1231                 /* (un->un_tty)->device = 0; */
1232
1233                 if (ch->ch_state == CS_READY)
1234                         ch->ch_state = CS_SEND_CLOSE;
1235         }
1236
1237         /*
1238          * Send the changes to the server
1239          */
1240         if (ch->ch_state != CS_IDLE) {
1241                 ch->ch_flag |= CH_PARAM;
1242                 wake_up_interruptible(&ch->ch_flag_wait);
1243         }
1244
1245         nd->nd_tx_work = 1;
1246         nd->nd_tx_ready = 1;
1247
1248 unlock:
1249         tty->closing = 0;
1250
1251         if (ch->ch_open_count <= 0)
1252                 dev_info(tty->dev,
1253                          "%s - unexpected value for ch->ch_open_count: %i\n",
1254                          __func__, ch->ch_open_count);
1255         else
1256                 ch->ch_open_count--;
1257
1258         if (un->un_open_count <= 0)
1259                 dev_info(tty->dev,
1260                          "%s - unexpected value for un->un_open_count: %i\n",
1261                          __func__, un->un_open_count);
1262         else
1263                 un->un_open_count--;
1264
1265         un->un_flag &= ~(UN_NORMAL_ACTIVE | UN_CALLOUT_ACTIVE | UN_CLOSING);
1266         if (waitqueue_active(&un->un_close_wait))
1267                 wake_up_interruptible(&un->un_close_wait);
1268
1269         spin_unlock_irqrestore(&nd->nd_lock, lock_flags);
1270
1271         return;
1272
1273 }
1274
1275 static void drp_wmove(struct ch_struct *ch, int from_user, void *buf, int count)
1276 {
1277         int n;
1278         int ret = 0;
1279
1280         ch->ch_nd->nd_tx_work = 1;
1281
1282         n = TBUF_MAX - ch->ch_tin;
1283
1284         if (count >= n) {
1285                 if (from_user)
1286                         ret = copy_from_user(ch->ch_tbuf + ch->ch_tin,
1287                                              (void __user *) buf, n);
1288                 else
1289                         memcpy(ch->ch_tbuf + ch->ch_tin, buf, n);
1290
1291                 buf = (char *) buf + n;
1292                 count -= n;
1293                 ch->ch_tin = 0;
1294         }
1295
1296         if (from_user)
1297                 ret = copy_from_user(ch->ch_tbuf + ch->ch_tin,
1298                                      (void __user *) buf, count);
1299         else
1300                 memcpy(ch->ch_tbuf + ch->ch_tin, buf, count);
1301
1302         ch->ch_tin += count;
1303 }
1304
1305
1306 static int dgrp_calculate_txprint_bounds(struct ch_struct *ch, int space,
1307                                          int *un_flag)
1308 {
1309         clock_t tt;
1310         clock_t mt;
1311         unsigned short tmax = 0;
1312
1313         /*
1314          * If the terminal device is busy, reschedule when
1315          * the terminal device becomes idle.
1316          */
1317
1318         if (ch->ch_tun.un_open_count != 0 &&
1319             ch->ch_tun.un_tty->ops->chars_in_buffer &&
1320             ((ch->ch_tun.un_tty->ops->chars_in_buffer)(ch->ch_tun.un_tty) != 0)) {
1321                 *un_flag = UN_PWAIT;
1322                 return 0;
1323         }
1324
1325         /*
1326          * Assure that whenever there is printer data in the output
1327          * buffer, there always remains enough space after it to
1328          * turn the printer off.
1329          */
1330         space -= ch->ch_digi.digi_offlen;
1331
1332         if (space <= 0) {
1333                 *un_flag = UN_EMPTY;
1334                 return 0;
1335         }
1336
1337         /*
1338          * We measure printer CPS speed by incrementing
1339          * ch_cpstime by (HZ / digi_maxcps) for every
1340          * character we output, restricting output so
1341          * that ch_cpstime never exceeds lbolt.
1342          *
1343          * However if output has not been done for some
1344          * time, lbolt will grow to very much larger than
1345          * ch_cpstime, which would allow essentially
1346          * unlimited amounts of output until ch_cpstime
1347          * finally caught up.   To avoid this, we adjust
1348          * cps_time when necessary so the difference
1349          * between lbolt and ch_cpstime never results
1350          * in sending more than digi_bufsize characters.
1351          *
1352          * This nicely models a printer with an internal
1353          * buffer of digi_bufsize characters.
1354          *
1355          * Get the time between lbolt and ch->ch_cpstime;
1356          */
1357
1358         tt = jiffies - ch->ch_cpstime;
1359
1360         /*
1361          * Compute the time required to send digi_bufsize
1362          * characters.
1363          */
1364
1365         mt = HZ * ch->ch_digi.digi_bufsize / ch->ch_digi.digi_maxcps;
1366
1367         /*
1368          * Compute the number of characters that can be sent
1369          * without violating the time constraint.   If the
1370          * direct calculation of this number is bigger than
1371          * digi_bufsize, limit the number to digi_bufsize,
1372          * and adjust cpstime to match.
1373          */
1374
1375         if ((clock_t)(tt + HZ) > (clock_t)(mt + HZ)) {
1376                 tmax = ch->ch_digi.digi_bufsize;
1377                 ch->ch_cpstime = jiffies - mt;
1378         } else {
1379                 tmax = ch->ch_digi.digi_maxcps * tt / HZ;
1380         }
1381
1382         /*
1383          * If the time constraint now binds, limit the transmit
1384          * count accordingly, and tentatively arrange to be
1385          * rescheduled based on time.
1386          */
1387
1388         if (tmax < space) {
1389                 *un_flag = UN_TIME;
1390                 space = tmax;
1391         }
1392
1393         /*
1394          * Compute the total number of characters we can
1395          * output before the total number of characters known
1396          * to be in the output queue exceeds digi_maxchar.
1397          */
1398
1399         tmax = (ch->ch_digi.digi_maxchar -
1400                 ((ch->ch_tin - ch->ch_tout) & TBUF_MASK) -
1401                 ((ch->ch_s_tin - ch->ch_s_tpos) & 0xffff));
1402
1403
1404         /*
1405          * If the digi_maxchar constraint now holds, limit
1406          * the transmit count accordingly, and arrange to
1407          * be rescheduled when the queue becomes empty.
1408          */
1409
1410         if (space > tmax) {
1411                 *un_flag = UN_EMPTY;
1412                 space = tmax;
1413         }
1414
1415         if (space <= 0)
1416                 *un_flag |= UN_EMPTY;
1417
1418         return space;
1419 }
1420
1421
1422 static int dgrp_tty_write(struct tty_struct *tty,
1423                           const unsigned char *buf,
1424                           int count)
1425 {
1426         struct nd_struct *nd;
1427         struct un_struct *un;
1428         struct ch_struct *ch;
1429         int     space;
1430         int     n;
1431         int     t;
1432         int sendcount;
1433         int un_flag;
1434         ulong lock_flags;
1435
1436         if (tty == NULL)
1437                 return 0;
1438
1439         un = tty->driver_data;
1440         if (!un)
1441                 return 0;
1442
1443         ch = un->un_ch;
1444         if (!ch)
1445                 return 0;
1446
1447         nd = ch->ch_nd;
1448         if (!nd)
1449                 return 0;
1450
1451         /*
1452          * Ignore the request if the channel is not ready.
1453          */
1454         if (ch->ch_state != CS_READY)
1455                 return 0;
1456
1457         spin_lock_irqsave(&dgrp_poll_data.poll_lock, lock_flags);
1458
1459         /*
1460          * Ignore the request if output is blocked.
1461          */
1462         if ((un->un_flag & (UN_EMPTY | UN_LOW | UN_TIME | UN_PWAIT)) != 0) {
1463                 count = 0;
1464                 goto out;
1465         }
1466
1467         /*
1468          * Also ignore the request if DPA has this port open,
1469          * and is flow controlled on reading more data.
1470          */
1471         if (nd->nd_dpa_debug && nd->nd_dpa_flag & DPA_WAIT_SPACE &&
1472                 nd->nd_dpa_port == MINOR(tty_devnum(ch->ch_tun.un_tty))) {
1473                 count = 0;
1474                 goto out;
1475         }
1476
1477         /*
1478          *      Limit amount we will write to the amount of space
1479          *      available in the channel buffer.
1480          */
1481         sendcount = 0;
1482
1483         space = (ch->ch_tout - ch->ch_tin - 1) & TBUF_MASK;
1484
1485         /*
1486          * Handle the printer device.
1487          */
1488
1489         un_flag = UN_LOW;
1490
1491         if (IS_PRINT(MINOR(tty_devnum(tty)))) {
1492                 clock_t tt;
1493                 clock_t mt;
1494                 unsigned short tmax = 0;
1495
1496                 /*
1497                  * If the terminal device is busy, reschedule when
1498                  * the terminal device becomes idle.
1499                  */
1500
1501                 if (ch->ch_tun.un_open_count != 0 &&
1502                     ((ch->ch_tun.un_tty->ops->chars_in_buffer)(ch->ch_tun.un_tty) != 0)) {
1503                         un->un_flag |= UN_PWAIT;
1504                         count = 0;
1505                         goto out;
1506                 }
1507
1508                 /*
1509                  * Assure that whenever there is printer data in the output
1510                  * buffer, there always remains enough space after it to
1511                  * turn the printer off.
1512                  */
1513                 space -= ch->ch_digi.digi_offlen;
1514
1515                 /*
1516                  * Output the printer on string.
1517                  */
1518
1519                 if ((ch->ch_flag & CH_PRON) == 0) {
1520                         space -= ch->ch_digi.digi_onlen;
1521
1522                         if (space < 0) {
1523                                 un->un_flag |= UN_EMPTY;
1524                                 (ch->ch_nd)->nd_tx_work = 1;
1525                                 count = 0;
1526                                 goto out;
1527                         }
1528
1529                         drp_wmove(ch, 0, ch->ch_digi.digi_onstr,
1530                                 ch->ch_digi.digi_onlen);
1531
1532                         ch->ch_flag |= CH_PRON;
1533                 }
1534
1535                 /*
1536                  * We measure printer CPS speed by incrementing
1537                  * ch_cpstime by (HZ / digi_maxcps) for every
1538                  * character we output, restricting output so
1539                  * that ch_cpstime never exceeds lbolt.
1540                  *
1541                  * However if output has not been done for some
1542                  * time, lbolt will grow to very much larger than
1543                  * ch_cpstime, which would allow essentially
1544                  * unlimited amounts of output until ch_cpstime
1545                  * finally caught up.   To avoid this, we adjust
1546                  * cps_time when necessary so the difference
1547                  * between lbolt and ch_cpstime never results
1548                  * in sending more than digi_bufsize characters.
1549                  *
1550                  * This nicely models a printer with an internal
1551                  * buffer of digi_bufsize characters.
1552                  *
1553                  * Get the time between lbolt and ch->ch_cpstime;
1554                  */
1555
1556                 tt = jiffies - ch->ch_cpstime;
1557
1558                 /*
1559                  * Compute the time required to send digi_bufsize
1560                  * characters.
1561                  */
1562
1563                 mt = HZ * ch->ch_digi.digi_bufsize / ch->ch_digi.digi_maxcps;
1564
1565                 /*
1566                  * Compute the number of characters that can be sent
1567                  * without violating the time constraint.   If the
1568                  * direct calculation of this number is bigger than
1569                  * digi_bufsize, limit the number to digi_bufsize,
1570                  * and adjust cpstime to match.
1571                  */
1572
1573                 if ((clock_t)(tt + HZ) > (clock_t)(mt + HZ)) {
1574                         tmax = ch->ch_digi.digi_bufsize;
1575                         ch->ch_cpstime = jiffies - mt;
1576                 } else {
1577                         tmax = ch->ch_digi.digi_maxcps * tt / HZ;
1578                 }
1579
1580                 /*
1581                  * If the time constraint now binds, limit the transmit
1582                  * count accordingly, and tentatively arrange to be
1583                  * rescheduled based on time.
1584                  */
1585
1586                 if (tmax < space) {
1587                         space = tmax;
1588                         un_flag = UN_TIME;
1589                 }
1590
1591                 /*
1592                  * Compute the total number of characters we can
1593                  * output before the total number of characters known
1594                  * to be in the output queue exceeds digi_maxchar.
1595                  */
1596
1597                 tmax = (ch->ch_digi.digi_maxchar -
1598                         ((ch->ch_tin - ch->ch_tout) & TBUF_MASK) -
1599                         ((ch->ch_s_tin - ch->ch_s_tpos) & 0xffff));
1600
1601
1602                 /*
1603                  * If the digi_maxchar constraint now holds, limit
1604                  * the transmit count accordingly, and arrange to
1605                  * be rescheduled when the queue becomes empty.
1606                  */
1607
1608                 if (space > tmax) {
1609                         space = tmax;
1610                         un_flag = UN_EMPTY;
1611                 }
1612
1613         }
1614         /*
1615          * Handle the terminal device.
1616          */
1617         else {
1618
1619                 /*
1620                  * If the printer device is on, turn it off.
1621                  */
1622
1623                 if ((ch->ch_flag & CH_PRON) != 0) {
1624
1625                         space -= ch->ch_digi.digi_offlen;
1626
1627                         drp_wmove(ch, 0, ch->ch_digi.digi_offstr,
1628                                   ch->ch_digi.digi_offlen);
1629
1630                         ch->ch_flag &= ~CH_PRON;
1631                 }
1632         }
1633
1634         /*
1635          *      If space is 0 and its because the ch->tbuf
1636          *      is full, then Linux will handle a callback when queue
1637          *      space becomes available.
1638          *      tty_write returns count = 0
1639          */
1640
1641         if (space <= 0) {
1642                 /* the linux tty_io.c handles this if we return 0 */
1643                 /* if (fp->flags & O_NONBLOCK) return -EAGAIN; */
1644
1645                 un->un_flag |= UN_EMPTY;
1646                 (ch->ch_nd)->nd_tx_work = 1;
1647                 count = 0;
1648                 goto out;
1649         }
1650
1651         count = min(count, space);
1652
1653         if (count > 0) {
1654
1655                 un->un_tbusy++;
1656
1657                 /*
1658                  *      Copy the buffer contents to the ch_tbuf
1659                  *      being careful to wrap around the circular queue
1660                  */
1661
1662                 t = TBUF_MAX - ch->ch_tin;
1663                 n = count;
1664
1665                 if (n >= t) {
1666                         memcpy(ch->ch_tbuf + ch->ch_tin, buf, t);
1667                         if (nd->nd_dpa_debug && nd->nd_dpa_port == PORT_NUM(MINOR(tty_devnum(un->un_tty))))
1668                                 dgrp_dpa_data(nd, 0, (char *) buf, t);
1669                         buf += t;
1670                         n -= t;
1671                         ch->ch_tin = 0;
1672                         sendcount += n;
1673                 }
1674
1675                 memcpy(ch->ch_tbuf + ch->ch_tin, buf, n);
1676                 if (nd->nd_dpa_debug && nd->nd_dpa_port == PORT_NUM(MINOR(tty_devnum(un->un_tty))))
1677                         dgrp_dpa_data(nd, 0, (char *) buf, n);
1678                 buf += n;
1679                 ch->ch_tin += n;
1680                 sendcount += n;
1681
1682                 un->un_tbusy--;
1683                 (ch->ch_nd)->nd_tx_work = 1;
1684                 if (ch->ch_edelay != DGRP_RTIME) {
1685                         (ch->ch_nd)->nd_tx_ready = 1;
1686                         wake_up_interruptible(&nd->nd_tx_waitq);
1687                 }
1688         }
1689
1690         ch->ch_txcount += count;
1691
1692         if (IS_PRINT(MINOR(tty_devnum(tty)))) {
1693
1694                 /*
1695                  * Adjust ch_cpstime to account
1696                  * for the characters just output.
1697                  */
1698
1699                 if (sendcount > 0) {
1700                         int cc = HZ * sendcount + ch->ch_cpsrem;
1701
1702                         ch->ch_cpstime += cc / ch->ch_digi.digi_maxcps;
1703                         ch->ch_cpsrem   = cc % ch->ch_digi.digi_maxcps;
1704                 }
1705
1706                 /*
1707                  * If we are now waiting on time, schedule ourself
1708                  * back when we'll be able to send a block of
1709                  * digi_maxchar characters.
1710                  */
1711
1712                 if ((un_flag & UN_TIME) != 0) {
1713                         ch->ch_waketime = (ch->ch_cpstime +
1714                                 (ch->ch_digi.digi_maxchar * HZ /
1715                                 ch->ch_digi.digi_maxcps));
1716                 }
1717         }
1718
1719         /*
1720          * If the printer unit is waiting for completion
1721          * of terminal output, get him going again.
1722          */
1723
1724         if ((ch->ch_pun.un_flag & UN_PWAIT) != 0)
1725                 (ch->ch_nd)->nd_tx_work = 1;
1726
1727 out:
1728         spin_unlock_irqrestore(&dgrp_poll_data.poll_lock, lock_flags);
1729
1730         return count;
1731 }
1732
1733
1734 /*
1735  *      Put a character into ch->ch_buf
1736  *
1737  *      - used by the line discipline for OPOST processing
1738  */
1739
1740 static int dgrp_tty_put_char(struct tty_struct *tty, unsigned char new_char)
1741 {
1742         struct un_struct *un;
1743         struct ch_struct *ch;
1744         ulong  lock_flags;
1745         int space;
1746         int retval = 0;
1747
1748         if (tty == NULL)
1749                 return 0;
1750
1751         un = tty->driver_data;
1752         if (!un)
1753                 return 0;
1754
1755         ch = un->un_ch;
1756         if (!ch)
1757                 return 0;
1758
1759         if (ch->ch_state != CS_READY)
1760                 return 0;
1761
1762         spin_lock_irqsave(&dgrp_poll_data.poll_lock, lock_flags);
1763
1764
1765         /*
1766          *      If space is 0 and its because the ch->tbuf
1767          *      Warn and dump the character, there isn't anything else
1768          *      we can do about it.  David_Fries@digi.com
1769          */
1770
1771         space = (ch->ch_tout - ch->ch_tin - 1) & TBUF_MASK;
1772
1773         un->un_tbusy++;
1774
1775         /*
1776          * Output the printer on string if device is TXPrint.
1777          */
1778         if (IS_PRINT(MINOR(tty_devnum(tty))) && (ch->ch_flag & CH_PRON) == 0) {
1779                 if (space < ch->ch_digi.digi_onlen) {
1780                         un->un_tbusy--;
1781                         goto out;
1782                 }
1783                 space -= ch->ch_digi.digi_onlen;
1784                 drp_wmove(ch, 0, ch->ch_digi.digi_onstr,
1785                           ch->ch_digi.digi_onlen);
1786                 ch->ch_flag |= CH_PRON;
1787         }
1788
1789         /*
1790          * Output the printer off string if device is NOT TXPrint.
1791          */
1792
1793         if (!IS_PRINT(MINOR(tty_devnum(tty))) &&
1794             ((ch->ch_flag & CH_PRON) != 0)) {
1795                 if (space < ch->ch_digi.digi_offlen) {
1796                         un->un_tbusy--;
1797                         goto out;
1798                 }
1799
1800                 space -= ch->ch_digi.digi_offlen;
1801                 drp_wmove(ch, 0, ch->ch_digi.digi_offstr,
1802                           ch->ch_digi.digi_offlen);
1803                 ch->ch_flag &= ~CH_PRON;
1804         }
1805
1806         if (!space) {
1807                 un->un_tbusy--;
1808                 goto out;
1809         }
1810
1811         /*
1812          *      Copy the character to the ch_tbuf being
1813          *      careful to wrap around the circular queue
1814          */
1815         ch->ch_tbuf[ch->ch_tin] = new_char;
1816         ch->ch_tin = (1 + ch->ch_tin) & TBUF_MASK;
1817
1818         if (IS_PRINT(MINOR(tty_devnum(tty)))) {
1819
1820                 /*
1821                  * Adjust ch_cpstime to account
1822                  * for the character just output.
1823                  */
1824
1825                 int cc = HZ + ch->ch_cpsrem;
1826
1827                 ch->ch_cpstime += cc / ch->ch_digi.digi_maxcps;
1828                 ch->ch_cpsrem   = cc % ch->ch_digi.digi_maxcps;
1829
1830                 /*
1831                  * If we are now waiting on time, schedule ourself
1832                  * back when we'll be able to send a block of
1833                  * digi_maxchar characters.
1834                  */
1835
1836                 ch->ch_waketime = (ch->ch_cpstime +
1837                         (ch->ch_digi.digi_maxchar * HZ /
1838                         ch->ch_digi.digi_maxcps));
1839         }
1840
1841
1842         un->un_tbusy--;
1843         (ch->ch_nd)->nd_tx_work = 1;
1844
1845         retval = 1;
1846 out:
1847         spin_unlock_irqrestore(&dgrp_poll_data.poll_lock, lock_flags);
1848         return retval;
1849 }
1850
1851
1852
1853 /*
1854  *      Flush TX buffer (make in == out)
1855  *
1856  *      check tty_ioctl.c  -- this is called after TCOFLUSH
1857  */
1858 static void dgrp_tty_flush_buffer(struct tty_struct *tty)
1859 {
1860         struct un_struct *un;
1861         struct ch_struct *ch;
1862
1863         if (!tty)
1864                 return;
1865         un = tty->driver_data;
1866         if (!un)
1867                 return;
1868
1869         ch = un->un_ch;
1870         if (!ch)
1871                 return;
1872
1873         ch->ch_tout = ch->ch_tin;
1874         /* do NOT do this here! */
1875         /* ch->ch_s_tpos = ch->ch_s_tin = 0; */
1876
1877         /* send the flush output command now */
1878         ch->ch_send |= RR_TX_FLUSH;
1879         (ch->ch_nd)->nd_tx_ready = 1;
1880         (ch->ch_nd)->nd_tx_work = 1;
1881         wake_up_interruptible(&(ch->ch_nd)->nd_tx_waitq);
1882
1883         if (waitqueue_active(&tty->write_wait))
1884                 wake_up_interruptible(&tty->write_wait);
1885
1886         tty_wakeup(tty);
1887
1888 }
1889
1890 /*
1891  *      Return space available in Tx buffer
1892  *      count = ( ch->ch_tout - ch->ch_tin ) mod (TBUF_MAX - 1)
1893  */
1894 static int dgrp_tty_write_room(struct tty_struct *tty)
1895 {
1896         struct un_struct *un;
1897         struct ch_struct *ch;
1898         int     count;
1899
1900         if (!tty)
1901                 return 0;
1902
1903         un = tty->driver_data;
1904         if (!un)
1905                 return 0;
1906
1907         ch = un->un_ch;
1908         if (!ch)
1909                 return 0;
1910
1911         count = (ch->ch_tout - ch->ch_tin - 1) & TBUF_MASK;
1912
1913         /* We *MUST* check this, and return 0 if the Printer Unit cannot
1914          * take any more data within its time constraints...  If we don't
1915          * return 0 and the printer has hit it time constraint, the ld will
1916          * call us back doing a put_char, which cannot be rejected!!!
1917          */
1918         if (IS_PRINT(MINOR(tty_devnum(tty)))) {
1919                 int un_flag = 0;
1920                 count = dgrp_calculate_txprint_bounds(ch, count, &un_flag);
1921                 if (count <= 0)
1922                         count = 0;
1923
1924                 ch->ch_pun.un_flag |= un_flag;
1925                 (ch->ch_nd)->nd_tx_work = 1;
1926         }
1927
1928         return count;
1929 }
1930
1931 /*
1932  *      Return number of characters that have not been transmitted yet.
1933  *      chars_in_buffer = ( ch->ch_tin - ch->ch_tout ) mod (TBUF_MAX - 1)
1934  *                      + ( ch->ch_s_tin - ch->ch_s_tout ) mod (0xffff)
1935  *                      = number of characters "in transit"
1936  *
1937  * Remember that sequence number math is always with a sixteen bit
1938  * mask, not the TBUF_MASK.
1939  */
1940
1941 static int dgrp_tty_chars_in_buffer(struct tty_struct *tty)
1942 {
1943         struct un_struct *un;
1944         struct ch_struct *ch;
1945         int     count;
1946         int     count1;
1947
1948         if (!tty)
1949                 return 0;
1950
1951         un = tty->driver_data;
1952         if (!un)
1953                 return 0;
1954
1955         ch = un->un_ch;
1956         if (!ch)
1957                 return 0;
1958
1959         count1 = count = (ch->ch_tin - ch->ch_tout) & TBUF_MASK;
1960         count += (ch->ch_s_tin - ch->ch_s_tpos) & 0xffff;
1961         /* one for tbuf, one for the PS */
1962
1963         /*
1964          * If we are busy transmitting add 1
1965          */
1966         count += un->un_tbusy;
1967
1968         return count;
1969 }
1970
1971
1972 /*****************************************************************************
1973  *
1974  * Helper applications for dgrp_tty_ioctl()
1975  *
1976  *****************************************************************************
1977  */
1978
1979
1980 /**
1981  * ch_to_tty_flags() -- convert channel flags to termio flags
1982  * @ch_flag: Digi channel flags
1983  * @flagtype: type of ch_flag (iflag, oflag or cflag)
1984  *
1985  * take the channel flags of the specified type and return the
1986  * corresponding termio flag
1987  */
1988 static tcflag_t ch_to_tty_flags(ushort ch_flag, char flagtype)
1989 {
1990         tcflag_t retval = 0;
1991
1992         switch (flagtype) {
1993         case 'i':
1994                 retval = ((ch_flag & IF_IGNBRK) ? IGNBRK : 0)
1995                      | ((ch_flag & IF_BRKINT) ? BRKINT : 0)
1996                      | ((ch_flag & IF_IGNPAR) ? IGNPAR : 0)
1997                      | ((ch_flag & IF_PARMRK) ? PARMRK : 0)
1998                      | ((ch_flag & IF_INPCK) ? INPCK  : 0)
1999                      | ((ch_flag & IF_ISTRIP) ? ISTRIP : 0)
2000                      | ((ch_flag & IF_IXON) ? IXON   : 0)
2001                      | ((ch_flag & IF_IXANY) ? IXANY  : 0)
2002                      | ((ch_flag & IF_IXOFF) ? IXOFF  : 0);
2003                 break;
2004
2005         case 'o':
2006                 retval = ((ch_flag & OF_OLCUC) ? OLCUC : 0)
2007                      | ((ch_flag & OF_ONLCR) ? ONLCR  : 0)
2008                      | ((ch_flag & OF_OCRNL) ? OCRNL  : 0)
2009                      | ((ch_flag & OF_ONOCR) ? ONOCR  : 0)
2010                      | ((ch_flag & OF_ONLRET) ? ONLRET : 0)
2011                   /* | ((ch_flag & OF_OTAB3) ? OFILL  : 0) */
2012                      | ((ch_flag & OF_TABDLY) ? TABDLY : 0);
2013                 break;
2014
2015         case 'c':
2016                 retval = ((ch_flag & CF_CSTOPB) ? CSTOPB : 0)
2017                      | ((ch_flag & CF_CREAD) ? CREAD  : 0)
2018                      | ((ch_flag & CF_PARENB) ? PARENB : 0)
2019                      | ((ch_flag & CF_PARODD) ? PARODD : 0)
2020                      | ((ch_flag & CF_HUPCL) ? HUPCL  : 0);
2021
2022                 switch (ch_flag & CF_CSIZE) {
2023                 case CF_CS5:
2024                         retval |= CS5;
2025                         break;
2026                 case CF_CS6:
2027                         retval |= CS6;
2028                         break;
2029                 case CF_CS7:
2030                         retval |= CS7;
2031                         break;
2032                 case CF_CS8:
2033                         retval |= CS8;
2034                         break;
2035                 default:
2036                         retval |= CS8;
2037                         break;
2038                 }
2039                 break;
2040         case 'x':
2041                 break;
2042         case 'l':
2043                 break;
2044         default:
2045                 return 0;
2046         }
2047
2048         return retval;
2049 }
2050
2051
2052 /**
2053  * tty_to_ch_flags() -- convert termio flags to digi channel flags
2054  * @tty: pointer to a TTY structure holding flag to be converted
2055  * @flagtype: identifies which flag (iflags, oflags, or cflags) should
2056  *                 be converted
2057  *
2058  * take the termio flag of the specified type and return the
2059  * corresponding Digi version of the flags
2060  */
2061 static ushort tty_to_ch_flags(struct tty_struct *tty, char flagtype)
2062 {
2063         ushort retval = 0;
2064         tcflag_t tflag = 0;
2065
2066         switch (flagtype) {
2067         case 'i':
2068                 tflag  = tty->termios.c_iflag;
2069                 retval = (I_IGNBRK(tty) ? IF_IGNBRK : 0)
2070                       | (I_BRKINT(tty) ? IF_BRKINT : 0)
2071                       | (I_IGNPAR(tty) ? IF_IGNPAR : 0)
2072                       | (I_PARMRK(tty) ? IF_PARMRK : 0)
2073                       | (I_INPCK(tty)  ? IF_INPCK  : 0)
2074                       | (I_ISTRIP(tty) ? IF_ISTRIP : 0)
2075                       | (I_IXON(tty)   ? IF_IXON   : 0)
2076                       | (I_IXANY(tty)  ? IF_IXANY  : 0)
2077                       | (I_IXOFF(tty)  ? IF_IXOFF  : 0);
2078                 break;
2079         case 'o':
2080                 tflag  = tty->termios.c_oflag;
2081                 /*
2082                  * If OPOST is set, then do the post processing in the
2083                  * firmware by setting all the processing flags on.
2084                  * If ~OPOST, then make sure we are not doing any
2085                  * output processing!!
2086                  */
2087                 if (!O_OPOST(tty))
2088                         retval = 0;
2089                 else
2090                         retval = (O_OLCUC(tty) ? OF_OLCUC : 0)
2091                              | (O_ONLCR(tty)  ? OF_ONLCR  : 0)
2092                              | (O_OCRNL(tty)  ? OF_OCRNL  : 0)
2093                              | (O_ONOCR(tty)  ? OF_ONOCR  : 0)
2094                              | (O_ONLRET(tty) ? OF_ONLRET : 0)
2095                           /* | (O_OFILL(tty)  ? OF_TAB3   : 0) */
2096                              | (O_TABDLY(tty) ? OF_TABDLY : 0);
2097                 break;
2098         case 'c':
2099                 tflag  = tty->termios.c_cflag;
2100                 retval = (C_CSTOPB(tty) ? CF_CSTOPB : 0)
2101                      | (C_CREAD(tty)  ? CF_CREAD  : 0)
2102                      | (C_PARENB(tty) ? CF_PARENB : 0)
2103                      | (C_PARODD(tty) ? CF_PARODD : 0)
2104                      | (C_HUPCL(tty)  ? CF_HUPCL  : 0);
2105                 switch (C_CSIZE(tty)) {
2106                 case CS8:
2107                         retval |= CF_CS8;
2108                         break;
2109                 case CS7:
2110                         retval |= CF_CS7;
2111                         break;
2112                 case CS6:
2113                         retval |= CF_CS6;
2114                         break;
2115                 case CS5:
2116                         retval |= CF_CS5;
2117                         break;
2118                 default:
2119                         retval |= CF_CS8;
2120                         break;
2121                 }
2122                 break;
2123         case 'x':
2124                 break;
2125         case 'l':
2126                 break;
2127         default:
2128                 return 0;
2129         }
2130
2131         return retval;
2132 }
2133
2134
2135 static int dgrp_tty_send_break(struct tty_struct *tty, int msec)
2136 {
2137         struct un_struct *un;
2138         struct ch_struct *ch;
2139         int ret = -EIO;
2140
2141         if (!tty)
2142                 return ret;
2143
2144         un = tty->driver_data;
2145         if (!un)
2146                 return ret;
2147
2148         ch = un->un_ch;
2149         if (!ch)
2150                 return ret;
2151
2152         dgrp_send_break(ch, msec);
2153         return 0;
2154 }
2155
2156
2157 /*
2158  * This routine sends a break character out the serial port.
2159  *
2160  * duration is in 1/1000's of a second
2161  */
2162 static int dgrp_send_break(struct ch_struct *ch, int msec)
2163 {
2164         ulong x;
2165
2166         wait_event_interruptible(ch->ch_flag_wait,
2167                 ((ch->ch_flag & CH_TX_BREAK) == 0));
2168         ch->ch_break_time += max(msec, 250);
2169         ch->ch_send |= RR_TX_BREAK;
2170         ch->ch_flag |= CH_TX_BREAK;
2171         (ch->ch_nd)->nd_tx_work = 1;
2172
2173         x = (msec * HZ) / 1000;
2174         wake_up_interruptible(&(ch->ch_nd)->nd_tx_waitq);
2175
2176         return 0;
2177 }
2178
2179
2180 /*
2181  * Return modem signals to ld.
2182  */
2183 static int dgrp_tty_tiocmget(struct tty_struct *tty)
2184 {
2185         unsigned int mlast;
2186         struct un_struct *un = tty->driver_data;
2187         struct ch_struct *ch;
2188
2189         if (!un)
2190                 return -ENODEV;
2191
2192         ch = un->un_ch;
2193         if (!ch)
2194                 return -ENODEV;
2195
2196         mlast = ((ch->ch_s_mlast & ~(DM_RTS | DM_DTR)) |
2197                 (ch->ch_mout & (DM_RTS | DM_DTR)));
2198
2199         /* defined in /usr/include/asm/termios.h */
2200         mlast =   ((mlast & DM_RTS) ? TIOCM_RTS : 0)
2201                 | ((mlast & DM_DTR) ? TIOCM_DTR : 0)
2202                 | ((mlast & DM_CD)  ? TIOCM_CAR : 0)
2203                 | ((mlast & DM_RI)  ? TIOCM_RNG : 0)
2204                 | ((mlast & DM_DSR) ? TIOCM_DSR : 0)
2205                 | ((mlast & DM_CTS) ? TIOCM_CTS : 0);
2206
2207         return mlast;
2208 }
2209
2210
2211 /*
2212  *      Set modem lines
2213  */
2214 static int dgrp_tty_tiocmset(struct tty_struct *tty,
2215                              unsigned int set, unsigned int clear)
2216 {
2217         ulong lock_flags;
2218         struct un_struct *un = tty->driver_data;
2219         struct ch_struct *ch;
2220
2221         if (!un)
2222                 return -ENODEV;
2223
2224         ch = un->un_ch;
2225         if (!ch)
2226                 return -ENODEV;
2227
2228         if (set & TIOCM_RTS)
2229                 ch->ch_mout |= DM_RTS;
2230
2231         if (set & TIOCM_DTR)
2232                 ch->ch_mout |= DM_DTR;
2233
2234         if (clear & TIOCM_RTS)
2235                 ch->ch_mout &= ~(DM_RTS);
2236
2237         if (clear & TIOCM_DTR)
2238                 ch->ch_mout &= ~(DM_DTR);
2239
2240         spin_lock_irqsave(&(ch->ch_nd)->nd_lock, lock_flags);
2241         ch->ch_flag |= CH_PARAM;
2242         (ch->ch_nd)->nd_tx_work = 1;
2243         wake_up_interruptible(&ch->ch_flag_wait);
2244
2245         spin_unlock_irqrestore(&(ch->ch_nd)->nd_lock, lock_flags);
2246
2247         return 0;
2248 }
2249
2250
2251
2252 /*
2253  *      Get current modem status
2254  */
2255 static int get_modem_info(struct ch_struct *ch, unsigned int *value)
2256 {
2257         unsigned int mlast;
2258
2259         mlast = ((ch->ch_s_mlast & ~(DM_RTS | DM_DTR)) |
2260                 (ch->ch_mout    &  (DM_RTS | DM_DTR)));
2261
2262         /* defined in /usr/include/asm/termios.h */
2263         mlast =   ((mlast & DM_RTS) ? TIOCM_RTS : 0)
2264                 | ((mlast & DM_DTR) ? TIOCM_DTR : 0)
2265                 | ((mlast & DM_CD)  ? TIOCM_CAR : 0)
2266                 | ((mlast & DM_RI)  ? TIOCM_RNG : 0)
2267                 | ((mlast & DM_DSR) ? TIOCM_DSR : 0)
2268                 | ((mlast & DM_CTS) ? TIOCM_CTS : 0);
2269         return put_user(mlast, (unsigned int __user *) value);
2270 }
2271
2272 /*
2273  *      Set modem lines
2274  */
2275 static int set_modem_info(struct ch_struct *ch, unsigned int command,
2276                           unsigned int *value)
2277 {
2278         int error;
2279         unsigned int arg;
2280         int mval = 0;
2281         ulong lock_flags;
2282
2283         error = access_ok(VERIFY_READ, (void __user *) value, sizeof(int));
2284         if (error == 0)
2285                 return -EFAULT;
2286
2287         if (get_user(arg, (unsigned int __user *) value))
2288                 return -EFAULT;
2289         mval |= ((arg & TIOCM_RTS) ? DM_RTS : 0)
2290                 | ((arg & TIOCM_DTR) ? DM_DTR : 0);
2291
2292         switch (command) {
2293         case TIOCMBIS:  /* set flags */
2294                 ch->ch_mout |= mval;
2295                 break;
2296         case TIOCMBIC:  /* clear flags */
2297                 ch->ch_mout &= ~mval;
2298                 break;
2299         case TIOCMSET:
2300                 ch->ch_mout = mval;
2301                 break;
2302         default:
2303                 return -EINVAL;
2304         }
2305
2306         spin_lock_irqsave(&(ch->ch_nd)->nd_lock, lock_flags);
2307
2308         ch->ch_flag |= CH_PARAM;
2309         (ch->ch_nd)->nd_tx_work = 1;
2310         wake_up_interruptible(&ch->ch_flag_wait);
2311
2312         spin_unlock_irqrestore(&(ch->ch_nd)->nd_lock, lock_flags);
2313
2314         return 0;
2315 }
2316
2317
2318 /*
2319  *  Assign the custom baud rate to the channel structure
2320  */
2321 static void dgrp_set_custom_speed(struct ch_struct *ch, int newrate)
2322 {
2323         int testdiv;
2324         int testrate_high;
2325         int testrate_low;
2326
2327         int deltahigh, deltalow;
2328
2329         if (newrate < 0)
2330                 newrate = 0;
2331
2332         /*
2333          * Since the divisor is stored in a 16-bit integer, we make sure
2334          * we don't allow any rates smaller than a 16-bit integer would allow.
2335          * And of course, rates above the dividend won't fly.
2336          */
2337         if (newrate && newrate < ((PORTSERVER_DIVIDEND / 0xFFFF) + 1))
2338                 newrate = ((PORTSERVER_DIVIDEND / 0xFFFF) + 1);
2339         if (newrate && newrate > PORTSERVER_DIVIDEND)
2340                 newrate = PORTSERVER_DIVIDEND;
2341
2342         while (newrate > 0) {
2343                 testdiv = PORTSERVER_DIVIDEND / newrate;
2344
2345                 /*
2346                  * If we try to figure out what rate the PortServer would use
2347                  * with the test divisor, it will be either equal or higher
2348                  * than the requested baud rate.  If we then determine the
2349                  * rate with a divisor one higher, we will get the next lower
2350                  * supported rate below the requested.
2351                  */
2352                 testrate_high = PORTSERVER_DIVIDEND / testdiv;
2353                 testrate_low  = PORTSERVER_DIVIDEND / (testdiv + 1);
2354
2355                 /*
2356                  * If the rate for the requested divisor is correct, just
2357                  * use it and be done.
2358                  */
2359                 if (testrate_high == newrate)
2360                         break;
2361
2362                 /*
2363                  * Otherwise, pick the rate that is closer (i.e. whichever rate
2364                  * has a smaller delta).
2365                  */
2366                 deltahigh = testrate_high - newrate;
2367                 deltalow = newrate - testrate_low;
2368
2369                 if (deltahigh < deltalow)
2370                         newrate = testrate_high;
2371                 else
2372                         newrate = testrate_low;
2373
2374                 break;
2375         }
2376
2377         ch->ch_custom_speed = newrate;
2378
2379         drp_param(ch);
2380
2381         return;
2382 }
2383
2384
2385 /*
2386  # dgrp_tty_digiseta()
2387  *
2388  * Ioctl to set the information from ditty.
2389  *
2390  * NOTE: DIGI_IXON, DSRPACE, DCDPACE, and DTRPACE are unsupported.  JAR 990922
2391  */
2392 static int dgrp_tty_digiseta(struct tty_struct *tty,
2393                              struct digi_struct *new_info)
2394 {
2395         struct un_struct *un = tty->driver_data;
2396         struct ch_struct *ch;
2397
2398         if (!un)
2399                 return -ENODEV;
2400
2401         ch = un->un_ch;
2402         if (!ch)
2403                 return -ENODEV;
2404
2405         if (copy_from_user(&ch->ch_digi, (void __user *) new_info,
2406                            sizeof(struct digi_struct)))
2407                 return -EFAULT;
2408
2409         if ((ch->ch_digi.digi_flags & RTSPACE) ||
2410             (ch->ch_digi.digi_flags & CTSPACE))
2411                 tty->termios.c_cflag |= CRTSCTS;
2412         else
2413                 tty->termios.c_cflag &= ~CRTSCTS;
2414
2415         if (ch->ch_digi.digi_maxcps < 1)
2416                 ch->ch_digi.digi_maxcps = 1;
2417
2418         if (ch->ch_digi.digi_maxcps > 10000)
2419                 ch->ch_digi.digi_maxcps = 10000;
2420
2421         if (ch->ch_digi.digi_bufsize < 10)
2422                 ch->ch_digi.digi_bufsize = 10;
2423
2424         if (ch->ch_digi.digi_maxchar < 1)
2425                 ch->ch_digi.digi_maxchar = 1;
2426
2427         if (ch->ch_digi.digi_maxchar > ch->ch_digi.digi_bufsize)
2428                 ch->ch_digi.digi_maxchar = ch->ch_digi.digi_bufsize;
2429
2430         if (ch->ch_digi.digi_onlen > DIGI_PLEN)
2431                 ch->ch_digi.digi_onlen = DIGI_PLEN;
2432
2433         if (ch->ch_digi.digi_offlen > DIGI_PLEN)
2434                 ch->ch_digi.digi_offlen = DIGI_PLEN;
2435
2436         /* make the changes now */
2437         drp_param(ch);
2438
2439         return 0;
2440 }
2441
2442
2443
2444 /*
2445  * dgrp_tty_digigetedelay()
2446  *
2447  * Ioctl to get the current edelay setting.
2448  *
2449  *
2450  *
2451  */
2452 static int dgrp_tty_digigetedelay(struct tty_struct *tty, int *retinfo)
2453 {
2454         struct un_struct *un;
2455         struct ch_struct *ch;
2456         int tmp;
2457
2458         if (!retinfo)
2459                 return -EFAULT;
2460
2461         if (!tty || tty->magic != TTY_MAGIC)
2462                 return -EFAULT;
2463
2464         un = tty->driver_data;
2465
2466         if (!un)
2467                 return -ENODEV;
2468
2469         ch = un->un_ch;
2470         if (!ch)
2471                 return -ENODEV;
2472
2473         tmp = ch->ch_edelay;
2474
2475         if (copy_to_user((void __user *) retinfo, &tmp, sizeof(*retinfo)))
2476                 return -EFAULT;
2477
2478         return 0;
2479 }
2480
2481
2482 /*
2483  * dgrp_tty_digisetedelay()
2484  *
2485  * Ioctl to set the EDELAY setting
2486  *
2487  */
2488 static int dgrp_tty_digisetedelay(struct tty_struct *tty, int *new_info)
2489 {
2490         struct un_struct *un;
2491         struct ch_struct *ch;
2492         int new_digi;
2493
2494         if (!tty || tty->magic != TTY_MAGIC)
2495                 return -EFAULT;
2496
2497         un = tty->driver_data;
2498
2499         if (!un)
2500                 return -ENODEV;
2501
2502         ch = un->un_ch;
2503         if (!ch)
2504                 return -ENODEV;
2505
2506         if (copy_from_user(&new_digi, (void __user *)new_info, sizeof(int)))
2507                 return -EFAULT;
2508
2509         ch->ch_edelay = new_digi;
2510
2511         /* make the changes now */
2512         drp_param(ch);
2513
2514         return 0;
2515 }
2516
2517
2518 /*
2519  *      The usual assortment of ioctl's
2520  *
2521  *      note:  use tty_check_change to make sure that we are not
2522  *      changing the state of a terminal when we are not a process
2523  *      in the forground.  See tty_io.c
2524  *              rc = tty_check_change(tty);
2525  *              if (rc) return rc;
2526  */
2527 static int dgrp_tty_ioctl(struct tty_struct *tty, unsigned int cmd,
2528                           unsigned long arg)
2529 {
2530         struct un_struct *un;
2531         struct ch_struct *ch;
2532         int rc;
2533         struct digiflow_struct   dflow;
2534
2535         if (!tty)
2536                 return -ENODEV;
2537
2538         un = tty->driver_data;
2539         if (!un)
2540                 return -ENODEV;
2541
2542         ch = un->un_ch;
2543         if (!ch)
2544                 return -ENODEV;
2545
2546         switch (cmd) {
2547
2548         /*
2549          * Here are all the standard ioctl's that we MUST implement
2550          */
2551
2552         case TCSBRK:
2553                 /*
2554                  * TCSBRK is SVID version: non-zero arg --> no break
2555                  * this behaviour is exploited by tcdrain().
2556                  *
2557                  * According to POSIX.1 spec (7.2.2.1.2) breaks should be
2558                  * between 0.25 and 0.5 seconds
2559                  */
2560
2561                 rc = tty_check_change(tty);
2562                 if (rc)
2563                         return rc;
2564                 tty_wait_until_sent(tty, 0);
2565
2566                 if (!arg)
2567                         rc = dgrp_send_break(ch, 250); /* 1/4 second */
2568
2569                 if (dgrp_tty_chars_in_buffer(tty) != 0)
2570                         return -EINTR;
2571
2572                 return 0;
2573
2574         case TCSBRKP:
2575                 /* support for POSIX tcsendbreak()
2576                  *
2577                  * According to POSIX.1 spec (7.2.2.1.2) breaks should be
2578                  * between 0.25 and 0.5 seconds so we'll ask for something
2579                  * in the middle: 0.375 seconds.
2580                  */
2581                 rc = tty_check_change(tty);
2582                 if (rc)
2583                         return rc;
2584                 tty_wait_until_sent(tty, 0);
2585
2586                 rc = dgrp_send_break(ch, arg ? arg*250 : 250);
2587
2588                 if (dgrp_tty_chars_in_buffer(tty) != 0)
2589                         return -EINTR;
2590                 return 0;
2591
2592         case TIOCSBRK:
2593                 rc = tty_check_change(tty);
2594                 if (rc)
2595                         return rc;
2596                 tty_wait_until_sent(tty, 0);
2597
2598                 /*
2599                  * RealPort doesn't support turning on a break unconditionally.
2600                  * The RealPort device will stop sending a break automatically
2601                  * after the specified time value that we send in.
2602                  */
2603                 rc = dgrp_send_break(ch, 250); /* 1/4 second */
2604
2605                 if (dgrp_tty_chars_in_buffer(tty) != 0)
2606                         return -EINTR;
2607                 return 0;
2608
2609         case TIOCCBRK:
2610                 /*
2611                  * RealPort doesn't support turning off a break unconditionally.
2612                  * The RealPort device will stop sending a break automatically
2613                  * after the specified time value that was sent when turning on
2614                  * the break.
2615                  */
2616                 return 0;
2617
2618         case TIOCMGET:
2619                 rc = access_ok(VERIFY_WRITE, (void __user *) arg,
2620                                  sizeof(unsigned int));
2621                 if (rc == 0)
2622                         return -EFAULT;
2623                 return get_modem_info(ch, (unsigned int *) arg);
2624
2625         case TIOCMBIS:
2626         case TIOCMBIC:
2627         case TIOCMSET:
2628                 return set_modem_info(ch, cmd, (unsigned int *) arg);
2629
2630         /*
2631          * Here are any additional ioctl's that we want to implement
2632          */
2633
2634         case TCFLSH:
2635                 /*
2636                  * The linux tty driver doesn't have a flush
2637                  * input routine for the driver, assuming all backed
2638                  * up data is in the line disc. buffers.  However,
2639                  * we all know that's not the case.  Here, we
2640                  * act on the ioctl, but then lie and say we didn't
2641                  * so the line discipline will process the flush
2642                  * also.
2643                  */
2644                 rc = tty_check_change(tty);
2645                 if (rc)
2646                         return rc;
2647
2648                 switch (arg) {
2649                 case TCIFLUSH:
2650                 case TCIOFLUSH:
2651                         /* only flush input if this is the only open unit */
2652                         if (!IS_PRINT(MINOR(tty_devnum(tty)))) {
2653                                 ch->ch_rout = ch->ch_rin;
2654                                 ch->ch_send |= RR_RX_FLUSH;
2655                                 (ch->ch_nd)->nd_tx_work = 1;
2656                                 (ch->ch_nd)->nd_tx_ready = 1;
2657                                 wake_up_interruptible(&(ch->ch_nd)->nd_tx_waitq);
2658                         }
2659                         if (arg == TCIFLUSH)
2660                                 break;
2661
2662                 case TCOFLUSH: /* flush output, or the receive buffer */
2663                         /*
2664                          * This is handled in the tty_ioctl.c code
2665                          * calling tty_flush_buffer
2666                          */
2667                         break;
2668
2669                 default:
2670                         /* POSIX.1 says return EINVAL if we got a bad arg */
2671                         return -EINVAL;
2672                 }
2673                 /* pretend we didn't recognize this IOCTL */
2674                 return -ENOIOCTLCMD;
2675
2676 #ifdef TIOCGETP
2677         case TIOCGETP:
2678 #endif
2679         /*****************************************
2680         Linux           HPUX            Function
2681         TCSETA          TCSETA          - set the termios
2682         TCSETAF         TCSETAF         - wait for drain first, then set termios
2683         TCSETAW         TCSETAW         - wait for drain, flush the input queue, then set termios
2684         - looking at the tty_ioctl code, these command all call our
2685         tty_set_termios at the driver's end, when a TCSETA* is sent,
2686         it is expecting the tty to have a termio structure,
2687         NOT a termios structure.  These two structures differ in size
2688         and the tty_ioctl code does a conversion before processing them both.
2689         - we should treat the TCSETAW TCSETAF ioctls the same, and let
2690         the tty_ioctl code do the conversion stuff.
2691
2692         TCSETS
2693         TCSETSF         (none)
2694         TCSETSW
2695         - the associated tty structure has a termios structure.
2696         *****************************************/
2697
2698         case TCGETS:
2699         case TCGETA:
2700                 return -ENOIOCTLCMD;
2701
2702         case TCSETAW:
2703         case TCSETAF:
2704         case TCSETSF:
2705         case TCSETSW:
2706                 /*
2707                  * The linux tty driver doesn't have a flush
2708                  * input routine for the driver, assuming all backed
2709                  * up data is in the line disc. buffers.  However,
2710                  * we all know that's not the case.  Here, we
2711                  * act on the ioctl, but then lie and say we didn't
2712                  * so the line discipline will process the flush
2713                  * also.
2714                  */
2715
2716                 /*
2717                  * Also, now that we have TXPrint, we have to check
2718                  * if this is the TXPrint device and the terminal
2719                  * device is open. If so, do NOT run check_change,
2720                  * as the terminal device is ALWAYS the parent.
2721                  */
2722                 if (!IS_PRINT(MINOR(tty_devnum(tty))) ||
2723                     !ch->ch_tun.un_open_count) {
2724                         rc = tty_check_change(tty);
2725                         if (rc)
2726                                 return rc;
2727                 }
2728
2729                 /* wait for all the characters in tbuf to drain */
2730                 tty_wait_until_sent(tty, 0);
2731
2732                 if ((cmd == TCSETSF) || (cmd == TCSETAF)) {
2733                         /* flush the contents of the rbuf queue */
2734                         /* TODO:  check if this is print device? */
2735                         ch->ch_send |= RR_RX_FLUSH;
2736                         (ch->ch_nd)->nd_tx_ready = 1;
2737                         (ch->ch_nd)->nd_tx_work = 1;
2738                         wake_up_interruptible(&(ch->ch_nd)->nd_tx_waitq);
2739                         /* do we need to do this?  just to be safe! */
2740                         ch->ch_rout = ch->ch_rin;
2741                 }
2742
2743                 /* pretend we didn't recognize this */
2744                 return -ENOIOCTLCMD;
2745
2746         case TCXONC:
2747                 /*
2748                  * The Linux Line Discipline (LD) would do this for us if we
2749                  * let it, but we have the special firmware options to do this
2750                  * the "right way" regardless of hardware or software flow
2751                  * control so we'll do it outselves instead of letting the LD
2752                  * do it.
2753                  */
2754                 rc = tty_check_change(tty);
2755                 if (rc)
2756                         return rc;
2757
2758                 switch (arg) {
2759                 case TCOON:
2760                         dgrp_tty_start(tty);
2761                         return 0;
2762                 case TCOOFF:
2763                         dgrp_tty_stop(tty);
2764                         return 0;
2765                 case TCION:
2766                         dgrp_tty_input_start(tty);
2767                         return 0;
2768                 case TCIOFF:
2769                         dgrp_tty_input_stop(tty);
2770                         return 0;
2771                 default:
2772                         return -EINVAL;
2773                 }
2774
2775         case DIGI_GETA:
2776                 /* get information for ditty */
2777                 if (copy_to_user((struct digi_struct __user *) arg,
2778                                  &ch->ch_digi, sizeof(struct digi_struct)))
2779                         return -EFAULT;
2780                 break;
2781
2782         case DIGI_SETAW:
2783         case DIGI_SETAF:
2784                 /* wait for all the characters in tbuf to drain */
2785                 tty_wait_until_sent(tty, 0);
2786
2787                 if (cmd == DIGI_SETAF) {
2788                         /* flush the contents of the rbuf queue */
2789                         /* send down a packet with RR_RX_FLUSH set */
2790                         ch->ch_send |= RR_RX_FLUSH;
2791                         (ch->ch_nd)->nd_tx_ready = 1;
2792                         (ch->ch_nd)->nd_tx_work = 1;
2793                         wake_up_interruptible(&(ch->ch_nd)->nd_tx_waitq);
2794                         /* do we need to do this?  just to be safe! */
2795                         ch->ch_rout = ch->ch_rin;
2796                 }
2797
2798                 /* pretend we didn't recognize this */
2799
2800         case DIGI_SETA:
2801                 return dgrp_tty_digiseta(tty, (struct digi_struct *) arg);
2802
2803         case DIGI_SEDELAY:
2804                 return dgrp_tty_digisetedelay(tty, (int *) arg);
2805
2806         case DIGI_GEDELAY:
2807                 return dgrp_tty_digigetedelay(tty, (int *) arg);
2808
2809         case DIGI_GETFLOW:
2810         case DIGI_GETAFLOW:
2811                 if (cmd == (DIGI_GETFLOW)) {
2812                         dflow.startc = tty->termios.c_cc[VSTART];
2813                         dflow.stopc = tty->termios.c_cc[VSTOP];
2814                 } else {
2815                         dflow.startc = ch->ch_xxon;
2816                         dflow.stopc = ch->ch_xxoff;
2817                 }
2818
2819                 if (copy_to_user((char __user *)arg, &dflow, sizeof(dflow)))
2820                         return -EFAULT;
2821                 break;
2822
2823         case DIGI_SETFLOW:
2824         case DIGI_SETAFLOW:
2825
2826                 if (copy_from_user(&dflow, (char __user *)arg, sizeof(dflow)))
2827                         return -EFAULT;
2828
2829                 if (cmd == (DIGI_SETFLOW)) {
2830                         tty->termios.c_cc[VSTART] = dflow.startc;
2831                         tty->termios.c_cc[VSTOP] = dflow.stopc;
2832                 } else {
2833                         ch->ch_xxon = dflow.startc;
2834                         ch->ch_xxoff = dflow.stopc;
2835                 }
2836                 break;
2837
2838         case DIGI_GETCUSTOMBAUD:
2839                 if (put_user(ch->ch_custom_speed, (unsigned int __user *) arg))
2840                         return -EFAULT;
2841                 break;
2842
2843         case DIGI_SETCUSTOMBAUD:
2844         {
2845                 int new_rate;
2846
2847                 if (get_user(new_rate, (unsigned int __user *) arg))
2848                         return -EFAULT;
2849                 dgrp_set_custom_speed(ch, new_rate);
2850
2851                 break;
2852         }
2853
2854         default:
2855                 return -ENOIOCTLCMD;
2856         }
2857
2858         return 0;
2859 }
2860
2861 /*
2862  *  This routine allows the tty driver to be notified when
2863  *  the device's termios setting have changed.  Note that we
2864  *  should be prepared to accept the case where old == NULL
2865  *  and try to do something rational.
2866  *
2867  *  So we need to make sure that our copies of ch_oflag,
2868  *  ch_clag, and ch_iflag reflect the tty->termios flags.
2869  */
2870 static void dgrp_tty_set_termios(struct tty_struct *tty, struct ktermios *old)
2871 {
2872         struct ktermios *ts;
2873         struct ch_struct *ch;
2874         struct un_struct *un;
2875
2876         /* seems silly, but we have to check all these! */
2877         if (!tty)
2878                 return;
2879
2880         un = tty->driver_data;
2881         if (!un)
2882                 return;
2883
2884         ts = &tty->termios;
2885
2886         ch = un->un_ch;
2887         if (!ch)
2888                 return;
2889
2890         drp_param(ch);
2891
2892         /* the CLOCAL flag has just been set */
2893         if (!(old->c_cflag & CLOCAL) && C_CLOCAL(tty))
2894                 wake_up_interruptible(&un->un_open_wait);
2895 }
2896
2897
2898 /*
2899  *      Throttle receiving data.  We just set a bit and stop reading
2900  *      data out of the channel buffer.  It will back up and the
2901  *      FEP will do whatever is necessary to stop the far end.
2902  */
2903 static void dgrp_tty_throttle(struct tty_struct *tty)
2904 {
2905         struct ch_struct *ch;
2906
2907         if (!tty)
2908                 return;
2909
2910         ch = ((struct un_struct *) tty->driver_data)->un_ch;
2911         if (!ch)
2912                 return;
2913
2914         ch->ch_flag |= CH_RXSTOP;
2915 }
2916
2917
2918 static void dgrp_tty_unthrottle(struct tty_struct *tty)
2919 {
2920         struct ch_struct *ch;
2921
2922         if (!tty)
2923                 return;
2924
2925         ch = ((struct un_struct *) tty->driver_data)->un_ch;
2926         if (!ch)
2927                 return;
2928
2929         ch->ch_flag &= ~CH_RXSTOP;
2930 }
2931
2932 /*
2933  *      Stop the transmitter
2934  */
2935 static void dgrp_tty_stop(struct tty_struct *tty)
2936 {
2937         struct ch_struct *ch;
2938
2939         if (!tty)
2940                 return;
2941
2942         ch = ((struct un_struct *) tty->driver_data)->un_ch;
2943         if (!ch)
2944                 return;
2945
2946         ch->ch_send |= RR_TX_STOP;
2947         ch->ch_send &= ~RR_TX_START;
2948
2949         /* make the change NOW! */
2950         (ch->ch_nd)->nd_tx_ready = 1;
2951         if (waitqueue_active(&(ch->ch_nd)->nd_tx_waitq))
2952                 wake_up_interruptible(&(ch->ch_nd)->nd_tx_waitq);
2953 }
2954
2955 /*
2956  *      Start the transmitter
2957  */
2958 static void dgrp_tty_start(struct tty_struct *tty)
2959 {
2960         struct ch_struct *ch;
2961
2962         if (!tty)
2963                 return;
2964
2965         ch = ((struct un_struct *) tty->driver_data)->un_ch;
2966         if (!ch)
2967                 return;
2968
2969         /* TODO: don't do anything if the transmitter is not stopped */
2970
2971         ch->ch_send |= RR_TX_START;
2972         ch->ch_send &= ~RR_TX_STOP;
2973
2974         /* make the change NOW! */
2975         (ch->ch_nd)->nd_tx_ready = 1;
2976         (ch->ch_nd)->nd_tx_work = 1;
2977         if (waitqueue_active(&(ch->ch_nd)->nd_tx_waitq))
2978                 wake_up_interruptible(&(ch->ch_nd)->nd_tx_waitq);
2979
2980 }
2981
2982 /*
2983  *      Stop the receiver
2984  */
2985 static void dgrp_tty_input_stop(struct tty_struct *tty)
2986 {
2987         struct ch_struct *ch;
2988
2989         if (!tty)
2990                 return;
2991
2992         ch = ((struct un_struct *) tty->driver_data)->un_ch;
2993         if (!ch)
2994                 return;
2995
2996         ch->ch_send |= RR_RX_STOP;
2997         ch->ch_send &= ~RR_RX_START;
2998         (ch->ch_nd)->nd_tx_ready = 1;
2999         if (waitqueue_active(&(ch->ch_nd)->nd_tx_waitq))
3000                 wake_up_interruptible(&(ch->ch_nd)->nd_tx_waitq);
3001
3002 }
3003
3004
3005 static void dgrp_tty_send_xchar(struct tty_struct *tty, char c)
3006 {
3007         struct un_struct *un;
3008         struct ch_struct *ch;
3009
3010         if (!tty)
3011                 return;
3012
3013         un = tty->driver_data;
3014         if (!un)
3015                 return;
3016
3017         ch = un->un_ch;
3018         if (!ch)
3019                 return;
3020         if (c == STOP_CHAR(tty))
3021                 ch->ch_send |= RR_RX_STOP;
3022         else if (c == START_CHAR(tty))
3023                 ch->ch_send |= RR_RX_START;
3024
3025         ch->ch_nd->nd_tx_ready = 1;
3026         ch->ch_nd->nd_tx_work = 1;
3027
3028         return;
3029 }
3030
3031
3032 static void dgrp_tty_input_start(struct tty_struct *tty)
3033 {
3034         struct ch_struct *ch;
3035
3036         if (!tty)
3037                 return;
3038
3039         ch = ((struct un_struct *) tty->driver_data)->un_ch;
3040         if (!ch)
3041                 return;
3042
3043         ch->ch_send |= RR_RX_START;
3044         ch->ch_send &= ~RR_RX_STOP;
3045         (ch->ch_nd)->nd_tx_ready = 1;
3046         (ch->ch_nd)->nd_tx_work = 1;
3047         if (waitqueue_active(&(ch->ch_nd)->nd_tx_waitq))
3048                 wake_up_interruptible(&(ch->ch_nd)->nd_tx_waitq);
3049
3050 }
3051
3052
3053 /*
3054  *      Hangup the port.  Like a close, but don't wait for output
3055  *      to drain.
3056  *
3057  *      How do we close all the channels that are open?
3058  */
3059 static void dgrp_tty_hangup(struct tty_struct *tty)
3060 {
3061         struct ch_struct *ch;
3062         struct nd_struct *nd;
3063         struct un_struct *un;
3064
3065         if (!tty)
3066                 return;
3067
3068         un = tty->driver_data;
3069         if (!un)
3070                 return;
3071
3072         ch = un->un_ch;
3073         if (!ch)
3074                 return;
3075
3076         nd = ch->ch_nd;
3077
3078         if (C_HUPCL(tty)) {
3079                 /* LOWER DTR */
3080                 ch->ch_mout &= ~DM_DTR;
3081                 /* Don't do this here */
3082                 /* ch->ch_flag |= CH_HANGUP; */
3083                 ch->ch_nd->nd_tx_ready = 1;
3084                 ch->ch_nd->nd_tx_work  = 1;
3085                 if (waitqueue_active(&ch->ch_flag_wait))
3086                         wake_up_interruptible(&ch->ch_flag_wait);
3087         }
3088
3089 }
3090
3091 /************************************************************************/
3092 /*                                                                      */
3093 /*       TTY Initialization/Cleanup Functions                           */
3094 /*                                                                      */
3095 /************************************************************************/
3096
3097 /*
3098  *      Uninitialize the TTY portion of the supplied node.  Free all
3099  *      memory and resources associated with this node.  Do it in reverse
3100  *      allocation order: this might possibly result in less fragmentation
3101  *      of memory, though I don't know this for sure.
3102  */
3103 void
3104 dgrp_tty_uninit(struct nd_struct *nd)
3105 {
3106         unsigned int i;
3107         char id[3];
3108
3109         ID_TO_CHAR(nd->nd_ID, id);
3110
3111         if (nd->nd_ttdriver_flags & SERIAL_TTDRV_REG) {
3112                 tty_unregister_driver(nd->nd_serial_ttdriver);
3113
3114                 kfree(nd->nd_serial_ttdriver->ttys);
3115                 nd->nd_serial_ttdriver->ttys = NULL;
3116
3117                 put_tty_driver(nd->nd_serial_ttdriver);
3118                 nd->nd_ttdriver_flags &= ~SERIAL_TTDRV_REG;
3119         }
3120
3121         if (nd->nd_ttdriver_flags & CALLOUT_TTDRV_REG) {
3122                 tty_unregister_driver(nd->nd_callout_ttdriver);
3123
3124                 kfree(nd->nd_callout_ttdriver->ttys);
3125                 nd->nd_callout_ttdriver->ttys = NULL;
3126
3127                 put_tty_driver(nd->nd_callout_ttdriver);
3128                 nd->nd_ttdriver_flags &= ~CALLOUT_TTDRV_REG;
3129         }
3130
3131         if (nd->nd_ttdriver_flags & XPRINT_TTDRV_REG) {
3132                 tty_unregister_driver(nd->nd_xprint_ttdriver);
3133
3134                 kfree(nd->nd_xprint_ttdriver->ttys);
3135                 nd->nd_xprint_ttdriver->ttys = NULL;
3136
3137                 put_tty_driver(nd->nd_xprint_ttdriver);
3138                 nd->nd_ttdriver_flags &= ~XPRINT_TTDRV_REG;
3139         }
3140         for (i = 0; i < CHAN_MAX; i++)
3141                 tty_port_destroy(&nd->nd_chan[i].port);
3142 }
3143
3144
3145
3146 /*
3147  *     Initialize the TTY portion of the supplied node.
3148  */
3149 int
3150 dgrp_tty_init(struct nd_struct *nd)
3151 {
3152         char id[3];
3153         int  rc;
3154         int  i;
3155
3156         ID_TO_CHAR(nd->nd_ID, id);
3157
3158         /*
3159          *  Initialize the TTDRIVER structures.
3160          */
3161
3162         nd->nd_serial_ttdriver = alloc_tty_driver(CHAN_MAX);
3163         if (!nd->nd_serial_ttdriver)
3164                 return -ENOMEM;
3165
3166         sprintf(nd->nd_serial_name,  "tty_dgrp_%s_", id);
3167
3168         nd->nd_serial_ttdriver->owner = THIS_MODULE;
3169         nd->nd_serial_ttdriver->name = nd->nd_serial_name;
3170         nd->nd_serial_ttdriver->name_base = 0;
3171         nd->nd_serial_ttdriver->major = 0;
3172         nd->nd_serial_ttdriver->minor_start = 0;
3173         nd->nd_serial_ttdriver->type = TTY_DRIVER_TYPE_SERIAL;
3174         nd->nd_serial_ttdriver->subtype = SERIAL_TYPE_NORMAL;
3175         nd->nd_serial_ttdriver->init_termios = DefaultTermios;
3176         nd->nd_serial_ttdriver->driver_name = "dgrp";
3177         nd->nd_serial_ttdriver->flags = (TTY_DRIVER_REAL_RAW |
3178                                          TTY_DRIVER_DYNAMIC_DEV |
3179                                          TTY_DRIVER_HARDWARE_BREAK);
3180
3181         /* The kernel wants space to store pointers to tty_structs. */
3182         nd->nd_serial_ttdriver->ttys =
3183                 kzalloc(CHAN_MAX * sizeof(struct tty_struct *), GFP_KERNEL);
3184         if (!nd->nd_serial_ttdriver->ttys)
3185                 return -ENOMEM;
3186
3187         tty_set_operations(nd->nd_serial_ttdriver, &dgrp_tty_ops);
3188
3189         if (!(nd->nd_ttdriver_flags & SERIAL_TTDRV_REG)) {
3190                 /*
3191                  *   Register tty devices
3192                  */
3193                 rc = tty_register_driver(nd->nd_serial_ttdriver);
3194                 if (rc < 0) {
3195                         /*
3196                          * If errno is EBUSY, this means there are no more
3197                          * slots available to have us auto-majored.
3198                          * (Which is currently supported up to 256)
3199                          *
3200                          * We can still request majors above 256,
3201                          * we just have to do it manually.
3202                          */
3203                         if (rc == -EBUSY) {
3204                                 int i;
3205                                 int max_majors = 1U << (32 - MINORBITS);
3206                                 for (i = 256; i < max_majors; i++) {
3207                                         nd->nd_serial_ttdriver->major = i;
3208                                         rc = tty_register_driver(nd->nd_serial_ttdriver);
3209                                         if (rc >= 0)
3210                                                 break;
3211                                 }
3212                                 /* Really fail now, since we ran out
3213                                  * of majors to try. */
3214                                 if (i == max_majors)
3215                                         return rc;
3216
3217                         } else {
3218                                 return rc;
3219                         }
3220                 }
3221                 nd->nd_ttdriver_flags |= SERIAL_TTDRV_REG;
3222         }
3223
3224         nd->nd_callout_ttdriver = alloc_tty_driver(CHAN_MAX);
3225         if (!nd->nd_callout_ttdriver)
3226                 return -ENOMEM;
3227
3228         sprintf(nd->nd_callout_name, "cu_dgrp_%s_",  id);
3229
3230         nd->nd_callout_ttdriver->owner = THIS_MODULE;
3231         nd->nd_callout_ttdriver->name = nd->nd_callout_name;
3232         nd->nd_callout_ttdriver->name_base = 0;
3233         nd->nd_callout_ttdriver->major = nd->nd_serial_ttdriver->major;
3234         nd->nd_callout_ttdriver->minor_start = 0x40;
3235         nd->nd_callout_ttdriver->type = TTY_DRIVER_TYPE_SERIAL;
3236         nd->nd_callout_ttdriver->subtype = SERIAL_TYPE_CALLOUT;
3237         nd->nd_callout_ttdriver->init_termios = DefaultTermios;
3238         nd->nd_callout_ttdriver->driver_name = "dgrp";
3239         nd->nd_callout_ttdriver->flags = (TTY_DRIVER_REAL_RAW |
3240                                           TTY_DRIVER_DYNAMIC_DEV |
3241                                           TTY_DRIVER_HARDWARE_BREAK);
3242
3243         /* The kernel wants space to store pointers to tty_structs. */
3244         nd->nd_callout_ttdriver->ttys =
3245                 kzalloc(CHAN_MAX * sizeof(struct tty_struct *), GFP_KERNEL);
3246         if (!nd->nd_callout_ttdriver->ttys)
3247                 return -ENOMEM;
3248
3249         tty_set_operations(nd->nd_callout_ttdriver, &dgrp_tty_ops);
3250
3251         if (dgrp_register_cudevices) {
3252                 if (!(nd->nd_ttdriver_flags & CALLOUT_TTDRV_REG)) {
3253                         /*
3254                          *   Register cu devices
3255                          */
3256                         rc = tty_register_driver(nd->nd_callout_ttdriver);
3257                         if (rc < 0)
3258                                 return rc;
3259                         nd->nd_ttdriver_flags |= CALLOUT_TTDRV_REG;
3260                 }
3261         }
3262
3263
3264         nd->nd_xprint_ttdriver = alloc_tty_driver(CHAN_MAX);
3265         if (!nd->nd_xprint_ttdriver)
3266                 return -ENOMEM;
3267
3268         sprintf(nd->nd_xprint_name,  "pr_dgrp_%s_", id);
3269
3270         nd->nd_xprint_ttdriver->owner = THIS_MODULE;
3271         nd->nd_xprint_ttdriver->name = nd->nd_xprint_name;
3272         nd->nd_xprint_ttdriver->name_base = 0;
3273         nd->nd_xprint_ttdriver->major = nd->nd_serial_ttdriver->major;
3274         nd->nd_xprint_ttdriver->minor_start = 0x80;
3275         nd->nd_xprint_ttdriver->type = TTY_DRIVER_TYPE_SERIAL;
3276         nd->nd_xprint_ttdriver->subtype = SERIAL_TYPE_XPRINT;
3277         nd->nd_xprint_ttdriver->init_termios = DefaultTermios;
3278         nd->nd_xprint_ttdriver->driver_name = "dgrp";
3279         nd->nd_xprint_ttdriver->flags = (TTY_DRIVER_REAL_RAW |
3280                                          TTY_DRIVER_DYNAMIC_DEV |
3281                                          TTY_DRIVER_HARDWARE_BREAK);
3282
3283         /* The kernel wants space to store pointers to tty_structs. */
3284         nd->nd_xprint_ttdriver->ttys =
3285                 kzalloc(CHAN_MAX * sizeof(struct tty_struct *), GFP_KERNEL);
3286         if (!nd->nd_xprint_ttdriver->ttys)
3287                 return -ENOMEM;
3288
3289         tty_set_operations(nd->nd_xprint_ttdriver, &dgrp_tty_ops);
3290
3291         if (dgrp_register_prdevices) {
3292                 if (!(nd->nd_ttdriver_flags & XPRINT_TTDRV_REG)) {
3293                         /*
3294                          *   Register transparent print devices
3295                          */
3296                         rc = tty_register_driver(nd->nd_xprint_ttdriver);
3297                         if (rc < 0)
3298                                 return rc;
3299                         nd->nd_ttdriver_flags |= XPRINT_TTDRV_REG;
3300                 }
3301         }
3302
3303         for (i = 0; i < CHAN_MAX; i++) {
3304                 struct ch_struct *ch = nd->nd_chan + i;
3305
3306                 ch->ch_nd = nd;
3307                 ch->ch_digi = digi_init;
3308                 ch->ch_edelay = 100;
3309                 ch->ch_custom_speed = 0;
3310                 ch->ch_portnum = i;
3311                 ch->ch_tun.un_ch = ch;
3312                 ch->ch_pun.un_ch = ch;
3313                 ch->ch_tun.un_type = SERIAL_TYPE_NORMAL;
3314                 ch->ch_pun.un_type = SERIAL_TYPE_XPRINT;
3315
3316                 init_waitqueue_head(&(ch->ch_flag_wait));
3317                 init_waitqueue_head(&(ch->ch_sleep));
3318
3319                 init_waitqueue_head(&(ch->ch_tun.un_open_wait));
3320                 init_waitqueue_head(&(ch->ch_tun.un_close_wait));
3321
3322                 init_waitqueue_head(&(ch->ch_pun.un_open_wait));
3323                 init_waitqueue_head(&(ch->ch_pun.un_close_wait));
3324                 tty_port_init(&ch->port);
3325         }
3326         return 0;
3327 }