File: /usr/include/linux/isicom.h

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     
20     typedef	struct	{
21     		unsigned short	exec_segment;
22     		unsigned short	exec_addr;
23     }	exec_record;
24     
25     typedef	struct	{
26     		int		board;		/* Board to load */
27     		unsigned short	addr;
28     		unsigned short	count;
29     }	bin_header;
30     
31     typedef	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      
130     struct	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     
142     struct	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      
172     extern 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     
192     extern 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     }
211     extern 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     }
230     extern 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     }
249     extern 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     }
268     extern 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     
288     extern 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