2  *      linux/drivers/char/riscom.c  -- RISCom/8 multiport serial driver.
 
   4  *      Copyright (C) 1994-1996  Dmitry Gorodchanin (pgmdsg@ibi.com)
 
   6  *      This code is loosely based on the Linux serial driver, written by
 
   7  *      Linus Torvalds, Theodore T'so and others. The RISCom/8 card 
 
   8  *      programming info was obtained from various drivers for other OSes 
 
   9  *      (FreeBSD, ISC, etc), but no source code from those drivers were 
 
  10  *      directly included in this driver.
 
  13  *      This program is free software; you can redistribute it and/or modify
 
  14  *      it under the terms of the GNU General Public License as published by
 
  15  *      the Free Software Foundation; either version 2 of the License, or
 
  16  *      (at your option) any later version.
 
  18  *      This program is distributed in the hope that it will be useful,
 
  19  *      but WITHOUT ANY WARRANTY; without even the implied warranty of
 
  20  *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
  21  *      GNU General Public License for more details.
 
  23  *      You should have received a copy of the GNU General Public License
 
  24  *      along with this program; if not, write to the Free Software
 
  25  *      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 
  30  *      Arnaldo Carvalho de Melo <acme@conectiva.com.br> - 27-Jun-2001
 
  31  *      - get rid of check_region and several cleanups
 
  34 #include <linux/module.h>
 
  37 #include <linux/kernel.h>
 
  38 #include <linux/sched.h>
 
  39 #include <linux/ioport.h>
 
  40 #include <linux/interrupt.h>
 
  41 #include <linux/errno.h>
 
  42 #include <linux/tty.h>
 
  44 #include <linux/serial.h>
 
  45 #include <linux/fcntl.h>
 
  46 #include <linux/major.h>
 
  47 #include <linux/init.h>
 
  48 #include <linux/delay.h>
 
  49 #include <linux/tty_flip.h>
 
  51 #include <asm/uaccess.h>
 
  54 #include "riscom8_reg.h"
 
  56 /* Am I paranoid or not ? ;-) */
 
  57 #define RISCOM_PARANOIA_CHECK
 
  60  * Crazy InteliCom/8 boards sometimes has swapped CTS & DSR signals.
 
  61  * You can slightly speed up things by #undefing the following option,
 
  62  * if you are REALLY sure that your board is correct one. 
 
  65 #define RISCOM_BRAIN_DAMAGED_CTS
 
  68  * The following defines are mostly for testing purposes. But if you need
 
  69  * some nice reporting in your syslog, you can define them also.
 
  72 #undef RC_REPORT_OVERRUN
 
  75 #define RISCOM_LEGAL_FLAGS \
 
  76         (ASYNC_HUP_NOTIFY   | ASYNC_SAK          | ASYNC_SPLIT_TERMIOS   | \
 
  77          ASYNC_SPD_HI       | ASYNC_SPEED_VHI    | ASYNC_SESSION_LOCKOUT | \
 
  78          ASYNC_PGRP_LOCKOUT | ASYNC_CALLOUT_NOHUP)
 
  80 #define RS_EVENT_WRITE_WAKEUP   0
 
  82 static struct tty_driver *riscom_driver;
 
  84 static struct riscom_board rc_board[RC_NBOARD] =  {
 
  99 static struct riscom_port rc_port[RC_NBOARD * RC_NPORT];
 
 101 /* RISCom/8 I/O ports addresses (without address translation) */
 
 102 static unsigned short rc_ioport[] =  {
 
 104         0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x0a, 0x0b, 0x0c,
 
 106         0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x0a, 0x0b, 0x0c, 0x10,
 
 107         0x11, 0x12, 0x18, 0x28, 0x31, 0x32, 0x39, 0x3a, 0x40, 0x41, 0x61, 0x62,
 
 108         0x63, 0x64, 0x6b, 0x70, 0x71, 0x78, 0x7a, 0x7b, 0x7f, 0x100, 0x101
 
 111 #define RC_NIOPORT      ARRAY_SIZE(rc_ioport)
 
 114 static inline int rc_paranoia_check(struct riscom_port const * port,
 
 115                                     char *name, const char *routine)
 
 117 #ifdef RISCOM_PARANOIA_CHECK
 
 118         static const char badmagic[] = KERN_INFO
 
 119                 "rc: Warning: bad riscom port magic number for device %s in %s\n";
 
 120         static const char badinfo[] = KERN_INFO
 
 121                 "rc: Warning: null riscom port for device %s in %s\n";
 
 124                 printk(badinfo, name, routine);
 
 127         if (port->magic != RISCOM8_MAGIC) {
 
 128                 printk(badmagic, name, routine);
 
 137  *  Service functions for RISCom/8 driver.
 
 141 /* Get board number from pointer */
 
 142 static inline int board_No (struct riscom_board const * bp)
 
 144         return bp - rc_board;
 
 147 /* Get port number from pointer */
 
 148 static inline int port_No (struct riscom_port const * port)
 
 150         return RC_PORT(port - rc_port); 
 
 153 /* Get pointer to board from pointer to port */
 
 154 static inline struct riscom_board * port_Board(struct riscom_port const * port)
 
 156         return &rc_board[RC_BOARD(port - rc_port)];
 
 159 /* Input Byte from CL CD180 register */
 
 160 static inline unsigned char rc_in(struct riscom_board const * bp, unsigned short reg)
 
 162         return inb(bp->base + RC_TO_ISA(reg));
 
 165 /* Output Byte to CL CD180 register */
 
 166 static inline void rc_out(struct riscom_board const * bp, unsigned short reg,
 
 169         outb(val, bp->base + RC_TO_ISA(reg));
 
 172 /* Wait for Channel Command Register ready */
 
 173 static inline void rc_wait_CCR(struct riscom_board const * bp)
 
 177         /* FIXME: need something more descriptive then 100000 :) */
 
 178         for (delay = 100000; delay; delay--) 
 
 179                 if (!rc_in(bp, CD180_CCR))
 
 182         printk(KERN_INFO "rc%d: Timeout waiting for CCR.\n", board_No(bp));
 
 186  *  RISCom/8 probe functions.
 
 189 static inline int rc_request_io_range(struct riscom_board * const bp)
 
 193         for (i = 0; i < RC_NIOPORT; i++)  
 
 194                 if (!request_region(RC_TO_ISA(rc_ioport[i]) + bp->base, 1,
 
 200         printk(KERN_INFO "rc%d: Skipping probe at 0x%03x. IO address in use.\n",
 
 201                          board_No(bp), bp->base);
 
 203                 release_region(RC_TO_ISA(rc_ioport[i]) + bp->base, 1);
 
 207 static inline void rc_release_io_range(struct riscom_board * const bp)
 
 211         for (i = 0; i < RC_NIOPORT; i++)  
 
 212                 release_region(RC_TO_ISA(rc_ioport[i]) + bp->base, 1);
 
 215 /* Reset and setup CD180 chip */
 
 216 static void __init rc_init_CD180(struct riscom_board const * bp)
 
 220         save_flags(flags); cli();
 
 221         rc_out(bp, RC_CTOUT, 0);                   /* Clear timeout             */
 
 222         rc_wait_CCR(bp);                           /* Wait for CCR ready        */
 
 223         rc_out(bp, CD180_CCR, CCR_HARDRESET);      /* Reset CD180 chip          */
 
 225         msleep(50);                                /* Delay 0.05 sec            */
 
 227         rc_out(bp, CD180_GIVR, RC_ID);             /* Set ID for this chip      */
 
 228         rc_out(bp, CD180_GICR, 0);                 /* Clear all bits            */
 
 229         rc_out(bp, CD180_PILR1, RC_ACK_MINT);      /* Prio for modem intr       */
 
 230         rc_out(bp, CD180_PILR2, RC_ACK_TINT);      /* Prio for transmitter intr */
 
 231         rc_out(bp, CD180_PILR3, RC_ACK_RINT);      /* Prio for receiver intr    */
 
 233         /* Setting up prescaler. We need 4 ticks per 1 ms */
 
 234         rc_out(bp, CD180_PPRH, (RC_OSCFREQ/(1000000/RISCOM_TPS)) >> 8);
 
 235         rc_out(bp, CD180_PPRL, (RC_OSCFREQ/(1000000/RISCOM_TPS)) & 0xff);
 
 237         restore_flags(flags);
 
 240 /* Main probing routine, also sets irq. */
 
 241 static int __init rc_probe(struct riscom_board *bp)
 
 243         unsigned char val1, val2;
 
 249         if (rc_request_io_range(bp))
 
 252         /* Are the I/O ports here ? */
 
 253         rc_out(bp, CD180_PPRL, 0x5a);
 
 255         val1 = rc_in(bp, CD180_PPRL);
 
 256         rc_out(bp, CD180_PPRL, 0xa5);
 
 258         val2 = rc_in(bp, CD180_PPRL);
 
 260         if ((val1 != 0x5a) || (val2 != 0xa5))  {
 
 261                 printk(KERN_ERR "rc%d: RISCom/8 Board at 0x%03x not found.\n",
 
 262                        board_No(bp), bp->base);
 
 266         /* It's time to find IRQ for this board */
 
 267         for (retries = 0; retries < 5 && irqs <= 0; retries++)  {
 
 268                 irqs = probe_irq_on();
 
 269                 rc_init_CD180(bp);                      /* Reset CD180 chip       */
 
 270                 rc_out(bp, CD180_CAR, 2);               /* Select port 2          */
 
 272                 rc_out(bp, CD180_CCR, CCR_TXEN);        /* Enable transmitter     */
 
 273                 rc_out(bp, CD180_IER, IER_TXRDY);       /* Enable tx empty intr   */
 
 275                 irqs = probe_irq_off(irqs);
 
 276                 val1 = rc_in(bp, RC_BSR);               /* Get Board Status reg   */
 
 277                 val2 = rc_in(bp, RC_ACK_TINT);          /* ACK interrupt          */
 
 278                 rc_init_CD180(bp);                      /* Reset CD180 again      */
 
 280                 if ((val1 & RC_BSR_TINT) || (val2 != (RC_ID | GIVR_IT_TX)))  {
 
 281                         printk(KERN_ERR "rc%d: RISCom/8 Board at 0x%03x not "
 
 282                                         "found.\n", board_No(bp), bp->base);
 
 288                 printk(KERN_ERR "rc%d: Can't find IRQ for RISCom/8 board "
 
 289                                 "at 0x%03x.\n", board_No(bp), bp->base);
 
 293         bp->flags |= RC_BOARD_PRESENT;
 
 295         printk(KERN_INFO "rc%d: RISCom/8 Rev. %c board detected at "
 
 298                (rc_in(bp, CD180_GFRCR) & 0x0f) + 'A',   /* Board revision */
 
 303         rc_release_io_range(bp);
 
 309  *  Interrupt processing routines.
 
 313 static inline void rc_mark_event(struct riscom_port * port, int event)
 
 315         set_bit(event, &port->event);
 
 316         schedule_work(&port->tqueue);
 
 319 static inline struct riscom_port * rc_get_port(struct riscom_board const * bp,
 
 320                                                unsigned char const * what)
 
 322         unsigned char channel;
 
 323         struct riscom_port * port;
 
 325         channel = rc_in(bp, CD180_GICR) >> GICR_CHAN_OFF;
 
 326         if (channel < CD180_NCH)  {
 
 327                 port = &rc_port[board_No(bp) * RC_NPORT + channel];
 
 328                 if (port->flags & ASYNC_INITIALIZED)  {
 
 332         printk(KERN_ERR "rc%d: %s interrupt from invalid port %d\n", 
 
 333                board_No(bp), what, channel);
 
 337 static inline void rc_receive_exc(struct riscom_board const * bp)
 
 339         struct riscom_port *port;
 
 340         struct tty_struct *tty;
 
 341         unsigned char status;
 
 342         unsigned char ch, flag;
 
 344         if (!(port = rc_get_port(bp, "Receive")))
 
 349 #ifdef RC_REPORT_OVERRUN        
 
 350         status = rc_in(bp, CD180_RCSR);
 
 351         if (status & RCSR_OE)
 
 353         status &= port->mark_mask;
 
 355         status = rc_in(bp, CD180_RCSR) & port->mark_mask;
 
 357         ch = rc_in(bp, CD180_RDR);
 
 361         if (status & RCSR_TOUT)  {
 
 362                 printk(KERN_WARNING "rc%d: port %d: Receiver timeout. "
 
 363                                     "Hardware problems ?\n", 
 
 364                        board_No(bp), port_No(port));
 
 367         } else if (status & RCSR_BREAK)  {
 
 368                 printk(KERN_INFO "rc%d: port %d: Handling break...\n",
 
 369                        board_No(bp), port_No(port));
 
 371                 if (port->flags & ASYNC_SAK)
 
 374         } else if (status & RCSR_PE) 
 
 377         else if (status & RCSR_FE) 
 
 380         else if (status & RCSR_OE)
 
 386         tty_insert_flip_char(tty, ch, flag);
 
 387         tty_flip_buffer_push(tty);
 
 390 static inline void rc_receive(struct riscom_board const * bp)
 
 392         struct riscom_port *port;
 
 393         struct tty_struct *tty;
 
 396         if (!(port = rc_get_port(bp, "Receive")))
 
 401         count = rc_in(bp, CD180_RDCR);
 
 403 #ifdef RC_REPORT_FIFO
 
 404         port->hits[count > 8 ? 9 : count]++;
 
 408                 if (tty_buffer_request_room(tty, 1) == 0)  {
 
 409                         printk(KERN_WARNING "rc%d: port %d: Working around "
 
 410                                             "flip buffer overflow.\n",
 
 411                                board_No(bp), port_No(port));
 
 414                 tty_insert_flip_char(tty, rc_in(bp, CD180_RDR), TTY_NORMAL);
 
 416         tty_flip_buffer_push(tty);
 
 419 static inline void rc_transmit(struct riscom_board const * bp)
 
 421         struct riscom_port *port;
 
 422         struct tty_struct *tty;
 
 426         if (!(port = rc_get_port(bp, "Transmit")))
 
 431         if (port->IER & IER_TXEMPTY)  {
 
 433                 rc_out(bp, CD180_CAR, port_No(port));
 
 434                 port->IER &= ~IER_TXEMPTY;
 
 435                 rc_out(bp, CD180_IER, port->IER);
 
 439         if ((port->xmit_cnt <= 0 && !port->break_length)
 
 440             || tty->stopped || tty->hw_stopped)  {
 
 441                 rc_out(bp, CD180_CAR, port_No(port));
 
 442                 port->IER &= ~IER_TXRDY;
 
 443                 rc_out(bp, CD180_IER, port->IER);
 
 447         if (port->break_length)  {
 
 448                 if (port->break_length > 0)  {
 
 449                         if (port->COR2 & COR2_ETC)  {
 
 450                                 rc_out(bp, CD180_TDR, CD180_C_ESC);
 
 451                                 rc_out(bp, CD180_TDR, CD180_C_SBRK);
 
 452                                 port->COR2 &= ~COR2_ETC;
 
 454                         count = min_t(int, port->break_length, 0xff);
 
 455                         rc_out(bp, CD180_TDR, CD180_C_ESC);
 
 456                         rc_out(bp, CD180_TDR, CD180_C_DELAY);
 
 457                         rc_out(bp, CD180_TDR, count);
 
 458                         if (!(port->break_length -= count))
 
 459                                 port->break_length--;
 
 461                         rc_out(bp, CD180_TDR, CD180_C_ESC);
 
 462                         rc_out(bp, CD180_TDR, CD180_C_EBRK);
 
 463                         rc_out(bp, CD180_COR2, port->COR2);
 
 465                         rc_out(bp, CD180_CCR, CCR_CORCHG2);
 
 466                         port->break_length = 0;
 
 473                 rc_out(bp, CD180_TDR, port->xmit_buf[port->xmit_tail++]);
 
 474                 port->xmit_tail = port->xmit_tail & (SERIAL_XMIT_SIZE-1);
 
 475                 if (--port->xmit_cnt <= 0)
 
 477         } while (--count > 0);
 
 479         if (port->xmit_cnt <= 0)  {
 
 480                 rc_out(bp, CD180_CAR, port_No(port));
 
 481                 port->IER &= ~IER_TXRDY;
 
 482                 rc_out(bp, CD180_IER, port->IER);
 
 484         if (port->xmit_cnt <= port->wakeup_chars)
 
 485                 rc_mark_event(port, RS_EVENT_WRITE_WAKEUP);
 
 488 static inline void rc_check_modem(struct riscom_board const * bp)
 
 490         struct riscom_port *port;
 
 491         struct tty_struct *tty;
 
 494         if (!(port = rc_get_port(bp, "Modem")))
 
 499         mcr = rc_in(bp, CD180_MCR);
 
 500         if (mcr & MCR_CDCHG)  {
 
 501                 if (rc_in(bp, CD180_MSVR) & MSVR_CD) 
 
 502                         wake_up_interruptible(&port->open_wait);
 
 504                         schedule_work(&port->tqueue_hangup);
 
 507 #ifdef RISCOM_BRAIN_DAMAGED_CTS
 
 508         if (mcr & MCR_CTSCHG)  {
 
 509                 if (rc_in(bp, CD180_MSVR) & MSVR_CTS)  {
 
 511                         port->IER |= IER_TXRDY;
 
 512                         if (port->xmit_cnt <= port->wakeup_chars)
 
 513                                 rc_mark_event(port, RS_EVENT_WRITE_WAKEUP);
 
 516                         port->IER &= ~IER_TXRDY;
 
 518                 rc_out(bp, CD180_IER, port->IER);
 
 520         if (mcr & MCR_DSRCHG)  {
 
 521                 if (rc_in(bp, CD180_MSVR) & MSVR_DSR)  {
 
 523                         port->IER |= IER_TXRDY;
 
 524                         if (port->xmit_cnt <= port->wakeup_chars)
 
 525                                 rc_mark_event(port, RS_EVENT_WRITE_WAKEUP);
 
 528                         port->IER &= ~IER_TXRDY;
 
 530                 rc_out(bp, CD180_IER, port->IER);
 
 532 #endif /* RISCOM_BRAIN_DAMAGED_CTS */
 
 534         /* Clear change bits */
 
 535         rc_out(bp, CD180_MCR, 0);
 
 538 /* The main interrupt processing routine */
 
 539 static irqreturn_t rc_interrupt(int dummy, void * dev_id)
 
 541         unsigned char status;
 
 543         struct riscom_board *bp = dev_id;
 
 544         unsigned long loop = 0;
 
 547         if (!(bp->flags & RC_BOARD_ACTIVE))
 
 550         while ((++loop < 16) && ((status = ~(rc_in(bp, RC_BSR))) &
 
 551                                  (RC_BSR_TOUT | RC_BSR_TINT |
 
 552                                   RC_BSR_MINT | RC_BSR_RINT))) {
 
 554                 if (status & RC_BSR_TOUT) 
 
 555                         printk(KERN_WARNING "rc%d: Got timeout. Hardware "
 
 556                                             "error?\n", board_No(bp));
 
 558                 else if (status & RC_BSR_RINT) {
 
 559                         ack = rc_in(bp, RC_ACK_RINT);
 
 561                         if (ack == (RC_ID | GIVR_IT_RCV))
 
 563                         else if (ack == (RC_ID | GIVR_IT_REXC))
 
 566                                 printk(KERN_WARNING "rc%d: Bad receive ack "
 
 570                 } else if (status & RC_BSR_TINT) {
 
 571                         ack = rc_in(bp, RC_ACK_TINT);
 
 573                         if (ack == (RC_ID | GIVR_IT_TX))
 
 576                                 printk(KERN_WARNING "rc%d: Bad transmit ack "
 
 580                 } else /* if (status & RC_BSR_MINT) */ {
 
 581                         ack = rc_in(bp, RC_ACK_MINT);
 
 583                         if (ack == (RC_ID | GIVR_IT_MODEM)) 
 
 586                                 printk(KERN_WARNING "rc%d: Bad modem ack "
 
 592                 rc_out(bp, CD180_EOIR, 0);   /* Mark end of interrupt */
 
 593                 rc_out(bp, RC_CTOUT, 0);     /* Clear timeout flag    */
 
 595         return IRQ_RETVAL(handled);
 
 599  *  Routines for open & close processing.
 
 602 /* Called with disabled interrupts */
 
 603 static int rc_setup_board(struct riscom_board * bp)
 
 607         if (bp->flags & RC_BOARD_ACTIVE) 
 
 610         error = request_irq(bp->irq, rc_interrupt, IRQF_DISABLED,
 
 615         rc_out(bp, RC_CTOUT, 0);                /* Just in case         */
 
 617         rc_out(bp, RC_DTR, bp->DTR);            /* Drop DTR on all ports */
 
 619         bp->flags |= RC_BOARD_ACTIVE;
 
 624 /* Called with disabled interrupts */
 
 625 static void rc_shutdown_board(struct riscom_board *bp)
 
 627         if (!(bp->flags & RC_BOARD_ACTIVE))
 
 630         bp->flags &= ~RC_BOARD_ACTIVE;
 
 632         free_irq(bp->irq, NULL);
 
 635         rc_out(bp, RC_DTR, bp->DTR);           /* Drop DTR on all ports */
 
 640  * Setting up port characteristics. 
 
 641  * Must be called with disabled interrupts
 
 643 static void rc_change_speed(struct riscom_board *bp, struct riscom_port *port)
 
 645         struct tty_struct *tty;
 
 648         unsigned char cor1 = 0, cor3 = 0;
 
 649         unsigned char mcor1 = 0, mcor2 = 0;
 
 651         if (!(tty = port->tty) || !tty->termios)
 
 656         port->MSVR = MSVR_RTS;
 
 658         baud = tty_get_baud_rate(tty);
 
 660         /* Select port on the board */
 
 661         rc_out(bp, CD180_CAR, port_No(port));
 
 664                 /* Drop DTR & exit */
 
 665                 bp->DTR |= (1u << port_No(port));
 
 666                 rc_out(bp, RC_DTR, bp->DTR);
 
 670                 bp->DTR &= ~(1u << port_No(port));
 
 671                 rc_out(bp, RC_DTR, bp->DTR);
 
 675          * Now we must calculate some speed depended things 
 
 678         /* Set baud rate for port */
 
 679         tmp = (((RC_OSCFREQ + baud/2) / baud +
 
 680                 CD180_TPC/2) / CD180_TPC);
 
 682         rc_out(bp, CD180_RBPRH, (tmp >> 8) & 0xff); 
 
 683         rc_out(bp, CD180_TBPRH, (tmp >> 8) & 0xff); 
 
 684         rc_out(bp, CD180_RBPRL, tmp & 0xff); 
 
 685         rc_out(bp, CD180_TBPRL, tmp & 0xff);
 
 687         baud = (baud + 5) / 10;   /* Estimated CPS */
 
 689         /* Two timer ticks seems enough to wakeup something like SLIP driver */
 
 690         tmp = ((baud + HZ/2) / HZ) * 2 - CD180_NFIFO;           
 
 691         port->wakeup_chars = (tmp < 0) ? 0 : ((tmp >= SERIAL_XMIT_SIZE) ?
 
 692                                               SERIAL_XMIT_SIZE - 1 : tmp);
 
 694         /* Receiver timeout will be transmission time for 1.5 chars */
 
 695         tmp = (RISCOM_TPS + RISCOM_TPS/2 + baud/2) / baud;
 
 696         tmp = (tmp > 0xff) ? 0xff : tmp;
 
 697         rc_out(bp, CD180_RTPR, tmp);
 
 699         switch (C_CSIZE(tty))  {
 
 719                 cor1 |= COR1_NORMPAR;
 
 723                         cor1 &= ~COR1_IGNORE;
 
 725         /* Set marking of some errors */
 
 726         port->mark_mask = RCSR_OE | RCSR_TOUT;
 
 728                 port->mark_mask |= RCSR_FE | RCSR_PE;
 
 729         if (I_BRKINT(tty) || I_PARMRK(tty)) 
 
 730                 port->mark_mask |= RCSR_BREAK;
 
 732                 port->mark_mask &= ~(RCSR_FE | RCSR_PE);
 
 734                 port->mark_mask &= ~RCSR_BREAK;
 
 736                         /* Real raw mode. Ignore all */
 
 737                         port->mark_mask &= ~RCSR_OE;
 
 739         /* Enable Hardware Flow Control */
 
 740         if (C_CRTSCTS(tty))  {
 
 741 #ifdef RISCOM_BRAIN_DAMAGED_CTS
 
 742                 port->IER |= IER_DSR | IER_CTS;
 
 743                 mcor1 |= MCOR1_DSRZD | MCOR1_CTSZD;
 
 744                 mcor2 |= MCOR2_DSROD | MCOR2_CTSOD;
 
 745                 tty->hw_stopped = !(rc_in(bp, CD180_MSVR) & (MSVR_CTS|MSVR_DSR));
 
 747                 port->COR2 |= COR2_CTSAE;
 
 750         /* Enable Software Flow Control. FIXME: I'm not sure about this */
 
 751         /* Some people reported that it works, but I still doubt */
 
 753                 port->COR2 |= COR2_TXIBE;
 
 754                 cor3 |= (COR3_FCT | COR3_SCDE);
 
 756                         port->COR2 |= COR2_IXM;
 
 757                 rc_out(bp, CD180_SCHR1, START_CHAR(tty));
 
 758                 rc_out(bp, CD180_SCHR2, STOP_CHAR(tty));
 
 759                 rc_out(bp, CD180_SCHR3, START_CHAR(tty));
 
 760                 rc_out(bp, CD180_SCHR4, STOP_CHAR(tty));
 
 762         if (!C_CLOCAL(tty))  {
 
 763                 /* Enable CD check */
 
 770                 /* Enable receiver */
 
 771                 port->IER |= IER_RXD;
 
 773         /* Set input FIFO size (1-8 bytes) */
 
 774         cor3 |= RISCOM_RXFIFO; 
 
 775         /* Setting up CD180 channel registers */
 
 776         rc_out(bp, CD180_COR1, cor1);
 
 777         rc_out(bp, CD180_COR2, port->COR2);
 
 778         rc_out(bp, CD180_COR3, cor3);
 
 779         /* Make CD180 know about registers change */
 
 781         rc_out(bp, CD180_CCR, CCR_CORCHG1 | CCR_CORCHG2 | CCR_CORCHG3);
 
 782         /* Setting up modem option registers */
 
 783         rc_out(bp, CD180_MCOR1, mcor1);
 
 784         rc_out(bp, CD180_MCOR2, mcor2);
 
 785         /* Enable CD180 transmitter & receiver */
 
 787         rc_out(bp, CD180_CCR, CCR_TXEN | CCR_RXEN);
 
 788         /* Enable interrupts */
 
 789         rc_out(bp, CD180_IER, port->IER);
 
 790         /* And finally set RTS on */
 
 791         rc_out(bp, CD180_MSVR, port->MSVR);
 
 794 /* Must be called with interrupts enabled */
 
 795 static int rc_setup_port(struct riscom_board *bp, struct riscom_port *port)
 
 799         if (port->flags & ASYNC_INITIALIZED)
 
 802         if (!port->xmit_buf) {
 
 803                 /* We may sleep in get_zeroed_page() */
 
 806                 if (!(tmp = get_zeroed_page(GFP_KERNEL)))
 
 809                 if (port->xmit_buf) {
 
 813                 port->xmit_buf = (unsigned char *) tmp;
 
 816         save_flags(flags); cli();
 
 819                 clear_bit(TTY_IO_ERROR, &port->tty->flags);
 
 821         if (port->count == 1) 
 
 824         port->xmit_cnt = port->xmit_head = port->xmit_tail = 0;
 
 825         rc_change_speed(bp, port);
 
 826         port->flags |= ASYNC_INITIALIZED;
 
 828         restore_flags(flags);
 
 832 /* Must be called with interrupts disabled */
 
 833 static void rc_shutdown_port(struct riscom_board *bp, struct riscom_port *port)
 
 835         struct tty_struct *tty;
 
 837         if (!(port->flags & ASYNC_INITIALIZED)) 
 
 840 #ifdef RC_REPORT_OVERRUN
 
 841         printk(KERN_INFO "rc%d: port %d: Total %ld overruns were detected.\n",
 
 842                board_No(bp), port_No(port), port->overrun);
 
 844 #ifdef RC_REPORT_FIFO
 
 848                 printk(KERN_INFO "rc%d: port %d: FIFO hits [ ",
 
 849                        board_No(bp), port_No(port));
 
 850                 for (i = 0; i < 10; i++)  {
 
 851                         printk("%ld ", port->hits[i]);
 
 856         if (port->xmit_buf)  {
 
 857                 free_page((unsigned long) port->xmit_buf);
 
 858                 port->xmit_buf = NULL;
 
 861         if (!(tty = port->tty) || C_HUPCL(tty))  {
 
 863                 bp->DTR |= (1u << port_No(port));
 
 864                 rc_out(bp, RC_DTR, bp->DTR);
 
 868         rc_out(bp, CD180_CAR, port_No(port));
 
 871         rc_out(bp, CD180_CCR, CCR_SOFTRESET);
 
 872         /* Disable all interrupts from this port */
 
 874         rc_out(bp, CD180_IER, port->IER);
 
 877                 set_bit(TTY_IO_ERROR, &tty->flags);
 
 878         port->flags &= ~ASYNC_INITIALIZED;
 
 880         if (--bp->count < 0)  {
 
 881                 printk(KERN_INFO "rc%d: rc_shutdown_port: "
 
 882                                  "bad board count: %d\n",
 
 883                        board_No(bp), bp->count);
 
 888          * If this is the last opened port on the board
 
 889          * shutdown whole board
 
 892                 rc_shutdown_board(bp);
 
 896 static int block_til_ready(struct tty_struct *tty, struct file * filp,
 
 897                            struct riscom_port *port)
 
 899         DECLARE_WAITQUEUE(wait, current);
 
 900         struct riscom_board *bp = port_Board(port);
 
 906          * If the device is in the middle of being closed, then block
 
 907          * until it's done, and then try again.
 
 909         if (tty_hung_up_p(filp) || port->flags & ASYNC_CLOSING) {
 
 910                 interruptible_sleep_on(&port->close_wait);
 
 911                 if (port->flags & ASYNC_HUP_NOTIFY)
 
 918          * If non-blocking mode is set, or the port is not enabled,
 
 919          * then make the check up front and then exit.
 
 921         if ((filp->f_flags & O_NONBLOCK) ||
 
 922             (tty->flags & (1 << TTY_IO_ERROR))) {
 
 923                 port->flags |= ASYNC_NORMAL_ACTIVE;
 
 931          * Block waiting for the carrier detect and the line to become
 
 932          * free (i.e., not in use by the callout).  While we are in
 
 933          * this loop, info->count is dropped by one, so that
 
 934          * rs_close() knows when to free things.  We restore it upon
 
 935          * exit, either normal or abnormal.
 
 938         add_wait_queue(&port->open_wait, &wait);
 
 940         if (!tty_hung_up_p(filp))
 
 943         port->blocked_open++;
 
 946                 rc_out(bp, CD180_CAR, port_No(port));
 
 947                 CD = rc_in(bp, CD180_MSVR) & MSVR_CD;
 
 948                 rc_out(bp, CD180_MSVR, MSVR_RTS);
 
 949                 bp->DTR &= ~(1u << port_No(port));
 
 950                 rc_out(bp, RC_DTR, bp->DTR);
 
 952                 set_current_state(TASK_INTERRUPTIBLE);
 
 953                 if (tty_hung_up_p(filp) ||
 
 954                     !(port->flags & ASYNC_INITIALIZED)) {
 
 955                         if (port->flags & ASYNC_HUP_NOTIFY)
 
 958                                 retval = -ERESTARTSYS;  
 
 961                 if (!(port->flags & ASYNC_CLOSING) &&
 
 964                 if (signal_pending(current)) {
 
 965                         retval = -ERESTARTSYS;
 
 970         __set_current_state(TASK_RUNNING);
 
 971         remove_wait_queue(&port->open_wait, &wait);
 
 972         if (!tty_hung_up_p(filp))
 
 974         port->blocked_open--;
 
 978         port->flags |= ASYNC_NORMAL_ACTIVE;
 
 982 static int rc_open(struct tty_struct * tty, struct file * filp)
 
 986         struct riscom_port * port;
 
 987         struct riscom_board * bp;
 
 989         board = RC_BOARD(tty->index);
 
 990         if (board >= RC_NBOARD || !(rc_board[board].flags & RC_BOARD_PRESENT))
 
 993         bp = &rc_board[board];
 
 994         port = rc_port + board * RC_NPORT + RC_PORT(tty->index);
 
 995         if (rc_paranoia_check(port, tty->name, "rc_open"))
 
 998         if ((error = rc_setup_board(bp))) 
 
1002         tty->driver_data = port;
 
1005         if ((error = rc_setup_port(bp, port))) 
 
1008         if ((error = block_til_ready(tty, filp, port)))
 
1014 static void rc_close(struct tty_struct * tty, struct file * filp)
 
1016         struct riscom_port *port = (struct riscom_port *) tty->driver_data;
 
1017         struct riscom_board *bp;
 
1018         unsigned long flags;
 
1019         unsigned long timeout;
 
1021         if (!port || rc_paranoia_check(port, tty->name, "close"))
 
1024         save_flags(flags); cli();
 
1025         if (tty_hung_up_p(filp))
 
1028         bp = port_Board(port);
 
1029         if ((tty->count == 1) && (port->count != 1))  {
 
1030                 printk(KERN_INFO "rc%d: rc_close: bad port count;"
 
1031                        " tty->count is 1, port count is %d\n",
 
1032                        board_No(bp), port->count);
 
1035         if (--port->count < 0)  {
 
1036                 printk(KERN_INFO "rc%d: rc_close: bad port count "
 
1038                        board_No(bp), port_No(port), port->count);
 
1043         port->flags |= ASYNC_CLOSING;
 
1045          * Now we wait for the transmit buffer to clear; and we notify 
 
1046          * the line discipline to only process XON/XOFF characters.
 
1049         if (port->closing_wait != ASYNC_CLOSING_WAIT_NONE)
 
1050                 tty_wait_until_sent(tty, port->closing_wait);
 
1052          * At this point we stop accepting input.  To do this, we
 
1053          * disable the receive line status interrupts, and tell the
 
1054          * interrupt driver to stop checking the data ready bit in the
 
1055          * line status register.
 
1057         port->IER &= ~IER_RXD;
 
1058         if (port->flags & ASYNC_INITIALIZED) {
 
1059                 port->IER &= ~IER_TXRDY;
 
1060                 port->IER |= IER_TXEMPTY;
 
1061                 rc_out(bp, CD180_CAR, port_No(port));
 
1062                 rc_out(bp, CD180_IER, port->IER);
 
1064                  * Before we drop DTR, make sure the UART transmitter
 
1065                  * has completely drained; this is especially
 
1066                  * important if there is a transmit FIFO!
 
1068                 timeout = jiffies+HZ;
 
1069                 while(port->IER & IER_TXEMPTY)  {
 
1070                         msleep_interruptible(jiffies_to_msecs(port->timeout));
 
1071                         if (time_after(jiffies, timeout))
 
1075         rc_shutdown_port(bp, port);
 
1076         if (tty->driver->flush_buffer)
 
1077                 tty->driver->flush_buffer(tty);
 
1078         tty_ldisc_flush(tty);
 
1083         if (port->blocked_open) {
 
1084                 if (port->close_delay) {
 
1085                         msleep_interruptible(jiffies_to_msecs(port->close_delay));
 
1087                 wake_up_interruptible(&port->open_wait);
 
1089         port->flags &= ~(ASYNC_NORMAL_ACTIVE|ASYNC_CLOSING);
 
1090         wake_up_interruptible(&port->close_wait);
 
1091 out:    restore_flags(flags);
 
1094 static int rc_write(struct tty_struct * tty, 
 
1095                     const unsigned char *buf, int count)
 
1097         struct riscom_port *port = (struct riscom_port *)tty->driver_data;
 
1098         struct riscom_board *bp;
 
1100         unsigned long flags;
 
1102         if (rc_paranoia_check(port, tty->name, "rc_write"))
 
1105         bp = port_Board(port);
 
1107         if (!tty || !port->xmit_buf)
 
1113                 c = min_t(int, count, min(SERIAL_XMIT_SIZE - port->xmit_cnt - 1,
 
1114                                           SERIAL_XMIT_SIZE - port->xmit_head));
 
1116                         restore_flags(flags);
 
1120                 memcpy(port->xmit_buf + port->xmit_head, buf, c);
 
1121                 port->xmit_head = (port->xmit_head + c) & (SERIAL_XMIT_SIZE-1);
 
1122                 port->xmit_cnt += c;
 
1123                 restore_flags(flags);
 
1131         if (port->xmit_cnt && !tty->stopped && !tty->hw_stopped &&
 
1132             !(port->IER & IER_TXRDY)) {
 
1133                 port->IER |= IER_TXRDY;
 
1134                 rc_out(bp, CD180_CAR, port_No(port));
 
1135                 rc_out(bp, CD180_IER, port->IER);
 
1137         restore_flags(flags);
 
1142 static void rc_put_char(struct tty_struct * tty, unsigned char ch)
 
1144         struct riscom_port *port = (struct riscom_port *)tty->driver_data;
 
1145         unsigned long flags;
 
1147         if (rc_paranoia_check(port, tty->name, "rc_put_char"))
 
1150         if (!tty || !port->xmit_buf)
 
1153         save_flags(flags); cli();
 
1155         if (port->xmit_cnt >= SERIAL_XMIT_SIZE - 1)
 
1158         port->xmit_buf[port->xmit_head++] = ch;
 
1159         port->xmit_head &= SERIAL_XMIT_SIZE - 1;
 
1161 out:    restore_flags(flags);
 
1164 static void rc_flush_chars(struct tty_struct * tty)
 
1166         struct riscom_port *port = (struct riscom_port *)tty->driver_data;
 
1167         unsigned long flags;
 
1169         if (rc_paranoia_check(port, tty->name, "rc_flush_chars"))
 
1172         if (port->xmit_cnt <= 0 || tty->stopped || tty->hw_stopped ||
 
1176         save_flags(flags); cli();
 
1177         port->IER |= IER_TXRDY;
 
1178         rc_out(port_Board(port), CD180_CAR, port_No(port));
 
1179         rc_out(port_Board(port), CD180_IER, port->IER);
 
1180         restore_flags(flags);
 
1183 static int rc_write_room(struct tty_struct * tty)
 
1185         struct riscom_port *port = (struct riscom_port *)tty->driver_data;
 
1188         if (rc_paranoia_check(port, tty->name, "rc_write_room"))
 
1191         ret = SERIAL_XMIT_SIZE - port->xmit_cnt - 1;
 
1197 static int rc_chars_in_buffer(struct tty_struct *tty)
 
1199         struct riscom_port *port = (struct riscom_port *)tty->driver_data;
 
1201         if (rc_paranoia_check(port, tty->name, "rc_chars_in_buffer"))
 
1204         return port->xmit_cnt;
 
1207 static void rc_flush_buffer(struct tty_struct *tty)
 
1209         struct riscom_port *port = (struct riscom_port *)tty->driver_data;
 
1210         unsigned long flags;
 
1212         if (rc_paranoia_check(port, tty->name, "rc_flush_buffer"))
 
1215         save_flags(flags); cli();
 
1216         port->xmit_cnt = port->xmit_head = port->xmit_tail = 0;
 
1217         restore_flags(flags);
 
1222 static int rc_tiocmget(struct tty_struct *tty, struct file *file)
 
1224         struct riscom_port *port = (struct riscom_port *)tty->driver_data;
 
1225         struct riscom_board * bp;
 
1226         unsigned char status;
 
1227         unsigned int result;
 
1228         unsigned long flags;
 
1230         if (rc_paranoia_check(port, tty->name, __FUNCTION__))
 
1233         bp = port_Board(port);
 
1234         save_flags(flags); cli();
 
1235         rc_out(bp, CD180_CAR, port_No(port));
 
1236         status = rc_in(bp, CD180_MSVR);
 
1237         result = rc_in(bp, RC_RI) & (1u << port_No(port)) ? 0 : TIOCM_RNG;
 
1238         restore_flags(flags);
 
1239         result |= ((status & MSVR_RTS) ? TIOCM_RTS : 0)
 
1240                 | ((status & MSVR_DTR) ? TIOCM_DTR : 0)
 
1241                 | ((status & MSVR_CD)  ? TIOCM_CAR : 0)
 
1242                 | ((status & MSVR_DSR) ? TIOCM_DSR : 0)
 
1243                 | ((status & MSVR_CTS) ? TIOCM_CTS : 0);
 
1247 static int rc_tiocmset(struct tty_struct *tty, struct file *file,
 
1248                        unsigned int set, unsigned int clear)
 
1250         struct riscom_port *port = (struct riscom_port *)tty->driver_data;
 
1251         unsigned long flags;
 
1252         struct riscom_board *bp;
 
1254         if (rc_paranoia_check(port, tty->name, __FUNCTION__))
 
1257         bp = port_Board(port);
 
1259         save_flags(flags); cli();
 
1260         if (set & TIOCM_RTS)
 
1261                 port->MSVR |= MSVR_RTS;
 
1262         if (set & TIOCM_DTR)
 
1263                 bp->DTR &= ~(1u << port_No(port));
 
1265         if (clear & TIOCM_RTS)
 
1266                 port->MSVR &= ~MSVR_RTS;
 
1267         if (clear & TIOCM_DTR)
 
1268                 bp->DTR |= (1u << port_No(port));
 
1270         rc_out(bp, CD180_CAR, port_No(port));
 
1271         rc_out(bp, CD180_MSVR, port->MSVR);
 
1272         rc_out(bp, RC_DTR, bp->DTR);
 
1273         restore_flags(flags);
 
1277 static inline void rc_send_break(struct riscom_port * port, unsigned long length)
 
1279         struct riscom_board *bp = port_Board(port);
 
1280         unsigned long flags;
 
1282         save_flags(flags); cli();
 
1283         port->break_length = RISCOM_TPS / HZ * length;
 
1284         port->COR2 |= COR2_ETC;
 
1285         port->IER  |= IER_TXRDY;
 
1286         rc_out(bp, CD180_CAR, port_No(port));
 
1287         rc_out(bp, CD180_COR2, port->COR2);
 
1288         rc_out(bp, CD180_IER, port->IER);
 
1290         rc_out(bp, CD180_CCR, CCR_CORCHG2);
 
1292         restore_flags(flags);
 
1295 static inline int rc_set_serial_info(struct riscom_port * port,
 
1296                                      struct serial_struct __user * newinfo)
 
1298         struct serial_struct tmp;
 
1299         struct riscom_board *bp = port_Board(port);
 
1301         unsigned long flags;
 
1303         if (copy_from_user(&tmp, newinfo, sizeof(tmp)))
 
1307         if ((tmp.irq != bp->irq) ||
 
1308             (tmp.port != bp->base) ||
 
1309             (tmp.type != PORT_CIRRUS) ||
 
1310             (tmp.baud_base != (RC_OSCFREQ + CD180_TPC/2) / CD180_TPC) ||
 
1311             (tmp.custom_divisor != 0) ||
 
1312             (tmp.xmit_fifo_size != CD180_NFIFO) ||
 
1313             (tmp.flags & ~RISCOM_LEGAL_FLAGS))
 
1317         change_speed = ((port->flags & ASYNC_SPD_MASK) !=
 
1318                         (tmp.flags & ASYNC_SPD_MASK));
 
1320         if (!capable(CAP_SYS_ADMIN)) {
 
1321                 if ((tmp.close_delay != port->close_delay) ||
 
1322                     (tmp.closing_wait != port->closing_wait) ||
 
1323                     ((tmp.flags & ~ASYNC_USR_MASK) !=
 
1324                      (port->flags & ~ASYNC_USR_MASK)))  
 
1326                 port->flags = ((port->flags & ~ASYNC_USR_MASK) |
 
1327                                (tmp.flags & ASYNC_USR_MASK));
 
1329                 port->flags = ((port->flags & ~ASYNC_FLAGS) |
 
1330                                (tmp.flags & ASYNC_FLAGS));
 
1331                 port->close_delay = tmp.close_delay;
 
1332                 port->closing_wait = tmp.closing_wait;
 
1335                 save_flags(flags); cli();
 
1336                 rc_change_speed(bp, port);
 
1337                 restore_flags(flags);
 
1342 static inline int rc_get_serial_info(struct riscom_port * port,
 
1343                                      struct serial_struct __user *retinfo)
 
1345         struct serial_struct tmp;
 
1346         struct riscom_board *bp = port_Board(port);
 
1348         memset(&tmp, 0, sizeof(tmp));
 
1349         tmp.type = PORT_CIRRUS;
 
1350         tmp.line = port - rc_port;
 
1351         tmp.port = bp->base;
 
1353         tmp.flags = port->flags;
 
1354         tmp.baud_base = (RC_OSCFREQ + CD180_TPC/2) / CD180_TPC;
 
1355         tmp.close_delay = port->close_delay * HZ/100;
 
1356         tmp.closing_wait = port->closing_wait * HZ/100;
 
1357         tmp.xmit_fifo_size = CD180_NFIFO;
 
1358         return copy_to_user(retinfo, &tmp, sizeof(tmp)) ? -EFAULT : 0;
 
1361 static int rc_ioctl(struct tty_struct * tty, struct file * filp, 
 
1362                     unsigned int cmd, unsigned long arg)
 
1365         struct riscom_port *port = (struct riscom_port *)tty->driver_data;
 
1366         void __user *argp = (void __user *)arg;
 
1369         if (rc_paranoia_check(port, tty->name, "rc_ioctl"))
 
1373          case TCSBRK:   /* SVID version: non-zero arg --> no break */
 
1374                 retval = tty_check_change(tty);
 
1377                 tty_wait_until_sent(tty, 0);
 
1379                         rc_send_break(port, HZ/4);      /* 1/4 second */
 
1381          case TCSBRKP:  /* support for POSIX tcsendbreak() */
 
1382                 retval = tty_check_change(tty);
 
1385                 tty_wait_until_sent(tty, 0);
 
1386                 rc_send_break(port, arg ? arg*(HZ/10) : HZ/4);
 
1389                 return put_user(C_CLOCAL(tty) ? 1 : 0, (unsigned __user *)argp);
 
1391                 if (get_user(arg,(unsigned __user *) argp))
 
1393                 tty->termios->c_cflag =
 
1394                         ((tty->termios->c_cflag & ~CLOCAL) |
 
1395                         (arg ? CLOCAL : 0));
 
1398                 return rc_get_serial_info(port, argp);
 
1400                 return rc_set_serial_info(port, argp);
 
1402                 return -ENOIOCTLCMD;
 
1407 static void rc_throttle(struct tty_struct * tty)
 
1409         struct riscom_port *port = (struct riscom_port *)tty->driver_data;
 
1410         struct riscom_board *bp;
 
1411         unsigned long flags;
 
1413         if (rc_paranoia_check(port, tty->name, "rc_throttle"))
 
1416         bp = port_Board(port);
 
1418         save_flags(flags); cli();
 
1419         port->MSVR &= ~MSVR_RTS;
 
1420         rc_out(bp, CD180_CAR, port_No(port));
 
1423                 rc_out(bp, CD180_CCR, CCR_SSCH2);
 
1426         rc_out(bp, CD180_MSVR, port->MSVR);
 
1427         restore_flags(flags);
 
1430 static void rc_unthrottle(struct tty_struct * tty)
 
1432         struct riscom_port *port = (struct riscom_port *)tty->driver_data;
 
1433         struct riscom_board *bp;
 
1434         unsigned long flags;
 
1436         if (rc_paranoia_check(port, tty->name, "rc_unthrottle"))
 
1439         bp = port_Board(port);
 
1441         save_flags(flags); cli();
 
1442         port->MSVR |= MSVR_RTS;
 
1443         rc_out(bp, CD180_CAR, port_No(port));
 
1446                 rc_out(bp, CD180_CCR, CCR_SSCH1);
 
1449         rc_out(bp, CD180_MSVR, port->MSVR);
 
1450         restore_flags(flags);
 
1453 static void rc_stop(struct tty_struct * tty)
 
1455         struct riscom_port *port = (struct riscom_port *)tty->driver_data;
 
1456         struct riscom_board *bp;
 
1457         unsigned long flags;
 
1459         if (rc_paranoia_check(port, tty->name, "rc_stop"))
 
1462         bp = port_Board(port);
 
1464         save_flags(flags); cli();
 
1465         port->IER &= ~IER_TXRDY;
 
1466         rc_out(bp, CD180_CAR, port_No(port));
 
1467         rc_out(bp, CD180_IER, port->IER);
 
1468         restore_flags(flags);
 
1471 static void rc_start(struct tty_struct * tty)
 
1473         struct riscom_port *port = (struct riscom_port *)tty->driver_data;
 
1474         struct riscom_board *bp;
 
1475         unsigned long flags;
 
1477         if (rc_paranoia_check(port, tty->name, "rc_start"))
 
1480         bp = port_Board(port);
 
1482         save_flags(flags); cli();
 
1483         if (port->xmit_cnt && port->xmit_buf && !(port->IER & IER_TXRDY))  {
 
1484                 port->IER |= IER_TXRDY;
 
1485                 rc_out(bp, CD180_CAR, port_No(port));
 
1486                 rc_out(bp, CD180_IER, port->IER);
 
1488         restore_flags(flags);
 
1492  * This routine is called from the work queue when the interrupt
 
1493  * routine has signalled that a hangup has occurred.  The path of
 
1494  * hangup processing is:
 
1496  *      serial interrupt routine -> (workqueue) ->
 
1497  *      do_rc_hangup() -> tty->hangup() -> rc_hangup()
 
1500 static void do_rc_hangup(struct work_struct *ugly_api)
 
1502         struct riscom_port      *port = container_of(ugly_api, struct riscom_port, tqueue_hangup);
 
1503         struct tty_struct       *tty;
 
1507                 tty_hangup(tty);        /* FIXME: module removal race still here */
 
1510 static void rc_hangup(struct tty_struct * tty)
 
1512         struct riscom_port *port = (struct riscom_port *)tty->driver_data;
 
1513         struct riscom_board *bp;
 
1515         if (rc_paranoia_check(port, tty->name, "rc_hangup"))
 
1518         bp = port_Board(port);
 
1520         rc_shutdown_port(bp, port);
 
1523         port->flags &= ~ASYNC_NORMAL_ACTIVE;
 
1525         wake_up_interruptible(&port->open_wait);
 
1528 static void rc_set_termios(struct tty_struct * tty, struct ktermios * old_termios)
 
1530         struct riscom_port *port = (struct riscom_port *)tty->driver_data;
 
1531         unsigned long flags;
 
1533         if (rc_paranoia_check(port, tty->name, "rc_set_termios"))
 
1536         if (tty->termios->c_cflag == old_termios->c_cflag &&
 
1537             tty->termios->c_iflag == old_termios->c_iflag)
 
1540         save_flags(flags); cli();
 
1541         rc_change_speed(port_Board(port), port);
 
1542         restore_flags(flags);
 
1544         if ((old_termios->c_cflag & CRTSCTS) &&
 
1545             !(tty->termios->c_cflag & CRTSCTS)) {
 
1546                 tty->hw_stopped = 0;
 
1551 static void do_softint(struct work_struct *ugly_api)
 
1553         struct riscom_port      *port = container_of(ugly_api, struct riscom_port, tqueue);
 
1554         struct tty_struct       *tty;
 
1556         if(!(tty = port->tty)) 
 
1559         if (test_and_clear_bit(RS_EVENT_WRITE_WAKEUP, &port->event))
 
1563 static const struct tty_operations riscom_ops = {
 
1567         .put_char = rc_put_char,
 
1568         .flush_chars = rc_flush_chars,
 
1569         .write_room = rc_write_room,
 
1570         .chars_in_buffer = rc_chars_in_buffer,
 
1571         .flush_buffer = rc_flush_buffer,
 
1573         .throttle = rc_throttle,
 
1574         .unthrottle = rc_unthrottle,
 
1575         .set_termios = rc_set_termios,
 
1578         .hangup = rc_hangup,
 
1579         .tiocmget = rc_tiocmget,
 
1580         .tiocmset = rc_tiocmset,
 
1583 static inline int rc_init_drivers(void)
 
1588         riscom_driver = alloc_tty_driver(RC_NBOARD * RC_NPORT);
 
1592         riscom_driver->owner = THIS_MODULE;
 
1593         riscom_driver->name = "ttyL";
 
1594         riscom_driver->major = RISCOM8_NORMAL_MAJOR;
 
1595         riscom_driver->type = TTY_DRIVER_TYPE_SERIAL;
 
1596         riscom_driver->subtype = SERIAL_TYPE_NORMAL;
 
1597         riscom_driver->init_termios = tty_std_termios;
 
1598         riscom_driver->init_termios.c_cflag =
 
1599                 B9600 | CS8 | CREAD | HUPCL | CLOCAL;
 
1600         riscom_driver->init_termios.c_ispeed = 9600;
 
1601         riscom_driver->init_termios.c_ospeed = 9600;
 
1602         riscom_driver->flags = TTY_DRIVER_REAL_RAW;
 
1603         tty_set_operations(riscom_driver, &riscom_ops);
 
1604         if ((error = tty_register_driver(riscom_driver)))  {
 
1605                 put_tty_driver(riscom_driver);
 
1606                 printk(KERN_ERR "rc: Couldn't register RISCom/8 driver, "
 
1612         memset(rc_port, 0, sizeof(rc_port));
 
1613         for (i = 0; i < RC_NPORT * RC_NBOARD; i++)  {
 
1614                 rc_port[i].magic = RISCOM8_MAGIC;
 
1615                 INIT_WORK(&rc_port[i].tqueue, do_softint);
 
1616                 INIT_WORK(&rc_port[i].tqueue_hangup, do_rc_hangup);
 
1617                 rc_port[i].close_delay = 50 * HZ/100;
 
1618                 rc_port[i].closing_wait = 3000 * HZ/100;
 
1619                 init_waitqueue_head(&rc_port[i].open_wait);
 
1620                 init_waitqueue_head(&rc_port[i].close_wait);
 
1626 static void rc_release_drivers(void)
 
1628         unsigned long flags;
 
1632         tty_unregister_driver(riscom_driver);
 
1633         put_tty_driver(riscom_driver);
 
1634         restore_flags(flags);
 
1639  * Called at boot time.
 
1641  * You can specify IO base for up to RC_NBOARD cards,
 
1642  * using line "riscom8=0xiobase1,0xiobase2,.." at LILO prompt.
 
1643  * Note that there will be no probing at default
 
1644  * addresses in this case.
 
1647 static int __init riscom8_setup(char *str)
 
1649         int ints[RC_NBOARD];
 
1652         str = get_options(str, ARRAY_SIZE(ints), ints);
 
1654         for (i = 0; i < RC_NBOARD; i++) {
 
1656                         rc_board[i].base = ints[i+1];
 
1658                         rc_board[i].base = 0;
 
1663 __setup("riscom8=", riscom8_setup);
 
1666 static char banner[] __initdata =
 
1667         KERN_INFO "rc: SDL RISCom/8 card driver v1.1, (c) D.Gorodchanin "
 
1669 static char no_boards_msg[] __initdata =
 
1670         KERN_INFO "rc: No RISCom/8 boards detected.\n";
 
1673  * This routine must be called by kernel at boot time 
 
1675 static int __init riscom8_init(void)
 
1682         if (rc_init_drivers()) 
 
1685         for (i = 0; i < RC_NBOARD; i++) 
 
1686                 if (rc_board[i].base && !rc_probe(&rc_board[i]))  
 
1690                 rc_release_drivers();
 
1691                 printk(no_boards_msg);
 
1702 module_param(iobase, int, 0);
 
1703 module_param(iobase1, int, 0);
 
1704 module_param(iobase2, int, 0);
 
1705 module_param(iobase3, int, 0);
 
1707 MODULE_LICENSE("GPL");
 
1711  * You can setup up to 4 boards (current value of RC_NBOARD)
 
1712  * by specifying "iobase=0xXXX iobase1=0xXXX ..." as insmod parameter.
 
1715 static int __init riscom8_init_module (void)
 
1720         if (iobase || iobase1 || iobase2 || iobase3) {
 
1721                 for(i = 0; i < RC_NBOARD; i++)
 
1722                         rc_board[0].base = 0;
 
1726                 rc_board[0].base = iobase;
 
1728                 rc_board[1].base = iobase1;
 
1730                 rc_board[2].base = iobase2;
 
1732                 rc_board[3].base = iobase3;
 
1735         return riscom8_init();
 
1738 static void __exit riscom8_exit_module (void)
 
1742         rc_release_drivers();
 
1743         for (i = 0; i < RC_NBOARD; i++)  
 
1744                 if (rc_board[i].flags & RC_BOARD_PRESENT) 
 
1745                         rc_release_io_range(&rc_board[i]);
 
1749 module_init(riscom8_init_module);
 
1750 module_exit(riscom8_exit_module);