linux/drivers/staging/dgrp/dgrp_tty.c
<<
>>
Prefs
   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
  56static void drp_param(struct ch_struct *);
  57static void dgrp_tty_close(struct tty_struct *, struct file *);
  58
  59/* ioctl helper functions */
  60static int set_modem_info(struct ch_struct *, unsigned int, unsigned int *);
  61static int get_modem_info(struct ch_struct *, unsigned int *);
  62static void dgrp_set_custom_speed(struct ch_struct *, int);
  63static int dgrp_tty_digigetedelay(struct tty_struct *, int *);
  64static int dgrp_tty_digisetedelay(struct tty_struct *, int *);
  65static int dgrp_send_break(struct ch_struct *, int);
  66
  67static ushort  tty_to_ch_flags(struct tty_struct *, char);
  68static tcflag_t ch_to_tty_flags(unsigned short, char);
  69
  70static void dgrp_tty_input_start(struct tty_struct *);
  71static void dgrp_tty_input_stop(struct tty_struct *);
  72
  73static void drp_wmove(struct ch_struct *, int, void*, int);
  74
  75static int dgrp_tty_open(struct tty_struct *, struct file *);
  76static void dgrp_tty_close(struct tty_struct *, struct file *);
  77static int dgrp_tty_write(struct tty_struct *, const unsigned char *, int);
  78static int dgrp_tty_write_room(struct tty_struct *);
  79static void dgrp_tty_flush_buffer(struct tty_struct *);
  80static int dgrp_tty_chars_in_buffer(struct tty_struct *);
  81static int dgrp_tty_ioctl(struct tty_struct *, unsigned int, unsigned long);
  82static void dgrp_tty_set_termios(struct tty_struct *, struct ktermios *);
  83static void dgrp_tty_stop(struct tty_struct *);
  84static void dgrp_tty_start(struct tty_struct *);
  85static void dgrp_tty_throttle(struct tty_struct *);
  86static void dgrp_tty_unthrottle(struct tty_struct *);
  87static void dgrp_tty_hangup(struct tty_struct *);
  88static int dgrp_tty_put_char(struct tty_struct *, unsigned char);
  89static int dgrp_tty_tiocmget(struct tty_struct *);
  90static int dgrp_tty_tiocmset(struct tty_struct *, unsigned int, unsigned int);
  91static int dgrp_tty_send_break(struct tty_struct *, int);
  92static 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 */
 112static 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 */
 131static 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 */
 142static 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
 165static 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
 208static 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 */
 247static 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 */
 538static 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 */
 550static 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 */
 594static 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
 939unlock:
 940
 941        spin_unlock_irqrestore(&nd->nd_lock, lock_flags);
 942
 943done:
 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 */
 964static 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                                spin_unlock_irqrestore(&nd->nd_lock, lock_flags);
1124                                tty_ldisc_flush(tty);
1125                                spin_lock_irqsave(&nd->nd_lock, lock_flags);
1126                                break;
1127                }
1128
1129                /*
1130                 *  Otherwise take a short nap.
1131                 */
1132
1133                ch->ch_flag |= CH_DRAIN;
1134
1135                spin_unlock_irqrestore(&nd->nd_lock, lock_flags);
1136
1137                schedule_timeout_interruptible(1);
1138                s = signal_pending(current);
1139
1140                spin_lock_irqsave(&nd->nd_lock, lock_flags);
1141
1142                if (s) {
1143                        /*
1144                         * If we had sent the printer off string, we now have
1145                         * some problems.
1146                         *
1147                         * The system won't let us sleep since we got an error
1148                         * back from sleep, presumably because the user did
1149                         * a ctrl-c...
1150                         * But we need to ensure that the offstr gets sent!
1151                         * Thus, we have to do something else besides sleeping.
1152                         * The plan:
1153                         * 1) Make this task uninterruptable.
1154                         * 2) Set up a timer to go off in 1 sec.
1155                         * 3) Act as tho we just got out of the sleep above.
1156                         *
1157                         * Thankfully, in the real world, this just
1158                         * never happens.
1159                         */
1160
1161                        if (sent_printer_offstr) {
1162                                spin_unlock_irqrestore(&nd->nd_lock,
1163                                                       lock_flags);
1164                                drp_my_sleep(ch);
1165                                spin_lock_irqsave(&nd->nd_lock, lock_flags);
1166                        } else {
1167                                err = 1;
1168                                break;
1169                        }
1170                }
1171
1172                /*
1173                 *  Restart the wait if any progress is seen.
1174                 */
1175
1176                if (ch->ch_s_tpos != tpos) {
1177                        tpos = ch->ch_s_tpos;
1178
1179                        /* TODO:  this gives us timeout problems with nist ?? */
1180                        waketime = jiffies + 15 * HZ;
1181                }
1182        }
1183
1184        /*
1185         *  Close the line discipline
1186         */
1187
1188        /* this is done in tty_io.c */
1189        /* if ((un->un_tty)->ldisc.close)
1190         *      ((un->un_tty)->ldisc.close)(un->un_tty);
1191         */
1192
1193        /* don't do this here */
1194        /* un->un_flag = 0; */
1195
1196        /*
1197         *  Flush the receive buffer on terminal unit close only.
1198         */
1199
1200        if (!IS_PRINT(MINOR(tty_devnum(tty))))
1201                ch->ch_rout = ch->ch_rin;
1202
1203
1204        /*
1205         * Don't permit the close to happen until we get any pending
1206         * sync request responses.
1207         * There could be other ports depending upon the response as well.
1208         *
1209         * Also, don't permit the close to happen until any parameter
1210         * changes have been sent out from the state machine as well.
1211         * This is required because of a ditty -a race with -HUPCL
1212         * We MUST make sure all channel parameters have been sent to the
1213         * Portserver before sending a close.
1214         */
1215
1216        if ((err != 1) && (ch->ch_state != CS_IDLE)) {
1217                spin_unlock_irqrestore(&nd->nd_lock, lock_flags);
1218                s = wait_event_interruptible(ch->ch_flag_wait,
1219                        ((ch->ch_flag & (CH_WAITING_SYNC | CH_PARAM)) == 0));
1220                spin_lock_irqsave(&nd->nd_lock, lock_flags);
1221        }
1222
1223        /*
1224         * Cleanup the channel if last unit open.
1225         */
1226
1227        if (ch->ch_open_count == 1) {
1228                ch->ch_flag = 0;
1229                ch->ch_category = 0;
1230                ch->ch_send = 0;
1231                ch->ch_expect = 0;
1232                ch->ch_tout = ch->ch_tin;
1233                /* (un->un_tty)->device = 0; */
1234
1235                if (ch->ch_state == CS_READY)
1236                        ch->ch_state = CS_SEND_CLOSE;
1237        }
1238
1239        /*
1240         * Send the changes to the server
1241         */
1242        if (ch->ch_state != CS_IDLE) {
1243                ch->ch_flag |= CH_PARAM;
1244                wake_up_interruptible(&ch->ch_flag_wait);
1245        }
1246
1247        nd->nd_tx_work = 1;
1248        nd->nd_tx_ready = 1;
1249
1250unlock:
1251        tty->closing = 0;
1252
1253        if (ch->ch_open_count <= 0)
1254                dev_info(tty->dev,
1255                         "%s - unexpected value for ch->ch_open_count: %i\n",
1256                         __func__, ch->ch_open_count);
1257        else
1258                ch->ch_open_count--;
1259
1260        if (un->un_open_count <= 0)
1261                dev_info(tty->dev,
1262                         "%s - unexpected value for un->un_open_count: %i\n",
1263                         __func__, un->un_open_count);
1264        else
1265                un->un_open_count--;
1266
1267        un->un_flag &= ~(UN_NORMAL_ACTIVE | UN_CALLOUT_ACTIVE | UN_CLOSING);
1268        if (waitqueue_active(&un->un_close_wait))
1269                wake_up_interruptible(&un->un_close_wait);
1270
1271        spin_unlock_irqrestore(&nd->nd_lock, lock_flags);
1272
1273        return;
1274
1275}
1276
1277static void drp_wmove(struct ch_struct *ch, int from_user, void *buf, int count)
1278{
1279        int n;
1280        int ret = 0;
1281
1282        ch->ch_nd->nd_tx_work = 1;
1283
1284        n = TBUF_MAX - ch->ch_tin;
1285
1286        if (count >= n) {
1287                if (from_user)
1288                        ret = copy_from_user(ch->ch_tbuf + ch->ch_tin,
1289                                             (void __user *) buf, n);
1290                else
1291                        memcpy(ch->ch_tbuf + ch->ch_tin, buf, n);
1292
1293                buf = (char *) buf + n;
1294                count -= n;
1295                ch->ch_tin = 0;
1296        }
1297
1298        if (from_user)
1299                ret = copy_from_user(ch->ch_tbuf + ch->ch_tin,
1300                                     (void __user *) buf, count);
1301        else
1302                memcpy(ch->ch_tbuf + ch->ch_tin, buf, count);
1303
1304        ch->ch_tin += count;
1305}
1306
1307
1308static int dgrp_calculate_txprint_bounds(struct ch_struct *ch, int space,
1309                                         int *un_flag)
1310{
1311        clock_t tt;
1312        clock_t mt;
1313        unsigned short tmax = 0;
1314
1315        /*
1316         * If the terminal device is busy, reschedule when
1317         * the terminal device becomes idle.
1318         */
1319
1320        if (ch->ch_tun.un_open_count != 0 &&
1321            ch->ch_tun.un_tty->ops->chars_in_buffer &&
1322            ((ch->ch_tun.un_tty->ops->chars_in_buffer)
1323             (ch->ch_tun.un_tty) != 0)) {
1324                *un_flag = UN_PWAIT;
1325                return 0;
1326        }
1327
1328        /*
1329         * Assure that whenever there is printer data in the output
1330         * buffer, there always remains enough space after it to
1331         * turn the printer off.
1332         */
1333        space -= ch->ch_digi.digi_offlen;
1334
1335        if (space <= 0) {
1336                *un_flag = UN_EMPTY;
1337                return 0;
1338        }
1339
1340        /*
1341         * We measure printer CPS speed by incrementing
1342         * ch_cpstime by (HZ / digi_maxcps) for every
1343         * character we output, restricting output so
1344         * that ch_cpstime never exceeds lbolt.
1345         *
1346         * However if output has not been done for some
1347         * time, lbolt will grow to very much larger than
1348         * ch_cpstime, which would allow essentially
1349         * unlimited amounts of output until ch_cpstime
1350         * finally caught up.   To avoid this, we adjust
1351         * cps_time when necessary so the difference
1352         * between lbolt and ch_cpstime never results
1353         * in sending more than digi_bufsize characters.
1354         *
1355         * This nicely models a printer with an internal
1356         * buffer of digi_bufsize characters.
1357         *
1358         * Get the time between lbolt and ch->ch_cpstime;
1359         */
1360
1361        tt = jiffies - ch->ch_cpstime;
1362
1363        /*
1364         * Compute the time required to send digi_bufsize
1365         * characters.
1366         */
1367
1368        mt = HZ * ch->ch_digi.digi_bufsize / ch->ch_digi.digi_maxcps;
1369
1370        /*
1371         * Compute the number of characters that can be sent
1372         * without violating the time constraint.   If the
1373         * direct calculation of this number is bigger than
1374         * digi_bufsize, limit the number to digi_bufsize,
1375         * and adjust cpstime to match.
1376         */
1377
1378        if ((clock_t)(tt + HZ) > (clock_t)(mt + HZ)) {
1379                tmax = ch->ch_digi.digi_bufsize;
1380                ch->ch_cpstime = jiffies - mt;
1381        } else {
1382                tmax = ch->ch_digi.digi_maxcps * tt / HZ;
1383        }
1384
1385        /*
1386         * If the time constraint now binds, limit the transmit
1387         * count accordingly, and tentatively arrange to be
1388         * rescheduled based on time.
1389         */
1390
1391        if (tmax < space) {
1392                *un_flag = UN_TIME;
1393                space = tmax;
1394        }
1395
1396        /*
1397         * Compute the total number of characters we can
1398         * output before the total number of characters known
1399         * to be in the output queue exceeds digi_maxchar.
1400         */
1401
1402        tmax = (ch->ch_digi.digi_maxchar -
1403                ((ch->ch_tin - ch->ch_tout) & TBUF_MASK) -
1404                ((ch->ch_s_tin - ch->ch_s_tpos) & 0xffff));
1405
1406
1407        /*
1408         * If the digi_maxchar constraint now holds, limit
1409         * the transmit count accordingly, and arrange to
1410         * be rescheduled when the queue becomes empty.
1411         */
1412
1413        if (space > tmax) {
1414                *un_flag = UN_EMPTY;
1415                space = tmax;
1416        }
1417
1418        if (space <= 0)
1419                *un_flag |= UN_EMPTY;
1420
1421        return space;
1422}
1423
1424
1425static int dgrp_tty_write(struct tty_struct *tty,
1426                          const unsigned char *buf,
1427                          int count)
1428{
1429        struct nd_struct *nd;
1430        struct un_struct *un;
1431        struct ch_struct *ch;
1432        int     space;
1433        int     n;
1434        int     t;
1435        int sendcount;
1436        int un_flag;
1437        ulong lock_flags;
1438
1439        if (tty == NULL)
1440                return 0;
1441
1442        un = tty->driver_data;
1443        if (!un)
1444                return 0;
1445
1446        ch = un->un_ch;
1447        if (!ch)
1448                return 0;
1449
1450        nd = ch->ch_nd;
1451        if (!nd)
1452                return 0;
1453
1454        /*
1455         * Ignore the request if the channel is not ready.
1456         */
1457        if (ch->ch_state != CS_READY)
1458                return 0;
1459
1460        spin_lock_irqsave(&dgrp_poll_data.poll_lock, lock_flags);
1461
1462        /*
1463         * Ignore the request if output is blocked.
1464         */
1465        if ((un->un_flag & (UN_EMPTY | UN_LOW | UN_TIME | UN_PWAIT)) != 0) {
1466                count = 0;
1467                goto out;
1468        }
1469
1470        /*
1471         * Also ignore the request if DPA has this port open,
1472         * and is flow controlled on reading more data.
1473         */
1474        if (nd->nd_dpa_debug && nd->nd_dpa_flag & DPA_WAIT_SPACE &&
1475                nd->nd_dpa_port == MINOR(tty_devnum(ch->ch_tun.un_tty))) {
1476                count = 0;
1477                goto out;
1478        }
1479
1480        /*
1481         *      Limit amount we will write to the amount of space
1482         *      available in the channel buffer.
1483         */
1484        sendcount = 0;
1485
1486        space = (ch->ch_tout - ch->ch_tin - 1) & TBUF_MASK;
1487
1488        /*
1489         * Handle the printer device.
1490         */
1491
1492        un_flag = UN_LOW;
1493
1494        if (IS_PRINT(MINOR(tty_devnum(tty)))) {
1495                clock_t tt;
1496                clock_t mt;
1497                unsigned short tmax = 0;
1498
1499                /*
1500                 * If the terminal device is busy, reschedule when
1501                 * the terminal device becomes idle.
1502                 */
1503
1504                if (ch->ch_tun.un_open_count != 0 &&
1505                    ((ch->ch_tun.un_tty->ops->chars_in_buffer)
1506                     (ch->ch_tun.un_tty) != 0)) {
1507                        un->un_flag |= UN_PWAIT;
1508                        count = 0;
1509                        goto out;
1510                }
1511
1512                /*
1513                 * Assure that whenever there is printer data in the output
1514                 * buffer, there always remains enough space after it to
1515                 * turn the printer off.
1516                 */
1517                space -= ch->ch_digi.digi_offlen;
1518
1519                /*
1520                 * Output the printer on string.
1521                 */
1522
1523                if ((ch->ch_flag & CH_PRON) == 0) {
1524                        space -= ch->ch_digi.digi_onlen;
1525
1526                        if (space < 0) {
1527                                un->un_flag |= UN_EMPTY;
1528                                (ch->ch_nd)->nd_tx_work = 1;
1529                                count = 0;
1530                                goto out;
1531                        }
1532
1533                        drp_wmove(ch, 0, ch->ch_digi.digi_onstr,
1534                                ch->ch_digi.digi_onlen);
1535
1536                        ch->ch_flag |= CH_PRON;
1537                }
1538
1539                /*
1540                 * We measure printer CPS speed by incrementing
1541                 * ch_cpstime by (HZ / digi_maxcps) for every
1542                 * character we output, restricting output so
1543                 * that ch_cpstime never exceeds lbolt.
1544                 *
1545                 * However if output has not been done for some
1546                 * time, lbolt will grow to very much larger than
1547                 * ch_cpstime, which would allow essentially
1548                 * unlimited amounts of output until ch_cpstime
1549                 * finally caught up.   To avoid this, we adjust
1550                 * cps_time when necessary so the difference
1551                 * between lbolt and ch_cpstime never results
1552                 * in sending more than digi_bufsize characters.
1553                 *
1554                 * This nicely models a printer with an internal
1555                 * buffer of digi_bufsize characters.
1556                 *
1557                 * Get the time between lbolt and ch->ch_cpstime;
1558                 */
1559
1560                tt = jiffies - ch->ch_cpstime;
1561
1562                /*
1563                 * Compute the time required to send digi_bufsize
1564                 * characters.
1565                 */
1566
1567                mt = HZ * ch->ch_digi.digi_bufsize / ch->ch_digi.digi_maxcps;
1568
1569                /*
1570                 * Compute the number of characters that can be sent
1571                 * without violating the time constraint.   If the
1572                 * direct calculation of this number is bigger than
1573                 * digi_bufsize, limit the number to digi_bufsize,
1574                 * and adjust cpstime to match.
1575                 */
1576
1577                if ((clock_t)(tt + HZ) > (clock_t)(mt + HZ)) {
1578                        tmax = ch->ch_digi.digi_bufsize;
1579                        ch->ch_cpstime = jiffies - mt;
1580                } else {
1581                        tmax = ch->ch_digi.digi_maxcps * tt / HZ;
1582                }
1583
1584                /*
1585                 * If the time constraint now binds, limit the transmit
1586                 * count accordingly, and tentatively arrange to be
1587                 * rescheduled based on time.
1588                 */
1589
1590                if (tmax < space) {
1591                        space = tmax;
1592                        un_flag = UN_TIME;
1593                }
1594
1595                /*
1596                 * Compute the total number of characters we can
1597                 * output before the total number of characters known
1598                 * to be in the output queue exceeds digi_maxchar.
1599                 */
1600
1601                tmax = (ch->ch_digi.digi_maxchar -
1602                        ((ch->ch_tin - ch->ch_tout) & TBUF_MASK) -
1603                        ((ch->ch_s_tin - ch->ch_s_tpos) & 0xffff));
1604
1605
1606                /*
1607                 * If the digi_maxchar constraint now holds, limit
1608                 * the transmit count accordingly, and arrange to
1609                 * be rescheduled when the queue becomes empty.
1610                 */
1611
1612                if (space > tmax) {
1613                        space = tmax;
1614                        un_flag = UN_EMPTY;
1615                }
1616
1617        }
1618        /*
1619         * Handle the terminal device.
1620         */
1621        else {
1622
1623                /*
1624                 * If the printer device is on, turn it off.
1625                 */
1626
1627                if ((ch->ch_flag & CH_PRON) != 0) {
1628
1629                        space -= ch->ch_digi.digi_offlen;
1630
1631                        drp_wmove(ch, 0, ch->ch_digi.digi_offstr,
1632                                  ch->ch_digi.digi_offlen);
1633
1634                        ch->ch_flag &= ~CH_PRON;
1635                }
1636        }
1637
1638        /*
1639         *      If space is 0 and its because the ch->tbuf
1640         *      is full, then Linux will handle a callback when queue
1641         *      space becomes available.
1642         *      tty_write returns count = 0
1643         */
1644
1645        if (space <= 0) {
1646                /* the linux tty_io.c handles this if we return 0 */
1647                /* if (fp->flags & O_NONBLOCK) return -EAGAIN; */
1648
1649                un->un_flag |= UN_EMPTY;
1650                (ch->ch_nd)->nd_tx_work = 1;
1651                count = 0;
1652                goto out;
1653        }
1654
1655        count = min(count, space);
1656
1657        if (count > 0) {
1658
1659                un->un_tbusy++;
1660
1661                /*
1662                 *      Copy the buffer contents to the ch_tbuf
1663                 *      being careful to wrap around the circular queue
1664                 */
1665
1666                t = TBUF_MAX - ch->ch_tin;
1667                n = count;
1668
1669                if (n >= t) {
1670                        memcpy(ch->ch_tbuf + ch->ch_tin, buf, t);
1671                        if (nd->nd_dpa_debug && nd->nd_dpa_port ==
1672                                PORT_NUM(MINOR(tty_devnum(un->un_tty))))
1673                                dgrp_dpa_data(nd, 0, (char *) buf, t);
1674                        buf += t;
1675                        n -= t;
1676                        ch->ch_tin = 0;
1677                        sendcount += n;
1678                }
1679
1680                memcpy(ch->ch_tbuf + ch->ch_tin, buf, n);
1681                if (nd->nd_dpa_debug && nd->nd_dpa_port ==
1682                        PORT_NUM(MINOR(tty_devnum(un->un_tty))))
1683                        dgrp_dpa_data(nd, 0, (char *) buf, n);
1684                buf += n;
1685                ch->ch_tin += n;
1686                sendcount += n;
1687
1688                un->un_tbusy--;
1689                (ch->ch_nd)->nd_tx_work = 1;
1690                if (ch->ch_edelay != DGRP_RTIME) {
1691                        (ch->ch_nd)->nd_tx_ready = 1;
1692                        wake_up_interruptible(&nd->nd_tx_waitq);
1693                }
1694        }
1695
1696        ch->ch_txcount += count;
1697
1698        if (IS_PRINT(MINOR(tty_devnum(tty)))) {
1699
1700                /*
1701                 * Adjust ch_cpstime to account
1702                 * for the characters just output.
1703                 */
1704
1705                if (sendcount > 0) {
1706                        int cc = HZ * sendcount + ch->ch_cpsrem;
1707
1708                        ch->ch_cpstime += cc / ch->ch_digi.digi_maxcps;
1709                        ch->ch_cpsrem   = cc % ch->ch_digi.digi_maxcps;
1710                }
1711
1712                /*
1713                 * If we are now waiting on time, schedule ourself
1714                 * back when we'll be able to send a block of
1715                 * digi_maxchar characters.
1716                 */
1717
1718                if ((un_flag & UN_TIME) != 0) {
1719                        ch->ch_waketime = (ch->ch_cpstime +
1720                                (ch->ch_digi.digi_maxchar * HZ /
1721                                ch->ch_digi.digi_maxcps));
1722                }
1723        }
1724
1725        /*
1726         * If the printer unit is waiting for completion
1727         * of terminal output, get him going again.
1728         */
1729
1730        if ((ch->ch_pun.un_flag & UN_PWAIT) != 0)
1731                (ch->ch_nd)->nd_tx_work = 1;
1732
1733out:
1734        spin_unlock_irqrestore(&dgrp_poll_data.poll_lock, lock_flags);
1735
1736        return count;
1737}
1738
1739
1740/*
1741 *      Put a character into ch->ch_buf
1742 *
1743 *      - used by the line discipline for OPOST processing
1744 */
1745
1746static int dgrp_tty_put_char(struct tty_struct *tty, unsigned char new_char)
1747{
1748        struct un_struct *un;
1749        struct ch_struct *ch;
1750        ulong  lock_flags;
1751        int space;
1752        int retval = 0;
1753
1754        if (tty == NULL)
1755                return 0;
1756
1757        un = tty->driver_data;
1758        if (!un)
1759                return 0;
1760
1761        ch = un->un_ch;
1762        if (!ch)
1763                return 0;
1764
1765        if (ch->ch_state != CS_READY)
1766                return 0;
1767
1768        spin_lock_irqsave(&dgrp_poll_data.poll_lock, lock_flags);
1769
1770
1771        /*
1772         *      If space is 0 and its because the ch->tbuf
1773         *      Warn and dump the character, there isn't anything else
1774         *      we can do about it.  David_Fries@digi.com
1775         */
1776
1777        space = (ch->ch_tout - ch->ch_tin - 1) & TBUF_MASK;
1778
1779        un->un_tbusy++;
1780
1781        /*
1782         * Output the printer on string if device is TXPrint.
1783         */
1784        if (IS_PRINT(MINOR(tty_devnum(tty))) && (ch->ch_flag & CH_PRON) == 0) {
1785                if (space < ch->ch_digi.digi_onlen) {
1786                        un->un_tbusy--;
1787                        goto out;
1788                }
1789                space -= ch->ch_digi.digi_onlen;
1790                drp_wmove(ch, 0, ch->ch_digi.digi_onstr,
1791                          ch->ch_digi.digi_onlen);
1792                ch->ch_flag |= CH_PRON;
1793        }
1794
1795        /*
1796         * Output the printer off string if device is NOT TXPrint.
1797         */
1798
1799        if (!IS_PRINT(MINOR(tty_devnum(tty))) &&
1800            ((ch->ch_flag & CH_PRON) != 0)) {
1801                if (space < ch->ch_digi.digi_offlen) {
1802                        un->un_tbusy--;
1803                        goto out;
1804                }
1805
1806                space -= ch->ch_digi.digi_offlen;
1807                drp_wmove(ch, 0, ch->ch_digi.digi_offstr,
1808                          ch->ch_digi.digi_offlen);
1809                ch->ch_flag &= ~CH_PRON;
1810        }
1811
1812        if (!space) {
1813                un->un_tbusy--;
1814                goto out;
1815        }
1816
1817        /*
1818         *      Copy the character to the ch_tbuf being
1819         *      careful to wrap around the circular queue
1820         */
1821        ch->ch_tbuf[ch->ch_tin] = new_char;
1822        ch->ch_tin = (1 + ch->ch_tin) & TBUF_MASK;
1823
1824        if (IS_PRINT(MINOR(tty_devnum(tty)))) {
1825
1826                /*
1827                 * Adjust ch_cpstime to account
1828                 * for the character just output.
1829                 */
1830
1831                int cc = HZ + ch->ch_cpsrem;
1832
1833                ch->ch_cpstime += cc / ch->ch_digi.digi_maxcps;
1834                ch->ch_cpsrem   = cc % ch->ch_digi.digi_maxcps;
1835
1836                /*
1837                 * If we are now waiting on time, schedule ourself
1838                 * back when we'll be able to send a block of
1839                 * digi_maxchar characters.
1840                 */
1841
1842                ch->ch_waketime = (ch->ch_cpstime +
1843                        (ch->ch_digi.digi_maxchar * HZ /
1844                        ch->ch_digi.digi_maxcps));
1845        }
1846
1847
1848        un->un_tbusy--;
1849        (ch->ch_nd)->nd_tx_work = 1;
1850
1851        retval = 1;
1852out:
1853        spin_unlock_irqrestore(&dgrp_poll_data.poll_lock, lock_flags);
1854        return retval;
1855}
1856
1857
1858
1859/*
1860 *      Flush TX buffer (make in == out)
1861 *
1862 *      check tty_ioctl.c  -- this is called after TCOFLUSH
1863 */
1864static void dgrp_tty_flush_buffer(struct tty_struct *tty)
1865{
1866        struct un_struct *un;
1867        struct ch_struct *ch;
1868
1869        if (!tty)
1870                return;
1871        un = tty->driver_data;
1872        if (!un)
1873                return;
1874
1875        ch = un->un_ch;
1876        if (!ch)
1877                return;
1878
1879        ch->ch_tout = ch->ch_tin;
1880        /* do NOT do this here! */
1881        /* ch->ch_s_tpos = ch->ch_s_tin = 0; */
1882
1883        /* send the flush output command now */
1884        ch->ch_send |= RR_TX_FLUSH;
1885        (ch->ch_nd)->nd_tx_ready = 1;
1886        (ch->ch_nd)->nd_tx_work = 1;
1887        wake_up_interruptible(&(ch->ch_nd)->nd_tx_waitq);
1888
1889        if (waitqueue_active(&tty->write_wait))
1890                wake_up_interruptible(&tty->write_wait);
1891
1892        tty_wakeup(tty);
1893
1894}
1895
1896/*
1897 *      Return space available in Tx buffer
1898 *      count = ( ch->ch_tout - ch->ch_tin ) mod (TBUF_MAX - 1)
1899 */
1900static int dgrp_tty_write_room(struct tty_struct *tty)
1901{
1902        struct un_struct *un;
1903        struct ch_struct *ch;
1904        int     count;
1905
1906        if (!tty)
1907                return 0;
1908
1909        un = tty->driver_data;
1910        if (!un)
1911                return 0;
1912
1913        ch = un->un_ch;
1914        if (!ch)
1915                return 0;
1916
1917        count = (ch->ch_tout - ch->ch_tin - 1) & TBUF_MASK;
1918
1919        /* We *MUST* check this, and return 0 if the Printer Unit cannot
1920         * take any more data within its time constraints...  If we don't
1921         * return 0 and the printer has hit it time constraint, the ld will
1922         * call us back doing a put_char, which cannot be rejected!!!
1923         */
1924        if (IS_PRINT(MINOR(tty_devnum(tty)))) {
1925                int un_flag = 0;
1926                count = dgrp_calculate_txprint_bounds(ch, count, &un_flag);
1927                if (count <= 0)
1928                        count = 0;
1929
1930                ch->ch_pun.un_flag |= un_flag;
1931                (ch->ch_nd)->nd_tx_work = 1;
1932        }
1933
1934        return count;
1935}
1936
1937/*
1938 *      Return number of characters that have not been transmitted yet.
1939 *      chars_in_buffer = ( ch->ch_tin - ch->ch_tout ) mod (TBUF_MAX - 1)
1940 *                      + ( ch->ch_s_tin - ch->ch_s_tout ) mod (0xffff)
1941 *                      = number of characters "in transit"
1942 *
1943 * Remember that sequence number math is always with a sixteen bit
1944 * mask, not the TBUF_MASK.
1945 */
1946
1947static int dgrp_tty_chars_in_buffer(struct tty_struct *tty)
1948{
1949        struct un_struct *un;
1950        struct ch_struct *ch;
1951        int     count;
1952        int     count1;
1953
1954        if (!tty)
1955                return 0;
1956
1957        un = tty->driver_data;
1958        if (!un)
1959                return 0;
1960
1961        ch = un->un_ch;
1962        if (!ch)
1963                return 0;
1964
1965        count1 = count = (ch->ch_tin - ch->ch_tout) & TBUF_MASK;
1966        count += (ch->ch_s_tin - ch->ch_s_tpos) & 0xffff;
1967        /* one for tbuf, one for the PS */
1968
1969        /*
1970         * If we are busy transmitting add 1
1971         */
1972        count += un->un_tbusy;
1973
1974        return count;
1975}
1976
1977
1978/*****************************************************************************
1979 *
1980 * Helper applications for dgrp_tty_ioctl()
1981 *
1982 *****************************************************************************
1983 */
1984
1985
1986/**
1987 * ch_to_tty_flags() -- convert channel flags to termio flags
1988 * @ch_flag: Digi channel flags
1989 * @flagtype: type of ch_flag (iflag, oflag or cflag)
1990 *
1991 * take the channel flags of the specified type and return the
1992 * corresponding termio flag
1993 */
1994static tcflag_t ch_to_tty_flags(ushort ch_flag, char flagtype)
1995{
1996        tcflag_t retval = 0;
1997
1998        switch (flagtype) {
1999        case 'i':
2000                retval = ((ch_flag & IF_IGNBRK) ? IGNBRK : 0)
2001                     | ((ch_flag & IF_BRKINT) ? BRKINT : 0)
2002                     | ((ch_flag & IF_IGNPAR) ? IGNPAR : 0)
2003                     | ((ch_flag & IF_PARMRK) ? PARMRK : 0)
2004                     | ((ch_flag & IF_INPCK) ? INPCK  : 0)
2005                     | ((ch_flag & IF_ISTRIP) ? ISTRIP : 0)
2006                     | ((ch_flag & IF_IXON) ? IXON   : 0)
2007                     | ((ch_flag & IF_IXANY) ? IXANY  : 0)
2008                     | ((ch_flag & IF_IXOFF) ? IXOFF  : 0);
2009                break;
2010
2011        case 'o':
2012                retval = ((ch_flag & OF_OLCUC) ? OLCUC : 0)
2013                     | ((ch_flag & OF_ONLCR) ? ONLCR  : 0)
2014                     | ((ch_flag & OF_OCRNL) ? OCRNL  : 0)
2015                     | ((ch_flag & OF_ONOCR) ? ONOCR  : 0)
2016                     | ((ch_flag & OF_ONLRET) ? ONLRET : 0)
2017                  /* | ((ch_flag & OF_OTAB3) ? OFILL  : 0) */
2018                     | ((ch_flag & OF_TABDLY) ? TABDLY : 0);
2019                break;
2020
2021        case 'c':
2022                retval = ((ch_flag & CF_CSTOPB) ? CSTOPB : 0)
2023                     | ((ch_flag & CF_CREAD) ? CREAD  : 0)
2024                     | ((ch_flag & CF_PARENB) ? PARENB : 0)
2025                     | ((ch_flag & CF_PARODD) ? PARODD : 0)
2026                     | ((ch_flag & CF_HUPCL) ? HUPCL  : 0);
2027
2028                switch (ch_flag & CF_CSIZE) {
2029                case CF_CS5:
2030                        retval |= CS5;
2031                        break;
2032                case CF_CS6:
2033                        retval |= CS6;
2034                        break;
2035                case CF_CS7:
2036                        retval |= CS7;
2037                        break;
2038                case CF_CS8:
2039                        retval |= CS8;
2040                        break;
2041                default:
2042                        retval |= CS8;
2043                        break;
2044                }
2045                break;
2046        case 'x':
2047                break;
2048        case 'l':
2049                break;
2050        default:
2051                return 0;
2052        }
2053
2054        return retval;
2055}
2056
2057
2058/**
2059 * tty_to_ch_flags() -- convert termio flags to digi channel flags
2060 * @tty: pointer to a TTY structure holding flag to be converted
2061 * @flagtype: identifies which flag (iflags, oflags, or cflags) should
2062 *                 be converted
2063 *
2064 * take the termio flag of the specified type and return the
2065 * corresponding Digi version of the flags
2066 */
2067static ushort tty_to_ch_flags(struct tty_struct *tty, char flagtype)
2068{
2069        ushort retval = 0;
2070        tcflag_t tflag = 0;
2071
2072        switch (flagtype) {
2073        case 'i':
2074                tflag  = tty->termios.c_iflag;
2075                retval = (I_IGNBRK(tty) ? IF_IGNBRK : 0)
2076                      | (I_BRKINT(tty) ? IF_BRKINT : 0)
2077                      | (I_IGNPAR(tty) ? IF_IGNPAR : 0)
2078                      | (I_PARMRK(tty) ? IF_PARMRK : 0)
2079                      | (I_INPCK(tty)  ? IF_INPCK  : 0)
2080                      | (I_ISTRIP(tty) ? IF_ISTRIP : 0)
2081                      | (I_IXON(tty)   ? IF_IXON   : 0)
2082                      | (I_IXANY(tty)  ? IF_IXANY  : 0)
2083                      | (I_IXOFF(tty)  ? IF_IXOFF  : 0);
2084                break;
2085        case 'o':
2086                tflag  = tty->termios.c_oflag;
2087                /*
2088                 * If OPOST is set, then do the post processing in the
2089                 * firmware by setting all the processing flags on.
2090                 * If ~OPOST, then make sure we are not doing any
2091                 * output processing!!
2092                 */
2093                if (!O_OPOST(tty))
2094                        retval = 0;
2095                else
2096                        retval = (O_OLCUC(tty) ? OF_OLCUC : 0)
2097                             | (O_ONLCR(tty)  ? OF_ONLCR  : 0)
2098                             | (O_OCRNL(tty)  ? OF_OCRNL  : 0)
2099                             | (O_ONOCR(tty)  ? OF_ONOCR  : 0)
2100                             | (O_ONLRET(tty) ? OF_ONLRET : 0)
2101                          /* | (O_OFILL(tty)  ? OF_TAB3   : 0) */
2102                             | (O_TABDLY(tty) ? OF_TABDLY : 0);
2103                break;
2104        case 'c':
2105                tflag  = tty->termios.c_cflag;
2106                retval = (C_CSTOPB(tty) ? CF_CSTOPB : 0)
2107                     | (C_CREAD(tty)  ? CF_CREAD  : 0)
2108                     | (C_PARENB(tty) ? CF_PARENB : 0)
2109                     | (C_PARODD(tty) ? CF_PARODD : 0)
2110                     | (C_HUPCL(tty)  ? CF_HUPCL  : 0);
2111                switch (C_CSIZE(tty)) {
2112                case CS8:
2113                        retval |= CF_CS8;
2114                        break;
2115                case CS7:
2116                        retval |= CF_CS7;
2117                        break;
2118                case CS6:
2119                        retval |= CF_CS6;
2120                        break;
2121                case CS5:
2122                        retval |= CF_CS5;
2123                        break;
2124                default:
2125                        retval |= CF_CS8;
2126                        break;
2127                }
2128                break;
2129        case 'x':
2130                break;
2131        case 'l':
2132                break;
2133        default:
2134                return 0;
2135        }
2136
2137        return retval;
2138}
2139
2140
2141static int dgrp_tty_send_break(struct tty_struct *tty, int msec)
2142{
2143        struct un_struct *un;
2144        struct ch_struct *ch;
2145        int ret = -EIO;
2146
2147        if (!tty)
2148                return ret;
2149
2150        un = tty->driver_data;
2151        if (!un)
2152                return ret;
2153
2154        ch = un->un_ch;
2155        if (!ch)
2156                return ret;
2157
2158        dgrp_send_break(ch, msec);
2159        return 0;
2160}
2161
2162
2163/*
2164 * This routine sends a break character out the serial port.
2165 *
2166 * duration is in 1/1000's of a second
2167 */
2168static int dgrp_send_break(struct ch_struct *ch, int msec)
2169{
2170        ulong x;
2171
2172        wait_event_interruptible(ch->ch_flag_wait,
2173                ((ch->ch_flag & CH_TX_BREAK) == 0));
2174        ch->ch_break_time += max(msec, 250);
2175        ch->ch_send |= RR_TX_BREAK;
2176        ch->ch_flag |= CH_TX_BREAK;
2177        (ch->ch_nd)->nd_tx_work = 1;
2178
2179        x = (msec * HZ) / 1000;
2180        wake_up_interruptible(&(ch->ch_nd)->nd_tx_waitq);
2181
2182        return 0;
2183}
2184
2185
2186/*
2187 * Return modem signals to ld.
2188 */
2189static int dgrp_tty_tiocmget(struct tty_struct *tty)
2190{
2191        unsigned int mlast;
2192        struct un_struct *un = tty->driver_data;
2193        struct ch_struct *ch;
2194
2195        if (!un)
2196                return -ENODEV;
2197
2198        ch = un->un_ch;
2199        if (!ch)
2200                return -ENODEV;
2201
2202        mlast = ((ch->ch_s_mlast & ~(DM_RTS | DM_DTR)) |
2203                (ch->ch_mout & (DM_RTS | DM_DTR)));
2204
2205        /* defined in /usr/include/asm/termios.h */
2206        mlast =   ((mlast & DM_RTS) ? TIOCM_RTS : 0)
2207                | ((mlast & DM_DTR) ? TIOCM_DTR : 0)
2208                | ((mlast & DM_CD)  ? TIOCM_CAR : 0)
2209                | ((mlast & DM_RI)  ? TIOCM_RNG : 0)
2210                | ((mlast & DM_DSR) ? TIOCM_DSR : 0)
2211                | ((mlast & DM_CTS) ? TIOCM_CTS : 0);
2212
2213        return mlast;
2214}
2215
2216
2217/*
2218 *      Set modem lines
2219 */
2220static int dgrp_tty_tiocmset(struct tty_struct *tty,
2221                             unsigned int set, unsigned int clear)
2222{
2223        ulong lock_flags;
2224        struct un_struct *un = tty->driver_data;
2225        struct ch_struct *ch;
2226
2227        if (!un)
2228                return -ENODEV;
2229
2230        ch = un->un_ch;
2231        if (!ch)
2232                return -ENODEV;
2233
2234        if (set & TIOCM_RTS)
2235                ch->ch_mout |= DM_RTS;
2236
2237        if (set & TIOCM_DTR)
2238                ch->ch_mout |= DM_DTR;
2239
2240        if (clear & TIOCM_RTS)
2241                ch->ch_mout &= ~(DM_RTS);
2242
2243        if (clear & TIOCM_DTR)
2244                ch->ch_mout &= ~(DM_DTR);
2245
2246        spin_lock_irqsave(&(ch->ch_nd)->nd_lock, lock_flags);
2247        ch->ch_flag |= CH_PARAM;
2248        (ch->ch_nd)->nd_tx_work = 1;
2249        wake_up_interruptible(&ch->ch_flag_wait);
2250
2251        spin_unlock_irqrestore(&(ch->ch_nd)->nd_lock, lock_flags);
2252
2253        return 0;
2254}
2255
2256
2257
2258/*
2259 *      Get current modem status
2260 */
2261static int get_modem_info(struct ch_struct *ch, unsigned int *value)
2262{
2263        unsigned int mlast;
2264
2265        mlast = ((ch->ch_s_mlast & ~(DM_RTS | DM_DTR)) |
2266                (ch->ch_mout    &  (DM_RTS | DM_DTR)));
2267
2268        /* defined in /usr/include/asm/termios.h */
2269        mlast =   ((mlast & DM_RTS) ? TIOCM_RTS : 0)
2270                | ((mlast & DM_DTR) ? TIOCM_DTR : 0)
2271                | ((mlast & DM_CD)  ? TIOCM_CAR : 0)
2272                | ((mlast & DM_RI)  ? TIOCM_RNG : 0)
2273                | ((mlast & DM_DSR) ? TIOCM_DSR : 0)
2274                | ((mlast & DM_CTS) ? TIOCM_CTS : 0);
2275        return put_user(mlast, (unsigned int __user *) value);
2276}
2277
2278/*
2279 *      Set modem lines
2280 */
2281static int set_modem_info(struct ch_struct *ch, unsigned int command,
2282                          unsigned int *value)
2283{
2284        int error;
2285        unsigned int arg;
2286        int mval = 0;
2287        ulong lock_flags;
2288
2289        error = access_ok(VERIFY_READ, (void __user *) value, sizeof(int));
2290        if (error == 0)
2291                return -EFAULT;
2292
2293        if (get_user(arg, (unsigned int __user *) value))
2294                return -EFAULT;
2295        mval |= ((arg & TIOCM_RTS) ? DM_RTS : 0)
2296                | ((arg & TIOCM_DTR) ? DM_DTR : 0);
2297
2298        switch (command) {
2299        case TIOCMBIS:  /* set flags */
2300                ch->ch_mout |= mval;
2301                break;
2302        case TIOCMBIC:  /* clear flags */
2303                ch->ch_mout &= ~mval;
2304                break;
2305        case TIOCMSET:
2306                ch->ch_mout = mval;
2307                break;
2308        default:
2309                return -EINVAL;
2310        }
2311
2312        spin_lock_irqsave(&(ch->ch_nd)->nd_lock, lock_flags);
2313
2314        ch->ch_flag |= CH_PARAM;
2315        (ch->ch_nd)->nd_tx_work = 1;
2316        wake_up_interruptible(&ch->ch_flag_wait);
2317
2318        spin_unlock_irqrestore(&(ch->ch_nd)->nd_lock, lock_flags);
2319
2320        return 0;
2321}
2322
2323
2324/*
2325 *  Assign the custom baud rate to the channel structure
2326 */
2327static void dgrp_set_custom_speed(struct ch_struct *ch, int newrate)
2328{
2329        int testdiv;
2330        int testrate_high;
2331        int testrate_low;
2332
2333        int deltahigh, deltalow;
2334
2335        if (newrate < 0)
2336                newrate = 0;
2337
2338        /*
2339         * Since the divisor is stored in a 16-bit integer, we make sure
2340         * we don't allow any rates smaller than a 16-bit integer would allow.
2341         * And of course, rates above the dividend won't fly.
2342         */
2343        if (newrate && newrate < ((PORTSERVER_DIVIDEND / 0xFFFF) + 1))
2344                newrate = ((PORTSERVER_DIVIDEND / 0xFFFF) + 1);
2345        if (newrate && newrate > PORTSERVER_DIVIDEND)
2346                newrate = PORTSERVER_DIVIDEND;
2347
2348        while (newrate > 0) {
2349                testdiv = PORTSERVER_DIVIDEND / newrate;
2350
2351                /*
2352                 * If we try to figure out what rate the PortServer would use
2353                 * with the test divisor, it will be either equal or higher
2354                 * than the requested baud rate.  If we then determine the
2355                 * rate with a divisor one higher, we will get the next lower
2356                 * supported rate below the requested.
2357                 */
2358                testrate_high = PORTSERVER_DIVIDEND / testdiv;
2359                testrate_low  = PORTSERVER_DIVIDEND / (testdiv + 1);
2360
2361                /*
2362                 * If the rate for the requested divisor is correct, just
2363                 * use it and be done.
2364                 */
2365                if (testrate_high == newrate)
2366                        break;
2367
2368                /*
2369                 * Otherwise, pick the rate that is closer (i.e. whichever rate
2370                 * has a smaller delta).
2371                 */
2372                deltahigh = testrate_high - newrate;
2373                deltalow = newrate - testrate_low;
2374
2375                if (deltahigh < deltalow)
2376                        newrate = testrate_high;
2377                else
2378                        newrate = testrate_low;
2379
2380                break;
2381        }
2382
2383        ch->ch_custom_speed = newrate;
2384
2385        drp_param(ch);
2386
2387        return;
2388}
2389
2390
2391/*
2392 # dgrp_tty_digiseta()
2393 *
2394 * Ioctl to set the information from ditty.
2395 *
2396 * NOTE: DIGI_IXON, DSRPACE, DCDPACE, and DTRPACE are unsupported.  JAR 990922
2397 */
2398static int dgrp_tty_digiseta(struct tty_struct *tty,
2399                             struct digi_struct *new_info)
2400{
2401        struct un_struct *un = tty->driver_data;
2402        struct ch_struct *ch;
2403
2404        if (!un)
2405                return -ENODEV;
2406
2407        ch = un->un_ch;
2408        if (!ch)
2409                return -ENODEV;
2410
2411        if (copy_from_user(&ch->ch_digi, (void __user *) new_info,
2412                           sizeof(struct digi_struct)))
2413                return -EFAULT;
2414
2415        if ((ch->ch_digi.digi_flags & RTSPACE) ||
2416            (ch->ch_digi.digi_flags & CTSPACE))
2417                tty->termios.c_cflag |= CRTSCTS;
2418        else
2419                tty->termios.c_cflag &= ~CRTSCTS;
2420
2421        if (ch->ch_digi.digi_maxcps < 1)
2422                ch->ch_digi.digi_maxcps = 1;
2423
2424        if (ch->ch_digi.digi_maxcps > 10000)
2425                ch->ch_digi.digi_maxcps = 10000;
2426
2427        if (ch->ch_digi.digi_bufsize < 10)
2428                ch->ch_digi.digi_bufsize = 10;
2429
2430        if (ch->ch_digi.digi_maxchar < 1)
2431                ch->ch_digi.digi_maxchar = 1;
2432
2433        if (ch->ch_digi.digi_maxchar > ch->ch_digi.digi_bufsize)
2434                ch->ch_digi.digi_maxchar = ch->ch_digi.digi_bufsize;
2435
2436        if (ch->ch_digi.digi_onlen > DIGI_PLEN)
2437                ch->ch_digi.digi_onlen = DIGI_PLEN;
2438
2439        if (ch->ch_digi.digi_offlen > DIGI_PLEN)
2440                ch->ch_digi.digi_offlen = DIGI_PLEN;
2441
2442        /* make the changes now */
2443        drp_param(ch);
2444
2445        return 0;
2446}
2447
2448
2449
2450/*
2451 * dgrp_tty_digigetedelay()
2452 *
2453 * Ioctl to get the current edelay setting.
2454 *
2455 *
2456 *
2457 */
2458static int dgrp_tty_digigetedelay(struct tty_struct *tty, int *retinfo)
2459{
2460        struct un_struct *un;
2461        struct ch_struct *ch;
2462        int tmp;
2463
2464        if (!retinfo)
2465                return -EFAULT;
2466
2467        if (!tty || tty->magic != TTY_MAGIC)
2468                return -EFAULT;
2469
2470        un = tty->driver_data;
2471
2472        if (!un)
2473                return -ENODEV;
2474
2475        ch = un->un_ch;
2476        if (!ch)
2477                return -ENODEV;
2478
2479        tmp = ch->ch_edelay;
2480
2481        if (copy_to_user((void __user *) retinfo, &tmp, sizeof(*retinfo)))
2482                return -EFAULT;
2483
2484        return 0;
2485}
2486
2487
2488/*
2489 * dgrp_tty_digisetedelay()
2490 *
2491 * Ioctl to set the EDELAY setting
2492 *
2493 */
2494static int dgrp_tty_digisetedelay(struct tty_struct *tty, int *new_info)
2495{
2496        struct un_struct *un;
2497        struct ch_struct *ch;
2498        int new_digi;
2499
2500        if (!tty || tty->magic != TTY_MAGIC)
2501                return -EFAULT;
2502
2503        un = tty->driver_data;
2504
2505        if (!un)
2506                return -ENODEV;
2507
2508        ch = un->un_ch;
2509        if (!ch)
2510                return -ENODEV;
2511
2512        if (copy_from_user(&new_digi, (void __user *)new_info, sizeof(int)))
2513                return -EFAULT;
2514
2515        ch->ch_edelay = new_digi;
2516
2517        /* make the changes now */
2518        drp_param(ch);
2519
2520        return 0;
2521}
2522
2523
2524/*
2525 *      The usual assortment of ioctl's
2526 *
2527 *      note:  use tty_check_change to make sure that we are not
2528 *      changing the state of a terminal when we are not a process
2529 *      in the forground.  See tty_io.c
2530 *              rc = tty_check_change(tty);
2531 *              if (rc) return rc;
2532 */
2533static int dgrp_tty_ioctl(struct tty_struct *tty, unsigned int cmd,
2534                          unsigned long arg)
2535{
2536        struct un_struct *un;
2537        struct ch_struct *ch;
2538        int rc;
2539        struct digiflow_struct   dflow;
2540
2541        if (!tty)
2542                return -ENODEV;
2543
2544        un = tty->driver_data;
2545        if (!un)
2546                return -ENODEV;
2547
2548        ch = un->un_ch;
2549        if (!ch)
2550                return -ENODEV;
2551
2552        switch (cmd) {
2553
2554        /*
2555         * Here are all the standard ioctl's that we MUST implement
2556         */
2557
2558        case TCSBRK:
2559                /*
2560                 * TCSBRK is SVID version: non-zero arg --> no break
2561                 * this behaviour is exploited by tcdrain().
2562                 *
2563                 * According to POSIX.1 spec (7.2.2.1.2) breaks should be
2564                 * between 0.25 and 0.5 seconds
2565                 */
2566
2567                rc = tty_check_change(tty);
2568                if (rc)
2569                        return rc;
2570                tty_wait_until_sent(tty, 0);
2571
2572                if (!arg)
2573                        rc = dgrp_send_break(ch, 250); /* 1/4 second */
2574
2575                if (dgrp_tty_chars_in_buffer(tty) != 0)
2576                        return -EINTR;
2577
2578                return 0;
2579
2580        case TCSBRKP:
2581                /* support for POSIX tcsendbreak()
2582                 *
2583                 * According to POSIX.1 spec (7.2.2.1.2) breaks should be
2584                 * between 0.25 and 0.5 seconds so we'll ask for something
2585                 * in the middle: 0.375 seconds.
2586                 */
2587                rc = tty_check_change(tty);
2588                if (rc)
2589                        return rc;
2590                tty_wait_until_sent(tty, 0);
2591
2592                rc = dgrp_send_break(ch, arg ? arg*250 : 250);
2593
2594                if (dgrp_tty_chars_in_buffer(tty) != 0)
2595                        return -EINTR;
2596                return 0;
2597
2598        case TIOCSBRK:
2599                rc = tty_check_change(tty);
2600                if (rc)
2601                        return rc;
2602                tty_wait_until_sent(tty, 0);
2603
2604                /*
2605                 * RealPort doesn't support turning on a break unconditionally.
2606                 * The RealPort device will stop sending a break automatically
2607                 * after the specified time value that we send in.
2608                 */
2609                rc = dgrp_send_break(ch, 250); /* 1/4 second */
2610
2611                if (dgrp_tty_chars_in_buffer(tty) != 0)
2612                        return -EINTR;
2613                return 0;
2614
2615        case TIOCCBRK:
2616                /*
2617                 * RealPort doesn't support turning off a break unconditionally.
2618                 * The RealPort device will stop sending a break automatically
2619                 * after the specified time value that was sent when turning on
2620                 * the break.
2621                 */
2622                return 0;
2623
2624        case TIOCMGET:
2625                rc = access_ok(VERIFY_WRITE, (void __user *) arg,
2626                                 sizeof(unsigned int));
2627                if (rc == 0)
2628                        return -EFAULT;
2629                return get_modem_info(ch, (unsigned int *) arg);
2630
2631        case TIOCMBIS:
2632        case TIOCMBIC:
2633        case TIOCMSET:
2634                return set_modem_info(ch, cmd, (unsigned int *) arg);
2635
2636        /*
2637         * Here are any additional ioctl's that we want to implement
2638         */
2639
2640        case TCFLSH:
2641                /*
2642                 * The linux tty driver doesn't have a flush
2643                 * input routine for the driver, assuming all backed
2644                 * up data is in the line disc. buffers.  However,
2645                 * we all know that's not the case.  Here, we
2646                 * act on the ioctl, but then lie and say we didn't
2647                 * so the line discipline will process the flush
2648                 * also.
2649                 */
2650                rc = tty_check_change(tty);
2651                if (rc)
2652                        return rc;
2653
2654                switch (arg) {
2655                case TCIFLUSH:
2656                case TCIOFLUSH:
2657                        /* only flush input if this is the only open unit */
2658                        if (!IS_PRINT(MINOR(tty_devnum(tty)))) {
2659                                ch->ch_rout = ch->ch_rin;
2660                                ch->ch_send |= RR_RX_FLUSH;
2661                                (ch->ch_nd)->nd_tx_work = 1;
2662                                (ch->ch_nd)->nd_tx_ready = 1;
2663                                wake_up_interruptible(
2664                                        &(ch->ch_nd)->nd_tx_waitq);
2665                        }
2666                        if (arg == TCIFLUSH)
2667                                break;
2668
2669                case TCOFLUSH: /* flush output, or the receive buffer */
2670                        /*
2671                         * This is handled in the tty_ioctl.c code
2672                         * calling tty_flush_buffer
2673                         */
2674                        break;
2675
2676                default:
2677                        /* POSIX.1 says return EINVAL if we got a bad arg */
2678                        return -EINVAL;
2679                }
2680                /* pretend we didn't recognize this IOCTL */
2681                return -ENOIOCTLCMD;
2682
2683#ifdef TIOCGETP
2684        case TIOCGETP:
2685#endif
2686        /*****************************************
2687        Linux           HPUX            Function
2688        TCSETA          TCSETA          - set the termios
2689        TCSETAF         TCSETAF         - wait for drain first, then set termios
2690        TCSETAW         TCSETAW         - wait for drain,
2691                                        flush the input queue, then set termios
2692        - looking at the tty_ioctl code, these command all call our
2693        tty_set_termios at the driver's end, when a TCSETA* is sent,
2694        it is expecting the tty to have a termio structure,
2695        NOT a termios structure.  These two structures differ in size
2696        and the tty_ioctl code does a conversion before processing them both.
2697        - we should treat the TCSETAW TCSETAF ioctls the same, and let
2698        the tty_ioctl code do the conversion stuff.
2699
2700        TCSETS
2701        TCSETSF         (none)
2702        TCSETSW
2703        - the associated tty structure has a termios structure.
2704        *****************************************/
2705
2706        case TCGETS:
2707        case TCGETA:
2708                return -ENOIOCTLCMD;
2709
2710        case TCSETAW:
2711        case TCSETAF:
2712        case TCSETSF:
2713        case TCSETSW:
2714                /*
2715                 * The linux tty driver doesn't have a flush
2716                 * input routine for the driver, assuming all backed
2717                 * up data is in the line disc. buffers.  However,
2718                 * we all know that's not the case.  Here, we
2719                 * act on the ioctl, but then lie and say we didn't
2720                 * so the line discipline will process the flush
2721                 * also.
2722                 */
2723
2724                /*
2725                 * Also, now that we have TXPrint, we have to check
2726                 * if this is the TXPrint device and the terminal
2727                 * device is open. If so, do NOT run check_change,
2728                 * as the terminal device is ALWAYS the parent.
2729                 */
2730                if (!IS_PRINT(MINOR(tty_devnum(tty))) ||
2731                    !ch->ch_tun.un_open_count) {
2732                        rc = tty_check_change(tty);
2733                        if (rc)
2734                                return rc;
2735                }
2736
2737                /* wait for all the characters in tbuf to drain */
2738                tty_wait_until_sent(tty, 0);
2739
2740                if ((cmd == TCSETSF) || (cmd == TCSETAF)) {
2741                        /* flush the contents of the rbuf queue */
2742                        /* TODO:  check if this is print device? */
2743                        ch->ch_send |= RR_RX_FLUSH;
2744                        (ch->ch_nd)->nd_tx_ready = 1;
2745                        (ch->ch_nd)->nd_tx_work = 1;
2746                        wake_up_interruptible(&(ch->ch_nd)->nd_tx_waitq);
2747                        /* do we need to do this?  just to be safe! */
2748                        ch->ch_rout = ch->ch_rin;
2749                }
2750
2751                /* pretend we didn't recognize this */
2752                return -ENOIOCTLCMD;
2753
2754        case TCXONC:
2755                /*
2756                 * The Linux Line Discipline (LD) would do this for us if we
2757                 * let it, but we have the special firmware options to do this
2758                 * the "right way" regardless of hardware or software flow
2759                 * control so we'll do it outselves instead of letting the LD
2760                 * do it.
2761                 */
2762                rc = tty_check_change(tty);
2763                if (rc)
2764                        return rc;
2765
2766                switch (arg) {
2767                case TCOON:
2768                        dgrp_tty_start(tty);
2769                        return 0;
2770                case TCOOFF:
2771                        dgrp_tty_stop(tty);
2772                        return 0;
2773                case TCION:
2774                        dgrp_tty_input_start(tty);
2775                        return 0;
2776                case TCIOFF:
2777                        dgrp_tty_input_stop(tty);
2778                        return 0;
2779                default:
2780                        return -EINVAL;
2781                }
2782
2783        case DIGI_GETA:
2784                /* get information for ditty */
2785                if (copy_to_user((struct digi_struct __user *) arg,
2786                                 &ch->ch_digi, sizeof(struct digi_struct)))
2787                        return -EFAULT;
2788                break;
2789
2790        case DIGI_SETAW:
2791        case DIGI_SETAF:
2792                /* wait for all the characters in tbuf to drain */
2793                tty_wait_until_sent(tty, 0);
2794
2795                if (cmd == DIGI_SETAF) {
2796                        /* flush the contents of the rbuf queue */
2797                        /* send down a packet with RR_RX_FLUSH set */
2798                        ch->ch_send |= RR_RX_FLUSH;
2799                        (ch->ch_nd)->nd_tx_ready = 1;
2800                        (ch->ch_nd)->nd_tx_work = 1;
2801                        wake_up_interruptible(&(ch->ch_nd)->nd_tx_waitq);
2802                        /* do we need to do this?  just to be safe! */
2803                        ch->ch_rout = ch->ch_rin;
2804                }
2805
2806                /* pretend we didn't recognize this */
2807                /* fall-through */
2808
2809        case DIGI_SETA:
2810                return dgrp_tty_digiseta(tty, (struct digi_struct *) arg);
2811
2812        case DIGI_SEDELAY:
2813                return dgrp_tty_digisetedelay(tty, (int *) arg);
2814
2815        case DIGI_GEDELAY:
2816                return dgrp_tty_digigetedelay(tty, (int *) arg);
2817
2818        case DIGI_GETFLOW:
2819        case DIGI_GETAFLOW:
2820                if (cmd == (DIGI_GETFLOW)) {
2821                        dflow.startc = tty->termios.c_cc[VSTART];
2822                        dflow.stopc = tty->termios.c_cc[VSTOP];
2823                } else {
2824                        dflow.startc = ch->ch_xxon;
2825                        dflow.stopc = ch->ch_xxoff;
2826                }
2827
2828                if (copy_to_user((char __user *)arg, &dflow, sizeof(dflow)))
2829                        return -EFAULT;
2830                break;
2831
2832        case DIGI_SETFLOW:
2833        case DIGI_SETAFLOW:
2834
2835                if (copy_from_user(&dflow, (char __user *)arg, sizeof(dflow)))
2836                        return -EFAULT;
2837
2838                if (cmd == (DIGI_SETFLOW)) {
2839                        tty->termios.c_cc[VSTART] = dflow.startc;
2840                        tty->termios.c_cc[VSTOP] = dflow.stopc;
2841                } else {
2842                        ch->ch_xxon = dflow.startc;
2843                        ch->ch_xxoff = dflow.stopc;
2844                }
2845                break;
2846
2847        case DIGI_GETCUSTOMBAUD:
2848                if (put_user(ch->ch_custom_speed, (unsigned int __user *) arg))
2849                        return -EFAULT;
2850                break;
2851
2852        case DIGI_SETCUSTOMBAUD:
2853        {
2854                int new_rate;
2855
2856                if (get_user(new_rate, (unsigned int __user *) arg))
2857                        return -EFAULT;
2858                dgrp_set_custom_speed(ch, new_rate);
2859
2860                break;
2861        }
2862
2863        default:
2864                return -ENOIOCTLCMD;
2865        }
2866
2867        return 0;
2868}
2869
2870/*
2871 *  This routine allows the tty driver to be notified when
2872 *  the device's termios setting have changed.  Note that we
2873 *  should be prepared to accept the case where old == NULL
2874 *  and try to do something rational.
2875 *
2876 *  So we need to make sure that our copies of ch_oflag,
2877 *  ch_clag, and ch_iflag reflect the tty->termios flags.
2878 */
2879static void dgrp_tty_set_termios(struct tty_struct *tty, struct ktermios *old)
2880{
2881        struct ktermios *ts;
2882        struct ch_struct *ch;
2883        struct un_struct *un;
2884
2885        /* seems silly, but we have to check all these! */
2886        if (!tty)
2887                return;
2888
2889        un = tty->driver_data;
2890        if (!un)
2891                return;
2892
2893        ts = &tty->termios;
2894
2895        ch = un->un_ch;
2896        if (!ch)
2897                return;
2898
2899        drp_param(ch);
2900
2901        /* the CLOCAL flag has just been set */
2902        if (!(old->c_cflag & CLOCAL) && C_CLOCAL(tty))
2903                wake_up_interruptible(&un->un_open_wait);
2904}
2905
2906
2907/*
2908 *      Throttle receiving data.  We just set a bit and stop reading
2909 *      data out of the channel buffer.  It will back up and the
2910 *      FEP will do whatever is necessary to stop the far end.
2911 */
2912static void dgrp_tty_throttle(struct tty_struct *tty)
2913{
2914        struct ch_struct *ch;
2915
2916        if (!tty)
2917                return;
2918
2919        ch = ((struct un_struct *) tty->driver_data)->un_ch;
2920        if (!ch)
2921                return;
2922
2923        ch->ch_flag |= CH_RXSTOP;
2924}
2925
2926
2927static void dgrp_tty_unthrottle(struct tty_struct *tty)
2928{
2929        struct ch_struct *ch;
2930
2931        if (!tty)
2932                return;
2933
2934        ch = ((struct un_struct *) tty->driver_data)->un_ch;
2935        if (!ch)
2936                return;
2937
2938        ch->ch_flag &= ~CH_RXSTOP;
2939}
2940
2941/*
2942 *      Stop the transmitter
2943 */
2944static void dgrp_tty_stop(struct tty_struct *tty)
2945{
2946        struct ch_struct *ch;
2947
2948        if (!tty)
2949                return;
2950
2951        ch = ((struct un_struct *) tty->driver_data)->un_ch;
2952        if (!ch)
2953                return;
2954
2955        ch->ch_send |= RR_TX_STOP;
2956        ch->ch_send &= ~RR_TX_START;
2957
2958        /* make the change NOW! */
2959        (ch->ch_nd)->nd_tx_ready = 1;
2960        if (waitqueue_active(&(ch->ch_nd)->nd_tx_waitq))
2961                wake_up_interruptible(&(ch->ch_nd)->nd_tx_waitq);
2962}
2963
2964/*
2965 *      Start the transmitter
2966 */
2967static void dgrp_tty_start(struct tty_struct *tty)
2968{
2969        struct ch_struct *ch;
2970
2971        if (!tty)
2972                return;
2973
2974        ch = ((struct un_struct *) tty->driver_data)->un_ch;
2975        if (!ch)
2976                return;
2977
2978        /* TODO: don't do anything if the transmitter is not stopped */
2979
2980        ch->ch_send |= RR_TX_START;
2981        ch->ch_send &= ~RR_TX_STOP;
2982
2983        /* make the change NOW! */
2984        (ch->ch_nd)->nd_tx_ready = 1;
2985        (ch->ch_nd)->nd_tx_work = 1;
2986        if (waitqueue_active(&(ch->ch_nd)->nd_tx_waitq))
2987                wake_up_interruptible(&(ch->ch_nd)->nd_tx_waitq);
2988
2989}
2990
2991/*
2992 *      Stop the receiver
2993 */
2994static void dgrp_tty_input_stop(struct tty_struct *tty)
2995{
2996        struct ch_struct *ch;
2997
2998        if (!tty)
2999                return;
3000
3001        ch = ((struct un_struct *) tty->driver_data)->un_ch;
3002        if (!ch)
3003                return;
3004
3005        ch->ch_send |= RR_RX_STOP;
3006        ch->ch_send &= ~RR_RX_START;
3007        (ch->ch_nd)->nd_tx_ready = 1;
3008        if (waitqueue_active(&(ch->ch_nd)->nd_tx_waitq))
3009                wake_up_interruptible(&(ch->ch_nd)->nd_tx_waitq);
3010
3011}
3012
3013
3014static void dgrp_tty_send_xchar(struct tty_struct *tty, char c)
3015{
3016        struct un_struct *un;
3017        struct ch_struct *ch;
3018
3019        if (!tty)
3020                return;
3021
3022        un = tty->driver_data;
3023        if (!un)
3024                return;
3025
3026        ch = un->un_ch;
3027        if (!ch)
3028                return;
3029        if (c == STOP_CHAR(tty))
3030                ch->ch_send |= RR_RX_STOP;
3031        else if (c == START_CHAR(tty))
3032                ch->ch_send |= RR_RX_START;
3033
3034        ch->ch_nd->nd_tx_ready = 1;
3035        ch->ch_nd->nd_tx_work = 1;
3036
3037        return;
3038}
3039
3040
3041static void dgrp_tty_input_start(struct tty_struct *tty)
3042{
3043        struct ch_struct *ch;
3044
3045        if (!tty)
3046                return;
3047
3048        ch = ((struct un_struct *) tty->driver_data)->un_ch;
3049        if (!ch)
3050                return;
3051
3052        ch->ch_send |= RR_RX_START;
3053        ch->ch_send &= ~RR_RX_STOP;
3054        (ch->ch_nd)->nd_tx_ready = 1;
3055        (ch->ch_nd)->nd_tx_work = 1;
3056        if (waitqueue_active(&(ch->ch_nd)->nd_tx_waitq))
3057                wake_up_interruptible(&(ch->ch_nd)->nd_tx_waitq);
3058
3059}
3060
3061
3062/*
3063 *      Hangup the port.  Like a close, but don't wait for output
3064 *      to drain.
3065 *
3066 *      How do we close all the channels that are open?
3067 */
3068static void dgrp_tty_hangup(struct tty_struct *tty)
3069{
3070        struct ch_struct *ch;
3071        struct nd_struct *nd;
3072        struct un_struct *un;
3073
3074        if (!tty)
3075                return;
3076
3077        un = tty->driver_data;
3078        if (!un)
3079                return;
3080
3081        ch = un->un_ch;
3082        if (!ch)
3083                return;
3084
3085        nd = ch->ch_nd;
3086
3087        if (C_HUPCL(tty)) {
3088                /* LOWER DTR */
3089                ch->ch_mout &= ~DM_DTR;
3090                /* Don't do this here */
3091                /* ch->ch_flag |= CH_HANGUP; */
3092                ch->ch_nd->nd_tx_ready = 1;
3093                ch->ch_nd->nd_tx_work  = 1;
3094                if (waitqueue_active(&ch->ch_flag_wait))
3095                        wake_up_interruptible(&ch->ch_flag_wait);
3096        }
3097
3098}
3099
3100/************************************************************************/
3101/*                                                                      */
3102/*       TTY Initialization/Cleanup Functions                           */
3103/*                                                                      */
3104/************************************************************************/
3105
3106/*
3107 *      Uninitialize the TTY portion of the supplied node.  Free all
3108 *      memory and resources associated with this node.  Do it in reverse
3109 *      allocation order: this might possibly result in less fragmentation
3110 *      of memory, though I don't know this for sure.
3111 */
3112void
3113dgrp_tty_uninit(struct nd_struct *nd)
3114{
3115        unsigned int i;
3116        char id[3];
3117
3118        ID_TO_CHAR(nd->nd_ID, id);
3119
3120        if (nd->nd_ttdriver_flags & SERIAL_TTDRV_REG) {
3121                tty_unregister_driver(nd->nd_serial_ttdriver);
3122
3123                kfree(nd->nd_serial_ttdriver->ttys);
3124                nd->nd_serial_ttdriver->ttys = NULL;
3125
3126                put_tty_driver(nd->nd_serial_ttdriver);
3127                nd->nd_ttdriver_flags &= ~SERIAL_TTDRV_REG;
3128        }
3129
3130        if (nd->nd_ttdriver_flags & CALLOUT_TTDRV_REG) {
3131                tty_unregister_driver(nd->nd_callout_ttdriver);
3132
3133                kfree(nd->nd_callout_ttdriver->ttys);
3134                nd->nd_callout_ttdriver->ttys = NULL;
3135
3136                put_tty_driver(nd->nd_callout_ttdriver);
3137                nd->nd_ttdriver_flags &= ~CALLOUT_TTDRV_REG;
3138        }
3139
3140        if (nd->nd_ttdriver_flags & XPRINT_TTDRV_REG) {
3141                tty_unregister_driver(nd->nd_xprint_ttdriver);
3142
3143                kfree(nd->nd_xprint_ttdriver->ttys);
3144                nd->nd_xprint_ttdriver->ttys = NULL;
3145
3146                put_tty_driver(nd->nd_xprint_ttdriver);
3147                nd->nd_ttdriver_flags &= ~XPRINT_TTDRV_REG;
3148        }
3149        for (i = 0; i < CHAN_MAX; i++)
3150                tty_port_destroy(&nd->nd_chan[i].port);
3151}
3152
3153
3154
3155/*
3156 *     Initialize the TTY portion of the supplied node.
3157 */
3158int
3159dgrp_tty_init(struct nd_struct *nd)
3160{
3161        char id[3];
3162        int  rc;
3163        int  i;
3164
3165        ID_TO_CHAR(nd->nd_ID, id);
3166
3167        /*
3168         *  Initialize the TTDRIVER structures.
3169         */
3170
3171        nd->nd_serial_ttdriver = alloc_tty_driver(CHAN_MAX);
3172        if (!nd->nd_serial_ttdriver)
3173                return -ENOMEM;
3174
3175        sprintf(nd->nd_serial_name,  "tty_dgrp_%s_", id);
3176
3177        nd->nd_serial_ttdriver->owner = THIS_MODULE;
3178        nd->nd_serial_ttdriver->name = nd->nd_serial_name;
3179        nd->nd_serial_ttdriver->name_base = 0;
3180        nd->nd_serial_ttdriver->major = 0;
3181        nd->nd_serial_ttdriver->minor_start = 0;
3182        nd->nd_serial_ttdriver->type = TTY_DRIVER_TYPE_SERIAL;
3183        nd->nd_serial_ttdriver->subtype = SERIAL_TYPE_NORMAL;
3184        nd->nd_serial_ttdriver->init_termios = DefaultTermios;
3185        nd->nd_serial_ttdriver->driver_name = "dgrp";
3186        nd->nd_serial_ttdriver->flags = (TTY_DRIVER_REAL_RAW |
3187                                         TTY_DRIVER_DYNAMIC_DEV |
3188                                         TTY_DRIVER_HARDWARE_BREAK);
3189
3190        /* The kernel wants space to store pointers to tty_structs. */
3191        nd->nd_serial_ttdriver->ttys =
3192                kzalloc(CHAN_MAX * sizeof(struct tty_struct *), GFP_KERNEL);
3193        if (!nd->nd_serial_ttdriver->ttys)
3194                return -ENOMEM;
3195
3196        tty_set_operations(nd->nd_serial_ttdriver, &dgrp_tty_ops);
3197
3198        if (!(nd->nd_ttdriver_flags & SERIAL_TTDRV_REG)) {
3199                /*
3200                 *   Register tty devices
3201                 */
3202                rc = tty_register_driver(nd->nd_serial_ttdriver);
3203                if (rc < 0) {
3204                        /*
3205                         * If errno is EBUSY, this means there are no more
3206                         * slots available to have us auto-majored.
3207                         * (Which is currently supported up to 256)
3208                         *
3209                         * We can still request majors above 256,
3210                         * we just have to do it manually.
3211                         */
3212                        if (rc == -EBUSY) {
3213                                int i;
3214                                int max_majors = 1U << (32 - MINORBITS);
3215                                for (i = 256; i < max_majors; i++) {
3216                                        nd->nd_serial_ttdriver->major = i;
3217                                        rc = tty_register_driver
3218                                                (nd->nd_serial_ttdriver);
3219                                        if (rc >= 0)
3220                                                break;
3221                                }
3222                                /* Really fail now, since we ran out
3223                                 * of majors to try. */
3224                                if (i == max_majors)
3225                                        return rc;
3226
3227                        } else {
3228                                return rc;
3229                        }
3230                }
3231                nd->nd_ttdriver_flags |= SERIAL_TTDRV_REG;
3232        }
3233
3234        nd->nd_callout_ttdriver = alloc_tty_driver(CHAN_MAX);
3235        if (!nd->nd_callout_ttdriver)
3236                return -ENOMEM;
3237
3238        sprintf(nd->nd_callout_name, "cu_dgrp_%s_",  id);
3239
3240        nd->nd_callout_ttdriver->owner = THIS_MODULE;
3241        nd->nd_callout_ttdriver->name = nd->nd_callout_name;
3242        nd->nd_callout_ttdriver->name_base = 0;
3243        nd->nd_callout_ttdriver->major = nd->nd_serial_ttdriver->major;
3244        nd->nd_callout_ttdriver->minor_start = 0x40;
3245        nd->nd_callout_ttdriver->type = TTY_DRIVER_TYPE_SERIAL;
3246        nd->nd_callout_ttdriver->subtype = SERIAL_TYPE_CALLOUT;
3247        nd->nd_callout_ttdriver->init_termios = DefaultTermios;
3248        nd->nd_callout_ttdriver->driver_name = "dgrp";
3249        nd->nd_callout_ttdriver->flags = (TTY_DRIVER_REAL_RAW |
3250                                          TTY_DRIVER_DYNAMIC_DEV |
3251                                          TTY_DRIVER_HARDWARE_BREAK);
3252
3253        /* The kernel wants space to store pointers to tty_structs. */
3254        nd->nd_callout_ttdriver->ttys =
3255                kzalloc(CHAN_MAX * sizeof(struct tty_struct *), GFP_KERNEL);
3256        if (!nd->nd_callout_ttdriver->ttys)
3257                return -ENOMEM;
3258
3259        tty_set_operations(nd->nd_callout_ttdriver, &dgrp_tty_ops);
3260
3261        if (dgrp_register_cudevices) {
3262                if (!(nd->nd_ttdriver_flags & CALLOUT_TTDRV_REG)) {
3263                        /*
3264                         *   Register cu devices
3265                         */
3266                        rc = tty_register_driver(nd->nd_callout_ttdriver);
3267                        if (rc < 0)
3268                                return rc;
3269                        nd->nd_ttdriver_flags |= CALLOUT_TTDRV_REG;
3270                }
3271        }
3272
3273
3274        nd->nd_xprint_ttdriver = alloc_tty_driver(CHAN_MAX);
3275        if (!nd->nd_xprint_ttdriver)
3276                return -ENOMEM;
3277
3278        sprintf(nd->nd_xprint_name,  "pr_dgrp_%s_", id);
3279
3280        nd->nd_xprint_ttdriver->owner = THIS_MODULE;
3281        nd->nd_xprint_ttdriver->name = nd->nd_xprint_name;
3282        nd->nd_xprint_ttdriver->name_base = 0;
3283        nd->nd_xprint_ttdriver->major = nd->nd_serial_ttdriver->major;
3284        nd->nd_xprint_ttdriver->minor_start = 0x80;
3285        nd->nd_xprint_ttdriver->type = TTY_DRIVER_TYPE_SERIAL;
3286        nd->nd_xprint_ttdriver->subtype = SERIAL_TYPE_XPRINT;
3287        nd->nd_xprint_ttdriver->init_termios = DefaultTermios;
3288        nd->nd_xprint_ttdriver->driver_name = "dgrp";
3289        nd->nd_xprint_ttdriver->flags = (TTY_DRIVER_REAL_RAW |
3290                                         TTY_DRIVER_DYNAMIC_DEV |
3291                                         TTY_DRIVER_HARDWARE_BREAK);
3292
3293        /* The kernel wants space to store pointers to tty_structs. */
3294        nd->nd_xprint_ttdriver->ttys =
3295                kzalloc(CHAN_MAX * sizeof(struct tty_struct *), GFP_KERNEL);
3296        if (!nd->nd_xprint_ttdriver->ttys)
3297                return -ENOMEM;
3298
3299        tty_set_operations(nd->nd_xprint_ttdriver, &dgrp_tty_ops);
3300
3301        if (dgrp_register_prdevices) {
3302                if (!(nd->nd_ttdriver_flags & XPRINT_TTDRV_REG)) {
3303                        /*
3304                         *   Register transparent print devices
3305                         */
3306                        rc = tty_register_driver(nd->nd_xprint_ttdriver);
3307                        if (rc < 0)
3308                                return rc;
3309                        nd->nd_ttdriver_flags |= XPRINT_TTDRV_REG;
3310                }
3311        }
3312
3313        for (i = 0; i < CHAN_MAX; i++) {
3314                struct ch_struct *ch = nd->nd_chan + i;
3315
3316                ch->ch_nd = nd;
3317                ch->ch_digi = digi_init;
3318                ch->ch_edelay = 100;
3319                ch->ch_custom_speed = 0;
3320                ch->ch_portnum = i;
3321                ch->ch_tun.un_ch = ch;
3322                ch->ch_pun.un_ch = ch;
3323                ch->ch_tun.un_type = SERIAL_TYPE_NORMAL;
3324                ch->ch_pun.un_type = SERIAL_TYPE_XPRINT;
3325
3326                init_waitqueue_head(&(ch->ch_flag_wait));
3327                init_waitqueue_head(&(ch->ch_sleep));
3328
3329                init_waitqueue_head(&(ch->ch_tun.un_open_wait));
3330                init_waitqueue_head(&(ch->ch_tun.un_close_wait));
3331
3332                init_waitqueue_head(&(ch->ch_pun.un_open_wait));
3333                init_waitqueue_head(&(ch->ch_pun.un_close_wait));
3334                tty_port_init(&ch->port);
3335        }
3336        return 0;
3337}
3338