net: core: use kernel's converter from hex to bin
[linux-2.6/linux-acpi-2.6/ibm-acpi-2.6.git] / drivers / char / stallion.c
blobf2167f8e5aab631acbf56cd91338bdd60644942e
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/sched.h>
31 #include <linux/slab.h>
32 #include <linux/interrupt.h>
33 #include <linux/tty.h>
34 #include <linux/tty_flip.h>
35 #include <linux/serial.h>
36 #include <linux/seq_file.h>
37 #include <linux/cd1400.h>
38 #include <linux/sc26198.h>
39 #include <linux/comstats.h>
40 #include <linux/stallion.h>
41 #include <linux/ioport.h>
42 #include <linux/init.h>
43 #include <linux/smp_lock.h>
44 #include <linux/device.h>
45 #include <linux/delay.h>
46 #include <linux/ctype.h>
48 #include <asm/io.h>
49 #include <asm/uaccess.h>
51 #include <linux/pci.h>
53 /*****************************************************************************/
56 * Define different board types. Use the standard Stallion "assigned"
57 * board numbers. Boards supported in this driver are abbreviated as
58 * EIO = EasyIO and ECH = EasyConnection 8/32.
60 #define BRD_EASYIO 20
61 #define BRD_ECH 21
62 #define BRD_ECHMC 22
63 #define BRD_ECHPCI 26
64 #define BRD_ECH64PCI 27
65 #define BRD_EASYIOPCI 28
67 struct stlconf {
68 unsigned int brdtype;
69 int ioaddr1;
70 int ioaddr2;
71 unsigned long memaddr;
72 int irq;
73 int irqtype;
76 static unsigned int stl_nrbrds;
78 /*****************************************************************************/
81 * Define some important driver characteristics. Device major numbers
82 * allocated as per Linux Device Registry.
84 #ifndef STL_SIOMEMMAJOR
85 #define STL_SIOMEMMAJOR 28
86 #endif
87 #ifndef STL_SERIALMAJOR
88 #define STL_SERIALMAJOR 24
89 #endif
90 #ifndef STL_CALLOUTMAJOR
91 #define STL_CALLOUTMAJOR 25
92 #endif
95 * Set the TX buffer size. Bigger is better, but we don't want
96 * to chew too much memory with buffers!
98 #define STL_TXBUFLOW 512
99 #define STL_TXBUFSIZE 4096
101 /*****************************************************************************/
104 * Define our local driver identity first. Set up stuff to deal with
105 * all the local structures required by a serial tty driver.
107 static char *stl_drvtitle = "Stallion Multiport Serial Driver";
108 static char *stl_drvname = "stallion";
109 static char *stl_drvversion = "5.6.0";
111 static struct tty_driver *stl_serial;
114 * Define a local default termios struct. All ports will be created
115 * with this termios initially. Basically all it defines is a raw port
116 * at 9600, 8 data bits, 1 stop bit.
118 static struct ktermios stl_deftermios = {
119 .c_cflag = (B9600 | CS8 | CREAD | HUPCL | CLOCAL),
120 .c_cc = INIT_C_CC,
121 .c_ispeed = 9600,
122 .c_ospeed = 9600,
126 * Define global place to put buffer overflow characters.
128 static char stl_unwanted[SC26198_RXFIFOSIZE];
130 /*****************************************************************************/
132 static DEFINE_MUTEX(stl_brdslock);
133 static struct stlbrd *stl_brds[STL_MAXBRDS];
135 static const struct tty_port_operations stl_port_ops;
138 * Per board state flags. Used with the state field of the board struct.
139 * Not really much here!
141 #define BRD_FOUND 0x1
142 #define STL_PROBED 0x2
146 * Define the port structure istate flags. These set of flags are
147 * modified at interrupt time - so setting and reseting them needs
148 * to be atomic. Use the bit clear/setting routines for this.
150 #define ASYI_TXBUSY 1
151 #define ASYI_TXLOW 2
152 #define ASYI_TXFLOWED 3
155 * Define an array of board names as printable strings. Handy for
156 * referencing boards when printing trace and stuff.
158 static char *stl_brdnames[] = {
159 NULL,
160 NULL,
161 NULL,
162 NULL,
163 NULL,
164 NULL,
165 NULL,
166 NULL,
167 NULL,
168 NULL,
169 NULL,
170 NULL,
171 NULL,
172 NULL,
173 NULL,
174 NULL,
175 NULL,
176 NULL,
177 NULL,
178 NULL,
179 "EasyIO",
180 "EC8/32-AT",
181 "EC8/32-MC",
182 NULL,
183 NULL,
184 NULL,
185 "EC8/32-PCI",
186 "EC8/64-PCI",
187 "EasyIO-PCI",
190 /*****************************************************************************/
193 * Define some string labels for arguments passed from the module
194 * load line. These allow for easy board definitions, and easy
195 * modification of the io, memory and irq resoucres.
197 static unsigned int stl_nargs;
198 static char *board0[4];
199 static char *board1[4];
200 static char *board2[4];
201 static char *board3[4];
203 static char **stl_brdsp[] = {
204 (char **) &board0,
205 (char **) &board1,
206 (char **) &board2,
207 (char **) &board3
211 * Define a set of common board names, and types. This is used to
212 * parse any module arguments.
215 static struct {
216 char *name;
217 int type;
218 } stl_brdstr[] = {
219 { "easyio", BRD_EASYIO },
220 { "eio", BRD_EASYIO },
221 { "20", BRD_EASYIO },
222 { "ec8/32", BRD_ECH },
223 { "ec8/32-at", BRD_ECH },
224 { "ec8/32-isa", BRD_ECH },
225 { "ech", BRD_ECH },
226 { "echat", BRD_ECH },
227 { "21", BRD_ECH },
228 { "ec8/32-mc", BRD_ECHMC },
229 { "ec8/32-mca", BRD_ECHMC },
230 { "echmc", BRD_ECHMC },
231 { "echmca", BRD_ECHMC },
232 { "22", BRD_ECHMC },
233 { "ec8/32-pc", BRD_ECHPCI },
234 { "ec8/32-pci", BRD_ECHPCI },
235 { "26", BRD_ECHPCI },
236 { "ec8/64-pc", BRD_ECH64PCI },
237 { "ec8/64-pci", BRD_ECH64PCI },
238 { "ech-pci", BRD_ECH64PCI },
239 { "echpci", BRD_ECH64PCI },
240 { "echpc", BRD_ECH64PCI },
241 { "27", BRD_ECH64PCI },
242 { "easyio-pc", BRD_EASYIOPCI },
243 { "easyio-pci", BRD_EASYIOPCI },
244 { "eio-pci", BRD_EASYIOPCI },
245 { "eiopci", BRD_EASYIOPCI },
246 { "28", BRD_EASYIOPCI },
250 * Define the module agruments.
253 module_param_array(board0, charp, &stl_nargs, 0);
254 MODULE_PARM_DESC(board0, "Board 0 config -> name[,ioaddr[,ioaddr2][,irq]]");
255 module_param_array(board1, charp, &stl_nargs, 0);
256 MODULE_PARM_DESC(board1, "Board 1 config -> name[,ioaddr[,ioaddr2][,irq]]");
257 module_param_array(board2, charp, &stl_nargs, 0);
258 MODULE_PARM_DESC(board2, "Board 2 config -> name[,ioaddr[,ioaddr2][,irq]]");
259 module_param_array(board3, charp, &stl_nargs, 0);
260 MODULE_PARM_DESC(board3, "Board 3 config -> name[,ioaddr[,ioaddr2][,irq]]");
262 /*****************************************************************************/
265 * Hardware ID bits for the EasyIO and ECH boards. These defines apply
266 * to the directly accessible io ports of these boards (not the uarts -
267 * they are in cd1400.h and sc26198.h).
269 #define EIO_8PORTRS 0x04
270 #define EIO_4PORTRS 0x05
271 #define EIO_8PORTDI 0x00
272 #define EIO_8PORTM 0x06
273 #define EIO_MK3 0x03
274 #define EIO_IDBITMASK 0x07
276 #define EIO_BRDMASK 0xf0
277 #define ID_BRD4 0x10
278 #define ID_BRD8 0x20
279 #define ID_BRD16 0x30
281 #define EIO_INTRPEND 0x08
282 #define EIO_INTEDGE 0x00
283 #define EIO_INTLEVEL 0x08
284 #define EIO_0WS 0x10
286 #define ECH_ID 0xa0
287 #define ECH_IDBITMASK 0xe0
288 #define ECH_BRDENABLE 0x08
289 #define ECH_BRDDISABLE 0x00
290 #define ECH_INTENABLE 0x01
291 #define ECH_INTDISABLE 0x00
292 #define ECH_INTLEVEL 0x02
293 #define ECH_INTEDGE 0x00
294 #define ECH_INTRPEND 0x01
295 #define ECH_BRDRESET 0x01
297 #define ECHMC_INTENABLE 0x01
298 #define ECHMC_BRDRESET 0x02
300 #define ECH_PNLSTATUS 2
301 #define ECH_PNL16PORT 0x20
302 #define ECH_PNLIDMASK 0x07
303 #define ECH_PNLXPID 0x40
304 #define ECH_PNLINTRPEND 0x80
306 #define ECH_ADDR2MASK 0x1e0
309 * Define the vector mapping bits for the programmable interrupt board
310 * hardware. These bits encode the interrupt for the board to use - it
311 * is software selectable (except the EIO-8M).
313 static unsigned char stl_vecmap[] = {
314 0xff, 0xff, 0xff, 0x04, 0x06, 0x05, 0xff, 0x07,
315 0xff, 0xff, 0x00, 0x02, 0x01, 0xff, 0xff, 0x03
319 * Lock ordering is that you may not take stallion_lock holding
320 * brd_lock.
323 static spinlock_t brd_lock; /* Guard the board mapping */
324 static spinlock_t stallion_lock; /* Guard the tty driver */
327 * Set up enable and disable macros for the ECH boards. They require
328 * the secondary io address space to be activated and deactivated.
329 * This way all ECH boards can share their secondary io region.
330 * If this is an ECH-PCI board then also need to set the page pointer
331 * to point to the correct page.
333 #define BRDENABLE(brdnr,pagenr) \
334 if (stl_brds[(brdnr)]->brdtype == BRD_ECH) \
335 outb((stl_brds[(brdnr)]->ioctrlval | ECH_BRDENABLE), \
336 stl_brds[(brdnr)]->ioctrl); \
337 else if (stl_brds[(brdnr)]->brdtype == BRD_ECHPCI) \
338 outb((pagenr), stl_brds[(brdnr)]->ioctrl);
340 #define BRDDISABLE(brdnr) \
341 if (stl_brds[(brdnr)]->brdtype == BRD_ECH) \
342 outb((stl_brds[(brdnr)]->ioctrlval | ECH_BRDDISABLE), \
343 stl_brds[(brdnr)]->ioctrl);
345 #define STL_CD1400MAXBAUD 230400
346 #define STL_SC26198MAXBAUD 460800
348 #define STL_BAUDBASE 115200
349 #define STL_CLOSEDELAY (5 * HZ / 10)
351 /*****************************************************************************/
354 * Define the Stallion PCI vendor and device IDs.
356 #ifndef PCI_VENDOR_ID_STALLION
357 #define PCI_VENDOR_ID_STALLION 0x124d
358 #endif
359 #ifndef PCI_DEVICE_ID_ECHPCI832
360 #define PCI_DEVICE_ID_ECHPCI832 0x0000
361 #endif
362 #ifndef PCI_DEVICE_ID_ECHPCI864
363 #define PCI_DEVICE_ID_ECHPCI864 0x0002
364 #endif
365 #ifndef PCI_DEVICE_ID_EIOPCI
366 #define PCI_DEVICE_ID_EIOPCI 0x0003
367 #endif
370 * Define structure to hold all Stallion PCI boards.
373 static struct pci_device_id stl_pcibrds[] = {
374 { PCI_DEVICE(PCI_VENDOR_ID_STALLION, PCI_DEVICE_ID_ECHPCI864),
375 .driver_data = BRD_ECH64PCI },
376 { PCI_DEVICE(PCI_VENDOR_ID_STALLION, PCI_DEVICE_ID_EIOPCI),
377 .driver_data = BRD_EASYIOPCI },
378 { PCI_DEVICE(PCI_VENDOR_ID_STALLION, PCI_DEVICE_ID_ECHPCI832),
379 .driver_data = BRD_ECHPCI },
380 { PCI_DEVICE(PCI_VENDOR_ID_NS, PCI_DEVICE_ID_NS_87410),
381 .driver_data = BRD_ECHPCI },
384 MODULE_DEVICE_TABLE(pci, stl_pcibrds);
386 /*****************************************************************************/
389 * Define macros to extract a brd/port number from a minor number.
391 #define MINOR2BRD(min) (((min) & 0xc0) >> 6)
392 #define MINOR2PORT(min) ((min) & 0x3f)
395 * Define a baud rate table that converts termios baud rate selector
396 * into the actual baud rate value. All baud rate calculations are
397 * based on the actual baud rate required.
399 static unsigned int stl_baudrates[] = {
400 0, 50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800,
401 9600, 19200, 38400, 57600, 115200, 230400, 460800, 921600
404 /*****************************************************************************/
407 * Declare all those functions in this driver!
410 static long stl_memioctl(struct file *fp, unsigned int cmd, unsigned long arg);
411 static int stl_brdinit(struct stlbrd *brdp);
412 static int stl_getportstats(struct tty_struct *tty, struct stlport *portp, comstats_t __user *cp);
413 static int stl_clrportstats(struct stlport *portp, comstats_t __user *cp);
416 * CD1400 uart specific handling functions.
418 static void stl_cd1400setreg(struct stlport *portp, int regnr, int value);
419 static int stl_cd1400getreg(struct stlport *portp, int regnr);
420 static int stl_cd1400updatereg(struct stlport *portp, int regnr, int value);
421 static int stl_cd1400panelinit(struct stlbrd *brdp, struct stlpanel *panelp);
422 static void stl_cd1400portinit(struct stlbrd *brdp, struct stlpanel *panelp, struct stlport *portp);
423 static void stl_cd1400setport(struct stlport *portp, struct ktermios *tiosp);
424 static int stl_cd1400getsignals(struct stlport *portp);
425 static void stl_cd1400setsignals(struct stlport *portp, int dtr, int rts);
426 static void stl_cd1400ccrwait(struct stlport *portp);
427 static void stl_cd1400enablerxtx(struct stlport *portp, int rx, int tx);
428 static void stl_cd1400startrxtx(struct stlport *portp, int rx, int tx);
429 static void stl_cd1400disableintrs(struct stlport *portp);
430 static void stl_cd1400sendbreak(struct stlport *portp, int len);
431 static void stl_cd1400flowctrl(struct stlport *portp, int state);
432 static void stl_cd1400sendflow(struct stlport *portp, int state);
433 static void stl_cd1400flush(struct stlport *portp);
434 static int stl_cd1400datastate(struct stlport *portp);
435 static void stl_cd1400eiointr(struct stlpanel *panelp, unsigned int iobase);
436 static void stl_cd1400echintr(struct stlpanel *panelp, unsigned int iobase);
437 static void stl_cd1400txisr(struct stlpanel *panelp, int ioaddr);
438 static void stl_cd1400rxisr(struct stlpanel *panelp, int ioaddr);
439 static void stl_cd1400mdmisr(struct stlpanel *panelp, int ioaddr);
441 static inline int stl_cd1400breakisr(struct stlport *portp, int ioaddr);
444 * SC26198 uart specific handling functions.
446 static void stl_sc26198setreg(struct stlport *portp, int regnr, int value);
447 static int stl_sc26198getreg(struct stlport *portp, int regnr);
448 static int stl_sc26198updatereg(struct stlport *portp, int regnr, int value);
449 static int stl_sc26198getglobreg(struct stlport *portp, int regnr);
450 static int stl_sc26198panelinit(struct stlbrd *brdp, struct stlpanel *panelp);
451 static void stl_sc26198portinit(struct stlbrd *brdp, struct stlpanel *panelp, struct stlport *portp);
452 static void stl_sc26198setport(struct stlport *portp, struct ktermios *tiosp);
453 static int stl_sc26198getsignals(struct stlport *portp);
454 static void stl_sc26198setsignals(struct stlport *portp, int dtr, int rts);
455 static void stl_sc26198enablerxtx(struct stlport *portp, int rx, int tx);
456 static void stl_sc26198startrxtx(struct stlport *portp, int rx, int tx);
457 static void stl_sc26198disableintrs(struct stlport *portp);
458 static void stl_sc26198sendbreak(struct stlport *portp, int len);
459 static void stl_sc26198flowctrl(struct stlport *portp, int state);
460 static void stl_sc26198sendflow(struct stlport *portp, int state);
461 static void stl_sc26198flush(struct stlport *portp);
462 static int stl_sc26198datastate(struct stlport *portp);
463 static void stl_sc26198wait(struct stlport *portp);
464 static void stl_sc26198txunflow(struct stlport *portp, struct tty_struct *tty);
465 static void stl_sc26198intr(struct stlpanel *panelp, unsigned int iobase);
466 static void stl_sc26198txisr(struct stlport *port);
467 static void stl_sc26198rxisr(struct stlport *port, unsigned int iack);
468 static void stl_sc26198rxbadch(struct stlport *portp, unsigned char status, char ch);
469 static void stl_sc26198rxbadchars(struct stlport *portp);
470 static void stl_sc26198otherisr(struct stlport *port, unsigned int iack);
472 /*****************************************************************************/
475 * Generic UART support structure.
477 typedef struct uart {
478 int (*panelinit)(struct stlbrd *brdp, struct stlpanel *panelp);
479 void (*portinit)(struct stlbrd *brdp, struct stlpanel *panelp, struct stlport *portp);
480 void (*setport)(struct stlport *portp, struct ktermios *tiosp);
481 int (*getsignals)(struct stlport *portp);
482 void (*setsignals)(struct stlport *portp, int dtr, int rts);
483 void (*enablerxtx)(struct stlport *portp, int rx, int tx);
484 void (*startrxtx)(struct stlport *portp, int rx, int tx);
485 void (*disableintrs)(struct stlport *portp);
486 void (*sendbreak)(struct stlport *portp, int len);
487 void (*flowctrl)(struct stlport *portp, int state);
488 void (*sendflow)(struct stlport *portp, int state);
489 void (*flush)(struct stlport *portp);
490 int (*datastate)(struct stlport *portp);
491 void (*intr)(struct stlpanel *panelp, unsigned int iobase);
492 } uart_t;
495 * Define some macros to make calling these functions nice and clean.
497 #define stl_panelinit (* ((uart_t *) panelp->uartp)->panelinit)
498 #define stl_portinit (* ((uart_t *) portp->uartp)->portinit)
499 #define stl_setport (* ((uart_t *) portp->uartp)->setport)
500 #define stl_getsignals (* ((uart_t *) portp->uartp)->getsignals)
501 #define stl_setsignals (* ((uart_t *) portp->uartp)->setsignals)
502 #define stl_enablerxtx (* ((uart_t *) portp->uartp)->enablerxtx)
503 #define stl_startrxtx (* ((uart_t *) portp->uartp)->startrxtx)
504 #define stl_disableintrs (* ((uart_t *) portp->uartp)->disableintrs)
505 #define stl_sendbreak (* ((uart_t *) portp->uartp)->sendbreak)
506 #define stl_flowctrl (* ((uart_t *) portp->uartp)->flowctrl)
507 #define stl_sendflow (* ((uart_t *) portp->uartp)->sendflow)
508 #define stl_flush (* ((uart_t *) portp->uartp)->flush)
509 #define stl_datastate (* ((uart_t *) portp->uartp)->datastate)
511 /*****************************************************************************/
514 * CD1400 UART specific data initialization.
516 static uart_t stl_cd1400uart = {
517 stl_cd1400panelinit,
518 stl_cd1400portinit,
519 stl_cd1400setport,
520 stl_cd1400getsignals,
521 stl_cd1400setsignals,
522 stl_cd1400enablerxtx,
523 stl_cd1400startrxtx,
524 stl_cd1400disableintrs,
525 stl_cd1400sendbreak,
526 stl_cd1400flowctrl,
527 stl_cd1400sendflow,
528 stl_cd1400flush,
529 stl_cd1400datastate,
530 stl_cd1400eiointr
534 * Define the offsets within the register bank of a cd1400 based panel.
535 * These io address offsets are common to the EasyIO board as well.
537 #define EREG_ADDR 0
538 #define EREG_DATA 4
539 #define EREG_RXACK 5
540 #define EREG_TXACK 6
541 #define EREG_MDACK 7
543 #define EREG_BANKSIZE 8
545 #define CD1400_CLK 25000000
546 #define CD1400_CLK8M 20000000
549 * Define the cd1400 baud rate clocks. These are used when calculating
550 * what clock and divisor to use for the required baud rate. Also
551 * define the maximum baud rate allowed, and the default base baud.
553 static int stl_cd1400clkdivs[] = {
554 CD1400_CLK0, CD1400_CLK1, CD1400_CLK2, CD1400_CLK3, CD1400_CLK4
557 /*****************************************************************************/
560 * SC26198 UART specific data initization.
562 static uart_t stl_sc26198uart = {
563 stl_sc26198panelinit,
564 stl_sc26198portinit,
565 stl_sc26198setport,
566 stl_sc26198getsignals,
567 stl_sc26198setsignals,
568 stl_sc26198enablerxtx,
569 stl_sc26198startrxtx,
570 stl_sc26198disableintrs,
571 stl_sc26198sendbreak,
572 stl_sc26198flowctrl,
573 stl_sc26198sendflow,
574 stl_sc26198flush,
575 stl_sc26198datastate,
576 stl_sc26198intr
580 * Define the offsets within the register bank of a sc26198 based panel.
582 #define XP_DATA 0
583 #define XP_ADDR 1
584 #define XP_MODID 2
585 #define XP_STATUS 2
586 #define XP_IACK 3
588 #define XP_BANKSIZE 4
591 * Define the sc26198 baud rate table. Offsets within the table
592 * represent the actual baud rate selector of sc26198 registers.
594 static unsigned int sc26198_baudtable[] = {
595 50, 75, 150, 200, 300, 450, 600, 900, 1200, 1800, 2400, 3600,
596 4800, 7200, 9600, 14400, 19200, 28800, 38400, 57600, 115200,
597 230400, 460800, 921600
600 #define SC26198_NRBAUDS ARRAY_SIZE(sc26198_baudtable)
602 /*****************************************************************************/
605 * Define the driver info for a user level control device. Used mainly
606 * to get at port stats - only not using the port device itself.
608 static const struct file_operations stl_fsiomem = {
609 .owner = THIS_MODULE,
610 .unlocked_ioctl = stl_memioctl,
613 static struct class *stallion_class;
615 static void stl_cd_change(struct stlport *portp)
617 unsigned int oldsigs = portp->sigs;
618 struct tty_struct *tty = tty_port_tty_get(&portp->port);
620 if (!tty)
621 return;
623 portp->sigs = stl_getsignals(portp);
625 if ((portp->sigs & TIOCM_CD) && ((oldsigs & TIOCM_CD) == 0))
626 wake_up_interruptible(&portp->port.open_wait);
628 if ((oldsigs & TIOCM_CD) && ((portp->sigs & TIOCM_CD) == 0))
629 if (portp->port.flags & ASYNC_CHECK_CD)
630 tty_hangup(tty);
631 tty_kref_put(tty);
635 * Check for any arguments passed in on the module load command line.
638 /*****************************************************************************/
641 * Parse the supplied argument string, into the board conf struct.
644 static int __init stl_parsebrd(struct stlconf *confp, char **argp)
646 char *sp;
647 unsigned int i;
649 pr_debug("stl_parsebrd(confp=%p,argp=%p)\n", confp, argp);
651 if ((argp[0] == NULL) || (*argp[0] == 0))
652 return 0;
654 for (sp = argp[0], i = 0; (*sp != 0) && (i < 25); sp++, i++)
655 *sp = tolower(*sp);
657 for (i = 0; i < ARRAY_SIZE(stl_brdstr); i++)
658 if (strcmp(stl_brdstr[i].name, argp[0]) == 0)
659 break;
661 if (i == ARRAY_SIZE(stl_brdstr)) {
662 printk("STALLION: unknown board name, %s?\n", argp[0]);
663 return 0;
666 confp->brdtype = stl_brdstr[i].type;
668 i = 1;
669 if ((argp[i] != NULL) && (*argp[i] != 0))
670 confp->ioaddr1 = simple_strtoul(argp[i], NULL, 0);
671 i++;
672 if (confp->brdtype == BRD_ECH) {
673 if ((argp[i] != NULL) && (*argp[i] != 0))
674 confp->ioaddr2 = simple_strtoul(argp[i], NULL, 0);
675 i++;
677 if ((argp[i] != NULL) && (*argp[i] != 0))
678 confp->irq = simple_strtoul(argp[i], NULL, 0);
679 return 1;
682 /*****************************************************************************/
685 * Allocate a new board structure. Fill out the basic info in it.
688 static struct stlbrd *stl_allocbrd(void)
690 struct stlbrd *brdp;
692 brdp = kzalloc(sizeof(struct stlbrd), GFP_KERNEL);
693 if (!brdp) {
694 printk("STALLION: failed to allocate memory (size=%Zd)\n",
695 sizeof(struct stlbrd));
696 return NULL;
699 brdp->magic = STL_BOARDMAGIC;
700 return brdp;
703 /*****************************************************************************/
705 static int stl_activate(struct tty_port *port, struct tty_struct *tty)
707 struct stlport *portp = container_of(port, struct stlport, port);
708 if (!portp->tx.buf) {
709 portp->tx.buf = kmalloc(STL_TXBUFSIZE, GFP_KERNEL);
710 if (!portp->tx.buf)
711 return -ENOMEM;
712 portp->tx.head = portp->tx.buf;
713 portp->tx.tail = portp->tx.buf;
715 stl_setport(portp, tty->termios);
716 portp->sigs = stl_getsignals(portp);
717 stl_setsignals(portp, 1, 1);
718 stl_enablerxtx(portp, 1, 1);
719 stl_startrxtx(portp, 1, 0);
720 return 0;
723 static int stl_open(struct tty_struct *tty, struct file *filp)
725 struct stlport *portp;
726 struct stlbrd *brdp;
727 unsigned int minordev, brdnr, panelnr;
728 int portnr;
730 pr_debug("stl_open(tty=%p,filp=%p): device=%s\n", tty, filp, tty->name);
732 minordev = tty->index;
733 brdnr = MINOR2BRD(minordev);
734 if (brdnr >= stl_nrbrds)
735 return -ENODEV;
736 brdp = stl_brds[brdnr];
737 if (brdp == NULL)
738 return -ENODEV;
740 minordev = MINOR2PORT(minordev);
741 for (portnr = -1, panelnr = 0; panelnr < STL_MAXPANELS; panelnr++) {
742 if (brdp->panels[panelnr] == NULL)
743 break;
744 if (minordev < brdp->panels[panelnr]->nrports) {
745 portnr = minordev;
746 break;
748 minordev -= brdp->panels[panelnr]->nrports;
750 if (portnr < 0)
751 return -ENODEV;
753 portp = brdp->panels[panelnr]->ports[portnr];
754 if (portp == NULL)
755 return -ENODEV;
757 tty->driver_data = portp;
758 return tty_port_open(&portp->port, tty, filp);
762 /*****************************************************************************/
764 static int stl_carrier_raised(struct tty_port *port)
766 struct stlport *portp = container_of(port, struct stlport, port);
767 return (portp->sigs & TIOCM_CD) ? 1 : 0;
770 static void stl_dtr_rts(struct tty_port *port, int on)
772 struct stlport *portp = container_of(port, struct stlport, port);
773 /* Takes brd_lock internally */
774 stl_setsignals(portp, on, on);
777 /*****************************************************************************/
779 static void stl_flushbuffer(struct tty_struct *tty)
781 struct stlport *portp;
783 pr_debug("stl_flushbuffer(tty=%p)\n", tty);
785 portp = tty->driver_data;
786 if (portp == NULL)
787 return;
789 stl_flush(portp);
790 tty_wakeup(tty);
793 /*****************************************************************************/
795 static void stl_waituntilsent(struct tty_struct *tty, int timeout)
797 struct stlport *portp;
798 unsigned long tend;
800 pr_debug("stl_waituntilsent(tty=%p,timeout=%d)\n", tty, timeout);
802 portp = tty->driver_data;
803 if (portp == NULL)
804 return;
806 if (timeout == 0)
807 timeout = HZ;
808 tend = jiffies + timeout;
810 while (stl_datastate(portp)) {
811 if (signal_pending(current))
812 break;
813 msleep_interruptible(20);
814 if (time_after_eq(jiffies, tend))
815 break;
819 /*****************************************************************************/
821 static void stl_shutdown(struct tty_port *port)
823 struct stlport *portp = container_of(port, struct stlport, port);
824 stl_disableintrs(portp);
825 stl_enablerxtx(portp, 0, 0);
826 stl_flush(portp);
827 portp->istate = 0;
828 if (portp->tx.buf != NULL) {
829 kfree(portp->tx.buf);
830 portp->tx.buf = NULL;
831 portp->tx.head = NULL;
832 portp->tx.tail = NULL;
836 static void stl_close(struct tty_struct *tty, struct file *filp)
838 struct stlport*portp;
839 pr_debug("stl_close(tty=%p,filp=%p)\n", tty, filp);
841 portp = tty->driver_data;
842 if(portp == NULL)
843 return;
844 tty_port_close(&portp->port, tty, filp);
847 /*****************************************************************************/
850 * Write routine. Take data and stuff it in to the TX ring queue.
851 * If transmit interrupts are not running then start them.
854 static int stl_write(struct tty_struct *tty, const unsigned char *buf, int count)
856 struct stlport *portp;
857 unsigned int len, stlen;
858 unsigned char *chbuf;
859 char *head, *tail;
861 pr_debug("stl_write(tty=%p,buf=%p,count=%d)\n", tty, buf, count);
863 portp = tty->driver_data;
864 if (portp == NULL)
865 return 0;
866 if (portp->tx.buf == NULL)
867 return 0;
870 * If copying direct from user space we must cater for page faults,
871 * causing us to "sleep" here for a while. To handle this copy in all
872 * the data we need now, into a local buffer. Then when we got it all
873 * copy it into the TX buffer.
875 chbuf = (unsigned char *) buf;
877 head = portp->tx.head;
878 tail = portp->tx.tail;
879 if (head >= tail) {
880 len = STL_TXBUFSIZE - (head - tail) - 1;
881 stlen = STL_TXBUFSIZE - (head - portp->tx.buf);
882 } else {
883 len = tail - head - 1;
884 stlen = len;
887 len = min(len, (unsigned int)count);
888 count = 0;
889 while (len > 0) {
890 stlen = min(len, stlen);
891 memcpy(head, chbuf, stlen);
892 len -= stlen;
893 chbuf += stlen;
894 count += stlen;
895 head += stlen;
896 if (head >= (portp->tx.buf + STL_TXBUFSIZE)) {
897 head = portp->tx.buf;
898 stlen = tail - head;
901 portp->tx.head = head;
903 clear_bit(ASYI_TXLOW, &portp->istate);
904 stl_startrxtx(portp, -1, 1);
906 return count;
909 /*****************************************************************************/
911 static int stl_putchar(struct tty_struct *tty, unsigned char ch)
913 struct stlport *portp;
914 unsigned int len;
915 char *head, *tail;
917 pr_debug("stl_putchar(tty=%p,ch=%x)\n", tty, ch);
919 portp = tty->driver_data;
920 if (portp == NULL)
921 return -EINVAL;
922 if (portp->tx.buf == NULL)
923 return -EINVAL;
925 head = portp->tx.head;
926 tail = portp->tx.tail;
928 len = (head >= tail) ? (STL_TXBUFSIZE - (head - tail)) : (tail - head);
929 len--;
931 if (len > 0) {
932 *head++ = ch;
933 if (head >= (portp->tx.buf + STL_TXBUFSIZE))
934 head = portp->tx.buf;
936 portp->tx.head = head;
937 return 0;
940 /*****************************************************************************/
943 * If there are any characters in the buffer then make sure that TX
944 * interrupts are on and get'em out. Normally used after the putchar
945 * routine has been called.
948 static void stl_flushchars(struct tty_struct *tty)
950 struct stlport *portp;
952 pr_debug("stl_flushchars(tty=%p)\n", tty);
954 portp = tty->driver_data;
955 if (portp == NULL)
956 return;
957 if (portp->tx.buf == NULL)
958 return;
960 stl_startrxtx(portp, -1, 1);
963 /*****************************************************************************/
965 static int stl_writeroom(struct tty_struct *tty)
967 struct stlport *portp;
968 char *head, *tail;
970 pr_debug("stl_writeroom(tty=%p)\n", tty);
972 portp = tty->driver_data;
973 if (portp == NULL)
974 return 0;
975 if (portp->tx.buf == NULL)
976 return 0;
978 head = portp->tx.head;
979 tail = portp->tx.tail;
980 return (head >= tail) ? (STL_TXBUFSIZE - (head - tail) - 1) : (tail - head - 1);
983 /*****************************************************************************/
986 * Return number of chars in the TX buffer. Normally we would just
987 * calculate the number of chars in the buffer and return that, but if
988 * the buffer is empty and TX interrupts are still on then we return
989 * that the buffer still has 1 char in it. This way whoever called us
990 * will not think that ALL chars have drained - since the UART still
991 * must have some chars in it (we are busy after all).
994 static int stl_charsinbuffer(struct tty_struct *tty)
996 struct stlport *portp;
997 unsigned int size;
998 char *head, *tail;
1000 pr_debug("stl_charsinbuffer(tty=%p)\n", tty);
1002 portp = tty->driver_data;
1003 if (portp == NULL)
1004 return 0;
1005 if (portp->tx.buf == NULL)
1006 return 0;
1008 head = portp->tx.head;
1009 tail = portp->tx.tail;
1010 size = (head >= tail) ? (head - tail) : (STL_TXBUFSIZE - (tail - head));
1011 if ((size == 0) && test_bit(ASYI_TXBUSY, &portp->istate))
1012 size = 1;
1013 return size;
1016 /*****************************************************************************/
1019 * Generate the serial struct info.
1022 static int stl_getserial(struct stlport *portp, struct serial_struct __user *sp)
1024 struct serial_struct sio;
1025 struct stlbrd *brdp;
1027 pr_debug("stl_getserial(portp=%p,sp=%p)\n", portp, sp);
1029 memset(&sio, 0, sizeof(struct serial_struct));
1031 mutex_lock(&portp->port.mutex);
1032 sio.line = portp->portnr;
1033 sio.port = portp->ioaddr;
1034 sio.flags = portp->port.flags;
1035 sio.baud_base = portp->baud_base;
1036 sio.close_delay = portp->close_delay;
1037 sio.closing_wait = portp->closing_wait;
1038 sio.custom_divisor = portp->custom_divisor;
1039 sio.hub6 = 0;
1040 if (portp->uartp == &stl_cd1400uart) {
1041 sio.type = PORT_CIRRUS;
1042 sio.xmit_fifo_size = CD1400_TXFIFOSIZE;
1043 } else {
1044 sio.type = PORT_UNKNOWN;
1045 sio.xmit_fifo_size = SC26198_TXFIFOSIZE;
1048 brdp = stl_brds[portp->brdnr];
1049 if (brdp != NULL)
1050 sio.irq = brdp->irq;
1051 mutex_unlock(&portp->port.mutex);
1053 return copy_to_user(sp, &sio, sizeof(struct serial_struct)) ? -EFAULT : 0;
1056 /*****************************************************************************/
1059 * Set port according to the serial struct info.
1060 * At this point we do not do any auto-configure stuff, so we will
1061 * just quietly ignore any requests to change irq, etc.
1064 static int stl_setserial(struct tty_struct *tty, struct serial_struct __user *sp)
1066 struct stlport * portp = tty->driver_data;
1067 struct serial_struct sio;
1069 pr_debug("stl_setserial(portp=%p,sp=%p)\n", portp, sp);
1071 if (copy_from_user(&sio, sp, sizeof(struct serial_struct)))
1072 return -EFAULT;
1073 mutex_lock(&portp->port.mutex);
1074 if (!capable(CAP_SYS_ADMIN)) {
1075 if ((sio.baud_base != portp->baud_base) ||
1076 (sio.close_delay != portp->close_delay) ||
1077 ((sio.flags & ~ASYNC_USR_MASK) !=
1078 (portp->port.flags & ~ASYNC_USR_MASK))) {
1079 mutex_unlock(&portp->port.mutex);
1080 return -EPERM;
1084 portp->port.flags = (portp->port.flags & ~ASYNC_USR_MASK) |
1085 (sio.flags & ASYNC_USR_MASK);
1086 portp->baud_base = sio.baud_base;
1087 portp->close_delay = sio.close_delay;
1088 portp->closing_wait = sio.closing_wait;
1089 portp->custom_divisor = sio.custom_divisor;
1090 mutex_unlock(&portp->port.mutex);
1091 stl_setport(portp, tty->termios);
1092 return 0;
1095 /*****************************************************************************/
1097 static int stl_tiocmget(struct tty_struct *tty, struct file *file)
1099 struct stlport *portp;
1101 portp = tty->driver_data;
1102 if (portp == NULL)
1103 return -ENODEV;
1104 if (tty->flags & (1 << TTY_IO_ERROR))
1105 return -EIO;
1107 return stl_getsignals(portp);
1110 static int stl_tiocmset(struct tty_struct *tty, struct file *file,
1111 unsigned int set, unsigned int clear)
1113 struct stlport *portp;
1114 int rts = -1, dtr = -1;
1116 portp = tty->driver_data;
1117 if (portp == NULL)
1118 return -ENODEV;
1119 if (tty->flags & (1 << TTY_IO_ERROR))
1120 return -EIO;
1122 if (set & TIOCM_RTS)
1123 rts = 1;
1124 if (set & TIOCM_DTR)
1125 dtr = 1;
1126 if (clear & TIOCM_RTS)
1127 rts = 0;
1128 if (clear & TIOCM_DTR)
1129 dtr = 0;
1131 stl_setsignals(portp, dtr, rts);
1132 return 0;
1135 static int stl_ioctl(struct tty_struct *tty, struct file *file, unsigned int cmd, unsigned long arg)
1137 struct stlport *portp;
1138 int rc;
1139 void __user *argp = (void __user *)arg;
1141 pr_debug("stl_ioctl(tty=%p,file=%p,cmd=%x,arg=%lx)\n", tty, file, cmd,
1142 arg);
1144 portp = tty->driver_data;
1145 if (portp == NULL)
1146 return -ENODEV;
1148 if ((cmd != TIOCGSERIAL) && (cmd != TIOCSSERIAL) &&
1149 (cmd != COM_GETPORTSTATS) && (cmd != COM_CLRPORTSTATS))
1150 if (tty->flags & (1 << TTY_IO_ERROR))
1151 return -EIO;
1153 rc = 0;
1155 switch (cmd) {
1156 case TIOCGSERIAL:
1157 rc = stl_getserial(portp, argp);
1158 break;
1159 case TIOCSSERIAL:
1160 rc = stl_setserial(tty, argp);
1161 break;
1162 case COM_GETPORTSTATS:
1163 rc = stl_getportstats(tty, portp, argp);
1164 break;
1165 case COM_CLRPORTSTATS:
1166 rc = stl_clrportstats(portp, argp);
1167 break;
1168 case TIOCSERCONFIG:
1169 case TIOCSERGWILD:
1170 case TIOCSERSWILD:
1171 case TIOCSERGETLSR:
1172 case TIOCSERGSTRUCT:
1173 case TIOCSERGETMULTI:
1174 case TIOCSERSETMULTI:
1175 default:
1176 rc = -ENOIOCTLCMD;
1177 break;
1179 return rc;
1182 /*****************************************************************************/
1185 * Start the transmitter again. Just turn TX interrupts back on.
1188 static void stl_start(struct tty_struct *tty)
1190 struct stlport *portp;
1192 pr_debug("stl_start(tty=%p)\n", tty);
1194 portp = tty->driver_data;
1195 if (portp == NULL)
1196 return;
1197 stl_startrxtx(portp, -1, 1);
1200 /*****************************************************************************/
1202 static void stl_settermios(struct tty_struct *tty, struct ktermios *old)
1204 struct stlport *portp;
1205 struct ktermios *tiosp;
1207 pr_debug("stl_settermios(tty=%p,old=%p)\n", tty, old);
1209 portp = tty->driver_data;
1210 if (portp == NULL)
1211 return;
1213 tiosp = tty->termios;
1214 if ((tiosp->c_cflag == old->c_cflag) &&
1215 (tiosp->c_iflag == old->c_iflag))
1216 return;
1218 stl_setport(portp, tiosp);
1219 stl_setsignals(portp, ((tiosp->c_cflag & (CBAUD & ~CBAUDEX)) ? 1 : 0),
1220 -1);
1221 if ((old->c_cflag & CRTSCTS) && ((tiosp->c_cflag & CRTSCTS) == 0)) {
1222 tty->hw_stopped = 0;
1223 stl_start(tty);
1225 if (((old->c_cflag & CLOCAL) == 0) && (tiosp->c_cflag & CLOCAL))
1226 wake_up_interruptible(&portp->port.open_wait);
1229 /*****************************************************************************/
1232 * Attempt to flow control who ever is sending us data. Based on termios
1233 * settings use software or/and hardware flow control.
1236 static void stl_throttle(struct tty_struct *tty)
1238 struct stlport *portp;
1240 pr_debug("stl_throttle(tty=%p)\n", tty);
1242 portp = tty->driver_data;
1243 if (portp == NULL)
1244 return;
1245 stl_flowctrl(portp, 0);
1248 /*****************************************************************************/
1251 * Unflow control the device sending us data...
1254 static void stl_unthrottle(struct tty_struct *tty)
1256 struct stlport *portp;
1258 pr_debug("stl_unthrottle(tty=%p)\n", tty);
1260 portp = tty->driver_data;
1261 if (portp == NULL)
1262 return;
1263 stl_flowctrl(portp, 1);
1266 /*****************************************************************************/
1269 * Stop the transmitter. Basically to do this we will just turn TX
1270 * interrupts off.
1273 static void stl_stop(struct tty_struct *tty)
1275 struct stlport *portp;
1277 pr_debug("stl_stop(tty=%p)\n", tty);
1279 portp = tty->driver_data;
1280 if (portp == NULL)
1281 return;
1282 stl_startrxtx(portp, -1, 0);
1285 /*****************************************************************************/
1288 * Hangup this port. This is pretty much like closing the port, only
1289 * a little more brutal. No waiting for data to drain. Shutdown the
1290 * port and maybe drop signals.
1293 static void stl_hangup(struct tty_struct *tty)
1295 struct stlport *portp = tty->driver_data;
1296 pr_debug("stl_hangup(tty=%p)\n", tty);
1298 if (portp == NULL)
1299 return;
1300 tty_port_hangup(&portp->port);
1303 /*****************************************************************************/
1305 static int stl_breakctl(struct tty_struct *tty, int state)
1307 struct stlport *portp;
1309 pr_debug("stl_breakctl(tty=%p,state=%d)\n", tty, state);
1311 portp = tty->driver_data;
1312 if (portp == NULL)
1313 return -EINVAL;
1315 stl_sendbreak(portp, ((state == -1) ? 1 : 2));
1316 return 0;
1319 /*****************************************************************************/
1321 static void stl_sendxchar(struct tty_struct *tty, char ch)
1323 struct stlport *portp;
1325 pr_debug("stl_sendxchar(tty=%p,ch=%x)\n", tty, ch);
1327 portp = tty->driver_data;
1328 if (portp == NULL)
1329 return;
1331 if (ch == STOP_CHAR(tty))
1332 stl_sendflow(portp, 0);
1333 else if (ch == START_CHAR(tty))
1334 stl_sendflow(portp, 1);
1335 else
1336 stl_putchar(tty, ch);
1339 static void stl_portinfo(struct seq_file *m, struct stlport *portp, int portnr)
1341 int sigs;
1342 char sep;
1344 seq_printf(m, "%d: uart:%s tx:%d rx:%d",
1345 portnr, (portp->hwid == 1) ? "SC26198" : "CD1400",
1346 (int) portp->stats.txtotal, (int) portp->stats.rxtotal);
1348 if (portp->stats.rxframing)
1349 seq_printf(m, " fe:%d", (int) portp->stats.rxframing);
1350 if (portp->stats.rxparity)
1351 seq_printf(m, " pe:%d", (int) portp->stats.rxparity);
1352 if (portp->stats.rxbreaks)
1353 seq_printf(m, " brk:%d", (int) portp->stats.rxbreaks);
1354 if (portp->stats.rxoverrun)
1355 seq_printf(m, " oe:%d", (int) portp->stats.rxoverrun);
1357 sigs = stl_getsignals(portp);
1358 sep = ' ';
1359 if (sigs & TIOCM_RTS) {
1360 seq_printf(m, "%c%s", sep, "RTS");
1361 sep = '|';
1363 if (sigs & TIOCM_CTS) {
1364 seq_printf(m, "%c%s", sep, "CTS");
1365 sep = '|';
1367 if (sigs & TIOCM_DTR) {
1368 seq_printf(m, "%c%s", sep, "DTR");
1369 sep = '|';
1371 if (sigs & TIOCM_CD) {
1372 seq_printf(m, "%c%s", sep, "DCD");
1373 sep = '|';
1375 if (sigs & TIOCM_DSR) {
1376 seq_printf(m, "%c%s", sep, "DSR");
1377 sep = '|';
1379 seq_putc(m, '\n');
1382 /*****************************************************************************/
1385 * Port info, read from the /proc file system.
1388 static int stl_proc_show(struct seq_file *m, void *v)
1390 struct stlbrd *brdp;
1391 struct stlpanel *panelp;
1392 struct stlport *portp;
1393 unsigned int brdnr, panelnr, portnr;
1394 int totalport;
1396 totalport = 0;
1398 seq_printf(m, "%s: version %s\n", stl_drvtitle, stl_drvversion);
1401 * We scan through for each board, panel and port. The offset is
1402 * calculated on the fly, and irrelevant ports are skipped.
1404 for (brdnr = 0; brdnr < stl_nrbrds; brdnr++) {
1405 brdp = stl_brds[brdnr];
1406 if (brdp == NULL)
1407 continue;
1408 if (brdp->state == 0)
1409 continue;
1411 totalport = brdnr * STL_MAXPORTS;
1412 for (panelnr = 0; panelnr < brdp->nrpanels; panelnr++) {
1413 panelp = brdp->panels[panelnr];
1414 if (panelp == NULL)
1415 continue;
1417 for (portnr = 0; portnr < panelp->nrports; portnr++,
1418 totalport++) {
1419 portp = panelp->ports[portnr];
1420 if (portp == NULL)
1421 continue;
1422 stl_portinfo(m, portp, totalport);
1426 return 0;
1429 static int stl_proc_open(struct inode *inode, struct file *file)
1431 return single_open(file, stl_proc_show, NULL);
1434 static const struct file_operations stl_proc_fops = {
1435 .owner = THIS_MODULE,
1436 .open = stl_proc_open,
1437 .read = seq_read,
1438 .llseek = seq_lseek,
1439 .release = single_release,
1442 /*****************************************************************************/
1445 * All board interrupts are vectored through here first. This code then
1446 * calls off to the approrpriate board interrupt handlers.
1449 static irqreturn_t stl_intr(int irq, void *dev_id)
1451 struct stlbrd *brdp = dev_id;
1453 pr_debug("stl_intr(brdp=%p,irq=%d)\n", brdp, brdp->irq);
1455 return IRQ_RETVAL((* brdp->isr)(brdp));
1458 /*****************************************************************************/
1461 * Interrupt service routine for EasyIO board types.
1464 static int stl_eiointr(struct stlbrd *brdp)
1466 struct stlpanel *panelp;
1467 unsigned int iobase;
1468 int handled = 0;
1470 spin_lock(&brd_lock);
1471 panelp = brdp->panels[0];
1472 iobase = panelp->iobase;
1473 while (inb(brdp->iostatus) & EIO_INTRPEND) {
1474 handled = 1;
1475 (* panelp->isr)(panelp, iobase);
1477 spin_unlock(&brd_lock);
1478 return handled;
1481 /*****************************************************************************/
1484 * Interrupt service routine for ECH-AT board types.
1487 static int stl_echatintr(struct stlbrd *brdp)
1489 struct stlpanel *panelp;
1490 unsigned int ioaddr, bnknr;
1491 int handled = 0;
1493 outb((brdp->ioctrlval | ECH_BRDENABLE), brdp->ioctrl);
1495 while (inb(brdp->iostatus) & ECH_INTRPEND) {
1496 handled = 1;
1497 for (bnknr = 0; bnknr < brdp->nrbnks; bnknr++) {
1498 ioaddr = brdp->bnkstataddr[bnknr];
1499 if (inb(ioaddr) & ECH_PNLINTRPEND) {
1500 panelp = brdp->bnk2panel[bnknr];
1501 (* panelp->isr)(panelp, (ioaddr & 0xfffc));
1506 outb((brdp->ioctrlval | ECH_BRDDISABLE), brdp->ioctrl);
1508 return handled;
1511 /*****************************************************************************/
1514 * Interrupt service routine for ECH-MCA board types.
1517 static int stl_echmcaintr(struct stlbrd *brdp)
1519 struct stlpanel *panelp;
1520 unsigned int ioaddr, bnknr;
1521 int handled = 0;
1523 while (inb(brdp->iostatus) & ECH_INTRPEND) {
1524 handled = 1;
1525 for (bnknr = 0; bnknr < brdp->nrbnks; bnknr++) {
1526 ioaddr = brdp->bnkstataddr[bnknr];
1527 if (inb(ioaddr) & ECH_PNLINTRPEND) {
1528 panelp = brdp->bnk2panel[bnknr];
1529 (* panelp->isr)(panelp, (ioaddr & 0xfffc));
1533 return handled;
1536 /*****************************************************************************/
1539 * Interrupt service routine for ECH-PCI board types.
1542 static int stl_echpciintr(struct stlbrd *brdp)
1544 struct stlpanel *panelp;
1545 unsigned int ioaddr, bnknr, recheck;
1546 int handled = 0;
1548 while (1) {
1549 recheck = 0;
1550 for (bnknr = 0; bnknr < brdp->nrbnks; bnknr++) {
1551 outb(brdp->bnkpageaddr[bnknr], brdp->ioctrl);
1552 ioaddr = brdp->bnkstataddr[bnknr];
1553 if (inb(ioaddr) & ECH_PNLINTRPEND) {
1554 panelp = brdp->bnk2panel[bnknr];
1555 (* panelp->isr)(panelp, (ioaddr & 0xfffc));
1556 recheck++;
1557 handled = 1;
1560 if (! recheck)
1561 break;
1563 return handled;
1566 /*****************************************************************************/
1569 * Interrupt service routine for ECH-8/64-PCI board types.
1572 static int stl_echpci64intr(struct stlbrd *brdp)
1574 struct stlpanel *panelp;
1575 unsigned int ioaddr, bnknr;
1576 int handled = 0;
1578 while (inb(brdp->ioctrl) & 0x1) {
1579 handled = 1;
1580 for (bnknr = 0; bnknr < brdp->nrbnks; bnknr++) {
1581 ioaddr = brdp->bnkstataddr[bnknr];
1582 if (inb(ioaddr) & ECH_PNLINTRPEND) {
1583 panelp = brdp->bnk2panel[bnknr];
1584 (* panelp->isr)(panelp, (ioaddr & 0xfffc));
1589 return handled;
1592 /*****************************************************************************/
1595 * Initialize all the ports on a panel.
1598 static int __devinit stl_initports(struct stlbrd *brdp, struct stlpanel *panelp)
1600 struct stlport *portp;
1601 unsigned int i;
1602 int chipmask;
1604 pr_debug("stl_initports(brdp=%p,panelp=%p)\n", brdp, panelp);
1606 chipmask = stl_panelinit(brdp, panelp);
1609 * All UART's are initialized (if found!). Now go through and setup
1610 * each ports data structures.
1612 for (i = 0; i < panelp->nrports; i++) {
1613 portp = kzalloc(sizeof(struct stlport), GFP_KERNEL);
1614 if (!portp) {
1615 printk("STALLION: failed to allocate memory "
1616 "(size=%Zd)\n", sizeof(struct stlport));
1617 break;
1619 tty_port_init(&portp->port);
1620 portp->port.ops = &stl_port_ops;
1621 portp->magic = STL_PORTMAGIC;
1622 portp->portnr = i;
1623 portp->brdnr = panelp->brdnr;
1624 portp->panelnr = panelp->panelnr;
1625 portp->uartp = panelp->uartp;
1626 portp->clk = brdp->clk;
1627 portp->baud_base = STL_BAUDBASE;
1628 portp->close_delay = STL_CLOSEDELAY;
1629 portp->closing_wait = 30 * HZ;
1630 init_waitqueue_head(&portp->port.open_wait);
1631 init_waitqueue_head(&portp->port.close_wait);
1632 portp->stats.brd = portp->brdnr;
1633 portp->stats.panel = portp->panelnr;
1634 portp->stats.port = portp->portnr;
1635 panelp->ports[i] = portp;
1636 stl_portinit(brdp, panelp, portp);
1639 return 0;
1642 static void stl_cleanup_panels(struct stlbrd *brdp)
1644 struct stlpanel *panelp;
1645 struct stlport *portp;
1646 unsigned int j, k;
1647 struct tty_struct *tty;
1649 for (j = 0; j < STL_MAXPANELS; j++) {
1650 panelp = brdp->panels[j];
1651 if (panelp == NULL)
1652 continue;
1653 for (k = 0; k < STL_PORTSPERPANEL; k++) {
1654 portp = panelp->ports[k];
1655 if (portp == NULL)
1656 continue;
1657 tty = tty_port_tty_get(&portp->port);
1658 if (tty != NULL) {
1659 stl_hangup(tty);
1660 tty_kref_put(tty);
1662 kfree(portp->tx.buf);
1663 kfree(portp);
1665 kfree(panelp);
1669 /*****************************************************************************/
1672 * Try to find and initialize an EasyIO board.
1675 static int __devinit stl_initeio(struct stlbrd *brdp)
1677 struct stlpanel *panelp;
1678 unsigned int status;
1679 char *name;
1680 int retval;
1682 pr_debug("stl_initeio(brdp=%p)\n", brdp);
1684 brdp->ioctrl = brdp->ioaddr1 + 1;
1685 brdp->iostatus = brdp->ioaddr1 + 2;
1687 status = inb(brdp->iostatus);
1688 if ((status & EIO_IDBITMASK) == EIO_MK3)
1689 brdp->ioctrl++;
1692 * Handle board specific stuff now. The real difference is PCI
1693 * or not PCI.
1695 if (brdp->brdtype == BRD_EASYIOPCI) {
1696 brdp->iosize1 = 0x80;
1697 brdp->iosize2 = 0x80;
1698 name = "serial(EIO-PCI)";
1699 outb(0x41, (brdp->ioaddr2 + 0x4c));
1700 } else {
1701 brdp->iosize1 = 8;
1702 name = "serial(EIO)";
1703 if ((brdp->irq < 0) || (brdp->irq > 15) ||
1704 (stl_vecmap[brdp->irq] == (unsigned char) 0xff)) {
1705 printk("STALLION: invalid irq=%d for brd=%d\n",
1706 brdp->irq, brdp->brdnr);
1707 retval = -EINVAL;
1708 goto err;
1710 outb((stl_vecmap[brdp->irq] | EIO_0WS |
1711 ((brdp->irqtype) ? EIO_INTLEVEL : EIO_INTEDGE)),
1712 brdp->ioctrl);
1715 retval = -EBUSY;
1716 if (!request_region(brdp->ioaddr1, brdp->iosize1, name)) {
1717 printk(KERN_WARNING "STALLION: Warning, board %d I/O address "
1718 "%x conflicts with another device\n", brdp->brdnr,
1719 brdp->ioaddr1);
1720 goto err;
1723 if (brdp->iosize2 > 0)
1724 if (!request_region(brdp->ioaddr2, brdp->iosize2, name)) {
1725 printk(KERN_WARNING "STALLION: Warning, board %d I/O "
1726 "address %x conflicts with another device\n",
1727 brdp->brdnr, brdp->ioaddr2);
1728 printk(KERN_WARNING "STALLION: Warning, also "
1729 "releasing board %d I/O address %x \n",
1730 brdp->brdnr, brdp->ioaddr1);
1731 goto err_rel1;
1735 * Everything looks OK, so let's go ahead and probe for the hardware.
1737 brdp->clk = CD1400_CLK;
1738 brdp->isr = stl_eiointr;
1740 retval = -ENODEV;
1741 switch (status & EIO_IDBITMASK) {
1742 case EIO_8PORTM:
1743 brdp->clk = CD1400_CLK8M;
1744 /* fall thru */
1745 case EIO_8PORTRS:
1746 case EIO_8PORTDI:
1747 brdp->nrports = 8;
1748 break;
1749 case EIO_4PORTRS:
1750 brdp->nrports = 4;
1751 break;
1752 case EIO_MK3:
1753 switch (status & EIO_BRDMASK) {
1754 case ID_BRD4:
1755 brdp->nrports = 4;
1756 break;
1757 case ID_BRD8:
1758 brdp->nrports = 8;
1759 break;
1760 case ID_BRD16:
1761 brdp->nrports = 16;
1762 break;
1763 default:
1764 goto err_rel2;
1766 break;
1767 default:
1768 goto err_rel2;
1772 * We have verified that the board is actually present, so now we
1773 * can complete the setup.
1776 panelp = kzalloc(sizeof(struct stlpanel), GFP_KERNEL);
1777 if (!panelp) {
1778 printk(KERN_WARNING "STALLION: failed to allocate memory "
1779 "(size=%Zd)\n", sizeof(struct stlpanel));
1780 retval = -ENOMEM;
1781 goto err_rel2;
1784 panelp->magic = STL_PANELMAGIC;
1785 panelp->brdnr = brdp->brdnr;
1786 panelp->panelnr = 0;
1787 panelp->nrports = brdp->nrports;
1788 panelp->iobase = brdp->ioaddr1;
1789 panelp->hwid = status;
1790 if ((status & EIO_IDBITMASK) == EIO_MK3) {
1791 panelp->uartp = &stl_sc26198uart;
1792 panelp->isr = stl_sc26198intr;
1793 } else {
1794 panelp->uartp = &stl_cd1400uart;
1795 panelp->isr = stl_cd1400eiointr;
1798 brdp->panels[0] = panelp;
1799 brdp->nrpanels = 1;
1800 brdp->state |= BRD_FOUND;
1801 brdp->hwid = status;
1802 if (request_irq(brdp->irq, stl_intr, IRQF_SHARED, name, brdp) != 0) {
1803 printk("STALLION: failed to register interrupt "
1804 "routine for %s irq=%d\n", name, brdp->irq);
1805 retval = -ENODEV;
1806 goto err_fr;
1809 return 0;
1810 err_fr:
1811 stl_cleanup_panels(brdp);
1812 err_rel2:
1813 if (brdp->iosize2 > 0)
1814 release_region(brdp->ioaddr2, brdp->iosize2);
1815 err_rel1:
1816 release_region(brdp->ioaddr1, brdp->iosize1);
1817 err:
1818 return retval;
1821 /*****************************************************************************/
1824 * Try to find an ECH board and initialize it. This code is capable of
1825 * dealing with all types of ECH board.
1828 static int __devinit stl_initech(struct stlbrd *brdp)
1830 struct stlpanel *panelp;
1831 unsigned int status, nxtid, ioaddr, conflict, panelnr, banknr, i;
1832 int retval;
1833 char *name;
1835 pr_debug("stl_initech(brdp=%p)\n", brdp);
1837 status = 0;
1838 conflict = 0;
1841 * Set up the initial board register contents for boards. This varies a
1842 * bit between the different board types. So we need to handle each
1843 * separately. Also do a check that the supplied IRQ is good.
1845 switch (brdp->brdtype) {
1847 case BRD_ECH:
1848 brdp->isr = stl_echatintr;
1849 brdp->ioctrl = brdp->ioaddr1 + 1;
1850 brdp->iostatus = brdp->ioaddr1 + 1;
1851 status = inb(brdp->iostatus);
1852 if ((status & ECH_IDBITMASK) != ECH_ID) {
1853 retval = -ENODEV;
1854 goto err;
1856 if ((brdp->irq < 0) || (brdp->irq > 15) ||
1857 (stl_vecmap[brdp->irq] == (unsigned char) 0xff)) {
1858 printk("STALLION: invalid irq=%d for brd=%d\n",
1859 brdp->irq, brdp->brdnr);
1860 retval = -EINVAL;
1861 goto err;
1863 status = ((brdp->ioaddr2 & ECH_ADDR2MASK) >> 1);
1864 status |= (stl_vecmap[brdp->irq] << 1);
1865 outb((status | ECH_BRDRESET), brdp->ioaddr1);
1866 brdp->ioctrlval = ECH_INTENABLE |
1867 ((brdp->irqtype) ? ECH_INTLEVEL : ECH_INTEDGE);
1868 for (i = 0; i < 10; i++)
1869 outb((brdp->ioctrlval | ECH_BRDENABLE), brdp->ioctrl);
1870 brdp->iosize1 = 2;
1871 brdp->iosize2 = 32;
1872 name = "serial(EC8/32)";
1873 outb(status, brdp->ioaddr1);
1874 break;
1876 case BRD_ECHMC:
1877 brdp->isr = stl_echmcaintr;
1878 brdp->ioctrl = brdp->ioaddr1 + 0x20;
1879 brdp->iostatus = brdp->ioctrl;
1880 status = inb(brdp->iostatus);
1881 if ((status & ECH_IDBITMASK) != ECH_ID) {
1882 retval = -ENODEV;
1883 goto err;
1885 if ((brdp->irq < 0) || (brdp->irq > 15) ||
1886 (stl_vecmap[brdp->irq] == (unsigned char) 0xff)) {
1887 printk("STALLION: invalid irq=%d for brd=%d\n",
1888 brdp->irq, brdp->brdnr);
1889 retval = -EINVAL;
1890 goto err;
1892 outb(ECHMC_BRDRESET, brdp->ioctrl);
1893 outb(ECHMC_INTENABLE, brdp->ioctrl);
1894 brdp->iosize1 = 64;
1895 name = "serial(EC8/32-MC)";
1896 break;
1898 case BRD_ECHPCI:
1899 brdp->isr = stl_echpciintr;
1900 brdp->ioctrl = brdp->ioaddr1 + 2;
1901 brdp->iosize1 = 4;
1902 brdp->iosize2 = 8;
1903 name = "serial(EC8/32-PCI)";
1904 break;
1906 case BRD_ECH64PCI:
1907 brdp->isr = stl_echpci64intr;
1908 brdp->ioctrl = brdp->ioaddr2 + 0x40;
1909 outb(0x43, (brdp->ioaddr1 + 0x4c));
1910 brdp->iosize1 = 0x80;
1911 brdp->iosize2 = 0x80;
1912 name = "serial(EC8/64-PCI)";
1913 break;
1915 default:
1916 printk("STALLION: unknown board type=%d\n", brdp->brdtype);
1917 retval = -EINVAL;
1918 goto err;
1922 * Check boards for possible IO address conflicts and return fail status
1923 * if an IO conflict found.
1925 retval = -EBUSY;
1926 if (!request_region(brdp->ioaddr1, brdp->iosize1, name)) {
1927 printk(KERN_WARNING "STALLION: Warning, board %d I/O address "
1928 "%x conflicts with another device\n", brdp->brdnr,
1929 brdp->ioaddr1);
1930 goto err;
1933 if (brdp->iosize2 > 0)
1934 if (!request_region(brdp->ioaddr2, brdp->iosize2, name)) {
1935 printk(KERN_WARNING "STALLION: Warning, board %d I/O "
1936 "address %x conflicts with another device\n",
1937 brdp->brdnr, brdp->ioaddr2);
1938 printk(KERN_WARNING "STALLION: Warning, also "
1939 "releasing board %d I/O address %x \n",
1940 brdp->brdnr, brdp->ioaddr1);
1941 goto err_rel1;
1945 * Scan through the secondary io address space looking for panels.
1946 * As we find'em allocate and initialize panel structures for each.
1948 brdp->clk = CD1400_CLK;
1949 brdp->hwid = status;
1951 ioaddr = brdp->ioaddr2;
1952 banknr = 0;
1953 panelnr = 0;
1954 nxtid = 0;
1956 for (i = 0; i < STL_MAXPANELS; i++) {
1957 if (brdp->brdtype == BRD_ECHPCI) {
1958 outb(nxtid, brdp->ioctrl);
1959 ioaddr = brdp->ioaddr2;
1961 status = inb(ioaddr + ECH_PNLSTATUS);
1962 if ((status & ECH_PNLIDMASK) != nxtid)
1963 break;
1964 panelp = kzalloc(sizeof(struct stlpanel), GFP_KERNEL);
1965 if (!panelp) {
1966 printk("STALLION: failed to allocate memory "
1967 "(size=%Zd)\n", sizeof(struct stlpanel));
1968 retval = -ENOMEM;
1969 goto err_fr;
1971 panelp->magic = STL_PANELMAGIC;
1972 panelp->brdnr = brdp->brdnr;
1973 panelp->panelnr = panelnr;
1974 panelp->iobase = ioaddr;
1975 panelp->pagenr = nxtid;
1976 panelp->hwid = status;
1977 brdp->bnk2panel[banknr] = panelp;
1978 brdp->bnkpageaddr[banknr] = nxtid;
1979 brdp->bnkstataddr[banknr++] = ioaddr + ECH_PNLSTATUS;
1981 if (status & ECH_PNLXPID) {
1982 panelp->uartp = &stl_sc26198uart;
1983 panelp->isr = stl_sc26198intr;
1984 if (status & ECH_PNL16PORT) {
1985 panelp->nrports = 16;
1986 brdp->bnk2panel[banknr] = panelp;
1987 brdp->bnkpageaddr[banknr] = nxtid;
1988 brdp->bnkstataddr[banknr++] = ioaddr + 4 +
1989 ECH_PNLSTATUS;
1990 } else
1991 panelp->nrports = 8;
1992 } else {
1993 panelp->uartp = &stl_cd1400uart;
1994 panelp->isr = stl_cd1400echintr;
1995 if (status & ECH_PNL16PORT) {
1996 panelp->nrports = 16;
1997 panelp->ackmask = 0x80;
1998 if (brdp->brdtype != BRD_ECHPCI)
1999 ioaddr += EREG_BANKSIZE;
2000 brdp->bnk2panel[banknr] = panelp;
2001 brdp->bnkpageaddr[banknr] = ++nxtid;
2002 brdp->bnkstataddr[banknr++] = ioaddr +
2003 ECH_PNLSTATUS;
2004 } else {
2005 panelp->nrports = 8;
2006 panelp->ackmask = 0xc0;
2010 nxtid++;
2011 ioaddr += EREG_BANKSIZE;
2012 brdp->nrports += panelp->nrports;
2013 brdp->panels[panelnr++] = panelp;
2014 if ((brdp->brdtype != BRD_ECHPCI) &&
2015 (ioaddr >= (brdp->ioaddr2 + brdp->iosize2))) {
2016 retval = -EINVAL;
2017 goto err_fr;
2021 brdp->nrpanels = panelnr;
2022 brdp->nrbnks = banknr;
2023 if (brdp->brdtype == BRD_ECH)
2024 outb((brdp->ioctrlval | ECH_BRDDISABLE), brdp->ioctrl);
2026 brdp->state |= BRD_FOUND;
2027 if (request_irq(brdp->irq, stl_intr, IRQF_SHARED, name, brdp) != 0) {
2028 printk("STALLION: failed to register interrupt "
2029 "routine for %s irq=%d\n", name, brdp->irq);
2030 retval = -ENODEV;
2031 goto err_fr;
2034 return 0;
2035 err_fr:
2036 stl_cleanup_panels(brdp);
2037 if (brdp->iosize2 > 0)
2038 release_region(brdp->ioaddr2, brdp->iosize2);
2039 err_rel1:
2040 release_region(brdp->ioaddr1, brdp->iosize1);
2041 err:
2042 return retval;
2045 /*****************************************************************************/
2048 * Initialize and configure the specified board.
2049 * Scan through all the boards in the configuration and see what we
2050 * can find. Handle EIO and the ECH boards a little differently here
2051 * since the initial search and setup is very different.
2054 static int __devinit stl_brdinit(struct stlbrd *brdp)
2056 int i, retval;
2058 pr_debug("stl_brdinit(brdp=%p)\n", brdp);
2060 switch (brdp->brdtype) {
2061 case BRD_EASYIO:
2062 case BRD_EASYIOPCI:
2063 retval = stl_initeio(brdp);
2064 if (retval)
2065 goto err;
2066 break;
2067 case BRD_ECH:
2068 case BRD_ECHMC:
2069 case BRD_ECHPCI:
2070 case BRD_ECH64PCI:
2071 retval = stl_initech(brdp);
2072 if (retval)
2073 goto err;
2074 break;
2075 default:
2076 printk("STALLION: board=%d is unknown board type=%d\n",
2077 brdp->brdnr, brdp->brdtype);
2078 retval = -ENODEV;
2079 goto err;
2082 if ((brdp->state & BRD_FOUND) == 0) {
2083 printk("STALLION: %s board not found, board=%d io=%x irq=%d\n",
2084 stl_brdnames[brdp->brdtype], brdp->brdnr,
2085 brdp->ioaddr1, brdp->irq);
2086 goto err_free;
2089 for (i = 0; i < STL_MAXPANELS; i++)
2090 if (brdp->panels[i] != NULL)
2091 stl_initports(brdp, brdp->panels[i]);
2093 printk("STALLION: %s found, board=%d io=%x irq=%d "
2094 "nrpanels=%d nrports=%d\n", stl_brdnames[brdp->brdtype],
2095 brdp->brdnr, brdp->ioaddr1, brdp->irq, brdp->nrpanels,
2096 brdp->nrports);
2098 return 0;
2099 err_free:
2100 free_irq(brdp->irq, brdp);
2102 stl_cleanup_panels(brdp);
2104 release_region(brdp->ioaddr1, brdp->iosize1);
2105 if (brdp->iosize2 > 0)
2106 release_region(brdp->ioaddr2, brdp->iosize2);
2107 err:
2108 return retval;
2111 /*****************************************************************************/
2114 * Find the next available board number that is free.
2117 static int __devinit stl_getbrdnr(void)
2119 unsigned int i;
2121 for (i = 0; i < STL_MAXBRDS; i++)
2122 if (stl_brds[i] == NULL) {
2123 if (i >= stl_nrbrds)
2124 stl_nrbrds = i + 1;
2125 return i;
2128 return -1;
2131 /*****************************************************************************/
2133 * We have a Stallion board. Allocate a board structure and
2134 * initialize it. Read its IO and IRQ resources from PCI
2135 * configuration space.
2138 static int __devinit stl_pciprobe(struct pci_dev *pdev,
2139 const struct pci_device_id *ent)
2141 struct stlbrd *brdp;
2142 unsigned int i, brdtype = ent->driver_data;
2143 int brdnr, retval = -ENODEV;
2145 if ((pdev->class >> 8) == PCI_CLASS_STORAGE_IDE)
2146 goto err;
2148 retval = pci_enable_device(pdev);
2149 if (retval)
2150 goto err;
2151 brdp = stl_allocbrd();
2152 if (brdp == NULL) {
2153 retval = -ENOMEM;
2154 goto err;
2156 mutex_lock(&stl_brdslock);
2157 brdnr = stl_getbrdnr();
2158 if (brdnr < 0) {
2159 dev_err(&pdev->dev, "too many boards found, "
2160 "maximum supported %d\n", STL_MAXBRDS);
2161 mutex_unlock(&stl_brdslock);
2162 retval = -ENODEV;
2163 goto err_fr;
2165 brdp->brdnr = (unsigned int)brdnr;
2166 stl_brds[brdp->brdnr] = brdp;
2167 mutex_unlock(&stl_brdslock);
2169 brdp->brdtype = brdtype;
2170 brdp->state |= STL_PROBED;
2173 * We have all resources from the board, so let's setup the actual
2174 * board structure now.
2176 switch (brdtype) {
2177 case BRD_ECHPCI:
2178 brdp->ioaddr2 = pci_resource_start(pdev, 0);
2179 brdp->ioaddr1 = pci_resource_start(pdev, 1);
2180 break;
2181 case BRD_ECH64PCI:
2182 brdp->ioaddr2 = pci_resource_start(pdev, 2);
2183 brdp->ioaddr1 = pci_resource_start(pdev, 1);
2184 break;
2185 case BRD_EASYIOPCI:
2186 brdp->ioaddr1 = pci_resource_start(pdev, 2);
2187 brdp->ioaddr2 = pci_resource_start(pdev, 1);
2188 break;
2189 default:
2190 dev_err(&pdev->dev, "unknown PCI board type=%u\n", brdtype);
2191 break;
2194 brdp->irq = pdev->irq;
2195 retval = stl_brdinit(brdp);
2196 if (retval)
2197 goto err_null;
2199 pci_set_drvdata(pdev, brdp);
2201 for (i = 0; i < brdp->nrports; i++)
2202 tty_register_device(stl_serial,
2203 brdp->brdnr * STL_MAXPORTS + i, &pdev->dev);
2205 return 0;
2206 err_null:
2207 stl_brds[brdp->brdnr] = NULL;
2208 err_fr:
2209 kfree(brdp);
2210 err:
2211 return retval;
2214 static void __devexit stl_pciremove(struct pci_dev *pdev)
2216 struct stlbrd *brdp = pci_get_drvdata(pdev);
2217 unsigned int i;
2219 free_irq(brdp->irq, brdp);
2221 stl_cleanup_panels(brdp);
2223 release_region(brdp->ioaddr1, brdp->iosize1);
2224 if (brdp->iosize2 > 0)
2225 release_region(brdp->ioaddr2, brdp->iosize2);
2227 for (i = 0; i < brdp->nrports; i++)
2228 tty_unregister_device(stl_serial,
2229 brdp->brdnr * STL_MAXPORTS + i);
2231 stl_brds[brdp->brdnr] = NULL;
2232 kfree(brdp);
2235 static struct pci_driver stl_pcidriver = {
2236 .name = "stallion",
2237 .id_table = stl_pcibrds,
2238 .probe = stl_pciprobe,
2239 .remove = __devexit_p(stl_pciremove)
2242 /*****************************************************************************/
2245 * Return the board stats structure to user app.
2248 static int stl_getbrdstats(combrd_t __user *bp)
2250 combrd_t stl_brdstats;
2251 struct stlbrd *brdp;
2252 struct stlpanel *panelp;
2253 unsigned int i;
2255 if (copy_from_user(&stl_brdstats, bp, sizeof(combrd_t)))
2256 return -EFAULT;
2257 if (stl_brdstats.brd >= STL_MAXBRDS)
2258 return -ENODEV;
2259 brdp = stl_brds[stl_brdstats.brd];
2260 if (brdp == NULL)
2261 return -ENODEV;
2263 memset(&stl_brdstats, 0, sizeof(combrd_t));
2264 stl_brdstats.brd = brdp->brdnr;
2265 stl_brdstats.type = brdp->brdtype;
2266 stl_brdstats.hwid = brdp->hwid;
2267 stl_brdstats.state = brdp->state;
2268 stl_brdstats.ioaddr = brdp->ioaddr1;
2269 stl_brdstats.ioaddr2 = brdp->ioaddr2;
2270 stl_brdstats.irq = brdp->irq;
2271 stl_brdstats.nrpanels = brdp->nrpanels;
2272 stl_brdstats.nrports = brdp->nrports;
2273 for (i = 0; i < brdp->nrpanels; i++) {
2274 panelp = brdp->panels[i];
2275 stl_brdstats.panels[i].panel = i;
2276 stl_brdstats.panels[i].hwid = panelp->hwid;
2277 stl_brdstats.panels[i].nrports = panelp->nrports;
2280 return copy_to_user(bp, &stl_brdstats, sizeof(combrd_t)) ? -EFAULT : 0;
2283 /*****************************************************************************/
2286 * Resolve the referenced port number into a port struct pointer.
2289 static struct stlport *stl_getport(int brdnr, int panelnr, int portnr)
2291 struct stlbrd *brdp;
2292 struct stlpanel *panelp;
2294 if (brdnr < 0 || brdnr >= STL_MAXBRDS)
2295 return NULL;
2296 brdp = stl_brds[brdnr];
2297 if (brdp == NULL)
2298 return NULL;
2299 if (panelnr < 0 || (unsigned int)panelnr >= brdp->nrpanels)
2300 return NULL;
2301 panelp = brdp->panels[panelnr];
2302 if (panelp == NULL)
2303 return NULL;
2304 if (portnr < 0 || (unsigned int)portnr >= panelp->nrports)
2305 return NULL;
2306 return panelp->ports[portnr];
2309 /*****************************************************************************/
2312 * Return the port stats structure to user app. A NULL port struct
2313 * pointer passed in means that we need to find out from the app
2314 * what port to get stats for (used through board control device).
2317 static int stl_getportstats(struct tty_struct *tty, struct stlport *portp, comstats_t __user *cp)
2319 comstats_t stl_comstats;
2320 unsigned char *head, *tail;
2321 unsigned long flags;
2323 if (!portp) {
2324 if (copy_from_user(&stl_comstats, cp, sizeof(comstats_t)))
2325 return -EFAULT;
2326 portp = stl_getport(stl_comstats.brd, stl_comstats.panel,
2327 stl_comstats.port);
2328 if (portp == NULL)
2329 return -ENODEV;
2332 mutex_lock(&portp->port.mutex);
2333 portp->stats.state = portp->istate;
2334 portp->stats.flags = portp->port.flags;
2335 portp->stats.hwid = portp->hwid;
2337 portp->stats.ttystate = 0;
2338 portp->stats.cflags = 0;
2339 portp->stats.iflags = 0;
2340 portp->stats.oflags = 0;
2341 portp->stats.lflags = 0;
2342 portp->stats.rxbuffered = 0;
2344 spin_lock_irqsave(&stallion_lock, flags);
2345 if (tty != NULL && portp->port.tty == tty) {
2346 portp->stats.ttystate = tty->flags;
2347 /* No longer available as a statistic */
2348 portp->stats.rxbuffered = 1; /*tty->flip.count; */
2349 if (tty->termios != NULL) {
2350 portp->stats.cflags = tty->termios->c_cflag;
2351 portp->stats.iflags = tty->termios->c_iflag;
2352 portp->stats.oflags = tty->termios->c_oflag;
2353 portp->stats.lflags = tty->termios->c_lflag;
2356 spin_unlock_irqrestore(&stallion_lock, flags);
2358 head = portp->tx.head;
2359 tail = portp->tx.tail;
2360 portp->stats.txbuffered = (head >= tail) ? (head - tail) :
2361 (STL_TXBUFSIZE - (tail - head));
2363 portp->stats.signals = (unsigned long) stl_getsignals(portp);
2364 mutex_unlock(&portp->port.mutex);
2366 return copy_to_user(cp, &portp->stats,
2367 sizeof(comstats_t)) ? -EFAULT : 0;
2370 /*****************************************************************************/
2373 * Clear the port stats structure. We also return it zeroed out...
2376 static int stl_clrportstats(struct stlport *portp, comstats_t __user *cp)
2378 comstats_t stl_comstats;
2380 if (!portp) {
2381 if (copy_from_user(&stl_comstats, cp, sizeof(comstats_t)))
2382 return -EFAULT;
2383 portp = stl_getport(stl_comstats.brd, stl_comstats.panel,
2384 stl_comstats.port);
2385 if (portp == NULL)
2386 return -ENODEV;
2389 mutex_lock(&portp->port.mutex);
2390 memset(&portp->stats, 0, sizeof(comstats_t));
2391 portp->stats.brd = portp->brdnr;
2392 portp->stats.panel = portp->panelnr;
2393 portp->stats.port = portp->portnr;
2394 mutex_unlock(&portp->port.mutex);
2395 return copy_to_user(cp, &portp->stats,
2396 sizeof(comstats_t)) ? -EFAULT : 0;
2399 /*****************************************************************************/
2402 * Return the entire driver ports structure to a user app.
2405 static int stl_getportstruct(struct stlport __user *arg)
2407 struct stlport stl_dummyport;
2408 struct stlport *portp;
2410 if (copy_from_user(&stl_dummyport, arg, sizeof(struct stlport)))
2411 return -EFAULT;
2412 portp = stl_getport(stl_dummyport.brdnr, stl_dummyport.panelnr,
2413 stl_dummyport.portnr);
2414 if (!portp)
2415 return -ENODEV;
2416 return copy_to_user(arg, portp, sizeof(struct stlport)) ? -EFAULT : 0;
2419 /*****************************************************************************/
2422 * Return the entire driver board structure to a user app.
2425 static int stl_getbrdstruct(struct stlbrd __user *arg)
2427 struct stlbrd stl_dummybrd;
2428 struct stlbrd *brdp;
2430 if (copy_from_user(&stl_dummybrd, arg, sizeof(struct stlbrd)))
2431 return -EFAULT;
2432 if (stl_dummybrd.brdnr >= STL_MAXBRDS)
2433 return -ENODEV;
2434 brdp = stl_brds[stl_dummybrd.brdnr];
2435 if (!brdp)
2436 return -ENODEV;
2437 return copy_to_user(arg, brdp, sizeof(struct stlbrd)) ? -EFAULT : 0;
2440 /*****************************************************************************/
2443 * The "staliomem" device is also required to do some special operations
2444 * on the board and/or ports. In this driver it is mostly used for stats
2445 * collection.
2448 static long stl_memioctl(struct file *fp, unsigned int cmd, unsigned long arg)
2450 int brdnr, rc;
2451 void __user *argp = (void __user *)arg;
2453 pr_debug("stl_memioctl(fp=%p,cmd=%x,arg=%lx)\n", fp, cmd,arg);
2455 brdnr = iminor(fp->f_dentry->d_inode);
2456 if (brdnr >= STL_MAXBRDS)
2457 return -ENODEV;
2458 rc = 0;
2460 switch (cmd) {
2461 case COM_GETPORTSTATS:
2462 rc = stl_getportstats(NULL, NULL, argp);
2463 break;
2464 case COM_CLRPORTSTATS:
2465 rc = stl_clrportstats(NULL, argp);
2466 break;
2467 case COM_GETBRDSTATS:
2468 rc = stl_getbrdstats(argp);
2469 break;
2470 case COM_READPORT:
2471 rc = stl_getportstruct(argp);
2472 break;
2473 case COM_READBOARD:
2474 rc = stl_getbrdstruct(argp);
2475 break;
2476 default:
2477 rc = -ENOIOCTLCMD;
2478 break;
2480 return rc;
2483 static const struct tty_operations stl_ops = {
2484 .open = stl_open,
2485 .close = stl_close,
2486 .write = stl_write,
2487 .put_char = stl_putchar,
2488 .flush_chars = stl_flushchars,
2489 .write_room = stl_writeroom,
2490 .chars_in_buffer = stl_charsinbuffer,
2491 .ioctl = stl_ioctl,
2492 .set_termios = stl_settermios,
2493 .throttle = stl_throttle,
2494 .unthrottle = stl_unthrottle,
2495 .stop = stl_stop,
2496 .start = stl_start,
2497 .hangup = stl_hangup,
2498 .flush_buffer = stl_flushbuffer,
2499 .break_ctl = stl_breakctl,
2500 .wait_until_sent = stl_waituntilsent,
2501 .send_xchar = stl_sendxchar,
2502 .tiocmget = stl_tiocmget,
2503 .tiocmset = stl_tiocmset,
2504 .proc_fops = &stl_proc_fops,
2507 static const struct tty_port_operations stl_port_ops = {
2508 .carrier_raised = stl_carrier_raised,
2509 .dtr_rts = stl_dtr_rts,
2510 .activate = stl_activate,
2511 .shutdown = stl_shutdown,
2514 /*****************************************************************************/
2515 /* CD1400 HARDWARE FUNCTIONS */
2516 /*****************************************************************************/
2519 * These functions get/set/update the registers of the cd1400 UARTs.
2520 * Access to the cd1400 registers is via an address/data io port pair.
2521 * (Maybe should make this inline...)
2524 static int stl_cd1400getreg(struct stlport *portp, int regnr)
2526 outb((regnr + portp->uartaddr), portp->ioaddr);
2527 return inb(portp->ioaddr + EREG_DATA);
2530 static void stl_cd1400setreg(struct stlport *portp, int regnr, int value)
2532 outb(regnr + portp->uartaddr, portp->ioaddr);
2533 outb(value, portp->ioaddr + EREG_DATA);
2536 static int stl_cd1400updatereg(struct stlport *portp, int regnr, int value)
2538 outb(regnr + portp->uartaddr, portp->ioaddr);
2539 if (inb(portp->ioaddr + EREG_DATA) != value) {
2540 outb(value, portp->ioaddr + EREG_DATA);
2541 return 1;
2543 return 0;
2546 /*****************************************************************************/
2549 * Inbitialize the UARTs in a panel. We don't care what sort of board
2550 * these ports are on - since the port io registers are almost
2551 * identical when dealing with ports.
2554 static int stl_cd1400panelinit(struct stlbrd *brdp, struct stlpanel *panelp)
2556 unsigned int gfrcr;
2557 int chipmask, i, j;
2558 int nrchips, uartaddr, ioaddr;
2559 unsigned long flags;
2561 pr_debug("stl_panelinit(brdp=%p,panelp=%p)\n", brdp, panelp);
2563 spin_lock_irqsave(&brd_lock, flags);
2564 BRDENABLE(panelp->brdnr, panelp->pagenr);
2567 * Check that each chip is present and started up OK.
2569 chipmask = 0;
2570 nrchips = panelp->nrports / CD1400_PORTS;
2571 for (i = 0; i < nrchips; i++) {
2572 if (brdp->brdtype == BRD_ECHPCI) {
2573 outb((panelp->pagenr + (i >> 1)), brdp->ioctrl);
2574 ioaddr = panelp->iobase;
2575 } else
2576 ioaddr = panelp->iobase + (EREG_BANKSIZE * (i >> 1));
2577 uartaddr = (i & 0x01) ? 0x080 : 0;
2578 outb((GFRCR + uartaddr), ioaddr);
2579 outb(0, (ioaddr + EREG_DATA));
2580 outb((CCR + uartaddr), ioaddr);
2581 outb(CCR_RESETFULL, (ioaddr + EREG_DATA));
2582 outb(CCR_RESETFULL, (ioaddr + EREG_DATA));
2583 outb((GFRCR + uartaddr), ioaddr);
2584 for (j = 0; j < CCR_MAXWAIT; j++)
2585 if ((gfrcr = inb(ioaddr + EREG_DATA)) != 0)
2586 break;
2588 if ((j >= CCR_MAXWAIT) || (gfrcr < 0x40) || (gfrcr > 0x60)) {
2589 printk("STALLION: cd1400 not responding, "
2590 "brd=%d panel=%d chip=%d\n",
2591 panelp->brdnr, panelp->panelnr, i);
2592 continue;
2594 chipmask |= (0x1 << i);
2595 outb((PPR + uartaddr), ioaddr);
2596 outb(PPR_SCALAR, (ioaddr + EREG_DATA));
2599 BRDDISABLE(panelp->brdnr);
2600 spin_unlock_irqrestore(&brd_lock, flags);
2601 return chipmask;
2604 /*****************************************************************************/
2607 * Initialize hardware specific port registers.
2610 static void stl_cd1400portinit(struct stlbrd *brdp, struct stlpanel *panelp, struct stlport *portp)
2612 unsigned long flags;
2613 pr_debug("stl_cd1400portinit(brdp=%p,panelp=%p,portp=%p)\n", brdp,
2614 panelp, portp);
2616 if ((brdp == NULL) || (panelp == NULL) ||
2617 (portp == NULL))
2618 return;
2620 spin_lock_irqsave(&brd_lock, flags);
2621 portp->ioaddr = panelp->iobase + (((brdp->brdtype == BRD_ECHPCI) ||
2622 (portp->portnr < 8)) ? 0 : EREG_BANKSIZE);
2623 portp->uartaddr = (portp->portnr & 0x04) << 5;
2624 portp->pagenr = panelp->pagenr + (portp->portnr >> 3);
2626 BRDENABLE(portp->brdnr, portp->pagenr);
2627 stl_cd1400setreg(portp, CAR, (portp->portnr & 0x03));
2628 stl_cd1400setreg(portp, LIVR, (portp->portnr << 3));
2629 portp->hwid = stl_cd1400getreg(portp, GFRCR);
2630 BRDDISABLE(portp->brdnr);
2631 spin_unlock_irqrestore(&brd_lock, flags);
2634 /*****************************************************************************/
2637 * Wait for the command register to be ready. We will poll this,
2638 * since it won't usually take too long to be ready.
2641 static void stl_cd1400ccrwait(struct stlport *portp)
2643 int i;
2645 for (i = 0; i < CCR_MAXWAIT; i++)
2646 if (stl_cd1400getreg(portp, CCR) == 0)
2647 return;
2649 printk("STALLION: cd1400 not responding, port=%d panel=%d brd=%d\n",
2650 portp->portnr, portp->panelnr, portp->brdnr);
2653 /*****************************************************************************/
2656 * Set up the cd1400 registers for a port based on the termios port
2657 * settings.
2660 static void stl_cd1400setport(struct stlport *portp, struct ktermios *tiosp)
2662 struct stlbrd *brdp;
2663 unsigned long flags;
2664 unsigned int clkdiv, baudrate;
2665 unsigned char cor1, cor2, cor3;
2666 unsigned char cor4, cor5, ccr;
2667 unsigned char srer, sreron, sreroff;
2668 unsigned char mcor1, mcor2, rtpr;
2669 unsigned char clk, div;
2671 cor1 = 0;
2672 cor2 = 0;
2673 cor3 = 0;
2674 cor4 = 0;
2675 cor5 = 0;
2676 ccr = 0;
2677 rtpr = 0;
2678 clk = 0;
2679 div = 0;
2680 mcor1 = 0;
2681 mcor2 = 0;
2682 sreron = 0;
2683 sreroff = 0;
2685 brdp = stl_brds[portp->brdnr];
2686 if (brdp == NULL)
2687 return;
2690 * Set up the RX char ignore mask with those RX error types we
2691 * can ignore. We can get the cd1400 to help us out a little here,
2692 * it will ignore parity errors and breaks for us.
2694 portp->rxignoremsk = 0;
2695 if (tiosp->c_iflag & IGNPAR) {
2696 portp->rxignoremsk |= (ST_PARITY | ST_FRAMING | ST_OVERRUN);
2697 cor1 |= COR1_PARIGNORE;
2699 if (tiosp->c_iflag & IGNBRK) {
2700 portp->rxignoremsk |= ST_BREAK;
2701 cor4 |= COR4_IGNBRK;
2704 portp->rxmarkmsk = ST_OVERRUN;
2705 if (tiosp->c_iflag & (INPCK | PARMRK))
2706 portp->rxmarkmsk |= (ST_PARITY | ST_FRAMING);
2707 if (tiosp->c_iflag & BRKINT)
2708 portp->rxmarkmsk |= ST_BREAK;
2711 * Go through the char size, parity and stop bits and set all the
2712 * option register appropriately.
2714 switch (tiosp->c_cflag & CSIZE) {
2715 case CS5:
2716 cor1 |= COR1_CHL5;
2717 break;
2718 case CS6:
2719 cor1 |= COR1_CHL6;
2720 break;
2721 case CS7:
2722 cor1 |= COR1_CHL7;
2723 break;
2724 default:
2725 cor1 |= COR1_CHL8;
2726 break;
2729 if (tiosp->c_cflag & CSTOPB)
2730 cor1 |= COR1_STOP2;
2731 else
2732 cor1 |= COR1_STOP1;
2734 if (tiosp->c_cflag & PARENB) {
2735 if (tiosp->c_cflag & PARODD)
2736 cor1 |= (COR1_PARENB | COR1_PARODD);
2737 else
2738 cor1 |= (COR1_PARENB | COR1_PAREVEN);
2739 } else {
2740 cor1 |= COR1_PARNONE;
2744 * Set the RX FIFO threshold at 6 chars. This gives a bit of breathing
2745 * space for hardware flow control and the like. This should be set to
2746 * VMIN. Also here we will set the RX data timeout to 10ms - this should
2747 * really be based on VTIME.
2749 cor3 |= FIFO_RXTHRESHOLD;
2750 rtpr = 2;
2753 * Calculate the baud rate timers. For now we will just assume that
2754 * the input and output baud are the same. Could have used a baud
2755 * table here, but this way we can generate virtually any baud rate
2756 * we like!
2758 baudrate = tiosp->c_cflag & CBAUD;
2759 if (baudrate & CBAUDEX) {
2760 baudrate &= ~CBAUDEX;
2761 if ((baudrate < 1) || (baudrate > 4))
2762 tiosp->c_cflag &= ~CBAUDEX;
2763 else
2764 baudrate += 15;
2766 baudrate = stl_baudrates[baudrate];
2767 if ((tiosp->c_cflag & CBAUD) == B38400) {
2768 if ((portp->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_HI)
2769 baudrate = 57600;
2770 else if ((portp->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_VHI)
2771 baudrate = 115200;
2772 else if ((portp->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_SHI)
2773 baudrate = 230400;
2774 else if ((portp->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_WARP)
2775 baudrate = 460800;
2776 else if ((portp->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST)
2777 baudrate = (portp->baud_base / portp->custom_divisor);
2779 if (baudrate > STL_CD1400MAXBAUD)
2780 baudrate = STL_CD1400MAXBAUD;
2782 if (baudrate > 0) {
2783 for (clk = 0; clk < CD1400_NUMCLKS; clk++) {
2784 clkdiv = (portp->clk / stl_cd1400clkdivs[clk]) / baudrate;
2785 if (clkdiv < 0x100)
2786 break;
2788 div = (unsigned char) clkdiv;
2792 * Check what form of modem signaling is required and set it up.
2794 if ((tiosp->c_cflag & CLOCAL) == 0) {
2795 mcor1 |= MCOR1_DCD;
2796 mcor2 |= MCOR2_DCD;
2797 sreron |= SRER_MODEM;
2798 portp->port.flags |= ASYNC_CHECK_CD;
2799 } else
2800 portp->port.flags &= ~ASYNC_CHECK_CD;
2803 * Setup cd1400 enhanced modes if we can. In particular we want to
2804 * handle as much of the flow control as possible automatically. As
2805 * well as saving a few CPU cycles it will also greatly improve flow
2806 * control reliability.
2808 if (tiosp->c_iflag & IXON) {
2809 cor2 |= COR2_TXIBE;
2810 cor3 |= COR3_SCD12;
2811 if (tiosp->c_iflag & IXANY)
2812 cor2 |= COR2_IXM;
2815 if (tiosp->c_cflag & CRTSCTS) {
2816 cor2 |= COR2_CTSAE;
2817 mcor1 |= FIFO_RTSTHRESHOLD;
2821 * All cd1400 register values calculated so go through and set
2822 * them all up.
2825 pr_debug("SETPORT: portnr=%d panelnr=%d brdnr=%d\n",
2826 portp->portnr, portp->panelnr, portp->brdnr);
2827 pr_debug(" cor1=%x cor2=%x cor3=%x cor4=%x cor5=%x\n",
2828 cor1, cor2, cor3, cor4, cor5);
2829 pr_debug(" mcor1=%x mcor2=%x rtpr=%x sreron=%x sreroff=%x\n",
2830 mcor1, mcor2, rtpr, sreron, sreroff);
2831 pr_debug(" tcor=%x tbpr=%x rcor=%x rbpr=%x\n", clk, div, clk, div);
2832 pr_debug(" schr1=%x schr2=%x schr3=%x schr4=%x\n",
2833 tiosp->c_cc[VSTART], tiosp->c_cc[VSTOP],
2834 tiosp->c_cc[VSTART], tiosp->c_cc[VSTOP]);
2836 spin_lock_irqsave(&brd_lock, flags);
2837 BRDENABLE(portp->brdnr, portp->pagenr);
2838 stl_cd1400setreg(portp, CAR, (portp->portnr & 0x3));
2839 srer = stl_cd1400getreg(portp, SRER);
2840 stl_cd1400setreg(portp, SRER, 0);
2841 if (stl_cd1400updatereg(portp, COR1, cor1))
2842 ccr = 1;
2843 if (stl_cd1400updatereg(portp, COR2, cor2))
2844 ccr = 1;
2845 if (stl_cd1400updatereg(portp, COR3, cor3))
2846 ccr = 1;
2847 if (ccr) {
2848 stl_cd1400ccrwait(portp);
2849 stl_cd1400setreg(portp, CCR, CCR_CORCHANGE);
2851 stl_cd1400setreg(portp, COR4, cor4);
2852 stl_cd1400setreg(portp, COR5, cor5);
2853 stl_cd1400setreg(portp, MCOR1, mcor1);
2854 stl_cd1400setreg(portp, MCOR2, mcor2);
2855 if (baudrate > 0) {
2856 stl_cd1400setreg(portp, TCOR, clk);
2857 stl_cd1400setreg(portp, TBPR, div);
2858 stl_cd1400setreg(portp, RCOR, clk);
2859 stl_cd1400setreg(portp, RBPR, div);
2861 stl_cd1400setreg(portp, SCHR1, tiosp->c_cc[VSTART]);
2862 stl_cd1400setreg(portp, SCHR2, tiosp->c_cc[VSTOP]);
2863 stl_cd1400setreg(portp, SCHR3, tiosp->c_cc[VSTART]);
2864 stl_cd1400setreg(portp, SCHR4, tiosp->c_cc[VSTOP]);
2865 stl_cd1400setreg(portp, RTPR, rtpr);
2866 mcor1 = stl_cd1400getreg(portp, MSVR1);
2867 if (mcor1 & MSVR1_DCD)
2868 portp->sigs |= TIOCM_CD;
2869 else
2870 portp->sigs &= ~TIOCM_CD;
2871 stl_cd1400setreg(portp, SRER, ((srer & ~sreroff) | sreron));
2872 BRDDISABLE(portp->brdnr);
2873 spin_unlock_irqrestore(&brd_lock, flags);
2876 /*****************************************************************************/
2879 * Set the state of the DTR and RTS signals.
2882 static void stl_cd1400setsignals(struct stlport *portp, int dtr, int rts)
2884 unsigned char msvr1, msvr2;
2885 unsigned long flags;
2887 pr_debug("stl_cd1400setsignals(portp=%p,dtr=%d,rts=%d)\n",
2888 portp, dtr, rts);
2890 msvr1 = 0;
2891 msvr2 = 0;
2892 if (dtr > 0)
2893 msvr1 = MSVR1_DTR;
2894 if (rts > 0)
2895 msvr2 = MSVR2_RTS;
2897 spin_lock_irqsave(&brd_lock, flags);
2898 BRDENABLE(portp->brdnr, portp->pagenr);
2899 stl_cd1400setreg(portp, CAR, (portp->portnr & 0x03));
2900 if (rts >= 0)
2901 stl_cd1400setreg(portp, MSVR2, msvr2);
2902 if (dtr >= 0)
2903 stl_cd1400setreg(portp, MSVR1, msvr1);
2904 BRDDISABLE(portp->brdnr);
2905 spin_unlock_irqrestore(&brd_lock, flags);
2908 /*****************************************************************************/
2911 * Return the state of the signals.
2914 static int stl_cd1400getsignals(struct stlport *portp)
2916 unsigned char msvr1, msvr2;
2917 unsigned long flags;
2918 int sigs;
2920 pr_debug("stl_cd1400getsignals(portp=%p)\n", portp);
2922 spin_lock_irqsave(&brd_lock, flags);
2923 BRDENABLE(portp->brdnr, portp->pagenr);
2924 stl_cd1400setreg(portp, CAR, (portp->portnr & 0x03));
2925 msvr1 = stl_cd1400getreg(portp, MSVR1);
2926 msvr2 = stl_cd1400getreg(portp, MSVR2);
2927 BRDDISABLE(portp->brdnr);
2928 spin_unlock_irqrestore(&brd_lock, flags);
2930 sigs = 0;
2931 sigs |= (msvr1 & MSVR1_DCD) ? TIOCM_CD : 0;
2932 sigs |= (msvr1 & MSVR1_CTS) ? TIOCM_CTS : 0;
2933 sigs |= (msvr1 & MSVR1_DTR) ? TIOCM_DTR : 0;
2934 sigs |= (msvr2 & MSVR2_RTS) ? TIOCM_RTS : 0;
2935 #if 0
2936 sigs |= (msvr1 & MSVR1_RI) ? TIOCM_RI : 0;
2937 sigs |= (msvr1 & MSVR1_DSR) ? TIOCM_DSR : 0;
2938 #else
2939 sigs |= TIOCM_DSR;
2940 #endif
2941 return sigs;
2944 /*****************************************************************************/
2947 * Enable/Disable the Transmitter and/or Receiver.
2950 static void stl_cd1400enablerxtx(struct stlport *portp, int rx, int tx)
2952 unsigned char ccr;
2953 unsigned long flags;
2955 pr_debug("stl_cd1400enablerxtx(portp=%p,rx=%d,tx=%d)\n", portp, rx, tx);
2957 ccr = 0;
2959 if (tx == 0)
2960 ccr |= CCR_TXDISABLE;
2961 else if (tx > 0)
2962 ccr |= CCR_TXENABLE;
2963 if (rx == 0)
2964 ccr |= CCR_RXDISABLE;
2965 else if (rx > 0)
2966 ccr |= CCR_RXENABLE;
2968 spin_lock_irqsave(&brd_lock, flags);
2969 BRDENABLE(portp->brdnr, portp->pagenr);
2970 stl_cd1400setreg(portp, CAR, (portp->portnr & 0x03));
2971 stl_cd1400ccrwait(portp);
2972 stl_cd1400setreg(portp, CCR, ccr);
2973 stl_cd1400ccrwait(portp);
2974 BRDDISABLE(portp->brdnr);
2975 spin_unlock_irqrestore(&brd_lock, flags);
2978 /*****************************************************************************/
2981 * Start/stop the Transmitter and/or Receiver.
2984 static void stl_cd1400startrxtx(struct stlport *portp, int rx, int tx)
2986 unsigned char sreron, sreroff;
2987 unsigned long flags;
2989 pr_debug("stl_cd1400startrxtx(portp=%p,rx=%d,tx=%d)\n", portp, rx, tx);
2991 sreron = 0;
2992 sreroff = 0;
2993 if (tx == 0)
2994 sreroff |= (SRER_TXDATA | SRER_TXEMPTY);
2995 else if (tx == 1)
2996 sreron |= SRER_TXDATA;
2997 else if (tx >= 2)
2998 sreron |= SRER_TXEMPTY;
2999 if (rx == 0)
3000 sreroff |= SRER_RXDATA;
3001 else if (rx > 0)
3002 sreron |= SRER_RXDATA;
3004 spin_lock_irqsave(&brd_lock, flags);
3005 BRDENABLE(portp->brdnr, portp->pagenr);
3006 stl_cd1400setreg(portp, CAR, (portp->portnr & 0x03));
3007 stl_cd1400setreg(portp, SRER,
3008 ((stl_cd1400getreg(portp, SRER) & ~sreroff) | sreron));
3009 BRDDISABLE(portp->brdnr);
3010 if (tx > 0)
3011 set_bit(ASYI_TXBUSY, &portp->istate);
3012 spin_unlock_irqrestore(&brd_lock, flags);
3015 /*****************************************************************************/
3018 * Disable all interrupts from this port.
3021 static void stl_cd1400disableintrs(struct stlport *portp)
3023 unsigned long flags;
3025 pr_debug("stl_cd1400disableintrs(portp=%p)\n", portp);
3027 spin_lock_irqsave(&brd_lock, flags);
3028 BRDENABLE(portp->brdnr, portp->pagenr);
3029 stl_cd1400setreg(portp, CAR, (portp->portnr & 0x03));
3030 stl_cd1400setreg(portp, SRER, 0);
3031 BRDDISABLE(portp->brdnr);
3032 spin_unlock_irqrestore(&brd_lock, flags);
3035 /*****************************************************************************/
3037 static void stl_cd1400sendbreak(struct stlport *portp, int len)
3039 unsigned long flags;
3041 pr_debug("stl_cd1400sendbreak(portp=%p,len=%d)\n", portp, len);
3043 spin_lock_irqsave(&brd_lock, flags);
3044 BRDENABLE(portp->brdnr, portp->pagenr);
3045 stl_cd1400setreg(portp, CAR, (portp->portnr & 0x03));
3046 stl_cd1400setreg(portp, SRER,
3047 ((stl_cd1400getreg(portp, SRER) & ~SRER_TXDATA) |
3048 SRER_TXEMPTY));
3049 BRDDISABLE(portp->brdnr);
3050 portp->brklen = len;
3051 if (len == 1)
3052 portp->stats.txbreaks++;
3053 spin_unlock_irqrestore(&brd_lock, flags);
3056 /*****************************************************************************/
3059 * Take flow control actions...
3062 static void stl_cd1400flowctrl(struct stlport *portp, int state)
3064 struct tty_struct *tty;
3065 unsigned long flags;
3067 pr_debug("stl_cd1400flowctrl(portp=%p,state=%x)\n", portp, state);
3069 if (portp == NULL)
3070 return;
3071 tty = tty_port_tty_get(&portp->port);
3072 if (tty == NULL)
3073 return;
3075 spin_lock_irqsave(&brd_lock, flags);
3076 BRDENABLE(portp->brdnr, portp->pagenr);
3077 stl_cd1400setreg(portp, CAR, (portp->portnr & 0x03));
3079 if (state) {
3080 if (tty->termios->c_iflag & IXOFF) {
3081 stl_cd1400ccrwait(portp);
3082 stl_cd1400setreg(portp, CCR, CCR_SENDSCHR1);
3083 portp->stats.rxxon++;
3084 stl_cd1400ccrwait(portp);
3087 * Question: should we return RTS to what it was before? It may
3088 * have been set by an ioctl... Suppose not, since if you have
3089 * hardware flow control set then it is pretty silly to go and
3090 * set the RTS line by hand.
3092 if (tty->termios->c_cflag & CRTSCTS) {
3093 stl_cd1400setreg(portp, MCOR1,
3094 (stl_cd1400getreg(portp, MCOR1) |
3095 FIFO_RTSTHRESHOLD));
3096 stl_cd1400setreg(portp, MSVR2, MSVR2_RTS);
3097 portp->stats.rxrtson++;
3099 } else {
3100 if (tty->termios->c_iflag & IXOFF) {
3101 stl_cd1400ccrwait(portp);
3102 stl_cd1400setreg(portp, CCR, CCR_SENDSCHR2);
3103 portp->stats.rxxoff++;
3104 stl_cd1400ccrwait(portp);
3106 if (tty->termios->c_cflag & CRTSCTS) {
3107 stl_cd1400setreg(portp, MCOR1,
3108 (stl_cd1400getreg(portp, MCOR1) & 0xf0));
3109 stl_cd1400setreg(portp, MSVR2, 0);
3110 portp->stats.rxrtsoff++;
3114 BRDDISABLE(portp->brdnr);
3115 spin_unlock_irqrestore(&brd_lock, flags);
3116 tty_kref_put(tty);
3119 /*****************************************************************************/
3122 * Send a flow control character...
3125 static void stl_cd1400sendflow(struct stlport *portp, int state)
3127 struct tty_struct *tty;
3128 unsigned long flags;
3130 pr_debug("stl_cd1400sendflow(portp=%p,state=%x)\n", portp, state);
3132 if (portp == NULL)
3133 return;
3134 tty = tty_port_tty_get(&portp->port);
3135 if (tty == NULL)
3136 return;
3138 spin_lock_irqsave(&brd_lock, flags);
3139 BRDENABLE(portp->brdnr, portp->pagenr);
3140 stl_cd1400setreg(portp, CAR, (portp->portnr & 0x03));
3141 if (state) {
3142 stl_cd1400ccrwait(portp);
3143 stl_cd1400setreg(portp, CCR, CCR_SENDSCHR1);
3144 portp->stats.rxxon++;
3145 stl_cd1400ccrwait(portp);
3146 } else {
3147 stl_cd1400ccrwait(portp);
3148 stl_cd1400setreg(portp, CCR, CCR_SENDSCHR2);
3149 portp->stats.rxxoff++;
3150 stl_cd1400ccrwait(portp);
3152 BRDDISABLE(portp->brdnr);
3153 spin_unlock_irqrestore(&brd_lock, flags);
3154 tty_kref_put(tty);
3157 /*****************************************************************************/
3159 static void stl_cd1400flush(struct stlport *portp)
3161 unsigned long flags;
3163 pr_debug("stl_cd1400flush(portp=%p)\n", portp);
3165 if (portp == NULL)
3166 return;
3168 spin_lock_irqsave(&brd_lock, flags);
3169 BRDENABLE(portp->brdnr, portp->pagenr);
3170 stl_cd1400setreg(portp, CAR, (portp->portnr & 0x03));
3171 stl_cd1400ccrwait(portp);
3172 stl_cd1400setreg(portp, CCR, CCR_TXFLUSHFIFO);
3173 stl_cd1400ccrwait(portp);
3174 portp->tx.tail = portp->tx.head;
3175 BRDDISABLE(portp->brdnr);
3176 spin_unlock_irqrestore(&brd_lock, flags);
3179 /*****************************************************************************/
3182 * Return the current state of data flow on this port. This is only
3183 * really interresting when determining if data has fully completed
3184 * transmission or not... This is easy for the cd1400, it accurately
3185 * maintains the busy port flag.
3188 static int stl_cd1400datastate(struct stlport *portp)
3190 pr_debug("stl_cd1400datastate(portp=%p)\n", portp);
3192 if (portp == NULL)
3193 return 0;
3195 return test_bit(ASYI_TXBUSY, &portp->istate) ? 1 : 0;
3198 /*****************************************************************************/
3201 * Interrupt service routine for cd1400 EasyIO boards.
3204 static void stl_cd1400eiointr(struct stlpanel *panelp, unsigned int iobase)
3206 unsigned char svrtype;
3208 pr_debug("stl_cd1400eiointr(panelp=%p,iobase=%x)\n", panelp, iobase);
3210 spin_lock(&brd_lock);
3211 outb(SVRR, iobase);
3212 svrtype = inb(iobase + EREG_DATA);
3213 if (panelp->nrports > 4) {
3214 outb((SVRR + 0x80), iobase);
3215 svrtype |= inb(iobase + EREG_DATA);
3218 if (svrtype & SVRR_RX)
3219 stl_cd1400rxisr(panelp, iobase);
3220 else if (svrtype & SVRR_TX)
3221 stl_cd1400txisr(panelp, iobase);
3222 else if (svrtype & SVRR_MDM)
3223 stl_cd1400mdmisr(panelp, iobase);
3225 spin_unlock(&brd_lock);
3228 /*****************************************************************************/
3231 * Interrupt service routine for cd1400 panels.
3234 static void stl_cd1400echintr(struct stlpanel *panelp, unsigned int iobase)
3236 unsigned char svrtype;
3238 pr_debug("stl_cd1400echintr(panelp=%p,iobase=%x)\n", panelp, iobase);
3240 outb(SVRR, iobase);
3241 svrtype = inb(iobase + EREG_DATA);
3242 outb((SVRR + 0x80), iobase);
3243 svrtype |= inb(iobase + EREG_DATA);
3244 if (svrtype & SVRR_RX)
3245 stl_cd1400rxisr(panelp, iobase);
3246 else if (svrtype & SVRR_TX)
3247 stl_cd1400txisr(panelp, iobase);
3248 else if (svrtype & SVRR_MDM)
3249 stl_cd1400mdmisr(panelp, iobase);
3253 /*****************************************************************************/
3256 * Unfortunately we need to handle breaks in the TX data stream, since
3257 * this is the only way to generate them on the cd1400.
3260 static int stl_cd1400breakisr(struct stlport *portp, int ioaddr)
3262 if (portp->brklen == 1) {
3263 outb((COR2 + portp->uartaddr), ioaddr);
3264 outb((inb(ioaddr + EREG_DATA) | COR2_ETC),
3265 (ioaddr + EREG_DATA));
3266 outb((TDR + portp->uartaddr), ioaddr);
3267 outb(ETC_CMD, (ioaddr + EREG_DATA));
3268 outb(ETC_STARTBREAK, (ioaddr + EREG_DATA));
3269 outb((SRER + portp->uartaddr), ioaddr);
3270 outb((inb(ioaddr + EREG_DATA) & ~(SRER_TXDATA | SRER_TXEMPTY)),
3271 (ioaddr + EREG_DATA));
3272 return 1;
3273 } else if (portp->brklen > 1) {
3274 outb((TDR + portp->uartaddr), ioaddr);
3275 outb(ETC_CMD, (ioaddr + EREG_DATA));
3276 outb(ETC_STOPBREAK, (ioaddr + EREG_DATA));
3277 portp->brklen = -1;
3278 return 1;
3279 } else {
3280 outb((COR2 + portp->uartaddr), ioaddr);
3281 outb((inb(ioaddr + EREG_DATA) & ~COR2_ETC),
3282 (ioaddr + EREG_DATA));
3283 portp->brklen = 0;
3285 return 0;
3288 /*****************************************************************************/
3291 * Transmit interrupt handler. This has gotta be fast! Handling TX
3292 * chars is pretty simple, stuff as many as possible from the TX buffer
3293 * into the cd1400 FIFO. Must also handle TX breaks here, since they
3294 * are embedded as commands in the data stream. Oh no, had to use a goto!
3295 * This could be optimized more, will do when I get time...
3296 * In practice it is possible that interrupts are enabled but that the
3297 * port has been hung up. Need to handle not having any TX buffer here,
3298 * this is done by using the side effect that head and tail will also
3299 * be NULL if the buffer has been freed.
3302 static void stl_cd1400txisr(struct stlpanel *panelp, int ioaddr)
3304 struct stlport *portp;
3305 int len, stlen;
3306 char *head, *tail;
3307 unsigned char ioack, srer;
3308 struct tty_struct *tty;
3310 pr_debug("stl_cd1400txisr(panelp=%p,ioaddr=%x)\n", panelp, ioaddr);
3312 ioack = inb(ioaddr + EREG_TXACK);
3313 if (((ioack & panelp->ackmask) != 0) ||
3314 ((ioack & ACK_TYPMASK) != ACK_TYPTX)) {
3315 printk("STALLION: bad TX interrupt ack value=%x\n", ioack);
3316 return;
3318 portp = panelp->ports[(ioack >> 3)];
3321 * Unfortunately we need to handle breaks in the data stream, since
3322 * this is the only way to generate them on the cd1400. Do it now if
3323 * a break is to be sent.
3325 if (portp->brklen != 0)
3326 if (stl_cd1400breakisr(portp, ioaddr))
3327 goto stl_txalldone;
3329 head = portp->tx.head;
3330 tail = portp->tx.tail;
3331 len = (head >= tail) ? (head - tail) : (STL_TXBUFSIZE - (tail - head));
3332 if ((len == 0) || ((len < STL_TXBUFLOW) &&
3333 (test_bit(ASYI_TXLOW, &portp->istate) == 0))) {
3334 set_bit(ASYI_TXLOW, &portp->istate);
3335 tty = tty_port_tty_get(&portp->port);
3336 if (tty) {
3337 tty_wakeup(tty);
3338 tty_kref_put(tty);
3342 if (len == 0) {
3343 outb((SRER + portp->uartaddr), ioaddr);
3344 srer = inb(ioaddr + EREG_DATA);
3345 if (srer & SRER_TXDATA) {
3346 srer = (srer & ~SRER_TXDATA) | SRER_TXEMPTY;
3347 } else {
3348 srer &= ~(SRER_TXDATA | SRER_TXEMPTY);
3349 clear_bit(ASYI_TXBUSY, &portp->istate);
3351 outb(srer, (ioaddr + EREG_DATA));
3352 } else {
3353 len = min(len, CD1400_TXFIFOSIZE);
3354 portp->stats.txtotal += len;
3355 stlen = min_t(unsigned int, len,
3356 (portp->tx.buf + STL_TXBUFSIZE) - tail);
3357 outb((TDR + portp->uartaddr), ioaddr);
3358 outsb((ioaddr + EREG_DATA), tail, stlen);
3359 len -= stlen;
3360 tail += stlen;
3361 if (tail >= (portp->tx.buf + STL_TXBUFSIZE))
3362 tail = portp->tx.buf;
3363 if (len > 0) {
3364 outsb((ioaddr + EREG_DATA), tail, len);
3365 tail += len;
3367 portp->tx.tail = tail;
3370 stl_txalldone:
3371 outb((EOSRR + portp->uartaddr), ioaddr);
3372 outb(0, (ioaddr + EREG_DATA));
3375 /*****************************************************************************/
3378 * Receive character interrupt handler. Determine if we have good chars
3379 * or bad chars and then process appropriately. Good chars are easy
3380 * just shove the lot into the RX buffer and set all status byte to 0.
3381 * If a bad RX char then process as required. This routine needs to be
3382 * fast! In practice it is possible that we get an interrupt on a port
3383 * that is closed. This can happen on hangups - since they completely
3384 * shutdown a port not in user context. Need to handle this case.
3387 static void stl_cd1400rxisr(struct stlpanel *panelp, int ioaddr)
3389 struct stlport *portp;
3390 struct tty_struct *tty;
3391 unsigned int ioack, len, buflen;
3392 unsigned char status;
3393 char ch;
3395 pr_debug("stl_cd1400rxisr(panelp=%p,ioaddr=%x)\n", panelp, ioaddr);
3397 ioack = inb(ioaddr + EREG_RXACK);
3398 if ((ioack & panelp->ackmask) != 0) {
3399 printk("STALLION: bad RX interrupt ack value=%x\n", ioack);
3400 return;
3402 portp = panelp->ports[(ioack >> 3)];
3403 tty = tty_port_tty_get(&portp->port);
3405 if ((ioack & ACK_TYPMASK) == ACK_TYPRXGOOD) {
3406 outb((RDCR + portp->uartaddr), ioaddr);
3407 len = inb(ioaddr + EREG_DATA);
3408 if (tty == NULL || (buflen = tty_buffer_request_room(tty, len)) == 0) {
3409 len = min_t(unsigned int, len, sizeof(stl_unwanted));
3410 outb((RDSR + portp->uartaddr), ioaddr);
3411 insb((ioaddr + EREG_DATA), &stl_unwanted[0], len);
3412 portp->stats.rxlost += len;
3413 portp->stats.rxtotal += len;
3414 } else {
3415 len = min(len, buflen);
3416 if (len > 0) {
3417 unsigned char *ptr;
3418 outb((RDSR + portp->uartaddr), ioaddr);
3419 tty_prepare_flip_string(tty, &ptr, len);
3420 insb((ioaddr + EREG_DATA), ptr, len);
3421 tty_schedule_flip(tty);
3422 portp->stats.rxtotal += len;
3425 } else if ((ioack & ACK_TYPMASK) == ACK_TYPRXBAD) {
3426 outb((RDSR + portp->uartaddr), ioaddr);
3427 status = inb(ioaddr + EREG_DATA);
3428 ch = inb(ioaddr + EREG_DATA);
3429 if (status & ST_PARITY)
3430 portp->stats.rxparity++;
3431 if (status & ST_FRAMING)
3432 portp->stats.rxframing++;
3433 if (status & ST_OVERRUN)
3434 portp->stats.rxoverrun++;
3435 if (status & ST_BREAK)
3436 portp->stats.rxbreaks++;
3437 if (status & ST_SCHARMASK) {
3438 if ((status & ST_SCHARMASK) == ST_SCHAR1)
3439 portp->stats.txxon++;
3440 if ((status & ST_SCHARMASK) == ST_SCHAR2)
3441 portp->stats.txxoff++;
3442 goto stl_rxalldone;
3444 if (tty != NULL && (portp->rxignoremsk & status) == 0) {
3445 if (portp->rxmarkmsk & status) {
3446 if (status & ST_BREAK) {
3447 status = TTY_BREAK;
3448 if (portp->port.flags & ASYNC_SAK) {
3449 do_SAK(tty);
3450 BRDENABLE(portp->brdnr, portp->pagenr);
3452 } else if (status & ST_PARITY)
3453 status = TTY_PARITY;
3454 else if (status & ST_FRAMING)
3455 status = TTY_FRAME;
3456 else if(status & ST_OVERRUN)
3457 status = TTY_OVERRUN;
3458 else
3459 status = 0;
3460 } else
3461 status = 0;
3462 tty_insert_flip_char(tty, ch, status);
3463 tty_schedule_flip(tty);
3465 } else {
3466 printk("STALLION: bad RX interrupt ack value=%x\n", ioack);
3467 tty_kref_put(tty);
3468 return;
3471 stl_rxalldone:
3472 tty_kref_put(tty);
3473 outb((EOSRR + portp->uartaddr), ioaddr);
3474 outb(0, (ioaddr + EREG_DATA));
3477 /*****************************************************************************/
3480 * Modem interrupt handler. The is called when the modem signal line
3481 * (DCD) has changed state. Leave most of the work to the off-level
3482 * processing routine.
3485 static void stl_cd1400mdmisr(struct stlpanel *panelp, int ioaddr)
3487 struct stlport *portp;
3488 unsigned int ioack;
3489 unsigned char misr;
3491 pr_debug("stl_cd1400mdmisr(panelp=%p)\n", panelp);
3493 ioack = inb(ioaddr + EREG_MDACK);
3494 if (((ioack & panelp->ackmask) != 0) ||
3495 ((ioack & ACK_TYPMASK) != ACK_TYPMDM)) {
3496 printk("STALLION: bad MODEM interrupt ack value=%x\n", ioack);
3497 return;
3499 portp = panelp->ports[(ioack >> 3)];
3501 outb((MISR + portp->uartaddr), ioaddr);
3502 misr = inb(ioaddr + EREG_DATA);
3503 if (misr & MISR_DCD) {
3504 stl_cd_change(portp);
3505 portp->stats.modem++;
3508 outb((EOSRR + portp->uartaddr), ioaddr);
3509 outb(0, (ioaddr + EREG_DATA));
3512 /*****************************************************************************/
3513 /* SC26198 HARDWARE FUNCTIONS */
3514 /*****************************************************************************/
3517 * These functions get/set/update the registers of the sc26198 UARTs.
3518 * Access to the sc26198 registers is via an address/data io port pair.
3519 * (Maybe should make this inline...)
3522 static int stl_sc26198getreg(struct stlport *portp, int regnr)
3524 outb((regnr | portp->uartaddr), (portp->ioaddr + XP_ADDR));
3525 return inb(portp->ioaddr + XP_DATA);
3528 static void stl_sc26198setreg(struct stlport *portp, int regnr, int value)
3530 outb((regnr | portp->uartaddr), (portp->ioaddr + XP_ADDR));
3531 outb(value, (portp->ioaddr + XP_DATA));
3534 static int stl_sc26198updatereg(struct stlport *portp, int regnr, int value)
3536 outb((regnr | portp->uartaddr), (portp->ioaddr + XP_ADDR));
3537 if (inb(portp->ioaddr + XP_DATA) != value) {
3538 outb(value, (portp->ioaddr + XP_DATA));
3539 return 1;
3541 return 0;
3544 /*****************************************************************************/
3547 * Functions to get and set the sc26198 global registers.
3550 static int stl_sc26198getglobreg(struct stlport *portp, int regnr)
3552 outb(regnr, (portp->ioaddr + XP_ADDR));
3553 return inb(portp->ioaddr + XP_DATA);
3556 #if 0
3557 static void stl_sc26198setglobreg(struct stlport *portp, int regnr, int value)
3559 outb(regnr, (portp->ioaddr + XP_ADDR));
3560 outb(value, (portp->ioaddr + XP_DATA));
3562 #endif
3564 /*****************************************************************************/
3567 * Inbitialize the UARTs in a panel. We don't care what sort of board
3568 * these ports are on - since the port io registers are almost
3569 * identical when dealing with ports.
3572 static int stl_sc26198panelinit(struct stlbrd *brdp, struct stlpanel *panelp)
3574 int chipmask, i;
3575 int nrchips, ioaddr;
3577 pr_debug("stl_sc26198panelinit(brdp=%p,panelp=%p)\n", brdp, panelp);
3579 BRDENABLE(panelp->brdnr, panelp->pagenr);
3582 * Check that each chip is present and started up OK.
3584 chipmask = 0;
3585 nrchips = (panelp->nrports + 4) / SC26198_PORTS;
3586 if (brdp->brdtype == BRD_ECHPCI)
3587 outb(panelp->pagenr, brdp->ioctrl);
3589 for (i = 0; i < nrchips; i++) {
3590 ioaddr = panelp->iobase + (i * 4);
3591 outb(SCCR, (ioaddr + XP_ADDR));
3592 outb(CR_RESETALL, (ioaddr + XP_DATA));
3593 outb(TSTR, (ioaddr + XP_ADDR));
3594 if (inb(ioaddr + XP_DATA) != 0) {
3595 printk("STALLION: sc26198 not responding, "
3596 "brd=%d panel=%d chip=%d\n",
3597 panelp->brdnr, panelp->panelnr, i);
3598 continue;
3600 chipmask |= (0x1 << i);
3601 outb(GCCR, (ioaddr + XP_ADDR));
3602 outb(GCCR_IVRTYPCHANACK, (ioaddr + XP_DATA));
3603 outb(WDTRCR, (ioaddr + XP_ADDR));
3604 outb(0xff, (ioaddr + XP_DATA));
3607 BRDDISABLE(panelp->brdnr);
3608 return chipmask;
3611 /*****************************************************************************/
3614 * Initialize hardware specific port registers.
3617 static void stl_sc26198portinit(struct stlbrd *brdp, struct stlpanel *panelp, struct stlport *portp)
3619 pr_debug("stl_sc26198portinit(brdp=%p,panelp=%p,portp=%p)\n", brdp,
3620 panelp, portp);
3622 if ((brdp == NULL) || (panelp == NULL) ||
3623 (portp == NULL))
3624 return;
3626 portp->ioaddr = panelp->iobase + ((portp->portnr < 8) ? 0 : 4);
3627 portp->uartaddr = (portp->portnr & 0x07) << 4;
3628 portp->pagenr = panelp->pagenr;
3629 portp->hwid = 0x1;
3631 BRDENABLE(portp->brdnr, portp->pagenr);
3632 stl_sc26198setreg(portp, IOPCR, IOPCR_SETSIGS);
3633 BRDDISABLE(portp->brdnr);
3636 /*****************************************************************************/
3639 * Set up the sc26198 registers for a port based on the termios port
3640 * settings.
3643 static void stl_sc26198setport(struct stlport *portp, struct ktermios *tiosp)
3645 struct stlbrd *brdp;
3646 unsigned long flags;
3647 unsigned int baudrate;
3648 unsigned char mr0, mr1, mr2, clk;
3649 unsigned char imron, imroff, iopr, ipr;
3651 mr0 = 0;
3652 mr1 = 0;
3653 mr2 = 0;
3654 clk = 0;
3655 iopr = 0;
3656 imron = 0;
3657 imroff = 0;
3659 brdp = stl_brds[portp->brdnr];
3660 if (brdp == NULL)
3661 return;
3664 * Set up the RX char ignore mask with those RX error types we
3665 * can ignore.
3667 portp->rxignoremsk = 0;
3668 if (tiosp->c_iflag & IGNPAR)
3669 portp->rxignoremsk |= (SR_RXPARITY | SR_RXFRAMING |
3670 SR_RXOVERRUN);
3671 if (tiosp->c_iflag & IGNBRK)
3672 portp->rxignoremsk |= SR_RXBREAK;
3674 portp->rxmarkmsk = SR_RXOVERRUN;
3675 if (tiosp->c_iflag & (INPCK | PARMRK))
3676 portp->rxmarkmsk |= (SR_RXPARITY | SR_RXFRAMING);
3677 if (tiosp->c_iflag & BRKINT)
3678 portp->rxmarkmsk |= SR_RXBREAK;
3681 * Go through the char size, parity and stop bits and set all the
3682 * option register appropriately.
3684 switch (tiosp->c_cflag & CSIZE) {
3685 case CS5:
3686 mr1 |= MR1_CS5;
3687 break;
3688 case CS6:
3689 mr1 |= MR1_CS6;
3690 break;
3691 case CS7:
3692 mr1 |= MR1_CS7;
3693 break;
3694 default:
3695 mr1 |= MR1_CS8;
3696 break;
3699 if (tiosp->c_cflag & CSTOPB)
3700 mr2 |= MR2_STOP2;
3701 else
3702 mr2 |= MR2_STOP1;
3704 if (tiosp->c_cflag & PARENB) {
3705 if (tiosp->c_cflag & PARODD)
3706 mr1 |= (MR1_PARENB | MR1_PARODD);
3707 else
3708 mr1 |= (MR1_PARENB | MR1_PAREVEN);
3709 } else
3710 mr1 |= MR1_PARNONE;
3712 mr1 |= MR1_ERRBLOCK;
3715 * Set the RX FIFO threshold at 8 chars. This gives a bit of breathing
3716 * space for hardware flow control and the like. This should be set to
3717 * VMIN.
3719 mr2 |= MR2_RXFIFOHALF;
3722 * Calculate the baud rate timers. For now we will just assume that
3723 * the input and output baud are the same. The sc26198 has a fixed
3724 * baud rate table, so only discrete baud rates possible.
3726 baudrate = tiosp->c_cflag & CBAUD;
3727 if (baudrate & CBAUDEX) {
3728 baudrate &= ~CBAUDEX;
3729 if ((baudrate < 1) || (baudrate > 4))
3730 tiosp->c_cflag &= ~CBAUDEX;
3731 else
3732 baudrate += 15;
3734 baudrate = stl_baudrates[baudrate];
3735 if ((tiosp->c_cflag & CBAUD) == B38400) {
3736 if ((portp->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_HI)
3737 baudrate = 57600;
3738 else if ((portp->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_VHI)
3739 baudrate = 115200;
3740 else if ((portp->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_SHI)
3741 baudrate = 230400;
3742 else if ((portp->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_WARP)
3743 baudrate = 460800;
3744 else if ((portp->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST)
3745 baudrate = (portp->baud_base / portp->custom_divisor);
3747 if (baudrate > STL_SC26198MAXBAUD)
3748 baudrate = STL_SC26198MAXBAUD;
3750 if (baudrate > 0)
3751 for (clk = 0; clk < SC26198_NRBAUDS; clk++)
3752 if (baudrate <= sc26198_baudtable[clk])
3753 break;
3756 * Check what form of modem signaling is required and set it up.
3758 if (tiosp->c_cflag & CLOCAL) {
3759 portp->port.flags &= ~ASYNC_CHECK_CD;
3760 } else {
3761 iopr |= IOPR_DCDCOS;
3762 imron |= IR_IOPORT;
3763 portp->port.flags |= ASYNC_CHECK_CD;
3767 * Setup sc26198 enhanced modes if we can. In particular we want to
3768 * handle as much of the flow control as possible automatically. As
3769 * well as saving a few CPU cycles it will also greatly improve flow
3770 * control reliability.
3772 if (tiosp->c_iflag & IXON) {
3773 mr0 |= MR0_SWFTX | MR0_SWFT;
3774 imron |= IR_XONXOFF;
3775 } else
3776 imroff |= IR_XONXOFF;
3778 if (tiosp->c_iflag & IXOFF)
3779 mr0 |= MR0_SWFRX;
3781 if (tiosp->c_cflag & CRTSCTS) {
3782 mr2 |= MR2_AUTOCTS;
3783 mr1 |= MR1_AUTORTS;
3787 * All sc26198 register values calculated so go through and set
3788 * them all up.
3791 pr_debug("SETPORT: portnr=%d panelnr=%d brdnr=%d\n",
3792 portp->portnr, portp->panelnr, portp->brdnr);
3793 pr_debug(" mr0=%x mr1=%x mr2=%x clk=%x\n", mr0, mr1, mr2, clk);
3794 pr_debug(" iopr=%x imron=%x imroff=%x\n", iopr, imron, imroff);
3795 pr_debug(" schr1=%x schr2=%x schr3=%x schr4=%x\n",
3796 tiosp->c_cc[VSTART], tiosp->c_cc[VSTOP],
3797 tiosp->c_cc[VSTART], tiosp->c_cc[VSTOP]);
3799 spin_lock_irqsave(&brd_lock, flags);
3800 BRDENABLE(portp->brdnr, portp->pagenr);
3801 stl_sc26198setreg(portp, IMR, 0);
3802 stl_sc26198updatereg(portp, MR0, mr0);
3803 stl_sc26198updatereg(portp, MR1, mr1);
3804 stl_sc26198setreg(portp, SCCR, CR_RXERRBLOCK);
3805 stl_sc26198updatereg(portp, MR2, mr2);
3806 stl_sc26198updatereg(portp, IOPIOR,
3807 ((stl_sc26198getreg(portp, IOPIOR) & ~IPR_CHANGEMASK) | iopr));
3809 if (baudrate > 0) {
3810 stl_sc26198setreg(portp, TXCSR, clk);
3811 stl_sc26198setreg(portp, RXCSR, clk);
3814 stl_sc26198setreg(portp, XONCR, tiosp->c_cc[VSTART]);
3815 stl_sc26198setreg(portp, XOFFCR, tiosp->c_cc[VSTOP]);
3817 ipr = stl_sc26198getreg(portp, IPR);
3818 if (ipr & IPR_DCD)
3819 portp->sigs &= ~TIOCM_CD;
3820 else
3821 portp->sigs |= TIOCM_CD;
3823 portp->imr = (portp->imr & ~imroff) | imron;
3824 stl_sc26198setreg(portp, IMR, portp->imr);
3825 BRDDISABLE(portp->brdnr);
3826 spin_unlock_irqrestore(&brd_lock, flags);
3829 /*****************************************************************************/
3832 * Set the state of the DTR and RTS signals.
3835 static void stl_sc26198setsignals(struct stlport *portp, int dtr, int rts)
3837 unsigned char iopioron, iopioroff;
3838 unsigned long flags;
3840 pr_debug("stl_sc26198setsignals(portp=%p,dtr=%d,rts=%d)\n", portp,
3841 dtr, rts);
3843 iopioron = 0;
3844 iopioroff = 0;
3845 if (dtr == 0)
3846 iopioroff |= IPR_DTR;
3847 else if (dtr > 0)
3848 iopioron |= IPR_DTR;
3849 if (rts == 0)
3850 iopioroff |= IPR_RTS;
3851 else if (rts > 0)
3852 iopioron |= IPR_RTS;
3854 spin_lock_irqsave(&brd_lock, flags);
3855 BRDENABLE(portp->brdnr, portp->pagenr);
3856 stl_sc26198setreg(portp, IOPIOR,
3857 ((stl_sc26198getreg(portp, IOPIOR) & ~iopioroff) | iopioron));
3858 BRDDISABLE(portp->brdnr);
3859 spin_unlock_irqrestore(&brd_lock, flags);
3862 /*****************************************************************************/
3865 * Return the state of the signals.
3868 static int stl_sc26198getsignals(struct stlport *portp)
3870 unsigned char ipr;
3871 unsigned long flags;
3872 int sigs;
3874 pr_debug("stl_sc26198getsignals(portp=%p)\n", portp);
3876 spin_lock_irqsave(&brd_lock, flags);
3877 BRDENABLE(portp->brdnr, portp->pagenr);
3878 ipr = stl_sc26198getreg(portp, IPR);
3879 BRDDISABLE(portp->brdnr);
3880 spin_unlock_irqrestore(&brd_lock, flags);
3882 sigs = 0;
3883 sigs |= (ipr & IPR_DCD) ? 0 : TIOCM_CD;
3884 sigs |= (ipr & IPR_CTS) ? 0 : TIOCM_CTS;
3885 sigs |= (ipr & IPR_DTR) ? 0: TIOCM_DTR;
3886 sigs |= (ipr & IPR_RTS) ? 0: TIOCM_RTS;
3887 sigs |= TIOCM_DSR;
3888 return sigs;
3891 /*****************************************************************************/
3894 * Enable/Disable the Transmitter and/or Receiver.
3897 static void stl_sc26198enablerxtx(struct stlport *portp, int rx, int tx)
3899 unsigned char ccr;
3900 unsigned long flags;
3902 pr_debug("stl_sc26198enablerxtx(portp=%p,rx=%d,tx=%d)\n", portp, rx,tx);
3904 ccr = portp->crenable;
3905 if (tx == 0)
3906 ccr &= ~CR_TXENABLE;
3907 else if (tx > 0)
3908 ccr |= CR_TXENABLE;
3909 if (rx == 0)
3910 ccr &= ~CR_RXENABLE;
3911 else if (rx > 0)
3912 ccr |= CR_RXENABLE;
3914 spin_lock_irqsave(&brd_lock, flags);
3915 BRDENABLE(portp->brdnr, portp->pagenr);
3916 stl_sc26198setreg(portp, SCCR, ccr);
3917 BRDDISABLE(portp->brdnr);
3918 portp->crenable = ccr;
3919 spin_unlock_irqrestore(&brd_lock, flags);
3922 /*****************************************************************************/
3925 * Start/stop the Transmitter and/or Receiver.
3928 static void stl_sc26198startrxtx(struct stlport *portp, int rx, int tx)
3930 unsigned char imr;
3931 unsigned long flags;
3933 pr_debug("stl_sc26198startrxtx(portp=%p,rx=%d,tx=%d)\n", portp, rx, tx);
3935 imr = portp->imr;
3936 if (tx == 0)
3937 imr &= ~IR_TXRDY;
3938 else if (tx == 1)
3939 imr |= IR_TXRDY;
3940 if (rx == 0)
3941 imr &= ~(IR_RXRDY | IR_RXBREAK | IR_RXWATCHDOG);
3942 else if (rx > 0)
3943 imr |= IR_RXRDY | IR_RXBREAK | IR_RXWATCHDOG;
3945 spin_lock_irqsave(&brd_lock, flags);
3946 BRDENABLE(portp->brdnr, portp->pagenr);
3947 stl_sc26198setreg(portp, IMR, imr);
3948 BRDDISABLE(portp->brdnr);
3949 portp->imr = imr;
3950 if (tx > 0)
3951 set_bit(ASYI_TXBUSY, &portp->istate);
3952 spin_unlock_irqrestore(&brd_lock, flags);
3955 /*****************************************************************************/
3958 * Disable all interrupts from this port.
3961 static void stl_sc26198disableintrs(struct stlport *portp)
3963 unsigned long flags;
3965 pr_debug("stl_sc26198disableintrs(portp=%p)\n", portp);
3967 spin_lock_irqsave(&brd_lock, flags);
3968 BRDENABLE(portp->brdnr, portp->pagenr);
3969 portp->imr = 0;
3970 stl_sc26198setreg(portp, IMR, 0);
3971 BRDDISABLE(portp->brdnr);
3972 spin_unlock_irqrestore(&brd_lock, flags);
3975 /*****************************************************************************/
3977 static void stl_sc26198sendbreak(struct stlport *portp, int len)
3979 unsigned long flags;
3981 pr_debug("stl_sc26198sendbreak(portp=%p,len=%d)\n", portp, len);
3983 spin_lock_irqsave(&brd_lock, flags);
3984 BRDENABLE(portp->brdnr, portp->pagenr);
3985 if (len == 1) {
3986 stl_sc26198setreg(portp, SCCR, CR_TXSTARTBREAK);
3987 portp->stats.txbreaks++;
3988 } else
3989 stl_sc26198setreg(portp, SCCR, CR_TXSTOPBREAK);
3991 BRDDISABLE(portp->brdnr);
3992 spin_unlock_irqrestore(&brd_lock, flags);
3995 /*****************************************************************************/
3998 * Take flow control actions...
4001 static void stl_sc26198flowctrl(struct stlport *portp, int state)
4003 struct tty_struct *tty;
4004 unsigned long flags;
4005 unsigned char mr0;
4007 pr_debug("stl_sc26198flowctrl(portp=%p,state=%x)\n", portp, state);
4009 if (portp == NULL)
4010 return;
4011 tty = tty_port_tty_get(&portp->port);
4012 if (tty == NULL)
4013 return;
4015 spin_lock_irqsave(&brd_lock, flags);
4016 BRDENABLE(portp->brdnr, portp->pagenr);
4018 if (state) {
4019 if (tty->termios->c_iflag & IXOFF) {
4020 mr0 = stl_sc26198getreg(portp, MR0);
4021 stl_sc26198setreg(portp, MR0, (mr0 & ~MR0_SWFRXTX));
4022 stl_sc26198setreg(portp, SCCR, CR_TXSENDXON);
4023 mr0 |= MR0_SWFRX;
4024 portp->stats.rxxon++;
4025 stl_sc26198wait(portp);
4026 stl_sc26198setreg(portp, MR0, mr0);
4029 * Question: should we return RTS to what it was before? It may
4030 * have been set by an ioctl... Suppose not, since if you have
4031 * hardware flow control set then it is pretty silly to go and
4032 * set the RTS line by hand.
4034 if (tty->termios->c_cflag & CRTSCTS) {
4035 stl_sc26198setreg(portp, MR1,
4036 (stl_sc26198getreg(portp, MR1) | MR1_AUTORTS));
4037 stl_sc26198setreg(portp, IOPIOR,
4038 (stl_sc26198getreg(portp, IOPIOR) | IOPR_RTS));
4039 portp->stats.rxrtson++;
4041 } else {
4042 if (tty->termios->c_iflag & IXOFF) {
4043 mr0 = stl_sc26198getreg(portp, MR0);
4044 stl_sc26198setreg(portp, MR0, (mr0 & ~MR0_SWFRXTX));
4045 stl_sc26198setreg(portp, SCCR, CR_TXSENDXOFF);
4046 mr0 &= ~MR0_SWFRX;
4047 portp->stats.rxxoff++;
4048 stl_sc26198wait(portp);
4049 stl_sc26198setreg(portp, MR0, mr0);
4051 if (tty->termios->c_cflag & CRTSCTS) {
4052 stl_sc26198setreg(portp, MR1,
4053 (stl_sc26198getreg(portp, MR1) & ~MR1_AUTORTS));
4054 stl_sc26198setreg(portp, IOPIOR,
4055 (stl_sc26198getreg(portp, IOPIOR) & ~IOPR_RTS));
4056 portp->stats.rxrtsoff++;
4060 BRDDISABLE(portp->brdnr);
4061 spin_unlock_irqrestore(&brd_lock, flags);
4062 tty_kref_put(tty);
4065 /*****************************************************************************/
4068 * Send a flow control character.
4071 static void stl_sc26198sendflow(struct stlport *portp, int state)
4073 struct tty_struct *tty;
4074 unsigned long flags;
4075 unsigned char mr0;
4077 pr_debug("stl_sc26198sendflow(portp=%p,state=%x)\n", portp, state);
4079 if (portp == NULL)
4080 return;
4081 tty = tty_port_tty_get(&portp->port);
4082 if (tty == NULL)
4083 return;
4085 spin_lock_irqsave(&brd_lock, flags);
4086 BRDENABLE(portp->brdnr, portp->pagenr);
4087 if (state) {
4088 mr0 = stl_sc26198getreg(portp, MR0);
4089 stl_sc26198setreg(portp, MR0, (mr0 & ~MR0_SWFRXTX));
4090 stl_sc26198setreg(portp, SCCR, CR_TXSENDXON);
4091 mr0 |= MR0_SWFRX;
4092 portp->stats.rxxon++;
4093 stl_sc26198wait(portp);
4094 stl_sc26198setreg(portp, MR0, mr0);
4095 } else {
4096 mr0 = stl_sc26198getreg(portp, MR0);
4097 stl_sc26198setreg(portp, MR0, (mr0 & ~MR0_SWFRXTX));
4098 stl_sc26198setreg(portp, SCCR, CR_TXSENDXOFF);
4099 mr0 &= ~MR0_SWFRX;
4100 portp->stats.rxxoff++;
4101 stl_sc26198wait(portp);
4102 stl_sc26198setreg(portp, MR0, mr0);
4104 BRDDISABLE(portp->brdnr);
4105 spin_unlock_irqrestore(&brd_lock, flags);
4106 tty_kref_put(tty);
4109 /*****************************************************************************/
4111 static void stl_sc26198flush(struct stlport *portp)
4113 unsigned long flags;
4115 pr_debug("stl_sc26198flush(portp=%p)\n", portp);
4117 if (portp == NULL)
4118 return;
4120 spin_lock_irqsave(&brd_lock, flags);
4121 BRDENABLE(portp->brdnr, portp->pagenr);
4122 stl_sc26198setreg(portp, SCCR, CR_TXRESET);
4123 stl_sc26198setreg(portp, SCCR, portp->crenable);
4124 BRDDISABLE(portp->brdnr);
4125 portp->tx.tail = portp->tx.head;
4126 spin_unlock_irqrestore(&brd_lock, flags);
4129 /*****************************************************************************/
4132 * Return the current state of data flow on this port. This is only
4133 * really interresting when determining if data has fully completed
4134 * transmission or not... The sc26198 interrupt scheme cannot
4135 * determine when all data has actually drained, so we need to
4136 * check the port statusy register to be sure.
4139 static int stl_sc26198datastate(struct stlport *portp)
4141 unsigned long flags;
4142 unsigned char sr;
4144 pr_debug("stl_sc26198datastate(portp=%p)\n", portp);
4146 if (portp == NULL)
4147 return 0;
4148 if (test_bit(ASYI_TXBUSY, &portp->istate))
4149 return 1;
4151 spin_lock_irqsave(&brd_lock, flags);
4152 BRDENABLE(portp->brdnr, portp->pagenr);
4153 sr = stl_sc26198getreg(portp, SR);
4154 BRDDISABLE(portp->brdnr);
4155 spin_unlock_irqrestore(&brd_lock, flags);
4157 return (sr & SR_TXEMPTY) ? 0 : 1;
4160 /*****************************************************************************/
4163 * Delay for a small amount of time, to give the sc26198 a chance
4164 * to process a command...
4167 static void stl_sc26198wait(struct stlport *portp)
4169 int i;
4171 pr_debug("stl_sc26198wait(portp=%p)\n", portp);
4173 if (portp == NULL)
4174 return;
4176 for (i = 0; i < 20; i++)
4177 stl_sc26198getglobreg(portp, TSTR);
4180 /*****************************************************************************/
4183 * If we are TX flow controlled and in IXANY mode then we may
4184 * need to unflow control here. We gotta do this because of the
4185 * automatic flow control modes of the sc26198.
4188 static void stl_sc26198txunflow(struct stlport *portp, struct tty_struct *tty)
4190 unsigned char mr0;
4192 mr0 = stl_sc26198getreg(portp, MR0);
4193 stl_sc26198setreg(portp, MR0, (mr0 & ~MR0_SWFRXTX));
4194 stl_sc26198setreg(portp, SCCR, CR_HOSTXON);
4195 stl_sc26198wait(portp);
4196 stl_sc26198setreg(portp, MR0, mr0);
4197 clear_bit(ASYI_TXFLOWED, &portp->istate);
4200 /*****************************************************************************/
4203 * Interrupt service routine for sc26198 panels.
4206 static void stl_sc26198intr(struct stlpanel *panelp, unsigned int iobase)
4208 struct stlport *portp;
4209 unsigned int iack;
4211 spin_lock(&brd_lock);
4214 * Work around bug in sc26198 chip... Cannot have A6 address
4215 * line of UART high, else iack will be returned as 0.
4217 outb(0, (iobase + 1));
4219 iack = inb(iobase + XP_IACK);
4220 portp = panelp->ports[(iack & IVR_CHANMASK) + ((iobase & 0x4) << 1)];
4222 if (iack & IVR_RXDATA)
4223 stl_sc26198rxisr(portp, iack);
4224 else if (iack & IVR_TXDATA)
4225 stl_sc26198txisr(portp);
4226 else
4227 stl_sc26198otherisr(portp, iack);
4229 spin_unlock(&brd_lock);
4232 /*****************************************************************************/
4235 * Transmit interrupt handler. This has gotta be fast! Handling TX
4236 * chars is pretty simple, stuff as many as possible from the TX buffer
4237 * into the sc26198 FIFO.
4238 * In practice it is possible that interrupts are enabled but that the
4239 * port has been hung up. Need to handle not having any TX buffer here,
4240 * this is done by using the side effect that head and tail will also
4241 * be NULL if the buffer has been freed.
4244 static void stl_sc26198txisr(struct stlport *portp)
4246 struct tty_struct *tty;
4247 unsigned int ioaddr;
4248 unsigned char mr0;
4249 int len, stlen;
4250 char *head, *tail;
4252 pr_debug("stl_sc26198txisr(portp=%p)\n", portp);
4254 ioaddr = portp->ioaddr;
4255 head = portp->tx.head;
4256 tail = portp->tx.tail;
4257 len = (head >= tail) ? (head - tail) : (STL_TXBUFSIZE - (tail - head));
4258 if ((len == 0) || ((len < STL_TXBUFLOW) &&
4259 (test_bit(ASYI_TXLOW, &portp->istate) == 0))) {
4260 set_bit(ASYI_TXLOW, &portp->istate);
4261 tty = tty_port_tty_get(&portp->port);
4262 if (tty) {
4263 tty_wakeup(tty);
4264 tty_kref_put(tty);
4268 if (len == 0) {
4269 outb((MR0 | portp->uartaddr), (ioaddr + XP_ADDR));
4270 mr0 = inb(ioaddr + XP_DATA);
4271 if ((mr0 & MR0_TXMASK) == MR0_TXEMPTY) {
4272 portp->imr &= ~IR_TXRDY;
4273 outb((IMR | portp->uartaddr), (ioaddr + XP_ADDR));
4274 outb(portp->imr, (ioaddr + XP_DATA));
4275 clear_bit(ASYI_TXBUSY, &portp->istate);
4276 } else {
4277 mr0 |= ((mr0 & ~MR0_TXMASK) | MR0_TXEMPTY);
4278 outb(mr0, (ioaddr + XP_DATA));
4280 } else {
4281 len = min(len, SC26198_TXFIFOSIZE);
4282 portp->stats.txtotal += len;
4283 stlen = min_t(unsigned int, len,
4284 (portp->tx.buf + STL_TXBUFSIZE) - tail);
4285 outb(GTXFIFO, (ioaddr + XP_ADDR));
4286 outsb((ioaddr + XP_DATA), tail, stlen);
4287 len -= stlen;
4288 tail += stlen;
4289 if (tail >= (portp->tx.buf + STL_TXBUFSIZE))
4290 tail = portp->tx.buf;
4291 if (len > 0) {
4292 outsb((ioaddr + XP_DATA), tail, len);
4293 tail += len;
4295 portp->tx.tail = tail;
4299 /*****************************************************************************/
4302 * Receive character interrupt handler. Determine if we have good chars
4303 * or bad chars and then process appropriately. Good chars are easy
4304 * just shove the lot into the RX buffer and set all status byte to 0.
4305 * If a bad RX char then process as required. This routine needs to be
4306 * fast! In practice it is possible that we get an interrupt on a port
4307 * that is closed. This can happen on hangups - since they completely
4308 * shutdown a port not in user context. Need to handle this case.
4311 static void stl_sc26198rxisr(struct stlport *portp, unsigned int iack)
4313 struct tty_struct *tty;
4314 unsigned int len, buflen, ioaddr;
4316 pr_debug("stl_sc26198rxisr(portp=%p,iack=%x)\n", portp, iack);
4318 tty = tty_port_tty_get(&portp->port);
4319 ioaddr = portp->ioaddr;
4320 outb(GIBCR, (ioaddr + XP_ADDR));
4321 len = inb(ioaddr + XP_DATA) + 1;
4323 if ((iack & IVR_TYPEMASK) == IVR_RXDATA) {
4324 if (tty == NULL || (buflen = tty_buffer_request_room(tty, len)) == 0) {
4325 len = min_t(unsigned int, len, sizeof(stl_unwanted));
4326 outb(GRXFIFO, (ioaddr + XP_ADDR));
4327 insb((ioaddr + XP_DATA), &stl_unwanted[0], len);
4328 portp->stats.rxlost += len;
4329 portp->stats.rxtotal += len;
4330 } else {
4331 len = min(len, buflen);
4332 if (len > 0) {
4333 unsigned char *ptr;
4334 outb(GRXFIFO, (ioaddr + XP_ADDR));
4335 tty_prepare_flip_string(tty, &ptr, len);
4336 insb((ioaddr + XP_DATA), ptr, len);
4337 tty_schedule_flip(tty);
4338 portp->stats.rxtotal += len;
4341 } else {
4342 stl_sc26198rxbadchars(portp);
4346 * If we are TX flow controlled and in IXANY mode then we may need
4347 * to unflow control here. We gotta do this because of the automatic
4348 * flow control modes of the sc26198.
4350 if (test_bit(ASYI_TXFLOWED, &portp->istate)) {
4351 if ((tty != NULL) &&
4352 (tty->termios != NULL) &&
4353 (tty->termios->c_iflag & IXANY)) {
4354 stl_sc26198txunflow(portp, tty);
4357 tty_kref_put(tty);
4360 /*****************************************************************************/
4363 * Process an RX bad character.
4366 static void stl_sc26198rxbadch(struct stlport *portp, unsigned char status, char ch)
4368 struct tty_struct *tty;
4369 unsigned int ioaddr;
4371 tty = tty_port_tty_get(&portp->port);
4372 ioaddr = portp->ioaddr;
4374 if (status & SR_RXPARITY)
4375 portp->stats.rxparity++;
4376 if (status & SR_RXFRAMING)
4377 portp->stats.rxframing++;
4378 if (status & SR_RXOVERRUN)
4379 portp->stats.rxoverrun++;
4380 if (status & SR_RXBREAK)
4381 portp->stats.rxbreaks++;
4383 if ((tty != NULL) &&
4384 ((portp->rxignoremsk & status) == 0)) {
4385 if (portp->rxmarkmsk & status) {
4386 if (status & SR_RXBREAK) {
4387 status = TTY_BREAK;
4388 if (portp->port.flags & ASYNC_SAK) {
4389 do_SAK(tty);
4390 BRDENABLE(portp->brdnr, portp->pagenr);
4392 } else if (status & SR_RXPARITY)
4393 status = TTY_PARITY;
4394 else if (status & SR_RXFRAMING)
4395 status = TTY_FRAME;
4396 else if(status & SR_RXOVERRUN)
4397 status = TTY_OVERRUN;
4398 else
4399 status = 0;
4400 } else
4401 status = 0;
4403 tty_insert_flip_char(tty, ch, status);
4404 tty_schedule_flip(tty);
4406 if (status == 0)
4407 portp->stats.rxtotal++;
4409 tty_kref_put(tty);
4412 /*****************************************************************************/
4415 * Process all characters in the RX FIFO of the UART. Check all char
4416 * status bytes as well, and process as required. We need to check
4417 * all bytes in the FIFO, in case some more enter the FIFO while we
4418 * are here. To get the exact character error type we need to switch
4419 * into CHAR error mode (that is why we need to make sure we empty
4420 * the FIFO).
4423 static void stl_sc26198rxbadchars(struct stlport *portp)
4425 unsigned char status, mr1;
4426 char ch;
4429 * To get the precise error type for each character we must switch
4430 * back into CHAR error mode.
4432 mr1 = stl_sc26198getreg(portp, MR1);
4433 stl_sc26198setreg(portp, MR1, (mr1 & ~MR1_ERRBLOCK));
4435 while ((status = stl_sc26198getreg(portp, SR)) & SR_RXRDY) {
4436 stl_sc26198setreg(portp, SCCR, CR_CLEARRXERR);
4437 ch = stl_sc26198getreg(portp, RXFIFO);
4438 stl_sc26198rxbadch(portp, status, ch);
4442 * To get correct interrupt class we must switch back into BLOCK
4443 * error mode.
4445 stl_sc26198setreg(portp, MR1, mr1);
4448 /*****************************************************************************/
4451 * Other interrupt handler. This includes modem signals, flow
4452 * control actions, etc. Most stuff is left to off-level interrupt
4453 * processing time.
4456 static void stl_sc26198otherisr(struct stlport *portp, unsigned int iack)
4458 unsigned char cir, ipr, xisr;
4460 pr_debug("stl_sc26198otherisr(portp=%p,iack=%x)\n", portp, iack);
4462 cir = stl_sc26198getglobreg(portp, CIR);
4464 switch (cir & CIR_SUBTYPEMASK) {
4465 case CIR_SUBCOS:
4466 ipr = stl_sc26198getreg(portp, IPR);
4467 if (ipr & IPR_DCDCHANGE) {
4468 stl_cd_change(portp);
4469 portp->stats.modem++;
4471 break;
4472 case CIR_SUBXONXOFF:
4473 xisr = stl_sc26198getreg(portp, XISR);
4474 if (xisr & XISR_RXXONGOT) {
4475 set_bit(ASYI_TXFLOWED, &portp->istate);
4476 portp->stats.txxoff++;
4478 if (xisr & XISR_RXXOFFGOT) {
4479 clear_bit(ASYI_TXFLOWED, &portp->istate);
4480 portp->stats.txxon++;
4482 break;
4483 case CIR_SUBBREAK:
4484 stl_sc26198setreg(portp, SCCR, CR_BREAKRESET);
4485 stl_sc26198rxbadchars(portp);
4486 break;
4487 default:
4488 break;
4492 static void stl_free_isabrds(void)
4494 struct stlbrd *brdp;
4495 unsigned int i;
4497 for (i = 0; i < stl_nrbrds; i++) {
4498 if ((brdp = stl_brds[i]) == NULL || (brdp->state & STL_PROBED))
4499 continue;
4501 free_irq(brdp->irq, brdp);
4503 stl_cleanup_panels(brdp);
4505 release_region(brdp->ioaddr1, brdp->iosize1);
4506 if (brdp->iosize2 > 0)
4507 release_region(brdp->ioaddr2, brdp->iosize2);
4509 kfree(brdp);
4510 stl_brds[i] = NULL;
4515 * Loadable module initialization stuff.
4517 static int __init stallion_module_init(void)
4519 struct stlbrd *brdp;
4520 struct stlconf conf;
4521 unsigned int i, j;
4522 int retval;
4524 printk(KERN_INFO "%s: version %s\n", stl_drvtitle, stl_drvversion);
4526 spin_lock_init(&stallion_lock);
4527 spin_lock_init(&brd_lock);
4529 stl_serial = alloc_tty_driver(STL_MAXBRDS * STL_MAXPORTS);
4530 if (!stl_serial) {
4531 retval = -ENOMEM;
4532 goto err;
4535 stl_serial->owner = THIS_MODULE;
4536 stl_serial->driver_name = stl_drvname;
4537 stl_serial->name = "ttyE";
4538 stl_serial->major = STL_SERIALMAJOR;
4539 stl_serial->minor_start = 0;
4540 stl_serial->type = TTY_DRIVER_TYPE_SERIAL;
4541 stl_serial->subtype = SERIAL_TYPE_NORMAL;
4542 stl_serial->init_termios = stl_deftermios;
4543 stl_serial->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_DYNAMIC_DEV;
4544 tty_set_operations(stl_serial, &stl_ops);
4546 retval = tty_register_driver(stl_serial);
4547 if (retval) {
4548 printk("STALLION: failed to register serial driver\n");
4549 goto err_frtty;
4553 * Find any dynamically supported boards. That is via module load
4554 * line options.
4556 for (i = stl_nrbrds; i < stl_nargs; i++) {
4557 memset(&conf, 0, sizeof(conf));
4558 if (stl_parsebrd(&conf, stl_brdsp[i]) == 0)
4559 continue;
4560 if ((brdp = stl_allocbrd()) == NULL)
4561 continue;
4562 brdp->brdnr = i;
4563 brdp->brdtype = conf.brdtype;
4564 brdp->ioaddr1 = conf.ioaddr1;
4565 brdp->ioaddr2 = conf.ioaddr2;
4566 brdp->irq = conf.irq;
4567 brdp->irqtype = conf.irqtype;
4568 stl_brds[brdp->brdnr] = brdp;
4569 if (stl_brdinit(brdp)) {
4570 stl_brds[brdp->brdnr] = NULL;
4571 kfree(brdp);
4572 } else {
4573 for (j = 0; j < brdp->nrports; j++)
4574 tty_register_device(stl_serial,
4575 brdp->brdnr * STL_MAXPORTS + j, NULL);
4576 stl_nrbrds = i + 1;
4580 /* this has to be _after_ isa finding because of locking */
4581 retval = pci_register_driver(&stl_pcidriver);
4582 if (retval && stl_nrbrds == 0) {
4583 printk(KERN_ERR "STALLION: can't register pci driver\n");
4584 goto err_unrtty;
4588 * Set up a character driver for per board stuff. This is mainly used
4589 * to do stats ioctls on the ports.
4591 if (register_chrdev(STL_SIOMEMMAJOR, "staliomem", &stl_fsiomem))
4592 printk("STALLION: failed to register serial board device\n");
4594 stallion_class = class_create(THIS_MODULE, "staliomem");
4595 if (IS_ERR(stallion_class))
4596 printk("STALLION: failed to create class\n");
4597 for (i = 0; i < 4; i++)
4598 device_create(stallion_class, NULL, MKDEV(STL_SIOMEMMAJOR, i),
4599 NULL, "staliomem%d", i);
4601 return 0;
4602 err_unrtty:
4603 tty_unregister_driver(stl_serial);
4604 err_frtty:
4605 put_tty_driver(stl_serial);
4606 err:
4607 return retval;
4610 static void __exit stallion_module_exit(void)
4612 struct stlbrd *brdp;
4613 unsigned int i, j;
4615 pr_debug("cleanup_module()\n");
4617 printk(KERN_INFO "Unloading %s: version %s\n", stl_drvtitle,
4618 stl_drvversion);
4621 * Free up all allocated resources used by the ports. This includes
4622 * memory and interrupts. As part of this process we will also do
4623 * a hangup on every open port - to try to flush out any processes
4624 * hanging onto ports.
4626 for (i = 0; i < stl_nrbrds; i++) {
4627 if ((brdp = stl_brds[i]) == NULL || (brdp->state & STL_PROBED))
4628 continue;
4629 for (j = 0; j < brdp->nrports; j++)
4630 tty_unregister_device(stl_serial,
4631 brdp->brdnr * STL_MAXPORTS + j);
4634 for (i = 0; i < 4; i++)
4635 device_destroy(stallion_class, MKDEV(STL_SIOMEMMAJOR, i));
4636 unregister_chrdev(STL_SIOMEMMAJOR, "staliomem");
4637 class_destroy(stallion_class);
4639 pci_unregister_driver(&stl_pcidriver);
4641 stl_free_isabrds();
4643 tty_unregister_driver(stl_serial);
4644 put_tty_driver(stl_serial);
4647 module_init(stallion_module_init);
4648 module_exit(stallion_module_exit);
4650 MODULE_AUTHOR("Greg Ungerer");
4651 MODULE_DESCRIPTION("Stallion Multiport Serial Driver");
4652 MODULE_LICENSE("GPL");