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