Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v2.6.30-rc7 2210 lines 56 kB view raw
1/*****************************************************************************/ 2/* 3 * moxa.c -- MOXA Intellio family multiport serial driver. 4 * 5 * Copyright (C) 1999-2000 Moxa Technologies (support@moxa.com). 6 * Copyright (c) 2007 Jiri Slaby <jirislaby@gmail.com> 7 * 8 * This code is loosely based on the Linux serial driver, written by 9 * Linus Torvalds, Theodore T'so and others. 10 * 11 * This program is free software; you can redistribute it and/or modify 12 * it under the terms of the GNU General Public License as published by 13 * the Free Software Foundation; either version 2 of the License, or 14 * (at your option) any later version. 15 */ 16 17/* 18 * MOXA Intellio Series Driver 19 * for : LINUX 20 * date : 1999/1/7 21 * version : 5.1 22 */ 23 24#include <linux/module.h> 25#include <linux/types.h> 26#include <linux/mm.h> 27#include <linux/ioport.h> 28#include <linux/errno.h> 29#include <linux/firmware.h> 30#include <linux/signal.h> 31#include <linux/sched.h> 32#include <linux/timer.h> 33#include <linux/interrupt.h> 34#include <linux/tty.h> 35#include <linux/tty_flip.h> 36#include <linux/major.h> 37#include <linux/string.h> 38#include <linux/fcntl.h> 39#include <linux/ptrace.h> 40#include <linux/serial.h> 41#include <linux/tty_driver.h> 42#include <linux/delay.h> 43#include <linux/pci.h> 44#include <linux/init.h> 45#include <linux/bitops.h> 46 47#include <asm/system.h> 48#include <asm/io.h> 49#include <asm/uaccess.h> 50 51#include "moxa.h" 52 53#define MOXA_VERSION "6.0k" 54 55#define MOXA_FW_HDRLEN 32 56 57#define MOXAMAJOR 172 58 59#define MAX_BOARDS 4 /* Don't change this value */ 60#define MAX_PORTS_PER_BOARD 32 /* Don't change this value */ 61#define MAX_PORTS (MAX_BOARDS * MAX_PORTS_PER_BOARD) 62 63#define MOXA_IS_320(brd) ((brd)->boardType == MOXA_BOARD_C320_ISA || \ 64 (brd)->boardType == MOXA_BOARD_C320_PCI) 65 66/* 67 * Define the Moxa PCI vendor and device IDs. 68 */ 69#define MOXA_BUS_TYPE_ISA 0 70#define MOXA_BUS_TYPE_PCI 1 71 72enum { 73 MOXA_BOARD_C218_PCI = 1, 74 MOXA_BOARD_C218_ISA, 75 MOXA_BOARD_C320_PCI, 76 MOXA_BOARD_C320_ISA, 77 MOXA_BOARD_CP204J, 78}; 79 80static char *moxa_brdname[] = 81{ 82 "C218 Turbo PCI series", 83 "C218 Turbo ISA series", 84 "C320 Turbo PCI series", 85 "C320 Turbo ISA series", 86 "CP-204J series", 87}; 88 89#ifdef CONFIG_PCI 90static struct pci_device_id moxa_pcibrds[] = { 91 { PCI_DEVICE(PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_MOXA_C218), 92 .driver_data = MOXA_BOARD_C218_PCI }, 93 { PCI_DEVICE(PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_MOXA_C320), 94 .driver_data = MOXA_BOARD_C320_PCI }, 95 { PCI_DEVICE(PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_MOXA_CP204J), 96 .driver_data = MOXA_BOARD_CP204J }, 97 { 0 } 98}; 99MODULE_DEVICE_TABLE(pci, moxa_pcibrds); 100#endif /* CONFIG_PCI */ 101 102struct moxa_port; 103 104static struct moxa_board_conf { 105 int boardType; 106 int numPorts; 107 int busType; 108 109 unsigned int ready; 110 111 struct moxa_port *ports; 112 113 void __iomem *basemem; 114 void __iomem *intNdx; 115 void __iomem *intPend; 116 void __iomem *intTable; 117} moxa_boards[MAX_BOARDS]; 118 119struct mxser_mstatus { 120 tcflag_t cflag; 121 int cts; 122 int dsr; 123 int ri; 124 int dcd; 125}; 126 127struct moxaq_str { 128 int inq; 129 int outq; 130}; 131 132struct moxa_port { 133 struct tty_port port; 134 struct moxa_board_conf *board; 135 void __iomem *tableAddr; 136 137 int type; 138 int cflag; 139 unsigned long statusflags; 140 141 u8 DCDState; 142 u8 lineCtrl; 143 u8 lowChkFlag; 144}; 145 146struct mon_str { 147 int tick; 148 int rxcnt[MAX_PORTS]; 149 int txcnt[MAX_PORTS]; 150}; 151 152/* statusflags */ 153#define TXSTOPPED 0x1 154#define LOWWAIT 0x2 155#define EMPTYWAIT 0x4 156#define THROTTLE 0x8 157 158#define SERIAL_DO_RESTART 159 160#define WAKEUP_CHARS 256 161 162static int ttymajor = MOXAMAJOR; 163static struct mon_str moxaLog; 164static unsigned int moxaFuncTout = HZ / 2; 165static unsigned int moxaLowWaterChk; 166static DEFINE_MUTEX(moxa_openlock); 167/* Variables for insmod */ 168#ifdef MODULE 169static unsigned long baseaddr[MAX_BOARDS]; 170static unsigned int type[MAX_BOARDS]; 171static unsigned int numports[MAX_BOARDS]; 172#endif 173 174MODULE_AUTHOR("William Chen"); 175MODULE_DESCRIPTION("MOXA Intellio Family Multiport Board Device Driver"); 176MODULE_LICENSE("GPL"); 177#ifdef MODULE 178module_param_array(type, uint, NULL, 0); 179MODULE_PARM_DESC(type, "card type: C218=2, C320=4"); 180module_param_array(baseaddr, ulong, NULL, 0); 181MODULE_PARM_DESC(baseaddr, "base address"); 182module_param_array(numports, uint, NULL, 0); 183MODULE_PARM_DESC(numports, "numports (ignored for C218)"); 184#endif 185module_param(ttymajor, int, 0); 186 187/* 188 * static functions: 189 */ 190static int moxa_open(struct tty_struct *, struct file *); 191static void moxa_close(struct tty_struct *, struct file *); 192static int moxa_write(struct tty_struct *, const unsigned char *, int); 193static int moxa_write_room(struct tty_struct *); 194static void moxa_flush_buffer(struct tty_struct *); 195static int moxa_chars_in_buffer(struct tty_struct *); 196static void moxa_throttle(struct tty_struct *); 197static void moxa_unthrottle(struct tty_struct *); 198static void moxa_set_termios(struct tty_struct *, struct ktermios *); 199static void moxa_stop(struct tty_struct *); 200static void moxa_start(struct tty_struct *); 201static void moxa_hangup(struct tty_struct *); 202static int moxa_tiocmget(struct tty_struct *tty, struct file *file); 203static int moxa_tiocmset(struct tty_struct *tty, struct file *file, 204 unsigned int set, unsigned int clear); 205static void moxa_poll(unsigned long); 206static void moxa_set_tty_param(struct tty_struct *, struct ktermios *); 207static void moxa_setup_empty_event(struct tty_struct *); 208static void moxa_shut_down(struct tty_struct *); 209static int moxa_carrier_raised(struct tty_port *); 210/* 211 * moxa board interface functions: 212 */ 213static void MoxaPortEnable(struct moxa_port *); 214static void MoxaPortDisable(struct moxa_port *); 215static int MoxaPortSetTermio(struct moxa_port *, struct ktermios *, speed_t); 216static int MoxaPortGetLineOut(struct moxa_port *, int *, int *); 217static void MoxaPortLineCtrl(struct moxa_port *, int, int); 218static void MoxaPortFlowCtrl(struct moxa_port *, int, int, int, int, int); 219static int MoxaPortLineStatus(struct moxa_port *); 220static void MoxaPortFlushData(struct moxa_port *, int); 221static int MoxaPortWriteData(struct tty_struct *, const unsigned char *, int); 222static int MoxaPortReadData(struct moxa_port *); 223static int MoxaPortTxQueue(struct moxa_port *); 224static int MoxaPortRxQueue(struct moxa_port *); 225static int MoxaPortTxFree(struct moxa_port *); 226static void MoxaPortTxDisable(struct moxa_port *); 227static void MoxaPortTxEnable(struct moxa_port *); 228static int moxa_get_serial_info(struct moxa_port *, struct serial_struct __user *); 229static int moxa_set_serial_info(struct moxa_port *, struct serial_struct __user *); 230static void MoxaSetFifo(struct moxa_port *port, int enable); 231 232/* 233 * I/O functions 234 */ 235 236static void moxa_wait_finish(void __iomem *ofsAddr) 237{ 238 unsigned long end = jiffies + moxaFuncTout; 239 240 while (readw(ofsAddr + FuncCode) != 0) 241 if (time_after(jiffies, end)) 242 return; 243 if (readw(ofsAddr + FuncCode) != 0 && printk_ratelimit()) 244 printk(KERN_WARNING "moxa function expired\n"); 245} 246 247static void moxafunc(void __iomem *ofsAddr, u16 cmd, u16 arg) 248{ 249 writew(arg, ofsAddr + FuncArg); 250 writew(cmd, ofsAddr + FuncCode); 251 moxa_wait_finish(ofsAddr); 252} 253 254static void moxa_low_water_check(void __iomem *ofsAddr) 255{ 256 u16 rptr, wptr, mask, len; 257 258 if (readb(ofsAddr + FlagStat) & Xoff_state) { 259 rptr = readw(ofsAddr + RXrptr); 260 wptr = readw(ofsAddr + RXwptr); 261 mask = readw(ofsAddr + RX_mask); 262 len = (wptr - rptr) & mask; 263 if (len <= Low_water) 264 moxafunc(ofsAddr, FC_SendXon, 0); 265 } 266} 267 268/* 269 * TTY operations 270 */ 271 272static int moxa_ioctl(struct tty_struct *tty, struct file *file, 273 unsigned int cmd, unsigned long arg) 274{ 275 struct moxa_port *ch = tty->driver_data; 276 void __user *argp = (void __user *)arg; 277 int status, ret = 0; 278 279 if (tty->index == MAX_PORTS) { 280 if (cmd != MOXA_GETDATACOUNT && cmd != MOXA_GET_IOQUEUE && 281 cmd != MOXA_GETMSTATUS) 282 return -EINVAL; 283 } else if (!ch) 284 return -ENODEV; 285 286 switch (cmd) { 287 case MOXA_GETDATACOUNT: 288 moxaLog.tick = jiffies; 289 if (copy_to_user(argp, &moxaLog, sizeof(moxaLog))) 290 ret = -EFAULT; 291 break; 292 case MOXA_FLUSH_QUEUE: 293 MoxaPortFlushData(ch, arg); 294 break; 295 case MOXA_GET_IOQUEUE: { 296 struct moxaq_str __user *argm = argp; 297 struct moxaq_str tmp; 298 struct moxa_port *p; 299 unsigned int i, j; 300 301 mutex_lock(&moxa_openlock); 302 for (i = 0; i < MAX_BOARDS; i++) { 303 p = moxa_boards[i].ports; 304 for (j = 0; j < MAX_PORTS_PER_BOARD; j++, p++, argm++) { 305 memset(&tmp, 0, sizeof(tmp)); 306 if (moxa_boards[i].ready) { 307 tmp.inq = MoxaPortRxQueue(p); 308 tmp.outq = MoxaPortTxQueue(p); 309 } 310 if (copy_to_user(argm, &tmp, sizeof(tmp))) { 311 mutex_unlock(&moxa_openlock); 312 return -EFAULT; 313 } 314 } 315 } 316 mutex_unlock(&moxa_openlock); 317 break; 318 } case MOXA_GET_OQUEUE: 319 status = MoxaPortTxQueue(ch); 320 ret = put_user(status, (unsigned long __user *)argp); 321 break; 322 case MOXA_GET_IQUEUE: 323 status = MoxaPortRxQueue(ch); 324 ret = put_user(status, (unsigned long __user *)argp); 325 break; 326 case MOXA_GETMSTATUS: { 327 struct mxser_mstatus __user *argm = argp; 328 struct mxser_mstatus tmp; 329 struct moxa_port *p; 330 unsigned int i, j; 331 332 mutex_lock(&moxa_openlock); 333 for (i = 0; i < MAX_BOARDS; i++) { 334 p = moxa_boards[i].ports; 335 for (j = 0; j < MAX_PORTS_PER_BOARD; j++, p++, argm++) { 336 struct tty_struct *ttyp; 337 memset(&tmp, 0, sizeof(tmp)); 338 if (!moxa_boards[i].ready) 339 goto copy; 340 341 status = MoxaPortLineStatus(p); 342 if (status & 1) 343 tmp.cts = 1; 344 if (status & 2) 345 tmp.dsr = 1; 346 if (status & 4) 347 tmp.dcd = 1; 348 349 ttyp = tty_port_tty_get(&p->port); 350 if (!ttyp || !ttyp->termios) 351 tmp.cflag = p->cflag; 352 else 353 tmp.cflag = ttyp->termios->c_cflag; 354 tty_kref_put(tty); 355copy: 356 if (copy_to_user(argm, &tmp, sizeof(tmp))) { 357 mutex_unlock(&moxa_openlock); 358 return -EFAULT; 359 } 360 } 361 } 362 mutex_unlock(&moxa_openlock); 363 break; 364 } 365 case TIOCGSERIAL: 366 mutex_lock(&moxa_openlock); 367 ret = moxa_get_serial_info(ch, argp); 368 mutex_unlock(&moxa_openlock); 369 break; 370 case TIOCSSERIAL: 371 mutex_lock(&moxa_openlock); 372 ret = moxa_set_serial_info(ch, argp); 373 mutex_unlock(&moxa_openlock); 374 break; 375 default: 376 ret = -ENOIOCTLCMD; 377 } 378 return ret; 379} 380 381static int moxa_break_ctl(struct tty_struct *tty, int state) 382{ 383 struct moxa_port *port = tty->driver_data; 384 385 moxafunc(port->tableAddr, state ? FC_SendBreak : FC_StopBreak, 386 Magic_code); 387 return 0; 388} 389 390static const struct tty_operations moxa_ops = { 391 .open = moxa_open, 392 .close = moxa_close, 393 .write = moxa_write, 394 .write_room = moxa_write_room, 395 .flush_buffer = moxa_flush_buffer, 396 .chars_in_buffer = moxa_chars_in_buffer, 397 .ioctl = moxa_ioctl, 398 .throttle = moxa_throttle, 399 .unthrottle = moxa_unthrottle, 400 .set_termios = moxa_set_termios, 401 .stop = moxa_stop, 402 .start = moxa_start, 403 .hangup = moxa_hangup, 404 .break_ctl = moxa_break_ctl, 405 .tiocmget = moxa_tiocmget, 406 .tiocmset = moxa_tiocmset, 407}; 408 409static const struct tty_port_operations moxa_port_ops = { 410 .carrier_raised = moxa_carrier_raised, 411}; 412 413static struct tty_driver *moxaDriver; 414static DEFINE_TIMER(moxaTimer, moxa_poll, 0, 0); 415static DEFINE_SPINLOCK(moxa_lock); 416 417/* 418 * HW init 419 */ 420 421static int moxa_check_fw_model(struct moxa_board_conf *brd, u8 model) 422{ 423 switch (brd->boardType) { 424 case MOXA_BOARD_C218_ISA: 425 case MOXA_BOARD_C218_PCI: 426 if (model != 1) 427 goto err; 428 break; 429 case MOXA_BOARD_CP204J: 430 if (model != 3) 431 goto err; 432 break; 433 default: 434 if (model != 2) 435 goto err; 436 break; 437 } 438 return 0; 439err: 440 return -EINVAL; 441} 442 443static int moxa_check_fw(const void *ptr) 444{ 445 const __le16 *lptr = ptr; 446 447 if (*lptr != cpu_to_le16(0x7980)) 448 return -EINVAL; 449 450 return 0; 451} 452 453static int moxa_load_bios(struct moxa_board_conf *brd, const u8 *buf, 454 size_t len) 455{ 456 void __iomem *baseAddr = brd->basemem; 457 u16 tmp; 458 459 writeb(HW_reset, baseAddr + Control_reg); /* reset */ 460 msleep(10); 461 memset_io(baseAddr, 0, 4096); 462 memcpy_toio(baseAddr, buf, len); /* download BIOS */ 463 writeb(0, baseAddr + Control_reg); /* restart */ 464 465 msleep(2000); 466 467 switch (brd->boardType) { 468 case MOXA_BOARD_C218_ISA: 469 case MOXA_BOARD_C218_PCI: 470 tmp = readw(baseAddr + C218_key); 471 if (tmp != C218_KeyCode) 472 goto err; 473 break; 474 case MOXA_BOARD_CP204J: 475 tmp = readw(baseAddr + C218_key); 476 if (tmp != CP204J_KeyCode) 477 goto err; 478 break; 479 default: 480 tmp = readw(baseAddr + C320_key); 481 if (tmp != C320_KeyCode) 482 goto err; 483 tmp = readw(baseAddr + C320_status); 484 if (tmp != STS_init) { 485 printk(KERN_ERR "MOXA: bios upload failed -- CPU/Basic " 486 "module not found\n"); 487 return -EIO; 488 } 489 break; 490 } 491 492 return 0; 493err: 494 printk(KERN_ERR "MOXA: bios upload failed -- board not found\n"); 495 return -EIO; 496} 497 498static int moxa_load_320b(struct moxa_board_conf *brd, const u8 *ptr, 499 size_t len) 500{ 501 void __iomem *baseAddr = brd->basemem; 502 503 if (len < 7168) { 504 printk(KERN_ERR "MOXA: invalid 320 bios -- too short\n"); 505 return -EINVAL; 506 } 507 508 writew(len - 7168 - 2, baseAddr + C320bapi_len); 509 writeb(1, baseAddr + Control_reg); /* Select Page 1 */ 510 memcpy_toio(baseAddr + DynPage_addr, ptr, 7168); 511 writeb(2, baseAddr + Control_reg); /* Select Page 2 */ 512 memcpy_toio(baseAddr + DynPage_addr, ptr + 7168, len - 7168); 513 514 return 0; 515} 516 517static int moxa_real_load_code(struct moxa_board_conf *brd, const void *ptr, 518 size_t len) 519{ 520 void __iomem *baseAddr = brd->basemem; 521 const __le16 *uptr = ptr; 522 size_t wlen, len2, j; 523 unsigned long key, loadbuf, loadlen, checksum, checksum_ok; 524 unsigned int i, retry; 525 u16 usum, keycode; 526 527 keycode = (brd->boardType == MOXA_BOARD_CP204J) ? CP204J_KeyCode : 528 C218_KeyCode; 529 530 switch (brd->boardType) { 531 case MOXA_BOARD_CP204J: 532 case MOXA_BOARD_C218_ISA: 533 case MOXA_BOARD_C218_PCI: 534 key = C218_key; 535 loadbuf = C218_LoadBuf; 536 loadlen = C218DLoad_len; 537 checksum = C218check_sum; 538 checksum_ok = C218chksum_ok; 539 break; 540 default: 541 key = C320_key; 542 keycode = C320_KeyCode; 543 loadbuf = C320_LoadBuf; 544 loadlen = C320DLoad_len; 545 checksum = C320check_sum; 546 checksum_ok = C320chksum_ok; 547 break; 548 } 549 550 usum = 0; 551 wlen = len >> 1; 552 for (i = 0; i < wlen; i++) 553 usum += le16_to_cpu(uptr[i]); 554 retry = 0; 555 do { 556 wlen = len >> 1; 557 j = 0; 558 while (wlen) { 559 len2 = (wlen > 2048) ? 2048 : wlen; 560 wlen -= len2; 561 memcpy_toio(baseAddr + loadbuf, ptr + j, len2 << 1); 562 j += len2 << 1; 563 564 writew(len2, baseAddr + loadlen); 565 writew(0, baseAddr + key); 566 for (i = 0; i < 100; i++) { 567 if (readw(baseAddr + key) == keycode) 568 break; 569 msleep(10); 570 } 571 if (readw(baseAddr + key) != keycode) 572 return -EIO; 573 } 574 writew(0, baseAddr + loadlen); 575 writew(usum, baseAddr + checksum); 576 writew(0, baseAddr + key); 577 for (i = 0; i < 100; i++) { 578 if (readw(baseAddr + key) == keycode) 579 break; 580 msleep(10); 581 } 582 retry++; 583 } while ((readb(baseAddr + checksum_ok) != 1) && (retry < 3)); 584 if (readb(baseAddr + checksum_ok) != 1) 585 return -EIO; 586 587 writew(0, baseAddr + key); 588 for (i = 0; i < 600; i++) { 589 if (readw(baseAddr + Magic_no) == Magic_code) 590 break; 591 msleep(10); 592 } 593 if (readw(baseAddr + Magic_no) != Magic_code) 594 return -EIO; 595 596 if (MOXA_IS_320(brd)) { 597 if (brd->busType == MOXA_BUS_TYPE_PCI) { /* ASIC board */ 598 writew(0x3800, baseAddr + TMS320_PORT1); 599 writew(0x3900, baseAddr + TMS320_PORT2); 600 writew(28499, baseAddr + TMS320_CLOCK); 601 } else { 602 writew(0x3200, baseAddr + TMS320_PORT1); 603 writew(0x3400, baseAddr + TMS320_PORT2); 604 writew(19999, baseAddr + TMS320_CLOCK); 605 } 606 } 607 writew(1, baseAddr + Disable_IRQ); 608 writew(0, baseAddr + Magic_no); 609 for (i = 0; i < 500; i++) { 610 if (readw(baseAddr + Magic_no) == Magic_code) 611 break; 612 msleep(10); 613 } 614 if (readw(baseAddr + Magic_no) != Magic_code) 615 return -EIO; 616 617 if (MOXA_IS_320(brd)) { 618 j = readw(baseAddr + Module_cnt); 619 if (j <= 0) 620 return -EIO; 621 brd->numPorts = j * 8; 622 writew(j, baseAddr + Module_no); 623 writew(0, baseAddr + Magic_no); 624 for (i = 0; i < 600; i++) { 625 if (readw(baseAddr + Magic_no) == Magic_code) 626 break; 627 msleep(10); 628 } 629 if (readw(baseAddr + Magic_no) != Magic_code) 630 return -EIO; 631 } 632 brd->intNdx = baseAddr + IRQindex; 633 brd->intPend = baseAddr + IRQpending; 634 brd->intTable = baseAddr + IRQtable; 635 636 return 0; 637} 638 639static int moxa_load_code(struct moxa_board_conf *brd, const void *ptr, 640 size_t len) 641{ 642 void __iomem *ofsAddr, *baseAddr = brd->basemem; 643 struct moxa_port *port; 644 int retval, i; 645 646 if (len % 2) { 647 printk(KERN_ERR "MOXA: bios length is not even\n"); 648 return -EINVAL; 649 } 650 651 retval = moxa_real_load_code(brd, ptr, len); /* may change numPorts */ 652 if (retval) 653 return retval; 654 655 switch (brd->boardType) { 656 case MOXA_BOARD_C218_ISA: 657 case MOXA_BOARD_C218_PCI: 658 case MOXA_BOARD_CP204J: 659 port = brd->ports; 660 for (i = 0; i < brd->numPorts; i++, port++) { 661 port->board = brd; 662 port->DCDState = 0; 663 port->tableAddr = baseAddr + Extern_table + 664 Extern_size * i; 665 ofsAddr = port->tableAddr; 666 writew(C218rx_mask, ofsAddr + RX_mask); 667 writew(C218tx_mask, ofsAddr + TX_mask); 668 writew(C218rx_spage + i * C218buf_pageno, ofsAddr + Page_rxb); 669 writew(readw(ofsAddr + Page_rxb) + C218rx_pageno, ofsAddr + EndPage_rxb); 670 671 writew(C218tx_spage + i * C218buf_pageno, ofsAddr + Page_txb); 672 writew(readw(ofsAddr + Page_txb) + C218tx_pageno, ofsAddr + EndPage_txb); 673 674 } 675 break; 676 default: 677 port = brd->ports; 678 for (i = 0; i < brd->numPorts; i++, port++) { 679 port->board = brd; 680 port->DCDState = 0; 681 port->tableAddr = baseAddr + Extern_table + 682 Extern_size * i; 683 ofsAddr = port->tableAddr; 684 switch (brd->numPorts) { 685 case 8: 686 writew(C320p8rx_mask, ofsAddr + RX_mask); 687 writew(C320p8tx_mask, ofsAddr + TX_mask); 688 writew(C320p8rx_spage + i * C320p8buf_pgno, ofsAddr + Page_rxb); 689 writew(readw(ofsAddr + Page_rxb) + C320p8rx_pgno, ofsAddr + EndPage_rxb); 690 writew(C320p8tx_spage + i * C320p8buf_pgno, ofsAddr + Page_txb); 691 writew(readw(ofsAddr + Page_txb) + C320p8tx_pgno, ofsAddr + EndPage_txb); 692 693 break; 694 case 16: 695 writew(C320p16rx_mask, ofsAddr + RX_mask); 696 writew(C320p16tx_mask, ofsAddr + TX_mask); 697 writew(C320p16rx_spage + i * C320p16buf_pgno, ofsAddr + Page_rxb); 698 writew(readw(ofsAddr + Page_rxb) + C320p16rx_pgno, ofsAddr + EndPage_rxb); 699 writew(C320p16tx_spage + i * C320p16buf_pgno, ofsAddr + Page_txb); 700 writew(readw(ofsAddr + Page_txb) + C320p16tx_pgno, ofsAddr + EndPage_txb); 701 break; 702 703 case 24: 704 writew(C320p24rx_mask, ofsAddr + RX_mask); 705 writew(C320p24tx_mask, ofsAddr + TX_mask); 706 writew(C320p24rx_spage + i * C320p24buf_pgno, ofsAddr + Page_rxb); 707 writew(readw(ofsAddr + Page_rxb) + C320p24rx_pgno, ofsAddr + EndPage_rxb); 708 writew(C320p24tx_spage + i * C320p24buf_pgno, ofsAddr + Page_txb); 709 writew(readw(ofsAddr + Page_txb), ofsAddr + EndPage_txb); 710 break; 711 case 32: 712 writew(C320p32rx_mask, ofsAddr + RX_mask); 713 writew(C320p32tx_mask, ofsAddr + TX_mask); 714 writew(C320p32tx_ofs, ofsAddr + Ofs_txb); 715 writew(C320p32rx_spage + i * C320p32buf_pgno, ofsAddr + Page_rxb); 716 writew(readb(ofsAddr + Page_rxb), ofsAddr + EndPage_rxb); 717 writew(C320p32tx_spage + i * C320p32buf_pgno, ofsAddr + Page_txb); 718 writew(readw(ofsAddr + Page_txb), ofsAddr + EndPage_txb); 719 break; 720 } 721 } 722 break; 723 } 724 return 0; 725} 726 727static int moxa_load_fw(struct moxa_board_conf *brd, const struct firmware *fw) 728{ 729 const void *ptr = fw->data; 730 char rsn[64]; 731 u16 lens[5]; 732 size_t len; 733 unsigned int a, lenp, lencnt; 734 int ret = -EINVAL; 735 struct { 736 __le32 magic; /* 0x34303430 */ 737 u8 reserved1[2]; 738 u8 type; /* UNIX = 3 */ 739 u8 model; /* C218T=1, C320T=2, CP204=3 */ 740 u8 reserved2[8]; 741 __le16 len[5]; 742 } const *hdr = ptr; 743 744 BUILD_BUG_ON(ARRAY_SIZE(hdr->len) != ARRAY_SIZE(lens)); 745 746 if (fw->size < MOXA_FW_HDRLEN) { 747 strcpy(rsn, "too short (even header won't fit)"); 748 goto err; 749 } 750 if (hdr->magic != cpu_to_le32(0x30343034)) { 751 sprintf(rsn, "bad magic: %.8x", le32_to_cpu(hdr->magic)); 752 goto err; 753 } 754 if (hdr->type != 3) { 755 sprintf(rsn, "not for linux, type is %u", hdr->type); 756 goto err; 757 } 758 if (moxa_check_fw_model(brd, hdr->model)) { 759 sprintf(rsn, "not for this card, model is %u", hdr->model); 760 goto err; 761 } 762 763 len = MOXA_FW_HDRLEN; 764 lencnt = hdr->model == 2 ? 5 : 3; 765 for (a = 0; a < ARRAY_SIZE(lens); a++) { 766 lens[a] = le16_to_cpu(hdr->len[a]); 767 if (lens[a] && len + lens[a] <= fw->size && 768 moxa_check_fw(&fw->data[len])) 769 printk(KERN_WARNING "MOXA firmware: unexpected input " 770 "at offset %u, but going on\n", (u32)len); 771 if (!lens[a] && a < lencnt) { 772 sprintf(rsn, "too few entries in fw file"); 773 goto err; 774 } 775 len += lens[a]; 776 } 777 778 if (len != fw->size) { 779 sprintf(rsn, "bad length: %u (should be %u)", (u32)fw->size, 780 (u32)len); 781 goto err; 782 } 783 784 ptr += MOXA_FW_HDRLEN; 785 lenp = 0; /* bios */ 786 787 strcpy(rsn, "read above"); 788 789 ret = moxa_load_bios(brd, ptr, lens[lenp]); 790 if (ret) 791 goto err; 792 793 /* we skip the tty section (lens[1]), since we don't need it */ 794 ptr += lens[lenp] + lens[lenp + 1]; 795 lenp += 2; /* comm */ 796 797 if (hdr->model == 2) { 798 ret = moxa_load_320b(brd, ptr, lens[lenp]); 799 if (ret) 800 goto err; 801 /* skip another tty */ 802 ptr += lens[lenp] + lens[lenp + 1]; 803 lenp += 2; 804 } 805 806 ret = moxa_load_code(brd, ptr, lens[lenp]); 807 if (ret) 808 goto err; 809 810 return 0; 811err: 812 printk(KERN_ERR "firmware failed to load, reason: %s\n", rsn); 813 return ret; 814} 815 816static int moxa_init_board(struct moxa_board_conf *brd, struct device *dev) 817{ 818 const struct firmware *fw; 819 const char *file; 820 struct moxa_port *p; 821 unsigned int i; 822 int ret; 823 824 brd->ports = kcalloc(MAX_PORTS_PER_BOARD, sizeof(*brd->ports), 825 GFP_KERNEL); 826 if (brd->ports == NULL) { 827 printk(KERN_ERR "cannot allocate memory for ports\n"); 828 ret = -ENOMEM; 829 goto err; 830 } 831 832 for (i = 0, p = brd->ports; i < MAX_PORTS_PER_BOARD; i++, p++) { 833 tty_port_init(&p->port); 834 p->port.ops = &moxa_port_ops; 835 p->type = PORT_16550A; 836 p->cflag = B9600 | CS8 | CREAD | CLOCAL | HUPCL; 837 } 838 839 switch (brd->boardType) { 840 case MOXA_BOARD_C218_ISA: 841 case MOXA_BOARD_C218_PCI: 842 file = "c218tunx.cod"; 843 break; 844 case MOXA_BOARD_CP204J: 845 file = "cp204unx.cod"; 846 break; 847 default: 848 file = "c320tunx.cod"; 849 break; 850 } 851 852 ret = request_firmware(&fw, file, dev); 853 if (ret) { 854 printk(KERN_ERR "MOXA: request_firmware failed. Make sure " 855 "you've placed '%s' file into your firmware " 856 "loader directory (e.g. /lib/firmware)\n", 857 file); 858 goto err_free; 859 } 860 861 ret = moxa_load_fw(brd, fw); 862 863 release_firmware(fw); 864 865 if (ret) 866 goto err_free; 867 868 spin_lock_bh(&moxa_lock); 869 brd->ready = 1; 870 if (!timer_pending(&moxaTimer)) 871 mod_timer(&moxaTimer, jiffies + HZ / 50); 872 spin_unlock_bh(&moxa_lock); 873 874 return 0; 875err_free: 876 kfree(brd->ports); 877err: 878 return ret; 879} 880 881static void moxa_board_deinit(struct moxa_board_conf *brd) 882{ 883 unsigned int a, opened; 884 885 mutex_lock(&moxa_openlock); 886 spin_lock_bh(&moxa_lock); 887 brd->ready = 0; 888 spin_unlock_bh(&moxa_lock); 889 890 /* pci hot-un-plug support */ 891 for (a = 0; a < brd->numPorts; a++) 892 if (brd->ports[a].port.flags & ASYNC_INITIALIZED) { 893 struct tty_struct *tty = tty_port_tty_get( 894 &brd->ports[a].port); 895 if (tty) { 896 tty_hangup(tty); 897 tty_kref_put(tty); 898 } 899 } 900 while (1) { 901 opened = 0; 902 for (a = 0; a < brd->numPorts; a++) 903 if (brd->ports[a].port.flags & ASYNC_INITIALIZED) 904 opened++; 905 mutex_unlock(&moxa_openlock); 906 if (!opened) 907 break; 908 msleep(50); 909 mutex_lock(&moxa_openlock); 910 } 911 912 iounmap(brd->basemem); 913 brd->basemem = NULL; 914 kfree(brd->ports); 915} 916 917#ifdef CONFIG_PCI 918static int __devinit moxa_pci_probe(struct pci_dev *pdev, 919 const struct pci_device_id *ent) 920{ 921 struct moxa_board_conf *board; 922 unsigned int i; 923 int board_type = ent->driver_data; 924 int retval; 925 926 retval = pci_enable_device(pdev); 927 if (retval) { 928 dev_err(&pdev->dev, "can't enable pci device\n"); 929 goto err; 930 } 931 932 for (i = 0; i < MAX_BOARDS; i++) 933 if (moxa_boards[i].basemem == NULL) 934 break; 935 936 retval = -ENODEV; 937 if (i >= MAX_BOARDS) { 938 dev_warn(&pdev->dev, "more than %u MOXA Intellio family boards " 939 "found. Board is ignored.\n", MAX_BOARDS); 940 goto err; 941 } 942 943 board = &moxa_boards[i]; 944 945 retval = pci_request_region(pdev, 2, "moxa-base"); 946 if (retval) { 947 dev_err(&pdev->dev, "can't request pci region 2\n"); 948 goto err; 949 } 950 951 board->basemem = ioremap_nocache(pci_resource_start(pdev, 2), 0x4000); 952 if (board->basemem == NULL) { 953 dev_err(&pdev->dev, "can't remap io space 2\n"); 954 goto err_reg; 955 } 956 957 board->boardType = board_type; 958 switch (board_type) { 959 case MOXA_BOARD_C218_ISA: 960 case MOXA_BOARD_C218_PCI: 961 board->numPorts = 8; 962 break; 963 964 case MOXA_BOARD_CP204J: 965 board->numPorts = 4; 966 break; 967 default: 968 board->numPorts = 0; 969 break; 970 } 971 board->busType = MOXA_BUS_TYPE_PCI; 972 973 retval = moxa_init_board(board, &pdev->dev); 974 if (retval) 975 goto err_base; 976 977 pci_set_drvdata(pdev, board); 978 979 dev_info(&pdev->dev, "board '%s' ready (%u ports, firmware loaded)\n", 980 moxa_brdname[board_type - 1], board->numPorts); 981 982 return 0; 983err_base: 984 iounmap(board->basemem); 985 board->basemem = NULL; 986err_reg: 987 pci_release_region(pdev, 2); 988err: 989 return retval; 990} 991 992static void __devexit moxa_pci_remove(struct pci_dev *pdev) 993{ 994 struct moxa_board_conf *brd = pci_get_drvdata(pdev); 995 996 moxa_board_deinit(brd); 997 998 pci_release_region(pdev, 2); 999} 1000 1001static struct pci_driver moxa_pci_driver = { 1002 .name = "moxa", 1003 .id_table = moxa_pcibrds, 1004 .probe = moxa_pci_probe, 1005 .remove = __devexit_p(moxa_pci_remove) 1006}; 1007#endif /* CONFIG_PCI */ 1008 1009static int __init moxa_init(void) 1010{ 1011 unsigned int isabrds = 0; 1012 int retval = 0; 1013 1014 printk(KERN_INFO "MOXA Intellio family driver version %s\n", 1015 MOXA_VERSION); 1016 moxaDriver = alloc_tty_driver(MAX_PORTS + 1); 1017 if (!moxaDriver) 1018 return -ENOMEM; 1019 1020 moxaDriver->owner = THIS_MODULE; 1021 moxaDriver->name = "ttyMX"; 1022 moxaDriver->major = ttymajor; 1023 moxaDriver->minor_start = 0; 1024 moxaDriver->type = TTY_DRIVER_TYPE_SERIAL; 1025 moxaDriver->subtype = SERIAL_TYPE_NORMAL; 1026 moxaDriver->init_termios = tty_std_termios; 1027 moxaDriver->init_termios.c_cflag = B9600 | CS8 | CREAD | CLOCAL | HUPCL; 1028 moxaDriver->init_termios.c_ispeed = 9600; 1029 moxaDriver->init_termios.c_ospeed = 9600; 1030 moxaDriver->flags = TTY_DRIVER_REAL_RAW; 1031 tty_set_operations(moxaDriver, &moxa_ops); 1032 1033 if (tty_register_driver(moxaDriver)) { 1034 printk(KERN_ERR "can't register MOXA Smartio tty driver!\n"); 1035 put_tty_driver(moxaDriver); 1036 return -1; 1037 } 1038 1039 /* Find the boards defined from module args. */ 1040#ifdef MODULE 1041 { 1042 struct moxa_board_conf *brd = moxa_boards; 1043 unsigned int i; 1044 for (i = 0; i < MAX_BOARDS; i++) { 1045 if (!baseaddr[i]) 1046 break; 1047 if (type[i] == MOXA_BOARD_C218_ISA || 1048 type[i] == MOXA_BOARD_C320_ISA) { 1049 pr_debug("Moxa board %2d: %s board(baseAddr=%lx)\n", 1050 isabrds + 1, moxa_brdname[type[i] - 1], 1051 baseaddr[i]); 1052 brd->boardType = type[i]; 1053 brd->numPorts = type[i] == MOXA_BOARD_C218_ISA ? 8 : 1054 numports[i]; 1055 brd->busType = MOXA_BUS_TYPE_ISA; 1056 brd->basemem = ioremap_nocache(baseaddr[i], 0x4000); 1057 if (!brd->basemem) { 1058 printk(KERN_ERR "MOXA: can't remap %lx\n", 1059 baseaddr[i]); 1060 continue; 1061 } 1062 if (moxa_init_board(brd, NULL)) { 1063 iounmap(brd->basemem); 1064 brd->basemem = NULL; 1065 continue; 1066 } 1067 1068 printk(KERN_INFO "MOXA isa board found at 0x%.8lu and " 1069 "ready (%u ports, firmware loaded)\n", 1070 baseaddr[i], brd->numPorts); 1071 1072 brd++; 1073 isabrds++; 1074 } 1075 } 1076 } 1077#endif 1078 1079#ifdef CONFIG_PCI 1080 retval = pci_register_driver(&moxa_pci_driver); 1081 if (retval) { 1082 printk(KERN_ERR "Can't register MOXA pci driver!\n"); 1083 if (isabrds) 1084 retval = 0; 1085 } 1086#endif 1087 1088 return retval; 1089} 1090 1091static void __exit moxa_exit(void) 1092{ 1093 unsigned int i; 1094 1095#ifdef CONFIG_PCI 1096 pci_unregister_driver(&moxa_pci_driver); 1097#endif 1098 1099 for (i = 0; i < MAX_BOARDS; i++) /* ISA boards */ 1100 if (moxa_boards[i].ready) 1101 moxa_board_deinit(&moxa_boards[i]); 1102 1103 del_timer_sync(&moxaTimer); 1104 1105 if (tty_unregister_driver(moxaDriver)) 1106 printk(KERN_ERR "Couldn't unregister MOXA Intellio family " 1107 "serial driver\n"); 1108 put_tty_driver(moxaDriver); 1109} 1110 1111module_init(moxa_init); 1112module_exit(moxa_exit); 1113 1114static void moxa_close_port(struct tty_struct *tty) 1115{ 1116 struct moxa_port *ch = tty->driver_data; 1117 moxa_shut_down(tty); 1118 MoxaPortFlushData(ch, 2); 1119 ch->port.flags &= ~ASYNC_NORMAL_ACTIVE; 1120 tty->driver_data = NULL; 1121 tty_port_tty_set(&ch->port, NULL); 1122} 1123 1124static int moxa_carrier_raised(struct tty_port *port) 1125{ 1126 struct moxa_port *ch = container_of(port, struct moxa_port, port); 1127 int dcd; 1128 1129 spin_lock_bh(&moxa_lock); 1130 dcd = ch->DCDState; 1131 spin_unlock_bh(&moxa_lock); 1132 return dcd; 1133} 1134 1135static int moxa_block_till_ready(struct tty_struct *tty, struct file *filp, 1136 struct moxa_port *ch) 1137{ 1138 struct tty_port *port = &ch->port; 1139 DEFINE_WAIT(wait); 1140 int retval = 0; 1141 u8 dcd; 1142 1143 while (1) { 1144 prepare_to_wait(&port->open_wait, &wait, TASK_INTERRUPTIBLE); 1145 if (tty_hung_up_p(filp)) { 1146#ifdef SERIAL_DO_RESTART 1147 retval = -ERESTARTSYS; 1148#else 1149 retval = -EAGAIN; 1150#endif 1151 break; 1152 } 1153 dcd = tty_port_carrier_raised(port); 1154 if (dcd) 1155 break; 1156 1157 if (signal_pending(current)) { 1158 retval = -ERESTARTSYS; 1159 break; 1160 } 1161 schedule(); 1162 } 1163 finish_wait(&port->open_wait, &wait); 1164 1165 return retval; 1166} 1167 1168static int moxa_open(struct tty_struct *tty, struct file *filp) 1169{ 1170 struct moxa_board_conf *brd; 1171 struct moxa_port *ch; 1172 int port; 1173 int retval; 1174 1175 port = tty->index; 1176 if (port == MAX_PORTS) { 1177 return capable(CAP_SYS_ADMIN) ? 0 : -EPERM; 1178 } 1179 if (mutex_lock_interruptible(&moxa_openlock)) 1180 return -ERESTARTSYS; 1181 brd = &moxa_boards[port / MAX_PORTS_PER_BOARD]; 1182 if (!brd->ready) { 1183 mutex_unlock(&moxa_openlock); 1184 return -ENODEV; 1185 } 1186 1187 ch = &brd->ports[port % MAX_PORTS_PER_BOARD]; 1188 ch->port.count++; 1189 tty->driver_data = ch; 1190 tty_port_tty_set(&ch->port, tty); 1191 if (!(ch->port.flags & ASYNC_INITIALIZED)) { 1192 ch->statusflags = 0; 1193 moxa_set_tty_param(tty, tty->termios); 1194 MoxaPortLineCtrl(ch, 1, 1); 1195 MoxaPortEnable(ch); 1196 MoxaSetFifo(ch, ch->type == PORT_16550A); 1197 ch->port.flags |= ASYNC_INITIALIZED; 1198 } 1199 mutex_unlock(&moxa_openlock); 1200 1201 retval = 0; 1202 if (!(filp->f_flags & O_NONBLOCK) && !C_CLOCAL(tty)) 1203 retval = moxa_block_till_ready(tty, filp, ch); 1204 mutex_lock(&moxa_openlock); 1205 if (retval) { 1206 if (ch->port.count) /* 0 means already hung up... */ 1207 if (--ch->port.count == 0) 1208 moxa_close_port(tty); 1209 } else 1210 ch->port.flags |= ASYNC_NORMAL_ACTIVE; 1211 mutex_unlock(&moxa_openlock); 1212 1213 return retval; 1214} 1215 1216static void moxa_close(struct tty_struct *tty, struct file *filp) 1217{ 1218 struct moxa_port *ch; 1219 int port; 1220 1221 port = tty->index; 1222 if (port == MAX_PORTS || tty_hung_up_p(filp)) 1223 return; 1224 1225 mutex_lock(&moxa_openlock); 1226 ch = tty->driver_data; 1227 if (ch == NULL) 1228 goto unlock; 1229 if (tty->count == 1 && ch->port.count != 1) { 1230 printk(KERN_WARNING "moxa_close: bad serial port count; " 1231 "tty->count is 1, ch->port.count is %d\n", ch->port.count); 1232 ch->port.count = 1; 1233 } 1234 if (--ch->port.count < 0) { 1235 printk(KERN_WARNING "moxa_close: bad serial port count, " 1236 "device=%s\n", tty->name); 1237 ch->port.count = 0; 1238 } 1239 if (ch->port.count) 1240 goto unlock; 1241 1242 ch->cflag = tty->termios->c_cflag; 1243 if (ch->port.flags & ASYNC_INITIALIZED) { 1244 moxa_setup_empty_event(tty); 1245 tty_wait_until_sent(tty, 30 * HZ); /* 30 seconds timeout */ 1246 } 1247 1248 moxa_close_port(tty); 1249unlock: 1250 mutex_unlock(&moxa_openlock); 1251} 1252 1253static int moxa_write(struct tty_struct *tty, 1254 const unsigned char *buf, int count) 1255{ 1256 struct moxa_port *ch = tty->driver_data; 1257 int len; 1258 1259 if (ch == NULL) 1260 return 0; 1261 1262 spin_lock_bh(&moxa_lock); 1263 len = MoxaPortWriteData(tty, buf, count); 1264 spin_unlock_bh(&moxa_lock); 1265 1266 ch->statusflags |= LOWWAIT; 1267 return len; 1268} 1269 1270static int moxa_write_room(struct tty_struct *tty) 1271{ 1272 struct moxa_port *ch; 1273 1274 if (tty->stopped) 1275 return 0; 1276 ch = tty->driver_data; 1277 if (ch == NULL) 1278 return 0; 1279 return MoxaPortTxFree(ch); 1280} 1281 1282static void moxa_flush_buffer(struct tty_struct *tty) 1283{ 1284 struct moxa_port *ch = tty->driver_data; 1285 1286 if (ch == NULL) 1287 return; 1288 MoxaPortFlushData(ch, 1); 1289 tty_wakeup(tty); 1290} 1291 1292static int moxa_chars_in_buffer(struct tty_struct *tty) 1293{ 1294 struct moxa_port *ch = tty->driver_data; 1295 int chars; 1296 1297 /* 1298 * Sigh...I have to check if driver_data is NULL here, because 1299 * if an open() fails, the TTY subsystem eventually calls 1300 * tty_wait_until_sent(), which calls the driver's chars_in_buffer() 1301 * routine. And since the open() failed, we return 0 here. TDJ 1302 */ 1303 if (ch == NULL) 1304 return 0; 1305 lock_kernel(); 1306 chars = MoxaPortTxQueue(ch); 1307 if (chars) { 1308 /* 1309 * Make it possible to wakeup anything waiting for output 1310 * in tty_ioctl.c, etc. 1311 */ 1312 if (!(ch->statusflags & EMPTYWAIT)) 1313 moxa_setup_empty_event(tty); 1314 } 1315 unlock_kernel(); 1316 return chars; 1317} 1318 1319static int moxa_tiocmget(struct tty_struct *tty, struct file *file) 1320{ 1321 struct moxa_port *ch; 1322 int flag = 0, dtr, rts; 1323 1324 mutex_lock(&moxa_openlock); 1325 ch = tty->driver_data; 1326 if (!ch) { 1327 mutex_unlock(&moxa_openlock); 1328 return -EINVAL; 1329 } 1330 1331 MoxaPortGetLineOut(ch, &dtr, &rts); 1332 if (dtr) 1333 flag |= TIOCM_DTR; 1334 if (rts) 1335 flag |= TIOCM_RTS; 1336 dtr = MoxaPortLineStatus(ch); 1337 if (dtr & 1) 1338 flag |= TIOCM_CTS; 1339 if (dtr & 2) 1340 flag |= TIOCM_DSR; 1341 if (dtr & 4) 1342 flag |= TIOCM_CD; 1343 mutex_unlock(&moxa_openlock); 1344 return flag; 1345} 1346 1347static int moxa_tiocmset(struct tty_struct *tty, struct file *file, 1348 unsigned int set, unsigned int clear) 1349{ 1350 struct moxa_port *ch; 1351 int port; 1352 int dtr, rts; 1353 1354 port = tty->index; 1355 mutex_lock(&moxa_openlock); 1356 ch = tty->driver_data; 1357 if (!ch) { 1358 mutex_unlock(&moxa_openlock); 1359 return -EINVAL; 1360 } 1361 1362 MoxaPortGetLineOut(ch, &dtr, &rts); 1363 if (set & TIOCM_RTS) 1364 rts = 1; 1365 if (set & TIOCM_DTR) 1366 dtr = 1; 1367 if (clear & TIOCM_RTS) 1368 rts = 0; 1369 if (clear & TIOCM_DTR) 1370 dtr = 0; 1371 MoxaPortLineCtrl(ch, dtr, rts); 1372 mutex_unlock(&moxa_openlock); 1373 return 0; 1374} 1375 1376static void moxa_throttle(struct tty_struct *tty) 1377{ 1378 struct moxa_port *ch = tty->driver_data; 1379 1380 ch->statusflags |= THROTTLE; 1381} 1382 1383static void moxa_unthrottle(struct tty_struct *tty) 1384{ 1385 struct moxa_port *ch = tty->driver_data; 1386 1387 ch->statusflags &= ~THROTTLE; 1388} 1389 1390static void moxa_set_termios(struct tty_struct *tty, 1391 struct ktermios *old_termios) 1392{ 1393 struct moxa_port *ch = tty->driver_data; 1394 1395 if (ch == NULL) 1396 return; 1397 moxa_set_tty_param(tty, old_termios); 1398 if (!(old_termios->c_cflag & CLOCAL) && C_CLOCAL(tty)) 1399 wake_up_interruptible(&ch->port.open_wait); 1400} 1401 1402static void moxa_stop(struct tty_struct *tty) 1403{ 1404 struct moxa_port *ch = tty->driver_data; 1405 1406 if (ch == NULL) 1407 return; 1408 MoxaPortTxDisable(ch); 1409 ch->statusflags |= TXSTOPPED; 1410} 1411 1412 1413static void moxa_start(struct tty_struct *tty) 1414{ 1415 struct moxa_port *ch = tty->driver_data; 1416 1417 if (ch == NULL) 1418 return; 1419 1420 if (!(ch->statusflags & TXSTOPPED)) 1421 return; 1422 1423 MoxaPortTxEnable(ch); 1424 ch->statusflags &= ~TXSTOPPED; 1425} 1426 1427static void moxa_hangup(struct tty_struct *tty) 1428{ 1429 struct moxa_port *ch; 1430 1431 mutex_lock(&moxa_openlock); 1432 ch = tty->driver_data; 1433 if (ch == NULL) { 1434 mutex_unlock(&moxa_openlock); 1435 return; 1436 } 1437 ch->port.count = 0; 1438 moxa_close_port(tty); 1439 mutex_unlock(&moxa_openlock); 1440 1441 wake_up_interruptible(&ch->port.open_wait); 1442} 1443 1444static void moxa_new_dcdstate(struct moxa_port *p, u8 dcd) 1445{ 1446 struct tty_struct *tty; 1447 dcd = !!dcd; 1448 1449 if (dcd != p->DCDState) { 1450 tty = tty_port_tty_get(&p->port); 1451 if (tty && C_CLOCAL(tty) && !dcd) 1452 tty_hangup(tty); 1453 tty_kref_put(tty); 1454 } 1455 p->DCDState = dcd; 1456} 1457 1458static int moxa_poll_port(struct moxa_port *p, unsigned int handle, 1459 u16 __iomem *ip) 1460{ 1461 struct tty_struct *tty = tty_port_tty_get(&p->port); 1462 void __iomem *ofsAddr; 1463 unsigned int inited = p->port.flags & ASYNC_INITIALIZED; 1464 u16 intr; 1465 1466 if (tty) { 1467 if ((p->statusflags & EMPTYWAIT) && 1468 MoxaPortTxQueue(p) == 0) { 1469 p->statusflags &= ~EMPTYWAIT; 1470 tty_wakeup(tty); 1471 } 1472 if ((p->statusflags & LOWWAIT) && !tty->stopped && 1473 MoxaPortTxQueue(p) <= WAKEUP_CHARS) { 1474 p->statusflags &= ~LOWWAIT; 1475 tty_wakeup(tty); 1476 } 1477 1478 if (inited && !(p->statusflags & THROTTLE) && 1479 MoxaPortRxQueue(p) > 0) { /* RX */ 1480 MoxaPortReadData(p); 1481 tty_schedule_flip(tty); 1482 } 1483 } else { 1484 p->statusflags &= ~EMPTYWAIT; 1485 MoxaPortFlushData(p, 0); /* flush RX */ 1486 } 1487 1488 if (!handle) /* nothing else to do */ 1489 goto put; 1490 1491 intr = readw(ip); /* port irq status */ 1492 if (intr == 0) 1493 goto put; 1494 1495 writew(0, ip); /* ACK port */ 1496 ofsAddr = p->tableAddr; 1497 if (intr & IntrTx) /* disable tx intr */ 1498 writew(readw(ofsAddr + HostStat) & ~WakeupTx, 1499 ofsAddr + HostStat); 1500 1501 if (!inited) 1502 goto put; 1503 1504 if (tty && (intr & IntrBreak) && !I_IGNBRK(tty)) { /* BREAK */ 1505 tty_insert_flip_char(tty, 0, TTY_BREAK); 1506 tty_schedule_flip(tty); 1507 } 1508 1509 if (intr & IntrLine) 1510 moxa_new_dcdstate(p, readb(ofsAddr + FlagStat) & DCD_state); 1511put: 1512 tty_kref_put(tty); 1513 1514 return 0; 1515} 1516 1517static void moxa_poll(unsigned long ignored) 1518{ 1519 struct moxa_board_conf *brd; 1520 u16 __iomem *ip; 1521 unsigned int card, port, served = 0; 1522 1523 spin_lock(&moxa_lock); 1524 for (card = 0; card < MAX_BOARDS; card++) { 1525 brd = &moxa_boards[card]; 1526 if (!brd->ready) 1527 continue; 1528 1529 served++; 1530 1531 ip = NULL; 1532 if (readb(brd->intPend) == 0xff) 1533 ip = brd->intTable + readb(brd->intNdx); 1534 1535 for (port = 0; port < brd->numPorts; port++) 1536 moxa_poll_port(&brd->ports[port], !!ip, ip + port); 1537 1538 if (ip) 1539 writeb(0, brd->intPend); /* ACK */ 1540 1541 if (moxaLowWaterChk) { 1542 struct moxa_port *p = brd->ports; 1543 for (port = 0; port < brd->numPorts; port++, p++) 1544 if (p->lowChkFlag) { 1545 p->lowChkFlag = 0; 1546 moxa_low_water_check(p->tableAddr); 1547 } 1548 } 1549 } 1550 moxaLowWaterChk = 0; 1551 1552 if (served) 1553 mod_timer(&moxaTimer, jiffies + HZ / 50); 1554 spin_unlock(&moxa_lock); 1555} 1556 1557/******************************************************************************/ 1558 1559static void moxa_set_tty_param(struct tty_struct *tty, struct ktermios *old_termios) 1560{ 1561 register struct ktermios *ts = tty->termios; 1562 struct moxa_port *ch = tty->driver_data; 1563 int rts, cts, txflow, rxflow, xany, baud; 1564 1565 rts = cts = txflow = rxflow = xany = 0; 1566 if (ts->c_cflag & CRTSCTS) 1567 rts = cts = 1; 1568 if (ts->c_iflag & IXON) 1569 txflow = 1; 1570 if (ts->c_iflag & IXOFF) 1571 rxflow = 1; 1572 if (ts->c_iflag & IXANY) 1573 xany = 1; 1574 1575 /* Clear the features we don't support */ 1576 ts->c_cflag &= ~CMSPAR; 1577 MoxaPortFlowCtrl(ch, rts, cts, txflow, rxflow, xany); 1578 baud = MoxaPortSetTermio(ch, ts, tty_get_baud_rate(tty)); 1579 if (baud == -1) 1580 baud = tty_termios_baud_rate(old_termios); 1581 /* Not put the baud rate into the termios data */ 1582 tty_encode_baud_rate(tty, baud, baud); 1583} 1584 1585static void moxa_setup_empty_event(struct tty_struct *tty) 1586{ 1587 struct moxa_port *ch = tty->driver_data; 1588 1589 spin_lock_bh(&moxa_lock); 1590 ch->statusflags |= EMPTYWAIT; 1591 spin_unlock_bh(&moxa_lock); 1592} 1593 1594static void moxa_shut_down(struct tty_struct *tty) 1595{ 1596 struct moxa_port *ch = tty->driver_data; 1597 1598 if (!(ch->port.flags & ASYNC_INITIALIZED)) 1599 return; 1600 1601 MoxaPortDisable(ch); 1602 1603 /* 1604 * If we're a modem control device and HUPCL is on, drop RTS & DTR. 1605 */ 1606 if (C_HUPCL(tty)) 1607 MoxaPortLineCtrl(ch, 0, 0); 1608 1609 spin_lock_bh(&moxa_lock); 1610 ch->port.flags &= ~ASYNC_INITIALIZED; 1611 spin_unlock_bh(&moxa_lock); 1612} 1613 1614/***************************************************************************** 1615 * Driver level functions: * 1616 *****************************************************************************/ 1617 1618static void MoxaPortFlushData(struct moxa_port *port, int mode) 1619{ 1620 void __iomem *ofsAddr; 1621 if (mode < 0 || mode > 2) 1622 return; 1623 ofsAddr = port->tableAddr; 1624 moxafunc(ofsAddr, FC_FlushQueue, mode); 1625 if (mode != 1) { 1626 port->lowChkFlag = 0; 1627 moxa_low_water_check(ofsAddr); 1628 } 1629} 1630 1631/* 1632 * Moxa Port Number Description: 1633 * 1634 * MOXA serial driver supports up to 4 MOXA-C218/C320 boards. And, 1635 * the port number using in MOXA driver functions will be 0 to 31 for 1636 * first MOXA board, 32 to 63 for second, 64 to 95 for third and 96 1637 * to 127 for fourth. For example, if you setup three MOXA boards, 1638 * first board is C218, second board is C320-16 and third board is 1639 * C320-32. The port number of first board (C218 - 8 ports) is from 1640 * 0 to 7. The port number of second board (C320 - 16 ports) is form 1641 * 32 to 47. The port number of third board (C320 - 32 ports) is from 1642 * 64 to 95. And those port numbers form 8 to 31, 48 to 63 and 96 to 1643 * 127 will be invalid. 1644 * 1645 * 1646 * Moxa Functions Description: 1647 * 1648 * Function 1: Driver initialization routine, this routine must be 1649 * called when initialized driver. 1650 * Syntax: 1651 * void MoxaDriverInit(); 1652 * 1653 * 1654 * Function 2: Moxa driver private IOCTL command processing. 1655 * Syntax: 1656 * int MoxaDriverIoctl(unsigned int cmd, unsigned long arg, int port); 1657 * 1658 * unsigned int cmd : IOCTL command 1659 * unsigned long arg : IOCTL argument 1660 * int port : port number (0 - 127) 1661 * 1662 * return: 0 (OK) 1663 * -EINVAL 1664 * -ENOIOCTLCMD 1665 * 1666 * 1667 * Function 6: Enable this port to start Tx/Rx data. 1668 * Syntax: 1669 * void MoxaPortEnable(int port); 1670 * int port : port number (0 - 127) 1671 * 1672 * 1673 * Function 7: Disable this port 1674 * Syntax: 1675 * void MoxaPortDisable(int port); 1676 * int port : port number (0 - 127) 1677 * 1678 * 1679 * Function 10: Setting baud rate of this port. 1680 * Syntax: 1681 * speed_t MoxaPortSetBaud(int port, speed_t baud); 1682 * int port : port number (0 - 127) 1683 * long baud : baud rate (50 - 115200) 1684 * 1685 * return: 0 : this port is invalid or baud < 50 1686 * 50 - 115200 : the real baud rate set to the port, if 1687 * the argument baud is large than maximun 1688 * available baud rate, the real setting 1689 * baud rate will be the maximun baud rate. 1690 * 1691 * 1692 * Function 12: Configure the port. 1693 * Syntax: 1694 * int MoxaPortSetTermio(int port, struct ktermios *termio, speed_t baud); 1695 * int port : port number (0 - 127) 1696 * struct ktermios * termio : termio structure pointer 1697 * speed_t baud : baud rate 1698 * 1699 * return: -1 : this port is invalid or termio == NULL 1700 * 0 : setting O.K. 1701 * 1702 * 1703 * Function 13: Get the DTR/RTS state of this port. 1704 * Syntax: 1705 * int MoxaPortGetLineOut(int port, int *dtrState, int *rtsState); 1706 * int port : port number (0 - 127) 1707 * int * dtrState : pointer to INT to receive the current DTR 1708 * state. (if NULL, this function will not 1709 * write to this address) 1710 * int * rtsState : pointer to INT to receive the current RTS 1711 * state. (if NULL, this function will not 1712 * write to this address) 1713 * 1714 * return: -1 : this port is invalid 1715 * 0 : O.K. 1716 * 1717 * 1718 * Function 14: Setting the DTR/RTS output state of this port. 1719 * Syntax: 1720 * void MoxaPortLineCtrl(int port, int dtrState, int rtsState); 1721 * int port : port number (0 - 127) 1722 * int dtrState : DTR output state (0: off, 1: on) 1723 * int rtsState : RTS output state (0: off, 1: on) 1724 * 1725 * 1726 * Function 15: Setting the flow control of this port. 1727 * Syntax: 1728 * void MoxaPortFlowCtrl(int port, int rtsFlow, int ctsFlow, int rxFlow, 1729 * int txFlow,int xany); 1730 * int port : port number (0 - 127) 1731 * int rtsFlow : H/W RTS flow control (0: no, 1: yes) 1732 * int ctsFlow : H/W CTS flow control (0: no, 1: yes) 1733 * int rxFlow : S/W Rx XON/XOFF flow control (0: no, 1: yes) 1734 * int txFlow : S/W Tx XON/XOFF flow control (0: no, 1: yes) 1735 * int xany : S/W XANY flow control (0: no, 1: yes) 1736 * 1737 * 1738 * Function 16: Get ths line status of this port 1739 * Syntax: 1740 * int MoxaPortLineStatus(int port); 1741 * int port : port number (0 - 127) 1742 * 1743 * return: Bit 0 - CTS state (0: off, 1: on) 1744 * Bit 1 - DSR state (0: off, 1: on) 1745 * Bit 2 - DCD state (0: off, 1: on) 1746 * 1747 * 1748 * Function 19: Flush the Rx/Tx buffer data of this port. 1749 * Syntax: 1750 * void MoxaPortFlushData(int port, int mode); 1751 * int port : port number (0 - 127) 1752 * int mode 1753 * 0 : flush the Rx buffer 1754 * 1 : flush the Tx buffer 1755 * 2 : flush the Rx and Tx buffer 1756 * 1757 * 1758 * Function 20: Write data. 1759 * Syntax: 1760 * int MoxaPortWriteData(int port, unsigned char * buffer, int length); 1761 * int port : port number (0 - 127) 1762 * unsigned char * buffer : pointer to write data buffer. 1763 * int length : write data length 1764 * 1765 * return: 0 - length : real write data length 1766 * 1767 * 1768 * Function 21: Read data. 1769 * Syntax: 1770 * int MoxaPortReadData(int port, struct tty_struct *tty); 1771 * int port : port number (0 - 127) 1772 * struct tty_struct *tty : tty for data 1773 * 1774 * return: 0 - length : real read data length 1775 * 1776 * 1777 * Function 24: Get the Tx buffer current queued data bytes 1778 * Syntax: 1779 * int MoxaPortTxQueue(int port); 1780 * int port : port number (0 - 127) 1781 * 1782 * return: .. : Tx buffer current queued data bytes 1783 * 1784 * 1785 * Function 25: Get the Tx buffer current free space 1786 * Syntax: 1787 * int MoxaPortTxFree(int port); 1788 * int port : port number (0 - 127) 1789 * 1790 * return: .. : Tx buffer current free space 1791 * 1792 * 1793 * Function 26: Get the Rx buffer current queued data bytes 1794 * Syntax: 1795 * int MoxaPortRxQueue(int port); 1796 * int port : port number (0 - 127) 1797 * 1798 * return: .. : Rx buffer current queued data bytes 1799 * 1800 * 1801 * Function 28: Disable port data transmission. 1802 * Syntax: 1803 * void MoxaPortTxDisable(int port); 1804 * int port : port number (0 - 127) 1805 * 1806 * 1807 * Function 29: Enable port data transmission. 1808 * Syntax: 1809 * void MoxaPortTxEnable(int port); 1810 * int port : port number (0 - 127) 1811 * 1812 * 1813 * Function 31: Get the received BREAK signal count and reset it. 1814 * Syntax: 1815 * int MoxaPortResetBrkCnt(int port); 1816 * int port : port number (0 - 127) 1817 * 1818 * return: 0 - .. : BREAK signal count 1819 * 1820 * 1821 */ 1822 1823static void MoxaPortEnable(struct moxa_port *port) 1824{ 1825 void __iomem *ofsAddr; 1826 u16 lowwater = 512; 1827 1828 ofsAddr = port->tableAddr; 1829 writew(lowwater, ofsAddr + Low_water); 1830 if (MOXA_IS_320(port->board)) 1831 moxafunc(ofsAddr, FC_SetBreakIrq, 0); 1832 else 1833 writew(readw(ofsAddr + HostStat) | WakeupBreak, 1834 ofsAddr + HostStat); 1835 1836 moxafunc(ofsAddr, FC_SetLineIrq, Magic_code); 1837 moxafunc(ofsAddr, FC_FlushQueue, 2); 1838 1839 moxafunc(ofsAddr, FC_EnableCH, Magic_code); 1840 MoxaPortLineStatus(port); 1841} 1842 1843static void MoxaPortDisable(struct moxa_port *port) 1844{ 1845 void __iomem *ofsAddr = port->tableAddr; 1846 1847 moxafunc(ofsAddr, FC_SetFlowCtl, 0); /* disable flow control */ 1848 moxafunc(ofsAddr, FC_ClrLineIrq, Magic_code); 1849 writew(0, ofsAddr + HostStat); 1850 moxafunc(ofsAddr, FC_DisableCH, Magic_code); 1851} 1852 1853static speed_t MoxaPortSetBaud(struct moxa_port *port, speed_t baud) 1854{ 1855 void __iomem *ofsAddr = port->tableAddr; 1856 unsigned int clock, val; 1857 speed_t max; 1858 1859 max = MOXA_IS_320(port->board) ? 460800 : 921600; 1860 if (baud < 50) 1861 return 0; 1862 if (baud > max) 1863 baud = max; 1864 clock = 921600; 1865 val = clock / baud; 1866 moxafunc(ofsAddr, FC_SetBaud, val); 1867 baud = clock / val; 1868 return baud; 1869} 1870 1871static int MoxaPortSetTermio(struct moxa_port *port, struct ktermios *termio, 1872 speed_t baud) 1873{ 1874 void __iomem *ofsAddr; 1875 tcflag_t cflag; 1876 tcflag_t mode = 0; 1877 1878 ofsAddr = port->tableAddr; 1879 cflag = termio->c_cflag; /* termio->c_cflag */ 1880 1881 mode = termio->c_cflag & CSIZE; 1882 if (mode == CS5) 1883 mode = MX_CS5; 1884 else if (mode == CS6) 1885 mode = MX_CS6; 1886 else if (mode == CS7) 1887 mode = MX_CS7; 1888 else if (mode == CS8) 1889 mode = MX_CS8; 1890 1891 if (termio->c_cflag & CSTOPB) { 1892 if (mode == MX_CS5) 1893 mode |= MX_STOP15; 1894 else 1895 mode |= MX_STOP2; 1896 } else 1897 mode |= MX_STOP1; 1898 1899 if (termio->c_cflag & PARENB) { 1900 if (termio->c_cflag & PARODD) 1901 mode |= MX_PARODD; 1902 else 1903 mode |= MX_PAREVEN; 1904 } else 1905 mode |= MX_PARNONE; 1906 1907 moxafunc(ofsAddr, FC_SetDataMode, (u16)mode); 1908 1909 if (MOXA_IS_320(port->board) && baud >= 921600) 1910 return -1; 1911 1912 baud = MoxaPortSetBaud(port, baud); 1913 1914 if (termio->c_iflag & (IXON | IXOFF | IXANY)) { 1915 writeb(termio->c_cc[VSTART], ofsAddr + FuncArg); 1916 writeb(termio->c_cc[VSTOP], ofsAddr + FuncArg1); 1917 writeb(FC_SetXonXoff, ofsAddr + FuncCode); 1918 moxa_wait_finish(ofsAddr); 1919 1920 } 1921 return baud; 1922} 1923 1924static int MoxaPortGetLineOut(struct moxa_port *port, int *dtrState, 1925 int *rtsState) 1926{ 1927 if (dtrState) 1928 *dtrState = !!(port->lineCtrl & DTR_ON); 1929 if (rtsState) 1930 *rtsState = !!(port->lineCtrl & RTS_ON); 1931 1932 return 0; 1933} 1934 1935static void MoxaPortLineCtrl(struct moxa_port *port, int dtr, int rts) 1936{ 1937 u8 mode = 0; 1938 1939 if (dtr) 1940 mode |= DTR_ON; 1941 if (rts) 1942 mode |= RTS_ON; 1943 port->lineCtrl = mode; 1944 moxafunc(port->tableAddr, FC_LineControl, mode); 1945} 1946 1947static void MoxaPortFlowCtrl(struct moxa_port *port, int rts, int cts, 1948 int txflow, int rxflow, int txany) 1949{ 1950 int mode = 0; 1951 1952 if (rts) 1953 mode |= RTS_FlowCtl; 1954 if (cts) 1955 mode |= CTS_FlowCtl; 1956 if (txflow) 1957 mode |= Tx_FlowCtl; 1958 if (rxflow) 1959 mode |= Rx_FlowCtl; 1960 if (txany) 1961 mode |= IXM_IXANY; 1962 moxafunc(port->tableAddr, FC_SetFlowCtl, mode); 1963} 1964 1965static int MoxaPortLineStatus(struct moxa_port *port) 1966{ 1967 void __iomem *ofsAddr; 1968 int val; 1969 1970 ofsAddr = port->tableAddr; 1971 if (MOXA_IS_320(port->board)) { 1972 moxafunc(ofsAddr, FC_LineStatus, 0); 1973 val = readw(ofsAddr + FuncArg); 1974 } else { 1975 val = readw(ofsAddr + FlagStat) >> 4; 1976 } 1977 val &= 0x0B; 1978 if (val & 8) 1979 val |= 4; 1980 spin_lock_bh(&moxa_lock); 1981 moxa_new_dcdstate(port, val & 8); 1982 spin_unlock_bh(&moxa_lock); 1983 val &= 7; 1984 return val; 1985} 1986 1987static int MoxaPortWriteData(struct tty_struct *tty, 1988 const unsigned char *buffer, int len) 1989{ 1990 struct moxa_port *port = tty->driver_data; 1991 void __iomem *baseAddr, *ofsAddr, *ofs; 1992 unsigned int c, total; 1993 u16 head, tail, tx_mask, spage, epage; 1994 u16 pageno, pageofs, bufhead; 1995 1996 ofsAddr = port->tableAddr; 1997 baseAddr = port->board->basemem; 1998 tx_mask = readw(ofsAddr + TX_mask); 1999 spage = readw(ofsAddr + Page_txb); 2000 epage = readw(ofsAddr + EndPage_txb); 2001 tail = readw(ofsAddr + TXwptr); 2002 head = readw(ofsAddr + TXrptr); 2003 c = (head > tail) ? (head - tail - 1) : (head - tail + tx_mask); 2004 if (c > len) 2005 c = len; 2006 moxaLog.txcnt[port->port.tty->index] += c; 2007 total = c; 2008 if (spage == epage) { 2009 bufhead = readw(ofsAddr + Ofs_txb); 2010 writew(spage, baseAddr + Control_reg); 2011 while (c > 0) { 2012 if (head > tail) 2013 len = head - tail - 1; 2014 else 2015 len = tx_mask + 1 - tail; 2016 len = (c > len) ? len : c; 2017 ofs = baseAddr + DynPage_addr + bufhead + tail; 2018 memcpy_toio(ofs, buffer, len); 2019 buffer += len; 2020 tail = (tail + len) & tx_mask; 2021 c -= len; 2022 } 2023 } else { 2024 pageno = spage + (tail >> 13); 2025 pageofs = tail & Page_mask; 2026 while (c > 0) { 2027 len = Page_size - pageofs; 2028 if (len > c) 2029 len = c; 2030 writeb(pageno, baseAddr + Control_reg); 2031 ofs = baseAddr + DynPage_addr + pageofs; 2032 memcpy_toio(ofs, buffer, len); 2033 buffer += len; 2034 if (++pageno == epage) 2035 pageno = spage; 2036 pageofs = 0; 2037 c -= len; 2038 } 2039 tail = (tail + total) & tx_mask; 2040 } 2041 writew(tail, ofsAddr + TXwptr); 2042 writeb(1, ofsAddr + CD180TXirq); /* start to send */ 2043 return total; 2044} 2045 2046static int MoxaPortReadData(struct moxa_port *port) 2047{ 2048 struct tty_struct *tty = port->port.tty; 2049 unsigned char *dst; 2050 void __iomem *baseAddr, *ofsAddr, *ofs; 2051 unsigned int count, len, total; 2052 u16 tail, rx_mask, spage, epage; 2053 u16 pageno, pageofs, bufhead, head; 2054 2055 ofsAddr = port->tableAddr; 2056 baseAddr = port->board->basemem; 2057 head = readw(ofsAddr + RXrptr); 2058 tail = readw(ofsAddr + RXwptr); 2059 rx_mask = readw(ofsAddr + RX_mask); 2060 spage = readw(ofsAddr + Page_rxb); 2061 epage = readw(ofsAddr + EndPage_rxb); 2062 count = (tail >= head) ? (tail - head) : (tail - head + rx_mask + 1); 2063 if (count == 0) 2064 return 0; 2065 2066 total = count; 2067 moxaLog.rxcnt[tty->index] += total; 2068 if (spage == epage) { 2069 bufhead = readw(ofsAddr + Ofs_rxb); 2070 writew(spage, baseAddr + Control_reg); 2071 while (count > 0) { 2072 ofs = baseAddr + DynPage_addr + bufhead + head; 2073 len = (tail >= head) ? (tail - head) : 2074 (rx_mask + 1 - head); 2075 len = tty_prepare_flip_string(tty, &dst, 2076 min(len, count)); 2077 memcpy_fromio(dst, ofs, len); 2078 head = (head + len) & rx_mask; 2079 count -= len; 2080 } 2081 } else { 2082 pageno = spage + (head >> 13); 2083 pageofs = head & Page_mask; 2084 while (count > 0) { 2085 writew(pageno, baseAddr + Control_reg); 2086 ofs = baseAddr + DynPage_addr + pageofs; 2087 len = tty_prepare_flip_string(tty, &dst, 2088 min(Page_size - pageofs, count)); 2089 memcpy_fromio(dst, ofs, len); 2090 2091 count -= len; 2092 pageofs = (pageofs + len) & Page_mask; 2093 if (pageofs == 0 && ++pageno == epage) 2094 pageno = spage; 2095 } 2096 head = (head + total) & rx_mask; 2097 } 2098 writew(head, ofsAddr + RXrptr); 2099 if (readb(ofsAddr + FlagStat) & Xoff_state) { 2100 moxaLowWaterChk = 1; 2101 port->lowChkFlag = 1; 2102 } 2103 return total; 2104} 2105 2106 2107static int MoxaPortTxQueue(struct moxa_port *port) 2108{ 2109 void __iomem *ofsAddr = port->tableAddr; 2110 u16 rptr, wptr, mask; 2111 2112 rptr = readw(ofsAddr + TXrptr); 2113 wptr = readw(ofsAddr + TXwptr); 2114 mask = readw(ofsAddr + TX_mask); 2115 return (wptr - rptr) & mask; 2116} 2117 2118static int MoxaPortTxFree(struct moxa_port *port) 2119{ 2120 void __iomem *ofsAddr = port->tableAddr; 2121 u16 rptr, wptr, mask; 2122 2123 rptr = readw(ofsAddr + TXrptr); 2124 wptr = readw(ofsAddr + TXwptr); 2125 mask = readw(ofsAddr + TX_mask); 2126 return mask - ((wptr - rptr) & mask); 2127} 2128 2129static int MoxaPortRxQueue(struct moxa_port *port) 2130{ 2131 void __iomem *ofsAddr = port->tableAddr; 2132 u16 rptr, wptr, mask; 2133 2134 rptr = readw(ofsAddr + RXrptr); 2135 wptr = readw(ofsAddr + RXwptr); 2136 mask = readw(ofsAddr + RX_mask); 2137 return (wptr - rptr) & mask; 2138} 2139 2140static void MoxaPortTxDisable(struct moxa_port *port) 2141{ 2142 moxafunc(port->tableAddr, FC_SetXoffState, Magic_code); 2143} 2144 2145static void MoxaPortTxEnable(struct moxa_port *port) 2146{ 2147 moxafunc(port->tableAddr, FC_SetXonState, Magic_code); 2148} 2149 2150static int moxa_get_serial_info(struct moxa_port *info, 2151 struct serial_struct __user *retinfo) 2152{ 2153 struct serial_struct tmp = { 2154 .type = info->type, 2155 .line = info->port.tty->index, 2156 .flags = info->port.flags, 2157 .baud_base = 921600, 2158 .close_delay = info->port.close_delay 2159 }; 2160 return copy_to_user(retinfo, &tmp, sizeof(*retinfo)) ? -EFAULT : 0; 2161} 2162 2163 2164static int moxa_set_serial_info(struct moxa_port *info, 2165 struct serial_struct __user *new_info) 2166{ 2167 struct serial_struct new_serial; 2168 2169 if (copy_from_user(&new_serial, new_info, sizeof(new_serial))) 2170 return -EFAULT; 2171 2172 if (new_serial.irq != 0 || new_serial.port != 0 || 2173 new_serial.custom_divisor != 0 || 2174 new_serial.baud_base != 921600) 2175 return -EPERM; 2176 2177 if (!capable(CAP_SYS_ADMIN)) { 2178 if (((new_serial.flags & ~ASYNC_USR_MASK) != 2179 (info->port.flags & ~ASYNC_USR_MASK))) 2180 return -EPERM; 2181 } else 2182 info->port.close_delay = new_serial.close_delay * HZ / 100; 2183 2184 new_serial.flags = (new_serial.flags & ~ASYNC_FLAGS); 2185 new_serial.flags |= (info->port.flags & ASYNC_FLAGS); 2186 2187 MoxaSetFifo(info, new_serial.type == PORT_16550A); 2188 2189 info->type = new_serial.type; 2190 return 0; 2191} 2192 2193 2194 2195/***************************************************************************** 2196 * Static local functions: * 2197 *****************************************************************************/ 2198 2199static void MoxaSetFifo(struct moxa_port *port, int enable) 2200{ 2201 void __iomem *ofsAddr = port->tableAddr; 2202 2203 if (!enable) { 2204 moxafunc(ofsAddr, FC_SetRxFIFOTrig, 0); 2205 moxafunc(ofsAddr, FC_SetTxFIFOCnt, 1); 2206 } else { 2207 moxafunc(ofsAddr, FC_SetRxFIFOTrig, 3); 2208 moxafunc(ofsAddr, FC_SetTxFIFOCnt, 16); 2209 } 2210}