moxa.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:87k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

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