linux/drivers/tty/amiserial.c
<<
>>
Prefs
   1/*
   2 * Serial driver for the amiga builtin port.
   3 *
   4 * This code was created by taking serial.c version 4.30 from kernel
   5 * release 2.3.22, replacing all hardware related stuff with the
   6 * corresponding amiga hardware actions, and removing all irrelevant
   7 * code. As a consequence, it uses many of the constants and names
   8 * associated with the registers and bits of 16550 compatible UARTS -
   9 * but only to keep track of status, etc in the state variables. It
  10 * was done this was to make it easier to keep the code in line with
  11 * (non hardware specific) changes to serial.c.
  12 *
  13 * The port is registered with the tty driver as minor device 64, and
  14 * therefore other ports should should only use 65 upwards.
  15 *
  16 * Richard Lucock 28/12/99
  17 *
  18 *  Copyright (C) 1991, 1992  Linus Torvalds
  19 *  Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 
  20 *              1998, 1999  Theodore Ts'o
  21 *
  22 */
  23
  24/*
  25 * Serial driver configuration section.  Here are the various options:
  26 *
  27 * SERIAL_PARANOIA_CHECK
  28 *              Check the magic number for the async_structure where
  29 *              ever possible.
  30 */
  31
  32#include <linux/delay.h>
  33
  34#undef SERIAL_PARANOIA_CHECK
  35
  36/* Set of debugging defines */
  37
  38#undef SERIAL_DEBUG_INTR
  39#undef SERIAL_DEBUG_OPEN
  40#undef SERIAL_DEBUG_FLOW
  41#undef SERIAL_DEBUG_RS_WAIT_UNTIL_SENT
  42
  43/* Sanity checks */
  44
  45#if defined(MODULE) && defined(SERIAL_DEBUG_MCOUNT)
  46#define DBG_CNT(s) printk("(%s): [%x] refc=%d, serc=%d, ttyc=%d -> %s\n", \
  47 tty->name, (info->tport.flags), serial_driver->refcount,info->count,tty->count,s)
  48#else
  49#define DBG_CNT(s)
  50#endif
  51
  52/*
  53 * End of serial driver configuration section.
  54 */
  55
  56#include <linux/module.h>
  57
  58#include <linux/types.h>
  59#include <linux/serial.h>
  60#include <linux/serial_reg.h>
  61static char *serial_version = "4.30";
  62
  63#include <linux/errno.h>
  64#include <linux/signal.h>
  65#include <linux/sched.h>
  66#include <linux/kernel.h>
  67#include <linux/timer.h>
  68#include <linux/interrupt.h>
  69#include <linux/tty.h>
  70#include <linux/tty_flip.h>
  71#include <linux/circ_buf.h>
  72#include <linux/console.h>
  73#include <linux/major.h>
  74#include <linux/string.h>
  75#include <linux/fcntl.h>
  76#include <linux/ptrace.h>
  77#include <linux/ioport.h>
  78#include <linux/mm.h>
  79#include <linux/seq_file.h>
  80#include <linux/slab.h>
  81#include <linux/init.h>
  82#include <linux/bitops.h>
  83#include <linux/platform_device.h>
  84
  85#include <asm/setup.h>
  86
  87
  88#include <asm/irq.h>
  89
  90#include <asm/amigahw.h>
  91#include <asm/amigaints.h>
  92
  93struct serial_state {
  94        struct tty_port         tport;
  95        struct circ_buf         xmit;
  96        struct async_icount     icount;
  97
  98        unsigned long           port;
  99        int                     baud_base;
 100        int                     xmit_fifo_size;
 101        int                     custom_divisor;
 102        int                     read_status_mask;
 103        int                     ignore_status_mask;
 104        int                     timeout;
 105        int                     quot;
 106        int                     IER;    /* Interrupt Enable Register */
 107        int                     MCR;    /* Modem control register */
 108        int                     x_char; /* xon/xoff character */
 109};
 110
 111#define custom amiga_custom
 112static char *serial_name = "Amiga-builtin serial driver";
 113
 114static struct tty_driver *serial_driver;
 115
 116/* number of characters left in xmit buffer before we ask for more */
 117#define WAKEUP_CHARS 256
 118
 119static unsigned char current_ctl_bits;
 120
 121static void change_speed(struct tty_struct *tty, struct serial_state *info,
 122                struct ktermios *old);
 123static void rs_wait_until_sent(struct tty_struct *tty, int timeout);
 124
 125
 126static struct serial_state rs_table[1];
 127
 128#define NR_PORTS ARRAY_SIZE(rs_table)
 129
 130#include <asm/uaccess.h>
 131
 132#define serial_isroot() (capable(CAP_SYS_ADMIN))
 133
 134
 135static inline int serial_paranoia_check(struct serial_state *info,
 136                                        char *name, const char *routine)
 137{
 138#ifdef SERIAL_PARANOIA_CHECK
 139        static const char *badmagic =
 140                "Warning: bad magic number for serial struct (%s) in %s\n";
 141        static const char *badinfo =
 142                "Warning: null async_struct for (%s) in %s\n";
 143
 144        if (!info) {
 145                printk(badinfo, name, routine);
 146                return 1;
 147        }
 148        if (info->magic != SERIAL_MAGIC) {
 149                printk(badmagic, name, routine);
 150                return 1;
 151        }
 152#endif
 153        return 0;
 154}
 155
 156/* some serial hardware definitions */
 157#define SDR_OVRUN   (1<<15)
 158#define SDR_RBF     (1<<14)
 159#define SDR_TBE     (1<<13)
 160#define SDR_TSRE    (1<<12)
 161
 162#define SERPER_PARENB    (1<<15)
 163
 164#define AC_SETCLR   (1<<15)
 165#define AC_UARTBRK  (1<<11)
 166
 167#define SER_DTR     (1<<7)
 168#define SER_RTS     (1<<6)
 169#define SER_DCD     (1<<5)
 170#define SER_CTS     (1<<4)
 171#define SER_DSR     (1<<3)
 172
 173static __inline__ void rtsdtr_ctrl(int bits)
 174{
 175    ciab.pra = ((bits & (SER_RTS | SER_DTR)) ^ (SER_RTS | SER_DTR)) | (ciab.pra & ~(SER_RTS | SER_DTR));
 176}
 177
 178/*
 179 * ------------------------------------------------------------
 180 * rs_stop() and rs_start()
 181 *
 182 * This routines are called before setting or resetting tty->stopped.
 183 * They enable or disable transmitter interrupts, as necessary.
 184 * ------------------------------------------------------------
 185 */
 186static void rs_stop(struct tty_struct *tty)
 187{
 188        struct serial_state *info = tty->driver_data;
 189        unsigned long flags;
 190
 191        if (serial_paranoia_check(info, tty->name, "rs_stop"))
 192                return;
 193
 194        local_irq_save(flags);
 195        if (info->IER & UART_IER_THRI) {
 196                info->IER &= ~UART_IER_THRI;
 197                /* disable Tx interrupt and remove any pending interrupts */
 198                custom.intena = IF_TBE;
 199                mb();
 200                custom.intreq = IF_TBE;
 201                mb();
 202        }
 203        local_irq_restore(flags);
 204}
 205
 206static void rs_start(struct tty_struct *tty)
 207{
 208        struct serial_state *info = tty->driver_data;
 209        unsigned long flags;
 210
 211        if (serial_paranoia_check(info, tty->name, "rs_start"))
 212                return;
 213
 214        local_irq_save(flags);
 215        if (info->xmit.head != info->xmit.tail
 216            && info->xmit.buf
 217            && !(info->IER & UART_IER_THRI)) {
 218                info->IER |= UART_IER_THRI;
 219                custom.intena = IF_SETCLR | IF_TBE;
 220                mb();
 221                /* set a pending Tx Interrupt, transmitter should restart now */
 222                custom.intreq = IF_SETCLR | IF_TBE;
 223                mb();
 224        }
 225        local_irq_restore(flags);
 226}
 227
 228/*
 229 * ----------------------------------------------------------------------
 230 *
 231 * Here starts the interrupt handling routines.  All of the following
 232 * subroutines are declared as inline and are folded into
 233 * rs_interrupt().  They were separated out for readability's sake.
 234 *
 235 * Note: rs_interrupt() is a "fast" interrupt, which means that it
 236 * runs with interrupts turned off.  People who may want to modify
 237 * rs_interrupt() should try to keep the interrupt handler as fast as
 238 * possible.  After you are done making modifications, it is not a bad
 239 * idea to do:
 240 * 
 241 * gcc -S -DKERNEL -Wall -Wstrict-prototypes -O6 -fomit-frame-pointer serial.c
 242 *
 243 * and look at the resulting assemble code in serial.s.
 244 *
 245 *                              - Ted Ts'o (tytso@mit.edu), 7-Mar-93
 246 * -----------------------------------------------------------------------
 247 */
 248
 249static void receive_chars(struct serial_state *info)
 250{
 251        int status;
 252        int serdatr;
 253        unsigned char ch, flag;
 254        struct  async_icount *icount;
 255        int oe = 0;
 256
 257        icount = &info->icount;
 258
 259        status = UART_LSR_DR; /* We obviously have a character! */
 260        serdatr = custom.serdatr;
 261        mb();
 262        custom.intreq = IF_RBF;
 263        mb();
 264
 265        if((serdatr & 0x1ff) == 0)
 266            status |= UART_LSR_BI;
 267        if(serdatr & SDR_OVRUN)
 268            status |= UART_LSR_OE;
 269
 270        ch = serdatr & 0xff;
 271        icount->rx++;
 272
 273#ifdef SERIAL_DEBUG_INTR
 274        printk("DR%02x:%02x...", ch, status);
 275#endif
 276        flag = TTY_NORMAL;
 277
 278        /*
 279         * We don't handle parity or frame errors - but I have left
 280         * the code in, since I'm not sure that the errors can't be
 281         * detected.
 282         */
 283
 284        if (status & (UART_LSR_BI | UART_LSR_PE |
 285                      UART_LSR_FE | UART_LSR_OE)) {
 286          /*
 287           * For statistics only
 288           */
 289          if (status & UART_LSR_BI) {
 290            status &= ~(UART_LSR_FE | UART_LSR_PE);
 291            icount->brk++;
 292          } else if (status & UART_LSR_PE)
 293            icount->parity++;
 294          else if (status & UART_LSR_FE)
 295            icount->frame++;
 296          if (status & UART_LSR_OE)
 297            icount->overrun++;
 298
 299          /*
 300           * Now check to see if character should be
 301           * ignored, and mask off conditions which
 302           * should be ignored.
 303           */
 304          if (status & info->ignore_status_mask)
 305            goto out;
 306
 307          status &= info->read_status_mask;
 308
 309          if (status & (UART_LSR_BI)) {
 310#ifdef SERIAL_DEBUG_INTR
 311            printk("handling break....");
 312#endif
 313            flag = TTY_BREAK;
 314            if (info->tport.flags & ASYNC_SAK)
 315              do_SAK(info->tport.tty);
 316          } else if (status & UART_LSR_PE)
 317            flag = TTY_PARITY;
 318          else if (status & UART_LSR_FE)
 319            flag = TTY_FRAME;
 320          if (status & UART_LSR_OE) {
 321            /*
 322             * Overrun is special, since it's
 323             * reported immediately, and doesn't
 324             * affect the current character
 325             */
 326             oe = 1;
 327          }
 328        }
 329        tty_insert_flip_char(&info->tport, ch, flag);
 330        if (oe == 1)
 331                tty_insert_flip_char(&info->tport, 0, TTY_OVERRUN);
 332        tty_flip_buffer_push(&info->tport);
 333out:
 334        return;
 335}
 336
 337static void transmit_chars(struct serial_state *info)
 338{
 339        custom.intreq = IF_TBE;
 340        mb();
 341        if (info->x_char) {
 342                custom.serdat = info->x_char | 0x100;
 343                mb();
 344                info->icount.tx++;
 345                info->x_char = 0;
 346                return;
 347        }
 348        if (info->xmit.head == info->xmit.tail
 349            || info->tport.tty->stopped
 350            || info->tport.tty->hw_stopped) {
 351                info->IER &= ~UART_IER_THRI;
 352                custom.intena = IF_TBE;
 353                mb();
 354                return;
 355        }
 356
 357        custom.serdat = info->xmit.buf[info->xmit.tail++] | 0x100;
 358        mb();
 359        info->xmit.tail = info->xmit.tail & (SERIAL_XMIT_SIZE-1);
 360        info->icount.tx++;
 361
 362        if (CIRC_CNT(info->xmit.head,
 363                     info->xmit.tail,
 364                     SERIAL_XMIT_SIZE) < WAKEUP_CHARS)
 365                tty_wakeup(info->tport.tty);
 366
 367#ifdef SERIAL_DEBUG_INTR
 368        printk("THRE...");
 369#endif
 370        if (info->xmit.head == info->xmit.tail) {
 371                custom.intena = IF_TBE;
 372                mb();
 373                info->IER &= ~UART_IER_THRI;
 374        }
 375}
 376
 377static void check_modem_status(struct serial_state *info)
 378{
 379        struct tty_port *port = &info->tport;
 380        unsigned char status = ciab.pra & (SER_DCD | SER_CTS | SER_DSR);
 381        unsigned char dstatus;
 382        struct  async_icount *icount;
 383
 384        /* Determine bits that have changed */
 385        dstatus = status ^ current_ctl_bits;
 386        current_ctl_bits = status;
 387
 388        if (dstatus) {
 389                icount = &info->icount;
 390                /* update input line counters */
 391                if (dstatus & SER_DSR)
 392                        icount->dsr++;
 393                if (dstatus & SER_DCD) {
 394                        icount->dcd++;
 395                }
 396                if (dstatus & SER_CTS)
 397                        icount->cts++;
 398                wake_up_interruptible(&port->delta_msr_wait);
 399        }
 400
 401        if (tty_port_check_carrier(port) && (dstatus & SER_DCD)) {
 402#if (defined(SERIAL_DEBUG_OPEN) || defined(SERIAL_DEBUG_INTR))
 403                printk("ttyS%d CD now %s...", info->line,
 404                       (!(status & SER_DCD)) ? "on" : "off");
 405#endif
 406                if (!(status & SER_DCD))
 407                        wake_up_interruptible(&port->open_wait);
 408                else {
 409#ifdef SERIAL_DEBUG_OPEN
 410                        printk("doing serial hangup...");
 411#endif
 412                        if (port->tty)
 413                                tty_hangup(port->tty);
 414                }
 415        }
 416        if (tty_port_cts_enabled(port)) {
 417                if (port->tty->hw_stopped) {
 418                        if (!(status & SER_CTS)) {
 419#if (defined(SERIAL_DEBUG_INTR) || defined(SERIAL_DEBUG_FLOW))
 420                                printk("CTS tx start...");
 421#endif
 422                                port->tty->hw_stopped = 0;
 423                                info->IER |= UART_IER_THRI;
 424                                custom.intena = IF_SETCLR | IF_TBE;
 425                                mb();
 426                                /* set a pending Tx Interrupt, transmitter should restart now */
 427                                custom.intreq = IF_SETCLR | IF_TBE;
 428                                mb();
 429                                tty_wakeup(port->tty);
 430                                return;
 431                        }
 432                } else {
 433                        if ((status & SER_CTS)) {
 434#if (defined(SERIAL_DEBUG_INTR) || defined(SERIAL_DEBUG_FLOW))
 435                                printk("CTS tx stop...");
 436#endif
 437                                port->tty->hw_stopped = 1;
 438                                info->IER &= ~UART_IER_THRI;
 439                                /* disable Tx interrupt and remove any pending interrupts */
 440                                custom.intena = IF_TBE;
 441                                mb();
 442                                custom.intreq = IF_TBE;
 443                                mb();
 444                        }
 445                }
 446        }
 447}
 448
 449static irqreturn_t ser_vbl_int( int irq, void *data)
 450{
 451        /* vbl is just a periodic interrupt we tie into to update modem status */
 452        struct serial_state *info = data;
 453        /*
 454         * TBD - is it better to unregister from this interrupt or to
 455         * ignore it if MSI is clear ?
 456         */
 457        if(info->IER & UART_IER_MSI)
 458          check_modem_status(info);
 459        return IRQ_HANDLED;
 460}
 461
 462static irqreturn_t ser_rx_int(int irq, void *dev_id)
 463{
 464        struct serial_state *info = dev_id;
 465
 466#ifdef SERIAL_DEBUG_INTR
 467        printk("ser_rx_int...");
 468#endif
 469
 470        if (!info->tport.tty)
 471                return IRQ_NONE;
 472
 473        receive_chars(info);
 474#ifdef SERIAL_DEBUG_INTR
 475        printk("end.\n");
 476#endif
 477        return IRQ_HANDLED;
 478}
 479
 480static irqreturn_t ser_tx_int(int irq, void *dev_id)
 481{
 482        struct serial_state *info = dev_id;
 483
 484        if (custom.serdatr & SDR_TBE) {
 485#ifdef SERIAL_DEBUG_INTR
 486          printk("ser_tx_int...");
 487#endif
 488
 489          if (!info->tport.tty)
 490                return IRQ_NONE;
 491
 492          transmit_chars(info);
 493#ifdef SERIAL_DEBUG_INTR
 494          printk("end.\n");
 495#endif
 496        }
 497        return IRQ_HANDLED;
 498}
 499
 500/*
 501 * -------------------------------------------------------------------
 502 * Here ends the serial interrupt routines.
 503 * -------------------------------------------------------------------
 504 */
 505
 506/*
 507 * ---------------------------------------------------------------
 508 * Low level utility subroutines for the serial driver:  routines to
 509 * figure out the appropriate timeout for an interrupt chain, routines
 510 * to initialize and startup a serial port, and routines to shutdown a
 511 * serial port.  Useful stuff like that.
 512 * ---------------------------------------------------------------
 513 */
 514
 515static int startup(struct tty_struct *tty, struct serial_state *info)
 516{
 517        struct tty_port *port = &info->tport;
 518        unsigned long flags;
 519        int     retval=0;
 520        unsigned long page;
 521
 522        page = get_zeroed_page(GFP_KERNEL);
 523        if (!page)
 524                return -ENOMEM;
 525
 526        local_irq_save(flags);
 527
 528        if (tty_port_initialized(port)) {
 529                free_page(page);
 530                goto errout;
 531        }
 532
 533        if (info->xmit.buf)
 534                free_page(page);
 535        else
 536                info->xmit.buf = (unsigned char *) page;
 537
 538#ifdef SERIAL_DEBUG_OPEN
 539        printk("starting up ttys%d ...", info->line);
 540#endif
 541
 542        /* Clear anything in the input buffer */
 543
 544        custom.intreq = IF_RBF;
 545        mb();
 546
 547        retval = request_irq(IRQ_AMIGA_VERTB, ser_vbl_int, 0, "serial status", info);
 548        if (retval) {
 549          if (serial_isroot()) {
 550              set_bit(TTY_IO_ERROR, &tty->flags);
 551            retval = 0;
 552          }
 553          goto errout;
 554        }
 555
 556        /* enable both Rx and Tx interrupts */
 557        custom.intena = IF_SETCLR | IF_RBF | IF_TBE;
 558        mb();
 559        info->IER = UART_IER_MSI;
 560
 561        /* remember current state of the DCD and CTS bits */
 562        current_ctl_bits = ciab.pra & (SER_DCD | SER_CTS | SER_DSR);
 563
 564        info->MCR = 0;
 565        if (C_BAUD(tty))
 566          info->MCR = SER_DTR | SER_RTS;
 567        rtsdtr_ctrl(info->MCR);
 568
 569        clear_bit(TTY_IO_ERROR, &tty->flags);
 570        info->xmit.head = info->xmit.tail = 0;
 571
 572        /*
 573         * Set up the tty->alt_speed kludge
 574         */
 575        if ((port->flags & ASYNC_SPD_MASK) == ASYNC_SPD_HI)
 576                tty->alt_speed = 57600;
 577        if ((port->flags & ASYNC_SPD_MASK) == ASYNC_SPD_VHI)
 578                tty->alt_speed = 115200;
 579        if ((port->flags & ASYNC_SPD_MASK) == ASYNC_SPD_SHI)
 580                tty->alt_speed = 230400;
 581        if ((port->flags & ASYNC_SPD_MASK) == ASYNC_SPD_WARP)
 582                tty->alt_speed = 460800;
 583
 584        /*
 585         * and set the speed of the serial port
 586         */
 587        change_speed(tty, info, NULL);
 588
 589        tty_port_set_initialized(port, 1);
 590        local_irq_restore(flags);
 591        return 0;
 592
 593errout:
 594        local_irq_restore(flags);
 595        return retval;
 596}
 597
 598/*
 599 * This routine will shutdown a serial port; interrupts are disabled, and
 600 * DTR is dropped if the hangup on close termio flag is on.
 601 */
 602static void shutdown(struct tty_struct *tty, struct serial_state *info)
 603{
 604        unsigned long   flags;
 605        struct serial_state *state;
 606
 607        if (!tty_port_initialized(&info->tport))
 608                return;
 609
 610        state = info;
 611
 612#ifdef SERIAL_DEBUG_OPEN
 613        printk("Shutting down serial port %d ....\n", info->line);
 614#endif
 615
 616        local_irq_save(flags); /* Disable interrupts */
 617
 618        /*
 619         * clear delta_msr_wait queue to avoid mem leaks: we may free the irq
 620         * here so the queue might never be waken up
 621         */
 622        wake_up_interruptible(&info->tport.delta_msr_wait);
 623
 624        /*
 625         * Free the IRQ, if necessary
 626         */
 627        free_irq(IRQ_AMIGA_VERTB, info);
 628
 629        if (info->xmit.buf) {
 630                free_page((unsigned long) info->xmit.buf);
 631                info->xmit.buf = NULL;
 632        }
 633
 634        info->IER = 0;
 635        custom.intena = IF_RBF | IF_TBE;
 636        mb();
 637
 638        /* disable break condition */
 639        custom.adkcon = AC_UARTBRK;
 640        mb();
 641
 642        if (C_HUPCL(tty))
 643                info->MCR &= ~(SER_DTR|SER_RTS);
 644        rtsdtr_ctrl(info->MCR);
 645
 646        set_bit(TTY_IO_ERROR, &tty->flags);
 647
 648        tty_port_set_initialized(&info->tport, 0);
 649        local_irq_restore(flags);
 650}
 651
 652
 653/*
 654 * This routine is called to set the UART divisor registers to match
 655 * the specified baud rate for a serial port.
 656 */
 657static void change_speed(struct tty_struct *tty, struct serial_state *info,
 658                         struct ktermios *old_termios)
 659{
 660        struct tty_port *port = &info->tport;
 661        int     quot = 0, baud_base, baud;
 662        unsigned cflag, cval = 0;
 663        int     bits;
 664        unsigned long   flags;
 665
 666        cflag = tty->termios.c_cflag;
 667
 668        /* Byte size is always 8 bits plus parity bit if requested */
 669
 670        cval = 3; bits = 10;
 671        if (cflag & CSTOPB) {
 672                cval |= 0x04;
 673                bits++;
 674        }
 675        if (cflag & PARENB) {
 676                cval |= UART_LCR_PARITY;
 677                bits++;
 678        }
 679        if (!(cflag & PARODD))
 680                cval |= UART_LCR_EPAR;
 681#ifdef CMSPAR
 682        if (cflag & CMSPAR)
 683                cval |= UART_LCR_SPAR;
 684#endif
 685
 686        /* Determine divisor based on baud rate */
 687        baud = tty_get_baud_rate(tty);
 688        if (!baud)
 689                baud = 9600;    /* B0 transition handled in rs_set_termios */
 690        baud_base = info->baud_base;
 691        if (baud == 38400 && (port->flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST)
 692                quot = info->custom_divisor;
 693        else {
 694                if (baud == 134)
 695                        /* Special case since 134 is really 134.5 */
 696                        quot = (2*baud_base / 269);
 697                else if (baud)
 698                        quot = baud_base / baud;
 699        }
 700        /* If the quotient is zero refuse the change */
 701        if (!quot && old_termios) {
 702                /* FIXME: Will need updating for new tty in the end */
 703                tty->termios.c_cflag &= ~CBAUD;
 704                tty->termios.c_cflag |= (old_termios->c_cflag & CBAUD);
 705                baud = tty_get_baud_rate(tty);
 706                if (!baud)
 707                        baud = 9600;
 708                if (baud == 38400 &&
 709                    (port->flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST)
 710                        quot = info->custom_divisor;
 711                else {
 712                        if (baud == 134)
 713                                /* Special case since 134 is really 134.5 */
 714                                quot = (2*baud_base / 269);
 715                        else if (baud)
 716                                quot = baud_base / baud;
 717                }
 718        }
 719        /* As a last resort, if the quotient is zero, default to 9600 bps */
 720        if (!quot)
 721                quot = baud_base / 9600;
 722        info->quot = quot;
 723        info->timeout = ((info->xmit_fifo_size*HZ*bits*quot) / baud_base);
 724        info->timeout += HZ/50;         /* Add .02 seconds of slop */
 725
 726        /* CTS flow control flag and modem status interrupts */
 727        info->IER &= ~UART_IER_MSI;
 728        if (port->flags & ASYNC_HARDPPS_CD)
 729                info->IER |= UART_IER_MSI;
 730        tty_port_set_cts_flow(port, cflag & CRTSCTS);
 731        if (cflag & CRTSCTS)
 732                info->IER |= UART_IER_MSI;
 733        tty_port_set_check_carrier(port, ~cflag & CLOCAL);
 734        if (~cflag & CLOCAL)
 735                info->IER |= UART_IER_MSI;
 736        /* TBD:
 737         * Does clearing IER_MSI imply that we should disable the VBL interrupt ?
 738         */
 739
 740        /*
 741         * Set up parity check flag
 742         */
 743
 744        info->read_status_mask = UART_LSR_OE | UART_LSR_DR;
 745        if (I_INPCK(tty))
 746                info->read_status_mask |= UART_LSR_FE | UART_LSR_PE;
 747        if (I_BRKINT(tty) || I_PARMRK(tty))
 748                info->read_status_mask |= UART_LSR_BI;
 749
 750        /*
 751         * Characters to ignore
 752         */
 753        info->ignore_status_mask = 0;
 754        if (I_IGNPAR(tty))
 755                info->ignore_status_mask |= UART_LSR_PE | UART_LSR_FE;
 756        if (I_IGNBRK(tty)) {
 757                info->ignore_status_mask |= UART_LSR_BI;
 758                /*
 759                 * If we're ignore parity and break indicators, ignore 
 760                 * overruns too.  (For real raw support).
 761                 */
 762                if (I_IGNPAR(tty))
 763                        info->ignore_status_mask |= UART_LSR_OE;
 764        }
 765        /*
 766         * !!! ignore all characters if CREAD is not set
 767         */
 768        if ((cflag & CREAD) == 0)
 769                info->ignore_status_mask |= UART_LSR_DR;
 770        local_irq_save(flags);
 771
 772        {
 773          short serper;
 774
 775        /* Set up the baud rate */
 776          serper = quot - 1;
 777
 778        /* Enable or disable parity bit */
 779
 780        if(cval & UART_LCR_PARITY)
 781          serper |= (SERPER_PARENB);
 782
 783        custom.serper = serper;
 784        mb();
 785        }
 786
 787        local_irq_restore(flags);
 788}
 789
 790static int rs_put_char(struct tty_struct *tty, unsigned char ch)
 791{
 792        struct serial_state *info;
 793        unsigned long flags;
 794
 795        info = tty->driver_data;
 796
 797        if (serial_paranoia_check(info, tty->name, "rs_put_char"))
 798                return 0;
 799
 800        if (!info->xmit.buf)
 801                return 0;
 802
 803        local_irq_save(flags);
 804        if (CIRC_SPACE(info->xmit.head,
 805                       info->xmit.tail,
 806                       SERIAL_XMIT_SIZE) == 0) {
 807                local_irq_restore(flags);
 808                return 0;
 809        }
 810
 811        info->xmit.buf[info->xmit.head++] = ch;
 812        info->xmit.head &= SERIAL_XMIT_SIZE-1;
 813        local_irq_restore(flags);
 814        return 1;
 815}
 816
 817static void rs_flush_chars(struct tty_struct *tty)
 818{
 819        struct serial_state *info = tty->driver_data;
 820        unsigned long flags;
 821
 822        if (serial_paranoia_check(info, tty->name, "rs_flush_chars"))
 823                return;
 824
 825        if (info->xmit.head == info->xmit.tail
 826            || tty->stopped
 827            || tty->hw_stopped
 828            || !info->xmit.buf)
 829                return;
 830
 831        local_irq_save(flags);
 832        info->IER |= UART_IER_THRI;
 833        custom.intena = IF_SETCLR | IF_TBE;
 834        mb();
 835        /* set a pending Tx Interrupt, transmitter should restart now */
 836        custom.intreq = IF_SETCLR | IF_TBE;
 837        mb();
 838        local_irq_restore(flags);
 839}
 840
 841static int rs_write(struct tty_struct * tty, const unsigned char *buf, int count)
 842{
 843        int     c, ret = 0;
 844        struct serial_state *info = tty->driver_data;
 845        unsigned long flags;
 846
 847        if (serial_paranoia_check(info, tty->name, "rs_write"))
 848                return 0;
 849
 850        if (!info->xmit.buf)
 851                return 0;
 852
 853        local_irq_save(flags);
 854        while (1) {
 855                c = CIRC_SPACE_TO_END(info->xmit.head,
 856                                      info->xmit.tail,
 857                                      SERIAL_XMIT_SIZE);
 858                if (count < c)
 859                        c = count;
 860                if (c <= 0) {
 861                        break;
 862                }
 863                memcpy(info->xmit.buf + info->xmit.head, buf, c);
 864                info->xmit.head = ((info->xmit.head + c) &
 865                                   (SERIAL_XMIT_SIZE-1));
 866                buf += c;
 867                count -= c;
 868                ret += c;
 869        }
 870        local_irq_restore(flags);
 871
 872        if (info->xmit.head != info->xmit.tail
 873            && !tty->stopped
 874            && !tty->hw_stopped
 875            && !(info->IER & UART_IER_THRI)) {
 876                info->IER |= UART_IER_THRI;
 877                local_irq_disable();
 878                custom.intena = IF_SETCLR | IF_TBE;
 879                mb();
 880                /* set a pending Tx Interrupt, transmitter should restart now */
 881                custom.intreq = IF_SETCLR | IF_TBE;
 882                mb();
 883                local_irq_restore(flags);
 884        }
 885        return ret;
 886}
 887
 888static int rs_write_room(struct tty_struct *tty)
 889{
 890        struct serial_state *info = tty->driver_data;
 891
 892        if (serial_paranoia_check(info, tty->name, "rs_write_room"))
 893                return 0;
 894        return CIRC_SPACE(info->xmit.head, info->xmit.tail, SERIAL_XMIT_SIZE);
 895}
 896
 897static int rs_chars_in_buffer(struct tty_struct *tty)
 898{
 899        struct serial_state *info = tty->driver_data;
 900
 901        if (serial_paranoia_check(info, tty->name, "rs_chars_in_buffer"))
 902                return 0;
 903        return CIRC_CNT(info->xmit.head, info->xmit.tail, SERIAL_XMIT_SIZE);
 904}
 905
 906static void rs_flush_buffer(struct tty_struct *tty)
 907{
 908        struct serial_state *info = tty->driver_data;
 909        unsigned long flags;
 910
 911        if (serial_paranoia_check(info, tty->name, "rs_flush_buffer"))
 912                return;
 913        local_irq_save(flags);
 914        info->xmit.head = info->xmit.tail = 0;
 915        local_irq_restore(flags);
 916        tty_wakeup(tty);
 917}
 918
 919/*
 920 * This function is used to send a high-priority XON/XOFF character to
 921 * the device
 922 */
 923static void rs_send_xchar(struct tty_struct *tty, char ch)
 924{
 925        struct serial_state *info = tty->driver_data;
 926        unsigned long flags;
 927
 928        if (serial_paranoia_check(info, tty->name, "rs_send_xchar"))
 929                return;
 930
 931        info->x_char = ch;
 932        if (ch) {
 933                /* Make sure transmit interrupts are on */
 934
 935                /* Check this ! */
 936                local_irq_save(flags);
 937                if(!(custom.intenar & IF_TBE)) {
 938                    custom.intena = IF_SETCLR | IF_TBE;
 939                    mb();
 940                    /* set a pending Tx Interrupt, transmitter should restart now */
 941                    custom.intreq = IF_SETCLR | IF_TBE;
 942                    mb();
 943                }
 944                local_irq_restore(flags);
 945
 946                info->IER |= UART_IER_THRI;
 947        }
 948}
 949
 950/*
 951 * ------------------------------------------------------------
 952 * rs_throttle()
 953 * 
 954 * This routine is called by the upper-layer tty layer to signal that
 955 * incoming characters should be throttled.
 956 * ------------------------------------------------------------
 957 */
 958static void rs_throttle(struct tty_struct * tty)
 959{
 960        struct serial_state *info = tty->driver_data;
 961        unsigned long flags;
 962#ifdef SERIAL_DEBUG_THROTTLE
 963        printk("throttle %s ....\n", tty_name(tty));
 964#endif
 965
 966        if (serial_paranoia_check(info, tty->name, "rs_throttle"))
 967                return;
 968
 969        if (I_IXOFF(tty))
 970                rs_send_xchar(tty, STOP_CHAR(tty));
 971
 972        if (C_CRTSCTS(tty))
 973                info->MCR &= ~SER_RTS;
 974
 975        local_irq_save(flags);
 976        rtsdtr_ctrl(info->MCR);
 977        local_irq_restore(flags);
 978}
 979
 980static void rs_unthrottle(struct tty_struct * tty)
 981{
 982        struct serial_state *info = tty->driver_data;
 983        unsigned long flags;
 984#ifdef SERIAL_DEBUG_THROTTLE
 985        printk("unthrottle %s ....\n", tty_name(tty));
 986#endif
 987
 988        if (serial_paranoia_check(info, tty->name, "rs_unthrottle"))
 989                return;
 990
 991        if (I_IXOFF(tty)) {
 992                if (info->x_char)
 993                        info->x_char = 0;
 994                else
 995                        rs_send_xchar(tty, START_CHAR(tty));
 996        }
 997        if (C_CRTSCTS(tty))
 998                info->MCR |= SER_RTS;
 999        local_irq_save(flags);
1000        rtsdtr_ctrl(info->MCR);
1001        local_irq_restore(flags);
1002}
1003
1004/*
1005 * ------------------------------------------------------------
1006 * rs_ioctl() and friends
1007 * ------------------------------------------------------------
1008 */
1009
1010static int get_serial_info(struct tty_struct *tty, struct serial_state *state,
1011                           struct serial_struct __user * retinfo)
1012{
1013        struct serial_struct tmp;
1014   
1015        if (!retinfo)
1016                return -EFAULT;
1017        memset(&tmp, 0, sizeof(tmp));
1018        tty_lock(tty);
1019        tmp.line = tty->index;
1020        tmp.port = state->port;
1021        tmp.flags = state->tport.flags;
1022        tmp.xmit_fifo_size = state->xmit_fifo_size;
1023        tmp.baud_base = state->baud_base;
1024        tmp.close_delay = state->tport.close_delay;
1025        tmp.closing_wait = state->tport.closing_wait;
1026        tmp.custom_divisor = state->custom_divisor;
1027        tty_unlock(tty);
1028        if (copy_to_user(retinfo,&tmp,sizeof(*retinfo)))
1029                return -EFAULT;
1030        return 0;
1031}
1032
1033static int set_serial_info(struct tty_struct *tty, struct serial_state *state,
1034                           struct serial_struct __user * new_info)
1035{
1036        struct tty_port *port = &state->tport;
1037        struct serial_struct new_serial;
1038        bool change_spd;
1039        int                     retval = 0;
1040
1041        if (copy_from_user(&new_serial,new_info,sizeof(new_serial)))
1042                return -EFAULT;
1043
1044        tty_lock(tty);
1045        change_spd = ((new_serial.flags ^ port->flags) & ASYNC_SPD_MASK) ||
1046                new_serial.custom_divisor != state->custom_divisor;
1047        if (new_serial.irq || new_serial.port != state->port ||
1048                        new_serial.xmit_fifo_size != state->xmit_fifo_size) {
1049                tty_unlock(tty);
1050                return -EINVAL;
1051        }
1052  
1053        if (!serial_isroot()) {
1054                if ((new_serial.baud_base != state->baud_base) ||
1055                    (new_serial.close_delay != port->close_delay) ||
1056                    (new_serial.xmit_fifo_size != state->xmit_fifo_size) ||
1057                    ((new_serial.flags & ~ASYNC_USR_MASK) !=
1058                     (port->flags & ~ASYNC_USR_MASK))) {
1059                        tty_unlock(tty);
1060                        return -EPERM;
1061                }
1062                port->flags = ((port->flags & ~ASYNC_USR_MASK) |
1063                               (new_serial.flags & ASYNC_USR_MASK));
1064                state->custom_divisor = new_serial.custom_divisor;
1065                goto check_and_exit;
1066        }
1067
1068        if (new_serial.baud_base < 9600) {
1069                tty_unlock(tty);
1070                return -EINVAL;
1071        }
1072
1073        /*
1074         * OK, past this point, all the error checking has been done.
1075         * At this point, we start making changes.....
1076         */
1077
1078        state->baud_base = new_serial.baud_base;
1079        port->flags = ((port->flags & ~ASYNC_FLAGS) |
1080                        (new_serial.flags & ASYNC_FLAGS));
1081        state->custom_divisor = new_serial.custom_divisor;
1082        port->close_delay = new_serial.close_delay * HZ/100;
1083        port->closing_wait = new_serial.closing_wait * HZ/100;
1084        port->low_latency = (port->flags & ASYNC_LOW_LATENCY) ? 1 : 0;
1085
1086check_and_exit:
1087        if (tty_port_initialized(port)) {
1088                if (change_spd) {
1089                        if ((port->flags & ASYNC_SPD_MASK) == ASYNC_SPD_HI)
1090                                tty->alt_speed = 57600;
1091                        if ((port->flags & ASYNC_SPD_MASK) == ASYNC_SPD_VHI)
1092                                tty->alt_speed = 115200;
1093                        if ((port->flags & ASYNC_SPD_MASK) == ASYNC_SPD_SHI)
1094                                tty->alt_speed = 230400;
1095                        if ((port->flags & ASYNC_SPD_MASK) == ASYNC_SPD_WARP)
1096                                tty->alt_speed = 460800;
1097                        change_speed(tty, state, NULL);
1098                }
1099        } else
1100                retval = startup(tty, state);
1101        tty_unlock(tty);
1102        return retval;
1103}
1104
1105
1106/*
1107 * get_lsr_info - get line status register info
1108 *
1109 * Purpose: Let user call ioctl() to get info when the UART physically
1110 *          is emptied.  On bus types like RS485, the transmitter must
1111 *          release the bus after transmitting. This must be done when
1112 *          the transmit shift register is empty, not be done when the
1113 *          transmit holding register is empty.  This functionality
1114 *          allows an RS485 driver to be written in user space. 
1115 */
1116static int get_lsr_info(struct serial_state *info, unsigned int __user *value)
1117{
1118        unsigned char status;
1119        unsigned int result;
1120        unsigned long flags;
1121
1122        local_irq_save(flags);
1123        status = custom.serdatr;
1124        mb();
1125        local_irq_restore(flags);
1126        result = ((status & SDR_TSRE) ? TIOCSER_TEMT : 0);
1127        if (copy_to_user(value, &result, sizeof(int)))
1128                return -EFAULT;
1129        return 0;
1130}
1131
1132
1133static int rs_tiocmget(struct tty_struct *tty)
1134{
1135        struct serial_state *info = tty->driver_data;
1136        unsigned char control, status;
1137        unsigned long flags;
1138
1139        if (serial_paranoia_check(info, tty->name, "rs_ioctl"))
1140                return -ENODEV;
1141        if (tty_io_error(tty))
1142                return -EIO;
1143
1144        control = info->MCR;
1145        local_irq_save(flags);
1146        status = ciab.pra;
1147        local_irq_restore(flags);
1148        return    ((control & SER_RTS) ? TIOCM_RTS : 0)
1149                | ((control & SER_DTR) ? TIOCM_DTR : 0)
1150                | (!(status  & SER_DCD) ? TIOCM_CAR : 0)
1151                | (!(status  & SER_DSR) ? TIOCM_DSR : 0)
1152                | (!(status  & SER_CTS) ? TIOCM_CTS : 0);
1153}
1154
1155static int rs_tiocmset(struct tty_struct *tty, unsigned int set,
1156                                                unsigned int clear)
1157{
1158        struct serial_state *info = tty->driver_data;
1159        unsigned long flags;
1160
1161        if (serial_paranoia_check(info, tty->name, "rs_ioctl"))
1162                return -ENODEV;
1163        if (tty_io_error(tty))
1164                return -EIO;
1165
1166        local_irq_save(flags);
1167        if (set & TIOCM_RTS)
1168                info->MCR |= SER_RTS;
1169        if (set & TIOCM_DTR)
1170                info->MCR |= SER_DTR;
1171        if (clear & TIOCM_RTS)
1172                info->MCR &= ~SER_RTS;
1173        if (clear & TIOCM_DTR)
1174                info->MCR &= ~SER_DTR;
1175        rtsdtr_ctrl(info->MCR);
1176        local_irq_restore(flags);
1177        return 0;
1178}
1179
1180/*
1181 * rs_break() --- routine which turns the break handling on or off
1182 */
1183static int rs_break(struct tty_struct *tty, int break_state)
1184{
1185        struct serial_state *info = tty->driver_data;
1186        unsigned long flags;
1187
1188        if (serial_paranoia_check(info, tty->name, "rs_break"))
1189                return -EINVAL;
1190
1191        local_irq_save(flags);
1192        if (break_state == -1)
1193          custom.adkcon = AC_SETCLR | AC_UARTBRK;
1194        else
1195          custom.adkcon = AC_UARTBRK;
1196        mb();
1197        local_irq_restore(flags);
1198        return 0;
1199}
1200
1201/*
1202 * Get counter of input serial line interrupts (DCD,RI,DSR,CTS)
1203 * Return: write counters to the user passed counter struct
1204 * NB: both 1->0 and 0->1 transitions are counted except for
1205 *     RI where only 0->1 is counted.
1206 */
1207static int rs_get_icount(struct tty_struct *tty,
1208                                struct serial_icounter_struct *icount)
1209{
1210        struct serial_state *info = tty->driver_data;
1211        struct async_icount cnow;
1212        unsigned long flags;
1213
1214        local_irq_save(flags);
1215        cnow = info->icount;
1216        local_irq_restore(flags);
1217        icount->cts = cnow.cts;
1218        icount->dsr = cnow.dsr;
1219        icount->rng = cnow.rng;
1220        icount->dcd = cnow.dcd;
1221        icount->rx = cnow.rx;
1222        icount->tx = cnow.tx;
1223        icount->frame = cnow.frame;
1224        icount->overrun = cnow.overrun;
1225        icount->parity = cnow.parity;
1226        icount->brk = cnow.brk;
1227        icount->buf_overrun = cnow.buf_overrun;
1228
1229        return 0;
1230}
1231
1232static int rs_ioctl(struct tty_struct *tty,
1233                    unsigned int cmd, unsigned long arg)
1234{
1235        struct serial_state *info = tty->driver_data;
1236        struct async_icount cprev, cnow;        /* kernel counter temps */
1237        void __user *argp = (void __user *)arg;
1238        unsigned long flags;
1239        DEFINE_WAIT(wait);
1240        int ret;
1241
1242        if (serial_paranoia_check(info, tty->name, "rs_ioctl"))
1243                return -ENODEV;
1244
1245        if ((cmd != TIOCGSERIAL) && (cmd != TIOCSSERIAL) &&
1246            (cmd != TIOCSERCONFIG) && (cmd != TIOCSERGSTRUCT) &&
1247            (cmd != TIOCMIWAIT) && (cmd != TIOCGICOUNT)) {
1248                if (tty_io_error(tty))
1249                    return -EIO;
1250        }
1251
1252        switch (cmd) {
1253                case TIOCGSERIAL:
1254                        return get_serial_info(tty, info, argp);
1255                case TIOCSSERIAL:
1256                        return set_serial_info(tty, info, argp);
1257                case TIOCSERCONFIG:
1258                        return 0;
1259
1260                case TIOCSERGETLSR: /* Get line status register */
1261                        return get_lsr_info(info, argp);
1262
1263                case TIOCSERGSTRUCT:
1264                        if (copy_to_user(argp,
1265                                         info, sizeof(struct serial_state)))
1266                                return -EFAULT;
1267                        return 0;
1268
1269                /*
1270                 * Wait for any of the 4 modem inputs (DCD,RI,DSR,CTS) to change
1271                 * - mask passed in arg for lines of interest
1272                 *   (use |'ed TIOCM_RNG/DSR/CD/CTS for masking)
1273                 * Caller should use TIOCGICOUNT to see which one it was
1274                 */
1275                case TIOCMIWAIT:
1276                        local_irq_save(flags);
1277                        /* note the counters on entry */
1278                        cprev = info->icount;
1279                        local_irq_restore(flags);
1280                        while (1) {
1281                                prepare_to_wait(&info->tport.delta_msr_wait,
1282                                                &wait, TASK_INTERRUPTIBLE);
1283                                local_irq_save(flags);
1284                                cnow = info->icount; /* atomic copy */
1285                                local_irq_restore(flags);
1286                                if (cnow.rng == cprev.rng && cnow.dsr == cprev.dsr && 
1287                                    cnow.dcd == cprev.dcd && cnow.cts == cprev.cts) {
1288                                        ret = -EIO; /* no change => error */
1289                                        break;
1290                                }
1291                                if ( ((arg & TIOCM_RNG) && (cnow.rng != cprev.rng)) ||
1292                                     ((arg & TIOCM_DSR) && (cnow.dsr != cprev.dsr)) ||
1293                                     ((arg & TIOCM_CD)  && (cnow.dcd != cprev.dcd)) ||
1294                                     ((arg & TIOCM_CTS) && (cnow.cts != cprev.cts)) ) {
1295                                        ret = 0;
1296                                        break;
1297                                }
1298                                schedule();
1299                                /* see if a signal did it */
1300                                if (signal_pending(current)) {
1301                                        ret = -ERESTARTSYS;
1302                                        break;
1303                                }
1304                                cprev = cnow;
1305                        }
1306                        finish_wait(&info->tport.delta_msr_wait, &wait);
1307                        return ret;
1308
1309                case TIOCSERGWILD:
1310                case TIOCSERSWILD:
1311                        /* "setserial -W" is called in Debian boot */
1312                        printk ("TIOCSER?WILD ioctl obsolete, ignored.\n");
1313                        return 0;
1314
1315                default:
1316                        return -ENOIOCTLCMD;
1317                }
1318        return 0;
1319}
1320
1321static void rs_set_termios(struct tty_struct *tty, struct ktermios *old_termios)
1322{
1323        struct serial_state *info = tty->driver_data;
1324        unsigned long flags;
1325        unsigned int cflag = tty->termios.c_cflag;
1326
1327        change_speed(tty, info, old_termios);
1328
1329        /* Handle transition to B0 status */
1330        if ((old_termios->c_cflag & CBAUD) && !(cflag & CBAUD)) {
1331                info->MCR &= ~(SER_DTR|SER_RTS);
1332                local_irq_save(flags);
1333                rtsdtr_ctrl(info->MCR);
1334                local_irq_restore(flags);
1335        }
1336
1337        /* Handle transition away from B0 status */
1338        if (!(old_termios->c_cflag & CBAUD) && (cflag & CBAUD)) {
1339                info->MCR |= SER_DTR;
1340                if (!C_CRTSCTS(tty) || !tty_throttled(tty))
1341                        info->MCR |= SER_RTS;
1342                local_irq_save(flags);
1343                rtsdtr_ctrl(info->MCR);
1344                local_irq_restore(flags);
1345        }
1346
1347        /* Handle turning off CRTSCTS */
1348        if ((old_termios->c_cflag & CRTSCTS) && !C_CRTSCTS(tty)) {
1349                tty->hw_stopped = 0;
1350                rs_start(tty);
1351        }
1352
1353#if 0
1354        /*
1355         * No need to wake up processes in open wait, since they
1356         * sample the CLOCAL flag once, and don't recheck it.
1357         * XXX  It's not clear whether the current behavior is correct
1358         * or not.  Hence, this may change.....
1359         */
1360        if (!(old_termios->c_cflag & CLOCAL) && C_CLOCAL(tty))
1361                wake_up_interruptible(&info->open_wait);
1362#endif
1363}
1364
1365/*
1366 * ------------------------------------------------------------
1367 * rs_close()
1368 * 
1369 * This routine is called when the serial port gets closed.  First, we
1370 * wait for the last remaining data to be sent.  Then, we unlink its
1371 * async structure from the interrupt chain if necessary, and we free
1372 * that IRQ if nothing is left in the chain.
1373 * ------------------------------------------------------------
1374 */
1375static void rs_close(struct tty_struct *tty, struct file * filp)
1376{
1377        struct serial_state *state = tty->driver_data;
1378        struct tty_port *port = &state->tport;
1379
1380        if (serial_paranoia_check(state, tty->name, "rs_close"))
1381                return;
1382
1383        if (tty_port_close_start(port, tty, filp) == 0)
1384                return;
1385
1386        /*
1387         * At this point we stop accepting input.  To do this, we
1388         * disable the receive line status interrupts, and tell the
1389         * interrupt driver to stop checking the data ready bit in the
1390         * line status register.
1391         */
1392        state->read_status_mask &= ~UART_LSR_DR;
1393        if (tty_port_initialized(port)) {
1394                /* disable receive interrupts */
1395                custom.intena = IF_RBF;
1396                mb();
1397                /* clear any pending receive interrupt */
1398                custom.intreq = IF_RBF;
1399                mb();
1400
1401                /*
1402                 * Before we drop DTR, make sure the UART transmitter
1403                 * has completely drained; this is especially
1404                 * important if there is a transmit FIFO!
1405                 */
1406                rs_wait_until_sent(tty, state->timeout);
1407        }
1408        shutdown(tty, state);
1409        rs_flush_buffer(tty);
1410                
1411        tty_ldisc_flush(tty);
1412        port->tty = NULL;
1413
1414        tty_port_close_end(port, tty);
1415}
1416
1417/*
1418 * rs_wait_until_sent() --- wait until the transmitter is empty
1419 */
1420static void rs_wait_until_sent(struct tty_struct *tty, int timeout)
1421{
1422        struct serial_state *info = tty->driver_data;
1423        unsigned long orig_jiffies, char_time;
1424        int lsr;
1425
1426        if (serial_paranoia_check(info, tty->name, "rs_wait_until_sent"))
1427                return;
1428
1429        if (info->xmit_fifo_size == 0)
1430                return; /* Just in case.... */
1431
1432        orig_jiffies = jiffies;
1433
1434        /*
1435         * Set the check interval to be 1/5 of the estimated time to
1436         * send a single character, and make it at least 1.  The check
1437         * interval should also be less than the timeout.
1438         * 
1439         * Note: we have to use pretty tight timings here to satisfy
1440         * the NIST-PCTS.
1441         */
1442        char_time = (info->timeout - HZ/50) / info->xmit_fifo_size;
1443        char_time = char_time / 5;
1444        if (char_time == 0)
1445                char_time = 1;
1446        if (timeout)
1447          char_time = min_t(unsigned long, char_time, timeout);
1448        /*
1449         * If the transmitter hasn't cleared in twice the approximate
1450         * amount of time to send the entire FIFO, it probably won't
1451         * ever clear.  This assumes the UART isn't doing flow
1452         * control, which is currently the case.  Hence, if it ever
1453         * takes longer than info->timeout, this is probably due to a
1454         * UART bug of some kind.  So, we clamp the timeout parameter at
1455         * 2*info->timeout.
1456         */
1457        if (!timeout || timeout > 2*info->timeout)
1458                timeout = 2*info->timeout;
1459#ifdef SERIAL_DEBUG_RS_WAIT_UNTIL_SENT
1460        printk("In rs_wait_until_sent(%d) check=%lu...", timeout, char_time);
1461        printk("jiff=%lu...", jiffies);
1462#endif
1463        while(!((lsr = custom.serdatr) & SDR_TSRE)) {
1464#ifdef SERIAL_DEBUG_RS_WAIT_UNTIL_SENT
1465                printk("serdatr = %d (jiff=%lu)...", lsr, jiffies);
1466#endif
1467                msleep_interruptible(jiffies_to_msecs(char_time));
1468                if (signal_pending(current))
1469                        break;
1470                if (timeout && time_after(jiffies, orig_jiffies + timeout))
1471                        break;
1472        }
1473        __set_current_state(TASK_RUNNING);
1474
1475#ifdef SERIAL_DEBUG_RS_WAIT_UNTIL_SENT
1476        printk("lsr = %d (jiff=%lu)...done\n", lsr, jiffies);
1477#endif
1478}
1479
1480/*
1481 * rs_hangup() --- called by tty_hangup() when a hangup is signaled.
1482 */
1483static void rs_hangup(struct tty_struct *tty)
1484{
1485        struct serial_state *info = tty->driver_data;
1486
1487        if (serial_paranoia_check(info, tty->name, "rs_hangup"))
1488                return;
1489
1490        rs_flush_buffer(tty);
1491        shutdown(tty, info);
1492        info->tport.count = 0;
1493        tty_port_set_active(&info->tport, 0);
1494        info->tport.tty = NULL;
1495        wake_up_interruptible(&info->tport.open_wait);
1496}
1497
1498/*
1499 * This routine is called whenever a serial port is opened.  It
1500 * enables interrupts for a serial port, linking in its async structure into
1501 * the IRQ chain.   It also performs the serial-specific
1502 * initialization for the tty structure.
1503 */
1504static int rs_open(struct tty_struct *tty, struct file * filp)
1505{
1506        struct serial_state *info = rs_table + tty->index;
1507        struct tty_port *port = &info->tport;
1508        int retval;
1509
1510        port->count++;
1511        port->tty = tty;
1512        tty->driver_data = info;
1513        tty->port = port;
1514        if (serial_paranoia_check(info, tty->name, "rs_open"))
1515                return -ENODEV;
1516
1517        port->low_latency = (port->flags & ASYNC_LOW_LATENCY) ? 1 : 0;
1518
1519        retval = startup(tty, info);
1520        if (retval) {
1521                return retval;
1522        }
1523
1524        return tty_port_block_til_ready(port, tty, filp);
1525}
1526
1527/*
1528 * /proc fs routines....
1529 */
1530
1531static inline void line_info(struct seq_file *m, int line,
1532                struct serial_state *state)
1533{
1534        char    stat_buf[30], control, status;
1535        unsigned long flags;
1536
1537        seq_printf(m, "%d: uart:amiga_builtin", line);
1538
1539        local_irq_save(flags);
1540        status = ciab.pra;
1541        control = tty_port_initialized(&state->tport) ? state->MCR : status;
1542        local_irq_restore(flags);
1543
1544        stat_buf[0] = 0;
1545        stat_buf[1] = 0;
1546        if(!(control & SER_RTS))
1547                strcat(stat_buf, "|RTS");
1548        if(!(status & SER_CTS))
1549                strcat(stat_buf, "|CTS");
1550        if(!(control & SER_DTR))
1551                strcat(stat_buf, "|DTR");
1552        if(!(status & SER_DSR))
1553                strcat(stat_buf, "|DSR");
1554        if(!(status & SER_DCD))
1555                strcat(stat_buf, "|CD");
1556
1557        if (state->quot)
1558                seq_printf(m, " baud:%d", state->baud_base / state->quot);
1559
1560        seq_printf(m, " tx:%d rx:%d", state->icount.tx, state->icount.rx);
1561
1562        if (state->icount.frame)
1563                seq_printf(m, " fe:%d", state->icount.frame);
1564
1565        if (state->icount.parity)
1566                seq_printf(m, " pe:%d", state->icount.parity);
1567
1568        if (state->icount.brk)
1569                seq_printf(m, " brk:%d", state->icount.brk);
1570
1571        if (state->icount.overrun)
1572                seq_printf(m, " oe:%d", state->icount.overrun);
1573
1574        /*
1575         * Last thing is the RS-232 status lines
1576         */
1577        seq_printf(m, " %s\n", stat_buf+1);
1578}
1579
1580static int rs_proc_show(struct seq_file *m, void *v)
1581{
1582        seq_printf(m, "serinfo:1.0 driver:%s\n", serial_version);
1583        line_info(m, 0, &rs_table[0]);
1584        return 0;
1585}
1586
1587static int rs_proc_open(struct inode *inode, struct file *file)
1588{
1589        return single_open(file, rs_proc_show, NULL);
1590}
1591
1592static const struct file_operations rs_proc_fops = {
1593        .owner          = THIS_MODULE,
1594        .open           = rs_proc_open,
1595        .read           = seq_read,
1596        .llseek         = seq_lseek,
1597        .release        = single_release,
1598};
1599
1600/*
1601 * ---------------------------------------------------------------------
1602 * rs_init() and friends
1603 *
1604 * rs_init() is called at boot-time to initialize the serial driver.
1605 * ---------------------------------------------------------------------
1606 */
1607
1608/*
1609 * This routine prints out the appropriate serial driver version
1610 * number, and identifies which options were configured into this
1611 * driver.
1612 */
1613static void show_serial_version(void)
1614{
1615        printk(KERN_INFO "%s version %s\n", serial_name, serial_version);
1616}
1617
1618
1619static const struct tty_operations serial_ops = {
1620        .open = rs_open,
1621        .close = rs_close,
1622        .write = rs_write,
1623        .put_char = rs_put_char,
1624        .flush_chars = rs_flush_chars,
1625        .write_room = rs_write_room,
1626        .chars_in_buffer = rs_chars_in_buffer,
1627        .flush_buffer = rs_flush_buffer,
1628        .ioctl = rs_ioctl,
1629        .throttle = rs_throttle,
1630        .unthrottle = rs_unthrottle,
1631        .set_termios = rs_set_termios,
1632        .stop = rs_stop,
1633        .start = rs_start,
1634        .hangup = rs_hangup,
1635        .break_ctl = rs_break,
1636        .send_xchar = rs_send_xchar,
1637        .wait_until_sent = rs_wait_until_sent,
1638        .tiocmget = rs_tiocmget,
1639        .tiocmset = rs_tiocmset,
1640        .get_icount = rs_get_icount,
1641        .proc_fops = &rs_proc_fops,
1642};
1643
1644static int amiga_carrier_raised(struct tty_port *port)
1645{
1646        return !(ciab.pra & SER_DCD);
1647}
1648
1649static void amiga_dtr_rts(struct tty_port *port, int raise)
1650{
1651        struct serial_state *info = container_of(port, struct serial_state,
1652                        tport);
1653        unsigned long flags;
1654
1655        if (raise)
1656                info->MCR |= SER_DTR|SER_RTS;
1657        else
1658                info->MCR &= ~(SER_DTR|SER_RTS);
1659
1660        local_irq_save(flags);
1661        rtsdtr_ctrl(info->MCR);
1662        local_irq_restore(flags);
1663}
1664
1665static const struct tty_port_operations amiga_port_ops = {
1666        .carrier_raised = amiga_carrier_raised,
1667        .dtr_rts = amiga_dtr_rts,
1668};
1669
1670/*
1671 * The serial driver boot-time initialization code!
1672 */
1673static int __init amiga_serial_probe(struct platform_device *pdev)
1674{
1675        unsigned long flags;
1676        struct serial_state * state;
1677        int error;
1678
1679        serial_driver = alloc_tty_driver(NR_PORTS);
1680        if (!serial_driver)
1681                return -ENOMEM;
1682
1683        show_serial_version();
1684
1685        /* Initialize the tty_driver structure */
1686
1687        serial_driver->driver_name = "amiserial";
1688        serial_driver->name = "ttyS";
1689        serial_driver->major = TTY_MAJOR;
1690        serial_driver->minor_start = 64;
1691        serial_driver->type = TTY_DRIVER_TYPE_SERIAL;
1692        serial_driver->subtype = SERIAL_TYPE_NORMAL;
1693        serial_driver->init_termios = tty_std_termios;
1694        serial_driver->init_termios.c_cflag =
1695                B9600 | CS8 | CREAD | HUPCL | CLOCAL;
1696        serial_driver->flags = TTY_DRIVER_REAL_RAW;
1697        tty_set_operations(serial_driver, &serial_ops);
1698
1699        state = rs_table;
1700        state->port = (int)&custom.serdatr; /* Just to give it a value */
1701        state->custom_divisor = 0;
1702        state->icount.cts = state->icount.dsr = 
1703          state->icount.rng = state->icount.dcd = 0;
1704        state->icount.rx = state->icount.tx = 0;
1705        state->icount.frame = state->icount.parity = 0;
1706        state->icount.overrun = state->icount.brk = 0;
1707        tty_port_init(&state->tport);
1708        state->tport.ops = &amiga_port_ops;
1709        tty_port_link_device(&state->tport, serial_driver, 0);
1710
1711        error = tty_register_driver(serial_driver);
1712        if (error)
1713                goto fail_put_tty_driver;
1714
1715        printk(KERN_INFO "ttyS0 is the amiga builtin serial port\n");
1716
1717        /* Hardware set up */
1718
1719        state->baud_base = amiga_colorclock;
1720        state->xmit_fifo_size = 1;
1721
1722        /* set ISRs, and then disable the rx interrupts */
1723        error = request_irq(IRQ_AMIGA_TBE, ser_tx_int, 0, "serial TX", state);
1724        if (error)
1725                goto fail_unregister;
1726
1727        error = request_irq(IRQ_AMIGA_RBF, ser_rx_int, 0,
1728                            "serial RX", state);
1729        if (error)
1730                goto fail_free_irq;
1731
1732        local_irq_save(flags);
1733
1734        /* turn off Rx and Tx interrupts */
1735        custom.intena = IF_RBF | IF_TBE;
1736        mb();
1737
1738        /* clear any pending interrupt */
1739        custom.intreq = IF_RBF | IF_TBE;
1740        mb();
1741
1742        local_irq_restore(flags);
1743
1744        /*
1745         * set the appropriate directions for the modem control flags,
1746         * and clear RTS and DTR
1747         */
1748        ciab.ddra |= (SER_DTR | SER_RTS);   /* outputs */
1749        ciab.ddra &= ~(SER_DCD | SER_CTS | SER_DSR);  /* inputs */
1750
1751        platform_set_drvdata(pdev, state);
1752
1753        return 0;
1754
1755fail_free_irq:
1756        free_irq(IRQ_AMIGA_TBE, state);
1757fail_unregister:
1758        tty_unregister_driver(serial_driver);
1759fail_put_tty_driver:
1760        tty_port_destroy(&state->tport);
1761        put_tty_driver(serial_driver);
1762        return error;
1763}
1764
1765static int __exit amiga_serial_remove(struct platform_device *pdev)
1766{
1767        int error;
1768        struct serial_state *state = platform_get_drvdata(pdev);
1769
1770        /* printk("Unloading %s: version %s\n", serial_name, serial_version); */
1771        error = tty_unregister_driver(serial_driver);
1772        if (error)
1773                printk("SERIAL: failed to unregister serial driver (%d)\n",
1774                       error);
1775        put_tty_driver(serial_driver);
1776        tty_port_destroy(&state->tport);
1777
1778        free_irq(IRQ_AMIGA_TBE, state);
1779        free_irq(IRQ_AMIGA_RBF, state);
1780
1781        return error;
1782}
1783
1784static struct platform_driver amiga_serial_driver = {
1785        .remove = __exit_p(amiga_serial_remove),
1786        .driver   = {
1787                .name   = "amiga-serial",
1788        },
1789};
1790
1791module_platform_driver_probe(amiga_serial_driver, amiga_serial_probe);
1792
1793
1794#if defined(CONFIG_SERIAL_CONSOLE) && !defined(MODULE)
1795
1796/*
1797 * ------------------------------------------------------------
1798 * Serial console driver
1799 * ------------------------------------------------------------
1800 */
1801
1802static void amiga_serial_putc(char c)
1803{
1804        custom.serdat = (unsigned char)c | 0x100;
1805        while (!(custom.serdatr & 0x2000))
1806                barrier();
1807}
1808
1809/*
1810 *      Print a string to the serial port trying not to disturb
1811 *      any possible real use of the port...
1812 *
1813 *      The console must be locked when we get here.
1814 */
1815static void serial_console_write(struct console *co, const char *s,
1816                                unsigned count)
1817{
1818        unsigned short intena = custom.intenar;
1819
1820        custom.intena = IF_TBE;
1821
1822        while (count--) {
1823                if (*s == '\n')
1824                        amiga_serial_putc('\r');
1825                amiga_serial_putc(*s++);
1826        }
1827
1828        custom.intena = IF_SETCLR | (intena & IF_TBE);
1829}
1830
1831static struct tty_driver *serial_console_device(struct console *c, int *index)
1832{
1833        *index = 0;
1834        return serial_driver;
1835}
1836
1837static struct console sercons = {
1838        .name =         "ttyS",
1839        .write =        serial_console_write,
1840        .device =       serial_console_device,
1841        .flags =        CON_PRINTBUFFER,
1842        .index =        -1,
1843};
1844
1845/*
1846 *      Register console.
1847 */
1848static int __init amiserial_console_init(void)
1849{
1850        if (!MACH_IS_AMIGA)
1851                return -ENODEV;
1852
1853        register_console(&sercons);
1854        return 0;
1855}
1856console_initcall(amiserial_console_init);
1857
1858#endif /* CONFIG_SERIAL_CONSOLE && !MODULE */
1859
1860MODULE_LICENSE("GPL");
1861MODULE_ALIAS("platform:amiga-serial");
1862