1 /*
2  * Copyright 2003 Digi International (www.digi.com)
3  *      Scott H Kilau <Scott_Kilau at digi dot com>
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2, or (at your option)
8  * any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY, EXPRESS OR IMPLIED; without even the
12  * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
13  * PURPOSE.  See the GNU General Public License for more details.
14  *
15  *************************************************************************
16  *
17  * Driver includes
18  *
19  *************************************************************************/
20 
21 #ifndef __DGNC_DRIVER_H
22 #define __DGNC_DRIVER_H
23 
24 #include <linux/types.h>
25 #include <linux/tty.h>
26 #include <linux/interrupt.h>
27 
28 #include "digi.h"		/* Digi specific ioctl header */
29 #include "dgnc_sysfs.h"		/* Support for SYSFS */
30 
31 /*************************************************************************
32  *
33  * Driver defines
34  *
35  *************************************************************************/
36 
37 /* Driver identification and error statments */
38 #define	PROCSTR		"dgnc"			/* /proc entries	 */
39 #define	DEVSTR		"/dev/dg/dgnc"		/* /dev entries		 */
40 #define	DRVSTR		"dgnc"			/* Driver name string	 */
41 #define	DG_PART		"40002369_F"		/* RPM part number	 */
42 
43 #define TRC_TO_CONSOLE 1
44 
45 /* Number of boards we support at once. */
46 #define	MAXBOARDS	20
47 #define	MAXPORTS	8
48 #define MAXTTYNAMELEN	200
49 
50 /* Our 3 magic numbers for our board, channel and unit structs */
51 #define DGNC_BOARD_MAGIC	0x5c6df104
52 #define DGNC_CHANNEL_MAGIC	0x6c6df104
53 #define DGNC_UNIT_MAGIC		0x7c6df104
54 
55 /* Serial port types */
56 #define DGNC_SERIAL		0
57 #define DGNC_PRINT		1
58 
59 #define	SERIAL_TYPE_NORMAL	1
60 
61 #define PORT_NUM(dev)	((dev) & 0x7f)
62 #define IS_PRINT(dev)	(((dev) & 0xff) >= 0x80)
63 
64 /* MAX number of stop characters we will send
65  * when our read queue is getting full
66  */
67 #define MAX_STOPS_SENT 5
68 
69 /* 4 extra for alignment play space */
70 #define WRITEBUFLEN		((4096) + 4)
71 
72 #define dgnc_jiffies_from_ms(a) (((a) * HZ) / 1000)
73 
74 /*
75  * Define a local default termios struct. All ports will be created
76  * with this termios initially.  This is the same structure that is defined
77  * as the default in tty_io.c with the same settings overridden as in serial.c
78  *
79  * In short, this should match the internal serial ports' defaults.
80  */
81 #define	DEFAULT_IFLAGS	(ICRNL | IXON)
82 #define	DEFAULT_OFLAGS	(OPOST | ONLCR)
83 #define	DEFAULT_CFLAGS	(B9600 | CS8 | CREAD | HUPCL | CLOCAL)
84 #define	DEFAULT_LFLAGS	(ISIG | ICANON | ECHO | ECHOE | ECHOK | \
85 			ECHOCTL | ECHOKE | IEXTEN)
86 
87 #ifndef _POSIX_VDISABLE
88 #define   _POSIX_VDISABLE '\0'
89 #endif
90 
91 
92 /*
93  * All the possible states the driver can be while being loaded.
94  */
95 enum {
96 	DRIVER_INITIALIZED = 0,
97 	DRIVER_READY
98 };
99 
100 /*
101  * All the possible states the board can be while booting up.
102  */
103 enum {
104 	BOARD_FAILED = 0,
105 	BOARD_FOUND,
106 	BOARD_READY
107 };
108 
109 
110 /*************************************************************************
111  *
112  * Structures and closely related defines.
113  *
114  *************************************************************************/
115 
116 struct dgnc_board;
117 struct channel_t;
118 
119 /************************************************************************
120  * Per board operations structure				       *
121  ************************************************************************/
122 struct board_ops {
123 	void (*tasklet)(unsigned long data);
124 	irqreturn_t (*intr)(int irq, void *voidbrd);
125 	void (*uart_init)(struct channel_t *ch);
126 	void (*uart_off)(struct channel_t *ch);
127 	int  (*drain)(struct tty_struct *tty, uint seconds);
128 	void (*param)(struct tty_struct *tty);
129 	void (*vpd)(struct dgnc_board *brd);
130 	void (*assert_modem_signals)(struct channel_t *ch);
131 	void (*flush_uart_write)(struct channel_t *ch);
132 	void (*flush_uart_read)(struct channel_t *ch);
133 	void (*disable_receiver)(struct channel_t *ch);
134 	void (*enable_receiver)(struct channel_t *ch);
135 	void (*send_break)(struct channel_t *ch, int);
136 	void (*send_start_character)(struct channel_t *ch);
137 	void (*send_stop_character)(struct channel_t *ch);
138 	void (*copy_data_from_queue_to_uart)(struct channel_t *ch);
139 	uint (*get_uart_bytes_left)(struct channel_t *ch);
140 	void (*send_immediate_char)(struct channel_t *ch, unsigned char);
141 };
142 
143 /************************************************************************
144  * Device flag definitions for bd_flags.
145  ************************************************************************/
146 #define BD_IS_PCI_EXPRESS     0x0001	  /* Is a PCI Express board */
147 
148 
149 /*
150  *	Per-board information
151  */
152 struct dgnc_board {
153 	int		magic;		/* Board Magic number.  */
154 	int		boardnum;	/* Board number: 0-32 */
155 
156 	int		type;		/* Type of board */
157 	char		*name;		/* Product Name */
158 	struct pci_dev	*pdev;		/* Pointer to the pci_dev struct */
159 	unsigned long	bd_flags;	/* Board flags */
160 	u16		vendor;		/* PCI vendor ID */
161 	u16		device;		/* PCI device ID */
162 	u16		subvendor;	/* PCI subsystem vendor ID */
163 	u16		subdevice;	/* PCI subsystem device ID */
164 	unsigned char	rev;		/* PCI revision ID */
165 	uint		pci_bus;	/* PCI bus value */
166 	uint		pci_slot;	/* PCI slot value */
167 	uint		maxports;	/* MAX ports this board can handle */
168 	unsigned char	dvid;		/* Board specific device id */
169 	unsigned char	vpd[128];	/* VPD of board, if found */
170 	unsigned char	serial_num[20];	/* Serial number of board,
171 					 * if found in VPD
172 					 */
173 
174 	spinlock_t	bd_lock;	/* Used to protect board */
175 
176 	spinlock_t	bd_intr_lock;	/* Used to protect the poller tasklet
177 					 * and the interrupt routine from each
178 					 * other.
179 					 */
180 
181 	uint		state;		/* State of card. */
182 	wait_queue_head_t state_wait;	/* Place to sleep on for state change */
183 
184 	struct		tasklet_struct helper_tasklet; /* Poll helper tasklet */
185 
186 	uint		nasync;		/* Number of ports on card */
187 
188 	uint		irq;		/* Interrupt request number */
189 	ulong		intr_count;	/* Count of interrupts */
190 	ulong		intr_modem;	/* Count of interrupts */
191 	ulong		intr_tx;	/* Count of interrupts */
192 	ulong		intr_rx;	/* Count of interrupts */
193 
194 	ulong		membase;	/* Start of base memory of the card */
195 	ulong		membase_end;	/* End of base memory of the card */
196 
197 	u8 __iomem	*re_map_membase; /* Remapped memory of the card */
198 
199 	ulong		iobase;		/* Start of io base of the card */
200 	ulong		iobase_end;	/* End of io base of the card */
201 
202 	uint		bd_uart_offset;	/* Space between each UART */
203 
204 	struct channel_t *channels[MAXPORTS];	/* array of pointers
205 						 * to our channels.
206 						 */
207 
208 	struct tty_driver	SerialDriver;
209 	char		SerialName[200];
210 	struct tty_driver	PrintDriver;
211 	char		PrintName[200];
212 
213 	bool		dgnc_Major_Serial_Registered;
214 	bool		dgnc_Major_TransparentPrint_Registered;
215 
216 	uint		dgnc_Serial_Major;
217 	uint		dgnc_TransparentPrint_Major;
218 
219 	uint		TtyRefCnt;
220 
221 	u16		dpatype;	/* The board "type",
222 					 * as defined by DPA
223 					 */
224 	u16		dpastatus;	/* The board "status",
225 					 * as defined by DPA
226 					 */
227 
228 	/*
229 	 *	Mgmt data.
230 	 */
231 	char		*msgbuf_head;
232 	char		*msgbuf;
233 
234 	uint		bd_dividend;	/* Board/UARTs specific dividend */
235 
236 	struct board_ops *bd_ops;
237 
238 	/* /proc/<board> entries */
239 	struct proc_dir_entry *proc_entry_pointer;
240 	struct dgnc_proc_entry *dgnc_board_table;
241 
242 };
243 
244 
245 /************************************************************************
246  * Unit flag definitions for un_flags.
247  ************************************************************************/
248 #define UN_ISOPEN	0x0001		/* Device is open		*/
249 #define UN_CLOSING	0x0002		/* Line is being closed		*/
250 #define UN_IMM		0x0004		/* Service immediately		*/
251 #define UN_BUSY		0x0008		/* Some work this channel	*/
252 #define UN_BREAKI	0x0010		/* Input break received		*/
253 #define UN_PWAIT	0x0020		/* Printer waiting for terminal	*/
254 #define UN_TIME		0x0040		/* Waiting on time		*/
255 #define UN_EMPTY	0x0080		/* Waiting output queue empty	*/
256 #define UN_LOW		0x0100		/* Waiting output low water mark*/
257 #define UN_EXCL_OPEN	0x0200		/* Open for exclusive use	*/
258 #define UN_WOPEN	0x0400		/* Device waiting for open	*/
259 #define UN_WIOCTL	0x0800		/* Device waiting for open	*/
260 #define UN_HANGUP	0x8000		/* Carrier lost			*/
261 
262 struct device;
263 
264 /************************************************************************
265  * Structure for terminal or printer unit.
266  ************************************************************************/
267 struct un_t {
268 	int	magic;		/* Unit Magic Number.			*/
269 	struct	channel_t *un_ch;
270 	ulong	un_time;
271 	uint	un_type;
272 	uint	un_open_count;	/* Counter of opens to port		*/
273 	struct tty_struct *un_tty;/* Pointer to unit tty structure	*/
274 	uint	un_flags;	/* Unit flags				*/
275 	wait_queue_head_t un_flags_wait; /* Place to sleep to wait on unit */
276 	uint	un_dev;		/* Minor device number			*/
277 	struct device *un_sysfs;
278 };
279 
280 
281 /************************************************************************
282  * Device flag definitions for ch_flags.
283  ************************************************************************/
284 #define CH_PRON		0x0001		/* Printer on string		*/
285 #define CH_STOP		0x0002		/* Output is stopped		*/
286 #define CH_STOPI	0x0004		/* Input is stopped		*/
287 #define CH_CD		0x0008		/* Carrier is present		*/
288 #define CH_FCAR		0x0010		/* Carrier forced on		*/
289 #define CH_HANGUP       0x0020		/* Hangup received		*/
290 
291 #define CH_RECEIVER_OFF	0x0040		/* Receiver is off		*/
292 #define CH_OPENING	0x0080		/* Port in fragile open state	*/
293 #define CH_CLOSING	0x0100		/* Port in fragile close state	*/
294 #define CH_FIFO_ENABLED 0x0200		/* Port has FIFOs enabled	*/
295 #define CH_TX_FIFO_EMPTY 0x0400		/* TX Fifo is completely empty	*/
296 #define CH_TX_FIFO_LWM  0x0800		/* TX Fifo is below Low Water	*/
297 #define CH_BREAK_SENDING 0x1000		/* Break is being sent		*/
298 #define CH_LOOPBACK 0x2000		/* Channel is in lookback mode	*/
299 #define CH_BAUD0	0x08000		/* Used for checking B0 transitions */
300 #define CH_FORCED_STOP  0x20000		/* Output is forcibly stopped	*/
301 #define CH_FORCED_STOPI 0x40000		/* Input is forcibly stopped	*/
302 
303 
304 /* Our Read/Error/Write queue sizes */
305 #define RQUEUEMASK	0x1FFF		/* 8 K - 1 */
306 #define EQUEUEMASK	0x1FFF		/* 8 K - 1 */
307 #define WQUEUEMASK	0x0FFF		/* 4 K - 1 */
308 #define RQUEUESIZE	(RQUEUEMASK + 1)
309 #define EQUEUESIZE	RQUEUESIZE
310 #define WQUEUESIZE	(WQUEUEMASK + 1)
311 
312 
313 /************************************************************************
314  * Channel information structure.
315  ************************************************************************/
316 struct channel_t {
317 	int magic;			/* Channel Magic Number		*/
318 	struct dgnc_board	*ch_bd;		/* Board structure pointer */
319 	struct digi_t	ch_digi;	/* Transparent Print structure  */
320 	struct un_t	ch_tun;		/* Terminal unit info	   */
321 	struct un_t	ch_pun;		/* Printer unit info	    */
322 
323 	spinlock_t	ch_lock;	/* provide for serialization */
324 	wait_queue_head_t ch_flags_wait;
325 
326 	uint		ch_portnum;	/* Port number, 0 offset.	*/
327 	uint		ch_open_count;	/* open count			*/
328 	uint		ch_flags;	/* Channel flags		*/
329 
330 	ulong		ch_close_delay;	/* How long we should
331 					 * drop RTS/DTR for
332 					 */
333 
334 	ulong		ch_cpstime;	/* Time for CPS calculations    */
335 
336 	tcflag_t	ch_c_iflag;	/* channel iflags	       */
337 	tcflag_t	ch_c_cflag;	/* channel cflags	       */
338 	tcflag_t	ch_c_oflag;	/* channel oflags	       */
339 	tcflag_t	ch_c_lflag;	/* channel lflags	       */
340 	unsigned char	ch_stopc;	/* Stop character	       */
341 	unsigned char	ch_startc;	/* Start character	      */
342 
343 	uint		ch_old_baud;	/* Cache of the current baud */
344 	uint		ch_custom_speed;/* Custom baud, if set */
345 
346 	uint		ch_wopen;	/* Waiting for open process cnt */
347 
348 	unsigned char		ch_mostat;	/* FEP output modem status */
349 	unsigned char		ch_mistat;	/* FEP input modem status */
350 
351 	struct neo_uart_struct __iomem *ch_neo_uart;	/* Pointer to the
352 							 * "mapped" UART struct
353 							 */
354 	struct cls_uart_struct __iomem *ch_cls_uart;	/* Pointer to the
355 							 * "mapped" UART struct
356 							 */
357 
358 	unsigned char	ch_cached_lsr;	/* Cached value of the LSR register */
359 
360 	unsigned char	*ch_rqueue;	/* Our read queue buffer - malloc'ed */
361 	ushort		ch_r_head;	/* Head location of the read queue */
362 	ushort		ch_r_tail;	/* Tail location of the read queue */
363 
364 	unsigned char	*ch_equeue;	/* Our error queue buffer - malloc'ed */
365 	ushort		ch_e_head;	/* Head location of the error queue */
366 	ushort		ch_e_tail;	/* Tail location of the error queue */
367 
368 	unsigned char	*ch_wqueue;	/* Our write queue buffer - malloc'ed */
369 	ushort		ch_w_head;	/* Head location of the write queue */
370 	ushort		ch_w_tail;	/* Tail location of the write queue */
371 
372 	ulong		ch_rxcount;	/* total of data received so far */
373 	ulong		ch_txcount;	/* total of data transmitted so far */
374 
375 	unsigned char		ch_r_tlevel;	/* Receive Trigger level */
376 	unsigned char		ch_t_tlevel;	/* Transmit Trigger level */
377 
378 	unsigned char		ch_r_watermark;	/* Receive Watermark */
379 
380 	ulong		ch_stop_sending_break;	/* Time we should STOP
381 						 * sending a break
382 						 */
383 
384 	uint		ch_stops_sent;	/* How many times I have sent a stop
385 					 * character to try to stop the other
386 					 * guy sending.
387 					 */
388 	ulong		ch_err_parity;	/* Count of parity errors on channel */
389 	ulong		ch_err_frame;	/* Count of framing errors on channel */
390 	ulong		ch_err_break;	/* Count of breaks on channel */
391 	ulong		ch_err_overrun; /* Count of overruns on channel */
392 
393 	ulong		ch_xon_sends;	/* Count of xons transmitted */
394 	ulong		ch_xoff_sends;	/* Count of xoffs transmitted */
395 
396 	ulong		ch_intr_modem;	/* Count of interrupts */
397 	ulong		ch_intr_tx;	/* Count of interrupts */
398 	ulong		ch_intr_rx;	/* Count of interrupts */
399 
400 
401 	/* /proc/<board>/<channel> entries */
402 	struct proc_dir_entry *proc_entry_pointer;
403 	struct dgnc_proc_entry *dgnc_channel_table;
404 
405 };
406 
407 /*
408  * Our Global Variables.
409  */
410 extern uint		dgnc_Major;		/* Our driver/mgmt major */
411 extern int		dgnc_poll_tick;		/* Poll interval - 20 ms */
412 extern spinlock_t	dgnc_global_lock;	/* Driver global spinlock */
413 extern spinlock_t	dgnc_poll_lock;		/* Poll scheduling lock */
414 extern uint		dgnc_NumBoards;		/* Total number of boards */
415 extern struct dgnc_board	*dgnc_Board[MAXBOARDS];	/* Array of board
416 							 * structs
417 							 */
418 
419 #endif
420