Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/trivial
[linux-2.6/linux-acpi-2.6/ibm-acpi-2.6.git] / drivers / char / stallion.c
blob4bef6ab83622f5e0e71ed6532a7f4cca12397a1c
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,
611 .llseek = noop_llseek,
614 static struct class *stallion_class;
616 static void stl_cd_change(struct stlport *portp)
618 unsigned int oldsigs = portp->sigs;
619 struct tty_struct *tty = tty_port_tty_get(&portp->port);
621 if (!tty)
622 return;
624 portp->sigs = stl_getsignals(portp);
626 if ((portp->sigs & TIOCM_CD) && ((oldsigs & TIOCM_CD) == 0))
627 wake_up_interruptible(&portp->port.open_wait);
629 if ((oldsigs & TIOCM_CD) && ((portp->sigs & TIOCM_CD) == 0))
630 if (portp->port.flags & ASYNC_CHECK_CD)
631 tty_hangup(tty);
632 tty_kref_put(tty);
636 * Check for any arguments passed in on the module load command line.
639 /*****************************************************************************/
642 * Parse the supplied argument string, into the board conf struct.
645 static int __init stl_parsebrd(struct stlconf *confp, char **argp)
647 char *sp;
648 unsigned int i;
650 pr_debug("stl_parsebrd(confp=%p,argp=%p)\n", confp, argp);
652 if ((argp[0] == NULL) || (*argp[0] == 0))
653 return 0;
655 for (sp = argp[0], i = 0; (*sp != 0) && (i < 25); sp++, i++)
656 *sp = tolower(*sp);
658 for (i = 0; i < ARRAY_SIZE(stl_brdstr); i++)
659 if (strcmp(stl_brdstr[i].name, argp[0]) == 0)
660 break;
662 if (i == ARRAY_SIZE(stl_brdstr)) {
663 printk("STALLION: unknown board name, %s?\n", argp[0]);
664 return 0;
667 confp->brdtype = stl_brdstr[i].type;
669 i = 1;
670 if ((argp[i] != NULL) && (*argp[i] != 0))
671 confp->ioaddr1 = simple_strtoul(argp[i], NULL, 0);
672 i++;
673 if (confp->brdtype == BRD_ECH) {
674 if ((argp[i] != NULL) && (*argp[i] != 0))
675 confp->ioaddr2 = simple_strtoul(argp[i], NULL, 0);
676 i++;
678 if ((argp[i] != NULL) && (*argp[i] != 0))
679 confp->irq = simple_strtoul(argp[i], NULL, 0);
680 return 1;
683 /*****************************************************************************/
686 * Allocate a new board structure. Fill out the basic info in it.
689 static struct stlbrd *stl_allocbrd(void)
691 struct stlbrd *brdp;
693 brdp = kzalloc(sizeof(struct stlbrd), GFP_KERNEL);
694 if (!brdp) {
695 printk("STALLION: failed to allocate memory (size=%Zd)\n",
696 sizeof(struct stlbrd));
697 return NULL;
700 brdp->magic = STL_BOARDMAGIC;
701 return brdp;
704 /*****************************************************************************/
706 static int stl_activate(struct tty_port *port, struct tty_struct *tty)
708 struct stlport *portp = container_of(port, struct stlport, port);
709 if (!portp->tx.buf) {
710 portp->tx.buf = kmalloc(STL_TXBUFSIZE, GFP_KERNEL);
711 if (!portp->tx.buf)
712 return -ENOMEM;
713 portp->tx.head = portp->tx.buf;
714 portp->tx.tail = portp->tx.buf;
716 stl_setport(portp, tty->termios);
717 portp->sigs = stl_getsignals(portp);
718 stl_setsignals(portp, 1, 1);
719 stl_enablerxtx(portp, 1, 1);
720 stl_startrxtx(portp, 1, 0);
721 return 0;
724 static int stl_open(struct tty_struct *tty, struct file *filp)
726 struct stlport *portp;
727 struct stlbrd *brdp;
728 unsigned int minordev, brdnr, panelnr;
729 int portnr;
731 pr_debug("stl_open(tty=%p,filp=%p): device=%s\n", tty, filp, tty->name);
733 minordev = tty->index;
734 brdnr = MINOR2BRD(minordev);
735 if (brdnr >= stl_nrbrds)
736 return -ENODEV;
737 brdp = stl_brds[brdnr];
738 if (brdp == NULL)
739 return -ENODEV;
741 minordev = MINOR2PORT(minordev);
742 for (portnr = -1, panelnr = 0; panelnr < STL_MAXPANELS; panelnr++) {
743 if (brdp->panels[panelnr] == NULL)
744 break;
745 if (minordev < brdp->panels[panelnr]->nrports) {
746 portnr = minordev;
747 break;
749 minordev -= brdp->panels[panelnr]->nrports;
751 if (portnr < 0)
752 return -ENODEV;
754 portp = brdp->panels[panelnr]->ports[portnr];
755 if (portp == NULL)
756 return -ENODEV;
758 tty->driver_data = portp;
759 return tty_port_open(&portp->port, tty, filp);
763 /*****************************************************************************/
765 static int stl_carrier_raised(struct tty_port *port)
767 struct stlport *portp = container_of(port, struct stlport, port);
768 return (portp->sigs & TIOCM_CD) ? 1 : 0;
771 static void stl_dtr_rts(struct tty_port *port, int on)
773 struct stlport *portp = container_of(port, struct stlport, port);
774 /* Takes brd_lock internally */
775 stl_setsignals(portp, on, on);
778 /*****************************************************************************/
780 static void stl_flushbuffer(struct tty_struct *tty)
782 struct stlport *portp;
784 pr_debug("stl_flushbuffer(tty=%p)\n", tty);
786 portp = tty->driver_data;
787 if (portp == NULL)
788 return;
790 stl_flush(portp);
791 tty_wakeup(tty);
794 /*****************************************************************************/
796 static void stl_waituntilsent(struct tty_struct *tty, int timeout)
798 struct stlport *portp;
799 unsigned long tend;
801 pr_debug("stl_waituntilsent(tty=%p,timeout=%d)\n", tty, timeout);
803 portp = tty->driver_data;
804 if (portp == NULL)
805 return;
807 if (timeout == 0)
808 timeout = HZ;
809 tend = jiffies + timeout;
811 while (stl_datastate(portp)) {
812 if (signal_pending(current))
813 break;
814 msleep_interruptible(20);
815 if (time_after_eq(jiffies, tend))
816 break;
820 /*****************************************************************************/
822 static void stl_shutdown(struct tty_port *port)
824 struct stlport *portp = container_of(port, struct stlport, port);
825 stl_disableintrs(portp);
826 stl_enablerxtx(portp, 0, 0);
827 stl_flush(portp);
828 portp->istate = 0;
829 if (portp->tx.buf != NULL) {
830 kfree(portp->tx.buf);
831 portp->tx.buf = NULL;
832 portp->tx.head = NULL;
833 portp->tx.tail = NULL;
837 static void stl_close(struct tty_struct *tty, struct file *filp)
839 struct stlport*portp;
840 pr_debug("stl_close(tty=%p,filp=%p)\n", tty, filp);
842 portp = tty->driver_data;
843 if(portp == NULL)
844 return;
845 tty_port_close(&portp->port, tty, filp);
848 /*****************************************************************************/
851 * Write routine. Take data and stuff it in to the TX ring queue.
852 * If transmit interrupts are not running then start them.
855 static int stl_write(struct tty_struct *tty, const unsigned char *buf, int count)
857 struct stlport *portp;
858 unsigned int len, stlen;
859 unsigned char *chbuf;
860 char *head, *tail;
862 pr_debug("stl_write(tty=%p,buf=%p,count=%d)\n", tty, buf, count);
864 portp = tty->driver_data;
865 if (portp == NULL)
866 return 0;
867 if (portp->tx.buf == NULL)
868 return 0;
871 * If copying direct from user space we must cater for page faults,
872 * causing us to "sleep" here for a while. To handle this copy in all
873 * the data we need now, into a local buffer. Then when we got it all
874 * copy it into the TX buffer.
876 chbuf = (unsigned char *) buf;
878 head = portp->tx.head;
879 tail = portp->tx.tail;
880 if (head >= tail) {
881 len = STL_TXBUFSIZE - (head - tail) - 1;
882 stlen = STL_TXBUFSIZE - (head - portp->tx.buf);
883 } else {
884 len = tail - head - 1;
885 stlen = len;
888 len = min(len, (unsigned int)count);
889 count = 0;
890 while (len > 0) {
891 stlen = min(len, stlen);
892 memcpy(head, chbuf, stlen);
893 len -= stlen;
894 chbuf += stlen;
895 count += stlen;
896 head += stlen;
897 if (head >= (portp->tx.buf + STL_TXBUFSIZE)) {
898 head = portp->tx.buf;
899 stlen = tail - head;
902 portp->tx.head = head;
904 clear_bit(ASYI_TXLOW, &portp->istate);
905 stl_startrxtx(portp, -1, 1);
907 return count;
910 /*****************************************************************************/
912 static int stl_putchar(struct tty_struct *tty, unsigned char ch)
914 struct stlport *portp;
915 unsigned int len;
916 char *head, *tail;
918 pr_debug("stl_putchar(tty=%p,ch=%x)\n", tty, ch);
920 portp = tty->driver_data;
921 if (portp == NULL)
922 return -EINVAL;
923 if (portp->tx.buf == NULL)
924 return -EINVAL;
926 head = portp->tx.head;
927 tail = portp->tx.tail;
929 len = (head >= tail) ? (STL_TXBUFSIZE - (head - tail)) : (tail - head);
930 len--;
932 if (len > 0) {
933 *head++ = ch;
934 if (head >= (portp->tx.buf + STL_TXBUFSIZE))
935 head = portp->tx.buf;
937 portp->tx.head = head;
938 return 0;
941 /*****************************************************************************/
944 * If there are any characters in the buffer then make sure that TX
945 * interrupts are on and get'em out. Normally used after the putchar
946 * routine has been called.
949 static void stl_flushchars(struct tty_struct *tty)
951 struct stlport *portp;
953 pr_debug("stl_flushchars(tty=%p)\n", tty);
955 portp = tty->driver_data;
956 if (portp == NULL)
957 return;
958 if (portp->tx.buf == NULL)
959 return;
961 stl_startrxtx(portp, -1, 1);
964 /*****************************************************************************/
966 static int stl_writeroom(struct tty_struct *tty)
968 struct stlport *portp;
969 char *head, *tail;
971 pr_debug("stl_writeroom(tty=%p)\n", tty);
973 portp = tty->driver_data;
974 if (portp == NULL)
975 return 0;
976 if (portp->tx.buf == NULL)
977 return 0;
979 head = portp->tx.head;
980 tail = portp->tx.tail;
981 return (head >= tail) ? (STL_TXBUFSIZE - (head - tail) - 1) : (tail - head - 1);
984 /*****************************************************************************/
987 * Return number of chars in the TX buffer. Normally we would just
988 * calculate the number of chars in the buffer and return that, but if
989 * the buffer is empty and TX interrupts are still on then we return
990 * that the buffer still has 1 char in it. This way whoever called us
991 * will not think that ALL chars have drained - since the UART still
992 * must have some chars in it (we are busy after all).
995 static int stl_charsinbuffer(struct tty_struct *tty)
997 struct stlport *portp;
998 unsigned int size;
999 char *head, *tail;
1001 pr_debug("stl_charsinbuffer(tty=%p)\n", tty);
1003 portp = tty->driver_data;
1004 if (portp == NULL)
1005 return 0;
1006 if (portp->tx.buf == NULL)
1007 return 0;
1009 head = portp->tx.head;
1010 tail = portp->tx.tail;
1011 size = (head >= tail) ? (head - tail) : (STL_TXBUFSIZE - (tail - head));
1012 if ((size == 0) && test_bit(ASYI_TXBUSY, &portp->istate))
1013 size = 1;
1014 return size;
1017 /*****************************************************************************/
1020 * Generate the serial struct info.
1023 static int stl_getserial(struct stlport *portp, struct serial_struct __user *sp)
1025 struct serial_struct sio;
1026 struct stlbrd *brdp;
1028 pr_debug("stl_getserial(portp=%p,sp=%p)\n", portp, sp);
1030 memset(&sio, 0, sizeof(struct serial_struct));
1032 mutex_lock(&portp->port.mutex);
1033 sio.line = portp->portnr;
1034 sio.port = portp->ioaddr;
1035 sio.flags = portp->port.flags;
1036 sio.baud_base = portp->baud_base;
1037 sio.close_delay = portp->close_delay;
1038 sio.closing_wait = portp->closing_wait;
1039 sio.custom_divisor = portp->custom_divisor;
1040 sio.hub6 = 0;
1041 if (portp->uartp == &stl_cd1400uart) {
1042 sio.type = PORT_CIRRUS;
1043 sio.xmit_fifo_size = CD1400_TXFIFOSIZE;
1044 } else {
1045 sio.type = PORT_UNKNOWN;
1046 sio.xmit_fifo_size = SC26198_TXFIFOSIZE;
1049 brdp = stl_brds[portp->brdnr];
1050 if (brdp != NULL)
1051 sio.irq = brdp->irq;
1052 mutex_unlock(&portp->port.mutex);
1054 return copy_to_user(sp, &sio, sizeof(struct serial_struct)) ? -EFAULT : 0;
1057 /*****************************************************************************/
1060 * Set port according to the serial struct info.
1061 * At this point we do not do any auto-configure stuff, so we will
1062 * just quietly ignore any requests to change irq, etc.
1065 static int stl_setserial(struct tty_struct *tty, struct serial_struct __user *sp)
1067 struct stlport * portp = tty->driver_data;
1068 struct serial_struct sio;
1070 pr_debug("stl_setserial(portp=%p,sp=%p)\n", portp, sp);
1072 if (copy_from_user(&sio, sp, sizeof(struct serial_struct)))
1073 return -EFAULT;
1074 mutex_lock(&portp->port.mutex);
1075 if (!capable(CAP_SYS_ADMIN)) {
1076 if ((sio.baud_base != portp->baud_base) ||
1077 (sio.close_delay != portp->close_delay) ||
1078 ((sio.flags & ~ASYNC_USR_MASK) !=
1079 (portp->port.flags & ~ASYNC_USR_MASK))) {
1080 mutex_unlock(&portp->port.mutex);
1081 return -EPERM;
1085 portp->port.flags = (portp->port.flags & ~ASYNC_USR_MASK) |
1086 (sio.flags & ASYNC_USR_MASK);
1087 portp->baud_base = sio.baud_base;
1088 portp->close_delay = sio.close_delay;
1089 portp->closing_wait = sio.closing_wait;
1090 portp->custom_divisor = sio.custom_divisor;
1091 mutex_unlock(&portp->port.mutex);
1092 stl_setport(portp, tty->termios);
1093 return 0;
1096 /*****************************************************************************/
1098 static int stl_tiocmget(struct tty_struct *tty, struct file *file)
1100 struct stlport *portp;
1102 portp = tty->driver_data;
1103 if (portp == NULL)
1104 return -ENODEV;
1105 if (tty->flags & (1 << TTY_IO_ERROR))
1106 return -EIO;
1108 return stl_getsignals(portp);
1111 static int stl_tiocmset(struct tty_struct *tty, struct file *file,
1112 unsigned int set, unsigned int clear)
1114 struct stlport *portp;
1115 int rts = -1, dtr = -1;
1117 portp = tty->driver_data;
1118 if (portp == NULL)
1119 return -ENODEV;
1120 if (tty->flags & (1 << TTY_IO_ERROR))
1121 return -EIO;
1123 if (set & TIOCM_RTS)
1124 rts = 1;
1125 if (set & TIOCM_DTR)
1126 dtr = 1;
1127 if (clear & TIOCM_RTS)
1128 rts = 0;
1129 if (clear & TIOCM_DTR)
1130 dtr = 0;
1132 stl_setsignals(portp, dtr, rts);
1133 return 0;
1136 static int stl_ioctl(struct tty_struct *tty, struct file *file, unsigned int cmd, unsigned long arg)
1138 struct stlport *portp;
1139 int rc;
1140 void __user *argp = (void __user *)arg;
1142 pr_debug("stl_ioctl(tty=%p,file=%p,cmd=%x,arg=%lx)\n", tty, file, cmd,
1143 arg);
1145 portp = tty->driver_data;
1146 if (portp == NULL)
1147 return -ENODEV;
1149 if ((cmd != TIOCGSERIAL) && (cmd != TIOCSSERIAL) &&
1150 (cmd != COM_GETPORTSTATS) && (cmd != COM_CLRPORTSTATS))
1151 if (tty->flags & (1 << TTY_IO_ERROR))
1152 return -EIO;
1154 rc = 0;
1156 switch (cmd) {
1157 case TIOCGSERIAL:
1158 rc = stl_getserial(portp, argp);
1159 break;
1160 case TIOCSSERIAL:
1161 rc = stl_setserial(tty, argp);
1162 break;
1163 case COM_GETPORTSTATS:
1164 rc = stl_getportstats(tty, portp, argp);
1165 break;
1166 case COM_CLRPORTSTATS:
1167 rc = stl_clrportstats(portp, argp);
1168 break;
1169 case TIOCSERCONFIG:
1170 case TIOCSERGWILD:
1171 case TIOCSERSWILD:
1172 case TIOCSERGETLSR:
1173 case TIOCSERGSTRUCT:
1174 case TIOCSERGETMULTI:
1175 case TIOCSERSETMULTI:
1176 default:
1177 rc = -ENOIOCTLCMD;
1178 break;
1180 return rc;
1183 /*****************************************************************************/
1186 * Start the transmitter again. Just turn TX interrupts back on.
1189 static void stl_start(struct tty_struct *tty)
1191 struct stlport *portp;
1193 pr_debug("stl_start(tty=%p)\n", tty);
1195 portp = tty->driver_data;
1196 if (portp == NULL)
1197 return;
1198 stl_startrxtx(portp, -1, 1);
1201 /*****************************************************************************/
1203 static void stl_settermios(struct tty_struct *tty, struct ktermios *old)
1205 struct stlport *portp;
1206 struct ktermios *tiosp;
1208 pr_debug("stl_settermios(tty=%p,old=%p)\n", tty, old);
1210 portp = tty->driver_data;
1211 if (portp == NULL)
1212 return;
1214 tiosp = tty->termios;
1215 if ((tiosp->c_cflag == old->c_cflag) &&
1216 (tiosp->c_iflag == old->c_iflag))
1217 return;
1219 stl_setport(portp, tiosp);
1220 stl_setsignals(portp, ((tiosp->c_cflag & (CBAUD & ~CBAUDEX)) ? 1 : 0),
1221 -1);
1222 if ((old->c_cflag & CRTSCTS) && ((tiosp->c_cflag & CRTSCTS) == 0)) {
1223 tty->hw_stopped = 0;
1224 stl_start(tty);
1226 if (((old->c_cflag & CLOCAL) == 0) && (tiosp->c_cflag & CLOCAL))
1227 wake_up_interruptible(&portp->port.open_wait);
1230 /*****************************************************************************/
1233 * Attempt to flow control who ever is sending us data. Based on termios
1234 * settings use software or/and hardware flow control.
1237 static void stl_throttle(struct tty_struct *tty)
1239 struct stlport *portp;
1241 pr_debug("stl_throttle(tty=%p)\n", tty);
1243 portp = tty->driver_data;
1244 if (portp == NULL)
1245 return;
1246 stl_flowctrl(portp, 0);
1249 /*****************************************************************************/
1252 * Unflow control the device sending us data...
1255 static void stl_unthrottle(struct tty_struct *tty)
1257 struct stlport *portp;
1259 pr_debug("stl_unthrottle(tty=%p)\n", tty);
1261 portp = tty->driver_data;
1262 if (portp == NULL)
1263 return;
1264 stl_flowctrl(portp, 1);
1267 /*****************************************************************************/
1270 * Stop the transmitter. Basically to do this we will just turn TX
1271 * interrupts off.
1274 static void stl_stop(struct tty_struct *tty)
1276 struct stlport *portp;
1278 pr_debug("stl_stop(tty=%p)\n", tty);
1280 portp = tty->driver_data;
1281 if (portp == NULL)
1282 return;
1283 stl_startrxtx(portp, -1, 0);
1286 /*****************************************************************************/
1289 * Hangup this port. This is pretty much like closing the port, only
1290 * a little more brutal. No waiting for data to drain. Shutdown the
1291 * port and maybe drop signals.
1294 static void stl_hangup(struct tty_struct *tty)
1296 struct stlport *portp = tty->driver_data;
1297 pr_debug("stl_hangup(tty=%p)\n", tty);
1299 if (portp == NULL)
1300 return;
1301 tty_port_hangup(&portp->port);
1304 /*****************************************************************************/
1306 static int stl_breakctl(struct tty_struct *tty, int state)
1308 struct stlport *portp;
1310 pr_debug("stl_breakctl(tty=%p,state=%d)\n", tty, state);
1312 portp = tty->driver_data;
1313 if (portp == NULL)
1314 return -EINVAL;
1316 stl_sendbreak(portp, ((state == -1) ? 1 : 2));
1317 return 0;
1320 /*****************************************************************************/
1322 static void stl_sendxchar(struct tty_struct *tty, char ch)
1324 struct stlport *portp;
1326 pr_debug("stl_sendxchar(tty=%p,ch=%x)\n", tty, ch);
1328 portp = tty->driver_data;
1329 if (portp == NULL)
1330 return;
1332 if (ch == STOP_CHAR(tty))
1333 stl_sendflow(portp, 0);
1334 else if (ch == START_CHAR(tty))
1335 stl_sendflow(portp, 1);
1336 else
1337 stl_putchar(tty, ch);
1340 static void stl_portinfo(struct seq_file *m, struct stlport *portp, int portnr)
1342 int sigs;
1343 char sep;
1345 seq_printf(m, "%d: uart:%s tx:%d rx:%d",
1346 portnr, (portp->hwid == 1) ? "SC26198" : "CD1400",
1347 (int) portp->stats.txtotal, (int) portp->stats.rxtotal);
1349 if (portp->stats.rxframing)
1350 seq_printf(m, " fe:%d", (int) portp->stats.rxframing);
1351 if (portp->stats.rxparity)
1352 seq_printf(m, " pe:%d", (int) portp->stats.rxparity);
1353 if (portp->stats.rxbreaks)
1354 seq_printf(m, " brk:%d", (int) portp->stats.rxbreaks);
1355 if (portp->stats.rxoverrun)
1356 seq_printf(m, " oe:%d", (int) portp->stats.rxoverrun);
1358 sigs = stl_getsignals(portp);
1359 sep = ' ';
1360 if (sigs & TIOCM_RTS) {
1361 seq_printf(m, "%c%s", sep, "RTS");
1362 sep = '|';
1364 if (sigs & TIOCM_CTS) {
1365 seq_printf(m, "%c%s", sep, "CTS");
1366 sep = '|';
1368 if (sigs & TIOCM_DTR) {
1369 seq_printf(m, "%c%s", sep, "DTR");
1370 sep = '|';
1372 if (sigs & TIOCM_CD) {
1373 seq_printf(m, "%c%s", sep, "DCD");
1374 sep = '|';
1376 if (sigs & TIOCM_DSR) {
1377 seq_printf(m, "%c%s", sep, "DSR");
1378 sep = '|';
1380 seq_putc(m, '\n');
1383 /*****************************************************************************/
1386 * Port info, read from the /proc file system.
1389 static int stl_proc_show(struct seq_file *m, void *v)
1391 struct stlbrd *brdp;
1392 struct stlpanel *panelp;
1393 struct stlport *portp;
1394 unsigned int brdnr, panelnr, portnr;
1395 int totalport;
1397 totalport = 0;
1399 seq_printf(m, "%s: version %s\n", stl_drvtitle, stl_drvversion);
1402 * We scan through for each board, panel and port. The offset is
1403 * calculated on the fly, and irrelevant ports are skipped.
1405 for (brdnr = 0; brdnr < stl_nrbrds; brdnr++) {
1406 brdp = stl_brds[brdnr];
1407 if (brdp == NULL)
1408 continue;
1409 if (brdp->state == 0)
1410 continue;
1412 totalport = brdnr * STL_MAXPORTS;
1413 for (panelnr = 0; panelnr < brdp->nrpanels; panelnr++) {
1414 panelp = brdp->panels[panelnr];
1415 if (panelp == NULL)
1416 continue;
1418 for (portnr = 0; portnr < panelp->nrports; portnr++,
1419 totalport++) {
1420 portp = panelp->ports[portnr];
1421 if (portp == NULL)
1422 continue;
1423 stl_portinfo(m, portp, totalport);
1427 return 0;
1430 static int stl_proc_open(struct inode *inode, struct file *file)
1432 return single_open(file, stl_proc_show, NULL);
1435 static const struct file_operations stl_proc_fops = {
1436 .owner = THIS_MODULE,
1437 .open = stl_proc_open,
1438 .read = seq_read,
1439 .llseek = seq_lseek,
1440 .release = single_release,
1443 /*****************************************************************************/
1446 * All board interrupts are vectored through here first. This code then
1447 * calls off to the approrpriate board interrupt handlers.
1450 static irqreturn_t stl_intr(int irq, void *dev_id)
1452 struct stlbrd *brdp = dev_id;
1454 pr_debug("stl_intr(brdp=%p,irq=%d)\n", brdp, brdp->irq);
1456 return IRQ_RETVAL((* brdp->isr)(brdp));
1459 /*****************************************************************************/
1462 * Interrupt service routine for EasyIO board types.
1465 static int stl_eiointr(struct stlbrd *brdp)
1467 struct stlpanel *panelp;
1468 unsigned int iobase;
1469 int handled = 0;
1471 spin_lock(&brd_lock);
1472 panelp = brdp->panels[0];
1473 iobase = panelp->iobase;
1474 while (inb(brdp->iostatus) & EIO_INTRPEND) {
1475 handled = 1;
1476 (* panelp->isr)(panelp, iobase);
1478 spin_unlock(&brd_lock);
1479 return handled;
1482 /*****************************************************************************/
1485 * Interrupt service routine for ECH-AT board types.
1488 static int stl_echatintr(struct stlbrd *brdp)
1490 struct stlpanel *panelp;
1491 unsigned int ioaddr, bnknr;
1492 int handled = 0;
1494 outb((brdp->ioctrlval | ECH_BRDENABLE), brdp->ioctrl);
1496 while (inb(brdp->iostatus) & ECH_INTRPEND) {
1497 handled = 1;
1498 for (bnknr = 0; bnknr < brdp->nrbnks; bnknr++) {
1499 ioaddr = brdp->bnkstataddr[bnknr];
1500 if (inb(ioaddr) & ECH_PNLINTRPEND) {
1501 panelp = brdp->bnk2panel[bnknr];
1502 (* panelp->isr)(panelp, (ioaddr & 0xfffc));
1507 outb((brdp->ioctrlval | ECH_BRDDISABLE), brdp->ioctrl);
1509 return handled;
1512 /*****************************************************************************/
1515 * Interrupt service routine for ECH-MCA board types.
1518 static int stl_echmcaintr(struct stlbrd *brdp)
1520 struct stlpanel *panelp;
1521 unsigned int ioaddr, bnknr;
1522 int handled = 0;
1524 while (inb(brdp->iostatus) & ECH_INTRPEND) {
1525 handled = 1;
1526 for (bnknr = 0; bnknr < brdp->nrbnks; bnknr++) {
1527 ioaddr = brdp->bnkstataddr[bnknr];
1528 if (inb(ioaddr) & ECH_PNLINTRPEND) {
1529 panelp = brdp->bnk2panel[bnknr];
1530 (* panelp->isr)(panelp, (ioaddr & 0xfffc));
1534 return handled;
1537 /*****************************************************************************/
1540 * Interrupt service routine for ECH-PCI board types.
1543 static int stl_echpciintr(struct stlbrd *brdp)
1545 struct stlpanel *panelp;
1546 unsigned int ioaddr, bnknr, recheck;
1547 int handled = 0;
1549 while (1) {
1550 recheck = 0;
1551 for (bnknr = 0; bnknr < brdp->nrbnks; bnknr++) {
1552 outb(brdp->bnkpageaddr[bnknr], brdp->ioctrl);
1553 ioaddr = brdp->bnkstataddr[bnknr];
1554 if (inb(ioaddr) & ECH_PNLINTRPEND) {
1555 panelp = brdp->bnk2panel[bnknr];
1556 (* panelp->isr)(panelp, (ioaddr & 0xfffc));
1557 recheck++;
1558 handled = 1;
1561 if (! recheck)
1562 break;
1564 return handled;
1567 /*****************************************************************************/
1570 * Interrupt service routine for ECH-8/64-PCI board types.
1573 static int stl_echpci64intr(struct stlbrd *brdp)
1575 struct stlpanel *panelp;
1576 unsigned int ioaddr, bnknr;
1577 int handled = 0;
1579 while (inb(brdp->ioctrl) & 0x1) {
1580 handled = 1;
1581 for (bnknr = 0; bnknr < brdp->nrbnks; bnknr++) {
1582 ioaddr = brdp->bnkstataddr[bnknr];
1583 if (inb(ioaddr) & ECH_PNLINTRPEND) {
1584 panelp = brdp->bnk2panel[bnknr];
1585 (* panelp->isr)(panelp, (ioaddr & 0xfffc));
1590 return handled;
1593 /*****************************************************************************/
1596 * Initialize all the ports on a panel.
1599 static int __devinit stl_initports(struct stlbrd *brdp, struct stlpanel *panelp)
1601 struct stlport *portp;
1602 unsigned int i;
1603 int chipmask;
1605 pr_debug("stl_initports(brdp=%p,panelp=%p)\n", brdp, panelp);
1607 chipmask = stl_panelinit(brdp, panelp);
1610 * All UART's are initialized (if found!). Now go through and setup
1611 * each ports data structures.
1613 for (i = 0; i < panelp->nrports; i++) {
1614 portp = kzalloc(sizeof(struct stlport), GFP_KERNEL);
1615 if (!portp) {
1616 printk("STALLION: failed to allocate memory "
1617 "(size=%Zd)\n", sizeof(struct stlport));
1618 break;
1620 tty_port_init(&portp->port);
1621 portp->port.ops = &stl_port_ops;
1622 portp->magic = STL_PORTMAGIC;
1623 portp->portnr = i;
1624 portp->brdnr = panelp->brdnr;
1625 portp->panelnr = panelp->panelnr;
1626 portp->uartp = panelp->uartp;
1627 portp->clk = brdp->clk;
1628 portp->baud_base = STL_BAUDBASE;
1629 portp->close_delay = STL_CLOSEDELAY;
1630 portp->closing_wait = 30 * HZ;
1631 init_waitqueue_head(&portp->port.open_wait);
1632 init_waitqueue_head(&portp->port.close_wait);
1633 portp->stats.brd = portp->brdnr;
1634 portp->stats.panel = portp->panelnr;
1635 portp->stats.port = portp->portnr;
1636 panelp->ports[i] = portp;
1637 stl_portinit(brdp, panelp, portp);
1640 return 0;
1643 static void stl_cleanup_panels(struct stlbrd *brdp)
1645 struct stlpanel *panelp;
1646 struct stlport *portp;
1647 unsigned int j, k;
1648 struct tty_struct *tty;
1650 for (j = 0; j < STL_MAXPANELS; j++) {
1651 panelp = brdp->panels[j];
1652 if (panelp == NULL)
1653 continue;
1654 for (k = 0; k < STL_PORTSPERPANEL; k++) {
1655 portp = panelp->ports[k];
1656 if (portp == NULL)
1657 continue;
1658 tty = tty_port_tty_get(&portp->port);
1659 if (tty != NULL) {
1660 stl_hangup(tty);
1661 tty_kref_put(tty);
1663 kfree(portp->tx.buf);
1664 kfree(portp);
1666 kfree(panelp);
1670 /*****************************************************************************/
1673 * Try to find and initialize an EasyIO board.
1676 static int __devinit stl_initeio(struct stlbrd *brdp)
1678 struct stlpanel *panelp;
1679 unsigned int status;
1680 char *name;
1681 int retval;
1683 pr_debug("stl_initeio(brdp=%p)\n", brdp);
1685 brdp->ioctrl = brdp->ioaddr1 + 1;
1686 brdp->iostatus = brdp->ioaddr1 + 2;
1688 status = inb(brdp->iostatus);
1689 if ((status & EIO_IDBITMASK) == EIO_MK3)
1690 brdp->ioctrl++;
1693 * Handle board specific stuff now. The real difference is PCI
1694 * or not PCI.
1696 if (brdp->brdtype == BRD_EASYIOPCI) {
1697 brdp->iosize1 = 0x80;
1698 brdp->iosize2 = 0x80;
1699 name = "serial(EIO-PCI)";
1700 outb(0x41, (brdp->ioaddr2 + 0x4c));
1701 } else {
1702 brdp->iosize1 = 8;
1703 name = "serial(EIO)";
1704 if ((brdp->irq < 0) || (brdp->irq > 15) ||
1705 (stl_vecmap[brdp->irq] == (unsigned char) 0xff)) {
1706 printk("STALLION: invalid irq=%d for brd=%d\n",
1707 brdp->irq, brdp->brdnr);
1708 retval = -EINVAL;
1709 goto err;
1711 outb((stl_vecmap[brdp->irq] | EIO_0WS |
1712 ((brdp->irqtype) ? EIO_INTLEVEL : EIO_INTEDGE)),
1713 brdp->ioctrl);
1716 retval = -EBUSY;
1717 if (!request_region(brdp->ioaddr1, brdp->iosize1, name)) {
1718 printk(KERN_WARNING "STALLION: Warning, board %d I/O address "
1719 "%x conflicts with another device\n", brdp->brdnr,
1720 brdp->ioaddr1);
1721 goto err;
1724 if (brdp->iosize2 > 0)
1725 if (!request_region(brdp->ioaddr2, brdp->iosize2, name)) {
1726 printk(KERN_WARNING "STALLION: Warning, board %d I/O "
1727 "address %x conflicts with another device\n",
1728 brdp->brdnr, brdp->ioaddr2);
1729 printk(KERN_WARNING "STALLION: Warning, also "
1730 "releasing board %d I/O address %x \n",
1731 brdp->brdnr, brdp->ioaddr1);
1732 goto err_rel1;
1736 * Everything looks OK, so let's go ahead and probe for the hardware.
1738 brdp->clk = CD1400_CLK;
1739 brdp->isr = stl_eiointr;
1741 retval = -ENODEV;
1742 switch (status & EIO_IDBITMASK) {
1743 case EIO_8PORTM:
1744 brdp->clk = CD1400_CLK8M;
1745 /* fall thru */
1746 case EIO_8PORTRS:
1747 case EIO_8PORTDI:
1748 brdp->nrports = 8;
1749 break;
1750 case EIO_4PORTRS:
1751 brdp->nrports = 4;
1752 break;
1753 case EIO_MK3:
1754 switch (status & EIO_BRDMASK) {
1755 case ID_BRD4:
1756 brdp->nrports = 4;
1757 break;
1758 case ID_BRD8:
1759 brdp->nrports = 8;
1760 break;
1761 case ID_BRD16:
1762 brdp->nrports = 16;
1763 break;
1764 default:
1765 goto err_rel2;
1767 break;
1768 default:
1769 goto err_rel2;
1773 * We have verified that the board is actually present, so now we
1774 * can complete the setup.
1777 panelp = kzalloc(sizeof(struct stlpanel), GFP_KERNEL);
1778 if (!panelp) {
1779 printk(KERN_WARNING "STALLION: failed to allocate memory "
1780 "(size=%Zd)\n", sizeof(struct stlpanel));
1781 retval = -ENOMEM;
1782 goto err_rel2;
1785 panelp->magic = STL_PANELMAGIC;
1786 panelp->brdnr = brdp->brdnr;
1787 panelp->panelnr = 0;
1788 panelp->nrports = brdp->nrports;
1789 panelp->iobase = brdp->ioaddr1;
1790 panelp->hwid = status;
1791 if ((status & EIO_IDBITMASK) == EIO_MK3) {
1792 panelp->uartp = &stl_sc26198uart;
1793 panelp->isr = stl_sc26198intr;
1794 } else {
1795 panelp->uartp = &stl_cd1400uart;
1796 panelp->isr = stl_cd1400eiointr;
1799 brdp->panels[0] = panelp;
1800 brdp->nrpanels = 1;
1801 brdp->state |= BRD_FOUND;
1802 brdp->hwid = status;
1803 if (request_irq(brdp->irq, stl_intr, IRQF_SHARED, name, brdp) != 0) {
1804 printk("STALLION: failed to register interrupt "
1805 "routine for %s irq=%d\n", name, brdp->irq);
1806 retval = -ENODEV;
1807 goto err_fr;
1810 return 0;
1811 err_fr:
1812 stl_cleanup_panels(brdp);
1813 err_rel2:
1814 if (brdp->iosize2 > 0)
1815 release_region(brdp->ioaddr2, brdp->iosize2);
1816 err_rel1:
1817 release_region(brdp->ioaddr1, brdp->iosize1);
1818 err:
1819 return retval;
1822 /*****************************************************************************/
1825 * Try to find an ECH board and initialize it. This code is capable of
1826 * dealing with all types of ECH board.
1829 static int __devinit stl_initech(struct stlbrd *brdp)
1831 struct stlpanel *panelp;
1832 unsigned int status, nxtid, ioaddr, conflict, panelnr, banknr, i;
1833 int retval;
1834 char *name;
1836 pr_debug("stl_initech(brdp=%p)\n", brdp);
1838 status = 0;
1839 conflict = 0;
1842 * Set up the initial board register contents for boards. This varies a
1843 * bit between the different board types. So we need to handle each
1844 * separately. Also do a check that the supplied IRQ is good.
1846 switch (brdp->brdtype) {
1848 case BRD_ECH:
1849 brdp->isr = stl_echatintr;
1850 brdp->ioctrl = brdp->ioaddr1 + 1;
1851 brdp->iostatus = brdp->ioaddr1 + 1;
1852 status = inb(brdp->iostatus);
1853 if ((status & ECH_IDBITMASK) != ECH_ID) {
1854 retval = -ENODEV;
1855 goto err;
1857 if ((brdp->irq < 0) || (brdp->irq > 15) ||
1858 (stl_vecmap[brdp->irq] == (unsigned char) 0xff)) {
1859 printk("STALLION: invalid irq=%d for brd=%d\n",
1860 brdp->irq, brdp->brdnr);
1861 retval = -EINVAL;
1862 goto err;
1864 status = ((brdp->ioaddr2 & ECH_ADDR2MASK) >> 1);
1865 status |= (stl_vecmap[brdp->irq] << 1);
1866 outb((status | ECH_BRDRESET), brdp->ioaddr1);
1867 brdp->ioctrlval = ECH_INTENABLE |
1868 ((brdp->irqtype) ? ECH_INTLEVEL : ECH_INTEDGE);
1869 for (i = 0; i < 10; i++)
1870 outb((brdp->ioctrlval | ECH_BRDENABLE), brdp->ioctrl);
1871 brdp->iosize1 = 2;
1872 brdp->iosize2 = 32;
1873 name = "serial(EC8/32)";
1874 outb(status, brdp->ioaddr1);
1875 break;
1877 case BRD_ECHMC:
1878 brdp->isr = stl_echmcaintr;
1879 brdp->ioctrl = brdp->ioaddr1 + 0x20;
1880 brdp->iostatus = brdp->ioctrl;
1881 status = inb(brdp->iostatus);
1882 if ((status & ECH_IDBITMASK) != ECH_ID) {
1883 retval = -ENODEV;
1884 goto err;
1886 if ((brdp->irq < 0) || (brdp->irq > 15) ||
1887 (stl_vecmap[brdp->irq] == (unsigned char) 0xff)) {
1888 printk("STALLION: invalid irq=%d for brd=%d\n",
1889 brdp->irq, brdp->brdnr);
1890 retval = -EINVAL;
1891 goto err;
1893 outb(ECHMC_BRDRESET, brdp->ioctrl);
1894 outb(ECHMC_INTENABLE, brdp->ioctrl);
1895 brdp->iosize1 = 64;
1896 name = "serial(EC8/32-MC)";
1897 break;
1899 case BRD_ECHPCI:
1900 brdp->isr = stl_echpciintr;
1901 brdp->ioctrl = brdp->ioaddr1 + 2;
1902 brdp->iosize1 = 4;
1903 brdp->iosize2 = 8;
1904 name = "serial(EC8/32-PCI)";
1905 break;
1907 case BRD_ECH64PCI:
1908 brdp->isr = stl_echpci64intr;
1909 brdp->ioctrl = brdp->ioaddr2 + 0x40;
1910 outb(0x43, (brdp->ioaddr1 + 0x4c));
1911 brdp->iosize1 = 0x80;
1912 brdp->iosize2 = 0x80;
1913 name = "serial(EC8/64-PCI)";
1914 break;
1916 default:
1917 printk("STALLION: unknown board type=%d\n", brdp->brdtype);
1918 retval = -EINVAL;
1919 goto err;
1923 * Check boards for possible IO address conflicts and return fail status
1924 * if an IO conflict found.
1926 retval = -EBUSY;
1927 if (!request_region(brdp->ioaddr1, brdp->iosize1, name)) {
1928 printk(KERN_WARNING "STALLION: Warning, board %d I/O address "
1929 "%x conflicts with another device\n", brdp->brdnr,
1930 brdp->ioaddr1);
1931 goto err;
1934 if (brdp->iosize2 > 0)
1935 if (!request_region(brdp->ioaddr2, brdp->iosize2, name)) {
1936 printk(KERN_WARNING "STALLION: Warning, board %d I/O "
1937 "address %x conflicts with another device\n",
1938 brdp->brdnr, brdp->ioaddr2);
1939 printk(KERN_WARNING "STALLION: Warning, also "
1940 "releasing board %d I/O address %x \n",
1941 brdp->brdnr, brdp->ioaddr1);
1942 goto err_rel1;
1946 * Scan through the secondary io address space looking for panels.
1947 * As we find'em allocate and initialize panel structures for each.
1949 brdp->clk = CD1400_CLK;
1950 brdp->hwid = status;
1952 ioaddr = brdp->ioaddr2;
1953 banknr = 0;
1954 panelnr = 0;
1955 nxtid = 0;
1957 for (i = 0; i < STL_MAXPANELS; i++) {
1958 if (brdp->brdtype == BRD_ECHPCI) {
1959 outb(nxtid, brdp->ioctrl);
1960 ioaddr = brdp->ioaddr2;
1962 status = inb(ioaddr + ECH_PNLSTATUS);
1963 if ((status & ECH_PNLIDMASK) != nxtid)
1964 break;
1965 panelp = kzalloc(sizeof(struct stlpanel), GFP_KERNEL);
1966 if (!panelp) {
1967 printk("STALLION: failed to allocate memory "
1968 "(size=%Zd)\n", sizeof(struct stlpanel));
1969 retval = -ENOMEM;
1970 goto err_fr;
1972 panelp->magic = STL_PANELMAGIC;
1973 panelp->brdnr = brdp->brdnr;
1974 panelp->panelnr = panelnr;
1975 panelp->iobase = ioaddr;
1976 panelp->pagenr = nxtid;
1977 panelp->hwid = status;
1978 brdp->bnk2panel[banknr] = panelp;
1979 brdp->bnkpageaddr[banknr] = nxtid;
1980 brdp->bnkstataddr[banknr++] = ioaddr + ECH_PNLSTATUS;
1982 if (status & ECH_PNLXPID) {
1983 panelp->uartp = &stl_sc26198uart;
1984 panelp->isr = stl_sc26198intr;
1985 if (status & ECH_PNL16PORT) {
1986 panelp->nrports = 16;
1987 brdp->bnk2panel[banknr] = panelp;
1988 brdp->bnkpageaddr[banknr] = nxtid;
1989 brdp->bnkstataddr[banknr++] = ioaddr + 4 +
1990 ECH_PNLSTATUS;
1991 } else
1992 panelp->nrports = 8;
1993 } else {
1994 panelp->uartp = &stl_cd1400uart;
1995 panelp->isr = stl_cd1400echintr;
1996 if (status & ECH_PNL16PORT) {
1997 panelp->nrports = 16;
1998 panelp->ackmask = 0x80;
1999 if (brdp->brdtype != BRD_ECHPCI)
2000 ioaddr += EREG_BANKSIZE;
2001 brdp->bnk2panel[banknr] = panelp;
2002 brdp->bnkpageaddr[banknr] = ++nxtid;
2003 brdp->bnkstataddr[banknr++] = ioaddr +
2004 ECH_PNLSTATUS;
2005 } else {
2006 panelp->nrports = 8;
2007 panelp->ackmask = 0xc0;
2011 nxtid++;
2012 ioaddr += EREG_BANKSIZE;
2013 brdp->nrports += panelp->nrports;
2014 brdp->panels[panelnr++] = panelp;
2015 if ((brdp->brdtype != BRD_ECHPCI) &&
2016 (ioaddr >= (brdp->ioaddr2 + brdp->iosize2))) {
2017 retval = -EINVAL;
2018 goto err_fr;
2022 brdp->nrpanels = panelnr;
2023 brdp->nrbnks = banknr;
2024 if (brdp->brdtype == BRD_ECH)
2025 outb((brdp->ioctrlval | ECH_BRDDISABLE), brdp->ioctrl);
2027 brdp->state |= BRD_FOUND;
2028 if (request_irq(brdp->irq, stl_intr, IRQF_SHARED, name, brdp) != 0) {
2029 printk("STALLION: failed to register interrupt "
2030 "routine for %s irq=%d\n", name, brdp->irq);
2031 retval = -ENODEV;
2032 goto err_fr;
2035 return 0;
2036 err_fr:
2037 stl_cleanup_panels(brdp);
2038 if (brdp->iosize2 > 0)
2039 release_region(brdp->ioaddr2, brdp->iosize2);
2040 err_rel1:
2041 release_region(brdp->ioaddr1, brdp->iosize1);
2042 err:
2043 return retval;
2046 /*****************************************************************************/
2049 * Initialize and configure the specified board.
2050 * Scan through all the boards in the configuration and see what we
2051 * can find. Handle EIO and the ECH boards a little differently here
2052 * since the initial search and setup is very different.
2055 static int __devinit stl_brdinit(struct stlbrd *brdp)
2057 int i, retval;
2059 pr_debug("stl_brdinit(brdp=%p)\n", brdp);
2061 switch (brdp->brdtype) {
2062 case BRD_EASYIO:
2063 case BRD_EASYIOPCI:
2064 retval = stl_initeio(brdp);
2065 if (retval)
2066 goto err;
2067 break;
2068 case BRD_ECH:
2069 case BRD_ECHMC:
2070 case BRD_ECHPCI:
2071 case BRD_ECH64PCI:
2072 retval = stl_initech(brdp);
2073 if (retval)
2074 goto err;
2075 break;
2076 default:
2077 printk("STALLION: board=%d is unknown board type=%d\n",
2078 brdp->brdnr, brdp->brdtype);
2079 retval = -ENODEV;
2080 goto err;
2083 if ((brdp->state & BRD_FOUND) == 0) {
2084 printk("STALLION: %s board not found, board=%d io=%x irq=%d\n",
2085 stl_brdnames[brdp->brdtype], brdp->brdnr,
2086 brdp->ioaddr1, brdp->irq);
2087 goto err_free;
2090 for (i = 0; i < STL_MAXPANELS; i++)
2091 if (brdp->panels[i] != NULL)
2092 stl_initports(brdp, brdp->panels[i]);
2094 printk("STALLION: %s found, board=%d io=%x irq=%d "
2095 "nrpanels=%d nrports=%d\n", stl_brdnames[brdp->brdtype],
2096 brdp->brdnr, brdp->ioaddr1, brdp->irq, brdp->nrpanels,
2097 brdp->nrports);
2099 return 0;
2100 err_free:
2101 free_irq(brdp->irq, brdp);
2103 stl_cleanup_panels(brdp);
2105 release_region(brdp->ioaddr1, brdp->iosize1);
2106 if (brdp->iosize2 > 0)
2107 release_region(brdp->ioaddr2, brdp->iosize2);
2108 err:
2109 return retval;
2112 /*****************************************************************************/
2115 * Find the next available board number that is free.
2118 static int __devinit stl_getbrdnr(void)
2120 unsigned int i;
2122 for (i = 0; i < STL_MAXBRDS; i++)
2123 if (stl_brds[i] == NULL) {
2124 if (i >= stl_nrbrds)
2125 stl_nrbrds = i + 1;
2126 return i;
2129 return -1;
2132 /*****************************************************************************/
2134 * We have a Stallion board. Allocate a board structure and
2135 * initialize it. Read its IO and IRQ resources from PCI
2136 * configuration space.
2139 static int __devinit stl_pciprobe(struct pci_dev *pdev,
2140 const struct pci_device_id *ent)
2142 struct stlbrd *brdp;
2143 unsigned int i, brdtype = ent->driver_data;
2144 int brdnr, retval = -ENODEV;
2146 if ((pdev->class >> 8) == PCI_CLASS_STORAGE_IDE)
2147 goto err;
2149 retval = pci_enable_device(pdev);
2150 if (retval)
2151 goto err;
2152 brdp = stl_allocbrd();
2153 if (brdp == NULL) {
2154 retval = -ENOMEM;
2155 goto err;
2157 mutex_lock(&stl_brdslock);
2158 brdnr = stl_getbrdnr();
2159 if (brdnr < 0) {
2160 dev_err(&pdev->dev, "too many boards found, "
2161 "maximum supported %d\n", STL_MAXBRDS);
2162 mutex_unlock(&stl_brdslock);
2163 retval = -ENODEV;
2164 goto err_fr;
2166 brdp->brdnr = (unsigned int)brdnr;
2167 stl_brds[brdp->brdnr] = brdp;
2168 mutex_unlock(&stl_brdslock);
2170 brdp->brdtype = brdtype;
2171 brdp->state |= STL_PROBED;
2174 * We have all resources from the board, so let's setup the actual
2175 * board structure now.
2177 switch (brdtype) {
2178 case BRD_ECHPCI:
2179 brdp->ioaddr2 = pci_resource_start(pdev, 0);
2180 brdp->ioaddr1 = pci_resource_start(pdev, 1);
2181 break;
2182 case BRD_ECH64PCI:
2183 brdp->ioaddr2 = pci_resource_start(pdev, 2);
2184 brdp->ioaddr1 = pci_resource_start(pdev, 1);
2185 break;
2186 case BRD_EASYIOPCI:
2187 brdp->ioaddr1 = pci_resource_start(pdev, 2);
2188 brdp->ioaddr2 = pci_resource_start(pdev, 1);
2189 break;
2190 default:
2191 dev_err(&pdev->dev, "unknown PCI board type=%u\n", brdtype);
2192 break;
2195 brdp->irq = pdev->irq;
2196 retval = stl_brdinit(brdp);
2197 if (retval)
2198 goto err_null;
2200 pci_set_drvdata(pdev, brdp);
2202 for (i = 0; i < brdp->nrports; i++)
2203 tty_register_device(stl_serial,
2204 brdp->brdnr * STL_MAXPORTS + i, &pdev->dev);
2206 return 0;
2207 err_null:
2208 stl_brds[brdp->brdnr] = NULL;
2209 err_fr:
2210 kfree(brdp);
2211 err:
2212 return retval;
2215 static void __devexit stl_pciremove(struct pci_dev *pdev)
2217 struct stlbrd *brdp = pci_get_drvdata(pdev);
2218 unsigned int i;
2220 free_irq(brdp->irq, brdp);
2222 stl_cleanup_panels(brdp);
2224 release_region(brdp->ioaddr1, brdp->iosize1);
2225 if (brdp->iosize2 > 0)
2226 release_region(brdp->ioaddr2, brdp->iosize2);
2228 for (i = 0; i < brdp->nrports; i++)
2229 tty_unregister_device(stl_serial,
2230 brdp->brdnr * STL_MAXPORTS + i);
2232 stl_brds[brdp->brdnr] = NULL;
2233 kfree(brdp);
2236 static struct pci_driver stl_pcidriver = {
2237 .name = "stallion",
2238 .id_table = stl_pcibrds,
2239 .probe = stl_pciprobe,
2240 .remove = __devexit_p(stl_pciremove)
2243 /*****************************************************************************/
2246 * Return the board stats structure to user app.
2249 static int stl_getbrdstats(combrd_t __user *bp)
2251 combrd_t stl_brdstats;
2252 struct stlbrd *brdp;
2253 struct stlpanel *panelp;
2254 unsigned int i;
2256 if (copy_from_user(&stl_brdstats, bp, sizeof(combrd_t)))
2257 return -EFAULT;
2258 if (stl_brdstats.brd >= STL_MAXBRDS)
2259 return -ENODEV;
2260 brdp = stl_brds[stl_brdstats.brd];
2261 if (brdp == NULL)
2262 return -ENODEV;
2264 memset(&stl_brdstats, 0, sizeof(combrd_t));
2265 stl_brdstats.brd = brdp->brdnr;
2266 stl_brdstats.type = brdp->brdtype;
2267 stl_brdstats.hwid = brdp->hwid;
2268 stl_brdstats.state = brdp->state;
2269 stl_brdstats.ioaddr = brdp->ioaddr1;
2270 stl_brdstats.ioaddr2 = brdp->ioaddr2;
2271 stl_brdstats.irq = brdp->irq;
2272 stl_brdstats.nrpanels = brdp->nrpanels;
2273 stl_brdstats.nrports = brdp->nrports;
2274 for (i = 0; i < brdp->nrpanels; i++) {
2275 panelp = brdp->panels[i];
2276 stl_brdstats.panels[i].panel = i;
2277 stl_brdstats.panels[i].hwid = panelp->hwid;
2278 stl_brdstats.panels[i].nrports = panelp->nrports;
2281 return copy_to_user(bp, &stl_brdstats, sizeof(combrd_t)) ? -EFAULT : 0;
2284 /*****************************************************************************/
2287 * Resolve the referenced port number into a port struct pointer.
2290 static struct stlport *stl_getport(int brdnr, int panelnr, int portnr)
2292 struct stlbrd *brdp;
2293 struct stlpanel *panelp;
2295 if (brdnr < 0 || brdnr >= STL_MAXBRDS)
2296 return NULL;
2297 brdp = stl_brds[brdnr];
2298 if (brdp == NULL)
2299 return NULL;
2300 if (panelnr < 0 || (unsigned int)panelnr >= brdp->nrpanels)
2301 return NULL;
2302 panelp = brdp->panels[panelnr];
2303 if (panelp == NULL)
2304 return NULL;
2305 if (portnr < 0 || (unsigned int)portnr >= panelp->nrports)
2306 return NULL;
2307 return panelp->ports[portnr];
2310 /*****************************************************************************/
2313 * Return the port stats structure to user app. A NULL port struct
2314 * pointer passed in means that we need to find out from the app
2315 * what port to get stats for (used through board control device).
2318 static int stl_getportstats(struct tty_struct *tty, struct stlport *portp, comstats_t __user *cp)
2320 comstats_t stl_comstats;
2321 unsigned char *head, *tail;
2322 unsigned long flags;
2324 if (!portp) {
2325 if (copy_from_user(&stl_comstats, cp, sizeof(comstats_t)))
2326 return -EFAULT;
2327 portp = stl_getport(stl_comstats.brd, stl_comstats.panel,
2328 stl_comstats.port);
2329 if (portp == NULL)
2330 return -ENODEV;
2333 mutex_lock(&portp->port.mutex);
2334 portp->stats.state = portp->istate;
2335 portp->stats.flags = portp->port.flags;
2336 portp->stats.hwid = portp->hwid;
2338 portp->stats.ttystate = 0;
2339 portp->stats.cflags = 0;
2340 portp->stats.iflags = 0;
2341 portp->stats.oflags = 0;
2342 portp->stats.lflags = 0;
2343 portp->stats.rxbuffered = 0;
2345 spin_lock_irqsave(&stallion_lock, flags);
2346 if (tty != NULL && portp->port.tty == tty) {
2347 portp->stats.ttystate = tty->flags;
2348 /* No longer available as a statistic */
2349 portp->stats.rxbuffered = 1; /*tty->flip.count; */
2350 if (tty->termios != NULL) {
2351 portp->stats.cflags = tty->termios->c_cflag;
2352 portp->stats.iflags = tty->termios->c_iflag;
2353 portp->stats.oflags = tty->termios->c_oflag;
2354 portp->stats.lflags = tty->termios->c_lflag;
2357 spin_unlock_irqrestore(&stallion_lock, flags);
2359 head = portp->tx.head;
2360 tail = portp->tx.tail;
2361 portp->stats.txbuffered = (head >= tail) ? (head - tail) :
2362 (STL_TXBUFSIZE - (tail - head));
2364 portp->stats.signals = (unsigned long) stl_getsignals(portp);
2365 mutex_unlock(&portp->port.mutex);
2367 return copy_to_user(cp, &portp->stats,
2368 sizeof(comstats_t)) ? -EFAULT : 0;
2371 /*****************************************************************************/
2374 * Clear the port stats structure. We also return it zeroed out...
2377 static int stl_clrportstats(struct stlport *portp, comstats_t __user *cp)
2379 comstats_t stl_comstats;
2381 if (!portp) {
2382 if (copy_from_user(&stl_comstats, cp, sizeof(comstats_t)))
2383 return -EFAULT;
2384 portp = stl_getport(stl_comstats.brd, stl_comstats.panel,
2385 stl_comstats.port);
2386 if (portp == NULL)
2387 return -ENODEV;
2390 mutex_lock(&portp->port.mutex);
2391 memset(&portp->stats, 0, sizeof(comstats_t));
2392 portp->stats.brd = portp->brdnr;
2393 portp->stats.panel = portp->panelnr;
2394 portp->stats.port = portp->portnr;
2395 mutex_unlock(&portp->port.mutex);
2396 return copy_to_user(cp, &portp->stats,
2397 sizeof(comstats_t)) ? -EFAULT : 0;
2400 /*****************************************************************************/
2403 * Return the entire driver ports structure to a user app.
2406 static int stl_getportstruct(struct stlport __user *arg)
2408 struct stlport stl_dummyport;
2409 struct stlport *portp;
2411 if (copy_from_user(&stl_dummyport, arg, sizeof(struct stlport)))
2412 return -EFAULT;
2413 portp = stl_getport(stl_dummyport.brdnr, stl_dummyport.panelnr,
2414 stl_dummyport.portnr);
2415 if (!portp)
2416 return -ENODEV;
2417 return copy_to_user(arg, portp, sizeof(struct stlport)) ? -EFAULT : 0;
2420 /*****************************************************************************/
2423 * Return the entire driver board structure to a user app.
2426 static int stl_getbrdstruct(struct stlbrd __user *arg)
2428 struct stlbrd stl_dummybrd;
2429 struct stlbrd *brdp;
2431 if (copy_from_user(&stl_dummybrd, arg, sizeof(struct stlbrd)))
2432 return -EFAULT;
2433 if (stl_dummybrd.brdnr >= STL_MAXBRDS)
2434 return -ENODEV;
2435 brdp = stl_brds[stl_dummybrd.brdnr];
2436 if (!brdp)
2437 return -ENODEV;
2438 return copy_to_user(arg, brdp, sizeof(struct stlbrd)) ? -EFAULT : 0;
2441 /*****************************************************************************/
2444 * The "staliomem" device is also required to do some special operations
2445 * on the board and/or ports. In this driver it is mostly used for stats
2446 * collection.
2449 static long stl_memioctl(struct file *fp, unsigned int cmd, unsigned long arg)
2451 int brdnr, rc;
2452 void __user *argp = (void __user *)arg;
2454 pr_debug("stl_memioctl(fp=%p,cmd=%x,arg=%lx)\n", fp, cmd,arg);
2456 brdnr = iminor(fp->f_dentry->d_inode);
2457 if (brdnr >= STL_MAXBRDS)
2458 return -ENODEV;
2459 rc = 0;
2461 switch (cmd) {
2462 case COM_GETPORTSTATS:
2463 rc = stl_getportstats(NULL, NULL, argp);
2464 break;
2465 case COM_CLRPORTSTATS:
2466 rc = stl_clrportstats(NULL, argp);
2467 break;
2468 case COM_GETBRDSTATS:
2469 rc = stl_getbrdstats(argp);
2470 break;
2471 case COM_READPORT:
2472 rc = stl_getportstruct(argp);
2473 break;
2474 case COM_READBOARD:
2475 rc = stl_getbrdstruct(argp);
2476 break;
2477 default:
2478 rc = -ENOIOCTLCMD;
2479 break;
2481 return rc;
2484 static const struct tty_operations stl_ops = {
2485 .open = stl_open,
2486 .close = stl_close,
2487 .write = stl_write,
2488 .put_char = stl_putchar,
2489 .flush_chars = stl_flushchars,
2490 .write_room = stl_writeroom,
2491 .chars_in_buffer = stl_charsinbuffer,
2492 .ioctl = stl_ioctl,
2493 .set_termios = stl_settermios,
2494 .throttle = stl_throttle,
2495 .unthrottle = stl_unthrottle,
2496 .stop = stl_stop,
2497 .start = stl_start,
2498 .hangup = stl_hangup,
2499 .flush_buffer = stl_flushbuffer,
2500 .break_ctl = stl_breakctl,
2501 .wait_until_sent = stl_waituntilsent,
2502 .send_xchar = stl_sendxchar,
2503 .tiocmget = stl_tiocmget,
2504 .tiocmset = stl_tiocmset,
2505 .proc_fops = &stl_proc_fops,
2508 static const struct tty_port_operations stl_port_ops = {
2509 .carrier_raised = stl_carrier_raised,
2510 .dtr_rts = stl_dtr_rts,
2511 .activate = stl_activate,
2512 .shutdown = stl_shutdown,
2515 /*****************************************************************************/
2516 /* CD1400 HARDWARE FUNCTIONS */
2517 /*****************************************************************************/
2520 * These functions get/set/update the registers of the cd1400 UARTs.
2521 * Access to the cd1400 registers is via an address/data io port pair.
2522 * (Maybe should make this inline...)
2525 static int stl_cd1400getreg(struct stlport *portp, int regnr)
2527 outb((regnr + portp->uartaddr), portp->ioaddr);
2528 return inb(portp->ioaddr + EREG_DATA);
2531 static void stl_cd1400setreg(struct stlport *portp, int regnr, int value)
2533 outb(regnr + portp->uartaddr, portp->ioaddr);
2534 outb(value, portp->ioaddr + EREG_DATA);
2537 static int stl_cd1400updatereg(struct stlport *portp, int regnr, int value)
2539 outb(regnr + portp->uartaddr, portp->ioaddr);
2540 if (inb(portp->ioaddr + EREG_DATA) != value) {
2541 outb(value, portp->ioaddr + EREG_DATA);
2542 return 1;
2544 return 0;
2547 /*****************************************************************************/
2550 * Inbitialize the UARTs in a panel. We don't care what sort of board
2551 * these ports are on - since the port io registers are almost
2552 * identical when dealing with ports.
2555 static int stl_cd1400panelinit(struct stlbrd *brdp, struct stlpanel *panelp)
2557 unsigned int gfrcr;
2558 int chipmask, i, j;
2559 int nrchips, uartaddr, ioaddr;
2560 unsigned long flags;
2562 pr_debug("stl_panelinit(brdp=%p,panelp=%p)\n", brdp, panelp);
2564 spin_lock_irqsave(&brd_lock, flags);
2565 BRDENABLE(panelp->brdnr, panelp->pagenr);
2568 * Check that each chip is present and started up OK.
2570 chipmask = 0;
2571 nrchips = panelp->nrports / CD1400_PORTS;
2572 for (i = 0; i < nrchips; i++) {
2573 if (brdp->brdtype == BRD_ECHPCI) {
2574 outb((panelp->pagenr + (i >> 1)), brdp->ioctrl);
2575 ioaddr = panelp->iobase;
2576 } else
2577 ioaddr = panelp->iobase + (EREG_BANKSIZE * (i >> 1));
2578 uartaddr = (i & 0x01) ? 0x080 : 0;
2579 outb((GFRCR + uartaddr), ioaddr);
2580 outb(0, (ioaddr + EREG_DATA));
2581 outb((CCR + uartaddr), ioaddr);
2582 outb(CCR_RESETFULL, (ioaddr + EREG_DATA));
2583 outb(CCR_RESETFULL, (ioaddr + EREG_DATA));
2584 outb((GFRCR + uartaddr), ioaddr);
2585 for (j = 0; j < CCR_MAXWAIT; j++)
2586 if ((gfrcr = inb(ioaddr + EREG_DATA)) != 0)
2587 break;
2589 if ((j >= CCR_MAXWAIT) || (gfrcr < 0x40) || (gfrcr > 0x60)) {
2590 printk("STALLION: cd1400 not responding, "
2591 "brd=%d panel=%d chip=%d\n",
2592 panelp->brdnr, panelp->panelnr, i);
2593 continue;
2595 chipmask |= (0x1 << i);
2596 outb((PPR + uartaddr), ioaddr);
2597 outb(PPR_SCALAR, (ioaddr + EREG_DATA));
2600 BRDDISABLE(panelp->brdnr);
2601 spin_unlock_irqrestore(&brd_lock, flags);
2602 return chipmask;
2605 /*****************************************************************************/
2608 * Initialize hardware specific port registers.
2611 static void stl_cd1400portinit(struct stlbrd *brdp, struct stlpanel *panelp, struct stlport *portp)
2613 unsigned long flags;
2614 pr_debug("stl_cd1400portinit(brdp=%p,panelp=%p,portp=%p)\n", brdp,
2615 panelp, portp);
2617 if ((brdp == NULL) || (panelp == NULL) ||
2618 (portp == NULL))
2619 return;
2621 spin_lock_irqsave(&brd_lock, flags);
2622 portp->ioaddr = panelp->iobase + (((brdp->brdtype == BRD_ECHPCI) ||
2623 (portp->portnr < 8)) ? 0 : EREG_BANKSIZE);
2624 portp->uartaddr = (portp->portnr & 0x04) << 5;
2625 portp->pagenr = panelp->pagenr + (portp->portnr >> 3);
2627 BRDENABLE(portp->brdnr, portp->pagenr);
2628 stl_cd1400setreg(portp, CAR, (portp->portnr & 0x03));
2629 stl_cd1400setreg(portp, LIVR, (portp->portnr << 3));
2630 portp->hwid = stl_cd1400getreg(portp, GFRCR);
2631 BRDDISABLE(portp->brdnr);
2632 spin_unlock_irqrestore(&brd_lock, flags);
2635 /*****************************************************************************/
2638 * Wait for the command register to be ready. We will poll this,
2639 * since it won't usually take too long to be ready.
2642 static void stl_cd1400ccrwait(struct stlport *portp)
2644 int i;
2646 for (i = 0; i < CCR_MAXWAIT; i++)
2647 if (stl_cd1400getreg(portp, CCR) == 0)
2648 return;
2650 printk("STALLION: cd1400 not responding, port=%d panel=%d brd=%d\n",
2651 portp->portnr, portp->panelnr, portp->brdnr);
2654 /*****************************************************************************/
2657 * Set up the cd1400 registers for a port based on the termios port
2658 * settings.
2661 static void stl_cd1400setport(struct stlport *portp, struct ktermios *tiosp)
2663 struct stlbrd *brdp;
2664 unsigned long flags;
2665 unsigned int clkdiv, baudrate;
2666 unsigned char cor1, cor2, cor3;
2667 unsigned char cor4, cor5, ccr;
2668 unsigned char srer, sreron, sreroff;
2669 unsigned char mcor1, mcor2, rtpr;
2670 unsigned char clk, div;
2672 cor1 = 0;
2673 cor2 = 0;
2674 cor3 = 0;
2675 cor4 = 0;
2676 cor5 = 0;
2677 ccr = 0;
2678 rtpr = 0;
2679 clk = 0;
2680 div = 0;
2681 mcor1 = 0;
2682 mcor2 = 0;
2683 sreron = 0;
2684 sreroff = 0;
2686 brdp = stl_brds[portp->brdnr];
2687 if (brdp == NULL)
2688 return;
2691 * Set up the RX char ignore mask with those RX error types we
2692 * can ignore. We can get the cd1400 to help us out a little here,
2693 * it will ignore parity errors and breaks for us.
2695 portp->rxignoremsk = 0;
2696 if (tiosp->c_iflag & IGNPAR) {
2697 portp->rxignoremsk |= (ST_PARITY | ST_FRAMING | ST_OVERRUN);
2698 cor1 |= COR1_PARIGNORE;
2700 if (tiosp->c_iflag & IGNBRK) {
2701 portp->rxignoremsk |= ST_BREAK;
2702 cor4 |= COR4_IGNBRK;
2705 portp->rxmarkmsk = ST_OVERRUN;
2706 if (tiosp->c_iflag & (INPCK | PARMRK))
2707 portp->rxmarkmsk |= (ST_PARITY | ST_FRAMING);
2708 if (tiosp->c_iflag & BRKINT)
2709 portp->rxmarkmsk |= ST_BREAK;
2712 * Go through the char size, parity and stop bits and set all the
2713 * option register appropriately.
2715 switch (tiosp->c_cflag & CSIZE) {
2716 case CS5:
2717 cor1 |= COR1_CHL5;
2718 break;
2719 case CS6:
2720 cor1 |= COR1_CHL6;
2721 break;
2722 case CS7:
2723 cor1 |= COR1_CHL7;
2724 break;
2725 default:
2726 cor1 |= COR1_CHL8;
2727 break;
2730 if (tiosp->c_cflag & CSTOPB)
2731 cor1 |= COR1_STOP2;
2732 else
2733 cor1 |= COR1_STOP1;
2735 if (tiosp->c_cflag & PARENB) {
2736 if (tiosp->c_cflag & PARODD)
2737 cor1 |= (COR1_PARENB | COR1_PARODD);
2738 else
2739 cor1 |= (COR1_PARENB | COR1_PAREVEN);
2740 } else {
2741 cor1 |= COR1_PARNONE;
2745 * Set the RX FIFO threshold at 6 chars. This gives a bit of breathing
2746 * space for hardware flow control and the like. This should be set to
2747 * VMIN. Also here we will set the RX data timeout to 10ms - this should
2748 * really be based on VTIME.
2750 cor3 |= FIFO_RXTHRESHOLD;
2751 rtpr = 2;
2754 * Calculate the baud rate timers. For now we will just assume that
2755 * the input and output baud are the same. Could have used a baud
2756 * table here, but this way we can generate virtually any baud rate
2757 * we like!
2759 baudrate = tiosp->c_cflag & CBAUD;
2760 if (baudrate & CBAUDEX) {
2761 baudrate &= ~CBAUDEX;
2762 if ((baudrate < 1) || (baudrate > 4))
2763 tiosp->c_cflag &= ~CBAUDEX;
2764 else
2765 baudrate += 15;
2767 baudrate = stl_baudrates[baudrate];
2768 if ((tiosp->c_cflag & CBAUD) == B38400) {
2769 if ((portp->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_HI)
2770 baudrate = 57600;
2771 else if ((portp->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_VHI)
2772 baudrate = 115200;
2773 else if ((portp->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_SHI)
2774 baudrate = 230400;
2775 else if ((portp->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_WARP)
2776 baudrate = 460800;
2777 else if ((portp->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST)
2778 baudrate = (portp->baud_base / portp->custom_divisor);
2780 if (baudrate > STL_CD1400MAXBAUD)
2781 baudrate = STL_CD1400MAXBAUD;
2783 if (baudrate > 0) {
2784 for (clk = 0; clk < CD1400_NUMCLKS; clk++) {
2785 clkdiv = (portp->clk / stl_cd1400clkdivs[clk]) / baudrate;
2786 if (clkdiv < 0x100)
2787 break;
2789 div = (unsigned char) clkdiv;
2793 * Check what form of modem signaling is required and set it up.
2795 if ((tiosp->c_cflag & CLOCAL) == 0) {
2796 mcor1 |= MCOR1_DCD;
2797 mcor2 |= MCOR2_DCD;
2798 sreron |= SRER_MODEM;
2799 portp->port.flags |= ASYNC_CHECK_CD;
2800 } else
2801 portp->port.flags &= ~ASYNC_CHECK_CD;
2804 * Setup cd1400 enhanced modes if we can. In particular we want to
2805 * handle as much of the flow control as possible automatically. As
2806 * well as saving a few CPU cycles it will also greatly improve flow
2807 * control reliability.
2809 if (tiosp->c_iflag & IXON) {
2810 cor2 |= COR2_TXIBE;
2811 cor3 |= COR3_SCD12;
2812 if (tiosp->c_iflag & IXANY)
2813 cor2 |= COR2_IXM;
2816 if (tiosp->c_cflag & CRTSCTS) {
2817 cor2 |= COR2_CTSAE;
2818 mcor1 |= FIFO_RTSTHRESHOLD;
2822 * All cd1400 register values calculated so go through and set
2823 * them all up.
2826 pr_debug("SETPORT: portnr=%d panelnr=%d brdnr=%d\n",
2827 portp->portnr, portp->panelnr, portp->brdnr);
2828 pr_debug(" cor1=%x cor2=%x cor3=%x cor4=%x cor5=%x\n",
2829 cor1, cor2, cor3, cor4, cor5);
2830 pr_debug(" mcor1=%x mcor2=%x rtpr=%x sreron=%x sreroff=%x\n",
2831 mcor1, mcor2, rtpr, sreron, sreroff);
2832 pr_debug(" tcor=%x tbpr=%x rcor=%x rbpr=%x\n", clk, div, clk, div);
2833 pr_debug(" schr1=%x schr2=%x schr3=%x schr4=%x\n",
2834 tiosp->c_cc[VSTART], tiosp->c_cc[VSTOP],
2835 tiosp->c_cc[VSTART], tiosp->c_cc[VSTOP]);
2837 spin_lock_irqsave(&brd_lock, flags);
2838 BRDENABLE(portp->brdnr, portp->pagenr);
2839 stl_cd1400setreg(portp, CAR, (portp->portnr & 0x3));
2840 srer = stl_cd1400getreg(portp, SRER);
2841 stl_cd1400setreg(portp, SRER, 0);
2842 if (stl_cd1400updatereg(portp, COR1, cor1))
2843 ccr = 1;
2844 if (stl_cd1400updatereg(portp, COR2, cor2))
2845 ccr = 1;
2846 if (stl_cd1400updatereg(portp, COR3, cor3))
2847 ccr = 1;
2848 if (ccr) {
2849 stl_cd1400ccrwait(portp);
2850 stl_cd1400setreg(portp, CCR, CCR_CORCHANGE);
2852 stl_cd1400setreg(portp, COR4, cor4);
2853 stl_cd1400setreg(portp, COR5, cor5);
2854 stl_cd1400setreg(portp, MCOR1, mcor1);
2855 stl_cd1400setreg(portp, MCOR2, mcor2);
2856 if (baudrate > 0) {
2857 stl_cd1400setreg(portp, TCOR, clk);
2858 stl_cd1400setreg(portp, TBPR, div);
2859 stl_cd1400setreg(portp, RCOR, clk);
2860 stl_cd1400setreg(portp, RBPR, div);
2862 stl_cd1400setreg(portp, SCHR1, tiosp->c_cc[VSTART]);
2863 stl_cd1400setreg(portp, SCHR2, tiosp->c_cc[VSTOP]);
2864 stl_cd1400setreg(portp, SCHR3, tiosp->c_cc[VSTART]);
2865 stl_cd1400setreg(portp, SCHR4, tiosp->c_cc[VSTOP]);
2866 stl_cd1400setreg(portp, RTPR, rtpr);
2867 mcor1 = stl_cd1400getreg(portp, MSVR1);
2868 if (mcor1 & MSVR1_DCD)
2869 portp->sigs |= TIOCM_CD;
2870 else
2871 portp->sigs &= ~TIOCM_CD;
2872 stl_cd1400setreg(portp, SRER, ((srer & ~sreroff) | sreron));
2873 BRDDISABLE(portp->brdnr);
2874 spin_unlock_irqrestore(&brd_lock, flags);
2877 /*****************************************************************************/
2880 * Set the state of the DTR and RTS signals.
2883 static void stl_cd1400setsignals(struct stlport *portp, int dtr, int rts)
2885 unsigned char msvr1, msvr2;
2886 unsigned long flags;
2888 pr_debug("stl_cd1400setsignals(portp=%p,dtr=%d,rts=%d)\n",
2889 portp, dtr, rts);
2891 msvr1 = 0;
2892 msvr2 = 0;
2893 if (dtr > 0)
2894 msvr1 = MSVR1_DTR;
2895 if (rts > 0)
2896 msvr2 = MSVR2_RTS;
2898 spin_lock_irqsave(&brd_lock, flags);
2899 BRDENABLE(portp->brdnr, portp->pagenr);
2900 stl_cd1400setreg(portp, CAR, (portp->portnr & 0x03));
2901 if (rts >= 0)
2902 stl_cd1400setreg(portp, MSVR2, msvr2);
2903 if (dtr >= 0)
2904 stl_cd1400setreg(portp, MSVR1, msvr1);
2905 BRDDISABLE(portp->brdnr);
2906 spin_unlock_irqrestore(&brd_lock, flags);
2909 /*****************************************************************************/
2912 * Return the state of the signals.
2915 static int stl_cd1400getsignals(struct stlport *portp)
2917 unsigned char msvr1, msvr2;
2918 unsigned long flags;
2919 int sigs;
2921 pr_debug("stl_cd1400getsignals(portp=%p)\n", portp);
2923 spin_lock_irqsave(&brd_lock, flags);
2924 BRDENABLE(portp->brdnr, portp->pagenr);
2925 stl_cd1400setreg(portp, CAR, (portp->portnr & 0x03));
2926 msvr1 = stl_cd1400getreg(portp, MSVR1);
2927 msvr2 = stl_cd1400getreg(portp, MSVR2);
2928 BRDDISABLE(portp->brdnr);
2929 spin_unlock_irqrestore(&brd_lock, flags);
2931 sigs = 0;
2932 sigs |= (msvr1 & MSVR1_DCD) ? TIOCM_CD : 0;
2933 sigs |= (msvr1 & MSVR1_CTS) ? TIOCM_CTS : 0;
2934 sigs |= (msvr1 & MSVR1_DTR) ? TIOCM_DTR : 0;
2935 sigs |= (msvr2 & MSVR2_RTS) ? TIOCM_RTS : 0;
2936 #if 0
2937 sigs |= (msvr1 & MSVR1_RI) ? TIOCM_RI : 0;
2938 sigs |= (msvr1 & MSVR1_DSR) ? TIOCM_DSR : 0;
2939 #else
2940 sigs |= TIOCM_DSR;
2941 #endif
2942 return sigs;
2945 /*****************************************************************************/
2948 * Enable/Disable the Transmitter and/or Receiver.
2951 static void stl_cd1400enablerxtx(struct stlport *portp, int rx, int tx)
2953 unsigned char ccr;
2954 unsigned long flags;
2956 pr_debug("stl_cd1400enablerxtx(portp=%p,rx=%d,tx=%d)\n", portp, rx, tx);
2958 ccr = 0;
2960 if (tx == 0)
2961 ccr |= CCR_TXDISABLE;
2962 else if (tx > 0)
2963 ccr |= CCR_TXENABLE;
2964 if (rx == 0)
2965 ccr |= CCR_RXDISABLE;
2966 else if (rx > 0)
2967 ccr |= CCR_RXENABLE;
2969 spin_lock_irqsave(&brd_lock, flags);
2970 BRDENABLE(portp->brdnr, portp->pagenr);
2971 stl_cd1400setreg(portp, CAR, (portp->portnr & 0x03));
2972 stl_cd1400ccrwait(portp);
2973 stl_cd1400setreg(portp, CCR, ccr);
2974 stl_cd1400ccrwait(portp);
2975 BRDDISABLE(portp->brdnr);
2976 spin_unlock_irqrestore(&brd_lock, flags);
2979 /*****************************************************************************/
2982 * Start/stop the Transmitter and/or Receiver.
2985 static void stl_cd1400startrxtx(struct stlport *portp, int rx, int tx)
2987 unsigned char sreron, sreroff;
2988 unsigned long flags;
2990 pr_debug("stl_cd1400startrxtx(portp=%p,rx=%d,tx=%d)\n", portp, rx, tx);
2992 sreron = 0;
2993 sreroff = 0;
2994 if (tx == 0)
2995 sreroff |= (SRER_TXDATA | SRER_TXEMPTY);
2996 else if (tx == 1)
2997 sreron |= SRER_TXDATA;
2998 else if (tx >= 2)
2999 sreron |= SRER_TXEMPTY;
3000 if (rx == 0)
3001 sreroff |= SRER_RXDATA;
3002 else if (rx > 0)
3003 sreron |= SRER_RXDATA;
3005 spin_lock_irqsave(&brd_lock, flags);
3006 BRDENABLE(portp->brdnr, portp->pagenr);
3007 stl_cd1400setreg(portp, CAR, (portp->portnr & 0x03));
3008 stl_cd1400setreg(portp, SRER,
3009 ((stl_cd1400getreg(portp, SRER) & ~sreroff) | sreron));
3010 BRDDISABLE(portp->brdnr);
3011 if (tx > 0)
3012 set_bit(ASYI_TXBUSY, &portp->istate);
3013 spin_unlock_irqrestore(&brd_lock, flags);
3016 /*****************************************************************************/
3019 * Disable all interrupts from this port.
3022 static void stl_cd1400disableintrs(struct stlport *portp)
3024 unsigned long flags;
3026 pr_debug("stl_cd1400disableintrs(portp=%p)\n", portp);
3028 spin_lock_irqsave(&brd_lock, flags);
3029 BRDENABLE(portp->brdnr, portp->pagenr);
3030 stl_cd1400setreg(portp, CAR, (portp->portnr & 0x03));
3031 stl_cd1400setreg(portp, SRER, 0);
3032 BRDDISABLE(portp->brdnr);
3033 spin_unlock_irqrestore(&brd_lock, flags);
3036 /*****************************************************************************/
3038 static void stl_cd1400sendbreak(struct stlport *portp, int len)
3040 unsigned long flags;
3042 pr_debug("stl_cd1400sendbreak(portp=%p,len=%d)\n", portp, len);
3044 spin_lock_irqsave(&brd_lock, flags);
3045 BRDENABLE(portp->brdnr, portp->pagenr);
3046 stl_cd1400setreg(portp, CAR, (portp->portnr & 0x03));
3047 stl_cd1400setreg(portp, SRER,
3048 ((stl_cd1400getreg(portp, SRER) & ~SRER_TXDATA) |
3049 SRER_TXEMPTY));
3050 BRDDISABLE(portp->brdnr);
3051 portp->brklen = len;
3052 if (len == 1)
3053 portp->stats.txbreaks++;
3054 spin_unlock_irqrestore(&brd_lock, flags);
3057 /*****************************************************************************/
3060 * Take flow control actions...
3063 static void stl_cd1400flowctrl(struct stlport *portp, int state)
3065 struct tty_struct *tty;
3066 unsigned long flags;
3068 pr_debug("stl_cd1400flowctrl(portp=%p,state=%x)\n", portp, state);
3070 if (portp == NULL)
3071 return;
3072 tty = tty_port_tty_get(&portp->port);
3073 if (tty == NULL)
3074 return;
3076 spin_lock_irqsave(&brd_lock, flags);
3077 BRDENABLE(portp->brdnr, portp->pagenr);
3078 stl_cd1400setreg(portp, CAR, (portp->portnr & 0x03));
3080 if (state) {
3081 if (tty->termios->c_iflag & IXOFF) {
3082 stl_cd1400ccrwait(portp);
3083 stl_cd1400setreg(portp, CCR, CCR_SENDSCHR1);
3084 portp->stats.rxxon++;
3085 stl_cd1400ccrwait(portp);
3088 * Question: should we return RTS to what it was before? It may
3089 * have been set by an ioctl... Suppose not, since if you have
3090 * hardware flow control set then it is pretty silly to go and
3091 * set the RTS line by hand.
3093 if (tty->termios->c_cflag & CRTSCTS) {
3094 stl_cd1400setreg(portp, MCOR1,
3095 (stl_cd1400getreg(portp, MCOR1) |
3096 FIFO_RTSTHRESHOLD));
3097 stl_cd1400setreg(portp, MSVR2, MSVR2_RTS);
3098 portp->stats.rxrtson++;
3100 } else {
3101 if (tty->termios->c_iflag & IXOFF) {
3102 stl_cd1400ccrwait(portp);
3103 stl_cd1400setreg(portp, CCR, CCR_SENDSCHR2);
3104 portp->stats.rxxoff++;
3105 stl_cd1400ccrwait(portp);
3107 if (tty->termios->c_cflag & CRTSCTS) {
3108 stl_cd1400setreg(portp, MCOR1,
3109 (stl_cd1400getreg(portp, MCOR1) & 0xf0));
3110 stl_cd1400setreg(portp, MSVR2, 0);
3111 portp->stats.rxrtsoff++;
3115 BRDDISABLE(portp->brdnr);
3116 spin_unlock_irqrestore(&brd_lock, flags);
3117 tty_kref_put(tty);
3120 /*****************************************************************************/
3123 * Send a flow control character...
3126 static void stl_cd1400sendflow(struct stlport *portp, int state)
3128 struct tty_struct *tty;
3129 unsigned long flags;
3131 pr_debug("stl_cd1400sendflow(portp=%p,state=%x)\n", portp, state);
3133 if (portp == NULL)
3134 return;
3135 tty = tty_port_tty_get(&portp->port);
3136 if (tty == NULL)
3137 return;
3139 spin_lock_irqsave(&brd_lock, flags);
3140 BRDENABLE(portp->brdnr, portp->pagenr);
3141 stl_cd1400setreg(portp, CAR, (portp->portnr & 0x03));
3142 if (state) {
3143 stl_cd1400ccrwait(portp);
3144 stl_cd1400setreg(portp, CCR, CCR_SENDSCHR1);
3145 portp->stats.rxxon++;
3146 stl_cd1400ccrwait(portp);
3147 } else {
3148 stl_cd1400ccrwait(portp);
3149 stl_cd1400setreg(portp, CCR, CCR_SENDSCHR2);
3150 portp->stats.rxxoff++;
3151 stl_cd1400ccrwait(portp);
3153 BRDDISABLE(portp->brdnr);
3154 spin_unlock_irqrestore(&brd_lock, flags);
3155 tty_kref_put(tty);
3158 /*****************************************************************************/
3160 static void stl_cd1400flush(struct stlport *portp)
3162 unsigned long flags;
3164 pr_debug("stl_cd1400flush(portp=%p)\n", portp);
3166 if (portp == NULL)
3167 return;
3169 spin_lock_irqsave(&brd_lock, flags);
3170 BRDENABLE(portp->brdnr, portp->pagenr);
3171 stl_cd1400setreg(portp, CAR, (portp->portnr & 0x03));
3172 stl_cd1400ccrwait(portp);
3173 stl_cd1400setreg(portp, CCR, CCR_TXFLUSHFIFO);
3174 stl_cd1400ccrwait(portp);
3175 portp->tx.tail = portp->tx.head;
3176 BRDDISABLE(portp->brdnr);
3177 spin_unlock_irqrestore(&brd_lock, flags);
3180 /*****************************************************************************/
3183 * Return the current state of data flow on this port. This is only
3184 * really interesting when determining if data has fully completed
3185 * transmission or not... This is easy for the cd1400, it accurately
3186 * maintains the busy port flag.
3189 static int stl_cd1400datastate(struct stlport *portp)
3191 pr_debug("stl_cd1400datastate(portp=%p)\n", portp);
3193 if (portp == NULL)
3194 return 0;
3196 return test_bit(ASYI_TXBUSY, &portp->istate) ? 1 : 0;
3199 /*****************************************************************************/
3202 * Interrupt service routine for cd1400 EasyIO boards.
3205 static void stl_cd1400eiointr(struct stlpanel *panelp, unsigned int iobase)
3207 unsigned char svrtype;
3209 pr_debug("stl_cd1400eiointr(panelp=%p,iobase=%x)\n", panelp, iobase);
3211 spin_lock(&brd_lock);
3212 outb(SVRR, iobase);
3213 svrtype = inb(iobase + EREG_DATA);
3214 if (panelp->nrports > 4) {
3215 outb((SVRR + 0x80), iobase);
3216 svrtype |= inb(iobase + EREG_DATA);
3219 if (svrtype & SVRR_RX)
3220 stl_cd1400rxisr(panelp, iobase);
3221 else if (svrtype & SVRR_TX)
3222 stl_cd1400txisr(panelp, iobase);
3223 else if (svrtype & SVRR_MDM)
3224 stl_cd1400mdmisr(panelp, iobase);
3226 spin_unlock(&brd_lock);
3229 /*****************************************************************************/
3232 * Interrupt service routine for cd1400 panels.
3235 static void stl_cd1400echintr(struct stlpanel *panelp, unsigned int iobase)
3237 unsigned char svrtype;
3239 pr_debug("stl_cd1400echintr(panelp=%p,iobase=%x)\n", panelp, iobase);
3241 outb(SVRR, iobase);
3242 svrtype = inb(iobase + EREG_DATA);
3243 outb((SVRR + 0x80), iobase);
3244 svrtype |= inb(iobase + EREG_DATA);
3245 if (svrtype & SVRR_RX)
3246 stl_cd1400rxisr(panelp, iobase);
3247 else if (svrtype & SVRR_TX)
3248 stl_cd1400txisr(panelp, iobase);
3249 else if (svrtype & SVRR_MDM)
3250 stl_cd1400mdmisr(panelp, iobase);
3254 /*****************************************************************************/
3257 * Unfortunately we need to handle breaks in the TX data stream, since
3258 * this is the only way to generate them on the cd1400.
3261 static int stl_cd1400breakisr(struct stlport *portp, int ioaddr)
3263 if (portp->brklen == 1) {
3264 outb((COR2 + portp->uartaddr), ioaddr);
3265 outb((inb(ioaddr + EREG_DATA) | COR2_ETC),
3266 (ioaddr + EREG_DATA));
3267 outb((TDR + portp->uartaddr), ioaddr);
3268 outb(ETC_CMD, (ioaddr + EREG_DATA));
3269 outb(ETC_STARTBREAK, (ioaddr + EREG_DATA));
3270 outb((SRER + portp->uartaddr), ioaddr);
3271 outb((inb(ioaddr + EREG_DATA) & ~(SRER_TXDATA | SRER_TXEMPTY)),
3272 (ioaddr + EREG_DATA));
3273 return 1;
3274 } else if (portp->brklen > 1) {
3275 outb((TDR + portp->uartaddr), ioaddr);
3276 outb(ETC_CMD, (ioaddr + EREG_DATA));
3277 outb(ETC_STOPBREAK, (ioaddr + EREG_DATA));
3278 portp->brklen = -1;
3279 return 1;
3280 } else {
3281 outb((COR2 + portp->uartaddr), ioaddr);
3282 outb((inb(ioaddr + EREG_DATA) & ~COR2_ETC),
3283 (ioaddr + EREG_DATA));
3284 portp->brklen = 0;
3286 return 0;
3289 /*****************************************************************************/
3292 * Transmit interrupt handler. This has gotta be fast! Handling TX
3293 * chars is pretty simple, stuff as many as possible from the TX buffer
3294 * into the cd1400 FIFO. Must also handle TX breaks here, since they
3295 * are embedded as commands in the data stream. Oh no, had to use a goto!
3296 * This could be optimized more, will do when I get time...
3297 * In practice it is possible that interrupts are enabled but that the
3298 * port has been hung up. Need to handle not having any TX buffer here,
3299 * this is done by using the side effect that head and tail will also
3300 * be NULL if the buffer has been freed.
3303 static void stl_cd1400txisr(struct stlpanel *panelp, int ioaddr)
3305 struct stlport *portp;
3306 int len, stlen;
3307 char *head, *tail;
3308 unsigned char ioack, srer;
3309 struct tty_struct *tty;
3311 pr_debug("stl_cd1400txisr(panelp=%p,ioaddr=%x)\n", panelp, ioaddr);
3313 ioack = inb(ioaddr + EREG_TXACK);
3314 if (((ioack & panelp->ackmask) != 0) ||
3315 ((ioack & ACK_TYPMASK) != ACK_TYPTX)) {
3316 printk("STALLION: bad TX interrupt ack value=%x\n", ioack);
3317 return;
3319 portp = panelp->ports[(ioack >> 3)];
3322 * Unfortunately we need to handle breaks in the data stream, since
3323 * this is the only way to generate them on the cd1400. Do it now if
3324 * a break is to be sent.
3326 if (portp->brklen != 0)
3327 if (stl_cd1400breakisr(portp, ioaddr))
3328 goto stl_txalldone;
3330 head = portp->tx.head;
3331 tail = portp->tx.tail;
3332 len = (head >= tail) ? (head - tail) : (STL_TXBUFSIZE - (tail - head));
3333 if ((len == 0) || ((len < STL_TXBUFLOW) &&
3334 (test_bit(ASYI_TXLOW, &portp->istate) == 0))) {
3335 set_bit(ASYI_TXLOW, &portp->istate);
3336 tty = tty_port_tty_get(&portp->port);
3337 if (tty) {
3338 tty_wakeup(tty);
3339 tty_kref_put(tty);
3343 if (len == 0) {
3344 outb((SRER + portp->uartaddr), ioaddr);
3345 srer = inb(ioaddr + EREG_DATA);
3346 if (srer & SRER_TXDATA) {
3347 srer = (srer & ~SRER_TXDATA) | SRER_TXEMPTY;
3348 } else {
3349 srer &= ~(SRER_TXDATA | SRER_TXEMPTY);
3350 clear_bit(ASYI_TXBUSY, &portp->istate);
3352 outb(srer, (ioaddr + EREG_DATA));
3353 } else {
3354 len = min(len, CD1400_TXFIFOSIZE);
3355 portp->stats.txtotal += len;
3356 stlen = min_t(unsigned int, len,
3357 (portp->tx.buf + STL_TXBUFSIZE) - tail);
3358 outb((TDR + portp->uartaddr), ioaddr);
3359 outsb((ioaddr + EREG_DATA), tail, stlen);
3360 len -= stlen;
3361 tail += stlen;
3362 if (tail >= (portp->tx.buf + STL_TXBUFSIZE))
3363 tail = portp->tx.buf;
3364 if (len > 0) {
3365 outsb((ioaddr + EREG_DATA), tail, len);
3366 tail += len;
3368 portp->tx.tail = tail;
3371 stl_txalldone:
3372 outb((EOSRR + portp->uartaddr), ioaddr);
3373 outb(0, (ioaddr + EREG_DATA));
3376 /*****************************************************************************/
3379 * Receive character interrupt handler. Determine if we have good chars
3380 * or bad chars and then process appropriately. Good chars are easy
3381 * just shove the lot into the RX buffer and set all status byte to 0.
3382 * If a bad RX char then process as required. This routine needs to be
3383 * fast! In practice it is possible that we get an interrupt on a port
3384 * that is closed. This can happen on hangups - since they completely
3385 * shutdown a port not in user context. Need to handle this case.
3388 static void stl_cd1400rxisr(struct stlpanel *panelp, int ioaddr)
3390 struct stlport *portp;
3391 struct tty_struct *tty;
3392 unsigned int ioack, len, buflen;
3393 unsigned char status;
3394 char ch;
3396 pr_debug("stl_cd1400rxisr(panelp=%p,ioaddr=%x)\n", panelp, ioaddr);
3398 ioack = inb(ioaddr + EREG_RXACK);
3399 if ((ioack & panelp->ackmask) != 0) {
3400 printk("STALLION: bad RX interrupt ack value=%x\n", ioack);
3401 return;
3403 portp = panelp->ports[(ioack >> 3)];
3404 tty = tty_port_tty_get(&portp->port);
3406 if ((ioack & ACK_TYPMASK) == ACK_TYPRXGOOD) {
3407 outb((RDCR + portp->uartaddr), ioaddr);
3408 len = inb(ioaddr + EREG_DATA);
3409 if (tty == NULL || (buflen = tty_buffer_request_room(tty, len)) == 0) {
3410 len = min_t(unsigned int, len, sizeof(stl_unwanted));
3411 outb((RDSR + portp->uartaddr), ioaddr);
3412 insb((ioaddr + EREG_DATA), &stl_unwanted[0], len);
3413 portp->stats.rxlost += len;
3414 portp->stats.rxtotal += len;
3415 } else {
3416 len = min(len, buflen);
3417 if (len > 0) {
3418 unsigned char *ptr;
3419 outb((RDSR + portp->uartaddr), ioaddr);
3420 tty_prepare_flip_string(tty, &ptr, len);
3421 insb((ioaddr + EREG_DATA), ptr, len);
3422 tty_schedule_flip(tty);
3423 portp->stats.rxtotal += len;
3426 } else if ((ioack & ACK_TYPMASK) == ACK_TYPRXBAD) {
3427 outb((RDSR + portp->uartaddr), ioaddr);
3428 status = inb(ioaddr + EREG_DATA);
3429 ch = inb(ioaddr + EREG_DATA);
3430 if (status & ST_PARITY)
3431 portp->stats.rxparity++;
3432 if (status & ST_FRAMING)
3433 portp->stats.rxframing++;
3434 if (status & ST_OVERRUN)
3435 portp->stats.rxoverrun++;
3436 if (status & ST_BREAK)
3437 portp->stats.rxbreaks++;
3438 if (status & ST_SCHARMASK) {
3439 if ((status & ST_SCHARMASK) == ST_SCHAR1)
3440 portp->stats.txxon++;
3441 if ((status & ST_SCHARMASK) == ST_SCHAR2)
3442 portp->stats.txxoff++;
3443 goto stl_rxalldone;
3445 if (tty != NULL && (portp->rxignoremsk & status) == 0) {
3446 if (portp->rxmarkmsk & status) {
3447 if (status & ST_BREAK) {
3448 status = TTY_BREAK;
3449 if (portp->port.flags & ASYNC_SAK) {
3450 do_SAK(tty);
3451 BRDENABLE(portp->brdnr, portp->pagenr);
3453 } else if (status & ST_PARITY)
3454 status = TTY_PARITY;
3455 else if (status & ST_FRAMING)
3456 status = TTY_FRAME;
3457 else if(status & ST_OVERRUN)
3458 status = TTY_OVERRUN;
3459 else
3460 status = 0;
3461 } else
3462 status = 0;
3463 tty_insert_flip_char(tty, ch, status);
3464 tty_schedule_flip(tty);
3466 } else {
3467 printk("STALLION: bad RX interrupt ack value=%x\n", ioack);
3468 tty_kref_put(tty);
3469 return;
3472 stl_rxalldone:
3473 tty_kref_put(tty);
3474 outb((EOSRR + portp->uartaddr), ioaddr);
3475 outb(0, (ioaddr + EREG_DATA));
3478 /*****************************************************************************/
3481 * Modem interrupt handler. The is called when the modem signal line
3482 * (DCD) has changed state. Leave most of the work to the off-level
3483 * processing routine.
3486 static void stl_cd1400mdmisr(struct stlpanel *panelp, int ioaddr)
3488 struct stlport *portp;
3489 unsigned int ioack;
3490 unsigned char misr;
3492 pr_debug("stl_cd1400mdmisr(panelp=%p)\n", panelp);
3494 ioack = inb(ioaddr + EREG_MDACK);
3495 if (((ioack & panelp->ackmask) != 0) ||
3496 ((ioack & ACK_TYPMASK) != ACK_TYPMDM)) {
3497 printk("STALLION: bad MODEM interrupt ack value=%x\n", ioack);
3498 return;
3500 portp = panelp->ports[(ioack >> 3)];
3502 outb((MISR + portp->uartaddr), ioaddr);
3503 misr = inb(ioaddr + EREG_DATA);
3504 if (misr & MISR_DCD) {
3505 stl_cd_change(portp);
3506 portp->stats.modem++;
3509 outb((EOSRR + portp->uartaddr), ioaddr);
3510 outb(0, (ioaddr + EREG_DATA));
3513 /*****************************************************************************/
3514 /* SC26198 HARDWARE FUNCTIONS */
3515 /*****************************************************************************/
3518 * These functions get/set/update the registers of the sc26198 UARTs.
3519 * Access to the sc26198 registers is via an address/data io port pair.
3520 * (Maybe should make this inline...)
3523 static int stl_sc26198getreg(struct stlport *portp, int regnr)
3525 outb((regnr | portp->uartaddr), (portp->ioaddr + XP_ADDR));
3526 return inb(portp->ioaddr + XP_DATA);
3529 static void stl_sc26198setreg(struct stlport *portp, int regnr, int value)
3531 outb((regnr | portp->uartaddr), (portp->ioaddr + XP_ADDR));
3532 outb(value, (portp->ioaddr + XP_DATA));
3535 static int stl_sc26198updatereg(struct stlport *portp, int regnr, int value)
3537 outb((regnr | portp->uartaddr), (portp->ioaddr + XP_ADDR));
3538 if (inb(portp->ioaddr + XP_DATA) != value) {
3539 outb(value, (portp->ioaddr + XP_DATA));
3540 return 1;
3542 return 0;
3545 /*****************************************************************************/
3548 * Functions to get and set the sc26198 global registers.
3551 static int stl_sc26198getglobreg(struct stlport *portp, int regnr)
3553 outb(regnr, (portp->ioaddr + XP_ADDR));
3554 return inb(portp->ioaddr + XP_DATA);
3557 #if 0
3558 static void stl_sc26198setglobreg(struct stlport *portp, int regnr, int value)
3560 outb(regnr, (portp->ioaddr + XP_ADDR));
3561 outb(value, (portp->ioaddr + XP_DATA));
3563 #endif
3565 /*****************************************************************************/
3568 * Inbitialize the UARTs in a panel. We don't care what sort of board
3569 * these ports are on - since the port io registers are almost
3570 * identical when dealing with ports.
3573 static int stl_sc26198panelinit(struct stlbrd *brdp, struct stlpanel *panelp)
3575 int chipmask, i;
3576 int nrchips, ioaddr;
3578 pr_debug("stl_sc26198panelinit(brdp=%p,panelp=%p)\n", brdp, panelp);
3580 BRDENABLE(panelp->brdnr, panelp->pagenr);
3583 * Check that each chip is present and started up OK.
3585 chipmask = 0;
3586 nrchips = (panelp->nrports + 4) / SC26198_PORTS;
3587 if (brdp->brdtype == BRD_ECHPCI)
3588 outb(panelp->pagenr, brdp->ioctrl);
3590 for (i = 0; i < nrchips; i++) {
3591 ioaddr = panelp->iobase + (i * 4);
3592 outb(SCCR, (ioaddr + XP_ADDR));
3593 outb(CR_RESETALL, (ioaddr + XP_DATA));
3594 outb(TSTR, (ioaddr + XP_ADDR));
3595 if (inb(ioaddr + XP_DATA) != 0) {
3596 printk("STALLION: sc26198 not responding, "
3597 "brd=%d panel=%d chip=%d\n",
3598 panelp->brdnr, panelp->panelnr, i);
3599 continue;
3601 chipmask |= (0x1 << i);
3602 outb(GCCR, (ioaddr + XP_ADDR));
3603 outb(GCCR_IVRTYPCHANACK, (ioaddr + XP_DATA));
3604 outb(WDTRCR, (ioaddr + XP_ADDR));
3605 outb(0xff, (ioaddr + XP_DATA));
3608 BRDDISABLE(panelp->brdnr);
3609 return chipmask;
3612 /*****************************************************************************/
3615 * Initialize hardware specific port registers.
3618 static void stl_sc26198portinit(struct stlbrd *brdp, struct stlpanel *panelp, struct stlport *portp)
3620 pr_debug("stl_sc26198portinit(brdp=%p,panelp=%p,portp=%p)\n", brdp,
3621 panelp, portp);
3623 if ((brdp == NULL) || (panelp == NULL) ||
3624 (portp == NULL))
3625 return;
3627 portp->ioaddr = panelp->iobase + ((portp->portnr < 8) ? 0 : 4);
3628 portp->uartaddr = (portp->portnr & 0x07) << 4;
3629 portp->pagenr = panelp->pagenr;
3630 portp->hwid = 0x1;
3632 BRDENABLE(portp->brdnr, portp->pagenr);
3633 stl_sc26198setreg(portp, IOPCR, IOPCR_SETSIGS);
3634 BRDDISABLE(portp->brdnr);
3637 /*****************************************************************************/
3640 * Set up the sc26198 registers for a port based on the termios port
3641 * settings.
3644 static void stl_sc26198setport(struct stlport *portp, struct ktermios *tiosp)
3646 struct stlbrd *brdp;
3647 unsigned long flags;
3648 unsigned int baudrate;
3649 unsigned char mr0, mr1, mr2, clk;
3650 unsigned char imron, imroff, iopr, ipr;
3652 mr0 = 0;
3653 mr1 = 0;
3654 mr2 = 0;
3655 clk = 0;
3656 iopr = 0;
3657 imron = 0;
3658 imroff = 0;
3660 brdp = stl_brds[portp->brdnr];
3661 if (brdp == NULL)
3662 return;
3665 * Set up the RX char ignore mask with those RX error types we
3666 * can ignore.
3668 portp->rxignoremsk = 0;
3669 if (tiosp->c_iflag & IGNPAR)
3670 portp->rxignoremsk |= (SR_RXPARITY | SR_RXFRAMING |
3671 SR_RXOVERRUN);
3672 if (tiosp->c_iflag & IGNBRK)
3673 portp->rxignoremsk |= SR_RXBREAK;
3675 portp->rxmarkmsk = SR_RXOVERRUN;
3676 if (tiosp->c_iflag & (INPCK | PARMRK))
3677 portp->rxmarkmsk |= (SR_RXPARITY | SR_RXFRAMING);
3678 if (tiosp->c_iflag & BRKINT)
3679 portp->rxmarkmsk |= SR_RXBREAK;
3682 * Go through the char size, parity and stop bits and set all the
3683 * option register appropriately.
3685 switch (tiosp->c_cflag & CSIZE) {
3686 case CS5:
3687 mr1 |= MR1_CS5;
3688 break;
3689 case CS6:
3690 mr1 |= MR1_CS6;
3691 break;
3692 case CS7:
3693 mr1 |= MR1_CS7;
3694 break;
3695 default:
3696 mr1 |= MR1_CS8;
3697 break;
3700 if (tiosp->c_cflag & CSTOPB)
3701 mr2 |= MR2_STOP2;
3702 else
3703 mr2 |= MR2_STOP1;
3705 if (tiosp->c_cflag & PARENB) {
3706 if (tiosp->c_cflag & PARODD)
3707 mr1 |= (MR1_PARENB | MR1_PARODD);
3708 else
3709 mr1 |= (MR1_PARENB | MR1_PAREVEN);
3710 } else
3711 mr1 |= MR1_PARNONE;
3713 mr1 |= MR1_ERRBLOCK;
3716 * Set the RX FIFO threshold at 8 chars. This gives a bit of breathing
3717 * space for hardware flow control and the like. This should be set to
3718 * VMIN.
3720 mr2 |= MR2_RXFIFOHALF;
3723 * Calculate the baud rate timers. For now we will just assume that
3724 * the input and output baud are the same. The sc26198 has a fixed
3725 * baud rate table, so only discrete baud rates possible.
3727 baudrate = tiosp->c_cflag & CBAUD;
3728 if (baudrate & CBAUDEX) {
3729 baudrate &= ~CBAUDEX;
3730 if ((baudrate < 1) || (baudrate > 4))
3731 tiosp->c_cflag &= ~CBAUDEX;
3732 else
3733 baudrate += 15;
3735 baudrate = stl_baudrates[baudrate];
3736 if ((tiosp->c_cflag & CBAUD) == B38400) {
3737 if ((portp->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_HI)
3738 baudrate = 57600;
3739 else if ((portp->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_VHI)
3740 baudrate = 115200;
3741 else if ((portp->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_SHI)
3742 baudrate = 230400;
3743 else if ((portp->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_WARP)
3744 baudrate = 460800;
3745 else if ((portp->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST)
3746 baudrate = (portp->baud_base / portp->custom_divisor);
3748 if (baudrate > STL_SC26198MAXBAUD)
3749 baudrate = STL_SC26198MAXBAUD;
3751 if (baudrate > 0)
3752 for (clk = 0; clk < SC26198_NRBAUDS; clk++)
3753 if (baudrate <= sc26198_baudtable[clk])
3754 break;
3757 * Check what form of modem signaling is required and set it up.
3759 if (tiosp->c_cflag & CLOCAL) {
3760 portp->port.flags &= ~ASYNC_CHECK_CD;
3761 } else {
3762 iopr |= IOPR_DCDCOS;
3763 imron |= IR_IOPORT;
3764 portp->port.flags |= ASYNC_CHECK_CD;
3768 * Setup sc26198 enhanced modes if we can. In particular we want to
3769 * handle as much of the flow control as possible automatically. As
3770 * well as saving a few CPU cycles it will also greatly improve flow
3771 * control reliability.
3773 if (tiosp->c_iflag & IXON) {
3774 mr0 |= MR0_SWFTX | MR0_SWFT;
3775 imron |= IR_XONXOFF;
3776 } else
3777 imroff |= IR_XONXOFF;
3779 if (tiosp->c_iflag & IXOFF)
3780 mr0 |= MR0_SWFRX;
3782 if (tiosp->c_cflag & CRTSCTS) {
3783 mr2 |= MR2_AUTOCTS;
3784 mr1 |= MR1_AUTORTS;
3788 * All sc26198 register values calculated so go through and set
3789 * them all up.
3792 pr_debug("SETPORT: portnr=%d panelnr=%d brdnr=%d\n",
3793 portp->portnr, portp->panelnr, portp->brdnr);
3794 pr_debug(" mr0=%x mr1=%x mr2=%x clk=%x\n", mr0, mr1, mr2, clk);
3795 pr_debug(" iopr=%x imron=%x imroff=%x\n", iopr, imron, imroff);
3796 pr_debug(" schr1=%x schr2=%x schr3=%x schr4=%x\n",
3797 tiosp->c_cc[VSTART], tiosp->c_cc[VSTOP],
3798 tiosp->c_cc[VSTART], tiosp->c_cc[VSTOP]);
3800 spin_lock_irqsave(&brd_lock, flags);
3801 BRDENABLE(portp->brdnr, portp->pagenr);
3802 stl_sc26198setreg(portp, IMR, 0);
3803 stl_sc26198updatereg(portp, MR0, mr0);
3804 stl_sc26198updatereg(portp, MR1, mr1);
3805 stl_sc26198setreg(portp, SCCR, CR_RXERRBLOCK);
3806 stl_sc26198updatereg(portp, MR2, mr2);
3807 stl_sc26198updatereg(portp, IOPIOR,
3808 ((stl_sc26198getreg(portp, IOPIOR) & ~IPR_CHANGEMASK) | iopr));
3810 if (baudrate > 0) {
3811 stl_sc26198setreg(portp, TXCSR, clk);
3812 stl_sc26198setreg(portp, RXCSR, clk);
3815 stl_sc26198setreg(portp, XONCR, tiosp->c_cc[VSTART]);
3816 stl_sc26198setreg(portp, XOFFCR, tiosp->c_cc[VSTOP]);
3818 ipr = stl_sc26198getreg(portp, IPR);
3819 if (ipr & IPR_DCD)
3820 portp->sigs &= ~TIOCM_CD;
3821 else
3822 portp->sigs |= TIOCM_CD;
3824 portp->imr = (portp->imr & ~imroff) | imron;
3825 stl_sc26198setreg(portp, IMR, portp->imr);
3826 BRDDISABLE(portp->brdnr);
3827 spin_unlock_irqrestore(&brd_lock, flags);
3830 /*****************************************************************************/
3833 * Set the state of the DTR and RTS signals.
3836 static void stl_sc26198setsignals(struct stlport *portp, int dtr, int rts)
3838 unsigned char iopioron, iopioroff;
3839 unsigned long flags;
3841 pr_debug("stl_sc26198setsignals(portp=%p,dtr=%d,rts=%d)\n", portp,
3842 dtr, rts);
3844 iopioron = 0;
3845 iopioroff = 0;
3846 if (dtr == 0)
3847 iopioroff |= IPR_DTR;
3848 else if (dtr > 0)
3849 iopioron |= IPR_DTR;
3850 if (rts == 0)
3851 iopioroff |= IPR_RTS;
3852 else if (rts > 0)
3853 iopioron |= IPR_RTS;
3855 spin_lock_irqsave(&brd_lock, flags);
3856 BRDENABLE(portp->brdnr, portp->pagenr);
3857 stl_sc26198setreg(portp, IOPIOR,
3858 ((stl_sc26198getreg(portp, IOPIOR) & ~iopioroff) | iopioron));
3859 BRDDISABLE(portp->brdnr);
3860 spin_unlock_irqrestore(&brd_lock, flags);
3863 /*****************************************************************************/
3866 * Return the state of the signals.
3869 static int stl_sc26198getsignals(struct stlport *portp)
3871 unsigned char ipr;
3872 unsigned long flags;
3873 int sigs;
3875 pr_debug("stl_sc26198getsignals(portp=%p)\n", portp);
3877 spin_lock_irqsave(&brd_lock, flags);
3878 BRDENABLE(portp->brdnr, portp->pagenr);
3879 ipr = stl_sc26198getreg(portp, IPR);
3880 BRDDISABLE(portp->brdnr);
3881 spin_unlock_irqrestore(&brd_lock, flags);
3883 sigs = 0;
3884 sigs |= (ipr & IPR_DCD) ? 0 : TIOCM_CD;
3885 sigs |= (ipr & IPR_CTS) ? 0 : TIOCM_CTS;
3886 sigs |= (ipr & IPR_DTR) ? 0: TIOCM_DTR;
3887 sigs |= (ipr & IPR_RTS) ? 0: TIOCM_RTS;
3888 sigs |= TIOCM_DSR;
3889 return sigs;
3892 /*****************************************************************************/
3895 * Enable/Disable the Transmitter and/or Receiver.
3898 static void stl_sc26198enablerxtx(struct stlport *portp, int rx, int tx)
3900 unsigned char ccr;
3901 unsigned long flags;
3903 pr_debug("stl_sc26198enablerxtx(portp=%p,rx=%d,tx=%d)\n", portp, rx,tx);
3905 ccr = portp->crenable;
3906 if (tx == 0)
3907 ccr &= ~CR_TXENABLE;
3908 else if (tx > 0)
3909 ccr |= CR_TXENABLE;
3910 if (rx == 0)
3911 ccr &= ~CR_RXENABLE;
3912 else if (rx > 0)
3913 ccr |= CR_RXENABLE;
3915 spin_lock_irqsave(&brd_lock, flags);
3916 BRDENABLE(portp->brdnr, portp->pagenr);
3917 stl_sc26198setreg(portp, SCCR, ccr);
3918 BRDDISABLE(portp->brdnr);
3919 portp->crenable = ccr;
3920 spin_unlock_irqrestore(&brd_lock, flags);
3923 /*****************************************************************************/
3926 * Start/stop the Transmitter and/or Receiver.
3929 static void stl_sc26198startrxtx(struct stlport *portp, int rx, int tx)
3931 unsigned char imr;
3932 unsigned long flags;
3934 pr_debug("stl_sc26198startrxtx(portp=%p,rx=%d,tx=%d)\n", portp, rx, tx);
3936 imr = portp->imr;
3937 if (tx == 0)
3938 imr &= ~IR_TXRDY;
3939 else if (tx == 1)
3940 imr |= IR_TXRDY;
3941 if (rx == 0)
3942 imr &= ~(IR_RXRDY | IR_RXBREAK | IR_RXWATCHDOG);
3943 else if (rx > 0)
3944 imr |= IR_RXRDY | IR_RXBREAK | IR_RXWATCHDOG;
3946 spin_lock_irqsave(&brd_lock, flags);
3947 BRDENABLE(portp->brdnr, portp->pagenr);
3948 stl_sc26198setreg(portp, IMR, imr);
3949 BRDDISABLE(portp->brdnr);
3950 portp->imr = imr;
3951 if (tx > 0)
3952 set_bit(ASYI_TXBUSY, &portp->istate);
3953 spin_unlock_irqrestore(&brd_lock, flags);
3956 /*****************************************************************************/
3959 * Disable all interrupts from this port.
3962 static void stl_sc26198disableintrs(struct stlport *portp)
3964 unsigned long flags;
3966 pr_debug("stl_sc26198disableintrs(portp=%p)\n", portp);
3968 spin_lock_irqsave(&brd_lock, flags);
3969 BRDENABLE(portp->brdnr, portp->pagenr);
3970 portp->imr = 0;
3971 stl_sc26198setreg(portp, IMR, 0);
3972 BRDDISABLE(portp->brdnr);
3973 spin_unlock_irqrestore(&brd_lock, flags);
3976 /*****************************************************************************/
3978 static void stl_sc26198sendbreak(struct stlport *portp, int len)
3980 unsigned long flags;
3982 pr_debug("stl_sc26198sendbreak(portp=%p,len=%d)\n", portp, len);
3984 spin_lock_irqsave(&brd_lock, flags);
3985 BRDENABLE(portp->brdnr, portp->pagenr);
3986 if (len == 1) {
3987 stl_sc26198setreg(portp, SCCR, CR_TXSTARTBREAK);
3988 portp->stats.txbreaks++;
3989 } else
3990 stl_sc26198setreg(portp, SCCR, CR_TXSTOPBREAK);
3992 BRDDISABLE(portp->brdnr);
3993 spin_unlock_irqrestore(&brd_lock, flags);
3996 /*****************************************************************************/
3999 * Take flow control actions...
4002 static void stl_sc26198flowctrl(struct stlport *portp, int state)
4004 struct tty_struct *tty;
4005 unsigned long flags;
4006 unsigned char mr0;
4008 pr_debug("stl_sc26198flowctrl(portp=%p,state=%x)\n", portp, state);
4010 if (portp == NULL)
4011 return;
4012 tty = tty_port_tty_get(&portp->port);
4013 if (tty == NULL)
4014 return;
4016 spin_lock_irqsave(&brd_lock, flags);
4017 BRDENABLE(portp->brdnr, portp->pagenr);
4019 if (state) {
4020 if (tty->termios->c_iflag & IXOFF) {
4021 mr0 = stl_sc26198getreg(portp, MR0);
4022 stl_sc26198setreg(portp, MR0, (mr0 & ~MR0_SWFRXTX));
4023 stl_sc26198setreg(portp, SCCR, CR_TXSENDXON);
4024 mr0 |= MR0_SWFRX;
4025 portp->stats.rxxon++;
4026 stl_sc26198wait(portp);
4027 stl_sc26198setreg(portp, MR0, mr0);
4030 * Question: should we return RTS to what it was before? It may
4031 * have been set by an ioctl... Suppose not, since if you have
4032 * hardware flow control set then it is pretty silly to go and
4033 * set the RTS line by hand.
4035 if (tty->termios->c_cflag & CRTSCTS) {
4036 stl_sc26198setreg(portp, MR1,
4037 (stl_sc26198getreg(portp, MR1) | MR1_AUTORTS));
4038 stl_sc26198setreg(portp, IOPIOR,
4039 (stl_sc26198getreg(portp, IOPIOR) | IOPR_RTS));
4040 portp->stats.rxrtson++;
4042 } else {
4043 if (tty->termios->c_iflag & IXOFF) {
4044 mr0 = stl_sc26198getreg(portp, MR0);
4045 stl_sc26198setreg(portp, MR0, (mr0 & ~MR0_SWFRXTX));
4046 stl_sc26198setreg(portp, SCCR, CR_TXSENDXOFF);
4047 mr0 &= ~MR0_SWFRX;
4048 portp->stats.rxxoff++;
4049 stl_sc26198wait(portp);
4050 stl_sc26198setreg(portp, MR0, mr0);
4052 if (tty->termios->c_cflag & CRTSCTS) {
4053 stl_sc26198setreg(portp, MR1,
4054 (stl_sc26198getreg(portp, MR1) & ~MR1_AUTORTS));
4055 stl_sc26198setreg(portp, IOPIOR,
4056 (stl_sc26198getreg(portp, IOPIOR) & ~IOPR_RTS));
4057 portp->stats.rxrtsoff++;
4061 BRDDISABLE(portp->brdnr);
4062 spin_unlock_irqrestore(&brd_lock, flags);
4063 tty_kref_put(tty);
4066 /*****************************************************************************/
4069 * Send a flow control character.
4072 static void stl_sc26198sendflow(struct stlport *portp, int state)
4074 struct tty_struct *tty;
4075 unsigned long flags;
4076 unsigned char mr0;
4078 pr_debug("stl_sc26198sendflow(portp=%p,state=%x)\n", portp, state);
4080 if (portp == NULL)
4081 return;
4082 tty = tty_port_tty_get(&portp->port);
4083 if (tty == NULL)
4084 return;
4086 spin_lock_irqsave(&brd_lock, flags);
4087 BRDENABLE(portp->brdnr, portp->pagenr);
4088 if (state) {
4089 mr0 = stl_sc26198getreg(portp, MR0);
4090 stl_sc26198setreg(portp, MR0, (mr0 & ~MR0_SWFRXTX));
4091 stl_sc26198setreg(portp, SCCR, CR_TXSENDXON);
4092 mr0 |= MR0_SWFRX;
4093 portp->stats.rxxon++;
4094 stl_sc26198wait(portp);
4095 stl_sc26198setreg(portp, MR0, mr0);
4096 } else {
4097 mr0 = stl_sc26198getreg(portp, MR0);
4098 stl_sc26198setreg(portp, MR0, (mr0 & ~MR0_SWFRXTX));
4099 stl_sc26198setreg(portp, SCCR, CR_TXSENDXOFF);
4100 mr0 &= ~MR0_SWFRX;
4101 portp->stats.rxxoff++;
4102 stl_sc26198wait(portp);
4103 stl_sc26198setreg(portp, MR0, mr0);
4105 BRDDISABLE(portp->brdnr);
4106 spin_unlock_irqrestore(&brd_lock, flags);
4107 tty_kref_put(tty);
4110 /*****************************************************************************/
4112 static void stl_sc26198flush(struct stlport *portp)
4114 unsigned long flags;
4116 pr_debug("stl_sc26198flush(portp=%p)\n", portp);
4118 if (portp == NULL)
4119 return;
4121 spin_lock_irqsave(&brd_lock, flags);
4122 BRDENABLE(portp->brdnr, portp->pagenr);
4123 stl_sc26198setreg(portp, SCCR, CR_TXRESET);
4124 stl_sc26198setreg(portp, SCCR, portp->crenable);
4125 BRDDISABLE(portp->brdnr);
4126 portp->tx.tail = portp->tx.head;
4127 spin_unlock_irqrestore(&brd_lock, flags);
4130 /*****************************************************************************/
4133 * Return the current state of data flow on this port. This is only
4134 * really interesting when determining if data has fully completed
4135 * transmission or not... The sc26198 interrupt scheme cannot
4136 * determine when all data has actually drained, so we need to
4137 * check the port statusy register to be sure.
4140 static int stl_sc26198datastate(struct stlport *portp)
4142 unsigned long flags;
4143 unsigned char sr;
4145 pr_debug("stl_sc26198datastate(portp=%p)\n", portp);
4147 if (portp == NULL)
4148 return 0;
4149 if (test_bit(ASYI_TXBUSY, &portp->istate))
4150 return 1;
4152 spin_lock_irqsave(&brd_lock, flags);
4153 BRDENABLE(portp->brdnr, portp->pagenr);
4154 sr = stl_sc26198getreg(portp, SR);
4155 BRDDISABLE(portp->brdnr);
4156 spin_unlock_irqrestore(&brd_lock, flags);
4158 return (sr & SR_TXEMPTY) ? 0 : 1;
4161 /*****************************************************************************/
4164 * Delay for a small amount of time, to give the sc26198 a chance
4165 * to process a command...
4168 static void stl_sc26198wait(struct stlport *portp)
4170 int i;
4172 pr_debug("stl_sc26198wait(portp=%p)\n", portp);
4174 if (portp == NULL)
4175 return;
4177 for (i = 0; i < 20; i++)
4178 stl_sc26198getglobreg(portp, TSTR);
4181 /*****************************************************************************/
4184 * If we are TX flow controlled and in IXANY mode then we may
4185 * need to unflow control here. We gotta do this because of the
4186 * automatic flow control modes of the sc26198.
4189 static void stl_sc26198txunflow(struct stlport *portp, struct tty_struct *tty)
4191 unsigned char mr0;
4193 mr0 = stl_sc26198getreg(portp, MR0);
4194 stl_sc26198setreg(portp, MR0, (mr0 & ~MR0_SWFRXTX));
4195 stl_sc26198setreg(portp, SCCR, CR_HOSTXON);
4196 stl_sc26198wait(portp);
4197 stl_sc26198setreg(portp, MR0, mr0);
4198 clear_bit(ASYI_TXFLOWED, &portp->istate);
4201 /*****************************************************************************/
4204 * Interrupt service routine for sc26198 panels.
4207 static void stl_sc26198intr(struct stlpanel *panelp, unsigned int iobase)
4209 struct stlport *portp;
4210 unsigned int iack;
4212 spin_lock(&brd_lock);
4215 * Work around bug in sc26198 chip... Cannot have A6 address
4216 * line of UART high, else iack will be returned as 0.
4218 outb(0, (iobase + 1));
4220 iack = inb(iobase + XP_IACK);
4221 portp = panelp->ports[(iack & IVR_CHANMASK) + ((iobase & 0x4) << 1)];
4223 if (iack & IVR_RXDATA)
4224 stl_sc26198rxisr(portp, iack);
4225 else if (iack & IVR_TXDATA)
4226 stl_sc26198txisr(portp);
4227 else
4228 stl_sc26198otherisr(portp, iack);
4230 spin_unlock(&brd_lock);
4233 /*****************************************************************************/
4236 * Transmit interrupt handler. This has gotta be fast! Handling TX
4237 * chars is pretty simple, stuff as many as possible from the TX buffer
4238 * into the sc26198 FIFO.
4239 * In practice it is possible that interrupts are enabled but that the
4240 * port has been hung up. Need to handle not having any TX buffer here,
4241 * this is done by using the side effect that head and tail will also
4242 * be NULL if the buffer has been freed.
4245 static void stl_sc26198txisr(struct stlport *portp)
4247 struct tty_struct *tty;
4248 unsigned int ioaddr;
4249 unsigned char mr0;
4250 int len, stlen;
4251 char *head, *tail;
4253 pr_debug("stl_sc26198txisr(portp=%p)\n", portp);
4255 ioaddr = portp->ioaddr;
4256 head = portp->tx.head;
4257 tail = portp->tx.tail;
4258 len = (head >= tail) ? (head - tail) : (STL_TXBUFSIZE - (tail - head));
4259 if ((len == 0) || ((len < STL_TXBUFLOW) &&
4260 (test_bit(ASYI_TXLOW, &portp->istate) == 0))) {
4261 set_bit(ASYI_TXLOW, &portp->istate);
4262 tty = tty_port_tty_get(&portp->port);
4263 if (tty) {
4264 tty_wakeup(tty);
4265 tty_kref_put(tty);
4269 if (len == 0) {
4270 outb((MR0 | portp->uartaddr), (ioaddr + XP_ADDR));
4271 mr0 = inb(ioaddr + XP_DATA);
4272 if ((mr0 & MR0_TXMASK) == MR0_TXEMPTY) {
4273 portp->imr &= ~IR_TXRDY;
4274 outb((IMR | portp->uartaddr), (ioaddr + XP_ADDR));
4275 outb(portp->imr, (ioaddr + XP_DATA));
4276 clear_bit(ASYI_TXBUSY, &portp->istate);
4277 } else {
4278 mr0 |= ((mr0 & ~MR0_TXMASK) | MR0_TXEMPTY);
4279 outb(mr0, (ioaddr + XP_DATA));
4281 } else {
4282 len = min(len, SC26198_TXFIFOSIZE);
4283 portp->stats.txtotal += len;
4284 stlen = min_t(unsigned int, len,
4285 (portp->tx.buf + STL_TXBUFSIZE) - tail);
4286 outb(GTXFIFO, (ioaddr + XP_ADDR));
4287 outsb((ioaddr + XP_DATA), tail, stlen);
4288 len -= stlen;
4289 tail += stlen;
4290 if (tail >= (portp->tx.buf + STL_TXBUFSIZE))
4291 tail = portp->tx.buf;
4292 if (len > 0) {
4293 outsb((ioaddr + XP_DATA), tail, len);
4294 tail += len;
4296 portp->tx.tail = tail;
4300 /*****************************************************************************/
4303 * Receive character interrupt handler. Determine if we have good chars
4304 * or bad chars and then process appropriately. Good chars are easy
4305 * just shove the lot into the RX buffer and set all status byte to 0.
4306 * If a bad RX char then process as required. This routine needs to be
4307 * fast! In practice it is possible that we get an interrupt on a port
4308 * that is closed. This can happen on hangups - since they completely
4309 * shutdown a port not in user context. Need to handle this case.
4312 static void stl_sc26198rxisr(struct stlport *portp, unsigned int iack)
4314 struct tty_struct *tty;
4315 unsigned int len, buflen, ioaddr;
4317 pr_debug("stl_sc26198rxisr(portp=%p,iack=%x)\n", portp, iack);
4319 tty = tty_port_tty_get(&portp->port);
4320 ioaddr = portp->ioaddr;
4321 outb(GIBCR, (ioaddr + XP_ADDR));
4322 len = inb(ioaddr + XP_DATA) + 1;
4324 if ((iack & IVR_TYPEMASK) == IVR_RXDATA) {
4325 if (tty == NULL || (buflen = tty_buffer_request_room(tty, len)) == 0) {
4326 len = min_t(unsigned int, len, sizeof(stl_unwanted));
4327 outb(GRXFIFO, (ioaddr + XP_ADDR));
4328 insb((ioaddr + XP_DATA), &stl_unwanted[0], len);
4329 portp->stats.rxlost += len;
4330 portp->stats.rxtotal += len;
4331 } else {
4332 len = min(len, buflen);
4333 if (len > 0) {
4334 unsigned char *ptr;
4335 outb(GRXFIFO, (ioaddr + XP_ADDR));
4336 tty_prepare_flip_string(tty, &ptr, len);
4337 insb((ioaddr + XP_DATA), ptr, len);
4338 tty_schedule_flip(tty);
4339 portp->stats.rxtotal += len;
4342 } else {
4343 stl_sc26198rxbadchars(portp);
4347 * If we are TX flow controlled and in IXANY mode then we may need
4348 * to unflow control here. We gotta do this because of the automatic
4349 * flow control modes of the sc26198.
4351 if (test_bit(ASYI_TXFLOWED, &portp->istate)) {
4352 if ((tty != NULL) &&
4353 (tty->termios != NULL) &&
4354 (tty->termios->c_iflag & IXANY)) {
4355 stl_sc26198txunflow(portp, tty);
4358 tty_kref_put(tty);
4361 /*****************************************************************************/
4364 * Process an RX bad character.
4367 static void stl_sc26198rxbadch(struct stlport *portp, unsigned char status, char ch)
4369 struct tty_struct *tty;
4370 unsigned int ioaddr;
4372 tty = tty_port_tty_get(&portp->port);
4373 ioaddr = portp->ioaddr;
4375 if (status & SR_RXPARITY)
4376 portp->stats.rxparity++;
4377 if (status & SR_RXFRAMING)
4378 portp->stats.rxframing++;
4379 if (status & SR_RXOVERRUN)
4380 portp->stats.rxoverrun++;
4381 if (status & SR_RXBREAK)
4382 portp->stats.rxbreaks++;
4384 if ((tty != NULL) &&
4385 ((portp->rxignoremsk & status) == 0)) {
4386 if (portp->rxmarkmsk & status) {
4387 if (status & SR_RXBREAK) {
4388 status = TTY_BREAK;
4389 if (portp->port.flags & ASYNC_SAK) {
4390 do_SAK(tty);
4391 BRDENABLE(portp->brdnr, portp->pagenr);
4393 } else if (status & SR_RXPARITY)
4394 status = TTY_PARITY;
4395 else if (status & SR_RXFRAMING)
4396 status = TTY_FRAME;
4397 else if(status & SR_RXOVERRUN)
4398 status = TTY_OVERRUN;
4399 else
4400 status = 0;
4401 } else
4402 status = 0;
4404 tty_insert_flip_char(tty, ch, status);
4405 tty_schedule_flip(tty);
4407 if (status == 0)
4408 portp->stats.rxtotal++;
4410 tty_kref_put(tty);
4413 /*****************************************************************************/
4416 * Process all characters in the RX FIFO of the UART. Check all char
4417 * status bytes as well, and process as required. We need to check
4418 * all bytes in the FIFO, in case some more enter the FIFO while we
4419 * are here. To get the exact character error type we need to switch
4420 * into CHAR error mode (that is why we need to make sure we empty
4421 * the FIFO).
4424 static void stl_sc26198rxbadchars(struct stlport *portp)
4426 unsigned char status, mr1;
4427 char ch;
4430 * To get the precise error type for each character we must switch
4431 * back into CHAR error mode.
4433 mr1 = stl_sc26198getreg(portp, MR1);
4434 stl_sc26198setreg(portp, MR1, (mr1 & ~MR1_ERRBLOCK));
4436 while ((status = stl_sc26198getreg(portp, SR)) & SR_RXRDY) {
4437 stl_sc26198setreg(portp, SCCR, CR_CLEARRXERR);
4438 ch = stl_sc26198getreg(portp, RXFIFO);
4439 stl_sc26198rxbadch(portp, status, ch);
4443 * To get correct interrupt class we must switch back into BLOCK
4444 * error mode.
4446 stl_sc26198setreg(portp, MR1, mr1);
4449 /*****************************************************************************/
4452 * Other interrupt handler. This includes modem signals, flow
4453 * control actions, etc. Most stuff is left to off-level interrupt
4454 * processing time.
4457 static void stl_sc26198otherisr(struct stlport *portp, unsigned int iack)
4459 unsigned char cir, ipr, xisr;
4461 pr_debug("stl_sc26198otherisr(portp=%p,iack=%x)\n", portp, iack);
4463 cir = stl_sc26198getglobreg(portp, CIR);
4465 switch (cir & CIR_SUBTYPEMASK) {
4466 case CIR_SUBCOS:
4467 ipr = stl_sc26198getreg(portp, IPR);
4468 if (ipr & IPR_DCDCHANGE) {
4469 stl_cd_change(portp);
4470 portp->stats.modem++;
4472 break;
4473 case CIR_SUBXONXOFF:
4474 xisr = stl_sc26198getreg(portp, XISR);
4475 if (xisr & XISR_RXXONGOT) {
4476 set_bit(ASYI_TXFLOWED, &portp->istate);
4477 portp->stats.txxoff++;
4479 if (xisr & XISR_RXXOFFGOT) {
4480 clear_bit(ASYI_TXFLOWED, &portp->istate);
4481 portp->stats.txxon++;
4483 break;
4484 case CIR_SUBBREAK:
4485 stl_sc26198setreg(portp, SCCR, CR_BREAKRESET);
4486 stl_sc26198rxbadchars(portp);
4487 break;
4488 default:
4489 break;
4493 static void stl_free_isabrds(void)
4495 struct stlbrd *brdp;
4496 unsigned int i;
4498 for (i = 0; i < stl_nrbrds; i++) {
4499 if ((brdp = stl_brds[i]) == NULL || (brdp->state & STL_PROBED))
4500 continue;
4502 free_irq(brdp->irq, brdp);
4504 stl_cleanup_panels(brdp);
4506 release_region(brdp->ioaddr1, brdp->iosize1);
4507 if (brdp->iosize2 > 0)
4508 release_region(brdp->ioaddr2, brdp->iosize2);
4510 kfree(brdp);
4511 stl_brds[i] = NULL;
4516 * Loadable module initialization stuff.
4518 static int __init stallion_module_init(void)
4520 struct stlbrd *brdp;
4521 struct stlconf conf;
4522 unsigned int i, j;
4523 int retval;
4525 printk(KERN_INFO "%s: version %s\n", stl_drvtitle, stl_drvversion);
4527 spin_lock_init(&stallion_lock);
4528 spin_lock_init(&brd_lock);
4530 stl_serial = alloc_tty_driver(STL_MAXBRDS * STL_MAXPORTS);
4531 if (!stl_serial) {
4532 retval = -ENOMEM;
4533 goto err;
4536 stl_serial->owner = THIS_MODULE;
4537 stl_serial->driver_name = stl_drvname;
4538 stl_serial->name = "ttyE";
4539 stl_serial->major = STL_SERIALMAJOR;
4540 stl_serial->minor_start = 0;
4541 stl_serial->type = TTY_DRIVER_TYPE_SERIAL;
4542 stl_serial->subtype = SERIAL_TYPE_NORMAL;
4543 stl_serial->init_termios = stl_deftermios;
4544 stl_serial->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_DYNAMIC_DEV;
4545 tty_set_operations(stl_serial, &stl_ops);
4547 retval = tty_register_driver(stl_serial);
4548 if (retval) {
4549 printk("STALLION: failed to register serial driver\n");
4550 goto err_frtty;
4554 * Find any dynamically supported boards. That is via module load
4555 * line options.
4557 for (i = stl_nrbrds; i < stl_nargs; i++) {
4558 memset(&conf, 0, sizeof(conf));
4559 if (stl_parsebrd(&conf, stl_brdsp[i]) == 0)
4560 continue;
4561 if ((brdp = stl_allocbrd()) == NULL)
4562 continue;
4563 brdp->brdnr = i;
4564 brdp->brdtype = conf.brdtype;
4565 brdp->ioaddr1 = conf.ioaddr1;
4566 brdp->ioaddr2 = conf.ioaddr2;
4567 brdp->irq = conf.irq;
4568 brdp->irqtype = conf.irqtype;
4569 stl_brds[brdp->brdnr] = brdp;
4570 if (stl_brdinit(brdp)) {
4571 stl_brds[brdp->brdnr] = NULL;
4572 kfree(brdp);
4573 } else {
4574 for (j = 0; j < brdp->nrports; j++)
4575 tty_register_device(stl_serial,
4576 brdp->brdnr * STL_MAXPORTS + j, NULL);
4577 stl_nrbrds = i + 1;
4581 /* this has to be _after_ isa finding because of locking */
4582 retval = pci_register_driver(&stl_pcidriver);
4583 if (retval && stl_nrbrds == 0) {
4584 printk(KERN_ERR "STALLION: can't register pci driver\n");
4585 goto err_unrtty;
4589 * Set up a character driver for per board stuff. This is mainly used
4590 * to do stats ioctls on the ports.
4592 if (register_chrdev(STL_SIOMEMMAJOR, "staliomem", &stl_fsiomem))
4593 printk("STALLION: failed to register serial board device\n");
4595 stallion_class = class_create(THIS_MODULE, "staliomem");
4596 if (IS_ERR(stallion_class))
4597 printk("STALLION: failed to create class\n");
4598 for (i = 0; i < 4; i++)
4599 device_create(stallion_class, NULL, MKDEV(STL_SIOMEMMAJOR, i),
4600 NULL, "staliomem%d", i);
4602 return 0;
4603 err_unrtty:
4604 tty_unregister_driver(stl_serial);
4605 err_frtty:
4606 put_tty_driver(stl_serial);
4607 err:
4608 return retval;
4611 static void __exit stallion_module_exit(void)
4613 struct stlbrd *brdp;
4614 unsigned int i, j;
4616 pr_debug("cleanup_module()\n");
4618 printk(KERN_INFO "Unloading %s: version %s\n", stl_drvtitle,
4619 stl_drvversion);
4622 * Free up all allocated resources used by the ports. This includes
4623 * memory and interrupts. As part of this process we will also do
4624 * a hangup on every open port - to try to flush out any processes
4625 * hanging onto ports.
4627 for (i = 0; i < stl_nrbrds; i++) {
4628 if ((brdp = stl_brds[i]) == NULL || (brdp->state & STL_PROBED))
4629 continue;
4630 for (j = 0; j < brdp->nrports; j++)
4631 tty_unregister_device(stl_serial,
4632 brdp->brdnr * STL_MAXPORTS + j);
4635 for (i = 0; i < 4; i++)
4636 device_destroy(stallion_class, MKDEV(STL_SIOMEMMAJOR, i));
4637 unregister_chrdev(STL_SIOMEMMAJOR, "staliomem");
4638 class_destroy(stallion_class);
4640 pci_unregister_driver(&stl_pcidriver);
4642 stl_free_isabrds();
4644 tty_unregister_driver(stl_serial);
4645 put_tty_driver(stl_serial);
4648 module_init(stallion_module_init);
4649 module_exit(stallion_module_exit);
4651 MODULE_AUTHOR("Greg Ungerer");
4652 MODULE_DESCRIPTION("Stallion Multiport Serial Driver");
4653 MODULE_LICENSE("GPL");