linux/drivers/char/moxa.c
<<
>>
Prefs
   1/*****************************************************************************/
   2/*
   3 *           moxa.c  -- MOXA Intellio family multiport serial driver.
   4 *
   5 *      Copyright (C) 1999-2000  Moxa Technologies (support@moxa.com.tw).
   6 *
   7 *      This code is loosely based on the Linux serial driver, written by
   8 *      Linus Torvalds, Theodore T'so and others.
   9 *
  10 *      This program is free software; you can redistribute it and/or modify
  11 *      it under the terms of the GNU General Public License as published by
  12 *      the Free Software Foundation; either version 2 of the License, or
  13 *      (at your option) any later version.
  14 */
  15
  16/*
  17 *    MOXA Intellio Series Driver
  18 *      for             : LINUX
  19 *      date            : 1999/1/7
  20 *      version         : 5.1
  21 */
  22
  23#include <linux/module.h>
  24#include <linux/types.h>
  25#include <linux/mm.h>
  26#include <linux/ioport.h>
  27#include <linux/errno.h>
  28#include <linux/signal.h>
  29#include <linux/sched.h>
  30#include <linux/timer.h>
  31#include <linux/interrupt.h>
  32#include <linux/tty.h>
  33#include <linux/tty_flip.h>
  34#include <linux/major.h>
  35#include <linux/string.h>
  36#include <linux/fcntl.h>
  37#include <linux/ptrace.h>
  38#include <linux/serial.h>
  39#include <linux/tty_driver.h>
  40#include <linux/delay.h>
  41#include <linux/pci.h>
  42#include <linux/init.h>
  43#include <linux/bitops.h>
  44#include <linux/completion.h>
  45
  46#include <asm/system.h>
  47#include <asm/io.h>
  48#include <asm/uaccess.h>
  49
  50#define MOXA_VERSION            "5.1k"
  51
  52#define MOXAMAJOR               172
  53#define MOXACUMAJOR             173
  54
  55#define MAX_BOARDS              4       /* Don't change this value */
  56#define MAX_PORTS_PER_BOARD     32      /* Don't change this value */
  57#define MAX_PORTS               (MAX_BOARDS * MAX_PORTS_PER_BOARD)
  58
  59/*
  60 *    Define the Moxa PCI vendor and device IDs.
  61 */
  62#define MOXA_BUS_TYPE_ISA       0
  63#define MOXA_BUS_TYPE_PCI       1
  64
  65enum {
  66        MOXA_BOARD_C218_PCI = 1,
  67        MOXA_BOARD_C218_ISA,
  68        MOXA_BOARD_C320_PCI,
  69        MOXA_BOARD_C320_ISA,
  70        MOXA_BOARD_CP204J,
  71};
  72
  73static char *moxa_brdname[] =
  74{
  75        "C218 Turbo PCI series",
  76        "C218 Turbo ISA series",
  77        "C320 Turbo PCI series",
  78        "C320 Turbo ISA series",
  79        "CP-204J series",
  80};
  81
  82#ifdef CONFIG_PCI
  83static struct pci_device_id moxa_pcibrds[] = {
  84        { PCI_DEVICE(PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_MOXA_C218),
  85                .driver_data = MOXA_BOARD_C218_PCI },
  86        { PCI_DEVICE(PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_MOXA_C320),
  87                .driver_data = MOXA_BOARD_C320_PCI },
  88        { PCI_DEVICE(PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_MOXA_CP204J),
  89                .driver_data = MOXA_BOARD_CP204J },
  90        { 0 }
  91};
  92MODULE_DEVICE_TABLE(pci, moxa_pcibrds);
  93#endif /* CONFIG_PCI */
  94
  95struct moxa_isa_board_conf {
  96        int boardType;
  97        int numPorts;
  98        unsigned long baseAddr;
  99};
 100
 101static struct moxa_isa_board_conf moxa_isa_boards[] =
 102{
 103/*       {MOXA_BOARD_C218_ISA,8,0xDC000}, */
 104};
 105
 106static struct moxa_board_conf {
 107        int boardType;
 108        int numPorts;
 109        unsigned long baseAddr;
 110        int busType;
 111
 112        int loadstat;
 113
 114        void __iomem *basemem;
 115        void __iomem *intNdx;
 116        void __iomem *intPend;
 117        void __iomem *intTable;
 118} moxa_boards[MAX_BOARDS];
 119
 120struct mxser_mstatus {
 121        tcflag_t cflag;
 122        int cts;
 123        int dsr;
 124        int ri;
 125        int dcd;
 126};
 127
 128struct moxaq_str {
 129        int inq;
 130        int outq;
 131};
 132
 133struct moxa_port {
 134        int type;
 135        int port;
 136        int close_delay;
 137        unsigned short closing_wait;
 138        int count;
 139        int blocked_open;
 140        long event; /* long req'd for set_bit --RR */
 141        int asyncflags;
 142        unsigned long statusflags;
 143        struct tty_struct *tty;
 144        int cflag;
 145        wait_queue_head_t open_wait;
 146        struct completion close_wait;
 147
 148        struct timer_list emptyTimer;
 149
 150        char chkPort;
 151        char lineCtrl;
 152        void __iomem *tableAddr;
 153        long curBaud;
 154        char DCDState;
 155        char lowChkFlag;
 156
 157        ushort breakCnt;
 158};
 159
 160/* statusflags */
 161#define TXSTOPPED       0x1
 162#define LOWWAIT         0x2
 163#define EMPTYWAIT       0x4
 164#define THROTTLE        0x8
 165
 166#define SERIAL_DO_RESTART
 167
 168#define WAKEUP_CHARS            256
 169
 170static int ttymajor = MOXAMAJOR;
 171/* Variables for insmod */
 172#ifdef MODULE
 173static int baseaddr[4];
 174static int type[4];
 175static int numports[4];
 176#endif
 177
 178MODULE_AUTHOR("William Chen");
 179MODULE_DESCRIPTION("MOXA Intellio Family Multiport Board Device Driver");
 180MODULE_LICENSE("GPL");
 181#ifdef MODULE
 182module_param_array(type, int, NULL, 0);
 183module_param_array(baseaddr, int, NULL, 0);
 184module_param_array(numports, int, NULL, 0);
 185#endif
 186module_param(ttymajor, int, 0);
 187
 188/*
 189 * static functions:
 190 */
 191static int moxa_open(struct tty_struct *, struct file *);
 192static void moxa_close(struct tty_struct *, struct file *);
 193static int moxa_write(struct tty_struct *, const unsigned char *, int);
 194static int moxa_write_room(struct tty_struct *);
 195static void moxa_flush_buffer(struct tty_struct *);
 196static int moxa_chars_in_buffer(struct tty_struct *);
 197static void moxa_flush_chars(struct tty_struct *);
 198static void moxa_put_char(struct tty_struct *, unsigned char);
 199static int moxa_ioctl(struct tty_struct *, struct file *, unsigned int, unsigned long);
 200static void moxa_throttle(struct tty_struct *);
 201static void moxa_unthrottle(struct tty_struct *);
 202static void moxa_set_termios(struct tty_struct *, struct ktermios *);
 203static void moxa_stop(struct tty_struct *);
 204static void moxa_start(struct tty_struct *);
 205static void moxa_hangup(struct tty_struct *);
 206static int moxa_tiocmget(struct tty_struct *tty, struct file *file);
 207static int moxa_tiocmset(struct tty_struct *tty, struct file *file,
 208                         unsigned int set, unsigned int clear);
 209static void moxa_poll(unsigned long);
 210static void moxa_set_tty_param(struct tty_struct *);
 211static int moxa_block_till_ready(struct tty_struct *, struct file *,
 212                            struct moxa_port *);
 213static void moxa_setup_empty_event(struct tty_struct *);
 214static void moxa_check_xmit_empty(unsigned long);
 215static void moxa_shut_down(struct moxa_port *);
 216static void moxa_receive_data(struct moxa_port *);
 217/*
 218 * moxa board interface functions:
 219 */
 220static void MoxaDriverInit(void);
 221static int MoxaDriverIoctl(unsigned int, unsigned long, int);
 222static int MoxaDriverPoll(void);
 223static int MoxaPortsOfCard(int);
 224static int MoxaPortIsValid(int);
 225static void MoxaPortEnable(int);
 226static void MoxaPortDisable(int);
 227static long MoxaPortGetMaxBaud(int);
 228static long MoxaPortSetBaud(int, long);
 229static int MoxaPortSetTermio(int, struct ktermios *, speed_t);
 230static int MoxaPortGetLineOut(int, int *, int *);
 231static void MoxaPortLineCtrl(int, int, int);
 232static void MoxaPortFlowCtrl(int, int, int, int, int, int);
 233static int MoxaPortLineStatus(int);
 234static int MoxaPortDCDChange(int);
 235static int MoxaPortDCDON(int);
 236static void MoxaPortFlushData(int, int);
 237static int MoxaPortWriteData(int, unsigned char *, int);
 238static int MoxaPortReadData(int, struct tty_struct *tty);
 239static int MoxaPortTxQueue(int);
 240static int MoxaPortRxQueue(int);
 241static int MoxaPortTxFree(int);
 242static void MoxaPortTxDisable(int);
 243static void MoxaPortTxEnable(int);
 244static int MoxaPortResetBrkCnt(int);
 245static void MoxaPortSendBreak(int, int);
 246static int moxa_get_serial_info(struct moxa_port *, struct serial_struct __user *);
 247static int moxa_set_serial_info(struct moxa_port *, struct serial_struct __user *);
 248static void MoxaSetFifo(int port, int enable);
 249
 250static const struct tty_operations moxa_ops = {
 251        .open = moxa_open,
 252        .close = moxa_close,
 253        .write = moxa_write,
 254        .write_room = moxa_write_room,
 255        .flush_buffer = moxa_flush_buffer,
 256        .chars_in_buffer = moxa_chars_in_buffer,
 257        .flush_chars = moxa_flush_chars,
 258        .put_char = moxa_put_char,
 259        .ioctl = moxa_ioctl,
 260        .throttle = moxa_throttle,
 261        .unthrottle = moxa_unthrottle,
 262        .set_termios = moxa_set_termios,
 263        .stop = moxa_stop,
 264        .start = moxa_start,
 265        .hangup = moxa_hangup,
 266        .tiocmget = moxa_tiocmget,
 267        .tiocmset = moxa_tiocmset,
 268};
 269
 270static struct tty_driver *moxaDriver;
 271static struct moxa_port moxa_ports[MAX_PORTS];
 272static DEFINE_TIMER(moxaTimer, moxa_poll, 0, 0);
 273static DEFINE_SPINLOCK(moxa_lock);
 274
 275#ifdef CONFIG_PCI
 276static int __devinit moxa_pci_probe(struct pci_dev *pdev,
 277                const struct pci_device_id *ent)
 278{
 279        struct moxa_board_conf *board;
 280        unsigned int i;
 281        int board_type = ent->driver_data;
 282        int retval;
 283
 284        retval = pci_enable_device(pdev);
 285        if (retval) {
 286                dev_err(&pdev->dev, "can't enable pci device\n");
 287                goto err;
 288        }
 289
 290        for (i = 0; i < MAX_BOARDS; i++)
 291                if (moxa_boards[i].basemem == NULL)
 292                        break;
 293
 294        retval = -ENODEV;
 295        if (i >= MAX_BOARDS) {
 296                dev_warn(&pdev->dev, "more than %u MOXA Intellio family boards "
 297                                "found. Board is ignored.\n", MAX_BOARDS);
 298                goto err;
 299        }
 300
 301        board = &moxa_boards[i];
 302        board->basemem = pci_iomap(pdev, 2, 0x4000);
 303        if (board->basemem == NULL) {
 304                dev_err(&pdev->dev, "can't remap io space 2\n");
 305                goto err;
 306        }
 307
 308        board->boardType = board_type;
 309        switch (board_type) {
 310        case MOXA_BOARD_C218_ISA:
 311        case MOXA_BOARD_C218_PCI:
 312                board->numPorts = 8;
 313                break;
 314
 315        case MOXA_BOARD_CP204J:
 316                board->numPorts = 4;
 317                break;
 318        default:
 319                board->numPorts = 0;
 320                break;
 321        }
 322        board->busType = MOXA_BUS_TYPE_PCI;
 323
 324        pci_set_drvdata(pdev, board);
 325
 326        return (0);
 327err:
 328        return retval;
 329}
 330
 331static void __devexit moxa_pci_remove(struct pci_dev *pdev)
 332{
 333        struct moxa_board_conf *brd = pci_get_drvdata(pdev);
 334
 335        pci_iounmap(pdev, brd->basemem);
 336        brd->basemem = NULL;
 337}
 338
 339static struct pci_driver moxa_pci_driver = {
 340        .name = "moxa",
 341        .id_table = moxa_pcibrds,
 342        .probe = moxa_pci_probe,
 343        .remove = __devexit_p(moxa_pci_remove)
 344};
 345#endif /* CONFIG_PCI */
 346
 347static int __init moxa_init(void)
 348{
 349        int i, numBoards, retval = 0;
 350        struct moxa_port *ch;
 351
 352        printk(KERN_INFO "MOXA Intellio family driver version %s\n",
 353                        MOXA_VERSION);
 354        moxaDriver = alloc_tty_driver(MAX_PORTS + 1);
 355        if (!moxaDriver)
 356                return -ENOMEM;
 357
 358        moxaDriver->owner = THIS_MODULE;
 359        moxaDriver->name = "ttyMX";
 360        moxaDriver->major = ttymajor;
 361        moxaDriver->minor_start = 0;
 362        moxaDriver->type = TTY_DRIVER_TYPE_SERIAL;
 363        moxaDriver->subtype = SERIAL_TYPE_NORMAL;
 364        moxaDriver->init_termios = tty_std_termios;
 365        moxaDriver->init_termios.c_cflag = B9600 | CS8 | CREAD | CLOCAL | HUPCL;
 366        moxaDriver->init_termios.c_ispeed = 9600;
 367        moxaDriver->init_termios.c_ospeed = 9600;
 368        moxaDriver->flags = TTY_DRIVER_REAL_RAW;
 369        tty_set_operations(moxaDriver, &moxa_ops);
 370
 371        for (i = 0, ch = moxa_ports; i < MAX_PORTS; i++, ch++) {
 372                ch->type = PORT_16550A;
 373                ch->port = i;
 374                ch->close_delay = 5 * HZ / 10;
 375                ch->closing_wait = 30 * HZ;
 376                ch->cflag = B9600 | CS8 | CREAD | CLOCAL | HUPCL;
 377                init_waitqueue_head(&ch->open_wait);
 378                init_completion(&ch->close_wait);
 379
 380                setup_timer(&ch->emptyTimer, moxa_check_xmit_empty,
 381                                (unsigned long)ch);
 382        }
 383
 384        pr_debug("Moxa tty devices major number = %d\n", ttymajor);
 385
 386        if (tty_register_driver(moxaDriver)) {
 387                printk(KERN_ERR "Couldn't install MOXA Smartio family driver !\n");
 388                put_tty_driver(moxaDriver);
 389                return -1;
 390        }
 391
 392        mod_timer(&moxaTimer, jiffies + HZ / 50);
 393
 394        /* Find the boards defined in source code */
 395        numBoards = 0;
 396        for (i = 0; i < MAX_BOARDS; i++) {
 397                if ((moxa_isa_boards[i].boardType == MOXA_BOARD_C218_ISA) ||
 398                 (moxa_isa_boards[i].boardType == MOXA_BOARD_C320_ISA)) {
 399                        moxa_boards[numBoards].boardType = moxa_isa_boards[i].boardType;
 400                        if (moxa_isa_boards[i].boardType == MOXA_BOARD_C218_ISA)
 401                                moxa_boards[numBoards].numPorts = 8;
 402                        else
 403                                moxa_boards[numBoards].numPorts = moxa_isa_boards[i].numPorts;
 404                        moxa_boards[numBoards].busType = MOXA_BUS_TYPE_ISA;
 405                        moxa_boards[numBoards].baseAddr = moxa_isa_boards[i].baseAddr;
 406                        pr_debug("Moxa board %2d: %s board(baseAddr=%lx)\n",
 407                               numBoards + 1,
 408                               moxa_brdname[moxa_boards[numBoards].boardType-1],
 409                               moxa_boards[numBoards].baseAddr);
 410                        numBoards++;
 411                }
 412        }
 413        /* Find the boards defined form module args. */
 414#ifdef MODULE
 415        for (i = 0; i < MAX_BOARDS; i++) {
 416                if ((type[i] == MOXA_BOARD_C218_ISA) ||
 417                    (type[i] == MOXA_BOARD_C320_ISA)) {
 418                        pr_debug("Moxa board %2d: %s board(baseAddr=%lx)\n",
 419                               numBoards + 1, moxa_brdname[type[i] - 1],
 420                               (unsigned long)baseaddr[i]);
 421                        if (numBoards >= MAX_BOARDS) {
 422                                printk(KERN_WARNING "More than %d MOXA "
 423                                        "Intellio family boards found. Board "
 424                                        "is ignored.\n", MAX_BOARDS);
 425                                continue;
 426                        }
 427                        moxa_boards[numBoards].boardType = type[i];
 428                        if (moxa_isa_boards[i].boardType == MOXA_BOARD_C218_ISA)
 429                                moxa_boards[numBoards].numPorts = 8;
 430                        else
 431                                moxa_boards[numBoards].numPorts = numports[i];
 432                        moxa_boards[numBoards].busType = MOXA_BUS_TYPE_ISA;
 433                        moxa_boards[numBoards].baseAddr = baseaddr[i];
 434                        numBoards++;
 435                }
 436        }
 437#endif
 438
 439#ifdef CONFIG_PCI
 440        retval = pci_register_driver(&moxa_pci_driver);
 441        if (retval) {
 442                printk(KERN_ERR "Can't register moxa pci driver!\n");
 443                if (numBoards)
 444                        retval = 0;
 445        }
 446#endif
 447
 448        for (i = 0; i < numBoards; i++) {
 449                moxa_boards[i].basemem = ioremap(moxa_boards[i].baseAddr,
 450                                0x4000);
 451        }
 452
 453        return retval;
 454}
 455
 456static void __exit moxa_exit(void)
 457{
 458        int i;
 459
 460        del_timer_sync(&moxaTimer);
 461
 462        for (i = 0; i < MAX_PORTS; i++)
 463                del_timer_sync(&moxa_ports[i].emptyTimer);
 464
 465        if (tty_unregister_driver(moxaDriver))
 466                printk(KERN_ERR "Couldn't unregister MOXA Intellio family "
 467                                "serial driver\n");
 468        put_tty_driver(moxaDriver);
 469
 470#ifdef CONFIG_PCI
 471        pci_unregister_driver(&moxa_pci_driver);
 472#endif
 473
 474        for (i = 0; i < MAX_BOARDS; i++)
 475                if (moxa_boards[i].basemem)
 476                        iounmap(moxa_boards[i].basemem);
 477}
 478
 479module_init(moxa_init);
 480module_exit(moxa_exit);
 481
 482static int moxa_open(struct tty_struct *tty, struct file *filp)
 483{
 484        struct moxa_port *ch;
 485        int port;
 486        int retval;
 487
 488        port = tty->index;
 489        if (port == MAX_PORTS) {
 490                return (0);
 491        }
 492        if (!MoxaPortIsValid(port)) {
 493                tty->driver_data = NULL;
 494                return (-ENODEV);
 495        }
 496
 497        ch = &moxa_ports[port];
 498        ch->count++;
 499        tty->driver_data = ch;
 500        ch->tty = tty;
 501        if (!(ch->asyncflags & ASYNC_INITIALIZED)) {
 502                ch->statusflags = 0;
 503                moxa_set_tty_param(tty);
 504                MoxaPortLineCtrl(ch->port, 1, 1);
 505                MoxaPortEnable(ch->port);
 506                ch->asyncflags |= ASYNC_INITIALIZED;
 507        }
 508        retval = moxa_block_till_ready(tty, filp, ch);
 509
 510        moxa_unthrottle(tty);
 511
 512        if (ch->type == PORT_16550A) {
 513                MoxaSetFifo(ch->port, 1);
 514        } else {
 515                MoxaSetFifo(ch->port, 0);
 516        }
 517
 518        return (retval);
 519}
 520
 521static void moxa_close(struct tty_struct *tty, struct file *filp)
 522{
 523        struct moxa_port *ch;
 524        int port;
 525
 526        port = tty->index;
 527        if (port == MAX_PORTS) {
 528                return;
 529        }
 530        if (!MoxaPortIsValid(port)) {
 531                pr_debug("Invalid portno in moxa_close\n");
 532                tty->driver_data = NULL;
 533                return;
 534        }
 535        if (tty->driver_data == NULL) {
 536                return;
 537        }
 538        if (tty_hung_up_p(filp)) {
 539                return;
 540        }
 541        ch = (struct moxa_port *) tty->driver_data;
 542
 543        if ((tty->count == 1) && (ch->count != 1)) {
 544                printk(KERN_WARNING "moxa_close: bad serial port count; "
 545                        "tty->count is 1, ch->count is %d\n", ch->count);
 546                ch->count = 1;
 547        }
 548        if (--ch->count < 0) {
 549                printk(KERN_WARNING "moxa_close: bad serial port count, "
 550                        "device=%s\n", tty->name);
 551                ch->count = 0;
 552        }
 553        if (ch->count) {
 554                return;
 555        }
 556        ch->asyncflags |= ASYNC_CLOSING;
 557
 558        ch->cflag = tty->termios->c_cflag;
 559        if (ch->asyncflags & ASYNC_INITIALIZED) {
 560                moxa_setup_empty_event(tty);
 561                tty_wait_until_sent(tty, 30 * HZ);      /* 30 seconds timeout */
 562                del_timer_sync(&moxa_ports[ch->port].emptyTimer);
 563        }
 564        moxa_shut_down(ch);
 565        MoxaPortFlushData(port, 2);
 566
 567        if (tty->driver->flush_buffer)
 568                tty->driver->flush_buffer(tty);
 569        tty_ldisc_flush(tty);
 570                        
 571        tty->closing = 0;
 572        ch->event = 0;
 573        ch->tty = NULL;
 574        if (ch->blocked_open) {
 575                if (ch->close_delay) {
 576                        msleep_interruptible(jiffies_to_msecs(ch->close_delay));
 577                }
 578                wake_up_interruptible(&ch->open_wait);
 579        }
 580        ch->asyncflags &= ~(ASYNC_NORMAL_ACTIVE | ASYNC_CLOSING);
 581        complete_all(&ch->close_wait);
 582}
 583
 584static int moxa_write(struct tty_struct *tty,
 585                      const unsigned char *buf, int count)
 586{
 587        struct moxa_port *ch;
 588        int len, port;
 589        unsigned long flags;
 590
 591        ch = (struct moxa_port *) tty->driver_data;
 592        if (ch == NULL)
 593                return (0);
 594        port = ch->port;
 595
 596        spin_lock_irqsave(&moxa_lock, flags);
 597        len = MoxaPortWriteData(port, (unsigned char *) buf, count);
 598        spin_unlock_irqrestore(&moxa_lock, flags);
 599
 600        /*********************************************
 601        if ( !(ch->statusflags & LOWWAIT) &&
 602             ((len != count) || (MoxaPortTxFree(port) <= 100)) )
 603        ************************************************/
 604        ch->statusflags |= LOWWAIT;
 605        return (len);
 606}
 607
 608static int moxa_write_room(struct tty_struct *tty)
 609{
 610        struct moxa_port *ch;
 611
 612        if (tty->stopped)
 613                return (0);
 614        ch = (struct moxa_port *) tty->driver_data;
 615        if (ch == NULL)
 616                return (0);
 617        return (MoxaPortTxFree(ch->port));
 618}
 619
 620static void moxa_flush_buffer(struct tty_struct *tty)
 621{
 622        struct moxa_port *ch = (struct moxa_port *) tty->driver_data;
 623
 624        if (ch == NULL)
 625                return;
 626        MoxaPortFlushData(ch->port, 1);
 627        tty_wakeup(tty);
 628}
 629
 630static int moxa_chars_in_buffer(struct tty_struct *tty)
 631{
 632        int chars;
 633        struct moxa_port *ch = (struct moxa_port *) tty->driver_data;
 634
 635        /*
 636         * Sigh...I have to check if driver_data is NULL here, because
 637         * if an open() fails, the TTY subsystem eventually calls
 638         * tty_wait_until_sent(), which calls the driver's chars_in_buffer()
 639         * routine.  And since the open() failed, we return 0 here.  TDJ
 640         */
 641        if (ch == NULL)
 642                return (0);
 643        chars = MoxaPortTxQueue(ch->port);
 644        if (chars) {
 645                /*
 646                 * Make it possible to wakeup anything waiting for output
 647                 * in tty_ioctl.c, etc.
 648                 */
 649                if (!(ch->statusflags & EMPTYWAIT))
 650                        moxa_setup_empty_event(tty);
 651        }
 652        return (chars);
 653}
 654
 655static void moxa_flush_chars(struct tty_struct *tty)
 656{
 657        /*
 658         * Don't think I need this, because this is called to empty the TX
 659         * buffer for the 16450, 16550, etc.
 660         */
 661}
 662
 663static void moxa_put_char(struct tty_struct *tty, unsigned char c)
 664{
 665        struct moxa_port *ch;
 666        int port;
 667        unsigned long flags;
 668
 669        ch = (struct moxa_port *) tty->driver_data;
 670        if (ch == NULL)
 671                return;
 672        port = ch->port;
 673        spin_lock_irqsave(&moxa_lock, flags);
 674        MoxaPortWriteData(port, &c, 1);
 675        spin_unlock_irqrestore(&moxa_lock, flags);
 676        /************************************************
 677        if ( !(ch->statusflags & LOWWAIT) && (MoxaPortTxFree(port) <= 100) )
 678        *************************************************/
 679        ch->statusflags |= LOWWAIT;
 680}
 681
 682static int moxa_tiocmget(struct tty_struct *tty, struct file *file)
 683{
 684        struct moxa_port *ch = (struct moxa_port *) tty->driver_data;
 685        int port;
 686        int flag = 0, dtr, rts;
 687
 688        port = tty->index;
 689        if ((port != MAX_PORTS) && (!ch))
 690                return (-EINVAL);
 691
 692        MoxaPortGetLineOut(ch->port, &dtr, &rts);
 693        if (dtr)
 694                flag |= TIOCM_DTR;
 695        if (rts)
 696                flag |= TIOCM_RTS;
 697        dtr = MoxaPortLineStatus(ch->port);
 698        if (dtr & 1)
 699                flag |= TIOCM_CTS;
 700        if (dtr & 2)
 701                flag |= TIOCM_DSR;
 702        if (dtr & 4)
 703                flag |= TIOCM_CD;
 704        return flag;
 705}
 706
 707static int moxa_tiocmset(struct tty_struct *tty, struct file *file,
 708                         unsigned int set, unsigned int clear)
 709{
 710        struct moxa_port *ch = (struct moxa_port *) tty->driver_data;
 711        int port;
 712        int dtr, rts;
 713
 714        port = tty->index;
 715        if ((port != MAX_PORTS) && (!ch))
 716                return (-EINVAL);
 717
 718        MoxaPortGetLineOut(ch->port, &dtr, &rts);
 719        if (set & TIOCM_RTS)
 720                rts = 1;
 721        if (set & TIOCM_DTR)
 722                dtr = 1;
 723        if (clear & TIOCM_RTS)
 724                rts = 0;
 725        if (clear & TIOCM_DTR)
 726                dtr = 0;
 727        MoxaPortLineCtrl(ch->port, dtr, rts);
 728        return 0;
 729}
 730
 731static int moxa_ioctl(struct tty_struct *tty, struct file *file,
 732                      unsigned int cmd, unsigned long arg)
 733{
 734        struct moxa_port *ch = (struct moxa_port *) tty->driver_data;
 735        register int port;
 736        void __user *argp = (void __user *)arg;
 737        int retval;
 738
 739        port = tty->index;
 740        if ((port != MAX_PORTS) && (!ch))
 741                return (-EINVAL);
 742
 743        switch (cmd) {
 744        case TCSBRK:            /* SVID version: non-zero arg --> no break */
 745                retval = tty_check_change(tty);
 746                if (retval)
 747                        return (retval);
 748                moxa_setup_empty_event(tty);
 749                tty_wait_until_sent(tty, 0);
 750                if (!arg)
 751                        MoxaPortSendBreak(ch->port, 0);
 752                return (0);
 753        case TCSBRKP:           /* support for POSIX tcsendbreak() */
 754                retval = tty_check_change(tty);
 755                if (retval)
 756                        return (retval);
 757                moxa_setup_empty_event(tty);
 758                tty_wait_until_sent(tty, 0);
 759                MoxaPortSendBreak(ch->port, arg);
 760                return (0);
 761        case TIOCGSOFTCAR:
 762                return put_user(C_CLOCAL(tty) ? 1 : 0, (unsigned long __user *) argp);
 763        case TIOCSSOFTCAR:
 764                if(get_user(retval, (unsigned long __user *) argp))
 765                        return -EFAULT;
 766                arg = retval;
 767                tty->termios->c_cflag = ((tty->termios->c_cflag & ~CLOCAL) |
 768                                         (arg ? CLOCAL : 0));
 769                if (C_CLOCAL(tty))
 770                        ch->asyncflags &= ~ASYNC_CHECK_CD;
 771                else
 772                        ch->asyncflags |= ASYNC_CHECK_CD;
 773                return (0);
 774        case TIOCGSERIAL:
 775                return moxa_get_serial_info(ch, argp);
 776
 777        case TIOCSSERIAL:
 778                return moxa_set_serial_info(ch, argp);
 779        default:
 780                retval = MoxaDriverIoctl(cmd, arg, port);
 781        }
 782        return (retval);
 783}
 784
 785static void moxa_throttle(struct tty_struct *tty)
 786{
 787        struct moxa_port *ch = (struct moxa_port *) tty->driver_data;
 788
 789        ch->statusflags |= THROTTLE;
 790}
 791
 792static void moxa_unthrottle(struct tty_struct *tty)
 793{
 794        struct moxa_port *ch = (struct moxa_port *) tty->driver_data;
 795
 796        ch->statusflags &= ~THROTTLE;
 797}
 798
 799static void moxa_set_termios(struct tty_struct *tty,
 800                             struct ktermios *old_termios)
 801{
 802        struct moxa_port *ch = (struct moxa_port *) tty->driver_data;
 803
 804        if (ch == NULL)
 805                return;
 806        moxa_set_tty_param(tty);
 807        if (!(old_termios->c_cflag & CLOCAL) &&
 808            (tty->termios->c_cflag & CLOCAL))
 809                wake_up_interruptible(&ch->open_wait);
 810}
 811
 812static void moxa_stop(struct tty_struct *tty)
 813{
 814        struct moxa_port *ch = (struct moxa_port *) tty->driver_data;
 815
 816        if (ch == NULL)
 817                return;
 818        MoxaPortTxDisable(ch->port);
 819        ch->statusflags |= TXSTOPPED;
 820}
 821
 822
 823static void moxa_start(struct tty_struct *tty)
 824{
 825        struct moxa_port *ch = (struct moxa_port *) tty->driver_data;
 826
 827        if (ch == NULL)
 828                return;
 829
 830        if (!(ch->statusflags & TXSTOPPED))
 831                return;
 832
 833        MoxaPortTxEnable(ch->port);
 834        ch->statusflags &= ~TXSTOPPED;
 835}
 836
 837static void moxa_hangup(struct tty_struct *tty)
 838{
 839        struct moxa_port *ch = (struct moxa_port *) tty->driver_data;
 840
 841        moxa_flush_buffer(tty);
 842        moxa_shut_down(ch);
 843        ch->event = 0;
 844        ch->count = 0;
 845        ch->asyncflags &= ~ASYNC_NORMAL_ACTIVE;
 846        ch->tty = NULL;
 847        wake_up_interruptible(&ch->open_wait);
 848}
 849
 850static void moxa_poll(unsigned long ignored)
 851{
 852        register int card;
 853        struct moxa_port *ch;
 854        struct tty_struct *tp;
 855        int i, ports;
 856
 857        del_timer(&moxaTimer);
 858
 859        if (MoxaDriverPoll() < 0) {
 860                mod_timer(&moxaTimer, jiffies + HZ / 50);
 861                return;
 862        }
 863        for (card = 0; card < MAX_BOARDS; card++) {
 864                if ((ports = MoxaPortsOfCard(card)) <= 0)
 865                        continue;
 866                ch = &moxa_ports[card * MAX_PORTS_PER_BOARD];
 867                for (i = 0; i < ports; i++, ch++) {
 868                        if ((ch->asyncflags & ASYNC_INITIALIZED) == 0)
 869                                continue;
 870                        if (!(ch->statusflags & THROTTLE) &&
 871                            (MoxaPortRxQueue(ch->port) > 0))
 872                                moxa_receive_data(ch);
 873                        if ((tp = ch->tty) == 0)
 874                                continue;
 875                        if (ch->statusflags & LOWWAIT) {
 876                                if (MoxaPortTxQueue(ch->port) <= WAKEUP_CHARS) {
 877                                        if (!tp->stopped) {
 878                                                ch->statusflags &= ~LOWWAIT;
 879                                                tty_wakeup(tp);
 880                                        }
 881                                }
 882                        }
 883                        if (!I_IGNBRK(tp) && (MoxaPortResetBrkCnt(ch->port) > 0)) {
 884                                tty_insert_flip_char(tp, 0, TTY_BREAK);
 885                                tty_schedule_flip(tp);
 886                        }
 887                        if (MoxaPortDCDChange(ch->port)) {
 888                                if (ch->asyncflags & ASYNC_CHECK_CD) {
 889                                        if (MoxaPortDCDON(ch->port))
 890                                                wake_up_interruptible(&ch->open_wait);
 891                                        else {
 892                                                tty_hangup(tp);
 893                                                wake_up_interruptible(&ch->open_wait);
 894                                                ch->asyncflags &= ~ASYNC_NORMAL_ACTIVE;
 895                                        }
 896                                }
 897                        }
 898                }
 899        }
 900
 901        mod_timer(&moxaTimer, jiffies + HZ / 50);
 902}
 903
 904/******************************************************************************/
 905
 906static void moxa_set_tty_param(struct tty_struct *tty)
 907{
 908        register struct ktermios *ts;
 909        struct moxa_port *ch;
 910        int rts, cts, txflow, rxflow, xany;
 911
 912        ch = (struct moxa_port *) tty->driver_data;
 913        ts = tty->termios;
 914        if (ts->c_cflag & CLOCAL)
 915                ch->asyncflags &= ~ASYNC_CHECK_CD;
 916        else
 917                ch->asyncflags |= ASYNC_CHECK_CD;
 918        rts = cts = txflow = rxflow = xany = 0;
 919        if (ts->c_cflag & CRTSCTS)
 920                rts = cts = 1;
 921        if (ts->c_iflag & IXON)
 922                txflow = 1;
 923        if (ts->c_iflag & IXOFF)
 924                rxflow = 1;
 925        if (ts->c_iflag & IXANY)
 926                xany = 1;
 927        MoxaPortFlowCtrl(ch->port, rts, cts, txflow, rxflow, xany);
 928        MoxaPortSetTermio(ch->port, ts, tty_get_baud_rate(tty));
 929}
 930
 931static int moxa_block_till_ready(struct tty_struct *tty, struct file *filp,
 932                            struct moxa_port *ch)
 933{
 934        DECLARE_WAITQUEUE(wait,current);
 935        unsigned long flags;
 936        int retval;
 937        int do_clocal = C_CLOCAL(tty);
 938
 939        /*
 940         * If the device is in the middle of being closed, then block
 941         * until it's done, and then try again.
 942         */
 943        if (tty_hung_up_p(filp) || (ch->asyncflags & ASYNC_CLOSING)) {
 944                if (ch->asyncflags & ASYNC_CLOSING)
 945                        wait_for_completion_interruptible(&ch->close_wait);
 946#ifdef SERIAL_DO_RESTART
 947                if (ch->asyncflags & ASYNC_HUP_NOTIFY)
 948                        return (-EAGAIN);
 949                else
 950                        return (-ERESTARTSYS);
 951#else
 952                return (-EAGAIN);
 953#endif
 954        }
 955        /*
 956         * If non-blocking mode is set, then make the check up front
 957         * and then exit.
 958         */
 959        if (filp->f_flags & O_NONBLOCK) {
 960                ch->asyncflags |= ASYNC_NORMAL_ACTIVE;
 961                return (0);
 962        }
 963        /*
 964         * Block waiting for the carrier detect and the line to become free
 965         */
 966        retval = 0;
 967        add_wait_queue(&ch->open_wait, &wait);
 968        pr_debug("block_til_ready before block: ttys%d, count = %d\n",
 969                ch->port, ch->count);
 970        spin_lock_irqsave(&moxa_lock, flags);
 971        if (!tty_hung_up_p(filp))
 972                ch->count--;
 973        ch->blocked_open++;
 974        spin_unlock_irqrestore(&moxa_lock, flags);
 975
 976        while (1) {
 977                set_current_state(TASK_INTERRUPTIBLE);
 978                if (tty_hung_up_p(filp) ||
 979                    !(ch->asyncflags & ASYNC_INITIALIZED)) {
 980#ifdef SERIAL_DO_RESTART
 981                        if (ch->asyncflags & ASYNC_HUP_NOTIFY)
 982                                retval = -EAGAIN;
 983                        else
 984                                retval = -ERESTARTSYS;
 985#else
 986                        retval = -EAGAIN;
 987#endif
 988                        break;
 989                }
 990                if (!(ch->asyncflags & ASYNC_CLOSING) && (do_clocal ||
 991                                                MoxaPortDCDON(ch->port)))
 992                        break;
 993
 994                if (signal_pending(current)) {
 995                        retval = -ERESTARTSYS;
 996                        break;
 997                }
 998                schedule();
 999        }
1000        set_current_state(TASK_RUNNING);
1001        remove_wait_queue(&ch->open_wait, &wait);
1002
1003        spin_lock_irqsave(&moxa_lock, flags);
1004        if (!tty_hung_up_p(filp))
1005                ch->count++;
1006        ch->blocked_open--;
1007        spin_unlock_irqrestore(&moxa_lock, flags);
1008        pr_debug("block_til_ready after blocking: ttys%d, count = %d\n",
1009                ch->port, ch->count);
1010        if (retval)
1011                return (retval);
1012        /* FIXME: review to see if we need to use set_bit on these */
1013        ch->asyncflags |= ASYNC_NORMAL_ACTIVE;
1014        return 0;
1015}
1016
1017static void moxa_setup_empty_event(struct tty_struct *tty)
1018{
1019        struct moxa_port *ch = tty->driver_data;
1020        unsigned long flags;
1021
1022        spin_lock_irqsave(&moxa_lock, flags);
1023        ch->statusflags |= EMPTYWAIT;
1024        mod_timer(&moxa_ports[ch->port].emptyTimer, jiffies + HZ);
1025        spin_unlock_irqrestore(&moxa_lock, flags);
1026}
1027
1028static void moxa_check_xmit_empty(unsigned long data)
1029{
1030        struct moxa_port *ch;
1031
1032        ch = (struct moxa_port *) data;
1033        if (ch->tty && (ch->statusflags & EMPTYWAIT)) {
1034                if (MoxaPortTxQueue(ch->port) == 0) {
1035                        ch->statusflags &= ~EMPTYWAIT;
1036                        tty_wakeup(ch->tty);
1037                        return;
1038                }
1039                mod_timer(&moxa_ports[ch->port].emptyTimer,
1040                                round_jiffies(jiffies + HZ));
1041        } else
1042                ch->statusflags &= ~EMPTYWAIT;
1043}
1044
1045static void moxa_shut_down(struct moxa_port *ch)
1046{
1047        struct tty_struct *tp;
1048
1049        if (!(ch->asyncflags & ASYNC_INITIALIZED))
1050                return;
1051
1052        tp = ch->tty;
1053
1054        MoxaPortDisable(ch->port);
1055
1056        /*
1057         * If we're a modem control device and HUPCL is on, drop RTS & DTR.
1058         */
1059        if (tp->termios->c_cflag & HUPCL)
1060                MoxaPortLineCtrl(ch->port, 0, 0);
1061
1062        ch->asyncflags &= ~ASYNC_INITIALIZED;
1063}
1064
1065static void moxa_receive_data(struct moxa_port *ch)
1066{
1067        struct tty_struct *tp;
1068        struct ktermios *ts;
1069        unsigned long flags;
1070
1071        ts = NULL;
1072        tp = ch->tty;
1073        if (tp)
1074                ts = tp->termios;
1075        /**************************************************
1076        if ( !tp || !ts || !(ts->c_cflag & CREAD) ) {
1077        *****************************************************/
1078        if (!tp || !ts) {
1079                MoxaPortFlushData(ch->port, 0);
1080                return;
1081        }
1082        spin_lock_irqsave(&moxa_lock, flags);
1083        MoxaPortReadData(ch->port, tp);
1084        spin_unlock_irqrestore(&moxa_lock, flags);
1085        tty_schedule_flip(tp);
1086}
1087
1088#define Magic_code      0x404
1089
1090/*
1091 *    System Configuration
1092 */
1093/*
1094 *    for C218 BIOS initialization
1095 */
1096#define C218_ConfBase   0x800
1097#define C218_status     (C218_ConfBase + 0)     /* BIOS running status    */
1098#define C218_diag       (C218_ConfBase + 2)     /* diagnostic status      */
1099#define C218_key        (C218_ConfBase + 4)     /* WORD (0x218 for C218) */
1100#define C218DLoad_len   (C218_ConfBase + 6)     /* WORD           */
1101#define C218check_sum   (C218_ConfBase + 8)     /* BYTE           */
1102#define C218chksum_ok   (C218_ConfBase + 0x0a)  /* BYTE (1:ok)            */
1103#define C218_TestRx     (C218_ConfBase + 0x10)  /* 8 bytes for 8 ports    */
1104#define C218_TestTx     (C218_ConfBase + 0x18)  /* 8 bytes for 8 ports    */
1105#define C218_RXerr      (C218_ConfBase + 0x20)  /* 8 bytes for 8 ports    */
1106#define C218_ErrFlag    (C218_ConfBase + 0x28)  /* 8 bytes for 8 ports    */
1107
1108#define C218_LoadBuf    0x0F00
1109#define C218_KeyCode    0x218
1110#define CP204J_KeyCode  0x204
1111
1112/*
1113 *    for C320 BIOS initialization
1114 */
1115#define C320_ConfBase   0x800
1116#define C320_LoadBuf    0x0f00
1117#define STS_init        0x05    /* for C320_status        */
1118
1119#define C320_status     C320_ConfBase + 0       /* BIOS running status    */
1120#define C320_diag       C320_ConfBase + 2       /* diagnostic status      */
1121#define C320_key        C320_ConfBase + 4       /* WORD (0320H for C320) */
1122#define C320DLoad_len   C320_ConfBase + 6       /* WORD           */
1123#define C320check_sum   C320_ConfBase + 8       /* WORD           */
1124#define C320chksum_ok   C320_ConfBase + 0x0a    /* WORD (1:ok)            */
1125#define C320bapi_len    C320_ConfBase + 0x0c    /* WORD           */
1126#define C320UART_no     C320_ConfBase + 0x0e    /* WORD           */
1127
1128#define C320_KeyCode    0x320
1129
1130#define FixPage_addr    0x0000  /* starting addr of static page  */
1131#define DynPage_addr    0x2000  /* starting addr of dynamic page */
1132#define C218_start      0x3000  /* starting addr of C218 BIOS prg */
1133#define Control_reg     0x1ff0  /* select page and reset control */
1134#define HW_reset        0x80
1135
1136/*
1137 *    Function Codes
1138 */
1139#define FC_CardReset    0x80
1140#define FC_ChannelReset 1       /* C320 firmware not supported */
1141#define FC_EnableCH     2
1142#define FC_DisableCH    3
1143#define FC_SetParam     4
1144#define FC_SetMode      5
1145#define FC_SetRate      6
1146#define FC_LineControl  7
1147#define FC_LineStatus   8
1148#define FC_XmitControl  9
1149#define FC_FlushQueue   10
1150#define FC_SendBreak    11
1151#define FC_StopBreak    12
1152#define FC_LoopbackON   13
1153#define FC_LoopbackOFF  14
1154#define FC_ClrIrqTable  15
1155#define FC_SendXon      16
1156#define FC_SetTermIrq   17      /* C320 firmware not supported */
1157#define FC_SetCntIrq    18      /* C320 firmware not supported */
1158#define FC_SetBreakIrq  19
1159#define FC_SetLineIrq   20
1160#define FC_SetFlowCtl   21
1161#define FC_GenIrq       22
1162#define FC_InCD180      23
1163#define FC_OutCD180     24
1164#define FC_InUARTreg    23
1165#define FC_OutUARTreg   24
1166#define FC_SetXonXoff   25
1167#define FC_OutCD180CCR  26
1168#define FC_ExtIQueue    27
1169#define FC_ExtOQueue    28
1170#define FC_ClrLineIrq   29
1171#define FC_HWFlowCtl    30
1172#define FC_GetClockRate 35
1173#define FC_SetBaud      36
1174#define FC_SetDataMode  41
1175#define FC_GetCCSR      43
1176#define FC_GetDataError 45
1177#define FC_RxControl    50
1178#define FC_ImmSend      51
1179#define FC_SetXonState  52
1180#define FC_SetXoffState 53
1181#define FC_SetRxFIFOTrig 54
1182#define FC_SetTxFIFOCnt 55
1183#define FC_UnixRate     56
1184#define FC_UnixResetTimer 57
1185
1186#define RxFIFOTrig1     0
1187#define RxFIFOTrig4     1
1188#define RxFIFOTrig8     2
1189#define RxFIFOTrig14    3
1190
1191/*
1192 *    Dual-Ported RAM
1193 */
1194#define DRAM_global     0
1195#define INT_data        (DRAM_global + 0)
1196#define Config_base     (DRAM_global + 0x108)
1197
1198#define IRQindex        (INT_data + 0)
1199#define IRQpending      (INT_data + 4)
1200#define IRQtable        (INT_data + 8)
1201
1202/*
1203 *    Interrupt Status
1204 */
1205#define IntrRx          0x01    /* receiver data O.K.             */
1206#define IntrTx          0x02    /* transmit buffer empty  */
1207#define IntrFunc        0x04    /* function complete              */
1208#define IntrBreak       0x08    /* received break         */
1209#define IntrLine        0x10    /* line status change
1210                                   for transmitter                */
1211#define IntrIntr        0x20    /* received INTR code             */
1212#define IntrQuit        0x40    /* received QUIT code             */
1213#define IntrEOF         0x80    /* received EOF code              */
1214
1215#define IntrRxTrigger   0x100   /* rx data count reach tigger value */
1216#define IntrTxTrigger   0x200   /* tx data count below trigger value */
1217
1218#define Magic_no        (Config_base + 0)
1219#define Card_model_no   (Config_base + 2)
1220#define Total_ports     (Config_base + 4)
1221#define Module_cnt      (Config_base + 8)
1222#define Module_no       (Config_base + 10)
1223#define Timer_10ms      (Config_base + 14)
1224#define Disable_IRQ     (Config_base + 20)
1225#define TMS320_PORT1    (Config_base + 22)
1226#define TMS320_PORT2    (Config_base + 24)
1227#define TMS320_CLOCK    (Config_base + 26)
1228
1229/*
1230 *    DATA BUFFER in DRAM
1231 */
1232#define Extern_table    0x400   /* Base address of the external table
1233                                   (24 words *    64) total 3K bytes
1234                                   (24 words * 128) total 6K bytes */
1235#define Extern_size     0x60    /* 96 bytes                       */
1236#define RXrptr          0x00    /* read pointer for RX buffer     */
1237#define RXwptr          0x02    /* write pointer for RX buffer    */
1238#define TXrptr          0x04    /* read pointer for TX buffer     */
1239#define TXwptr          0x06    /* write pointer for TX buffer    */
1240#define HostStat        0x08    /* IRQ flag and general flag      */
1241#define FlagStat        0x0A
1242#define FlowControl     0x0C    /* B7 B6 B5 B4 B3 B2 B1 B0              */
1243                                        /*  x  x  x  x  |  |  |  |            */
1244                                        /*              |  |  |  + CTS flow   */
1245                                        /*              |  |  +--- RTS flow   */
1246                                        /*              |  +------ TX Xon/Xoff */
1247                                        /*              +--------- RX Xon/Xoff */
1248#define Break_cnt       0x0E    /* received break count   */
1249#define CD180TXirq      0x10    /* if non-0: enable TX irq        */
1250#define RX_mask         0x12
1251#define TX_mask         0x14
1252#define Ofs_rxb         0x16
1253#define Ofs_txb         0x18
1254#define Page_rxb        0x1A
1255#define Page_txb        0x1C
1256#define EndPage_rxb     0x1E
1257#define EndPage_txb     0x20
1258#define Data_error      0x22
1259#define RxTrigger       0x28
1260#define TxTrigger       0x2a
1261
1262#define rRXwptr         0x34
1263#define Low_water       0x36
1264
1265#define FuncCode        0x40
1266#define FuncArg         0x42
1267#define FuncArg1        0x44
1268
1269#define C218rx_size     0x2000  /* 8K bytes */
1270#define C218tx_size     0x8000  /* 32K bytes */
1271
1272#define C218rx_mask     (C218rx_size - 1)
1273#define C218tx_mask     (C218tx_size - 1)
1274
1275#define C320p8rx_size   0x2000
1276#define C320p8tx_size   0x8000
1277#define C320p8rx_mask   (C320p8rx_size - 1)
1278#define C320p8tx_mask   (C320p8tx_size - 1)
1279
1280#define C320p16rx_size  0x2000
1281#define C320p16tx_size  0x4000
1282#define C320p16rx_mask  (C320p16rx_size - 1)
1283#define C320p16tx_mask  (C320p16tx_size - 1)
1284
1285#define C320p24rx_size  0x2000
1286#define C320p24tx_size  0x2000
1287#define C320p24rx_mask  (C320p24rx_size - 1)
1288#define C320p24tx_mask  (C320p24tx_size - 1)
1289
1290#define C320p32rx_size  0x1000
1291#define C320p32tx_size  0x1000
1292#define C320p32rx_mask  (C320p32rx_size - 1)
1293#define C320p32tx_mask  (C320p32tx_size - 1)
1294
1295#define Page_size       0x2000
1296#define Page_mask       (Page_size - 1)
1297#define C218rx_spage    3
1298#define C218tx_spage    4
1299#define C218rx_pageno   1
1300#define C218tx_pageno   4
1301#define C218buf_pageno  5
1302
1303#define C320p8rx_spage  3
1304#define C320p8tx_spage  4
1305#define C320p8rx_pgno   1
1306#define C320p8tx_pgno   4
1307#define C320p8buf_pgno  5
1308
1309#define C320p16rx_spage 3
1310#define C320p16tx_spage 4
1311#define C320p16rx_pgno  1
1312#define C320p16tx_pgno  2
1313#define C320p16buf_pgno 3
1314
1315#define C320p24rx_spage 3
1316#define C320p24tx_spage 4
1317#define C320p24rx_pgno  1
1318#define C320p24tx_pgno  1
1319#define C320p24buf_pgno 2
1320
1321#define C320p32rx_spage 3
1322#define C320p32tx_ofs   C320p32rx_size
1323#define C320p32tx_spage 3
1324#define C320p32buf_pgno 1
1325
1326/*
1327 *    Host Status
1328 */
1329#define WakeupRx        0x01
1330#define WakeupTx        0x02
1331#define WakeupBreak     0x08
1332#define WakeupLine      0x10
1333#define WakeupIntr      0x20
1334#define WakeupQuit      0x40
1335#define WakeupEOF       0x80    /* used in VTIME control */
1336#define WakeupRxTrigger 0x100
1337#define WakeupTxTrigger 0x200
1338/*
1339 *    Flag status
1340 */
1341#define Rx_over         0x01
1342#define Xoff_state      0x02
1343#define Tx_flowOff      0x04
1344#define Tx_enable       0x08
1345#define CTS_state       0x10
1346#define DSR_state       0x20
1347#define DCD_state       0x80
1348/*
1349 *    FlowControl
1350 */
1351#define CTS_FlowCtl     1
1352#define RTS_FlowCtl     2
1353#define Tx_FlowCtl      4
1354#define Rx_FlowCtl      8
1355#define IXM_IXANY       0x10
1356
1357#define LowWater        128
1358
1359#define DTR_ON          1
1360#define RTS_ON          2
1361#define CTS_ON          1
1362#define DSR_ON          2
1363#define DCD_ON          8
1364
1365/* mode definition */
1366#define MX_CS8          0x03
1367#define MX_CS7          0x02
1368#define MX_CS6          0x01
1369#define MX_CS5          0x00
1370
1371#define MX_STOP1        0x00
1372#define MX_STOP15       0x04
1373#define MX_STOP2        0x08
1374
1375#define MX_PARNONE      0x00
1376#define MX_PAREVEN      0x40
1377#define MX_PARODD       0xC0
1378
1379/*
1380 *    Query
1381 */
1382
1383struct mon_str {
1384        int tick;
1385        int rxcnt[MAX_PORTS];
1386        int txcnt[MAX_PORTS];
1387};
1388
1389#define         DCD_changed     0x01
1390#define         DCD_oldstate    0x80
1391
1392static unsigned char moxaBuff[10240];
1393static int moxaLowWaterChk;
1394static int moxaCard;
1395static struct mon_str moxaLog;
1396static int moxaFuncTout = HZ / 2;
1397
1398static void moxafunc(void __iomem *, int, ushort);
1399static void moxa_wait_finish(void __iomem *);
1400static void moxa_low_water_check(void __iomem *);
1401static int moxaloadbios(int, unsigned char __user *, int);
1402static int moxafindcard(int);
1403static int moxaload320b(int, unsigned char __user *, int);
1404static int moxaloadcode(int, unsigned char __user *, int);
1405static int moxaloadc218(int, void __iomem *, int);
1406static int moxaloadc320(int, void __iomem *, int, int *);
1407
1408/*****************************************************************************
1409 *      Driver level functions:                                              *
1410 *      1. MoxaDriverInit(void);                                             *
1411 *      2. MoxaDriverIoctl(unsigned int cmd, unsigned long arg, int port);   *
1412 *      3. MoxaDriverPoll(void);                                             *
1413 *****************************************************************************/
1414void MoxaDriverInit(void)
1415{
1416        struct moxa_port *p;
1417        unsigned int i;
1418
1419        moxaFuncTout = HZ / 2;  /* 500 mini-seconds */
1420        moxaCard = 0;
1421        moxaLog.tick = 0;
1422        moxaLowWaterChk = 0;
1423        for (i = 0; i < MAX_PORTS; i++) {
1424                p = &moxa_ports[i];
1425                p->chkPort = 0;
1426                p->lowChkFlag = 0;
1427                p->lineCtrl = 0;
1428                moxaLog.rxcnt[i] = 0;
1429                moxaLog.txcnt[i] = 0;
1430        }
1431}
1432
1433#define MOXA            0x400
1434#define MOXA_GET_IQUEUE         (MOXA + 1)      /* get input buffered count */
1435#define MOXA_GET_OQUEUE         (MOXA + 2)      /* get output buffered count */
1436#define MOXA_INIT_DRIVER        (MOXA + 6)      /* moxaCard=0 */
1437#define MOXA_LOAD_BIOS          (MOXA + 9)      /* download BIOS */
1438#define MOXA_FIND_BOARD         (MOXA + 10)     /* Check if MOXA card exist? */
1439#define MOXA_LOAD_C320B         (MOXA + 11)     /* download 320B firmware */
1440#define MOXA_LOAD_CODE          (MOXA + 12)     /* download firmware */
1441#define MOXA_GETDATACOUNT       (MOXA + 23)
1442#define MOXA_GET_IOQUEUE        (MOXA + 27)
1443#define MOXA_FLUSH_QUEUE        (MOXA + 28)
1444#define MOXA_GET_CONF           (MOXA + 35)     /* configuration */
1445#define MOXA_GET_MAJOR          (MOXA + 63)
1446#define MOXA_GET_CUMAJOR        (MOXA + 64)
1447#define MOXA_GETMSTATUS         (MOXA + 65)
1448
1449struct dl_str {
1450        char __user *buf;
1451        int len;
1452        int cardno;
1453};
1454
1455static struct dl_str dltmp;
1456
1457void MoxaPortFlushData(int port, int mode)
1458{
1459        void __iomem *ofsAddr;
1460        if ((mode < 0) || (mode > 2))
1461                return;
1462        ofsAddr = moxa_ports[port].tableAddr;
1463        moxafunc(ofsAddr, FC_FlushQueue, mode);
1464        if (mode != 1) {
1465                moxa_ports[port].lowChkFlag = 0;
1466                moxa_low_water_check(ofsAddr);
1467        }
1468}
1469
1470int MoxaDriverIoctl(unsigned int cmd, unsigned long arg, int port)
1471{
1472        int i;
1473        int status;
1474        int MoxaPortTxQueue(int), MoxaPortRxQueue(int);
1475        void __user *argp = (void __user *)arg;
1476
1477        if (port == MAX_PORTS) {
1478                if ((cmd != MOXA_GET_CONF) && (cmd != MOXA_INIT_DRIVER) &&
1479                    (cmd != MOXA_LOAD_BIOS) && (cmd != MOXA_FIND_BOARD) && (cmd != MOXA_LOAD_C320B) &&
1480                 (cmd != MOXA_LOAD_CODE) && (cmd != MOXA_GETDATACOUNT) &&
1481                  (cmd != MOXA_GET_IOQUEUE) && (cmd != MOXA_GET_MAJOR) &&
1482                    (cmd != MOXA_GET_CUMAJOR) && (cmd != MOXA_GETMSTATUS))
1483                        return (-EINVAL);
1484        }
1485        switch (cmd) {
1486        case MOXA_GET_CONF:
1487                if(copy_to_user(argp, &moxa_boards, MAX_BOARDS *
1488                                sizeof(struct moxa_board_conf)))
1489                        return -EFAULT;
1490                return (0);
1491        case MOXA_INIT_DRIVER:
1492                if ((int) arg == 0x404)
1493                        MoxaDriverInit();
1494                return (0);
1495        case MOXA_GETDATACOUNT:
1496                moxaLog.tick = jiffies;
1497                if(copy_to_user(argp, &moxaLog, sizeof(struct mon_str)))
1498                        return -EFAULT;
1499                return (0);
1500        case MOXA_FLUSH_QUEUE:
1501                MoxaPortFlushData(port, arg);
1502                return (0);
1503        case MOXA_GET_IOQUEUE: {
1504                struct moxaq_str __user *argm = argp;
1505                struct moxaq_str tmp;
1506
1507                for (i = 0; i < MAX_PORTS; i++, argm++) {
1508                        memset(&tmp, 0, sizeof(tmp));
1509                        if (moxa_ports[i].chkPort) {
1510                                tmp.inq = MoxaPortRxQueue(i);
1511                                tmp.outq = MoxaPortTxQueue(i);
1512                        }
1513                        if (copy_to_user(argm, &tmp, sizeof(tmp)))
1514                                return -EFAULT;
1515                }
1516                return (0);
1517        } case MOXA_GET_OQUEUE:
1518                i = MoxaPortTxQueue(port);
1519                return put_user(i, (unsigned long __user *)argp);
1520        case MOXA_GET_IQUEUE:
1521                i = MoxaPortRxQueue(port);
1522                return put_user(i, (unsigned long __user *)argp);
1523        case MOXA_GET_MAJOR:
1524                if(copy_to_user(argp, &ttymajor, sizeof(int)))
1525                        return -EFAULT;
1526                return 0;
1527        case MOXA_GET_CUMAJOR:
1528                i = 0;
1529                if(copy_to_user(argp, &i, sizeof(int)))
1530                        return -EFAULT;
1531                return 0;
1532        case MOXA_GETMSTATUS: {
1533                struct mxser_mstatus __user *argm = argp;
1534                struct mxser_mstatus tmp;
1535                struct moxa_port *p;
1536
1537                for (i = 0; i < MAX_PORTS; i++, argm++) {
1538                        p = &moxa_ports[i];
1539                        memset(&tmp, 0, sizeof(tmp));
1540                        if (!p->chkPort) {
1541                                goto copy;
1542                        } else {
1543                                status = MoxaPortLineStatus(p->port);
1544                                if (status & 1)
1545                                        tmp.cts = 1;
1546                                if (status & 2)
1547                                        tmp.dsr = 1;
1548                                if (status & 4)
1549                                        tmp.dcd = 1;
1550                        }
1551
1552                        if (!p->tty || !p->tty->termios)
1553                                tmp.cflag = p->cflag;
1554                        else
1555                                tmp.cflag = p->tty->termios->c_cflag;
1556copy:
1557                        if (copy_to_user(argm, &tmp, sizeof(tmp)))
1558                                return -EFAULT;
1559                }
1560                return 0;
1561        } default:
1562                return (-ENOIOCTLCMD);
1563        case MOXA_LOAD_BIOS:
1564        case MOXA_FIND_BOARD:
1565        case MOXA_LOAD_C320B:
1566        case MOXA_LOAD_CODE:
1567                if (!capable(CAP_SYS_RAWIO))
1568                        return -EPERM;
1569                break;
1570        }
1571
1572        if(copy_from_user(&dltmp, argp, sizeof(struct dl_str)))
1573                return -EFAULT;
1574        if(dltmp.cardno < 0 || dltmp.cardno >= MAX_BOARDS || dltmp.len < 0)
1575                return -EINVAL;
1576
1577        switch(cmd)
1578        {
1579        case MOXA_LOAD_BIOS:
1580                i = moxaloadbios(dltmp.cardno, dltmp.buf, dltmp.len);
1581                return (i);
1582        case MOXA_FIND_BOARD:
1583                return moxafindcard(dltmp.cardno);
1584        case MOXA_LOAD_C320B:
1585                moxaload320b(dltmp.cardno, dltmp.buf, dltmp.len);
1586        default: /* to keep gcc happy */
1587                return (0);
1588        case MOXA_LOAD_CODE:
1589                i = moxaloadcode(dltmp.cardno, dltmp.buf, dltmp.len);
1590                if (i == -1)
1591                        return (-EFAULT);
1592                return (i);
1593
1594        }
1595}
1596
1597int MoxaDriverPoll(void)
1598{
1599        struct moxa_board_conf *brd;
1600        register ushort temp;
1601        register int card;
1602        void __iomem *ofsAddr;
1603        void __iomem *ip;
1604        int port, p, ports;
1605
1606        if (moxaCard == 0)
1607                return (-1);
1608        for (card = 0; card < MAX_BOARDS; card++) {
1609                brd = &moxa_boards[card];
1610                if (brd->loadstat == 0)
1611                        continue;
1612                if ((ports = brd->numPorts) == 0)
1613                        continue;
1614                if (readb(brd->intPend) == 0xff) {
1615                        ip = brd->intTable + readb(brd->intNdx);
1616                        p = card * MAX_PORTS_PER_BOARD;
1617                        ports <<= 1;
1618                        for (port = 0; port < ports; port += 2, p++) {
1619                                if ((temp = readw(ip + port)) != 0) {
1620                                        writew(0, ip + port);
1621                                        ofsAddr = moxa_ports[p].tableAddr;
1622                                        if (temp & IntrTx)
1623                                                writew(readw(ofsAddr + HostStat) & ~WakeupTx, ofsAddr + HostStat);
1624                                        if (temp & IntrBreak) {
1625                                                moxa_ports[p].breakCnt++;
1626                                        }
1627                                        if (temp & IntrLine) {
1628                                                if (readb(ofsAddr + FlagStat) & DCD_state) {
1629                                                        if ((moxa_ports[p].DCDState & DCD_oldstate) == 0)
1630                                                                moxa_ports[p].DCDState = (DCD_oldstate |
1631                                                                                   DCD_changed);
1632                                                } else {
1633                                                        if (moxa_ports[p].DCDState & DCD_oldstate)
1634                                                                moxa_ports[p].DCDState = DCD_changed;
1635                                                }
1636                                        }
1637                                }
1638                        }
1639                        writeb(0, brd->intPend);
1640                }
1641                if (moxaLowWaterChk) {
1642                        p = card * MAX_PORTS_PER_BOARD;
1643                        for (port = 0; port < ports; port++, p++) {
1644                                if (moxa_ports[p].lowChkFlag) {
1645                                        moxa_ports[p].lowChkFlag = 0;
1646                                        ofsAddr = moxa_ports[p].tableAddr;
1647                                        moxa_low_water_check(ofsAddr);
1648                                }
1649                        }
1650                }
1651        }
1652        moxaLowWaterChk = 0;
1653        return (0);
1654}
1655
1656/*****************************************************************************
1657 *      Card level function:                                                 *
1658 *      1. MoxaPortsOfCard(int cardno);                                      *
1659 *****************************************************************************/
1660int MoxaPortsOfCard(int cardno)
1661{
1662
1663        if (moxa_boards[cardno].boardType == 0)
1664                return (0);
1665        return (moxa_boards[cardno].numPorts);
1666}
1667
1668/*****************************************************************************
1669 *      Port level functions:                                                *
1670 *      1.  MoxaPortIsValid(int port);                                       *
1671 *      2.  MoxaPortEnable(int port);                                        *
1672 *      3.  MoxaPortDisable(int port);                                       *
1673 *      4.  MoxaPortGetMaxBaud(int port);                                    *
1674 *      6.  MoxaPortSetBaud(int port, long baud);                            *
1675 *      8.  MoxaPortSetTermio(int port, unsigned char *termio);              *
1676 *      9.  MoxaPortGetLineOut(int port, int *dtrState, int *rtsState);      *
1677 *      10. MoxaPortLineCtrl(int port, int dtrState, int rtsState);          *
1678 *      11. MoxaPortFlowCtrl(int port, int rts, int cts, int rx, int tx,int xany);    *
1679 *      12. MoxaPortLineStatus(int port);                                    *
1680 *      13. MoxaPortDCDChange(int port);                                     *
1681 *      14. MoxaPortDCDON(int port);                                         *
1682 *      15. MoxaPortFlushData(int port, int mode);                           *
1683 *      16. MoxaPortWriteData(int port, unsigned char * buffer, int length); *
1684 *      17. MoxaPortReadData(int port, struct tty_struct *tty);              *
1685 *      20. MoxaPortTxQueue(int port);                                       *
1686 *      21. MoxaPortTxFree(int port);                                        *
1687 *      22. MoxaPortRxQueue(int port);                                       *
1688 *      24. MoxaPortTxDisable(int port);                                     *
1689 *      25. MoxaPortTxEnable(int port);                                      *
1690 *      27. MoxaPortResetBrkCnt(int port);                                   *
1691 *      30. MoxaPortSendBreak(int port, int ticks);                          *
1692 *****************************************************************************/
1693/*
1694 *    Moxa Port Number Description:
1695 *
1696 *      MOXA serial driver supports up to 4 MOXA-C218/C320 boards. And,
1697 *      the port number using in MOXA driver functions will be 0 to 31 for
1698 *      first MOXA board, 32 to 63 for second, 64 to 95 for third and 96
1699 *      to 127 for fourth. For example, if you setup three MOXA boards,
1700 *      first board is C218, second board is C320-16 and third board is
1701 *      C320-32. The port number of first board (C218 - 8 ports) is from
1702 *      0 to 7. The port number of second board (C320 - 16 ports) is form
1703 *      32 to 47. The port number of third board (C320 - 32 ports) is from
1704 *      64 to 95. And those port numbers form 8 to 31, 48 to 63 and 96 to
1705 *      127 will be invalid.
1706 *
1707 *
1708 *      Moxa Functions Description:
1709 *
1710 *      Function 1:     Driver initialization routine, this routine must be
1711 *                      called when initialized driver.
1712 *      Syntax:
1713 *      void MoxaDriverInit();
1714 *
1715 *
1716 *      Function 2:     Moxa driver private IOCTL command processing.
1717 *      Syntax:
1718 *      int  MoxaDriverIoctl(unsigned int cmd, unsigned long arg, int port);
1719 *
1720 *           unsigned int cmd   : IOCTL command
1721 *           unsigned long arg  : IOCTL argument
1722 *           int port           : port number (0 - 127)
1723 *
1724 *           return:    0  (OK)
1725 *                      -EINVAL
1726 *                      -ENOIOCTLCMD
1727 *
1728 *
1729 *      Function 3:     Moxa driver polling process routine.
1730 *      Syntax:
1731 *      int  MoxaDriverPoll(void);
1732 *
1733 *           return:    0       ; polling O.K.
1734 *                      -1      : no any Moxa card.             
1735 *
1736 *
1737 *      Function 4:     Get the ports of this card.
1738 *      Syntax:
1739 *      int  MoxaPortsOfCard(int cardno);
1740 *
1741 *           int cardno         : card number (0 - 3)
1742 *
1743 *           return:    0       : this card is invalid
1744 *                      8/16/24/32
1745 *
1746 *
1747 *      Function 5:     Check this port is valid or invalid
1748 *      Syntax:
1749 *      int  MoxaPortIsValid(int port);
1750 *           int port           : port number (0 - 127, ref port description)
1751 *
1752 *           return:    0       : this port is invalid
1753 *                      1       : this port is valid
1754 *
1755 *
1756 *      Function 6:     Enable this port to start Tx/Rx data.
1757 *      Syntax:
1758 *      void MoxaPortEnable(int port);
1759 *           int port           : port number (0 - 127)
1760 *
1761 *
1762 *      Function 7:     Disable this port
1763 *      Syntax:
1764 *      void MoxaPortDisable(int port);
1765 *           int port           : port number (0 - 127)
1766 *
1767 *
1768 *      Function 8:     Get the maximun available baud rate of this port.
1769 *      Syntax:
1770 *      long MoxaPortGetMaxBaud(int port);
1771 *           int port           : port number (0 - 127)
1772 *
1773 *           return:    0       : this port is invalid
1774 *                      38400/57600/115200 bps
1775 *
1776 *
1777 *      Function 10:    Setting baud rate of this port.
1778 *      Syntax:
1779 *      long MoxaPortSetBaud(int port, long baud);
1780 *           int port           : port number (0 - 127)
1781 *           long baud          : baud rate (50 - 115200)
1782 *
1783 *           return:    0       : this port is invalid or baud < 50
1784 *                      50 - 115200 : the real baud rate set to the port, if
1785 *                                    the argument baud is large than maximun
1786 *                                    available baud rate, the real setting
1787 *                                    baud rate will be the maximun baud rate.
1788 *
1789 *
1790 *      Function 12:    Configure the port.
1791 *      Syntax:
1792 *      int  MoxaPortSetTermio(int port, struct ktermios *termio, speed_t baud);
1793 *           int port           : port number (0 - 127)
1794 *           struct ktermios * termio : termio structure pointer
1795 *           speed_t baud       : baud rate
1796 *
1797 *           return:    -1      : this port is invalid or termio == NULL
1798 *                      0       : setting O.K.
1799 *
1800 *
1801 *      Function 13:    Get the DTR/RTS state of this port.
1802 *      Syntax:
1803 *      int  MoxaPortGetLineOut(int port, int *dtrState, int *rtsState);
1804 *           int port           : port number (0 - 127)
1805 *           int * dtrState     : pointer to INT to receive the current DTR
1806 *                                state. (if NULL, this function will not
1807 *                                write to this address)
1808 *           int * rtsState     : pointer to INT to receive the current RTS
1809 *                                state. (if NULL, this function will not
1810 *                                write to this address)
1811 *
1812 *           return:    -1      : this port is invalid
1813 *                      0       : O.K.
1814 *
1815 *
1816 *      Function 14:    Setting the DTR/RTS output state of this port.
1817 *      Syntax:
1818 *      void MoxaPortLineCtrl(int port, int dtrState, int rtsState);
1819 *           int port           : port number (0 - 127)
1820 *           int dtrState       : DTR output state (0: off, 1: on)
1821 *           int rtsState       : RTS output state (0: off, 1: on)
1822 *
1823 *
1824 *      Function 15:    Setting the flow control of this port.
1825 *      Syntax:
1826 *      void MoxaPortFlowCtrl(int port, int rtsFlow, int ctsFlow, int rxFlow,
1827 *                            int txFlow,int xany);
1828 *           int port           : port number (0 - 127)
1829 *           int rtsFlow        : H/W RTS flow control (0: no, 1: yes)
1830 *           int ctsFlow        : H/W CTS flow control (0: no, 1: yes)
1831 *           int rxFlow         : S/W Rx XON/XOFF flow control (0: no, 1: yes)
1832 *           int txFlow         : S/W Tx XON/XOFF flow control (0: no, 1: yes)
1833 *           int xany           : S/W XANY flow control (0: no, 1: yes)
1834 *
1835 *
1836 *      Function 16:    Get ths line status of this port
1837 *      Syntax:
1838 *      int  MoxaPortLineStatus(int port);
1839 *           int port           : port number (0 - 127)
1840 *
1841 *           return:    Bit 0 - CTS state (0: off, 1: on)
1842 *                      Bit 1 - DSR state (0: off, 1: on)
1843 *                      Bit 2 - DCD state (0: off, 1: on)
1844 *
1845 *
1846 *      Function 17:    Check the DCD state has changed since the last read
1847 *                      of this function.
1848 *      Syntax:
1849 *      int  MoxaPortDCDChange(int port);
1850 *           int port           : port number (0 - 127)
1851 *
1852 *           return:    0       : no changed
1853 *                      1       : DCD has changed
1854 *
1855 *
1856 *      Function 18:    Check ths current DCD state is ON or not.
1857 *      Syntax:
1858 *      int  MoxaPortDCDON(int port);
1859 *           int port           : port number (0 - 127)
1860 *
1861 *           return:    0       : DCD off
1862 *                      1       : DCD on
1863 *
1864 *
1865 *      Function 19:    Flush the Rx/Tx buffer data of this port.
1866 *      Syntax:
1867 *      void MoxaPortFlushData(int port, int mode);
1868 *           int port           : port number (0 - 127)
1869 *           int mode    
1870 *                      0       : flush the Rx buffer 
1871 *                      1       : flush the Tx buffer 
1872 *                      2       : flush the Rx and Tx buffer 
1873 *
1874 *
1875 *      Function 20:    Write data.
1876 *      Syntax:
1877 *      int  MoxaPortWriteData(int port, unsigned char * buffer, int length);
1878 *           int port           : port number (0 - 127)
1879 *           unsigned char * buffer     : pointer to write data buffer.
1880 *           int length         : write data length
1881 *
1882 *           return:    0 - length      : real write data length
1883 *
1884 *
1885 *      Function 21:    Read data.
1886 *      Syntax:
1887 *      int  MoxaPortReadData(int port, struct tty_struct *tty);
1888 *           int port           : port number (0 - 127)
1889 *           struct tty_struct *tty : tty for data
1890 *
1891 *           return:    0 - length      : real read data length
1892 *
1893 *
1894 *      Function 24:    Get the Tx buffer current queued data bytes
1895 *      Syntax:
1896 *      int  MoxaPortTxQueue(int port);
1897 *           int port           : port number (0 - 127)
1898 *
1899 *           return:    ..      : Tx buffer current queued data bytes
1900 *
1901 *
1902 *      Function 25:    Get the Tx buffer current free space
1903 *      Syntax:
1904 *      int  MoxaPortTxFree(int port);
1905 *           int port           : port number (0 - 127)
1906 *
1907 *           return:    ..      : Tx buffer current free space
1908 *
1909 *
1910 *      Function 26:    Get the Rx buffer current queued data bytes
1911 *      Syntax:
1912 *      int  MoxaPortRxQueue(int port);
1913 *           int port           : port number (0 - 127)
1914 *
1915 *           return:    ..      : Rx buffer current queued data bytes
1916 *
1917 *
1918 *      Function 28:    Disable port data transmission.
1919 *      Syntax:
1920 *      void MoxaPortTxDisable(int port);
1921 *           int port           : port number (0 - 127)
1922 *
1923 *
1924 *      Function 29:    Enable port data transmission.
1925 *      Syntax:
1926 *      void MoxaPortTxEnable(int port);
1927 *           int port           : port number (0 - 127)
1928 *
1929 *
1930 *      Function 31:    Get the received BREAK signal count and reset it.
1931 *      Syntax:
1932 *      int  MoxaPortResetBrkCnt(int port);
1933 *           int port           : port number (0 - 127)
1934 *
1935 *           return:    0 - ..  : BREAK signal count
1936 *
1937 *
1938 *      Function 34:    Send out a BREAK signal.
1939 *      Syntax:
1940 *      void MoxaPortSendBreak(int port, int ms100);
1941 *           int port           : port number (0 - 127)
1942 *           int ms100          : break signal time interval.
1943 *                                unit: 100 mini-second. if ms100 == 0, it will
1944 *                                send out a about 250 ms BREAK signal.
1945 *
1946 */
1947int MoxaPortIsValid(int port)
1948{
1949
1950        if (moxaCard == 0)
1951                return (0);
1952        if (moxa_ports[port].chkPort == 0)
1953                return (0);
1954        return (1);
1955}
1956
1957void MoxaPortEnable(int port)
1958{
1959        void __iomem *ofsAddr;
1960        int MoxaPortLineStatus(int);
1961        short lowwater = 512;
1962
1963        ofsAddr = moxa_ports[port].tableAddr;
1964        writew(lowwater, ofsAddr + Low_water);
1965        moxa_ports[port].breakCnt = 0;
1966        if ((moxa_boards[port / MAX_PORTS_PER_BOARD].boardType == MOXA_BOARD_C320_ISA) ||
1967            (moxa_boards[port / MAX_PORTS_PER_BOARD].boardType == MOXA_BOARD_C320_PCI)) {
1968                moxafunc(ofsAddr, FC_SetBreakIrq, 0);
1969        } else {
1970                writew(readw(ofsAddr + HostStat) | WakeupBreak, ofsAddr + HostStat);
1971        }
1972
1973        moxafunc(ofsAddr, FC_SetLineIrq, Magic_code);
1974        moxafunc(ofsAddr, FC_FlushQueue, 2);
1975
1976        moxafunc(ofsAddr, FC_EnableCH, Magic_code);
1977        MoxaPortLineStatus(port);
1978}
1979
1980void MoxaPortDisable(int port)
1981{
1982        void __iomem *ofsAddr = moxa_ports[port].tableAddr;
1983
1984        moxafunc(ofsAddr, FC_SetFlowCtl, 0);    /* disable flow control */
1985        moxafunc(ofsAddr, FC_ClrLineIrq, Magic_code);
1986        writew(0, ofsAddr + HostStat);
1987        moxafunc(ofsAddr, FC_DisableCH, Magic_code);
1988}
1989
1990long MoxaPortGetMaxBaud(int port)
1991{
1992        if ((moxa_boards[port / MAX_PORTS_PER_BOARD].boardType == MOXA_BOARD_C320_ISA) ||
1993            (moxa_boards[port / MAX_PORTS_PER_BOARD].boardType == MOXA_BOARD_C320_PCI))
1994                return (460800L);
1995        else
1996                return (921600L);
1997}
1998
1999
2000long MoxaPortSetBaud(int port, long baud)
2001{
2002        void __iomem *ofsAddr;
2003        long max, clock;
2004        unsigned int val;
2005
2006        if ((baud < 50L) || ((max = MoxaPortGetMaxBaud(port)) == 0))
2007                return (0);
2008        ofsAddr = moxa_ports[port].tableAddr;
2009        if (baud > max)
2010                baud = max;
2011        if (max == 38400L)
2012                clock = 614400L;        /* for 9.8304 Mhz : max. 38400 bps */
2013        else if (max == 57600L)
2014                clock = 691200L;        /* for 11.0592 Mhz : max. 57600 bps */
2015        else
2016                clock = 921600L;        /* for 14.7456 Mhz : max. 115200 bps */
2017        val = clock / baud;
2018        moxafunc(ofsAddr, FC_SetBaud, val);
2019        baud = clock / val;
2020        moxa_ports[port].curBaud = baud;
2021        return (baud);
2022}
2023
2024int MoxaPortSetTermio(int port, struct ktermios *termio, speed_t baud)
2025{
2026        void __iomem *ofsAddr;
2027        tcflag_t cflag;
2028        tcflag_t mode = 0;
2029
2030        if (moxa_ports[port].chkPort == 0 || termio == 0)
2031                return (-1);
2032        ofsAddr = moxa_ports[port].tableAddr;
2033        cflag = termio->c_cflag;        /* termio->c_cflag */
2034
2035        mode = termio->c_cflag & CSIZE;
2036        if (mode == CS5)
2037                mode = MX_CS5;
2038        else if (mode == CS6)
2039                mode = MX_CS6;
2040        else if (mode == CS7)
2041                mode = MX_CS7;
2042        else if (mode == CS8)
2043                mode = MX_CS8;
2044
2045        if (termio->c_cflag & CSTOPB) {
2046                if (mode == MX_CS5)
2047                        mode |= MX_STOP15;
2048                else
2049                        mode |= MX_STOP2;
2050        } else
2051                mode |= MX_STOP1;
2052
2053        if (termio->c_cflag & PARENB) {
2054                if (termio->c_cflag & PARODD)
2055                        mode |= MX_PARODD;
2056                else
2057                        mode |= MX_PAREVEN;
2058        } else
2059                mode |= MX_PARNONE;
2060
2061        moxafunc(ofsAddr, FC_SetDataMode, (ushort) mode);
2062
2063        if ((moxa_boards[port / MAX_PORTS_PER_BOARD].boardType == MOXA_BOARD_C320_ISA) ||
2064            (moxa_boards[port / MAX_PORTS_PER_BOARD].boardType == MOXA_BOARD_C320_PCI)) {
2065                if (baud >= 921600L)
2066                        return (-1);
2067        }
2068        MoxaPortSetBaud(port, baud);
2069
2070        if (termio->c_iflag & (IXON | IXOFF | IXANY)) {
2071                writeb(termio->c_cc[VSTART], ofsAddr + FuncArg);
2072                writeb(termio->c_cc[VSTOP], ofsAddr + FuncArg1);
2073                writeb(FC_SetXonXoff, ofsAddr + FuncCode);
2074                moxa_wait_finish(ofsAddr);
2075
2076        }
2077        return (0);
2078}
2079
2080int MoxaPortGetLineOut(int port, int *dtrState, int *rtsState)
2081{
2082
2083        if (!MoxaPortIsValid(port))
2084                return (-1);
2085        if (dtrState) {
2086                if (moxa_ports[port].lineCtrl & DTR_ON)
2087                        *dtrState = 1;
2088                else
2089                        *dtrState = 0;
2090        }
2091        if (rtsState) {
2092                if (moxa_ports[port].lineCtrl & RTS_ON)
2093                        *rtsState = 1;
2094                else
2095                        *rtsState = 0;
2096        }
2097        return (0);
2098}
2099
2100void MoxaPortLineCtrl(int port, int dtr, int rts)
2101{
2102        void __iomem *ofsAddr;
2103        int mode;
2104
2105        ofsAddr = moxa_ports[port].tableAddr;
2106        mode = 0;
2107        if (dtr)
2108                mode |= DTR_ON;
2109        if (rts)
2110                mode |= RTS_ON;
2111        moxa_ports[port].lineCtrl = mode;
2112        moxafunc(ofsAddr, FC_LineControl, mode);
2113}
2114
2115void MoxaPortFlowCtrl(int port, int rts, int cts, int txflow, int rxflow, int txany)
2116{
2117        void __iomem *ofsAddr;
2118        int mode;
2119
2120        ofsAddr = moxa_ports[port].tableAddr;
2121        mode = 0;
2122        if (rts)
2123                mode |= RTS_FlowCtl;
2124        if (cts)
2125                mode |= CTS_FlowCtl;
2126        if (txflow)
2127                mode |= Tx_FlowCtl;
2128        if (rxflow)
2129                mode |= Rx_FlowCtl;
2130        if (txany)
2131                mode |= IXM_IXANY;
2132        moxafunc(ofsAddr, FC_SetFlowCtl, mode);
2133}
2134
2135int MoxaPortLineStatus(int port)
2136{
2137        void __iomem *ofsAddr;
2138        int val;
2139
2140        ofsAddr = moxa_ports[port].tableAddr;
2141        if ((moxa_boards[port / MAX_PORTS_PER_BOARD].boardType == MOXA_BOARD_C320_ISA) ||
2142            (moxa_boards[port / MAX_PORTS_PER_BOARD].boardType == MOXA_BOARD_C320_PCI)) {
2143                moxafunc(ofsAddr, FC_LineStatus, 0);
2144                val = readw(ofsAddr + FuncArg);
2145        } else {
2146                val = readw(ofsAddr + FlagStat) >> 4;
2147        }
2148        val &= 0x0B;
2149        if (val & 8) {
2150                val |= 4;
2151                if ((moxa_ports[port].DCDState & DCD_oldstate) == 0)
2152                        moxa_ports[port].DCDState = (DCD_oldstate | DCD_changed);
2153        } else {
2154                if (moxa_ports[port].DCDState & DCD_oldstate)
2155                        moxa_ports[port].DCDState = DCD_changed;
2156        }
2157        val &= 7;
2158        return (val);
2159}
2160
2161int MoxaPortDCDChange(int port)
2162{
2163        int n;
2164
2165        if (moxa_ports[port].chkPort == 0)
2166                return (0);
2167        n = moxa_ports[port].DCDState;
2168        moxa_ports[port].DCDState &= ~DCD_changed;
2169        n &= DCD_changed;
2170        return (n);
2171}
2172
2173int MoxaPortDCDON(int port)
2174{
2175        int n;
2176
2177        if (moxa_ports[port].chkPort == 0)
2178                return (0);
2179        if (moxa_ports[port].DCDState & DCD_oldstate)
2180                n = 1;
2181        else
2182                n = 0;
2183        return (n);
2184}
2185
2186int MoxaPortWriteData(int port, unsigned char * buffer, int len)
2187{
2188        int c, total, i;
2189        ushort tail;
2190        int cnt;
2191        ushort head, tx_mask, spage, epage;
2192        ushort pageno, pageofs, bufhead;
2193        void __iomem *baseAddr, *ofsAddr, *ofs;
2194
2195        ofsAddr = moxa_ports[port].tableAddr;
2196        baseAddr = moxa_boards[port / MAX_PORTS_PER_BOARD].basemem;
2197        tx_mask = readw(ofsAddr + TX_mask);
2198        spage = readw(ofsAddr + Page_txb);
2199        epage = readw(ofsAddr + EndPage_txb);
2200        tail = readw(ofsAddr + TXwptr);
2201        head = readw(ofsAddr + TXrptr);
2202        c = (head > tail) ? (head - tail - 1)
2203            : (head - tail + tx_mask);
2204        if (c > len)
2205                c = len;
2206        moxaLog.txcnt[port] += c;
2207        total = c;
2208        if (spage == epage) {
2209                bufhead = readw(ofsAddr + Ofs_txb);
2210                writew(spage, baseAddr + Control_reg);
2211                while (c > 0) {
2212                        if (head > tail)
2213                                len = head - tail - 1;
2214                        else
2215                                len = tx_mask + 1 - tail;
2216                        len = (c > len) ? len : c;
2217                        ofs = baseAddr + DynPage_addr + bufhead + tail;
2218                        for (i = 0; i < len; i++)
2219                                writeb(*buffer++, ofs + i);
2220                        tail = (tail + len) & tx_mask;
2221                        c -= len;
2222                }
2223                writew(tail, ofsAddr + TXwptr);
2224        } else {
2225                len = c;
2226                pageno = spage + (tail >> 13);
2227                pageofs = tail & Page_mask;
2228                do {
2229                        cnt = Page_size - pageofs;
2230                        if (cnt > c)
2231                                cnt = c;
2232                        c -= cnt;
2233                        writeb(pageno, baseAddr + Control_reg);
2234                        ofs = baseAddr + DynPage_addr + pageofs;
2235                        for (i = 0; i < cnt; i++)
2236                                writeb(*buffer++, ofs + i);
2237                        if (c == 0) {
2238                                writew((tail + len) & tx_mask, ofsAddr + TXwptr);
2239                                break;
2240                        }
2241                        if (++pageno == epage)
2242                                pageno = spage;
2243                        pageofs = 0;
2244                } while (1);
2245        }
2246        writeb(1, ofsAddr + CD180TXirq);        /* start to send */
2247        return (total);
2248}
2249
2250int MoxaPortReadData(int port, struct tty_struct *tty)
2251{
2252        register ushort head, pageofs;
2253        int i, count, cnt, len, total, remain;
2254        ushort tail, rx_mask, spage, epage;
2255        ushort pageno, bufhead;
2256        void __iomem *baseAddr, *ofsAddr, *ofs;
2257
2258        ofsAddr = moxa_ports[port].tableAddr;
2259        baseAddr = moxa_boards[port / MAX_PORTS_PER_BOARD].basemem;
2260        head = readw(ofsAddr + RXrptr);
2261        tail = readw(ofsAddr + RXwptr);
2262        rx_mask = readw(ofsAddr + RX_mask);
2263        spage = readw(ofsAddr + Page_rxb);
2264        epage = readw(ofsAddr + EndPage_rxb);
2265        count = (tail >= head) ? (tail - head)
2266            : (tail - head + rx_mask + 1);
2267        if (count == 0)
2268                return 0;
2269
2270        total = count;
2271        remain = count - total;
2272        moxaLog.rxcnt[port] += total;
2273        count = total;
2274        if (spage == epage) {
2275                bufhead = readw(ofsAddr + Ofs_rxb);
2276                writew(spage, baseAddr + Control_reg);
2277                while (count > 0) {
2278                        if (tail >= head)
2279                                len = tail - head;
2280                        else
2281                                len = rx_mask + 1 - head;
2282                        len = (count > len) ? len : count;
2283                        ofs = baseAddr + DynPage_addr + bufhead + head;
2284                        for (i = 0; i < len; i++)
2285                                tty_insert_flip_char(tty, readb(ofs + i), TTY_NORMAL);
2286                        head = (head + len) & rx_mask;
2287                        count -= len;
2288                }
2289                writew(head, ofsAddr + RXrptr);
2290        } else {
2291                len = count;
2292                pageno = spage + (head >> 13);
2293                pageofs = head & Page_mask;
2294                do {
2295                        cnt = Page_size - pageofs;
2296                        if (cnt > count)
2297                                cnt = count;
2298                        count -= cnt;
2299                        writew(pageno, baseAddr + Control_reg);
2300                        ofs = baseAddr + DynPage_addr + pageofs;
2301                        for (i = 0; i < cnt; i++)
2302                                tty_insert_flip_char(tty, readb(ofs + i), TTY_NORMAL);
2303                        if (count == 0) {
2304                                writew((head + len) & rx_mask, ofsAddr + RXrptr);
2305                                break;
2306                        }
2307                        if (++pageno == epage)
2308                                pageno = spage;
2309                        pageofs = 0;
2310                } while (1);
2311        }
2312        if ((readb(ofsAddr + FlagStat) & Xoff_state) && (remain < LowWater)) {
2313                moxaLowWaterChk = 1;
2314                moxa_ports[port].lowChkFlag = 1;
2315        }
2316        return (total);
2317}
2318
2319
2320int MoxaPortTxQueue(int port)
2321{
2322        void __iomem *ofsAddr;
2323        ushort rptr, wptr, mask;
2324        int len;
2325
2326        ofsAddr = moxa_ports[port].tableAddr;
2327        rptr = readw(ofsAddr + TXrptr);
2328        wptr = readw(ofsAddr + TXwptr);
2329        mask = readw(ofsAddr + TX_mask);
2330        len = (wptr - rptr) & mask;
2331        return (len);
2332}
2333
2334int MoxaPortTxFree(int port)
2335{
2336        void __iomem *ofsAddr;
2337        ushort rptr, wptr, mask;
2338        int len;
2339
2340        ofsAddr = moxa_ports[port].tableAddr;
2341        rptr = readw(ofsAddr + TXrptr);
2342        wptr = readw(ofsAddr + TXwptr);
2343        mask = readw(ofsAddr + TX_mask);
2344        len = mask - ((wptr - rptr) & mask);
2345        return (len);
2346}
2347
2348int MoxaPortRxQueue(int port)
2349{
2350        void __iomem *ofsAddr;
2351        ushort rptr, wptr, mask;
2352        int len;
2353
2354        ofsAddr = moxa_ports[port].tableAddr;
2355        rptr = readw(ofsAddr + RXrptr);
2356        wptr = readw(ofsAddr + RXwptr);
2357        mask = readw(ofsAddr + RX_mask);
2358        len = (wptr - rptr) & mask;
2359        return (len);
2360}
2361
2362
2363void MoxaPortTxDisable(int port)
2364{
2365        void __iomem *ofsAddr;
2366
2367        ofsAddr = moxa_ports[port].tableAddr;
2368        moxafunc(ofsAddr, FC_SetXoffState, Magic_code);
2369}
2370
2371void MoxaPortTxEnable(int port)
2372{
2373        void __iomem *ofsAddr;
2374
2375        ofsAddr = moxa_ports[port].tableAddr;
2376        moxafunc(ofsAddr, FC_SetXonState, Magic_code);
2377}
2378
2379
2380int MoxaPortResetBrkCnt(int port)
2381{
2382        ushort cnt;
2383        cnt = moxa_ports[port].breakCnt;
2384        moxa_ports[port].breakCnt = 0;
2385        return (cnt);
2386}
2387
2388
2389void MoxaPortSendBreak(int port, int ms100)
2390{
2391        void __iomem *ofsAddr;
2392
2393        ofsAddr = moxa_ports[port].tableAddr;
2394        if (ms100) {
2395                moxafunc(ofsAddr, FC_SendBreak, Magic_code);
2396                msleep(ms100 * 10);
2397        } else {
2398                moxafunc(ofsAddr, FC_SendBreak, Magic_code);
2399                msleep(250);
2400        }
2401        moxafunc(ofsAddr, FC_StopBreak, Magic_code);
2402}
2403
2404static int moxa_get_serial_info(struct moxa_port *info,
2405                                struct serial_struct __user *retinfo)
2406{
2407        struct serial_struct tmp;
2408
2409        memset(&tmp, 0, sizeof(tmp));
2410        tmp.type = info->type;
2411        tmp.line = info->port;
2412        tmp.port = 0;
2413        tmp.irq = 0;
2414        tmp.flags = info->asyncflags;
2415        tmp.baud_base = 921600;
2416        tmp.close_delay = info->close_delay;
2417        tmp.closing_wait = info->closing_wait;
2418        tmp.custom_divisor = 0;
2419        tmp.hub6 = 0;
2420        if(copy_to_user(retinfo, &tmp, sizeof(*retinfo)))
2421                return -EFAULT;
2422        return (0);
2423}
2424
2425
2426static int moxa_set_serial_info(struct moxa_port *info,
2427                                struct serial_struct __user *new_info)
2428{
2429        struct serial_struct new_serial;
2430
2431        if(copy_from_user(&new_serial, new_info, sizeof(new_serial)))
2432                return -EFAULT;
2433
2434        if ((new_serial.irq != 0) ||
2435            (new_serial.port != 0) ||
2436//           (new_serial.type != info->type) ||
2437            (new_serial.custom_divisor != 0) ||
2438            (new_serial.baud_base != 921600))
2439                return (-EPERM);
2440
2441        if (!capable(CAP_SYS_ADMIN)) {
2442                if (((new_serial.flags & ~ASYNC_USR_MASK) !=
2443                     (info->asyncflags & ~ASYNC_USR_MASK)))
2444                        return (-EPERM);
2445        } else {
2446                info->close_delay = new_serial.close_delay * HZ / 100;
2447                info->closing_wait = new_serial.closing_wait * HZ / 100;
2448        }
2449
2450        new_serial.flags = (new_serial.flags & ~ASYNC_FLAGS);
2451        new_serial.flags |= (info->asyncflags & ASYNC_FLAGS);
2452
2453        if (new_serial.type == PORT_16550A) {
2454                MoxaSetFifo(info->port, 1);
2455        } else {
2456                MoxaSetFifo(info->port, 0);
2457        }
2458
2459        info->type = new_serial.type;
2460        return (0);
2461}
2462
2463
2464
2465/*****************************************************************************
2466 *      Static local functions:                                              *
2467 *****************************************************************************/
2468static void moxafunc(void __iomem *ofsAddr, int cmd, ushort arg)
2469{
2470
2471        writew(arg, ofsAddr + FuncArg);
2472        writew(cmd, ofsAddr + FuncCode);
2473        moxa_wait_finish(ofsAddr);
2474}
2475
2476static void moxa_wait_finish(void __iomem *ofsAddr)
2477{
2478        unsigned long i, j;
2479
2480        i = jiffies;
2481        while (readw(ofsAddr + FuncCode) != 0) {
2482                j = jiffies;
2483                if ((j - i) > moxaFuncTout) {
2484                        return;
2485                }
2486        }
2487}
2488
2489static void moxa_low_water_check(void __iomem *ofsAddr)
2490{
2491        int len;
2492        ushort rptr, wptr, mask;
2493
2494        if (readb(ofsAddr + FlagStat) & Xoff_state) {
2495                rptr = readw(ofsAddr + RXrptr);
2496                wptr = readw(ofsAddr + RXwptr);
2497                mask = readw(ofsAddr + RX_mask);
2498                len = (wptr - rptr) & mask;
2499                if (len <= Low_water)
2500                        moxafunc(ofsAddr, FC_SendXon, 0);
2501        }
2502}
2503
2504static int moxaloadbios(int cardno, unsigned char __user *tmp, int len)
2505{
2506        void __iomem *baseAddr;
2507        int i;
2508
2509        if(len < 0 || len > sizeof(moxaBuff))
2510                return -EINVAL;
2511        if(copy_from_user(moxaBuff, tmp, len))
2512                return -EFAULT;
2513        baseAddr = moxa_boards[cardno].basemem;
2514        writeb(HW_reset, baseAddr + Control_reg);       /* reset */
2515        msleep(10);
2516        for (i = 0; i < 4096; i++)
2517                writeb(0, baseAddr + i);        /* clear fix page */
2518        for (i = 0; i < len; i++)
2519                writeb(moxaBuff[i], baseAddr + i);      /* download BIOS */
2520        writeb(0, baseAddr + Control_reg);      /* restart */
2521        return (0);
2522}
2523
2524static int moxafindcard(int cardno)
2525{
2526        void __iomem *baseAddr;
2527        ushort tmp;
2528
2529        baseAddr = moxa_boards[cardno].basemem;
2530        switch (moxa_boards[cardno].boardType) {
2531        case MOXA_BOARD_C218_ISA:
2532        case MOXA_BOARD_C218_PCI:
2533                if ((tmp = readw(baseAddr + C218_key)) != C218_KeyCode) {
2534                        return (-1);
2535                }
2536                break;
2537        case MOXA_BOARD_CP204J:
2538                if ((tmp = readw(baseAddr + C218_key)) != CP204J_KeyCode) {
2539                        return (-1);
2540                }
2541                break;
2542        default:
2543                if ((tmp = readw(baseAddr + C320_key)) != C320_KeyCode) {
2544                        return (-1);
2545                }
2546                if ((tmp = readw(baseAddr + C320_status)) != STS_init) {
2547                        return (-2);
2548                }
2549        }
2550        return (0);
2551}
2552
2553static int moxaload320b(int cardno, unsigned char __user *tmp, int len)
2554{
2555        void __iomem *baseAddr;
2556        int i;
2557
2558        if(len < 0 || len > sizeof(moxaBuff))
2559                return -EINVAL;
2560        if(copy_from_user(moxaBuff, tmp, len))
2561                return -EFAULT;
2562        baseAddr = moxa_boards[cardno].basemem;
2563        writew(len - 7168 - 2, baseAddr + C320bapi_len);
2564        writeb(1, baseAddr + Control_reg);      /* Select Page 1 */
2565        for (i = 0; i < 7168; i++)
2566                writeb(moxaBuff[i], baseAddr + DynPage_addr + i);
2567        writeb(2, baseAddr + Control_reg);      /* Select Page 2 */
2568        for (i = 0; i < (len - 7168); i++)
2569                writeb(moxaBuff[i + 7168], baseAddr + DynPage_addr + i);
2570        return (0);
2571}
2572
2573static int moxaloadcode(int cardno, unsigned char __user *tmp, int len)
2574{
2575        void __iomem *baseAddr, *ofsAddr;
2576        int retval, port, i;
2577
2578        if(len < 0 || len > sizeof(moxaBuff))
2579                return -EINVAL;
2580        if(copy_from_user(moxaBuff, tmp, len))
2581                return -EFAULT;
2582        baseAddr = moxa_boards[cardno].basemem;
2583        switch (moxa_boards[cardno].boardType) {
2584        case MOXA_BOARD_C218_ISA:
2585        case MOXA_BOARD_C218_PCI:
2586        case MOXA_BOARD_CP204J:
2587                retval = moxaloadc218(cardno, baseAddr, len);
2588                if (retval)
2589                        return (retval);
2590                port = cardno * MAX_PORTS_PER_BOARD;
2591                for (i = 0; i < moxa_boards[cardno].numPorts; i++, port++) {
2592                        struct moxa_port *p = &moxa_ports[port];
2593
2594                        p->chkPort = 1;
2595                        p->curBaud = 9600L;
2596                        p->DCDState = 0;
2597                        p->tableAddr = baseAddr + Extern_table + Extern_size * i;
2598                        ofsAddr = p->tableAddr;
2599                        writew(C218rx_mask, ofsAddr + RX_mask);
2600                        writew(C218tx_mask, ofsAddr + TX_mask);
2601                        writew(C218rx_spage + i * C218buf_pageno, ofsAddr + Page_rxb);
2602                        writew(readw(ofsAddr + Page_rxb) + C218rx_pageno, ofsAddr + EndPage_rxb);
2603
2604                        writew(C218tx_spage + i * C218buf_pageno, ofsAddr + Page_txb);
2605                        writew(readw(ofsAddr + Page_txb) + C218tx_pageno, ofsAddr + EndPage_txb);
2606
2607                }
2608                break;
2609        default:
2610                retval = moxaloadc320(cardno, baseAddr, len,
2611                                      &moxa_boards[cardno].numPorts);
2612                if (retval)
2613                        return (retval);
2614                port = cardno * MAX_PORTS_PER_BOARD;
2615                for (i = 0; i < moxa_boards[cardno].numPorts; i++, port++) {
2616                        struct moxa_port *p = &moxa_ports[port];
2617
2618                        p->chkPort = 1;
2619                        p->curBaud = 9600L;
2620                        p->DCDState = 0;
2621                        p->tableAddr = baseAddr + Extern_table + Extern_size * i;
2622                        ofsAddr = p->tableAddr;
2623                        if (moxa_boards[cardno].numPorts == 8) {
2624                                writew(C320p8rx_mask, ofsAddr + RX_mask);
2625                                writew(C320p8tx_mask, ofsAddr + TX_mask);
2626                                writew(C320p8rx_spage + i * C320p8buf_pgno, ofsAddr + Page_rxb);
2627                                writew(readw(ofsAddr + Page_rxb) + C320p8rx_pgno, ofsAddr + EndPage_rxb);
2628                                writew(C320p8tx_spage + i * C320p8buf_pgno, ofsAddr + Page_txb);
2629                                writew(readw(ofsAddr + Page_txb) + C320p8tx_pgno, ofsAddr + EndPage_txb);
2630
2631                        } else if (moxa_boards[cardno].numPorts == 16) {
2632                                writew(C320p16rx_mask, ofsAddr + RX_mask);
2633                                writew(C320p16tx_mask, ofsAddr + TX_mask);
2634                                writew(C320p16rx_spage + i * C320p16buf_pgno, ofsAddr + Page_rxb);
2635                                writew(readw(ofsAddr + Page_rxb) + C320p16rx_pgno, ofsAddr + EndPage_rxb);
2636                                writew(C320p16tx_spage + i * C320p16buf_pgno, ofsAddr + Page_txb);
2637                                writew(readw(ofsAddr + Page_txb) + C320p16tx_pgno, ofsAddr + EndPage_txb);
2638
2639                        } else if (moxa_boards[cardno].numPorts == 24) {
2640                                writew(C320p24rx_mask, ofsAddr + RX_mask);
2641                                writew(C320p24tx_mask, ofsAddr + TX_mask);
2642                                writew(C320p24rx_spage + i * C320p24buf_pgno, ofsAddr + Page_rxb);
2643                                writew(readw(ofsAddr + Page_rxb) + C320p24rx_pgno, ofsAddr + EndPage_rxb);
2644                                writew(C320p24tx_spage + i * C320p24buf_pgno, ofsAddr + Page_txb);
2645                                writew(readw(ofsAddr + Page_txb), ofsAddr + EndPage_txb);
2646                        } else if (moxa_boards[cardno].numPorts == 32) {
2647                                writew(C320p32rx_mask, ofsAddr + RX_mask);
2648                                writew(C320p32tx_mask, ofsAddr + TX_mask);
2649                                writew(C320p32tx_ofs, ofsAddr + Ofs_txb);
2650                                writew(C320p32rx_spage + i * C320p32buf_pgno, ofsAddr + Page_rxb);
2651                                writew(readb(ofsAddr + Page_rxb), ofsAddr + EndPage_rxb);
2652                                writew(C320p32tx_spage + i * C320p32buf_pgno, ofsAddr + Page_txb);
2653                                writew(readw(ofsAddr + Page_txb), ofsAddr + EndPage_txb);
2654                        }
2655                }
2656                break;
2657        }
2658        moxa_boards[cardno].loadstat = 1;
2659        return (0);
2660}
2661
2662static int moxaloadc218(int cardno, void __iomem *baseAddr, int len)
2663{
2664        char retry;
2665        int i, j, len1, len2;
2666        ushort usum, *ptr, keycode;
2667
2668        if (moxa_boards[cardno].boardType == MOXA_BOARD_CP204J)
2669                keycode = CP204J_KeyCode;
2670        else
2671                keycode = C218_KeyCode;
2672        usum = 0;
2673        len1 = len >> 1;
2674        ptr = (ushort *) moxaBuff;
2675        for (i = 0; i < len1; i++)
2676                usum += le16_to_cpu(*(ptr + i));
2677        retry = 0;
2678        do {
2679                len1 = len >> 1;
2680                j = 0;
2681                while (len1) {
2682                        len2 = (len1 > 2048) ? 2048 : len1;
2683                        len1 -= len2;
2684                        for (i = 0; i < len2 << 1; i++)
2685                                writeb(moxaBuff[i + j], baseAddr + C218_LoadBuf + i);
2686                        j += i;
2687
2688                        writew(len2, baseAddr + C218DLoad_len);
2689                        writew(0, baseAddr + C218_key);
2690                        for (i = 0; i < 100; i++) {
2691                                if (readw(baseAddr + C218_key) == keycode)
2692                                        break;
2693                                msleep(10);
2694                        }
2695                        if (readw(baseAddr + C218_key) != keycode) {
2696                                return (-1);
2697                        }
2698                }
2699                writew(0, baseAddr + C218DLoad_len);
2700                writew(usum, baseAddr + C218check_sum);
2701                writew(0, baseAddr + C218_key);
2702                for (i = 0; i < 100; i++) {
2703                        if (readw(baseAddr + C218_key) == keycode)
2704                                break;
2705                        msleep(10);
2706                }
2707                retry++;
2708        } while ((readb(baseAddr + C218chksum_ok) != 1) && (retry < 3));
2709        if (readb(baseAddr + C218chksum_ok) != 1) {
2710                return (-1);
2711        }
2712        writew(0, baseAddr + C218_key);
2713        for (i = 0; i < 100; i++) {
2714                if (readw(baseAddr + Magic_no) == Magic_code)
2715                        break;
2716                msleep(10);
2717        }
2718        if (readw(baseAddr + Magic_no) != Magic_code) {
2719                return (-1);
2720        }
2721        writew(1, baseAddr + Disable_IRQ);
2722        writew(0, baseAddr + Magic_no);
2723        for (i = 0; i < 100; i++) {
2724                if (readw(baseAddr + Magic_no) == Magic_code)
2725                        break;
2726                msleep(10);
2727        }
2728        if (readw(baseAddr + Magic_no) != Magic_code) {
2729                return (-1);
2730        }
2731        moxaCard = 1;
2732        moxa_boards[cardno].intNdx = baseAddr + IRQindex;
2733        moxa_boards[cardno].intPend = baseAddr + IRQpending;
2734        moxa_boards[cardno].intTable = baseAddr + IRQtable;
2735        return (0);
2736}
2737
2738static int moxaloadc320(int cardno, void __iomem *baseAddr, int len, int *numPorts)
2739{
2740        ushort usum;
2741        int i, j, wlen, len2, retry;
2742        ushort *uptr;
2743
2744        usum = 0;
2745        wlen = len >> 1;
2746        uptr = (ushort *) moxaBuff;
2747        for (i = 0; i < wlen; i++)
2748                usum += le16_to_cpu(uptr[i]);
2749        retry = 0;
2750        j = 0;
2751        do {
2752                while (wlen) {
2753                        if (wlen > 2048)
2754                                len2 = 2048;
2755                        else
2756                                len2 = wlen;
2757                        wlen -= len2;
2758                        len2 <<= 1;
2759                        for (i = 0; i < len2; i++)
2760                                writeb(moxaBuff[j + i], baseAddr + C320_LoadBuf + i);
2761                        len2 >>= 1;
2762                        j += i;
2763                        writew(len2, baseAddr + C320DLoad_len);
2764                        writew(0, baseAddr + C320_key);
2765                        for (i = 0; i < 10; i++) {
2766                                if (readw(baseAddr + C320_key) == C320_KeyCode)
2767                                        break;
2768                                msleep(10);
2769                        }
2770                        if (readw(baseAddr + C320_key) != C320_KeyCode)
2771                                return (-1);
2772                }
2773                writew(0, baseAddr + C320DLoad_len);
2774                writew(usum, baseAddr + C320check_sum);
2775                writew(0, baseAddr + C320_key);
2776                for (i = 0; i < 10; i++) {
2777                        if (readw(baseAddr + C320_key) == C320_KeyCode)
2778                                break;
2779                        msleep(10);
2780                }
2781                retry++;
2782        } while ((readb(baseAddr + C320chksum_ok) != 1) && (retry < 3));
2783        if (readb(baseAddr + C320chksum_ok) != 1)
2784                return (-1);
2785        writew(0, baseAddr + C320_key);
2786        for (i = 0; i < 600; i++) {
2787                if (readw(baseAddr + Magic_no) == Magic_code)
2788                        break;
2789                msleep(10);
2790        }
2791        if (readw(baseAddr + Magic_no) != Magic_code)
2792                return (-100);
2793
2794        if (moxa_boards[cardno].busType == MOXA_BUS_TYPE_PCI) {         /* ASIC board */
2795                writew(0x3800, baseAddr + TMS320_PORT1);
2796                writew(0x3900, baseAddr + TMS320_PORT2);
2797                writew(28499, baseAddr + TMS320_CLOCK);
2798        } else {
2799                writew(0x3200, baseAddr + TMS320_PORT1);
2800                writew(0x3400, baseAddr + TMS320_PORT2);
2801                writew(19999, baseAddr + TMS320_CLOCK);
2802        }
2803        writew(1, baseAddr + Disable_IRQ);
2804        writew(0, baseAddr + Magic_no);
2805        for (i = 0; i < 500; i++) {
2806                if (readw(baseAddr + Magic_no) == Magic_code)
2807                        break;
2808                msleep(10);
2809        }
2810        if (readw(baseAddr + Magic_no) != Magic_code)
2811                return (-102);
2812
2813        j = readw(baseAddr + Module_cnt);
2814        if (j <= 0)
2815                return (-101);
2816        *numPorts = j * 8;
2817        writew(j, baseAddr + Module_no);
2818        writew(0, baseAddr + Magic_no);
2819        for (i = 0; i < 600; i++) {
2820                if (readw(baseAddr + Magic_no) == Magic_code)
2821                        break;
2822                msleep(10);
2823        }
2824        if (readw(baseAddr + Magic_no) != Magic_code)
2825                return (-102);
2826        moxaCard = 1;
2827        moxa_boards[cardno].intNdx = baseAddr + IRQindex;
2828        moxa_boards[cardno].intPend = baseAddr + IRQpending;
2829        moxa_boards[cardno].intTable = baseAddr + IRQtable;
2830        return (0);
2831}
2832
2833static void MoxaSetFifo(int port, int enable)
2834{
2835        void __iomem *ofsAddr = moxa_ports[port].tableAddr;
2836
2837        if (!enable) {
2838                moxafunc(ofsAddr, FC_SetRxFIFOTrig, 0);
2839                moxafunc(ofsAddr, FC_SetTxFIFOCnt, 1);
2840        } else {
2841                moxafunc(ofsAddr, FC_SetRxFIFOTrig, 3);
2842                moxafunc(ofsAddr, FC_SetTxFIFOCnt, 16);
2843        }
2844}
2845