1#ifndef _LINUX_ISICOM_H
2#define _LINUX_ISICOM_H
3
4/*#define		ISICOM_DEBUG*/
5/*#define		ISICOM_DEBUG_DTR_RTS*/
6
7
8/*
9 *	Firmware Loader definitions ...
10 */
11
12#define		__MultiTech		('M'<<8)
13#define		MIOCTL_LOAD_FIRMWARE	(__MultiTech | 0x01)
14#define         MIOCTL_READ_FIRMWARE    (__MultiTech | 0x02)
15#define         MIOCTL_XFER_CTRL	(__MultiTech | 0x03)
16#define         MIOCTL_RESET_CARD	(__MultiTech | 0x04)
17
18#define		DATA_SIZE	16
19
20typedef	struct	{
21		unsigned short	exec_segment;
22		unsigned short	exec_addr;
23}	exec_record;
24
25typedef	struct	{
26		int		board;		/* Board to load */
27		unsigned short	addr;
28		unsigned short	count;
29}	bin_header;
30
31typedef	struct	{
32		int		board;		/* Board to load */
33		unsigned short	addr;
34		unsigned short	count;
35		unsigned short	segment;
36		unsigned char	bin_data[DATA_SIZE];
37}	bin_frame;
38
39#ifdef __KERNEL__
40
41#define		YES	1
42#define		NO	0
43
44#define		ISILOAD_MISC_MINOR	155	/* /dev/isctl */
45#define		ISILOAD_NAME		"ISILoad"
46
47/*
48 *  ISICOM Driver definitions ...
49 *
50 */
51
52#define		ISICOM_NAME	"ISICom"
53
54/*
55 *      PCI definitions
56 */
57
58 #define        DEVID_COUNT     9
59 #define        VENDOR_ID       0x10b5
60
61/*
62 *	These are now officially allocated numbers
63 */
64
65#define		ISICOM_NMAJOR	112	/* normal  */
66#define		ISICOM_CMAJOR	113	/* callout */
67#define		ISICOM_MAGIC	(('M' << 8) | 'T')
68
69#define		WAKEUP_CHARS	256	/* hard coded for now	*/
70#define		TX_SIZE		254
71
72#define		BOARD_COUNT	4
73#define		PORT_COUNT	(BOARD_COUNT*16)
74
75#define		SERIAL_TYPE_NORMAL	1
76#define		SERIAL_TYPE_CALLOUT	2
77
78/*   character sizes  */
79
80#define		ISICOM_CS5		0x0000
81#define		ISICOM_CS6		0x0001
82#define		ISICOM_CS7		0x0002
83#define		ISICOM_CS8		0x0003
84
85/* stop bits */
86
87#define		ISICOM_1SB		0x0000
88#define		ISICOM_2SB		0x0004
89
90/* parity */
91
92#define		ISICOM_NOPAR		0x0000
93#define		ISICOM_ODPAR		0x0008
94#define		ISICOM_EVPAR		0x0018
95
96/* flow control */
97
98#define		ISICOM_CTSRTS		0x03
99#define		ISICOM_INITIATE_XONXOFF	0x04
100#define		ISICOM_RESPOND_XONXOFF	0x08
101
102#define InterruptTheCard(base) (outw(0,(base)+0xc))
103#define ClearInterrupt(base) (inw((base)+0x0a))
104
105#define	BOARD(line)  (((line) >> 4) & 0x3)
106#define MIN(a, b) ( (a) < (b) ? (a) : (b) )
107
108	/*	isi kill queue bitmap	*/
109
110#define		ISICOM_KILLTX		0x01
111#define		ISICOM_KILLRX		0x02
112
113	/* isi_board status bitmap */
114
115#define		FIRMWARE_LOADED		0x0001
116#define		BOARD_ACTIVE		0x0002
117
118 	/* isi_port status bitmap  */
119
120#define		ISI_CTS			0x1000
121#define		ISI_DSR			0x2000
122#define		ISI_RI			0x4000
123#define		ISI_DCD			0x8000
124#define		ISI_DTR			0x0100
125#define		ISI_RTS			0x0200
126
127
128#define		ISI_TXOK		0x0001
129
130struct	isi_board {
131	unsigned short		base;
132	unsigned char		irq;
133	unsigned char		port_count;
134	unsigned short		status;
135	unsigned short		port_status; /* each bit represents a single port */
136	unsigned short		shift_count;
137	struct isi_port		* ports;
138	signed char		count;
139	unsigned char		isa;
140};
141
142struct	isi_port {
143	unsigned short		magic;
144	unsigned int		flags;
145	int			count;
146	int			blocked_open;
147	int			close_delay;
148	unsigned short		channel;
149	unsigned short		status;
150	unsigned short		closing_wait;
151	long 			session;
152	long			pgrp;
153	struct isi_board	* card;
154	struct tty_struct 	* tty;
155	wait_queue_head_t	close_wait;
156	wait_queue_head_t	open_wait;
157	struct tq_struct	hangup_tq;
158	struct tq_struct	bh_tqueue;
159	unsigned char		* xmit_buf;
160	int			xmit_head;
161	int			xmit_tail;
162	int			xmit_cnt;
163	struct termios 		normal_termios;
164	struct termios		callout_termios;
165};
166
167
168/*
169 *  ISI Card specific ops ...
170 */
171
172static inline void raise_dtr(struct isi_port * port)
173{
174	struct isi_board * card = port->card;
175	unsigned short base = card->base;
176	unsigned char channel = port->channel;
177	short wait=400;
178	while(((inw(base+0x0e) & 0x01) == 0) && (wait-- > 0));
179	if (wait <= 0) {
180		printk(KERN_WARNING "ISICOM: Card found busy in raise_dtr.\n");
181		return;
182	}
183#ifdef ISICOM_DEBUG_DTR_RTS
184	printk(KERN_DEBUG "ISICOM: raise_dtr.\n");
185#endif
186	outw(0x8000 | (channel << card->shift_count) | 0x02 , base);
187	outw(0x0504, base);
188	InterruptTheCard(base);
189	port->status |= ISI_DTR;
190}
191
192static inline void drop_dtr(struct isi_port * port)
193{
194	struct isi_board * card = port->card;
195	unsigned short base = card->base;
196	unsigned char channel = port->channel;
197	short wait=400;
198	while(((inw(base+0x0e) & 0x01) == 0) && (wait-- > 0));
199	if (wait <= 0) {
200		printk(KERN_WARNING "ISICOM: Card found busy in drop_dtr.\n");
201		return;
202	}
203#ifdef ISICOM_DEBUG_DTR_RTS
204	printk(KERN_DEBUG "ISICOM: drop_dtr.\n");
205#endif
206	outw(0x8000 | (channel << card->shift_count) | 0x02 , base);
207	outw(0x0404, base);
208	InterruptTheCard(base);
209	port->status &= ~ISI_DTR;
210}
211static inline void raise_rts(struct isi_port * port)
212{
213	struct isi_board * card = port->card;
214	unsigned short base = card->base;
215	unsigned char channel = port->channel;
216	short wait=400;
217	while(((inw(base+0x0e) & 0x01) == 0) && (wait-- > 0));
218	if (wait <= 0) {
219		printk(KERN_WARNING "ISICOM: Card found busy in raise_rts.\n");
220		return;
221	}
222#ifdef ISICOM_DEBUG_DTR_RTS
223	printk(KERN_DEBUG "ISICOM: raise_rts.\n");
224#endif
225	outw(0x8000 | (channel << card->shift_count) | 0x02 , base);
226	outw(0x0a04, base);
227	InterruptTheCard(base);
228	port->status |= ISI_RTS;
229}
230static inline void drop_rts(struct isi_port * port)
231{
232	struct isi_board * card = port->card;
233	unsigned short base = card->base;
234	unsigned char channel = port->channel;
235	short wait=400;
236	while(((inw(base+0x0e) & 0x01) == 0) && (wait-- > 0));
237	if (wait <= 0) {
238		printk(KERN_WARNING "ISICOM: Card found busy in drop_rts.\n");
239		return;
240	}
241#ifdef ISICOM_DEBUG_DTR_RTS
242	printk(KERN_DEBUG "ISICOM: drop_rts.\n");
243#endif
244	outw(0x8000 | (channel << card->shift_count) | 0x02 , base);
245	outw(0x0804, base);
246	InterruptTheCard(base);
247	port->status &= ~ISI_RTS;
248}
249static inline void raise_dtr_rts(struct isi_port * port)
250{
251	struct isi_board * card = port->card;
252	unsigned short base = card->base;
253	unsigned char channel = port->channel;
254	short wait=400;
255	while(((inw(base+0x0e) & 0x01) == 0) && (wait-- > 0));
256	if (wait <= 0) {
257		printk(KERN_WARNING "ISICOM: Card found busy in raise_dtr_rts.\n");
258		return;
259	}
260#ifdef ISICOM_DEBUG_DTR_RTS
261	printk(KERN_DEBUG "ISICOM: raise_dtr_rts.\n");
262#endif
263	outw(0x8000 | (channel << card->shift_count) | 0x02 , base);
264	outw(0x0f04, base);
265	InterruptTheCard(base);
266	port->status |= (ISI_DTR | ISI_RTS);
267}
268static inline void drop_dtr_rts(struct isi_port * port)
269{
270	struct isi_board * card = port->card;
271	unsigned short base = card->base;
272	unsigned char channel = port->channel;
273	short wait=400;
274	while(((inw(base+0x0e) & 0x01) == 0) && (wait-- > 0));
275	if (wait <= 0) {
276		printk(KERN_WARNING "ISICOM: Card found busy in drop_dtr_rts.\n");
277		return;
278	}
279#ifdef ISICOM_DEBUG_DTR_RTS
280	printk(KERN_DEBUG "ISICOM: drop_dtr_rts.\n");
281#endif
282	outw(0x8000 | (channel << card->shift_count) | 0x02 , base);
283	outw(0x0c04, base);
284	InterruptTheCard(base);
285	port->status &= ~(ISI_RTS | ISI_DTR);
286}
287
288static inline void kill_queue(struct isi_port * port, short queue)
289{
290	struct isi_board * card = port->card;
291	unsigned short base = card->base;
292	unsigned char channel = port->channel;
293	short wait=400;
294	while(((inw(base+0x0e) & 0x01) == 0) && (wait-- > 0));
295	if (wait <= 0) {
296		printk(KERN_WARNING "ISICOM: Card found busy in kill_queue.\n");
297		return;
298	}
299#ifdef ISICOM_DEBUG
300	printk(KERN_DEBUG "ISICOM: kill_queue 0x%x.\n", queue);
301#endif
302	outw(0x8000 | (channel << card->shift_count) | 0x02 , base);
303	outw((queue << 8) | 0x06, base);
304	InterruptTheCard(base);
305}
306
307#endif	/*	__KERNEL__	*/
308
309#endif	/*	ISICOM_H	*/
310
311