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