• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*****************************************************************************/
2 
3 /*
4  *	istallion.c  -- stallion intelligent 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  */
18 
19 /*****************************************************************************/
20 
21 #include <linux/module.h>
22 #include <linux/slab.h>
23 #include <linux/interrupt.h>
24 #include <linux/tty.h>
25 #include <linux/tty_flip.h>
26 #include <linux/serial.h>
27 #include <linux/cdk.h>
28 #include <linux/comstats.h>
29 #include <linux/istallion.h>
30 #include <linux/ioport.h>
31 #include <linux/delay.h>
32 #include <linux/init.h>
33 #include <linux/device.h>
34 #include <linux/wait.h>
35 #include <linux/eisa.h>
36 #include <linux/ctype.h>
37 
38 #include <asm/io.h>
39 #include <asm/uaccess.h>
40 
41 #include <linux/pci.h>
42 
43 /*****************************************************************************/
44 
45 /*
46  *	Define different board types. Not all of the following board types
47  *	are supported by this driver. But I will use the standard "assigned"
48  *	board numbers. Currently supported boards are abbreviated as:
49  *	ECP = EasyConnection 8/64, ONB = ONboard, BBY = Brumby and
50  *	STAL = Stallion.
51  */
52 #define	BRD_UNKNOWN	0
53 #define	BRD_STALLION	1
54 #define	BRD_BRUMBY4	2
55 #define	BRD_ONBOARD2	3
56 #define	BRD_ONBOARD	4
57 #define	BRD_ONBOARDE	7
58 #define	BRD_ECP		23
59 #define BRD_ECPE	24
60 #define	BRD_ECPMC	25
61 #define	BRD_ECPPCI	29
62 
63 #define	BRD_BRUMBY	BRD_BRUMBY4
64 
65 /*
66  *	Define a configuration structure to hold the board configuration.
67  *	Need to set this up in the code (for now) with the boards that are
68  *	to be configured into the system. This is what needs to be modified
69  *	when adding/removing/modifying boards. Each line entry in the
70  *	stli_brdconf[] array is a board. Each line contains io/irq/memory
71  *	ranges for that board (as well as what type of board it is).
72  *	Some examples:
73  *		{ BRD_ECP, 0x2a0, 0, 0xcc000, 0, 0 },
74  *	This line will configure an EasyConnection 8/64 at io address 2a0,
75  *	and shared memory address of cc000. Multiple EasyConnection 8/64
76  *	boards can share the same shared memory address space. No interrupt
77  *	is required for this board type.
78  *	Another example:
79  *		{ BRD_ECPE, 0x5000, 0, 0x80000000, 0, 0 },
80  *	This line will configure an EasyConnection 8/64 EISA in slot 5 and
81  *	shared memory address of 0x80000000 (2 GByte). Multiple
82  *	EasyConnection 8/64 EISA boards can share the same shared memory
83  *	address space. No interrupt is required for this board type.
84  *	Another example:
85  *		{ BRD_ONBOARD, 0x240, 0, 0xd0000, 0, 0 },
86  *	This line will configure an ONboard (ISA type) at io address 240,
87  *	and shared memory address of d0000. Multiple ONboards can share
88  *	the same shared memory address space. No interrupt required.
89  *	Another example:
90  *		{ BRD_BRUMBY4, 0x360, 0, 0xc8000, 0, 0 },
91  *	This line will configure a Brumby board (any number of ports!) at
92  *	io address 360 and shared memory address of c8000. All Brumby boards
93  *	configured into a system must have their own separate io and memory
94  *	addresses. No interrupt is required.
95  *	Another example:
96  *		{ BRD_STALLION, 0x330, 0, 0xd0000, 0, 0 },
97  *	This line will configure an original Stallion board at io address 330
98  *	and shared memory address d0000 (this would only be valid for a "V4.0"
99  *	or Rev.O Stallion board). All Stallion boards configured into the
100  *	system must have their own separate io and memory addresses. No
101  *	interrupt is required.
102  */
103 
104 struct stlconf {
105 	int		brdtype;
106 	int		ioaddr1;
107 	int		ioaddr2;
108 	unsigned long	memaddr;
109 	int		irq;
110 	int		irqtype;
111 };
112 
113 static unsigned int stli_nrbrds;
114 
115 /* stli_lock must NOT be taken holding brd_lock */
116 static spinlock_t stli_lock;	/* TTY logic lock */
117 static spinlock_t brd_lock;	/* Board logic lock */
118 
119 /*
120  *	There is some experimental EISA board detection code in this driver.
121  *	By default it is disabled, but for those that want to try it out,
122  *	then set the define below to be 1.
123  */
124 #define	STLI_EISAPROBE	0
125 
126 /*****************************************************************************/
127 
128 /*
129  *	Define some important driver characteristics. Device major numbers
130  *	allocated as per Linux Device Registry.
131  */
132 #ifndef	STL_SIOMEMMAJOR
133 #define	STL_SIOMEMMAJOR		28
134 #endif
135 #ifndef	STL_SERIALMAJOR
136 #define	STL_SERIALMAJOR		24
137 #endif
138 #ifndef	STL_CALLOUTMAJOR
139 #define	STL_CALLOUTMAJOR	25
140 #endif
141 
142 /*****************************************************************************/
143 
144 /*
145  *	Define our local driver identity first. Set up stuff to deal with
146  *	all the local structures required by a serial tty driver.
147  */
148 static char	*stli_drvtitle = "Stallion Intelligent Multiport Serial Driver";
149 static char	*stli_drvname = "istallion";
150 static char	*stli_drvversion = "5.6.0";
151 static char	*stli_serialname = "ttyE";
152 
153 static struct tty_driver	*stli_serial;
154 static const struct tty_port_operations stli_port_ops;
155 
156 #define	STLI_TXBUFSIZE		4096
157 
158 /*
159  *	Use a fast local buffer for cooked characters. Typically a whole
160  *	bunch of cooked characters come in for a port, 1 at a time. So we
161  *	save those up into a local buffer, then write out the whole lot
162  *	with a large memcpy. Just use 1 buffer for all ports, since its
163  *	use it is only need for short periods of time by each port.
164  */
165 static char			*stli_txcookbuf;
166 static int			stli_txcooksize;
167 static int			stli_txcookrealsize;
168 static struct tty_struct	*stli_txcooktty;
169 
170 /*
171  *	Define a local default termios struct. All ports will be created
172  *	with this termios initially. Basically all it defines is a raw port
173  *	at 9600 baud, 8 data bits, no parity, 1 stop bit.
174  */
175 static struct ktermios		stli_deftermios = {
176 	.c_cflag	= (B9600 | CS8 | CREAD | HUPCL | CLOCAL),
177 	.c_cc		= INIT_C_CC,
178 	.c_ispeed	= 9600,
179 	.c_ospeed	= 9600,
180 };
181 
182 /*
183  *	Define global stats structures. Not used often, and can be
184  *	re-used for each stats call.
185  */
186 static comstats_t	stli_comstats;
187 static combrd_t		stli_brdstats;
188 static struct asystats	stli_cdkstats;
189 
190 /*****************************************************************************/
191 
192 static DEFINE_MUTEX(stli_brdslock);
193 static struct stlibrd	*stli_brds[STL_MAXBRDS];
194 
195 static int		stli_shared;
196 
197 /*
198  *	Per board state flags. Used with the state field of the board struct.
199  *	Not really much here... All we need to do is keep track of whether
200  *	the board has been detected, and whether it is actually running a slave
201  *	or not.
202  */
203 #define	BST_FOUND	0x1
204 #define	BST_STARTED	0x2
205 #define	BST_PROBED	0x4
206 
207 /*
208  *	Define the set of port state flags. These are marked for internal
209  *	state purposes only, usually to do with the state of communications
210  *	with the slave. Most of them need to be updated atomically, so always
211  *	use the bit setting operations (unless protected by cli/sti).
212  */
213 #define	ST_INITIALIZING	1
214 #define	ST_OPENING	2
215 #define	ST_CLOSING	3
216 #define	ST_CMDING	4
217 #define	ST_TXBUSY	5
218 #define	ST_RXING	6
219 #define	ST_DOFLUSHRX	7
220 #define	ST_DOFLUSHTX	8
221 #define	ST_DOSIGS	9
222 #define	ST_RXSTOP	10
223 #define	ST_GETSIGS	11
224 
225 /*
226  *	Define an array of board names as printable strings. Handy for
227  *	referencing boards when printing trace and stuff.
228  */
229 static char	*stli_brdnames[] = {
230 	"Unknown",
231 	"Stallion",
232 	"Brumby",
233 	"ONboard-MC",
234 	"ONboard",
235 	"Brumby",
236 	"Brumby",
237 	"ONboard-EI",
238 	NULL,
239 	"ONboard",
240 	"ONboard-MC",
241 	"ONboard-MC",
242 	NULL,
243 	NULL,
244 	NULL,
245 	NULL,
246 	NULL,
247 	NULL,
248 	NULL,
249 	NULL,
250 	"EasyIO",
251 	"EC8/32-AT",
252 	"EC8/32-MC",
253 	"EC8/64-AT",
254 	"EC8/64-EI",
255 	"EC8/64-MC",
256 	"EC8/32-PCI",
257 	"EC8/64-PCI",
258 	"EasyIO-PCI",
259 	"EC/RA-PCI",
260 };
261 
262 /*****************************************************************************/
263 
264 /*
265  *	Define some string labels for arguments passed from the module
266  *	load line. These allow for easy board definitions, and easy
267  *	modification of the io, memory and irq resoucres.
268  */
269 
270 static char	*board0[8];
271 static char	*board1[8];
272 static char	*board2[8];
273 static char	*board3[8];
274 
275 static char	**stli_brdsp[] = {
276 	(char **) &board0,
277 	(char **) &board1,
278 	(char **) &board2,
279 	(char **) &board3
280 };
281 
282 /*
283  *	Define a set of common board names, and types. This is used to
284  *	parse any module arguments.
285  */
286 
287 static struct stlibrdtype {
288 	char	*name;
289 	int	type;
290 } stli_brdstr[] = {
291 	{ "stallion", BRD_STALLION },
292 	{ "1", BRD_STALLION },
293 	{ "brumby", BRD_BRUMBY },
294 	{ "brumby4", BRD_BRUMBY },
295 	{ "brumby/4", BRD_BRUMBY },
296 	{ "brumby-4", BRD_BRUMBY },
297 	{ "brumby8", BRD_BRUMBY },
298 	{ "brumby/8", BRD_BRUMBY },
299 	{ "brumby-8", BRD_BRUMBY },
300 	{ "brumby16", BRD_BRUMBY },
301 	{ "brumby/16", BRD_BRUMBY },
302 	{ "brumby-16", BRD_BRUMBY },
303 	{ "2", BRD_BRUMBY },
304 	{ "onboard2", BRD_ONBOARD2 },
305 	{ "onboard-2", BRD_ONBOARD2 },
306 	{ "onboard/2", BRD_ONBOARD2 },
307 	{ "onboard-mc", BRD_ONBOARD2 },
308 	{ "onboard/mc", BRD_ONBOARD2 },
309 	{ "onboard-mca", BRD_ONBOARD2 },
310 	{ "onboard/mca", BRD_ONBOARD2 },
311 	{ "3", BRD_ONBOARD2 },
312 	{ "onboard", BRD_ONBOARD },
313 	{ "onboardat", BRD_ONBOARD },
314 	{ "4", BRD_ONBOARD },
315 	{ "onboarde", BRD_ONBOARDE },
316 	{ "onboard-e", BRD_ONBOARDE },
317 	{ "onboard/e", BRD_ONBOARDE },
318 	{ "onboard-ei", BRD_ONBOARDE },
319 	{ "onboard/ei", BRD_ONBOARDE },
320 	{ "7", BRD_ONBOARDE },
321 	{ "ecp", BRD_ECP },
322 	{ "ecpat", BRD_ECP },
323 	{ "ec8/64", BRD_ECP },
324 	{ "ec8/64-at", BRD_ECP },
325 	{ "ec8/64-isa", BRD_ECP },
326 	{ "23", BRD_ECP },
327 	{ "ecpe", BRD_ECPE },
328 	{ "ecpei", BRD_ECPE },
329 	{ "ec8/64-e", BRD_ECPE },
330 	{ "ec8/64-ei", BRD_ECPE },
331 	{ "24", BRD_ECPE },
332 	{ "ecpmc", BRD_ECPMC },
333 	{ "ec8/64-mc", BRD_ECPMC },
334 	{ "ec8/64-mca", BRD_ECPMC },
335 	{ "25", BRD_ECPMC },
336 	{ "ecppci", BRD_ECPPCI },
337 	{ "ec/ra", BRD_ECPPCI },
338 	{ "ec/ra-pc", BRD_ECPPCI },
339 	{ "ec/ra-pci", BRD_ECPPCI },
340 	{ "29", BRD_ECPPCI },
341 };
342 
343 /*
344  *	Define the module agruments.
345  */
346 MODULE_AUTHOR("Greg Ungerer");
347 MODULE_DESCRIPTION("Stallion Intelligent Multiport Serial Driver");
348 MODULE_LICENSE("GPL");
349 
350 
351 module_param_array(board0, charp, NULL, 0);
352 MODULE_PARM_DESC(board0, "Board 0 config -> name[,ioaddr[,memaddr]");
353 module_param_array(board1, charp, NULL, 0);
354 MODULE_PARM_DESC(board1, "Board 1 config -> name[,ioaddr[,memaddr]");
355 module_param_array(board2, charp, NULL, 0);
356 MODULE_PARM_DESC(board2, "Board 2 config -> name[,ioaddr[,memaddr]");
357 module_param_array(board3, charp, NULL, 0);
358 MODULE_PARM_DESC(board3, "Board 3 config -> name[,ioaddr[,memaddr]");
359 
360 #if STLI_EISAPROBE != 0
361 /*
362  *	Set up a default memory address table for EISA board probing.
363  *	The default addresses are all bellow 1Mbyte, which has to be the
364  *	case anyway. They should be safe, since we only read values from
365  *	them, and interrupts are disabled while we do it. If the higher
366  *	memory support is compiled in then we also try probing around
367  *	the 1Gb, 2Gb and 3Gb areas as well...
368  */
369 static unsigned long	stli_eisamemprobeaddrs[] = {
370 	0xc0000,    0xd0000,    0xe0000,    0xf0000,
371 	0x80000000, 0x80010000, 0x80020000, 0x80030000,
372 	0x40000000, 0x40010000, 0x40020000, 0x40030000,
373 	0xc0000000, 0xc0010000, 0xc0020000, 0xc0030000,
374 	0xff000000, 0xff010000, 0xff020000, 0xff030000,
375 };
376 
377 static int	stli_eisamempsize = ARRAY_SIZE(stli_eisamemprobeaddrs);
378 #endif
379 
380 /*
381  *	Define the Stallion PCI vendor and device IDs.
382  */
383 #ifndef PCI_DEVICE_ID_ECRA
384 #define	PCI_DEVICE_ID_ECRA		0x0004
385 #endif
386 
387 static struct pci_device_id istallion_pci_tbl[] = {
388 	{ PCI_DEVICE(PCI_VENDOR_ID_STALLION, PCI_DEVICE_ID_ECRA), },
389 	{ 0 }
390 };
391 MODULE_DEVICE_TABLE(pci, istallion_pci_tbl);
392 
393 static struct pci_driver stli_pcidriver;
394 
395 /*****************************************************************************/
396 
397 /*
398  *	Hardware configuration info for ECP boards. These defines apply
399  *	to the directly accessible io ports of the ECP. There is a set of
400  *	defines for each ECP board type, ISA, EISA, MCA and PCI.
401  */
402 #define	ECP_IOSIZE	4
403 
404 #define	ECP_MEMSIZE	(128 * 1024)
405 #define	ECP_PCIMEMSIZE	(256 * 1024)
406 
407 #define	ECP_ATPAGESIZE	(4 * 1024)
408 #define	ECP_MCPAGESIZE	(4 * 1024)
409 #define	ECP_EIPAGESIZE	(64 * 1024)
410 #define	ECP_PCIPAGESIZE	(64 * 1024)
411 
412 #define	STL_EISAID	0x8c4e
413 
414 /*
415  *	Important defines for the ISA class of ECP board.
416  */
417 #define	ECP_ATIREG	0
418 #define	ECP_ATCONFR	1
419 #define	ECP_ATMEMAR	2
420 #define	ECP_ATMEMPR	3
421 #define	ECP_ATSTOP	0x1
422 #define	ECP_ATINTENAB	0x10
423 #define	ECP_ATENABLE	0x20
424 #define	ECP_ATDISABLE	0x00
425 #define	ECP_ATADDRMASK	0x3f000
426 #define	ECP_ATADDRSHFT	12
427 
428 /*
429  *	Important defines for the EISA class of ECP board.
430  */
431 #define	ECP_EIIREG	0
432 #define	ECP_EIMEMARL	1
433 #define	ECP_EICONFR	2
434 #define	ECP_EIMEMARH	3
435 #define	ECP_EIENABLE	0x1
436 #define	ECP_EIDISABLE	0x0
437 #define	ECP_EISTOP	0x4
438 #define	ECP_EIEDGE	0x00
439 #define	ECP_EILEVEL	0x80
440 #define	ECP_EIADDRMASKL	0x00ff0000
441 #define	ECP_EIADDRSHFTL	16
442 #define	ECP_EIADDRMASKH	0xff000000
443 #define	ECP_EIADDRSHFTH	24
444 #define	ECP_EIBRDENAB	0xc84
445 
446 #define	ECP_EISAID	0x4
447 
448 /*
449  *	Important defines for the Micro-channel class of ECP board.
450  *	(It has a lot in common with the ISA boards.)
451  */
452 #define	ECP_MCIREG	0
453 #define	ECP_MCCONFR	1
454 #define	ECP_MCSTOP	0x20
455 #define	ECP_MCENABLE	0x80
456 #define	ECP_MCDISABLE	0x00
457 
458 /*
459  *	Important defines for the PCI class of ECP board.
460  *	(It has a lot in common with the other ECP boards.)
461  */
462 #define	ECP_PCIIREG	0
463 #define	ECP_PCICONFR	1
464 #define	ECP_PCISTOP	0x01
465 
466 /*
467  *	Hardware configuration info for ONboard and Brumby boards. These
468  *	defines apply to the directly accessible io ports of these boards.
469  */
470 #define	ONB_IOSIZE	16
471 #define	ONB_MEMSIZE	(64 * 1024)
472 #define	ONB_ATPAGESIZE	(64 * 1024)
473 #define	ONB_MCPAGESIZE	(64 * 1024)
474 #define	ONB_EIMEMSIZE	(128 * 1024)
475 #define	ONB_EIPAGESIZE	(64 * 1024)
476 
477 /*
478  *	Important defines for the ISA class of ONboard board.
479  */
480 #define	ONB_ATIREG	0
481 #define	ONB_ATMEMAR	1
482 #define	ONB_ATCONFR	2
483 #define	ONB_ATSTOP	0x4
484 #define	ONB_ATENABLE	0x01
485 #define	ONB_ATDISABLE	0x00
486 #define	ONB_ATADDRMASK	0xff0000
487 #define	ONB_ATADDRSHFT	16
488 
489 #define	ONB_MEMENABLO	0
490 #define	ONB_MEMENABHI	0x02
491 
492 /*
493  *	Important defines for the EISA class of ONboard board.
494  */
495 #define	ONB_EIIREG	0
496 #define	ONB_EIMEMARL	1
497 #define	ONB_EICONFR	2
498 #define	ONB_EIMEMARH	3
499 #define	ONB_EIENABLE	0x1
500 #define	ONB_EIDISABLE	0x0
501 #define	ONB_EISTOP	0x4
502 #define	ONB_EIEDGE	0x00
503 #define	ONB_EILEVEL	0x80
504 #define	ONB_EIADDRMASKL	0x00ff0000
505 #define	ONB_EIADDRSHFTL	16
506 #define	ONB_EIADDRMASKH	0xff000000
507 #define	ONB_EIADDRSHFTH	24
508 #define	ONB_EIBRDENAB	0xc84
509 
510 #define	ONB_EISAID	0x1
511 
512 /*
513  *	Important defines for the Brumby boards. They are pretty simple,
514  *	there is not much that is programmably configurable.
515  */
516 #define	BBY_IOSIZE	16
517 #define	BBY_MEMSIZE	(64 * 1024)
518 #define	BBY_PAGESIZE	(16 * 1024)
519 
520 #define	BBY_ATIREG	0
521 #define	BBY_ATCONFR	1
522 #define	BBY_ATSTOP	0x4
523 
524 /*
525  *	Important defines for the Stallion boards. They are pretty simple,
526  *	there is not much that is programmably configurable.
527  */
528 #define	STAL_IOSIZE	16
529 #define	STAL_MEMSIZE	(64 * 1024)
530 #define	STAL_PAGESIZE	(64 * 1024)
531 
532 /*
533  *	Define the set of status register values for EasyConnection panels.
534  *	The signature will return with the status value for each panel. From
535  *	this we can determine what is attached to the board - before we have
536  *	actually down loaded any code to it.
537  */
538 #define	ECH_PNLSTATUS	2
539 #define	ECH_PNL16PORT	0x20
540 #define	ECH_PNLIDMASK	0x07
541 #define	ECH_PNLXPID	0x40
542 #define	ECH_PNLINTRPEND	0x80
543 
544 /*
545  *	Define some macros to do things to the board. Even those these boards
546  *	are somewhat related there is often significantly different ways of
547  *	doing some operation on it (like enable, paging, reset, etc). So each
548  *	board class has a set of functions which do the commonly required
549  *	operations. The macros below basically just call these functions,
550  *	generally checking for a NULL function - which means that the board
551  *	needs nothing done to it to achieve this operation!
552  */
553 #define	EBRDINIT(brdp)						\
554 	if (brdp->init != NULL)					\
555 		(* brdp->init)(brdp)
556 
557 #define	EBRDENABLE(brdp)					\
558 	if (brdp->enable != NULL)				\
559 		(* brdp->enable)(brdp);
560 
561 #define	EBRDDISABLE(brdp)					\
562 	if (brdp->disable != NULL)				\
563 		(* brdp->disable)(brdp);
564 
565 #define	EBRDINTR(brdp)						\
566 	if (brdp->intr != NULL)					\
567 		(* brdp->intr)(brdp);
568 
569 #define	EBRDRESET(brdp)						\
570 	if (brdp->reset != NULL)				\
571 		(* brdp->reset)(brdp);
572 
573 #define	EBRDGETMEMPTR(brdp,offset)				\
574 	(* brdp->getmemptr)(brdp, offset, __LINE__)
575 
576 /*
577  *	Define the maximal baud rate, and the default baud base for ports.
578  */
579 #define	STL_MAXBAUD	460800
580 #define	STL_BAUDBASE	115200
581 #define	STL_CLOSEDELAY	(5 * HZ / 10)
582 
583 /*****************************************************************************/
584 
585 /*
586  *	Define macros to extract a brd or port number from a minor number.
587  */
588 #define	MINOR2BRD(min)		(((min) & 0xc0) >> 6)
589 #define	MINOR2PORT(min)		((min) & 0x3f)
590 
591 /*****************************************************************************/
592 
593 /*
594  *	Prototype all functions in this driver!
595  */
596 
597 static int	stli_parsebrd(struct stlconf *confp, char **argp);
598 static int	stli_open(struct tty_struct *tty, struct file *filp);
599 static void	stli_close(struct tty_struct *tty, struct file *filp);
600 static int	stli_write(struct tty_struct *tty, const unsigned char *buf, int count);
601 static int	stli_putchar(struct tty_struct *tty, unsigned char ch);
602 static void	stli_flushchars(struct tty_struct *tty);
603 static int	stli_writeroom(struct tty_struct *tty);
604 static int	stli_charsinbuffer(struct tty_struct *tty);
605 static int	stli_ioctl(struct tty_struct *tty, struct file *file, unsigned int cmd, unsigned long arg);
606 static void	stli_settermios(struct tty_struct *tty, struct ktermios *old);
607 static void	stli_throttle(struct tty_struct *tty);
608 static void	stli_unthrottle(struct tty_struct *tty);
609 static void	stli_stop(struct tty_struct *tty);
610 static void	stli_start(struct tty_struct *tty);
611 static void	stli_flushbuffer(struct tty_struct *tty);
612 static int	stli_breakctl(struct tty_struct *tty, int state);
613 static void	stli_waituntilsent(struct tty_struct *tty, int timeout);
614 static void	stli_sendxchar(struct tty_struct *tty, char ch);
615 static void	stli_hangup(struct tty_struct *tty);
616 static int	stli_portinfo(struct stlibrd *brdp, struct stliport *portp, int portnr, char *pos);
617 
618 static int	stli_brdinit(struct stlibrd *brdp);
619 static int	stli_startbrd(struct stlibrd *brdp);
620 static ssize_t	stli_memread(struct file *fp, char __user *buf, size_t count, loff_t *offp);
621 static ssize_t	stli_memwrite(struct file *fp, const char __user *buf, size_t count, loff_t *offp);
622 static int	stli_memioctl(struct inode *ip, struct file *fp, unsigned int cmd, unsigned long arg);
623 static void	stli_brdpoll(struct stlibrd *brdp, cdkhdr_t __iomem *hdrp);
624 static void	stli_poll(unsigned long arg);
625 static int	stli_hostcmd(struct stlibrd *brdp, struct stliport *portp);
626 static int	stli_initopen(struct tty_struct *tty, struct stlibrd *brdp, struct stliport *portp);
627 static int	stli_rawopen(struct stlibrd *brdp, struct stliport *portp, unsigned long arg, int wait);
628 static int	stli_rawclose(struct stlibrd *brdp, struct stliport *portp, unsigned long arg, int wait);
629 static int	stli_setport(struct tty_struct *tty);
630 static int	stli_cmdwait(struct stlibrd *brdp, struct stliport *portp, unsigned long cmd, void *arg, int size, int copyback);
631 static void	stli_sendcmd(struct stlibrd *brdp, struct stliport *portp, unsigned long cmd, void *arg, int size, int copyback);
632 static void	__stli_sendcmd(struct stlibrd *brdp, struct stliport *portp, unsigned long cmd, void *arg, int size, int copyback);
633 static void	stli_dodelaycmd(struct stliport *portp, cdkctrl_t __iomem *cp);
634 static void	stli_mkasyport(struct tty_struct *tty, struct stliport *portp, asyport_t *pp, struct ktermios *tiosp);
635 static void	stli_mkasysigs(asysigs_t *sp, int dtr, int rts);
636 static long	stli_mktiocm(unsigned long sigvalue);
637 static void	stli_read(struct stlibrd *brdp, struct stliport *portp);
638 static int	stli_getserial(struct stliport *portp, struct serial_struct __user *sp);
639 static int	stli_setserial(struct tty_struct *tty, struct serial_struct __user *sp);
640 static int	stli_getbrdstats(combrd_t __user *bp);
641 static int	stli_getportstats(struct tty_struct *tty, struct stliport *portp, comstats_t __user *cp);
642 static int	stli_portcmdstats(struct tty_struct *tty, struct stliport *portp);
643 static int	stli_clrportstats(struct stliport *portp, comstats_t __user *cp);
644 static int	stli_getportstruct(struct stliport __user *arg);
645 static int	stli_getbrdstruct(struct stlibrd __user *arg);
646 static struct stlibrd *stli_allocbrd(void);
647 
648 static void	stli_ecpinit(struct stlibrd *brdp);
649 static void	stli_ecpenable(struct stlibrd *brdp);
650 static void	stli_ecpdisable(struct stlibrd *brdp);
651 static void __iomem *stli_ecpgetmemptr(struct stlibrd *brdp, unsigned long offset, int line);
652 static void	stli_ecpreset(struct stlibrd *brdp);
653 static void	stli_ecpintr(struct stlibrd *brdp);
654 static void	stli_ecpeiinit(struct stlibrd *brdp);
655 static void	stli_ecpeienable(struct stlibrd *brdp);
656 static void	stli_ecpeidisable(struct stlibrd *brdp);
657 static void __iomem *stli_ecpeigetmemptr(struct stlibrd *brdp, unsigned long offset, int line);
658 static void	stli_ecpeireset(struct stlibrd *brdp);
659 static void	stli_ecpmcenable(struct stlibrd *brdp);
660 static void	stli_ecpmcdisable(struct stlibrd *brdp);
661 static void __iomem *stli_ecpmcgetmemptr(struct stlibrd *brdp, unsigned long offset, int line);
662 static void	stli_ecpmcreset(struct stlibrd *brdp);
663 static void	stli_ecppciinit(struct stlibrd *brdp);
664 static void __iomem *stli_ecppcigetmemptr(struct stlibrd *brdp, unsigned long offset, int line);
665 static void	stli_ecppcireset(struct stlibrd *brdp);
666 
667 static void	stli_onbinit(struct stlibrd *brdp);
668 static void	stli_onbenable(struct stlibrd *brdp);
669 static void	stli_onbdisable(struct stlibrd *brdp);
670 static void __iomem *stli_onbgetmemptr(struct stlibrd *brdp, unsigned long offset, int line);
671 static void	stli_onbreset(struct stlibrd *brdp);
672 static void	stli_onbeinit(struct stlibrd *brdp);
673 static void	stli_onbeenable(struct stlibrd *brdp);
674 static void	stli_onbedisable(struct stlibrd *brdp);
675 static void __iomem *stli_onbegetmemptr(struct stlibrd *brdp, unsigned long offset, int line);
676 static void	stli_onbereset(struct stlibrd *brdp);
677 static void	stli_bbyinit(struct stlibrd *brdp);
678 static void __iomem *stli_bbygetmemptr(struct stlibrd *brdp, unsigned long offset, int line);
679 static void	stli_bbyreset(struct stlibrd *brdp);
680 static void	stli_stalinit(struct stlibrd *brdp);
681 static void __iomem *stli_stalgetmemptr(struct stlibrd *brdp, unsigned long offset, int line);
682 static void	stli_stalreset(struct stlibrd *brdp);
683 
684 static struct stliport *stli_getport(unsigned int brdnr, unsigned int panelnr, unsigned int portnr);
685 
686 static int	stli_initecp(struct stlibrd *brdp);
687 static int	stli_initonb(struct stlibrd *brdp);
688 #if STLI_EISAPROBE != 0
689 static int	stli_eisamemprobe(struct stlibrd *brdp);
690 #endif
691 static int	stli_initports(struct stlibrd *brdp);
692 
693 /*****************************************************************************/
694 
695 /*
696  *	Define the driver info for a user level shared memory device. This
697  *	device will work sort of like the /dev/kmem device - except that it
698  *	will give access to the shared memory on the Stallion intelligent
699  *	board. This is also a very useful debugging tool.
700  */
701 static const struct file_operations	stli_fsiomem = {
702 	.owner		= THIS_MODULE,
703 	.read		= stli_memread,
704 	.write		= stli_memwrite,
705 	.ioctl		= stli_memioctl,
706 };
707 
708 /*****************************************************************************/
709 
710 /*
711  *	Define a timer_list entry for our poll routine. The slave board
712  *	is polled every so often to see if anything needs doing. This is
713  *	much cheaper on host cpu than using interrupts. It turns out to
714  *	not increase character latency by much either...
715  */
716 static DEFINE_TIMER(stli_timerlist, stli_poll, 0, 0);
717 
718 static int	stli_timeron;
719 
720 /*
721  *	Define the calculation for the timeout routine.
722  */
723 #define	STLI_TIMEOUT	(jiffies + 1)
724 
725 /*****************************************************************************/
726 
727 static struct class *istallion_class;
728 
stli_cleanup_ports(struct stlibrd * brdp)729 static void stli_cleanup_ports(struct stlibrd *brdp)
730 {
731 	struct stliport *portp;
732 	unsigned int j;
733 	struct tty_struct *tty;
734 
735 	for (j = 0; j < STL_MAXPORTS; j++) {
736 		portp = brdp->ports[j];
737 		if (portp != NULL) {
738 			tty = tty_port_tty_get(&portp->port);
739 			if (tty != NULL) {
740 				tty_hangup(tty);
741 				tty_kref_put(tty);
742 			}
743 			kfree(portp);
744 		}
745 	}
746 }
747 
748 /*****************************************************************************/
749 
750 /*
751  *	Parse the supplied argument string, into the board conf struct.
752  */
753 
stli_parsebrd(struct stlconf * confp,char ** argp)754 static int stli_parsebrd(struct stlconf *confp, char **argp)
755 {
756 	unsigned int i;
757 	char *sp;
758 
759 	if (argp[0] == NULL || *argp[0] == 0)
760 		return 0;
761 
762 	for (sp = argp[0], i = 0; ((*sp != 0) && (i < 25)); sp++, i++)
763 		*sp = tolower(*sp);
764 
765 	for (i = 0; i < ARRAY_SIZE(stli_brdstr); i++) {
766 		if (strcmp(stli_brdstr[i].name, argp[0]) == 0)
767 			break;
768 	}
769 	if (i == ARRAY_SIZE(stli_brdstr)) {
770 		printk(KERN_WARNING "istallion: unknown board name, %s?\n", argp[0]);
771 		return 0;
772 	}
773 
774 	confp->brdtype = stli_brdstr[i].type;
775 	if (argp[1] != NULL && *argp[1] != 0)
776 		confp->ioaddr1 = simple_strtoul(argp[1], NULL, 0);
777 	if (argp[2] !=  NULL && *argp[2] != 0)
778 		confp->memaddr = simple_strtoul(argp[2], NULL, 0);
779 	return(1);
780 }
781 
782 /*****************************************************************************/
783 
stli_open(struct tty_struct * tty,struct file * filp)784 static int stli_open(struct tty_struct *tty, struct file *filp)
785 {
786 	struct stlibrd *brdp;
787 	struct stliport *portp;
788 	struct tty_port *port;
789 	unsigned int minordev, brdnr, portnr;
790 	int rc;
791 
792 	minordev = tty->index;
793 	brdnr = MINOR2BRD(minordev);
794 	if (brdnr >= stli_nrbrds)
795 		return -ENODEV;
796 	brdp = stli_brds[brdnr];
797 	if (brdp == NULL)
798 		return -ENODEV;
799 	if ((brdp->state & BST_STARTED) == 0)
800 		return -ENODEV;
801 	portnr = MINOR2PORT(minordev);
802 	if (portnr > brdp->nrports)
803 		return -ENODEV;
804 
805 	portp = brdp->ports[portnr];
806 	if (portp == NULL)
807 		return -ENODEV;
808 	if (portp->devnr < 1)
809 		return -ENODEV;
810 	port = &portp->port;
811 
812 /*
813  *	On the first open of the device setup the port hardware, and
814  *	initialize the per port data structure. Since initializing the port
815  *	requires several commands to the board we will need to wait for any
816  *	other open that is already initializing the port.
817  *
818  *	Review - locking
819  */
820 	tty_port_tty_set(port, tty);
821 	tty->driver_data = portp;
822 	port->count++;
823 
824 	wait_event_interruptible(portp->raw_wait,
825 			!test_bit(ST_INITIALIZING, &portp->state));
826 	if (signal_pending(current))
827 		return -ERESTARTSYS;
828 
829 	if ((portp->port.flags & ASYNC_INITIALIZED) == 0) {
830 		set_bit(ST_INITIALIZING, &portp->state);
831 		if ((rc = stli_initopen(tty, brdp, portp)) >= 0) {
832 			/* Locking */
833 			port->flags |= ASYNC_INITIALIZED;
834 			clear_bit(TTY_IO_ERROR, &tty->flags);
835 		}
836 		clear_bit(ST_INITIALIZING, &portp->state);
837 		wake_up_interruptible(&portp->raw_wait);
838 		if (rc < 0)
839 			return rc;
840 	}
841 	return tty_port_block_til_ready(&portp->port, tty, filp);
842 }
843 
844 /*****************************************************************************/
845 
stli_close(struct tty_struct * tty,struct file * filp)846 static void stli_close(struct tty_struct *tty, struct file *filp)
847 {
848 	struct stlibrd *brdp;
849 	struct stliport *portp;
850 	struct tty_port *port;
851 	unsigned long flags;
852 
853 	portp = tty->driver_data;
854 	if (portp == NULL)
855 		return;
856 	port = &portp->port;
857 
858 	if (tty_port_close_start(port, tty, filp) == 0)
859 		return;
860 
861 /*
862  *	May want to wait for data to drain before closing. The BUSY flag
863  *	keeps track of whether we are still transmitting or not. It is
864  *	updated by messages from the slave - indicating when all chars
865  *	really have drained.
866  */
867  	spin_lock_irqsave(&stli_lock, flags);
868 	if (tty == stli_txcooktty)
869 		stli_flushchars(tty);
870 	spin_unlock_irqrestore(&stli_lock, flags);
871 
872 	/* We end up doing this twice for the moment. This needs looking at
873 	   eventually. Note we still use portp->closing_wait as a result */
874 	if (portp->closing_wait != ASYNC_CLOSING_WAIT_NONE)
875 		tty_wait_until_sent(tty, portp->closing_wait);
876 
877 	/* FIXME: port locking here needs attending to */
878 	port->flags &= ~ASYNC_INITIALIZED;
879 
880 	brdp = stli_brds[portp->brdnr];
881 	stli_rawclose(brdp, portp, 0, 0);
882 	if (tty->termios->c_cflag & HUPCL) {
883 		stli_mkasysigs(&portp->asig, 0, 0);
884 		if (test_bit(ST_CMDING, &portp->state))
885 			set_bit(ST_DOSIGS, &portp->state);
886 		else
887 			stli_sendcmd(brdp, portp, A_SETSIGNALS, &portp->asig,
888 				sizeof(asysigs_t), 0);
889 	}
890 	clear_bit(ST_TXBUSY, &portp->state);
891 	clear_bit(ST_RXSTOP, &portp->state);
892 	set_bit(TTY_IO_ERROR, &tty->flags);
893 	tty_ldisc_flush(tty);
894 	set_bit(ST_DOFLUSHRX, &portp->state);
895 	stli_flushbuffer(tty);
896 
897 	tty_port_close_end(port, tty);
898 	tty_port_tty_set(port, NULL);
899 }
900 
901 /*****************************************************************************/
902 
903 /*
904  *	Carry out first open operations on a port. This involves a number of
905  *	commands to be sent to the slave. We need to open the port, set the
906  *	notification events, set the initial port settings, get and set the
907  *	initial signal values. We sleep and wait in between each one. But
908  *	this still all happens pretty quickly.
909  */
910 
stli_initopen(struct tty_struct * tty,struct stlibrd * brdp,struct stliport * portp)911 static int stli_initopen(struct tty_struct *tty,
912 				struct stlibrd *brdp, struct stliport *portp)
913 {
914 	asynotify_t nt;
915 	asyport_t aport;
916 	int rc;
917 
918 	if ((rc = stli_rawopen(brdp, portp, 0, 1)) < 0)
919 		return rc;
920 
921 	memset(&nt, 0, sizeof(asynotify_t));
922 	nt.data = (DT_TXLOW | DT_TXEMPTY | DT_RXBUSY | DT_RXBREAK);
923 	nt.signal = SG_DCD;
924 	if ((rc = stli_cmdwait(brdp, portp, A_SETNOTIFY, &nt,
925 	    sizeof(asynotify_t), 0)) < 0)
926 		return rc;
927 
928 	stli_mkasyport(tty, portp, &aport, tty->termios);
929 	if ((rc = stli_cmdwait(brdp, portp, A_SETPORT, &aport,
930 	    sizeof(asyport_t), 0)) < 0)
931 		return rc;
932 
933 	set_bit(ST_GETSIGS, &portp->state);
934 	if ((rc = stli_cmdwait(brdp, portp, A_GETSIGNALS, &portp->asig,
935 	    sizeof(asysigs_t), 1)) < 0)
936 		return rc;
937 	if (test_and_clear_bit(ST_GETSIGS, &portp->state))
938 		portp->sigs = stli_mktiocm(portp->asig.sigvalue);
939 	stli_mkasysigs(&portp->asig, 1, 1);
940 	if ((rc = stli_cmdwait(brdp, portp, A_SETSIGNALS, &portp->asig,
941 	    sizeof(asysigs_t), 0)) < 0)
942 		return rc;
943 
944 	return 0;
945 }
946 
947 /*****************************************************************************/
948 
949 /*
950  *	Send an open message to the slave. This will sleep waiting for the
951  *	acknowledgement, so must have user context. We need to co-ordinate
952  *	with close events here, since we don't want open and close events
953  *	to overlap.
954  */
955 
stli_rawopen(struct stlibrd * brdp,struct stliport * portp,unsigned long arg,int wait)956 static int stli_rawopen(struct stlibrd *brdp, struct stliport *portp, unsigned long arg, int wait)
957 {
958 	cdkhdr_t __iomem *hdrp;
959 	cdkctrl_t __iomem *cp;
960 	unsigned char __iomem *bits;
961 	unsigned long flags;
962 	int rc;
963 
964 /*
965  *	Send a message to the slave to open this port.
966  */
967 
968 /*
969  *	Slave is already closing this port. This can happen if a hangup
970  *	occurs on this port. So we must wait until it is complete. The
971  *	order of opens and closes may not be preserved across shared
972  *	memory, so we must wait until it is complete.
973  */
974 	wait_event_interruptible(portp->raw_wait,
975 			!test_bit(ST_CLOSING, &portp->state));
976 	if (signal_pending(current)) {
977 		return -ERESTARTSYS;
978 	}
979 
980 /*
981  *	Everything is ready now, so write the open message into shared
982  *	memory. Once the message is in set the service bits to say that
983  *	this port wants service.
984  */
985 	spin_lock_irqsave(&brd_lock, flags);
986 	EBRDENABLE(brdp);
987 	cp = &((cdkasy_t __iomem *) EBRDGETMEMPTR(brdp, portp->addr))->ctrl;
988 	writel(arg, &cp->openarg);
989 	writeb(1, &cp->open);
990 	hdrp = (cdkhdr_t __iomem *) EBRDGETMEMPTR(brdp, CDK_CDKADDR);
991 	bits = ((unsigned char __iomem *) hdrp) + brdp->slaveoffset +
992 		portp->portidx;
993 	writeb(readb(bits) | portp->portbit, bits);
994 	EBRDDISABLE(brdp);
995 
996 	if (wait == 0) {
997 		spin_unlock_irqrestore(&brd_lock, flags);
998 		return 0;
999 	}
1000 
1001 /*
1002  *	Slave is in action, so now we must wait for the open acknowledgment
1003  *	to come back.
1004  */
1005 	rc = 0;
1006 	set_bit(ST_OPENING, &portp->state);
1007 	spin_unlock_irqrestore(&brd_lock, flags);
1008 
1009 	wait_event_interruptible(portp->raw_wait,
1010 			!test_bit(ST_OPENING, &portp->state));
1011 	if (signal_pending(current))
1012 		rc = -ERESTARTSYS;
1013 
1014 	if ((rc == 0) && (portp->rc != 0))
1015 		rc = -EIO;
1016 	return rc;
1017 }
1018 
1019 /*****************************************************************************/
1020 
1021 /*
1022  *	Send a close message to the slave. Normally this will sleep waiting
1023  *	for the acknowledgement, but if wait parameter is 0 it will not. If
1024  *	wait is true then must have user context (to sleep).
1025  */
1026 
stli_rawclose(struct stlibrd * brdp,struct stliport * portp,unsigned long arg,int wait)1027 static int stli_rawclose(struct stlibrd *brdp, struct stliport *portp, unsigned long arg, int wait)
1028 {
1029 	cdkhdr_t __iomem *hdrp;
1030 	cdkctrl_t __iomem *cp;
1031 	unsigned char __iomem *bits;
1032 	unsigned long flags;
1033 	int rc;
1034 
1035 /*
1036  *	Slave is already closing this port. This can happen if a hangup
1037  *	occurs on this port.
1038  */
1039 	if (wait) {
1040 		wait_event_interruptible(portp->raw_wait,
1041 				!test_bit(ST_CLOSING, &portp->state));
1042 		if (signal_pending(current)) {
1043 			return -ERESTARTSYS;
1044 		}
1045 	}
1046 
1047 /*
1048  *	Write the close command into shared memory.
1049  */
1050 	spin_lock_irqsave(&brd_lock, flags);
1051 	EBRDENABLE(brdp);
1052 	cp = &((cdkasy_t __iomem *) EBRDGETMEMPTR(brdp, portp->addr))->ctrl;
1053 	writel(arg, &cp->closearg);
1054 	writeb(1, &cp->close);
1055 	hdrp = (cdkhdr_t __iomem *) EBRDGETMEMPTR(brdp, CDK_CDKADDR);
1056 	bits = ((unsigned char __iomem *) hdrp) + brdp->slaveoffset +
1057 		portp->portidx;
1058 	writeb(readb(bits) |portp->portbit, bits);
1059 	EBRDDISABLE(brdp);
1060 
1061 	set_bit(ST_CLOSING, &portp->state);
1062 	spin_unlock_irqrestore(&brd_lock, flags);
1063 
1064 	if (wait == 0)
1065 		return 0;
1066 
1067 /*
1068  *	Slave is in action, so now we must wait for the open acknowledgment
1069  *	to come back.
1070  */
1071 	rc = 0;
1072 	wait_event_interruptible(portp->raw_wait,
1073 			!test_bit(ST_CLOSING, &portp->state));
1074 	if (signal_pending(current))
1075 		rc = -ERESTARTSYS;
1076 
1077 	if ((rc == 0) && (portp->rc != 0))
1078 		rc = -EIO;
1079 	return rc;
1080 }
1081 
1082 /*****************************************************************************/
1083 
1084 /*
1085  *	Send a command to the slave and wait for the response. This must
1086  *	have user context (it sleeps). This routine is generic in that it
1087  *	can send any type of command. Its purpose is to wait for that command
1088  *	to complete (as opposed to initiating the command then returning).
1089  */
1090 
stli_cmdwait(struct stlibrd * brdp,struct stliport * portp,unsigned long cmd,void * arg,int size,int copyback)1091 static int stli_cmdwait(struct stlibrd *brdp, struct stliport *portp, unsigned long cmd, void *arg, int size, int copyback)
1092 {
1093 	wait_event_interruptible(portp->raw_wait,
1094 			!test_bit(ST_CMDING, &portp->state));
1095 	if (signal_pending(current))
1096 		return -ERESTARTSYS;
1097 
1098 	stli_sendcmd(brdp, portp, cmd, arg, size, copyback);
1099 
1100 	wait_event_interruptible(portp->raw_wait,
1101 			!test_bit(ST_CMDING, &portp->state));
1102 	if (signal_pending(current))
1103 		return -ERESTARTSYS;
1104 
1105 	if (portp->rc != 0)
1106 		return -EIO;
1107 	return 0;
1108 }
1109 
1110 /*****************************************************************************/
1111 
1112 /*
1113  *	Send the termios settings for this port to the slave. This sleeps
1114  *	waiting for the command to complete - so must have user context.
1115  */
1116 
stli_setport(struct tty_struct * tty)1117 static int stli_setport(struct tty_struct *tty)
1118 {
1119 	struct stliport *portp = tty->driver_data;
1120 	struct stlibrd *brdp;
1121 	asyport_t aport;
1122 
1123 	if (portp == NULL)
1124 		return -ENODEV;
1125 	if (portp->brdnr >= stli_nrbrds)
1126 		return -ENODEV;
1127 	brdp = stli_brds[portp->brdnr];
1128 	if (brdp == NULL)
1129 		return -ENODEV;
1130 
1131 	stli_mkasyport(tty, portp, &aport, tty->termios);
1132 	return(stli_cmdwait(brdp, portp, A_SETPORT, &aport, sizeof(asyport_t), 0));
1133 }
1134 
1135 /*****************************************************************************/
1136 
stli_carrier_raised(struct tty_port * port)1137 static int stli_carrier_raised(struct tty_port *port)
1138 {
1139 	struct stliport *portp = container_of(port, struct stliport, port);
1140 	return (portp->sigs & TIOCM_CD) ? 1 : 0;
1141 }
1142 
stli_raise_dtr_rts(struct tty_port * port)1143 static void stli_raise_dtr_rts(struct tty_port *port)
1144 {
1145 	struct stliport *portp = container_of(port, struct stliport, port);
1146 	struct stlibrd *brdp = stli_brds[portp->brdnr];
1147 	stli_mkasysigs(&portp->asig, 1, 1);
1148 	if (stli_cmdwait(brdp, portp, A_SETSIGNALS, &portp->asig,
1149 		sizeof(asysigs_t), 0) < 0)
1150 			printk(KERN_WARNING "istallion: dtr raise failed.\n");
1151 }
1152 
1153 
1154 /*****************************************************************************/
1155 
1156 /*
1157  *	Write routine. Take the data and put it in the shared memory ring
1158  *	queue. If port is not already sending chars then need to mark the
1159  *	service bits for this port.
1160  */
1161 
stli_write(struct tty_struct * tty,const unsigned char * buf,int count)1162 static int stli_write(struct tty_struct *tty, const unsigned char *buf, int count)
1163 {
1164 	cdkasy_t __iomem *ap;
1165 	cdkhdr_t __iomem *hdrp;
1166 	unsigned char __iomem *bits;
1167 	unsigned char __iomem *shbuf;
1168 	unsigned char *chbuf;
1169 	struct stliport *portp;
1170 	struct stlibrd *brdp;
1171 	unsigned int len, stlen, head, tail, size;
1172 	unsigned long flags;
1173 
1174 	if (tty == stli_txcooktty)
1175 		stli_flushchars(tty);
1176 	portp = tty->driver_data;
1177 	if (portp == NULL)
1178 		return 0;
1179 	if (portp->brdnr >= stli_nrbrds)
1180 		return 0;
1181 	brdp = stli_brds[portp->brdnr];
1182 	if (brdp == NULL)
1183 		return 0;
1184 	chbuf = (unsigned char *) buf;
1185 
1186 /*
1187  *	All data is now local, shove as much as possible into shared memory.
1188  */
1189 	spin_lock_irqsave(&brd_lock, flags);
1190 	EBRDENABLE(brdp);
1191 	ap = (cdkasy_t __iomem *) EBRDGETMEMPTR(brdp, portp->addr);
1192 	head = (unsigned int) readw(&ap->txq.head);
1193 	tail = (unsigned int) readw(&ap->txq.tail);
1194 	if (tail != ((unsigned int) readw(&ap->txq.tail)))
1195 		tail = (unsigned int) readw(&ap->txq.tail);
1196 	size = portp->txsize;
1197 	if (head >= tail) {
1198 		len = size - (head - tail) - 1;
1199 		stlen = size - head;
1200 	} else {
1201 		len = tail - head - 1;
1202 		stlen = len;
1203 	}
1204 
1205 	len = min(len, (unsigned int)count);
1206 	count = 0;
1207 	shbuf = (char __iomem *) EBRDGETMEMPTR(brdp, portp->txoffset);
1208 
1209 	while (len > 0) {
1210 		stlen = min(len, stlen);
1211 		memcpy_toio(shbuf + head, chbuf, stlen);
1212 		chbuf += stlen;
1213 		len -= stlen;
1214 		count += stlen;
1215 		head += stlen;
1216 		if (head >= size) {
1217 			head = 0;
1218 			stlen = tail;
1219 		}
1220 	}
1221 
1222 	ap = (cdkasy_t __iomem *) EBRDGETMEMPTR(brdp, portp->addr);
1223 	writew(head, &ap->txq.head);
1224 	if (test_bit(ST_TXBUSY, &portp->state)) {
1225 		if (readl(&ap->changed.data) & DT_TXEMPTY)
1226 			writel(readl(&ap->changed.data) & ~DT_TXEMPTY, &ap->changed.data);
1227 	}
1228 	hdrp = (cdkhdr_t __iomem *) EBRDGETMEMPTR(brdp, CDK_CDKADDR);
1229 	bits = ((unsigned char __iomem *) hdrp) + brdp->slaveoffset +
1230 		portp->portidx;
1231 	writeb(readb(bits) | portp->portbit, bits);
1232 	set_bit(ST_TXBUSY, &portp->state);
1233 	EBRDDISABLE(brdp);
1234 	spin_unlock_irqrestore(&brd_lock, flags);
1235 
1236 	return(count);
1237 }
1238 
1239 /*****************************************************************************/
1240 
1241 /*
1242  *	Output a single character. We put it into a temporary local buffer
1243  *	(for speed) then write out that buffer when the flushchars routine
1244  *	is called. There is a safety catch here so that if some other port
1245  *	writes chars before the current buffer has been, then we write them
1246  *	first them do the new ports.
1247  */
1248 
stli_putchar(struct tty_struct * tty,unsigned char ch)1249 static int stli_putchar(struct tty_struct *tty, unsigned char ch)
1250 {
1251 	if (tty != stli_txcooktty) {
1252 		if (stli_txcooktty != NULL)
1253 			stli_flushchars(stli_txcooktty);
1254 		stli_txcooktty = tty;
1255 	}
1256 
1257 	stli_txcookbuf[stli_txcooksize++] = ch;
1258 	return 0;
1259 }
1260 
1261 /*****************************************************************************/
1262 
1263 /*
1264  *	Transfer characters from the local TX cooking buffer to the board.
1265  *	We sort of ignore the tty that gets passed in here. We rely on the
1266  *	info stored with the TX cook buffer to tell us which port to flush
1267  *	the data on. In any case we clean out the TX cook buffer, for re-use
1268  *	by someone else.
1269  */
1270 
stli_flushchars(struct tty_struct * tty)1271 static void stli_flushchars(struct tty_struct *tty)
1272 {
1273 	cdkhdr_t __iomem *hdrp;
1274 	unsigned char __iomem *bits;
1275 	cdkasy_t __iomem *ap;
1276 	struct tty_struct *cooktty;
1277 	struct stliport *portp;
1278 	struct stlibrd *brdp;
1279 	unsigned int len, stlen, head, tail, size, count, cooksize;
1280 	unsigned char *buf;
1281 	unsigned char __iomem *shbuf;
1282 	unsigned long flags;
1283 
1284 	cooksize = stli_txcooksize;
1285 	cooktty = stli_txcooktty;
1286 	stli_txcooksize = 0;
1287 	stli_txcookrealsize = 0;
1288 	stli_txcooktty = NULL;
1289 
1290 	if (cooktty == NULL)
1291 		return;
1292 	if (tty != cooktty)
1293 		tty = cooktty;
1294 	if (cooksize == 0)
1295 		return;
1296 
1297 	portp = tty->driver_data;
1298 	if (portp == NULL)
1299 		return;
1300 	if (portp->brdnr >= stli_nrbrds)
1301 		return;
1302 	brdp = stli_brds[portp->brdnr];
1303 	if (brdp == NULL)
1304 		return;
1305 
1306 	spin_lock_irqsave(&brd_lock, flags);
1307 	EBRDENABLE(brdp);
1308 
1309 	ap = (cdkasy_t __iomem *) EBRDGETMEMPTR(brdp, portp->addr);
1310 	head = (unsigned int) readw(&ap->txq.head);
1311 	tail = (unsigned int) readw(&ap->txq.tail);
1312 	if (tail != ((unsigned int) readw(&ap->txq.tail)))
1313 		tail = (unsigned int) readw(&ap->txq.tail);
1314 	size = portp->txsize;
1315 	if (head >= tail) {
1316 		len = size - (head - tail) - 1;
1317 		stlen = size - head;
1318 	} else {
1319 		len = tail - head - 1;
1320 		stlen = len;
1321 	}
1322 
1323 	len = min(len, cooksize);
1324 	count = 0;
1325 	shbuf = EBRDGETMEMPTR(brdp, portp->txoffset);
1326 	buf = stli_txcookbuf;
1327 
1328 	while (len > 0) {
1329 		stlen = min(len, stlen);
1330 		memcpy_toio(shbuf + head, buf, stlen);
1331 		buf += stlen;
1332 		len -= stlen;
1333 		count += stlen;
1334 		head += stlen;
1335 		if (head >= size) {
1336 			head = 0;
1337 			stlen = tail;
1338 		}
1339 	}
1340 
1341 	ap = (cdkasy_t __iomem *) EBRDGETMEMPTR(brdp, portp->addr);
1342 	writew(head, &ap->txq.head);
1343 
1344 	if (test_bit(ST_TXBUSY, &portp->state)) {
1345 		if (readl(&ap->changed.data) & DT_TXEMPTY)
1346 			writel(readl(&ap->changed.data) & ~DT_TXEMPTY, &ap->changed.data);
1347 	}
1348 	hdrp = (cdkhdr_t __iomem *) EBRDGETMEMPTR(brdp, CDK_CDKADDR);
1349 	bits = ((unsigned char __iomem *) hdrp) + brdp->slaveoffset +
1350 		portp->portidx;
1351 	writeb(readb(bits) | portp->portbit, bits);
1352 	set_bit(ST_TXBUSY, &portp->state);
1353 
1354 	EBRDDISABLE(brdp);
1355 	spin_unlock_irqrestore(&brd_lock, flags);
1356 }
1357 
1358 /*****************************************************************************/
1359 
stli_writeroom(struct tty_struct * tty)1360 static int stli_writeroom(struct tty_struct *tty)
1361 {
1362 	cdkasyrq_t __iomem *rp;
1363 	struct stliport *portp;
1364 	struct stlibrd *brdp;
1365 	unsigned int head, tail, len;
1366 	unsigned long flags;
1367 
1368 	if (tty == stli_txcooktty) {
1369 		if (stli_txcookrealsize != 0) {
1370 			len = stli_txcookrealsize - stli_txcooksize;
1371 			return len;
1372 		}
1373 	}
1374 
1375 	portp = tty->driver_data;
1376 	if (portp == NULL)
1377 		return 0;
1378 	if (portp->brdnr >= stli_nrbrds)
1379 		return 0;
1380 	brdp = stli_brds[portp->brdnr];
1381 	if (brdp == NULL)
1382 		return 0;
1383 
1384 	spin_lock_irqsave(&brd_lock, flags);
1385 	EBRDENABLE(brdp);
1386 	rp = &((cdkasy_t __iomem *) EBRDGETMEMPTR(brdp, portp->addr))->txq;
1387 	head = (unsigned int) readw(&rp->head);
1388 	tail = (unsigned int) readw(&rp->tail);
1389 	if (tail != ((unsigned int) readw(&rp->tail)))
1390 		tail = (unsigned int) readw(&rp->tail);
1391 	len = (head >= tail) ? (portp->txsize - (head - tail)) : (tail - head);
1392 	len--;
1393 	EBRDDISABLE(brdp);
1394 	spin_unlock_irqrestore(&brd_lock, flags);
1395 
1396 	if (tty == stli_txcooktty) {
1397 		stli_txcookrealsize = len;
1398 		len -= stli_txcooksize;
1399 	}
1400 	return len;
1401 }
1402 
1403 /*****************************************************************************/
1404 
1405 /*
1406  *	Return the number of characters in the transmit buffer. Normally we
1407  *	will return the number of chars in the shared memory ring queue.
1408  *	We need to kludge around the case where the shared memory buffer is
1409  *	empty but not all characters have drained yet, for this case just
1410  *	return that there is 1 character in the buffer!
1411  */
1412 
stli_charsinbuffer(struct tty_struct * tty)1413 static int stli_charsinbuffer(struct tty_struct *tty)
1414 {
1415 	cdkasyrq_t __iomem *rp;
1416 	struct stliport *portp;
1417 	struct stlibrd *brdp;
1418 	unsigned int head, tail, len;
1419 	unsigned long flags;
1420 
1421 	if (tty == stli_txcooktty)
1422 		stli_flushchars(tty);
1423 	portp = tty->driver_data;
1424 	if (portp == NULL)
1425 		return 0;
1426 	if (portp->brdnr >= stli_nrbrds)
1427 		return 0;
1428 	brdp = stli_brds[portp->brdnr];
1429 	if (brdp == NULL)
1430 		return 0;
1431 
1432 	spin_lock_irqsave(&brd_lock, flags);
1433 	EBRDENABLE(brdp);
1434 	rp = &((cdkasy_t __iomem *) EBRDGETMEMPTR(brdp, portp->addr))->txq;
1435 	head = (unsigned int) readw(&rp->head);
1436 	tail = (unsigned int) readw(&rp->tail);
1437 	if (tail != ((unsigned int) readw(&rp->tail)))
1438 		tail = (unsigned int) readw(&rp->tail);
1439 	len = (head >= tail) ? (head - tail) : (portp->txsize - (tail - head));
1440 	if ((len == 0) && test_bit(ST_TXBUSY, &portp->state))
1441 		len = 1;
1442 	EBRDDISABLE(brdp);
1443 	spin_unlock_irqrestore(&brd_lock, flags);
1444 
1445 	return len;
1446 }
1447 
1448 /*****************************************************************************/
1449 
1450 /*
1451  *	Generate the serial struct info.
1452  */
1453 
stli_getserial(struct stliport * portp,struct serial_struct __user * sp)1454 static int stli_getserial(struct stliport *portp, struct serial_struct __user *sp)
1455 {
1456 	struct serial_struct sio;
1457 	struct stlibrd *brdp;
1458 
1459 	memset(&sio, 0, sizeof(struct serial_struct));
1460 	sio.type = PORT_UNKNOWN;
1461 	sio.line = portp->portnr;
1462 	sio.irq = 0;
1463 	sio.flags = portp->port.flags;
1464 	sio.baud_base = portp->baud_base;
1465 	sio.close_delay = portp->port.close_delay;
1466 	sio.closing_wait = portp->closing_wait;
1467 	sio.custom_divisor = portp->custom_divisor;
1468 	sio.xmit_fifo_size = 0;
1469 	sio.hub6 = 0;
1470 
1471 	brdp = stli_brds[portp->brdnr];
1472 	if (brdp != NULL)
1473 		sio.port = brdp->iobase;
1474 
1475 	return copy_to_user(sp, &sio, sizeof(struct serial_struct)) ?
1476 			-EFAULT : 0;
1477 }
1478 
1479 /*****************************************************************************/
1480 
1481 /*
1482  *	Set port according to the serial struct info.
1483  *	At this point we do not do any auto-configure stuff, so we will
1484  *	just quietly ignore any requests to change irq, etc.
1485  */
1486 
stli_setserial(struct tty_struct * tty,struct serial_struct __user * sp)1487 static int stli_setserial(struct tty_struct *tty, struct serial_struct __user *sp)
1488 {
1489 	struct serial_struct sio;
1490 	int rc;
1491 	struct stliport *portp = tty->driver_data;
1492 
1493 	if (copy_from_user(&sio, sp, sizeof(struct serial_struct)))
1494 		return -EFAULT;
1495 	if (!capable(CAP_SYS_ADMIN)) {
1496 		if ((sio.baud_base != portp->baud_base) ||
1497 		    (sio.close_delay != portp->port.close_delay) ||
1498 		    ((sio.flags & ~ASYNC_USR_MASK) !=
1499 		    (portp->port.flags & ~ASYNC_USR_MASK)))
1500 			return -EPERM;
1501 	}
1502 
1503 	portp->port.flags = (portp->port.flags & ~ASYNC_USR_MASK) |
1504 		(sio.flags & ASYNC_USR_MASK);
1505 	portp->baud_base = sio.baud_base;
1506 	portp->port.close_delay = sio.close_delay;
1507 	portp->closing_wait = sio.closing_wait;
1508 	portp->custom_divisor = sio.custom_divisor;
1509 
1510 	if ((rc = stli_setport(tty)) < 0)
1511 		return rc;
1512 	return 0;
1513 }
1514 
1515 /*****************************************************************************/
1516 
stli_tiocmget(struct tty_struct * tty,struct file * file)1517 static int stli_tiocmget(struct tty_struct *tty, struct file *file)
1518 {
1519 	struct stliport *portp = tty->driver_data;
1520 	struct stlibrd *brdp;
1521 	int rc;
1522 
1523 	if (portp == NULL)
1524 		return -ENODEV;
1525 	if (portp->brdnr >= stli_nrbrds)
1526 		return 0;
1527 	brdp = stli_brds[portp->brdnr];
1528 	if (brdp == NULL)
1529 		return 0;
1530 	if (tty->flags & (1 << TTY_IO_ERROR))
1531 		return -EIO;
1532 
1533 	if ((rc = stli_cmdwait(brdp, portp, A_GETSIGNALS,
1534 			       &portp->asig, sizeof(asysigs_t), 1)) < 0)
1535 		return rc;
1536 
1537 	return stli_mktiocm(portp->asig.sigvalue);
1538 }
1539 
stli_tiocmset(struct tty_struct * tty,struct file * file,unsigned int set,unsigned int clear)1540 static int stli_tiocmset(struct tty_struct *tty, struct file *file,
1541 			 unsigned int set, unsigned int clear)
1542 {
1543 	struct stliport *portp = tty->driver_data;
1544 	struct stlibrd *brdp;
1545 	int rts = -1, dtr = -1;
1546 
1547 	if (portp == NULL)
1548 		return -ENODEV;
1549 	if (portp->brdnr >= stli_nrbrds)
1550 		return 0;
1551 	brdp = stli_brds[portp->brdnr];
1552 	if (brdp == NULL)
1553 		return 0;
1554 	if (tty->flags & (1 << TTY_IO_ERROR))
1555 		return -EIO;
1556 
1557 	if (set & TIOCM_RTS)
1558 		rts = 1;
1559 	if (set & TIOCM_DTR)
1560 		dtr = 1;
1561 	if (clear & TIOCM_RTS)
1562 		rts = 0;
1563 	if (clear & TIOCM_DTR)
1564 		dtr = 0;
1565 
1566 	stli_mkasysigs(&portp->asig, dtr, rts);
1567 
1568 	return stli_cmdwait(brdp, portp, A_SETSIGNALS, &portp->asig,
1569 			    sizeof(asysigs_t), 0);
1570 }
1571 
stli_ioctl(struct tty_struct * tty,struct file * file,unsigned int cmd,unsigned long arg)1572 static int stli_ioctl(struct tty_struct *tty, struct file *file, unsigned int cmd, unsigned long arg)
1573 {
1574 	struct stliport *portp;
1575 	struct stlibrd *brdp;
1576 	int rc;
1577 	void __user *argp = (void __user *)arg;
1578 
1579 	portp = tty->driver_data;
1580 	if (portp == NULL)
1581 		return -ENODEV;
1582 	if (portp->brdnr >= stli_nrbrds)
1583 		return 0;
1584 	brdp = stli_brds[portp->brdnr];
1585 	if (brdp == NULL)
1586 		return 0;
1587 
1588 	if ((cmd != TIOCGSERIAL) && (cmd != TIOCSSERIAL) &&
1589  	    (cmd != COM_GETPORTSTATS) && (cmd != COM_CLRPORTSTATS)) {
1590 		if (tty->flags & (1 << TTY_IO_ERROR))
1591 			return -EIO;
1592 	}
1593 
1594 	rc = 0;
1595 
1596 	switch (cmd) {
1597 	case TIOCGSERIAL:
1598 		rc = stli_getserial(portp, argp);
1599 		break;
1600 	case TIOCSSERIAL:
1601 		rc = stli_setserial(tty, argp);
1602 		break;
1603 	case STL_GETPFLAG:
1604 		rc = put_user(portp->pflag, (unsigned __user *)argp);
1605 		break;
1606 	case STL_SETPFLAG:
1607 		if ((rc = get_user(portp->pflag, (unsigned __user *)argp)) == 0)
1608 			stli_setport(tty);
1609 		break;
1610 	case COM_GETPORTSTATS:
1611 		rc = stli_getportstats(tty, portp, argp);
1612 		break;
1613 	case COM_CLRPORTSTATS:
1614 		rc = stli_clrportstats(portp, argp);
1615 		break;
1616 	case TIOCSERCONFIG:
1617 	case TIOCSERGWILD:
1618 	case TIOCSERSWILD:
1619 	case TIOCSERGETLSR:
1620 	case TIOCSERGSTRUCT:
1621 	case TIOCSERGETMULTI:
1622 	case TIOCSERSETMULTI:
1623 	default:
1624 		rc = -ENOIOCTLCMD;
1625 		break;
1626 	}
1627 
1628 	return rc;
1629 }
1630 
1631 /*****************************************************************************/
1632 
1633 /*
1634  *	This routine assumes that we have user context and can sleep.
1635  *	Looks like it is true for the current ttys implementation..!!
1636  */
1637 
stli_settermios(struct tty_struct * tty,struct ktermios * old)1638 static void stli_settermios(struct tty_struct *tty, struct ktermios *old)
1639 {
1640 	struct stliport *portp;
1641 	struct stlibrd *brdp;
1642 	struct ktermios *tiosp;
1643 	asyport_t aport;
1644 
1645 	portp = tty->driver_data;
1646 	if (portp == NULL)
1647 		return;
1648 	if (portp->brdnr >= stli_nrbrds)
1649 		return;
1650 	brdp = stli_brds[portp->brdnr];
1651 	if (brdp == NULL)
1652 		return;
1653 
1654 	tiosp = tty->termios;
1655 
1656 	stli_mkasyport(tty, portp, &aport, tiosp);
1657 	stli_cmdwait(brdp, portp, A_SETPORT, &aport, sizeof(asyport_t), 0);
1658 	stli_mkasysigs(&portp->asig, ((tiosp->c_cflag & CBAUD) ? 1 : 0), -1);
1659 	stli_cmdwait(brdp, portp, A_SETSIGNALS, &portp->asig,
1660 		sizeof(asysigs_t), 0);
1661 	if ((old->c_cflag & CRTSCTS) && ((tiosp->c_cflag & CRTSCTS) == 0))
1662 		tty->hw_stopped = 0;
1663 	if (((old->c_cflag & CLOCAL) == 0) && (tiosp->c_cflag & CLOCAL))
1664 		wake_up_interruptible(&portp->port.open_wait);
1665 }
1666 
1667 /*****************************************************************************/
1668 
1669 /*
1670  *	Attempt to flow control who ever is sending us data. We won't really
1671  *	do any flow control action here. We can't directly, and even if we
1672  *	wanted to we would have to send a command to the slave. The slave
1673  *	knows how to flow control, and will do so when its buffers reach its
1674  *	internal high water marks. So what we will do is set a local state
1675  *	bit that will stop us sending any RX data up from the poll routine
1676  *	(which is the place where RX data from the slave is handled).
1677  */
1678 
stli_throttle(struct tty_struct * tty)1679 static void stli_throttle(struct tty_struct *tty)
1680 {
1681 	struct stliport	*portp = tty->driver_data;
1682 	if (portp == NULL)
1683 		return;
1684 	set_bit(ST_RXSTOP, &portp->state);
1685 }
1686 
1687 /*****************************************************************************/
1688 
1689 /*
1690  *	Unflow control the device sending us data... That means that all
1691  *	we have to do is clear the RXSTOP state bit. The next poll call
1692  *	will then be able to pass the RX data back up.
1693  */
1694 
stli_unthrottle(struct tty_struct * tty)1695 static void stli_unthrottle(struct tty_struct *tty)
1696 {
1697 	struct stliport	*portp = tty->driver_data;
1698 	if (portp == NULL)
1699 		return;
1700 	clear_bit(ST_RXSTOP, &portp->state);
1701 }
1702 
1703 /*****************************************************************************/
1704 
1705 /*
1706  *	Stop the transmitter.
1707  */
1708 
stli_stop(struct tty_struct * tty)1709 static void stli_stop(struct tty_struct *tty)
1710 {
1711 }
1712 
1713 /*****************************************************************************/
1714 
1715 /*
1716  *	Start the transmitter again.
1717  */
1718 
stli_start(struct tty_struct * tty)1719 static void stli_start(struct tty_struct *tty)
1720 {
1721 }
1722 
1723 /*****************************************************************************/
1724 
1725 /*
1726  *	Hangup this port. This is pretty much like closing the port, only
1727  *	a little more brutal. No waiting for data to drain. Shutdown the
1728  *	port and maybe drop signals. This is rather tricky really. We want
1729  *	to close the port as well.
1730  */
1731 
stli_hangup(struct tty_struct * tty)1732 static void stli_hangup(struct tty_struct *tty)
1733 {
1734 	struct stliport *portp;
1735 	struct stlibrd *brdp;
1736 	struct tty_port *port;
1737 	unsigned long flags;
1738 
1739 	portp = tty->driver_data;
1740 	if (portp == NULL)
1741 		return;
1742 	if (portp->brdnr >= stli_nrbrds)
1743 		return;
1744 	brdp = stli_brds[portp->brdnr];
1745 	if (brdp == NULL)
1746 		return;
1747 	port = &portp->port;
1748 
1749 	spin_lock_irqsave(&port->lock, flags);
1750 	port->flags &= ~ASYNC_INITIALIZED;
1751 	spin_unlock_irqrestore(&port->lock, flags);
1752 
1753 	if (!test_bit(ST_CLOSING, &portp->state))
1754 		stli_rawclose(brdp, portp, 0, 0);
1755 
1756 	spin_lock_irqsave(&stli_lock, flags);
1757 	if (tty->termios->c_cflag & HUPCL) {
1758 		stli_mkasysigs(&portp->asig, 0, 0);
1759 		if (test_bit(ST_CMDING, &portp->state)) {
1760 			set_bit(ST_DOSIGS, &portp->state);
1761 			set_bit(ST_DOFLUSHTX, &portp->state);
1762 			set_bit(ST_DOFLUSHRX, &portp->state);
1763 		} else {
1764 			stli_sendcmd(brdp, portp, A_SETSIGNALSF,
1765 				&portp->asig, sizeof(asysigs_t), 0);
1766 		}
1767 	}
1768 
1769 	clear_bit(ST_TXBUSY, &portp->state);
1770 	clear_bit(ST_RXSTOP, &portp->state);
1771 	set_bit(TTY_IO_ERROR, &tty->flags);
1772 	spin_unlock_irqrestore(&stli_lock, flags);
1773 
1774 	tty_port_hangup(port);
1775 }
1776 
1777 /*****************************************************************************/
1778 
1779 /*
1780  *	Flush characters from the lower buffer. We may not have user context
1781  *	so we cannot sleep waiting for it to complete. Also we need to check
1782  *	if there is chars for this port in the TX cook buffer, and flush them
1783  *	as well.
1784  */
1785 
stli_flushbuffer(struct tty_struct * tty)1786 static void stli_flushbuffer(struct tty_struct *tty)
1787 {
1788 	struct stliport *portp;
1789 	struct stlibrd *brdp;
1790 	unsigned long ftype, flags;
1791 
1792 	portp = tty->driver_data;
1793 	if (portp == NULL)
1794 		return;
1795 	if (portp->brdnr >= stli_nrbrds)
1796 		return;
1797 	brdp = stli_brds[portp->brdnr];
1798 	if (brdp == NULL)
1799 		return;
1800 
1801 	spin_lock_irqsave(&brd_lock, flags);
1802 	if (tty == stli_txcooktty) {
1803 		stli_txcooktty = NULL;
1804 		stli_txcooksize = 0;
1805 		stli_txcookrealsize = 0;
1806 	}
1807 	if (test_bit(ST_CMDING, &portp->state)) {
1808 		set_bit(ST_DOFLUSHTX, &portp->state);
1809 	} else {
1810 		ftype = FLUSHTX;
1811 		if (test_bit(ST_DOFLUSHRX, &portp->state)) {
1812 			ftype |= FLUSHRX;
1813 			clear_bit(ST_DOFLUSHRX, &portp->state);
1814 		}
1815 		__stli_sendcmd(brdp, portp, A_FLUSH, &ftype, sizeof(u32), 0);
1816 	}
1817 	spin_unlock_irqrestore(&brd_lock, flags);
1818 	tty_wakeup(tty);
1819 }
1820 
1821 /*****************************************************************************/
1822 
stli_breakctl(struct tty_struct * tty,int state)1823 static int stli_breakctl(struct tty_struct *tty, int state)
1824 {
1825 	struct stlibrd	*brdp;
1826 	struct stliport	*portp;
1827 	long		arg;
1828 
1829 	portp = tty->driver_data;
1830 	if (portp == NULL)
1831 		return -EINVAL;
1832 	if (portp->brdnr >= stli_nrbrds)
1833 		return -EINVAL;
1834 	brdp = stli_brds[portp->brdnr];
1835 	if (brdp == NULL)
1836 		return -EINVAL;
1837 
1838 	arg = (state == -1) ? BREAKON : BREAKOFF;
1839 	stli_cmdwait(brdp, portp, A_BREAK, &arg, sizeof(long), 0);
1840 	return 0;
1841 }
1842 
1843 /*****************************************************************************/
1844 
stli_waituntilsent(struct tty_struct * tty,int timeout)1845 static void stli_waituntilsent(struct tty_struct *tty, int timeout)
1846 {
1847 	struct stliport *portp;
1848 	unsigned long tend;
1849 
1850 	portp = tty->driver_data;
1851 	if (portp == NULL)
1852 		return;
1853 
1854 	if (timeout == 0)
1855 		timeout = HZ;
1856 	tend = jiffies + timeout;
1857 
1858 	while (test_bit(ST_TXBUSY, &portp->state)) {
1859 		if (signal_pending(current))
1860 			break;
1861 		msleep_interruptible(20);
1862 		if (time_after_eq(jiffies, tend))
1863 			break;
1864 	}
1865 }
1866 
1867 /*****************************************************************************/
1868 
stli_sendxchar(struct tty_struct * tty,char ch)1869 static void stli_sendxchar(struct tty_struct *tty, char ch)
1870 {
1871 	struct stlibrd	*brdp;
1872 	struct stliport	*portp;
1873 	asyctrl_t	actrl;
1874 
1875 	portp = tty->driver_data;
1876 	if (portp == NULL)
1877 		return;
1878 	if (portp->brdnr >= stli_nrbrds)
1879 		return;
1880 	brdp = stli_brds[portp->brdnr];
1881 	if (brdp == NULL)
1882 		return;
1883 
1884 	memset(&actrl, 0, sizeof(asyctrl_t));
1885 	if (ch == STOP_CHAR(tty)) {
1886 		actrl.rxctrl = CT_STOPFLOW;
1887 	} else if (ch == START_CHAR(tty)) {
1888 		actrl.rxctrl = CT_STARTFLOW;
1889 	} else {
1890 		actrl.txctrl = CT_SENDCHR;
1891 		actrl.tximdch = ch;
1892 	}
1893 	stli_cmdwait(brdp, portp, A_PORTCTRL, &actrl, sizeof(asyctrl_t), 0);
1894 }
1895 
1896 /*****************************************************************************/
1897 
1898 #define	MAXLINE		80
1899 
1900 /*
1901  *	Format info for a specified port. The line is deliberately limited
1902  *	to 80 characters. (If it is too long it will be truncated, if too
1903  *	short then padded with spaces).
1904  */
1905 
stli_portinfo(struct stlibrd * brdp,struct stliport * portp,int portnr,char * pos)1906 static int stli_portinfo(struct stlibrd *brdp, struct stliport *portp, int portnr, char *pos)
1907 {
1908 	char *sp, *uart;
1909 	int rc, cnt;
1910 
1911 	rc = stli_portcmdstats(NULL, portp);
1912 
1913 	uart = "UNKNOWN";
1914 	if (brdp->state & BST_STARTED) {
1915 		switch (stli_comstats.hwid) {
1916 		case 0:	uart = "2681"; break;
1917 		case 1:	uart = "SC26198"; break;
1918 		default:uart = "CD1400"; break;
1919 		}
1920 	}
1921 
1922 	sp = pos;
1923 	sp += sprintf(sp, "%d: uart:%s ", portnr, uart);
1924 
1925 	if ((brdp->state & BST_STARTED) && (rc >= 0)) {
1926 		sp += sprintf(sp, "tx:%d rx:%d", (int) stli_comstats.txtotal,
1927 			(int) stli_comstats.rxtotal);
1928 
1929 		if (stli_comstats.rxframing)
1930 			sp += sprintf(sp, " fe:%d",
1931 				(int) stli_comstats.rxframing);
1932 		if (stli_comstats.rxparity)
1933 			sp += sprintf(sp, " pe:%d",
1934 				(int) stli_comstats.rxparity);
1935 		if (stli_comstats.rxbreaks)
1936 			sp += sprintf(sp, " brk:%d",
1937 				(int) stli_comstats.rxbreaks);
1938 		if (stli_comstats.rxoverrun)
1939 			sp += sprintf(sp, " oe:%d",
1940 				(int) stli_comstats.rxoverrun);
1941 
1942 		cnt = sprintf(sp, "%s%s%s%s%s ",
1943 			(stli_comstats.signals & TIOCM_RTS) ? "|RTS" : "",
1944 			(stli_comstats.signals & TIOCM_CTS) ? "|CTS" : "",
1945 			(stli_comstats.signals & TIOCM_DTR) ? "|DTR" : "",
1946 			(stli_comstats.signals & TIOCM_CD) ? "|DCD" : "",
1947 			(stli_comstats.signals & TIOCM_DSR) ? "|DSR" : "");
1948 		*sp = ' ';
1949 		sp += cnt;
1950 	}
1951 
1952 	for (cnt = (sp - pos); (cnt < (MAXLINE - 1)); cnt++)
1953 		*sp++ = ' ';
1954 	if (cnt >= MAXLINE)
1955 		pos[(MAXLINE - 2)] = '+';
1956 	pos[(MAXLINE - 1)] = '\n';
1957 
1958 	return(MAXLINE);
1959 }
1960 
1961 /*****************************************************************************/
1962 
1963 /*
1964  *	Port info, read from the /proc file system.
1965  */
1966 
stli_readproc(char * page,char ** start,off_t off,int count,int * eof,void * data)1967 static int stli_readproc(char *page, char **start, off_t off, int count, int *eof, void *data)
1968 {
1969 	struct stlibrd *brdp;
1970 	struct stliport *portp;
1971 	unsigned int brdnr, portnr, totalport;
1972 	int curoff, maxoff;
1973 	char *pos;
1974 
1975 	pos = page;
1976 	totalport = 0;
1977 	curoff = 0;
1978 
1979 	if (off == 0) {
1980 		pos += sprintf(pos, "%s: version %s", stli_drvtitle,
1981 			stli_drvversion);
1982 		while (pos < (page + MAXLINE - 1))
1983 			*pos++ = ' ';
1984 		*pos++ = '\n';
1985 	}
1986 	curoff =  MAXLINE;
1987 
1988 /*
1989  *	We scan through for each board, panel and port. The offset is
1990  *	calculated on the fly, and irrelevant ports are skipped.
1991  */
1992 	for (brdnr = 0; (brdnr < stli_nrbrds); brdnr++) {
1993 		brdp = stli_brds[brdnr];
1994 		if (brdp == NULL)
1995 			continue;
1996 		if (brdp->state == 0)
1997 			continue;
1998 
1999 		maxoff = curoff + (brdp->nrports * MAXLINE);
2000 		if (off >= maxoff) {
2001 			curoff = maxoff;
2002 			continue;
2003 		}
2004 
2005 		totalport = brdnr * STL_MAXPORTS;
2006 		for (portnr = 0; (portnr < brdp->nrports); portnr++,
2007 		    totalport++) {
2008 			portp = brdp->ports[portnr];
2009 			if (portp == NULL)
2010 				continue;
2011 			if (off >= (curoff += MAXLINE))
2012 				continue;
2013 			if ((pos - page + MAXLINE) > count)
2014 				goto stli_readdone;
2015 			pos += stli_portinfo(brdp, portp, totalport, pos);
2016 		}
2017 	}
2018 
2019 	*eof = 1;
2020 
2021 stli_readdone:
2022 	*start = page;
2023 	return(pos - page);
2024 }
2025 
2026 /*****************************************************************************/
2027 
2028 /*
2029  *	Generic send command routine. This will send a message to the slave,
2030  *	of the specified type with the specified argument. Must be very
2031  *	careful of data that will be copied out from shared memory -
2032  *	containing command results. The command completion is all done from
2033  *	a poll routine that does not have user context. Therefore you cannot
2034  *	copy back directly into user space, or to the kernel stack of a
2035  *	process. This routine does not sleep, so can be called from anywhere.
2036  *
2037  *	The caller must hold the brd_lock (see also stli_sendcmd the usual
2038  *	entry point)
2039  */
2040 
__stli_sendcmd(struct stlibrd * brdp,struct stliport * portp,unsigned long cmd,void * arg,int size,int copyback)2041 static void __stli_sendcmd(struct stlibrd *brdp, struct stliport *portp, unsigned long cmd, void *arg, int size, int copyback)
2042 {
2043 	cdkhdr_t __iomem *hdrp;
2044 	cdkctrl_t __iomem *cp;
2045 	unsigned char __iomem *bits;
2046 
2047 	if (test_bit(ST_CMDING, &portp->state)) {
2048 		printk(KERN_ERR "istallion: command already busy, cmd=%x!\n",
2049 				(int) cmd);
2050 		return;
2051 	}
2052 
2053 	EBRDENABLE(brdp);
2054 	cp = &((cdkasy_t __iomem *) EBRDGETMEMPTR(brdp, portp->addr))->ctrl;
2055 	if (size > 0) {
2056 		memcpy_toio((void __iomem *) &(cp->args[0]), arg, size);
2057 		if (copyback) {
2058 			portp->argp = arg;
2059 			portp->argsize = size;
2060 		}
2061 	}
2062 	writel(0, &cp->status);
2063 	writel(cmd, &cp->cmd);
2064 	hdrp = (cdkhdr_t __iomem *) EBRDGETMEMPTR(brdp, CDK_CDKADDR);
2065 	bits = ((unsigned char __iomem *) hdrp) + brdp->slaveoffset +
2066 		portp->portidx;
2067 	writeb(readb(bits) | portp->portbit, bits);
2068 	set_bit(ST_CMDING, &portp->state);
2069 	EBRDDISABLE(brdp);
2070 }
2071 
stli_sendcmd(struct stlibrd * brdp,struct stliport * portp,unsigned long cmd,void * arg,int size,int copyback)2072 static void stli_sendcmd(struct stlibrd *brdp, struct stliport *portp, unsigned long cmd, void *arg, int size, int copyback)
2073 {
2074 	unsigned long		flags;
2075 
2076 	spin_lock_irqsave(&brd_lock, flags);
2077 	__stli_sendcmd(brdp, portp, cmd, arg, size, copyback);
2078 	spin_unlock_irqrestore(&brd_lock, flags);
2079 }
2080 
2081 /*****************************************************************************/
2082 
2083 /*
2084  *	Read data from shared memory. This assumes that the shared memory
2085  *	is enabled and that interrupts are off. Basically we just empty out
2086  *	the shared memory buffer into the tty buffer. Must be careful to
2087  *	handle the case where we fill up the tty buffer, but still have
2088  *	more chars to unload.
2089  */
2090 
stli_read(struct stlibrd * brdp,struct stliport * portp)2091 static void stli_read(struct stlibrd *brdp, struct stliport *portp)
2092 {
2093 	cdkasyrq_t __iomem *rp;
2094 	char __iomem *shbuf;
2095 	struct tty_struct	*tty;
2096 	unsigned int head, tail, size;
2097 	unsigned int len, stlen;
2098 
2099 	if (test_bit(ST_RXSTOP, &portp->state))
2100 		return;
2101 	tty = tty_port_tty_get(&portp->port);
2102 	if (tty == NULL)
2103 		return;
2104 
2105 	rp = &((cdkasy_t __iomem *) EBRDGETMEMPTR(brdp, portp->addr))->rxq;
2106 	head = (unsigned int) readw(&rp->head);
2107 	if (head != ((unsigned int) readw(&rp->head)))
2108 		head = (unsigned int) readw(&rp->head);
2109 	tail = (unsigned int) readw(&rp->tail);
2110 	size = portp->rxsize;
2111 	if (head >= tail) {
2112 		len = head - tail;
2113 		stlen = len;
2114 	} else {
2115 		len = size - (tail - head);
2116 		stlen = size - tail;
2117 	}
2118 
2119 	len = tty_buffer_request_room(tty, len);
2120 
2121 	shbuf = (char __iomem *) EBRDGETMEMPTR(brdp, portp->rxoffset);
2122 
2123 	while (len > 0) {
2124 		unsigned char *cptr;
2125 
2126 		stlen = min(len, stlen);
2127 		tty_prepare_flip_string(tty, &cptr, stlen);
2128 		memcpy_fromio(cptr, shbuf + tail, stlen);
2129 		len -= stlen;
2130 		tail += stlen;
2131 		if (tail >= size) {
2132 			tail = 0;
2133 			stlen = head;
2134 		}
2135 	}
2136 	rp = &((cdkasy_t __iomem *) EBRDGETMEMPTR(brdp, portp->addr))->rxq;
2137 	writew(tail, &rp->tail);
2138 
2139 	if (head != tail)
2140 		set_bit(ST_RXING, &portp->state);
2141 
2142 	tty_schedule_flip(tty);
2143 	tty_kref_put(tty);
2144 }
2145 
2146 /*****************************************************************************/
2147 
2148 /*
2149  *	Set up and carry out any delayed commands. There is only a small set
2150  *	of slave commands that can be done "off-level". So it is not too
2151  *	difficult to deal with them here.
2152  */
2153 
stli_dodelaycmd(struct stliport * portp,cdkctrl_t __iomem * cp)2154 static void stli_dodelaycmd(struct stliport *portp, cdkctrl_t __iomem *cp)
2155 {
2156 	int cmd;
2157 
2158 	if (test_bit(ST_DOSIGS, &portp->state)) {
2159 		if (test_bit(ST_DOFLUSHTX, &portp->state) &&
2160 		    test_bit(ST_DOFLUSHRX, &portp->state))
2161 			cmd = A_SETSIGNALSF;
2162 		else if (test_bit(ST_DOFLUSHTX, &portp->state))
2163 			cmd = A_SETSIGNALSFTX;
2164 		else if (test_bit(ST_DOFLUSHRX, &portp->state))
2165 			cmd = A_SETSIGNALSFRX;
2166 		else
2167 			cmd = A_SETSIGNALS;
2168 		clear_bit(ST_DOFLUSHTX, &portp->state);
2169 		clear_bit(ST_DOFLUSHRX, &portp->state);
2170 		clear_bit(ST_DOSIGS, &portp->state);
2171 		memcpy_toio((void __iomem *) &(cp->args[0]), (void *) &portp->asig,
2172 			sizeof(asysigs_t));
2173 		writel(0, &cp->status);
2174 		writel(cmd, &cp->cmd);
2175 		set_bit(ST_CMDING, &portp->state);
2176 	} else if (test_bit(ST_DOFLUSHTX, &portp->state) ||
2177 	    test_bit(ST_DOFLUSHRX, &portp->state)) {
2178 		cmd = ((test_bit(ST_DOFLUSHTX, &portp->state)) ? FLUSHTX : 0);
2179 		cmd |= ((test_bit(ST_DOFLUSHRX, &portp->state)) ? FLUSHRX : 0);
2180 		clear_bit(ST_DOFLUSHTX, &portp->state);
2181 		clear_bit(ST_DOFLUSHRX, &portp->state);
2182 		memcpy_toio((void __iomem *) &(cp->args[0]), (void *) &cmd, sizeof(int));
2183 		writel(0, &cp->status);
2184 		writel(A_FLUSH, &cp->cmd);
2185 		set_bit(ST_CMDING, &portp->state);
2186 	}
2187 }
2188 
2189 /*****************************************************************************/
2190 
2191 /*
2192  *	Host command service checking. This handles commands or messages
2193  *	coming from the slave to the host. Must have board shared memory
2194  *	enabled and interrupts off when called. Notice that by servicing the
2195  *	read data last we don't need to change the shared memory pointer
2196  *	during processing (which is a slow IO operation).
2197  *	Return value indicates if this port is still awaiting actions from
2198  *	the slave (like open, command, or even TX data being sent). If 0
2199  *	then port is still busy, otherwise no longer busy.
2200  */
2201 
stli_hostcmd(struct stlibrd * brdp,struct stliport * portp)2202 static int stli_hostcmd(struct stlibrd *brdp, struct stliport *portp)
2203 {
2204 	cdkasy_t __iomem *ap;
2205 	cdkctrl_t __iomem *cp;
2206 	struct tty_struct *tty;
2207 	asynotify_t nt;
2208 	unsigned long oldsigs;
2209 	int rc, donerx;
2210 
2211 	ap = (cdkasy_t __iomem *) EBRDGETMEMPTR(brdp, portp->addr);
2212 	cp = &ap->ctrl;
2213 
2214 /*
2215  *	Check if we are waiting for an open completion message.
2216  */
2217 	if (test_bit(ST_OPENING, &portp->state)) {
2218 		rc = readl(&cp->openarg);
2219 		if (readb(&cp->open) == 0 && rc != 0) {
2220 			if (rc > 0)
2221 				rc--;
2222 			writel(0, &cp->openarg);
2223 			portp->rc = rc;
2224 			clear_bit(ST_OPENING, &portp->state);
2225 			wake_up_interruptible(&portp->raw_wait);
2226 		}
2227 	}
2228 
2229 /*
2230  *	Check if we are waiting for a close completion message.
2231  */
2232 	if (test_bit(ST_CLOSING, &portp->state)) {
2233 		rc = (int) readl(&cp->closearg);
2234 		if (readb(&cp->close) == 0 && rc != 0) {
2235 			if (rc > 0)
2236 				rc--;
2237 			writel(0, &cp->closearg);
2238 			portp->rc = rc;
2239 			clear_bit(ST_CLOSING, &portp->state);
2240 			wake_up_interruptible(&portp->raw_wait);
2241 		}
2242 	}
2243 
2244 /*
2245  *	Check if we are waiting for a command completion message. We may
2246  *	need to copy out the command results associated with this command.
2247  */
2248 	if (test_bit(ST_CMDING, &portp->state)) {
2249 		rc = readl(&cp->status);
2250 		if (readl(&cp->cmd) == 0 && rc != 0) {
2251 			if (rc > 0)
2252 				rc--;
2253 			if (portp->argp != NULL) {
2254 				memcpy_fromio(portp->argp, (void __iomem *) &(cp->args[0]),
2255 					portp->argsize);
2256 				portp->argp = NULL;
2257 			}
2258 			writel(0, &cp->status);
2259 			portp->rc = rc;
2260 			clear_bit(ST_CMDING, &portp->state);
2261 			stli_dodelaycmd(portp, cp);
2262 			wake_up_interruptible(&portp->raw_wait);
2263 		}
2264 	}
2265 
2266 /*
2267  *	Check for any notification messages ready. This includes lots of
2268  *	different types of events - RX chars ready, RX break received,
2269  *	TX data low or empty in the slave, modem signals changed state.
2270  */
2271 	donerx = 0;
2272 
2273 	if (ap->notify) {
2274 		nt = ap->changed;
2275 		ap->notify = 0;
2276 		tty = tty_port_tty_get(&portp->port);
2277 
2278 		if (nt.signal & SG_DCD) {
2279 			oldsigs = portp->sigs;
2280 			portp->sigs = stli_mktiocm(nt.sigvalue);
2281 			clear_bit(ST_GETSIGS, &portp->state);
2282 			if ((portp->sigs & TIOCM_CD) &&
2283 			    ((oldsigs & TIOCM_CD) == 0))
2284 				wake_up_interruptible(&portp->port.open_wait);
2285 			if ((oldsigs & TIOCM_CD) &&
2286 			    ((portp->sigs & TIOCM_CD) == 0)) {
2287 				if (portp->port.flags & ASYNC_CHECK_CD) {
2288 					if (tty)
2289 						tty_hangup(tty);
2290 				}
2291 			}
2292 		}
2293 
2294 		if (nt.data & DT_TXEMPTY)
2295 			clear_bit(ST_TXBUSY, &portp->state);
2296 		if (nt.data & (DT_TXEMPTY | DT_TXLOW)) {
2297 			if (tty != NULL) {
2298 				tty_wakeup(tty);
2299 				EBRDENABLE(brdp);
2300 			}
2301 		}
2302 
2303 		if ((nt.data & DT_RXBREAK) && (portp->rxmarkmsk & BRKINT)) {
2304 			if (tty != NULL) {
2305 				tty_insert_flip_char(tty, 0, TTY_BREAK);
2306 				if (portp->port.flags & ASYNC_SAK) {
2307 					do_SAK(tty);
2308 					EBRDENABLE(brdp);
2309 				}
2310 				tty_schedule_flip(tty);
2311 			}
2312 		}
2313 		tty_kref_put(tty);
2314 
2315 		if (nt.data & DT_RXBUSY) {
2316 			donerx++;
2317 			stli_read(brdp, portp);
2318 		}
2319 	}
2320 
2321 /*
2322  *	It might seem odd that we are checking for more RX chars here.
2323  *	But, we need to handle the case where the tty buffer was previously
2324  *	filled, but we had more characters to pass up. The slave will not
2325  *	send any more RX notify messages until the RX buffer has been emptied.
2326  *	But it will leave the service bits on (since the buffer is not empty).
2327  *	So from here we can try to process more RX chars.
2328  */
2329 	if ((!donerx) && test_bit(ST_RXING, &portp->state)) {
2330 		clear_bit(ST_RXING, &portp->state);
2331 		stli_read(brdp, portp);
2332 	}
2333 
2334 	return((test_bit(ST_OPENING, &portp->state) ||
2335 		test_bit(ST_CLOSING, &portp->state) ||
2336 		test_bit(ST_CMDING, &portp->state) ||
2337 		test_bit(ST_TXBUSY, &portp->state) ||
2338 		test_bit(ST_RXING, &portp->state)) ? 0 : 1);
2339 }
2340 
2341 /*****************************************************************************/
2342 
2343 /*
2344  *	Service all ports on a particular board. Assumes that the boards
2345  *	shared memory is enabled, and that the page pointer is pointed
2346  *	at the cdk header structure.
2347  */
2348 
stli_brdpoll(struct stlibrd * brdp,cdkhdr_t __iomem * hdrp)2349 static void stli_brdpoll(struct stlibrd *brdp, cdkhdr_t __iomem *hdrp)
2350 {
2351 	struct stliport *portp;
2352 	unsigned char hostbits[(STL_MAXCHANS / 8) + 1];
2353 	unsigned char slavebits[(STL_MAXCHANS / 8) + 1];
2354 	unsigned char __iomem *slavep;
2355 	int bitpos, bitat, bitsize;
2356 	int channr, nrdevs, slavebitchange;
2357 
2358 	bitsize = brdp->bitsize;
2359 	nrdevs = brdp->nrdevs;
2360 
2361 /*
2362  *	Check if slave wants any service. Basically we try to do as
2363  *	little work as possible here. There are 2 levels of service
2364  *	bits. So if there is nothing to do we bail early. We check
2365  *	8 service bits at a time in the inner loop, so we can bypass
2366  *	the lot if none of them want service.
2367  */
2368 	memcpy_fromio(&hostbits[0], (((unsigned char __iomem *) hdrp) + brdp->hostoffset),
2369 		bitsize);
2370 
2371 	memset(&slavebits[0], 0, bitsize);
2372 	slavebitchange = 0;
2373 
2374 	for (bitpos = 0; (bitpos < bitsize); bitpos++) {
2375 		if (hostbits[bitpos] == 0)
2376 			continue;
2377 		channr = bitpos * 8;
2378 		for (bitat = 0x1; (channr < nrdevs); channr++, bitat <<= 1) {
2379 			if (hostbits[bitpos] & bitat) {
2380 				portp = brdp->ports[(channr - 1)];
2381 				if (stli_hostcmd(brdp, portp)) {
2382 					slavebitchange++;
2383 					slavebits[bitpos] |= bitat;
2384 				}
2385 			}
2386 		}
2387 	}
2388 
2389 /*
2390  *	If any of the ports are no longer busy then update them in the
2391  *	slave request bits. We need to do this after, since a host port
2392  *	service may initiate more slave requests.
2393  */
2394 	if (slavebitchange) {
2395 		hdrp = (cdkhdr_t __iomem *) EBRDGETMEMPTR(brdp, CDK_CDKADDR);
2396 		slavep = ((unsigned char __iomem *) hdrp) + brdp->slaveoffset;
2397 		for (bitpos = 0; (bitpos < bitsize); bitpos++) {
2398 			if (readb(slavebits + bitpos))
2399 				writeb(readb(slavep + bitpos) & ~slavebits[bitpos], slavebits + bitpos);
2400 		}
2401 	}
2402 }
2403 
2404 /*****************************************************************************/
2405 
2406 /*
2407  *	Driver poll routine. This routine polls the boards in use and passes
2408  *	messages back up to host when necessary. This is actually very
2409  *	CPU efficient, since we will always have the kernel poll clock, it
2410  *	adds only a few cycles when idle (since board service can be
2411  *	determined very easily), but when loaded generates no interrupts
2412  *	(with their expensive associated context change).
2413  */
2414 
stli_poll(unsigned long arg)2415 static void stli_poll(unsigned long arg)
2416 {
2417 	cdkhdr_t __iomem *hdrp;
2418 	struct stlibrd *brdp;
2419 	unsigned int brdnr;
2420 
2421 	mod_timer(&stli_timerlist, STLI_TIMEOUT);
2422 
2423 /*
2424  *	Check each board and do any servicing required.
2425  */
2426 	for (brdnr = 0; (brdnr < stli_nrbrds); brdnr++) {
2427 		brdp = stli_brds[brdnr];
2428 		if (brdp == NULL)
2429 			continue;
2430 		if ((brdp->state & BST_STARTED) == 0)
2431 			continue;
2432 
2433 		spin_lock(&brd_lock);
2434 		EBRDENABLE(brdp);
2435 		hdrp = (cdkhdr_t __iomem *) EBRDGETMEMPTR(brdp, CDK_CDKADDR);
2436 		if (readb(&hdrp->hostreq))
2437 			stli_brdpoll(brdp, hdrp);
2438 		EBRDDISABLE(brdp);
2439 		spin_unlock(&brd_lock);
2440 	}
2441 }
2442 
2443 /*****************************************************************************/
2444 
2445 /*
2446  *	Translate the termios settings into the port setting structure of
2447  *	the slave.
2448  */
2449 
stli_mkasyport(struct tty_struct * tty,struct stliport * portp,asyport_t * pp,struct ktermios * tiosp)2450 static void stli_mkasyport(struct tty_struct *tty, struct stliport *portp,
2451 				asyport_t *pp, struct ktermios *tiosp)
2452 {
2453 	memset(pp, 0, sizeof(asyport_t));
2454 
2455 /*
2456  *	Start of by setting the baud, char size, parity and stop bit info.
2457  */
2458 	pp->baudout = tty_get_baud_rate(tty);
2459 	if ((tiosp->c_cflag & CBAUD) == B38400) {
2460 		if ((portp->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_HI)
2461 			pp->baudout = 57600;
2462 		else if ((portp->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_VHI)
2463 			pp->baudout = 115200;
2464 		else if ((portp->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_SHI)
2465 			pp->baudout = 230400;
2466 		else if ((portp->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_WARP)
2467 			pp->baudout = 460800;
2468 		else if ((portp->port.flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST)
2469 			pp->baudout = (portp->baud_base / portp->custom_divisor);
2470 	}
2471 	if (pp->baudout > STL_MAXBAUD)
2472 		pp->baudout = STL_MAXBAUD;
2473 	pp->baudin = pp->baudout;
2474 
2475 	switch (tiosp->c_cflag & CSIZE) {
2476 	case CS5:
2477 		pp->csize = 5;
2478 		break;
2479 	case CS6:
2480 		pp->csize = 6;
2481 		break;
2482 	case CS7:
2483 		pp->csize = 7;
2484 		break;
2485 	default:
2486 		pp->csize = 8;
2487 		break;
2488 	}
2489 
2490 	if (tiosp->c_cflag & CSTOPB)
2491 		pp->stopbs = PT_STOP2;
2492 	else
2493 		pp->stopbs = PT_STOP1;
2494 
2495 	if (tiosp->c_cflag & PARENB) {
2496 		if (tiosp->c_cflag & PARODD)
2497 			pp->parity = PT_ODDPARITY;
2498 		else
2499 			pp->parity = PT_EVENPARITY;
2500 	} else {
2501 		pp->parity = PT_NOPARITY;
2502 	}
2503 
2504 /*
2505  *	Set up any flow control options enabled.
2506  */
2507 	if (tiosp->c_iflag & IXON) {
2508 		pp->flow |= F_IXON;
2509 		if (tiosp->c_iflag & IXANY)
2510 			pp->flow |= F_IXANY;
2511 	}
2512 	if (tiosp->c_cflag & CRTSCTS)
2513 		pp->flow |= (F_RTSFLOW | F_CTSFLOW);
2514 
2515 	pp->startin = tiosp->c_cc[VSTART];
2516 	pp->stopin = tiosp->c_cc[VSTOP];
2517 	pp->startout = tiosp->c_cc[VSTART];
2518 	pp->stopout = tiosp->c_cc[VSTOP];
2519 
2520 /*
2521  *	Set up the RX char marking mask with those RX error types we must
2522  *	catch. We can get the slave to help us out a little here, it will
2523  *	ignore parity errors and breaks for us, and mark parity errors in
2524  *	the data stream.
2525  */
2526 	if (tiosp->c_iflag & IGNPAR)
2527 		pp->iflag |= FI_IGNRXERRS;
2528 	if (tiosp->c_iflag & IGNBRK)
2529 		pp->iflag |= FI_IGNBREAK;
2530 
2531 	portp->rxmarkmsk = 0;
2532 	if (tiosp->c_iflag & (INPCK | PARMRK))
2533 		pp->iflag |= FI_1MARKRXERRS;
2534 	if (tiosp->c_iflag & BRKINT)
2535 		portp->rxmarkmsk |= BRKINT;
2536 
2537 /*
2538  *	Set up clocal processing as required.
2539  */
2540 	if (tiosp->c_cflag & CLOCAL)
2541 		portp->port.flags &= ~ASYNC_CHECK_CD;
2542 	else
2543 		portp->port.flags |= ASYNC_CHECK_CD;
2544 
2545 /*
2546  *	Transfer any persistent flags into the asyport structure.
2547  */
2548 	pp->pflag = (portp->pflag & 0xffff);
2549 	pp->vmin = (portp->pflag & P_RXIMIN) ? 1 : 0;
2550 	pp->vtime = (portp->pflag & P_RXITIME) ? 1 : 0;
2551 	pp->cc[1] = (portp->pflag & P_RXTHOLD) ? 1 : 0;
2552 }
2553 
2554 /*****************************************************************************/
2555 
2556 /*
2557  *	Construct a slave signals structure for setting the DTR and RTS
2558  *	signals as specified.
2559  */
2560 
stli_mkasysigs(asysigs_t * sp,int dtr,int rts)2561 static void stli_mkasysigs(asysigs_t *sp, int dtr, int rts)
2562 {
2563 	memset(sp, 0, sizeof(asysigs_t));
2564 	if (dtr >= 0) {
2565 		sp->signal |= SG_DTR;
2566 		sp->sigvalue |= ((dtr > 0) ? SG_DTR : 0);
2567 	}
2568 	if (rts >= 0) {
2569 		sp->signal |= SG_RTS;
2570 		sp->sigvalue |= ((rts > 0) ? SG_RTS : 0);
2571 	}
2572 }
2573 
2574 /*****************************************************************************/
2575 
2576 /*
2577  *	Convert the signals returned from the slave into a local TIOCM type
2578  *	signals value. We keep them locally in TIOCM format.
2579  */
2580 
stli_mktiocm(unsigned long sigvalue)2581 static long stli_mktiocm(unsigned long sigvalue)
2582 {
2583 	long	tiocm = 0;
2584 	tiocm |= ((sigvalue & SG_DCD) ? TIOCM_CD : 0);
2585 	tiocm |= ((sigvalue & SG_CTS) ? TIOCM_CTS : 0);
2586 	tiocm |= ((sigvalue & SG_RI) ? TIOCM_RI : 0);
2587 	tiocm |= ((sigvalue & SG_DSR) ? TIOCM_DSR : 0);
2588 	tiocm |= ((sigvalue & SG_DTR) ? TIOCM_DTR : 0);
2589 	tiocm |= ((sigvalue & SG_RTS) ? TIOCM_RTS : 0);
2590 	return(tiocm);
2591 }
2592 
2593 /*****************************************************************************/
2594 
2595 /*
2596  *	All panels and ports actually attached have been worked out. All
2597  *	we need to do here is set up the appropriate per port data structures.
2598  */
2599 
stli_initports(struct stlibrd * brdp)2600 static int stli_initports(struct stlibrd *brdp)
2601 {
2602 	struct stliport	*portp;
2603 	unsigned int i, panelnr, panelport;
2604 
2605 	for (i = 0, panelnr = 0, panelport = 0; (i < brdp->nrports); i++) {
2606 		portp = kzalloc(sizeof(struct stliport), GFP_KERNEL);
2607 		if (!portp) {
2608 			printk(KERN_WARNING "istallion: failed to allocate port structure\n");
2609 			continue;
2610 		}
2611 		tty_port_init(&portp->port);
2612 		portp->port.ops = &stli_port_ops;
2613 		portp->magic = STLI_PORTMAGIC;
2614 		portp->portnr = i;
2615 		portp->brdnr = brdp->brdnr;
2616 		portp->panelnr = panelnr;
2617 		portp->baud_base = STL_BAUDBASE;
2618 		portp->port.close_delay = STL_CLOSEDELAY;
2619 		portp->closing_wait = 30 * HZ;
2620 		init_waitqueue_head(&portp->port.open_wait);
2621 		init_waitqueue_head(&portp->port.close_wait);
2622 		init_waitqueue_head(&portp->raw_wait);
2623 		panelport++;
2624 		if (panelport >= brdp->panels[panelnr]) {
2625 			panelport = 0;
2626 			panelnr++;
2627 		}
2628 		brdp->ports[i] = portp;
2629 	}
2630 
2631 	return 0;
2632 }
2633 
2634 /*****************************************************************************/
2635 
2636 /*
2637  *	All the following routines are board specific hardware operations.
2638  */
2639 
stli_ecpinit(struct stlibrd * brdp)2640 static void stli_ecpinit(struct stlibrd *brdp)
2641 {
2642 	unsigned long	memconf;
2643 
2644 	outb(ECP_ATSTOP, (brdp->iobase + ECP_ATCONFR));
2645 	udelay(10);
2646 	outb(ECP_ATDISABLE, (brdp->iobase + ECP_ATCONFR));
2647 	udelay(100);
2648 
2649 	memconf = (brdp->memaddr & ECP_ATADDRMASK) >> ECP_ATADDRSHFT;
2650 	outb(memconf, (brdp->iobase + ECP_ATMEMAR));
2651 }
2652 
2653 /*****************************************************************************/
2654 
stli_ecpenable(struct stlibrd * brdp)2655 static void stli_ecpenable(struct stlibrd *brdp)
2656 {
2657 	outb(ECP_ATENABLE, (brdp->iobase + ECP_ATCONFR));
2658 }
2659 
2660 /*****************************************************************************/
2661 
stli_ecpdisable(struct stlibrd * brdp)2662 static void stli_ecpdisable(struct stlibrd *brdp)
2663 {
2664 	outb(ECP_ATDISABLE, (brdp->iobase + ECP_ATCONFR));
2665 }
2666 
2667 /*****************************************************************************/
2668 
stli_ecpgetmemptr(struct stlibrd * brdp,unsigned long offset,int line)2669 static void __iomem *stli_ecpgetmemptr(struct stlibrd *brdp, unsigned long offset, int line)
2670 {
2671 	void __iomem *ptr;
2672 	unsigned char val;
2673 
2674 	if (offset > brdp->memsize) {
2675 		printk(KERN_ERR "istallion: shared memory pointer=%x out of "
2676 				"range at line=%d(%d), brd=%d\n",
2677 			(int) offset, line, __LINE__, brdp->brdnr);
2678 		ptr = NULL;
2679 		val = 0;
2680 	} else {
2681 		ptr = brdp->membase + (offset % ECP_ATPAGESIZE);
2682 		val = (unsigned char) (offset / ECP_ATPAGESIZE);
2683 	}
2684 	outb(val, (brdp->iobase + ECP_ATMEMPR));
2685 	return(ptr);
2686 }
2687 
2688 /*****************************************************************************/
2689 
stli_ecpreset(struct stlibrd * brdp)2690 static void stli_ecpreset(struct stlibrd *brdp)
2691 {
2692 	outb(ECP_ATSTOP, (brdp->iobase + ECP_ATCONFR));
2693 	udelay(10);
2694 	outb(ECP_ATDISABLE, (brdp->iobase + ECP_ATCONFR));
2695 	udelay(500);
2696 }
2697 
2698 /*****************************************************************************/
2699 
stli_ecpintr(struct stlibrd * brdp)2700 static void stli_ecpintr(struct stlibrd *brdp)
2701 {
2702 	outb(0x1, brdp->iobase);
2703 }
2704 
2705 /*****************************************************************************/
2706 
2707 /*
2708  *	The following set of functions act on ECP EISA boards.
2709  */
2710 
stli_ecpeiinit(struct stlibrd * brdp)2711 static void stli_ecpeiinit(struct stlibrd *brdp)
2712 {
2713 	unsigned long	memconf;
2714 
2715 	outb(0x1, (brdp->iobase + ECP_EIBRDENAB));
2716 	outb(ECP_EISTOP, (brdp->iobase + ECP_EICONFR));
2717 	udelay(10);
2718 	outb(ECP_EIDISABLE, (brdp->iobase + ECP_EICONFR));
2719 	udelay(500);
2720 
2721 	memconf = (brdp->memaddr & ECP_EIADDRMASKL) >> ECP_EIADDRSHFTL;
2722 	outb(memconf, (brdp->iobase + ECP_EIMEMARL));
2723 	memconf = (brdp->memaddr & ECP_EIADDRMASKH) >> ECP_EIADDRSHFTH;
2724 	outb(memconf, (brdp->iobase + ECP_EIMEMARH));
2725 }
2726 
2727 /*****************************************************************************/
2728 
stli_ecpeienable(struct stlibrd * brdp)2729 static void stli_ecpeienable(struct stlibrd *brdp)
2730 {
2731 	outb(ECP_EIENABLE, (brdp->iobase + ECP_EICONFR));
2732 }
2733 
2734 /*****************************************************************************/
2735 
stli_ecpeidisable(struct stlibrd * brdp)2736 static void stli_ecpeidisable(struct stlibrd *brdp)
2737 {
2738 	outb(ECP_EIDISABLE, (brdp->iobase + ECP_EICONFR));
2739 }
2740 
2741 /*****************************************************************************/
2742 
stli_ecpeigetmemptr(struct stlibrd * brdp,unsigned long offset,int line)2743 static void __iomem *stli_ecpeigetmemptr(struct stlibrd *brdp, unsigned long offset, int line)
2744 {
2745 	void __iomem *ptr;
2746 	unsigned char	val;
2747 
2748 	if (offset > brdp->memsize) {
2749 		printk(KERN_ERR "istallion: shared memory pointer=%x out of "
2750 				"range at line=%d(%d), brd=%d\n",
2751 			(int) offset, line, __LINE__, brdp->brdnr);
2752 		ptr = NULL;
2753 		val = 0;
2754 	} else {
2755 		ptr = brdp->membase + (offset % ECP_EIPAGESIZE);
2756 		if (offset < ECP_EIPAGESIZE)
2757 			val = ECP_EIENABLE;
2758 		else
2759 			val = ECP_EIENABLE | 0x40;
2760 	}
2761 	outb(val, (brdp->iobase + ECP_EICONFR));
2762 	return(ptr);
2763 }
2764 
2765 /*****************************************************************************/
2766 
stli_ecpeireset(struct stlibrd * brdp)2767 static void stli_ecpeireset(struct stlibrd *brdp)
2768 {
2769 	outb(ECP_EISTOP, (brdp->iobase + ECP_EICONFR));
2770 	udelay(10);
2771 	outb(ECP_EIDISABLE, (brdp->iobase + ECP_EICONFR));
2772 	udelay(500);
2773 }
2774 
2775 /*****************************************************************************/
2776 
2777 /*
2778  *	The following set of functions act on ECP MCA boards.
2779  */
2780 
stli_ecpmcenable(struct stlibrd * brdp)2781 static void stli_ecpmcenable(struct stlibrd *brdp)
2782 {
2783 	outb(ECP_MCENABLE, (brdp->iobase + ECP_MCCONFR));
2784 }
2785 
2786 /*****************************************************************************/
2787 
stli_ecpmcdisable(struct stlibrd * brdp)2788 static void stli_ecpmcdisable(struct stlibrd *brdp)
2789 {
2790 	outb(ECP_MCDISABLE, (brdp->iobase + ECP_MCCONFR));
2791 }
2792 
2793 /*****************************************************************************/
2794 
stli_ecpmcgetmemptr(struct stlibrd * brdp,unsigned long offset,int line)2795 static void __iomem *stli_ecpmcgetmemptr(struct stlibrd *brdp, unsigned long offset, int line)
2796 {
2797 	void __iomem *ptr;
2798 	unsigned char val;
2799 
2800 	if (offset > brdp->memsize) {
2801 		printk(KERN_ERR "istallion: shared memory pointer=%x out of "
2802 				"range at line=%d(%d), brd=%d\n",
2803 			(int) offset, line, __LINE__, brdp->brdnr);
2804 		ptr = NULL;
2805 		val = 0;
2806 	} else {
2807 		ptr = brdp->membase + (offset % ECP_MCPAGESIZE);
2808 		val = ((unsigned char) (offset / ECP_MCPAGESIZE)) | ECP_MCENABLE;
2809 	}
2810 	outb(val, (brdp->iobase + ECP_MCCONFR));
2811 	return(ptr);
2812 }
2813 
2814 /*****************************************************************************/
2815 
stli_ecpmcreset(struct stlibrd * brdp)2816 static void stli_ecpmcreset(struct stlibrd *brdp)
2817 {
2818 	outb(ECP_MCSTOP, (brdp->iobase + ECP_MCCONFR));
2819 	udelay(10);
2820 	outb(ECP_MCDISABLE, (brdp->iobase + ECP_MCCONFR));
2821 	udelay(500);
2822 }
2823 
2824 /*****************************************************************************/
2825 
2826 /*
2827  *	The following set of functions act on ECP PCI boards.
2828  */
2829 
stli_ecppciinit(struct stlibrd * brdp)2830 static void stli_ecppciinit(struct stlibrd *brdp)
2831 {
2832 	outb(ECP_PCISTOP, (brdp->iobase + ECP_PCICONFR));
2833 	udelay(10);
2834 	outb(0, (brdp->iobase + ECP_PCICONFR));
2835 	udelay(500);
2836 }
2837 
2838 /*****************************************************************************/
2839 
stli_ecppcigetmemptr(struct stlibrd * brdp,unsigned long offset,int line)2840 static void __iomem *stli_ecppcigetmemptr(struct stlibrd *brdp, unsigned long offset, int line)
2841 {
2842 	void __iomem *ptr;
2843 	unsigned char	val;
2844 
2845 	if (offset > brdp->memsize) {
2846 		printk(KERN_ERR "istallion: shared memory pointer=%x out of "
2847 				"range at line=%d(%d), board=%d\n",
2848 				(int) offset, line, __LINE__, brdp->brdnr);
2849 		ptr = NULL;
2850 		val = 0;
2851 	} else {
2852 		ptr = brdp->membase + (offset % ECP_PCIPAGESIZE);
2853 		val = (offset / ECP_PCIPAGESIZE) << 1;
2854 	}
2855 	outb(val, (brdp->iobase + ECP_PCICONFR));
2856 	return(ptr);
2857 }
2858 
2859 /*****************************************************************************/
2860 
stli_ecppcireset(struct stlibrd * brdp)2861 static void stli_ecppcireset(struct stlibrd *brdp)
2862 {
2863 	outb(ECP_PCISTOP, (brdp->iobase + ECP_PCICONFR));
2864 	udelay(10);
2865 	outb(0, (brdp->iobase + ECP_PCICONFR));
2866 	udelay(500);
2867 }
2868 
2869 /*****************************************************************************/
2870 
2871 /*
2872  *	The following routines act on ONboards.
2873  */
2874 
stli_onbinit(struct stlibrd * brdp)2875 static void stli_onbinit(struct stlibrd *brdp)
2876 {
2877 	unsigned long	memconf;
2878 
2879 	outb(ONB_ATSTOP, (brdp->iobase + ONB_ATCONFR));
2880 	udelay(10);
2881 	outb(ONB_ATDISABLE, (brdp->iobase + ONB_ATCONFR));
2882 	mdelay(1000);
2883 
2884 	memconf = (brdp->memaddr & ONB_ATADDRMASK) >> ONB_ATADDRSHFT;
2885 	outb(memconf, (brdp->iobase + ONB_ATMEMAR));
2886 	outb(0x1, brdp->iobase);
2887 	mdelay(1);
2888 }
2889 
2890 /*****************************************************************************/
2891 
stli_onbenable(struct stlibrd * brdp)2892 static void stli_onbenable(struct stlibrd *brdp)
2893 {
2894 	outb((brdp->enabval | ONB_ATENABLE), (brdp->iobase + ONB_ATCONFR));
2895 }
2896 
2897 /*****************************************************************************/
2898 
stli_onbdisable(struct stlibrd * brdp)2899 static void stli_onbdisable(struct stlibrd *brdp)
2900 {
2901 	outb((brdp->enabval | ONB_ATDISABLE), (brdp->iobase + ONB_ATCONFR));
2902 }
2903 
2904 /*****************************************************************************/
2905 
stli_onbgetmemptr(struct stlibrd * brdp,unsigned long offset,int line)2906 static void __iomem *stli_onbgetmemptr(struct stlibrd *brdp, unsigned long offset, int line)
2907 {
2908 	void __iomem *ptr;
2909 
2910 	if (offset > brdp->memsize) {
2911 		printk(KERN_ERR "istallion: shared memory pointer=%x out of "
2912 				"range at line=%d(%d), brd=%d\n",
2913 				(int) offset, line, __LINE__, brdp->brdnr);
2914 		ptr = NULL;
2915 	} else {
2916 		ptr = brdp->membase + (offset % ONB_ATPAGESIZE);
2917 	}
2918 	return(ptr);
2919 }
2920 
2921 /*****************************************************************************/
2922 
stli_onbreset(struct stlibrd * brdp)2923 static void stli_onbreset(struct stlibrd *brdp)
2924 {
2925 	outb(ONB_ATSTOP, (brdp->iobase + ONB_ATCONFR));
2926 	udelay(10);
2927 	outb(ONB_ATDISABLE, (brdp->iobase + ONB_ATCONFR));
2928 	mdelay(1000);
2929 }
2930 
2931 /*****************************************************************************/
2932 
2933 /*
2934  *	The following routines act on ONboard EISA.
2935  */
2936 
stli_onbeinit(struct stlibrd * brdp)2937 static void stli_onbeinit(struct stlibrd *brdp)
2938 {
2939 	unsigned long	memconf;
2940 
2941 	outb(0x1, (brdp->iobase + ONB_EIBRDENAB));
2942 	outb(ONB_EISTOP, (brdp->iobase + ONB_EICONFR));
2943 	udelay(10);
2944 	outb(ONB_EIDISABLE, (brdp->iobase + ONB_EICONFR));
2945 	mdelay(1000);
2946 
2947 	memconf = (brdp->memaddr & ONB_EIADDRMASKL) >> ONB_EIADDRSHFTL;
2948 	outb(memconf, (brdp->iobase + ONB_EIMEMARL));
2949 	memconf = (brdp->memaddr & ONB_EIADDRMASKH) >> ONB_EIADDRSHFTH;
2950 	outb(memconf, (brdp->iobase + ONB_EIMEMARH));
2951 	outb(0x1, brdp->iobase);
2952 	mdelay(1);
2953 }
2954 
2955 /*****************************************************************************/
2956 
stli_onbeenable(struct stlibrd * brdp)2957 static void stli_onbeenable(struct stlibrd *brdp)
2958 {
2959 	outb(ONB_EIENABLE, (brdp->iobase + ONB_EICONFR));
2960 }
2961 
2962 /*****************************************************************************/
2963 
stli_onbedisable(struct stlibrd * brdp)2964 static void stli_onbedisable(struct stlibrd *brdp)
2965 {
2966 	outb(ONB_EIDISABLE, (brdp->iobase + ONB_EICONFR));
2967 }
2968 
2969 /*****************************************************************************/
2970 
stli_onbegetmemptr(struct stlibrd * brdp,unsigned long offset,int line)2971 static void __iomem *stli_onbegetmemptr(struct stlibrd *brdp, unsigned long offset, int line)
2972 {
2973 	void __iomem *ptr;
2974 	unsigned char val;
2975 
2976 	if (offset > brdp->memsize) {
2977 		printk(KERN_ERR "istallion: shared memory pointer=%x out of "
2978 				"range at line=%d(%d), brd=%d\n",
2979 			(int) offset, line, __LINE__, brdp->brdnr);
2980 		ptr = NULL;
2981 		val = 0;
2982 	} else {
2983 		ptr = brdp->membase + (offset % ONB_EIPAGESIZE);
2984 		if (offset < ONB_EIPAGESIZE)
2985 			val = ONB_EIENABLE;
2986 		else
2987 			val = ONB_EIENABLE | 0x40;
2988 	}
2989 	outb(val, (brdp->iobase + ONB_EICONFR));
2990 	return(ptr);
2991 }
2992 
2993 /*****************************************************************************/
2994 
stli_onbereset(struct stlibrd * brdp)2995 static void stli_onbereset(struct stlibrd *brdp)
2996 {
2997 	outb(ONB_EISTOP, (brdp->iobase + ONB_EICONFR));
2998 	udelay(10);
2999 	outb(ONB_EIDISABLE, (brdp->iobase + ONB_EICONFR));
3000 	mdelay(1000);
3001 }
3002 
3003 /*****************************************************************************/
3004 
3005 /*
3006  *	The following routines act on Brumby boards.
3007  */
3008 
stli_bbyinit(struct stlibrd * brdp)3009 static void stli_bbyinit(struct stlibrd *brdp)
3010 {
3011 	outb(BBY_ATSTOP, (brdp->iobase + BBY_ATCONFR));
3012 	udelay(10);
3013 	outb(0, (brdp->iobase + BBY_ATCONFR));
3014 	mdelay(1000);
3015 	outb(0x1, brdp->iobase);
3016 	mdelay(1);
3017 }
3018 
3019 /*****************************************************************************/
3020 
stli_bbygetmemptr(struct stlibrd * brdp,unsigned long offset,int line)3021 static void __iomem *stli_bbygetmemptr(struct stlibrd *brdp, unsigned long offset, int line)
3022 {
3023 	void __iomem *ptr;
3024 	unsigned char val;
3025 
3026 	BUG_ON(offset > brdp->memsize);
3027 
3028 	ptr = brdp->membase + (offset % BBY_PAGESIZE);
3029 	val = (unsigned char) (offset / BBY_PAGESIZE);
3030 	outb(val, (brdp->iobase + BBY_ATCONFR));
3031 	return(ptr);
3032 }
3033 
3034 /*****************************************************************************/
3035 
stli_bbyreset(struct stlibrd * brdp)3036 static void stli_bbyreset(struct stlibrd *brdp)
3037 {
3038 	outb(BBY_ATSTOP, (brdp->iobase + BBY_ATCONFR));
3039 	udelay(10);
3040 	outb(0, (brdp->iobase + BBY_ATCONFR));
3041 	mdelay(1000);
3042 }
3043 
3044 /*****************************************************************************/
3045 
3046 /*
3047  *	The following routines act on original old Stallion boards.
3048  */
3049 
stli_stalinit(struct stlibrd * brdp)3050 static void stli_stalinit(struct stlibrd *brdp)
3051 {
3052 	outb(0x1, brdp->iobase);
3053 	mdelay(1000);
3054 }
3055 
3056 /*****************************************************************************/
3057 
stli_stalgetmemptr(struct stlibrd * brdp,unsigned long offset,int line)3058 static void __iomem *stli_stalgetmemptr(struct stlibrd *brdp, unsigned long offset, int line)
3059 {
3060 	BUG_ON(offset > brdp->memsize);
3061 	return brdp->membase + (offset % STAL_PAGESIZE);
3062 }
3063 
3064 /*****************************************************************************/
3065 
stli_stalreset(struct stlibrd * brdp)3066 static void stli_stalreset(struct stlibrd *brdp)
3067 {
3068 	u32 __iomem *vecp;
3069 
3070 	vecp = (u32 __iomem *) (brdp->membase + 0x30);
3071 	writel(0xffff0000, vecp);
3072 	outb(0, brdp->iobase);
3073 	mdelay(1000);
3074 }
3075 
3076 /*****************************************************************************/
3077 
3078 /*
3079  *	Try to find an ECP board and initialize it. This handles only ECP
3080  *	board types.
3081  */
3082 
stli_initecp(struct stlibrd * brdp)3083 static int stli_initecp(struct stlibrd *brdp)
3084 {
3085 	cdkecpsig_t sig;
3086 	cdkecpsig_t __iomem *sigsp;
3087 	unsigned int status, nxtid;
3088 	char *name;
3089 	int retval, panelnr, nrports;
3090 
3091 	if ((brdp->iobase == 0) || (brdp->memaddr == 0)) {
3092 		retval = -ENODEV;
3093 		goto err;
3094 	}
3095 
3096 	brdp->iosize = ECP_IOSIZE;
3097 
3098 	if (!request_region(brdp->iobase, brdp->iosize, "istallion")) {
3099 		retval = -EIO;
3100 		goto err;
3101 	}
3102 
3103 /*
3104  *	Based on the specific board type setup the common vars to access
3105  *	and enable shared memory. Set all board specific information now
3106  *	as well.
3107  */
3108 	switch (brdp->brdtype) {
3109 	case BRD_ECP:
3110 		brdp->memsize = ECP_MEMSIZE;
3111 		brdp->pagesize = ECP_ATPAGESIZE;
3112 		brdp->init = stli_ecpinit;
3113 		brdp->enable = stli_ecpenable;
3114 		brdp->reenable = stli_ecpenable;
3115 		brdp->disable = stli_ecpdisable;
3116 		brdp->getmemptr = stli_ecpgetmemptr;
3117 		brdp->intr = stli_ecpintr;
3118 		brdp->reset = stli_ecpreset;
3119 		name = "serial(EC8/64)";
3120 		break;
3121 
3122 	case BRD_ECPE:
3123 		brdp->memsize = ECP_MEMSIZE;
3124 		brdp->pagesize = ECP_EIPAGESIZE;
3125 		brdp->init = stli_ecpeiinit;
3126 		brdp->enable = stli_ecpeienable;
3127 		brdp->reenable = stli_ecpeienable;
3128 		brdp->disable = stli_ecpeidisable;
3129 		brdp->getmemptr = stli_ecpeigetmemptr;
3130 		brdp->intr = stli_ecpintr;
3131 		brdp->reset = stli_ecpeireset;
3132 		name = "serial(EC8/64-EI)";
3133 		break;
3134 
3135 	case BRD_ECPMC:
3136 		brdp->memsize = ECP_MEMSIZE;
3137 		brdp->pagesize = ECP_MCPAGESIZE;
3138 		brdp->init = NULL;
3139 		brdp->enable = stli_ecpmcenable;
3140 		brdp->reenable = stli_ecpmcenable;
3141 		brdp->disable = stli_ecpmcdisable;
3142 		brdp->getmemptr = stli_ecpmcgetmemptr;
3143 		brdp->intr = stli_ecpintr;
3144 		brdp->reset = stli_ecpmcreset;
3145 		name = "serial(EC8/64-MCA)";
3146 		break;
3147 
3148 	case BRD_ECPPCI:
3149 		brdp->memsize = ECP_PCIMEMSIZE;
3150 		brdp->pagesize = ECP_PCIPAGESIZE;
3151 		brdp->init = stli_ecppciinit;
3152 		brdp->enable = NULL;
3153 		brdp->reenable = NULL;
3154 		brdp->disable = NULL;
3155 		brdp->getmemptr = stli_ecppcigetmemptr;
3156 		brdp->intr = stli_ecpintr;
3157 		brdp->reset = stli_ecppcireset;
3158 		name = "serial(EC/RA-PCI)";
3159 		break;
3160 
3161 	default:
3162 		retval = -EINVAL;
3163 		goto err_reg;
3164 	}
3165 
3166 /*
3167  *	The per-board operations structure is all set up, so now let's go
3168  *	and get the board operational. Firstly initialize board configuration
3169  *	registers. Set the memory mapping info so we can get at the boards
3170  *	shared memory.
3171  */
3172 	EBRDINIT(brdp);
3173 
3174 	brdp->membase = ioremap_nocache(brdp->memaddr, brdp->memsize);
3175 	if (brdp->membase == NULL) {
3176 		retval = -ENOMEM;
3177 		goto err_reg;
3178 	}
3179 
3180 /*
3181  *	Now that all specific code is set up, enable the shared memory and
3182  *	look for the a signature area that will tell us exactly what board
3183  *	this is, and what it is connected to it.
3184  */
3185 	EBRDENABLE(brdp);
3186 	sigsp = (cdkecpsig_t __iomem *) EBRDGETMEMPTR(brdp, CDK_SIGADDR);
3187 	memcpy_fromio(&sig, sigsp, sizeof(cdkecpsig_t));
3188 	EBRDDISABLE(brdp);
3189 
3190 	if (sig.magic != cpu_to_le32(ECP_MAGIC)) {
3191 		retval = -ENODEV;
3192 		goto err_unmap;
3193 	}
3194 
3195 /*
3196  *	Scan through the signature looking at the panels connected to the
3197  *	board. Calculate the total number of ports as we go.
3198  */
3199 	for (panelnr = 0, nxtid = 0; (panelnr < STL_MAXPANELS); panelnr++) {
3200 		status = sig.panelid[nxtid];
3201 		if ((status & ECH_PNLIDMASK) != nxtid)
3202 			break;
3203 
3204 		brdp->panelids[panelnr] = status;
3205 		nrports = (status & ECH_PNL16PORT) ? 16 : 8;
3206 		if ((nrports == 16) && ((status & ECH_PNLXPID) == 0))
3207 			nxtid++;
3208 		brdp->panels[panelnr] = nrports;
3209 		brdp->nrports += nrports;
3210 		nxtid++;
3211 		brdp->nrpanels++;
3212 	}
3213 
3214 
3215 	brdp->state |= BST_FOUND;
3216 	return 0;
3217 err_unmap:
3218 	iounmap(brdp->membase);
3219 	brdp->membase = NULL;
3220 err_reg:
3221 	release_region(brdp->iobase, brdp->iosize);
3222 err:
3223 	return retval;
3224 }
3225 
3226 /*****************************************************************************/
3227 
3228 /*
3229  *	Try to find an ONboard, Brumby or Stallion board and initialize it.
3230  *	This handles only these board types.
3231  */
3232 
stli_initonb(struct stlibrd * brdp)3233 static int stli_initonb(struct stlibrd *brdp)
3234 {
3235 	cdkonbsig_t sig;
3236 	cdkonbsig_t __iomem *sigsp;
3237 	char *name;
3238 	int i, retval;
3239 
3240 /*
3241  *	Do a basic sanity check on the IO and memory addresses.
3242  */
3243 	if (brdp->iobase == 0 || brdp->memaddr == 0) {
3244 		retval = -ENODEV;
3245 		goto err;
3246 	}
3247 
3248 	brdp->iosize = ONB_IOSIZE;
3249 
3250 	if (!request_region(brdp->iobase, brdp->iosize, "istallion")) {
3251 		retval = -EIO;
3252 		goto err;
3253 	}
3254 
3255 /*
3256  *	Based on the specific board type setup the common vars to access
3257  *	and enable shared memory. Set all board specific information now
3258  *	as well.
3259  */
3260 	switch (brdp->brdtype) {
3261 	case BRD_ONBOARD:
3262 	case BRD_ONBOARD2:
3263 		brdp->memsize = ONB_MEMSIZE;
3264 		brdp->pagesize = ONB_ATPAGESIZE;
3265 		brdp->init = stli_onbinit;
3266 		brdp->enable = stli_onbenable;
3267 		brdp->reenable = stli_onbenable;
3268 		brdp->disable = stli_onbdisable;
3269 		brdp->getmemptr = stli_onbgetmemptr;
3270 		brdp->intr = stli_ecpintr;
3271 		brdp->reset = stli_onbreset;
3272 		if (brdp->memaddr > 0x100000)
3273 			brdp->enabval = ONB_MEMENABHI;
3274 		else
3275 			brdp->enabval = ONB_MEMENABLO;
3276 		name = "serial(ONBoard)";
3277 		break;
3278 
3279 	case BRD_ONBOARDE:
3280 		brdp->memsize = ONB_EIMEMSIZE;
3281 		brdp->pagesize = ONB_EIPAGESIZE;
3282 		brdp->init = stli_onbeinit;
3283 		brdp->enable = stli_onbeenable;
3284 		brdp->reenable = stli_onbeenable;
3285 		brdp->disable = stli_onbedisable;
3286 		brdp->getmemptr = stli_onbegetmemptr;
3287 		brdp->intr = stli_ecpintr;
3288 		brdp->reset = stli_onbereset;
3289 		name = "serial(ONBoard/E)";
3290 		break;
3291 
3292 	case BRD_BRUMBY4:
3293 		brdp->memsize = BBY_MEMSIZE;
3294 		brdp->pagesize = BBY_PAGESIZE;
3295 		brdp->init = stli_bbyinit;
3296 		brdp->enable = NULL;
3297 		brdp->reenable = NULL;
3298 		brdp->disable = NULL;
3299 		brdp->getmemptr = stli_bbygetmemptr;
3300 		brdp->intr = stli_ecpintr;
3301 		brdp->reset = stli_bbyreset;
3302 		name = "serial(Brumby)";
3303 		break;
3304 
3305 	case BRD_STALLION:
3306 		brdp->memsize = STAL_MEMSIZE;
3307 		brdp->pagesize = STAL_PAGESIZE;
3308 		brdp->init = stli_stalinit;
3309 		brdp->enable = NULL;
3310 		brdp->reenable = NULL;
3311 		brdp->disable = NULL;
3312 		brdp->getmemptr = stli_stalgetmemptr;
3313 		brdp->intr = stli_ecpintr;
3314 		brdp->reset = stli_stalreset;
3315 		name = "serial(Stallion)";
3316 		break;
3317 
3318 	default:
3319 		retval = -EINVAL;
3320 		goto err_reg;
3321 	}
3322 
3323 /*
3324  *	The per-board operations structure is all set up, so now let's go
3325  *	and get the board operational. Firstly initialize board configuration
3326  *	registers. Set the memory mapping info so we can get at the boards
3327  *	shared memory.
3328  */
3329 	EBRDINIT(brdp);
3330 
3331 	brdp->membase = ioremap_nocache(brdp->memaddr, brdp->memsize);
3332 	if (brdp->membase == NULL) {
3333 		retval = -ENOMEM;
3334 		goto err_reg;
3335 	}
3336 
3337 /*
3338  *	Now that all specific code is set up, enable the shared memory and
3339  *	look for the a signature area that will tell us exactly what board
3340  *	this is, and how many ports.
3341  */
3342 	EBRDENABLE(brdp);
3343 	sigsp = (cdkonbsig_t __iomem *) EBRDGETMEMPTR(brdp, CDK_SIGADDR);
3344 	memcpy_fromio(&sig, sigsp, sizeof(cdkonbsig_t));
3345 	EBRDDISABLE(brdp);
3346 
3347 	if (sig.magic0 != cpu_to_le16(ONB_MAGIC0) ||
3348 	    sig.magic1 != cpu_to_le16(ONB_MAGIC1) ||
3349 	    sig.magic2 != cpu_to_le16(ONB_MAGIC2) ||
3350 	    sig.magic3 != cpu_to_le16(ONB_MAGIC3)) {
3351 		retval = -ENODEV;
3352 		goto err_unmap;
3353 	}
3354 
3355 /*
3356  *	Scan through the signature alive mask and calculate how many ports
3357  *	there are on this board.
3358  */
3359 	brdp->nrpanels = 1;
3360 	if (sig.amask1) {
3361 		brdp->nrports = 32;
3362 	} else {
3363 		for (i = 0; (i < 16); i++) {
3364 			if (((sig.amask0 << i) & 0x8000) == 0)
3365 				break;
3366 		}
3367 		brdp->nrports = i;
3368 	}
3369 	brdp->panels[0] = brdp->nrports;
3370 
3371 
3372 	brdp->state |= BST_FOUND;
3373 	return 0;
3374 err_unmap:
3375 	iounmap(brdp->membase);
3376 	brdp->membase = NULL;
3377 err_reg:
3378 	release_region(brdp->iobase, brdp->iosize);
3379 err:
3380 	return retval;
3381 }
3382 
3383 /*****************************************************************************/
3384 
3385 /*
3386  *	Start up a running board. This routine is only called after the
3387  *	code has been down loaded to the board and is operational. It will
3388  *	read in the memory map, and get the show on the road...
3389  */
3390 
stli_startbrd(struct stlibrd * brdp)3391 static int stli_startbrd(struct stlibrd *brdp)
3392 {
3393 	cdkhdr_t __iomem *hdrp;
3394 	cdkmem_t __iomem *memp;
3395 	cdkasy_t __iomem *ap;
3396 	unsigned long flags;
3397 	unsigned int portnr, nrdevs, i;
3398 	struct stliport *portp;
3399 	int rc = 0;
3400 	u32 memoff;
3401 
3402 	spin_lock_irqsave(&brd_lock, flags);
3403 	EBRDENABLE(brdp);
3404 	hdrp = (cdkhdr_t __iomem *) EBRDGETMEMPTR(brdp, CDK_CDKADDR);
3405 	nrdevs = hdrp->nrdevs;
3406 
3407 #if 0
3408 	printk("%s(%d): CDK version %d.%d.%d --> "
3409 		"nrdevs=%d memp=%x hostp=%x slavep=%x\n",
3410 		 __FILE__, __LINE__, readb(&hdrp->ver_release), readb(&hdrp->ver_modification),
3411 		 readb(&hdrp->ver_fix), nrdevs, (int) readl(&hdrp->memp), readl(&hdrp->hostp),
3412 		 readl(&hdrp->slavep));
3413 #endif
3414 
3415 	if (nrdevs < (brdp->nrports + 1)) {
3416 		printk(KERN_ERR "istallion: slave failed to allocate memory for "
3417 				"all devices, devices=%d\n", nrdevs);
3418 		brdp->nrports = nrdevs - 1;
3419 	}
3420 	brdp->nrdevs = nrdevs;
3421 	brdp->hostoffset = hdrp->hostp - CDK_CDKADDR;
3422 	brdp->slaveoffset = hdrp->slavep - CDK_CDKADDR;
3423 	brdp->bitsize = (nrdevs + 7) / 8;
3424 	memoff = readl(&hdrp->memp);
3425 	if (memoff > brdp->memsize) {
3426 		printk(KERN_ERR "istallion: corrupted shared memory region?\n");
3427 		rc = -EIO;
3428 		goto stli_donestartup;
3429 	}
3430 	memp = (cdkmem_t __iomem *) EBRDGETMEMPTR(brdp, memoff);
3431 	if (readw(&memp->dtype) != TYP_ASYNCTRL) {
3432 		printk(KERN_ERR "istallion: no slave control device found\n");
3433 		goto stli_donestartup;
3434 	}
3435 	memp++;
3436 
3437 /*
3438  *	Cycle through memory allocation of each port. We are guaranteed to
3439  *	have all ports inside the first page of slave window, so no need to
3440  *	change pages while reading memory map.
3441  */
3442 	for (i = 1, portnr = 0; (i < nrdevs); i++, portnr++, memp++) {
3443 		if (readw(&memp->dtype) != TYP_ASYNC)
3444 			break;
3445 		portp = brdp->ports[portnr];
3446 		if (portp == NULL)
3447 			break;
3448 		portp->devnr = i;
3449 		portp->addr = readl(&memp->offset);
3450 		portp->reqbit = (unsigned char) (0x1 << (i * 8 / nrdevs));
3451 		portp->portidx = (unsigned char) (i / 8);
3452 		portp->portbit = (unsigned char) (0x1 << (i % 8));
3453 	}
3454 
3455 	writeb(0xff, &hdrp->slavereq);
3456 
3457 /*
3458  *	For each port setup a local copy of the RX and TX buffer offsets
3459  *	and sizes. We do this separate from the above, because we need to
3460  *	move the shared memory page...
3461  */
3462 	for (i = 1, portnr = 0; (i < nrdevs); i++, portnr++) {
3463 		portp = brdp->ports[portnr];
3464 		if (portp == NULL)
3465 			break;
3466 		if (portp->addr == 0)
3467 			break;
3468 		ap = (cdkasy_t __iomem *) EBRDGETMEMPTR(brdp, portp->addr);
3469 		if (ap != NULL) {
3470 			portp->rxsize = readw(&ap->rxq.size);
3471 			portp->txsize = readw(&ap->txq.size);
3472 			portp->rxoffset = readl(&ap->rxq.offset);
3473 			portp->txoffset = readl(&ap->txq.offset);
3474 		}
3475 	}
3476 
3477 stli_donestartup:
3478 	EBRDDISABLE(brdp);
3479 	spin_unlock_irqrestore(&brd_lock, flags);
3480 
3481 	if (rc == 0)
3482 		brdp->state |= BST_STARTED;
3483 
3484 	if (! stli_timeron) {
3485 		stli_timeron++;
3486 		mod_timer(&stli_timerlist, STLI_TIMEOUT);
3487 	}
3488 
3489 	return rc;
3490 }
3491 
3492 /*****************************************************************************/
3493 
3494 /*
3495  *	Probe and initialize the specified board.
3496  */
3497 
stli_brdinit(struct stlibrd * brdp)3498 static int __devinit stli_brdinit(struct stlibrd *brdp)
3499 {
3500 	int retval;
3501 
3502 	switch (brdp->brdtype) {
3503 	case BRD_ECP:
3504 	case BRD_ECPE:
3505 	case BRD_ECPMC:
3506 	case BRD_ECPPCI:
3507 		retval = stli_initecp(brdp);
3508 		break;
3509 	case BRD_ONBOARD:
3510 	case BRD_ONBOARDE:
3511 	case BRD_ONBOARD2:
3512 	case BRD_BRUMBY4:
3513 	case BRD_STALLION:
3514 		retval = stli_initonb(brdp);
3515 		break;
3516 	default:
3517 		printk(KERN_ERR "istallion: board=%d is unknown board "
3518 				"type=%d\n", brdp->brdnr, brdp->brdtype);
3519 		retval = -ENODEV;
3520 	}
3521 
3522 	if (retval)
3523 		return retval;
3524 
3525 	stli_initports(brdp);
3526 	printk(KERN_INFO "istallion: %s found, board=%d io=%x mem=%x "
3527 		"nrpanels=%d nrports=%d\n", stli_brdnames[brdp->brdtype],
3528 		brdp->brdnr, brdp->iobase, (int) brdp->memaddr,
3529 		brdp->nrpanels, brdp->nrports);
3530 	return 0;
3531 }
3532 
3533 #if STLI_EISAPROBE != 0
3534 /*****************************************************************************/
3535 
3536 /*
3537  *	Probe around trying to find where the EISA boards shared memory
3538  *	might be. This is a bit if hack, but it is the best we can do.
3539  */
3540 
stli_eisamemprobe(struct stlibrd * brdp)3541 static int stli_eisamemprobe(struct stlibrd *brdp)
3542 {
3543 	cdkecpsig_t	ecpsig, __iomem *ecpsigp;
3544 	cdkonbsig_t	onbsig, __iomem *onbsigp;
3545 	int		i, foundit;
3546 
3547 /*
3548  *	First up we reset the board, to get it into a known state. There
3549  *	is only 2 board types here we need to worry about. Don;t use the
3550  *	standard board init routine here, it programs up the shared
3551  *	memory address, and we don't know it yet...
3552  */
3553 	if (brdp->brdtype == BRD_ECPE) {
3554 		outb(0x1, (brdp->iobase + ECP_EIBRDENAB));
3555 		outb(ECP_EISTOP, (brdp->iobase + ECP_EICONFR));
3556 		udelay(10);
3557 		outb(ECP_EIDISABLE, (brdp->iobase + ECP_EICONFR));
3558 		udelay(500);
3559 		stli_ecpeienable(brdp);
3560 	} else if (brdp->brdtype == BRD_ONBOARDE) {
3561 		outb(0x1, (brdp->iobase + ONB_EIBRDENAB));
3562 		outb(ONB_EISTOP, (brdp->iobase + ONB_EICONFR));
3563 		udelay(10);
3564 		outb(ONB_EIDISABLE, (brdp->iobase + ONB_EICONFR));
3565 		mdelay(100);
3566 		outb(0x1, brdp->iobase);
3567 		mdelay(1);
3568 		stli_onbeenable(brdp);
3569 	} else {
3570 		return -ENODEV;
3571 	}
3572 
3573 	foundit = 0;
3574 	brdp->memsize = ECP_MEMSIZE;
3575 
3576 /*
3577  *	Board shared memory is enabled, so now we have a poke around and
3578  *	see if we can find it.
3579  */
3580 	for (i = 0; (i < stli_eisamempsize); i++) {
3581 		brdp->memaddr = stli_eisamemprobeaddrs[i];
3582 		brdp->membase = ioremap_nocache(brdp->memaddr, brdp->memsize);
3583 		if (brdp->membase == NULL)
3584 			continue;
3585 
3586 		if (brdp->brdtype == BRD_ECPE) {
3587 			ecpsigp = stli_ecpeigetmemptr(brdp,
3588 				CDK_SIGADDR, __LINE__);
3589 			memcpy_fromio(&ecpsig, ecpsigp, sizeof(cdkecpsig_t));
3590 			if (ecpsig.magic == cpu_to_le32(ECP_MAGIC))
3591 				foundit = 1;
3592 		} else {
3593 			onbsigp = (cdkonbsig_t __iomem *) stli_onbegetmemptr(brdp,
3594 				CDK_SIGADDR, __LINE__);
3595 			memcpy_fromio(&onbsig, onbsigp, sizeof(cdkonbsig_t));
3596 			if ((onbsig.magic0 == cpu_to_le16(ONB_MAGIC0)) &&
3597 			    (onbsig.magic1 == cpu_to_le16(ONB_MAGIC1)) &&
3598 			    (onbsig.magic2 == cpu_to_le16(ONB_MAGIC2)) &&
3599 			    (onbsig.magic3 == cpu_to_le16(ONB_MAGIC3)))
3600 				foundit = 1;
3601 		}
3602 
3603 		iounmap(brdp->membase);
3604 		if (foundit)
3605 			break;
3606 	}
3607 
3608 /*
3609  *	Regardless of whether we found the shared memory or not we must
3610  *	disable the region. After that return success or failure.
3611  */
3612 	if (brdp->brdtype == BRD_ECPE)
3613 		stli_ecpeidisable(brdp);
3614 	else
3615 		stli_onbedisable(brdp);
3616 
3617 	if (! foundit) {
3618 		brdp->memaddr = 0;
3619 		brdp->membase = NULL;
3620 		printk(KERN_ERR "istallion: failed to probe shared memory "
3621 				"region for %s in EISA slot=%d\n",
3622 			stli_brdnames[brdp->brdtype], (brdp->iobase >> 12));
3623 		return -ENODEV;
3624 	}
3625 	return 0;
3626 }
3627 #endif
3628 
stli_getbrdnr(void)3629 static int stli_getbrdnr(void)
3630 {
3631 	unsigned int i;
3632 
3633 	for (i = 0; i < STL_MAXBRDS; i++) {
3634 		if (!stli_brds[i]) {
3635 			if (i >= stli_nrbrds)
3636 				stli_nrbrds = i + 1;
3637 			return i;
3638 		}
3639 	}
3640 	return -1;
3641 }
3642 
3643 #if STLI_EISAPROBE != 0
3644 /*****************************************************************************/
3645 
3646 /*
3647  *	Probe around and try to find any EISA boards in system. The biggest
3648  *	problem here is finding out what memory address is associated with
3649  *	an EISA board after it is found. The registers of the ECPE and
3650  *	ONboardE are not readable - so we can't read them from there. We
3651  *	don't have access to the EISA CMOS (or EISA BIOS) so we don't
3652  *	actually have any way to find out the real value. The best we can
3653  *	do is go probing around in the usual places hoping we can find it.
3654  */
3655 
stli_findeisabrds(void)3656 static int __init stli_findeisabrds(void)
3657 {
3658 	struct stlibrd *brdp;
3659 	unsigned int iobase, eid, i;
3660 	int brdnr, found = 0;
3661 
3662 /*
3663  *	Firstly check if this is an EISA system.  If this is not an EISA system then
3664  *	don't bother going any further!
3665  */
3666 	if (EISA_bus)
3667 		return 0;
3668 
3669 /*
3670  *	Looks like an EISA system, so go searching for EISA boards.
3671  */
3672 	for (iobase = 0x1000; (iobase <= 0xc000); iobase += 0x1000) {
3673 		outb(0xff, (iobase + 0xc80));
3674 		eid = inb(iobase + 0xc80);
3675 		eid |= inb(iobase + 0xc81) << 8;
3676 		if (eid != STL_EISAID)
3677 			continue;
3678 
3679 /*
3680  *		We have found a board. Need to check if this board was
3681  *		statically configured already (just in case!).
3682  */
3683 		for (i = 0; (i < STL_MAXBRDS); i++) {
3684 			brdp = stli_brds[i];
3685 			if (brdp == NULL)
3686 				continue;
3687 			if (brdp->iobase == iobase)
3688 				break;
3689 		}
3690 		if (i < STL_MAXBRDS)
3691 			continue;
3692 
3693 /*
3694  *		We have found a Stallion board and it is not configured already.
3695  *		Allocate a board structure and initialize it.
3696  */
3697 		if ((brdp = stli_allocbrd()) == NULL)
3698 			return found ? : -ENOMEM;
3699 		brdnr = stli_getbrdnr();
3700 		if (brdnr < 0)
3701 			return found ? : -ENOMEM;
3702 		brdp->brdnr = (unsigned int)brdnr;
3703 		eid = inb(iobase + 0xc82);
3704 		if (eid == ECP_EISAID)
3705 			brdp->brdtype = BRD_ECPE;
3706 		else if (eid == ONB_EISAID)
3707 			brdp->brdtype = BRD_ONBOARDE;
3708 		else
3709 			brdp->brdtype = BRD_UNKNOWN;
3710 		brdp->iobase = iobase;
3711 		outb(0x1, (iobase + 0xc84));
3712 		if (stli_eisamemprobe(brdp))
3713 			outb(0, (iobase + 0xc84));
3714 		if (stli_brdinit(brdp) < 0) {
3715 			kfree(brdp);
3716 			continue;
3717 		}
3718 
3719 		stli_brds[brdp->brdnr] = brdp;
3720 		found++;
3721 
3722 		for (i = 0; i < brdp->nrports; i++)
3723 			tty_register_device(stli_serial,
3724 					brdp->brdnr * STL_MAXPORTS + i, NULL);
3725 	}
3726 
3727 	return found;
3728 }
3729 #else
stli_findeisabrds(void)3730 static inline int stli_findeisabrds(void) { return 0; }
3731 #endif
3732 
3733 /*****************************************************************************/
3734 
3735 /*
3736  *	Find the next available board number that is free.
3737  */
3738 
3739 /*****************************************************************************/
3740 
3741 /*
3742  *	We have a Stallion board. Allocate a board structure and
3743  *	initialize it. Read its IO and MEMORY resources from PCI
3744  *	configuration space.
3745  */
3746 
stli_pciprobe(struct pci_dev * pdev,const struct pci_device_id * ent)3747 static int __devinit stli_pciprobe(struct pci_dev *pdev,
3748 		const struct pci_device_id *ent)
3749 {
3750 	struct stlibrd *brdp;
3751 	unsigned int i;
3752 	int brdnr, retval = -EIO;
3753 
3754 	retval = pci_enable_device(pdev);
3755 	if (retval)
3756 		goto err;
3757 	brdp = stli_allocbrd();
3758 	if (brdp == NULL) {
3759 		retval = -ENOMEM;
3760 		goto err;
3761 	}
3762 	mutex_lock(&stli_brdslock);
3763 	brdnr = stli_getbrdnr();
3764 	if (brdnr < 0) {
3765 		printk(KERN_INFO "istallion: too many boards found, "
3766 			"maximum supported %d\n", STL_MAXBRDS);
3767 		mutex_unlock(&stli_brdslock);
3768 		retval = -EIO;
3769 		goto err_fr;
3770 	}
3771 	brdp->brdnr = (unsigned int)brdnr;
3772 	stli_brds[brdp->brdnr] = brdp;
3773 	mutex_unlock(&stli_brdslock);
3774 	brdp->brdtype = BRD_ECPPCI;
3775 /*
3776  *	We have all resources from the board, so lets setup the actual
3777  *	board structure now.
3778  */
3779 	brdp->iobase = pci_resource_start(pdev, 3);
3780 	brdp->memaddr = pci_resource_start(pdev, 2);
3781 	retval = stli_brdinit(brdp);
3782 	if (retval)
3783 		goto err_null;
3784 
3785 	brdp->state |= BST_PROBED;
3786 	pci_set_drvdata(pdev, brdp);
3787 
3788 	EBRDENABLE(brdp);
3789 	brdp->enable = NULL;
3790 	brdp->disable = NULL;
3791 
3792 	for (i = 0; i < brdp->nrports; i++)
3793 		tty_register_device(stli_serial, brdp->brdnr * STL_MAXPORTS + i,
3794 				&pdev->dev);
3795 
3796 	return 0;
3797 err_null:
3798 	stli_brds[brdp->brdnr] = NULL;
3799 err_fr:
3800 	kfree(brdp);
3801 err:
3802 	return retval;
3803 }
3804 
stli_pciremove(struct pci_dev * pdev)3805 static void stli_pciremove(struct pci_dev *pdev)
3806 {
3807 	struct stlibrd *brdp = pci_get_drvdata(pdev);
3808 
3809 	stli_cleanup_ports(brdp);
3810 
3811 	iounmap(brdp->membase);
3812 	if (brdp->iosize > 0)
3813 		release_region(brdp->iobase, brdp->iosize);
3814 
3815 	stli_brds[brdp->brdnr] = NULL;
3816 	kfree(brdp);
3817 }
3818 
3819 static struct pci_driver stli_pcidriver = {
3820 	.name = "istallion",
3821 	.id_table = istallion_pci_tbl,
3822 	.probe = stli_pciprobe,
3823 	.remove = __devexit_p(stli_pciremove)
3824 };
3825 /*****************************************************************************/
3826 
3827 /*
3828  *	Allocate a new board structure. Fill out the basic info in it.
3829  */
3830 
stli_allocbrd(void)3831 static struct stlibrd *stli_allocbrd(void)
3832 {
3833 	struct stlibrd *brdp;
3834 
3835 	brdp = kzalloc(sizeof(struct stlibrd), GFP_KERNEL);
3836 	if (!brdp) {
3837 		printk(KERN_ERR "istallion: failed to allocate memory "
3838 				"(size=%Zd)\n", sizeof(struct stlibrd));
3839 		return NULL;
3840 	}
3841 	brdp->magic = STLI_BOARDMAGIC;
3842 	return brdp;
3843 }
3844 
3845 /*****************************************************************************/
3846 
3847 /*
3848  *	Scan through all the boards in the configuration and see what we
3849  *	can find.
3850  */
3851 
stli_initbrds(void)3852 static int __init stli_initbrds(void)
3853 {
3854 	struct stlibrd *brdp, *nxtbrdp;
3855 	struct stlconf conf;
3856 	unsigned int i, j, found = 0;
3857 	int retval;
3858 
3859 	for (stli_nrbrds = 0; stli_nrbrds < ARRAY_SIZE(stli_brdsp);
3860 			stli_nrbrds++) {
3861 		memset(&conf, 0, sizeof(conf));
3862 		if (stli_parsebrd(&conf, stli_brdsp[stli_nrbrds]) == 0)
3863 			continue;
3864 		if ((brdp = stli_allocbrd()) == NULL)
3865 			continue;
3866 		brdp->brdnr = stli_nrbrds;
3867 		brdp->brdtype = conf.brdtype;
3868 		brdp->iobase = conf.ioaddr1;
3869 		brdp->memaddr = conf.memaddr;
3870 		if (stli_brdinit(brdp) < 0) {
3871 			kfree(brdp);
3872 			continue;
3873 		}
3874 		stli_brds[brdp->brdnr] = brdp;
3875 		found++;
3876 
3877 		for (i = 0; i < brdp->nrports; i++)
3878 			tty_register_device(stli_serial,
3879 					brdp->brdnr * STL_MAXPORTS + i, NULL);
3880 	}
3881 
3882 	retval = stli_findeisabrds();
3883 	if (retval > 0)
3884 		found += retval;
3885 
3886 /*
3887  *	All found boards are initialized. Now for a little optimization, if
3888  *	no boards are sharing the "shared memory" regions then we can just
3889  *	leave them all enabled. This is in fact the usual case.
3890  */
3891 	stli_shared = 0;
3892 	if (stli_nrbrds > 1) {
3893 		for (i = 0; (i < stli_nrbrds); i++) {
3894 			brdp = stli_brds[i];
3895 			if (brdp == NULL)
3896 				continue;
3897 			for (j = i + 1; (j < stli_nrbrds); j++) {
3898 				nxtbrdp = stli_brds[j];
3899 				if (nxtbrdp == NULL)
3900 					continue;
3901 				if ((brdp->membase >= nxtbrdp->membase) &&
3902 				    (brdp->membase <= (nxtbrdp->membase +
3903 				    nxtbrdp->memsize - 1))) {
3904 					stli_shared++;
3905 					break;
3906 				}
3907 			}
3908 		}
3909 	}
3910 
3911 	if (stli_shared == 0) {
3912 		for (i = 0; (i < stli_nrbrds); i++) {
3913 			brdp = stli_brds[i];
3914 			if (brdp == NULL)
3915 				continue;
3916 			if (brdp->state & BST_FOUND) {
3917 				EBRDENABLE(brdp);
3918 				brdp->enable = NULL;
3919 				brdp->disable = NULL;
3920 			}
3921 		}
3922 	}
3923 
3924 	retval = pci_register_driver(&stli_pcidriver);
3925 	if (retval && found == 0) {
3926 		printk(KERN_ERR "Neither isa nor eisa cards found nor pci "
3927 				"driver can be registered!\n");
3928 		goto err;
3929 	}
3930 
3931 	return 0;
3932 err:
3933 	return retval;
3934 }
3935 
3936 /*****************************************************************************/
3937 
3938 /*
3939  *	Code to handle an "staliomem" read operation. This device is the
3940  *	contents of the board shared memory. It is used for down loading
3941  *	the slave image (and debugging :-)
3942  */
3943 
stli_memread(struct file * fp,char __user * buf,size_t count,loff_t * offp)3944 static ssize_t stli_memread(struct file *fp, char __user *buf, size_t count, loff_t *offp)
3945 {
3946 	unsigned long flags;
3947 	void __iomem *memptr;
3948 	struct stlibrd *brdp;
3949 	unsigned int brdnr;
3950 	int size, n;
3951 	void *p;
3952 	loff_t off = *offp;
3953 
3954 	brdnr = iminor(fp->f_path.dentry->d_inode);
3955 	if (brdnr >= stli_nrbrds)
3956 		return -ENODEV;
3957 	brdp = stli_brds[brdnr];
3958 	if (brdp == NULL)
3959 		return -ENODEV;
3960 	if (brdp->state == 0)
3961 		return -ENODEV;
3962 	if (off >= brdp->memsize || off + count < off)
3963 		return 0;
3964 
3965 	size = min(count, (size_t)(brdp->memsize - off));
3966 
3967 	/*
3968 	 *	Copy the data a page at a time
3969 	 */
3970 
3971 	p = (void *)__get_free_page(GFP_KERNEL);
3972 	if(p == NULL)
3973 		return -ENOMEM;
3974 
3975 	while (size > 0) {
3976 		spin_lock_irqsave(&brd_lock, flags);
3977 		EBRDENABLE(brdp);
3978 		memptr = EBRDGETMEMPTR(brdp, off);
3979 		n = min(size, (int)(brdp->pagesize - (((unsigned long) off) % brdp->pagesize)));
3980 		n = min(n, (int)PAGE_SIZE);
3981 		memcpy_fromio(p, memptr, n);
3982 		EBRDDISABLE(brdp);
3983 		spin_unlock_irqrestore(&brd_lock, flags);
3984 		if (copy_to_user(buf, p, n)) {
3985 			count = -EFAULT;
3986 			goto out;
3987 		}
3988 		off += n;
3989 		buf += n;
3990 		size -= n;
3991 	}
3992 out:
3993 	*offp = off;
3994 	free_page((unsigned long)p);
3995 	return count;
3996 }
3997 
3998 /*****************************************************************************/
3999 
4000 /*
4001  *	Code to handle an "staliomem" write operation. This device is the
4002  *	contents of the board shared memory. It is used for down loading
4003  *	the slave image (and debugging :-)
4004  *
4005  *	FIXME: copy under lock
4006  */
4007 
stli_memwrite(struct file * fp,const char __user * buf,size_t count,loff_t * offp)4008 static ssize_t stli_memwrite(struct file *fp, const char __user *buf, size_t count, loff_t *offp)
4009 {
4010 	unsigned long flags;
4011 	void __iomem *memptr;
4012 	struct stlibrd *brdp;
4013 	char __user *chbuf;
4014 	unsigned int brdnr;
4015 	int size, n;
4016 	void *p;
4017 	loff_t off = *offp;
4018 
4019 	brdnr = iminor(fp->f_path.dentry->d_inode);
4020 
4021 	if (brdnr >= stli_nrbrds)
4022 		return -ENODEV;
4023 	brdp = stli_brds[brdnr];
4024 	if (brdp == NULL)
4025 		return -ENODEV;
4026 	if (brdp->state == 0)
4027 		return -ENODEV;
4028 	if (off >= brdp->memsize || off + count < off)
4029 		return 0;
4030 
4031 	chbuf = (char __user *) buf;
4032 	size = min(count, (size_t)(brdp->memsize - off));
4033 
4034 	/*
4035 	 *	Copy the data a page at a time
4036 	 */
4037 
4038 	p = (void *)__get_free_page(GFP_KERNEL);
4039 	if(p == NULL)
4040 		return -ENOMEM;
4041 
4042 	while (size > 0) {
4043 		n = min(size, (int)(brdp->pagesize - (((unsigned long) off) % brdp->pagesize)));
4044 		n = min(n, (int)PAGE_SIZE);
4045 		if (copy_from_user(p, chbuf, n)) {
4046 			if (count == 0)
4047 				count = -EFAULT;
4048 			goto out;
4049 		}
4050 		spin_lock_irqsave(&brd_lock, flags);
4051 		EBRDENABLE(brdp);
4052 		memptr = EBRDGETMEMPTR(brdp, off);
4053 		memcpy_toio(memptr, p, n);
4054 		EBRDDISABLE(brdp);
4055 		spin_unlock_irqrestore(&brd_lock, flags);
4056 		off += n;
4057 		chbuf += n;
4058 		size -= n;
4059 	}
4060 out:
4061 	free_page((unsigned long) p);
4062 	*offp = off;
4063 	return count;
4064 }
4065 
4066 /*****************************************************************************/
4067 
4068 /*
4069  *	Return the board stats structure to user app.
4070  */
4071 
stli_getbrdstats(combrd_t __user * bp)4072 static int stli_getbrdstats(combrd_t __user *bp)
4073 {
4074 	struct stlibrd *brdp;
4075 	unsigned int i;
4076 
4077 	if (copy_from_user(&stli_brdstats, bp, sizeof(combrd_t)))
4078 		return -EFAULT;
4079 	if (stli_brdstats.brd >= STL_MAXBRDS)
4080 		return -ENODEV;
4081 	brdp = stli_brds[stli_brdstats.brd];
4082 	if (brdp == NULL)
4083 		return -ENODEV;
4084 
4085 	memset(&stli_brdstats, 0, sizeof(combrd_t));
4086 	stli_brdstats.brd = brdp->brdnr;
4087 	stli_brdstats.type = brdp->brdtype;
4088 	stli_brdstats.hwid = 0;
4089 	stli_brdstats.state = brdp->state;
4090 	stli_brdstats.ioaddr = brdp->iobase;
4091 	stli_brdstats.memaddr = brdp->memaddr;
4092 	stli_brdstats.nrpanels = brdp->nrpanels;
4093 	stli_brdstats.nrports = brdp->nrports;
4094 	for (i = 0; (i < brdp->nrpanels); i++) {
4095 		stli_brdstats.panels[i].panel = i;
4096 		stli_brdstats.panels[i].hwid = brdp->panelids[i];
4097 		stli_brdstats.panels[i].nrports = brdp->panels[i];
4098 	}
4099 
4100 	if (copy_to_user(bp, &stli_brdstats, sizeof(combrd_t)))
4101 		return -EFAULT;
4102 	return 0;
4103 }
4104 
4105 /*****************************************************************************/
4106 
4107 /*
4108  *	Resolve the referenced port number into a port struct pointer.
4109  */
4110 
stli_getport(unsigned int brdnr,unsigned int panelnr,unsigned int portnr)4111 static struct stliport *stli_getport(unsigned int brdnr, unsigned int panelnr,
4112 		unsigned int portnr)
4113 {
4114 	struct stlibrd *brdp;
4115 	unsigned int i;
4116 
4117 	if (brdnr >= STL_MAXBRDS)
4118 		return NULL;
4119 	brdp = stli_brds[brdnr];
4120 	if (brdp == NULL)
4121 		return NULL;
4122 	for (i = 0; (i < panelnr); i++)
4123 		portnr += brdp->panels[i];
4124 	if (portnr >= brdp->nrports)
4125 		return NULL;
4126 	return brdp->ports[portnr];
4127 }
4128 
4129 /*****************************************************************************/
4130 
4131 /*
4132  *	Return the port stats structure to user app. A NULL port struct
4133  *	pointer passed in means that we need to find out from the app
4134  *	what port to get stats for (used through board control device).
4135  */
4136 
stli_portcmdstats(struct tty_struct * tty,struct stliport * portp)4137 static int stli_portcmdstats(struct tty_struct *tty, struct stliport *portp)
4138 {
4139 	unsigned long	flags;
4140 	struct stlibrd	*brdp;
4141 	int		rc;
4142 
4143 	memset(&stli_comstats, 0, sizeof(comstats_t));
4144 
4145 	if (portp == NULL)
4146 		return -ENODEV;
4147 	brdp = stli_brds[portp->brdnr];
4148 	if (brdp == NULL)
4149 		return -ENODEV;
4150 
4151 	if (brdp->state & BST_STARTED) {
4152 		if ((rc = stli_cmdwait(brdp, portp, A_GETSTATS,
4153 		    &stli_cdkstats, sizeof(asystats_t), 1)) < 0)
4154 			return rc;
4155 	} else {
4156 		memset(&stli_cdkstats, 0, sizeof(asystats_t));
4157 	}
4158 
4159 	stli_comstats.brd = portp->brdnr;
4160 	stli_comstats.panel = portp->panelnr;
4161 	stli_comstats.port = portp->portnr;
4162 	stli_comstats.state = portp->state;
4163 	stli_comstats.flags = portp->port.flags;
4164 
4165 	spin_lock_irqsave(&brd_lock, flags);
4166 	if (tty != NULL) {
4167 		if (portp->port.tty == tty) {
4168 			stli_comstats.ttystate = tty->flags;
4169 			stli_comstats.rxbuffered = -1;
4170 			if (tty->termios != NULL) {
4171 				stli_comstats.cflags = tty->termios->c_cflag;
4172 				stli_comstats.iflags = tty->termios->c_iflag;
4173 				stli_comstats.oflags = tty->termios->c_oflag;
4174 				stli_comstats.lflags = tty->termios->c_lflag;
4175 			}
4176 		}
4177 	}
4178 	spin_unlock_irqrestore(&brd_lock, flags);
4179 
4180 	stli_comstats.txtotal = stli_cdkstats.txchars;
4181 	stli_comstats.rxtotal = stli_cdkstats.rxchars + stli_cdkstats.ringover;
4182 	stli_comstats.txbuffered = stli_cdkstats.txringq;
4183 	stli_comstats.rxbuffered += stli_cdkstats.rxringq;
4184 	stli_comstats.rxoverrun = stli_cdkstats.overruns;
4185 	stli_comstats.rxparity = stli_cdkstats.parity;
4186 	stli_comstats.rxframing = stli_cdkstats.framing;
4187 	stli_comstats.rxlost = stli_cdkstats.ringover;
4188 	stli_comstats.rxbreaks = stli_cdkstats.rxbreaks;
4189 	stli_comstats.txbreaks = stli_cdkstats.txbreaks;
4190 	stli_comstats.txxon = stli_cdkstats.txstart;
4191 	stli_comstats.txxoff = stli_cdkstats.txstop;
4192 	stli_comstats.rxxon = stli_cdkstats.rxstart;
4193 	stli_comstats.rxxoff = stli_cdkstats.rxstop;
4194 	stli_comstats.rxrtsoff = stli_cdkstats.rtscnt / 2;
4195 	stli_comstats.rxrtson = stli_cdkstats.rtscnt - stli_comstats.rxrtsoff;
4196 	stli_comstats.modem = stli_cdkstats.dcdcnt;
4197 	stli_comstats.hwid = stli_cdkstats.hwid;
4198 	stli_comstats.signals = stli_mktiocm(stli_cdkstats.signals);
4199 
4200 	return 0;
4201 }
4202 
4203 /*****************************************************************************/
4204 
4205 /*
4206  *	Return the port stats structure to user app. A NULL port struct
4207  *	pointer passed in means that we need to find out from the app
4208  *	what port to get stats for (used through board control device).
4209  */
4210 
stli_getportstats(struct tty_struct * tty,struct stliport * portp,comstats_t __user * cp)4211 static int stli_getportstats(struct tty_struct *tty, struct stliport *portp,
4212 							comstats_t __user *cp)
4213 {
4214 	struct stlibrd *brdp;
4215 	int rc;
4216 
4217 	if (!portp) {
4218 		if (copy_from_user(&stli_comstats, cp, sizeof(comstats_t)))
4219 			return -EFAULT;
4220 		portp = stli_getport(stli_comstats.brd, stli_comstats.panel,
4221 			stli_comstats.port);
4222 		if (!portp)
4223 			return -ENODEV;
4224 	}
4225 
4226 	brdp = stli_brds[portp->brdnr];
4227 	if (!brdp)
4228 		return -ENODEV;
4229 
4230 	if ((rc = stli_portcmdstats(tty, portp)) < 0)
4231 		return rc;
4232 
4233 	return copy_to_user(cp, &stli_comstats, sizeof(comstats_t)) ?
4234 			-EFAULT : 0;
4235 }
4236 
4237 /*****************************************************************************/
4238 
4239 /*
4240  *	Clear the port stats structure. We also return it zeroed out...
4241  */
4242 
stli_clrportstats(struct stliport * portp,comstats_t __user * cp)4243 static int stli_clrportstats(struct stliport *portp, comstats_t __user *cp)
4244 {
4245 	struct stlibrd *brdp;
4246 	int rc;
4247 
4248 	if (!portp) {
4249 		if (copy_from_user(&stli_comstats, cp, sizeof(comstats_t)))
4250 			return -EFAULT;
4251 		portp = stli_getport(stli_comstats.brd, stli_comstats.panel,
4252 			stli_comstats.port);
4253 		if (!portp)
4254 			return -ENODEV;
4255 	}
4256 
4257 	brdp = stli_brds[portp->brdnr];
4258 	if (!brdp)
4259 		return -ENODEV;
4260 
4261 	if (brdp->state & BST_STARTED) {
4262 		if ((rc = stli_cmdwait(brdp, portp, A_CLEARSTATS, NULL, 0, 0)) < 0)
4263 			return rc;
4264 	}
4265 
4266 	memset(&stli_comstats, 0, sizeof(comstats_t));
4267 	stli_comstats.brd = portp->brdnr;
4268 	stli_comstats.panel = portp->panelnr;
4269 	stli_comstats.port = portp->portnr;
4270 
4271 	if (copy_to_user(cp, &stli_comstats, sizeof(comstats_t)))
4272 		return -EFAULT;
4273 	return 0;
4274 }
4275 
4276 /*****************************************************************************/
4277 
4278 /*
4279  *	Return the entire driver ports structure to a user app.
4280  */
4281 
stli_getportstruct(struct stliport __user * arg)4282 static int stli_getportstruct(struct stliport __user *arg)
4283 {
4284 	struct stliport stli_dummyport;
4285 	struct stliport *portp;
4286 
4287 	if (copy_from_user(&stli_dummyport, arg, sizeof(struct stliport)))
4288 		return -EFAULT;
4289 	portp = stli_getport(stli_dummyport.brdnr, stli_dummyport.panelnr,
4290 		 stli_dummyport.portnr);
4291 	if (!portp)
4292 		return -ENODEV;
4293 	if (copy_to_user(arg, portp, sizeof(struct stliport)))
4294 		return -EFAULT;
4295 	return 0;
4296 }
4297 
4298 /*****************************************************************************/
4299 
4300 /*
4301  *	Return the entire driver board structure to a user app.
4302  */
4303 
stli_getbrdstruct(struct stlibrd __user * arg)4304 static int stli_getbrdstruct(struct stlibrd __user *arg)
4305 {
4306 	struct stlibrd stli_dummybrd;
4307 	struct stlibrd *brdp;
4308 
4309 	if (copy_from_user(&stli_dummybrd, arg, sizeof(struct stlibrd)))
4310 		return -EFAULT;
4311 	if (stli_dummybrd.brdnr >= STL_MAXBRDS)
4312 		return -ENODEV;
4313 	brdp = stli_brds[stli_dummybrd.brdnr];
4314 	if (!brdp)
4315 		return -ENODEV;
4316 	if (copy_to_user(arg, brdp, sizeof(struct stlibrd)))
4317 		return -EFAULT;
4318 	return 0;
4319 }
4320 
4321 /*****************************************************************************/
4322 
4323 /*
4324  *	The "staliomem" device is also required to do some special operations on
4325  *	the board. We need to be able to send an interrupt to the board,
4326  *	reset it, and start/stop it.
4327  */
4328 
stli_memioctl(struct inode * ip,struct file * fp,unsigned int cmd,unsigned long arg)4329 static int stli_memioctl(struct inode *ip, struct file *fp, unsigned int cmd, unsigned long arg)
4330 {
4331 	struct stlibrd *brdp;
4332 	int brdnr, rc, done;
4333 	void __user *argp = (void __user *)arg;
4334 
4335 /*
4336  *	First up handle the board independent ioctls.
4337  */
4338 	done = 0;
4339 	rc = 0;
4340 
4341 	lock_kernel();
4342 
4343 	switch (cmd) {
4344 	case COM_GETPORTSTATS:
4345 		rc = stli_getportstats(NULL, NULL, argp);
4346 		done++;
4347 		break;
4348 	case COM_CLRPORTSTATS:
4349 		rc = stli_clrportstats(NULL, argp);
4350 		done++;
4351 		break;
4352 	case COM_GETBRDSTATS:
4353 		rc = stli_getbrdstats(argp);
4354 		done++;
4355 		break;
4356 	case COM_READPORT:
4357 		rc = stli_getportstruct(argp);
4358 		done++;
4359 		break;
4360 	case COM_READBOARD:
4361 		rc = stli_getbrdstruct(argp);
4362 		done++;
4363 		break;
4364 	}
4365 	unlock_kernel();
4366 
4367 	if (done)
4368 		return rc;
4369 
4370 /*
4371  *	Now handle the board specific ioctls. These all depend on the
4372  *	minor number of the device they were called from.
4373  */
4374 	brdnr = iminor(ip);
4375 	if (brdnr >= STL_MAXBRDS)
4376 		return -ENODEV;
4377 	brdp = stli_brds[brdnr];
4378 	if (!brdp)
4379 		return -ENODEV;
4380 	if (brdp->state == 0)
4381 		return -ENODEV;
4382 
4383 	lock_kernel();
4384 
4385 	switch (cmd) {
4386 	case STL_BINTR:
4387 		EBRDINTR(brdp);
4388 		break;
4389 	case STL_BSTART:
4390 		rc = stli_startbrd(brdp);
4391 		break;
4392 	case STL_BSTOP:
4393 		brdp->state &= ~BST_STARTED;
4394 		break;
4395 	case STL_BRESET:
4396 		brdp->state &= ~BST_STARTED;
4397 		EBRDRESET(brdp);
4398 		if (stli_shared == 0) {
4399 			if (brdp->reenable != NULL)
4400 				(* brdp->reenable)(brdp);
4401 		}
4402 		break;
4403 	default:
4404 		rc = -ENOIOCTLCMD;
4405 		break;
4406 	}
4407 	unlock_kernel();
4408 	return rc;
4409 }
4410 
4411 static const struct tty_operations stli_ops = {
4412 	.open = stli_open,
4413 	.close = stli_close,
4414 	.write = stli_write,
4415 	.put_char = stli_putchar,
4416 	.flush_chars = stli_flushchars,
4417 	.write_room = stli_writeroom,
4418 	.chars_in_buffer = stli_charsinbuffer,
4419 	.ioctl = stli_ioctl,
4420 	.set_termios = stli_settermios,
4421 	.throttle = stli_throttle,
4422 	.unthrottle = stli_unthrottle,
4423 	.stop = stli_stop,
4424 	.start = stli_start,
4425 	.hangup = stli_hangup,
4426 	.flush_buffer = stli_flushbuffer,
4427 	.break_ctl = stli_breakctl,
4428 	.wait_until_sent = stli_waituntilsent,
4429 	.send_xchar = stli_sendxchar,
4430 	.read_proc = stli_readproc,
4431 	.tiocmget = stli_tiocmget,
4432 	.tiocmset = stli_tiocmset,
4433 };
4434 
4435 static const struct tty_port_operations stli_port_ops = {
4436 	.carrier_raised = stli_carrier_raised,
4437 	.raise_dtr_rts = stli_raise_dtr_rts,
4438 };
4439 
4440 /*****************************************************************************/
4441 /*
4442  *	Loadable module initialization stuff.
4443  */
4444 
istallion_cleanup_isa(void)4445 static void istallion_cleanup_isa(void)
4446 {
4447 	struct stlibrd	*brdp;
4448 	unsigned int j;
4449 
4450 	for (j = 0; (j < stli_nrbrds); j++) {
4451 		if ((brdp = stli_brds[j]) == NULL || (brdp->state & BST_PROBED))
4452 			continue;
4453 
4454 		stli_cleanup_ports(brdp);
4455 
4456 		iounmap(brdp->membase);
4457 		if (brdp->iosize > 0)
4458 			release_region(brdp->iobase, brdp->iosize);
4459 		kfree(brdp);
4460 		stli_brds[j] = NULL;
4461 	}
4462 }
4463 
istallion_module_init(void)4464 static int __init istallion_module_init(void)
4465 {
4466 	unsigned int i;
4467 	int retval;
4468 
4469 	printk(KERN_INFO "%s: version %s\n", stli_drvtitle, stli_drvversion);
4470 
4471 	spin_lock_init(&stli_lock);
4472 	spin_lock_init(&brd_lock);
4473 
4474 	stli_txcookbuf = kmalloc(STLI_TXBUFSIZE, GFP_KERNEL);
4475 	if (!stli_txcookbuf) {
4476 		printk(KERN_ERR "istallion: failed to allocate memory "
4477 				"(size=%d)\n", STLI_TXBUFSIZE);
4478 		retval = -ENOMEM;
4479 		goto err;
4480 	}
4481 
4482 	stli_serial = alloc_tty_driver(STL_MAXBRDS * STL_MAXPORTS);
4483 	if (!stli_serial) {
4484 		retval = -ENOMEM;
4485 		goto err_free;
4486 	}
4487 
4488 	stli_serial->owner = THIS_MODULE;
4489 	stli_serial->driver_name = stli_drvname;
4490 	stli_serial->name = stli_serialname;
4491 	stli_serial->major = STL_SERIALMAJOR;
4492 	stli_serial->minor_start = 0;
4493 	stli_serial->type = TTY_DRIVER_TYPE_SERIAL;
4494 	stli_serial->subtype = SERIAL_TYPE_NORMAL;
4495 	stli_serial->init_termios = stli_deftermios;
4496 	stli_serial->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_DYNAMIC_DEV;
4497 	tty_set_operations(stli_serial, &stli_ops);
4498 
4499 	retval = tty_register_driver(stli_serial);
4500 	if (retval) {
4501 		printk(KERN_ERR "istallion: failed to register serial driver\n");
4502 		goto err_ttyput;
4503 	}
4504 
4505 	retval = stli_initbrds();
4506 	if (retval)
4507 		goto err_ttyunr;
4508 
4509 /*
4510  *	Set up a character driver for the shared memory region. We need this
4511  *	to down load the slave code image. Also it is a useful debugging tool.
4512  */
4513 	retval = register_chrdev(STL_SIOMEMMAJOR, "staliomem", &stli_fsiomem);
4514 	if (retval) {
4515 		printk(KERN_ERR "istallion: failed to register serial memory "
4516 				"device\n");
4517 		goto err_deinit;
4518 	}
4519 
4520 	istallion_class = class_create(THIS_MODULE, "staliomem");
4521 	for (i = 0; i < 4; i++)
4522 		device_create(istallion_class, NULL, MKDEV(STL_SIOMEMMAJOR, i),
4523 			      NULL, "staliomem%d", i);
4524 
4525 	return 0;
4526 err_deinit:
4527 	pci_unregister_driver(&stli_pcidriver);
4528 	istallion_cleanup_isa();
4529 err_ttyunr:
4530 	tty_unregister_driver(stli_serial);
4531 err_ttyput:
4532 	put_tty_driver(stli_serial);
4533 err_free:
4534 	kfree(stli_txcookbuf);
4535 err:
4536 	return retval;
4537 }
4538 
4539 /*****************************************************************************/
4540 
istallion_module_exit(void)4541 static void __exit istallion_module_exit(void)
4542 {
4543 	unsigned int j;
4544 
4545 	printk(KERN_INFO "Unloading %s: version %s\n", stli_drvtitle,
4546 		stli_drvversion);
4547 
4548 	if (stli_timeron) {
4549 		stli_timeron = 0;
4550 		del_timer_sync(&stli_timerlist);
4551 	}
4552 
4553 	unregister_chrdev(STL_SIOMEMMAJOR, "staliomem");
4554 
4555 	for (j = 0; j < 4; j++)
4556 		device_destroy(istallion_class, MKDEV(STL_SIOMEMMAJOR, j));
4557 	class_destroy(istallion_class);
4558 
4559 	pci_unregister_driver(&stli_pcidriver);
4560 	istallion_cleanup_isa();
4561 
4562 	tty_unregister_driver(stli_serial);
4563 	put_tty_driver(stli_serial);
4564 
4565 	kfree(stli_txcookbuf);
4566 }
4567 
4568 module_init(istallion_module_init);
4569 module_exit(istallion_module_exit);
4570