Merge branch 'for-linus' of git://git.infradead.org/users/eparis/selinux into for...
[pandora-kernel.git] / drivers / staging / tty / stallion.c
1 /*****************************************************************************/
2
3 /*
4  *      stallion.c  -- stallion multiport serial driver.
5  *
6  *      Copyright (C) 1996-1999  Stallion Technologies
7  *      Copyright (C) 1994-1996  Greg Ungerer.
8  *
9  *      This code is loosely based on the Linux serial driver, written by
10  *      Linus Torvalds, Theodore T'so and others.
11  *
12  *      This program is free software; you can redistribute it and/or modify
13  *      it under the terms of the GNU General Public License as published by
14  *      the Free Software Foundation; either version 2 of the License, or
15  *      (at your option) any later version.
16  *
17  *      This program is distributed in the hope that it will be useful,
18  *      but WITHOUT ANY WARRANTY; without even the implied warranty of
19  *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20  *      GNU General Public License for more details.
21  *
22  *      You should have received a copy of the GNU General Public License
23  *      along with this program; if not, write to the Free Software
24  *      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
25  */
26
27 /*****************************************************************************/
28
29 #include <linux/module.h>
30 #include <linux/sched.h>
31 #include <linux/slab.h>
32 #include <linux/interrupt.h>
33 #include <linux/tty.h>
34 #include <linux/tty_flip.h>
35 #include <linux/serial.h>
36 #include <linux/seq_file.h>
37 #include <linux/cd1400.h>
38 #include <linux/sc26198.h>
39 #include <linux/comstats.h>
40 #include <linux/stallion.h>
41 #include <linux/ioport.h>
42 #include <linux/init.h>
43 #include <linux/device.h>
44 #include <linux/delay.h>
45 #include <linux/ctype.h>
46
47 #include <asm/io.h>
48 #include <asm/uaccess.h>
49
50 #include <linux/pci.h>
51
52 /*****************************************************************************/
53
54 /*
55  *      Define different board types. Use the standard Stallion "assigned"
56  *      board numbers. Boards supported in this driver are abbreviated as
57  *      EIO = EasyIO and ECH = EasyConnection 8/32.
58  */
59 #define BRD_EASYIO      20
60 #define BRD_ECH         21
61 #define BRD_ECHMC       22
62 #define BRD_ECHPCI      26
63 #define BRD_ECH64PCI    27
64 #define BRD_EASYIOPCI   28
65
66 struct stlconf {
67         unsigned int    brdtype;
68         int             ioaddr1;
69         int             ioaddr2;
70         unsigned long   memaddr;
71         int             irq;
72         int             irqtype;
73 };
74
75 static unsigned int stl_nrbrds;
76
77 /*****************************************************************************/
78
79 /*
80  *      Define some important driver characteristics. Device major numbers
81  *      allocated as per Linux Device Registry.
82  */
83 #ifndef STL_SIOMEMMAJOR
84 #define STL_SIOMEMMAJOR         28
85 #endif
86 #ifndef STL_SERIALMAJOR
87 #define STL_SERIALMAJOR         24
88 #endif
89 #ifndef STL_CALLOUTMAJOR
90 #define STL_CALLOUTMAJOR        25
91 #endif
92
93 /*
94  *      Set the TX buffer size. Bigger is better, but we don't want
95  *      to chew too much memory with buffers!
96  */
97 #define STL_TXBUFLOW            512
98 #define STL_TXBUFSIZE           4096
99
100 /*****************************************************************************/
101
102 /*
103  *      Define our local driver identity first. Set up stuff to deal with
104  *      all the local structures required by a serial tty driver.
105  */
106 static char     *stl_drvtitle = "Stallion Multiport Serial Driver";
107 static char     *stl_drvname = "stallion";
108 static char     *stl_drvversion = "5.6.0";
109
110 static struct tty_driver        *stl_serial;
111
112 /*
113  *      Define a local default termios struct. All ports will be created
114  *      with this termios initially. Basically all it defines is a raw port
115  *      at 9600, 8 data bits, 1 stop bit.
116  */
117 static struct ktermios          stl_deftermios = {
118         .c_cflag        = (B9600 | CS8 | CREAD | HUPCL | CLOCAL),
119         .c_cc           = INIT_C_CC,
120         .c_ispeed       = 9600,
121         .c_ospeed       = 9600,
122 };
123
124 /*
125  *      Define global place to put buffer overflow characters.
126  */
127 static char             stl_unwanted[SC26198_RXFIFOSIZE];
128
129 /*****************************************************************************/
130
131 static DEFINE_MUTEX(stl_brdslock);
132 static struct stlbrd            *stl_brds[STL_MAXBRDS];
133
134 static const struct tty_port_operations stl_port_ops;
135
136 /*
137  *      Per board state flags. Used with the state field of the board struct.
138  *      Not really much here!
139  */
140 #define BRD_FOUND       0x1
141 #define STL_PROBED      0x2
142
143
144 /*
145  *      Define the port structure istate flags. These set of flags are
146  *      modified at interrupt time - so setting and reseting them needs
147  *      to be atomic. Use the bit clear/setting routines for this.
148  */
149 #define ASYI_TXBUSY     1
150 #define ASYI_TXLOW      2
151 #define ASYI_TXFLOWED   3
152
153 /*
154  *      Define an array of board names as printable strings. Handy for
155  *      referencing boards when printing trace and stuff.
156  */
157 static char     *stl_brdnames[] = {
158         NULL,
159         NULL,
160         NULL,
161         NULL,
162         NULL,
163         NULL,
164         NULL,
165         NULL,
166         NULL,
167         NULL,
168         NULL,
169         NULL,
170         NULL,
171         NULL,
172         NULL,
173         NULL,
174         NULL,
175         NULL,
176         NULL,
177         NULL,
178         "EasyIO",
179         "EC8/32-AT",
180         "EC8/32-MC",
181         NULL,
182         NULL,
183         NULL,
184         "EC8/32-PCI",
185         "EC8/64-PCI",
186         "EasyIO-PCI",
187 };
188
189 /*****************************************************************************/
190
191 /*
192  *      Define some string labels for arguments passed from the module
193  *      load line. These allow for easy board definitions, and easy
194  *      modification of the io, memory and irq resoucres.
195  */
196 static unsigned int stl_nargs;
197 static char     *board0[4];
198 static char     *board1[4];
199 static char     *board2[4];
200 static char     *board3[4];
201
202 static char     **stl_brdsp[] = {
203         (char **) &board0,
204         (char **) &board1,
205         (char **) &board2,
206         (char **) &board3
207 };
208
209 /*
210  *      Define a set of common board names, and types. This is used to
211  *      parse any module arguments.
212  */
213
214 static struct {
215         char    *name;
216         int     type;
217 } stl_brdstr[] = {
218         { "easyio", BRD_EASYIO },
219         { "eio", BRD_EASYIO },
220         { "20", BRD_EASYIO },
221         { "ec8/32", BRD_ECH },
222         { "ec8/32-at", BRD_ECH },
223         { "ec8/32-isa", BRD_ECH },
224         { "ech", BRD_ECH },
225         { "echat", BRD_ECH },
226         { "21", BRD_ECH },
227         { "ec8/32-mc", BRD_ECHMC },
228         { "ec8/32-mca", BRD_ECHMC },
229         { "echmc", BRD_ECHMC },
230         { "echmca", BRD_ECHMC },
231         { "22", BRD_ECHMC },
232         { "ec8/32-pc", BRD_ECHPCI },
233         { "ec8/32-pci", BRD_ECHPCI },
234         { "26", BRD_ECHPCI },
235         { "ec8/64-pc", BRD_ECH64PCI },
236         { "ec8/64-pci", BRD_ECH64PCI },
237         { "ech-pci", BRD_ECH64PCI },
238         { "echpci", BRD_ECH64PCI },
239         { "echpc", BRD_ECH64PCI },
240         { "27", BRD_ECH64PCI },
241         { "easyio-pc", BRD_EASYIOPCI },
242         { "easyio-pci", BRD_EASYIOPCI },
243         { "eio-pci", BRD_EASYIOPCI },
244         { "eiopci", BRD_EASYIOPCI },
245         { "28", BRD_EASYIOPCI },
246 };
247
248 /*
249  *      Define the module agruments.
250  */
251
252 module_param_array(board0, charp, &stl_nargs, 0);
253 MODULE_PARM_DESC(board0, "Board 0 config -> name[,ioaddr[,ioaddr2][,irq]]");
254 module_param_array(board1, charp, &stl_nargs, 0);
255 MODULE_PARM_DESC(board1, "Board 1 config -> name[,ioaddr[,ioaddr2][,irq]]");
256 module_param_array(board2, charp, &stl_nargs, 0);
257 MODULE_PARM_DESC(board2, "Board 2 config -> name[,ioaddr[,ioaddr2][,irq]]");
258 module_param_array(board3, charp, &stl_nargs, 0);
259 MODULE_PARM_DESC(board3, "Board 3 config -> name[,ioaddr[,ioaddr2][,irq]]");
260
261 /*****************************************************************************/
262
263 /*
264  *      Hardware ID bits for the EasyIO and ECH boards. These defines apply
265  *      to the directly accessible io ports of these boards (not the uarts -
266  *      they are in cd1400.h and sc26198.h).
267  */
268 #define EIO_8PORTRS     0x04
269 #define EIO_4PORTRS     0x05
270 #define EIO_8PORTDI     0x00
271 #define EIO_8PORTM      0x06
272 #define EIO_MK3         0x03
273 #define EIO_IDBITMASK   0x07
274
275 #define EIO_BRDMASK     0xf0
276 #define ID_BRD4         0x10
277 #define ID_BRD8         0x20
278 #define ID_BRD16        0x30
279
280 #define EIO_INTRPEND    0x08
281 #define EIO_INTEDGE     0x00
282 #define EIO_INTLEVEL    0x08
283 #define EIO_0WS         0x10
284
285 #define ECH_ID          0xa0
286 #define ECH_IDBITMASK   0xe0
287 #define ECH_BRDENABLE   0x08
288 #define ECH_BRDDISABLE  0x00
289 #define ECH_INTENABLE   0x01
290 #define ECH_INTDISABLE  0x00
291 #define ECH_INTLEVEL    0x02
292 #define ECH_INTEDGE     0x00
293 #define ECH_INTRPEND    0x01
294 #define ECH_BRDRESET    0x01
295
296 #define ECHMC_INTENABLE 0x01
297 #define ECHMC_BRDRESET  0x02
298
299 #define ECH_PNLSTATUS   2
300 #define ECH_PNL16PORT   0x20
301 #define ECH_PNLIDMASK   0x07
302 #define ECH_PNLXPID     0x40
303 #define ECH_PNLINTRPEND 0x80
304
305 #define ECH_ADDR2MASK   0x1e0
306
307 /*
308  *      Define the vector mapping bits for the programmable interrupt board
309  *      hardware. These bits encode the interrupt for the board to use - it
310  *      is software selectable (except the EIO-8M).
311  */
312 static unsigned char    stl_vecmap[] = {
313         0xff, 0xff, 0xff, 0x04, 0x06, 0x05, 0xff, 0x07,
314         0xff, 0xff, 0x00, 0x02, 0x01, 0xff, 0xff, 0x03
315 };
316
317 /*
318  *      Lock ordering is that you may not take stallion_lock holding
319  *      brd_lock.
320  */
321
322 static spinlock_t brd_lock;             /* Guard the board mapping */
323 static spinlock_t stallion_lock;        /* Guard the tty driver */
324
325 /*
326  *      Set up enable and disable macros for the ECH boards. They require
327  *      the secondary io address space to be activated and deactivated.
328  *      This way all ECH boards can share their secondary io region.
329  *      If this is an ECH-PCI board then also need to set the page pointer
330  *      to point to the correct page.
331  */
332 #define BRDENABLE(brdnr,pagenr)                                         \
333         if (stl_brds[(brdnr)]->brdtype == BRD_ECH)                      \
334                 outb((stl_brds[(brdnr)]->ioctrlval | ECH_BRDENABLE),    \
335                         stl_brds[(brdnr)]->ioctrl);                     \
336         else if (stl_brds[(brdnr)]->brdtype == BRD_ECHPCI)              \
337                 outb((pagenr), stl_brds[(brdnr)]->ioctrl);
338
339 #define BRDDISABLE(brdnr)                                               \
340         if (stl_brds[(brdnr)]->brdtype == BRD_ECH)                      \
341                 outb((stl_brds[(brdnr)]->ioctrlval | ECH_BRDDISABLE),   \
342                         stl_brds[(brdnr)]->ioctrl);
343
344 #define STL_CD1400MAXBAUD       230400
345 #define STL_SC26198MAXBAUD      460800
346
347 #define STL_BAUDBASE            115200
348 #define STL_CLOSEDELAY          (5 * HZ / 10)
349
350 /*****************************************************************************/
351
352 /*
353  *      Define the Stallion PCI vendor and device IDs.
354  */
355 #ifndef PCI_VENDOR_ID_STALLION
356 #define PCI_VENDOR_ID_STALLION          0x124d
357 #endif
358 #ifndef PCI_DEVICE_ID_ECHPCI832
359 #define PCI_DEVICE_ID_ECHPCI832         0x0000
360 #endif
361 #ifndef PCI_DEVICE_ID_ECHPCI864
362 #define PCI_DEVICE_ID_ECHPCI864         0x0002
363 #endif
364 #ifndef PCI_DEVICE_ID_EIOPCI
365 #define PCI_DEVICE_ID_EIOPCI            0x0003
366 #endif
367
368 /*
369  *      Define structure to hold all Stallion PCI boards.
370  */
371
372 static struct pci_device_id stl_pcibrds[] = {
373         { PCI_DEVICE(PCI_VENDOR_ID_STALLION, PCI_DEVICE_ID_ECHPCI864),
374                 .driver_data = BRD_ECH64PCI },
375         { PCI_DEVICE(PCI_VENDOR_ID_STALLION, PCI_DEVICE_ID_EIOPCI),
376                 .driver_data = BRD_EASYIOPCI },
377         { PCI_DEVICE(PCI_VENDOR_ID_STALLION, PCI_DEVICE_ID_ECHPCI832),
378                 .driver_data = BRD_ECHPCI },
379         { PCI_DEVICE(PCI_VENDOR_ID_NS, PCI_DEVICE_ID_NS_87410),
380                 .driver_data = BRD_ECHPCI },
381         { }
382 };
383 MODULE_DEVICE_TABLE(pci, stl_pcibrds);
384
385 /*****************************************************************************/
386
387 /*
388  *      Define macros to extract a brd/port number from a minor number.
389  */
390 #define MINOR2BRD(min)          (((min) & 0xc0) >> 6)
391 #define MINOR2PORT(min)         ((min) & 0x3f)
392
393 /*
394  *      Define a baud rate table that converts termios baud rate selector
395  *      into the actual baud rate value. All baud rate calculations are
396  *      based on the actual baud rate required.
397  */
398 static unsigned int     stl_baudrates[] = {
399         0, 50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800,
400         9600, 19200, 38400, 57600, 115200, 230400, 460800, 921600
401 };
402
403 /*****************************************************************************/
404
405 /*
406  *      Declare all those functions in this driver!
407  */
408
409 static long     stl_memioctl(struct file *fp, unsigned int cmd, unsigned long arg);
410 static int      stl_brdinit(struct stlbrd *brdp);
411 static int      stl_getportstats(struct tty_struct *tty, struct stlport *portp, comstats_t __user *cp);
412 static int      stl_clrportstats(struct stlport *portp, comstats_t __user *cp);
413
414 /*
415  *      CD1400 uart specific handling functions.
416  */
417 static void     stl_cd1400setreg(struct stlport *portp, int regnr, int value);
418 static int      stl_cd1400getreg(struct stlport *portp, int regnr);
419 static int      stl_cd1400updatereg(struct stlport *portp, int regnr, int value);
420 static int      stl_cd1400panelinit(struct stlbrd *brdp, struct stlpanel *panelp);
421 static void     stl_cd1400portinit(struct stlbrd *brdp, struct stlpanel *panelp, struct stlport *portp);
422 static void     stl_cd1400setport(struct stlport *portp, struct ktermios *tiosp);
423 static int      stl_cd1400getsignals(struct stlport *portp);
424 static void     stl_cd1400setsignals(struct stlport *portp, int dtr, int rts);
425 static void     stl_cd1400ccrwait(struct stlport *portp);
426 static void     stl_cd1400enablerxtx(struct stlport *portp, int rx, int tx);
427 static void     stl_cd1400startrxtx(struct stlport *portp, int rx, int tx);
428 static void     stl_cd1400disableintrs(struct stlport *portp);
429 static void     stl_cd1400sendbreak(struct stlport *portp, int len);
430 static void     stl_cd1400flowctrl(struct stlport *portp, int state);
431 static void     stl_cd1400sendflow(struct stlport *portp, int state);
432 static void     stl_cd1400flush(struct stlport *portp);
433 static int      stl_cd1400datastate(struct stlport *portp);
434 static void     stl_cd1400eiointr(struct stlpanel *panelp, unsigned int iobase);
435 static void     stl_cd1400echintr(struct stlpanel *panelp, unsigned int iobase);
436 static void     stl_cd1400txisr(struct stlpanel *panelp, int ioaddr);
437 static void     stl_cd1400rxisr(struct stlpanel *panelp, int ioaddr);
438 static void     stl_cd1400mdmisr(struct stlpanel *panelp, int ioaddr);
439
440 static inline int       stl_cd1400breakisr(struct stlport *portp, int ioaddr);
441
442 /*
443  *      SC26198 uart specific handling functions.
444  */
445 static void     stl_sc26198setreg(struct stlport *portp, int regnr, int value);
446 static int      stl_sc26198getreg(struct stlport *portp, int regnr);
447 static int      stl_sc26198updatereg(struct stlport *portp, int regnr, int value);
448 static int      stl_sc26198getglobreg(struct stlport *portp, int regnr);
449 static int      stl_sc26198panelinit(struct stlbrd *brdp, struct stlpanel *panelp);
450 static void     stl_sc26198portinit(struct stlbrd *brdp, struct stlpanel *panelp, struct stlport *portp);
451 static void     stl_sc26198setport(struct stlport *portp, struct ktermios *tiosp);
452 static int      stl_sc26198getsignals(struct stlport *portp);
453 static void     stl_sc26198setsignals(struct stlport *portp, int dtr, int rts);
454 static void     stl_sc26198enablerxtx(struct stlport *portp, int rx, int tx);
455 static void     stl_sc26198startrxtx(struct stlport *portp, int rx, int tx);
456 static void     stl_sc26198disableintrs(struct stlport *portp);
457 static void     stl_sc26198sendbreak(struct stlport *portp, int len);
458 static void     stl_sc26198flowctrl(struct stlport *portp, int state);
459 static void     stl_sc26198sendflow(struct stlport *portp, int state);
460 static void     stl_sc26198flush(struct stlport *portp);
461 static int      stl_sc26198datastate(struct stlport *portp);
462 static void     stl_sc26198wait(struct stlport *portp);
463 static void     stl_sc26198txunflow(struct stlport *portp, struct tty_struct *tty);
464 static void     stl_sc26198intr(struct stlpanel *panelp, unsigned int iobase);
465 static void     stl_sc26198txisr(struct stlport *port);
466 static void     stl_sc26198rxisr(struct stlport *port, unsigned int iack);
467 static void     stl_sc26198rxbadch(struct stlport *portp, unsigned char status, char ch);
468 static void     stl_sc26198rxbadchars(struct stlport *portp);
469 static void     stl_sc26198otherisr(struct stlport *port, unsigned int iack);
470
471 /*****************************************************************************/
472
473 /*
474  *      Generic UART support structure.
475  */
476 typedef struct uart {
477         int     (*panelinit)(struct stlbrd *brdp, struct stlpanel *panelp);
478         void    (*portinit)(struct stlbrd *brdp, struct stlpanel *panelp, struct stlport *portp);
479         void    (*setport)(struct stlport *portp, struct ktermios *tiosp);
480         int     (*getsignals)(struct stlport *portp);
481         void    (*setsignals)(struct stlport *portp, int dtr, int rts);
482         void    (*enablerxtx)(struct stlport *portp, int rx, int tx);
483         void    (*startrxtx)(struct stlport *portp, int rx, int tx);
484         void    (*disableintrs)(struct stlport *portp);
485         void    (*sendbreak)(struct stlport *portp, int len);
486         void    (*flowctrl)(struct stlport *portp, int state);
487         void    (*sendflow)(struct stlport *portp, int state);
488         void    (*flush)(struct stlport *portp);
489         int     (*datastate)(struct stlport *portp);
490         void    (*intr)(struct stlpanel *panelp, unsigned int iobase);
491 } uart_t;
492
493 /*
494  *      Define some macros to make calling these functions nice and clean.
495  */
496 #define stl_panelinit           (* ((uart_t *) panelp->uartp)->panelinit)
497 #define stl_portinit            (* ((uart_t *) portp->uartp)->portinit)
498 #define stl_setport             (* ((uart_t *) portp->uartp)->setport)
499 #define stl_getsignals          (* ((uart_t *) portp->uartp)->getsignals)
500 #define stl_setsignals          (* ((uart_t *) portp->uartp)->setsignals)
501 #define stl_enablerxtx          (* ((uart_t *) portp->uartp)->enablerxtx)
502 #define stl_startrxtx           (* ((uart_t *) portp->uartp)->startrxtx)
503 #define stl_disableintrs        (* ((uart_t *) portp->uartp)->disableintrs)
504 #define stl_sendbreak           (* ((uart_t *) portp->uartp)->sendbreak)
505 #define stl_flowctrl            (* ((uart_t *) portp->uartp)->flowctrl)
506 #define stl_sendflow            (* ((uart_t *) portp->uartp)->sendflow)
507 #define stl_flush               (* ((uart_t *) portp->uartp)->flush)
508 #define stl_datastate           (* ((uart_t *) portp->uartp)->datastate)
509
510 /*****************************************************************************/
511
512 /*
513  *      CD1400 UART specific data initialization.
514  */
515 static uart_t stl_cd1400uart = {
516         stl_cd1400panelinit,
517         stl_cd1400portinit,
518         stl_cd1400setport,
519         stl_cd1400getsignals,
520         stl_cd1400setsignals,
521         stl_cd1400enablerxtx,
522         stl_cd1400startrxtx,
523         stl_cd1400disableintrs,
524         stl_cd1400sendbreak,
525         stl_cd1400flowctrl,
526         stl_cd1400sendflow,
527         stl_cd1400flush,
528         stl_cd1400datastate,
529         stl_cd1400eiointr
530 };
531
532 /*
533  *      Define the offsets within the register bank of a cd1400 based panel.
534  *      These io address offsets are common to the EasyIO board as well.
535  */
536 #define EREG_ADDR       0
537 #define EREG_DATA       4
538 #define EREG_RXACK      5
539 #define EREG_TXACK      6
540 #define EREG_MDACK      7
541
542 #define EREG_BANKSIZE   8
543
544 #define CD1400_CLK      25000000
545 #define CD1400_CLK8M    20000000
546
547 /*
548  *      Define the cd1400 baud rate clocks. These are used when calculating
549  *      what clock and divisor to use for the required baud rate. Also
550  *      define the maximum baud rate allowed, and the default base baud.
551  */
552 static int      stl_cd1400clkdivs[] = {
553         CD1400_CLK0, CD1400_CLK1, CD1400_CLK2, CD1400_CLK3, CD1400_CLK4
554 };
555
556 /*****************************************************************************/
557
558 /*
559  *      SC26198 UART specific data initization.
560  */
561 static uart_t stl_sc26198uart = {
562         stl_sc26198panelinit,
563         stl_sc26198portinit,
564         stl_sc26198setport,
565         stl_sc26198getsignals,
566         stl_sc26198setsignals,
567         stl_sc26198enablerxtx,
568         stl_sc26198startrxtx,
569         stl_sc26198disableintrs,
570         stl_sc26198sendbreak,
571         stl_sc26198flowctrl,
572         stl_sc26198sendflow,
573         stl_sc26198flush,
574         stl_sc26198datastate,
575         stl_sc26198intr
576 };
577
578 /*
579  *      Define the offsets within the register bank of a sc26198 based panel.
580  */
581 #define XP_DATA         0
582 #define XP_ADDR         1
583 #define XP_MODID        2
584 #define XP_STATUS       2
585 #define XP_IACK         3
586
587 #define XP_BANKSIZE     4
588
589 /*
590  *      Define the sc26198 baud rate table. Offsets within the table
591  *      represent the actual baud rate selector of sc26198 registers.
592  */
593 static unsigned int     sc26198_baudtable[] = {
594         50, 75, 150, 200, 300, 450, 600, 900, 1200, 1800, 2400, 3600,
595         4800, 7200, 9600, 14400, 19200, 28800, 38400, 57600, 115200,
596         230400, 460800, 921600
597 };
598
599 #define SC26198_NRBAUDS         ARRAY_SIZE(sc26198_baudtable)
600
601 /*****************************************************************************/
602
603 /*
604  *      Define the driver info for a user level control device. Used mainly
605  *      to get at port stats - only not using the port device itself.
606  */
607 static const struct file_operations     stl_fsiomem = {
608         .owner          = THIS_MODULE,
609         .unlocked_ioctl = stl_memioctl,
610         .llseek         = noop_llseek,
611 };
612
613 static struct class *stallion_class;
614
615 static void stl_cd_change(struct stlport *portp)
616 {
617         unsigned int oldsigs = portp->sigs;
618         struct tty_struct *tty = tty_port_tty_get(&portp->port);
619
620         if (!tty)
621                 return;
622
623         portp->sigs = stl_getsignals(portp);
624
625         if ((portp->sigs & TIOCM_CD) && ((oldsigs & TIOCM_CD) == 0))
626                 wake_up_interruptible(&portp->port.open_wait);
627
628         if ((oldsigs & TIOCM_CD) && ((portp->sigs & TIOCM_CD) == 0))
629                 if (portp->port.flags & ASYNC_CHECK_CD)
630                         tty_hangup(tty);
631         tty_kref_put(tty);
632 }
633
634 /*
635  *      Check for any arguments passed in on the module load command line.
636  */
637
638 /*****************************************************************************/
639
640 /*
641  *      Parse the supplied argument string, into the board conf struct.
642  */
643
644 static int __init stl_parsebrd(struct stlconf *confp, char **argp)
645 {
646         char    *sp;
647         unsigned int i;
648
649         pr_debug("stl_parsebrd(confp=%p,argp=%p)\n", confp, argp);
650
651         if ((argp[0] == NULL) || (*argp[0] == 0))
652                 return 0;
653
654         for (sp = argp[0], i = 0; (*sp != 0) && (i < 25); sp++, i++)
655                 *sp = tolower(*sp);
656
657         for (i = 0; i < ARRAY_SIZE(stl_brdstr); i++)
658                 if (strcmp(stl_brdstr[i].name, argp[0]) == 0)
659                         break;
660
661         if (i == ARRAY_SIZE(stl_brdstr)) {
662                 printk("STALLION: unknown board name, %s?\n", argp[0]);
663                 return 0;
664         }
665
666         confp->brdtype = stl_brdstr[i].type;
667
668         i = 1;
669         if ((argp[i] != NULL) && (*argp[i] != 0))
670                 confp->ioaddr1 = simple_strtoul(argp[i], NULL, 0);
671         i++;
672         if (confp->brdtype == BRD_ECH) {
673                 if ((argp[i] != NULL) && (*argp[i] != 0))
674                         confp->ioaddr2 = simple_strtoul(argp[i], NULL, 0);
675                 i++;
676         }
677         if ((argp[i] != NULL) && (*argp[i] != 0))
678                 confp->irq = simple_strtoul(argp[i], NULL, 0);
679         return 1;
680 }
681
682 /*****************************************************************************/
683
684 /*
685  *      Allocate a new board structure. Fill out the basic info in it.
686  */
687
688 static struct stlbrd *stl_allocbrd(void)
689 {
690         struct stlbrd   *brdp;
691
692         brdp = kzalloc(sizeof(struct stlbrd), GFP_KERNEL);
693         if (!brdp) {
694                 printk("STALLION: failed to allocate memory (size=%Zd)\n",
695                         sizeof(struct stlbrd));
696                 return NULL;
697         }
698
699         brdp->magic = STL_BOARDMAGIC;
700         return brdp;
701 }
702
703 /*****************************************************************************/
704
705 static int stl_activate(struct tty_port *port, struct tty_struct *tty)
706 {
707         struct stlport *portp = container_of(port, struct stlport, port);
708         if (!portp->tx.buf) {
709                 portp->tx.buf = kmalloc(STL_TXBUFSIZE, GFP_KERNEL);
710                 if (!portp->tx.buf)
711                         return -ENOMEM;
712                 portp->tx.head = portp->tx.buf;
713                 portp->tx.tail = portp->tx.buf;
714         }
715         stl_setport(portp, tty->termios);
716         portp->sigs = stl_getsignals(portp);
717         stl_setsignals(portp, 1, 1);
718         stl_enablerxtx(portp, 1, 1);
719         stl_startrxtx(portp, 1, 0);
720         return 0;
721 }
722
723 static int stl_open(struct tty_struct *tty, struct file *filp)
724 {
725         struct stlport  *portp;
726         struct stlbrd   *brdp;
727         unsigned int    minordev, brdnr, panelnr;
728         int             portnr;
729
730         pr_debug("stl_open(tty=%p,filp=%p): device=%s\n", tty, filp, tty->name);
731
732         minordev = tty->index;
733         brdnr = MINOR2BRD(minordev);
734         if (brdnr >= stl_nrbrds)
735                 return -ENODEV;
736         brdp = stl_brds[brdnr];
737         if (brdp == NULL)
738                 return -ENODEV;
739
740         minordev = MINOR2PORT(minordev);
741         for (portnr = -1, panelnr = 0; panelnr < STL_MAXPANELS; panelnr++) {
742                 if (brdp->panels[panelnr] == NULL)
743                         break;
744                 if (minordev < brdp->panels[panelnr]->nrports) {
745                         portnr = minordev;
746                         break;
747                 }
748                 minordev -= brdp->panels[panelnr]->nrports;
749         }
750         if (portnr < 0)
751                 return -ENODEV;
752
753         portp = brdp->panels[panelnr]->ports[portnr];
754         if (portp == NULL)
755                 return -ENODEV;
756
757         tty->driver_data = portp;
758         return tty_port_open(&portp->port, tty, filp);
759
760 }
761
762 /*****************************************************************************/
763
764 static int stl_carrier_raised(struct tty_port *port)
765 {
766         struct stlport *portp = container_of(port, struct stlport, port);
767         return (portp->sigs & TIOCM_CD) ? 1 : 0;
768 }
769
770 static void stl_dtr_rts(struct tty_port *port, int on)
771 {
772         struct stlport *portp = container_of(port, struct stlport, port);
773         /* Takes brd_lock internally */
774         stl_setsignals(portp, on, on);
775 }
776
777 /*****************************************************************************/
778
779 static void stl_flushbuffer(struct tty_struct *tty)
780 {
781         struct stlport  *portp;
782
783         pr_debug("stl_flushbuffer(tty=%p)\n", tty);
784
785         portp = tty->driver_data;
786         if (portp == NULL)
787                 return;
788
789         stl_flush(portp);
790         tty_wakeup(tty);
791 }
792
793 /*****************************************************************************/
794
795 static void stl_waituntilsent(struct tty_struct *tty, int timeout)
796 {
797         struct stlport  *portp;
798         unsigned long   tend;
799
800         pr_debug("stl_waituntilsent(tty=%p,timeout=%d)\n", tty, timeout);
801
802         portp = tty->driver_data;
803         if (portp == NULL)
804                 return;
805
806         if (timeout == 0)
807                 timeout = HZ;
808         tend = jiffies + timeout;
809
810         while (stl_datastate(portp)) {
811                 if (signal_pending(current))
812                         break;
813                 msleep_interruptible(20);
814                 if (time_after_eq(jiffies, tend))
815                         break;
816         }
817 }
818
819 /*****************************************************************************/
820
821 static void stl_shutdown(struct tty_port *port)
822 {
823         struct stlport *portp = container_of(port, struct stlport, port);
824         stl_disableintrs(portp);
825         stl_enablerxtx(portp, 0, 0);
826         stl_flush(portp);
827         portp->istate = 0;
828         if (portp->tx.buf != NULL) {
829                 kfree(portp->tx.buf);
830                 portp->tx.buf = NULL;
831                 portp->tx.head = NULL;
832                 portp->tx.tail = NULL;
833         }
834 }
835
836 static void stl_close(struct tty_struct *tty, struct file *filp)
837 {
838         struct stlport*portp;
839         pr_debug("stl_close(tty=%p,filp=%p)\n", tty, filp);
840
841         portp = tty->driver_data;
842         if(portp == NULL)
843                 return;
844         tty_port_close(&portp->port, tty, filp);
845 }
846
847 /*****************************************************************************/
848
849 /*
850  *      Write routine. Take data and stuff it in to the TX ring queue.
851  *      If transmit interrupts are not running then start them.
852  */
853
854 static int stl_write(struct tty_struct *tty, const unsigned char *buf, int count)
855 {
856         struct stlport  *portp;
857         unsigned int    len, stlen;
858         unsigned char   *chbuf;
859         char            *head, *tail;
860
861         pr_debug("stl_write(tty=%p,buf=%p,count=%d)\n", tty, buf, count);
862
863         portp = tty->driver_data;
864         if (portp == NULL)
865                 return 0;
866         if (portp->tx.buf == NULL)
867                 return 0;
868
869 /*
870  *      If copying direct from user space we must cater for page faults,
871  *      causing us to "sleep" here for a while. To handle this copy in all
872  *      the data we need now, into a local buffer. Then when we got it all
873  *      copy it into the TX buffer.
874  */
875         chbuf = (unsigned char *) buf;
876
877         head = portp->tx.head;
878         tail = portp->tx.tail;
879         if (head >= tail) {
880                 len = STL_TXBUFSIZE - (head - tail) - 1;
881                 stlen = STL_TXBUFSIZE - (head - portp->tx.buf);
882         } else {
883                 len = tail - head - 1;
884                 stlen = len;
885         }
886
887         len = min(len, (unsigned int)count);
888         count = 0;
889         while (len > 0) {
890                 stlen = min(len, stlen);
891                 memcpy(head, chbuf, stlen);
892                 len -= stlen;
893                 chbuf += stlen;
894                 count += stlen;
895                 head += stlen;
896                 if (head >= (portp->tx.buf + STL_TXBUFSIZE)) {
897                         head = portp->tx.buf;
898                         stlen = tail - head;
899                 }
900         }
901         portp->tx.head = head;
902
903         clear_bit(ASYI_TXLOW, &portp->istate);
904         stl_startrxtx(portp, -1, 1);
905
906         return count;
907 }
908
909 /*****************************************************************************/
910
911 static int stl_putchar(struct tty_struct *tty, unsigned char ch)
912 {
913         struct stlport  *portp;
914         unsigned int    len;
915         char            *head, *tail;
916
917         pr_debug("stl_putchar(tty=%p,ch=%x)\n", tty, ch);
918
919         portp = tty->driver_data;
920         if (portp == NULL)
921                 return -EINVAL;
922         if (portp->tx.buf == NULL)
923                 return -EINVAL;
924
925         head = portp->tx.head;
926         tail = portp->tx.tail;
927
928         len = (head >= tail) ? (STL_TXBUFSIZE - (head - tail)) : (tail - head);
929         len--;
930
931         if (len > 0) {
932                 *head++ = ch;
933                 if (head >= (portp->tx.buf + STL_TXBUFSIZE))
934                         head = portp->tx.buf;
935         }       
936         portp->tx.head = head;
937         return 0;
938 }
939
940 /*****************************************************************************/
941
942 /*
943  *      If there are any characters in the buffer then make sure that TX
944  *      interrupts are on and get'em out. Normally used after the putchar
945  *      routine has been called.
946  */
947
948 static void stl_flushchars(struct tty_struct *tty)
949 {
950         struct stlport  *portp;
951
952         pr_debug("stl_flushchars(tty=%p)\n", tty);
953
954         portp = tty->driver_data;
955         if (portp == NULL)
956                 return;
957         if (portp->tx.buf == NULL)
958                 return;
959
960         stl_startrxtx(portp, -1, 1);
961 }
962
963 /*****************************************************************************/
964
965 static int stl_writeroom(struct tty_struct *tty)
966 {
967         struct stlport  *portp;
968         char            *head, *tail;
969
970         pr_debug("stl_writeroom(tty=%p)\n", tty);
971
972         portp = tty->driver_data;
973         if (portp == NULL)
974                 return 0;
975         if (portp->tx.buf == NULL)
976                 return 0;
977
978         head = portp->tx.head;
979         tail = portp->tx.tail;
980         return (head >= tail) ? (STL_TXBUFSIZE - (head - tail) - 1) : (tail - head - 1);
981 }
982
983 /*****************************************************************************/
984
985 /*
986  *      Return number of chars in the TX buffer. Normally we would just
987  *      calculate the number of chars in the buffer and return that, but if
988  *      the buffer is empty and TX interrupts are still on then we return
989  *      that the buffer still has 1 char in it. This way whoever called us
990  *      will not think that ALL chars have drained - since the UART still
991  *      must have some chars in it (we are busy after all).
992  */
993
994 static int stl_charsinbuffer(struct tty_struct *tty)
995 {
996         struct stlport  *portp;
997         unsigned int    size;
998         char            *head, *tail;
999
1000         pr_debug("stl_charsinbuffer(tty=%p)\n", tty);
1001
1002         portp = tty->driver_data;
1003         if (portp == NULL)
1004                 return 0;
1005         if (portp->tx.buf == NULL)
1006                 return 0;
1007
1008         head = portp->tx.head;
1009         tail = portp->tx.tail;
1010         size = (head >= tail) ? (head - tail) : (STL_TXBUFSIZE - (tail - head));
1011         if ((size == 0) && test_bit(ASYI_TXBUSY, &portp->istate))
1012                 size = 1;
1013         return size;
1014 }
1015
1016 /*****************************************************************************/
1017
1018 /*
1019  *      Generate the serial struct info.
1020  */
1021
1022 static int stl_getserial(struct stlport *portp, struct serial_struct __user *sp)
1023 {
1024         struct serial_struct    sio;
1025         struct stlbrd           *brdp;
1026
1027         pr_debug("stl_getserial(portp=%p,sp=%p)\n", portp, sp);
1028
1029         memset(&sio, 0, sizeof(struct serial_struct));
1030
1031         mutex_lock(&portp->port.mutex);
1032         sio.line = portp->portnr;
1033         sio.port = portp->ioaddr;
1034         sio.flags = portp->port.flags;
1035         sio.baud_base = portp->baud_base;
1036         sio.close_delay = portp->close_delay;
1037         sio.closing_wait = portp->closing_wait;
1038         sio.custom_divisor = portp->custom_divisor;
1039         sio.hub6 = 0;
1040         if (portp->uartp == &stl_cd1400uart) {
1041                 sio.type = PORT_CIRRUS;
1042                 sio.xmit_fifo_size = CD1400_TXFIFOSIZE;
1043         } else {
1044                 sio.type = PORT_UNKNOWN;
1045                 sio.xmit_fifo_size = SC26198_TXFIFOSIZE;
1046         }
1047
1048         brdp = stl_brds[portp->brdnr];
1049         if (brdp != NULL)
1050                 sio.irq = brdp->irq;
1051         mutex_unlock(&portp->port.mutex);
1052
1053         return copy_to_user(sp, &sio, sizeof(struct serial_struct)) ? -EFAULT : 0;
1054 }
1055
1056 /*****************************************************************************/
1057
1058 /*
1059  *      Set port according to the serial struct info.
1060  *      At this point we do not do any auto-configure stuff, so we will
1061  *      just quietly ignore any requests to change irq, etc.
1062  */
1063
1064 static int stl_setserial(struct tty_struct *tty, struct serial_struct __user *sp)
1065 {
1066         struct stlport *        portp = tty->driver_data;
1067         struct serial_struct    sio;
1068
1069         pr_debug("stl_setserial(portp=%p,sp=%p)\n", portp, sp);
1070
1071         if (copy_from_user(&sio, sp, sizeof(struct serial_struct)))
1072                 return -EFAULT;
1073         mutex_lock(&portp->port.mutex);
1074         if (!capable(CAP_SYS_ADMIN)) {
1075                 if ((sio.baud_base != portp->baud_base) ||
1076                     (sio.close_delay != portp->close_delay) ||
1077                     ((sio.flags & ~ASYNC_USR_MASK) !=
1078                     (portp->port.flags & ~ASYNC_USR_MASK))) {
1079                         mutex_unlock(&portp->port.mutex);
1080                         return -EPERM;
1081                 }
1082         } 
1083
1084         portp->port.flags = (portp->port.flags & ~ASYNC_USR_MASK) |
1085                 (sio.flags & ASYNC_USR_MASK);
1086         portp->baud_base = sio.baud_base;
1087         portp->close_delay = sio.close_delay;
1088         portp->closing_wait = sio.closing_wait;
1089         portp->custom_divisor = sio.custom_divisor;
1090         mutex_unlock(&portp->port.mutex);
1091         stl_setport(portp, tty->termios);
1092         return 0;
1093 }
1094
1095 /*****************************************************************************/
1096
1097 static int stl_tiocmget(struct tty_struct *tty)
1098 {
1099         struct stlport  *portp;
1100
1101         portp = tty->driver_data;
1102         if (portp == NULL)
1103                 return -ENODEV;
1104         if (tty->flags & (1 << TTY_IO_ERROR))
1105                 return -EIO;
1106
1107         return stl_getsignals(portp);
1108 }
1109
1110 static int stl_tiocmset(struct tty_struct *tty,
1111                         unsigned int set, unsigned int clear)
1112 {
1113         struct stlport  *portp;
1114         int rts = -1, dtr = -1;
1115
1116         portp = tty->driver_data;
1117         if (portp == NULL)
1118                 return -ENODEV;
1119         if (tty->flags & (1 << TTY_IO_ERROR))
1120                 return -EIO;
1121
1122         if (set & TIOCM_RTS)
1123                 rts = 1;
1124         if (set & TIOCM_DTR)
1125                 dtr = 1;
1126         if (clear & TIOCM_RTS)
1127                 rts = 0;
1128         if (clear & TIOCM_DTR)
1129                 dtr = 0;
1130
1131         stl_setsignals(portp, dtr, rts);
1132         return 0;
1133 }
1134
1135 static int stl_ioctl(struct tty_struct *tty, unsigned int cmd, unsigned long arg)
1136 {
1137         struct stlport  *portp;
1138         int             rc;
1139         void __user *argp = (void __user *)arg;
1140
1141         pr_debug("stl_ioctl(tty=%p,cmd=%x,arg=%lx)\n", tty, cmd, arg);
1142
1143         portp = tty->driver_data;
1144         if (portp == NULL)
1145                 return -ENODEV;
1146
1147         if ((cmd != TIOCGSERIAL) && (cmd != TIOCSSERIAL) &&
1148             (cmd != COM_GETPORTSTATS) && (cmd != COM_CLRPORTSTATS))
1149                 if (tty->flags & (1 << TTY_IO_ERROR))
1150                         return -EIO;
1151
1152         rc = 0;
1153
1154         switch (cmd) {
1155         case TIOCGSERIAL:
1156                 rc = stl_getserial(portp, argp);
1157                 break;
1158         case TIOCSSERIAL:
1159                 rc = stl_setserial(tty, argp);
1160                 break;
1161         case COM_GETPORTSTATS:
1162                 rc = stl_getportstats(tty, portp, argp);
1163                 break;
1164         case COM_CLRPORTSTATS:
1165                 rc = stl_clrportstats(portp, argp);
1166                 break;
1167         case TIOCSERCONFIG:
1168         case TIOCSERGWILD:
1169         case TIOCSERSWILD:
1170         case TIOCSERGETLSR:
1171         case TIOCSERGSTRUCT:
1172         case TIOCSERGETMULTI:
1173         case TIOCSERSETMULTI:
1174         default:
1175                 rc = -ENOIOCTLCMD;
1176                 break;
1177         }
1178         return rc;
1179 }
1180
1181 /*****************************************************************************/
1182
1183 /*
1184  *      Start the transmitter again. Just turn TX interrupts back on.
1185  */
1186
1187 static void stl_start(struct tty_struct *tty)
1188 {
1189         struct stlport  *portp;
1190
1191         pr_debug("stl_start(tty=%p)\n", tty);
1192
1193         portp = tty->driver_data;
1194         if (portp == NULL)
1195                 return;
1196         stl_startrxtx(portp, -1, 1);
1197 }
1198
1199 /*****************************************************************************/
1200
1201 static void stl_settermios(struct tty_struct *tty, struct ktermios *old)
1202 {
1203         struct stlport  *portp;
1204         struct ktermios *tiosp;
1205
1206         pr_debug("stl_settermios(tty=%p,old=%p)\n", tty, old);
1207
1208         portp = tty->driver_data;
1209         if (portp == NULL)
1210                 return;
1211
1212         tiosp = tty->termios;
1213         if ((tiosp->c_cflag == old->c_cflag) &&
1214             (tiosp->c_iflag == old->c_iflag))
1215                 return;
1216
1217         stl_setport(portp, tiosp);
1218         stl_setsignals(portp, ((tiosp->c_cflag & (CBAUD & ~CBAUDEX)) ? 1 : 0),
1219                 -1);
1220         if ((old->c_cflag & CRTSCTS) && ((tiosp->c_cflag & CRTSCTS) == 0)) {
1221                 tty->hw_stopped = 0;
1222                 stl_start(tty);
1223         }
1224         if (((old->c_cflag & CLOCAL) == 0) && (tiosp->c_cflag & CLOCAL))
1225                 wake_up_interruptible(&portp->port.open_wait);
1226 }
1227
1228 /*****************************************************************************/
1229
1230 /*
1231  *      Attempt to flow control who ever is sending us data. Based on termios
1232  *      settings use software or/and hardware flow control.
1233  */
1234
1235 static void stl_throttle(struct tty_struct *tty)
1236 {
1237         struct stlport  *portp;
1238
1239         pr_debug("stl_throttle(tty=%p)\n", tty);
1240
1241         portp = tty->driver_data;
1242         if (portp == NULL)
1243                 return;
1244         stl_flowctrl(portp, 0);
1245 }
1246
1247 /*****************************************************************************/
1248
1249 /*
1250  *      Unflow control the device sending us data...
1251  */
1252
1253 static void stl_unthrottle(struct tty_struct *tty)
1254 {
1255         struct stlport  *portp;
1256
1257         pr_debug("stl_unthrottle(tty=%p)\n", tty);
1258
1259         portp = tty->driver_data;
1260         if (portp == NULL)
1261                 return;
1262         stl_flowctrl(portp, 1);
1263 }
1264
1265 /*****************************************************************************/
1266
1267 /*
1268  *      Stop the transmitter. Basically to do this we will just turn TX
1269  *      interrupts off.
1270  */
1271
1272 static void stl_stop(struct tty_struct *tty)
1273 {
1274         struct stlport  *portp;
1275
1276         pr_debug("stl_stop(tty=%p)\n", tty);
1277
1278         portp = tty->driver_data;
1279         if (portp == NULL)
1280                 return;
1281         stl_startrxtx(portp, -1, 0);
1282 }
1283
1284 /*****************************************************************************/
1285
1286 /*
1287  *      Hangup this port. This is pretty much like closing the port, only
1288  *      a little more brutal. No waiting for data to drain. Shutdown the
1289  *      port and maybe drop signals.
1290  */
1291
1292 static void stl_hangup(struct tty_struct *tty)
1293 {
1294         struct stlport  *portp = tty->driver_data;
1295         pr_debug("stl_hangup(tty=%p)\n", tty);
1296
1297         if (portp == NULL)
1298                 return;
1299         tty_port_hangup(&portp->port);
1300 }
1301
1302 /*****************************************************************************/
1303
1304 static int stl_breakctl(struct tty_struct *tty, int state)
1305 {
1306         struct stlport  *portp;
1307
1308         pr_debug("stl_breakctl(tty=%p,state=%d)\n", tty, state);
1309
1310         portp = tty->driver_data;
1311         if (portp == NULL)
1312                 return -EINVAL;
1313
1314         stl_sendbreak(portp, ((state == -1) ? 1 : 2));
1315         return 0;
1316 }
1317
1318 /*****************************************************************************/
1319
1320 static void stl_sendxchar(struct tty_struct *tty, char ch)
1321 {
1322         struct stlport  *portp;
1323
1324         pr_debug("stl_sendxchar(tty=%p,ch=%x)\n", tty, ch);
1325
1326         portp = tty->driver_data;
1327         if (portp == NULL)
1328                 return;
1329
1330         if (ch == STOP_CHAR(tty))
1331                 stl_sendflow(portp, 0);
1332         else if (ch == START_CHAR(tty))
1333                 stl_sendflow(portp, 1);
1334         else
1335                 stl_putchar(tty, ch);
1336 }
1337
1338 static void stl_portinfo(struct seq_file *m, struct stlport *portp, int portnr)
1339 {
1340         int     sigs;
1341         char sep;
1342
1343         seq_printf(m, "%d: uart:%s tx:%d rx:%d",
1344                 portnr, (portp->hwid == 1) ? "SC26198" : "CD1400",
1345                 (int) portp->stats.txtotal, (int) portp->stats.rxtotal);
1346
1347         if (portp->stats.rxframing)
1348                 seq_printf(m, " fe:%d", (int) portp->stats.rxframing);
1349         if (portp->stats.rxparity)
1350                 seq_printf(m, " pe:%d", (int) portp->stats.rxparity);
1351         if (portp->stats.rxbreaks)
1352                 seq_printf(m, " brk:%d", (int) portp->stats.rxbreaks);
1353         if (portp->stats.rxoverrun)
1354                 seq_printf(m, " oe:%d", (int) portp->stats.rxoverrun);
1355
1356         sigs = stl_getsignals(portp);
1357         sep = ' ';
1358         if (sigs & TIOCM_RTS) {
1359                 seq_printf(m, "%c%s", sep, "RTS");
1360                 sep = '|';
1361         }
1362         if (sigs & TIOCM_CTS) {
1363                 seq_printf(m, "%c%s", sep, "CTS");
1364                 sep = '|';
1365         }
1366         if (sigs & TIOCM_DTR) {
1367                 seq_printf(m, "%c%s", sep, "DTR");
1368                 sep = '|';
1369         }
1370         if (sigs & TIOCM_CD) {
1371                 seq_printf(m, "%c%s", sep, "DCD");
1372                 sep = '|';
1373         }
1374         if (sigs & TIOCM_DSR) {
1375                 seq_printf(m, "%c%s", sep, "DSR");
1376                 sep = '|';
1377         }
1378         seq_putc(m, '\n');
1379 }
1380
1381 /*****************************************************************************/
1382
1383 /*
1384  *      Port info, read from the /proc file system.
1385  */
1386
1387 static int stl_proc_show(struct seq_file *m, void *v)
1388 {
1389         struct stlbrd   *brdp;
1390         struct stlpanel *panelp;
1391         struct stlport  *portp;
1392         unsigned int    brdnr, panelnr, portnr;
1393         int             totalport;
1394
1395         totalport = 0;
1396
1397         seq_printf(m, "%s: version %s\n", stl_drvtitle, stl_drvversion);
1398
1399 /*
1400  *      We scan through for each board, panel and port. The offset is
1401  *      calculated on the fly, and irrelevant ports are skipped.
1402  */
1403         for (brdnr = 0; brdnr < stl_nrbrds; brdnr++) {
1404                 brdp = stl_brds[brdnr];
1405                 if (brdp == NULL)
1406                         continue;
1407                 if (brdp->state == 0)
1408                         continue;
1409
1410                 totalport = brdnr * STL_MAXPORTS;
1411                 for (panelnr = 0; panelnr < brdp->nrpanels; panelnr++) {
1412                         panelp = brdp->panels[panelnr];
1413                         if (panelp == NULL)
1414                                 continue;
1415
1416                         for (portnr = 0; portnr < panelp->nrports; portnr++,
1417                             totalport++) {
1418                                 portp = panelp->ports[portnr];
1419                                 if (portp == NULL)
1420                                         continue;
1421                                 stl_portinfo(m, portp, totalport);
1422                         }
1423                 }
1424         }
1425         return 0;
1426 }
1427
1428 static int stl_proc_open(struct inode *inode, struct file *file)
1429 {
1430         return single_open(file, stl_proc_show, NULL);
1431 }
1432
1433 static const struct file_operations stl_proc_fops = {
1434         .owner          = THIS_MODULE,
1435         .open           = stl_proc_open,
1436         .read           = seq_read,
1437         .llseek         = seq_lseek,
1438         .release        = single_release,
1439 };
1440
1441 /*****************************************************************************/
1442
1443 /*
1444  *      All board interrupts are vectored through here first. This code then
1445  *      calls off to the approrpriate board interrupt handlers.
1446  */
1447
1448 static irqreturn_t stl_intr(int irq, void *dev_id)
1449 {
1450         struct stlbrd *brdp = dev_id;
1451
1452         pr_debug("stl_intr(brdp=%p,irq=%d)\n", brdp, brdp->irq);
1453
1454         return IRQ_RETVAL((* brdp->isr)(brdp));
1455 }
1456
1457 /*****************************************************************************/
1458
1459 /*
1460  *      Interrupt service routine for EasyIO board types.
1461  */
1462
1463 static int stl_eiointr(struct stlbrd *brdp)
1464 {
1465         struct stlpanel *panelp;
1466         unsigned int    iobase;
1467         int             handled = 0;
1468
1469         spin_lock(&brd_lock);
1470         panelp = brdp->panels[0];
1471         iobase = panelp->iobase;
1472         while (inb(brdp->iostatus) & EIO_INTRPEND) {
1473                 handled = 1;
1474                 (* panelp->isr)(panelp, iobase);
1475         }
1476         spin_unlock(&brd_lock);
1477         return handled;
1478 }
1479
1480 /*****************************************************************************/
1481
1482 /*
1483  *      Interrupt service routine for ECH-AT board types.
1484  */
1485
1486 static int stl_echatintr(struct stlbrd *brdp)
1487 {
1488         struct stlpanel *panelp;
1489         unsigned int    ioaddr, bnknr;
1490         int             handled = 0;
1491
1492         outb((brdp->ioctrlval | ECH_BRDENABLE), brdp->ioctrl);
1493
1494         while (inb(brdp->iostatus) & ECH_INTRPEND) {
1495                 handled = 1;
1496                 for (bnknr = 0; bnknr < brdp->nrbnks; bnknr++) {
1497                         ioaddr = brdp->bnkstataddr[bnknr];
1498                         if (inb(ioaddr) & ECH_PNLINTRPEND) {
1499                                 panelp = brdp->bnk2panel[bnknr];
1500                                 (* panelp->isr)(panelp, (ioaddr & 0xfffc));
1501                         }
1502                 }
1503         }
1504
1505         outb((brdp->ioctrlval | ECH_BRDDISABLE), brdp->ioctrl);
1506
1507         return handled;
1508 }
1509
1510 /*****************************************************************************/
1511
1512 /*
1513  *      Interrupt service routine for ECH-MCA board types.
1514  */
1515
1516 static int stl_echmcaintr(struct stlbrd *brdp)
1517 {
1518         struct stlpanel *panelp;
1519         unsigned int    ioaddr, bnknr;
1520         int             handled = 0;
1521
1522         while (inb(brdp->iostatus) & ECH_INTRPEND) {
1523                 handled = 1;
1524                 for (bnknr = 0; bnknr < brdp->nrbnks; bnknr++) {
1525                         ioaddr = brdp->bnkstataddr[bnknr];
1526                         if (inb(ioaddr) & ECH_PNLINTRPEND) {
1527                                 panelp = brdp->bnk2panel[bnknr];
1528                                 (* panelp->isr)(panelp, (ioaddr & 0xfffc));
1529                         }
1530                 }
1531         }
1532         return handled;
1533 }
1534
1535 /*****************************************************************************/
1536
1537 /*
1538  *      Interrupt service routine for ECH-PCI board types.
1539  */
1540
1541 static int stl_echpciintr(struct stlbrd *brdp)
1542 {
1543         struct stlpanel *panelp;
1544         unsigned int    ioaddr, bnknr, recheck;
1545         int             handled = 0;
1546
1547         while (1) {
1548                 recheck = 0;
1549                 for (bnknr = 0; bnknr < brdp->nrbnks; bnknr++) {
1550                         outb(brdp->bnkpageaddr[bnknr], brdp->ioctrl);
1551                         ioaddr = brdp->bnkstataddr[bnknr];
1552                         if (inb(ioaddr) & ECH_PNLINTRPEND) {
1553                                 panelp = brdp->bnk2panel[bnknr];
1554                                 (* panelp->isr)(panelp, (ioaddr & 0xfffc));
1555                                 recheck++;
1556                                 handled = 1;
1557                         }
1558                 }
1559                 if (! recheck)
1560                         break;
1561         }
1562         return handled;
1563 }
1564
1565 /*****************************************************************************/
1566
1567 /*
1568  *      Interrupt service routine for ECH-8/64-PCI board types.
1569  */
1570
1571 static int stl_echpci64intr(struct stlbrd *brdp)
1572 {
1573         struct stlpanel *panelp;
1574         unsigned int    ioaddr, bnknr;
1575         int             handled = 0;
1576
1577         while (inb(brdp->ioctrl) & 0x1) {
1578                 handled = 1;
1579                 for (bnknr = 0; bnknr < brdp->nrbnks; bnknr++) {
1580                         ioaddr = brdp->bnkstataddr[bnknr];
1581                         if (inb(ioaddr) & ECH_PNLINTRPEND) {
1582                                 panelp = brdp->bnk2panel[bnknr];
1583                                 (* panelp->isr)(panelp, (ioaddr & 0xfffc));
1584                         }
1585                 }
1586         }
1587
1588         return handled;
1589 }
1590
1591 /*****************************************************************************/
1592
1593 /*
1594  *      Initialize all the ports on a panel.
1595  */
1596
1597 static int __devinit stl_initports(struct stlbrd *brdp, struct stlpanel *panelp)
1598 {
1599         struct stlport *portp;
1600         unsigned int i;
1601         int chipmask;
1602
1603         pr_debug("stl_initports(brdp=%p,panelp=%p)\n", brdp, panelp);
1604
1605         chipmask = stl_panelinit(brdp, panelp);
1606
1607 /*
1608  *      All UART's are initialized (if found!). Now go through and setup
1609  *      each ports data structures.
1610  */
1611         for (i = 0; i < panelp->nrports; i++) {
1612                 portp = kzalloc(sizeof(struct stlport), GFP_KERNEL);
1613                 if (!portp) {
1614                         printk("STALLION: failed to allocate memory "
1615                                 "(size=%Zd)\n", sizeof(struct stlport));
1616                         break;
1617                 }
1618                 tty_port_init(&portp->port);
1619                 portp->port.ops = &stl_port_ops;
1620                 portp->magic = STL_PORTMAGIC;
1621                 portp->portnr = i;
1622                 portp->brdnr = panelp->brdnr;
1623                 portp->panelnr = panelp->panelnr;
1624                 portp->uartp = panelp->uartp;
1625                 portp->clk = brdp->clk;
1626                 portp->baud_base = STL_BAUDBASE;
1627                 portp->close_delay = STL_CLOSEDELAY;
1628                 portp->closing_wait = 30 * HZ;
1629                 init_waitqueue_head(&portp->port.open_wait);
1630                 init_waitqueue_head(&portp->port.close_wait);
1631                 portp->stats.brd = portp->brdnr;
1632                 portp->stats.panel = portp->panelnr;
1633                 portp->stats.port = portp->portnr;
1634                 panelp->ports[i] = portp;
1635                 stl_portinit(brdp, panelp, portp);
1636         }
1637
1638         return 0;
1639 }
1640
1641 static void stl_cleanup_panels(struct stlbrd *brdp)
1642 {
1643         struct stlpanel *panelp;
1644         struct stlport *portp;
1645         unsigned int j, k;
1646         struct tty_struct *tty;
1647
1648         for (j = 0; j < STL_MAXPANELS; j++) {
1649                 panelp = brdp->panels[j];
1650                 if (panelp == NULL)
1651                         continue;
1652                 for (k = 0; k < STL_PORTSPERPANEL; k++) {
1653                         portp = panelp->ports[k];
1654                         if (portp == NULL)
1655                                 continue;
1656                         tty = tty_port_tty_get(&portp->port);
1657                         if (tty != NULL) {
1658                                 stl_hangup(tty);
1659                                 tty_kref_put(tty);
1660                         }
1661                         kfree(portp->tx.buf);
1662                         kfree(portp);
1663                 }
1664                 kfree(panelp);
1665         }
1666 }
1667
1668 /*****************************************************************************/
1669
1670 /*
1671  *      Try to find and initialize an EasyIO board.
1672  */
1673
1674 static int __devinit stl_initeio(struct stlbrd *brdp)
1675 {
1676         struct stlpanel *panelp;
1677         unsigned int    status;
1678         char            *name;
1679         int             retval;
1680
1681         pr_debug("stl_initeio(brdp=%p)\n", brdp);
1682
1683         brdp->ioctrl = brdp->ioaddr1 + 1;
1684         brdp->iostatus = brdp->ioaddr1 + 2;
1685
1686         status = inb(brdp->iostatus);
1687         if ((status & EIO_IDBITMASK) == EIO_MK3)
1688                 brdp->ioctrl++;
1689
1690 /*
1691  *      Handle board specific stuff now. The real difference is PCI
1692  *      or not PCI.
1693  */
1694         if (brdp->brdtype == BRD_EASYIOPCI) {
1695                 brdp->iosize1 = 0x80;
1696                 brdp->iosize2 = 0x80;
1697                 name = "serial(EIO-PCI)";
1698                 outb(0x41, (brdp->ioaddr2 + 0x4c));
1699         } else {
1700                 brdp->iosize1 = 8;
1701                 name = "serial(EIO)";
1702                 if ((brdp->irq < 0) || (brdp->irq > 15) ||
1703                     (stl_vecmap[brdp->irq] == (unsigned char) 0xff)) {
1704                         printk("STALLION: invalid irq=%d for brd=%d\n",
1705                                 brdp->irq, brdp->brdnr);
1706                         retval = -EINVAL;
1707                         goto err;
1708                 }
1709                 outb((stl_vecmap[brdp->irq] | EIO_0WS |
1710                         ((brdp->irqtype) ? EIO_INTLEVEL : EIO_INTEDGE)),
1711                         brdp->ioctrl);
1712         }
1713
1714         retval = -EBUSY;
1715         if (!request_region(brdp->ioaddr1, brdp->iosize1, name)) {
1716                 printk(KERN_WARNING "STALLION: Warning, board %d I/O address "
1717                         "%x conflicts with another device\n", brdp->brdnr, 
1718                         brdp->ioaddr1);
1719                 goto err;
1720         }
1721         
1722         if (brdp->iosize2 > 0)
1723                 if (!request_region(brdp->ioaddr2, brdp->iosize2, name)) {
1724                         printk(KERN_WARNING "STALLION: Warning, board %d I/O "
1725                                 "address %x conflicts with another device\n",
1726                                 brdp->brdnr, brdp->ioaddr2);
1727                         printk(KERN_WARNING "STALLION: Warning, also "
1728                                 "releasing board %d I/O address %x \n", 
1729                                 brdp->brdnr, brdp->ioaddr1);
1730                         goto err_rel1;
1731                 }
1732
1733 /*
1734  *      Everything looks OK, so let's go ahead and probe for the hardware.
1735  */
1736         brdp->clk = CD1400_CLK;
1737         brdp->isr = stl_eiointr;
1738
1739         retval = -ENODEV;
1740         switch (status & EIO_IDBITMASK) {
1741         case EIO_8PORTM:
1742                 brdp->clk = CD1400_CLK8M;
1743                 /* fall thru */
1744         case EIO_8PORTRS:
1745         case EIO_8PORTDI:
1746                 brdp->nrports = 8;
1747                 break;
1748         case EIO_4PORTRS:
1749                 brdp->nrports = 4;
1750                 break;
1751         case EIO_MK3:
1752                 switch (status & EIO_BRDMASK) {
1753                 case ID_BRD4:
1754                         brdp->nrports = 4;
1755                         break;
1756                 case ID_BRD8:
1757                         brdp->nrports = 8;
1758                         break;
1759                 case ID_BRD16:
1760                         brdp->nrports = 16;
1761                         break;
1762                 default:
1763                         goto err_rel2;
1764                 }
1765                 break;
1766         default:
1767                 goto err_rel2;
1768         }
1769
1770 /*
1771  *      We have verified that the board is actually present, so now we
1772  *      can complete the setup.
1773  */
1774
1775         panelp = kzalloc(sizeof(struct stlpanel), GFP_KERNEL);
1776         if (!panelp) {
1777                 printk(KERN_WARNING "STALLION: failed to allocate memory "
1778                         "(size=%Zd)\n", sizeof(struct stlpanel));
1779                 retval = -ENOMEM;
1780                 goto err_rel2;
1781         }
1782
1783         panelp->magic = STL_PANELMAGIC;
1784         panelp->brdnr = brdp->brdnr;
1785         panelp->panelnr = 0;
1786         panelp->nrports = brdp->nrports;
1787         panelp->iobase = brdp->ioaddr1;
1788         panelp->hwid = status;
1789         if ((status & EIO_IDBITMASK) == EIO_MK3) {
1790                 panelp->uartp = &stl_sc26198uart;
1791                 panelp->isr = stl_sc26198intr;
1792         } else {
1793                 panelp->uartp = &stl_cd1400uart;
1794                 panelp->isr = stl_cd1400eiointr;
1795         }
1796
1797         brdp->panels[0] = panelp;
1798         brdp->nrpanels = 1;
1799         brdp->state |= BRD_FOUND;
1800         brdp->hwid = status;
1801         if (request_irq(brdp->irq, stl_intr, IRQF_SHARED, name, brdp) != 0) {
1802                 printk("STALLION: failed to register interrupt "
1803                     "routine for %s irq=%d\n", name, brdp->irq);
1804                 retval = -ENODEV;
1805                 goto err_fr;
1806         }
1807
1808         return 0;
1809 err_fr:
1810         stl_cleanup_panels(brdp);
1811 err_rel2:
1812         if (brdp->iosize2 > 0)
1813                 release_region(brdp->ioaddr2, brdp->iosize2);
1814 err_rel1:
1815         release_region(brdp->ioaddr1, brdp->iosize1);
1816 err:
1817         return retval;
1818 }
1819
1820 /*****************************************************************************/
1821
1822 /*
1823  *      Try to find an ECH board and initialize it. This code is capable of
1824  *      dealing with all types of ECH board.
1825  */
1826
1827 static int __devinit stl_initech(struct stlbrd *brdp)
1828 {
1829         struct stlpanel *panelp;
1830         unsigned int    status, nxtid, ioaddr, conflict, panelnr, banknr, i;
1831         int             retval;
1832         char            *name;
1833
1834         pr_debug("stl_initech(brdp=%p)\n", brdp);
1835
1836         status = 0;
1837         conflict = 0;
1838
1839 /*
1840  *      Set up the initial board register contents for boards. This varies a
1841  *      bit between the different board types. So we need to handle each
1842  *      separately. Also do a check that the supplied IRQ is good.
1843  */
1844         switch (brdp->brdtype) {
1845
1846         case BRD_ECH:
1847                 brdp->isr = stl_echatintr;
1848                 brdp->ioctrl = brdp->ioaddr1 + 1;
1849                 brdp->iostatus = brdp->ioaddr1 + 1;
1850                 status = inb(brdp->iostatus);
1851                 if ((status & ECH_IDBITMASK) != ECH_ID) {
1852                         retval = -ENODEV;
1853                         goto err;
1854                 }
1855                 if ((brdp->irq < 0) || (brdp->irq > 15) ||
1856                     (stl_vecmap[brdp->irq] == (unsigned char) 0xff)) {
1857                         printk("STALLION: invalid irq=%d for brd=%d\n",
1858                                 brdp->irq, brdp->brdnr);
1859                         retval = -EINVAL;
1860                         goto err;
1861                 }
1862                 status = ((brdp->ioaddr2 & ECH_ADDR2MASK) >> 1);
1863                 status |= (stl_vecmap[brdp->irq] << 1);
1864                 outb((status | ECH_BRDRESET), brdp->ioaddr1);
1865                 brdp->ioctrlval = ECH_INTENABLE |
1866                         ((brdp->irqtype) ? ECH_INTLEVEL : ECH_INTEDGE);
1867                 for (i = 0; i < 10; i++)
1868                         outb((brdp->ioctrlval | ECH_BRDENABLE), brdp->ioctrl);
1869                 brdp->iosize1 = 2;
1870                 brdp->iosize2 = 32;
1871                 name = "serial(EC8/32)";
1872                 outb(status, brdp->ioaddr1);
1873                 break;
1874
1875         case BRD_ECHMC:
1876                 brdp->isr = stl_echmcaintr;
1877                 brdp->ioctrl = brdp->ioaddr1 + 0x20;
1878                 brdp->iostatus = brdp->ioctrl;
1879                 status = inb(brdp->iostatus);
1880                 if ((status & ECH_IDBITMASK) != ECH_ID) {
1881                         retval = -ENODEV;
1882                         goto err;
1883                 }
1884                 if ((brdp->irq < 0) || (brdp->irq > 15) ||
1885                     (stl_vecmap[brdp->irq] == (unsigned char) 0xff)) {
1886                         printk("STALLION: invalid irq=%d for brd=%d\n",
1887                                 brdp->irq, brdp->brdnr);
1888                         retval = -EINVAL;
1889                         goto err;
1890                 }
1891                 outb(ECHMC_BRDRESET, brdp->ioctrl);
1892                 outb(ECHMC_INTENABLE, brdp->ioctrl);
1893                 brdp->iosize1 = 64;
1894                 name = "serial(EC8/32-MC)";
1895                 break;
1896
1897         case BRD_ECHPCI:
1898                 brdp->isr = stl_echpciintr;
1899                 brdp->ioctrl = brdp->ioaddr1 + 2;
1900                 brdp->iosize1 = 4;
1901                 brdp->iosize2 = 8;
1902                 name = "serial(EC8/32-PCI)";
1903                 break;
1904
1905         case BRD_ECH64PCI:
1906                 brdp->isr = stl_echpci64intr;
1907                 brdp->ioctrl = brdp->ioaddr2 + 0x40;
1908                 outb(0x43, (brdp->ioaddr1 + 0x4c));
1909                 brdp->iosize1 = 0x80;
1910                 brdp->iosize2 = 0x80;
1911                 name = "serial(EC8/64-PCI)";
1912                 break;
1913
1914         default:
1915                 printk("STALLION: unknown board type=%d\n", brdp->brdtype);
1916                 retval = -EINVAL;
1917                 goto err;
1918         }
1919
1920 /*
1921  *      Check boards for possible IO address conflicts and return fail status 
1922  *      if an IO conflict found.
1923  */
1924         retval = -EBUSY;
1925         if (!request_region(brdp->ioaddr1, brdp->iosize1, name)) {
1926                 printk(KERN_WARNING "STALLION: Warning, board %d I/O address "
1927                         "%x conflicts with another device\n", brdp->brdnr, 
1928                         brdp->ioaddr1);
1929                 goto err;
1930         }
1931         
1932         if (brdp->iosize2 > 0)
1933                 if (!request_region(brdp->ioaddr2, brdp->iosize2, name)) {
1934                         printk(KERN_WARNING "STALLION: Warning, board %d I/O "
1935                                 "address %x conflicts with another device\n",
1936                                 brdp->brdnr, brdp->ioaddr2);
1937                         printk(KERN_WARNING "STALLION: Warning, also "
1938                                 "releasing board %d I/O address %x \n", 
1939                                 brdp->brdnr, brdp->ioaddr1);
1940                         goto err_rel1;
1941                 }
1942
1943 /*
1944  *      Scan through the secondary io address space looking for panels.
1945  *      As we find'em allocate and initialize panel structures for each.
1946  */
1947         brdp->clk = CD1400_CLK;
1948         brdp->hwid = status;
1949
1950         ioaddr = brdp->ioaddr2;
1951         banknr = 0;
1952         panelnr = 0;
1953         nxtid = 0;
1954
1955         for (i = 0; i < STL_MAXPANELS; i++) {
1956                 if (brdp->brdtype == BRD_ECHPCI) {
1957                         outb(nxtid, brdp->ioctrl);
1958                         ioaddr = brdp->ioaddr2;
1959                 }
1960                 status = inb(ioaddr + ECH_PNLSTATUS);
1961                 if ((status & ECH_PNLIDMASK) != nxtid)
1962                         break;
1963                 panelp = kzalloc(sizeof(struct stlpanel), GFP_KERNEL);
1964                 if (!panelp) {
1965                         printk("STALLION: failed to allocate memory "
1966                                 "(size=%Zd)\n", sizeof(struct stlpanel));
1967                         retval = -ENOMEM;
1968                         goto err_fr;
1969                 }
1970                 panelp->magic = STL_PANELMAGIC;
1971                 panelp->brdnr = brdp->brdnr;
1972                 panelp->panelnr = panelnr;
1973                 panelp->iobase = ioaddr;
1974                 panelp->pagenr = nxtid;
1975                 panelp->hwid = status;
1976                 brdp->bnk2panel[banknr] = panelp;
1977                 brdp->bnkpageaddr[banknr] = nxtid;
1978                 brdp->bnkstataddr[banknr++] = ioaddr + ECH_PNLSTATUS;
1979
1980                 if (status & ECH_PNLXPID) {
1981                         panelp->uartp = &stl_sc26198uart;
1982                         panelp->isr = stl_sc26198intr;
1983                         if (status & ECH_PNL16PORT) {
1984                                 panelp->nrports = 16;
1985                                 brdp->bnk2panel[banknr] = panelp;
1986                                 brdp->bnkpageaddr[banknr] = nxtid;
1987                                 brdp->bnkstataddr[banknr++] = ioaddr + 4 +
1988                                         ECH_PNLSTATUS;
1989                         } else
1990                                 panelp->nrports = 8;
1991                 } else {
1992                         panelp->uartp = &stl_cd1400uart;
1993                         panelp->isr = stl_cd1400echintr;
1994                         if (status & ECH_PNL16PORT) {
1995                                 panelp->nrports = 16;
1996                                 panelp->ackmask = 0x80;
1997                                 if (brdp->brdtype != BRD_ECHPCI)
1998                                         ioaddr += EREG_BANKSIZE;
1999                                 brdp->bnk2panel[banknr] = panelp;
2000                                 brdp->bnkpageaddr[banknr] = ++nxtid;
2001                                 brdp->bnkstataddr[banknr++] = ioaddr +
2002                                         ECH_PNLSTATUS;
2003                         } else {
2004                                 panelp->nrports = 8;
2005                                 panelp->ackmask = 0xc0;
2006                         }
2007                 }
2008
2009                 nxtid++;
2010                 ioaddr += EREG_BANKSIZE;
2011                 brdp->nrports += panelp->nrports;
2012                 brdp->panels[panelnr++] = panelp;
2013                 if ((brdp->brdtype != BRD_ECHPCI) &&
2014                     (ioaddr >= (brdp->ioaddr2 + brdp->iosize2))) {
2015                         retval = -EINVAL;
2016                         goto err_fr;
2017                 }
2018         }
2019
2020         brdp->nrpanels = panelnr;
2021         brdp->nrbnks = banknr;
2022         if (brdp->brdtype == BRD_ECH)
2023                 outb((brdp->ioctrlval | ECH_BRDDISABLE), brdp->ioctrl);
2024
2025         brdp->state |= BRD_FOUND;
2026         if (request_irq(brdp->irq, stl_intr, IRQF_SHARED, name, brdp) != 0) {
2027                 printk("STALLION: failed to register interrupt "
2028                     "routine for %s irq=%d\n", name, brdp->irq);
2029                 retval = -ENODEV;
2030                 goto err_fr;
2031         }
2032
2033         return 0;
2034 err_fr:
2035         stl_cleanup_panels(brdp);
2036         if (brdp->iosize2 > 0)
2037                 release_region(brdp->ioaddr2, brdp->iosize2);
2038 err_rel1:
2039         release_region(brdp->ioaddr1, brdp->iosize1);
2040 err:
2041         return retval;
2042 }
2043
2044 /*****************************************************************************/
2045
2046 /*
2047  *      Initialize and configure the specified board.
2048  *      Scan through all the boards in the configuration and see what we
2049  *      can find. Handle EIO and the ECH boards a little differently here
2050  *      since the initial search and setup is very different.
2051  */
2052
2053 static int __devinit stl_brdinit(struct stlbrd *brdp)
2054 {
2055         int i, retval;
2056
2057         pr_debug("stl_brdinit(brdp=%p)\n", brdp);
2058
2059         switch (brdp->brdtype) {
2060         case BRD_EASYIO:
2061         case BRD_EASYIOPCI:
2062                 retval = stl_initeio(brdp);
2063                 if (retval)
2064                         goto err;
2065                 break;
2066         case BRD_ECH:
2067         case BRD_ECHMC:
2068         case BRD_ECHPCI:
2069         case BRD_ECH64PCI:
2070                 retval = stl_initech(brdp);
2071                 if (retval)
2072                         goto err;
2073                 break;
2074         default:
2075                 printk("STALLION: board=%d is unknown board type=%d\n",
2076                         brdp->brdnr, brdp->brdtype);
2077                 retval = -ENODEV;
2078                 goto err;
2079         }
2080
2081         if ((brdp->state & BRD_FOUND) == 0) {
2082                 printk("STALLION: %s board not found, board=%d io=%x irq=%d\n",
2083                         stl_brdnames[brdp->brdtype], brdp->brdnr,
2084                         brdp->ioaddr1, brdp->irq);
2085                 goto err_free;
2086         }
2087
2088         for (i = 0; i < STL_MAXPANELS; i++)
2089                 if (brdp->panels[i] != NULL)
2090                         stl_initports(brdp, brdp->panels[i]);
2091
2092         printk("STALLION: %s found, board=%d io=%x irq=%d "
2093                 "nrpanels=%d nrports=%d\n", stl_brdnames[brdp->brdtype],
2094                 brdp->brdnr, brdp->ioaddr1, brdp->irq, brdp->nrpanels,
2095                 brdp->nrports);
2096
2097         return 0;
2098 err_free:
2099         free_irq(brdp->irq, brdp);
2100
2101         stl_cleanup_panels(brdp);
2102
2103         release_region(brdp->ioaddr1, brdp->iosize1);
2104         if (brdp->iosize2 > 0)
2105                 release_region(brdp->ioaddr2, brdp->iosize2);
2106 err:
2107         return retval;
2108 }
2109
2110 /*****************************************************************************/
2111
2112 /*
2113  *      Find the next available board number that is free.
2114  */
2115
2116 static int __devinit stl_getbrdnr(void)
2117 {
2118         unsigned int i;
2119
2120         for (i = 0; i < STL_MAXBRDS; i++)
2121                 if (stl_brds[i] == NULL) {
2122                         if (i >= stl_nrbrds)
2123                                 stl_nrbrds = i + 1;
2124                         return i;
2125                 }
2126
2127         return -1;
2128 }
2129
2130 /*****************************************************************************/
2131 /*
2132  *      We have a Stallion board. Allocate a board structure and
2133  *      initialize it. Read its IO and IRQ resources from PCI
2134  *      configuration space.
2135  */
2136
2137 static int __devinit stl_pciprobe(struct pci_dev *pdev,
2138                 const struct pci_device_id *ent)
2139 {
2140         struct stlbrd *brdp;
2141         unsigned int i, brdtype = ent->driver_data;
2142         int brdnr, retval = -ENODEV;
2143
2144         if ((pdev->class >> 8) == PCI_CLASS_STORAGE_IDE)
2145                 goto err;
2146
2147         retval = pci_enable_device(pdev);
2148         if (retval)
2149                 goto err;
2150         brdp = stl_allocbrd();
2151         if (brdp == NULL) {
2152                 retval = -ENOMEM;
2153                 goto err;
2154         }
2155         mutex_lock(&stl_brdslock);
2156         brdnr = stl_getbrdnr();
2157         if (brdnr < 0) {
2158                 dev_err(&pdev->dev, "too many boards found, "
2159                         "maximum supported %d\n", STL_MAXBRDS);
2160                 mutex_unlock(&stl_brdslock);
2161                 retval = -ENODEV;
2162                 goto err_fr;
2163         }
2164         brdp->brdnr = (unsigned int)brdnr;
2165         stl_brds[brdp->brdnr] = brdp;
2166         mutex_unlock(&stl_brdslock);
2167
2168         brdp->brdtype = brdtype;
2169         brdp->state |= STL_PROBED;
2170
2171 /*
2172  *      We have all resources from the board, so let's setup the actual
2173  *      board structure now.
2174  */
2175         switch (brdtype) {
2176         case BRD_ECHPCI:
2177                 brdp->ioaddr2 = pci_resource_start(pdev, 0);
2178                 brdp->ioaddr1 = pci_resource_start(pdev, 1);
2179                 break;
2180         case BRD_ECH64PCI:
2181                 brdp->ioaddr2 = pci_resource_start(pdev, 2);
2182                 brdp->ioaddr1 = pci_resource_start(pdev, 1);
2183                 break;
2184         case BRD_EASYIOPCI:
2185                 brdp->ioaddr1 = pci_resource_start(pdev, 2);
2186                 brdp->ioaddr2 = pci_resource_start(pdev, 1);
2187                 break;
2188         default:
2189                 dev_err(&pdev->dev, "unknown PCI board type=%u\n", brdtype);
2190                 break;
2191         }
2192
2193         brdp->irq = pdev->irq;
2194         retval = stl_brdinit(brdp);
2195         if (retval)
2196                 goto err_null;
2197
2198         pci_set_drvdata(pdev, brdp);
2199
2200         for (i = 0; i < brdp->nrports; i++)
2201                 tty_register_device(stl_serial,
2202                                 brdp->brdnr * STL_MAXPORTS + i, &pdev->dev);
2203
2204         return 0;
2205 err_null:
2206         stl_brds[brdp->brdnr] = NULL;
2207 err_fr:
2208         kfree(brdp);
2209 err:
2210         return retval;
2211 }
2212
2213 static void __devexit stl_pciremove(struct pci_dev *pdev)
2214 {
2215         struct stlbrd *brdp = pci_get_drvdata(pdev);
2216         unsigned int i;
2217
2218         free_irq(brdp->irq, brdp);
2219
2220         stl_cleanup_panels(brdp);
2221
2222         release_region(brdp->ioaddr1, brdp->iosize1);
2223         if (brdp->iosize2 > 0)
2224                 release_region(brdp->ioaddr2, brdp->iosize2);
2225
2226         for (i = 0; i < brdp->nrports; i++)
2227                 tty_unregister_device(stl_serial,
2228                                 brdp->brdnr * STL_MAXPORTS + i);
2229
2230         stl_brds[brdp->brdnr] = NULL;
2231         kfree(brdp);
2232 }
2233
2234 static struct pci_driver stl_pcidriver = {
2235         .name = "stallion",
2236         .id_table = stl_pcibrds,
2237         .probe = stl_pciprobe,
2238         .remove = __devexit_p(stl_pciremove)
2239 };
2240
2241 /*****************************************************************************/
2242
2243 /*
2244  *      Return the board stats structure to user app.
2245  */
2246
2247 static int stl_getbrdstats(combrd_t __user *bp)
2248 {
2249         combrd_t        stl_brdstats;
2250         struct stlbrd   *brdp;
2251         struct stlpanel *panelp;
2252         unsigned int i;
2253
2254         if (copy_from_user(&stl_brdstats, bp, sizeof(combrd_t)))
2255                 return -EFAULT;
2256         if (stl_brdstats.brd >= STL_MAXBRDS)
2257                 return -ENODEV;
2258         brdp = stl_brds[stl_brdstats.brd];
2259         if (brdp == NULL)
2260                 return -ENODEV;
2261
2262         memset(&stl_brdstats, 0, sizeof(combrd_t));
2263         stl_brdstats.brd = brdp->brdnr;
2264         stl_brdstats.type = brdp->brdtype;
2265         stl_brdstats.hwid = brdp->hwid;
2266         stl_brdstats.state = brdp->state;
2267         stl_brdstats.ioaddr = brdp->ioaddr1;
2268         stl_brdstats.ioaddr2 = brdp->ioaddr2;
2269         stl_brdstats.irq = brdp->irq;
2270         stl_brdstats.nrpanels = brdp->nrpanels;
2271         stl_brdstats.nrports = brdp->nrports;
2272         for (i = 0; i < brdp->nrpanels; i++) {
2273                 panelp = brdp->panels[i];
2274                 stl_brdstats.panels[i].panel = i;
2275                 stl_brdstats.panels[i].hwid = panelp->hwid;
2276                 stl_brdstats.panels[i].nrports = panelp->nrports;
2277         }
2278
2279         return copy_to_user(bp, &stl_brdstats, sizeof(combrd_t)) ? -EFAULT : 0;
2280 }
2281
2282 /*****************************************************************************/
2283
2284 /*
2285  *      Resolve the referenced port number into a port struct pointer.
2286  */
2287
2288 static struct stlport *stl_getport(int brdnr, int panelnr, int portnr)
2289 {
2290         struct stlbrd   *brdp;
2291         struct stlpanel *panelp;
2292
2293         if (brdnr < 0 || brdnr >= STL_MAXBRDS)
2294                 return NULL;
2295         brdp = stl_brds[brdnr];
2296         if (brdp == NULL)
2297                 return NULL;
2298         if (panelnr < 0 || (unsigned int)panelnr >= brdp->nrpanels)
2299                 return NULL;
2300         panelp = brdp->panels[panelnr];
2301         if (panelp == NULL)
2302                 return NULL;
2303         if (portnr < 0 || (unsigned int)portnr >= panelp->nrports)
2304                 return NULL;
2305         return panelp->ports[portnr];
2306 }
2307
2308 /*****************************************************************************/
2309
2310 /*
2311  *      Return the port stats structure to user app. A NULL port struct
2312  *      pointer passed in means that we need to find out from the app
2313  *      what port to get stats for (used through board control device).
2314  */
2315
2316 static int stl_getportstats(struct tty_struct *tty, struct stlport *portp, comstats_t __user *cp)
2317 {
2318         comstats_t      stl_comstats;
2319         unsigned char   *head, *tail;
2320         unsigned long   flags;
2321
2322         if (!portp) {
2323                 if (copy_from_user(&stl_comstats, cp, sizeof(comstats_t)))
2324                         return -EFAULT;
2325                 portp = stl_getport(stl_comstats.brd, stl_comstats.panel,
2326                         stl_comstats.port);
2327                 if (portp == NULL)
2328                         return -ENODEV;
2329         }
2330
2331         mutex_lock(&portp->port.mutex);
2332         portp->stats.state = portp->istate;
2333         portp->stats.flags = portp->port.flags;
2334         portp->stats.hwid = portp->hwid;
2335
2336         portp->stats.ttystate = 0;
2337         portp->stats.cflags = 0;
2338         portp->stats.iflags = 0;
2339         portp->stats.oflags = 0;
2340         portp->stats.lflags = 0;
2341         portp->stats.rxbuffered = 0;
2342
2343         spin_lock_irqsave(&stallion_lock, flags);
2344         if (tty != NULL && portp->port.tty == tty) {
2345                 portp->stats.ttystate = tty->flags;
2346                 /* No longer available as a statistic */
2347                 portp->stats.rxbuffered = 1; /*tty->flip.count; */
2348                 if (tty->termios != NULL) {
2349                         portp->stats.cflags = tty->termios->c_cflag;
2350                         portp->stats.iflags = tty->termios->c_iflag;
2351                         portp->stats.oflags = tty->termios->c_oflag;
2352                         portp->stats.lflags = tty->termios->c_lflag;
2353                 }
2354         }
2355         spin_unlock_irqrestore(&stallion_lock, flags);
2356
2357         head = portp->tx.head;
2358         tail = portp->tx.tail;
2359         portp->stats.txbuffered = (head >= tail) ? (head - tail) :
2360                 (STL_TXBUFSIZE - (tail - head));
2361
2362         portp->stats.signals = (unsigned long) stl_getsignals(portp);
2363         mutex_unlock(&portp->port.mutex);
2364
2365         return copy_to_user(cp, &portp->stats,
2366                             sizeof(comstats_t)) ? -EFAULT : 0;
2367 }
2368
2369 /*****************************************************************************/
2370
2371 /*
2372  *      Clear the port stats structure. We also return it zeroed out...
2373  */
2374
2375 static int stl_clrportstats(struct stlport *portp, comstats_t __user *cp)
2376 {
2377         comstats_t      stl_comstats;
2378
2379         if (!portp) {
2380                 if (copy_from_user(&stl_comstats, cp, sizeof(comstats_t)))
2381                         return -EFAULT;
2382                 portp = stl_getport(stl_comstats.brd, stl_comstats.panel,
2383                         stl_comstats.port);
2384                 if (portp == NULL)
2385                         return -ENODEV;
2386         }
2387
2388         mutex_lock(&portp->port.mutex);
2389         memset(&portp->stats, 0, sizeof(comstats_t));
2390         portp->stats.brd = portp->brdnr;
2391         portp->stats.panel = portp->panelnr;
2392         portp->stats.port = portp->portnr;
2393         mutex_unlock(&portp->port.mutex);
2394         return copy_to_user(cp, &portp->stats,
2395                             sizeof(comstats_t)) ? -EFAULT : 0;
2396 }
2397
2398 /*****************************************************************************/
2399
2400 /*
2401  *      Return the entire driver ports structure to a user app.
2402  */
2403
2404 static int stl_getportstruct(struct stlport __user *arg)
2405 {
2406         struct stlport  stl_dummyport;
2407         struct stlport  *portp;
2408
2409         if (copy_from_user(&stl_dummyport, arg, sizeof(struct stlport)))
2410                 return -EFAULT;
2411         portp = stl_getport(stl_dummyport.brdnr, stl_dummyport.panelnr,
2412                  stl_dummyport.portnr);
2413         if (!portp)
2414                 return -ENODEV;
2415         return copy_to_user(arg, portp, sizeof(struct stlport)) ? -EFAULT : 0;
2416 }
2417
2418 /*****************************************************************************/
2419
2420 /*
2421  *      Return the entire driver board structure to a user app.
2422  */
2423
2424 static int stl_getbrdstruct(struct stlbrd __user *arg)
2425 {
2426         struct stlbrd   stl_dummybrd;
2427         struct stlbrd   *brdp;
2428
2429         if (copy_from_user(&stl_dummybrd, arg, sizeof(struct stlbrd)))
2430                 return -EFAULT;
2431         if (stl_dummybrd.brdnr >= STL_MAXBRDS)
2432                 return -ENODEV;
2433         brdp = stl_brds[stl_dummybrd.brdnr];
2434         if (!brdp)
2435                 return -ENODEV;
2436         return copy_to_user(arg, brdp, sizeof(struct stlbrd)) ? -EFAULT : 0;
2437 }
2438
2439 /*****************************************************************************/
2440
2441 /*
2442  *      The "staliomem" device is also required to do some special operations
2443  *      on the board and/or ports. In this driver it is mostly used for stats
2444  *      collection.
2445  */
2446
2447 static long stl_memioctl(struct file *fp, unsigned int cmd, unsigned long arg)
2448 {
2449         int     brdnr, rc;
2450         void __user *argp = (void __user *)arg;
2451
2452         pr_debug("stl_memioctl(fp=%p,cmd=%x,arg=%lx)\n", fp, cmd,arg);
2453
2454         brdnr = iminor(fp->f_dentry->d_inode);
2455         if (brdnr >= STL_MAXBRDS)
2456                 return -ENODEV;
2457         rc = 0;
2458
2459         switch (cmd) {
2460         case COM_GETPORTSTATS:
2461                 rc = stl_getportstats(NULL, NULL, argp);
2462                 break;
2463         case COM_CLRPORTSTATS:
2464                 rc = stl_clrportstats(NULL, argp);
2465                 break;
2466         case COM_GETBRDSTATS:
2467                 rc = stl_getbrdstats(argp);
2468                 break;
2469         case COM_READPORT:
2470                 rc = stl_getportstruct(argp);
2471                 break;
2472         case COM_READBOARD:
2473                 rc = stl_getbrdstruct(argp);
2474                 break;
2475         default:
2476                 rc = -ENOIOCTLCMD;
2477                 break;
2478         }
2479         return rc;
2480 }
2481
2482 static const struct tty_operations stl_ops = {
2483         .open = stl_open,
2484         .close = stl_close,
2485         .write = stl_write,
2486         .put_char = stl_putchar,
2487         .flush_chars = stl_flushchars,
2488         .write_room = stl_writeroom,
2489         .chars_in_buffer = stl_charsinbuffer,
2490         .ioctl = stl_ioctl,
2491         .set_termios = stl_settermios,
2492         .throttle = stl_throttle,
2493         .unthrottle = stl_unthrottle,
2494         .stop = stl_stop,
2495         .start = stl_start,
2496         .hangup = stl_hangup,
2497         .flush_buffer = stl_flushbuffer,
2498         .break_ctl = stl_breakctl,
2499         .wait_until_sent = stl_waituntilsent,
2500         .send_xchar = stl_sendxchar,
2501         .tiocmget = stl_tiocmget,
2502         .tiocmset = stl_tiocmset,
2503         .proc_fops = &stl_proc_fops,
2504 };
2505
2506 static const struct tty_port_operations stl_port_ops = {
2507         .carrier_raised = stl_carrier_raised,
2508         .dtr_rts = stl_dtr_rts,
2509         .activate = stl_activate,
2510         .shutdown = stl_shutdown,
2511 };
2512
2513 /*****************************************************************************/
2514 /*                       CD1400 HARDWARE FUNCTIONS                           */
2515 /*****************************************************************************/
2516
2517 /*
2518  *      These functions get/set/update the registers of the cd1400 UARTs.
2519  *      Access to the cd1400 registers is via an address/data io port pair.
2520  *      (Maybe should make this inline...)
2521  */
2522
2523 static int stl_cd1400getreg(struct stlport *portp, int regnr)
2524 {
2525         outb((regnr + portp->uartaddr), portp->ioaddr);
2526         return inb(portp->ioaddr + EREG_DATA);
2527 }
2528
2529 static void stl_cd1400setreg(struct stlport *portp, int regnr, int value)
2530 {
2531         outb(regnr + portp->uartaddr, portp->ioaddr);
2532         outb(value, portp->ioaddr + EREG_DATA);
2533 }
2534
2535 static int stl_cd1400updatereg(struct stlport *portp, int regnr, int value)
2536 {
2537         outb(regnr + portp->uartaddr, portp->ioaddr);
2538         if (inb(portp->ioaddr + EREG_DATA) != value) {
2539                 outb(value, portp->ioaddr + EREG_DATA);
2540                 return 1;
2541         }
2542         return 0;
2543 }
2544
2545 /*****************************************************************************/
2546
2547 /*
2548  *      Inbitialize the UARTs in a panel. We don't care what sort of board
2549  *      these ports are on - since the port io registers are almost
2550  *      identical when dealing with ports.
2551  */
2552
2553 static int stl_cd1400panelinit(struct stlbrd *brdp, struct stlpanel *panelp)
2554 {
2555         unsigned int    gfrcr;
2556         int             chipmask, i, j;
2557         int             nrchips, uartaddr, ioaddr;
2558         unsigned long   flags;
2559
2560         pr_debug("stl_panelinit(brdp=%p,panelp=%p)\n", brdp, panelp);
2561
2562         spin_lock_irqsave(&brd_lock, flags);
2563         BRDENABLE(panelp->brdnr, panelp->pagenr);
2564
2565 /*
2566  *      Check that each chip is present and started up OK.
2567  */
2568         chipmask = 0;
2569         nrchips = panelp->nrports / CD1400_PORTS;
2570         for (i = 0; i < nrchips; i++) {
2571                 if (brdp->brdtype == BRD_ECHPCI) {
2572                         outb((panelp->pagenr + (i >> 1)), brdp->ioctrl);
2573                         ioaddr = panelp->iobase;
2574                 } else
2575                         ioaddr = panelp->iobase + (EREG_BANKSIZE * (i >> 1));
2576                 uartaddr = (i & 0x01) ? 0x080 : 0;
2577                 outb((GFRCR + uartaddr), ioaddr);
2578                 outb(0, (ioaddr + EREG_DATA));
2579                 outb((CCR + uartaddr), ioaddr);
2580                 outb(CCR_RESETFULL, (ioaddr + EREG_DATA));
2581                 outb(CCR_RESETFULL, (ioaddr + EREG_DATA));
2582                 outb((GFRCR + uartaddr), ioaddr);
2583                 for (j = 0; j < CCR_MAXWAIT; j++)
2584                         if ((gfrcr = inb(ioaddr + EREG_DATA)) != 0)
2585                                 break;
2586
2587                 if ((j >= CCR_MAXWAIT) || (gfrcr < 0x40) || (gfrcr > 0x60)) {
2588                         printk("STALLION: cd1400 not responding, "
2589                                 "brd=%d panel=%d chip=%d\n",
2590                                 panelp->brdnr, panelp->panelnr, i);
2591                         continue;
2592                 }
2593                 chipmask |= (0x1 << i);
2594                 outb((PPR + uartaddr), ioaddr);
2595                 outb(PPR_SCALAR, (ioaddr + EREG_DATA));
2596         }
2597
2598         BRDDISABLE(panelp->brdnr);
2599         spin_unlock_irqrestore(&brd_lock, flags);
2600         return chipmask;
2601 }
2602
2603 /*****************************************************************************/
2604
2605 /*
2606  *      Initialize hardware specific port registers.
2607  */
2608
2609 static void stl_cd1400portinit(struct stlbrd *brdp, struct stlpanel *panelp, struct stlport *portp)
2610 {
2611         unsigned long flags;
2612         pr_debug("stl_cd1400portinit(brdp=%p,panelp=%p,portp=%p)\n", brdp,
2613                         panelp, portp);
2614
2615         if ((brdp == NULL) || (panelp == NULL) ||
2616             (portp == NULL))
2617                 return;
2618
2619         spin_lock_irqsave(&brd_lock, flags);
2620         portp->ioaddr = panelp->iobase + (((brdp->brdtype == BRD_ECHPCI) ||
2621                 (portp->portnr < 8)) ? 0 : EREG_BANKSIZE);
2622         portp->uartaddr = (portp->portnr & 0x04) << 5;
2623         portp->pagenr = panelp->pagenr + (portp->portnr >> 3);
2624
2625         BRDENABLE(portp->brdnr, portp->pagenr);
2626         stl_cd1400setreg(portp, CAR, (portp->portnr & 0x03));
2627         stl_cd1400setreg(portp, LIVR, (portp->portnr << 3));
2628         portp->hwid = stl_cd1400getreg(portp, GFRCR);
2629         BRDDISABLE(portp->brdnr);
2630         spin_unlock_irqrestore(&brd_lock, flags);
2631 }
2632
2633 /*****************************************************************************/
2634
2635 /*
2636  *      Wait for the command register to be ready. We will poll this,
2637  *      since it won't usually take too long to be ready.
2638  */
2639
2640 static void stl_cd1400ccrwait(struct stlport *portp)
2641 {
2642         int     i;
2643
2644         for (i = 0; i < CCR_MAXWAIT; i++)
2645                 if (stl_cd1400getreg(portp, CCR) == 0)
2646                         return;
2647
2648         printk("STALLION: cd1400 not responding, port=%d panel=%d brd=%d\n",
2649                 portp->portnr, portp->panelnr, portp->brdnr);
2650 }
2651
2652 /*****************************************************************************/
2653
2654 /*
2655  *      Set up the cd1400 registers for a port based on the termios port
2656  *      settings.
2657  */
2658
2659 static void stl_cd1400setport(struct stlport *portp, struct ktermios *tiosp)
2660 {
2661         struct stlbrd   *brdp;
2662         unsigned long   flags;
2663         unsigned int    clkdiv, baudrate;
2664         unsigned char   cor1, cor2, cor3;
2665         unsigned char   cor4, cor5, ccr;
2666         unsigned char   srer, sreron, sreroff;
2667         unsigned char   mcor1, mcor2, rtpr;
2668         unsigned char   clk, div;
2669
2670         cor1 = 0;
2671         cor2 = 0;
2672         cor3 = 0;
2673         cor4 = 0;
2674         cor5 = 0;
2675         ccr = 0;
2676         rtpr = 0;
2677         clk = 0;
2678         div = 0;
2679         mcor1 = 0;
2680         mcor2 = 0;
2681         sreron = 0;
2682         sreroff = 0;
2683
2684         brdp = stl_brds[portp->brdnr];
2685         if (brdp == NULL)
2686                 return;
2687
2688 /*
2689  *      Set up the RX char ignore mask with those RX error types we
2690  *      can ignore. We can get the cd1400 to help us out a little here,
2691  *      it will ignore parity errors and breaks for us.
2692  */
2693         portp->rxignoremsk = 0;
2694         if (tiosp->c_iflag & IGNPAR) {
2695                 portp->rxignoremsk |= (ST_PARITY | ST_FRAMING | ST_OVERRUN);
2696                 cor1 |= COR1_PARIGNORE;
2697         }
2698         if (tiosp->c_iflag & IGNBRK) {
2699                 portp->rxignoremsk |= ST_BREAK;
2700                 cor4 |= COR4_IGNBRK;
2701         }
2702
2703         portp->rxmarkmsk = ST_OVERRUN;
2704         if (tiosp->c_iflag & (INPCK | PARMRK))
2705                 portp->rxmarkmsk |= (ST_PARITY | ST_FRAMING);
2706         if (tiosp->c_iflag & BRKINT)
2707                 portp->rxmarkmsk |= ST_BREAK;
2708
2709 /*
2710  *      Go through the char size, parity and stop bits and set all the
2711  *      option register appropriately.
2712  */
2713         switch (tiosp->c_cflag & CSIZE) {
2714         case CS5:
2715                 cor1 |= COR1_CHL5;
2716                 break;
2717         case CS6:
2718                 cor1 |= COR1_CHL6;
2719                 break;
2720         case CS7:
2721                 cor1 |= COR1_CHL7;
2722                 break;
2723         default:
2724                 cor1 |= COR1_CHL8;
2725                 break;
2726         }
2727
2728         if (tiosp->c_cflag & CSTOPB)
2729                 cor1 |= COR1_STOP2;
2730         else
2731                 cor1 |= COR1_STOP1;
2732
2733         if (tiosp->c_cflag & PARENB) {
2734                 if (tiosp->c_cflag & PARODD)
2735                         cor1 |= (COR1_PARENB | COR1_PARODD);
2736                 else
2737                         cor1 |= (COR1_PARENB | COR1_PAREVEN);
2738         } else {
2739                 cor1 |= COR1_PARNONE;
2740         }
2741
2742 /*
2743  *      Set the RX FIFO threshold at 6 chars. This gives a bit of breathing
2744  *      space for hardware flow control and the like. This should be set to
2745  *      VMIN. Also here we will set the RX data timeout to 10ms - this should
2746  *      really be based on VTIME.
2747  */
2748         cor3 |= FIFO_RXTHRESHOLD;
2749         rtpr = 2;
2750
2751 /*
2752  *      Calculate the baud rate timers. For now we will just assume that
2753  *      the input and output baud are the same. Could have used a baud
2754  *      table here, but this way we can generate virtually any baud rate
2755  *      we like!
2756  */
2757         baudrate = tiosp->c_cflag & CBAUD;
2758         if (baudrate & CBAUDEX) {
2759                 baudrate &= ~CBAUDEX;
2760                 if ((baudrate < 1) || (baudrate > 4))
2761                         tiosp->c_cflag &= ~CBAUDEX;
2762                 else
2763                         baudrate += 15;
2764         }
2765         baudrate = stl_baudrates[baudrate];
2766         if ((tiosp->c_cflag & CBAUD) == B38400) {
2767                 if ((portp->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_HI)
2768                         baudrate = 57600;
2769                 else if ((portp->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_VHI)
2770                         baudrate = 115200;
2771                 else if ((portp->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_SHI)
2772                         baudrate = 230400;
2773                 else if ((portp->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_WARP)
2774                         baudrate = 460800;
2775                 else if ((portp->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST)
2776                         baudrate = (portp->baud_base / portp->custom_divisor);
2777         }
2778         if (baudrate > STL_CD1400MAXBAUD)
2779                 baudrate = STL_CD1400MAXBAUD;
2780
2781         if (baudrate > 0) {
2782                 for (clk = 0; clk < CD1400_NUMCLKS; clk++) {
2783                         clkdiv = (portp->clk / stl_cd1400clkdivs[clk]) / baudrate;
2784                         if (clkdiv < 0x100)
2785                                 break;
2786                 }
2787                 div = (unsigned char) clkdiv;
2788         }
2789
2790 /*
2791  *      Check what form of modem signaling is required and set it up.
2792  */
2793         if ((tiosp->c_cflag & CLOCAL) == 0) {
2794                 mcor1 |= MCOR1_DCD;
2795                 mcor2 |= MCOR2_DCD;
2796                 sreron |= SRER_MODEM;
2797                 portp->port.flags |= ASYNC_CHECK_CD;
2798         } else
2799                 portp->port.flags &= ~ASYNC_CHECK_CD;
2800
2801 /*
2802  *      Setup cd1400 enhanced modes if we can. In particular we want to
2803  *      handle as much of the flow control as possible automatically. As
2804  *      well as saving a few CPU cycles it will also greatly improve flow
2805  *      control reliability.
2806  */
2807         if (tiosp->c_iflag & IXON) {
2808                 cor2 |= COR2_TXIBE;
2809                 cor3 |= COR3_SCD12;
2810                 if (tiosp->c_iflag & IXANY)
2811                         cor2 |= COR2_IXM;
2812         }
2813
2814         if (tiosp->c_cflag & CRTSCTS) {
2815                 cor2 |= COR2_CTSAE;
2816                 mcor1 |= FIFO_RTSTHRESHOLD;
2817         }
2818
2819 /*
2820  *      All cd1400 register values calculated so go through and set
2821  *      them all up.
2822  */
2823
2824         pr_debug("SETPORT: portnr=%d panelnr=%d brdnr=%d\n",
2825                 portp->portnr, portp->panelnr, portp->brdnr);
2826         pr_debug("    cor1=%x cor2=%x cor3=%x cor4=%x cor5=%x\n",
2827                 cor1, cor2, cor3, cor4, cor5);
2828         pr_debug("    mcor1=%x mcor2=%x rtpr=%x sreron=%x sreroff=%x\n",
2829                 mcor1, mcor2, rtpr, sreron, sreroff);
2830         pr_debug("    tcor=%x tbpr=%x rcor=%x rbpr=%x\n", clk, div, clk, div);
2831         pr_debug("    schr1=%x schr2=%x schr3=%x schr4=%x\n",
2832                 tiosp->c_cc[VSTART], tiosp->c_cc[VSTOP],
2833                 tiosp->c_cc[VSTART], tiosp->c_cc[VSTOP]);
2834
2835         spin_lock_irqsave(&brd_lock, flags);
2836         BRDENABLE(portp->brdnr, portp->pagenr);
2837         stl_cd1400setreg(portp, CAR, (portp->portnr & 0x3));
2838         srer = stl_cd1400getreg(portp, SRER);
2839         stl_cd1400setreg(portp, SRER, 0);
2840         if (stl_cd1400updatereg(portp, COR1, cor1))
2841                 ccr = 1;
2842         if (stl_cd1400updatereg(portp, COR2, cor2))
2843                 ccr = 1;
2844         if (stl_cd1400updatereg(portp, COR3, cor3))
2845                 ccr = 1;
2846         if (ccr) {
2847                 stl_cd1400ccrwait(portp);
2848                 stl_cd1400setreg(portp, CCR, CCR_CORCHANGE);
2849         }
2850         stl_cd1400setreg(portp, COR4, cor4);
2851         stl_cd1400setreg(portp, COR5, cor5);
2852         stl_cd1400setreg(portp, MCOR1, mcor1);
2853         stl_cd1400setreg(portp, MCOR2, mcor2);
2854         if (baudrate > 0) {
2855                 stl_cd1400setreg(portp, TCOR, clk);
2856                 stl_cd1400setreg(portp, TBPR, div);
2857                 stl_cd1400setreg(portp, RCOR, clk);
2858                 stl_cd1400setreg(portp, RBPR, div);
2859         }
2860         stl_cd1400setreg(portp, SCHR1, tiosp->c_cc[VSTART]);
2861         stl_cd1400setreg(portp, SCHR2, tiosp->c_cc[VSTOP]);
2862         stl_cd1400setreg(portp, SCHR3, tiosp->c_cc[VSTART]);
2863         stl_cd1400setreg(portp, SCHR4, tiosp->c_cc[VSTOP]);
2864         stl_cd1400setreg(portp, RTPR, rtpr);
2865         mcor1 = stl_cd1400getreg(portp, MSVR1);
2866         if (mcor1 & MSVR1_DCD)
2867                 portp->sigs |= TIOCM_CD;
2868         else
2869                 portp->sigs &= ~TIOCM_CD;
2870         stl_cd1400setreg(portp, SRER, ((srer & ~sreroff) | sreron));
2871         BRDDISABLE(portp->brdnr);
2872         spin_unlock_irqrestore(&brd_lock, flags);
2873 }
2874
2875 /*****************************************************************************/
2876
2877 /*
2878  *      Set the state of the DTR and RTS signals.
2879  */
2880
2881 static void stl_cd1400setsignals(struct stlport *portp, int dtr, int rts)
2882 {
2883         unsigned char   msvr1, msvr2;
2884         unsigned long   flags;
2885
2886         pr_debug("stl_cd1400setsignals(portp=%p,dtr=%d,rts=%d)\n",
2887                         portp, dtr, rts);
2888
2889         msvr1 = 0;
2890         msvr2 = 0;
2891         if (dtr > 0)
2892                 msvr1 = MSVR1_DTR;
2893         if (rts > 0)
2894                 msvr2 = MSVR2_RTS;
2895
2896         spin_lock_irqsave(&brd_lock, flags);
2897         BRDENABLE(portp->brdnr, portp->pagenr);
2898         stl_cd1400setreg(portp, CAR, (portp->portnr & 0x03));
2899         if (rts >= 0)
2900                 stl_cd1400setreg(portp, MSVR2, msvr2);
2901         if (dtr >= 0)
2902                 stl_cd1400setreg(portp, MSVR1, msvr1);
2903         BRDDISABLE(portp->brdnr);
2904         spin_unlock_irqrestore(&brd_lock, flags);
2905 }
2906
2907 /*****************************************************************************/
2908
2909 /*
2910  *      Return the state of the signals.
2911  */
2912
2913 static int stl_cd1400getsignals(struct stlport *portp)
2914 {
2915         unsigned char   msvr1, msvr2;
2916         unsigned long   flags;
2917         int             sigs;
2918
2919         pr_debug("stl_cd1400getsignals(portp=%p)\n", portp);
2920
2921         spin_lock_irqsave(&brd_lock, flags);
2922         BRDENABLE(portp->brdnr, portp->pagenr);
2923         stl_cd1400setreg(portp, CAR, (portp->portnr & 0x03));
2924         msvr1 = stl_cd1400getreg(portp, MSVR1);
2925         msvr2 = stl_cd1400getreg(portp, MSVR2);
2926         BRDDISABLE(portp->brdnr);
2927         spin_unlock_irqrestore(&brd_lock, flags);
2928
2929         sigs = 0;
2930         sigs |= (msvr1 & MSVR1_DCD) ? TIOCM_CD : 0;
2931         sigs |= (msvr1 & MSVR1_CTS) ? TIOCM_CTS : 0;
2932         sigs |= (msvr1 & MSVR1_DTR) ? TIOCM_DTR : 0;
2933         sigs |= (msvr2 & MSVR2_RTS) ? TIOCM_RTS : 0;
2934 #if 0
2935         sigs |= (msvr1 & MSVR1_RI) ? TIOCM_RI : 0;
2936         sigs |= (msvr1 & MSVR1_DSR) ? TIOCM_DSR : 0;
2937 #else
2938         sigs |= TIOCM_DSR;
2939 #endif
2940         return sigs;
2941 }
2942
2943 /*****************************************************************************/
2944
2945 /*
2946  *      Enable/Disable the Transmitter and/or Receiver.
2947  */
2948
2949 static void stl_cd1400enablerxtx(struct stlport *portp, int rx, int tx)
2950 {
2951         unsigned char   ccr;
2952         unsigned long   flags;
2953
2954         pr_debug("stl_cd1400enablerxtx(portp=%p,rx=%d,tx=%d)\n", portp, rx, tx);
2955
2956         ccr = 0;
2957
2958         if (tx == 0)
2959                 ccr |= CCR_TXDISABLE;
2960         else if (tx > 0)
2961                 ccr |= CCR_TXENABLE;
2962         if (rx == 0)
2963                 ccr |= CCR_RXDISABLE;
2964         else if (rx > 0)
2965                 ccr |= CCR_RXENABLE;
2966
2967         spin_lock_irqsave(&brd_lock, flags);
2968         BRDENABLE(portp->brdnr, portp->pagenr);
2969         stl_cd1400setreg(portp, CAR, (portp->portnr & 0x03));
2970         stl_cd1400ccrwait(portp);
2971         stl_cd1400setreg(portp, CCR, ccr);
2972         stl_cd1400ccrwait(portp);
2973         BRDDISABLE(portp->brdnr);
2974         spin_unlock_irqrestore(&brd_lock, flags);
2975 }
2976
2977 /*****************************************************************************/
2978
2979 /*
2980  *      Start/stop the Transmitter and/or Receiver.
2981  */
2982
2983 static void stl_cd1400startrxtx(struct stlport *portp, int rx, int tx)
2984 {
2985         unsigned char   sreron, sreroff;
2986         unsigned long   flags;
2987
2988         pr_debug("stl_cd1400startrxtx(portp=%p,rx=%d,tx=%d)\n", portp, rx, tx);
2989
2990         sreron = 0;
2991         sreroff = 0;
2992         if (tx == 0)
2993                 sreroff |= (SRER_TXDATA | SRER_TXEMPTY);
2994         else if (tx == 1)
2995                 sreron |= SRER_TXDATA;
2996         else if (tx >= 2)
2997                 sreron |= SRER_TXEMPTY;
2998         if (rx == 0)
2999                 sreroff |= SRER_RXDATA;
3000         else if (rx > 0)
3001                 sreron |= SRER_RXDATA;
3002
3003         spin_lock_irqsave(&brd_lock, flags);
3004         BRDENABLE(portp->brdnr, portp->pagenr);
3005         stl_cd1400setreg(portp, CAR, (portp->portnr & 0x03));
3006         stl_cd1400setreg(portp, SRER,
3007                 ((stl_cd1400getreg(portp, SRER) & ~sreroff) | sreron));
3008         BRDDISABLE(portp->brdnr);
3009         if (tx > 0)
3010                 set_bit(ASYI_TXBUSY, &portp->istate);
3011         spin_unlock_irqrestore(&brd_lock, flags);
3012 }
3013
3014 /*****************************************************************************/
3015
3016 /*
3017  *      Disable all interrupts from this port.
3018  */
3019
3020 static void stl_cd1400disableintrs(struct stlport *portp)
3021 {
3022         unsigned long   flags;
3023
3024         pr_debug("stl_cd1400disableintrs(portp=%p)\n", portp);
3025
3026         spin_lock_irqsave(&brd_lock, flags);
3027         BRDENABLE(portp->brdnr, portp->pagenr);
3028         stl_cd1400setreg(portp, CAR, (portp->portnr & 0x03));
3029         stl_cd1400setreg(portp, SRER, 0);
3030         BRDDISABLE(portp->brdnr);
3031         spin_unlock_irqrestore(&brd_lock, flags);
3032 }
3033
3034 /*****************************************************************************/
3035
3036 static void stl_cd1400sendbreak(struct stlport *portp, int len)
3037 {
3038         unsigned long   flags;
3039
3040         pr_debug("stl_cd1400sendbreak(portp=%p,len=%d)\n", portp, len);
3041
3042         spin_lock_irqsave(&brd_lock, flags);
3043         BRDENABLE(portp->brdnr, portp->pagenr);
3044         stl_cd1400setreg(portp, CAR, (portp->portnr & 0x03));
3045         stl_cd1400setreg(portp, SRER,
3046                 ((stl_cd1400getreg(portp, SRER) & ~SRER_TXDATA) |
3047                 SRER_TXEMPTY));
3048         BRDDISABLE(portp->brdnr);
3049         portp->brklen = len;
3050         if (len == 1)
3051                 portp->stats.txbreaks++;
3052         spin_unlock_irqrestore(&brd_lock, flags);
3053 }
3054
3055 /*****************************************************************************/
3056
3057 /*
3058  *      Take flow control actions...
3059  */
3060
3061 static void stl_cd1400flowctrl(struct stlport *portp, int state)
3062 {
3063         struct tty_struct       *tty;
3064         unsigned long           flags;
3065
3066         pr_debug("stl_cd1400flowctrl(portp=%p,state=%x)\n", portp, state);
3067
3068         if (portp == NULL)
3069                 return;
3070         tty = tty_port_tty_get(&portp->port);
3071         if (tty == NULL)
3072                 return;
3073
3074         spin_lock_irqsave(&brd_lock, flags);
3075         BRDENABLE(portp->brdnr, portp->pagenr);
3076         stl_cd1400setreg(portp, CAR, (portp->portnr & 0x03));
3077
3078         if (state) {
3079                 if (tty->termios->c_iflag & IXOFF) {
3080                         stl_cd1400ccrwait(portp);
3081                         stl_cd1400setreg(portp, CCR, CCR_SENDSCHR1);
3082                         portp->stats.rxxon++;
3083                         stl_cd1400ccrwait(portp);
3084                 }
3085 /*
3086  *              Question: should we return RTS to what it was before? It may
3087  *              have been set by an ioctl... Suppose not, since if you have
3088  *              hardware flow control set then it is pretty silly to go and
3089  *              set the RTS line by hand.
3090  */
3091                 if (tty->termios->c_cflag & CRTSCTS) {
3092                         stl_cd1400setreg(portp, MCOR1,
3093                                 (stl_cd1400getreg(portp, MCOR1) |
3094                                 FIFO_RTSTHRESHOLD));
3095                         stl_cd1400setreg(portp, MSVR2, MSVR2_RTS);
3096                         portp->stats.rxrtson++;
3097                 }
3098         } else {
3099                 if (tty->termios->c_iflag & IXOFF) {
3100                         stl_cd1400ccrwait(portp);
3101                         stl_cd1400setreg(portp, CCR, CCR_SENDSCHR2);
3102                         portp->stats.rxxoff++;
3103                         stl_cd1400ccrwait(portp);
3104                 }
3105                 if (tty->termios->c_cflag & CRTSCTS) {
3106                         stl_cd1400setreg(portp, MCOR1,
3107                                 (stl_cd1400getreg(portp, MCOR1) & 0xf0));
3108                         stl_cd1400setreg(portp, MSVR2, 0);
3109                         portp->stats.rxrtsoff++;
3110                 }
3111         }
3112
3113         BRDDISABLE(portp->brdnr);
3114         spin_unlock_irqrestore(&brd_lock, flags);
3115         tty_kref_put(tty);
3116 }
3117
3118 /*****************************************************************************/
3119
3120 /*
3121  *      Send a flow control character...
3122  */
3123
3124 static void stl_cd1400sendflow(struct stlport *portp, int state)
3125 {
3126         struct tty_struct       *tty;
3127         unsigned long           flags;
3128
3129         pr_debug("stl_cd1400sendflow(portp=%p,state=%x)\n", portp, state);
3130
3131         if (portp == NULL)
3132                 return;
3133         tty = tty_port_tty_get(&portp->port);
3134         if (tty == NULL)
3135                 return;
3136
3137         spin_lock_irqsave(&brd_lock, flags);
3138         BRDENABLE(portp->brdnr, portp->pagenr);
3139         stl_cd1400setreg(portp, CAR, (portp->portnr & 0x03));
3140         if (state) {
3141                 stl_cd1400ccrwait(portp);
3142                 stl_cd1400setreg(portp, CCR, CCR_SENDSCHR1);
3143                 portp->stats.rxxon++;
3144                 stl_cd1400ccrwait(portp);
3145         } else {
3146                 stl_cd1400ccrwait(portp);
3147                 stl_cd1400setreg(portp, CCR, CCR_SENDSCHR2);
3148                 portp->stats.rxxoff++;
3149                 stl_cd1400ccrwait(portp);
3150         }
3151         BRDDISABLE(portp->brdnr);
3152         spin_unlock_irqrestore(&brd_lock, flags);
3153         tty_kref_put(tty);
3154 }
3155
3156 /*****************************************************************************/
3157
3158 static void stl_cd1400flush(struct stlport *portp)
3159 {
3160         unsigned long   flags;
3161
3162         pr_debug("stl_cd1400flush(portp=%p)\n", portp);
3163
3164         if (portp == NULL)
3165                 return;
3166
3167         spin_lock_irqsave(&brd_lock, flags);
3168         BRDENABLE(portp->brdnr, portp->pagenr);
3169         stl_cd1400setreg(portp, CAR, (portp->portnr & 0x03));
3170         stl_cd1400ccrwait(portp);
3171         stl_cd1400setreg(portp, CCR, CCR_TXFLUSHFIFO);
3172         stl_cd1400ccrwait(portp);
3173         portp->tx.tail = portp->tx.head;
3174         BRDDISABLE(portp->brdnr);
3175         spin_unlock_irqrestore(&brd_lock, flags);
3176 }
3177
3178 /*****************************************************************************/
3179
3180 /*
3181  *      Return the current state of data flow on this port. This is only
3182  *      really interesting when determining if data has fully completed
3183  *      transmission or not... This is easy for the cd1400, it accurately
3184  *      maintains the busy port flag.
3185  */
3186
3187 static int stl_cd1400datastate(struct stlport *portp)
3188 {
3189         pr_debug("stl_cd1400datastate(portp=%p)\n", portp);
3190
3191         if (portp == NULL)
3192                 return 0;
3193
3194         return test_bit(ASYI_TXBUSY, &portp->istate) ? 1 : 0;
3195 }
3196
3197 /*****************************************************************************/
3198
3199 /*
3200  *      Interrupt service routine for cd1400 EasyIO boards.
3201  */
3202
3203 static void stl_cd1400eiointr(struct stlpanel *panelp, unsigned int iobase)
3204 {
3205         unsigned char   svrtype;
3206
3207         pr_debug("stl_cd1400eiointr(panelp=%p,iobase=%x)\n", panelp, iobase);
3208
3209         spin_lock(&brd_lock);
3210         outb(SVRR, iobase);
3211         svrtype = inb(iobase + EREG_DATA);
3212         if (panelp->nrports > 4) {
3213                 outb((SVRR + 0x80), iobase);
3214                 svrtype |= inb(iobase + EREG_DATA);
3215         }
3216
3217         if (svrtype & SVRR_RX)
3218                 stl_cd1400rxisr(panelp, iobase);
3219         else if (svrtype & SVRR_TX)
3220                 stl_cd1400txisr(panelp, iobase);
3221         else if (svrtype & SVRR_MDM)
3222                 stl_cd1400mdmisr(panelp, iobase);
3223
3224         spin_unlock(&brd_lock);
3225 }
3226
3227 /*****************************************************************************/
3228
3229 /*
3230  *      Interrupt service routine for cd1400 panels.
3231  */
3232
3233 static void stl_cd1400echintr(struct stlpanel *panelp, unsigned int iobase)
3234 {
3235         unsigned char   svrtype;
3236
3237         pr_debug("stl_cd1400echintr(panelp=%p,iobase=%x)\n", panelp, iobase);
3238
3239         outb(SVRR, iobase);
3240         svrtype = inb(iobase + EREG_DATA);
3241         outb((SVRR + 0x80), iobase);
3242         svrtype |= inb(iobase + EREG_DATA);
3243         if (svrtype & SVRR_RX)
3244                 stl_cd1400rxisr(panelp, iobase);
3245         else if (svrtype & SVRR_TX)
3246                 stl_cd1400txisr(panelp, iobase);
3247         else if (svrtype & SVRR_MDM)
3248                 stl_cd1400mdmisr(panelp, iobase);
3249 }
3250
3251
3252 /*****************************************************************************/
3253
3254 /*
3255  *      Unfortunately we need to handle breaks in the TX data stream, since
3256  *      this is the only way to generate them on the cd1400.
3257  */
3258
3259 static int stl_cd1400breakisr(struct stlport *portp, int ioaddr)
3260 {
3261         if (portp->brklen == 1) {
3262                 outb((COR2 + portp->uartaddr), ioaddr);
3263                 outb((inb(ioaddr + EREG_DATA) | COR2_ETC),
3264                         (ioaddr + EREG_DATA));
3265                 outb((TDR + portp->uartaddr), ioaddr);
3266                 outb(ETC_CMD, (ioaddr + EREG_DATA));
3267                 outb(ETC_STARTBREAK, (ioaddr + EREG_DATA));
3268                 outb((SRER + portp->uartaddr), ioaddr);
3269                 outb((inb(ioaddr + EREG_DATA) & ~(SRER_TXDATA | SRER_TXEMPTY)),
3270                         (ioaddr + EREG_DATA));
3271                 return 1;
3272         } else if (portp->brklen > 1) {
3273                 outb((TDR + portp->uartaddr), ioaddr);
3274                 outb(ETC_CMD, (ioaddr + EREG_DATA));
3275                 outb(ETC_STOPBREAK, (ioaddr + EREG_DATA));
3276                 portp->brklen = -1;
3277                 return 1;
3278         } else {
3279                 outb((COR2 + portp->uartaddr), ioaddr);
3280                 outb((inb(ioaddr + EREG_DATA) & ~COR2_ETC),
3281                         (ioaddr + EREG_DATA));
3282                 portp->brklen = 0;
3283         }
3284         return 0;
3285 }
3286
3287 /*****************************************************************************/
3288
3289 /*
3290  *      Transmit interrupt handler. This has gotta be fast!  Handling TX
3291  *      chars is pretty simple, stuff as many as possible from the TX buffer
3292  *      into the cd1400 FIFO. Must also handle TX breaks here, since they
3293  *      are embedded as commands in the data stream. Oh no, had to use a goto!
3294  *      This could be optimized more, will do when I get time...
3295  *      In practice it is possible that interrupts are enabled but that the
3296  *      port has been hung up. Need to handle not having any TX buffer here,
3297  *      this is done by using the side effect that head and tail will also
3298  *      be NULL if the buffer has been freed.
3299  */
3300
3301 static void stl_cd1400txisr(struct stlpanel *panelp, int ioaddr)
3302 {
3303         struct stlport  *portp;
3304         int             len, stlen;
3305         char            *head, *tail;
3306         unsigned char   ioack, srer;
3307         struct tty_struct *tty;
3308
3309         pr_debug("stl_cd1400txisr(panelp=%p,ioaddr=%x)\n", panelp, ioaddr);
3310
3311         ioack = inb(ioaddr + EREG_TXACK);
3312         if (((ioack & panelp->ackmask) != 0) ||
3313             ((ioack & ACK_TYPMASK) != ACK_TYPTX)) {
3314                 printk("STALLION: bad TX interrupt ack value=%x\n", ioack);
3315                 return;
3316         }
3317         portp = panelp->ports[(ioack >> 3)];
3318
3319 /*
3320  *      Unfortunately we need to handle breaks in the data stream, since
3321  *      this is the only way to generate them on the cd1400. Do it now if
3322  *      a break is to be sent.
3323  */
3324         if (portp->brklen != 0)
3325                 if (stl_cd1400breakisr(portp, ioaddr))
3326                         goto stl_txalldone;
3327
3328         head = portp->tx.head;
3329         tail = portp->tx.tail;
3330         len = (head >= tail) ? (head - tail) : (STL_TXBUFSIZE - (tail - head));
3331         if ((len == 0) || ((len < STL_TXBUFLOW) &&
3332             (test_bit(ASYI_TXLOW, &portp->istate) == 0))) {
3333                 set_bit(ASYI_TXLOW, &portp->istate);
3334                 tty = tty_port_tty_get(&portp->port);
3335                 if (tty) {
3336                         tty_wakeup(tty);
3337                         tty_kref_put(tty);
3338                 }
3339         }
3340
3341         if (len == 0) {
3342                 outb((SRER + portp->uartaddr), ioaddr);
3343                 srer = inb(ioaddr + EREG_DATA);
3344                 if (srer & SRER_TXDATA) {
3345                         srer = (srer & ~SRER_TXDATA) | SRER_TXEMPTY;
3346                 } else {
3347                         srer &= ~(SRER_TXDATA | SRER_TXEMPTY);
3348                         clear_bit(ASYI_TXBUSY, &portp->istate);
3349                 }
3350                 outb(srer, (ioaddr + EREG_DATA));
3351         } else {
3352                 len = min(len, CD1400_TXFIFOSIZE);
3353                 portp->stats.txtotal += len;
3354                 stlen = min_t(unsigned int, len,
3355                                 (portp->tx.buf + STL_TXBUFSIZE) - tail);
3356                 outb((TDR + portp->uartaddr), ioaddr);
3357                 outsb((ioaddr + EREG_DATA), tail, stlen);
3358                 len -= stlen;
3359                 tail += stlen;
3360                 if (tail >= (portp->tx.buf + STL_TXBUFSIZE))
3361                         tail = portp->tx.buf;
3362                 if (len > 0) {
3363                         outsb((ioaddr + EREG_DATA), tail, len);
3364                         tail += len;
3365                 }
3366                 portp->tx.tail = tail;
3367         }
3368
3369 stl_txalldone:
3370         outb((EOSRR + portp->uartaddr), ioaddr);
3371         outb(0, (ioaddr + EREG_DATA));
3372 }
3373
3374 /*****************************************************************************/
3375
3376 /*
3377  *      Receive character interrupt handler. Determine if we have good chars
3378  *      or bad chars and then process appropriately. Good chars are easy
3379  *      just shove the lot into the RX buffer and set all status byte to 0.
3380  *      If a bad RX char then process as required. This routine needs to be
3381  *      fast!  In practice it is possible that we get an interrupt on a port
3382  *      that is closed. This can happen on hangups - since they completely
3383  *      shutdown a port not in user context. Need to handle this case.
3384  */
3385
3386 static void stl_cd1400rxisr(struct stlpanel *panelp, int ioaddr)
3387 {
3388         struct stlport          *portp;
3389         struct tty_struct       *tty;
3390         unsigned int            ioack, len, buflen;
3391         unsigned char           status;
3392         char                    ch;
3393
3394         pr_debug("stl_cd1400rxisr(panelp=%p,ioaddr=%x)\n", panelp, ioaddr);
3395
3396         ioack = inb(ioaddr + EREG_RXACK);
3397         if ((ioack & panelp->ackmask) != 0) {
3398                 printk("STALLION: bad RX interrupt ack value=%x\n", ioack);
3399                 return;
3400         }
3401         portp = panelp->ports[(ioack >> 3)];
3402         tty = tty_port_tty_get(&portp->port);
3403
3404         if ((ioack & ACK_TYPMASK) == ACK_TYPRXGOOD) {
3405                 outb((RDCR + portp->uartaddr), ioaddr);
3406                 len = inb(ioaddr + EREG_DATA);
3407                 if (tty == NULL || (buflen = tty_buffer_request_room(tty, len)) == 0) {
3408                         len = min_t(unsigned int, len, sizeof(stl_unwanted));
3409                         outb((RDSR + portp->uartaddr), ioaddr);
3410                         insb((ioaddr + EREG_DATA), &stl_unwanted[0], len);
3411                         portp->stats.rxlost += len;
3412                         portp->stats.rxtotal += len;
3413                 } else {
3414                         len = min(len, buflen);
3415                         if (len > 0) {
3416                                 unsigned char *ptr;
3417                                 outb((RDSR + portp->uartaddr), ioaddr);
3418                                 tty_prepare_flip_string(tty, &ptr, len);
3419                                 insb((ioaddr + EREG_DATA), ptr, len);
3420                                 tty_schedule_flip(tty);
3421                                 portp->stats.rxtotal += len;
3422                         }
3423                 }
3424         } else if ((ioack & ACK_TYPMASK) == ACK_TYPRXBAD) {
3425                 outb((RDSR + portp->uartaddr), ioaddr);
3426                 status = inb(ioaddr + EREG_DATA);
3427                 ch = inb(ioaddr + EREG_DATA);
3428                 if (status & ST_PARITY)
3429                         portp->stats.rxparity++;
3430                 if (status & ST_FRAMING)
3431                         portp->stats.rxframing++;
3432                 if (status & ST_OVERRUN)
3433                         portp->stats.rxoverrun++;
3434                 if (status & ST_BREAK)
3435                         portp->stats.rxbreaks++;
3436                 if (status & ST_SCHARMASK) {
3437                         if ((status & ST_SCHARMASK) == ST_SCHAR1)
3438                                 portp->stats.txxon++;
3439                         if ((status & ST_SCHARMASK) == ST_SCHAR2)
3440                                 portp->stats.txxoff++;
3441                         goto stl_rxalldone;
3442                 }
3443                 if (tty != NULL && (portp->rxignoremsk & status) == 0) {
3444                         if (portp->rxmarkmsk & status) {
3445                                 if (status & ST_BREAK) {
3446                                         status = TTY_BREAK;
3447                                         if (portp->port.flags & ASYNC_SAK) {
3448                                                 do_SAK(tty);
3449                                                 BRDENABLE(portp->brdnr, portp->pagenr);
3450                                         }
3451                                 } else if (status & ST_PARITY)
3452                                         status = TTY_PARITY;
3453                                 else if (status & ST_FRAMING)
3454                                         status = TTY_FRAME;
3455                                 else if(status & ST_OVERRUN)
3456                                         status = TTY_OVERRUN;
3457                                 else
3458                                         status = 0;
3459                         } else
3460                                 status = 0;
3461                         tty_insert_flip_char(tty, ch, status);
3462                         tty_schedule_flip(tty);
3463                 }
3464         } else {
3465                 printk("STALLION: bad RX interrupt ack value=%x\n", ioack);
3466                 tty_kref_put(tty);
3467                 return;
3468         }
3469
3470 stl_rxalldone:
3471         tty_kref_put(tty);
3472         outb((EOSRR + portp->uartaddr), ioaddr);
3473         outb(0, (ioaddr + EREG_DATA));
3474 }
3475
3476 /*****************************************************************************/
3477
3478 /*
3479  *      Modem interrupt handler. The is called when the modem signal line
3480  *      (DCD) has changed state. Leave most of the work to the off-level
3481  *      processing routine.
3482  */
3483
3484 static void stl_cd1400mdmisr(struct stlpanel *panelp, int ioaddr)
3485 {
3486         struct stlport  *portp;
3487         unsigned int    ioack;
3488         unsigned char   misr;
3489
3490         pr_debug("stl_cd1400mdmisr(panelp=%p)\n", panelp);
3491
3492         ioack = inb(ioaddr + EREG_MDACK);
3493         if (((ioack & panelp->ackmask) != 0) ||
3494             ((ioack & ACK_TYPMASK) != ACK_TYPMDM)) {
3495                 printk("STALLION: bad MODEM interrupt ack value=%x\n", ioack);
3496                 return;
3497         }
3498         portp = panelp->ports[(ioack >> 3)];
3499
3500         outb((MISR + portp->uartaddr), ioaddr);
3501         misr = inb(ioaddr + EREG_DATA);
3502         if (misr & MISR_DCD) {
3503                 stl_cd_change(portp);
3504                 portp->stats.modem++;
3505         }
3506
3507         outb((EOSRR + portp->uartaddr), ioaddr);
3508         outb(0, (ioaddr + EREG_DATA));
3509 }
3510
3511 /*****************************************************************************/
3512 /*                      SC26198 HARDWARE FUNCTIONS                           */
3513 /*****************************************************************************/
3514
3515 /*
3516  *      These functions get/set/update the registers of the sc26198 UARTs.
3517  *      Access to the sc26198 registers is via an address/data io port pair.
3518  *      (Maybe should make this inline...)
3519  */
3520
3521 static int stl_sc26198getreg(struct stlport *portp, int regnr)
3522 {
3523         outb((regnr | portp->uartaddr), (portp->ioaddr + XP_ADDR));
3524         return inb(portp->ioaddr + XP_DATA);
3525 }
3526
3527 static void stl_sc26198setreg(struct stlport *portp, int regnr, int value)
3528 {
3529         outb((regnr | portp->uartaddr), (portp->ioaddr + XP_ADDR));
3530         outb(value, (portp->ioaddr + XP_DATA));
3531 }
3532
3533 static int stl_sc26198updatereg(struct stlport *portp, int regnr, int value)
3534 {
3535         outb((regnr | portp->uartaddr), (portp->ioaddr + XP_ADDR));
3536         if (inb(portp->ioaddr + XP_DATA) != value) {
3537                 outb(value, (portp->ioaddr + XP_DATA));
3538                 return 1;
3539         }
3540         return 0;
3541 }
3542
3543 /*****************************************************************************/
3544
3545 /*
3546  *      Functions to get and set the sc26198 global registers.
3547  */
3548
3549 static int stl_sc26198getglobreg(struct stlport *portp, int regnr)
3550 {
3551         outb(regnr, (portp->ioaddr + XP_ADDR));
3552         return inb(portp->ioaddr + XP_DATA);
3553 }
3554
3555 #if 0
3556 static void stl_sc26198setglobreg(struct stlport *portp, int regnr, int value)
3557 {
3558         outb(regnr, (portp->ioaddr + XP_ADDR));
3559         outb(value, (portp->ioaddr + XP_DATA));
3560 }
3561 #endif
3562
3563 /*****************************************************************************/
3564
3565 /*
3566  *      Inbitialize the UARTs in a panel. We don't care what sort of board
3567  *      these ports are on - since the port io registers are almost
3568  *      identical when dealing with ports.
3569  */
3570
3571 static int stl_sc26198panelinit(struct stlbrd *brdp, struct stlpanel *panelp)
3572 {
3573         int     chipmask, i;
3574         int     nrchips, ioaddr;
3575
3576         pr_debug("stl_sc26198panelinit(brdp=%p,panelp=%p)\n", brdp, panelp);
3577
3578         BRDENABLE(panelp->brdnr, panelp->pagenr);
3579
3580 /*
3581  *      Check that each chip is present and started up OK.
3582  */
3583         chipmask = 0;
3584         nrchips = (panelp->nrports + 4) / SC26198_PORTS;
3585         if (brdp->brdtype == BRD_ECHPCI)
3586                 outb(panelp->pagenr, brdp->ioctrl);
3587
3588         for (i = 0; i < nrchips; i++) {
3589                 ioaddr = panelp->iobase + (i * 4); 
3590                 outb(SCCR, (ioaddr + XP_ADDR));
3591                 outb(CR_RESETALL, (ioaddr + XP_DATA));
3592                 outb(TSTR, (ioaddr + XP_ADDR));
3593                 if (inb(ioaddr + XP_DATA) != 0) {
3594                         printk("STALLION: sc26198 not responding, "
3595                                 "brd=%d panel=%d chip=%d\n",
3596                                 panelp->brdnr, panelp->panelnr, i);
3597                         continue;
3598                 }
3599                 chipmask |= (0x1 << i);
3600                 outb(GCCR, (ioaddr + XP_ADDR));
3601                 outb(GCCR_IVRTYPCHANACK, (ioaddr + XP_DATA));
3602                 outb(WDTRCR, (ioaddr + XP_ADDR));
3603                 outb(0xff, (ioaddr + XP_DATA));
3604         }
3605
3606         BRDDISABLE(panelp->brdnr);
3607         return chipmask;
3608 }
3609
3610 /*****************************************************************************/
3611
3612 /*
3613  *      Initialize hardware specific port registers.
3614  */
3615
3616 static void stl_sc26198portinit(struct stlbrd *brdp, struct stlpanel *panelp, struct stlport *portp)
3617 {
3618         pr_debug("stl_sc26198portinit(brdp=%p,panelp=%p,portp=%p)\n", brdp,
3619                         panelp, portp);
3620
3621         if ((brdp == NULL) || (panelp == NULL) ||
3622             (portp == NULL))
3623                 return;
3624
3625         portp->ioaddr = panelp->iobase + ((portp->portnr < 8) ? 0 : 4);
3626         portp->uartaddr = (portp->portnr & 0x07) << 4;
3627         portp->pagenr = panelp->pagenr;
3628         portp->hwid = 0x1;
3629
3630         BRDENABLE(portp->brdnr, portp->pagenr);
3631         stl_sc26198setreg(portp, IOPCR, IOPCR_SETSIGS);
3632         BRDDISABLE(portp->brdnr);
3633 }
3634
3635 /*****************************************************************************/
3636
3637 /*
3638  *      Set up the sc26198 registers for a port based on the termios port
3639  *      settings.
3640  */
3641
3642 static void stl_sc26198setport(struct stlport *portp, struct ktermios *tiosp)
3643 {
3644         struct stlbrd   *brdp;
3645         unsigned long   flags;
3646         unsigned int    baudrate;
3647         unsigned char   mr0, mr1, mr2, clk;
3648         unsigned char   imron, imroff, iopr, ipr;
3649
3650         mr0 = 0;
3651         mr1 = 0;
3652         mr2 = 0;
3653         clk = 0;
3654         iopr = 0;
3655         imron = 0;
3656         imroff = 0;
3657
3658         brdp = stl_brds[portp->brdnr];
3659         if (brdp == NULL)
3660                 return;
3661
3662 /*
3663  *      Set up the RX char ignore mask with those RX error types we
3664  *      can ignore.
3665  */
3666         portp->rxignoremsk = 0;
3667         if (tiosp->c_iflag & IGNPAR)
3668                 portp->rxignoremsk |= (SR_RXPARITY | SR_RXFRAMING |
3669                         SR_RXOVERRUN);
3670         if (tiosp->c_iflag & IGNBRK)
3671                 portp->rxignoremsk |= SR_RXBREAK;
3672
3673         portp->rxmarkmsk = SR_RXOVERRUN;
3674         if (tiosp->c_iflag & (INPCK | PARMRK))
3675                 portp->rxmarkmsk |= (SR_RXPARITY | SR_RXFRAMING);
3676         if (tiosp->c_iflag & BRKINT)
3677                 portp->rxmarkmsk |= SR_RXBREAK;
3678
3679 /*
3680  *      Go through the char size, parity and stop bits and set all the
3681  *      option register appropriately.
3682  */
3683         switch (tiosp->c_cflag & CSIZE) {
3684         case CS5:
3685                 mr1 |= MR1_CS5;
3686                 break;
3687         case CS6:
3688                 mr1 |= MR1_CS6;
3689                 break;
3690         case CS7:
3691                 mr1 |= MR1_CS7;
3692                 break;
3693         default:
3694                 mr1 |= MR1_CS8;
3695                 break;
3696         }
3697
3698         if (tiosp->c_cflag & CSTOPB)
3699                 mr2 |= MR2_STOP2;
3700         else
3701                 mr2 |= MR2_STOP1;
3702
3703         if (tiosp->c_cflag & PARENB) {
3704                 if (tiosp->c_cflag & PARODD)
3705                         mr1 |= (MR1_PARENB | MR1_PARODD);
3706                 else
3707                         mr1 |= (MR1_PARENB | MR1_PAREVEN);
3708         } else
3709                 mr1 |= MR1_PARNONE;
3710
3711         mr1 |= MR1_ERRBLOCK;
3712
3713 /*
3714  *      Set the RX FIFO threshold at 8 chars. This gives a bit of breathing
3715  *      space for hardware flow control and the like. This should be set to
3716  *      VMIN.
3717  */
3718         mr2 |= MR2_RXFIFOHALF;
3719
3720 /*
3721  *      Calculate the baud rate timers. For now we will just assume that
3722  *      the input and output baud are the same. The sc26198 has a fixed
3723  *      baud rate table, so only discrete baud rates possible.
3724  */
3725         baudrate = tiosp->c_cflag & CBAUD;
3726         if (baudrate & CBAUDEX) {
3727                 baudrate &= ~CBAUDEX;
3728                 if ((baudrate < 1) || (baudrate > 4))
3729                         tiosp->c_cflag &= ~CBAUDEX;
3730                 else
3731                         baudrate += 15;
3732         }
3733         baudrate = stl_baudrates[baudrate];
3734         if ((tiosp->c_cflag & CBAUD) == B38400) {
3735                 if ((portp->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_HI)
3736                         baudrate = 57600;
3737                 else if ((portp->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_VHI)
3738                         baudrate = 115200;
3739                 else if ((portp->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_SHI)
3740                         baudrate = 230400;
3741                 else if ((portp->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_WARP)
3742                         baudrate = 460800;
3743                 else if ((portp->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST)
3744                         baudrate = (portp->baud_base / portp->custom_divisor);
3745         }
3746         if (baudrate > STL_SC26198MAXBAUD)
3747                 baudrate = STL_SC26198MAXBAUD;
3748
3749         if (baudrate > 0)
3750                 for (clk = 0; clk < SC26198_NRBAUDS; clk++)
3751                         if (baudrate <= sc26198_baudtable[clk])
3752                                 break;
3753
3754 /*
3755  *      Check what form of modem signaling is required and set it up.
3756  */
3757         if (tiosp->c_cflag & CLOCAL) {
3758                 portp->port.flags &= ~ASYNC_CHECK_CD;
3759         } else {
3760                 iopr |= IOPR_DCDCOS;
3761                 imron |= IR_IOPORT;
3762                 portp->port.flags |= ASYNC_CHECK_CD;
3763         }
3764
3765 /*
3766  *      Setup sc26198 enhanced modes if we can. In particular we want to
3767  *      handle as much of the flow control as possible automatically. As
3768  *      well as saving a few CPU cycles it will also greatly improve flow
3769  *      control reliability.
3770  */
3771         if (tiosp->c_iflag & IXON) {
3772                 mr0 |= MR0_SWFTX | MR0_SWFT;
3773                 imron |= IR_XONXOFF;
3774         } else
3775                 imroff |= IR_XONXOFF;
3776
3777         if (tiosp->c_iflag & IXOFF)
3778                 mr0 |= MR0_SWFRX;
3779
3780         if (tiosp->c_cflag & CRTSCTS) {
3781                 mr2 |= MR2_AUTOCTS;
3782                 mr1 |= MR1_AUTORTS;
3783         }
3784
3785 /*
3786  *      All sc26198 register values calculated so go through and set
3787  *      them all up.
3788  */
3789
3790         pr_debug("SETPORT: portnr=%d panelnr=%d brdnr=%d\n",
3791                 portp->portnr, portp->panelnr, portp->brdnr);
3792         pr_debug("    mr0=%x mr1=%x mr2=%x clk=%x\n", mr0, mr1, mr2, clk);
3793         pr_debug("    iopr=%x imron=%x imroff=%x\n", iopr, imron, imroff);
3794         pr_debug("    schr1=%x schr2=%x schr3=%x schr4=%x\n",
3795                 tiosp->c_cc[VSTART], tiosp->c_cc[VSTOP],
3796                 tiosp->c_cc[VSTART], tiosp->c_cc[VSTOP]);
3797
3798         spin_lock_irqsave(&brd_lock, flags);
3799         BRDENABLE(portp->brdnr, portp->pagenr);
3800         stl_sc26198setreg(portp, IMR, 0);
3801         stl_sc26198updatereg(portp, MR0, mr0);
3802         stl_sc26198updatereg(portp, MR1, mr1);
3803         stl_sc26198setreg(portp, SCCR, CR_RXERRBLOCK);
3804         stl_sc26198updatereg(portp, MR2, mr2);
3805         stl_sc26198updatereg(portp, IOPIOR,
3806                 ((stl_sc26198getreg(portp, IOPIOR) & ~IPR_CHANGEMASK) | iopr));
3807
3808         if (baudrate > 0) {
3809                 stl_sc26198setreg(portp, TXCSR, clk);
3810                 stl_sc26198setreg(portp, RXCSR, clk);
3811         }
3812
3813         stl_sc26198setreg(portp, XONCR, tiosp->c_cc[VSTART]);
3814         stl_sc26198setreg(portp, XOFFCR, tiosp->c_cc[VSTOP]);
3815
3816         ipr = stl_sc26198getreg(portp, IPR);
3817         if (ipr & IPR_DCD)
3818                 portp->sigs &= ~TIOCM_CD;
3819         else
3820                 portp->sigs |= TIOCM_CD;
3821
3822         portp->imr = (portp->imr & ~imroff) | imron;
3823         stl_sc26198setreg(portp, IMR, portp->imr);
3824         BRDDISABLE(portp->brdnr);
3825         spin_unlock_irqrestore(&brd_lock, flags);
3826 }
3827
3828 /*****************************************************************************/
3829
3830 /*
3831  *      Set the state of the DTR and RTS signals.
3832  */
3833
3834 static void stl_sc26198setsignals(struct stlport *portp, int dtr, int rts)
3835 {
3836         unsigned char   iopioron, iopioroff;
3837         unsigned long   flags;
3838
3839         pr_debug("stl_sc26198setsignals(portp=%p,dtr=%d,rts=%d)\n", portp,
3840                         dtr, rts);
3841
3842         iopioron = 0;
3843         iopioroff = 0;
3844         if (dtr == 0)
3845                 iopioroff |= IPR_DTR;
3846         else if (dtr > 0)
3847                 iopioron |= IPR_DTR;
3848         if (rts == 0)
3849                 iopioroff |= IPR_RTS;
3850         else if (rts > 0)
3851                 iopioron |= IPR_RTS;
3852
3853         spin_lock_irqsave(&brd_lock, flags);
3854         BRDENABLE(portp->brdnr, portp->pagenr);
3855         stl_sc26198setreg(portp, IOPIOR,
3856                 ((stl_sc26198getreg(portp, IOPIOR) & ~iopioroff) | iopioron));
3857         BRDDISABLE(portp->brdnr);
3858         spin_unlock_irqrestore(&brd_lock, flags);
3859 }
3860
3861 /*****************************************************************************/
3862
3863 /*
3864  *      Return the state of the signals.
3865  */
3866
3867 static int stl_sc26198getsignals(struct stlport *portp)
3868 {
3869         unsigned char   ipr;
3870         unsigned long   flags;
3871         int             sigs;
3872
3873         pr_debug("stl_sc26198getsignals(portp=%p)\n", portp);
3874
3875         spin_lock_irqsave(&brd_lock, flags);
3876         BRDENABLE(portp->brdnr, portp->pagenr);
3877         ipr = stl_sc26198getreg(portp, IPR);
3878         BRDDISABLE(portp->brdnr);
3879         spin_unlock_irqrestore(&brd_lock, flags);
3880
3881         sigs = 0;
3882         sigs |= (ipr & IPR_DCD) ? 0 : TIOCM_CD;
3883         sigs |= (ipr & IPR_CTS) ? 0 : TIOCM_CTS;
3884         sigs |= (ipr & IPR_DTR) ? 0: TIOCM_DTR;
3885         sigs |= (ipr & IPR_RTS) ? 0: TIOCM_RTS;
3886         sigs |= TIOCM_DSR;
3887         return sigs;
3888 }
3889
3890 /*****************************************************************************/
3891
3892 /*
3893  *      Enable/Disable the Transmitter and/or Receiver.
3894  */
3895
3896 static void stl_sc26198enablerxtx(struct stlport *portp, int rx, int tx)
3897 {
3898         unsigned char   ccr;
3899         unsigned long   flags;
3900
3901         pr_debug("stl_sc26198enablerxtx(portp=%p,rx=%d,tx=%d)\n", portp, rx,tx);
3902
3903         ccr = portp->crenable;
3904         if (tx == 0)
3905                 ccr &= ~CR_TXENABLE;
3906         else if (tx > 0)
3907                 ccr |= CR_TXENABLE;
3908         if (rx == 0)
3909                 ccr &= ~CR_RXENABLE;
3910         else if (rx > 0)
3911                 ccr |= CR_RXENABLE;
3912
3913         spin_lock_irqsave(&brd_lock, flags);
3914         BRDENABLE(portp->brdnr, portp->pagenr);
3915         stl_sc26198setreg(portp, SCCR, ccr);
3916         BRDDISABLE(portp->brdnr);
3917         portp->crenable = ccr;
3918         spin_unlock_irqrestore(&brd_lock, flags);
3919 }
3920
3921 /*****************************************************************************/
3922
3923 /*
3924  *      Start/stop the Transmitter and/or Receiver.
3925  */
3926
3927 static void stl_sc26198startrxtx(struct stlport *portp, int rx, int tx)
3928 {
3929         unsigned char   imr;
3930         unsigned long   flags;
3931
3932         pr_debug("stl_sc26198startrxtx(portp=%p,rx=%d,tx=%d)\n", portp, rx, tx);
3933
3934         imr = portp->imr;
3935         if (tx == 0)
3936                 imr &= ~IR_TXRDY;
3937         else if (tx == 1)
3938                 imr |= IR_TXRDY;
3939         if (rx == 0)
3940                 imr &= ~(IR_RXRDY | IR_RXBREAK | IR_RXWATCHDOG);
3941         else if (rx > 0)
3942                 imr |= IR_RXRDY | IR_RXBREAK | IR_RXWATCHDOG;
3943
3944         spin_lock_irqsave(&brd_lock, flags);
3945         BRDENABLE(portp->brdnr, portp->pagenr);
3946         stl_sc26198setreg(portp, IMR, imr);
3947         BRDDISABLE(portp->brdnr);
3948         portp->imr = imr;
3949         if (tx > 0)
3950                 set_bit(ASYI_TXBUSY, &portp->istate);
3951         spin_unlock_irqrestore(&brd_lock, flags);
3952 }
3953
3954 /*****************************************************************************/
3955
3956 /*
3957  *      Disable all interrupts from this port.
3958  */
3959
3960 static void stl_sc26198disableintrs(struct stlport *portp)
3961 {
3962         unsigned long   flags;
3963
3964         pr_debug("stl_sc26198disableintrs(portp=%p)\n", portp);
3965
3966         spin_lock_irqsave(&brd_lock, flags);
3967         BRDENABLE(portp->brdnr, portp->pagenr);
3968         portp->imr = 0;
3969         stl_sc26198setreg(portp, IMR, 0);
3970         BRDDISABLE(portp->brdnr);
3971         spin_unlock_irqrestore(&brd_lock, flags);
3972 }
3973
3974 /*****************************************************************************/
3975
3976 static void stl_sc26198sendbreak(struct stlport *portp, int len)
3977 {
3978         unsigned long   flags;
3979
3980         pr_debug("stl_sc26198sendbreak(portp=%p,len=%d)\n", portp, len);
3981
3982         spin_lock_irqsave(&brd_lock, flags);
3983         BRDENABLE(portp->brdnr, portp->pagenr);
3984         if (len == 1) {
3985                 stl_sc26198setreg(portp, SCCR, CR_TXSTARTBREAK);
3986                 portp->stats.txbreaks++;
3987         } else
3988                 stl_sc26198setreg(portp, SCCR, CR_TXSTOPBREAK);
3989
3990         BRDDISABLE(portp->brdnr);
3991         spin_unlock_irqrestore(&brd_lock, flags);
3992 }
3993
3994 /*****************************************************************************/
3995
3996 /*
3997  *      Take flow control actions...
3998  */
3999
4000 static void stl_sc26198flowctrl(struct stlport *portp, int state)
4001 {
4002         struct tty_struct       *tty;
4003         unsigned long           flags;
4004         unsigned char           mr0;
4005
4006         pr_debug("stl_sc26198flowctrl(portp=%p,state=%x)\n", portp, state);
4007
4008         if (portp == NULL)
4009                 return;
4010         tty = tty_port_tty_get(&portp->port);
4011         if (tty == NULL)
4012                 return;
4013
4014         spin_lock_irqsave(&brd_lock, flags);
4015         BRDENABLE(portp->brdnr, portp->pagenr);
4016
4017         if (state) {
4018                 if (tty->termios->c_iflag & IXOFF) {
4019                         mr0 = stl_sc26198getreg(portp, MR0);
4020                         stl_sc26198setreg(portp, MR0, (mr0 & ~MR0_SWFRXTX));
4021                         stl_sc26198setreg(portp, SCCR, CR_TXSENDXON);
4022                         mr0 |= MR0_SWFRX;
4023                         portp->stats.rxxon++;
4024                         stl_sc26198wait(portp);
4025                         stl_sc26198setreg(portp, MR0, mr0);
4026                 }
4027 /*
4028  *              Question: should we return RTS to what it was before? It may
4029  *              have been set by an ioctl... Suppose not, since if you have
4030  *              hardware flow control set then it is pretty silly to go and
4031  *              set the RTS line by hand.
4032  */
4033                 if (tty->termios->c_cflag & CRTSCTS) {
4034                         stl_sc26198setreg(portp, MR1,
4035                                 (stl_sc26198getreg(portp, MR1) | MR1_AUTORTS));
4036                         stl_sc26198setreg(portp, IOPIOR,
4037                                 (stl_sc26198getreg(portp, IOPIOR) | IOPR_RTS));
4038                         portp->stats.rxrtson++;
4039                 }
4040         } else {
4041                 if (tty->termios->c_iflag & IXOFF) {
4042                         mr0 = stl_sc26198getreg(portp, MR0);
4043                         stl_sc26198setreg(portp, MR0, (mr0 & ~MR0_SWFRXTX));
4044                         stl_sc26198setreg(portp, SCCR, CR_TXSENDXOFF);
4045                         mr0 &= ~MR0_SWFRX;
4046                         portp->stats.rxxoff++;
4047                         stl_sc26198wait(portp);
4048                         stl_sc26198setreg(portp, MR0, mr0);
4049                 }
4050                 if (tty->termios->c_cflag & CRTSCTS) {
4051                         stl_sc26198setreg(portp, MR1,
4052                                 (stl_sc26198getreg(portp, MR1) & ~MR1_AUTORTS));
4053                         stl_sc26198setreg(portp, IOPIOR,
4054                                 (stl_sc26198getreg(portp, IOPIOR) & ~IOPR_RTS));
4055                         portp->stats.rxrtsoff++;
4056                 }
4057         }
4058
4059         BRDDISABLE(portp->brdnr);
4060         spin_unlock_irqrestore(&brd_lock, flags);
4061         tty_kref_put(tty);
4062 }
4063
4064 /*****************************************************************************/
4065
4066 /*
4067  *      Send a flow control character.
4068  */
4069
4070 static void stl_sc26198sendflow(struct stlport *portp, int state)
4071 {
4072         struct tty_struct       *tty;
4073         unsigned long           flags;
4074         unsigned char           mr0;
4075
4076         pr_debug("stl_sc26198sendflow(portp=%p,state=%x)\n", portp, state);
4077
4078         if (portp == NULL)
4079                 return;
4080         tty = tty_port_tty_get(&portp->port);
4081         if (tty == NULL)
4082                 return;
4083
4084         spin_lock_irqsave(&brd_lock, flags);
4085         BRDENABLE(portp->brdnr, portp->pagenr);
4086         if (state) {
4087                 mr0 = stl_sc26198getreg(portp, MR0);
4088                 stl_sc26198setreg(portp, MR0, (mr0 & ~MR0_SWFRXTX));
4089                 stl_sc26198setreg(portp, SCCR, CR_TXSENDXON);
4090                 mr0 |= MR0_SWFRX;
4091                 portp->stats.rxxon++;
4092                 stl_sc26198wait(portp);
4093                 stl_sc26198setreg(portp, MR0, mr0);
4094         } else {
4095                 mr0 = stl_sc26198getreg(portp, MR0);
4096                 stl_sc26198setreg(portp, MR0, (mr0 & ~MR0_SWFRXTX));
4097                 stl_sc26198setreg(portp, SCCR, CR_TXSENDXOFF);
4098                 mr0 &= ~MR0_SWFRX;
4099                 portp->stats.rxxoff++;
4100                 stl_sc26198wait(portp);
4101                 stl_sc26198setreg(portp, MR0, mr0);
4102         }
4103         BRDDISABLE(portp->brdnr);
4104         spin_unlock_irqrestore(&brd_lock, flags);
4105         tty_kref_put(tty);
4106 }
4107
4108 /*****************************************************************************/
4109
4110 static void stl_sc26198flush(struct stlport *portp)
4111 {
4112         unsigned long   flags;
4113
4114         pr_debug("stl_sc26198flush(portp=%p)\n", portp);
4115
4116         if (portp == NULL)
4117                 return;
4118
4119         spin_lock_irqsave(&brd_lock, flags);
4120         BRDENABLE(portp->brdnr, portp->pagenr);
4121         stl_sc26198setreg(portp, SCCR, CR_TXRESET);
4122         stl_sc26198setreg(portp, SCCR, portp->crenable);
4123         BRDDISABLE(portp->brdnr);
4124         portp->tx.tail = portp->tx.head;
4125         spin_unlock_irqrestore(&brd_lock, flags);
4126 }
4127
4128 /*****************************************************************************/
4129
4130 /*
4131  *      Return the current state of data flow on this port. This is only
4132  *      really interesting when determining if data has fully completed
4133  *      transmission or not... The sc26198 interrupt scheme cannot
4134  *      determine when all data has actually drained, so we need to
4135  *      check the port statusy register to be sure.
4136  */
4137
4138 static int stl_sc26198datastate(struct stlport *portp)
4139 {
4140         unsigned long   flags;
4141         unsigned char   sr;
4142
4143         pr_debug("stl_sc26198datastate(portp=%p)\n", portp);
4144
4145         if (portp == NULL)
4146                 return 0;
4147         if (test_bit(ASYI_TXBUSY, &portp->istate))
4148                 return 1;
4149
4150         spin_lock_irqsave(&brd_lock, flags);
4151         BRDENABLE(portp->brdnr, portp->pagenr);
4152         sr = stl_sc26198getreg(portp, SR);
4153         BRDDISABLE(portp->brdnr);
4154         spin_unlock_irqrestore(&brd_lock, flags);
4155
4156         return (sr & SR_TXEMPTY) ? 0 : 1;
4157 }
4158
4159 /*****************************************************************************/
4160
4161 /*
4162  *      Delay for a small amount of time, to give the sc26198 a chance
4163  *      to process a command...
4164  */
4165
4166 static void stl_sc26198wait(struct stlport *portp)
4167 {
4168         int     i;
4169
4170         pr_debug("stl_sc26198wait(portp=%p)\n", portp);
4171
4172         if (portp == NULL)
4173                 return;
4174
4175         for (i = 0; i < 20; i++)
4176                 stl_sc26198getglobreg(portp, TSTR);
4177 }
4178
4179 /*****************************************************************************/
4180
4181 /*
4182  *      If we are TX flow controlled and in IXANY mode then we may
4183  *      need to unflow control here. We gotta do this because of the
4184  *      automatic flow control modes of the sc26198.
4185  */
4186
4187 static void stl_sc26198txunflow(struct stlport *portp, struct tty_struct *tty)
4188 {
4189         unsigned char   mr0;
4190
4191         mr0 = stl_sc26198getreg(portp, MR0);
4192         stl_sc26198setreg(portp, MR0, (mr0 & ~MR0_SWFRXTX));
4193         stl_sc26198setreg(portp, SCCR, CR_HOSTXON);
4194         stl_sc26198wait(portp);
4195         stl_sc26198setreg(portp, MR0, mr0);
4196         clear_bit(ASYI_TXFLOWED, &portp->istate);
4197 }
4198
4199 /*****************************************************************************/
4200
4201 /*
4202  *      Interrupt service routine for sc26198 panels.
4203  */
4204
4205 static void stl_sc26198intr(struct stlpanel *panelp, unsigned int iobase)
4206 {
4207         struct stlport  *portp;
4208         unsigned int    iack;
4209
4210         spin_lock(&brd_lock);
4211
4212 /* 
4213  *      Work around bug in sc26198 chip... Cannot have A6 address
4214  *      line of UART high, else iack will be returned as 0.
4215  */
4216         outb(0, (iobase + 1));
4217
4218         iack = inb(iobase + XP_IACK);
4219         portp = panelp->ports[(iack & IVR_CHANMASK) + ((iobase & 0x4) << 1)];
4220
4221         if (iack & IVR_RXDATA)
4222                 stl_sc26198rxisr(portp, iack);
4223         else if (iack & IVR_TXDATA)
4224                 stl_sc26198txisr(portp);
4225         else
4226                 stl_sc26198otherisr(portp, iack);
4227
4228         spin_unlock(&brd_lock);
4229 }
4230
4231 /*****************************************************************************/
4232
4233 /*
4234  *      Transmit interrupt handler. This has gotta be fast!  Handling TX
4235  *      chars is pretty simple, stuff as many as possible from the TX buffer
4236  *      into the sc26198 FIFO.
4237  *      In practice it is possible that interrupts are enabled but that the
4238  *      port has been hung up. Need to handle not having any TX buffer here,
4239  *      this is done by using the side effect that head and tail will also
4240  *      be NULL if the buffer has been freed.
4241  */
4242
4243 static void stl_sc26198txisr(struct stlport *portp)
4244 {
4245         struct tty_struct *tty;
4246         unsigned int    ioaddr;
4247         unsigned char   mr0;
4248         int             len, stlen;
4249         char            *head, *tail;
4250
4251         pr_debug("stl_sc26198txisr(portp=%p)\n", portp);
4252
4253         ioaddr = portp->ioaddr;
4254         head = portp->tx.head;
4255         tail = portp->tx.tail;
4256         len = (head >= tail) ? (head - tail) : (STL_TXBUFSIZE - (tail - head));
4257         if ((len == 0) || ((len < STL_TXBUFLOW) &&
4258             (test_bit(ASYI_TXLOW, &portp->istate) == 0))) {
4259                 set_bit(ASYI_TXLOW, &portp->istate);
4260                 tty = tty_port_tty_get(&portp->port);
4261                 if (tty) {
4262                         tty_wakeup(tty);
4263                         tty_kref_put(tty);
4264                 }
4265         }
4266
4267         if (len == 0) {
4268                 outb((MR0 | portp->uartaddr), (ioaddr + XP_ADDR));
4269                 mr0 = inb(ioaddr + XP_DATA);
4270                 if ((mr0 & MR0_TXMASK) == MR0_TXEMPTY) {
4271                         portp->imr &= ~IR_TXRDY;
4272                         outb((IMR | portp->uartaddr), (ioaddr + XP_ADDR));
4273                         outb(portp->imr, (ioaddr + XP_DATA));
4274                         clear_bit(ASYI_TXBUSY, &portp->istate);
4275                 } else {
4276                         mr0 |= ((mr0 & ~MR0_TXMASK) | MR0_TXEMPTY);
4277                         outb(mr0, (ioaddr + XP_DATA));
4278                 }
4279         } else {
4280                 len = min(len, SC26198_TXFIFOSIZE);
4281                 portp->stats.txtotal += len;
4282                 stlen = min_t(unsigned int, len,
4283                                 (portp->tx.buf + STL_TXBUFSIZE) - tail);
4284                 outb(GTXFIFO, (ioaddr + XP_ADDR));
4285                 outsb((ioaddr + XP_DATA), tail, stlen);
4286                 len -= stlen;
4287                 tail += stlen;
4288                 if (tail >= (portp->tx.buf + STL_TXBUFSIZE))
4289                         tail = portp->tx.buf;
4290                 if (len > 0) {
4291                         outsb((ioaddr + XP_DATA), tail, len);
4292                         tail += len;
4293                 }
4294                 portp->tx.tail = tail;
4295         }
4296 }
4297
4298 /*****************************************************************************/
4299
4300 /*
4301  *      Receive character interrupt handler. Determine if we have good chars
4302  *      or bad chars and then process appropriately. Good chars are easy
4303  *      just shove the lot into the RX buffer and set all status byte to 0.
4304  *      If a bad RX char then process as required. This routine needs to be
4305  *      fast!  In practice it is possible that we get an interrupt on a port
4306  *      that is closed. This can happen on hangups - since they completely
4307  *      shutdown a port not in user context. Need to handle this case.
4308  */
4309
4310 static void stl_sc26198rxisr(struct stlport *portp, unsigned int iack)
4311 {
4312         struct tty_struct       *tty;
4313         unsigned int            len, buflen, ioaddr;
4314
4315         pr_debug("stl_sc26198rxisr(portp=%p,iack=%x)\n", portp, iack);
4316
4317         tty = tty_port_tty_get(&portp->port);
4318         ioaddr = portp->ioaddr;
4319         outb(GIBCR, (ioaddr + XP_ADDR));
4320         len = inb(ioaddr + XP_DATA) + 1;
4321
4322         if ((iack & IVR_TYPEMASK) == IVR_RXDATA) {
4323                 if (tty == NULL || (buflen = tty_buffer_request_room(tty, len)) == 0) {
4324                         len = min_t(unsigned int, len, sizeof(stl_unwanted));
4325                         outb(GRXFIFO, (ioaddr + XP_ADDR));
4326                         insb((ioaddr + XP_DATA), &stl_unwanted[0], len);
4327                         portp->stats.rxlost += len;
4328                         portp->stats.rxtotal += len;
4329                 } else {
4330                         len = min(len, buflen);
4331                         if (len > 0) {
4332                                 unsigned char *ptr;
4333                                 outb(GRXFIFO, (ioaddr + XP_ADDR));
4334                                 tty_prepare_flip_string(tty, &ptr, len);
4335                                 insb((ioaddr + XP_DATA), ptr, len);
4336                                 tty_schedule_flip(tty);
4337                                 portp->stats.rxtotal += len;
4338                         }
4339                 }
4340         } else {
4341                 stl_sc26198rxbadchars(portp);
4342         }
4343
4344 /*
4345  *      If we are TX flow controlled and in IXANY mode then we may need
4346  *      to unflow control here. We gotta do this because of the automatic
4347  *      flow control modes of the sc26198.
4348  */
4349         if (test_bit(ASYI_TXFLOWED, &portp->istate)) {
4350                 if ((tty != NULL) &&
4351                     (tty->termios != NULL) &&
4352                     (tty->termios->c_iflag & IXANY)) {
4353                         stl_sc26198txunflow(portp, tty);
4354                 }
4355         }
4356         tty_kref_put(tty);
4357 }
4358
4359 /*****************************************************************************/
4360
4361 /*
4362  *      Process an RX bad character.
4363  */
4364
4365 static void stl_sc26198rxbadch(struct stlport *portp, unsigned char status, char ch)
4366 {
4367         struct tty_struct       *tty;
4368         unsigned int            ioaddr;
4369
4370         tty = tty_port_tty_get(&portp->port);
4371         ioaddr = portp->ioaddr;
4372
4373         if (status & SR_RXPARITY)
4374                 portp->stats.rxparity++;
4375         if (status & SR_RXFRAMING)
4376                 portp->stats.rxframing++;
4377         if (status & SR_RXOVERRUN)
4378                 portp->stats.rxoverrun++;
4379         if (status & SR_RXBREAK)
4380                 portp->stats.rxbreaks++;
4381
4382         if ((tty != NULL) &&
4383             ((portp->rxignoremsk & status) == 0)) {
4384                 if (portp->rxmarkmsk & status) {
4385                         if (status & SR_RXBREAK) {
4386                                 status = TTY_BREAK;
4387                                 if (portp->port.flags & ASYNC_SAK) {
4388                                         do_SAK(tty);
4389                                         BRDENABLE(portp->brdnr, portp->pagenr);
4390                                 }
4391                         } else if (status & SR_RXPARITY)
4392                                 status = TTY_PARITY;
4393                         else if (status & SR_RXFRAMING)
4394                                 status = TTY_FRAME;
4395                         else if(status & SR_RXOVERRUN)
4396                                 status = TTY_OVERRUN;
4397                         else
4398                                 status = 0;
4399                 } else
4400                         status = 0;
4401
4402                 tty_insert_flip_char(tty, ch, status);
4403                 tty_schedule_flip(tty);
4404
4405                 if (status == 0)
4406                         portp->stats.rxtotal++;
4407         }
4408         tty_kref_put(tty);
4409 }
4410
4411 /*****************************************************************************/
4412
4413 /*
4414  *      Process all characters in the RX FIFO of the UART. Check all char
4415  *      status bytes as well, and process as required. We need to check
4416  *      all bytes in the FIFO, in case some more enter the FIFO while we
4417  *      are here. To get the exact character error type we need to switch
4418  *      into CHAR error mode (that is why we need to make sure we empty
4419  *      the FIFO).
4420  */
4421
4422 static void stl_sc26198rxbadchars(struct stlport *portp)
4423 {
4424         unsigned char   status, mr1;
4425         char            ch;
4426
4427 /*
4428  *      To get the precise error type for each character we must switch
4429  *      back into CHAR error mode.
4430  */
4431         mr1 = stl_sc26198getreg(portp, MR1);
4432         stl_sc26198setreg(portp, MR1, (mr1 & ~MR1_ERRBLOCK));
4433
4434         while ((status = stl_sc26198getreg(portp, SR)) & SR_RXRDY) {
4435                 stl_sc26198setreg(portp, SCCR, CR_CLEARRXERR);
4436                 ch = stl_sc26198getreg(portp, RXFIFO);
4437                 stl_sc26198rxbadch(portp, status, ch);
4438         }
4439
4440 /*
4441  *      To get correct interrupt class we must switch back into BLOCK
4442  *      error mode.
4443  */
4444         stl_sc26198setreg(portp, MR1, mr1);
4445 }
4446
4447 /*****************************************************************************/
4448
4449 /*
4450  *      Other interrupt handler. This includes modem signals, flow
4451  *      control actions, etc. Most stuff is left to off-level interrupt
4452  *      processing time.
4453  */
4454
4455 static void stl_sc26198otherisr(struct stlport *portp, unsigned int iack)
4456 {
4457         unsigned char   cir, ipr, xisr;
4458
4459         pr_debug("stl_sc26198otherisr(portp=%p,iack=%x)\n", portp, iack);
4460
4461         cir = stl_sc26198getglobreg(portp, CIR);
4462
4463         switch (cir & CIR_SUBTYPEMASK) {
4464         case CIR_SUBCOS:
4465                 ipr = stl_sc26198getreg(portp, IPR);
4466                 if (ipr & IPR_DCDCHANGE) {
4467                         stl_cd_change(portp);
4468                         portp->stats.modem++;
4469                 }
4470                 break;
4471         case CIR_SUBXONXOFF:
4472                 xisr = stl_sc26198getreg(portp, XISR);
4473                 if (xisr & XISR_RXXONGOT) {
4474                         set_bit(ASYI_TXFLOWED, &portp->istate);
4475                         portp->stats.txxoff++;
4476                 }
4477                 if (xisr & XISR_RXXOFFGOT) {
4478                         clear_bit(ASYI_TXFLOWED, &portp->istate);
4479                         portp->stats.txxon++;
4480                 }
4481                 break;
4482         case CIR_SUBBREAK:
4483                 stl_sc26198setreg(portp, SCCR, CR_BREAKRESET);
4484                 stl_sc26198rxbadchars(portp);
4485                 break;
4486         default:
4487                 break;
4488         }
4489 }
4490
4491 static void stl_free_isabrds(void)
4492 {
4493         struct stlbrd *brdp;
4494         unsigned int i;
4495
4496         for (i = 0; i < stl_nrbrds; i++) {
4497                 if ((brdp = stl_brds[i]) == NULL || (brdp->state & STL_PROBED))
4498                         continue;
4499
4500                 free_irq(brdp->irq, brdp);
4501
4502                 stl_cleanup_panels(brdp);
4503
4504                 release_region(brdp->ioaddr1, brdp->iosize1);
4505                 if (brdp->iosize2 > 0)
4506                         release_region(brdp->ioaddr2, brdp->iosize2);
4507
4508                 kfree(brdp);
4509                 stl_brds[i] = NULL;
4510         }
4511 }
4512
4513 /*
4514  *      Loadable module initialization stuff.
4515  */
4516 static int __init stallion_module_init(void)
4517 {
4518         struct stlbrd   *brdp;
4519         struct stlconf  conf;
4520         unsigned int i, j;
4521         int retval;
4522
4523         printk(KERN_INFO "%s: version %s\n", stl_drvtitle, stl_drvversion);
4524
4525         spin_lock_init(&stallion_lock);
4526         spin_lock_init(&brd_lock);
4527
4528         stl_serial = alloc_tty_driver(STL_MAXBRDS * STL_MAXPORTS);
4529         if (!stl_serial) {
4530                 retval = -ENOMEM;
4531                 goto err;
4532         }
4533
4534         stl_serial->owner = THIS_MODULE;
4535         stl_serial->driver_name = stl_drvname;
4536         stl_serial->name = "ttyE";
4537         stl_serial->major = STL_SERIALMAJOR;
4538         stl_serial->minor_start = 0;
4539         stl_serial->type = TTY_DRIVER_TYPE_SERIAL;
4540         stl_serial->subtype = SERIAL_TYPE_NORMAL;
4541         stl_serial->init_termios = stl_deftermios;
4542         stl_serial->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_DYNAMIC_DEV;
4543         tty_set_operations(stl_serial, &stl_ops);
4544
4545         retval = tty_register_driver(stl_serial);
4546         if (retval) {
4547                 printk("STALLION: failed to register serial driver\n");
4548                 goto err_frtty;
4549         }
4550
4551 /*
4552  *      Find any dynamically supported boards. That is via module load
4553  *      line options.
4554  */
4555         for (i = stl_nrbrds; i < stl_nargs; i++) {
4556                 memset(&conf, 0, sizeof(conf));
4557                 if (stl_parsebrd(&conf, stl_brdsp[i]) == 0)
4558                         continue;
4559                 if ((brdp = stl_allocbrd()) == NULL)
4560                         continue;
4561                 brdp->brdnr = i;
4562                 brdp->brdtype = conf.brdtype;
4563                 brdp->ioaddr1 = conf.ioaddr1;
4564                 brdp->ioaddr2 = conf.ioaddr2;
4565                 brdp->irq = conf.irq;
4566                 brdp->irqtype = conf.irqtype;
4567                 stl_brds[brdp->brdnr] = brdp;
4568                 if (stl_brdinit(brdp)) {
4569                         stl_brds[brdp->brdnr] = NULL;
4570                         kfree(brdp);
4571                 } else {
4572                         for (j = 0; j < brdp->nrports; j++)
4573                                 tty_register_device(stl_serial,
4574                                         brdp->brdnr * STL_MAXPORTS + j, NULL);
4575                         stl_nrbrds = i + 1;
4576                 }
4577         }
4578
4579         /* this has to be _after_ isa finding because of locking */
4580         retval = pci_register_driver(&stl_pcidriver);
4581         if (retval && stl_nrbrds == 0) {
4582                 printk(KERN_ERR "STALLION: can't register pci driver\n");
4583                 goto err_unrtty;
4584         }
4585
4586 /*
4587  *      Set up a character driver for per board stuff. This is mainly used
4588  *      to do stats ioctls on the ports.
4589  */
4590         if (register_chrdev(STL_SIOMEMMAJOR, "staliomem", &stl_fsiomem))
4591                 printk("STALLION: failed to register serial board device\n");
4592
4593         stallion_class = class_create(THIS_MODULE, "staliomem");
4594         if (IS_ERR(stallion_class))
4595                 printk("STALLION: failed to create class\n");
4596         for (i = 0; i < 4; i++)
4597                 device_create(stallion_class, NULL, MKDEV(STL_SIOMEMMAJOR, i),
4598                               NULL, "staliomem%d", i);
4599
4600         return 0;
4601 err_unrtty:
4602         tty_unregister_driver(stl_serial);
4603 err_frtty:
4604         put_tty_driver(stl_serial);
4605 err:
4606         return retval;
4607 }
4608
4609 static void __exit stallion_module_exit(void)
4610 {
4611         struct stlbrd *brdp;
4612         unsigned int i, j;
4613
4614         pr_debug("cleanup_module()\n");
4615
4616         printk(KERN_INFO "Unloading %s: version %s\n", stl_drvtitle,
4617                 stl_drvversion);
4618
4619 /*
4620  *      Free up all allocated resources used by the ports. This includes
4621  *      memory and interrupts. As part of this process we will also do
4622  *      a hangup on every open port - to try to flush out any processes
4623  *      hanging onto ports.
4624  */
4625         for (i = 0; i < stl_nrbrds; i++) {
4626                 if ((brdp = stl_brds[i]) == NULL || (brdp->state & STL_PROBED))
4627                         continue;
4628                 for (j = 0; j < brdp->nrports; j++)
4629                         tty_unregister_device(stl_serial,
4630                                 brdp->brdnr * STL_MAXPORTS + j);
4631         }
4632
4633         for (i = 0; i < 4; i++)
4634                 device_destroy(stallion_class, MKDEV(STL_SIOMEMMAJOR, i));
4635         unregister_chrdev(STL_SIOMEMMAJOR, "staliomem");
4636         class_destroy(stallion_class);
4637
4638         pci_unregister_driver(&stl_pcidriver);
4639
4640         stl_free_isabrds();
4641
4642         tty_unregister_driver(stl_serial);
4643         put_tty_driver(stl_serial);
4644 }
4645
4646 module_init(stallion_module_init);
4647 module_exit(stallion_module_exit);
4648
4649 MODULE_AUTHOR("Greg Ungerer");
4650 MODULE_DESCRIPTION("Stallion Multiport Serial Driver");
4651 MODULE_LICENSE("GPL");