pty: simplify unix98 allocation
[linux-2.6/sactl.git] / drivers / char / stallion.c
blob81b3234127db2fae1839568960bbae4110641298
1 /*****************************************************************************/
3 /*
4 * stallion.c -- stallion multiport serial driver.
6 * Copyright (C) 1996-1999 Stallion Technologies
7 * Copyright (C) 1994-1996 Greg Ungerer.
9 * This code is loosely based on the Linux serial driver, written by
10 * Linus Torvalds, Theodore T'so and others.
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.
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.
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.
27 /*****************************************************************************/
29 #include <linux/module.h>
30 #include <linux/slab.h>
31 #include <linux/interrupt.h>
32 #include <linux/tty.h>
33 #include <linux/tty_flip.h>
34 #include <linux/serial.h>
35 #include <linux/cd1400.h>
36 #include <linux/sc26198.h>
37 #include <linux/comstats.h>
38 #include <linux/stallion.h>
39 #include <linux/ioport.h>
40 #include <linux/init.h>
41 #include <linux/smp_lock.h>
42 #include <linux/device.h>
43 #include <linux/delay.h>
44 #include <linux/ctype.h>
46 #include <asm/io.h>
47 #include <asm/uaccess.h>
49 #include <linux/pci.h>
51 /*****************************************************************************/
54 * Define different board types. Use the standard Stallion "assigned"
55 * board numbers. Boards supported in this driver are abbreviated as
56 * EIO = EasyIO and ECH = EasyConnection 8/32.
58 #define BRD_EASYIO 20
59 #define BRD_ECH 21
60 #define BRD_ECHMC 22
61 #define BRD_ECHPCI 26
62 #define BRD_ECH64PCI 27
63 #define BRD_EASYIOPCI 28
65 struct stlconf {
66 unsigned int brdtype;
67 int ioaddr1;
68 int ioaddr2;
69 unsigned long memaddr;
70 int irq;
71 int irqtype;
74 static unsigned int stl_nrbrds;
76 /*****************************************************************************/
79 * Define some important driver characteristics. Device major numbers
80 * allocated as per Linux Device Registry.
82 #ifndef STL_SIOMEMMAJOR
83 #define STL_SIOMEMMAJOR 28
84 #endif
85 #ifndef STL_SERIALMAJOR
86 #define STL_SERIALMAJOR 24
87 #endif
88 #ifndef STL_CALLOUTMAJOR
89 #define STL_CALLOUTMAJOR 25
90 #endif
93 * Set the TX buffer size. Bigger is better, but we don't want
94 * to chew too much memory with buffers!
96 #define STL_TXBUFLOW 512
97 #define STL_TXBUFSIZE 4096
99 /*****************************************************************************/
102 * Define our local driver identity first. Set up stuff to deal with
103 * all the local structures required by a serial tty driver.
105 static char *stl_drvtitle = "Stallion Multiport Serial Driver";
106 static char *stl_drvname = "stallion";
107 static char *stl_drvversion = "5.6.0";
109 static struct tty_driver *stl_serial;
112 * Define a local default termios struct. All ports will be created
113 * with this termios initially. Basically all it defines is a raw port
114 * at 9600, 8 data bits, 1 stop bit.
116 static struct ktermios stl_deftermios = {
117 .c_cflag = (B9600 | CS8 | CREAD | HUPCL | CLOCAL),
118 .c_cc = INIT_C_CC,
119 .c_ispeed = 9600,
120 .c_ospeed = 9600,
124 * Define global place to put buffer overflow characters.
126 static char stl_unwanted[SC26198_RXFIFOSIZE];
128 /*****************************************************************************/
130 static DEFINE_MUTEX(stl_brdslock);
131 static struct stlbrd *stl_brds[STL_MAXBRDS];
134 * Per board state flags. Used with the state field of the board struct.
135 * Not really much here!
137 #define BRD_FOUND 0x1
138 #define STL_PROBED 0x2
142 * Define the port structure istate flags. These set of flags are
143 * modified at interrupt time - so setting and reseting them needs
144 * to be atomic. Use the bit clear/setting routines for this.
146 #define ASYI_TXBUSY 1
147 #define ASYI_TXLOW 2
148 #define ASYI_TXFLOWED 3
151 * Define an array of board names as printable strings. Handy for
152 * referencing boards when printing trace and stuff.
154 static char *stl_brdnames[] = {
155 NULL,
156 NULL,
157 NULL,
158 NULL,
159 NULL,
160 NULL,
161 NULL,
162 NULL,
163 NULL,
164 NULL,
165 NULL,
166 NULL,
167 NULL,
168 NULL,
169 NULL,
170 NULL,
171 NULL,
172 NULL,
173 NULL,
174 NULL,
175 "EasyIO",
176 "EC8/32-AT",
177 "EC8/32-MC",
178 NULL,
179 NULL,
180 NULL,
181 "EC8/32-PCI",
182 "EC8/64-PCI",
183 "EasyIO-PCI",
186 /*****************************************************************************/
189 * Define some string labels for arguments passed from the module
190 * load line. These allow for easy board definitions, and easy
191 * modification of the io, memory and irq resoucres.
193 static unsigned int stl_nargs;
194 static char *board0[4];
195 static char *board1[4];
196 static char *board2[4];
197 static char *board3[4];
199 static char **stl_brdsp[] = {
200 (char **) &board0,
201 (char **) &board1,
202 (char **) &board2,
203 (char **) &board3
207 * Define a set of common board names, and types. This is used to
208 * parse any module arguments.
211 static struct {
212 char *name;
213 int type;
214 } stl_brdstr[] = {
215 { "easyio", BRD_EASYIO },
216 { "eio", BRD_EASYIO },
217 { "20", BRD_EASYIO },
218 { "ec8/32", BRD_ECH },
219 { "ec8/32-at", BRD_ECH },
220 { "ec8/32-isa", BRD_ECH },
221 { "ech", BRD_ECH },
222 { "echat", BRD_ECH },
223 { "21", BRD_ECH },
224 { "ec8/32-mc", BRD_ECHMC },
225 { "ec8/32-mca", BRD_ECHMC },
226 { "echmc", BRD_ECHMC },
227 { "echmca", BRD_ECHMC },
228 { "22", BRD_ECHMC },
229 { "ec8/32-pc", BRD_ECHPCI },
230 { "ec8/32-pci", BRD_ECHPCI },
231 { "26", BRD_ECHPCI },
232 { "ec8/64-pc", BRD_ECH64PCI },
233 { "ec8/64-pci", BRD_ECH64PCI },
234 { "ech-pci", BRD_ECH64PCI },
235 { "echpci", BRD_ECH64PCI },
236 { "echpc", BRD_ECH64PCI },
237 { "27", BRD_ECH64PCI },
238 { "easyio-pc", BRD_EASYIOPCI },
239 { "easyio-pci", BRD_EASYIOPCI },
240 { "eio-pci", BRD_EASYIOPCI },
241 { "eiopci", BRD_EASYIOPCI },
242 { "28", BRD_EASYIOPCI },
246 * Define the module agruments.
249 module_param_array(board0, charp, &stl_nargs, 0);
250 MODULE_PARM_DESC(board0, "Board 0 config -> name[,ioaddr[,ioaddr2][,irq]]");
251 module_param_array(board1, charp, &stl_nargs, 0);
252 MODULE_PARM_DESC(board1, "Board 1 config -> name[,ioaddr[,ioaddr2][,irq]]");
253 module_param_array(board2, charp, &stl_nargs, 0);
254 MODULE_PARM_DESC(board2, "Board 2 config -> name[,ioaddr[,ioaddr2][,irq]]");
255 module_param_array(board3, charp, &stl_nargs, 0);
256 MODULE_PARM_DESC(board3, "Board 3 config -> name[,ioaddr[,ioaddr2][,irq]]");
258 /*****************************************************************************/
261 * Hardware ID bits for the EasyIO and ECH boards. These defines apply
262 * to the directly accessible io ports of these boards (not the uarts -
263 * they are in cd1400.h and sc26198.h).
265 #define EIO_8PORTRS 0x04
266 #define EIO_4PORTRS 0x05
267 #define EIO_8PORTDI 0x00
268 #define EIO_8PORTM 0x06
269 #define EIO_MK3 0x03
270 #define EIO_IDBITMASK 0x07
272 #define EIO_BRDMASK 0xf0
273 #define ID_BRD4 0x10
274 #define ID_BRD8 0x20
275 #define ID_BRD16 0x30
277 #define EIO_INTRPEND 0x08
278 #define EIO_INTEDGE 0x00
279 #define EIO_INTLEVEL 0x08
280 #define EIO_0WS 0x10
282 #define ECH_ID 0xa0
283 #define ECH_IDBITMASK 0xe0
284 #define ECH_BRDENABLE 0x08
285 #define ECH_BRDDISABLE 0x00
286 #define ECH_INTENABLE 0x01
287 #define ECH_INTDISABLE 0x00
288 #define ECH_INTLEVEL 0x02
289 #define ECH_INTEDGE 0x00
290 #define ECH_INTRPEND 0x01
291 #define ECH_BRDRESET 0x01
293 #define ECHMC_INTENABLE 0x01
294 #define ECHMC_BRDRESET 0x02
296 #define ECH_PNLSTATUS 2
297 #define ECH_PNL16PORT 0x20
298 #define ECH_PNLIDMASK 0x07
299 #define ECH_PNLXPID 0x40
300 #define ECH_PNLINTRPEND 0x80
302 #define ECH_ADDR2MASK 0x1e0
305 * Define the vector mapping bits for the programmable interrupt board
306 * hardware. These bits encode the interrupt for the board to use - it
307 * is software selectable (except the EIO-8M).
309 static unsigned char stl_vecmap[] = {
310 0xff, 0xff, 0xff, 0x04, 0x06, 0x05, 0xff, 0x07,
311 0xff, 0xff, 0x00, 0x02, 0x01, 0xff, 0xff, 0x03
315 * Lock ordering is that you may not take stallion_lock holding
316 * brd_lock.
319 static spinlock_t brd_lock; /* Guard the board mapping */
320 static spinlock_t stallion_lock; /* Guard the tty driver */
323 * Set up enable and disable macros for the ECH boards. They require
324 * the secondary io address space to be activated and deactivated.
325 * This way all ECH boards can share their secondary io region.
326 * If this is an ECH-PCI board then also need to set the page pointer
327 * to point to the correct page.
329 #define BRDENABLE(brdnr,pagenr) \
330 if (stl_brds[(brdnr)]->brdtype == BRD_ECH) \
331 outb((stl_brds[(brdnr)]->ioctrlval | ECH_BRDENABLE), \
332 stl_brds[(brdnr)]->ioctrl); \
333 else if (stl_brds[(brdnr)]->brdtype == BRD_ECHPCI) \
334 outb((pagenr), stl_brds[(brdnr)]->ioctrl);
336 #define BRDDISABLE(brdnr) \
337 if (stl_brds[(brdnr)]->brdtype == BRD_ECH) \
338 outb((stl_brds[(brdnr)]->ioctrlval | ECH_BRDDISABLE), \
339 stl_brds[(brdnr)]->ioctrl);
341 #define STL_CD1400MAXBAUD 230400
342 #define STL_SC26198MAXBAUD 460800
344 #define STL_BAUDBASE 115200
345 #define STL_CLOSEDELAY (5 * HZ / 10)
347 /*****************************************************************************/
350 * Define the Stallion PCI vendor and device IDs.
352 #ifndef PCI_VENDOR_ID_STALLION
353 #define PCI_VENDOR_ID_STALLION 0x124d
354 #endif
355 #ifndef PCI_DEVICE_ID_ECHPCI832
356 #define PCI_DEVICE_ID_ECHPCI832 0x0000
357 #endif
358 #ifndef PCI_DEVICE_ID_ECHPCI864
359 #define PCI_DEVICE_ID_ECHPCI864 0x0002
360 #endif
361 #ifndef PCI_DEVICE_ID_EIOPCI
362 #define PCI_DEVICE_ID_EIOPCI 0x0003
363 #endif
366 * Define structure to hold all Stallion PCI boards.
369 static struct pci_device_id stl_pcibrds[] = {
370 { PCI_DEVICE(PCI_VENDOR_ID_STALLION, PCI_DEVICE_ID_ECHPCI864),
371 .driver_data = BRD_ECH64PCI },
372 { PCI_DEVICE(PCI_VENDOR_ID_STALLION, PCI_DEVICE_ID_EIOPCI),
373 .driver_data = BRD_EASYIOPCI },
374 { PCI_DEVICE(PCI_VENDOR_ID_STALLION, PCI_DEVICE_ID_ECHPCI832),
375 .driver_data = BRD_ECHPCI },
376 { PCI_DEVICE(PCI_VENDOR_ID_NS, PCI_DEVICE_ID_NS_87410),
377 .driver_data = BRD_ECHPCI },
380 MODULE_DEVICE_TABLE(pci, stl_pcibrds);
382 /*****************************************************************************/
385 * Define macros to extract a brd/port number from a minor number.
387 #define MINOR2BRD(min) (((min) & 0xc0) >> 6)
388 #define MINOR2PORT(min) ((min) & 0x3f)
391 * Define a baud rate table that converts termios baud rate selector
392 * into the actual baud rate value. All baud rate calculations are
393 * based on the actual baud rate required.
395 static unsigned int stl_baudrates[] = {
396 0, 50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800,
397 9600, 19200, 38400, 57600, 115200, 230400, 460800, 921600
400 /*****************************************************************************/
403 * Declare all those functions in this driver!
406 static int stl_memioctl(struct inode *ip, struct file *fp, unsigned int cmd, unsigned long arg);
407 static int stl_brdinit(struct stlbrd *brdp);
408 static int stl_getportstats(struct tty_struct *tty, struct stlport *portp, comstats_t __user *cp);
409 static int stl_clrportstats(struct stlport *portp, comstats_t __user *cp);
410 static int stl_waitcarrier(struct tty_struct *tty, struct stlport *portp, struct file *filp);
413 * CD1400 uart specific handling functions.
415 static void stl_cd1400setreg(struct stlport *portp, int regnr, int value);
416 static int stl_cd1400getreg(struct stlport *portp, int regnr);
417 static int stl_cd1400updatereg(struct stlport *portp, int regnr, int value);
418 static int stl_cd1400panelinit(struct stlbrd *brdp, struct stlpanel *panelp);
419 static void stl_cd1400portinit(struct stlbrd *brdp, struct stlpanel *panelp, struct stlport *portp);
420 static void stl_cd1400setport(struct stlport *portp, struct ktermios *tiosp);
421 static int stl_cd1400getsignals(struct stlport *portp);
422 static void stl_cd1400setsignals(struct stlport *portp, int dtr, int rts);
423 static void stl_cd1400ccrwait(struct stlport *portp);
424 static void stl_cd1400enablerxtx(struct stlport *portp, int rx, int tx);
425 static void stl_cd1400startrxtx(struct stlport *portp, int rx, int tx);
426 static void stl_cd1400disableintrs(struct stlport *portp);
427 static void stl_cd1400sendbreak(struct stlport *portp, int len);
428 static void stl_cd1400flowctrl(struct stlport *portp, int state);
429 static void stl_cd1400sendflow(struct stlport *portp, int state);
430 static void stl_cd1400flush(struct stlport *portp);
431 static int stl_cd1400datastate(struct stlport *portp);
432 static void stl_cd1400eiointr(struct stlpanel *panelp, unsigned int iobase);
433 static void stl_cd1400echintr(struct stlpanel *panelp, unsigned int iobase);
434 static void stl_cd1400txisr(struct stlpanel *panelp, int ioaddr);
435 static void stl_cd1400rxisr(struct stlpanel *panelp, int ioaddr);
436 static void stl_cd1400mdmisr(struct stlpanel *panelp, int ioaddr);
438 static inline int stl_cd1400breakisr(struct stlport *portp, int ioaddr);
441 * SC26198 uart specific handling functions.
443 static void stl_sc26198setreg(struct stlport *portp, int regnr, int value);
444 static int stl_sc26198getreg(struct stlport *portp, int regnr);
445 static int stl_sc26198updatereg(struct stlport *portp, int regnr, int value);
446 static int stl_sc26198getglobreg(struct stlport *portp, int regnr);
447 static int stl_sc26198panelinit(struct stlbrd *brdp, struct stlpanel *panelp);
448 static void stl_sc26198portinit(struct stlbrd *brdp, struct stlpanel *panelp, struct stlport *portp);
449 static void stl_sc26198setport(struct stlport *portp, struct ktermios *tiosp);
450 static int stl_sc26198getsignals(struct stlport *portp);
451 static void stl_sc26198setsignals(struct stlport *portp, int dtr, int rts);
452 static void stl_sc26198enablerxtx(struct stlport *portp, int rx, int tx);
453 static void stl_sc26198startrxtx(struct stlport *portp, int rx, int tx);
454 static void stl_sc26198disableintrs(struct stlport *portp);
455 static void stl_sc26198sendbreak(struct stlport *portp, int len);
456 static void stl_sc26198flowctrl(struct stlport *portp, int state);
457 static void stl_sc26198sendflow(struct stlport *portp, int state);
458 static void stl_sc26198flush(struct stlport *portp);
459 static int stl_sc26198datastate(struct stlport *portp);
460 static void stl_sc26198wait(struct stlport *portp);
461 static void stl_sc26198txunflow(struct stlport *portp, struct tty_struct *tty);
462 static void stl_sc26198intr(struct stlpanel *panelp, unsigned int iobase);
463 static void stl_sc26198txisr(struct stlport *port);
464 static void stl_sc26198rxisr(struct stlport *port, unsigned int iack);
465 static void stl_sc26198rxbadch(struct stlport *portp, unsigned char status, char ch);
466 static void stl_sc26198rxbadchars(struct stlport *portp);
467 static void stl_sc26198otherisr(struct stlport *port, unsigned int iack);
469 /*****************************************************************************/
472 * Generic UART support structure.
474 typedef struct uart {
475 int (*panelinit)(struct stlbrd *brdp, struct stlpanel *panelp);
476 void (*portinit)(struct stlbrd *brdp, struct stlpanel *panelp, struct stlport *portp);
477 void (*setport)(struct stlport *portp, struct ktermios *tiosp);
478 int (*getsignals)(struct stlport *portp);
479 void (*setsignals)(struct stlport *portp, int dtr, int rts);
480 void (*enablerxtx)(struct stlport *portp, int rx, int tx);
481 void (*startrxtx)(struct stlport *portp, int rx, int tx);
482 void (*disableintrs)(struct stlport *portp);
483 void (*sendbreak)(struct stlport *portp, int len);
484 void (*flowctrl)(struct stlport *portp, int state);
485 void (*sendflow)(struct stlport *portp, int state);
486 void (*flush)(struct stlport *portp);
487 int (*datastate)(struct stlport *portp);
488 void (*intr)(struct stlpanel *panelp, unsigned int iobase);
489 } uart_t;
492 * Define some macros to make calling these functions nice and clean.
494 #define stl_panelinit (* ((uart_t *) panelp->uartp)->panelinit)
495 #define stl_portinit (* ((uart_t *) portp->uartp)->portinit)
496 #define stl_setport (* ((uart_t *) portp->uartp)->setport)
497 #define stl_getsignals (* ((uart_t *) portp->uartp)->getsignals)
498 #define stl_setsignals (* ((uart_t *) portp->uartp)->setsignals)
499 #define stl_enablerxtx (* ((uart_t *) portp->uartp)->enablerxtx)
500 #define stl_startrxtx (* ((uart_t *) portp->uartp)->startrxtx)
501 #define stl_disableintrs (* ((uart_t *) portp->uartp)->disableintrs)
502 #define stl_sendbreak (* ((uart_t *) portp->uartp)->sendbreak)
503 #define stl_flowctrl (* ((uart_t *) portp->uartp)->flowctrl)
504 #define stl_sendflow (* ((uart_t *) portp->uartp)->sendflow)
505 #define stl_flush (* ((uart_t *) portp->uartp)->flush)
506 #define stl_datastate (* ((uart_t *) portp->uartp)->datastate)
508 /*****************************************************************************/
511 * CD1400 UART specific data initialization.
513 static uart_t stl_cd1400uart = {
514 stl_cd1400panelinit,
515 stl_cd1400portinit,
516 stl_cd1400setport,
517 stl_cd1400getsignals,
518 stl_cd1400setsignals,
519 stl_cd1400enablerxtx,
520 stl_cd1400startrxtx,
521 stl_cd1400disableintrs,
522 stl_cd1400sendbreak,
523 stl_cd1400flowctrl,
524 stl_cd1400sendflow,
525 stl_cd1400flush,
526 stl_cd1400datastate,
527 stl_cd1400eiointr
531 * Define the offsets within the register bank of a cd1400 based panel.
532 * These io address offsets are common to the EasyIO board as well.
534 #define EREG_ADDR 0
535 #define EREG_DATA 4
536 #define EREG_RXACK 5
537 #define EREG_TXACK 6
538 #define EREG_MDACK 7
540 #define EREG_BANKSIZE 8
542 #define CD1400_CLK 25000000
543 #define CD1400_CLK8M 20000000
546 * Define the cd1400 baud rate clocks. These are used when calculating
547 * what clock and divisor to use for the required baud rate. Also
548 * define the maximum baud rate allowed, and the default base baud.
550 static int stl_cd1400clkdivs[] = {
551 CD1400_CLK0, CD1400_CLK1, CD1400_CLK2, CD1400_CLK3, CD1400_CLK4
554 /*****************************************************************************/
557 * SC26198 UART specific data initization.
559 static uart_t stl_sc26198uart = {
560 stl_sc26198panelinit,
561 stl_sc26198portinit,
562 stl_sc26198setport,
563 stl_sc26198getsignals,
564 stl_sc26198setsignals,
565 stl_sc26198enablerxtx,
566 stl_sc26198startrxtx,
567 stl_sc26198disableintrs,
568 stl_sc26198sendbreak,
569 stl_sc26198flowctrl,
570 stl_sc26198sendflow,
571 stl_sc26198flush,
572 stl_sc26198datastate,
573 stl_sc26198intr
577 * Define the offsets within the register bank of a sc26198 based panel.
579 #define XP_DATA 0
580 #define XP_ADDR 1
581 #define XP_MODID 2
582 #define XP_STATUS 2
583 #define XP_IACK 3
585 #define XP_BANKSIZE 4
588 * Define the sc26198 baud rate table. Offsets within the table
589 * represent the actual baud rate selector of sc26198 registers.
591 static unsigned int sc26198_baudtable[] = {
592 50, 75, 150, 200, 300, 450, 600, 900, 1200, 1800, 2400, 3600,
593 4800, 7200, 9600, 14400, 19200, 28800, 38400, 57600, 115200,
594 230400, 460800, 921600
597 #define SC26198_NRBAUDS ARRAY_SIZE(sc26198_baudtable)
599 /*****************************************************************************/
602 * Define the driver info for a user level control device. Used mainly
603 * to get at port stats - only not using the port device itself.
605 static const struct file_operations stl_fsiomem = {
606 .owner = THIS_MODULE,
607 .ioctl = stl_memioctl,
610 static struct class *stallion_class;
612 static void stl_cd_change(struct stlport *portp)
614 unsigned int oldsigs = portp->sigs;
615 struct tty_struct *tty = tty_port_tty_get(&portp->port);
617 if (!tty)
618 return;
620 portp->sigs = stl_getsignals(portp);
622 if ((portp->sigs & TIOCM_CD) && ((oldsigs & TIOCM_CD) == 0))
623 wake_up_interruptible(&portp->port.open_wait);
625 if ((oldsigs & TIOCM_CD) && ((portp->sigs & TIOCM_CD) == 0))
626 if (portp->port.flags & ASYNC_CHECK_CD)
627 tty_hangup(tty);
628 tty_kref_put(tty);
632 * Check for any arguments passed in on the module load command line.
635 /*****************************************************************************/
638 * Parse the supplied argument string, into the board conf struct.
641 static int __init stl_parsebrd(struct stlconf *confp, char **argp)
643 char *sp;
644 unsigned int i;
646 pr_debug("stl_parsebrd(confp=%p,argp=%p)\n", confp, argp);
648 if ((argp[0] == NULL) || (*argp[0] == 0))
649 return 0;
651 for (sp = argp[0], i = 0; (*sp != 0) && (i < 25); sp++, i++)
652 *sp = tolower(*sp);
654 for (i = 0; i < ARRAY_SIZE(stl_brdstr); i++)
655 if (strcmp(stl_brdstr[i].name, argp[0]) == 0)
656 break;
658 if (i == ARRAY_SIZE(stl_brdstr)) {
659 printk("STALLION: unknown board name, %s?\n", argp[0]);
660 return 0;
663 confp->brdtype = stl_brdstr[i].type;
665 i = 1;
666 if ((argp[i] != NULL) && (*argp[i] != 0))
667 confp->ioaddr1 = simple_strtoul(argp[i], NULL, 0);
668 i++;
669 if (confp->brdtype == BRD_ECH) {
670 if ((argp[i] != NULL) && (*argp[i] != 0))
671 confp->ioaddr2 = simple_strtoul(argp[i], NULL, 0);
672 i++;
674 if ((argp[i] != NULL) && (*argp[i] != 0))
675 confp->irq = simple_strtoul(argp[i], NULL, 0);
676 return 1;
679 /*****************************************************************************/
682 * Allocate a new board structure. Fill out the basic info in it.
685 static struct stlbrd *stl_allocbrd(void)
687 struct stlbrd *brdp;
689 brdp = kzalloc(sizeof(struct stlbrd), GFP_KERNEL);
690 if (!brdp) {
691 printk("STALLION: failed to allocate memory (size=%Zd)\n",
692 sizeof(struct stlbrd));
693 return NULL;
696 brdp->magic = STL_BOARDMAGIC;
697 return brdp;
700 /*****************************************************************************/
702 static int stl_open(struct tty_struct *tty, struct file *filp)
704 struct stlport *portp;
705 struct stlbrd *brdp;
706 unsigned int minordev, brdnr, panelnr;
707 int portnr, rc;
709 pr_debug("stl_open(tty=%p,filp=%p): device=%s\n", tty, filp, tty->name);
711 minordev = tty->index;
712 brdnr = MINOR2BRD(minordev);
713 if (brdnr >= stl_nrbrds)
714 return -ENODEV;
715 brdp = stl_brds[brdnr];
716 if (brdp == NULL)
717 return -ENODEV;
718 minordev = MINOR2PORT(minordev);
719 for (portnr = -1, panelnr = 0; panelnr < STL_MAXPANELS; panelnr++) {
720 if (brdp->panels[panelnr] == NULL)
721 break;
722 if (minordev < brdp->panels[panelnr]->nrports) {
723 portnr = minordev;
724 break;
726 minordev -= brdp->panels[panelnr]->nrports;
728 if (portnr < 0)
729 return -ENODEV;
731 portp = brdp->panels[panelnr]->ports[portnr];
732 if (portp == NULL)
733 return -ENODEV;
736 * On the first open of the device setup the port hardware, and
737 * initialize the per port data structure.
739 tty_port_tty_set(&portp->port, tty);
740 tty->driver_data = portp;
741 portp->port.count++;
743 if ((portp->port.flags & ASYNC_INITIALIZED) == 0) {
744 if (!portp->tx.buf) {
745 portp->tx.buf = kmalloc(STL_TXBUFSIZE, GFP_KERNEL);
746 if (!portp->tx.buf)
747 return -ENOMEM;
748 portp->tx.head = portp->tx.buf;
749 portp->tx.tail = portp->tx.buf;
751 stl_setport(portp, tty->termios);
752 portp->sigs = stl_getsignals(portp);
753 stl_setsignals(portp, 1, 1);
754 stl_enablerxtx(portp, 1, 1);
755 stl_startrxtx(portp, 1, 0);
756 clear_bit(TTY_IO_ERROR, &tty->flags);
757 portp->port.flags |= ASYNC_INITIALIZED;
761 * Check if this port is in the middle of closing. If so then wait
762 * until it is closed then return error status, based on flag settings.
763 * The sleep here does not need interrupt protection since the wakeup
764 * for it is done with the same context.
766 if (portp->port.flags & ASYNC_CLOSING) {
767 interruptible_sleep_on(&portp->port.close_wait);
768 if (portp->port.flags & ASYNC_HUP_NOTIFY)
769 return -EAGAIN;
770 return -ERESTARTSYS;
774 * Based on type of open being done check if it can overlap with any
775 * previous opens still in effect. If we are a normal serial device
776 * then also we might have to wait for carrier.
778 if (!(filp->f_flags & O_NONBLOCK))
779 if ((rc = stl_waitcarrier(tty, portp, filp)) != 0)
780 return rc;
782 portp->port.flags |= ASYNC_NORMAL_ACTIVE;
784 return 0;
787 /*****************************************************************************/
790 * Possibly need to wait for carrier (DCD signal) to come high. Say
791 * maybe because if we are clocal then we don't need to wait...
794 static int stl_waitcarrier(struct tty_struct *tty, struct stlport *portp,
795 struct file *filp)
797 unsigned long flags;
798 int rc, doclocal;
800 pr_debug("stl_waitcarrier(portp=%p,filp=%p)\n", portp, filp);
802 rc = 0;
803 doclocal = 0;
805 spin_lock_irqsave(&stallion_lock, flags);
807 if (tty->termios->c_cflag & CLOCAL)
808 doclocal++;
810 portp->openwaitcnt++;
811 if (! tty_hung_up_p(filp))
812 portp->port.count--;
814 for (;;) {
815 /* Takes brd_lock internally */
816 stl_setsignals(portp, 1, 1);
817 if (tty_hung_up_p(filp) ||
818 ((portp->port.flags & ASYNC_INITIALIZED) == 0)) {
819 if (portp->port.flags & ASYNC_HUP_NOTIFY)
820 rc = -EBUSY;
821 else
822 rc = -ERESTARTSYS;
823 break;
825 if (((portp->port.flags & ASYNC_CLOSING) == 0) &&
826 (doclocal || (portp->sigs & TIOCM_CD)))
827 break;
828 if (signal_pending(current)) {
829 rc = -ERESTARTSYS;
830 break;
832 /* FIXME */
833 interruptible_sleep_on(&portp->port.open_wait);
836 if (! tty_hung_up_p(filp))
837 portp->port.count++;
838 portp->openwaitcnt--;
839 spin_unlock_irqrestore(&stallion_lock, flags);
841 return rc;
844 /*****************************************************************************/
846 static void stl_flushbuffer(struct tty_struct *tty)
848 struct stlport *portp;
850 pr_debug("stl_flushbuffer(tty=%p)\n", tty);
852 if (tty == NULL)
853 return;
854 portp = tty->driver_data;
855 if (portp == NULL)
856 return;
858 stl_flush(portp);
859 tty_wakeup(tty);
862 /*****************************************************************************/
864 static void stl_waituntilsent(struct tty_struct *tty, int timeout)
866 struct stlport *portp;
867 unsigned long tend;
869 pr_debug("stl_waituntilsent(tty=%p,timeout=%d)\n", tty, timeout);
871 if (tty == NULL)
872 return;
873 portp = tty->driver_data;
874 if (portp == NULL)
875 return;
877 if (timeout == 0)
878 timeout = HZ;
879 tend = jiffies + timeout;
881 lock_kernel();
882 while (stl_datastate(portp)) {
883 if (signal_pending(current))
884 break;
885 msleep_interruptible(20);
886 if (time_after_eq(jiffies, tend))
887 break;
889 unlock_kernel();
892 /*****************************************************************************/
894 static void stl_close(struct tty_struct *tty, struct file *filp)
896 struct stlport *portp;
897 unsigned long flags;
899 pr_debug("stl_close(tty=%p,filp=%p)\n", tty, filp);
901 portp = tty->driver_data;
902 if (portp == NULL)
903 return;
905 spin_lock_irqsave(&stallion_lock, flags);
906 if (tty_hung_up_p(filp)) {
907 spin_unlock_irqrestore(&stallion_lock, flags);
908 return;
910 if ((tty->count == 1) && (portp->port.count != 1))
911 portp->port.count = 1;
912 if (portp->port.count-- > 1) {
913 spin_unlock_irqrestore(&stallion_lock, flags);
914 return;
917 portp->port.count = 0;
918 portp->port.flags |= ASYNC_CLOSING;
921 * May want to wait for any data to drain before closing. The BUSY
922 * flag keeps track of whether we are still sending or not - it is
923 * very accurate for the cd1400, not quite so for the sc26198.
924 * (The sc26198 has no "end-of-data" interrupt only empty FIFO)
926 tty->closing = 1;
928 spin_unlock_irqrestore(&stallion_lock, flags);
930 if (portp->closing_wait != ASYNC_CLOSING_WAIT_NONE)
931 tty_wait_until_sent(tty, portp->closing_wait);
932 stl_waituntilsent(tty, (HZ / 2));
935 spin_lock_irqsave(&stallion_lock, flags);
936 portp->port.flags &= ~ASYNC_INITIALIZED;
937 spin_unlock_irqrestore(&stallion_lock, flags);
939 stl_disableintrs(portp);
940 if (tty->termios->c_cflag & HUPCL)
941 stl_setsignals(portp, 0, 0);
942 stl_enablerxtx(portp, 0, 0);
943 stl_flushbuffer(tty);
944 portp->istate = 0;
945 if (portp->tx.buf != NULL) {
946 kfree(portp->tx.buf);
947 portp->tx.buf = NULL;
948 portp->tx.head = NULL;
949 portp->tx.tail = NULL;
951 set_bit(TTY_IO_ERROR, &tty->flags);
952 tty_ldisc_flush(tty);
954 tty->closing = 0;
955 tty_port_tty_set(&portp->port, NULL);
957 if (portp->openwaitcnt) {
958 if (portp->close_delay)
959 msleep_interruptible(jiffies_to_msecs(portp->close_delay));
960 wake_up_interruptible(&portp->port.open_wait);
963 portp->port.flags &= ~(ASYNC_NORMAL_ACTIVE|ASYNC_CLOSING);
964 wake_up_interruptible(&portp->port.close_wait);
967 /*****************************************************************************/
970 * Write routine. Take data and stuff it in to the TX ring queue.
971 * If transmit interrupts are not running then start them.
974 static int stl_write(struct tty_struct *tty, const unsigned char *buf, int count)
976 struct stlport *portp;
977 unsigned int len, stlen;
978 unsigned char *chbuf;
979 char *head, *tail;
981 pr_debug("stl_write(tty=%p,buf=%p,count=%d)\n", tty, buf, count);
983 portp = tty->driver_data;
984 if (portp == NULL)
985 return 0;
986 if (portp->tx.buf == NULL)
987 return 0;
990 * If copying direct from user space we must cater for page faults,
991 * causing us to "sleep" here for a while. To handle this copy in all
992 * the data we need now, into a local buffer. Then when we got it all
993 * copy it into the TX buffer.
995 chbuf = (unsigned char *) buf;
997 head = portp->tx.head;
998 tail = portp->tx.tail;
999 if (head >= tail) {
1000 len = STL_TXBUFSIZE - (head - tail) - 1;
1001 stlen = STL_TXBUFSIZE - (head - portp->tx.buf);
1002 } else {
1003 len = tail - head - 1;
1004 stlen = len;
1007 len = min(len, (unsigned int)count);
1008 count = 0;
1009 while (len > 0) {
1010 stlen = min(len, stlen);
1011 memcpy(head, chbuf, stlen);
1012 len -= stlen;
1013 chbuf += stlen;
1014 count += stlen;
1015 head += stlen;
1016 if (head >= (portp->tx.buf + STL_TXBUFSIZE)) {
1017 head = portp->tx.buf;
1018 stlen = tail - head;
1021 portp->tx.head = head;
1023 clear_bit(ASYI_TXLOW, &portp->istate);
1024 stl_startrxtx(portp, -1, 1);
1026 return count;
1029 /*****************************************************************************/
1031 static int stl_putchar(struct tty_struct *tty, unsigned char ch)
1033 struct stlport *portp;
1034 unsigned int len;
1035 char *head, *tail;
1037 pr_debug("stl_putchar(tty=%p,ch=%x)\n", tty, ch);
1039 if (tty == NULL)
1040 return -EINVAL;
1041 portp = tty->driver_data;
1042 if (portp == NULL)
1043 return -EINVAL;
1044 if (portp->tx.buf == NULL)
1045 return -EINVAL;
1047 head = portp->tx.head;
1048 tail = portp->tx.tail;
1050 len = (head >= tail) ? (STL_TXBUFSIZE - (head - tail)) : (tail - head);
1051 len--;
1053 if (len > 0) {
1054 *head++ = ch;
1055 if (head >= (portp->tx.buf + STL_TXBUFSIZE))
1056 head = portp->tx.buf;
1058 portp->tx.head = head;
1059 return 0;
1062 /*****************************************************************************/
1065 * If there are any characters in the buffer then make sure that TX
1066 * interrupts are on and get'em out. Normally used after the putchar
1067 * routine has been called.
1070 static void stl_flushchars(struct tty_struct *tty)
1072 struct stlport *portp;
1074 pr_debug("stl_flushchars(tty=%p)\n", tty);
1076 if (tty == NULL)
1077 return;
1078 portp = tty->driver_data;
1079 if (portp == NULL)
1080 return;
1081 if (portp->tx.buf == NULL)
1082 return;
1084 stl_startrxtx(portp, -1, 1);
1087 /*****************************************************************************/
1089 static int stl_writeroom(struct tty_struct *tty)
1091 struct stlport *portp;
1092 char *head, *tail;
1094 pr_debug("stl_writeroom(tty=%p)\n", tty);
1096 if (tty == NULL)
1097 return 0;
1098 portp = tty->driver_data;
1099 if (portp == NULL)
1100 return 0;
1101 if (portp->tx.buf == NULL)
1102 return 0;
1104 head = portp->tx.head;
1105 tail = portp->tx.tail;
1106 return (head >= tail) ? (STL_TXBUFSIZE - (head - tail) - 1) : (tail - head - 1);
1109 /*****************************************************************************/
1112 * Return number of chars in the TX buffer. Normally we would just
1113 * calculate the number of chars in the buffer and return that, but if
1114 * the buffer is empty and TX interrupts are still on then we return
1115 * that the buffer still has 1 char in it. This way whoever called us
1116 * will not think that ALL chars have drained - since the UART still
1117 * must have some chars in it (we are busy after all).
1120 static int stl_charsinbuffer(struct tty_struct *tty)
1122 struct stlport *portp;
1123 unsigned int size;
1124 char *head, *tail;
1126 pr_debug("stl_charsinbuffer(tty=%p)\n", tty);
1128 if (tty == NULL)
1129 return 0;
1130 portp = tty->driver_data;
1131 if (portp == NULL)
1132 return 0;
1133 if (portp->tx.buf == NULL)
1134 return 0;
1136 head = portp->tx.head;
1137 tail = portp->tx.tail;
1138 size = (head >= tail) ? (head - tail) : (STL_TXBUFSIZE - (tail - head));
1139 if ((size == 0) && test_bit(ASYI_TXBUSY, &portp->istate))
1140 size = 1;
1141 return size;
1144 /*****************************************************************************/
1147 * Generate the serial struct info.
1150 static int stl_getserial(struct stlport *portp, struct serial_struct __user *sp)
1152 struct serial_struct sio;
1153 struct stlbrd *brdp;
1155 pr_debug("stl_getserial(portp=%p,sp=%p)\n", portp, sp);
1157 memset(&sio, 0, sizeof(struct serial_struct));
1158 sio.line = portp->portnr;
1159 sio.port = portp->ioaddr;
1160 sio.flags = portp->port.flags;
1161 sio.baud_base = portp->baud_base;
1162 sio.close_delay = portp->close_delay;
1163 sio.closing_wait = portp->closing_wait;
1164 sio.custom_divisor = portp->custom_divisor;
1165 sio.hub6 = 0;
1166 if (portp->uartp == &stl_cd1400uart) {
1167 sio.type = PORT_CIRRUS;
1168 sio.xmit_fifo_size = CD1400_TXFIFOSIZE;
1169 } else {
1170 sio.type = PORT_UNKNOWN;
1171 sio.xmit_fifo_size = SC26198_TXFIFOSIZE;
1174 brdp = stl_brds[portp->brdnr];
1175 if (brdp != NULL)
1176 sio.irq = brdp->irq;
1178 return copy_to_user(sp, &sio, sizeof(struct serial_struct)) ? -EFAULT : 0;
1181 /*****************************************************************************/
1184 * Set port according to the serial struct info.
1185 * At this point we do not do any auto-configure stuff, so we will
1186 * just quietly ignore any requests to change irq, etc.
1189 static int stl_setserial(struct tty_struct *tty, struct serial_struct __user *sp)
1191 struct stlport * portp = tty->driver_data;
1192 struct serial_struct sio;
1194 pr_debug("stl_setserial(portp=%p,sp=%p)\n", portp, sp);
1196 if (copy_from_user(&sio, sp, sizeof(struct serial_struct)))
1197 return -EFAULT;
1198 if (!capable(CAP_SYS_ADMIN)) {
1199 if ((sio.baud_base != portp->baud_base) ||
1200 (sio.close_delay != portp->close_delay) ||
1201 ((sio.flags & ~ASYNC_USR_MASK) !=
1202 (portp->port.flags & ~ASYNC_USR_MASK)))
1203 return -EPERM;
1206 portp->port.flags = (portp->port.flags & ~ASYNC_USR_MASK) |
1207 (sio.flags & ASYNC_USR_MASK);
1208 portp->baud_base = sio.baud_base;
1209 portp->close_delay = sio.close_delay;
1210 portp->closing_wait = sio.closing_wait;
1211 portp->custom_divisor = sio.custom_divisor;
1212 stl_setport(portp, tty->termios);
1213 return 0;
1216 /*****************************************************************************/
1218 static int stl_tiocmget(struct tty_struct *tty, struct file *file)
1220 struct stlport *portp;
1222 if (tty == NULL)
1223 return -ENODEV;
1224 portp = tty->driver_data;
1225 if (portp == NULL)
1226 return -ENODEV;
1227 if (tty->flags & (1 << TTY_IO_ERROR))
1228 return -EIO;
1230 return stl_getsignals(portp);
1233 static int stl_tiocmset(struct tty_struct *tty, struct file *file,
1234 unsigned int set, unsigned int clear)
1236 struct stlport *portp;
1237 int rts = -1, dtr = -1;
1239 if (tty == NULL)
1240 return -ENODEV;
1241 portp = tty->driver_data;
1242 if (portp == NULL)
1243 return -ENODEV;
1244 if (tty->flags & (1 << TTY_IO_ERROR))
1245 return -EIO;
1247 if (set & TIOCM_RTS)
1248 rts = 1;
1249 if (set & TIOCM_DTR)
1250 dtr = 1;
1251 if (clear & TIOCM_RTS)
1252 rts = 0;
1253 if (clear & TIOCM_DTR)
1254 dtr = 0;
1256 stl_setsignals(portp, dtr, rts);
1257 return 0;
1260 static int stl_ioctl(struct tty_struct *tty, struct file *file, unsigned int cmd, unsigned long arg)
1262 struct stlport *portp;
1263 int rc;
1264 void __user *argp = (void __user *)arg;
1266 pr_debug("stl_ioctl(tty=%p,file=%p,cmd=%x,arg=%lx)\n", tty, file, cmd,
1267 arg);
1269 if (tty == NULL)
1270 return -ENODEV;
1271 portp = tty->driver_data;
1272 if (portp == NULL)
1273 return -ENODEV;
1275 if ((cmd != TIOCGSERIAL) && (cmd != TIOCSSERIAL) &&
1276 (cmd != COM_GETPORTSTATS) && (cmd != COM_CLRPORTSTATS))
1277 if (tty->flags & (1 << TTY_IO_ERROR))
1278 return -EIO;
1280 rc = 0;
1282 lock_kernel();
1284 switch (cmd) {
1285 case TIOCGSERIAL:
1286 rc = stl_getserial(portp, argp);
1287 break;
1288 case TIOCSSERIAL:
1289 rc = stl_setserial(tty, argp);
1290 break;
1291 case COM_GETPORTSTATS:
1292 rc = stl_getportstats(tty, portp, argp);
1293 break;
1294 case COM_CLRPORTSTATS:
1295 rc = stl_clrportstats(portp, argp);
1296 break;
1297 case TIOCSERCONFIG:
1298 case TIOCSERGWILD:
1299 case TIOCSERSWILD:
1300 case TIOCSERGETLSR:
1301 case TIOCSERGSTRUCT:
1302 case TIOCSERGETMULTI:
1303 case TIOCSERSETMULTI:
1304 default:
1305 rc = -ENOIOCTLCMD;
1306 break;
1308 unlock_kernel();
1309 return rc;
1312 /*****************************************************************************/
1315 * Start the transmitter again. Just turn TX interrupts back on.
1318 static void stl_start(struct tty_struct *tty)
1320 struct stlport *portp;
1322 pr_debug("stl_start(tty=%p)\n", tty);
1324 if (tty == NULL)
1325 return;
1326 portp = tty->driver_data;
1327 if (portp == NULL)
1328 return;
1329 stl_startrxtx(portp, -1, 1);
1332 /*****************************************************************************/
1334 static void stl_settermios(struct tty_struct *tty, struct ktermios *old)
1336 struct stlport *portp;
1337 struct ktermios *tiosp;
1339 pr_debug("stl_settermios(tty=%p,old=%p)\n", tty, old);
1341 if (tty == NULL)
1342 return;
1343 portp = tty->driver_data;
1344 if (portp == NULL)
1345 return;
1347 tiosp = tty->termios;
1348 if ((tiosp->c_cflag == old->c_cflag) &&
1349 (tiosp->c_iflag == old->c_iflag))
1350 return;
1352 stl_setport(portp, tiosp);
1353 stl_setsignals(portp, ((tiosp->c_cflag & (CBAUD & ~CBAUDEX)) ? 1 : 0),
1354 -1);
1355 if ((old->c_cflag & CRTSCTS) && ((tiosp->c_cflag & CRTSCTS) == 0)) {
1356 tty->hw_stopped = 0;
1357 stl_start(tty);
1359 if (((old->c_cflag & CLOCAL) == 0) && (tiosp->c_cflag & CLOCAL))
1360 wake_up_interruptible(&portp->port.open_wait);
1363 /*****************************************************************************/
1366 * Attempt to flow control who ever is sending us data. Based on termios
1367 * settings use software or/and hardware flow control.
1370 static void stl_throttle(struct tty_struct *tty)
1372 struct stlport *portp;
1374 pr_debug("stl_throttle(tty=%p)\n", tty);
1376 if (tty == NULL)
1377 return;
1378 portp = tty->driver_data;
1379 if (portp == NULL)
1380 return;
1381 stl_flowctrl(portp, 0);
1384 /*****************************************************************************/
1387 * Unflow control the device sending us data...
1390 static void stl_unthrottle(struct tty_struct *tty)
1392 struct stlport *portp;
1394 pr_debug("stl_unthrottle(tty=%p)\n", tty);
1396 if (tty == NULL)
1397 return;
1398 portp = tty->driver_data;
1399 if (portp == NULL)
1400 return;
1401 stl_flowctrl(portp, 1);
1404 /*****************************************************************************/
1407 * Stop the transmitter. Basically to do this we will just turn TX
1408 * interrupts off.
1411 static void stl_stop(struct tty_struct *tty)
1413 struct stlport *portp;
1415 pr_debug("stl_stop(tty=%p)\n", tty);
1417 if (tty == NULL)
1418 return;
1419 portp = tty->driver_data;
1420 if (portp == NULL)
1421 return;
1422 stl_startrxtx(portp, -1, 0);
1425 /*****************************************************************************/
1428 * Hangup this port. This is pretty much like closing the port, only
1429 * a little more brutal. No waiting for data to drain. Shutdown the
1430 * port and maybe drop signals.
1433 static void stl_hangup(struct tty_struct *tty)
1435 struct stlport *portp;
1437 pr_debug("stl_hangup(tty=%p)\n", tty);
1439 if (tty == NULL)
1440 return;
1441 portp = tty->driver_data;
1442 if (portp == NULL)
1443 return;
1445 portp->port.flags &= ~ASYNC_INITIALIZED;
1446 stl_disableintrs(portp);
1447 if (tty->termios->c_cflag & HUPCL)
1448 stl_setsignals(portp, 0, 0);
1449 stl_enablerxtx(portp, 0, 0);
1450 stl_flushbuffer(tty);
1451 portp->istate = 0;
1452 set_bit(TTY_IO_ERROR, &tty->flags);
1453 if (portp->tx.buf != NULL) {
1454 kfree(portp->tx.buf);
1455 portp->tx.buf = NULL;
1456 portp->tx.head = NULL;
1457 portp->tx.tail = NULL;
1459 tty_port_tty_set(&portp->port, NULL);
1460 portp->port.flags &= ~ASYNC_NORMAL_ACTIVE;
1461 portp->port.count = 0;
1462 wake_up_interruptible(&portp->port.open_wait);
1465 /*****************************************************************************/
1467 static int stl_breakctl(struct tty_struct *tty, int state)
1469 struct stlport *portp;
1471 pr_debug("stl_breakctl(tty=%p,state=%d)\n", tty, state);
1473 if (tty == NULL)
1474 return -EINVAL;
1475 portp = tty->driver_data;
1476 if (portp == NULL)
1477 return -EINVAL;
1479 stl_sendbreak(portp, ((state == -1) ? 1 : 2));
1480 return 0;
1483 /*****************************************************************************/
1485 static void stl_sendxchar(struct tty_struct *tty, char ch)
1487 struct stlport *portp;
1489 pr_debug("stl_sendxchar(tty=%p,ch=%x)\n", tty, ch);
1491 if (tty == NULL)
1492 return;
1493 portp = tty->driver_data;
1494 if (portp == NULL)
1495 return;
1497 if (ch == STOP_CHAR(tty))
1498 stl_sendflow(portp, 0);
1499 else if (ch == START_CHAR(tty))
1500 stl_sendflow(portp, 1);
1501 else
1502 stl_putchar(tty, ch);
1505 /*****************************************************************************/
1507 #define MAXLINE 80
1510 * Format info for a specified port. The line is deliberately limited
1511 * to 80 characters. (If it is too long it will be truncated, if too
1512 * short then padded with spaces).
1515 static int stl_portinfo(struct stlport *portp, int portnr, char *pos)
1517 char *sp;
1518 int sigs, cnt;
1520 sp = pos;
1521 sp += sprintf(sp, "%d: uart:%s tx:%d rx:%d",
1522 portnr, (portp->hwid == 1) ? "SC26198" : "CD1400",
1523 (int) portp->stats.txtotal, (int) portp->stats.rxtotal);
1525 if (portp->stats.rxframing)
1526 sp += sprintf(sp, " fe:%d", (int) portp->stats.rxframing);
1527 if (portp->stats.rxparity)
1528 sp += sprintf(sp, " pe:%d", (int) portp->stats.rxparity);
1529 if (portp->stats.rxbreaks)
1530 sp += sprintf(sp, " brk:%d", (int) portp->stats.rxbreaks);
1531 if (portp->stats.rxoverrun)
1532 sp += sprintf(sp, " oe:%d", (int) portp->stats.rxoverrun);
1534 sigs = stl_getsignals(portp);
1535 cnt = sprintf(sp, "%s%s%s%s%s ",
1536 (sigs & TIOCM_RTS) ? "|RTS" : "",
1537 (sigs & TIOCM_CTS) ? "|CTS" : "",
1538 (sigs & TIOCM_DTR) ? "|DTR" : "",
1539 (sigs & TIOCM_CD) ? "|DCD" : "",
1540 (sigs & TIOCM_DSR) ? "|DSR" : "");
1541 *sp = ' ';
1542 sp += cnt;
1544 for (cnt = sp - pos; cnt < (MAXLINE - 1); cnt++)
1545 *sp++ = ' ';
1546 if (cnt >= MAXLINE)
1547 pos[(MAXLINE - 2)] = '+';
1548 pos[(MAXLINE - 1)] = '\n';
1550 return MAXLINE;
1553 /*****************************************************************************/
1556 * Port info, read from the /proc file system.
1559 static int stl_readproc(char *page, char **start, off_t off, int count, int *eof, void *data)
1561 struct stlbrd *brdp;
1562 struct stlpanel *panelp;
1563 struct stlport *portp;
1564 unsigned int brdnr, panelnr, portnr;
1565 int totalport, curoff, maxoff;
1566 char *pos;
1568 pr_debug("stl_readproc(page=%p,start=%p,off=%lx,count=%d,eof=%p,"
1569 "data=%p\n", page, start, off, count, eof, data);
1571 pos = page;
1572 totalport = 0;
1573 curoff = 0;
1575 if (off == 0) {
1576 pos += sprintf(pos, "%s: version %s", stl_drvtitle,
1577 stl_drvversion);
1578 while (pos < (page + MAXLINE - 1))
1579 *pos++ = ' ';
1580 *pos++ = '\n';
1582 curoff = MAXLINE;
1585 * We scan through for each board, panel and port. The offset is
1586 * calculated on the fly, and irrelevant ports are skipped.
1588 for (brdnr = 0; brdnr < stl_nrbrds; brdnr++) {
1589 brdp = stl_brds[brdnr];
1590 if (brdp == NULL)
1591 continue;
1592 if (brdp->state == 0)
1593 continue;
1595 maxoff = curoff + (brdp->nrports * MAXLINE);
1596 if (off >= maxoff) {
1597 curoff = maxoff;
1598 continue;
1601 totalport = brdnr * STL_MAXPORTS;
1602 for (panelnr = 0; panelnr < brdp->nrpanels; panelnr++) {
1603 panelp = brdp->panels[panelnr];
1604 if (panelp == NULL)
1605 continue;
1607 maxoff = curoff + (panelp->nrports * MAXLINE);
1608 if (off >= maxoff) {
1609 curoff = maxoff;
1610 totalport += panelp->nrports;
1611 continue;
1614 for (portnr = 0; portnr < panelp->nrports; portnr++,
1615 totalport++) {
1616 portp = panelp->ports[portnr];
1617 if (portp == NULL)
1618 continue;
1619 if (off >= (curoff += MAXLINE))
1620 continue;
1621 if ((pos - page + MAXLINE) > count)
1622 goto stl_readdone;
1623 pos += stl_portinfo(portp, totalport, pos);
1628 *eof = 1;
1630 stl_readdone:
1631 *start = page;
1632 return pos - page;
1635 /*****************************************************************************/
1638 * All board interrupts are vectored through here first. This code then
1639 * calls off to the approrpriate board interrupt handlers.
1642 static irqreturn_t stl_intr(int irq, void *dev_id)
1644 struct stlbrd *brdp = dev_id;
1646 pr_debug("stl_intr(brdp=%p,irq=%d)\n", brdp, brdp->irq);
1648 return IRQ_RETVAL((* brdp->isr)(brdp));
1651 /*****************************************************************************/
1654 * Interrupt service routine for EasyIO board types.
1657 static int stl_eiointr(struct stlbrd *brdp)
1659 struct stlpanel *panelp;
1660 unsigned int iobase;
1661 int handled = 0;
1663 spin_lock(&brd_lock);
1664 panelp = brdp->panels[0];
1665 iobase = panelp->iobase;
1666 while (inb(brdp->iostatus) & EIO_INTRPEND) {
1667 handled = 1;
1668 (* panelp->isr)(panelp, iobase);
1670 spin_unlock(&brd_lock);
1671 return handled;
1674 /*****************************************************************************/
1677 * Interrupt service routine for ECH-AT board types.
1680 static int stl_echatintr(struct stlbrd *brdp)
1682 struct stlpanel *panelp;
1683 unsigned int ioaddr, bnknr;
1684 int handled = 0;
1686 outb((brdp->ioctrlval | ECH_BRDENABLE), brdp->ioctrl);
1688 while (inb(brdp->iostatus) & ECH_INTRPEND) {
1689 handled = 1;
1690 for (bnknr = 0; bnknr < brdp->nrbnks; bnknr++) {
1691 ioaddr = brdp->bnkstataddr[bnknr];
1692 if (inb(ioaddr) & ECH_PNLINTRPEND) {
1693 panelp = brdp->bnk2panel[bnknr];
1694 (* panelp->isr)(panelp, (ioaddr & 0xfffc));
1699 outb((brdp->ioctrlval | ECH_BRDDISABLE), brdp->ioctrl);
1701 return handled;
1704 /*****************************************************************************/
1707 * Interrupt service routine for ECH-MCA board types.
1710 static int stl_echmcaintr(struct stlbrd *brdp)
1712 struct stlpanel *panelp;
1713 unsigned int ioaddr, bnknr;
1714 int handled = 0;
1716 while (inb(brdp->iostatus) & ECH_INTRPEND) {
1717 handled = 1;
1718 for (bnknr = 0; bnknr < brdp->nrbnks; bnknr++) {
1719 ioaddr = brdp->bnkstataddr[bnknr];
1720 if (inb(ioaddr) & ECH_PNLINTRPEND) {
1721 panelp = brdp->bnk2panel[bnknr];
1722 (* panelp->isr)(panelp, (ioaddr & 0xfffc));
1726 return handled;
1729 /*****************************************************************************/
1732 * Interrupt service routine for ECH-PCI board types.
1735 static int stl_echpciintr(struct stlbrd *brdp)
1737 struct stlpanel *panelp;
1738 unsigned int ioaddr, bnknr, recheck;
1739 int handled = 0;
1741 while (1) {
1742 recheck = 0;
1743 for (bnknr = 0; bnknr < brdp->nrbnks; bnknr++) {
1744 outb(brdp->bnkpageaddr[bnknr], brdp->ioctrl);
1745 ioaddr = brdp->bnkstataddr[bnknr];
1746 if (inb(ioaddr) & ECH_PNLINTRPEND) {
1747 panelp = brdp->bnk2panel[bnknr];
1748 (* panelp->isr)(panelp, (ioaddr & 0xfffc));
1749 recheck++;
1750 handled = 1;
1753 if (! recheck)
1754 break;
1756 return handled;
1759 /*****************************************************************************/
1762 * Interrupt service routine for ECH-8/64-PCI board types.
1765 static int stl_echpci64intr(struct stlbrd *brdp)
1767 struct stlpanel *panelp;
1768 unsigned int ioaddr, bnknr;
1769 int handled = 0;
1771 while (inb(brdp->ioctrl) & 0x1) {
1772 handled = 1;
1773 for (bnknr = 0; bnknr < brdp->nrbnks; bnknr++) {
1774 ioaddr = brdp->bnkstataddr[bnknr];
1775 if (inb(ioaddr) & ECH_PNLINTRPEND) {
1776 panelp = brdp->bnk2panel[bnknr];
1777 (* panelp->isr)(panelp, (ioaddr & 0xfffc));
1782 return handled;
1785 /*****************************************************************************/
1788 * Initialize all the ports on a panel.
1791 static int __devinit stl_initports(struct stlbrd *brdp, struct stlpanel *panelp)
1793 struct stlport *portp;
1794 unsigned int i;
1795 int chipmask;
1797 pr_debug("stl_initports(brdp=%p,panelp=%p)\n", brdp, panelp);
1799 chipmask = stl_panelinit(brdp, panelp);
1802 * All UART's are initialized (if found!). Now go through and setup
1803 * each ports data structures.
1805 for (i = 0; i < panelp->nrports; i++) {
1806 portp = kzalloc(sizeof(struct stlport), GFP_KERNEL);
1807 if (!portp) {
1808 printk("STALLION: failed to allocate memory "
1809 "(size=%Zd)\n", sizeof(struct stlport));
1810 break;
1812 tty_port_init(&portp->port);
1813 portp->magic = STL_PORTMAGIC;
1814 portp->portnr = i;
1815 portp->brdnr = panelp->brdnr;
1816 portp->panelnr = panelp->panelnr;
1817 portp->uartp = panelp->uartp;
1818 portp->clk = brdp->clk;
1819 portp->baud_base = STL_BAUDBASE;
1820 portp->close_delay = STL_CLOSEDELAY;
1821 portp->closing_wait = 30 * HZ;
1822 init_waitqueue_head(&portp->port.open_wait);
1823 init_waitqueue_head(&portp->port.close_wait);
1824 portp->stats.brd = portp->brdnr;
1825 portp->stats.panel = portp->panelnr;
1826 portp->stats.port = portp->portnr;
1827 panelp->ports[i] = portp;
1828 stl_portinit(brdp, panelp, portp);
1831 return 0;
1834 static void stl_cleanup_panels(struct stlbrd *brdp)
1836 struct stlpanel *panelp;
1837 struct stlport *portp;
1838 unsigned int j, k;
1839 struct tty_struct *tty;
1841 for (j = 0; j < STL_MAXPANELS; j++) {
1842 panelp = brdp->panels[j];
1843 if (panelp == NULL)
1844 continue;
1845 for (k = 0; k < STL_PORTSPERPANEL; k++) {
1846 portp = panelp->ports[k];
1847 if (portp == NULL)
1848 continue;
1849 tty = tty_port_tty_get(&portp->port);
1850 if (tty != NULL) {
1851 stl_hangup(tty);
1852 tty_kref_put(tty);
1854 kfree(portp->tx.buf);
1855 kfree(portp);
1857 kfree(panelp);
1861 /*****************************************************************************/
1864 * Try to find and initialize an EasyIO board.
1867 static int __devinit stl_initeio(struct stlbrd *brdp)
1869 struct stlpanel *panelp;
1870 unsigned int status;
1871 char *name;
1872 int retval;
1874 pr_debug("stl_initeio(brdp=%p)\n", brdp);
1876 brdp->ioctrl = brdp->ioaddr1 + 1;
1877 brdp->iostatus = brdp->ioaddr1 + 2;
1879 status = inb(brdp->iostatus);
1880 if ((status & EIO_IDBITMASK) == EIO_MK3)
1881 brdp->ioctrl++;
1884 * Handle board specific stuff now. The real difference is PCI
1885 * or not PCI.
1887 if (brdp->brdtype == BRD_EASYIOPCI) {
1888 brdp->iosize1 = 0x80;
1889 brdp->iosize2 = 0x80;
1890 name = "serial(EIO-PCI)";
1891 outb(0x41, (brdp->ioaddr2 + 0x4c));
1892 } else {
1893 brdp->iosize1 = 8;
1894 name = "serial(EIO)";
1895 if ((brdp->irq < 0) || (brdp->irq > 15) ||
1896 (stl_vecmap[brdp->irq] == (unsigned char) 0xff)) {
1897 printk("STALLION: invalid irq=%d for brd=%d\n",
1898 brdp->irq, brdp->brdnr);
1899 retval = -EINVAL;
1900 goto err;
1902 outb((stl_vecmap[brdp->irq] | EIO_0WS |
1903 ((brdp->irqtype) ? EIO_INTLEVEL : EIO_INTEDGE)),
1904 brdp->ioctrl);
1907 retval = -EBUSY;
1908 if (!request_region(brdp->ioaddr1, brdp->iosize1, name)) {
1909 printk(KERN_WARNING "STALLION: Warning, board %d I/O address "
1910 "%x conflicts with another device\n", brdp->brdnr,
1911 brdp->ioaddr1);
1912 goto err;
1915 if (brdp->iosize2 > 0)
1916 if (!request_region(brdp->ioaddr2, brdp->iosize2, name)) {
1917 printk(KERN_WARNING "STALLION: Warning, board %d I/O "
1918 "address %x conflicts with another device\n",
1919 brdp->brdnr, brdp->ioaddr2);
1920 printk(KERN_WARNING "STALLION: Warning, also "
1921 "releasing board %d I/O address %x \n",
1922 brdp->brdnr, brdp->ioaddr1);
1923 goto err_rel1;
1927 * Everything looks OK, so let's go ahead and probe for the hardware.
1929 brdp->clk = CD1400_CLK;
1930 brdp->isr = stl_eiointr;
1932 retval = -ENODEV;
1933 switch (status & EIO_IDBITMASK) {
1934 case EIO_8PORTM:
1935 brdp->clk = CD1400_CLK8M;
1936 /* fall thru */
1937 case EIO_8PORTRS:
1938 case EIO_8PORTDI:
1939 brdp->nrports = 8;
1940 break;
1941 case EIO_4PORTRS:
1942 brdp->nrports = 4;
1943 break;
1944 case EIO_MK3:
1945 switch (status & EIO_BRDMASK) {
1946 case ID_BRD4:
1947 brdp->nrports = 4;
1948 break;
1949 case ID_BRD8:
1950 brdp->nrports = 8;
1951 break;
1952 case ID_BRD16:
1953 brdp->nrports = 16;
1954 break;
1955 default:
1956 goto err_rel2;
1958 break;
1959 default:
1960 goto err_rel2;
1964 * We have verified that the board is actually present, so now we
1965 * can complete the setup.
1968 panelp = kzalloc(sizeof(struct stlpanel), GFP_KERNEL);
1969 if (!panelp) {
1970 printk(KERN_WARNING "STALLION: failed to allocate memory "
1971 "(size=%Zd)\n", sizeof(struct stlpanel));
1972 retval = -ENOMEM;
1973 goto err_rel2;
1976 panelp->magic = STL_PANELMAGIC;
1977 panelp->brdnr = brdp->brdnr;
1978 panelp->panelnr = 0;
1979 panelp->nrports = brdp->nrports;
1980 panelp->iobase = brdp->ioaddr1;
1981 panelp->hwid = status;
1982 if ((status & EIO_IDBITMASK) == EIO_MK3) {
1983 panelp->uartp = &stl_sc26198uart;
1984 panelp->isr = stl_sc26198intr;
1985 } else {
1986 panelp->uartp = &stl_cd1400uart;
1987 panelp->isr = stl_cd1400eiointr;
1990 brdp->panels[0] = panelp;
1991 brdp->nrpanels = 1;
1992 brdp->state |= BRD_FOUND;
1993 brdp->hwid = status;
1994 if (request_irq(brdp->irq, stl_intr, IRQF_SHARED, name, brdp) != 0) {
1995 printk("STALLION: failed to register interrupt "
1996 "routine for %s irq=%d\n", name, brdp->irq);
1997 retval = -ENODEV;
1998 goto err_fr;
2001 return 0;
2002 err_fr:
2003 stl_cleanup_panels(brdp);
2004 err_rel2:
2005 if (brdp->iosize2 > 0)
2006 release_region(brdp->ioaddr2, brdp->iosize2);
2007 err_rel1:
2008 release_region(brdp->ioaddr1, brdp->iosize1);
2009 err:
2010 return retval;
2013 /*****************************************************************************/
2016 * Try to find an ECH board and initialize it. This code is capable of
2017 * dealing with all types of ECH board.
2020 static int __devinit stl_initech(struct stlbrd *brdp)
2022 struct stlpanel *panelp;
2023 unsigned int status, nxtid, ioaddr, conflict, panelnr, banknr, i;
2024 int retval;
2025 char *name;
2027 pr_debug("stl_initech(brdp=%p)\n", brdp);
2029 status = 0;
2030 conflict = 0;
2033 * Set up the initial board register contents for boards. This varies a
2034 * bit between the different board types. So we need to handle each
2035 * separately. Also do a check that the supplied IRQ is good.
2037 switch (brdp->brdtype) {
2039 case BRD_ECH:
2040 brdp->isr = stl_echatintr;
2041 brdp->ioctrl = brdp->ioaddr1 + 1;
2042 brdp->iostatus = brdp->ioaddr1 + 1;
2043 status = inb(brdp->iostatus);
2044 if ((status & ECH_IDBITMASK) != ECH_ID) {
2045 retval = -ENODEV;
2046 goto err;
2048 if ((brdp->irq < 0) || (brdp->irq > 15) ||
2049 (stl_vecmap[brdp->irq] == (unsigned char) 0xff)) {
2050 printk("STALLION: invalid irq=%d for brd=%d\n",
2051 brdp->irq, brdp->brdnr);
2052 retval = -EINVAL;
2053 goto err;
2055 status = ((brdp->ioaddr2 & ECH_ADDR2MASK) >> 1);
2056 status |= (stl_vecmap[brdp->irq] << 1);
2057 outb((status | ECH_BRDRESET), brdp->ioaddr1);
2058 brdp->ioctrlval = ECH_INTENABLE |
2059 ((brdp->irqtype) ? ECH_INTLEVEL : ECH_INTEDGE);
2060 for (i = 0; i < 10; i++)
2061 outb((brdp->ioctrlval | ECH_BRDENABLE), brdp->ioctrl);
2062 brdp->iosize1 = 2;
2063 brdp->iosize2 = 32;
2064 name = "serial(EC8/32)";
2065 outb(status, brdp->ioaddr1);
2066 break;
2068 case BRD_ECHMC:
2069 brdp->isr = stl_echmcaintr;
2070 brdp->ioctrl = brdp->ioaddr1 + 0x20;
2071 brdp->iostatus = brdp->ioctrl;
2072 status = inb(brdp->iostatus);
2073 if ((status & ECH_IDBITMASK) != ECH_ID) {
2074 retval = -ENODEV;
2075 goto err;
2077 if ((brdp->irq < 0) || (brdp->irq > 15) ||
2078 (stl_vecmap[brdp->irq] == (unsigned char) 0xff)) {
2079 printk("STALLION: invalid irq=%d for brd=%d\n",
2080 brdp->irq, brdp->brdnr);
2081 retval = -EINVAL;
2082 goto err;
2084 outb(ECHMC_BRDRESET, brdp->ioctrl);
2085 outb(ECHMC_INTENABLE, brdp->ioctrl);
2086 brdp->iosize1 = 64;
2087 name = "serial(EC8/32-MC)";
2088 break;
2090 case BRD_ECHPCI:
2091 brdp->isr = stl_echpciintr;
2092 brdp->ioctrl = brdp->ioaddr1 + 2;
2093 brdp->iosize1 = 4;
2094 brdp->iosize2 = 8;
2095 name = "serial(EC8/32-PCI)";
2096 break;
2098 case BRD_ECH64PCI:
2099 brdp->isr = stl_echpci64intr;
2100 brdp->ioctrl = brdp->ioaddr2 + 0x40;
2101 outb(0x43, (brdp->ioaddr1 + 0x4c));
2102 brdp->iosize1 = 0x80;
2103 brdp->iosize2 = 0x80;
2104 name = "serial(EC8/64-PCI)";
2105 break;
2107 default:
2108 printk("STALLION: unknown board type=%d\n", brdp->brdtype);
2109 retval = -EINVAL;
2110 goto err;
2114 * Check boards for possible IO address conflicts and return fail status
2115 * if an IO conflict found.
2117 retval = -EBUSY;
2118 if (!request_region(brdp->ioaddr1, brdp->iosize1, name)) {
2119 printk(KERN_WARNING "STALLION: Warning, board %d I/O address "
2120 "%x conflicts with another device\n", brdp->brdnr,
2121 brdp->ioaddr1);
2122 goto err;
2125 if (brdp->iosize2 > 0)
2126 if (!request_region(brdp->ioaddr2, brdp->iosize2, name)) {
2127 printk(KERN_WARNING "STALLION: Warning, board %d I/O "
2128 "address %x conflicts with another device\n",
2129 brdp->brdnr, brdp->ioaddr2);
2130 printk(KERN_WARNING "STALLION: Warning, also "
2131 "releasing board %d I/O address %x \n",
2132 brdp->brdnr, brdp->ioaddr1);
2133 goto err_rel1;
2137 * Scan through the secondary io address space looking for panels.
2138 * As we find'em allocate and initialize panel structures for each.
2140 brdp->clk = CD1400_CLK;
2141 brdp->hwid = status;
2143 ioaddr = brdp->ioaddr2;
2144 banknr = 0;
2145 panelnr = 0;
2146 nxtid = 0;
2148 for (i = 0; i < STL_MAXPANELS; i++) {
2149 if (brdp->brdtype == BRD_ECHPCI) {
2150 outb(nxtid, brdp->ioctrl);
2151 ioaddr = brdp->ioaddr2;
2153 status = inb(ioaddr + ECH_PNLSTATUS);
2154 if ((status & ECH_PNLIDMASK) != nxtid)
2155 break;
2156 panelp = kzalloc(sizeof(struct stlpanel), GFP_KERNEL);
2157 if (!panelp) {
2158 printk("STALLION: failed to allocate memory "
2159 "(size=%Zd)\n", sizeof(struct stlpanel));
2160 retval = -ENOMEM;
2161 goto err_fr;
2163 panelp->magic = STL_PANELMAGIC;
2164 panelp->brdnr = brdp->brdnr;
2165 panelp->panelnr = panelnr;
2166 panelp->iobase = ioaddr;
2167 panelp->pagenr = nxtid;
2168 panelp->hwid = status;
2169 brdp->bnk2panel[banknr] = panelp;
2170 brdp->bnkpageaddr[banknr] = nxtid;
2171 brdp->bnkstataddr[banknr++] = ioaddr + ECH_PNLSTATUS;
2173 if (status & ECH_PNLXPID) {
2174 panelp->uartp = &stl_sc26198uart;
2175 panelp->isr = stl_sc26198intr;
2176 if (status & ECH_PNL16PORT) {
2177 panelp->nrports = 16;
2178 brdp->bnk2panel[banknr] = panelp;
2179 brdp->bnkpageaddr[banknr] = nxtid;
2180 brdp->bnkstataddr[banknr++] = ioaddr + 4 +
2181 ECH_PNLSTATUS;
2182 } else
2183 panelp->nrports = 8;
2184 } else {
2185 panelp->uartp = &stl_cd1400uart;
2186 panelp->isr = stl_cd1400echintr;
2187 if (status & ECH_PNL16PORT) {
2188 panelp->nrports = 16;
2189 panelp->ackmask = 0x80;
2190 if (brdp->brdtype != BRD_ECHPCI)
2191 ioaddr += EREG_BANKSIZE;
2192 brdp->bnk2panel[banknr] = panelp;
2193 brdp->bnkpageaddr[banknr] = ++nxtid;
2194 brdp->bnkstataddr[banknr++] = ioaddr +
2195 ECH_PNLSTATUS;
2196 } else {
2197 panelp->nrports = 8;
2198 panelp->ackmask = 0xc0;
2202 nxtid++;
2203 ioaddr += EREG_BANKSIZE;
2204 brdp->nrports += panelp->nrports;
2205 brdp->panels[panelnr++] = panelp;
2206 if ((brdp->brdtype != BRD_ECHPCI) &&
2207 (ioaddr >= (brdp->ioaddr2 + brdp->iosize2))) {
2208 retval = -EINVAL;
2209 goto err_fr;
2213 brdp->nrpanels = panelnr;
2214 brdp->nrbnks = banknr;
2215 if (brdp->brdtype == BRD_ECH)
2216 outb((brdp->ioctrlval | ECH_BRDDISABLE), brdp->ioctrl);
2218 brdp->state |= BRD_FOUND;
2219 if (request_irq(brdp->irq, stl_intr, IRQF_SHARED, name, brdp) != 0) {
2220 printk("STALLION: failed to register interrupt "
2221 "routine for %s irq=%d\n", name, brdp->irq);
2222 retval = -ENODEV;
2223 goto err_fr;
2226 return 0;
2227 err_fr:
2228 stl_cleanup_panels(brdp);
2229 if (brdp->iosize2 > 0)
2230 release_region(brdp->ioaddr2, brdp->iosize2);
2231 err_rel1:
2232 release_region(brdp->ioaddr1, brdp->iosize1);
2233 err:
2234 return retval;
2237 /*****************************************************************************/
2240 * Initialize and configure the specified board.
2241 * Scan through all the boards in the configuration and see what we
2242 * can find. Handle EIO and the ECH boards a little differently here
2243 * since the initial search and setup is very different.
2246 static int __devinit stl_brdinit(struct stlbrd *brdp)
2248 int i, retval;
2250 pr_debug("stl_brdinit(brdp=%p)\n", brdp);
2252 switch (brdp->brdtype) {
2253 case BRD_EASYIO:
2254 case BRD_EASYIOPCI:
2255 retval = stl_initeio(brdp);
2256 if (retval)
2257 goto err;
2258 break;
2259 case BRD_ECH:
2260 case BRD_ECHMC:
2261 case BRD_ECHPCI:
2262 case BRD_ECH64PCI:
2263 retval = stl_initech(brdp);
2264 if (retval)
2265 goto err;
2266 break;
2267 default:
2268 printk("STALLION: board=%d is unknown board type=%d\n",
2269 brdp->brdnr, brdp->brdtype);
2270 retval = -ENODEV;
2271 goto err;
2274 if ((brdp->state & BRD_FOUND) == 0) {
2275 printk("STALLION: %s board not found, board=%d io=%x irq=%d\n",
2276 stl_brdnames[brdp->brdtype], brdp->brdnr,
2277 brdp->ioaddr1, brdp->irq);
2278 goto err_free;
2281 for (i = 0; i < STL_MAXPANELS; i++)
2282 if (brdp->panels[i] != NULL)
2283 stl_initports(brdp, brdp->panels[i]);
2285 printk("STALLION: %s found, board=%d io=%x irq=%d "
2286 "nrpanels=%d nrports=%d\n", stl_brdnames[brdp->brdtype],
2287 brdp->brdnr, brdp->ioaddr1, brdp->irq, brdp->nrpanels,
2288 brdp->nrports);
2290 return 0;
2291 err_free:
2292 free_irq(brdp->irq, brdp);
2294 stl_cleanup_panels(brdp);
2296 release_region(brdp->ioaddr1, brdp->iosize1);
2297 if (brdp->iosize2 > 0)
2298 release_region(brdp->ioaddr2, brdp->iosize2);
2299 err:
2300 return retval;
2303 /*****************************************************************************/
2306 * Find the next available board number that is free.
2309 static int __devinit stl_getbrdnr(void)
2311 unsigned int i;
2313 for (i = 0; i < STL_MAXBRDS; i++)
2314 if (stl_brds[i] == NULL) {
2315 if (i >= stl_nrbrds)
2316 stl_nrbrds = i + 1;
2317 return i;
2320 return -1;
2323 /*****************************************************************************/
2325 * We have a Stallion board. Allocate a board structure and
2326 * initialize it. Read its IO and IRQ resources from PCI
2327 * configuration space.
2330 static int __devinit stl_pciprobe(struct pci_dev *pdev,
2331 const struct pci_device_id *ent)
2333 struct stlbrd *brdp;
2334 unsigned int i, brdtype = ent->driver_data;
2335 int brdnr, retval = -ENODEV;
2337 if ((pdev->class >> 8) == PCI_CLASS_STORAGE_IDE)
2338 goto err;
2340 retval = pci_enable_device(pdev);
2341 if (retval)
2342 goto err;
2343 brdp = stl_allocbrd();
2344 if (brdp == NULL) {
2345 retval = -ENOMEM;
2346 goto err;
2348 mutex_lock(&stl_brdslock);
2349 brdnr = stl_getbrdnr();
2350 if (brdnr < 0) {
2351 dev_err(&pdev->dev, "too many boards found, "
2352 "maximum supported %d\n", STL_MAXBRDS);
2353 mutex_unlock(&stl_brdslock);
2354 retval = -ENODEV;
2355 goto err_fr;
2357 brdp->brdnr = (unsigned int)brdnr;
2358 stl_brds[brdp->brdnr] = brdp;
2359 mutex_unlock(&stl_brdslock);
2361 brdp->brdtype = brdtype;
2362 brdp->state |= STL_PROBED;
2365 * We have all resources from the board, so let's setup the actual
2366 * board structure now.
2368 switch (brdtype) {
2369 case BRD_ECHPCI:
2370 brdp->ioaddr2 = pci_resource_start(pdev, 0);
2371 brdp->ioaddr1 = pci_resource_start(pdev, 1);
2372 break;
2373 case BRD_ECH64PCI:
2374 brdp->ioaddr2 = pci_resource_start(pdev, 2);
2375 brdp->ioaddr1 = pci_resource_start(pdev, 1);
2376 break;
2377 case BRD_EASYIOPCI:
2378 brdp->ioaddr1 = pci_resource_start(pdev, 2);
2379 brdp->ioaddr2 = pci_resource_start(pdev, 1);
2380 break;
2381 default:
2382 dev_err(&pdev->dev, "unknown PCI board type=%u\n", brdtype);
2383 break;
2386 brdp->irq = pdev->irq;
2387 retval = stl_brdinit(brdp);
2388 if (retval)
2389 goto err_null;
2391 pci_set_drvdata(pdev, brdp);
2393 for (i = 0; i < brdp->nrports; i++)
2394 tty_register_device(stl_serial,
2395 brdp->brdnr * STL_MAXPORTS + i, &pdev->dev);
2397 return 0;
2398 err_null:
2399 stl_brds[brdp->brdnr] = NULL;
2400 err_fr:
2401 kfree(brdp);
2402 err:
2403 return retval;
2406 static void __devexit stl_pciremove(struct pci_dev *pdev)
2408 struct stlbrd *brdp = pci_get_drvdata(pdev);
2409 unsigned int i;
2411 free_irq(brdp->irq, brdp);
2413 stl_cleanup_panels(brdp);
2415 release_region(brdp->ioaddr1, brdp->iosize1);
2416 if (brdp->iosize2 > 0)
2417 release_region(brdp->ioaddr2, brdp->iosize2);
2419 for (i = 0; i < brdp->nrports; i++)
2420 tty_unregister_device(stl_serial,
2421 brdp->brdnr * STL_MAXPORTS + i);
2423 stl_brds[brdp->brdnr] = NULL;
2424 kfree(brdp);
2427 static struct pci_driver stl_pcidriver = {
2428 .name = "stallion",
2429 .id_table = stl_pcibrds,
2430 .probe = stl_pciprobe,
2431 .remove = __devexit_p(stl_pciremove)
2434 /*****************************************************************************/
2437 * Return the board stats structure to user app.
2440 static int stl_getbrdstats(combrd_t __user *bp)
2442 combrd_t stl_brdstats;
2443 struct stlbrd *brdp;
2444 struct stlpanel *panelp;
2445 unsigned int i;
2447 if (copy_from_user(&stl_brdstats, bp, sizeof(combrd_t)))
2448 return -EFAULT;
2449 if (stl_brdstats.brd >= STL_MAXBRDS)
2450 return -ENODEV;
2451 brdp = stl_brds[stl_brdstats.brd];
2452 if (brdp == NULL)
2453 return -ENODEV;
2455 memset(&stl_brdstats, 0, sizeof(combrd_t));
2456 stl_brdstats.brd = brdp->brdnr;
2457 stl_brdstats.type = brdp->brdtype;
2458 stl_brdstats.hwid = brdp->hwid;
2459 stl_brdstats.state = brdp->state;
2460 stl_brdstats.ioaddr = brdp->ioaddr1;
2461 stl_brdstats.ioaddr2 = brdp->ioaddr2;
2462 stl_brdstats.irq = brdp->irq;
2463 stl_brdstats.nrpanels = brdp->nrpanels;
2464 stl_brdstats.nrports = brdp->nrports;
2465 for (i = 0; i < brdp->nrpanels; i++) {
2466 panelp = brdp->panels[i];
2467 stl_brdstats.panels[i].panel = i;
2468 stl_brdstats.panels[i].hwid = panelp->hwid;
2469 stl_brdstats.panels[i].nrports = panelp->nrports;
2472 return copy_to_user(bp, &stl_brdstats, sizeof(combrd_t)) ? -EFAULT : 0;
2475 /*****************************************************************************/
2478 * Resolve the referenced port number into a port struct pointer.
2481 static struct stlport *stl_getport(int brdnr, int panelnr, int portnr)
2483 struct stlbrd *brdp;
2484 struct stlpanel *panelp;
2486 if (brdnr < 0 || brdnr >= STL_MAXBRDS)
2487 return NULL;
2488 brdp = stl_brds[brdnr];
2489 if (brdp == NULL)
2490 return NULL;
2491 if (panelnr < 0 || (unsigned int)panelnr >= brdp->nrpanels)
2492 return NULL;
2493 panelp = brdp->panels[panelnr];
2494 if (panelp == NULL)
2495 return NULL;
2496 if (portnr < 0 || (unsigned int)portnr >= panelp->nrports)
2497 return NULL;
2498 return panelp->ports[portnr];
2501 /*****************************************************************************/
2504 * Return the port stats structure to user app. A NULL port struct
2505 * pointer passed in means that we need to find out from the app
2506 * what port to get stats for (used through board control device).
2509 static int stl_getportstats(struct tty_struct *tty, struct stlport *portp, comstats_t __user *cp)
2511 comstats_t stl_comstats;
2512 unsigned char *head, *tail;
2513 unsigned long flags;
2515 if (!portp) {
2516 if (copy_from_user(&stl_comstats, cp, sizeof(comstats_t)))
2517 return -EFAULT;
2518 portp = stl_getport(stl_comstats.brd, stl_comstats.panel,
2519 stl_comstats.port);
2520 if (portp == NULL)
2521 return -ENODEV;
2524 portp->stats.state = portp->istate;
2525 portp->stats.flags = portp->port.flags;
2526 portp->stats.hwid = portp->hwid;
2528 portp->stats.ttystate = 0;
2529 portp->stats.cflags = 0;
2530 portp->stats.iflags = 0;
2531 portp->stats.oflags = 0;
2532 portp->stats.lflags = 0;
2533 portp->stats.rxbuffered = 0;
2535 spin_lock_irqsave(&stallion_lock, flags);
2536 if (tty != NULL && portp->port.tty == tty) {
2537 portp->stats.ttystate = tty->flags;
2538 /* No longer available as a statistic */
2539 portp->stats.rxbuffered = 1; /*tty->flip.count; */
2540 if (tty->termios != NULL) {
2541 portp->stats.cflags = tty->termios->c_cflag;
2542 portp->stats.iflags = tty->termios->c_iflag;
2543 portp->stats.oflags = tty->termios->c_oflag;
2544 portp->stats.lflags = tty->termios->c_lflag;
2547 spin_unlock_irqrestore(&stallion_lock, flags);
2549 head = portp->tx.head;
2550 tail = portp->tx.tail;
2551 portp->stats.txbuffered = (head >= tail) ? (head - tail) :
2552 (STL_TXBUFSIZE - (tail - head));
2554 portp->stats.signals = (unsigned long) stl_getsignals(portp);
2556 return copy_to_user(cp, &portp->stats,
2557 sizeof(comstats_t)) ? -EFAULT : 0;
2560 /*****************************************************************************/
2563 * Clear the port stats structure. We also return it zeroed out...
2566 static int stl_clrportstats(struct stlport *portp, comstats_t __user *cp)
2568 comstats_t stl_comstats;
2570 if (!portp) {
2571 if (copy_from_user(&stl_comstats, cp, sizeof(comstats_t)))
2572 return -EFAULT;
2573 portp = stl_getport(stl_comstats.brd, stl_comstats.panel,
2574 stl_comstats.port);
2575 if (portp == NULL)
2576 return -ENODEV;
2579 memset(&portp->stats, 0, sizeof(comstats_t));
2580 portp->stats.brd = portp->brdnr;
2581 portp->stats.panel = portp->panelnr;
2582 portp->stats.port = portp->portnr;
2583 return copy_to_user(cp, &portp->stats,
2584 sizeof(comstats_t)) ? -EFAULT : 0;
2587 /*****************************************************************************/
2590 * Return the entire driver ports structure to a user app.
2593 static int stl_getportstruct(struct stlport __user *arg)
2595 struct stlport stl_dummyport;
2596 struct stlport *portp;
2598 if (copy_from_user(&stl_dummyport, arg, sizeof(struct stlport)))
2599 return -EFAULT;
2600 portp = stl_getport(stl_dummyport.brdnr, stl_dummyport.panelnr,
2601 stl_dummyport.portnr);
2602 if (!portp)
2603 return -ENODEV;
2604 return copy_to_user(arg, portp, sizeof(struct stlport)) ? -EFAULT : 0;
2607 /*****************************************************************************/
2610 * Return the entire driver board structure to a user app.
2613 static int stl_getbrdstruct(struct stlbrd __user *arg)
2615 struct stlbrd stl_dummybrd;
2616 struct stlbrd *brdp;
2618 if (copy_from_user(&stl_dummybrd, arg, sizeof(struct stlbrd)))
2619 return -EFAULT;
2620 if (stl_dummybrd.brdnr >= STL_MAXBRDS)
2621 return -ENODEV;
2622 brdp = stl_brds[stl_dummybrd.brdnr];
2623 if (!brdp)
2624 return -ENODEV;
2625 return copy_to_user(arg, brdp, sizeof(struct stlbrd)) ? -EFAULT : 0;
2628 /*****************************************************************************/
2631 * The "staliomem" device is also required to do some special operations
2632 * on the board and/or ports. In this driver it is mostly used for stats
2633 * collection.
2636 static int stl_memioctl(struct inode *ip, struct file *fp, unsigned int cmd, unsigned long arg)
2638 int brdnr, rc;
2639 void __user *argp = (void __user *)arg;
2641 pr_debug("stl_memioctl(ip=%p,fp=%p,cmd=%x,arg=%lx)\n", ip, fp, cmd,arg);
2643 brdnr = iminor(ip);
2644 if (brdnr >= STL_MAXBRDS)
2645 return -ENODEV;
2646 rc = 0;
2648 switch (cmd) {
2649 case COM_GETPORTSTATS:
2650 rc = stl_getportstats(NULL, NULL, argp);
2651 break;
2652 case COM_CLRPORTSTATS:
2653 rc = stl_clrportstats(NULL, argp);
2654 break;
2655 case COM_GETBRDSTATS:
2656 rc = stl_getbrdstats(argp);
2657 break;
2658 case COM_READPORT:
2659 rc = stl_getportstruct(argp);
2660 break;
2661 case COM_READBOARD:
2662 rc = stl_getbrdstruct(argp);
2663 break;
2664 default:
2665 rc = -ENOIOCTLCMD;
2666 break;
2669 return rc;
2672 static const struct tty_operations stl_ops = {
2673 .open = stl_open,
2674 .close = stl_close,
2675 .write = stl_write,
2676 .put_char = stl_putchar,
2677 .flush_chars = stl_flushchars,
2678 .write_room = stl_writeroom,
2679 .chars_in_buffer = stl_charsinbuffer,
2680 .ioctl = stl_ioctl,
2681 .set_termios = stl_settermios,
2682 .throttle = stl_throttle,
2683 .unthrottle = stl_unthrottle,
2684 .stop = stl_stop,
2685 .start = stl_start,
2686 .hangup = stl_hangup,
2687 .flush_buffer = stl_flushbuffer,
2688 .break_ctl = stl_breakctl,
2689 .wait_until_sent = stl_waituntilsent,
2690 .send_xchar = stl_sendxchar,
2691 .read_proc = stl_readproc,
2692 .tiocmget = stl_tiocmget,
2693 .tiocmset = stl_tiocmset,
2696 /*****************************************************************************/
2697 /* CD1400 HARDWARE FUNCTIONS */
2698 /*****************************************************************************/
2701 * These functions get/set/update the registers of the cd1400 UARTs.
2702 * Access to the cd1400 registers is via an address/data io port pair.
2703 * (Maybe should make this inline...)
2706 static int stl_cd1400getreg(struct stlport *portp, int regnr)
2708 outb((regnr + portp->uartaddr), portp->ioaddr);
2709 return inb(portp->ioaddr + EREG_DATA);
2712 static void stl_cd1400setreg(struct stlport *portp, int regnr, int value)
2714 outb(regnr + portp->uartaddr, portp->ioaddr);
2715 outb(value, portp->ioaddr + EREG_DATA);
2718 static int stl_cd1400updatereg(struct stlport *portp, int regnr, int value)
2720 outb(regnr + portp->uartaddr, portp->ioaddr);
2721 if (inb(portp->ioaddr + EREG_DATA) != value) {
2722 outb(value, portp->ioaddr + EREG_DATA);
2723 return 1;
2725 return 0;
2728 /*****************************************************************************/
2731 * Inbitialize the UARTs in a panel. We don't care what sort of board
2732 * these ports are on - since the port io registers are almost
2733 * identical when dealing with ports.
2736 static int stl_cd1400panelinit(struct stlbrd *brdp, struct stlpanel *panelp)
2738 unsigned int gfrcr;
2739 int chipmask, i, j;
2740 int nrchips, uartaddr, ioaddr;
2741 unsigned long flags;
2743 pr_debug("stl_panelinit(brdp=%p,panelp=%p)\n", brdp, panelp);
2745 spin_lock_irqsave(&brd_lock, flags);
2746 BRDENABLE(panelp->brdnr, panelp->pagenr);
2749 * Check that each chip is present and started up OK.
2751 chipmask = 0;
2752 nrchips = panelp->nrports / CD1400_PORTS;
2753 for (i = 0; i < nrchips; i++) {
2754 if (brdp->brdtype == BRD_ECHPCI) {
2755 outb((panelp->pagenr + (i >> 1)), brdp->ioctrl);
2756 ioaddr = panelp->iobase;
2757 } else
2758 ioaddr = panelp->iobase + (EREG_BANKSIZE * (i >> 1));
2759 uartaddr = (i & 0x01) ? 0x080 : 0;
2760 outb((GFRCR + uartaddr), ioaddr);
2761 outb(0, (ioaddr + EREG_DATA));
2762 outb((CCR + uartaddr), ioaddr);
2763 outb(CCR_RESETFULL, (ioaddr + EREG_DATA));
2764 outb(CCR_RESETFULL, (ioaddr + EREG_DATA));
2765 outb((GFRCR + uartaddr), ioaddr);
2766 for (j = 0; j < CCR_MAXWAIT; j++)
2767 if ((gfrcr = inb(ioaddr + EREG_DATA)) != 0)
2768 break;
2770 if ((j >= CCR_MAXWAIT) || (gfrcr < 0x40) || (gfrcr > 0x60)) {
2771 printk("STALLION: cd1400 not responding, "
2772 "brd=%d panel=%d chip=%d\n",
2773 panelp->brdnr, panelp->panelnr, i);
2774 continue;
2776 chipmask |= (0x1 << i);
2777 outb((PPR + uartaddr), ioaddr);
2778 outb(PPR_SCALAR, (ioaddr + EREG_DATA));
2781 BRDDISABLE(panelp->brdnr);
2782 spin_unlock_irqrestore(&brd_lock, flags);
2783 return chipmask;
2786 /*****************************************************************************/
2789 * Initialize hardware specific port registers.
2792 static void stl_cd1400portinit(struct stlbrd *brdp, struct stlpanel *panelp, struct stlport *portp)
2794 unsigned long flags;
2795 pr_debug("stl_cd1400portinit(brdp=%p,panelp=%p,portp=%p)\n", brdp,
2796 panelp, portp);
2798 if ((brdp == NULL) || (panelp == NULL) ||
2799 (portp == NULL))
2800 return;
2802 spin_lock_irqsave(&brd_lock, flags);
2803 portp->ioaddr = panelp->iobase + (((brdp->brdtype == BRD_ECHPCI) ||
2804 (portp->portnr < 8)) ? 0 : EREG_BANKSIZE);
2805 portp->uartaddr = (portp->portnr & 0x04) << 5;
2806 portp->pagenr = panelp->pagenr + (portp->portnr >> 3);
2808 BRDENABLE(portp->brdnr, portp->pagenr);
2809 stl_cd1400setreg(portp, CAR, (portp->portnr & 0x03));
2810 stl_cd1400setreg(portp, LIVR, (portp->portnr << 3));
2811 portp->hwid = stl_cd1400getreg(portp, GFRCR);
2812 BRDDISABLE(portp->brdnr);
2813 spin_unlock_irqrestore(&brd_lock, flags);
2816 /*****************************************************************************/
2819 * Wait for the command register to be ready. We will poll this,
2820 * since it won't usually take too long to be ready.
2823 static void stl_cd1400ccrwait(struct stlport *portp)
2825 int i;
2827 for (i = 0; i < CCR_MAXWAIT; i++)
2828 if (stl_cd1400getreg(portp, CCR) == 0)
2829 return;
2831 printk("STALLION: cd1400 not responding, port=%d panel=%d brd=%d\n",
2832 portp->portnr, portp->panelnr, portp->brdnr);
2835 /*****************************************************************************/
2838 * Set up the cd1400 registers for a port based on the termios port
2839 * settings.
2842 static void stl_cd1400setport(struct stlport *portp, struct ktermios *tiosp)
2844 struct stlbrd *brdp;
2845 unsigned long flags;
2846 unsigned int clkdiv, baudrate;
2847 unsigned char cor1, cor2, cor3;
2848 unsigned char cor4, cor5, ccr;
2849 unsigned char srer, sreron, sreroff;
2850 unsigned char mcor1, mcor2, rtpr;
2851 unsigned char clk, div;
2853 cor1 = 0;
2854 cor2 = 0;
2855 cor3 = 0;
2856 cor4 = 0;
2857 cor5 = 0;
2858 ccr = 0;
2859 rtpr = 0;
2860 clk = 0;
2861 div = 0;
2862 mcor1 = 0;
2863 mcor2 = 0;
2864 sreron = 0;
2865 sreroff = 0;
2867 brdp = stl_brds[portp->brdnr];
2868 if (brdp == NULL)
2869 return;
2872 * Set up the RX char ignore mask with those RX error types we
2873 * can ignore. We can get the cd1400 to help us out a little here,
2874 * it will ignore parity errors and breaks for us.
2876 portp->rxignoremsk = 0;
2877 if (tiosp->c_iflag & IGNPAR) {
2878 portp->rxignoremsk |= (ST_PARITY | ST_FRAMING | ST_OVERRUN);
2879 cor1 |= COR1_PARIGNORE;
2881 if (tiosp->c_iflag & IGNBRK) {
2882 portp->rxignoremsk |= ST_BREAK;
2883 cor4 |= COR4_IGNBRK;
2886 portp->rxmarkmsk = ST_OVERRUN;
2887 if (tiosp->c_iflag & (INPCK | PARMRK))
2888 portp->rxmarkmsk |= (ST_PARITY | ST_FRAMING);
2889 if (tiosp->c_iflag & BRKINT)
2890 portp->rxmarkmsk |= ST_BREAK;
2893 * Go through the char size, parity and stop bits and set all the
2894 * option register appropriately.
2896 switch (tiosp->c_cflag & CSIZE) {
2897 case CS5:
2898 cor1 |= COR1_CHL5;
2899 break;
2900 case CS6:
2901 cor1 |= COR1_CHL6;
2902 break;
2903 case CS7:
2904 cor1 |= COR1_CHL7;
2905 break;
2906 default:
2907 cor1 |= COR1_CHL8;
2908 break;
2911 if (tiosp->c_cflag & CSTOPB)
2912 cor1 |= COR1_STOP2;
2913 else
2914 cor1 |= COR1_STOP1;
2916 if (tiosp->c_cflag & PARENB) {
2917 if (tiosp->c_cflag & PARODD)
2918 cor1 |= (COR1_PARENB | COR1_PARODD);
2919 else
2920 cor1 |= (COR1_PARENB | COR1_PAREVEN);
2921 } else {
2922 cor1 |= COR1_PARNONE;
2926 * Set the RX FIFO threshold at 6 chars. This gives a bit of breathing
2927 * space for hardware flow control and the like. This should be set to
2928 * VMIN. Also here we will set the RX data timeout to 10ms - this should
2929 * really be based on VTIME.
2931 cor3 |= FIFO_RXTHRESHOLD;
2932 rtpr = 2;
2935 * Calculate the baud rate timers. For now we will just assume that
2936 * the input and output baud are the same. Could have used a baud
2937 * table here, but this way we can generate virtually any baud rate
2938 * we like!
2940 baudrate = tiosp->c_cflag & CBAUD;
2941 if (baudrate & CBAUDEX) {
2942 baudrate &= ~CBAUDEX;
2943 if ((baudrate < 1) || (baudrate > 4))
2944 tiosp->c_cflag &= ~CBAUDEX;
2945 else
2946 baudrate += 15;
2948 baudrate = stl_baudrates[baudrate];
2949 if ((tiosp->c_cflag & CBAUD) == B38400) {
2950 if ((portp->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_HI)
2951 baudrate = 57600;
2952 else if ((portp->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_VHI)
2953 baudrate = 115200;
2954 else if ((portp->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_SHI)
2955 baudrate = 230400;
2956 else if ((portp->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_WARP)
2957 baudrate = 460800;
2958 else if ((portp->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST)
2959 baudrate = (portp->baud_base / portp->custom_divisor);
2961 if (baudrate > STL_CD1400MAXBAUD)
2962 baudrate = STL_CD1400MAXBAUD;
2964 if (baudrate > 0) {
2965 for (clk = 0; clk < CD1400_NUMCLKS; clk++) {
2966 clkdiv = (portp->clk / stl_cd1400clkdivs[clk]) / baudrate;
2967 if (clkdiv < 0x100)
2968 break;
2970 div = (unsigned char) clkdiv;
2974 * Check what form of modem signaling is required and set it up.
2976 if ((tiosp->c_cflag & CLOCAL) == 0) {
2977 mcor1 |= MCOR1_DCD;
2978 mcor2 |= MCOR2_DCD;
2979 sreron |= SRER_MODEM;
2980 portp->port.flags |= ASYNC_CHECK_CD;
2981 } else
2982 portp->port.flags &= ~ASYNC_CHECK_CD;
2985 * Setup cd1400 enhanced modes if we can. In particular we want to
2986 * handle as much of the flow control as possible automatically. As
2987 * well as saving a few CPU cycles it will also greatly improve flow
2988 * control reliability.
2990 if (tiosp->c_iflag & IXON) {
2991 cor2 |= COR2_TXIBE;
2992 cor3 |= COR3_SCD12;
2993 if (tiosp->c_iflag & IXANY)
2994 cor2 |= COR2_IXM;
2997 if (tiosp->c_cflag & CRTSCTS) {
2998 cor2 |= COR2_CTSAE;
2999 mcor1 |= FIFO_RTSTHRESHOLD;
3003 * All cd1400 register values calculated so go through and set
3004 * them all up.
3007 pr_debug("SETPORT: portnr=%d panelnr=%d brdnr=%d\n",
3008 portp->portnr, portp->panelnr, portp->brdnr);
3009 pr_debug(" cor1=%x cor2=%x cor3=%x cor4=%x cor5=%x\n",
3010 cor1, cor2, cor3, cor4, cor5);
3011 pr_debug(" mcor1=%x mcor2=%x rtpr=%x sreron=%x sreroff=%x\n",
3012 mcor1, mcor2, rtpr, sreron, sreroff);
3013 pr_debug(" tcor=%x tbpr=%x rcor=%x rbpr=%x\n", clk, div, clk, div);
3014 pr_debug(" schr1=%x schr2=%x schr3=%x schr4=%x\n",
3015 tiosp->c_cc[VSTART], tiosp->c_cc[VSTOP],
3016 tiosp->c_cc[VSTART], tiosp->c_cc[VSTOP]);
3018 spin_lock_irqsave(&brd_lock, flags);
3019 BRDENABLE(portp->brdnr, portp->pagenr);
3020 stl_cd1400setreg(portp, CAR, (portp->portnr & 0x3));
3021 srer = stl_cd1400getreg(portp, SRER);
3022 stl_cd1400setreg(portp, SRER, 0);
3023 if (stl_cd1400updatereg(portp, COR1, cor1))
3024 ccr = 1;
3025 if (stl_cd1400updatereg(portp, COR2, cor2))
3026 ccr = 1;
3027 if (stl_cd1400updatereg(portp, COR3, cor3))
3028 ccr = 1;
3029 if (ccr) {
3030 stl_cd1400ccrwait(portp);
3031 stl_cd1400setreg(portp, CCR, CCR_CORCHANGE);
3033 stl_cd1400setreg(portp, COR4, cor4);
3034 stl_cd1400setreg(portp, COR5, cor5);
3035 stl_cd1400setreg(portp, MCOR1, mcor1);
3036 stl_cd1400setreg(portp, MCOR2, mcor2);
3037 if (baudrate > 0) {
3038 stl_cd1400setreg(portp, TCOR, clk);
3039 stl_cd1400setreg(portp, TBPR, div);
3040 stl_cd1400setreg(portp, RCOR, clk);
3041 stl_cd1400setreg(portp, RBPR, div);
3043 stl_cd1400setreg(portp, SCHR1, tiosp->c_cc[VSTART]);
3044 stl_cd1400setreg(portp, SCHR2, tiosp->c_cc[VSTOP]);
3045 stl_cd1400setreg(portp, SCHR3, tiosp->c_cc[VSTART]);
3046 stl_cd1400setreg(portp, SCHR4, tiosp->c_cc[VSTOP]);
3047 stl_cd1400setreg(portp, RTPR, rtpr);
3048 mcor1 = stl_cd1400getreg(portp, MSVR1);
3049 if (mcor1 & MSVR1_DCD)
3050 portp->sigs |= TIOCM_CD;
3051 else
3052 portp->sigs &= ~TIOCM_CD;
3053 stl_cd1400setreg(portp, SRER, ((srer & ~sreroff) | sreron));
3054 BRDDISABLE(portp->brdnr);
3055 spin_unlock_irqrestore(&brd_lock, flags);
3058 /*****************************************************************************/
3061 * Set the state of the DTR and RTS signals.
3064 static void stl_cd1400setsignals(struct stlport *portp, int dtr, int rts)
3066 unsigned char msvr1, msvr2;
3067 unsigned long flags;
3069 pr_debug("stl_cd1400setsignals(portp=%p,dtr=%d,rts=%d)\n",
3070 portp, dtr, rts);
3072 msvr1 = 0;
3073 msvr2 = 0;
3074 if (dtr > 0)
3075 msvr1 = MSVR1_DTR;
3076 if (rts > 0)
3077 msvr2 = MSVR2_RTS;
3079 spin_lock_irqsave(&brd_lock, flags);
3080 BRDENABLE(portp->brdnr, portp->pagenr);
3081 stl_cd1400setreg(portp, CAR, (portp->portnr & 0x03));
3082 if (rts >= 0)
3083 stl_cd1400setreg(portp, MSVR2, msvr2);
3084 if (dtr >= 0)
3085 stl_cd1400setreg(portp, MSVR1, msvr1);
3086 BRDDISABLE(portp->brdnr);
3087 spin_unlock_irqrestore(&brd_lock, flags);
3090 /*****************************************************************************/
3093 * Return the state of the signals.
3096 static int stl_cd1400getsignals(struct stlport *portp)
3098 unsigned char msvr1, msvr2;
3099 unsigned long flags;
3100 int sigs;
3102 pr_debug("stl_cd1400getsignals(portp=%p)\n", portp);
3104 spin_lock_irqsave(&brd_lock, flags);
3105 BRDENABLE(portp->brdnr, portp->pagenr);
3106 stl_cd1400setreg(portp, CAR, (portp->portnr & 0x03));
3107 msvr1 = stl_cd1400getreg(portp, MSVR1);
3108 msvr2 = stl_cd1400getreg(portp, MSVR2);
3109 BRDDISABLE(portp->brdnr);
3110 spin_unlock_irqrestore(&brd_lock, flags);
3112 sigs = 0;
3113 sigs |= (msvr1 & MSVR1_DCD) ? TIOCM_CD : 0;
3114 sigs |= (msvr1 & MSVR1_CTS) ? TIOCM_CTS : 0;
3115 sigs |= (msvr1 & MSVR1_DTR) ? TIOCM_DTR : 0;
3116 sigs |= (msvr2 & MSVR2_RTS) ? TIOCM_RTS : 0;
3117 #if 0
3118 sigs |= (msvr1 & MSVR1_RI) ? TIOCM_RI : 0;
3119 sigs |= (msvr1 & MSVR1_DSR) ? TIOCM_DSR : 0;
3120 #else
3121 sigs |= TIOCM_DSR;
3122 #endif
3123 return sigs;
3126 /*****************************************************************************/
3129 * Enable/Disable the Transmitter and/or Receiver.
3132 static void stl_cd1400enablerxtx(struct stlport *portp, int rx, int tx)
3134 unsigned char ccr;
3135 unsigned long flags;
3137 pr_debug("stl_cd1400enablerxtx(portp=%p,rx=%d,tx=%d)\n", portp, rx, tx);
3139 ccr = 0;
3141 if (tx == 0)
3142 ccr |= CCR_TXDISABLE;
3143 else if (tx > 0)
3144 ccr |= CCR_TXENABLE;
3145 if (rx == 0)
3146 ccr |= CCR_RXDISABLE;
3147 else if (rx > 0)
3148 ccr |= CCR_RXENABLE;
3150 spin_lock_irqsave(&brd_lock, flags);
3151 BRDENABLE(portp->brdnr, portp->pagenr);
3152 stl_cd1400setreg(portp, CAR, (portp->portnr & 0x03));
3153 stl_cd1400ccrwait(portp);
3154 stl_cd1400setreg(portp, CCR, ccr);
3155 stl_cd1400ccrwait(portp);
3156 BRDDISABLE(portp->brdnr);
3157 spin_unlock_irqrestore(&brd_lock, flags);
3160 /*****************************************************************************/
3163 * Start/stop the Transmitter and/or Receiver.
3166 static void stl_cd1400startrxtx(struct stlport *portp, int rx, int tx)
3168 unsigned char sreron, sreroff;
3169 unsigned long flags;
3171 pr_debug("stl_cd1400startrxtx(portp=%p,rx=%d,tx=%d)\n", portp, rx, tx);
3173 sreron = 0;
3174 sreroff = 0;
3175 if (tx == 0)
3176 sreroff |= (SRER_TXDATA | SRER_TXEMPTY);
3177 else if (tx == 1)
3178 sreron |= SRER_TXDATA;
3179 else if (tx >= 2)
3180 sreron |= SRER_TXEMPTY;
3181 if (rx == 0)
3182 sreroff |= SRER_RXDATA;
3183 else if (rx > 0)
3184 sreron |= SRER_RXDATA;
3186 spin_lock_irqsave(&brd_lock, flags);
3187 BRDENABLE(portp->brdnr, portp->pagenr);
3188 stl_cd1400setreg(portp, CAR, (portp->portnr & 0x03));
3189 stl_cd1400setreg(portp, SRER,
3190 ((stl_cd1400getreg(portp, SRER) & ~sreroff) | sreron));
3191 BRDDISABLE(portp->brdnr);
3192 if (tx > 0)
3193 set_bit(ASYI_TXBUSY, &portp->istate);
3194 spin_unlock_irqrestore(&brd_lock, flags);
3197 /*****************************************************************************/
3200 * Disable all interrupts from this port.
3203 static void stl_cd1400disableintrs(struct stlport *portp)
3205 unsigned long flags;
3207 pr_debug("stl_cd1400disableintrs(portp=%p)\n", portp);
3209 spin_lock_irqsave(&brd_lock, flags);
3210 BRDENABLE(portp->brdnr, portp->pagenr);
3211 stl_cd1400setreg(portp, CAR, (portp->portnr & 0x03));
3212 stl_cd1400setreg(portp, SRER, 0);
3213 BRDDISABLE(portp->brdnr);
3214 spin_unlock_irqrestore(&brd_lock, flags);
3217 /*****************************************************************************/
3219 static void stl_cd1400sendbreak(struct stlport *portp, int len)
3221 unsigned long flags;
3223 pr_debug("stl_cd1400sendbreak(portp=%p,len=%d)\n", portp, len);
3225 spin_lock_irqsave(&brd_lock, flags);
3226 BRDENABLE(portp->brdnr, portp->pagenr);
3227 stl_cd1400setreg(portp, CAR, (portp->portnr & 0x03));
3228 stl_cd1400setreg(portp, SRER,
3229 ((stl_cd1400getreg(portp, SRER) & ~SRER_TXDATA) |
3230 SRER_TXEMPTY));
3231 BRDDISABLE(portp->brdnr);
3232 portp->brklen = len;
3233 if (len == 1)
3234 portp->stats.txbreaks++;
3235 spin_unlock_irqrestore(&brd_lock, flags);
3238 /*****************************************************************************/
3241 * Take flow control actions...
3244 static void stl_cd1400flowctrl(struct stlport *portp, int state)
3246 struct tty_struct *tty;
3247 unsigned long flags;
3249 pr_debug("stl_cd1400flowctrl(portp=%p,state=%x)\n", portp, state);
3251 if (portp == NULL)
3252 return;
3253 tty = tty_port_tty_get(&portp->port);
3254 if (tty == NULL)
3255 return;
3257 spin_lock_irqsave(&brd_lock, flags);
3258 BRDENABLE(portp->brdnr, portp->pagenr);
3259 stl_cd1400setreg(portp, CAR, (portp->portnr & 0x03));
3261 if (state) {
3262 if (tty->termios->c_iflag & IXOFF) {
3263 stl_cd1400ccrwait(portp);
3264 stl_cd1400setreg(portp, CCR, CCR_SENDSCHR1);
3265 portp->stats.rxxon++;
3266 stl_cd1400ccrwait(portp);
3269 * Question: should we return RTS to what it was before? It may
3270 * have been set by an ioctl... Suppose not, since if you have
3271 * hardware flow control set then it is pretty silly to go and
3272 * set the RTS line by hand.
3274 if (tty->termios->c_cflag & CRTSCTS) {
3275 stl_cd1400setreg(portp, MCOR1,
3276 (stl_cd1400getreg(portp, MCOR1) |
3277 FIFO_RTSTHRESHOLD));
3278 stl_cd1400setreg(portp, MSVR2, MSVR2_RTS);
3279 portp->stats.rxrtson++;
3281 } else {
3282 if (tty->termios->c_iflag & IXOFF) {
3283 stl_cd1400ccrwait(portp);
3284 stl_cd1400setreg(portp, CCR, CCR_SENDSCHR2);
3285 portp->stats.rxxoff++;
3286 stl_cd1400ccrwait(portp);
3288 if (tty->termios->c_cflag & CRTSCTS) {
3289 stl_cd1400setreg(portp, MCOR1,
3290 (stl_cd1400getreg(portp, MCOR1) & 0xf0));
3291 stl_cd1400setreg(portp, MSVR2, 0);
3292 portp->stats.rxrtsoff++;
3296 BRDDISABLE(portp->brdnr);
3297 spin_unlock_irqrestore(&brd_lock, flags);
3298 tty_kref_put(tty);
3301 /*****************************************************************************/
3304 * Send a flow control character...
3307 static void stl_cd1400sendflow(struct stlport *portp, int state)
3309 struct tty_struct *tty;
3310 unsigned long flags;
3312 pr_debug("stl_cd1400sendflow(portp=%p,state=%x)\n", portp, state);
3314 if (portp == NULL)
3315 return;
3316 tty = tty_port_tty_get(&portp->port);
3317 if (tty == NULL)
3318 return;
3320 spin_lock_irqsave(&brd_lock, flags);
3321 BRDENABLE(portp->brdnr, portp->pagenr);
3322 stl_cd1400setreg(portp, CAR, (portp->portnr & 0x03));
3323 if (state) {
3324 stl_cd1400ccrwait(portp);
3325 stl_cd1400setreg(portp, CCR, CCR_SENDSCHR1);
3326 portp->stats.rxxon++;
3327 stl_cd1400ccrwait(portp);
3328 } else {
3329 stl_cd1400ccrwait(portp);
3330 stl_cd1400setreg(portp, CCR, CCR_SENDSCHR2);
3331 portp->stats.rxxoff++;
3332 stl_cd1400ccrwait(portp);
3334 BRDDISABLE(portp->brdnr);
3335 spin_unlock_irqrestore(&brd_lock, flags);
3336 tty_kref_put(tty);
3339 /*****************************************************************************/
3341 static void stl_cd1400flush(struct stlport *portp)
3343 unsigned long flags;
3345 pr_debug("stl_cd1400flush(portp=%p)\n", portp);
3347 if (portp == NULL)
3348 return;
3350 spin_lock_irqsave(&brd_lock, flags);
3351 BRDENABLE(portp->brdnr, portp->pagenr);
3352 stl_cd1400setreg(portp, CAR, (portp->portnr & 0x03));
3353 stl_cd1400ccrwait(portp);
3354 stl_cd1400setreg(portp, CCR, CCR_TXFLUSHFIFO);
3355 stl_cd1400ccrwait(portp);
3356 portp->tx.tail = portp->tx.head;
3357 BRDDISABLE(portp->brdnr);
3358 spin_unlock_irqrestore(&brd_lock, flags);
3361 /*****************************************************************************/
3364 * Return the current state of data flow on this port. This is only
3365 * really interresting when determining if data has fully completed
3366 * transmission or not... This is easy for the cd1400, it accurately
3367 * maintains the busy port flag.
3370 static int stl_cd1400datastate(struct stlport *portp)
3372 pr_debug("stl_cd1400datastate(portp=%p)\n", portp);
3374 if (portp == NULL)
3375 return 0;
3377 return test_bit(ASYI_TXBUSY, &portp->istate) ? 1 : 0;
3380 /*****************************************************************************/
3383 * Interrupt service routine for cd1400 EasyIO boards.
3386 static void stl_cd1400eiointr(struct stlpanel *panelp, unsigned int iobase)
3388 unsigned char svrtype;
3390 pr_debug("stl_cd1400eiointr(panelp=%p,iobase=%x)\n", panelp, iobase);
3392 spin_lock(&brd_lock);
3393 outb(SVRR, iobase);
3394 svrtype = inb(iobase + EREG_DATA);
3395 if (panelp->nrports > 4) {
3396 outb((SVRR + 0x80), iobase);
3397 svrtype |= inb(iobase + EREG_DATA);
3400 if (svrtype & SVRR_RX)
3401 stl_cd1400rxisr(panelp, iobase);
3402 else if (svrtype & SVRR_TX)
3403 stl_cd1400txisr(panelp, iobase);
3404 else if (svrtype & SVRR_MDM)
3405 stl_cd1400mdmisr(panelp, iobase);
3407 spin_unlock(&brd_lock);
3410 /*****************************************************************************/
3413 * Interrupt service routine for cd1400 panels.
3416 static void stl_cd1400echintr(struct stlpanel *panelp, unsigned int iobase)
3418 unsigned char svrtype;
3420 pr_debug("stl_cd1400echintr(panelp=%p,iobase=%x)\n", panelp, iobase);
3422 outb(SVRR, iobase);
3423 svrtype = inb(iobase + EREG_DATA);
3424 outb((SVRR + 0x80), iobase);
3425 svrtype |= inb(iobase + EREG_DATA);
3426 if (svrtype & SVRR_RX)
3427 stl_cd1400rxisr(panelp, iobase);
3428 else if (svrtype & SVRR_TX)
3429 stl_cd1400txisr(panelp, iobase);
3430 else if (svrtype & SVRR_MDM)
3431 stl_cd1400mdmisr(panelp, iobase);
3435 /*****************************************************************************/
3438 * Unfortunately we need to handle breaks in the TX data stream, since
3439 * this is the only way to generate them on the cd1400.
3442 static int stl_cd1400breakisr(struct stlport *portp, int ioaddr)
3444 if (portp->brklen == 1) {
3445 outb((COR2 + portp->uartaddr), ioaddr);
3446 outb((inb(ioaddr + EREG_DATA) | COR2_ETC),
3447 (ioaddr + EREG_DATA));
3448 outb((TDR + portp->uartaddr), ioaddr);
3449 outb(ETC_CMD, (ioaddr + EREG_DATA));
3450 outb(ETC_STARTBREAK, (ioaddr + EREG_DATA));
3451 outb((SRER + portp->uartaddr), ioaddr);
3452 outb((inb(ioaddr + EREG_DATA) & ~(SRER_TXDATA | SRER_TXEMPTY)),
3453 (ioaddr + EREG_DATA));
3454 return 1;
3455 } else if (portp->brklen > 1) {
3456 outb((TDR + portp->uartaddr), ioaddr);
3457 outb(ETC_CMD, (ioaddr + EREG_DATA));
3458 outb(ETC_STOPBREAK, (ioaddr + EREG_DATA));
3459 portp->brklen = -1;
3460 return 1;
3461 } else {
3462 outb((COR2 + portp->uartaddr), ioaddr);
3463 outb((inb(ioaddr + EREG_DATA) & ~COR2_ETC),
3464 (ioaddr + EREG_DATA));
3465 portp->brklen = 0;
3467 return 0;
3470 /*****************************************************************************/
3473 * Transmit interrupt handler. This has gotta be fast! Handling TX
3474 * chars is pretty simple, stuff as many as possible from the TX buffer
3475 * into the cd1400 FIFO. Must also handle TX breaks here, since they
3476 * are embedded as commands in the data stream. Oh no, had to use a goto!
3477 * This could be optimized more, will do when I get time...
3478 * In practice it is possible that interrupts are enabled but that the
3479 * port has been hung up. Need to handle not having any TX buffer here,
3480 * this is done by using the side effect that head and tail will also
3481 * be NULL if the buffer has been freed.
3484 static void stl_cd1400txisr(struct stlpanel *panelp, int ioaddr)
3486 struct stlport *portp;
3487 int len, stlen;
3488 char *head, *tail;
3489 unsigned char ioack, srer;
3490 struct tty_struct *tty;
3492 pr_debug("stl_cd1400txisr(panelp=%p,ioaddr=%x)\n", panelp, ioaddr);
3494 ioack = inb(ioaddr + EREG_TXACK);
3495 if (((ioack & panelp->ackmask) != 0) ||
3496 ((ioack & ACK_TYPMASK) != ACK_TYPTX)) {
3497 printk("STALLION: bad TX interrupt ack value=%x\n", ioack);
3498 return;
3500 portp = panelp->ports[(ioack >> 3)];
3503 * Unfortunately we need to handle breaks in the data stream, since
3504 * this is the only way to generate them on the cd1400. Do it now if
3505 * a break is to be sent.
3507 if (portp->brklen != 0)
3508 if (stl_cd1400breakisr(portp, ioaddr))
3509 goto stl_txalldone;
3511 head = portp->tx.head;
3512 tail = portp->tx.tail;
3513 len = (head >= tail) ? (head - tail) : (STL_TXBUFSIZE - (tail - head));
3514 if ((len == 0) || ((len < STL_TXBUFLOW) &&
3515 (test_bit(ASYI_TXLOW, &portp->istate) == 0))) {
3516 set_bit(ASYI_TXLOW, &portp->istate);
3517 tty = tty_port_tty_get(&portp->port);
3518 if (tty) {
3519 tty_wakeup(tty);
3520 tty_kref_put(tty);
3524 if (len == 0) {
3525 outb((SRER + portp->uartaddr), ioaddr);
3526 srer = inb(ioaddr + EREG_DATA);
3527 if (srer & SRER_TXDATA) {
3528 srer = (srer & ~SRER_TXDATA) | SRER_TXEMPTY;
3529 } else {
3530 srer &= ~(SRER_TXDATA | SRER_TXEMPTY);
3531 clear_bit(ASYI_TXBUSY, &portp->istate);
3533 outb(srer, (ioaddr + EREG_DATA));
3534 } else {
3535 len = min(len, CD1400_TXFIFOSIZE);
3536 portp->stats.txtotal += len;
3537 stlen = min_t(unsigned int, len,
3538 (portp->tx.buf + STL_TXBUFSIZE) - tail);
3539 outb((TDR + portp->uartaddr), ioaddr);
3540 outsb((ioaddr + EREG_DATA), tail, stlen);
3541 len -= stlen;
3542 tail += stlen;
3543 if (tail >= (portp->tx.buf + STL_TXBUFSIZE))
3544 tail = portp->tx.buf;
3545 if (len > 0) {
3546 outsb((ioaddr + EREG_DATA), tail, len);
3547 tail += len;
3549 portp->tx.tail = tail;
3552 stl_txalldone:
3553 outb((EOSRR + portp->uartaddr), ioaddr);
3554 outb(0, (ioaddr + EREG_DATA));
3557 /*****************************************************************************/
3560 * Receive character interrupt handler. Determine if we have good chars
3561 * or bad chars and then process appropriately. Good chars are easy
3562 * just shove the lot into the RX buffer and set all status byte to 0.
3563 * If a bad RX char then process as required. This routine needs to be
3564 * fast! In practice it is possible that we get an interrupt on a port
3565 * that is closed. This can happen on hangups - since they completely
3566 * shutdown a port not in user context. Need to handle this case.
3569 static void stl_cd1400rxisr(struct stlpanel *panelp, int ioaddr)
3571 struct stlport *portp;
3572 struct tty_struct *tty;
3573 unsigned int ioack, len, buflen;
3574 unsigned char status;
3575 char ch;
3577 pr_debug("stl_cd1400rxisr(panelp=%p,ioaddr=%x)\n", panelp, ioaddr);
3579 ioack = inb(ioaddr + EREG_RXACK);
3580 if ((ioack & panelp->ackmask) != 0) {
3581 printk("STALLION: bad RX interrupt ack value=%x\n", ioack);
3582 return;
3584 portp = panelp->ports[(ioack >> 3)];
3585 tty = tty_port_tty_get(&portp->port);
3587 if ((ioack & ACK_TYPMASK) == ACK_TYPRXGOOD) {
3588 outb((RDCR + portp->uartaddr), ioaddr);
3589 len = inb(ioaddr + EREG_DATA);
3590 if (tty == NULL || (buflen = tty_buffer_request_room(tty, len)) == 0) {
3591 len = min_t(unsigned int, len, sizeof(stl_unwanted));
3592 outb((RDSR + portp->uartaddr), ioaddr);
3593 insb((ioaddr + EREG_DATA), &stl_unwanted[0], len);
3594 portp->stats.rxlost += len;
3595 portp->stats.rxtotal += len;
3596 } else {
3597 len = min(len, buflen);
3598 if (len > 0) {
3599 unsigned char *ptr;
3600 outb((RDSR + portp->uartaddr), ioaddr);
3601 tty_prepare_flip_string(tty, &ptr, len);
3602 insb((ioaddr + EREG_DATA), ptr, len);
3603 tty_schedule_flip(tty);
3604 portp->stats.rxtotal += len;
3607 } else if ((ioack & ACK_TYPMASK) == ACK_TYPRXBAD) {
3608 outb((RDSR + portp->uartaddr), ioaddr);
3609 status = inb(ioaddr + EREG_DATA);
3610 ch = inb(ioaddr + EREG_DATA);
3611 if (status & ST_PARITY)
3612 portp->stats.rxparity++;
3613 if (status & ST_FRAMING)
3614 portp->stats.rxframing++;
3615 if (status & ST_OVERRUN)
3616 portp->stats.rxoverrun++;
3617 if (status & ST_BREAK)
3618 portp->stats.rxbreaks++;
3619 if (status & ST_SCHARMASK) {
3620 if ((status & ST_SCHARMASK) == ST_SCHAR1)
3621 portp->stats.txxon++;
3622 if ((status & ST_SCHARMASK) == ST_SCHAR2)
3623 portp->stats.txxoff++;
3624 goto stl_rxalldone;
3626 if (tty != NULL && (portp->rxignoremsk & status) == 0) {
3627 if (portp->rxmarkmsk & status) {
3628 if (status & ST_BREAK) {
3629 status = TTY_BREAK;
3630 if (portp->port.flags & ASYNC_SAK) {
3631 do_SAK(tty);
3632 BRDENABLE(portp->brdnr, portp->pagenr);
3634 } else if (status & ST_PARITY)
3635 status = TTY_PARITY;
3636 else if (status & ST_FRAMING)
3637 status = TTY_FRAME;
3638 else if(status & ST_OVERRUN)
3639 status = TTY_OVERRUN;
3640 else
3641 status = 0;
3642 } else
3643 status = 0;
3644 tty_insert_flip_char(tty, ch, status);
3645 tty_schedule_flip(tty);
3647 } else {
3648 printk("STALLION: bad RX interrupt ack value=%x\n", ioack);
3649 tty_kref_put(tty);
3650 return;
3653 stl_rxalldone:
3654 tty_kref_put(tty);
3655 outb((EOSRR + portp->uartaddr), ioaddr);
3656 outb(0, (ioaddr + EREG_DATA));
3659 /*****************************************************************************/
3662 * Modem interrupt handler. The is called when the modem signal line
3663 * (DCD) has changed state. Leave most of the work to the off-level
3664 * processing routine.
3667 static void stl_cd1400mdmisr(struct stlpanel *panelp, int ioaddr)
3669 struct stlport *portp;
3670 unsigned int ioack;
3671 unsigned char misr;
3673 pr_debug("stl_cd1400mdmisr(panelp=%p)\n", panelp);
3675 ioack = inb(ioaddr + EREG_MDACK);
3676 if (((ioack & panelp->ackmask) != 0) ||
3677 ((ioack & ACK_TYPMASK) != ACK_TYPMDM)) {
3678 printk("STALLION: bad MODEM interrupt ack value=%x\n", ioack);
3679 return;
3681 portp = panelp->ports[(ioack >> 3)];
3683 outb((MISR + portp->uartaddr), ioaddr);
3684 misr = inb(ioaddr + EREG_DATA);
3685 if (misr & MISR_DCD) {
3686 stl_cd_change(portp);
3687 portp->stats.modem++;
3690 outb((EOSRR + portp->uartaddr), ioaddr);
3691 outb(0, (ioaddr + EREG_DATA));
3694 /*****************************************************************************/
3695 /* SC26198 HARDWARE FUNCTIONS */
3696 /*****************************************************************************/
3699 * These functions get/set/update the registers of the sc26198 UARTs.
3700 * Access to the sc26198 registers is via an address/data io port pair.
3701 * (Maybe should make this inline...)
3704 static int stl_sc26198getreg(struct stlport *portp, int regnr)
3706 outb((regnr | portp->uartaddr), (portp->ioaddr + XP_ADDR));
3707 return inb(portp->ioaddr + XP_DATA);
3710 static void stl_sc26198setreg(struct stlport *portp, int regnr, int value)
3712 outb((regnr | portp->uartaddr), (portp->ioaddr + XP_ADDR));
3713 outb(value, (portp->ioaddr + XP_DATA));
3716 static int stl_sc26198updatereg(struct stlport *portp, int regnr, int value)
3718 outb((regnr | portp->uartaddr), (portp->ioaddr + XP_ADDR));
3719 if (inb(portp->ioaddr + XP_DATA) != value) {
3720 outb(value, (portp->ioaddr + XP_DATA));
3721 return 1;
3723 return 0;
3726 /*****************************************************************************/
3729 * Functions to get and set the sc26198 global registers.
3732 static int stl_sc26198getglobreg(struct stlport *portp, int regnr)
3734 outb(regnr, (portp->ioaddr + XP_ADDR));
3735 return inb(portp->ioaddr + XP_DATA);
3738 #if 0
3739 static void stl_sc26198setglobreg(struct stlport *portp, int regnr, int value)
3741 outb(regnr, (portp->ioaddr + XP_ADDR));
3742 outb(value, (portp->ioaddr + XP_DATA));
3744 #endif
3746 /*****************************************************************************/
3749 * Inbitialize the UARTs in a panel. We don't care what sort of board
3750 * these ports are on - since the port io registers are almost
3751 * identical when dealing with ports.
3754 static int stl_sc26198panelinit(struct stlbrd *brdp, struct stlpanel *panelp)
3756 int chipmask, i;
3757 int nrchips, ioaddr;
3759 pr_debug("stl_sc26198panelinit(brdp=%p,panelp=%p)\n", brdp, panelp);
3761 BRDENABLE(panelp->brdnr, panelp->pagenr);
3764 * Check that each chip is present and started up OK.
3766 chipmask = 0;
3767 nrchips = (panelp->nrports + 4) / SC26198_PORTS;
3768 if (brdp->brdtype == BRD_ECHPCI)
3769 outb(panelp->pagenr, brdp->ioctrl);
3771 for (i = 0; i < nrchips; i++) {
3772 ioaddr = panelp->iobase + (i * 4);
3773 outb(SCCR, (ioaddr + XP_ADDR));
3774 outb(CR_RESETALL, (ioaddr + XP_DATA));
3775 outb(TSTR, (ioaddr + XP_ADDR));
3776 if (inb(ioaddr + XP_DATA) != 0) {
3777 printk("STALLION: sc26198 not responding, "
3778 "brd=%d panel=%d chip=%d\n",
3779 panelp->brdnr, panelp->panelnr, i);
3780 continue;
3782 chipmask |= (0x1 << i);
3783 outb(GCCR, (ioaddr + XP_ADDR));
3784 outb(GCCR_IVRTYPCHANACK, (ioaddr + XP_DATA));
3785 outb(WDTRCR, (ioaddr + XP_ADDR));
3786 outb(0xff, (ioaddr + XP_DATA));
3789 BRDDISABLE(panelp->brdnr);
3790 return chipmask;
3793 /*****************************************************************************/
3796 * Initialize hardware specific port registers.
3799 static void stl_sc26198portinit(struct stlbrd *brdp, struct stlpanel *panelp, struct stlport *portp)
3801 pr_debug("stl_sc26198portinit(brdp=%p,panelp=%p,portp=%p)\n", brdp,
3802 panelp, portp);
3804 if ((brdp == NULL) || (panelp == NULL) ||
3805 (portp == NULL))
3806 return;
3808 portp->ioaddr = panelp->iobase + ((portp->portnr < 8) ? 0 : 4);
3809 portp->uartaddr = (portp->portnr & 0x07) << 4;
3810 portp->pagenr = panelp->pagenr;
3811 portp->hwid = 0x1;
3813 BRDENABLE(portp->brdnr, portp->pagenr);
3814 stl_sc26198setreg(portp, IOPCR, IOPCR_SETSIGS);
3815 BRDDISABLE(portp->brdnr);
3818 /*****************************************************************************/
3821 * Set up the sc26198 registers for a port based on the termios port
3822 * settings.
3825 static void stl_sc26198setport(struct stlport *portp, struct ktermios *tiosp)
3827 struct stlbrd *brdp;
3828 unsigned long flags;
3829 unsigned int baudrate;
3830 unsigned char mr0, mr1, mr2, clk;
3831 unsigned char imron, imroff, iopr, ipr;
3833 mr0 = 0;
3834 mr1 = 0;
3835 mr2 = 0;
3836 clk = 0;
3837 iopr = 0;
3838 imron = 0;
3839 imroff = 0;
3841 brdp = stl_brds[portp->brdnr];
3842 if (brdp == NULL)
3843 return;
3846 * Set up the RX char ignore mask with those RX error types we
3847 * can ignore.
3849 portp->rxignoremsk = 0;
3850 if (tiosp->c_iflag & IGNPAR)
3851 portp->rxignoremsk |= (SR_RXPARITY | SR_RXFRAMING |
3852 SR_RXOVERRUN);
3853 if (tiosp->c_iflag & IGNBRK)
3854 portp->rxignoremsk |= SR_RXBREAK;
3856 portp->rxmarkmsk = SR_RXOVERRUN;
3857 if (tiosp->c_iflag & (INPCK | PARMRK))
3858 portp->rxmarkmsk |= (SR_RXPARITY | SR_RXFRAMING);
3859 if (tiosp->c_iflag & BRKINT)
3860 portp->rxmarkmsk |= SR_RXBREAK;
3863 * Go through the char size, parity and stop bits and set all the
3864 * option register appropriately.
3866 switch (tiosp->c_cflag & CSIZE) {
3867 case CS5:
3868 mr1 |= MR1_CS5;
3869 break;
3870 case CS6:
3871 mr1 |= MR1_CS6;
3872 break;
3873 case CS7:
3874 mr1 |= MR1_CS7;
3875 break;
3876 default:
3877 mr1 |= MR1_CS8;
3878 break;
3881 if (tiosp->c_cflag & CSTOPB)
3882 mr2 |= MR2_STOP2;
3883 else
3884 mr2 |= MR2_STOP1;
3886 if (tiosp->c_cflag & PARENB) {
3887 if (tiosp->c_cflag & PARODD)
3888 mr1 |= (MR1_PARENB | MR1_PARODD);
3889 else
3890 mr1 |= (MR1_PARENB | MR1_PAREVEN);
3891 } else
3892 mr1 |= MR1_PARNONE;
3894 mr1 |= MR1_ERRBLOCK;
3897 * Set the RX FIFO threshold at 8 chars. This gives a bit of breathing
3898 * space for hardware flow control and the like. This should be set to
3899 * VMIN.
3901 mr2 |= MR2_RXFIFOHALF;
3904 * Calculate the baud rate timers. For now we will just assume that
3905 * the input and output baud are the same. The sc26198 has a fixed
3906 * baud rate table, so only discrete baud rates possible.
3908 baudrate = tiosp->c_cflag & CBAUD;
3909 if (baudrate & CBAUDEX) {
3910 baudrate &= ~CBAUDEX;
3911 if ((baudrate < 1) || (baudrate > 4))
3912 tiosp->c_cflag &= ~CBAUDEX;
3913 else
3914 baudrate += 15;
3916 baudrate = stl_baudrates[baudrate];
3917 if ((tiosp->c_cflag & CBAUD) == B38400) {
3918 if ((portp->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_HI)
3919 baudrate = 57600;
3920 else if ((portp->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_VHI)
3921 baudrate = 115200;
3922 else if ((portp->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_SHI)
3923 baudrate = 230400;
3924 else if ((portp->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_WARP)
3925 baudrate = 460800;
3926 else if ((portp->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST)
3927 baudrate = (portp->baud_base / portp->custom_divisor);
3929 if (baudrate > STL_SC26198MAXBAUD)
3930 baudrate = STL_SC26198MAXBAUD;
3932 if (baudrate > 0)
3933 for (clk = 0; clk < SC26198_NRBAUDS; clk++)
3934 if (baudrate <= sc26198_baudtable[clk])
3935 break;
3938 * Check what form of modem signaling is required and set it up.
3940 if (tiosp->c_cflag & CLOCAL) {
3941 portp->port.flags &= ~ASYNC_CHECK_CD;
3942 } else {
3943 iopr |= IOPR_DCDCOS;
3944 imron |= IR_IOPORT;
3945 portp->port.flags |= ASYNC_CHECK_CD;
3949 * Setup sc26198 enhanced modes if we can. In particular we want to
3950 * handle as much of the flow control as possible automatically. As
3951 * well as saving a few CPU cycles it will also greatly improve flow
3952 * control reliability.
3954 if (tiosp->c_iflag & IXON) {
3955 mr0 |= MR0_SWFTX | MR0_SWFT;
3956 imron |= IR_XONXOFF;
3957 } else
3958 imroff |= IR_XONXOFF;
3960 if (tiosp->c_iflag & IXOFF)
3961 mr0 |= MR0_SWFRX;
3963 if (tiosp->c_cflag & CRTSCTS) {
3964 mr2 |= MR2_AUTOCTS;
3965 mr1 |= MR1_AUTORTS;
3969 * All sc26198 register values calculated so go through and set
3970 * them all up.
3973 pr_debug("SETPORT: portnr=%d panelnr=%d brdnr=%d\n",
3974 portp->portnr, portp->panelnr, portp->brdnr);
3975 pr_debug(" mr0=%x mr1=%x mr2=%x clk=%x\n", mr0, mr1, mr2, clk);
3976 pr_debug(" iopr=%x imron=%x imroff=%x\n", iopr, imron, imroff);
3977 pr_debug(" schr1=%x schr2=%x schr3=%x schr4=%x\n",
3978 tiosp->c_cc[VSTART], tiosp->c_cc[VSTOP],
3979 tiosp->c_cc[VSTART], tiosp->c_cc[VSTOP]);
3981 spin_lock_irqsave(&brd_lock, flags);
3982 BRDENABLE(portp->brdnr, portp->pagenr);
3983 stl_sc26198setreg(portp, IMR, 0);
3984 stl_sc26198updatereg(portp, MR0, mr0);
3985 stl_sc26198updatereg(portp, MR1, mr1);
3986 stl_sc26198setreg(portp, SCCR, CR_RXERRBLOCK);
3987 stl_sc26198updatereg(portp, MR2, mr2);
3988 stl_sc26198updatereg(portp, IOPIOR,
3989 ((stl_sc26198getreg(portp, IOPIOR) & ~IPR_CHANGEMASK) | iopr));
3991 if (baudrate > 0) {
3992 stl_sc26198setreg(portp, TXCSR, clk);
3993 stl_sc26198setreg(portp, RXCSR, clk);
3996 stl_sc26198setreg(portp, XONCR, tiosp->c_cc[VSTART]);
3997 stl_sc26198setreg(portp, XOFFCR, tiosp->c_cc[VSTOP]);
3999 ipr = stl_sc26198getreg(portp, IPR);
4000 if (ipr & IPR_DCD)
4001 portp->sigs &= ~TIOCM_CD;
4002 else
4003 portp->sigs |= TIOCM_CD;
4005 portp->imr = (portp->imr & ~imroff) | imron;
4006 stl_sc26198setreg(portp, IMR, portp->imr);
4007 BRDDISABLE(portp->brdnr);
4008 spin_unlock_irqrestore(&brd_lock, flags);
4011 /*****************************************************************************/
4014 * Set the state of the DTR and RTS signals.
4017 static void stl_sc26198setsignals(struct stlport *portp, int dtr, int rts)
4019 unsigned char iopioron, iopioroff;
4020 unsigned long flags;
4022 pr_debug("stl_sc26198setsignals(portp=%p,dtr=%d,rts=%d)\n", portp,
4023 dtr, rts);
4025 iopioron = 0;
4026 iopioroff = 0;
4027 if (dtr == 0)
4028 iopioroff |= IPR_DTR;
4029 else if (dtr > 0)
4030 iopioron |= IPR_DTR;
4031 if (rts == 0)
4032 iopioroff |= IPR_RTS;
4033 else if (rts > 0)
4034 iopioron |= IPR_RTS;
4036 spin_lock_irqsave(&brd_lock, flags);
4037 BRDENABLE(portp->brdnr, portp->pagenr);
4038 stl_sc26198setreg(portp, IOPIOR,
4039 ((stl_sc26198getreg(portp, IOPIOR) & ~iopioroff) | iopioron));
4040 BRDDISABLE(portp->brdnr);
4041 spin_unlock_irqrestore(&brd_lock, flags);
4044 /*****************************************************************************/
4047 * Return the state of the signals.
4050 static int stl_sc26198getsignals(struct stlport *portp)
4052 unsigned char ipr;
4053 unsigned long flags;
4054 int sigs;
4056 pr_debug("stl_sc26198getsignals(portp=%p)\n", portp);
4058 spin_lock_irqsave(&brd_lock, flags);
4059 BRDENABLE(portp->brdnr, portp->pagenr);
4060 ipr = stl_sc26198getreg(portp, IPR);
4061 BRDDISABLE(portp->brdnr);
4062 spin_unlock_irqrestore(&brd_lock, flags);
4064 sigs = 0;
4065 sigs |= (ipr & IPR_DCD) ? 0 : TIOCM_CD;
4066 sigs |= (ipr & IPR_CTS) ? 0 : TIOCM_CTS;
4067 sigs |= (ipr & IPR_DTR) ? 0: TIOCM_DTR;
4068 sigs |= (ipr & IPR_RTS) ? 0: TIOCM_RTS;
4069 sigs |= TIOCM_DSR;
4070 return sigs;
4073 /*****************************************************************************/
4076 * Enable/Disable the Transmitter and/or Receiver.
4079 static void stl_sc26198enablerxtx(struct stlport *portp, int rx, int tx)
4081 unsigned char ccr;
4082 unsigned long flags;
4084 pr_debug("stl_sc26198enablerxtx(portp=%p,rx=%d,tx=%d)\n", portp, rx,tx);
4086 ccr = portp->crenable;
4087 if (tx == 0)
4088 ccr &= ~CR_TXENABLE;
4089 else if (tx > 0)
4090 ccr |= CR_TXENABLE;
4091 if (rx == 0)
4092 ccr &= ~CR_RXENABLE;
4093 else if (rx > 0)
4094 ccr |= CR_RXENABLE;
4096 spin_lock_irqsave(&brd_lock, flags);
4097 BRDENABLE(portp->brdnr, portp->pagenr);
4098 stl_sc26198setreg(portp, SCCR, ccr);
4099 BRDDISABLE(portp->brdnr);
4100 portp->crenable = ccr;
4101 spin_unlock_irqrestore(&brd_lock, flags);
4104 /*****************************************************************************/
4107 * Start/stop the Transmitter and/or Receiver.
4110 static void stl_sc26198startrxtx(struct stlport *portp, int rx, int tx)
4112 unsigned char imr;
4113 unsigned long flags;
4115 pr_debug("stl_sc26198startrxtx(portp=%p,rx=%d,tx=%d)\n", portp, rx, tx);
4117 imr = portp->imr;
4118 if (tx == 0)
4119 imr &= ~IR_TXRDY;
4120 else if (tx == 1)
4121 imr |= IR_TXRDY;
4122 if (rx == 0)
4123 imr &= ~(IR_RXRDY | IR_RXBREAK | IR_RXWATCHDOG);
4124 else if (rx > 0)
4125 imr |= IR_RXRDY | IR_RXBREAK | IR_RXWATCHDOG;
4127 spin_lock_irqsave(&brd_lock, flags);
4128 BRDENABLE(portp->brdnr, portp->pagenr);
4129 stl_sc26198setreg(portp, IMR, imr);
4130 BRDDISABLE(portp->brdnr);
4131 portp->imr = imr;
4132 if (tx > 0)
4133 set_bit(ASYI_TXBUSY, &portp->istate);
4134 spin_unlock_irqrestore(&brd_lock, flags);
4137 /*****************************************************************************/
4140 * Disable all interrupts from this port.
4143 static void stl_sc26198disableintrs(struct stlport *portp)
4145 unsigned long flags;
4147 pr_debug("stl_sc26198disableintrs(portp=%p)\n", portp);
4149 spin_lock_irqsave(&brd_lock, flags);
4150 BRDENABLE(portp->brdnr, portp->pagenr);
4151 portp->imr = 0;
4152 stl_sc26198setreg(portp, IMR, 0);
4153 BRDDISABLE(portp->brdnr);
4154 spin_unlock_irqrestore(&brd_lock, flags);
4157 /*****************************************************************************/
4159 static void stl_sc26198sendbreak(struct stlport *portp, int len)
4161 unsigned long flags;
4163 pr_debug("stl_sc26198sendbreak(portp=%p,len=%d)\n", portp, len);
4165 spin_lock_irqsave(&brd_lock, flags);
4166 BRDENABLE(portp->brdnr, portp->pagenr);
4167 if (len == 1) {
4168 stl_sc26198setreg(portp, SCCR, CR_TXSTARTBREAK);
4169 portp->stats.txbreaks++;
4170 } else
4171 stl_sc26198setreg(portp, SCCR, CR_TXSTOPBREAK);
4173 BRDDISABLE(portp->brdnr);
4174 spin_unlock_irqrestore(&brd_lock, flags);
4177 /*****************************************************************************/
4180 * Take flow control actions...
4183 static void stl_sc26198flowctrl(struct stlport *portp, int state)
4185 struct tty_struct *tty;
4186 unsigned long flags;
4187 unsigned char mr0;
4189 pr_debug("stl_sc26198flowctrl(portp=%p,state=%x)\n", portp, state);
4191 if (portp == NULL)
4192 return;
4193 tty = tty_port_tty_get(&portp->port);
4194 if (tty == NULL)
4195 return;
4197 spin_lock_irqsave(&brd_lock, flags);
4198 BRDENABLE(portp->brdnr, portp->pagenr);
4200 if (state) {
4201 if (tty->termios->c_iflag & IXOFF) {
4202 mr0 = stl_sc26198getreg(portp, MR0);
4203 stl_sc26198setreg(portp, MR0, (mr0 & ~MR0_SWFRXTX));
4204 stl_sc26198setreg(portp, SCCR, CR_TXSENDXON);
4205 mr0 |= MR0_SWFRX;
4206 portp->stats.rxxon++;
4207 stl_sc26198wait(portp);
4208 stl_sc26198setreg(portp, MR0, mr0);
4211 * Question: should we return RTS to what it was before? It may
4212 * have been set by an ioctl... Suppose not, since if you have
4213 * hardware flow control set then it is pretty silly to go and
4214 * set the RTS line by hand.
4216 if (tty->termios->c_cflag & CRTSCTS) {
4217 stl_sc26198setreg(portp, MR1,
4218 (stl_sc26198getreg(portp, MR1) | MR1_AUTORTS));
4219 stl_sc26198setreg(portp, IOPIOR,
4220 (stl_sc26198getreg(portp, IOPIOR) | IOPR_RTS));
4221 portp->stats.rxrtson++;
4223 } else {
4224 if (tty->termios->c_iflag & IXOFF) {
4225 mr0 = stl_sc26198getreg(portp, MR0);
4226 stl_sc26198setreg(portp, MR0, (mr0 & ~MR0_SWFRXTX));
4227 stl_sc26198setreg(portp, SCCR, CR_TXSENDXOFF);
4228 mr0 &= ~MR0_SWFRX;
4229 portp->stats.rxxoff++;
4230 stl_sc26198wait(portp);
4231 stl_sc26198setreg(portp, MR0, mr0);
4233 if (tty->termios->c_cflag & CRTSCTS) {
4234 stl_sc26198setreg(portp, MR1,
4235 (stl_sc26198getreg(portp, MR1) & ~MR1_AUTORTS));
4236 stl_sc26198setreg(portp, IOPIOR,
4237 (stl_sc26198getreg(portp, IOPIOR) & ~IOPR_RTS));
4238 portp->stats.rxrtsoff++;
4242 BRDDISABLE(portp->brdnr);
4243 spin_unlock_irqrestore(&brd_lock, flags);
4244 tty_kref_put(tty);
4247 /*****************************************************************************/
4250 * Send a flow control character.
4253 static void stl_sc26198sendflow(struct stlport *portp, int state)
4255 struct tty_struct *tty;
4256 unsigned long flags;
4257 unsigned char mr0;
4259 pr_debug("stl_sc26198sendflow(portp=%p,state=%x)\n", portp, state);
4261 if (portp == NULL)
4262 return;
4263 tty = tty_port_tty_get(&portp->port);
4264 if (tty == NULL)
4265 return;
4267 spin_lock_irqsave(&brd_lock, flags);
4268 BRDENABLE(portp->brdnr, portp->pagenr);
4269 if (state) {
4270 mr0 = stl_sc26198getreg(portp, MR0);
4271 stl_sc26198setreg(portp, MR0, (mr0 & ~MR0_SWFRXTX));
4272 stl_sc26198setreg(portp, SCCR, CR_TXSENDXON);
4273 mr0 |= MR0_SWFRX;
4274 portp->stats.rxxon++;
4275 stl_sc26198wait(portp);
4276 stl_sc26198setreg(portp, MR0, mr0);
4277 } else {
4278 mr0 = stl_sc26198getreg(portp, MR0);
4279 stl_sc26198setreg(portp, MR0, (mr0 & ~MR0_SWFRXTX));
4280 stl_sc26198setreg(portp, SCCR, CR_TXSENDXOFF);
4281 mr0 &= ~MR0_SWFRX;
4282 portp->stats.rxxoff++;
4283 stl_sc26198wait(portp);
4284 stl_sc26198setreg(portp, MR0, mr0);
4286 BRDDISABLE(portp->brdnr);
4287 spin_unlock_irqrestore(&brd_lock, flags);
4288 tty_kref_put(tty);
4291 /*****************************************************************************/
4293 static void stl_sc26198flush(struct stlport *portp)
4295 unsigned long flags;
4297 pr_debug("stl_sc26198flush(portp=%p)\n", portp);
4299 if (portp == NULL)
4300 return;
4302 spin_lock_irqsave(&brd_lock, flags);
4303 BRDENABLE(portp->brdnr, portp->pagenr);
4304 stl_sc26198setreg(portp, SCCR, CR_TXRESET);
4305 stl_sc26198setreg(portp, SCCR, portp->crenable);
4306 BRDDISABLE(portp->brdnr);
4307 portp->tx.tail = portp->tx.head;
4308 spin_unlock_irqrestore(&brd_lock, flags);
4311 /*****************************************************************************/
4314 * Return the current state of data flow on this port. This is only
4315 * really interresting when determining if data has fully completed
4316 * transmission or not... The sc26198 interrupt scheme cannot
4317 * determine when all data has actually drained, so we need to
4318 * check the port statusy register to be sure.
4321 static int stl_sc26198datastate(struct stlport *portp)
4323 unsigned long flags;
4324 unsigned char sr;
4326 pr_debug("stl_sc26198datastate(portp=%p)\n", portp);
4328 if (portp == NULL)
4329 return 0;
4330 if (test_bit(ASYI_TXBUSY, &portp->istate))
4331 return 1;
4333 spin_lock_irqsave(&brd_lock, flags);
4334 BRDENABLE(portp->brdnr, portp->pagenr);
4335 sr = stl_sc26198getreg(portp, SR);
4336 BRDDISABLE(portp->brdnr);
4337 spin_unlock_irqrestore(&brd_lock, flags);
4339 return (sr & SR_TXEMPTY) ? 0 : 1;
4342 /*****************************************************************************/
4345 * Delay for a small amount of time, to give the sc26198 a chance
4346 * to process a command...
4349 static void stl_sc26198wait(struct stlport *portp)
4351 int i;
4353 pr_debug("stl_sc26198wait(portp=%p)\n", portp);
4355 if (portp == NULL)
4356 return;
4358 for (i = 0; i < 20; i++)
4359 stl_sc26198getglobreg(portp, TSTR);
4362 /*****************************************************************************/
4365 * If we are TX flow controlled and in IXANY mode then we may
4366 * need to unflow control here. We gotta do this because of the
4367 * automatic flow control modes of the sc26198.
4370 static void stl_sc26198txunflow(struct stlport *portp, struct tty_struct *tty)
4372 unsigned char mr0;
4374 mr0 = stl_sc26198getreg(portp, MR0);
4375 stl_sc26198setreg(portp, MR0, (mr0 & ~MR0_SWFRXTX));
4376 stl_sc26198setreg(portp, SCCR, CR_HOSTXON);
4377 stl_sc26198wait(portp);
4378 stl_sc26198setreg(portp, MR0, mr0);
4379 clear_bit(ASYI_TXFLOWED, &portp->istate);
4382 /*****************************************************************************/
4385 * Interrupt service routine for sc26198 panels.
4388 static void stl_sc26198intr(struct stlpanel *panelp, unsigned int iobase)
4390 struct stlport *portp;
4391 unsigned int iack;
4393 spin_lock(&brd_lock);
4396 * Work around bug in sc26198 chip... Cannot have A6 address
4397 * line of UART high, else iack will be returned as 0.
4399 outb(0, (iobase + 1));
4401 iack = inb(iobase + XP_IACK);
4402 portp = panelp->ports[(iack & IVR_CHANMASK) + ((iobase & 0x4) << 1)];
4404 if (iack & IVR_RXDATA)
4405 stl_sc26198rxisr(portp, iack);
4406 else if (iack & IVR_TXDATA)
4407 stl_sc26198txisr(portp);
4408 else
4409 stl_sc26198otherisr(portp, iack);
4411 spin_unlock(&brd_lock);
4414 /*****************************************************************************/
4417 * Transmit interrupt handler. This has gotta be fast! Handling TX
4418 * chars is pretty simple, stuff as many as possible from the TX buffer
4419 * into the sc26198 FIFO.
4420 * In practice it is possible that interrupts are enabled but that the
4421 * port has been hung up. Need to handle not having any TX buffer here,
4422 * this is done by using the side effect that head and tail will also
4423 * be NULL if the buffer has been freed.
4426 static void stl_sc26198txisr(struct stlport *portp)
4428 struct tty_struct *tty;
4429 unsigned int ioaddr;
4430 unsigned char mr0;
4431 int len, stlen;
4432 char *head, *tail;
4434 pr_debug("stl_sc26198txisr(portp=%p)\n", portp);
4436 ioaddr = portp->ioaddr;
4437 head = portp->tx.head;
4438 tail = portp->tx.tail;
4439 len = (head >= tail) ? (head - tail) : (STL_TXBUFSIZE - (tail - head));
4440 if ((len == 0) || ((len < STL_TXBUFLOW) &&
4441 (test_bit(ASYI_TXLOW, &portp->istate) == 0))) {
4442 set_bit(ASYI_TXLOW, &portp->istate);
4443 tty = tty_port_tty_get(&portp->port);
4444 if (tty) {
4445 tty_wakeup(tty);
4446 tty_kref_put(tty);
4450 if (len == 0) {
4451 outb((MR0 | portp->uartaddr), (ioaddr + XP_ADDR));
4452 mr0 = inb(ioaddr + XP_DATA);
4453 if ((mr0 & MR0_TXMASK) == MR0_TXEMPTY) {
4454 portp->imr &= ~IR_TXRDY;
4455 outb((IMR | portp->uartaddr), (ioaddr + XP_ADDR));
4456 outb(portp->imr, (ioaddr + XP_DATA));
4457 clear_bit(ASYI_TXBUSY, &portp->istate);
4458 } else {
4459 mr0 |= ((mr0 & ~MR0_TXMASK) | MR0_TXEMPTY);
4460 outb(mr0, (ioaddr + XP_DATA));
4462 } else {
4463 len = min(len, SC26198_TXFIFOSIZE);
4464 portp->stats.txtotal += len;
4465 stlen = min_t(unsigned int, len,
4466 (portp->tx.buf + STL_TXBUFSIZE) - tail);
4467 outb(GTXFIFO, (ioaddr + XP_ADDR));
4468 outsb((ioaddr + XP_DATA), tail, stlen);
4469 len -= stlen;
4470 tail += stlen;
4471 if (tail >= (portp->tx.buf + STL_TXBUFSIZE))
4472 tail = portp->tx.buf;
4473 if (len > 0) {
4474 outsb((ioaddr + XP_DATA), tail, len);
4475 tail += len;
4477 portp->tx.tail = tail;
4481 /*****************************************************************************/
4484 * Receive character interrupt handler. Determine if we have good chars
4485 * or bad chars and then process appropriately. Good chars are easy
4486 * just shove the lot into the RX buffer and set all status byte to 0.
4487 * If a bad RX char then process as required. This routine needs to be
4488 * fast! In practice it is possible that we get an interrupt on a port
4489 * that is closed. This can happen on hangups - since they completely
4490 * shutdown a port not in user context. Need to handle this case.
4493 static void stl_sc26198rxisr(struct stlport *portp, unsigned int iack)
4495 struct tty_struct *tty;
4496 unsigned int len, buflen, ioaddr;
4498 pr_debug("stl_sc26198rxisr(portp=%p,iack=%x)\n", portp, iack);
4500 tty = tty_port_tty_get(&portp->port);
4501 ioaddr = portp->ioaddr;
4502 outb(GIBCR, (ioaddr + XP_ADDR));
4503 len = inb(ioaddr + XP_DATA) + 1;
4505 if ((iack & IVR_TYPEMASK) == IVR_RXDATA) {
4506 if (tty == NULL || (buflen = tty_buffer_request_room(tty, len)) == 0) {
4507 len = min_t(unsigned int, len, sizeof(stl_unwanted));
4508 outb(GRXFIFO, (ioaddr + XP_ADDR));
4509 insb((ioaddr + XP_DATA), &stl_unwanted[0], len);
4510 portp->stats.rxlost += len;
4511 portp->stats.rxtotal += len;
4512 } else {
4513 len = min(len, buflen);
4514 if (len > 0) {
4515 unsigned char *ptr;
4516 outb(GRXFIFO, (ioaddr + XP_ADDR));
4517 tty_prepare_flip_string(tty, &ptr, len);
4518 insb((ioaddr + XP_DATA), ptr, len);
4519 tty_schedule_flip(tty);
4520 portp->stats.rxtotal += len;
4523 } else {
4524 stl_sc26198rxbadchars(portp);
4528 * If we are TX flow controlled and in IXANY mode then we may need
4529 * to unflow control here. We gotta do this because of the automatic
4530 * flow control modes of the sc26198.
4532 if (test_bit(ASYI_TXFLOWED, &portp->istate)) {
4533 if ((tty != NULL) &&
4534 (tty->termios != NULL) &&
4535 (tty->termios->c_iflag & IXANY)) {
4536 stl_sc26198txunflow(portp, tty);
4539 tty_kref_put(tty);
4542 /*****************************************************************************/
4545 * Process an RX bad character.
4548 static void stl_sc26198rxbadch(struct stlport *portp, unsigned char status, char ch)
4550 struct tty_struct *tty;
4551 unsigned int ioaddr;
4553 tty = tty_port_tty_get(&portp->port);
4554 ioaddr = portp->ioaddr;
4556 if (status & SR_RXPARITY)
4557 portp->stats.rxparity++;
4558 if (status & SR_RXFRAMING)
4559 portp->stats.rxframing++;
4560 if (status & SR_RXOVERRUN)
4561 portp->stats.rxoverrun++;
4562 if (status & SR_RXBREAK)
4563 portp->stats.rxbreaks++;
4565 if ((tty != NULL) &&
4566 ((portp->rxignoremsk & status) == 0)) {
4567 if (portp->rxmarkmsk & status) {
4568 if (status & SR_RXBREAK) {
4569 status = TTY_BREAK;
4570 if (portp->port.flags & ASYNC_SAK) {
4571 do_SAK(tty);
4572 BRDENABLE(portp->brdnr, portp->pagenr);
4574 } else if (status & SR_RXPARITY)
4575 status = TTY_PARITY;
4576 else if (status & SR_RXFRAMING)
4577 status = TTY_FRAME;
4578 else if(status & SR_RXOVERRUN)
4579 status = TTY_OVERRUN;
4580 else
4581 status = 0;
4582 } else
4583 status = 0;
4585 tty_insert_flip_char(tty, ch, status);
4586 tty_schedule_flip(tty);
4588 if (status == 0)
4589 portp->stats.rxtotal++;
4591 tty_kref_put(tty);
4594 /*****************************************************************************/
4597 * Process all characters in the RX FIFO of the UART. Check all char
4598 * status bytes as well, and process as required. We need to check
4599 * all bytes in the FIFO, in case some more enter the FIFO while we
4600 * are here. To get the exact character error type we need to switch
4601 * into CHAR error mode (that is why we need to make sure we empty
4602 * the FIFO).
4605 static void stl_sc26198rxbadchars(struct stlport *portp)
4607 unsigned char status, mr1;
4608 char ch;
4611 * To get the precise error type for each character we must switch
4612 * back into CHAR error mode.
4614 mr1 = stl_sc26198getreg(portp, MR1);
4615 stl_sc26198setreg(portp, MR1, (mr1 & ~MR1_ERRBLOCK));
4617 while ((status = stl_sc26198getreg(portp, SR)) & SR_RXRDY) {
4618 stl_sc26198setreg(portp, SCCR, CR_CLEARRXERR);
4619 ch = stl_sc26198getreg(portp, RXFIFO);
4620 stl_sc26198rxbadch(portp, status, ch);
4624 * To get correct interrupt class we must switch back into BLOCK
4625 * error mode.
4627 stl_sc26198setreg(portp, MR1, mr1);
4630 /*****************************************************************************/
4633 * Other interrupt handler. This includes modem signals, flow
4634 * control actions, etc. Most stuff is left to off-level interrupt
4635 * processing time.
4638 static void stl_sc26198otherisr(struct stlport *portp, unsigned int iack)
4640 unsigned char cir, ipr, xisr;
4642 pr_debug("stl_sc26198otherisr(portp=%p,iack=%x)\n", portp, iack);
4644 cir = stl_sc26198getglobreg(portp, CIR);
4646 switch (cir & CIR_SUBTYPEMASK) {
4647 case CIR_SUBCOS:
4648 ipr = stl_sc26198getreg(portp, IPR);
4649 if (ipr & IPR_DCDCHANGE) {
4650 stl_cd_change(portp);
4651 portp->stats.modem++;
4653 break;
4654 case CIR_SUBXONXOFF:
4655 xisr = stl_sc26198getreg(portp, XISR);
4656 if (xisr & XISR_RXXONGOT) {
4657 set_bit(ASYI_TXFLOWED, &portp->istate);
4658 portp->stats.txxoff++;
4660 if (xisr & XISR_RXXOFFGOT) {
4661 clear_bit(ASYI_TXFLOWED, &portp->istate);
4662 portp->stats.txxon++;
4664 break;
4665 case CIR_SUBBREAK:
4666 stl_sc26198setreg(portp, SCCR, CR_BREAKRESET);
4667 stl_sc26198rxbadchars(portp);
4668 break;
4669 default:
4670 break;
4674 static void stl_free_isabrds(void)
4676 struct stlbrd *brdp;
4677 unsigned int i;
4679 for (i = 0; i < stl_nrbrds; i++) {
4680 if ((brdp = stl_brds[i]) == NULL || (brdp->state & STL_PROBED))
4681 continue;
4683 free_irq(brdp->irq, brdp);
4685 stl_cleanup_panels(brdp);
4687 release_region(brdp->ioaddr1, brdp->iosize1);
4688 if (brdp->iosize2 > 0)
4689 release_region(brdp->ioaddr2, brdp->iosize2);
4691 kfree(brdp);
4692 stl_brds[i] = NULL;
4697 * Loadable module initialization stuff.
4699 static int __init stallion_module_init(void)
4701 struct stlbrd *brdp;
4702 struct stlconf conf;
4703 unsigned int i, j;
4704 int retval;
4706 printk(KERN_INFO "%s: version %s\n", stl_drvtitle, stl_drvversion);
4708 spin_lock_init(&stallion_lock);
4709 spin_lock_init(&brd_lock);
4711 stl_serial = alloc_tty_driver(STL_MAXBRDS * STL_MAXPORTS);
4712 if (!stl_serial) {
4713 retval = -ENOMEM;
4714 goto err;
4717 stl_serial->owner = THIS_MODULE;
4718 stl_serial->driver_name = stl_drvname;
4719 stl_serial->name = "ttyE";
4720 stl_serial->major = STL_SERIALMAJOR;
4721 stl_serial->minor_start = 0;
4722 stl_serial->type = TTY_DRIVER_TYPE_SERIAL;
4723 stl_serial->subtype = SERIAL_TYPE_NORMAL;
4724 stl_serial->init_termios = stl_deftermios;
4725 stl_serial->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_DYNAMIC_DEV;
4726 tty_set_operations(stl_serial, &stl_ops);
4728 retval = tty_register_driver(stl_serial);
4729 if (retval) {
4730 printk("STALLION: failed to register serial driver\n");
4731 goto err_frtty;
4735 * Find any dynamically supported boards. That is via module load
4736 * line options.
4738 for (i = stl_nrbrds; i < stl_nargs; i++) {
4739 memset(&conf, 0, sizeof(conf));
4740 if (stl_parsebrd(&conf, stl_brdsp[i]) == 0)
4741 continue;
4742 if ((brdp = stl_allocbrd()) == NULL)
4743 continue;
4744 brdp->brdnr = i;
4745 brdp->brdtype = conf.brdtype;
4746 brdp->ioaddr1 = conf.ioaddr1;
4747 brdp->ioaddr2 = conf.ioaddr2;
4748 brdp->irq = conf.irq;
4749 brdp->irqtype = conf.irqtype;
4750 stl_brds[brdp->brdnr] = brdp;
4751 if (stl_brdinit(brdp)) {
4752 stl_brds[brdp->brdnr] = NULL;
4753 kfree(brdp);
4754 } else {
4755 for (j = 0; j < brdp->nrports; j++)
4756 tty_register_device(stl_serial,
4757 brdp->brdnr * STL_MAXPORTS + j, NULL);
4758 stl_nrbrds = i + 1;
4762 /* this has to be _after_ isa finding because of locking */
4763 retval = pci_register_driver(&stl_pcidriver);
4764 if (retval && stl_nrbrds == 0) {
4765 printk(KERN_ERR "STALLION: can't register pci driver\n");
4766 goto err_unrtty;
4770 * Set up a character driver for per board stuff. This is mainly used
4771 * to do stats ioctls on the ports.
4773 if (register_chrdev(STL_SIOMEMMAJOR, "staliomem", &stl_fsiomem))
4774 printk("STALLION: failed to register serial board device\n");
4776 stallion_class = class_create(THIS_MODULE, "staliomem");
4777 if (IS_ERR(stallion_class))
4778 printk("STALLION: failed to create class\n");
4779 for (i = 0; i < 4; i++)
4780 device_create_drvdata(stallion_class, NULL, MKDEV(STL_SIOMEMMAJOR, i),
4781 NULL, "staliomem%d", i);
4783 return 0;
4784 err_unrtty:
4785 tty_unregister_driver(stl_serial);
4786 err_frtty:
4787 put_tty_driver(stl_serial);
4788 err:
4789 return retval;
4792 static void __exit stallion_module_exit(void)
4794 struct stlbrd *brdp;
4795 unsigned int i, j;
4797 pr_debug("cleanup_module()\n");
4799 printk(KERN_INFO "Unloading %s: version %s\n", stl_drvtitle,
4800 stl_drvversion);
4803 * Free up all allocated resources used by the ports. This includes
4804 * memory and interrupts. As part of this process we will also do
4805 * a hangup on every open port - to try to flush out any processes
4806 * hanging onto ports.
4808 for (i = 0; i < stl_nrbrds; i++) {
4809 if ((brdp = stl_brds[i]) == NULL || (brdp->state & STL_PROBED))
4810 continue;
4811 for (j = 0; j < brdp->nrports; j++)
4812 tty_unregister_device(stl_serial,
4813 brdp->brdnr * STL_MAXPORTS + j);
4816 for (i = 0; i < 4; i++)
4817 device_destroy(stallion_class, MKDEV(STL_SIOMEMMAJOR, i));
4818 unregister_chrdev(STL_SIOMEMMAJOR, "staliomem");
4819 class_destroy(stallion_class);
4821 pci_unregister_driver(&stl_pcidriver);
4823 stl_free_isabrds();
4825 tty_unregister_driver(stl_serial);
4826 put_tty_driver(stl_serial);
4829 module_init(stallion_module_init);
4830 module_exit(stallion_module_exit);
4832 MODULE_AUTHOR("Greg Ungerer");
4833 MODULE_DESCRIPTION("Stallion Multiport Serial Driver");
4834 MODULE_LICENSE("GPL");