linux/drivers/char/mxser.c
<<
>>
Prefs
   1/*
   2 *          mxser.c  -- MOXA Smartio/Industio family multiport serial driver.
   3 *
   4 *      Copyright (C) 1999-2006  Moxa Technologies (support@moxa.com).
   5 *      Copyright (C) 2006-2008  Jiri Slaby <jirislaby@gmail.com>
   6 *
   7 *      This code is loosely based on the 1.8 moxa driver which is based on
   8 *      Linux serial driver, written by Linus Torvalds, Theodore T'so and
   9 *      others.
  10 *
  11 *      This program is free software; you can redistribute it and/or modify
  12 *      it under the terms of the GNU General Public License as published by
  13 *      the Free Software Foundation; either version 2 of the License, or
  14 *      (at your option) any later version.
  15 *
  16 *      Fed through a cleanup, indent and remove of non 2.6 code by Alan Cox
  17 *      <alan@lxorguk.ukuu.org.uk>. The original 1.8 code is available on
  18 *      www.moxa.com.
  19 *      - Fixed x86_64 cleanness
  20 */
  21
  22#include <linux/module.h>
  23#include <linux/errno.h>
  24#include <linux/signal.h>
  25#include <linux/sched.h>
  26#include <linux/smp_lock.h>
  27#include <linux/timer.h>
  28#include <linux/interrupt.h>
  29#include <linux/tty.h>
  30#include <linux/tty_flip.h>
  31#include <linux/serial.h>
  32#include <linux/serial_reg.h>
  33#include <linux/major.h>
  34#include <linux/string.h>
  35#include <linux/fcntl.h>
  36#include <linux/ptrace.h>
  37#include <linux/gfp.h>
  38#include <linux/ioport.h>
  39#include <linux/mm.h>
  40#include <linux/delay.h>
  41#include <linux/pci.h>
  42#include <linux/bitops.h>
  43
  44#include <asm/system.h>
  45#include <asm/io.h>
  46#include <asm/irq.h>
  47#include <asm/uaccess.h>
  48
  49#include "mxser.h"
  50
  51#define MXSER_VERSION   "2.0.4"         /* 1.12 */
  52#define MXSERMAJOR       174
  53
  54#define MXSER_BOARDS            4       /* Max. boards */
  55#define MXSER_PORTS_PER_BOARD   8       /* Max. ports per board */
  56#define MXSER_PORTS             (MXSER_BOARDS * MXSER_PORTS_PER_BOARD)
  57#define MXSER_ISR_PASS_LIMIT    100
  58
  59/*CheckIsMoxaMust return value*/
  60#define MOXA_OTHER_UART         0x00
  61#define MOXA_MUST_MU150_HWID    0x01
  62#define MOXA_MUST_MU860_HWID    0x02
  63
  64#define WAKEUP_CHARS            256
  65
  66#define UART_MCR_AFE            0x20
  67#define UART_LSR_SPECIAL        0x1E
  68
  69#define PCI_DEVICE_ID_POS104UL  0x1044
  70#define PCI_DEVICE_ID_CB108     0x1080
  71#define PCI_DEVICE_ID_CP102UF   0x1023
  72#define PCI_DEVICE_ID_CB114     0x1142
  73#define PCI_DEVICE_ID_CP114UL   0x1143
  74#define PCI_DEVICE_ID_CB134I    0x1341
  75#define PCI_DEVICE_ID_CP138U    0x1380
  76
  77
  78#define C168_ASIC_ID    1
  79#define C104_ASIC_ID    2
  80#define C102_ASIC_ID    0xB
  81#define CI132_ASIC_ID   4
  82#define CI134_ASIC_ID   3
  83#define CI104J_ASIC_ID  5
  84
  85#define MXSER_HIGHBAUD  1
  86#define MXSER_HAS2      2
  87
  88/* This is only for PCI */
  89static const struct {
  90        int type;
  91        int tx_fifo;
  92        int rx_fifo;
  93        int xmit_fifo_size;
  94        int rx_high_water;
  95        int rx_trigger;
  96        int rx_low_water;
  97        long max_baud;
  98} Gpci_uart_info[] = {
  99        {MOXA_OTHER_UART, 16, 16, 16, 14, 14, 1, 921600L},
 100        {MOXA_MUST_MU150_HWID, 64, 64, 64, 48, 48, 16, 230400L},
 101        {MOXA_MUST_MU860_HWID, 128, 128, 128, 96, 96, 32, 921600L}
 102};
 103#define UART_INFO_NUM   ARRAY_SIZE(Gpci_uart_info)
 104
 105struct mxser_cardinfo {
 106        char *name;
 107        unsigned int nports;
 108        unsigned int flags;
 109};
 110
 111static const struct mxser_cardinfo mxser_cards[] = {
 112/* 0*/  { "C168 series",        8, },
 113        { "C104 series",        4, },
 114        { "CI-104J series",     4, },
 115        { "C168H/PCI series",   8, },
 116        { "C104H/PCI series",   4, },
 117/* 5*/  { "C102 series",        4, MXSER_HAS2 },        /* C102-ISA */
 118        { "CI-132 series",      4, MXSER_HAS2 },
 119        { "CI-134 series",      4, },
 120        { "CP-132 series",      2, },
 121        { "CP-114 series",      4, },
 122/*10*/  { "CT-114 series",      4, },
 123        { "CP-102 series",      2, MXSER_HIGHBAUD },
 124        { "CP-104U series",     4, },
 125        { "CP-168U series",     8, },
 126        { "CP-132U series",     2, },
 127/*15*/  { "CP-134U series",     4, },
 128        { "CP-104JU series",    4, },
 129        { "Moxa UC7000 Serial", 8, },           /* RC7000 */
 130        { "CP-118U series",     8, },
 131        { "CP-102UL series",    2, },
 132/*20*/  { "CP-102U series",     2, },
 133        { "CP-118EL series",    8, },
 134        { "CP-168EL series",    8, },
 135        { "CP-104EL series",    4, },
 136        { "CB-108 series",      8, },
 137/*25*/  { "CB-114 series",      4, },
 138        { "CB-134I series",     4, },
 139        { "CP-138U series",     8, },
 140        { "POS-104UL series",   4, },
 141        { "CP-114UL series",    4, },
 142/*30*/  { "CP-102UF series",    2, }
 143};
 144
 145/* driver_data correspond to the lines in the structure above
 146   see also ISA probe function before you change something */
 147static struct pci_device_id mxser_pcibrds[] = {
 148        { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_C168),   .driver_data = 3 },
 149        { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_C104),   .driver_data = 4 },
 150        { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP132),  .driver_data = 8 },
 151        { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP114),  .driver_data = 9 },
 152        { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CT114),  .driver_data = 10 },
 153        { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP102),  .driver_data = 11 },
 154        { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP104U), .driver_data = 12 },
 155        { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP168U), .driver_data = 13 },
 156        { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP132U), .driver_data = 14 },
 157        { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP134U), .driver_data = 15 },
 158        { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP104JU),.driver_data = 16 },
 159        { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_RC7000), .driver_data = 17 },
 160        { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP118U), .driver_data = 18 },
 161        { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP102UL),.driver_data = 19 },
 162        { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP102U), .driver_data = 20 },
 163        { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP118EL),.driver_data = 21 },
 164        { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP168EL),.driver_data = 22 },
 165        { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_MOXA_CP104EL),.driver_data = 23 },
 166        { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_CB108),       .driver_data = 24 },
 167        { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_CB114),       .driver_data = 25 },
 168        { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_CB134I),      .driver_data = 26 },
 169        { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_CP138U),      .driver_data = 27 },
 170        { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_POS104UL),    .driver_data = 28 },
 171        { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_CP114UL),     .driver_data = 29 },
 172        { PCI_VDEVICE(MOXA, PCI_DEVICE_ID_CP102UF),     .driver_data = 30 },
 173        { }
 174};
 175MODULE_DEVICE_TABLE(pci, mxser_pcibrds);
 176
 177static unsigned long ioaddr[MXSER_BOARDS];
 178static int ttymajor = MXSERMAJOR;
 179
 180/* Variables for insmod */
 181
 182MODULE_AUTHOR("Casper Yang");
 183MODULE_DESCRIPTION("MOXA Smartio/Industio Family Multiport Board Device Driver");
 184module_param_array(ioaddr, ulong, NULL, 0);
 185MODULE_PARM_DESC(ioaddr, "ISA io addresses to look for a moxa board");
 186module_param(ttymajor, int, 0);
 187MODULE_LICENSE("GPL");
 188
 189struct mxser_log {
 190        int tick;
 191        unsigned long rxcnt[MXSER_PORTS];
 192        unsigned long txcnt[MXSER_PORTS];
 193};
 194
 195struct mxser_mon {
 196        unsigned long rxcnt;
 197        unsigned long txcnt;
 198        unsigned long up_rxcnt;
 199        unsigned long up_txcnt;
 200        int modem_status;
 201        unsigned char hold_reason;
 202};
 203
 204struct mxser_mon_ext {
 205        unsigned long rx_cnt[32];
 206        unsigned long tx_cnt[32];
 207        unsigned long up_rxcnt[32];
 208        unsigned long up_txcnt[32];
 209        int modem_status[32];
 210
 211        long baudrate[32];
 212        int databits[32];
 213        int stopbits[32];
 214        int parity[32];
 215        int flowctrl[32];
 216        int fifo[32];
 217        int iftype[32];
 218};
 219
 220struct mxser_board;
 221
 222struct mxser_port {
 223        struct tty_port port;
 224        struct mxser_board *board;
 225
 226        unsigned long ioaddr;
 227        unsigned long opmode_ioaddr;
 228        int max_baud;
 229
 230        int rx_high_water;
 231        int rx_trigger;         /* Rx fifo trigger level */
 232        int rx_low_water;
 233        int baud_base;          /* max. speed */
 234        int type;               /* UART type */
 235
 236        int x_char;             /* xon/xoff character */
 237        int IER;                /* Interrupt Enable Register */
 238        int MCR;                /* Modem control register */
 239
 240        unsigned char stop_rx;
 241        unsigned char ldisc_stop_rx;
 242
 243        int custom_divisor;
 244        unsigned char err_shadow;
 245
 246        struct async_icount icount; /* kernel counters for 4 input interrupts */
 247        int timeout;
 248
 249        int read_status_mask;
 250        int ignore_status_mask;
 251        int xmit_fifo_size;
 252        int xmit_head;
 253        int xmit_tail;
 254        int xmit_cnt;
 255
 256        struct ktermios normal_termios;
 257
 258        struct mxser_mon mon_data;
 259
 260        spinlock_t slock;
 261        wait_queue_head_t delta_msr_wait;
 262};
 263
 264struct mxser_board {
 265        unsigned int idx;
 266        int irq;
 267        const struct mxser_cardinfo *info;
 268        unsigned long vector;
 269        unsigned long vector_mask;
 270
 271        int chip_flag;
 272        int uart_type;
 273
 274        struct mxser_port ports[MXSER_PORTS_PER_BOARD];
 275};
 276
 277struct mxser_mstatus {
 278        tcflag_t cflag;
 279        int cts;
 280        int dsr;
 281        int ri;
 282        int dcd;
 283};
 284
 285static struct mxser_board mxser_boards[MXSER_BOARDS];
 286static struct tty_driver *mxvar_sdriver;
 287static struct mxser_log mxvar_log;
 288static int mxser_set_baud_method[MXSER_PORTS + 1];
 289
 290static void mxser_enable_must_enchance_mode(unsigned long baseio)
 291{
 292        u8 oldlcr;
 293        u8 efr;
 294
 295        oldlcr = inb(baseio + UART_LCR);
 296        outb(MOXA_MUST_ENTER_ENCHANCE, baseio + UART_LCR);
 297
 298        efr = inb(baseio + MOXA_MUST_EFR_REGISTER);
 299        efr |= MOXA_MUST_EFR_EFRB_ENABLE;
 300
 301        outb(efr, baseio + MOXA_MUST_EFR_REGISTER);
 302        outb(oldlcr, baseio + UART_LCR);
 303}
 304
 305static void mxser_disable_must_enchance_mode(unsigned long baseio)
 306{
 307        u8 oldlcr;
 308        u8 efr;
 309
 310        oldlcr = inb(baseio + UART_LCR);
 311        outb(MOXA_MUST_ENTER_ENCHANCE, baseio + UART_LCR);
 312
 313        efr = inb(baseio + MOXA_MUST_EFR_REGISTER);
 314        efr &= ~MOXA_MUST_EFR_EFRB_ENABLE;
 315
 316        outb(efr, baseio + MOXA_MUST_EFR_REGISTER);
 317        outb(oldlcr, baseio + UART_LCR);
 318}
 319
 320static void mxser_set_must_xon1_value(unsigned long baseio, u8 value)
 321{
 322        u8 oldlcr;
 323        u8 efr;
 324
 325        oldlcr = inb(baseio + UART_LCR);
 326        outb(MOXA_MUST_ENTER_ENCHANCE, baseio + UART_LCR);
 327
 328        efr = inb(baseio + MOXA_MUST_EFR_REGISTER);
 329        efr &= ~MOXA_MUST_EFR_BANK_MASK;
 330        efr |= MOXA_MUST_EFR_BANK0;
 331
 332        outb(efr, baseio + MOXA_MUST_EFR_REGISTER);
 333        outb(value, baseio + MOXA_MUST_XON1_REGISTER);
 334        outb(oldlcr, baseio + UART_LCR);
 335}
 336
 337static void mxser_set_must_xoff1_value(unsigned long baseio, u8 value)
 338{
 339        u8 oldlcr;
 340        u8 efr;
 341
 342        oldlcr = inb(baseio + UART_LCR);
 343        outb(MOXA_MUST_ENTER_ENCHANCE, baseio + UART_LCR);
 344
 345        efr = inb(baseio + MOXA_MUST_EFR_REGISTER);
 346        efr &= ~MOXA_MUST_EFR_BANK_MASK;
 347        efr |= MOXA_MUST_EFR_BANK0;
 348
 349        outb(efr, baseio + MOXA_MUST_EFR_REGISTER);
 350        outb(value, baseio + MOXA_MUST_XOFF1_REGISTER);
 351        outb(oldlcr, baseio + UART_LCR);
 352}
 353
 354static void mxser_set_must_fifo_value(struct mxser_port *info)
 355{
 356        u8 oldlcr;
 357        u8 efr;
 358
 359        oldlcr = inb(info->ioaddr + UART_LCR);
 360        outb(MOXA_MUST_ENTER_ENCHANCE, info->ioaddr + UART_LCR);
 361
 362        efr = inb(info->ioaddr + MOXA_MUST_EFR_REGISTER);
 363        efr &= ~MOXA_MUST_EFR_BANK_MASK;
 364        efr |= MOXA_MUST_EFR_BANK1;
 365
 366        outb(efr, info->ioaddr + MOXA_MUST_EFR_REGISTER);
 367        outb((u8)info->rx_high_water, info->ioaddr + MOXA_MUST_RBRTH_REGISTER);
 368        outb((u8)info->rx_trigger, info->ioaddr + MOXA_MUST_RBRTI_REGISTER);
 369        outb((u8)info->rx_low_water, info->ioaddr + MOXA_MUST_RBRTL_REGISTER);
 370        outb(oldlcr, info->ioaddr + UART_LCR);
 371}
 372
 373static void mxser_set_must_enum_value(unsigned long baseio, u8 value)
 374{
 375        u8 oldlcr;
 376        u8 efr;
 377
 378        oldlcr = inb(baseio + UART_LCR);
 379        outb(MOXA_MUST_ENTER_ENCHANCE, baseio + UART_LCR);
 380
 381        efr = inb(baseio + MOXA_MUST_EFR_REGISTER);
 382        efr &= ~MOXA_MUST_EFR_BANK_MASK;
 383        efr |= MOXA_MUST_EFR_BANK2;
 384
 385        outb(efr, baseio + MOXA_MUST_EFR_REGISTER);
 386        outb(value, baseio + MOXA_MUST_ENUM_REGISTER);
 387        outb(oldlcr, baseio + UART_LCR);
 388}
 389
 390static void mxser_get_must_hardware_id(unsigned long baseio, u8 *pId)
 391{
 392        u8 oldlcr;
 393        u8 efr;
 394
 395        oldlcr = inb(baseio + UART_LCR);
 396        outb(MOXA_MUST_ENTER_ENCHANCE, baseio + UART_LCR);
 397
 398        efr = inb(baseio + MOXA_MUST_EFR_REGISTER);
 399        efr &= ~MOXA_MUST_EFR_BANK_MASK;
 400        efr |= MOXA_MUST_EFR_BANK2;
 401
 402        outb(efr, baseio + MOXA_MUST_EFR_REGISTER);
 403        *pId = inb(baseio + MOXA_MUST_HWID_REGISTER);
 404        outb(oldlcr, baseio + UART_LCR);
 405}
 406
 407static void SET_MOXA_MUST_NO_SOFTWARE_FLOW_CONTROL(unsigned long baseio)
 408{
 409        u8 oldlcr;
 410        u8 efr;
 411
 412        oldlcr = inb(baseio + UART_LCR);
 413        outb(MOXA_MUST_ENTER_ENCHANCE, baseio + UART_LCR);
 414
 415        efr = inb(baseio + MOXA_MUST_EFR_REGISTER);
 416        efr &= ~MOXA_MUST_EFR_SF_MASK;
 417
 418        outb(efr, baseio + MOXA_MUST_EFR_REGISTER);
 419        outb(oldlcr, baseio + UART_LCR);
 420}
 421
 422static void mxser_enable_must_tx_software_flow_control(unsigned long baseio)
 423{
 424        u8 oldlcr;
 425        u8 efr;
 426
 427        oldlcr = inb(baseio + UART_LCR);
 428        outb(MOXA_MUST_ENTER_ENCHANCE, baseio + UART_LCR);
 429
 430        efr = inb(baseio + MOXA_MUST_EFR_REGISTER);
 431        efr &= ~MOXA_MUST_EFR_SF_TX_MASK;
 432        efr |= MOXA_MUST_EFR_SF_TX1;
 433
 434        outb(efr, baseio + MOXA_MUST_EFR_REGISTER);
 435        outb(oldlcr, baseio + UART_LCR);
 436}
 437
 438static void mxser_disable_must_tx_software_flow_control(unsigned long baseio)
 439{
 440        u8 oldlcr;
 441        u8 efr;
 442
 443        oldlcr = inb(baseio + UART_LCR);
 444        outb(MOXA_MUST_ENTER_ENCHANCE, baseio + UART_LCR);
 445
 446        efr = inb(baseio + MOXA_MUST_EFR_REGISTER);
 447        efr &= ~MOXA_MUST_EFR_SF_TX_MASK;
 448
 449        outb(efr, baseio + MOXA_MUST_EFR_REGISTER);
 450        outb(oldlcr, baseio + UART_LCR);
 451}
 452
 453static void mxser_enable_must_rx_software_flow_control(unsigned long baseio)
 454{
 455        u8 oldlcr;
 456        u8 efr;
 457
 458        oldlcr = inb(baseio + UART_LCR);
 459        outb(MOXA_MUST_ENTER_ENCHANCE, baseio + UART_LCR);
 460
 461        efr = inb(baseio + MOXA_MUST_EFR_REGISTER);
 462        efr &= ~MOXA_MUST_EFR_SF_RX_MASK;
 463        efr |= MOXA_MUST_EFR_SF_RX1;
 464
 465        outb(efr, baseio + MOXA_MUST_EFR_REGISTER);
 466        outb(oldlcr, baseio + UART_LCR);
 467}
 468
 469static void mxser_disable_must_rx_software_flow_control(unsigned long baseio)
 470{
 471        u8 oldlcr;
 472        u8 efr;
 473
 474        oldlcr = inb(baseio + UART_LCR);
 475        outb(MOXA_MUST_ENTER_ENCHANCE, baseio + UART_LCR);
 476
 477        efr = inb(baseio + MOXA_MUST_EFR_REGISTER);
 478        efr &= ~MOXA_MUST_EFR_SF_RX_MASK;
 479
 480        outb(efr, baseio + MOXA_MUST_EFR_REGISTER);
 481        outb(oldlcr, baseio + UART_LCR);
 482}
 483
 484#ifdef CONFIG_PCI
 485static int __devinit CheckIsMoxaMust(unsigned long io)
 486{
 487        u8 oldmcr, hwid;
 488        int i;
 489
 490        outb(0, io + UART_LCR);
 491        mxser_disable_must_enchance_mode(io);
 492        oldmcr = inb(io + UART_MCR);
 493        outb(0, io + UART_MCR);
 494        mxser_set_must_xon1_value(io, 0x11);
 495        if ((hwid = inb(io + UART_MCR)) != 0) {
 496                outb(oldmcr, io + UART_MCR);
 497                return MOXA_OTHER_UART;
 498        }
 499
 500        mxser_get_must_hardware_id(io, &hwid);
 501        for (i = 1; i < UART_INFO_NUM; i++) { /* 0 = OTHER_UART */
 502                if (hwid == Gpci_uart_info[i].type)
 503                        return (int)hwid;
 504        }
 505        return MOXA_OTHER_UART;
 506}
 507#endif
 508
 509static void process_txrx_fifo(struct mxser_port *info)
 510{
 511        int i;
 512
 513        if ((info->type == PORT_16450) || (info->type == PORT_8250)) {
 514                info->rx_trigger = 1;
 515                info->rx_high_water = 1;
 516                info->rx_low_water = 1;
 517                info->xmit_fifo_size = 1;
 518        } else
 519                for (i = 0; i < UART_INFO_NUM; i++)
 520                        if (info->board->chip_flag == Gpci_uart_info[i].type) {
 521                                info->rx_trigger = Gpci_uart_info[i].rx_trigger;
 522                                info->rx_low_water = Gpci_uart_info[i].rx_low_water;
 523                                info->rx_high_water = Gpci_uart_info[i].rx_high_water;
 524                                info->xmit_fifo_size = Gpci_uart_info[i].xmit_fifo_size;
 525                                break;
 526                        }
 527}
 528
 529static unsigned char mxser_get_msr(int baseaddr, int mode, int port)
 530{
 531        static unsigned char mxser_msr[MXSER_PORTS + 1];
 532        unsigned char status = 0;
 533
 534        status = inb(baseaddr + UART_MSR);
 535
 536        mxser_msr[port] &= 0x0F;
 537        mxser_msr[port] |= status;
 538        status = mxser_msr[port];
 539        if (mode)
 540                mxser_msr[port] = 0;
 541
 542        return status;
 543}
 544
 545static int mxser_carrier_raised(struct tty_port *port)
 546{
 547        struct mxser_port *mp = container_of(port, struct mxser_port, port);
 548        return (inb(mp->ioaddr + UART_MSR) & UART_MSR_DCD)?1:0;
 549}
 550
 551static void mxser_dtr_rts(struct tty_port *port, int on)
 552{
 553        struct mxser_port *mp = container_of(port, struct mxser_port, port);
 554        unsigned long flags;
 555
 556        spin_lock_irqsave(&mp->slock, flags);
 557        if (on)
 558                outb(inb(mp->ioaddr + UART_MCR) |
 559                        UART_MCR_DTR | UART_MCR_RTS, mp->ioaddr + UART_MCR);
 560        else
 561                outb(inb(mp->ioaddr + UART_MCR)&~(UART_MCR_DTR | UART_MCR_RTS),
 562                        mp->ioaddr + UART_MCR);
 563        spin_unlock_irqrestore(&mp->slock, flags);
 564}
 565
 566static int mxser_set_baud(struct tty_struct *tty, long newspd)
 567{
 568        struct mxser_port *info = tty->driver_data;
 569        int quot = 0, baud;
 570        unsigned char cval;
 571
 572        if (!info->ioaddr)
 573                return -1;
 574
 575        if (newspd > info->max_baud)
 576                return -1;
 577
 578        if (newspd == 134) {
 579                quot = 2 * info->baud_base / 269;
 580                tty_encode_baud_rate(tty, 134, 134);
 581        } else if (newspd) {
 582                quot = info->baud_base / newspd;
 583                if (quot == 0)
 584                        quot = 1;
 585                baud = info->baud_base/quot;
 586                tty_encode_baud_rate(tty, baud, baud);
 587        } else {
 588                quot = 0;
 589        }
 590
 591        info->timeout = ((info->xmit_fifo_size * HZ * 10 * quot) / info->baud_base);
 592        info->timeout += HZ / 50;       /* Add .02 seconds of slop */
 593
 594        if (quot) {
 595                info->MCR |= UART_MCR_DTR;
 596                outb(info->MCR, info->ioaddr + UART_MCR);
 597        } else {
 598                info->MCR &= ~UART_MCR_DTR;
 599                outb(info->MCR, info->ioaddr + UART_MCR);
 600                return 0;
 601        }
 602
 603        cval = inb(info->ioaddr + UART_LCR);
 604
 605        outb(cval | UART_LCR_DLAB, info->ioaddr + UART_LCR);    /* set DLAB */
 606
 607        outb(quot & 0xff, info->ioaddr + UART_DLL);     /* LS of divisor */
 608        outb(quot >> 8, info->ioaddr + UART_DLM);       /* MS of divisor */
 609        outb(cval, info->ioaddr + UART_LCR);    /* reset DLAB */
 610
 611#ifdef BOTHER
 612        if (C_BAUD(tty) == BOTHER) {
 613                quot = info->baud_base % newspd;
 614                quot *= 8;
 615                if (quot % newspd > newspd / 2) {
 616                        quot /= newspd;
 617                        quot++;
 618                } else
 619                        quot /= newspd;
 620
 621                mxser_set_must_enum_value(info->ioaddr, quot);
 622        } else
 623#endif
 624                mxser_set_must_enum_value(info->ioaddr, 0);
 625
 626        return 0;
 627}
 628
 629/*
 630 * This routine is called to set the UART divisor registers to match
 631 * the specified baud rate for a serial port.
 632 */
 633static int mxser_change_speed(struct tty_struct *tty,
 634                                        struct ktermios *old_termios)
 635{
 636        struct mxser_port *info = tty->driver_data;
 637        unsigned cflag, cval, fcr;
 638        int ret = 0;
 639        unsigned char status;
 640
 641        cflag = tty->termios->c_cflag;
 642        if (!info->ioaddr)
 643                return ret;
 644
 645        if (mxser_set_baud_method[tty->index] == 0)
 646                mxser_set_baud(tty, tty_get_baud_rate(tty));
 647
 648        /* byte size and parity */
 649        switch (cflag & CSIZE) {
 650        case CS5:
 651                cval = 0x00;
 652                break;
 653        case CS6:
 654                cval = 0x01;
 655                break;
 656        case CS7:
 657                cval = 0x02;
 658                break;
 659        case CS8:
 660                cval = 0x03;
 661                break;
 662        default:
 663                cval = 0x00;
 664                break;          /* too keep GCC shut... */
 665        }
 666        if (cflag & CSTOPB)
 667                cval |= 0x04;
 668        if (cflag & PARENB)
 669                cval |= UART_LCR_PARITY;
 670        if (!(cflag & PARODD))
 671                cval |= UART_LCR_EPAR;
 672        if (cflag & CMSPAR)
 673                cval |= UART_LCR_SPAR;
 674
 675        if ((info->type == PORT_8250) || (info->type == PORT_16450)) {
 676                if (info->board->chip_flag) {
 677                        fcr = UART_FCR_ENABLE_FIFO;
 678                        fcr |= MOXA_MUST_FCR_GDA_MODE_ENABLE;
 679                        mxser_set_must_fifo_value(info);
 680                } else
 681                        fcr = 0;
 682        } else {
 683                fcr = UART_FCR_ENABLE_FIFO;
 684                if (info->board->chip_flag) {
 685                        fcr |= MOXA_MUST_FCR_GDA_MODE_ENABLE;
 686                        mxser_set_must_fifo_value(info);
 687                } else {
 688                        switch (info->rx_trigger) {
 689                        case 1:
 690                                fcr |= UART_FCR_TRIGGER_1;
 691                                break;
 692                        case 4:
 693                                fcr |= UART_FCR_TRIGGER_4;
 694                                break;
 695                        case 8:
 696                                fcr |= UART_FCR_TRIGGER_8;
 697                                break;
 698                        default:
 699                                fcr |= UART_FCR_TRIGGER_14;
 700                                break;
 701                        }
 702                }
 703        }
 704
 705        /* CTS flow control flag and modem status interrupts */
 706        info->IER &= ~UART_IER_MSI;
 707        info->MCR &= ~UART_MCR_AFE;
 708        if (cflag & CRTSCTS) {
 709                info->port.flags |= ASYNC_CTS_FLOW;
 710                info->IER |= UART_IER_MSI;
 711                if ((info->type == PORT_16550A) || (info->board->chip_flag)) {
 712                        info->MCR |= UART_MCR_AFE;
 713                } else {
 714                        status = inb(info->ioaddr + UART_MSR);
 715                        if (tty->hw_stopped) {
 716                                if (status & UART_MSR_CTS) {
 717                                        tty->hw_stopped = 0;
 718                                        if (info->type != PORT_16550A &&
 719                                                        !info->board->chip_flag) {
 720                                                outb(info->IER & ~UART_IER_THRI,
 721                                                        info->ioaddr +
 722                                                        UART_IER);
 723                                                info->IER |= UART_IER_THRI;
 724                                                outb(info->IER, info->ioaddr +
 725                                                                UART_IER);
 726                                        }
 727                                        tty_wakeup(tty);
 728                                }
 729                        } else {
 730                                if (!(status & UART_MSR_CTS)) {
 731                                        tty->hw_stopped = 1;
 732                                        if ((info->type != PORT_16550A) &&
 733                                                        (!info->board->chip_flag)) {
 734                                                info->IER &= ~UART_IER_THRI;
 735                                                outb(info->IER, info->ioaddr +
 736                                                                UART_IER);
 737                                        }
 738                                }
 739                        }
 740                }
 741        } else {
 742                info->port.flags &= ~ASYNC_CTS_FLOW;
 743        }
 744        outb(info->MCR, info->ioaddr + UART_MCR);
 745        if (cflag & CLOCAL) {
 746                info->port.flags &= ~ASYNC_CHECK_CD;
 747        } else {
 748                info->port.flags |= ASYNC_CHECK_CD;
 749                info->IER |= UART_IER_MSI;
 750        }
 751        outb(info->IER, info->ioaddr + UART_IER);
 752
 753        /*
 754         * Set up parity check flag
 755         */
 756        info->read_status_mask = UART_LSR_OE | UART_LSR_THRE | UART_LSR_DR;
 757        if (I_INPCK(tty))
 758                info->read_status_mask |= UART_LSR_FE | UART_LSR_PE;
 759        if (I_BRKINT(tty) || I_PARMRK(tty))
 760                info->read_status_mask |= UART_LSR_BI;
 761
 762        info->ignore_status_mask = 0;
 763
 764        if (I_IGNBRK(tty)) {
 765                info->ignore_status_mask |= UART_LSR_BI;
 766                info->read_status_mask |= UART_LSR_BI;
 767                /*
 768                 * If we're ignore parity and break indicators, ignore
 769                 * overruns too.  (For real raw support).
 770                 */
 771                if (I_IGNPAR(tty)) {
 772                        info->ignore_status_mask |=
 773                                                UART_LSR_OE |
 774                                                UART_LSR_PE |
 775                                                UART_LSR_FE;
 776                        info->read_status_mask |=
 777                                                UART_LSR_OE |
 778                                                UART_LSR_PE |
 779                                                UART_LSR_FE;
 780                }
 781        }
 782        if (info->board->chip_flag) {
 783                mxser_set_must_xon1_value(info->ioaddr, START_CHAR(tty));
 784                mxser_set_must_xoff1_value(info->ioaddr, STOP_CHAR(tty));
 785                if (I_IXON(tty)) {
 786                        mxser_enable_must_rx_software_flow_control(
 787                                        info->ioaddr);
 788                } else {
 789                        mxser_disable_must_rx_software_flow_control(
 790                                        info->ioaddr);
 791                }
 792                if (I_IXOFF(tty)) {
 793                        mxser_enable_must_tx_software_flow_control(
 794                                        info->ioaddr);
 795                } else {
 796                        mxser_disable_must_tx_software_flow_control(
 797                                        info->ioaddr);
 798                }
 799        }
 800
 801
 802        outb(fcr, info->ioaddr + UART_FCR);     /* set fcr */
 803        outb(cval, info->ioaddr + UART_LCR);
 804
 805        return ret;
 806}
 807
 808static void mxser_check_modem_status(struct tty_struct *tty,
 809                                struct mxser_port *port, int status)
 810{
 811        /* update input line counters */
 812        if (status & UART_MSR_TERI)
 813                port->icount.rng++;
 814        if (status & UART_MSR_DDSR)
 815                port->icount.dsr++;
 816        if (status & UART_MSR_DDCD)
 817                port->icount.dcd++;
 818        if (status & UART_MSR_DCTS)
 819                port->icount.cts++;
 820        port->mon_data.modem_status = status;
 821        wake_up_interruptible(&port->delta_msr_wait);
 822
 823        if ((port->port.flags & ASYNC_CHECK_CD) && (status & UART_MSR_DDCD)) {
 824                if (status & UART_MSR_DCD)
 825                        wake_up_interruptible(&port->port.open_wait);
 826        }
 827
 828        if (port->port.flags & ASYNC_CTS_FLOW) {
 829                if (tty->hw_stopped) {
 830                        if (status & UART_MSR_CTS) {
 831                                tty->hw_stopped = 0;
 832
 833                                if ((port->type != PORT_16550A) &&
 834                                                (!port->board->chip_flag)) {
 835                                        outb(port->IER & ~UART_IER_THRI,
 836                                                port->ioaddr + UART_IER);
 837                                        port->IER |= UART_IER_THRI;
 838                                        outb(port->IER, port->ioaddr +
 839                                                        UART_IER);
 840                                }
 841                                tty_wakeup(tty);
 842                        }
 843                } else {
 844                        if (!(status & UART_MSR_CTS)) {
 845                                tty->hw_stopped = 1;
 846                                if (port->type != PORT_16550A &&
 847                                                !port->board->chip_flag) {
 848                                        port->IER &= ~UART_IER_THRI;
 849                                        outb(port->IER, port->ioaddr +
 850                                                        UART_IER);
 851                                }
 852                        }
 853                }
 854        }
 855}
 856
 857static int mxser_startup(struct tty_struct *tty)
 858{
 859        struct mxser_port *info = tty->driver_data;
 860        unsigned long page;
 861        unsigned long flags;
 862
 863        page = __get_free_page(GFP_KERNEL);
 864        if (!page)
 865                return -ENOMEM;
 866
 867        spin_lock_irqsave(&info->slock, flags);
 868
 869        if (info->port.flags & ASYNC_INITIALIZED) {
 870                free_page(page);
 871                spin_unlock_irqrestore(&info->slock, flags);
 872                return 0;
 873        }
 874
 875        if (!info->ioaddr || !info->type) {
 876                set_bit(TTY_IO_ERROR, &tty->flags);
 877                free_page(page);
 878                spin_unlock_irqrestore(&info->slock, flags);
 879                return 0;
 880        }
 881        if (info->port.xmit_buf)
 882                free_page(page);
 883        else
 884                info->port.xmit_buf = (unsigned char *) page;
 885
 886        /*
 887         * Clear the FIFO buffers and disable them
 888         * (they will be reenabled in mxser_change_speed())
 889         */
 890        if (info->board->chip_flag)
 891                outb((UART_FCR_CLEAR_RCVR |
 892                        UART_FCR_CLEAR_XMIT |
 893                        MOXA_MUST_FCR_GDA_MODE_ENABLE), info->ioaddr + UART_FCR);
 894        else
 895                outb((UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT),
 896                        info->ioaddr + UART_FCR);
 897
 898        /*
 899         * At this point there's no way the LSR could still be 0xFF;
 900         * if it is, then bail out, because there's likely no UART
 901         * here.
 902         */
 903        if (inb(info->ioaddr + UART_LSR) == 0xff) {
 904                spin_unlock_irqrestore(&info->slock, flags);
 905                if (capable(CAP_SYS_ADMIN)) {
 906                        if (tty)
 907                                set_bit(TTY_IO_ERROR, &tty->flags);
 908                        return 0;
 909                } else
 910                        return -ENODEV;
 911        }
 912
 913        /*
 914         * Clear the interrupt registers.
 915         */
 916        (void) inb(info->ioaddr + UART_LSR);
 917        (void) inb(info->ioaddr + UART_RX);
 918        (void) inb(info->ioaddr + UART_IIR);
 919        (void) inb(info->ioaddr + UART_MSR);
 920
 921        /*
 922         * Now, initialize the UART
 923         */
 924        outb(UART_LCR_WLEN8, info->ioaddr + UART_LCR);  /* reset DLAB */
 925        info->MCR = UART_MCR_DTR | UART_MCR_RTS;
 926        outb(info->MCR, info->ioaddr + UART_MCR);
 927
 928        /*
 929         * Finally, enable interrupts
 930         */
 931        info->IER = UART_IER_MSI | UART_IER_RLSI | UART_IER_RDI;
 932
 933        if (info->board->chip_flag)
 934                info->IER |= MOXA_MUST_IER_EGDAI;
 935        outb(info->IER, info->ioaddr + UART_IER);       /* enable interrupts */
 936
 937        /*
 938         * And clear the interrupt registers again for luck.
 939         */
 940        (void) inb(info->ioaddr + UART_LSR);
 941        (void) inb(info->ioaddr + UART_RX);
 942        (void) inb(info->ioaddr + UART_IIR);
 943        (void) inb(info->ioaddr + UART_MSR);
 944
 945        clear_bit(TTY_IO_ERROR, &tty->flags);
 946        info->xmit_cnt = info->xmit_head = info->xmit_tail = 0;
 947
 948        /*
 949         * and set the speed of the serial port
 950         */
 951        mxser_change_speed(tty, NULL);
 952        info->port.flags |= ASYNC_INITIALIZED;
 953        spin_unlock_irqrestore(&info->slock, flags);
 954
 955        return 0;
 956}
 957
 958/*
 959 * This routine will shutdown a serial port; interrupts maybe disabled, and
 960 * DTR is dropped if the hangup on close termio flag is on.
 961 */
 962static void mxser_shutdown(struct tty_struct *tty)
 963{
 964        struct mxser_port *info = tty->driver_data;
 965        unsigned long flags;
 966
 967        if (!(info->port.flags & ASYNC_INITIALIZED))
 968                return;
 969
 970        spin_lock_irqsave(&info->slock, flags);
 971
 972        /*
 973         * clear delta_msr_wait queue to avoid mem leaks: we may free the irq
 974         * here so the queue might never be waken up
 975         */
 976        wake_up_interruptible(&info->delta_msr_wait);
 977
 978        /*
 979         * Free the IRQ, if necessary
 980         */
 981        if (info->port.xmit_buf) {
 982                free_page((unsigned long) info->port.xmit_buf);
 983                info->port.xmit_buf = NULL;
 984        }
 985
 986        info->IER = 0;
 987        outb(0x00, info->ioaddr + UART_IER);
 988
 989        if (tty->termios->c_cflag & HUPCL)
 990                info->MCR &= ~(UART_MCR_DTR | UART_MCR_RTS);
 991        outb(info->MCR, info->ioaddr + UART_MCR);
 992
 993        /* clear Rx/Tx FIFO's */
 994        if (info->board->chip_flag)
 995                outb(UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT |
 996                                MOXA_MUST_FCR_GDA_MODE_ENABLE,
 997                                info->ioaddr + UART_FCR);
 998        else
 999                outb(UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT,
1000                        info->ioaddr + UART_FCR);
1001
1002        /* read data port to reset things */
1003        (void) inb(info->ioaddr + UART_RX);
1004
1005        set_bit(TTY_IO_ERROR, &tty->flags);
1006
1007        info->port.flags &= ~ASYNC_INITIALIZED;
1008
1009        if (info->board->chip_flag)
1010                SET_MOXA_MUST_NO_SOFTWARE_FLOW_CONTROL(info->ioaddr);
1011
1012        spin_unlock_irqrestore(&info->slock, flags);
1013}
1014
1015/*
1016 * This routine is called whenever a serial port is opened.  It
1017 * enables interrupts for a serial port, linking in its async structure into
1018 * the IRQ chain.   It also performs the serial-specific
1019 * initialization for the tty structure.
1020 */
1021static int mxser_open(struct tty_struct *tty, struct file *filp)
1022{
1023        struct mxser_port *info;
1024        unsigned long flags;
1025        int retval, line;
1026
1027        line = tty->index;
1028        if (line == MXSER_PORTS)
1029                return 0;
1030        if (line < 0 || line > MXSER_PORTS)
1031                return -ENODEV;
1032        info = &mxser_boards[line / MXSER_PORTS_PER_BOARD].ports[line % MXSER_PORTS_PER_BOARD];
1033        if (!info->ioaddr)
1034                return -ENODEV;
1035
1036        tty->driver_data = info;
1037        tty_port_tty_set(&info->port, tty);
1038        /*
1039         * Start up serial port
1040         */
1041        spin_lock_irqsave(&info->port.lock, flags);
1042        info->port.count++;
1043        spin_unlock_irqrestore(&info->port.lock, flags);
1044        retval = mxser_startup(tty);
1045        if (retval)
1046                return retval;
1047
1048        retval = tty_port_block_til_ready(&info->port, tty, filp);
1049        if (retval)
1050                return retval;
1051
1052        return 0;
1053}
1054
1055static void mxser_flush_buffer(struct tty_struct *tty)
1056{
1057        struct mxser_port *info = tty->driver_data;
1058        char fcr;
1059        unsigned long flags;
1060
1061
1062        spin_lock_irqsave(&info->slock, flags);
1063        info->xmit_cnt = info->xmit_head = info->xmit_tail = 0;
1064
1065        fcr = inb(info->ioaddr + UART_FCR);
1066        outb((fcr | UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT),
1067                info->ioaddr + UART_FCR);
1068        outb(fcr, info->ioaddr + UART_FCR);
1069
1070        spin_unlock_irqrestore(&info->slock, flags);
1071
1072        tty_wakeup(tty);
1073}
1074
1075
1076/*
1077 * This routine is called when the serial port gets closed.  First, we
1078 * wait for the last remaining data to be sent.  Then, we unlink its
1079 * async structure from the interrupt chain if necessary, and we free
1080 * that IRQ if nothing is left in the chain.
1081 */
1082static void mxser_close(struct tty_struct *tty, struct file *filp)
1083{
1084        struct mxser_port *info = tty->driver_data;
1085        struct tty_port *port = &info->port;
1086
1087        unsigned long timeout;
1088
1089        if (tty->index == MXSER_PORTS)
1090                return;
1091        if (!info)
1092                return;
1093
1094        if (tty_port_close_start(port, tty, filp) == 0)
1095                return;
1096
1097        /*
1098         * Save the termios structure, since this port may have
1099         * separate termios for callout and dialin.
1100         *
1101         * FIXME: Can this go ?
1102         */
1103        if (info->port.flags & ASYNC_NORMAL_ACTIVE)
1104                info->normal_termios = *tty->termios;
1105        /*
1106         * At this point we stop accepting input.  To do this, we
1107         * disable the receive line status interrupts, and tell the
1108         * interrupt driver to stop checking the data ready bit in the
1109         * line status register.
1110         */
1111        info->IER &= ~UART_IER_RLSI;
1112        if (info->board->chip_flag)
1113                info->IER &= ~MOXA_MUST_RECV_ISR;
1114
1115        if (info->port.flags & ASYNC_INITIALIZED) {
1116                outb(info->IER, info->ioaddr + UART_IER);
1117                /*
1118                 * Before we drop DTR, make sure the UART transmitter
1119                 * has completely drained; this is especially
1120                 * important if there is a transmit FIFO!
1121                 */
1122                timeout = jiffies + HZ;
1123                while (!(inb(info->ioaddr + UART_LSR) & UART_LSR_TEMT)) {
1124                        schedule_timeout_interruptible(5);
1125                        if (time_after(jiffies, timeout))
1126                                break;
1127                }
1128        }
1129        mxser_shutdown(tty);
1130        mxser_flush_buffer(tty);
1131
1132        /* Right now the tty_port set is done outside of the close_end helper
1133           as we don't yet have everyone using refcounts */     
1134        tty_port_close_end(port, tty);
1135        tty_port_tty_set(port, NULL);
1136}
1137
1138static int mxser_write(struct tty_struct *tty, const unsigned char *buf, int count)
1139{
1140        int c, total = 0;
1141        struct mxser_port *info = tty->driver_data;
1142        unsigned long flags;
1143
1144        if (!info->port.xmit_buf)
1145                return 0;
1146
1147        while (1) {
1148                c = min_t(int, count, min(SERIAL_XMIT_SIZE - info->xmit_cnt - 1,
1149                                          SERIAL_XMIT_SIZE - info->xmit_head));
1150                if (c <= 0)
1151                        break;
1152
1153                memcpy(info->port.xmit_buf + info->xmit_head, buf, c);
1154                spin_lock_irqsave(&info->slock, flags);
1155                info->xmit_head = (info->xmit_head + c) &
1156                                  (SERIAL_XMIT_SIZE - 1);
1157                info->xmit_cnt += c;
1158                spin_unlock_irqrestore(&info->slock, flags);
1159
1160                buf += c;
1161                count -= c;
1162                total += c;
1163        }
1164
1165        if (info->xmit_cnt && !tty->stopped) {
1166                if (!tty->hw_stopped ||
1167                                (info->type == PORT_16550A) ||
1168                                (info->board->chip_flag)) {
1169                        spin_lock_irqsave(&info->slock, flags);
1170                        outb(info->IER & ~UART_IER_THRI, info->ioaddr +
1171                                        UART_IER);
1172                        info->IER |= UART_IER_THRI;
1173                        outb(info->IER, info->ioaddr + UART_IER);
1174                        spin_unlock_irqrestore(&info->slock, flags);
1175                }
1176        }
1177        return total;
1178}
1179
1180static int mxser_put_char(struct tty_struct *tty, unsigned char ch)
1181{
1182        struct mxser_port *info = tty->driver_data;
1183        unsigned long flags;
1184
1185        if (!info->port.xmit_buf)
1186                return 0;
1187
1188        if (info->xmit_cnt >= SERIAL_XMIT_SIZE - 1)
1189                return 0;
1190
1191        spin_lock_irqsave(&info->slock, flags);
1192        info->port.xmit_buf[info->xmit_head++] = ch;
1193        info->xmit_head &= SERIAL_XMIT_SIZE - 1;
1194        info->xmit_cnt++;
1195        spin_unlock_irqrestore(&info->slock, flags);
1196        if (!tty->stopped) {
1197                if (!tty->hw_stopped ||
1198                                (info->type == PORT_16550A) ||
1199                                info->board->chip_flag) {
1200                        spin_lock_irqsave(&info->slock, flags);
1201                        outb(info->IER & ~UART_IER_THRI, info->ioaddr + UART_IER);
1202                        info->IER |= UART_IER_THRI;
1203                        outb(info->IER, info->ioaddr + UART_IER);
1204                        spin_unlock_irqrestore(&info->slock, flags);
1205                }
1206        }
1207        return 1;
1208}
1209
1210
1211static void mxser_flush_chars(struct tty_struct *tty)
1212{
1213        struct mxser_port *info = tty->driver_data;
1214        unsigned long flags;
1215
1216        if (info->xmit_cnt <= 0 || tty->stopped || !info->port.xmit_buf ||
1217                        (tty->hw_stopped && info->type != PORT_16550A &&
1218                         !info->board->chip_flag))
1219                return;
1220
1221        spin_lock_irqsave(&info->slock, flags);
1222
1223        outb(info->IER & ~UART_IER_THRI, info->ioaddr + UART_IER);
1224        info->IER |= UART_IER_THRI;
1225        outb(info->IER, info->ioaddr + UART_IER);
1226
1227        spin_unlock_irqrestore(&info->slock, flags);
1228}
1229
1230static int mxser_write_room(struct tty_struct *tty)
1231{
1232        struct mxser_port *info = tty->driver_data;
1233        int ret;
1234
1235        ret = SERIAL_XMIT_SIZE - info->xmit_cnt - 1;
1236        return ret < 0 ? 0 : ret;
1237}
1238
1239static int mxser_chars_in_buffer(struct tty_struct *tty)
1240{
1241        struct mxser_port *info = tty->driver_data;
1242        return info->xmit_cnt;
1243}
1244
1245/*
1246 * ------------------------------------------------------------
1247 * friends of mxser_ioctl()
1248 * ------------------------------------------------------------
1249 */
1250static int mxser_get_serial_info(struct tty_struct *tty,
1251                struct serial_struct __user *retinfo)
1252{
1253        struct mxser_port *info = tty->driver_data;
1254        struct serial_struct tmp = {
1255                .type = info->type,
1256                .line = tty->index,
1257                .port = info->ioaddr,
1258                .irq = info->board->irq,
1259                .flags = info->port.flags,
1260                .baud_base = info->baud_base,
1261                .close_delay = info->port.close_delay,
1262                .closing_wait = info->port.closing_wait,
1263                .custom_divisor = info->custom_divisor,
1264                .hub6 = 0
1265        };
1266        if (copy_to_user(retinfo, &tmp, sizeof(*retinfo)))
1267                return -EFAULT;
1268        return 0;
1269}
1270
1271static int mxser_set_serial_info(struct tty_struct *tty,
1272                struct serial_struct __user *new_info)
1273{
1274        struct mxser_port *info = tty->driver_data;
1275        struct serial_struct new_serial;
1276        speed_t baud;
1277        unsigned long sl_flags;
1278        unsigned int flags;
1279        int retval = 0;
1280
1281        if (!new_info || !info->ioaddr)
1282                return -ENODEV;
1283        if (copy_from_user(&new_serial, new_info, sizeof(new_serial)))
1284                return -EFAULT;
1285
1286        if (new_serial.irq != info->board->irq ||
1287                        new_serial.port != info->ioaddr)
1288                return -EINVAL;
1289
1290        flags = info->port.flags & ASYNC_SPD_MASK;
1291
1292        if (!capable(CAP_SYS_ADMIN)) {
1293                if ((new_serial.baud_base != info->baud_base) ||
1294                                (new_serial.close_delay != info->port.close_delay) ||
1295                                ((new_serial.flags & ~ASYNC_USR_MASK) != (info->port.flags & ~ASYNC_USR_MASK)))
1296                        return -EPERM;
1297                info->port.flags = ((info->port.flags & ~ASYNC_USR_MASK) |
1298                                (new_serial.flags & ASYNC_USR_MASK));
1299        } else {
1300                /*
1301                 * OK, past this point, all the error checking has been done.
1302                 * At this point, we start making changes.....
1303                 */
1304                info->port.flags = ((info->port.flags & ~ASYNC_FLAGS) |
1305                                (new_serial.flags & ASYNC_FLAGS));
1306                info->port.close_delay = new_serial.close_delay * HZ / 100;
1307                info->port.closing_wait = new_serial.closing_wait * HZ / 100;
1308                tty->low_latency = (info->port.flags & ASYNC_LOW_LATENCY)
1309                                                                ? 1 : 0;
1310                if ((info->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST &&
1311                                (new_serial.baud_base != info->baud_base ||
1312                                new_serial.custom_divisor !=
1313                                info->custom_divisor)) {
1314                        baud = new_serial.baud_base / new_serial.custom_divisor;
1315                        tty_encode_baud_rate(tty, baud, baud);
1316                }
1317        }
1318
1319        info->type = new_serial.type;
1320
1321        process_txrx_fifo(info);
1322
1323        if (info->port.flags & ASYNC_INITIALIZED) {
1324                if (flags != (info->port.flags & ASYNC_SPD_MASK)) {
1325                        spin_lock_irqsave(&info->slock, sl_flags);
1326                        mxser_change_speed(tty, NULL);
1327                        spin_unlock_irqrestore(&info->slock, sl_flags);
1328                }
1329        } else
1330                retval = mxser_startup(tty);
1331
1332        return retval;
1333}
1334
1335/*
1336 * mxser_get_lsr_info - get line status register info
1337 *
1338 * Purpose: Let user call ioctl() to get info when the UART physically
1339 *          is emptied.  On bus types like RS485, the transmitter must
1340 *          release the bus after transmitting. This must be done when
1341 *          the transmit shift register is empty, not be done when the
1342 *          transmit holding register is empty.  This functionality
1343 *          allows an RS485 driver to be written in user space.
1344 */
1345static int mxser_get_lsr_info(struct mxser_port *info,
1346                unsigned int __user *value)
1347{
1348        unsigned char status;
1349        unsigned int result;
1350        unsigned long flags;
1351
1352        spin_lock_irqsave(&info->slock, flags);
1353        status = inb(info->ioaddr + UART_LSR);
1354        spin_unlock_irqrestore(&info->slock, flags);
1355        result = ((status & UART_LSR_TEMT) ? TIOCSER_TEMT : 0);
1356        return put_user(result, value);
1357}
1358
1359static int mxser_tiocmget(struct tty_struct *tty, struct file *file)
1360{
1361        struct mxser_port *info = tty->driver_data;
1362        unsigned char control, status;
1363        unsigned long flags;
1364
1365
1366        if (tty->index == MXSER_PORTS)
1367                return -ENOIOCTLCMD;
1368        if (test_bit(TTY_IO_ERROR, &tty->flags))
1369                return -EIO;
1370
1371        control = info->MCR;
1372
1373        spin_lock_irqsave(&info->slock, flags);
1374        status = inb(info->ioaddr + UART_MSR);
1375        if (status & UART_MSR_ANY_DELTA)
1376                mxser_check_modem_status(tty, info, status);
1377        spin_unlock_irqrestore(&info->slock, flags);
1378        return ((control & UART_MCR_RTS) ? TIOCM_RTS : 0) |
1379                    ((control & UART_MCR_DTR) ? TIOCM_DTR : 0) |
1380                    ((status & UART_MSR_DCD) ? TIOCM_CAR : 0) |
1381                    ((status & UART_MSR_RI) ? TIOCM_RNG : 0) |
1382                    ((status & UART_MSR_DSR) ? TIOCM_DSR : 0) |
1383                    ((status & UART_MSR_CTS) ? TIOCM_CTS : 0);
1384}
1385
1386static int mxser_tiocmset(struct tty_struct *tty, struct file *file,
1387                unsigned int set, unsigned int clear)
1388{
1389        struct mxser_port *info = tty->driver_data;
1390        unsigned long flags;
1391
1392
1393        if (tty->index == MXSER_PORTS)
1394                return -ENOIOCTLCMD;
1395        if (test_bit(TTY_IO_ERROR, &tty->flags))
1396                return -EIO;
1397
1398        spin_lock_irqsave(&info->slock, flags);
1399
1400        if (set & TIOCM_RTS)
1401                info->MCR |= UART_MCR_RTS;
1402        if (set & TIOCM_DTR)
1403                info->MCR |= UART_MCR_DTR;
1404
1405        if (clear & TIOCM_RTS)
1406                info->MCR &= ~UART_MCR_RTS;
1407        if (clear & TIOCM_DTR)
1408                info->MCR &= ~UART_MCR_DTR;
1409
1410        outb(info->MCR, info->ioaddr + UART_MCR);
1411        spin_unlock_irqrestore(&info->slock, flags);
1412        return 0;
1413}
1414
1415static int __init mxser_program_mode(int port)
1416{
1417        int id, i, j, n;
1418
1419        outb(0, port);
1420        outb(0, port);
1421        outb(0, port);
1422        (void)inb(port);
1423        (void)inb(port);
1424        outb(0, port);
1425        (void)inb(port);
1426
1427        id = inb(port + 1) & 0x1F;
1428        if ((id != C168_ASIC_ID) &&
1429                        (id != C104_ASIC_ID) &&
1430                        (id != C102_ASIC_ID) &&
1431                        (id != CI132_ASIC_ID) &&
1432                        (id != CI134_ASIC_ID) &&
1433                        (id != CI104J_ASIC_ID))
1434                return -1;
1435        for (i = 0, j = 0; i < 4; i++) {
1436                n = inb(port + 2);
1437                if (n == 'M') {
1438                        j = 1;
1439                } else if ((j == 1) && (n == 1)) {
1440                        j = 2;
1441                        break;
1442                } else
1443                        j = 0;
1444        }
1445        if (j != 2)
1446                id = -2;
1447        return id;
1448}
1449
1450static void __init mxser_normal_mode(int port)
1451{
1452        int i, n;
1453
1454        outb(0xA5, port + 1);
1455        outb(0x80, port + 3);
1456        outb(12, port + 0);     /* 9600 bps */
1457        outb(0, port + 1);
1458        outb(0x03, port + 3);   /* 8 data bits */
1459        outb(0x13, port + 4);   /* loop back mode */
1460        for (i = 0; i < 16; i++) {
1461                n = inb(port + 5);
1462                if ((n & 0x61) == 0x60)
1463                        break;
1464                if ((n & 1) == 1)
1465                        (void)inb(port);
1466        }
1467        outb(0x00, port + 4);
1468}
1469
1470#define CHIP_SK         0x01    /* Serial Data Clock  in Eprom */
1471#define CHIP_DO         0x02    /* Serial Data Output in Eprom */
1472#define CHIP_CS         0x04    /* Serial Chip Select in Eprom */
1473#define CHIP_DI         0x08    /* Serial Data Input  in Eprom */
1474#define EN_CCMD         0x000   /* Chip's command register     */
1475#define EN0_RSARLO      0x008   /* Remote start address reg 0  */
1476#define EN0_RSARHI      0x009   /* Remote start address reg 1  */
1477#define EN0_RCNTLO      0x00A   /* Remote byte count reg WR    */
1478#define EN0_RCNTHI      0x00B   /* Remote byte count reg WR    */
1479#define EN0_DCFG        0x00E   /* Data configuration reg WR   */
1480#define EN0_PORT        0x010   /* Rcv missed frame error counter RD */
1481#define ENC_PAGE0       0x000   /* Select page 0 of chip registers   */
1482#define ENC_PAGE3       0x0C0   /* Select page 3 of chip registers   */
1483static int __init mxser_read_register(int port, unsigned short *regs)
1484{
1485        int i, k, value, id;
1486        unsigned int j;
1487
1488        id = mxser_program_mode(port);
1489        if (id < 0)
1490                return id;
1491        for (i = 0; i < 14; i++) {
1492                k = (i & 0x3F) | 0x180;
1493                for (j = 0x100; j > 0; j >>= 1) {
1494                        outb(CHIP_CS, port);
1495                        if (k & j) {
1496                                outb(CHIP_CS | CHIP_DO, port);
1497                                outb(CHIP_CS | CHIP_DO | CHIP_SK, port);        /* A? bit of read */
1498                        } else {
1499                                outb(CHIP_CS, port);
1500                                outb(CHIP_CS | CHIP_SK, port);  /* A? bit of read */
1501                        }
1502                }
1503                (void)inb(port);
1504                value = 0;
1505                for (k = 0, j = 0x8000; k < 16; k++, j >>= 1) {
1506                        outb(CHIP_CS, port);
1507                        outb(CHIP_CS | CHIP_SK, port);
1508                        if (inb(port) & CHIP_DI)
1509                                value |= j;
1510                }
1511                regs[i] = value;
1512                outb(0, port);
1513        }
1514        mxser_normal_mode(port);
1515        return id;
1516}
1517
1518static int mxser_ioctl_special(unsigned int cmd, void __user *argp)
1519{
1520        struct mxser_port *port;
1521        struct tty_struct *tty;
1522        int result, status;
1523        unsigned int i, j;
1524        int ret = 0;
1525
1526        switch (cmd) {
1527        case MOXA_GET_MAJOR:
1528                if (printk_ratelimit())
1529                        printk(KERN_WARNING "mxser: '%s' uses deprecated ioctl "
1530                                        "%x (GET_MAJOR), fix your userspace\n",
1531                                        current->comm, cmd);
1532                return put_user(ttymajor, (int __user *)argp);
1533
1534        case MOXA_CHKPORTENABLE:
1535                result = 0;
1536                lock_kernel();
1537                for (i = 0; i < MXSER_BOARDS; i++)
1538                        for (j = 0; j < MXSER_PORTS_PER_BOARD; j++)
1539                                if (mxser_boards[i].ports[j].ioaddr)
1540                                        result |= (1 << i);
1541                unlock_kernel();
1542                return put_user(result, (unsigned long __user *)argp);
1543        case MOXA_GETDATACOUNT:
1544                lock_kernel();
1545                if (copy_to_user(argp, &mxvar_log, sizeof(mxvar_log)))
1546                        ret = -EFAULT;
1547                unlock_kernel();
1548                return ret;
1549        case MOXA_GETMSTATUS: {
1550                struct mxser_mstatus ms, __user *msu = argp;
1551                lock_kernel();
1552                for (i = 0; i < MXSER_BOARDS; i++)
1553                        for (j = 0; j < MXSER_PORTS_PER_BOARD; j++) {
1554                                port = &mxser_boards[i].ports[j];
1555                                memset(&ms, 0, sizeof(ms));
1556
1557                                if (!port->ioaddr)
1558                                        goto copy;
1559                                
1560                                tty = tty_port_tty_get(&port->port);
1561
1562                                if (!tty || !tty->termios)
1563                                        ms.cflag = port->normal_termios.c_cflag;
1564                                else
1565                                        ms.cflag = tty->termios->c_cflag;
1566                                tty_kref_put(tty);
1567                                status = inb(port->ioaddr + UART_MSR);
1568                                if (status & UART_MSR_DCD)
1569                                        ms.dcd = 1;
1570                                if (status & UART_MSR_DSR)
1571                                        ms.dsr = 1;
1572                                if (status & UART_MSR_CTS)
1573                                        ms.cts = 1;
1574                        copy:
1575                                if (copy_to_user(msu, &ms, sizeof(ms))) {
1576                                        unlock_kernel();
1577                                        return -EFAULT;
1578                                }
1579                                msu++;
1580                        }
1581                unlock_kernel();
1582                return 0;
1583        }
1584        case MOXA_ASPP_MON_EXT: {
1585                struct mxser_mon_ext *me; /* it's 2k, stack unfriendly */
1586                unsigned int cflag, iflag, p;
1587                u8 opmode;
1588
1589                me = kzalloc(sizeof(*me), GFP_KERNEL);
1590                if (!me)
1591                        return -ENOMEM;
1592
1593                lock_kernel();
1594                for (i = 0, p = 0; i < MXSER_BOARDS; i++) {
1595                        for (j = 0; j < MXSER_PORTS_PER_BOARD; j++, p++) {
1596                                if (p >= ARRAY_SIZE(me->rx_cnt)) {
1597                                        i = MXSER_BOARDS;
1598                                        break;
1599                                }
1600                                port = &mxser_boards[i].ports[j];
1601                                if (!port->ioaddr)
1602                                        continue;
1603
1604                                status = mxser_get_msr(port->ioaddr, 0, p);
1605
1606                                if (status & UART_MSR_TERI)
1607                                        port->icount.rng++;
1608                                if (status & UART_MSR_DDSR)
1609                                        port->icount.dsr++;
1610                                if (status & UART_MSR_DDCD)
1611                                        port->icount.dcd++;
1612                                if (status & UART_MSR_DCTS)
1613                                        port->icount.cts++;
1614
1615                                port->mon_data.modem_status = status;
1616                                me->rx_cnt[p] = port->mon_data.rxcnt;
1617                                me->tx_cnt[p] = port->mon_data.txcnt;
1618                                me->up_rxcnt[p] = port->mon_data.up_rxcnt;
1619                                me->up_txcnt[p] = port->mon_data.up_txcnt;
1620                                me->modem_status[p] =
1621                                        port->mon_data.modem_status;
1622                                tty = tty_port_tty_get(&port->port);
1623
1624                                if (!tty || !tty->termios) {
1625                                        cflag = port->normal_termios.c_cflag;
1626                                        iflag = port->normal_termios.c_iflag;
1627                                        me->baudrate[p] = tty_termios_baud_rate(&port->normal_termios);
1628                                } else {
1629                                        cflag = tty->termios->c_cflag;
1630                                        iflag = tty->termios->c_iflag;
1631                                        me->baudrate[p] = tty_get_baud_rate(tty);
1632                                }
1633                                tty_kref_put(tty);
1634
1635                                me->databits[p] = cflag & CSIZE;
1636                                me->stopbits[p] = cflag & CSTOPB;
1637                                me->parity[p] = cflag & (PARENB | PARODD |
1638                                                CMSPAR);
1639
1640                                if (cflag & CRTSCTS)
1641                                        me->flowctrl[p] |= 0x03;
1642
1643                                if (iflag & (IXON | IXOFF))
1644                                        me->flowctrl[p] |= 0x0C;
1645
1646                                if (port->type == PORT_16550A)
1647                                        me->fifo[p] = 1;
1648
1649                                opmode = inb(port->opmode_ioaddr) >>
1650                                                ((p % 4) * 2);
1651                                opmode &= OP_MODE_MASK;
1652                                me->iftype[p] = opmode;
1653                        }
1654                }
1655                unlock_kernel();
1656                if (copy_to_user(argp, me, sizeof(*me)))
1657                        ret = -EFAULT;
1658                kfree(me);
1659                return ret;
1660        }
1661        default:
1662                return -ENOIOCTLCMD;
1663        }
1664        return 0;
1665}
1666
1667static int mxser_cflags_changed(struct mxser_port *info, unsigned long arg,
1668                struct async_icount *cprev)
1669{
1670        struct async_icount cnow;
1671        unsigned long flags;
1672        int ret;
1673
1674        spin_lock_irqsave(&info->slock, flags);
1675        cnow = info->icount;    /* atomic copy */
1676        spin_unlock_irqrestore(&info->slock, flags);
1677
1678        ret =   ((arg & TIOCM_RNG) && (cnow.rng != cprev->rng)) ||
1679                ((arg & TIOCM_DSR) && (cnow.dsr != cprev->dsr)) ||
1680                ((arg & TIOCM_CD)  && (cnow.dcd != cprev->dcd)) ||
1681                ((arg & TIOCM_CTS) && (cnow.cts != cprev->cts));
1682
1683        *cprev = cnow;
1684
1685        return ret;
1686}
1687
1688static int mxser_ioctl(struct tty_struct *tty, struct file *file,
1689                unsigned int cmd, unsigned long arg)
1690{
1691        struct mxser_port *info = tty->driver_data;
1692        struct async_icount cnow;
1693        unsigned long flags;
1694        void __user *argp = (void __user *)arg;
1695        int retval;
1696
1697        if (tty->index == MXSER_PORTS)
1698                return mxser_ioctl_special(cmd, argp);
1699
1700        if (cmd == MOXA_SET_OP_MODE || cmd == MOXA_GET_OP_MODE) {
1701                int p;
1702                unsigned long opmode;
1703                static unsigned char ModeMask[] = { 0xfc, 0xf3, 0xcf, 0x3f };
1704                int shiftbit;
1705                unsigned char val, mask;
1706
1707                p = tty->index % 4;
1708                if (cmd == MOXA_SET_OP_MODE) {
1709                        if (get_user(opmode, (int __user *) argp))
1710                                return -EFAULT;
1711                        if (opmode != RS232_MODE &&
1712                                        opmode != RS485_2WIRE_MODE &&
1713                                        opmode != RS422_MODE &&
1714                                        opmode != RS485_4WIRE_MODE)
1715                                return -EFAULT;
1716                        lock_kernel();
1717                        mask = ModeMask[p];
1718                        shiftbit = p * 2;
1719                        val = inb(info->opmode_ioaddr);
1720                        val &= mask;
1721                        val |= (opmode << shiftbit);
1722                        outb(val, info->opmode_ioaddr);
1723                        unlock_kernel();
1724                } else {
1725                        lock_kernel();
1726                        shiftbit = p * 2;
1727                        opmode = inb(info->opmode_ioaddr) >> shiftbit;
1728                        opmode &= OP_MODE_MASK;
1729                        unlock_kernel();
1730                        if (put_user(opmode, (int __user *)argp))
1731                                return -EFAULT;
1732                }
1733                return 0;
1734        }
1735
1736        if (cmd != TIOCGSERIAL && cmd != TIOCMIWAIT && cmd != TIOCGICOUNT &&
1737                        test_bit(TTY_IO_ERROR, &tty->flags))
1738                return -EIO;
1739
1740        switch (cmd) {
1741        case TIOCGSERIAL:
1742                lock_kernel();
1743                retval = mxser_get_serial_info(tty, argp);
1744                unlock_kernel();
1745                return retval;
1746        case TIOCSSERIAL:
1747                lock_kernel();
1748                retval = mxser_set_serial_info(tty, argp);
1749                unlock_kernel();
1750                return retval;
1751        case TIOCSERGETLSR:     /* Get line status register */
1752                return  mxser_get_lsr_info(info, argp);
1753                /*
1754                 * Wait for any of the 4 modem inputs (DCD,RI,DSR,CTS) to change
1755                 * - mask passed in arg for lines of interest
1756                 *   (use |'ed TIOCM_RNG/DSR/CD/CTS for masking)
1757                 * Caller should use TIOCGICOUNT to see which one it was
1758                 */
1759        case TIOCMIWAIT:
1760                spin_lock_irqsave(&info->slock, flags);
1761                cnow = info->icount;    /* note the counters on entry */
1762                spin_unlock_irqrestore(&info->slock, flags);
1763
1764                return wait_event_interruptible(info->delta_msr_wait,
1765                                mxser_cflags_changed(info, arg, &cnow));
1766        /*
1767         * Get counter of input serial line interrupts (DCD,RI,DSR,CTS)
1768         * Return: write counters to the user passed counter struct
1769         * NB: both 1->0 and 0->1 transitions are counted except for
1770         *     RI where only 0->1 is counted.
1771         */
1772        case TIOCGICOUNT: {
1773                struct serial_icounter_struct icnt = { 0 };
1774                spin_lock_irqsave(&info->slock, flags);
1775                cnow = info->icount;
1776                spin_unlock_irqrestore(&info->slock, flags);
1777
1778                icnt.frame = cnow.frame;
1779                icnt.brk = cnow.brk;
1780                icnt.overrun = cnow.overrun;
1781                icnt.buf_overrun = cnow.buf_overrun;
1782                icnt.parity = cnow.parity;
1783                icnt.rx = cnow.rx;
1784                icnt.tx = cnow.tx;
1785                icnt.cts = cnow.cts;
1786                icnt.dsr = cnow.dsr;
1787                icnt.rng = cnow.rng;
1788                icnt.dcd = cnow.dcd;
1789
1790                return copy_to_user(argp, &icnt, sizeof(icnt)) ? -EFAULT : 0;
1791        }
1792        case MOXA_HighSpeedOn:
1793                return put_user(info->baud_base != 115200 ? 1 : 0, (int __user *)argp);
1794        case MOXA_SDS_RSTICOUNTER:
1795                lock_kernel();
1796                info->mon_data.rxcnt = 0;
1797                info->mon_data.txcnt = 0;
1798                unlock_kernel();
1799                return 0;
1800
1801        case MOXA_ASPP_OQUEUE:{
1802                int len, lsr;
1803
1804                lock_kernel();
1805                len = mxser_chars_in_buffer(tty);
1806                lsr = inb(info->ioaddr + UART_LSR) & UART_LSR_TEMT;
1807                len += (lsr ? 0 : 1);
1808                unlock_kernel();
1809
1810                return put_user(len, (int __user *)argp);
1811        }
1812        case MOXA_ASPP_MON: {
1813                int mcr, status;
1814
1815                lock_kernel();
1816                status = mxser_get_msr(info->ioaddr, 1, tty->index);
1817                mxser_check_modem_status(tty, info, status);
1818
1819                mcr = inb(info->ioaddr + UART_MCR);
1820                if (mcr & MOXA_MUST_MCR_XON_FLAG)
1821                        info->mon_data.hold_reason &= ~NPPI_NOTIFY_XOFFHOLD;
1822                else
1823                        info->mon_data.hold_reason |= NPPI_NOTIFY_XOFFHOLD;
1824
1825                if (mcr & MOXA_MUST_MCR_TX_XON)
1826                        info->mon_data.hold_reason &= ~NPPI_NOTIFY_XOFFXENT;
1827                else
1828                        info->mon_data.hold_reason |= NPPI_NOTIFY_XOFFXENT;
1829
1830                if (tty->hw_stopped)
1831                        info->mon_data.hold_reason |= NPPI_NOTIFY_CTSHOLD;
1832                else
1833                        info->mon_data.hold_reason &= ~NPPI_NOTIFY_CTSHOLD;
1834                unlock_kernel();
1835                if (copy_to_user(argp, &info->mon_data,
1836                                sizeof(struct mxser_mon)))
1837                        return -EFAULT;
1838
1839                return 0;
1840        }
1841        case MOXA_ASPP_LSTATUS: {
1842                if (put_user(info->err_shadow, (unsigned char __user *)argp))
1843                        return -EFAULT;
1844
1845                info->err_shadow = 0;
1846                return 0;
1847        }
1848        case MOXA_SET_BAUD_METHOD: {
1849                int method;
1850
1851                if (get_user(method, (int __user *)argp))
1852                        return -EFAULT;
1853                mxser_set_baud_method[tty->index] = method;
1854                return put_user(method, (int __user *)argp);
1855        }
1856        default:
1857                return -ENOIOCTLCMD;
1858        }
1859        return 0;
1860}
1861
1862static void mxser_stoprx(struct tty_struct *tty)
1863{
1864        struct mxser_port *info = tty->driver_data;
1865
1866        info->ldisc_stop_rx = 1;
1867        if (I_IXOFF(tty)) {
1868                if (info->board->chip_flag) {
1869                        info->IER &= ~MOXA_MUST_RECV_ISR;
1870                        outb(info->IER, info->ioaddr + UART_IER);
1871                } else {
1872                        info->x_char = STOP_CHAR(tty);
1873                        outb(0, info->ioaddr + UART_IER);
1874                        info->IER |= UART_IER_THRI;
1875                        outb(info->IER, info->ioaddr + UART_IER);
1876                }
1877        }
1878
1879        if (tty->termios->c_cflag & CRTSCTS) {
1880                info->MCR &= ~UART_MCR_RTS;
1881                outb(info->MCR, info->ioaddr + UART_MCR);
1882        }
1883}
1884
1885/*
1886 * This routine is called by the upper-layer tty layer to signal that
1887 * incoming characters should be throttled.
1888 */
1889static void mxser_throttle(struct tty_struct *tty)
1890{
1891        mxser_stoprx(tty);
1892}
1893
1894static void mxser_unthrottle(struct tty_struct *tty)
1895{
1896        struct mxser_port *info = tty->driver_data;
1897
1898        /* startrx */
1899        info->ldisc_stop_rx = 0;
1900        if (I_IXOFF(tty)) {
1901                if (info->x_char)
1902                        info->x_char = 0;
1903                else {
1904                        if (info->board->chip_flag) {
1905                                info->IER |= MOXA_MUST_RECV_ISR;
1906                                outb(info->IER, info->ioaddr + UART_IER);
1907                        } else {
1908                                info->x_char = START_CHAR(tty);
1909                                outb(0, info->ioaddr + UART_IER);
1910                                info->IER |= UART_IER_THRI;
1911                                outb(info->IER, info->ioaddr + UART_IER);
1912                        }
1913                }
1914        }
1915
1916        if (tty->termios->c_cflag & CRTSCTS) {
1917                info->MCR |= UART_MCR_RTS;
1918                outb(info->MCR, info->ioaddr + UART_MCR);
1919        }
1920}
1921
1922/*
1923 * mxser_stop() and mxser_start()
1924 *
1925 * This routines are called before setting or resetting tty->stopped.
1926 * They enable or disable transmitter interrupts, as necessary.
1927 */
1928static void mxser_stop(struct tty_struct *tty)
1929{
1930        struct mxser_port *info = tty->driver_data;
1931        unsigned long flags;
1932
1933        spin_lock_irqsave(&info->slock, flags);
1934        if (info->IER & UART_IER_THRI) {
1935                info->IER &= ~UART_IER_THRI;
1936                outb(info->IER, info->ioaddr + UART_IER);
1937        }
1938        spin_unlock_irqrestore(&info->slock, flags);
1939}
1940
1941static void mxser_start(struct tty_struct *tty)
1942{
1943        struct mxser_port *info = tty->driver_data;
1944        unsigned long flags;
1945
1946        spin_lock_irqsave(&info->slock, flags);
1947        if (info->xmit_cnt && info->port.xmit_buf) {
1948                outb(info->IER & ~UART_IER_THRI, info->ioaddr + UART_IER);
1949                info->IER |= UART_IER_THRI;
1950                outb(info->IER, info->ioaddr + UART_IER);
1951        }
1952        spin_unlock_irqrestore(&info->slock, flags);
1953}
1954
1955static void mxser_set_termios(struct tty_struct *tty, struct ktermios *old_termios)
1956{
1957        struct mxser_port *info = tty->driver_data;
1958        unsigned long flags;
1959
1960        spin_lock_irqsave(&info->slock, flags);
1961        mxser_change_speed(tty, old_termios);
1962        spin_unlock_irqrestore(&info->slock, flags);
1963
1964        if ((old_termios->c_cflag & CRTSCTS) &&
1965                        !(tty->termios->c_cflag & CRTSCTS)) {
1966                tty->hw_stopped = 0;
1967                mxser_start(tty);
1968        }
1969
1970        /* Handle sw stopped */
1971        if ((old_termios->c_iflag & IXON) &&
1972                        !(tty->termios->c_iflag & IXON)) {
1973                tty->stopped = 0;
1974
1975                if (info->board->chip_flag) {
1976                        spin_lock_irqsave(&info->slock, flags);
1977                        mxser_disable_must_rx_software_flow_control(
1978                                        info->ioaddr);
1979                        spin_unlock_irqrestore(&info->slock, flags);
1980                }
1981
1982                mxser_start(tty);
1983        }
1984}
1985
1986/*
1987 * mxser_wait_until_sent() --- wait until the transmitter is empty
1988 */
1989static void mxser_wait_until_sent(struct tty_struct *tty, int timeout)
1990{
1991        struct mxser_port *info = tty->driver_data;
1992        unsigned long orig_jiffies, char_time;
1993        int lsr;
1994
1995        if (info->type == PORT_UNKNOWN)
1996                return;
1997
1998        if (info->xmit_fifo_size == 0)
1999                return;         /* Just in case.... */
2000
2001        orig_jiffies = jiffies;
2002        /*
2003         * Set the check interval to be 1/5 of the estimated time to
2004         * send a single character, and make it at least 1.  The check
2005         * interval should also be less than the timeout.
2006         *
2007         * Note: we have to use pretty tight timings here to satisfy
2008         * the NIST-PCTS.
2009         */
2010        char_time = (info->timeout - HZ / 50) / info->xmit_fifo_size;
2011        char_time = char_time / 5;
2012        if (char_time == 0)
2013                char_time = 1;
2014        if (timeout && timeout < char_time)
2015                char_time = timeout;
2016        /*
2017         * If the transmitter hasn't cleared in twice the approximate
2018         * amount of time to send the entire FIFO, it probably won't
2019         * ever clear.  This assumes the UART isn't doing flow
2020         * control, which is currently the case.  Hence, if it ever
2021         * takes longer than info->timeout, this is probably due to a
2022         * UART bug of some kind.  So, we clamp the timeout parameter at
2023         * 2*info->timeout.
2024         */
2025        if (!timeout || timeout > 2 * info->timeout)
2026                timeout = 2 * info->timeout;
2027#ifdef SERIAL_DEBUG_RS_WAIT_UNTIL_SENT
2028        printk(KERN_DEBUG "In rs_wait_until_sent(%d) check=%lu...",
2029                timeout, char_time);
2030        printk("jiff=%lu...", jiffies);
2031#endif
2032        lock_kernel();
2033        while (!((lsr = inb(info->ioaddr + UART_LSR)) & UART_LSR_TEMT)) {
2034#ifdef SERIAL_DEBUG_RS_WAIT_UNTIL_SENT
2035                printk("lsr = %d (jiff=%lu)...", lsr, jiffies);
2036#endif
2037                schedule_timeout_interruptible(char_time);
2038                if (signal_pending(current))
2039                        break;
2040                if (timeout && time_after(jiffies, orig_jiffies + timeout))
2041                        break;
2042        }
2043        set_current_state(TASK_RUNNING);
2044        unlock_kernel();
2045
2046#ifdef SERIAL_DEBUG_RS_WAIT_UNTIL_SENT
2047        printk("lsr = %d (jiff=%lu)...done\n", lsr, jiffies);
2048#endif
2049}
2050
2051/*
2052 * This routine is called by tty_hangup() when a hangup is signaled.
2053 */
2054static void mxser_hangup(struct tty_struct *tty)
2055{
2056        struct mxser_port *info = tty->driver_data;
2057
2058        mxser_flush_buffer(tty);
2059        mxser_shutdown(tty);
2060        tty_port_hangup(&info->port);
2061}
2062
2063/*
2064 * mxser_rs_break() --- routine which turns the break handling on or off
2065 */
2066static int mxser_rs_break(struct tty_struct *tty, int break_state)
2067{
2068        struct mxser_port *info = tty->driver_data;
2069        unsigned long flags;
2070
2071        spin_lock_irqsave(&info->slock, flags);
2072        if (break_state == -1)
2073                outb(inb(info->ioaddr + UART_LCR) | UART_LCR_SBC,
2074                        info->ioaddr + UART_LCR);
2075        else
2076                outb(inb(info->ioaddr + UART_LCR) & ~UART_LCR_SBC,
2077                        info->ioaddr + UART_LCR);
2078        spin_unlock_irqrestore(&info->slock, flags);
2079        return 0;
2080}
2081
2082static void mxser_receive_chars(struct tty_struct *tty,
2083                                struct mxser_port *port, int *status)
2084{
2085        unsigned char ch, gdl;
2086        int ignored = 0;
2087        int cnt = 0;
2088        int recv_room;
2089        int max = 256;
2090
2091        recv_room = tty->receive_room;
2092        if (recv_room == 0 && !port->ldisc_stop_rx)
2093                mxser_stoprx(tty);
2094        if (port->board->chip_flag != MOXA_OTHER_UART) {
2095
2096                if (*status & UART_LSR_SPECIAL)
2097                        goto intr_old;
2098                if (port->board->chip_flag == MOXA_MUST_MU860_HWID &&
2099                                (*status & MOXA_MUST_LSR_RERR))
2100                        goto intr_old;
2101                if (*status & MOXA_MUST_LSR_RERR)
2102                        goto intr_old;
2103
2104                gdl = inb(port->ioaddr + MOXA_MUST_GDL_REGISTER);
2105
2106                if (port->board->chip_flag == MOXA_MUST_MU150_HWID)
2107                        gdl &= MOXA_MUST_GDL_MASK;
2108                if (gdl >= recv_room) {
2109                        if (!port->ldisc_stop_rx)
2110                                mxser_stoprx(tty);
2111                }
2112                while (gdl--) {
2113                        ch = inb(port->ioaddr + UART_RX);
2114                        tty_insert_flip_char(tty, ch, 0);
2115                        cnt++;
2116                }
2117                goto end_intr;
2118        }
2119intr_old:
2120
2121        do {
2122                if (max-- < 0)
2123                        break;
2124
2125                ch = inb(port->ioaddr + UART_RX);
2126                if (port->board->chip_flag && (*status & UART_LSR_OE))
2127                        outb(0x23, port->ioaddr + UART_FCR);
2128                *status &= port->read_status_mask;
2129                if (*status & port->ignore_status_mask) {
2130                        if (++ignored > 100)
2131                                break;
2132                } else {
2133                        char flag = 0;
2134                        if (*status & UART_LSR_SPECIAL) {
2135                                if (*status & UART_LSR_BI) {
2136                                        flag = TTY_BREAK;
2137                                        port->icount.brk++;
2138
2139                                        if (port->port.flags & ASYNC_SAK)
2140                                                do_SAK(tty);
2141                                } else if (*status & UART_LSR_PE) {
2142                                        flag = TTY_PARITY;
2143                                        port->icount.parity++;
2144                                } else if (*status & UART_LSR_FE) {
2145                                        flag = TTY_FRAME;
2146                                        port->icount.frame++;
2147                                } else if (*status & UART_LSR_OE) {
2148                                        flag = TTY_OVERRUN;
2149                                        port->icount.overrun++;
2150                                } else
2151                                        flag = TTY_BREAK;
2152                        }
2153                        tty_insert_flip_char(tty, ch, flag);
2154                        cnt++;
2155                        if (cnt >= recv_room) {
2156                                if (!port->ldisc_stop_rx)
2157                                        mxser_stoprx(tty);
2158                                break;
2159                        }
2160
2161                }
2162
2163                if (port->board->chip_flag)
2164                        break;
2165
2166                *status = inb(port->ioaddr + UART_LSR);
2167        } while (*status & UART_LSR_DR);
2168
2169end_intr:
2170        mxvar_log.rxcnt[tty->index] += cnt;
2171        port->mon_data.rxcnt += cnt;
2172        port->mon_data.up_rxcnt += cnt;
2173
2174        /*
2175         * We are called from an interrupt context with &port->slock
2176         * being held. Drop it temporarily in order to prevent
2177         * recursive locking.
2178         */
2179        spin_unlock(&port->slock);
2180        tty_flip_buffer_push(tty);
2181        spin_lock(&port->slock);
2182}
2183
2184static void mxser_transmit_chars(struct tty_struct *tty, struct mxser_port *port)
2185{
2186        int count, cnt;
2187
2188        if (port->x_char) {
2189                outb(port->x_char, port->ioaddr + UART_TX);
2190                port->x_char = 0;
2191                mxvar_log.txcnt[tty->index]++;
2192                port->mon_data.txcnt++;
2193                port->mon_data.up_txcnt++;
2194                port->icount.tx++;
2195                return;
2196        }
2197
2198        if (port->port.xmit_buf == NULL)
2199                return;
2200
2201        if (port->xmit_cnt <= 0 || tty->stopped ||
2202                        (tty->hw_stopped &&
2203                        (port->type != PORT_16550A) &&
2204                        (!port->board->chip_flag))) {
2205                port->IER &= ~UART_IER_THRI;
2206                outb(port->IER, port->ioaddr + UART_IER);
2207                return;
2208        }
2209
2210        cnt = port->xmit_cnt;
2211        count = port->xmit_fifo_size;
2212        do {
2213                outb(port->port.xmit_buf[port->xmit_tail++],
2214                        port->ioaddr + UART_TX);
2215                port->xmit_tail = port->xmit_tail & (SERIAL_XMIT_SIZE - 1);
2216                if (--port->xmit_cnt <= 0)
2217                        break;
2218        } while (--count > 0);
2219        mxvar_log.txcnt[tty->index] += (cnt - port->xmit_cnt);
2220
2221        port->mon_data.txcnt += (cnt - port->xmit_cnt);
2222        port->mon_data.up_txcnt += (cnt - port->xmit_cnt);
2223        port->icount.tx += (cnt - port->xmit_cnt);
2224
2225        if (port->xmit_cnt < WAKEUP_CHARS && tty)
2226                tty_wakeup(tty);
2227
2228        if (port->xmit_cnt <= 0) {
2229                port->IER &= ~UART_IER_THRI;
2230                outb(port->IER, port->ioaddr + UART_IER);
2231        }
2232}
2233
2234/*
2235 * This is the serial driver's generic interrupt routine
2236 */
2237static irqreturn_t mxser_interrupt(int irq, void *dev_id)
2238{
2239        int status, iir, i;
2240        struct mxser_board *brd = NULL;
2241        struct mxser_port *port;
2242        int max, irqbits, bits, msr;
2243        unsigned int int_cnt, pass_counter = 0;
2244        int handled = IRQ_NONE;
2245        struct tty_struct *tty;
2246
2247        for (i = 0; i < MXSER_BOARDS; i++)
2248                if (dev_id == &mxser_boards[i]) {
2249                        brd = dev_id;
2250                        break;
2251                }
2252
2253        if (i == MXSER_BOARDS)
2254                goto irq_stop;
2255        if (brd == NULL)
2256                goto irq_stop;
2257        max = brd->info->nports;
2258        while (pass_counter++ < MXSER_ISR_PASS_LIMIT) {
2259                irqbits = inb(brd->vector) & brd->vector_mask;
2260                if (irqbits == brd->vector_mask)
2261                        break;
2262
2263                handled = IRQ_HANDLED;
2264                for (i = 0, bits = 1; i < max; i++, irqbits |= bits, bits <<= 1) {
2265                        if (irqbits == brd->vector_mask)
2266                                break;
2267                        if (bits & irqbits)
2268                                continue;
2269                        port = &brd->ports[i];
2270
2271                        int_cnt = 0;
2272                        spin_lock(&port->slock);
2273                        do {
2274                                iir = inb(port->ioaddr + UART_IIR);
2275                                if (iir & UART_IIR_NO_INT)
2276                                        break;
2277                                iir &= MOXA_MUST_IIR_MASK;
2278                                tty = tty_port_tty_get(&port->port);
2279                                if (!tty ||
2280                                                (port->port.flags & ASYNC_CLOSING) ||
2281                                                !(port->port.flags &
2282                                                        ASYNC_INITIALIZED)) {
2283                                        status = inb(port->ioaddr + UART_LSR);
2284                                        outb(0x27, port->ioaddr + UART_FCR);
2285                                        inb(port->ioaddr + UART_MSR);
2286                                        tty_kref_put(tty);
2287                                        break;
2288                                }
2289
2290                                status = inb(port->ioaddr + UART_LSR);
2291
2292                                if (status & UART_LSR_PE)
2293                                        port->err_shadow |= NPPI_NOTIFY_PARITY;
2294                                if (status & UART_LSR_FE)
2295                                        port->err_shadow |= NPPI_NOTIFY_FRAMING;
2296                                if (status & UART_LSR_OE)
2297                                        port->err_shadow |=
2298                                                NPPI_NOTIFY_HW_OVERRUN;
2299                                if (status & UART_LSR_BI)
2300                                        port->err_shadow |= NPPI_NOTIFY_BREAK;
2301
2302                                if (port->board->chip_flag) {
2303                                        if (iir == MOXA_MUST_IIR_GDA ||
2304                                            iir == MOXA_MUST_IIR_RDA ||
2305                                            iir == MOXA_MUST_IIR_RTO ||
2306                                            iir == MOXA_MUST_IIR_LSR)
2307                                                mxser_receive_chars(tty, port,
2308                                                                &status);
2309
2310                                } else {
2311                                        status &= port->read_status_mask;
2312                                        if (status & UART_LSR_DR)
2313                                                mxser_receive_chars(tty, port,
2314                                                                &status);
2315                                }
2316                                msr = inb(port->ioaddr + UART_MSR);
2317                                if (msr & UART_MSR_ANY_DELTA)
2318                                        mxser_check_modem_status(tty, port, msr);
2319
2320                                if (port->board->chip_flag) {
2321                                        if (iir == 0x02 && (status &
2322                                                                UART_LSR_THRE))
2323                                                mxser_transmit_chars(tty, port);
2324                                } else {
2325                                        if (status & UART_LSR_THRE)
2326                                                mxser_transmit_chars(tty, port);
2327                                }
2328                                tty_kref_put(tty);
2329                        } while (int_cnt++ < MXSER_ISR_PASS_LIMIT);
2330                        spin_unlock(&port->slock);
2331                }
2332        }
2333
2334irq_stop:
2335        return handled;
2336}
2337
2338static const struct tty_operations mxser_ops = {
2339        .open = mxser_open,
2340        .close = mxser_close,
2341        .write = mxser_write,
2342        .put_char = mxser_put_char,
2343        .flush_chars = mxser_flush_chars,
2344        .write_room = mxser_write_room,
2345        .chars_in_buffer = mxser_chars_in_buffer,
2346        .flush_buffer = mxser_flush_buffer,
2347        .ioctl = mxser_ioctl,
2348        .throttle = mxser_throttle,
2349        .unthrottle = mxser_unthrottle,
2350        .set_termios = mxser_set_termios,
2351        .stop = mxser_stop,
2352        .start = mxser_start,
2353        .hangup = mxser_hangup,
2354        .break_ctl = mxser_rs_break,
2355        .wait_until_sent = mxser_wait_until_sent,
2356        .tiocmget = mxser_tiocmget,
2357        .tiocmset = mxser_tiocmset,
2358};
2359
2360struct tty_port_operations mxser_port_ops = {
2361        .carrier_raised = mxser_carrier_raised,
2362        .dtr_rts = mxser_dtr_rts,
2363};
2364
2365/*
2366 * The MOXA Smartio/Industio serial driver boot-time initialization code!
2367 */
2368
2369static void mxser_release_res(struct mxser_board *brd, struct pci_dev *pdev,
2370                unsigned int irq)
2371{
2372        if (irq)
2373                free_irq(brd->irq, brd);
2374        if (pdev != NULL) {     /* PCI */
2375#ifdef CONFIG_PCI
2376                pci_release_region(pdev, 2);
2377                pci_release_region(pdev, 3);
2378#endif
2379        } else {
2380                release_region(brd->ports[0].ioaddr, 8 * brd->info->nports);
2381                release_region(brd->vector, 1);
2382        }
2383}
2384
2385static int __devinit mxser_initbrd(struct mxser_board *brd,
2386                struct pci_dev *pdev)
2387{
2388        struct mxser_port *info;
2389        unsigned int i;
2390        int retval;
2391
2392        printk(KERN_INFO "mxser: max. baud rate = %d bps\n",
2393                        brd->ports[0].max_baud);
2394
2395        for (i = 0; i < brd->info->nports; i++) {
2396                info = &brd->ports[i];
2397                tty_port_init(&info->port);
2398                info->port.ops = &mxser_port_ops;
2399                info->board = brd;
2400                info->stop_rx = 0;
2401                info->ldisc_stop_rx = 0;
2402
2403                /* Enhance mode enabled here */
2404                if (brd->chip_flag != MOXA_OTHER_UART)
2405                        mxser_enable_must_enchance_mode(info->ioaddr);
2406
2407                info->port.flags = ASYNC_SHARE_IRQ;
2408                info->type = brd->uart_type;
2409
2410                process_txrx_fifo(info);
2411
2412                info->custom_divisor = info->baud_base * 16;
2413                info->port.close_delay = 5 * HZ / 10;
2414                info->port.closing_wait = 30 * HZ;
2415                info->normal_termios = mxvar_sdriver->init_termios;
2416                init_waitqueue_head(&info->delta_msr_wait);
2417                memset(&info->mon_data, 0, sizeof(struct mxser_mon));
2418                info->err_shadow = 0;
2419                spin_lock_init(&info->slock);
2420
2421                /* before set INT ISR, disable all int */
2422                outb(inb(info->ioaddr + UART_IER) & 0xf0,
2423                        info->ioaddr + UART_IER);
2424        }
2425
2426        retval = request_irq(brd->irq, mxser_interrupt, IRQF_SHARED, "mxser",
2427                        brd);
2428        if (retval) {
2429                printk(KERN_ERR "Board %s: Request irq failed, IRQ (%d) may "
2430                        "conflict with another device.\n",
2431                        brd->info->name, brd->irq);
2432                /* We hold resources, we need to release them. */
2433                mxser_release_res(brd, pdev, 0);
2434        }
2435        return retval;
2436}
2437
2438static int __init mxser_get_ISA_conf(int cap, struct mxser_board *brd)
2439{
2440        int id, i, bits;
2441        unsigned short regs[16], irq;
2442        unsigned char scratch, scratch2;
2443
2444        brd->chip_flag = MOXA_OTHER_UART;
2445
2446        id = mxser_read_register(cap, regs);
2447        switch (id) {
2448        case C168_ASIC_ID:
2449                brd->info = &mxser_cards[0];
2450                break;
2451        case C104_ASIC_ID:
2452                brd->info = &mxser_cards[1];
2453                break;
2454        case CI104J_ASIC_ID:
2455                brd->info = &mxser_cards[2];
2456                break;
2457        case C102_ASIC_ID:
2458                brd->info = &mxser_cards[5];
2459                break;
2460        case CI132_ASIC_ID:
2461                brd->info = &mxser_cards[6];
2462                break;
2463        case CI134_ASIC_ID:
2464                brd->info = &mxser_cards[7];
2465                break;
2466        default:
2467                return 0;
2468        }
2469
2470        irq = 0;
2471        /* some ISA cards have 2 ports, but we want to see them as 4-port (why?)
2472           Flag-hack checks if configuration should be read as 2-port here. */
2473        if (brd->info->nports == 2 || (brd->info->flags & MXSER_HAS2)) {
2474                irq = regs[9] & 0xF000;
2475                irq = irq | (irq >> 4);
2476                if (irq != (regs[9] & 0xFF00))
2477                        goto err_irqconflict;
2478        } else if (brd->info->nports == 4) {
2479                irq = regs[9] & 0xF000;
2480                irq = irq | (irq >> 4);
2481                irq = irq | (irq >> 8);
2482                if (irq != regs[9])
2483                        goto err_irqconflict;
2484        } else if (brd->info->nports == 8) {
2485                irq = regs[9] & 0xF000;
2486                irq = irq | (irq >> 4);
2487                irq = irq | (irq >> 8);
2488                if ((irq != regs[9]) || (irq != regs[10]))
2489                        goto err_irqconflict;
2490        }
2491
2492        if (!irq) {
2493                printk(KERN_ERR "mxser: interrupt number unset\n");
2494                return -EIO;
2495        }
2496        brd->irq = ((int)(irq & 0xF000) >> 12);
2497        for (i = 0; i < 8; i++)
2498                brd->ports[i].ioaddr = (int) regs[i + 1] & 0xFFF8;
2499        if ((regs[12] & 0x80) == 0) {
2500                printk(KERN_ERR "mxser: invalid interrupt vector\n");
2501                return -EIO;
2502        }
2503        brd->vector = (int)regs[11];    /* interrupt vector */
2504        if (id == 1)
2505                brd->vector_mask = 0x00FF;
2506        else
2507                brd->vector_mask = 0x000F;
2508        for (i = 7, bits = 0x0100; i >= 0; i--, bits <<= 1) {
2509                if (regs[12] & bits) {
2510                        brd->ports[i].baud_base = 921600;
2511                        brd->ports[i].max_baud = 921600;
2512                } else {
2513                        brd->ports[i].baud_base = 115200;
2514                        brd->ports[i].max_baud = 115200;
2515                }
2516        }
2517        scratch2 = inb(cap + UART_LCR) & (~UART_LCR_DLAB);
2518        outb(scratch2 | UART_LCR_DLAB, cap + UART_LCR);
2519        outb(0, cap + UART_EFR);        /* EFR is the same as FCR */
2520        outb(scratch2, cap + UART_LCR);
2521        outb(UART_FCR_ENABLE_FIFO, cap + UART_FCR);
2522        scratch = inb(cap + UART_IIR);
2523
2524        if (scratch & 0xC0)
2525                brd->uart_type = PORT_16550A;
2526        else
2527                brd->uart_type = PORT_16450;
2528        if (!request_region(brd->ports[0].ioaddr, 8 * brd->info->nports,
2529                        "mxser(IO)")) {
2530                printk(KERN_ERR "mxser: can't request ports I/O region: "
2531                                "0x%.8lx-0x%.8lx\n",
2532                                brd->ports[0].ioaddr, brd->ports[0].ioaddr +
2533                                8 * brd->info->nports - 1);
2534                return -EIO;
2535        }
2536        if (!request_region(brd->vector, 1, "mxser(vector)")) {
2537                release_region(brd->ports[0].ioaddr, 8 * brd->info->nports);
2538                printk(KERN_ERR "mxser: can't request interrupt vector region: "
2539                                "0x%.8lx-0x%.8lx\n",
2540                                brd->ports[0].ioaddr, brd->ports[0].ioaddr +
2541                                8 * brd->info->nports - 1);
2542                return -EIO;
2543        }
2544        return brd->info->nports;
2545
2546err_irqconflict:
2547        printk(KERN_ERR "mxser: invalid interrupt number\n");
2548        return -EIO;
2549}
2550
2551static int __devinit mxser_probe(struct pci_dev *pdev,
2552                const struct pci_device_id *ent)
2553{
2554#ifdef CONFIG_PCI
2555        struct mxser_board *brd;
2556        unsigned int i, j;
2557        unsigned long ioaddress;
2558        int retval = -EINVAL;
2559
2560        for (i = 0; i < MXSER_BOARDS; i++)
2561                if (mxser_boards[i].info == NULL)
2562                        break;
2563
2564        if (i >= MXSER_BOARDS) {
2565                dev_err(&pdev->dev, "too many boards found (maximum %d), board "
2566                                "not configured\n", MXSER_BOARDS);
2567                goto err;
2568        }
2569
2570        brd = &mxser_boards[i];
2571        brd->idx = i * MXSER_PORTS_PER_BOARD;
2572        dev_info(&pdev->dev, "found MOXA %s board (BusNo=%d, DevNo=%d)\n",
2573                mxser_cards[ent->driver_data].name,
2574                pdev->bus->number, PCI_SLOT(pdev->devfn));
2575
2576        retval = pci_enable_device(pdev);
2577        if (retval) {
2578                dev_err(&pdev->dev, "PCI enable failed\n");
2579                goto err;
2580        }
2581
2582        /* io address */
2583        ioaddress = pci_resource_start(pdev, 2);
2584        retval = pci_request_region(pdev, 2, "mxser(IO)");
2585        if (retval)
2586                goto err;
2587
2588        brd->info = &mxser_cards[ent->driver_data];
2589        for (i = 0; i < brd->info->nports; i++)
2590                brd->ports[i].ioaddr = ioaddress + 8 * i;
2591
2592        /* vector */
2593        ioaddress = pci_resource_start(pdev, 3);
2594        retval = pci_request_region(pdev, 3, "mxser(vector)");
2595        if (retval)
2596                goto err_relio;
2597        brd->vector = ioaddress;
2598
2599        /* irq */
2600        brd->irq = pdev->irq;
2601
2602        brd->chip_flag = CheckIsMoxaMust(brd->ports[0].ioaddr);
2603        brd->uart_type = PORT_16550A;
2604        brd->vector_mask = 0;
2605
2606        for (i = 0; i < brd->info->nports; i++) {
2607                for (j = 0; j < UART_INFO_NUM; j++) {
2608                        if (Gpci_uart_info[j].type == brd->chip_flag) {
2609                                brd->ports[i].max_baud =
2610                                        Gpci_uart_info[j].max_baud;
2611
2612                                /* exception....CP-102 */
2613                                if (brd->info->flags & MXSER_HIGHBAUD)
2614                                        brd->ports[i].max_baud = 921600;
2615                                break;
2616                        }
2617                }
2618        }
2619
2620        if (brd->chip_flag == MOXA_MUST_MU860_HWID) {
2621                for (i = 0; i < brd->info->nports; i++) {
2622                        if (i < 4)
2623                                brd->ports[i].opmode_ioaddr = ioaddress + 4;
2624                        else
2625                                brd->ports[i].opmode_ioaddr = ioaddress + 0x0c;
2626                }
2627                outb(0, ioaddress + 4); /* default set to RS232 mode */
2628                outb(0, ioaddress + 0x0c);      /* default set to RS232 mode */
2629        }
2630
2631        for (i = 0; i < brd->info->nports; i++) {
2632                brd->vector_mask |= (1 << i);
2633                brd->ports[i].baud_base = 921600;
2634        }
2635
2636        /* mxser_initbrd will hook ISR. */
2637        retval = mxser_initbrd(brd, pdev);
2638        if (retval)
2639                goto err_null;
2640
2641        for (i = 0; i < brd->info->nports; i++)
2642                tty_register_device(mxvar_sdriver, brd->idx + i, &pdev->dev);
2643
2644        pci_set_drvdata(pdev, brd);
2645
2646        return 0;
2647err_relio:
2648        pci_release_region(pdev, 2);
2649err_null:
2650        brd->info = NULL;
2651err:
2652        return retval;
2653#else
2654        return -ENODEV;
2655#endif
2656}
2657
2658static void __devexit mxser_remove(struct pci_dev *pdev)
2659{
2660        struct mxser_board *brd = pci_get_drvdata(pdev);
2661        unsigned int i;
2662
2663        for (i = 0; i < brd->info->nports; i++)
2664                tty_unregister_device(mxvar_sdriver, brd->idx + i);
2665
2666        mxser_release_res(brd, pdev, 1);
2667        brd->info = NULL;
2668}
2669
2670static struct pci_driver mxser_driver = {
2671        .name = "mxser",
2672        .id_table = mxser_pcibrds,
2673        .probe = mxser_probe,
2674        .remove = __devexit_p(mxser_remove)
2675};
2676
2677static int __init mxser_module_init(void)
2678{
2679        struct mxser_board *brd;
2680        unsigned int b, i, m;
2681        int retval;
2682
2683        mxvar_sdriver = alloc_tty_driver(MXSER_PORTS + 1);
2684        if (!mxvar_sdriver)
2685                return -ENOMEM;
2686
2687        printk(KERN_INFO "MOXA Smartio/Industio family driver version %s\n",
2688                MXSER_VERSION);
2689
2690        /* Initialize the tty_driver structure */
2691        mxvar_sdriver->owner = THIS_MODULE;
2692        mxvar_sdriver->magic = TTY_DRIVER_MAGIC;
2693        mxvar_sdriver->name = "ttyMI";
2694        mxvar_sdriver->major = ttymajor;
2695        mxvar_sdriver->minor_start = 0;
2696        mxvar_sdriver->num = MXSER_PORTS + 1;
2697        mxvar_sdriver->type = TTY_DRIVER_TYPE_SERIAL;
2698        mxvar_sdriver->subtype = SERIAL_TYPE_NORMAL;
2699        mxvar_sdriver->init_termios = tty_std_termios;
2700        mxvar_sdriver->init_termios.c_cflag = B9600|CS8|CREAD|HUPCL|CLOCAL;
2701        mxvar_sdriver->flags = TTY_DRIVER_REAL_RAW|TTY_DRIVER_DYNAMIC_DEV;
2702        tty_set_operations(mxvar_sdriver, &mxser_ops);
2703
2704        retval = tty_register_driver(mxvar_sdriver);
2705        if (retval) {
2706                printk(KERN_ERR "Couldn't install MOXA Smartio/Industio family "
2707                                "tty driver !\n");
2708                goto err_put;
2709        }
2710
2711        /* Start finding ISA boards here */
2712        for (m = 0, b = 0; b < MXSER_BOARDS; b++) {
2713                if (!ioaddr[b])
2714                        continue;
2715
2716                brd = &mxser_boards[m];
2717                retval = mxser_get_ISA_conf(ioaddr[b], brd);
2718                if (retval <= 0) {
2719                        brd->info = NULL;
2720                        continue;
2721                }
2722
2723                printk(KERN_INFO "mxser: found MOXA %s board (CAP=0x%lx)\n",
2724                                brd->info->name, ioaddr[b]);
2725
2726                /* mxser_initbrd will hook ISR. */
2727                if (mxser_initbrd(brd, NULL) < 0) {
2728                        brd->info = NULL;
2729                        continue;
2730                }
2731
2732                brd->idx = m * MXSER_PORTS_PER_BOARD;
2733                for (i = 0; i < brd->info->nports; i++)
2734                        tty_register_device(mxvar_sdriver, brd->idx + i, NULL);
2735
2736                m++;
2737        }
2738
2739        retval = pci_register_driver(&mxser_driver);
2740        if (retval) {
2741                printk(KERN_ERR "mxser: can't register pci driver\n");
2742                if (!m) {
2743                        retval = -ENODEV;
2744                        goto err_unr;
2745                } /* else: we have some ISA cards under control */
2746        }
2747
2748        return 0;
2749err_unr:
2750        tty_unregister_driver(mxvar_sdriver);
2751err_put:
2752        put_tty_driver(mxvar_sdriver);
2753        return retval;
2754}
2755
2756static void __exit mxser_module_exit(void)
2757{
2758        unsigned int i, j;
2759
2760        pci_unregister_driver(&mxser_driver);
2761
2762        for (i = 0; i < MXSER_BOARDS; i++) /* ISA remains */
2763                if (mxser_boards[i].info != NULL)
2764                        for (j = 0; j < mxser_boards[i].info->nports; j++)
2765                                tty_unregister_device(mxvar_sdriver,
2766                                                mxser_boards[i].idx + j);
2767        tty_unregister_driver(mxvar_sdriver);
2768        put_tty_driver(mxvar_sdriver);
2769
2770        for (i = 0; i < MXSER_BOARDS; i++)
2771                if (mxser_boards[i].info != NULL)
2772                        mxser_release_res(&mxser_boards[i], NULL, 1);
2773}
2774
2775module_init(mxser_module_init);
2776module_exit(mxser_module_exit);
2777
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.