1/*
2 * RocketPort device driver for Linux
3 *
4 * Written by Theodore Ts'o, 1995, 1996, 1997, 1998, 1999, 2000.
5 *
6 * Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2003 by Comtrol, Inc.
7 *
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License as
10 * published by the Free Software Foundation; either version 2 of the
11 * License, or (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful, but
14 * WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16 * General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 */
22
23/*
24 * Kernel Synchronization:
25 *
26 * This driver has 2 kernel control paths - exception handlers (calls into the driver
27 * from user mode) and the timer bottom half (tasklet).  This is a polled driver, interrupts
28 * are not used.
29 *
30 * Critical data:
31 * -  rp_table[], accessed through passed "info" pointers, is a global (static) array of
32 *    serial port state information and the xmit_buf circular buffer.  Protected by
33 *    a per port spinlock.
34 * -  xmit_flags[], an array of ints indexed by line (port) number, indicating that there
35 *    is data to be transmitted.  Protected by atomic bit operations.
36 * -  rp_num_ports, int indicating number of open ports, protected by atomic operations.
37 *
38 * rp_write() and rp_write_char() functions use a per port semaphore to protect against
39 * simultaneous access to the same port by more than one process.
40 */
41
42/****** Defines ******/
43#define ROCKET_PARANOIA_CHECK
44#define ROCKET_DISABLE_SIMUSAGE
45
46#undef ROCKET_SOFT_FLOW
47#undef ROCKET_DEBUG_OPEN
48#undef ROCKET_DEBUG_INTR
49#undef ROCKET_DEBUG_WRITE
50#undef ROCKET_DEBUG_FLOW
51#undef ROCKET_DEBUG_THROTTLE
52#undef ROCKET_DEBUG_WAIT_UNTIL_SENT
53#undef ROCKET_DEBUG_RECEIVE
54#undef ROCKET_DEBUG_HANGUP
55#undef REV_PCI_ORDER
56#undef ROCKET_DEBUG_IO
57
58#define POLL_PERIOD (HZ/100)	/*  Polling period .01 seconds (10ms) */
59
60/****** Kernel includes ******/
61
62#include <linux/module.h>
63#include <linux/errno.h>
64#include <linux/major.h>
65#include <linux/kernel.h>
66#include <linux/signal.h>
67#include <linux/slab.h>
68#include <linux/mm.h>
69#include <linux/sched.h>
70#include <linux/timer.h>
71#include <linux/interrupt.h>
72#include <linux/tty.h>
73#include <linux/tty_driver.h>
74#include <linux/tty_flip.h>
75#include <linux/serial.h>
76#include <linux/string.h>
77#include <linux/fcntl.h>
78#include <linux/ptrace.h>
79#include <linux/mutex.h>
80#include <linux/ioport.h>
81#include <linux/delay.h>
82#include <linux/completion.h>
83#include <linux/wait.h>
84#include <linux/pci.h>
85#include <linux/uaccess.h>
86#include <linux/atomic.h>
87#include <asm/unaligned.h>
88#include <linux/bitops.h>
89#include <linux/spinlock.h>
90#include <linux/init.h>
91
92/****** RocketPort includes ******/
93
94#include "rocket_int.h"
95#include "rocket.h"
96
97#define ROCKET_VERSION "2.09"
98#define ROCKET_DATE "12-June-2003"
99
100/****** RocketPort Local Variables ******/
101
102static void rp_do_poll(unsigned long dummy);
103
104static struct tty_driver *rocket_driver;
105
106static struct rocket_version driver_version = {
107	ROCKET_VERSION, ROCKET_DATE
108};
109
110static struct r_port *rp_table[MAX_RP_PORTS];	       /*  The main repository of serial port state information. */
111static unsigned int xmit_flags[NUM_BOARDS];	       /*  Bit significant, indicates port had data to transmit. */
112						       /*  eg.  Bit 0 indicates port 0 has xmit data, ...        */
113static atomic_t rp_num_ports_open;	               /*  Number of serial ports open                           */
114static DEFINE_TIMER(rocket_timer, rp_do_poll, 0, 0);
115
116static unsigned long board1;	                       /* ISA addresses, retrieved from rocketport.conf          */
117static unsigned long board2;
118static unsigned long board3;
119static unsigned long board4;
120static unsigned long controller;
121static bool support_low_speed;
122static unsigned long modem1;
123static unsigned long modem2;
124static unsigned long modem3;
125static unsigned long modem4;
126static unsigned long pc104_1[8];
127static unsigned long pc104_2[8];
128static unsigned long pc104_3[8];
129static unsigned long pc104_4[8];
130static unsigned long *pc104[4] = { pc104_1, pc104_2, pc104_3, pc104_4 };
131
132static int rp_baud_base[NUM_BOARDS];	               /*  Board config info (Someday make a per-board structure)  */
133static unsigned long rcktpt_io_addr[NUM_BOARDS];
134static int rcktpt_type[NUM_BOARDS];
135static int is_PCI[NUM_BOARDS];
136static rocketModel_t rocketModel[NUM_BOARDS];
137static int max_board;
138static const struct tty_port_operations rocket_port_ops;
139
140/*
141 * The following arrays define the interrupt bits corresponding to each AIOP.
142 * These bits are different between the ISA and regular PCI boards and the
143 * Universal PCI boards.
144 */
145
146static Word_t aiop_intr_bits[AIOP_CTL_SIZE] = {
147	AIOP_INTR_BIT_0,
148	AIOP_INTR_BIT_1,
149	AIOP_INTR_BIT_2,
150	AIOP_INTR_BIT_3
151};
152
153#ifdef CONFIG_PCI
154static Word_t upci_aiop_intr_bits[AIOP_CTL_SIZE] = {
155	UPCI_AIOP_INTR_BIT_0,
156	UPCI_AIOP_INTR_BIT_1,
157	UPCI_AIOP_INTR_BIT_2,
158	UPCI_AIOP_INTR_BIT_3
159};
160#endif
161
162static Byte_t RData[RDATASIZE] = {
163	0x00, 0x09, 0xf6, 0x82,
164	0x02, 0x09, 0x86, 0xfb,
165	0x04, 0x09, 0x00, 0x0a,
166	0x06, 0x09, 0x01, 0x0a,
167	0x08, 0x09, 0x8a, 0x13,
168	0x0a, 0x09, 0xc5, 0x11,
169	0x0c, 0x09, 0x86, 0x85,
170	0x0e, 0x09, 0x20, 0x0a,
171	0x10, 0x09, 0x21, 0x0a,
172	0x12, 0x09, 0x41, 0xff,
173	0x14, 0x09, 0x82, 0x00,
174	0x16, 0x09, 0x82, 0x7b,
175	0x18, 0x09, 0x8a, 0x7d,
176	0x1a, 0x09, 0x88, 0x81,
177	0x1c, 0x09, 0x86, 0x7a,
178	0x1e, 0x09, 0x84, 0x81,
179	0x20, 0x09, 0x82, 0x7c,
180	0x22, 0x09, 0x0a, 0x0a
181};
182
183static Byte_t RRegData[RREGDATASIZE] = {
184	0x00, 0x09, 0xf6, 0x82,	/* 00: Stop Rx processor */
185	0x08, 0x09, 0x8a, 0x13,	/* 04: Tx software flow control */
186	0x0a, 0x09, 0xc5, 0x11,	/* 08: XON char */
187	0x0c, 0x09, 0x86, 0x85,	/* 0c: XANY */
188	0x12, 0x09, 0x41, 0xff,	/* 10: Rx mask char */
189	0x14, 0x09, 0x82, 0x00,	/* 14: Compare/Ignore #0 */
190	0x16, 0x09, 0x82, 0x7b,	/* 18: Compare #1 */
191	0x18, 0x09, 0x8a, 0x7d,	/* 1c: Compare #2 */
192	0x1a, 0x09, 0x88, 0x81,	/* 20: Interrupt #1 */
193	0x1c, 0x09, 0x86, 0x7a,	/* 24: Ignore/Replace #1 */
194	0x1e, 0x09, 0x84, 0x81,	/* 28: Interrupt #2 */
195	0x20, 0x09, 0x82, 0x7c,	/* 2c: Ignore/Replace #2 */
196	0x22, 0x09, 0x0a, 0x0a	/* 30: Rx FIFO Enable */
197};
198
199static CONTROLLER_T sController[CTL_SIZE] = {
200	{-1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, {0, 0, 0, 0},
201	 {0, 0, 0, 0}, {-1, -1, -1, -1}, {0, 0, 0, 0}},
202	{-1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, {0, 0, 0, 0},
203	 {0, 0, 0, 0}, {-1, -1, -1, -1}, {0, 0, 0, 0}},
204	{-1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, {0, 0, 0, 0},
205	 {0, 0, 0, 0}, {-1, -1, -1, -1}, {0, 0, 0, 0}},
206	{-1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, {0, 0, 0, 0},
207	 {0, 0, 0, 0}, {-1, -1, -1, -1}, {0, 0, 0, 0}}
208};
209
210static Byte_t sBitMapClrTbl[8] = {
211	0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f
212};
213
214static Byte_t sBitMapSetTbl[8] = {
215	0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80
216};
217
218static int sClockPrescale = 0x14;
219
220/*
221 *  Line number is the ttySIx number (x), the Minor number.  We
222 *  assign them sequentially, starting at zero.  The following
223 *  array keeps track of the line number assigned to a given board/aiop/channel.
224 */
225static unsigned char lineNumbers[MAX_RP_PORTS];
226static unsigned long nextLineNumber;
227
228/*****  RocketPort Static Prototypes   *********/
229static int __init init_ISA(int i);
230static void rp_wait_until_sent(struct tty_struct *tty, int timeout);
231static void rp_flush_buffer(struct tty_struct *tty);
232static unsigned char GetLineNumber(int ctrl, int aiop, int ch);
233static unsigned char SetLineNumber(int ctrl, int aiop, int ch);
234static void rp_start(struct tty_struct *tty);
235static int sInitChan(CONTROLLER_T * CtlP, CHANNEL_T * ChP, int AiopNum,
236		     int ChanNum);
237static void sSetInterfaceMode(CHANNEL_T * ChP, Byte_t mode);
238static void sFlushRxFIFO(CHANNEL_T * ChP);
239static void sFlushTxFIFO(CHANNEL_T * ChP);
240static void sEnInterrupts(CHANNEL_T * ChP, Word_t Flags);
241static void sDisInterrupts(CHANNEL_T * ChP, Word_t Flags);
242static void sModemReset(CONTROLLER_T * CtlP, int chan, int on);
243static void sPCIModemReset(CONTROLLER_T * CtlP, int chan, int on);
244static int sWriteTxPrioByte(CHANNEL_T * ChP, Byte_t Data);
245static int sInitController(CONTROLLER_T * CtlP, int CtlNum, ByteIO_t MudbacIO,
246			   ByteIO_t * AiopIOList, int AiopIOListSize,
247			   int IRQNum, Byte_t Frequency, int PeriodicOnly);
248static int sReadAiopID(ByteIO_t io);
249static int sReadAiopNumChan(WordIO_t io);
250
251MODULE_AUTHOR("Theodore Ts'o");
252MODULE_DESCRIPTION("Comtrol RocketPort driver");
253module_param(board1, ulong, 0);
254MODULE_PARM_DESC(board1, "I/O port for (ISA) board #1");
255module_param(board2, ulong, 0);
256MODULE_PARM_DESC(board2, "I/O port for (ISA) board #2");
257module_param(board3, ulong, 0);
258MODULE_PARM_DESC(board3, "I/O port for (ISA) board #3");
259module_param(board4, ulong, 0);
260MODULE_PARM_DESC(board4, "I/O port for (ISA) board #4");
261module_param(controller, ulong, 0);
262MODULE_PARM_DESC(controller, "I/O port for (ISA) rocketport controller");
263module_param(support_low_speed, bool, 0);
264MODULE_PARM_DESC(support_low_speed, "1 means support 50 baud, 0 means support 460400 baud");
265module_param(modem1, ulong, 0);
266MODULE_PARM_DESC(modem1, "1 means (ISA) board #1 is a RocketModem");
267module_param(modem2, ulong, 0);
268MODULE_PARM_DESC(modem2, "1 means (ISA) board #2 is a RocketModem");
269module_param(modem3, ulong, 0);
270MODULE_PARM_DESC(modem3, "1 means (ISA) board #3 is a RocketModem");
271module_param(modem4, ulong, 0);
272MODULE_PARM_DESC(modem4, "1 means (ISA) board #4 is a RocketModem");
273module_param_array(pc104_1, ulong, NULL, 0);
274MODULE_PARM_DESC(pc104_1, "set interface types for ISA(PC104) board #1 (e.g. pc104_1=232,232,485,485,...");
275module_param_array(pc104_2, ulong, NULL, 0);
276MODULE_PARM_DESC(pc104_2, "set interface types for ISA(PC104) board #2 (e.g. pc104_2=232,232,485,485,...");
277module_param_array(pc104_3, ulong, NULL, 0);
278MODULE_PARM_DESC(pc104_3, "set interface types for ISA(PC104) board #3 (e.g. pc104_3=232,232,485,485,...");
279module_param_array(pc104_4, ulong, NULL, 0);
280MODULE_PARM_DESC(pc104_4, "set interface types for ISA(PC104) board #4 (e.g. pc104_4=232,232,485,485,...");
281
282static int rp_init(void);
283static void rp_cleanup_module(void);
284
285module_init(rp_init);
286module_exit(rp_cleanup_module);
287
288
289MODULE_LICENSE("Dual BSD/GPL");
290
291/*************************************************************************/
292/*                     Module code starts here                           */
293
294static inline int rocket_paranoia_check(struct r_port *info,
295					const char *routine)
296{
297#ifdef ROCKET_PARANOIA_CHECK
298	if (!info)
299		return 1;
300	if (info->magic != RPORT_MAGIC) {
301		printk(KERN_WARNING "Warning: bad magic number for rocketport "
302				"struct in %s\n", routine);
303		return 1;
304	}
305#endif
306	return 0;
307}
308
309
310/*  Serial port receive data function.  Called (from timer poll) when an AIOPIC signals
311 *  that receive data is present on a serial port.  Pulls data from FIFO, moves it into the
312 *  tty layer.
313 */
314static void rp_do_receive(struct r_port *info, CHANNEL_t *cp,
315		unsigned int ChanStatus)
316{
317	unsigned int CharNStat;
318	int ToRecv, wRecv, space;
319	unsigned char *cbuf;
320
321	ToRecv = sGetRxCnt(cp);
322#ifdef ROCKET_DEBUG_INTR
323	printk(KERN_INFO "rp_do_receive(%d)...\n", ToRecv);
324#endif
325	if (ToRecv == 0)
326		return;
327
328	/*
329	 * if status indicates there are errored characters in the
330	 * FIFO, then enter status mode (a word in FIFO holds
331	 * character and status).
332	 */
333	if (ChanStatus & (RXFOVERFL | RXBREAK | RXFRAME | RXPARITY)) {
334		if (!(ChanStatus & STATMODE)) {
335#ifdef ROCKET_DEBUG_RECEIVE
336			printk(KERN_INFO "Entering STATMODE...\n");
337#endif
338			ChanStatus |= STATMODE;
339			sEnRxStatusMode(cp);
340		}
341	}
342
343	/*
344	 * if we previously entered status mode, then read down the
345	 * FIFO one word at a time, pulling apart the character and
346	 * the status.  Update error counters depending on status
347	 */
348	if (ChanStatus & STATMODE) {
349#ifdef ROCKET_DEBUG_RECEIVE
350		printk(KERN_INFO "Ignore %x, read %x...\n",
351			info->ignore_status_mask, info->read_status_mask);
352#endif
353		while (ToRecv) {
354			char flag;
355
356			CharNStat = sInW(sGetTxRxDataIO(cp));
357#ifdef ROCKET_DEBUG_RECEIVE
358			printk(KERN_INFO "%x...\n", CharNStat);
359#endif
360			if (CharNStat & STMBREAKH)
361				CharNStat &= ~(STMFRAMEH | STMPARITYH);
362			if (CharNStat & info->ignore_status_mask) {
363				ToRecv--;
364				continue;
365			}
366			CharNStat &= info->read_status_mask;
367			if (CharNStat & STMBREAKH)
368				flag = TTY_BREAK;
369			else if (CharNStat & STMPARITYH)
370				flag = TTY_PARITY;
371			else if (CharNStat & STMFRAMEH)
372				flag = TTY_FRAME;
373			else if (CharNStat & STMRCVROVRH)
374				flag = TTY_OVERRUN;
375			else
376				flag = TTY_NORMAL;
377			tty_insert_flip_char(&info->port, CharNStat & 0xff,
378					flag);
379			ToRecv--;
380		}
381
382		/*
383		 * after we've emptied the FIFO in status mode, turn
384		 * status mode back off
385		 */
386		if (sGetRxCnt(cp) == 0) {
387#ifdef ROCKET_DEBUG_RECEIVE
388			printk(KERN_INFO "Status mode off.\n");
389#endif
390			sDisRxStatusMode(cp);
391		}
392	} else {
393		/*
394		 * we aren't in status mode, so read down the FIFO two
395		 * characters at time by doing repeated word IO
396		 * transfer.
397		 */
398		space = tty_prepare_flip_string(&info->port, &cbuf, ToRecv);
399		if (space < ToRecv) {
400#ifdef ROCKET_DEBUG_RECEIVE
401			printk(KERN_INFO "rp_do_receive:insufficient space ToRecv=%d space=%d\n", ToRecv, space);
402#endif
403			if (space <= 0)
404				return;
405			ToRecv = space;
406		}
407		wRecv = ToRecv >> 1;
408		if (wRecv)
409			sInStrW(sGetTxRxDataIO(cp), (unsigned short *) cbuf, wRecv);
410		if (ToRecv & 1)
411			cbuf[ToRecv - 1] = sInB(sGetTxRxDataIO(cp));
412	}
413	/*  Push the data up to the tty layer */
414	tty_flip_buffer_push(&info->port);
415}
416
417/*
418 *  Serial port transmit data function.  Called from the timer polling loop as a
419 *  result of a bit set in xmit_flags[], indicating data (from the tty layer) is ready
420 *  to be sent out the serial port.  Data is buffered in rp_table[line].xmit_buf, it is
421 *  moved to the port's xmit FIFO.  *info is critical data, protected by spinlocks.
422 */
423static void rp_do_transmit(struct r_port *info)
424{
425	int c;
426	CHANNEL_t *cp = &info->channel;
427	struct tty_struct *tty;
428	unsigned long flags;
429
430#ifdef ROCKET_DEBUG_INTR
431	printk(KERN_DEBUG "%s\n", __func__);
432#endif
433	if (!info)
434		return;
435	tty = tty_port_tty_get(&info->port);
436
437	if (tty == NULL) {
438		printk(KERN_WARNING "rp: WARNING %s called with tty==NULL\n", __func__);
439		clear_bit((info->aiop * 8) + info->chan, (void *) &xmit_flags[info->board]);
440		return;
441	}
442
443	spin_lock_irqsave(&info->slock, flags);
444	info->xmit_fifo_room = TXFIFO_SIZE - sGetTxCnt(cp);
445
446	/*  Loop sending data to FIFO until done or FIFO full */
447	while (1) {
448		if (tty->stopped)
449			break;
450		c = min(info->xmit_fifo_room, info->xmit_cnt);
451		c = min(c, XMIT_BUF_SIZE - info->xmit_tail);
452		if (c <= 0 || info->xmit_fifo_room <= 0)
453			break;
454		sOutStrW(sGetTxRxDataIO(cp), (unsigned short *) (info->xmit_buf + info->xmit_tail), c / 2);
455		if (c & 1)
456			sOutB(sGetTxRxDataIO(cp), info->xmit_buf[info->xmit_tail + c - 1]);
457		info->xmit_tail += c;
458		info->xmit_tail &= XMIT_BUF_SIZE - 1;
459		info->xmit_cnt -= c;
460		info->xmit_fifo_room -= c;
461#ifdef ROCKET_DEBUG_INTR
462		printk(KERN_INFO "tx %d chars...\n", c);
463#endif
464	}
465
466	if (info->xmit_cnt == 0)
467		clear_bit((info->aiop * 8) + info->chan, (void *) &xmit_flags[info->board]);
468
469	if (info->xmit_cnt < WAKEUP_CHARS) {
470		tty_wakeup(tty);
471#ifdef ROCKETPORT_HAVE_POLL_WAIT
472		wake_up_interruptible(&tty->poll_wait);
473#endif
474	}
475
476	spin_unlock_irqrestore(&info->slock, flags);
477	tty_kref_put(tty);
478
479#ifdef ROCKET_DEBUG_INTR
480	printk(KERN_DEBUG "(%d,%d,%d,%d)...\n", info->xmit_cnt, info->xmit_head,
481	       info->xmit_tail, info->xmit_fifo_room);
482#endif
483}
484
485/*
486 *  Called when a serial port signals it has read data in it's RX FIFO.
487 *  It checks what interrupts are pending and services them, including
488 *  receiving serial data.
489 */
490static void rp_handle_port(struct r_port *info)
491{
492	CHANNEL_t *cp;
493	unsigned int IntMask, ChanStatus;
494
495	if (!info)
496		return;
497
498	if ((info->port.flags & ASYNC_INITIALIZED) == 0) {
499		printk(KERN_WARNING "rp: WARNING: rp_handle_port called with "
500				"info->flags & NOT_INIT\n");
501		return;
502	}
503
504	cp = &info->channel;
505
506	IntMask = sGetChanIntID(cp) & info->intmask;
507#ifdef ROCKET_DEBUG_INTR
508	printk(KERN_INFO "rp_interrupt %02x...\n", IntMask);
509#endif
510	ChanStatus = sGetChanStatus(cp);
511	if (IntMask & RXF_TRIG) {	/* Rx FIFO trigger level */
512		rp_do_receive(info, cp, ChanStatus);
513	}
514	if (IntMask & DELTA_CD) {	/* CD change  */
515#if (defined(ROCKET_DEBUG_OPEN) || defined(ROCKET_DEBUG_INTR) || defined(ROCKET_DEBUG_HANGUP))
516		printk(KERN_INFO "ttyR%d CD now %s...\n", info->line,
517		       (ChanStatus & CD_ACT) ? "on" : "off");
518#endif
519		if (!(ChanStatus & CD_ACT) && info->cd_status) {
520#ifdef ROCKET_DEBUG_HANGUP
521			printk(KERN_INFO "CD drop, calling hangup.\n");
522#endif
523			tty_port_tty_hangup(&info->port, false);
524		}
525		info->cd_status = (ChanStatus & CD_ACT) ? 1 : 0;
526		wake_up_interruptible(&info->port.open_wait);
527	}
528#ifdef ROCKET_DEBUG_INTR
529	if (IntMask & DELTA_CTS) {	/* CTS change */
530		printk(KERN_INFO "CTS change...\n");
531	}
532	if (IntMask & DELTA_DSR) {	/* DSR change */
533		printk(KERN_INFO "DSR change...\n");
534	}
535#endif
536}
537
538/*
539 *  The top level polling routine.  Repeats every 1/100 HZ (10ms).
540 */
541static void rp_do_poll(unsigned long dummy)
542{
543	CONTROLLER_t *ctlp;
544	int ctrl, aiop, ch, line;
545	unsigned int xmitmask, i;
546	unsigned int CtlMask;
547	unsigned char AiopMask;
548	Word_t bit;
549
550	/*  Walk through all the boards (ctrl's) */
551	for (ctrl = 0; ctrl < max_board; ctrl++) {
552		if (rcktpt_io_addr[ctrl] <= 0)
553			continue;
554
555		/*  Get a ptr to the board's control struct */
556		ctlp = sCtlNumToCtlPtr(ctrl);
557
558		/*  Get the interrupt status from the board */
559#ifdef CONFIG_PCI
560		if (ctlp->BusType == isPCI)
561			CtlMask = sPCIGetControllerIntStatus(ctlp);
562		else
563#endif
564			CtlMask = sGetControllerIntStatus(ctlp);
565
566		/*  Check if any AIOP read bits are set */
567		for (aiop = 0; CtlMask; aiop++) {
568			bit = ctlp->AiopIntrBits[aiop];
569			if (CtlMask & bit) {
570				CtlMask &= ~bit;
571				AiopMask = sGetAiopIntStatus(ctlp, aiop);
572
573				/*  Check if any port read bits are set */
574				for (ch = 0; AiopMask;  AiopMask >>= 1, ch++) {
575					if (AiopMask & 1) {
576
577						/*  Get the line number (/dev/ttyRx number). */
578						/*  Read the data from the port. */
579						line = GetLineNumber(ctrl, aiop, ch);
580						rp_handle_port(rp_table[line]);
581					}
582				}
583			}
584		}
585
586		xmitmask = xmit_flags[ctrl];
587
588		/*
589		 *  xmit_flags contains bit-significant flags, indicating there is data
590		 *  to xmit on the port. Bit 0 is port 0 on this board, bit 1 is port
591		 *  1, ... (32 total possible).  The variable i has the aiop and ch
592		 *  numbers encoded in it (port 0-7 are aiop0, 8-15 are aiop1, etc).
593		 */
594		if (xmitmask) {
595			for (i = 0; i < rocketModel[ctrl].numPorts; i++) {
596				if (xmitmask & (1 << i)) {
597					aiop = (i & 0x18) >> 3;
598					ch = i & 0x07;
599					line = GetLineNumber(ctrl, aiop, ch);
600					rp_do_transmit(rp_table[line]);
601				}
602			}
603		}
604	}
605
606	/*
607	 * Reset the timer so we get called at the next clock tick (10ms).
608	 */
609	if (atomic_read(&rp_num_ports_open))
610		mod_timer(&rocket_timer, jiffies + POLL_PERIOD);
611}
612
613/*
614 *  Initializes the r_port structure for a port, as well as enabling the port on
615 *  the board.
616 *  Inputs:  board, aiop, chan numbers
617 */
618static void init_r_port(int board, int aiop, int chan, struct pci_dev *pci_dev)
619{
620	unsigned rocketMode;
621	struct r_port *info;
622	int line;
623	CONTROLLER_T *ctlp;
624
625	/*  Get the next available line number */
626	line = SetLineNumber(board, aiop, chan);
627
628	ctlp = sCtlNumToCtlPtr(board);
629
630	/*  Get a r_port struct for the port, fill it in and save it globally, indexed by line number */
631	info = kzalloc(sizeof (struct r_port), GFP_KERNEL);
632	if (!info) {
633		printk(KERN_ERR "Couldn't allocate info struct for line #%d\n",
634				line);
635		return;
636	}
637
638	info->magic = RPORT_MAGIC;
639	info->line = line;
640	info->ctlp = ctlp;
641	info->board = board;
642	info->aiop = aiop;
643	info->chan = chan;
644	tty_port_init(&info->port);
645	info->port.ops = &rocket_port_ops;
646	init_completion(&info->close_wait);
647	info->flags &= ~ROCKET_MODE_MASK;
648	switch (pc104[board][line]) {
649	case 422:
650		info->flags |= ROCKET_MODE_RS422;
651		break;
652	case 485:
653		info->flags |= ROCKET_MODE_RS485;
654		break;
655	case 232:
656	default:
657		info->flags |= ROCKET_MODE_RS232;
658		break;
659	}
660
661	info->intmask = RXF_TRIG | TXFIFO_MT | SRC_INT | DELTA_CD | DELTA_CTS | DELTA_DSR;
662	if (sInitChan(ctlp, &info->channel, aiop, chan) == 0) {
663		printk(KERN_ERR "RocketPort sInitChan(%d, %d, %d) failed!\n",
664				board, aiop, chan);
665		tty_port_destroy(&info->port);
666		kfree(info);
667		return;
668	}
669
670	rocketMode = info->flags & ROCKET_MODE_MASK;
671
672	if ((info->flags & ROCKET_RTS_TOGGLE) || (rocketMode == ROCKET_MODE_RS485))
673		sEnRTSToggle(&info->channel);
674	else
675		sDisRTSToggle(&info->channel);
676
677	if (ctlp->boardType == ROCKET_TYPE_PC104) {
678		switch (rocketMode) {
679		case ROCKET_MODE_RS485:
680			sSetInterfaceMode(&info->channel, InterfaceModeRS485);
681			break;
682		case ROCKET_MODE_RS422:
683			sSetInterfaceMode(&info->channel, InterfaceModeRS422);
684			break;
685		case ROCKET_MODE_RS232:
686		default:
687			if (info->flags & ROCKET_RTS_TOGGLE)
688				sSetInterfaceMode(&info->channel, InterfaceModeRS232T);
689			else
690				sSetInterfaceMode(&info->channel, InterfaceModeRS232);
691			break;
692		}
693	}
694	spin_lock_init(&info->slock);
695	mutex_init(&info->write_mtx);
696	rp_table[line] = info;
697	tty_port_register_device(&info->port, rocket_driver, line,
698			pci_dev ? &pci_dev->dev : NULL);
699}
700
701/*
702 *  Configures a rocketport port according to its termio settings.  Called from
703 *  user mode into the driver (exception handler).  *info CD manipulation is spinlock protected.
704 */
705static void configure_r_port(struct tty_struct *tty, struct r_port *info,
706			     struct ktermios *old_termios)
707{
708	unsigned cflag;
709	unsigned long flags;
710	unsigned rocketMode;
711	int bits, baud, divisor;
712	CHANNEL_t *cp;
713	struct ktermios *t = &tty->termios;
714
715	cp = &info->channel;
716	cflag = t->c_cflag;
717
718	/* Byte size and parity */
719	if ((cflag & CSIZE) == CS8) {
720		sSetData8(cp);
721		bits = 10;
722	} else {
723		sSetData7(cp);
724		bits = 9;
725	}
726	if (cflag & CSTOPB) {
727		sSetStop2(cp);
728		bits++;
729	} else {
730		sSetStop1(cp);
731	}
732
733	if (cflag & PARENB) {
734		sEnParity(cp);
735		bits++;
736		if (cflag & PARODD) {
737			sSetOddParity(cp);
738		} else {
739			sSetEvenParity(cp);
740		}
741	} else {
742		sDisParity(cp);
743	}
744
745	/* baud rate */
746	baud = tty_get_baud_rate(tty);
747	if (!baud)
748		baud = 9600;
749	divisor = ((rp_baud_base[info->board] + (baud >> 1)) / baud) - 1;
750	if ((divisor >= 8192 || divisor < 0) && old_termios) {
751		baud = tty_termios_baud_rate(old_termios);
752		if (!baud)
753			baud = 9600;
754		divisor = (rp_baud_base[info->board] / baud) - 1;
755	}
756	if (divisor >= 8192 || divisor < 0) {
757		baud = 9600;
758		divisor = (rp_baud_base[info->board] / baud) - 1;
759	}
760	info->cps = baud / bits;
761	sSetBaud(cp, divisor);
762
763	/* FIXME: Should really back compute a baud rate from the divisor */
764	tty_encode_baud_rate(tty, baud, baud);
765
766	if (cflag & CRTSCTS) {
767		info->intmask |= DELTA_CTS;
768		sEnCTSFlowCtl(cp);
769	} else {
770		info->intmask &= ~DELTA_CTS;
771		sDisCTSFlowCtl(cp);
772	}
773	if (cflag & CLOCAL) {
774		info->intmask &= ~DELTA_CD;
775	} else {
776		spin_lock_irqsave(&info->slock, flags);
777		if (sGetChanStatus(cp) & CD_ACT)
778			info->cd_status = 1;
779		else
780			info->cd_status = 0;
781		info->intmask |= DELTA_CD;
782		spin_unlock_irqrestore(&info->slock, flags);
783	}
784
785	/*
786	 * Handle software flow control in the board
787	 */
788#ifdef ROCKET_SOFT_FLOW
789	if (I_IXON(tty)) {
790		sEnTxSoftFlowCtl(cp);
791		if (I_IXANY(tty)) {
792			sEnIXANY(cp);
793		} else {
794			sDisIXANY(cp);
795		}
796		sSetTxXONChar(cp, START_CHAR(tty));
797		sSetTxXOFFChar(cp, STOP_CHAR(tty));
798	} else {
799		sDisTxSoftFlowCtl(cp);
800		sDisIXANY(cp);
801		sClrTxXOFF(cp);
802	}
803#endif
804
805	/*
806	 * Set up ignore/read mask words
807	 */
808	info->read_status_mask = STMRCVROVRH | 0xFF;
809	if (I_INPCK(tty))
810		info->read_status_mask |= STMFRAMEH | STMPARITYH;
811	if (I_BRKINT(tty) || I_PARMRK(tty))
812		info->read_status_mask |= STMBREAKH;
813
814	/*
815	 * Characters to ignore
816	 */
817	info->ignore_status_mask = 0;
818	if (I_IGNPAR(tty))
819		info->ignore_status_mask |= STMFRAMEH | STMPARITYH;
820	if (I_IGNBRK(tty)) {
821		info->ignore_status_mask |= STMBREAKH;
822		/*
823		 * If we're ignoring parity and break indicators,
824		 * ignore overruns too.  (For real raw support).
825		 */
826		if (I_IGNPAR(tty))
827			info->ignore_status_mask |= STMRCVROVRH;
828	}
829
830	rocketMode = info->flags & ROCKET_MODE_MASK;
831
832	if ((info->flags & ROCKET_RTS_TOGGLE)
833	    || (rocketMode == ROCKET_MODE_RS485))
834		sEnRTSToggle(cp);
835	else
836		sDisRTSToggle(cp);
837
838	sSetRTS(&info->channel);
839
840	if (cp->CtlP->boardType == ROCKET_TYPE_PC104) {
841		switch (rocketMode) {
842		case ROCKET_MODE_RS485:
843			sSetInterfaceMode(cp, InterfaceModeRS485);
844			break;
845		case ROCKET_MODE_RS422:
846			sSetInterfaceMode(cp, InterfaceModeRS422);
847			break;
848		case ROCKET_MODE_RS232:
849		default:
850			if (info->flags & ROCKET_RTS_TOGGLE)
851				sSetInterfaceMode(cp, InterfaceModeRS232T);
852			else
853				sSetInterfaceMode(cp, InterfaceModeRS232);
854			break;
855		}
856	}
857}
858
859static int carrier_raised(struct tty_port *port)
860{
861	struct r_port *info = container_of(port, struct r_port, port);
862	return (sGetChanStatusLo(&info->channel) & CD_ACT) ? 1 : 0;
863}
864
865static void dtr_rts(struct tty_port *port, int on)
866{
867	struct r_port *info = container_of(port, struct r_port, port);
868	if (on) {
869		sSetDTR(&info->channel);
870		sSetRTS(&info->channel);
871	} else {
872		sClrDTR(&info->channel);
873		sClrRTS(&info->channel);
874	}
875}
876
877/*
878 *  Exception handler that opens a serial port.  Creates xmit_buf storage, fills in
879 *  port's r_port struct.  Initializes the port hardware.
880 */
881static int rp_open(struct tty_struct *tty, struct file *filp)
882{
883	struct r_port *info;
884	struct tty_port *port;
885	int retval;
886	CHANNEL_t *cp;
887	unsigned long page;
888
889	info = rp_table[tty->index];
890	if (info == NULL)
891		return -ENXIO;
892	port = &info->port;
893
894	page = __get_free_page(GFP_KERNEL);
895	if (!page)
896		return -ENOMEM;
897
898	/*
899	 * We must not sleep from here until the port is marked fully in use.
900	 */
901	if (info->xmit_buf)
902		free_page(page);
903	else
904		info->xmit_buf = (unsigned char *) page;
905
906	tty->driver_data = info;
907	tty_port_tty_set(port, tty);
908
909	if (port->count++ == 0) {
910		atomic_inc(&rp_num_ports_open);
911
912#ifdef ROCKET_DEBUG_OPEN
913		printk(KERN_INFO "rocket mod++ = %d...\n",
914				atomic_read(&rp_num_ports_open));
915#endif
916	}
917#ifdef ROCKET_DEBUG_OPEN
918	printk(KERN_INFO "rp_open ttyR%d, count=%d\n", info->line, info->port.count);
919#endif
920
921	/*
922	 * Info->count is now 1; so it's safe to sleep now.
923	 */
924	if (!test_bit(ASYNCB_INITIALIZED, &port->flags)) {
925		cp = &info->channel;
926		sSetRxTrigger(cp, TRIG_1);
927		if (sGetChanStatus(cp) & CD_ACT)
928			info->cd_status = 1;
929		else
930			info->cd_status = 0;
931		sDisRxStatusMode(cp);
932		sFlushRxFIFO(cp);
933		sFlushTxFIFO(cp);
934
935		sEnInterrupts(cp, (TXINT_EN | MCINT_EN | RXINT_EN | SRCINT_EN | CHANINT_EN));
936		sSetRxTrigger(cp, TRIG_1);
937
938		sGetChanStatus(cp);
939		sDisRxStatusMode(cp);
940		sClrTxXOFF(cp);
941
942		sDisCTSFlowCtl(cp);
943		sDisTxSoftFlowCtl(cp);
944
945		sEnRxFIFO(cp);
946		sEnTransmit(cp);
947
948		set_bit(ASYNCB_INITIALIZED, &info->port.flags);
949
950		/*
951		 * Set up the tty->alt_speed kludge
952		 */
953		if ((info->flags & ROCKET_SPD_MASK) == ROCKET_SPD_HI)
954			tty->alt_speed = 57600;
955		if ((info->flags & ROCKET_SPD_MASK) == ROCKET_SPD_VHI)
956			tty->alt_speed = 115200;
957		if ((info->flags & ROCKET_SPD_MASK) == ROCKET_SPD_SHI)
958			tty->alt_speed = 230400;
959		if ((info->flags & ROCKET_SPD_MASK) == ROCKET_SPD_WARP)
960			tty->alt_speed = 460800;
961
962		configure_r_port(tty, info, NULL);
963		if (tty->termios.c_cflag & CBAUD) {
964			sSetDTR(cp);
965			sSetRTS(cp);
966		}
967	}
968	/*  Starts (or resets) the maint polling loop */
969	mod_timer(&rocket_timer, jiffies + POLL_PERIOD);
970
971	retval = tty_port_block_til_ready(port, tty, filp);
972	if (retval) {
973#ifdef ROCKET_DEBUG_OPEN
974		printk(KERN_INFO "rp_open returning after block_til_ready with %d\n", retval);
975#endif
976		return retval;
977	}
978	return 0;
979}
980
981/*
982 *  Exception handler that closes a serial port. info->port.count is considered critical.
983 */
984static void rp_close(struct tty_struct *tty, struct file *filp)
985{
986	struct r_port *info = tty->driver_data;
987	struct tty_port *port = &info->port;
988	int timeout;
989	CHANNEL_t *cp;
990
991	if (rocket_paranoia_check(info, "rp_close"))
992		return;
993
994#ifdef ROCKET_DEBUG_OPEN
995	printk(KERN_INFO "rp_close ttyR%d, count = %d\n", info->line, info->port.count);
996#endif
997
998	if (tty_port_close_start(port, tty, filp) == 0)
999		return;
1000
1001	mutex_lock(&port->mutex);
1002	cp = &info->channel;
1003	/*
1004	 * Before we drop DTR, make sure the UART transmitter
1005	 * has completely drained; this is especially
1006	 * important if there is a transmit FIFO!
1007	 */
1008	timeout = (sGetTxCnt(cp) + 1) * HZ / info->cps;
1009	if (timeout == 0)
1010		timeout = 1;
1011	rp_wait_until_sent(tty, timeout);
1012	clear_bit((info->aiop * 8) + info->chan, (void *) &xmit_flags[info->board]);
1013
1014	sDisTransmit(cp);
1015	sDisInterrupts(cp, (TXINT_EN | MCINT_EN | RXINT_EN | SRCINT_EN | CHANINT_EN));
1016	sDisCTSFlowCtl(cp);
1017	sDisTxSoftFlowCtl(cp);
1018	sClrTxXOFF(cp);
1019	sFlushRxFIFO(cp);
1020	sFlushTxFIFO(cp);
1021	sClrRTS(cp);
1022	if (C_HUPCL(tty))
1023		sClrDTR(cp);
1024
1025	rp_flush_buffer(tty);
1026
1027	tty_ldisc_flush(tty);
1028
1029	clear_bit((info->aiop * 8) + info->chan, (void *) &xmit_flags[info->board]);
1030
1031	/* We can't yet use tty_port_close_end as the buffer handling in this
1032	   driver is a bit different to the usual */
1033
1034	if (port->blocked_open) {
1035		if (port->close_delay) {
1036			msleep_interruptible(jiffies_to_msecs(port->close_delay));
1037		}
1038		wake_up_interruptible(&port->open_wait);
1039	} else {
1040		if (info->xmit_buf) {
1041			free_page((unsigned long) info->xmit_buf);
1042			info->xmit_buf = NULL;
1043		}
1044	}
1045	spin_lock_irq(&port->lock);
1046	info->port.flags &= ~(ASYNC_INITIALIZED | ASYNC_CLOSING | ASYNC_NORMAL_ACTIVE);
1047	tty->closing = 0;
1048	spin_unlock_irq(&port->lock);
1049	mutex_unlock(&port->mutex);
1050	tty_port_tty_set(port, NULL);
1051
1052	complete_all(&info->close_wait);
1053	atomic_dec(&rp_num_ports_open);
1054
1055#ifdef ROCKET_DEBUG_OPEN
1056	printk(KERN_INFO "rocket mod-- = %d...\n",
1057			atomic_read(&rp_num_ports_open));
1058	printk(KERN_INFO "rp_close ttyR%d complete shutdown\n", info->line);
1059#endif
1060
1061}
1062
1063static void rp_set_termios(struct tty_struct *tty,
1064			   struct ktermios *old_termios)
1065{
1066	struct r_port *info = tty->driver_data;
1067	CHANNEL_t *cp;
1068	unsigned cflag;
1069
1070	if (rocket_paranoia_check(info, "rp_set_termios"))
1071		return;
1072
1073	cflag = tty->termios.c_cflag;
1074
1075	/*
1076	 * This driver doesn't support CS5 or CS6
1077	 */
1078	if (((cflag & CSIZE) == CS5) || ((cflag & CSIZE) == CS6))
1079		tty->termios.c_cflag =
1080		    ((cflag & ~CSIZE) | (old_termios->c_cflag & CSIZE));
1081	/* Or CMSPAR */
1082	tty->termios.c_cflag &= ~CMSPAR;
1083
1084	configure_r_port(tty, info, old_termios);
1085
1086	cp = &info->channel;
1087
1088	/* Handle transition to B0 status */
1089	if ((old_termios->c_cflag & CBAUD) && !(tty->termios.c_cflag & CBAUD)) {
1090		sClrDTR(cp);
1091		sClrRTS(cp);
1092	}
1093
1094	/* Handle transition away from B0 status */
1095	if (!(old_termios->c_cflag & CBAUD) && (tty->termios.c_cflag & CBAUD)) {
1096		sSetRTS(cp);
1097		sSetDTR(cp);
1098	}
1099
1100	if ((old_termios->c_cflag & CRTSCTS) && !(tty->termios.c_cflag & CRTSCTS))
1101		rp_start(tty);
1102}
1103
1104static int rp_break(struct tty_struct *tty, int break_state)
1105{
1106	struct r_port *info = tty->driver_data;
1107	unsigned long flags;
1108
1109	if (rocket_paranoia_check(info, "rp_break"))
1110		return -EINVAL;
1111
1112	spin_lock_irqsave(&info->slock, flags);
1113	if (break_state == -1)
1114		sSendBreak(&info->channel);
1115	else
1116		sClrBreak(&info->channel);
1117	spin_unlock_irqrestore(&info->slock, flags);
1118	return 0;
1119}
1120
1121/*
1122 * sGetChanRI used to be a macro in rocket_int.h. When the functionality for
1123 * the UPCI boards was added, it was decided to make this a function because
1124 * the macro was getting too complicated. All cases except the first one
1125 * (UPCIRingInd) are taken directly from the original macro.
1126 */
1127static int sGetChanRI(CHANNEL_T * ChP)
1128{
1129	CONTROLLER_t *CtlP = ChP->CtlP;
1130	int ChanNum = ChP->ChanNum;
1131	int RingInd = 0;
1132
1133	if (CtlP->UPCIRingInd)
1134		RingInd = !(sInB(CtlP->UPCIRingInd) & sBitMapSetTbl[ChanNum]);
1135	else if (CtlP->AltChanRingIndicator)
1136		RingInd = sInB((ByteIO_t) (ChP->ChanStat + 8)) & DSR_ACT;
1137	else if (CtlP->boardType == ROCKET_TYPE_PC104)
1138		RingInd = !(sInB(CtlP->AiopIO[3]) & sBitMapSetTbl[ChanNum]);
1139
1140	return RingInd;
1141}
1142
1143/********************************************************************************************/
1144/*  Here are the routines used by rp_ioctl.  These are all called from exception handlers.  */
1145
1146/*
1147 *  Returns the state of the serial modem control lines.  These next 2 functions
1148 *  are the way kernel versions > 2.5 handle modem control lines rather than IOCTLs.
1149 */
1150static int rp_tiocmget(struct tty_struct *tty)
1151{
1152	struct r_port *info = tty->driver_data;
1153	unsigned int control, result, ChanStatus;
1154
1155	ChanStatus = sGetChanStatusLo(&info->channel);
1156	control = info->channel.TxControl[3];
1157	result = ((control & SET_RTS) ? TIOCM_RTS : 0) |
1158		((control & SET_DTR) ?  TIOCM_DTR : 0) |
1159		((ChanStatus & CD_ACT) ? TIOCM_CAR : 0) |
1160		(sGetChanRI(&info->channel) ? TIOCM_RNG : 0) |
1161		((ChanStatus & DSR_ACT) ? TIOCM_DSR : 0) |
1162		((ChanStatus & CTS_ACT) ? TIOCM_CTS : 0);
1163
1164	return result;
1165}
1166
1167/*
1168 *  Sets the modem control lines
1169 */
1170static int rp_tiocmset(struct tty_struct *tty,
1171				unsigned int set, unsigned int clear)
1172{
1173	struct r_port *info = tty->driver_data;
1174
1175	if (set & TIOCM_RTS)
1176		info->channel.TxControl[3] |= SET_RTS;
1177	if (set & TIOCM_DTR)
1178		info->channel.TxControl[3] |= SET_DTR;
1179	if (clear & TIOCM_RTS)
1180		info->channel.TxControl[3] &= ~SET_RTS;
1181	if (clear & TIOCM_DTR)
1182		info->channel.TxControl[3] &= ~SET_DTR;
1183
1184	out32(info->channel.IndexAddr, info->channel.TxControl);
1185	return 0;
1186}
1187
1188static int get_config(struct r_port *info, struct rocket_config __user *retinfo)
1189{
1190	struct rocket_config tmp;
1191
1192	if (!retinfo)
1193		return -EFAULT;
1194	memset(&tmp, 0, sizeof (tmp));
1195	mutex_lock(&info->port.mutex);
1196	tmp.line = info->line;
1197	tmp.flags = info->flags;
1198	tmp.close_delay = info->port.close_delay;
1199	tmp.closing_wait = info->port.closing_wait;
1200	tmp.port = rcktpt_io_addr[(info->line >> 5) & 3];
1201	mutex_unlock(&info->port.mutex);
1202
1203	if (copy_to_user(retinfo, &tmp, sizeof (*retinfo)))
1204		return -EFAULT;
1205	return 0;
1206}
1207
1208static int set_config(struct tty_struct *tty, struct r_port *info,
1209					struct rocket_config __user *new_info)
1210{
1211	struct rocket_config new_serial;
1212
1213	if (copy_from_user(&new_serial, new_info, sizeof (new_serial)))
1214		return -EFAULT;
1215
1216	mutex_lock(&info->port.mutex);
1217	if (!capable(CAP_SYS_ADMIN))
1218	{
1219		if ((new_serial.flags & ~ROCKET_USR_MASK) != (info->flags & ~ROCKET_USR_MASK)) {
1220			mutex_unlock(&info->port.mutex);
1221			return -EPERM;
1222		}
1223		info->flags = ((info->flags & ~ROCKET_USR_MASK) | (new_serial.flags & ROCKET_USR_MASK));
1224		configure_r_port(tty, info, NULL);
1225		mutex_unlock(&info->port.mutex);
1226		return 0;
1227	}
1228
1229	info->flags = ((info->flags & ~ROCKET_FLAGS) | (new_serial.flags & ROCKET_FLAGS));
1230	info->port.close_delay = new_serial.close_delay;
1231	info->port.closing_wait = new_serial.closing_wait;
1232
1233	if ((info->flags & ROCKET_SPD_MASK) == ROCKET_SPD_HI)
1234		tty->alt_speed = 57600;
1235	if ((info->flags & ROCKET_SPD_MASK) == ROCKET_SPD_VHI)
1236		tty->alt_speed = 115200;
1237	if ((info->flags & ROCKET_SPD_MASK) == ROCKET_SPD_SHI)
1238		tty->alt_speed = 230400;
1239	if ((info->flags & ROCKET_SPD_MASK) == ROCKET_SPD_WARP)
1240		tty->alt_speed = 460800;
1241	mutex_unlock(&info->port.mutex);
1242
1243	configure_r_port(tty, info, NULL);
1244	return 0;
1245}
1246
1247/*
1248 *  This function fills in a rocket_ports struct with information
1249 *  about what boards/ports are in the system.  This info is passed
1250 *  to user space.  See setrocket.c where the info is used to create
1251 *  the /dev/ttyRx ports.
1252 */
1253static int get_ports(struct r_port *info, struct rocket_ports __user *retports)
1254{
1255	struct rocket_ports tmp;
1256	int board;
1257
1258	if (!retports)
1259		return -EFAULT;
1260	memset(&tmp, 0, sizeof (tmp));
1261	tmp.tty_major = rocket_driver->major;
1262
1263	for (board = 0; board < 4; board++) {
1264		tmp.rocketModel[board].model = rocketModel[board].model;
1265		strcpy(tmp.rocketModel[board].modelString, rocketModel[board].modelString);
1266		tmp.rocketModel[board].numPorts = rocketModel[board].numPorts;
1267		tmp.rocketModel[board].loadrm2 = rocketModel[board].loadrm2;
1268		tmp.rocketModel[board].startingPortNumber = rocketModel[board].startingPortNumber;
1269	}
1270	if (copy_to_user(retports, &tmp, sizeof (*retports)))
1271		return -EFAULT;
1272	return 0;
1273}
1274
1275static int reset_rm2(struct r_port *info, void __user *arg)
1276{
1277	int reset;
1278
1279	if (!capable(CAP_SYS_ADMIN))
1280		return -EPERM;
1281
1282	if (copy_from_user(&reset, arg, sizeof (int)))
1283		return -EFAULT;
1284	if (reset)
1285		reset = 1;
1286
1287	if (rcktpt_type[info->board] != ROCKET_TYPE_MODEMII &&
1288            rcktpt_type[info->board] != ROCKET_TYPE_MODEMIII)
1289		return -EINVAL;
1290
1291	if (info->ctlp->BusType == isISA)
1292		sModemReset(info->ctlp, info->chan, reset);
1293	else
1294		sPCIModemReset(info->ctlp, info->chan, reset);
1295
1296	return 0;
1297}
1298
1299static int get_version(struct r_port *info, struct rocket_version __user *retvers)
1300{
1301	if (copy_to_user(retvers, &driver_version, sizeof (*retvers)))
1302		return -EFAULT;
1303	return 0;
1304}
1305
1306/*  IOCTL call handler into the driver */
1307static int rp_ioctl(struct tty_struct *tty,
1308		    unsigned int cmd, unsigned long arg)
1309{
1310	struct r_port *info = tty->driver_data;
1311	void __user *argp = (void __user *)arg;
1312	int ret = 0;
1313
1314	if (cmd != RCKP_GET_PORTS && rocket_paranoia_check(info, "rp_ioctl"))
1315		return -ENXIO;
1316
1317	switch (cmd) {
1318	case RCKP_GET_STRUCT:
1319		if (copy_to_user(argp, info, sizeof (struct r_port)))
1320			ret = -EFAULT;
1321		break;
1322	case RCKP_GET_CONFIG:
1323		ret = get_config(info, argp);
1324		break;
1325	case RCKP_SET_CONFIG:
1326		ret = set_config(tty, info, argp);
1327		break;
1328	case RCKP_GET_PORTS:
1329		ret = get_ports(info, argp);
1330		break;
1331	case RCKP_RESET_RM2:
1332		ret = reset_rm2(info, argp);
1333		break;
1334	case RCKP_GET_VERSION:
1335		ret = get_version(info, argp);
1336		break;
1337	default:
1338		ret = -ENOIOCTLCMD;
1339	}
1340	return ret;
1341}
1342
1343static void rp_send_xchar(struct tty_struct *tty, char ch)
1344{
1345	struct r_port *info = tty->driver_data;
1346	CHANNEL_t *cp;
1347
1348	if (rocket_paranoia_check(info, "rp_send_xchar"))
1349		return;
1350
1351	cp = &info->channel;
1352	if (sGetTxCnt(cp))
1353		sWriteTxPrioByte(cp, ch);
1354	else
1355		sWriteTxByte(sGetTxRxDataIO(cp), ch);
1356}
1357
1358static void rp_throttle(struct tty_struct *tty)
1359{
1360	struct r_port *info = tty->driver_data;
1361
1362#ifdef ROCKET_DEBUG_THROTTLE
1363	printk(KERN_INFO "throttle %s: %d....\n", tty->name,
1364	       tty->ldisc.chars_in_buffer(tty));
1365#endif
1366
1367	if (rocket_paranoia_check(info, "rp_throttle"))
1368		return;
1369
1370	if (I_IXOFF(tty))
1371		rp_send_xchar(tty, STOP_CHAR(tty));
1372
1373	sClrRTS(&info->channel);
1374}
1375
1376static void rp_unthrottle(struct tty_struct *tty)
1377{
1378	struct r_port *info = tty->driver_data;
1379#ifdef ROCKET_DEBUG_THROTTLE
1380	printk(KERN_INFO "unthrottle %s: %d....\n", tty->name,
1381	       tty->ldisc.chars_in_buffer(tty));
1382#endif
1383
1384	if (rocket_paranoia_check(info, "rp_unthrottle"))
1385		return;
1386
1387	if (I_IXOFF(tty))
1388		rp_send_xchar(tty, START_CHAR(tty));
1389
1390	sSetRTS(&info->channel);
1391}
1392
1393/*
1394 * ------------------------------------------------------------
1395 * rp_stop() and rp_start()
1396 *
1397 * This routines are called before setting or resetting tty->stopped.
1398 * They enable or disable transmitter interrupts, as necessary.
1399 * ------------------------------------------------------------
1400 */
1401static void rp_stop(struct tty_struct *tty)
1402{
1403	struct r_port *info = tty->driver_data;
1404
1405#ifdef ROCKET_DEBUG_FLOW
1406	printk(KERN_INFO "stop %s: %d %d....\n", tty->name,
1407	       info->xmit_cnt, info->xmit_fifo_room);
1408#endif
1409
1410	if (rocket_paranoia_check(info, "rp_stop"))
1411		return;
1412
1413	if (sGetTxCnt(&info->channel))
1414		sDisTransmit(&info->channel);
1415}
1416
1417static void rp_start(struct tty_struct *tty)
1418{
1419	struct r_port *info = tty->driver_data;
1420
1421#ifdef ROCKET_DEBUG_FLOW
1422	printk(KERN_INFO "start %s: %d %d....\n", tty->name,
1423	       info->xmit_cnt, info->xmit_fifo_room);
1424#endif
1425
1426	if (rocket_paranoia_check(info, "rp_stop"))
1427		return;
1428
1429	sEnTransmit(&info->channel);
1430	set_bit((info->aiop * 8) + info->chan,
1431		(void *) &xmit_flags[info->board]);
1432}
1433
1434/*
1435 * rp_wait_until_sent() --- wait until the transmitter is empty
1436 */
1437static void rp_wait_until_sent(struct tty_struct *tty, int timeout)
1438{
1439	struct r_port *info = tty->driver_data;
1440	CHANNEL_t *cp;
1441	unsigned long orig_jiffies;
1442	int check_time, exit_time;
1443	int txcnt;
1444
1445	if (rocket_paranoia_check(info, "rp_wait_until_sent"))
1446		return;
1447
1448	cp = &info->channel;
1449
1450	orig_jiffies = jiffies;
1451#ifdef ROCKET_DEBUG_WAIT_UNTIL_SENT
1452	printk(KERN_INFO "In %s(%d) (jiff=%lu)...\n", __func__, timeout,
1453	       jiffies);
1454	printk(KERN_INFO "cps=%d...\n", info->cps);
1455#endif
1456	while (1) {
1457		txcnt = sGetTxCnt(cp);
1458		if (!txcnt) {
1459			if (sGetChanStatusLo(cp) & TXSHRMT)
1460				break;
1461			check_time = (HZ / info->cps) / 5;
1462		} else {
1463			check_time = HZ * txcnt / info->cps;
1464		}
1465		if (timeout) {
1466			exit_time = orig_jiffies + timeout - jiffies;
1467			if (exit_time <= 0)
1468				break;
1469			if (exit_time < check_time)
1470				check_time = exit_time;
1471		}
1472		if (check_time == 0)
1473			check_time = 1;
1474#ifdef ROCKET_DEBUG_WAIT_UNTIL_SENT
1475		printk(KERN_INFO "txcnt = %d (jiff=%lu,check=%d)...\n", txcnt,
1476				jiffies, check_time);
1477#endif
1478		msleep_interruptible(jiffies_to_msecs(check_time));
1479		if (signal_pending(current))
1480			break;
1481	}
1482	__set_current_state(TASK_RUNNING);
1483#ifdef ROCKET_DEBUG_WAIT_UNTIL_SENT
1484	printk(KERN_INFO "txcnt = %d (jiff=%lu)...done\n", txcnt, jiffies);
1485#endif
1486}
1487
1488/*
1489 * rp_hangup() --- called by tty_hangup() when a hangup is signaled.
1490 */
1491static void rp_hangup(struct tty_struct *tty)
1492{
1493	CHANNEL_t *cp;
1494	struct r_port *info = tty->driver_data;
1495	unsigned long flags;
1496
1497	if (rocket_paranoia_check(info, "rp_hangup"))
1498		return;
1499
1500#if (defined(ROCKET_DEBUG_OPEN) || defined(ROCKET_DEBUG_HANGUP))
1501	printk(KERN_INFO "rp_hangup of ttyR%d...\n", info->line);
1502#endif
1503	rp_flush_buffer(tty);
1504	spin_lock_irqsave(&info->port.lock, flags);
1505	if (info->port.count)
1506		atomic_dec(&rp_num_ports_open);
1507	clear_bit((info->aiop * 8) + info->chan, (void *) &xmit_flags[info->board]);
1508	spin_unlock_irqrestore(&info->port.lock, flags);
1509
1510	tty_port_hangup(&info->port);
1511
1512	cp = &info->channel;
1513	sDisRxFIFO(cp);
1514	sDisTransmit(cp);
1515	sDisInterrupts(cp, (TXINT_EN | MCINT_EN | RXINT_EN | SRCINT_EN | CHANINT_EN));
1516	sDisCTSFlowCtl(cp);
1517	sDisTxSoftFlowCtl(cp);
1518	sClrTxXOFF(cp);
1519	clear_bit(ASYNCB_INITIALIZED, &info->port.flags);
1520
1521	wake_up_interruptible(&info->port.open_wait);
1522}
1523
1524/*
1525 *  Exception handler - write char routine.  The RocketPort driver uses a
1526 *  double-buffering strategy, with the twist that if the in-memory CPU
1527 *  buffer is empty, and there's space in the transmit FIFO, the
1528 *  writing routines will write directly to transmit FIFO.
1529 *  Write buffer and counters protected by spinlocks
1530 */
1531static int rp_put_char(struct tty_struct *tty, unsigned char ch)
1532{
1533	struct r_port *info = tty->driver_data;
1534	CHANNEL_t *cp;
1535	unsigned long flags;
1536
1537	if (rocket_paranoia_check(info, "rp_put_char"))
1538		return 0;
1539
1540	/*
1541	 * Grab the port write mutex, locking out other processes that try to
1542	 * write to this port
1543	 */
1544	mutex_lock(&info->write_mtx);
1545
1546#ifdef ROCKET_DEBUG_WRITE
1547	printk(KERN_INFO "rp_put_char %c...\n", ch);
1548#endif
1549
1550	spin_lock_irqsave(&info->slock, flags);
1551	cp = &info->channel;
1552
1553	if (!tty->stopped && info->xmit_fifo_room == 0)
1554		info->xmit_fifo_room = TXFIFO_SIZE - sGetTxCnt(cp);
1555
1556	if (tty->stopped || info->xmit_fifo_room == 0 || info->xmit_cnt != 0) {
1557		info->xmit_buf[info->xmit_head++] = ch;
1558		info->xmit_head &= XMIT_BUF_SIZE - 1;
1559		info->xmit_cnt++;
1560		set_bit((info->aiop * 8) + info->chan, (void *) &xmit_flags[info->board]);
1561	} else {
1562		sOutB(sGetTxRxDataIO(cp), ch);
1563		info->xmit_fifo_room--;
1564	}
1565	spin_unlock_irqrestore(&info->slock, flags);
1566	mutex_unlock(&info->write_mtx);
1567	return 1;
1568}
1569
1570/*
1571 *  Exception handler - write routine, called when user app writes to the device.
1572 *  A per port write mutex is used to protect from another process writing to
1573 *  this port at the same time.  This other process could be running on the other CPU
1574 *  or get control of the CPU if the copy_from_user() blocks due to a page fault (swapped out).
1575 *  Spinlocks protect the info xmit members.
1576 */
1577static int rp_write(struct tty_struct *tty,
1578		    const unsigned char *buf, int count)
1579{
1580	struct r_port *info = tty->driver_data;
1581	CHANNEL_t *cp;
1582	const unsigned char *b;
1583	int c, retval = 0;
1584	unsigned long flags;
1585
1586	if (count <= 0 || rocket_paranoia_check(info, "rp_write"))
1587		return 0;
1588
1589	if (mutex_lock_interruptible(&info->write_mtx))
1590		return -ERESTARTSYS;
1591
1592#ifdef ROCKET_DEBUG_WRITE
1593	printk(KERN_INFO "rp_write %d chars...\n", count);
1594#endif
1595	cp = &info->channel;
1596
1597	if (!tty->stopped && info->xmit_fifo_room < count)
1598		info->xmit_fifo_room = TXFIFO_SIZE - sGetTxCnt(cp);
1599
1600        /*
1601	 *  If the write queue for the port is empty, and there is FIFO space, stuff bytes
1602	 *  into FIFO.  Use the write queue for temp storage.
1603         */
1604	if (!tty->stopped && info->xmit_cnt == 0 && info->xmit_fifo_room > 0) {
1605		c = min(count, info->xmit_fifo_room);
1606		b = buf;
1607
1608		/*  Push data into FIFO, 2 bytes at a time */
1609		sOutStrW(sGetTxRxDataIO(cp), (unsigned short *) b, c / 2);
1610
1611		/*  If there is a byte remaining, write it */
1612		if (c & 1)
1613			sOutB(sGetTxRxDataIO(cp), b[c - 1]);
1614
1615		retval += c;
1616		buf += c;
1617		count -= c;
1618
1619		spin_lock_irqsave(&info->slock, flags);
1620		info->xmit_fifo_room -= c;
1621		spin_unlock_irqrestore(&info->slock, flags);
1622	}
1623
1624	/* If count is zero, we wrote it all and are done */
1625	if (!count)
1626		goto end;
1627
1628	/*  Write remaining data into the port's xmit_buf */
1629	while (1) {
1630		/* Hung up ? */
1631		if (!test_bit(ASYNCB_NORMAL_ACTIVE, &info->port.flags))
1632			goto end;
1633		c = min(count, XMIT_BUF_SIZE - info->xmit_cnt - 1);
1634		c = min(c, XMIT_BUF_SIZE - info->xmit_head);
1635		if (c <= 0)
1636			break;
1637
1638		b = buf;
1639		memcpy(info->xmit_buf + info->xmit_head, b, c);
1640
1641		spin_lock_irqsave(&info->slock, flags);
1642		info->xmit_head =
1643		    (info->xmit_head + c) & (XMIT_BUF_SIZE - 1);
1644		info->xmit_cnt += c;
1645		spin_unlock_irqrestore(&info->slock, flags);
1646
1647		buf += c;
1648		count -= c;
1649		retval += c;
1650	}
1651
1652	if ((retval > 0) && !tty->stopped)
1653		set_bit((info->aiop * 8) + info->chan, (void *) &xmit_flags[info->board]);
1654
1655end:
1656 	if (info->xmit_cnt < WAKEUP_CHARS) {
1657 		tty_wakeup(tty);
1658#ifdef ROCKETPORT_HAVE_POLL_WAIT
1659		wake_up_interruptible(&tty->poll_wait);
1660#endif
1661	}
1662	mutex_unlock(&info->write_mtx);
1663	return retval;
1664}
1665
1666/*
1667 * Return the number of characters that can be sent.  We estimate
1668 * only using the in-memory transmit buffer only, and ignore the
1669 * potential space in the transmit FIFO.
1670 */
1671static int rp_write_room(struct tty_struct *tty)
1672{
1673	struct r_port *info = tty->driver_data;
1674	int ret;
1675
1676	if (rocket_paranoia_check(info, "rp_write_room"))
1677		return 0;
1678
1679	ret = XMIT_BUF_SIZE - info->xmit_cnt - 1;
1680	if (ret < 0)
1681		ret = 0;
1682#ifdef ROCKET_DEBUG_WRITE
1683	printk(KERN_INFO "rp_write_room returns %d...\n", ret);
1684#endif
1685	return ret;
1686}
1687
1688/*
1689 * Return the number of characters in the buffer.  Again, this only
1690 * counts those characters in the in-memory transmit buffer.
1691 */
1692static int rp_chars_in_buffer(struct tty_struct *tty)
1693{
1694	struct r_port *info = tty->driver_data;
1695
1696	if (rocket_paranoia_check(info, "rp_chars_in_buffer"))
1697		return 0;
1698
1699#ifdef ROCKET_DEBUG_WRITE
1700	printk(KERN_INFO "rp_chars_in_buffer returns %d...\n", info->xmit_cnt);
1701#endif
1702	return info->xmit_cnt;
1703}
1704
1705/*
1706 *  Flushes the TX fifo for a port, deletes data in the xmit_buf stored in the
1707 *  r_port struct for the port.  Note that spinlock are used to protect info members,
1708 *  do not call this function if the spinlock is already held.
1709 */
1710static void rp_flush_buffer(struct tty_struct *tty)
1711{
1712	struct r_port *info = tty->driver_data;
1713	CHANNEL_t *cp;
1714	unsigned long flags;
1715
1716	if (rocket_paranoia_check(info, "rp_flush_buffer"))
1717		return;
1718
1719	spin_lock_irqsave(&info->slock, flags);
1720	info->xmit_cnt = info->xmit_head = info->xmit_tail = 0;
1721	spin_unlock_irqrestore(&info->slock, flags);
1722
1723#ifdef ROCKETPORT_HAVE_POLL_WAIT
1724	wake_up_interruptible(&tty->poll_wait);
1725#endif
1726	tty_wakeup(tty);
1727
1728	cp = &info->channel;
1729	sFlushTxFIFO(cp);
1730}
1731
1732#ifdef CONFIG_PCI
1733
1734static const struct pci_device_id rocket_pci_ids[] = {
1735	{ PCI_DEVICE(PCI_VENDOR_ID_RP, PCI_DEVICE_ID_RP4QUAD) },
1736	{ PCI_DEVICE(PCI_VENDOR_ID_RP, PCI_DEVICE_ID_RP8OCTA) },
1737	{ PCI_DEVICE(PCI_VENDOR_ID_RP, PCI_DEVICE_ID_URP8OCTA) },
1738	{ PCI_DEVICE(PCI_VENDOR_ID_RP, PCI_DEVICE_ID_RP8INTF) },
1739	{ PCI_DEVICE(PCI_VENDOR_ID_RP, PCI_DEVICE_ID_URP8INTF) },
1740	{ PCI_DEVICE(PCI_VENDOR_ID_RP, PCI_DEVICE_ID_RP8J) },
1741	{ PCI_DEVICE(PCI_VENDOR_ID_RP, PCI_DEVICE_ID_RP4J) },
1742	{ PCI_DEVICE(PCI_VENDOR_ID_RP, PCI_DEVICE_ID_RP8SNI) },
1743	{ PCI_DEVICE(PCI_VENDOR_ID_RP, PCI_DEVICE_ID_RP16SNI) },
1744	{ PCI_DEVICE(PCI_VENDOR_ID_RP, PCI_DEVICE_ID_RP16INTF) },
1745	{ PCI_DEVICE(PCI_VENDOR_ID_RP, PCI_DEVICE_ID_URP16INTF) },
1746	{ PCI_DEVICE(PCI_VENDOR_ID_RP, PCI_DEVICE_ID_CRP16INTF) },
1747	{ PCI_DEVICE(PCI_VENDOR_ID_RP, PCI_DEVICE_ID_RP32INTF) },
1748	{ PCI_DEVICE(PCI_VENDOR_ID_RP, PCI_DEVICE_ID_URP32INTF) },
1749	{ PCI_DEVICE(PCI_VENDOR_ID_RP, PCI_DEVICE_ID_RPP4) },
1750	{ PCI_DEVICE(PCI_VENDOR_ID_RP, PCI_DEVICE_ID_RPP8) },
1751	{ PCI_DEVICE(PCI_VENDOR_ID_RP, PCI_DEVICE_ID_RP2_232) },
1752	{ PCI_DEVICE(PCI_VENDOR_ID_RP, PCI_DEVICE_ID_RP2_422) },
1753	{ PCI_DEVICE(PCI_VENDOR_ID_RP, PCI_DEVICE_ID_RP6M) },
1754	{ PCI_DEVICE(PCI_VENDOR_ID_RP, PCI_DEVICE_ID_RP4M) },
1755	{ PCI_DEVICE(PCI_VENDOR_ID_RP, PCI_DEVICE_ID_UPCI_RM3_8PORT) },
1756	{ PCI_DEVICE(PCI_VENDOR_ID_RP, PCI_DEVICE_ID_UPCI_RM3_4PORT) },
1757	{ }
1758};
1759MODULE_DEVICE_TABLE(pci, rocket_pci_ids);
1760
1761/*  Resets the speaker controller on RocketModem II and III devices */
1762static void rmSpeakerReset(CONTROLLER_T * CtlP, unsigned long model)
1763{
1764	ByteIO_t addr;
1765
1766	/* RocketModem II speaker control is at the 8th port location of offset 0x40 */
1767	if ((model == MODEL_RP4M) || (model == MODEL_RP6M)) {
1768		addr = CtlP->AiopIO[0] + 0x4F;
1769		sOutB(addr, 0);
1770	}
1771
1772	/* RocketModem III speaker control is at the 1st port location of offset 0x80 */
1773	if ((model == MODEL_UPCI_RM3_8PORT)
1774	    || (model == MODEL_UPCI_RM3_4PORT)) {
1775		addr = CtlP->AiopIO[0] + 0x88;
1776		sOutB(addr, 0);
1777	}
1778}
1779
1780/***************************************************************************
1781Function: sPCIInitController
1782Purpose:  Initialization of controller global registers and controller
1783          structure.
1784Call:     sPCIInitController(CtlP,CtlNum,AiopIOList,AiopIOListSize,
1785                          IRQNum,Frequency,PeriodicOnly)
1786          CONTROLLER_T *CtlP; Ptr to controller structure
1787          int CtlNum; Controller number
1788          ByteIO_t *AiopIOList; List of I/O addresses for each AIOP.
1789             This list must be in the order the AIOPs will be found on the
1790             controller.  Once an AIOP in the list is not found, it is
1791             assumed that there are no more AIOPs on the controller.
1792          int AiopIOListSize; Number of addresses in AiopIOList
1793          int IRQNum; Interrupt Request number.  Can be any of the following:
1794                         0: Disable global interrupts
1795                         3: IRQ 3
1796                         4: IRQ 4
1797                         5: IRQ 5
1798                         9: IRQ 9
1799                         10: IRQ 10
1800                         11: IRQ 11
1801                         12: IRQ 12
1802                         15: IRQ 15
1803          Byte_t Frequency: A flag identifying the frequency
1804                   of the periodic interrupt, can be any one of the following:
1805                      FREQ_DIS - periodic interrupt disabled
1806                      FREQ_137HZ - 137 Hertz
1807                      FREQ_69HZ - 69 Hertz
1808                      FREQ_34HZ - 34 Hertz
1809                      FREQ_17HZ - 17 Hertz
1810                      FREQ_9HZ - 9 Hertz
1811                      FREQ_4HZ - 4 Hertz
1812                   If IRQNum is set to 0 the Frequency parameter is
1813                   overidden, it is forced to a value of FREQ_DIS.
1814          int PeriodicOnly: 1 if all interrupts except the periodic
1815                               interrupt are to be blocked.
1816                            0 is both the periodic interrupt and
1817                               other channel interrupts are allowed.
1818                            If IRQNum is set to 0 the PeriodicOnly parameter is
1819                               overidden, it is forced to a value of 0.
1820Return:   int: Number of AIOPs on the controller, or CTLID_NULL if controller
1821               initialization failed.
1822
1823Comments:
1824          If periodic interrupts are to be disabled but AIOP interrupts
1825          are allowed, set Frequency to FREQ_DIS and PeriodicOnly to 0.
1826
1827          If interrupts are to be completely disabled set IRQNum to 0.
1828
1829          Setting Frequency to FREQ_DIS and PeriodicOnly to 1 is an
1830          invalid combination.
1831
1832          This function performs initialization of global interrupt modes,
1833          but it does not actually enable global interrupts.  To enable
1834          and disable global interrupts use functions sEnGlobalInt() and
1835          sDisGlobalInt().  Enabling of global interrupts is normally not
1836          done until all other initializations are complete.
1837
1838          Even if interrupts are globally enabled, they must also be
1839          individually enabled for each channel that is to generate
1840          interrupts.
1841
1842Warnings: No range checking on any of the parameters is done.
1843
1844          No context switches are allowed while executing this function.
1845
1846          After this function all AIOPs on the controller are disabled,
1847          they can be enabled with sEnAiop().
1848*/
1849static int sPCIInitController(CONTROLLER_T * CtlP, int CtlNum,
1850			      ByteIO_t * AiopIOList, int AiopIOListSize,
1851			      WordIO_t ConfigIO, int IRQNum, Byte_t Frequency,
1852			      int PeriodicOnly, int altChanRingIndicator,
1853			      int UPCIRingInd)
1854{
1855	int i;
1856	ByteIO_t io;
1857
1858	CtlP->AltChanRingIndicator = altChanRingIndicator;
1859	CtlP->UPCIRingInd = UPCIRingInd;
1860	CtlP->CtlNum = CtlNum;
1861	CtlP->CtlID = CTLID_0001;	/* controller release 1 */
1862	CtlP->BusType = isPCI;	/* controller release 1 */
1863
1864	if (ConfigIO) {
1865		CtlP->isUPCI = 1;
1866		CtlP->PCIIO = ConfigIO + _PCI_9030_INT_CTRL;
1867		CtlP->PCIIO2 = ConfigIO + _PCI_9030_GPIO_CTRL;
1868		CtlP->AiopIntrBits = upci_aiop_intr_bits;
1869	} else {
1870		CtlP->isUPCI = 0;
1871		CtlP->PCIIO =
1872		    (WordIO_t) ((ByteIO_t) AiopIOList[0] + _PCI_INT_FUNC);
1873		CtlP->AiopIntrBits = aiop_intr_bits;
1874	}
1875
1876	sPCIControllerEOI(CtlP);	/* clear EOI if warm init */
1877	/* Init AIOPs */
1878	CtlP->NumAiop = 0;
1879	for (i = 0; i < AiopIOListSize; i++) {
1880		io = AiopIOList[i];
1881		CtlP->AiopIO[i] = (WordIO_t) io;
1882		CtlP->AiopIntChanIO[i] = io + _INT_CHAN;
1883
1884		CtlP->AiopID[i] = sReadAiopID(io);	/* read AIOP ID */
1885		if (CtlP->AiopID[i] == AIOPID_NULL)	/* if AIOP does not exist */
1886			break;	/* done looking for AIOPs */
1887
1888		CtlP->AiopNumChan[i] = sReadAiopNumChan((WordIO_t) io);	/* num channels in AIOP */
1889		sOutW((WordIO_t) io + _INDX_ADDR, _CLK_PRE);	/* clock prescaler */
1890		sOutB(io + _INDX_DATA, sClockPrescale);
1891		CtlP->NumAiop++;	/* bump count of AIOPs */
1892	}
1893
1894	if (CtlP->NumAiop == 0)
1895		return (-1);
1896	else
1897		return (CtlP->NumAiop);
1898}
1899
1900/*
1901 *  Called when a PCI card is found.  Retrieves and stores model information,
1902 *  init's aiopic and serial port hardware.
1903 *  Inputs:  i is the board number (0-n)
1904 */
1905static __init int register_PCI(int i, struct pci_dev *dev)
1906{
1907	int num_aiops, aiop, max_num_aiops, num_chan, chan;
1908	unsigned int aiopio[MAX_AIOPS_PER_BOARD];
1909	CONTROLLER_t *ctlp;
1910
1911	int fast_clock = 0;
1912	int altChanRingIndicator = 0;
1913	int ports_per_aiop = 8;
1914	WordIO_t ConfigIO = 0;
1915	ByteIO_t UPCIRingInd = 0;
1916
1917	if (!dev || !pci_match_id(rocket_pci_ids, dev) ||
1918	    pci_enable_device(dev))
1919		return 0;
1920
1921	rcktpt_io_addr[i] = pci_resource_start(dev, 0);
1922
1923	rcktpt_type[i] = ROCKET_TYPE_NORMAL;
1924	rocketModel[i].loadrm2 = 0;
1925	rocketModel[i].startingPortNumber = nextLineNumber;
1926
1927	/*  Depending on the model, set up some config variables */
1928	switch (dev->device) {
1929	case PCI_DEVICE_ID_RP4QUAD:
1930		max_num_aiops = 1;
1931		ports_per_aiop = 4;
1932		rocketModel[i].model = MODEL_RP4QUAD;
1933		strcpy(rocketModel[i].modelString, "RocketPort 4 port w/quad cable");
1934		rocketModel[i].numPorts = 4;
1935		break;
1936	case PCI_DEVICE_ID_RP8OCTA:
1937		max_num_aiops = 1;
1938		rocketModel[i].model = MODEL_RP8OCTA;
1939		strcpy(rocketModel[i].modelString, "RocketPort 8 port w/octa cable");
1940		rocketModel[i].numPorts = 8;
1941		break;
1942	case PCI_DEVICE_ID_URP8OCTA:
1943		max_num_aiops = 1;
1944		rocketModel[i].model = MODEL_UPCI_RP8OCTA;
1945		strcpy(rocketModel[i].modelString, "RocketPort UPCI 8 port w/octa cable");
1946		rocketModel[i].numPorts = 8;
1947		break;
1948	case PCI_DEVICE_ID_RP8INTF:
1949		max_num_aiops = 1;
1950		rocketModel[i].model = MODEL_RP8INTF;
1951		strcpy(rocketModel[i].modelString, "RocketPort 8 port w/external I/F");
1952		rocketModel[i].numPorts = 8;
1953		break;
1954	case PCI_DEVICE_ID_URP8INTF:
1955		max_num_aiops = 1;
1956		rocketModel[i].model = MODEL_UPCI_RP8INTF;
1957		strcpy(rocketModel[i].modelString, "RocketPort UPCI 8 port w/external I/F");
1958		rocketModel[i].numPorts = 8;
1959		break;
1960	case PCI_DEVICE_ID_RP8J:
1961		max_num_aiops = 1;
1962		rocketModel[i].model = MODEL_RP8J;
1963		strcpy(rocketModel[i].modelString, "RocketPort 8 port w/RJ11 connectors");
1964		rocketModel[i].numPorts = 8;
1965		break;
1966	case PCI_DEVICE_ID_RP4J:
1967		max_num_aiops = 1;
1968		ports_per_aiop = 4;
1969		rocketModel[i].model = MODEL_RP4J;
1970		strcpy(rocketModel[i].modelString, "RocketPort 4 port w/RJ45 connectors");
1971		rocketModel[i].numPorts = 4;
1972		break;
1973	case PCI_DEVICE_ID_RP8SNI:
1974		max_num_aiops = 1;
1975		rocketModel[i].model = MODEL_RP8SNI;
1976		strcpy(rocketModel[i].modelString, "RocketPort 8 port w/ custom DB78");
1977		rocketModel[i].numPorts = 8;
1978		break;
1979	case PCI_DEVICE_ID_RP16SNI:
1980		max_num_aiops = 2;
1981		rocketModel[i].model = MODEL_RP16SNI;
1982		strcpy(rocketModel[i].modelString, "RocketPort 16 port w/ custom DB78");
1983		rocketModel[i].numPorts = 16;
1984		break;
1985	case PCI_DEVICE_ID_RP16INTF:
1986		max_num_aiops = 2;
1987		rocketModel[i].model = MODEL_RP16INTF;
1988		strcpy(rocketModel[i].modelString, "RocketPort 16 port w/external I/F");
1989		rocketModel[i].numPorts = 16;
1990		break;
1991	case PCI_DEVICE_ID_URP16INTF:
1992		max_num_aiops = 2;
1993		rocketModel[i].model = MODEL_UPCI_RP16INTF;
1994		strcpy(rocketModel[i].modelString, "RocketPort UPCI 16 port w/external I/F");
1995		rocketModel[i].numPorts = 16;
1996		break;
1997	case PCI_DEVICE_ID_CRP16INTF:
1998		max_num_aiops = 2;
1999		rocketModel[i].model = MODEL_CPCI_RP16INTF;
2000		strcpy(rocketModel[i].modelString, "RocketPort Compact PCI 16 port w/external I/F");
2001		rocketModel[i].numPorts = 16;
2002		break;
2003	case PCI_DEVICE_ID_RP32INTF:
2004		max_num_aiops = 4;
2005		rocketModel[i].model = MODEL_RP32INTF;
2006		strcpy(rocketModel[i].modelString, "RocketPort 32 port w/external I/F");
2007		rocketModel[i].numPorts = 32;
2008		break;
2009	case PCI_DEVICE_ID_URP32INTF:
2010		max_num_aiops = 4;
2011		rocketModel[i].model = MODEL_UPCI_RP32INTF;
2012		strcpy(rocketModel[i].modelString, "RocketPort UPCI 32 port w/external I/F");
2013		rocketModel[i].numPorts = 32;
2014		break;
2015	case PCI_DEVICE_ID_RPP4:
2016		max_num_aiops = 1;
2017		ports_per_aiop = 4;
2018		altChanRingIndicator++;
2019		fast_clock++;
2020		rocketModel[i].model = MODEL_RPP4;
2021		strcpy(rocketModel[i].modelString, "RocketPort Plus 4 port");
2022		rocketModel[i].numPorts = 4;
2023		break;
2024	case PCI_DEVICE_ID_RPP8:
2025		max_num_aiops = 2;
2026		ports_per_aiop = 4;
2027		altChanRingIndicator++;
2028		fast_clock++;
2029		rocketModel[i].model = MODEL_RPP8;
2030		strcpy(rocketModel[i].modelString, "RocketPort Plus 8 port");
2031		rocketModel[i].numPorts = 8;
2032		break;
2033	case PCI_DEVICE_ID_RP2_232:
2034		max_num_aiops = 1;
2035		ports_per_aiop = 2;
2036		altChanRingIndicator++;
2037		fast_clock++;
2038		rocketModel[i].model = MODEL_RP2_232;
2039		strcpy(rocketModel[i].modelString, "RocketPort Plus 2 port RS232");
2040		rocketModel[i].numPorts = 2;
2041		break;
2042	case PCI_DEVICE_ID_RP2_422:
2043		max_num_aiops = 1;
2044		ports_per_aiop = 2;
2045		altChanRingIndicator++;
2046		fast_clock++;
2047		rocketModel[i].model = MODEL_RP2_422;
2048		strcpy(rocketModel[i].modelString, "RocketPort Plus 2 port RS422");
2049		rocketModel[i].numPorts = 2;
2050		break;
2051	case PCI_DEVICE_ID_RP6M:
2052
2053		max_num_aiops = 1;
2054		ports_per_aiop = 6;
2055
2056		/*  If revision is 1, the rocketmodem flash must be loaded.
2057		 *  If it is 2 it is a "socketed" version. */
2058		if (dev->revision == 1) {
2059			rcktpt_type[i] = ROCKET_TYPE_MODEMII;
2060			rocketModel[i].loadrm2 = 1;
2061		} else {
2062			rcktpt_type[i] = ROCKET_TYPE_MODEM;
2063		}
2064
2065		rocketModel[i].model = MODEL_RP6M;
2066		strcpy(rocketModel[i].modelString, "RocketModem 6 port");
2067		rocketModel[i].numPorts = 6;
2068		break;
2069	case PCI_DEVICE_ID_RP4M:
2070		max_num_aiops = 1;
2071		ports_per_aiop = 4;
2072		if (dev->revision == 1) {
2073			rcktpt_type[i] = ROCKET_TYPE_MODEMII;
2074			rocketModel[i].loadrm2 = 1;
2075		} else {
2076			rcktpt_type[i] = ROCKET_TYPE_MODEM;
2077		}
2078
2079		rocketModel[i].model = MODEL_RP4M;
2080		strcpy(rocketModel[i].modelString, "RocketModem 4 port");
2081		rocketModel[i].numPorts = 4;
2082		break;
2083	default:
2084		max_num_aiops = 0;
2085		break;
2086	}
2087
2088	/*
2089	 * Check for UPCI boards.
2090	 */
2091
2092	switch (dev->device) {
2093	case PCI_DEVICE_ID_URP32INTF:
2094	case PCI_DEVICE_ID_URP8INTF:
2095	case PCI_DEVICE_ID_URP16INTF:
2096	case PCI_DEVICE_ID_CRP16INTF:
2097	case PCI_DEVICE_ID_URP8OCTA:
2098		rcktpt_io_addr[i] = pci_resource_start(dev, 2);
2099		ConfigIO = pci_resource_start(dev, 1);
2100		if (dev->device == PCI_DEVICE_ID_URP8OCTA) {
2101			UPCIRingInd = rcktpt_io_addr[i] + _PCI_9030_RING_IND;
2102
2103			/*
2104			 * Check for octa or quad cable.
2105			 */
2106			if (!
2107			    (sInW(ConfigIO + _PCI_9030_GPIO_CTRL) &
2108			     PCI_GPIO_CTRL_8PORT)) {
2109				ports_per_aiop = 4;
2110				rocketModel[i].numPorts = 4;
2111			}
2112		}
2113		break;
2114	case PCI_DEVICE_ID_UPCI_RM3_8PORT:
2115		max_num_aiops = 1;
2116		rocketModel[i].model = MODEL_UPCI_RM3_8PORT;
2117		strcpy(rocketModel[i].modelString, "RocketModem III 8 port");
2118		rocketModel[i].numPorts = 8;
2119		rcktpt_io_addr[i] = pci_resource_start(dev, 2);
2120		UPCIRingInd = rcktpt_io_addr[i] + _PCI_9030_RING_IND;
2121		ConfigIO = pci_resource_start(dev, 1);
2122		rcktpt_type[i] = ROCKET_TYPE_MODEMIII;
2123		break;
2124	case PCI_DEVICE_ID_UPCI_RM3_4PORT:
2125		max_num_aiops = 1;
2126		rocketModel[i].model = MODEL_UPCI_RM3_4PORT;
2127		strcpy(rocketModel[i].modelString, "RocketModem III 4 port");
2128		rocketModel[i].numPorts = 4;
2129		rcktpt_io_addr[i] = pci_resource_start(dev, 2);
2130		UPCIRingInd = rcktpt_io_addr[i] + _PCI_9030_RING_IND;
2131		ConfigIO = pci_resource_start(dev, 1);
2132		rcktpt_type[i] = ROCKET_TYPE_MODEMIII;
2133		break;
2134	default:
2135		break;
2136	}
2137
2138	if (fast_clock) {
2139		sClockPrescale = 0x12;	/* mod 2 (divide by 3) */
2140		rp_baud_base[i] = 921600;
2141	} else {
2142		/*
2143		 * If support_low_speed is set, use the slow clock
2144		 * prescale, which supports 50 bps
2145		 */
2146		if (support_low_speed) {
2147			/* mod 9 (divide by 10) prescale */
2148			sClockPrescale = 0x19;
2149			rp_baud_base[i] = 230400;
2150		} else {
2151			/* mod 4 (divide by 5) prescale */
2152			sClockPrescale = 0x14;
2153			rp_baud_base[i] = 460800;
2154		}
2155	}
2156
2157	for (aiop = 0; aiop < max_num_aiops; aiop++)
2158		aiopio[aiop] = rcktpt_io_addr[i] + (aiop * 0x40);
2159	ctlp = sCtlNumToCtlPtr(i);
2160	num_aiops = sPCIInitController(ctlp, i, aiopio, max_num_aiops, ConfigIO, 0, FREQ_DIS, 0, altChanRingIndicator, UPCIRingInd);
2161	for (aiop = 0; aiop < max_num_aiops; aiop++)
2162		ctlp->AiopNumChan[aiop] = ports_per_aiop;
2163
2164	dev_info(&dev->dev, "comtrol PCI controller #%d found at "
2165		"address %04lx, %d AIOP(s) (%s), creating ttyR%d - %ld\n",
2166		i, rcktpt_io_addr[i], num_aiops, rocketModel[i].modelString,
2167		rocketModel[i].startingPortNumber,
2168		rocketModel[i].startingPortNumber + rocketModel[i].numPorts-1);
2169
2170	if (num_aiops <= 0) {
2171		rcktpt_io_addr[i] = 0;
2172		return (0);
2173	}
2174	is_PCI[i] = 1;
2175
2176	/*  Reset the AIOPIC, init the serial ports */
2177	for (aiop = 0; aiop < num_aiops; aiop++) {
2178		sResetAiopByNum(ctlp, aiop);
2179		num_chan = ports_per_aiop;
2180		for (chan = 0; chan < num_chan; chan++)
2181			init_r_port(i, aiop, chan, dev);
2182	}
2183
2184	/*  Rocket modems must be reset */
2185	if ((rcktpt_type[i] == ROCKET_TYPE_MODEM) ||
2186	    (rcktpt_type[i] == ROCKET_TYPE_MODEMII) ||
2187	    (rcktpt_type[i] == ROCKET_TYPE_MODEMIII)) {
2188		num_chan = ports_per_aiop;
2189		for (chan = 0; chan < num_chan; chan++)
2190			sPCIModemReset(ctlp, chan, 1);
2191		msleep(500);
2192		for (chan = 0; chan < num_chan; chan++)
2193			sPCIModemReset(ctlp, chan, 0);
2194		msleep(500);
2195		rmSpeakerReset(ctlp, rocketModel[i].model);
2196	}
2197	return (1);
2198}
2199
2200/*
2201 *  Probes for PCI cards, inits them if found
2202 *  Input:   board_found = number of ISA boards already found, or the
2203 *           starting board number
2204 *  Returns: Number of PCI boards found
2205 */
2206static int __init init_PCI(int boards_found)
2207{
2208	struct pci_dev *dev = NULL;
2209	int count = 0;
2210
2211	/*  Work through the PCI device list, pulling out ours */
2212	while ((dev = pci_get_device(PCI_VENDOR_ID_RP, PCI_ANY_ID, dev))) {
2213		if (register_PCI(count + boards_found, dev))
2214			count++;
2215	}
2216	return (count);
2217}
2218
2219#endif				/* CONFIG_PCI */
2220
2221/*
2222 *  Probes for ISA cards
2223 *  Input:   i = the board number to look for
2224 *  Returns: 1 if board found, 0 else
2225 */
2226static int __init init_ISA(int i)
2227{
2228	int num_aiops, num_chan = 0, total_num_chan = 0;
2229	int aiop, chan;
2230	unsigned int aiopio[MAX_AIOPS_PER_BOARD];
2231	CONTROLLER_t *ctlp;
2232	char *type_string;
2233
2234	/*  If io_addr is zero, no board configured */
2235	if (rcktpt_io_addr[i] == 0)
2236		return (0);
2237
2238	/*  Reserve the IO region */
2239	if (!request_region(rcktpt_io_addr[i], 64, "Comtrol RocketPort")) {
2240		printk(KERN_ERR "Unable to reserve IO region for configured "
2241				"ISA RocketPort at address 0x%lx, board not "
2242				"installed...\n", rcktpt_io_addr[i]);
2243		rcktpt_io_addr[i] = 0;
2244		return (0);
2245	}
2246
2247	ctlp = sCtlNumToCtlPtr(i);
2248
2249	ctlp->boardType = rcktpt_type[i];
2250
2251	switch (rcktpt_type[i]) {
2252	case ROCKET_TYPE_PC104:
2253		type_string = "(PC104)";
2254		break;
2255	case ROCKET_TYPE_MODEM:
2256		type_string = "(RocketModem)";
2257		break;
2258	case ROCKET_TYPE_MODEMII:
2259		type_string = "(RocketModem II)";
2260		break;
2261	default:
2262		type_string = "";
2263		break;
2264	}
2265
2266	/*
2267	 * If support_low_speed is set, use the slow clock prescale,
2268	 * which supports 50 bps
2269	 */
2270	if (support_low_speed) {
2271		sClockPrescale = 0x19;	/* mod 9 (divide by 10) prescale */
2272		rp_baud_base[i] = 230400;
2273	} else {
2274		sClockPrescale = 0x14;	/* mod 4 (divide by 5) prescale */
2275		rp_baud_base[i] = 460800;
2276	}
2277
2278	for (aiop = 0; aiop < MAX_AIOPS_PER_BOARD; aiop++)
2279		aiopio[aiop] = rcktpt_io_addr[i] + (aiop * 0x400);
2280
2281	num_aiops = sInitController(ctlp, i, controller + (i * 0x400), aiopio,  MAX_AIOPS_PER_BOARD, 0, FREQ_DIS, 0);
2282
2283	if (ctlp->boardType == ROCKET_TYPE_PC104) {
2284		sEnAiop(ctlp, 2);	/* only one AIOPIC, but these */
2285		sEnAiop(ctlp, 3);	/* CSels used for other stuff */
2286	}
2287
2288	/*  If something went wrong initing the AIOP's release the ISA IO memory */
2289	if (num_aiops <= 0) {
2290		release_region(rcktpt_io_addr[i], 64);
2291		rcktpt_io_addr[i] = 0;
2292		return (0);
2293	}
2294
2295	rocketModel[i].startingPortNumber = nextLineNumber;
2296
2297	for (aiop = 0; aiop < num_aiops; aiop++) {
2298		sResetAiopByNum(ctlp, aiop);
2299		sEnAiop(ctlp, aiop);
2300		num_chan = sGetAiopNumChan(ctlp, aiop);
2301		total_num_chan += num_chan;
2302		for (chan = 0; chan < num_chan; chan++)
2303			init_r_port(i, aiop, chan, NULL);
2304	}
2305	is_PCI[i] = 0;
2306	if ((rcktpt_type[i] == ROCKET_TYPE_MODEM) || (rcktpt_type[i] == ROCKET_TYPE_MODEMII)) {
2307		num_chan = sGetAiopNumChan(ctlp, 0);
2308		total_num_chan = num_chan;
2309		for (chan = 0; chan < num_chan; chan++)
2310			sModemReset(ctlp, chan, 1);
2311		msleep(500);
2312		for (chan = 0; chan < num_chan; chan++)
2313			sModemReset(ctlp, chan, 0);
2314		msleep(500);
2315		strcpy(rocketModel[i].modelString, "RocketModem ISA");
2316	} else {
2317		strcpy(rocketModel[i].modelString, "RocketPort ISA");
2318	}
2319	rocketModel[i].numPorts = total_num_chan;
2320	rocketModel[i].model = MODEL_ISA;
2321
2322	printk(KERN_INFO "RocketPort ISA card #%d found at 0x%lx - %d AIOPs %s\n",
2323	       i, rcktpt_io_addr[i], num_aiops, type_string);
2324
2325	printk(KERN_INFO "Installing %s, creating /dev/ttyR%d - %ld\n",
2326	       rocketModel[i].modelString,
2327	       rocketModel[i].startingPortNumber,
2328	       rocketModel[i].startingPortNumber +
2329	       rocketModel[i].numPorts - 1);
2330
2331	return (1);
2332}
2333
2334static const struct tty_operations rocket_ops = {
2335	.open = rp_open,
2336	.close = rp_close,
2337	.write = rp_write,
2338	.put_char = rp_put_char,
2339	.write_room = rp_write_room,
2340	.chars_in_buffer = rp_chars_in_buffer,
2341	.flush_buffer = rp_flush_buffer,
2342	.ioctl = rp_ioctl,
2343	.throttle = rp_throttle,
2344	.unthrottle = rp_unthrottle,
2345	.set_termios = rp_set_termios,
2346	.stop = rp_stop,
2347	.start = rp_start,
2348	.hangup = rp_hangup,
2349	.break_ctl = rp_break,
2350	.send_xchar = rp_send_xchar,
2351	.wait_until_sent = rp_wait_until_sent,
2352	.tiocmget = rp_tiocmget,
2353	.tiocmset = rp_tiocmset,
2354};
2355
2356static const struct tty_port_operations rocket_port_ops = {
2357	.carrier_raised = carrier_raised,
2358	.dtr_rts = dtr_rts,
2359};
2360
2361/*
2362 * The module "startup" routine; it's run when the module is loaded.
2363 */
2364static int __init rp_init(void)
2365{
2366	int ret = -ENOMEM, pci_boards_found, isa_boards_found, i;
2367
2368	printk(KERN_INFO "RocketPort device driver module, version %s, %s\n",
2369	       ROCKET_VERSION, ROCKET_DATE);
2370
2371	rocket_driver = alloc_tty_driver(MAX_RP_PORTS);
2372	if (!rocket_driver)
2373		goto err;
2374
2375	/*
2376	 *  If board 1 is non-zero, there is at least one ISA configured.  If controller is
2377	 *  zero, use the default controller IO address of board1 + 0x40.
2378	 */
2379	if (board1) {
2380		if (controller == 0)
2381			controller = board1 + 0x40;
2382	} else {
2383		controller = 0;  /*  Used as a flag, meaning no ISA boards */
2384	}
2385
2386	/*  If an ISA card is configured, reserve the 4 byte IO space for the Mudbac controller */
2387	if (controller && (!request_region(controller, 4, "Comtrol RocketPort"))) {
2388		printk(KERN_ERR "Unable to reserve IO region for first "
2389			"configured ISA RocketPort controller 0x%lx.  "
2390			"Driver exiting\n", controller);
2391		ret = -EBUSY;
2392		goto err_tty;
2393	}
2394
2395	/*  Store ISA variable retrieved from command line or .conf file. */
2396	rcktpt_io_addr[0] = board1;
2397	rcktpt_io_addr[1] = board2;
2398	rcktpt_io_addr[2] = board3;
2399	rcktpt_io_addr[3] = board4;
2400
2401	rcktpt_type[0] = modem1 ? ROCKET_TYPE_MODEM : ROCKET_TYPE_NORMAL;
2402	rcktpt_type[0] = pc104_1[0] ? ROCKET_TYPE_PC104 : rcktpt_type[0];
2403	rcktpt_type[1] = modem2 ? ROCKET_TYPE_MODEM : ROCKET_TYPE_NORMAL;
2404	rcktpt_type[1] = pc104_2[0] ? ROCKET_TYPE_PC104 : rcktpt_type[1];
2405	rcktpt_type[2] = modem3 ? ROCKET_TYPE_MODEM : ROCKET_TYPE_NORMAL;
2406	rcktpt_type[2] = pc104_3[0] ? ROCKET_TYPE_PC104 : rcktpt_type[2];
2407	rcktpt_type[3] = modem4 ? ROCKET_TYPE_MODEM : ROCKET_TYPE_NORMAL;
2408	rcktpt_type[3] = pc104_4[0] ? ROCKET_TYPE_PC104 : rcktpt_type[3];
2409
2410	/*
2411	 * Set up the tty driver structure and then register this
2412	 * driver with the tty layer.
2413	 */
2414
2415	rocket_driver->flags = TTY_DRIVER_DYNAMIC_DEV;
2416	rocket_driver->name = "ttyR";
2417	rocket_driver->driver_name = "Comtrol RocketPort";
2418	rocket_driver->major = TTY_ROCKET_MAJOR;
2419	rocket_driver->minor_start = 0;
2420	rocket_driver->type = TTY_DRIVER_TYPE_SERIAL;
2421	rocket_driver->subtype = SERIAL_TYPE_NORMAL;
2422	rocket_driver->init_termios = tty_std_termios;
2423	rocket_driver->init_termios.c_cflag =
2424	    B9600 | CS8 | CREAD | HUPCL | CLOCAL;
2425	rocket_driver->init_termios.c_ispeed = 9600;
2426	rocket_driver->init_termios.c_ospeed = 9600;
2427#ifdef ROCKET_SOFT_FLOW
2428	rocket_driver->flags |= TTY_DRIVER_REAL_RAW;
2429#endif
2430	tty_set_operations(rocket_driver, &rocket_ops);
2431
2432	ret = tty_register_driver(rocket_driver);
2433	if (ret < 0) {
2434		printk(KERN_ERR "Couldn't install tty RocketPort driver\n");
2435		goto err_controller;
2436	}
2437
2438#ifdef ROCKET_DEBUG_OPEN
2439	printk(KERN_INFO "RocketPort driver is major %d\n", rocket_driver.major);
2440#endif
2441
2442	/*
2443	 *  OK, let's probe each of the controllers looking for boards.  Any boards found
2444         *  will be initialized here.
2445	 */
2446	isa_boards_found = 0;
2447	pci_boards_found = 0;
2448
2449	for (i = 0; i < NUM_BOARDS; i++) {
2450		if (init_ISA(i))
2451			isa_boards_found++;
2452	}
2453
2454#ifdef CONFIG_PCI
2455	if (isa_boards_found < NUM_BOARDS)
2456		pci_boards_found = init_PCI(isa_boards_found);
2457#endif
2458
2459	max_board = pci_boards_found + isa_boards_found;
2460
2461	if (max_board == 0) {
2462		printk(KERN_ERR "No rocketport ports found; unloading driver\n");
2463		ret = -ENXIO;
2464		goto err_ttyu;
2465	}
2466
2467	return 0;
2468err_ttyu:
2469	tty_unregister_driver(rocket_driver);
2470err_controller:
2471	if (controller)
2472		release_region(controller, 4);
2473err_tty:
2474	put_tty_driver(rocket_driver);
2475err:
2476	return ret;
2477}
2478
2479
2480static void rp_cleanup_module(void)
2481{
2482	int retval;
2483	int i;
2484
2485	del_timer_sync(&rocket_timer);
2486
2487	retval = tty_unregister_driver(rocket_driver);
2488	if (retval)
2489		printk(KERN_ERR "Error %d while trying to unregister "
2490		       "rocketport driver\n", -retval);
2491
2492	for (i = 0; i < MAX_RP_PORTS; i++)
2493		if (rp_table[i]) {
2494			tty_unregister_device(rocket_driver, i);
2495			tty_port_destroy(&rp_table[i]->port);
2496			kfree(rp_table[i]);
2497		}
2498
2499	put_tty_driver(rocket_driver);
2500
2501	for (i = 0; i < NUM_BOARDS; i++) {
2502		if (rcktpt_io_addr[i] <= 0 || is_PCI[i])
2503			continue;
2504		release_region(rcktpt_io_addr[i], 64);
2505	}
2506	if (controller)
2507		release_region(controller, 4);
2508}
2509
2510/***************************************************************************
2511Function: sInitController
2512Purpose:  Initialization of controller global registers and controller
2513          structure.
2514Call:     sInitController(CtlP,CtlNum,MudbacIO,AiopIOList,AiopIOListSize,
2515                          IRQNum,Frequency,PeriodicOnly)
2516          CONTROLLER_T *CtlP; Ptr to controller structure
2517          int CtlNum; Controller number
2518          ByteIO_t MudbacIO; Mudbac base I/O address.
2519          ByteIO_t *AiopIOList; List of I/O addresses for each AIOP.
2520             This list must be in the order the AIOPs will be found on the
2521             controller.  Once an AIOP in the list is not found, it is
2522             assumed that there are no more AIOPs on the controller.
2523          int AiopIOListSize; Number of addresses in AiopIOList
2524          int IRQNum; Interrupt Request number.  Can be any of the following:
2525                         0: Disable global interrupts
2526                         3: IRQ 3
2527                         4: IRQ 4
2528                         5: IRQ 5
2529                         9: IRQ 9
2530                         10: IRQ 10
2531                         11: IRQ 11
2532                         12: IRQ 12
2533                         15: IRQ 15
2534          Byte_t Frequency: A flag identifying the frequency
2535                   of the periodic interrupt, can be any one of the following:
2536                      FREQ_DIS - periodic interrupt disabled
2537                      FREQ_137HZ - 137 Hertz
2538                      FREQ_69HZ - 69 Hertz
2539                      FREQ_34HZ - 34 Hertz
2540                      FREQ_17HZ - 17 Hertz
2541                      FREQ_9HZ - 9 Hertz
2542                      FREQ_4HZ - 4 Hertz
2543                   If IRQNum is set to 0 the Frequency parameter is
2544                   overidden, it is forced to a value of FREQ_DIS.
2545          int PeriodicOnly: 1 if all interrupts except the periodic
2546                               interrupt are to be blocked.
2547                            0 is both the periodic interrupt and
2548                               other channel interrupts are allowed.
2549                            If IRQNum is set to 0 the PeriodicOnly parameter is
2550                               overidden, it is forced to a value of 0.
2551Return:   int: Number of AIOPs on the controller, or CTLID_NULL if controller
2552               initialization failed.
2553
2554Comments:
2555          If periodic interrupts are to be disabled but AIOP interrupts
2556          are allowed, set Frequency to FREQ_DIS and PeriodicOnly to 0.
2557
2558          If interrupts are to be completely disabled set IRQNum to 0.
2559
2560          Setting Frequency to FREQ_DIS and PeriodicOnly to 1 is an
2561          invalid combination.
2562
2563          This function performs initialization of global interrupt modes,
2564          but it does not actually enable global interrupts.  To enable
2565          and disable global interrupts use functions sEnGlobalInt() and
2566          sDisGlobalInt().  Enabling of global interrupts is normally not
2567          done until all other initializations are complete.
2568
2569          Even if interrupts are globally enabled, they must also be
2570          individually enabled for each channel that is to generate
2571          interrupts.
2572
2573Warnings: No range checking on any of the parameters is done.
2574
2575          No context switches are allowed while executing this function.
2576
2577          After this function all AIOPs on the controller are disabled,
2578          they can be enabled with sEnAiop().
2579*/
2580static int sInitController(CONTROLLER_T * CtlP, int CtlNum, ByteIO_t MudbacIO,
2581			   ByteIO_t * AiopIOList, int AiopIOListSize,
2582			   int IRQNum, Byte_t Frequency, int PeriodicOnly)
2583{
2584	int i;
2585	ByteIO_t io;
2586	int done;
2587
2588	CtlP->AiopIntrBits = aiop_intr_bits;
2589	CtlP->AltChanRingIndicator = 0;
2590	CtlP->CtlNum = CtlNum;
2591	CtlP->CtlID = CTLID_0001;	/* controller release 1 */
2592	CtlP->BusType = isISA;
2593	CtlP->MBaseIO = MudbacIO;
2594	CtlP->MReg1IO = MudbacIO + 1;
2595	CtlP->MReg2IO = MudbacIO + 2;
2596	CtlP->MReg3IO = MudbacIO + 3;
2597#if 1
2598	CtlP->MReg2 = 0;	/* interrupt disable */
2599	CtlP->MReg3 = 0;	/* no periodic interrupts */
2600#else
2601	if (sIRQMap[IRQNum] == 0) {	/* interrupts globally disabled */
2602		CtlP->MReg2 = 0;	/* interrupt disable */
2603		CtlP->MReg3 = 0;	/* no periodic interrupts */
2604	} else {
2605		CtlP->MReg2 = sIRQMap[IRQNum];	/* set IRQ number */
2606		CtlP->MReg3 = Frequency;	/* set frequency */
2607		if (PeriodicOnly) {	/* periodic interrupt only */
2608			CtlP->MReg3 |= PERIODIC_ONLY;
2609		}
2610	}
2611#endif
2612	sOutB(CtlP->MReg2IO, CtlP->MReg2);
2613	sOutB(CtlP->MReg3IO, CtlP->MReg3);
2614	sControllerEOI(CtlP);	/* clear EOI if warm init */
2615	/* Init AIOPs */
2616	CtlP->NumAiop = 0;
2617	for (i = done = 0; i < AiopIOListSize; i++) {
2618		io = AiopIOList[i];
2619		CtlP->AiopIO[i] = (WordIO_t) io;
2620		CtlP->AiopIntChanIO[i] = io + _INT_CHAN;
2621		sOutB(CtlP->MReg2IO, CtlP->MReg2 | (i & 0x03));	/* AIOP index */
2622		sOutB(MudbacIO, (Byte_t) (io >> 6));	/* set up AIOP I/O in MUDBAC */
2623		if (done)
2624			continue;
2625		sEnAiop(CtlP, i);	/* enable the AIOP */
2626		CtlP->AiopID[i] = sReadAiopID(io);	/* read AIOP ID */
2627		if (CtlP->AiopID[i] == AIOPID_NULL)	/* if AIOP does not exist */
2628			done = 1;	/* done looking for AIOPs */
2629		else {
2630			CtlP->AiopNumChan[i] = sReadAiopNumChan((WordIO_t) io);	/* num channels in AIOP */
2631			sOutW((WordIO_t) io + _INDX_ADDR, _CLK_PRE);	/* clock prescaler */
2632			sOutB(io + _INDX_DATA, sClockPrescale);
2633			CtlP->NumAiop++;	/* bump count of AIOPs */
2634		}
2635		sDisAiop(CtlP, i);	/* disable AIOP */
2636	}
2637
2638	if (CtlP->NumAiop == 0)
2639		return (-1);
2640	else
2641		return (CtlP->NumAiop);
2642}
2643
2644/***************************************************************************
2645Function: sReadAiopID
2646Purpose:  Read the AIOP idenfication number directly from an AIOP.
2647Call:     sReadAiopID(io)
2648          ByteIO_t io: AIOP base I/O address
2649Return:   int: Flag AIOPID_XXXX if a valid AIOP is found, where X
2650                 is replace by an identifying number.
2651          Flag AIOPID_NULL if no valid AIOP is found
2652Warnings: No context switches are allowed while executing this function.
2653
2654*/
2655static int sReadAiopID(ByteIO_t io)
2656{
2657	Byte_t AiopID;		/* ID byte from AIOP */
2658
2659	sOutB(io + _CMD_REG, RESET_ALL);	/* reset AIOP */
2660	sOutB(io + _CMD_REG, 0x0);
2661	AiopID = sInW(io + _CHN_STAT0) & 0x07;
2662	if (AiopID == 0x06)
2663		return (1);
2664	else			/* AIOP does not exist */
2665		return (-1);
2666}
2667
2668/***************************************************************************
2669Function: sReadAiopNumChan
2670Purpose:  Read the number of channels available in an AIOP directly from
2671          an AIOP.
2672Call:     sReadAiopNumChan(io)
2673          WordIO_t io: AIOP base I/O address
2674Return:   int: The number of channels available
2675Comments: The number of channels is determined by write/reads from identical
2676          offsets within the SRAM address spaces for channels 0 and 4.
2677          If the channel 4 space is mirrored to channel 0 it is a 4 channel
2678          AIOP, otherwise it is an 8 channel.
2679Warnings: No context switches are allowed while executing this function.
2680*/
2681static int sReadAiopNumChan(WordIO_t io)
2682{
2683	Word_t x;
2684	static Byte_t R[4] = { 0x00, 0x00, 0x34, 0x12 };
2685
2686	/* write to chan 0 SRAM */
2687	out32((DWordIO_t) io + _INDX_ADDR, R);
2688	sOutW(io + _INDX_ADDR, 0);	/* read from SRAM, chan 0 */
2689	x = sInW(io + _INDX_DATA);
2690	sOutW(io + _INDX_ADDR, 0x4000);	/* read from SRAM, chan 4 */
2691	if (x != sInW(io + _INDX_DATA))	/* if different must be 8 chan */
2692		return (8);
2693	else
2694		return (4);
2695}
2696
2697/***************************************************************************
2698Function: sInitChan
2699Purpose:  Initialization of a channel and channel structure
2700Call:     sInitChan(CtlP,ChP,AiopNum,ChanNum)
2701          CONTROLLER_T *CtlP; Ptr to controller structure
2702          CHANNEL_T *ChP; Ptr to channel structure
2703          int AiopNum; AIOP number within controller
2704          int ChanNum; Channel number within AIOP
2705Return:   int: 1 if initialization succeeded, 0 if it fails because channel
2706               number exceeds number of channels available in AIOP.
2707Comments: This function must be called before a channel can be used.
2708Warnings: No range checking on any of the parameters is done.
2709
2710          No context switches are allowed while executing this function.
2711*/
2712static int sInitChan(CONTROLLER_T * CtlP, CHANNEL_T * ChP, int AiopNum,
2713		     int ChanNum)
2714{
2715	int i;
2716	WordIO_t AiopIO;
2717	WordIO_t ChIOOff;
2718	Byte_t *ChR;
2719	Word_t ChOff;
2720	static Byte_t R[4];
2721	int brd9600;
2722
2723	if (ChanNum >= CtlP->AiopNumChan[AiopNum])
2724		return 0;	/* exceeds num chans in AIOP */
2725
2726	/* Channel, AIOP, and controller identifiers */
2727	ChP->CtlP = CtlP;
2728	ChP->ChanID = CtlP->AiopID[AiopNum];
2729	ChP->AiopNum = AiopNum;
2730	ChP->ChanNum = ChanNum;
2731
2732	/* Global direct addresses */
2733	AiopIO = CtlP->AiopIO[AiopNum];
2734	ChP->Cmd = (ByteIO_t) AiopIO + _CMD_REG;
2735	ChP->IntChan = (ByteIO_t) AiopIO + _INT_CHAN;
2736	ChP->IntMask = (ByteIO_t) AiopIO + _INT_MASK;
2737	ChP->IndexAddr = (DWordIO_t) AiopIO + _INDX_ADDR;
2738	ChP->IndexData = AiopIO + _INDX_DATA;
2739
2740	/* Channel direct addresses */
2741	ChIOOff = AiopIO + ChP->ChanNum * 2;
2742	ChP->TxRxData = ChIOOff + _TD0;
2743	ChP->ChanStat = ChIOOff + _CHN_STAT0;
2744	ChP->TxRxCount = ChIOOff + _FIFO_CNT0;
2745	ChP->IntID = (ByteIO_t) AiopIO + ChP->ChanNum + _INT_ID0;
2746
2747	/* Initialize the channel from the RData array */
2748	for (i = 0; i < RDATASIZE; i += 4) {
2749		R[0] = RData[i];
2750		R[1] = RData[i + 1] + 0x10 * ChanNum;
2751		R[2] = RData[i + 2];
2752		R[3] = RData[i + 3];
2753		out32(ChP->IndexAddr, R);
2754	}
2755
2756	ChR = ChP->R;
2757	for (i = 0; i < RREGDATASIZE; i += 4) {
2758		ChR[i] = RRegData[i];
2759		ChR[i + 1] = RRegData[i + 1] + 0x10 * ChanNum;
2760		ChR[i + 2] = RRegData[i + 2];
2761		ChR[i + 3] = RRegData[i + 3];
2762	}
2763
2764	/* Indexed registers */
2765	ChOff = (Word_t) ChanNum *0x1000;
2766
2767	if (sClockPrescale == 0x14)
2768		brd9600 = 47;
2769	else
2770		brd9600 = 23;
2771
2772	ChP->BaudDiv[0] = (Byte_t) (ChOff + _BAUD);
2773	ChP->BaudDiv[1] = (Byte_t) ((ChOff + _BAUD) >> 8);
2774	ChP->BaudDiv[2] = (Byte_t) brd9600;
2775	ChP->BaudDiv[3] = (Byte_t) (brd9600 >> 8);
2776	out32(ChP->IndexAddr, ChP->BaudDiv);
2777
2778	ChP->TxControl[0] = (Byte_t) (ChOff + _TX_CTRL);
2779	ChP->TxControl[1] = (Byte_t) ((ChOff + _TX_CTRL) >> 8);
2780	ChP->TxControl[2] = 0;
2781	ChP->TxControl[3] = 0;
2782	out32(ChP->IndexAddr, ChP->TxControl);
2783
2784	ChP->RxControl[0] = (Byte_t) (ChOff + _RX_CTRL);
2785	ChP->RxControl[1] = (Byte_t) ((ChOff + _RX_CTRL) >> 8);
2786	ChP->RxControl[2] = 0;
2787	ChP->RxControl[3] = 0;
2788	out32(ChP->IndexAddr, ChP->RxControl);
2789
2790	ChP->TxEnables[0] = (Byte_t) (ChOff + _TX_ENBLS);
2791	ChP->TxEnables[1] = (Byte_t) ((ChOff + _TX_ENBLS) >> 8);
2792	ChP->TxEnables[2] = 0;
2793	ChP->TxEnables[3] = 0;
2794	out32(ChP->IndexAddr, ChP->TxEnables);
2795
2796	ChP->TxCompare[0] = (Byte_t) (ChOff + _TXCMP1);
2797	ChP->TxCompare[1] = (Byte_t) ((ChOff + _TXCMP1) >> 8);
2798	ChP->TxCompare[2] = 0;
2799	ChP->TxCompare[3] = 0;
2800	out32(ChP->IndexAddr, ChP->TxCompare);
2801
2802	ChP->TxReplace1[0] = (Byte_t) (ChOff + _TXREP1B1);
2803	ChP->TxReplace1[1] = (Byte_t) ((ChOff + _TXREP1B1) >> 8);
2804	ChP->TxReplace1[2] = 0;
2805	ChP->TxReplace1[3] = 0;
2806	out32(ChP->IndexAddr, ChP->TxReplace1);
2807
2808	ChP->TxReplace2[0] = (Byte_t) (ChOff + _TXREP2);
2809	ChP->TxReplace2[1] = (Byte_t) ((ChOff + _TXREP2) >> 8);
2810	ChP->TxReplace2[2] = 0;
2811	ChP->TxReplace2[3] = 0;
2812	out32(ChP->IndexAddr, ChP->TxReplace2);
2813
2814	ChP->TxFIFOPtrs = ChOff + _TXF_OUTP;
2815	ChP->TxFIFO = ChOff + _TX_FIFO;
2816
2817	sOutB(ChP->Cmd, (Byte_t) ChanNum | RESTXFCNT);	/* apply reset Tx FIFO count */
2818	sOutB(ChP->Cmd, (Byte_t) ChanNum);	/* remove reset Tx FIFO count */
2819	sOutW((WordIO_t) ChP->IndexAddr, ChP->TxFIFOPtrs);	/* clear Tx in/out ptrs */
2820	sOutW(ChP->IndexData, 0);
2821	ChP->RxFIFOPtrs = ChOff + _RXF_OUTP;
2822	ChP->RxFIFO = ChOff + _RX_FIFO;
2823
2824	sOutB(ChP->Cmd, (Byte_t) ChanNum | RESRXFCNT);	/* apply reset Rx FIFO count */
2825	sOutB(ChP->Cmd, (Byte_t) ChanNum);	/* remove reset Rx FIFO count */
2826	sOutW((WordIO_t) ChP->IndexAddr, ChP->RxFIFOPtrs);	/* clear Rx out ptr */
2827	sOutW(ChP->IndexData, 0);
2828	sOutW((WordIO_t) ChP->IndexAddr, ChP->RxFIFOPtrs + 2);	/* clear Rx in ptr */
2829	sOutW(ChP->IndexData, 0);
2830	ChP->TxPrioCnt = ChOff + _TXP_CNT;
2831	sOutW((WordIO_t) ChP->IndexAddr, ChP->TxPrioCnt);
2832	sOutB(ChP->IndexData, 0);
2833	ChP->TxPrioPtr = ChOff + _TXP_PNTR;
2834	sOutW((WordIO_t) ChP->IndexAddr, ChP->TxPrioPtr);
2835	sOutB(ChP->IndexData, 0);
2836	ChP->TxPrioBuf = ChOff + _TXP_BUF;
2837	sEnRxProcessor(ChP);	/* start the Rx processor */
2838
2839	return 1;
2840}
2841
2842/***************************************************************************
2843Function: sStopRxProcessor
2844Purpose:  Stop the receive processor from processing a channel.
2845Call:     sStopRxProcessor(ChP)
2846          CHANNEL_T *ChP; Ptr to channel structure
2847
2848Comments: The receive processor can be started again with sStartRxProcessor().
2849          This function causes the receive processor to skip over the
2850          stopped channel.  It does not stop it from processing other channels.
2851
2852Warnings: No context switches are allowed while executing this function.
2853
2854          Do not leave the receive processor stopped for more than one
2855          character time.
2856
2857          After calling this function a delay of 4 uS is required to ensure
2858          that the receive processor is no longer processing this channel.
2859*/
2860static void sStopRxProcessor(CHANNEL_T * ChP)
2861{
2862	Byte_t R[4];
2863
2864	R[0] = ChP->R[0];
2865	R[1] = ChP->R[1];
2866	R[2] = 0x0a;
2867	R[3] = ChP->R[3];
2868	out32(ChP->IndexAddr, R);
2869}
2870
2871/***************************************************************************
2872Function: sFlushRxFIFO
2873Purpose:  Flush the Rx FIFO
2874Call:     sFlushRxFIFO(ChP)
2875          CHANNEL_T *ChP; Ptr to channel structure
2876Return:   void
2877Comments: To prevent data from being enqueued or dequeued in the Tx FIFO
2878          while it is being flushed the receive processor is stopped
2879          and the transmitter is disabled.  After these operations a
2880          4 uS delay is done before clearing the pointers to allow
2881          the receive processor to stop.  These items are handled inside
2882          this function.
2883Warnings: No context switches are allowed while executing this function.
2884*/
2885static void sFlushRxFIFO(CHANNEL_T * ChP)
2886{
2887	int i;
2888	Byte_t Ch;		/* channel number within AIOP */
2889	int RxFIFOEnabled;	/* 1 if Rx FIFO enabled */
2890
2891	if (sGetRxCnt(ChP) == 0)	/* Rx FIFO empty */
2892		return;		/* don't need to flush */
2893
2894	RxFIFOEnabled = 0;
2895	if (ChP->R[0x32] == 0x08) {	/* Rx FIFO is enabled */
2896		RxFIFOEnabled = 1;
2897		sDisRxFIFO(ChP);	/* disable it */
2898		for (i = 0; i < 2000 / 200; i++)	/* delay 2 uS to allow proc to disable FIFO */
2899			sInB(ChP->IntChan);	/* depends on bus i/o timing */
2900	}
2901	sGetChanStatus(ChP);	/* clear any pending Rx errors in chan stat */
2902	Ch = (Byte_t) sGetChanNum(ChP);
2903	sOutB(ChP->Cmd, Ch | RESRXFCNT);	/* apply reset Rx FIFO count */
2904	sOutB(ChP->Cmd, Ch);	/* remove reset Rx FIFO count */
2905	sOutW((WordIO_t) ChP->IndexAddr, ChP->RxFIFOPtrs);	/* clear Rx out ptr */
2906	sOutW(ChP->IndexData, 0);
2907	sOutW((WordIO_t) ChP->IndexAddr, ChP->RxFIFOPtrs + 2);	/* clear Rx in ptr */
2908	sOutW(ChP->IndexData, 0);
2909	if (RxFIFOEnabled)
2910		sEnRxFIFO(ChP);	/* enable Rx FIFO */
2911}
2912
2913/***************************************************************************
2914Function: sFlushTxFIFO
2915Purpose:  Flush the Tx FIFO
2916Call:     sFlushTxFIFO(ChP)
2917          CHANNEL_T *ChP; Ptr to channel structure
2918Return:   void
2919Comments: To prevent data from being enqueued or dequeued in the Tx FIFO
2920          while it is being flushed the receive processor is stopped
2921          and the transmitter is disabled.  After these operations a
2922          4 uS delay is done before clearing the pointers to allow
2923          the receive processor to stop.  These items are handled inside
2924          this function.
2925Warnings: No context switches are allowed while executing this function.
2926*/
2927static void sFlushTxFIFO(CHANNEL_T * ChP)
2928{
2929	int i;
2930	Byte_t Ch;		/* channel number within AIOP */
2931	int TxEnabled;		/* 1 if transmitter enabled */
2932
2933	if (sGetTxCnt(ChP) == 0)	/* Tx FIFO empty */
2934		return;		/* don't need to flush */
2935
2936	TxEnabled = 0;
2937	if (ChP->TxControl[3] & TX_ENABLE) {
2938		TxEnabled = 1;
2939		sDisTransmit(ChP);	/* disable transmitter */
2940	}
2941	sStopRxProcessor(ChP);	/* stop Rx processor */
2942	for (i = 0; i < 4000 / 200; i++)	/* delay 4 uS to allow proc to stop */
2943		sInB(ChP->IntChan);	/* depends on bus i/o timing */
2944	Ch = (Byte_t) sGetChanNum(ChP);
2945	sOutB(ChP->Cmd, Ch | RESTXFCNT);	/* apply reset Tx FIFO count */
2946	sOutB(ChP->Cmd, Ch);	/* remove reset Tx FIFO count */
2947	sOutW((WordIO_t) ChP->IndexAddr, ChP->TxFIFOPtrs);	/* clear Tx in/out ptrs */
2948	sOutW(ChP->IndexData, 0);
2949	if (TxEnabled)
2950		sEnTransmit(ChP);	/* enable transmitter */
2951	sStartRxProcessor(ChP);	/* restart Rx processor */
2952}
2953
2954/***************************************************************************
2955Function: sWriteTxPrioByte
2956Purpose:  Write a byte of priority transmit data to a channel
2957Call:     sWriteTxPrioByte(ChP,Data)
2958          CHANNEL_T *ChP; Ptr to channel structure
2959          Byte_t Data; The transmit data byte
2960
2961Return:   int: 1 if the bytes is successfully written, otherwise 0.
2962
2963Comments: The priority byte is transmitted before any data in the Tx FIFO.
2964
2965Warnings: No context switches are allowed while executing this function.
2966*/
2967static int sWriteTxPrioByte(CHANNEL_T * ChP, Byte_t Data)
2968{
2969	Byte_t DWBuf[4];	/* buffer for double word writes */
2970	Word_t *WordPtr;	/* must be far because Win SS != DS */
2971	register DWordIO_t IndexAddr;
2972
2973	if (sGetTxCnt(ChP) > 1) {	/* write it to Tx priority buffer */
2974		IndexAddr = ChP->IndexAddr;
2975		sOutW((WordIO_t) IndexAddr, ChP->TxPrioCnt);	/* get priority buffer status */
2976		if (sInB((ByteIO_t) ChP->IndexData) & PRI_PEND)	/* priority buffer busy */
2977			return (0);	/* nothing sent */
2978
2979		WordPtr = (Word_t *) (&DWBuf[0]);
2980		*WordPtr = ChP->TxPrioBuf;	/* data byte address */
2981
2982		DWBuf[2] = Data;	/* data byte value */
2983		out32(IndexAddr, DWBuf);	/* write it out */
2984
2985		*WordPtr = ChP->TxPrioCnt;	/* Tx priority count address */
2986
2987		DWBuf[2] = PRI_PEND + 1;	/* indicate 1 byte pending */
2988		DWBuf[3] = 0;	/* priority buffer pointer */
2989		out32(IndexAddr, DWBuf);	/* write it out */
2990	} else {		/* write it to Tx FIFO */
2991
2992		sWriteTxByte(sGetTxRxDataIO(ChP), Data);
2993	}
2994	return (1);		/* 1 byte sent */
2995}
2996
2997/***************************************************************************
2998Function: sEnInterrupts
2999Purpose:  Enable one or more interrupts for a channel
3000Call:     sEnInterrupts(ChP,Flags)
3001          CHANNEL_T *ChP; Ptr to channel structure
3002          Word_t Flags: Interrupt enable flags, can be any combination
3003             of the following flags:
3004                TXINT_EN:   Interrupt on Tx FIFO empty
3005                RXINT_EN:   Interrupt on Rx FIFO at trigger level (see
3006                            sSetRxTrigger())
3007                SRCINT_EN:  Interrupt on SRC (Special Rx Condition)
3008                MCINT_EN:   Interrupt on modem input change
3009                CHANINT_EN: Allow channel interrupt signal to the AIOP's
3010                            Interrupt Channel Register.
3011Return:   void
3012Comments: If an interrupt enable flag is set in Flags, that interrupt will be
3013          enabled.  If an interrupt enable flag is not set in Flags, that
3014          interrupt will not be changed.  Interrupts can be disabled with
3015          function sDisInterrupts().
3016
3017          This function sets the appropriate bit for the channel in the AIOP's
3018          Interrupt Mask Register if the CHANINT_EN flag is set.  This allows
3019          this channel's bit to be set in the AIOP's Interrupt Channel Register.
3020
3021          Interrupts must also be globally enabled before channel interrupts
3022          will be passed on to the host.  This is done with function
3023          sEnGlobalInt().
3024
3025          In some cases it may be desirable to disable interrupts globally but
3026          enable channel interrupts.  This would allow the global interrupt
3027          status register to be used to determine which AIOPs need service.
3028*/
3029static void sEnInterrupts(CHANNEL_T * ChP, Word_t Flags)
3030{
3031	Byte_t Mask;		/* Interrupt Mask Register */
3032
3033	ChP->RxControl[2] |=
3034	    ((Byte_t) Flags & (RXINT_EN | SRCINT_EN | MCINT_EN));
3035
3036	out32(ChP->IndexAddr, ChP->RxControl);
3037
3038	ChP->TxControl[2] |= ((Byte_t) Flags & TXINT_EN);
3039
3040	out32(ChP->IndexAddr, ChP->TxControl);
3041
3042	if (Flags & CHANINT_EN) {
3043		Mask = sInB(ChP->IntMask) | sBitMapSetTbl[ChP->ChanNum];
3044		sOutB(ChP->IntMask, Mask);
3045	}
3046}
3047
3048/***************************************************************************
3049Function: sDisInterrupts
3050Purpose:  Disable one or more interrupts for a channel
3051Call:     sDisInterrupts(ChP,Flags)
3052          CHANNEL_T *ChP; Ptr to channel structure
3053          Word_t Flags: Interrupt flags, can be any combination
3054             of the following flags:
3055                TXINT_EN:   Interrupt on Tx FIFO empty
3056                RXINT_EN:   Interrupt on Rx FIFO at trigger level (see
3057                            sSetRxTrigger())
3058                SRCINT_EN:  Interrupt on SRC (Special Rx Condition)
3059                MCINT_EN:   Interrupt on modem input change
3060                CHANINT_EN: Disable channel interrupt signal to the
3061                            AIOP's Interrupt Channel Register.
3062Return:   void
3063Comments: If an interrupt flag is set in Flags, that interrupt will be
3064          disabled.  If an interrupt flag is not set in Flags, that
3065          interrupt will not be changed.  Interrupts can be enabled with
3066          function sEnInterrupts().
3067
3068          This function clears the appropriate bit for the channel in the AIOP's
3069          Interrupt Mask Register if the CHANINT_EN flag is set.  This blocks
3070          this channel's bit from being set in the AIOP's Interrupt Channel
3071          Register.
3072*/
3073static void sDisInterrupts(CHANNEL_T * ChP, Word_t Flags)
3074{
3075	Byte_t Mask;		/* Interrupt Mask Register */
3076
3077	ChP->RxControl[2] &=
3078	    ~((Byte_t) Flags & (RXINT_EN | SRCINT_EN | MCINT_EN));
3079	out32(ChP->IndexAddr, ChP->RxControl);
3080	ChP->TxControl[2] &= ~((Byte_t) Flags & TXINT_EN);
3081	out32(ChP->IndexAddr, ChP->TxControl);
3082
3083	if (Flags & CHANINT_EN) {
3084		Mask = sInB(ChP->IntMask) & sBitMapClrTbl[ChP->ChanNum];
3085		sOutB(ChP->IntMask, Mask);
3086	}
3087}
3088
3089static void sSetInterfaceMode(CHANNEL_T * ChP, Byte_t mode)
3090{
3091	sOutB(ChP->CtlP->AiopIO[2], (mode & 0x18) | ChP->ChanNum);
3092}
3093
3094/*
3095 *  Not an official SSCI function, but how to reset RocketModems.
3096 *  ISA bus version
3097 */
3098static void sModemReset(CONTROLLER_T * CtlP, int chan, int on)
3099{
3100	ByteIO_t addr;
3101	Byte_t val;
3102
3103	addr = CtlP->AiopIO[0] + 0x400;
3104	val = sInB(CtlP->MReg3IO);
3105	/* if AIOP[1] is not enabled, enable it */
3106	if ((val & 2) == 0) {
3107		val = sInB(CtlP->MReg2IO);
3108		sOutB(CtlP->MReg2IO, (val & 0xfc) | (1 & 0x03));
3109		sOutB(CtlP->MBaseIO, (unsigned char) (addr >> 6));
3110	}
3111
3112	sEnAiop(CtlP, 1);
3113	if (!on)
3114		addr += 8;
3115	sOutB(addr + chan, 0);	/* apply or remove reset */
3116	sDisAiop(CtlP, 1);
3117}
3118
3119/*
3120 *  Not an official SSCI function, but how to reset RocketModems.
3121 *  PCI bus version
3122 */
3123static void sPCIModemReset(CONTROLLER_T * CtlP, int chan, int on)
3124{
3125	ByteIO_t addr;
3126
3127	addr = CtlP->AiopIO[0] + 0x40;	/* 2nd AIOP */
3128	if (!on)
3129		addr += 8;
3130	sOutB(addr + chan, 0);	/* apply or remove reset */
3131}
3132
3133/*  Returns the line number given the controller (board), aiop and channel number */
3134static unsigned char GetLineNumber(int ctrl, int aiop, int ch)
3135{
3136	return lineNumbers[(ctrl << 5) | (aiop << 3) | ch];
3137}
3138
3139/*
3140 *  Stores the line number associated with a given controller (board), aiop
3141 *  and channel number.
3142 *  Returns:  The line number assigned
3143 */
3144static unsigned char SetLineNumber(int ctrl, int aiop, int ch)
3145{
3146	lineNumbers[(ctrl << 5) | (aiop << 3) | ch] = nextLineNumber++;
3147	return (nextLineNumber - 1);
3148}
3149