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