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