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