linux/drivers/tty/serial/jsm/jsm_tty.c
<<
>>
Prefs
   1/************************************************************************
   2 * Copyright 2003 Digi International (www.digi.com)
   3 *
   4 * Copyright (C) 2004 IBM Corporation. All rights reserved.
   5 *
   6 * This program is free software; you can redistribute it and/or modify
   7 * it under the terms of the GNU General Public License as published by
   8 * the Free Software Foundation; either version 2, or (at your option)
   9 * any later version.
  10 *
  11 * This program is distributed in the hope that it will be useful,
  12 * but WITHOUT ANY WARRANTY, EXPRESS OR IMPLIED; without even the
  13 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
  14 * PURPOSE.  See the GNU General Public License for more details.
  15 *
  16 * You should have received a copy of the GNU General Public License
  17 * along with this program; if not, write to the Free Software
  18 * Foundation, Inc., 59 * Temple Place - Suite 330, Boston,
  19 * MA  02111-1307, USA.
  20 *
  21 * Contact Information:
  22 * Scott H Kilau <Scott_Kilau@digi.com>
  23 * Ananda Venkatarman <mansarov@us.ibm.com>
  24 * Modifications:
  25 * 01/19/06:    changed jsm_input routine to use the dynamically allocated
  26 *              tty_buffer changes. Contributors: Scott Kilau and Ananda V.
  27 ***********************************************************************/
  28#include <linux/tty.h>
  29#include <linux/tty_flip.h>
  30#include <linux/serial_reg.h>
  31#include <linux/delay.h>        /* For udelay */
  32#include <linux/pci.h>
  33#include <linux/slab.h>
  34
  35#include "jsm.h"
  36
  37static DECLARE_BITMAP(linemap, MAXLINES);
  38
  39static void jsm_carrier(struct jsm_channel *ch);
  40
  41static inline int jsm_get_mstat(struct jsm_channel *ch)
  42{
  43        unsigned char mstat;
  44        unsigned result;
  45
  46        jsm_printk(IOCTL, INFO, &ch->ch_bd->pci_dev, "start\n");
  47
  48        mstat = (ch->ch_mostat | ch->ch_mistat);
  49
  50        result = 0;
  51
  52        if (mstat & UART_MCR_DTR)
  53                result |= TIOCM_DTR;
  54        if (mstat & UART_MCR_RTS)
  55                result |= TIOCM_RTS;
  56        if (mstat & UART_MSR_CTS)
  57                result |= TIOCM_CTS;
  58        if (mstat & UART_MSR_DSR)
  59                result |= TIOCM_DSR;
  60        if (mstat & UART_MSR_RI)
  61                result |= TIOCM_RI;
  62        if (mstat & UART_MSR_DCD)
  63                result |= TIOCM_CD;
  64
  65        jsm_printk(IOCTL, INFO, &ch->ch_bd->pci_dev, "finish\n");
  66        return result;
  67}
  68
  69static unsigned int jsm_tty_tx_empty(struct uart_port *port)
  70{
  71        return TIOCSER_TEMT;
  72}
  73
  74/*
  75 * Return modem signals to ld.
  76 */
  77static unsigned int jsm_tty_get_mctrl(struct uart_port *port)
  78{
  79        int result;
  80        struct jsm_channel *channel = (struct jsm_channel *)port;
  81
  82        jsm_printk(IOCTL, INFO, &channel->ch_bd->pci_dev, "start\n");
  83
  84        result = jsm_get_mstat(channel);
  85
  86        if (result < 0)
  87                return -ENXIO;
  88
  89        jsm_printk(IOCTL, INFO, &channel->ch_bd->pci_dev, "finish\n");
  90
  91        return result;
  92}
  93
  94/*
  95 * jsm_set_modem_info()
  96 *
  97 * Set modem signals, called by ld.
  98 */
  99static void jsm_tty_set_mctrl(struct uart_port *port, unsigned int mctrl)
 100{
 101        struct jsm_channel *channel = (struct jsm_channel *)port;
 102
 103        jsm_printk(IOCTL, INFO, &channel->ch_bd->pci_dev, "start\n");
 104
 105        if (mctrl & TIOCM_RTS)
 106                channel->ch_mostat |= UART_MCR_RTS;
 107        else
 108                channel->ch_mostat &= ~UART_MCR_RTS;
 109
 110        if (mctrl & TIOCM_DTR)
 111                channel->ch_mostat |= UART_MCR_DTR;
 112        else
 113                channel->ch_mostat &= ~UART_MCR_DTR;
 114
 115        channel->ch_bd->bd_ops->assert_modem_signals(channel);
 116
 117        jsm_printk(IOCTL, INFO, &channel->ch_bd->pci_dev, "finish\n");
 118        udelay(10);
 119}
 120
 121static void jsm_tty_start_tx(struct uart_port *port)
 122{
 123        struct jsm_channel *channel = (struct jsm_channel *)port;
 124
 125        jsm_printk(IOCTL, INFO, &channel->ch_bd->pci_dev, "start\n");
 126
 127        channel->ch_flags &= ~(CH_STOP);
 128        jsm_tty_write(port);
 129
 130        jsm_printk(IOCTL, INFO, &channel->ch_bd->pci_dev, "finish\n");
 131}
 132
 133static void jsm_tty_stop_tx(struct uart_port *port)
 134{
 135        struct jsm_channel *channel = (struct jsm_channel *)port;
 136
 137        jsm_printk(IOCTL, INFO, &channel->ch_bd->pci_dev, "start\n");
 138
 139        channel->ch_flags |= (CH_STOP);
 140
 141        jsm_printk(IOCTL, INFO, &channel->ch_bd->pci_dev, "finish\n");
 142}
 143
 144static void jsm_tty_send_xchar(struct uart_port *port, char ch)
 145{
 146        unsigned long lock_flags;
 147        struct jsm_channel *channel = (struct jsm_channel *)port;
 148        struct ktermios *termios;
 149
 150        spin_lock_irqsave(&port->lock, lock_flags);
 151        termios = port->state->port.tty->termios;
 152        if (ch == termios->c_cc[VSTART])
 153                channel->ch_bd->bd_ops->send_start_character(channel);
 154
 155        if (ch == termios->c_cc[VSTOP])
 156                channel->ch_bd->bd_ops->send_stop_character(channel);
 157        spin_unlock_irqrestore(&port->lock, lock_flags);
 158}
 159
 160static void jsm_tty_stop_rx(struct uart_port *port)
 161{
 162        struct jsm_channel *channel = (struct jsm_channel *)port;
 163
 164        channel->ch_bd->bd_ops->disable_receiver(channel);
 165}
 166
 167static void jsm_tty_enable_ms(struct uart_port *port)
 168{
 169        /* Nothing needed */
 170}
 171
 172static void jsm_tty_break(struct uart_port *port, int break_state)
 173{
 174        unsigned long lock_flags;
 175        struct jsm_channel *channel = (struct jsm_channel *)port;
 176
 177        spin_lock_irqsave(&port->lock, lock_flags);
 178        if (break_state == -1)
 179                channel->ch_bd->bd_ops->send_break(channel);
 180        else
 181                channel->ch_bd->bd_ops->clear_break(channel, 0);
 182
 183        spin_unlock_irqrestore(&port->lock, lock_flags);
 184}
 185
 186static int jsm_tty_open(struct uart_port *port)
 187{
 188        struct jsm_board *brd;
 189        struct jsm_channel *channel = (struct jsm_channel *)port;
 190        struct ktermios *termios;
 191
 192        /* Get board pointer from our array of majors we have allocated */
 193        brd = channel->ch_bd;
 194
 195        /*
 196         * Allocate channel buffers for read/write/error.
 197         * Set flag, so we don't get trounced on.
 198         */
 199        channel->ch_flags |= (CH_OPENING);
 200
 201        /* Drop locks, as malloc with GFP_KERNEL can sleep */
 202
 203        if (!channel->ch_rqueue) {
 204                channel->ch_rqueue = kzalloc(RQUEUESIZE, GFP_KERNEL);
 205                if (!channel->ch_rqueue) {
 206                        jsm_printk(INIT, ERR, &channel->ch_bd->pci_dev,
 207                                "unable to allocate read queue buf");
 208                        return -ENOMEM;
 209                }
 210        }
 211        if (!channel->ch_equeue) {
 212                channel->ch_equeue = kzalloc(EQUEUESIZE, GFP_KERNEL);
 213                if (!channel->ch_equeue) {
 214                        jsm_printk(INIT, ERR, &channel->ch_bd->pci_dev,
 215                                "unable to allocate error queue buf");
 216                        return -ENOMEM;
 217                }
 218        }
 219        if (!channel->ch_wqueue) {
 220                channel->ch_wqueue = kzalloc(WQUEUESIZE, GFP_KERNEL);
 221                if (!channel->ch_wqueue) {
 222                        jsm_printk(INIT, ERR, &channel->ch_bd->pci_dev,
 223                                "unable to allocate write queue buf");
 224                        return -ENOMEM;
 225                }
 226        }
 227
 228        channel->ch_flags &= ~(CH_OPENING);
 229        /*
 230         * Initialize if neither terminal is open.
 231         */
 232        jsm_printk(OPEN, INFO, &channel->ch_bd->pci_dev,
 233                "jsm_open: initializing channel in open...\n");
 234
 235        /*
 236         * Flush input queues.
 237         */
 238        channel->ch_r_head = channel->ch_r_tail = 0;
 239        channel->ch_e_head = channel->ch_e_tail = 0;
 240        channel->ch_w_head = channel->ch_w_tail = 0;
 241
 242        brd->bd_ops->flush_uart_write(channel);
 243        brd->bd_ops->flush_uart_read(channel);
 244
 245        channel->ch_flags = 0;
 246        channel->ch_cached_lsr = 0;
 247        channel->ch_stops_sent = 0;
 248
 249        termios = port->state->port.tty->termios;
 250        channel->ch_c_cflag     = termios->c_cflag;
 251        channel->ch_c_iflag     = termios->c_iflag;
 252        channel->ch_c_oflag     = termios->c_oflag;
 253        channel->ch_c_lflag     = termios->c_lflag;
 254        channel->ch_startc      = termios->c_cc[VSTART];
 255        channel->ch_stopc       = termios->c_cc[VSTOP];
 256
 257        /* Tell UART to init itself */
 258        brd->bd_ops->uart_init(channel);
 259
 260        /*
 261         * Run param in case we changed anything
 262         */
 263        brd->bd_ops->param(channel);
 264
 265        jsm_carrier(channel);
 266
 267        channel->ch_open_count++;
 268
 269        jsm_printk(OPEN, INFO, &channel->ch_bd->pci_dev, "finish\n");
 270        return 0;
 271}
 272
 273static void jsm_tty_close(struct uart_port *port)
 274{
 275        struct jsm_board *bd;
 276        struct ktermios *ts;
 277        struct jsm_channel *channel = (struct jsm_channel *)port;
 278
 279        jsm_printk(CLOSE, INFO, &channel->ch_bd->pci_dev, "start\n");
 280
 281        bd = channel->ch_bd;
 282        ts = port->state->port.tty->termios;
 283
 284        channel->ch_flags &= ~(CH_STOPI);
 285
 286        channel->ch_open_count--;
 287
 288        /*
 289         * If we have HUPCL set, lower DTR and RTS
 290         */
 291        if (channel->ch_c_cflag & HUPCL) {
 292                jsm_printk(CLOSE, INFO, &channel->ch_bd->pci_dev,
 293                        "Close. HUPCL set, dropping DTR/RTS\n");
 294
 295                /* Drop RTS/DTR */
 296                channel->ch_mostat &= ~(UART_MCR_DTR | UART_MCR_RTS);
 297                bd->bd_ops->assert_modem_signals(channel);
 298        }
 299
 300        /* Turn off UART interrupts for this port */
 301        channel->ch_bd->bd_ops->uart_off(channel);
 302
 303        jsm_printk(CLOSE, INFO, &channel->ch_bd->pci_dev, "finish\n");
 304}
 305
 306static void jsm_tty_set_termios(struct uart_port *port,
 307                                 struct ktermios *termios,
 308                                 struct ktermios *old_termios)
 309{
 310        unsigned long lock_flags;
 311        struct jsm_channel *channel = (struct jsm_channel *)port;
 312
 313        spin_lock_irqsave(&port->lock, lock_flags);
 314        channel->ch_c_cflag     = termios->c_cflag;
 315        channel->ch_c_iflag     = termios->c_iflag;
 316        channel->ch_c_oflag     = termios->c_oflag;
 317        channel->ch_c_lflag     = termios->c_lflag;
 318        channel->ch_startc      = termios->c_cc[VSTART];
 319        channel->ch_stopc       = termios->c_cc[VSTOP];
 320
 321        channel->ch_bd->bd_ops->param(channel);
 322        jsm_carrier(channel);
 323        spin_unlock_irqrestore(&port->lock, lock_flags);
 324}
 325
 326static const char *jsm_tty_type(struct uart_port *port)
 327{
 328        return "jsm";
 329}
 330
 331static void jsm_tty_release_port(struct uart_port *port)
 332{
 333}
 334
 335static int jsm_tty_request_port(struct uart_port *port)
 336{
 337        return 0;
 338}
 339
 340static void jsm_config_port(struct uart_port *port, int flags)
 341{
 342        port->type = PORT_JSM;
 343}
 344
 345static struct uart_ops jsm_ops = {
 346        .tx_empty       = jsm_tty_tx_empty,
 347        .set_mctrl      = jsm_tty_set_mctrl,
 348        .get_mctrl      = jsm_tty_get_mctrl,
 349        .stop_tx        = jsm_tty_stop_tx,
 350        .start_tx       = jsm_tty_start_tx,
 351        .send_xchar     = jsm_tty_send_xchar,
 352        .stop_rx        = jsm_tty_stop_rx,
 353        .enable_ms      = jsm_tty_enable_ms,
 354        .break_ctl      = jsm_tty_break,
 355        .startup        = jsm_tty_open,
 356        .shutdown       = jsm_tty_close,
 357        .set_termios    = jsm_tty_set_termios,
 358        .type           = jsm_tty_type,
 359        .release_port   = jsm_tty_release_port,
 360        .request_port   = jsm_tty_request_port,
 361        .config_port    = jsm_config_port,
 362};
 363
 364/*
 365 * jsm_tty_init()
 366 *
 367 * Init the tty subsystem.  Called once per board after board has been
 368 * downloaded and init'ed.
 369 */
 370int __devinit jsm_tty_init(struct jsm_board *brd)
 371{
 372        int i;
 373        void __iomem *vaddr;
 374        struct jsm_channel *ch;
 375
 376        if (!brd)
 377                return -ENXIO;
 378
 379        jsm_printk(INIT, INFO, &brd->pci_dev, "start\n");
 380
 381        /*
 382         * Initialize board structure elements.
 383         */
 384
 385        brd->nasync = brd->maxports;
 386
 387        /*
 388         * Allocate channel memory that might not have been allocated
 389         * when the driver was first loaded.
 390         */
 391        for (i = 0; i < brd->nasync; i++) {
 392                if (!brd->channels[i]) {
 393
 394                        /*
 395                         * Okay to malloc with GFP_KERNEL, we are not at
 396                         * interrupt context, and there are no locks held.
 397                         */
 398                        brd->channels[i] = kzalloc(sizeof(struct jsm_channel), GFP_KERNEL);
 399                        if (!brd->channels[i]) {
 400                                jsm_printk(CORE, ERR, &brd->pci_dev,
 401                                        "%s:%d Unable to allocate memory for channel struct\n",
 402                                                         __FILE__, __LINE__);
 403                        }
 404                }
 405        }
 406
 407        ch = brd->channels[0];
 408        vaddr = brd->re_map_membase;
 409
 410        /* Set up channel variables */
 411        for (i = 0; i < brd->nasync; i++, ch = brd->channels[i]) {
 412
 413                if (!brd->channels[i])
 414                        continue;
 415
 416                spin_lock_init(&ch->ch_lock);
 417
 418                if (brd->bd_uart_offset == 0x200)
 419                        ch->ch_neo_uart =  vaddr + (brd->bd_uart_offset * i);
 420
 421                ch->ch_bd = brd;
 422                ch->ch_portnum = i;
 423
 424                /* .25 second delay */
 425                ch->ch_close_delay = 250;
 426
 427                init_waitqueue_head(&ch->ch_flags_wait);
 428        }
 429
 430        jsm_printk(INIT, INFO, &brd->pci_dev, "finish\n");
 431        return 0;
 432}
 433
 434int jsm_uart_port_init(struct jsm_board *brd)
 435{
 436        int i, rc;
 437        unsigned int line;
 438        struct jsm_channel *ch;
 439
 440        if (!brd)
 441                return -ENXIO;
 442
 443        jsm_printk(INIT, INFO, &brd->pci_dev, "start\n");
 444
 445        /*
 446         * Initialize board structure elements.
 447         */
 448
 449        brd->nasync = brd->maxports;
 450
 451        /* Set up channel variables */
 452        for (i = 0; i < brd->nasync; i++, ch = brd->channels[i]) {
 453
 454                if (!brd->channels[i])
 455                        continue;
 456
 457                brd->channels[i]->uart_port.irq = brd->irq;
 458                brd->channels[i]->uart_port.uartclk = 14745600;
 459                brd->channels[i]->uart_port.type = PORT_JSM;
 460                brd->channels[i]->uart_port.iotype = UPIO_MEM;
 461                brd->channels[i]->uart_port.membase = brd->re_map_membase;
 462                brd->channels[i]->uart_port.fifosize = 16;
 463                brd->channels[i]->uart_port.ops = &jsm_ops;
 464                line = find_first_zero_bit(linemap, MAXLINES);
 465                if (line >= MAXLINES) {
 466                        printk(KERN_INFO "jsm: linemap is full, added device failed\n");
 467                        continue;
 468                } else
 469                        set_bit(line, linemap);
 470                brd->channels[i]->uart_port.line = line;
 471                rc = uart_add_one_port (&jsm_uart_driver, &brd->channels[i]->uart_port);
 472                if (rc){
 473                        printk(KERN_INFO "jsm: Port %d failed. Aborting...\n", i);
 474                        return rc;
 475                }
 476                else
 477                        printk(KERN_INFO "jsm: Port %d added\n", i);
 478        }
 479
 480        jsm_printk(INIT, INFO, &brd->pci_dev, "finish\n");
 481        return 0;
 482}
 483
 484int jsm_remove_uart_port(struct jsm_board *brd)
 485{
 486        int i;
 487        struct jsm_channel *ch;
 488
 489        if (!brd)
 490                return -ENXIO;
 491
 492        jsm_printk(INIT, INFO, &brd->pci_dev, "start\n");
 493
 494        /*
 495         * Initialize board structure elements.
 496         */
 497
 498        brd->nasync = brd->maxports;
 499
 500        /* Set up channel variables */
 501        for (i = 0; i < brd->nasync; i++) {
 502
 503                if (!brd->channels[i])
 504                        continue;
 505
 506                ch = brd->channels[i];
 507
 508                clear_bit(ch->uart_port.line, linemap);
 509                uart_remove_one_port(&jsm_uart_driver, &brd->channels[i]->uart_port);
 510        }
 511
 512        jsm_printk(INIT, INFO, &brd->pci_dev, "finish\n");
 513        return 0;
 514}
 515
 516void jsm_input(struct jsm_channel *ch)
 517{
 518        struct jsm_board *bd;
 519        struct tty_struct *tp;
 520        u32 rmask;
 521        u16 head;
 522        u16 tail;
 523        int data_len;
 524        unsigned long lock_flags;
 525        int len = 0;
 526        int n = 0;
 527        int s = 0;
 528        int i = 0;
 529
 530        jsm_printk(READ, INFO, &ch->ch_bd->pci_dev, "start\n");
 531
 532        if (!ch)
 533                return;
 534
 535        tp = ch->uart_port.state->port.tty;
 536
 537        bd = ch->ch_bd;
 538        if(!bd)
 539                return;
 540
 541        spin_lock_irqsave(&ch->ch_lock, lock_flags);
 542
 543        /*
 544         *Figure the number of characters in the buffer.
 545         *Exit immediately if none.
 546         */
 547
 548        rmask = RQUEUEMASK;
 549
 550        head = ch->ch_r_head & rmask;
 551        tail = ch->ch_r_tail & rmask;
 552
 553        data_len = (head - tail) & rmask;
 554        if (data_len == 0) {
 555                spin_unlock_irqrestore(&ch->ch_lock, lock_flags);
 556                return;
 557        }
 558
 559        jsm_printk(READ, INFO, &ch->ch_bd->pci_dev, "start\n");
 560
 561        /*
 562         *If the device is not open, or CREAD is off, flush
 563         *input data and return immediately.
 564         */
 565        if (!tp ||
 566                !(tp->termios->c_cflag & CREAD) ) {
 567
 568                jsm_printk(READ, INFO, &ch->ch_bd->pci_dev,
 569                        "input. dropping %d bytes on port %d...\n", data_len, ch->ch_portnum);
 570                ch->ch_r_head = tail;
 571
 572                /* Force queue flow control to be released, if needed */
 573                jsm_check_queue_flow_control(ch);
 574
 575                spin_unlock_irqrestore(&ch->ch_lock, lock_flags);
 576                return;
 577        }
 578
 579        /*
 580         * If we are throttled, simply don't read any data.
 581         */
 582        if (ch->ch_flags & CH_STOPI) {
 583                spin_unlock_irqrestore(&ch->ch_lock, lock_flags);
 584                jsm_printk(READ, INFO, &ch->ch_bd->pci_dev,
 585                        "Port %d throttled, not reading any data. head: %x tail: %x\n",
 586                        ch->ch_portnum, head, tail);
 587                return;
 588        }
 589
 590        jsm_printk(READ, INFO, &ch->ch_bd->pci_dev, "start 2\n");
 591
 592        if (data_len <= 0) {
 593                spin_unlock_irqrestore(&ch->ch_lock, lock_flags);
 594                jsm_printk(READ, INFO, &ch->ch_bd->pci_dev, "jsm_input 1\n");
 595                return;
 596        }
 597
 598        len = tty_buffer_request_room(tp, data_len);
 599        n = len;
 600
 601        /*
 602         * n now contains the most amount of data we can copy,
 603         * bounded either by the flip buffer size or the amount
 604         * of data the card actually has pending...
 605         */
 606        while (n) {
 607                s = ((head >= tail) ? head : RQUEUESIZE) - tail;
 608                s = min(s, n);
 609
 610                if (s <= 0)
 611                        break;
 612
 613                        /*
 614                         * If conditions are such that ld needs to see all
 615                         * UART errors, we will have to walk each character
 616                         * and error byte and send them to the buffer one at
 617                         * a time.
 618                         */
 619
 620                if (I_PARMRK(tp) || I_BRKINT(tp) || I_INPCK(tp)) {
 621                        for (i = 0; i < s; i++) {
 622                                /*
 623                                 * Give the Linux ld the flags in the
 624                                 * format it likes.
 625                                 */
 626                                if (*(ch->ch_equeue +tail +i) & UART_LSR_BI)
 627                                        tty_insert_flip_char(tp, *(ch->ch_rqueue +tail +i),  TTY_BREAK);
 628                                else if (*(ch->ch_equeue +tail +i) & UART_LSR_PE)
 629                                        tty_insert_flip_char(tp, *(ch->ch_rqueue +tail +i), TTY_PARITY);
 630                                else if (*(ch->ch_equeue +tail +i) & UART_LSR_FE)
 631                                        tty_insert_flip_char(tp, *(ch->ch_rqueue +tail +i), TTY_FRAME);
 632                                else
 633                                        tty_insert_flip_char(tp, *(ch->ch_rqueue +tail +i), TTY_NORMAL);
 634                        }
 635                } else {
 636                        tty_insert_flip_string(tp, ch->ch_rqueue + tail, s) ;
 637                }
 638                tail += s;
 639                n -= s;
 640                /* Flip queue if needed */
 641                tail &= rmask;
 642        }
 643
 644        ch->ch_r_tail = tail & rmask;
 645        ch->ch_e_tail = tail & rmask;
 646        jsm_check_queue_flow_control(ch);
 647        spin_unlock_irqrestore(&ch->ch_lock, lock_flags);
 648
 649        /* Tell the tty layer its okay to "eat" the data now */
 650        tty_flip_buffer_push(tp);
 651
 652        jsm_printk(IOCTL, INFO, &ch->ch_bd->pci_dev, "finish\n");
 653}
 654
 655static void jsm_carrier(struct jsm_channel *ch)
 656{
 657        struct jsm_board *bd;
 658
 659        int virt_carrier = 0;
 660        int phys_carrier = 0;
 661
 662        jsm_printk(CARR, INFO, &ch->ch_bd->pci_dev, "start\n");
 663        if (!ch)
 664                return;
 665
 666        bd = ch->ch_bd;
 667
 668        if (!bd)
 669                return;
 670
 671        if (ch->ch_mistat & UART_MSR_DCD) {
 672                jsm_printk(CARR, INFO, &ch->ch_bd->pci_dev,
 673                        "mistat: %x D_CD: %x\n", ch->ch_mistat, ch->ch_mistat & UART_MSR_DCD);
 674                phys_carrier = 1;
 675        }
 676
 677        if (ch->ch_c_cflag & CLOCAL)
 678                virt_carrier = 1;
 679
 680        jsm_printk(CARR, INFO, &ch->ch_bd->pci_dev,
 681                "DCD: physical: %d virt: %d\n", phys_carrier, virt_carrier);
 682
 683        /*
 684         * Test for a VIRTUAL carrier transition to HIGH.
 685         */
 686        if (((ch->ch_flags & CH_FCAR) == 0) && (virt_carrier == 1)) {
 687
 688                /*
 689                 * When carrier rises, wake any threads waiting
 690                 * for carrier in the open routine.
 691                 */
 692
 693                jsm_printk(CARR, INFO, &ch->ch_bd->pci_dev,
 694                        "carrier: virt DCD rose\n");
 695
 696                if (waitqueue_active(&(ch->ch_flags_wait)))
 697                        wake_up_interruptible(&ch->ch_flags_wait);
 698        }
 699
 700        /*
 701         * Test for a PHYSICAL carrier transition to HIGH.
 702         */
 703        if (((ch->ch_flags & CH_CD) == 0) && (phys_carrier == 1)) {
 704
 705                /*
 706                 * When carrier rises, wake any threads waiting
 707                 * for carrier in the open routine.
 708                 */
 709
 710                jsm_printk(CARR, INFO, &ch->ch_bd->pci_dev,
 711                        "carrier: physical DCD rose\n");
 712
 713                if (waitqueue_active(&(ch->ch_flags_wait)))
 714                        wake_up_interruptible(&ch->ch_flags_wait);
 715        }
 716
 717        /*
 718         *  Test for a PHYSICAL transition to low, so long as we aren't
 719         *  currently ignoring physical transitions (which is what "virtual
 720         *  carrier" indicates).
 721         *
 722         *  The transition of the virtual carrier to low really doesn't
 723         *  matter... it really only means "ignore carrier state", not
 724         *  "make pretend that carrier is there".
 725         */
 726        if ((virt_carrier == 0) && ((ch->ch_flags & CH_CD) != 0)
 727                        && (phys_carrier == 0)) {
 728                /*
 729                 *      When carrier drops:
 730                 *
 731                 *      Drop carrier on all open units.
 732                 *
 733                 *      Flush queues, waking up any task waiting in the
 734                 *      line discipline.
 735                 *
 736                 *      Send a hangup to the control terminal.
 737                 *
 738                 *      Enable all select calls.
 739                 */
 740                if (waitqueue_active(&(ch->ch_flags_wait)))
 741                        wake_up_interruptible(&ch->ch_flags_wait);
 742        }
 743
 744        /*
 745         *  Make sure that our cached values reflect the current reality.
 746         */
 747        if (virt_carrier == 1)
 748                ch->ch_flags |= CH_FCAR;
 749        else
 750                ch->ch_flags &= ~CH_FCAR;
 751
 752        if (phys_carrier == 1)
 753                ch->ch_flags |= CH_CD;
 754        else
 755                ch->ch_flags &= ~CH_CD;
 756}
 757
 758
 759void jsm_check_queue_flow_control(struct jsm_channel *ch)
 760{
 761        struct board_ops *bd_ops = ch->ch_bd->bd_ops;
 762        int qleft;
 763
 764        /* Store how much space we have left in the queue */
 765        if ((qleft = ch->ch_r_tail - ch->ch_r_head - 1) < 0)
 766                qleft += RQUEUEMASK + 1;
 767
 768        /*
 769         * Check to see if we should enforce flow control on our queue because
 770         * the ld (or user) isn't reading data out of our queue fast enuf.
 771         *
 772         * NOTE: This is done based on what the current flow control of the
 773         * port is set for.
 774         *
 775         * 1) HWFLOW (RTS) - Turn off the UART's Receive interrupt.
 776         *      This will cause the UART's FIFO to back up, and force
 777         *      the RTS signal to be dropped.
 778         * 2) SWFLOW (IXOFF) - Keep trying to send a stop character to
 779         *      the other side, in hopes it will stop sending data to us.
 780         * 3) NONE - Nothing we can do.  We will simply drop any extra data
 781         *      that gets sent into us when the queue fills up.
 782         */
 783        if (qleft < 256) {
 784                /* HWFLOW */
 785                if (ch->ch_c_cflag & CRTSCTS) {
 786                        if(!(ch->ch_flags & CH_RECEIVER_OFF)) {
 787                                bd_ops->disable_receiver(ch);
 788                                ch->ch_flags |= (CH_RECEIVER_OFF);
 789                                jsm_printk(READ, INFO, &ch->ch_bd->pci_dev,
 790                                        "Internal queue hit hilevel mark (%d)! Turning off interrupts.\n",
 791                                        qleft);
 792                        }
 793                }
 794                /* SWFLOW */
 795                else if (ch->ch_c_iflag & IXOFF) {
 796                        if (ch->ch_stops_sent <= MAX_STOPS_SENT) {
 797                                bd_ops->send_stop_character(ch);
 798                                ch->ch_stops_sent++;
 799                                jsm_printk(READ, INFO, &ch->ch_bd->pci_dev,
 800                                        "Sending stop char! Times sent: %x\n", ch->ch_stops_sent);
 801                        }
 802                }
 803        }
 804
 805        /*
 806         * Check to see if we should unenforce flow control because
 807         * ld (or user) finally read enuf data out of our queue.
 808         *
 809         * NOTE: This is done based on what the current flow control of the
 810         * port is set for.
 811         *
 812         * 1) HWFLOW (RTS) - Turn back on the UART's Receive interrupt.
 813         *      This will cause the UART's FIFO to raise RTS back up,
 814         *      which will allow the other side to start sending data again.
 815         * 2) SWFLOW (IXOFF) - Send a start character to
 816         *      the other side, so it will start sending data to us again.
 817         * 3) NONE - Do nothing. Since we didn't do anything to turn off the
 818         *      other side, we don't need to do anything now.
 819         */
 820        if (qleft > (RQUEUESIZE / 2)) {
 821                /* HWFLOW */
 822                if (ch->ch_c_cflag & CRTSCTS) {
 823                        if (ch->ch_flags & CH_RECEIVER_OFF) {
 824                                bd_ops->enable_receiver(ch);
 825                                ch->ch_flags &= ~(CH_RECEIVER_OFF);
 826                                jsm_printk(READ, INFO, &ch->ch_bd->pci_dev,
 827                                        "Internal queue hit lowlevel mark (%d)! Turning on interrupts.\n",
 828                                        qleft);
 829                        }
 830                }
 831                /* SWFLOW */
 832                else if (ch->ch_c_iflag & IXOFF && ch->ch_stops_sent) {
 833                        ch->ch_stops_sent = 0;
 834                        bd_ops->send_start_character(ch);
 835                        jsm_printk(READ, INFO, &ch->ch_bd->pci_dev, "Sending start char!\n");
 836                }
 837        }
 838}
 839
 840/*
 841 * jsm_tty_write()
 842 *
 843 * Take data from the user or kernel and send it out to the FEP.
 844 * In here exists all the Transparent Print magic as well.
 845 */
 846int jsm_tty_write(struct uart_port *port)
 847{
 848        int bufcount;
 849        int data_count = 0,data_count1 =0;
 850        u16 head;
 851        u16 tail;
 852        u16 tmask;
 853        u32 remain;
 854        int temp_tail = port->state->xmit.tail;
 855        struct jsm_channel *channel = (struct jsm_channel *)port;
 856
 857        tmask = WQUEUEMASK;
 858        head = (channel->ch_w_head) & tmask;
 859        tail = (channel->ch_w_tail) & tmask;
 860
 861        if ((bufcount = tail - head - 1) < 0)
 862                bufcount += WQUEUESIZE;
 863
 864        bufcount = min(bufcount, 56);
 865        remain = WQUEUESIZE - head;
 866
 867        data_count = 0;
 868        if (bufcount >= remain) {
 869                bufcount -= remain;
 870                while ((port->state->xmit.head != temp_tail) &&
 871                (data_count < remain)) {
 872                        channel->ch_wqueue[head++] =
 873                        port->state->xmit.buf[temp_tail];
 874
 875                        temp_tail++;
 876                        temp_tail &= (UART_XMIT_SIZE - 1);
 877                        data_count++;
 878                }
 879                if (data_count == remain) head = 0;
 880        }
 881
 882        data_count1 = 0;
 883        if (bufcount > 0) {
 884                remain = bufcount;
 885                while ((port->state->xmit.head != temp_tail) &&
 886                        (data_count1 < remain)) {
 887                        channel->ch_wqueue[head++] =
 888                                port->state->xmit.buf[temp_tail];
 889
 890                        temp_tail++;
 891                        temp_tail &= (UART_XMIT_SIZE - 1);
 892                        data_count1++;
 893
 894                }
 895        }
 896
 897        port->state->xmit.tail = temp_tail;
 898
 899        data_count += data_count1;
 900        if (data_count) {
 901                head &= tmask;
 902                channel->ch_w_head = head;
 903        }
 904
 905        if (data_count) {
 906                channel->ch_bd->bd_ops->copy_data_from_queue_to_uart(channel);
 907        }
 908
 909        return data_count;
 910}
 911