/*
 * Copyright 2003 Digi International (www.digi.com)
 *      Scott H Kilau <Scott_Kilau at digi dot com>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2, or (at your option)
 * any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY, EXPRESS OR IMPLIED; without even the
 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
 * PURPOSE.  See the GNU General Public License for more details.
 */

#ifndef _DGNC_DRIVER_H
#define _DGNC_DRIVER_H

#include <linux/types.h>
#include <linux/tty.h>
#include <linux/interrupt.h>

#include "digi.h"		/* Digi specific ioctl header */

/* Driver identification and error statements */
#define	PROCSTR		"dgnc"			/* /proc entries */
#define	DEVSTR		"/dev/dg/dgnc"		/* /dev entries */
#define	DRVSTR		"dgnc"			/* Driver name string */
#define	DG_PART		"40002369_F"		/* RPM part number */

#define TRC_TO_CONSOLE 1

/* Number of boards we support at once. */
#define	MAXBOARDS	20
#define	MAXPORTS	8
#define MAXTTYNAMELEN	200

/* Serial port types */
#define DGNC_SERIAL		0
#define DGNC_PRINT		1

#define	SERIAL_TYPE_NORMAL	1

#define PORT_NUM(dev)	((dev) & 0x7f)
#define IS_PRINT(dev)	(((dev) & 0xff) >= 0x80)

/* MAX number of stop characters sent when our read queue is getting full */
#define MAX_STOPS_SENT 5

/* 4 extra for alignment play space */
#define WRITEBUFLEN		((4096) + 4)

#define dgnc_jiffies_from_ms(a) (((a) * HZ) / 1000)

#ifndef _POSIX_VDISABLE
#define   _POSIX_VDISABLE '\0'
#endif

/* All the possible states the driver can be while being loaded. */
enum {
	DRIVER_INITIALIZED = 0,
	DRIVER_READY
};

/* All the possible states the board can be while booting up. */
enum {
	BOARD_FAILED = 0,
	BOARD_FOUND,
	BOARD_READY
};

struct dgnc_board;
struct channel_t;

/**
 * struct board_ops - Per board operations.
 */
struct board_ops {
	void (*tasklet)(unsigned long data);
	irqreturn_t (*intr)(int irq, void *voidbrd);
	void (*uart_init)(struct channel_t *ch);
	void (*uart_off)(struct channel_t *ch);
	int  (*drain)(struct tty_struct *tty, uint seconds);
	void (*param)(struct tty_struct *tty);
	void (*vpd)(struct dgnc_board *brd);
	void (*assert_modem_signals)(struct channel_t *ch);
	void (*flush_uart_write)(struct channel_t *ch);
	void (*flush_uart_read)(struct channel_t *ch);
	void (*disable_receiver)(struct channel_t *ch);
	void (*enable_receiver)(struct channel_t *ch);
	void (*send_break)(struct channel_t *ch, int);
	void (*send_start_character)(struct channel_t *ch);
	void (*send_stop_character)(struct channel_t *ch);
	void (*copy_data_from_queue_to_uart)(struct channel_t *ch);
	uint (*get_uart_bytes_left)(struct channel_t *ch);
	void (*send_immediate_char)(struct channel_t *ch, unsigned char);
};

/* Device flag definitions for bd_flags. */

#define BD_IS_PCI_EXPRESS     0x0001	  /* Is a PCI Express board */

/**
 * struct dgnc_board - Per board information.
 * @boardnum: Board number (0 - 32).
 *
 * @type: Type of board.
 * @name: Product name.
 * @pdev: Pointer to the pci_dev structure.
 * @bd_flags: Board flags.
 * @vendor: PCI vendor ID.
 * @device: PCI device ID.
 * @subvendor: PCI subsystem vendor ID.
 * @subdevice: PCI subsystem device ID.
 * @rev: PCI revision ID.
 * @pci_bus: PCI bus value.
 * @pci_slot: PCI slot value.
 * @maxports: Maximum ports this board can handle.
 * @dvid: Board specific device ID.
 * @vpd: VPD of this board, if found.
 * @serial_num: Serial number of this board, if found in VPD.
 * @bd_lock: Used to protect board.
 * @bd_intr_lock: Protect poller tasklet and interrupt routine from each other.
 * @state: State of the card.
 * @state_wait: Queue to sleep on for state change.
 * @helper_tasklet: Poll helper tasklet.
 * @nasync: Number of ports on card.
 * @irq: Interrupt request number.
 * @membase: Start of base memory of the card.
 * @membase_end: End of base memory of the card.
 * @iobase: Start of IO base of the card.
 * @iobase_end: End of IO base of the card.
 * @bd_uart_offset: Space between each UART.
 * @channels: array of pointers to our channels.
 * @serial_driver: Pointer to the serial driver.
 * @serial_name: Serial driver name.
 * @print_dirver: Pointer to the print driver.
 * @print_name: Print driver name.
 * @dpatype: Board type as defined by DPA.
 * @dpastatus: Board status as defined by DPA.
 * @bd_dividend: Board/UART's specific dividend.
 * @bd_ops: Pointer to board operations structure.
 * @proc_entry_pointer: Proc/<board> entry
 * @dgnc_board_table: Proc/<board> entry
 */
struct dgnc_board {
	int		boardnum;

	int		type;
	char		*name;
	struct pci_dev	*pdev;
	unsigned long	bd_flags;
	u16		vendor;
	u16		device;
	u16		subvendor;
	u16		subdevice;
	unsigned char	rev;
	uint		pci_bus;
	uint		pci_slot;
	uint		maxports;
	unsigned char	dvid;
	unsigned char	vpd[128];
	unsigned char	serial_num[20];

	/* used to protect the board */
	spinlock_t	bd_lock;

	/*  Protect poller tasklet and interrupt routine from each other. */
	spinlock_t	bd_intr_lock;

	uint		state;
	wait_queue_head_t state_wait;

	struct tasklet_struct helper_tasklet;

	uint		nasync;

	uint		irq;

	ulong		membase;
	ulong		membase_end;

	u8 __iomem	*re_map_membase;

	ulong		iobase;
	ulong		iobase_end;

	uint		bd_uart_offset;

	struct channel_t *channels[MAXPORTS];

	struct tty_driver *serial_driver;
	char		serial_name[200];
	struct tty_driver *print_driver;
	char		print_name[200];

	u16		dpatype;
	u16		dpastatus;

	uint		bd_dividend;

	struct board_ops *bd_ops;

	struct proc_dir_entry *proc_entry_pointer;
	struct dgnc_proc_entry *dgnc_board_table;

};

/* Unit flag definitions for un_flags. */
#define UN_ISOPEN	0x0001		/* Device is open */
#define UN_CLOSING	0x0002		/* Line is being closed	*/
#define UN_IMM		0x0004		/* Service immediately */
#define UN_BUSY		0x0008		/* Some work this channel */
#define UN_BREAKI	0x0010		/* Input break received	*/
#define UN_PWAIT	0x0020		/* Printer waiting for terminal	*/
#define UN_TIME		0x0040		/* Waiting on time */
#define UN_EMPTY	0x0080		/* Waiting output queue empty */
#define UN_LOW		0x0100		/* Waiting output low water mark*/
#define UN_EXCL_OPEN	0x0200		/* Open for exclusive use */
#define UN_WOPEN	0x0400		/* Device waiting for open */
#define UN_WIOCTL	0x0800		/* Device waiting for open */
#define UN_HANGUP	0x8000		/* Carrier lost	*/

struct device;

/**
 * struct un_t - terminal or printer unit
 * @un_open_count: Counter of opens to port.
 * @un_tty: Pointer to unit tty structure.
 * @un_flags: Unit flags.
 * @un_flags_wait: Place to sleep to wait on unit.
 * @un_dev: Minor device number.
 */
struct un_t {
	struct	channel_t *un_ch;
	ulong	un_time;
	uint	un_type;
	uint	un_open_count;
	struct tty_struct *un_tty;
	uint	un_flags;
	wait_queue_head_t un_flags_wait;
	uint	un_dev;
	struct device *un_sysfs;
};

/* Device flag definitions for ch_flags. */
#define CH_PRON		0x0001		/* Printer on string */
#define CH_STOP		0x0002		/* Output is stopped */
#define CH_STOPI	0x0004		/* Input is stopped */
#define CH_CD		0x0008		/* Carrier is present */
#define CH_FCAR		0x0010		/* Carrier forced on */
#define CH_HANGUP       0x0020		/* Hangup received */

#define CH_RECEIVER_OFF	0x0040		/* Receiver is off */
#define CH_OPENING	0x0080		/* Port in fragile open state */
#define CH_CLOSING	0x0100		/* Port in fragile close state */
#define CH_FIFO_ENABLED 0x0200		/* Port has FIFOs enabled */
#define CH_TX_FIFO_EMPTY 0x0400		/* TX Fifo is completely empty */
#define CH_TX_FIFO_LWM  0x0800		/* TX Fifo is below Low Water */
#define CH_BREAK_SENDING 0x1000		/* Break is being sent */
#define CH_LOOPBACK	0x2000		/* Channel is in lookback mode */
#define CH_BAUD0	0x08000		/* Used for checking B0 transitions */
#define CH_FORCED_STOP  0x20000		/* Output is forcibly stopped */
#define CH_FORCED_STOPI 0x40000		/* Input is forcibly stopped */

/* Our Read/Error/Write queue sizes */
#define RQUEUEMASK	0x1FFF		/* 8 K - 1 */
#define EQUEUEMASK	0x1FFF		/* 8 K - 1 */
#define WQUEUEMASK	0x0FFF		/* 4 K - 1 */
#define RQUEUESIZE	(RQUEUEMASK + 1)
#define EQUEUESIZE	RQUEUESIZE
#define WQUEUESIZE	(WQUEUEMASK + 1)

/**
 * struct channel_t - Channel information.
 * @dgnc_board: Pointer to board structure.
 * @ch_bd: Transparent print structure.
 * @ch_tun: Terminal unit information.
 * @ch_pun: Printer unit information.
 * @ch_lock: Provide for serialization.
 * @ch_flags_wait: Channel flags wait queue.
 * @ch_portnum: Port number, 0 offset.
 * @ch_open_count: Open count.
 * @ch_flags: Channel flags.
 * @ch_close_delay: How long we should drop RTS/DTR for.
 * @ch_cpstime: Time for CPS calculations.
 * @ch_c_iflag: Channel iflags.
 * @ch_c_cflag: Channel cflags.
 * @ch_c_oflag: Channel oflags.
 * @ch_c_lflag: Channel lflags.
 * @ch_stopc: Stop character.
 * @ch_startc: Start character.
 * @ch_old_baud: Cache of the current baud rate.
 * @ch_custom_speed: Custom baud rate, if set.
 * @ch_wopen: Waiting for open process count.
 * @ch_mostat: FEP output modem status.
 * @ch_mistat: FEP input modem status.
 * @chc_neo_uart: Pointer to the mapped neo UART struct
 * @ch_cls_uart:  Pointer to the mapped cls UART struct
 * @ch_cached_lsr: Cached value of the LSR register.
 * @ch_rqueue: Read queue buffer, malloc'ed.
 * @ch_r_head: Head location of the read queue.
 * @ch_r_tail: Tail location of the read queue.
 * @ch_equeue: Error queue buffer, malloc'ed.
 * @ch_e_head: Head location of the error queue.
 * @ch_e_tail: Tail location of the error queue.
 * @ch_wqueue: Write queue buffer, malloc'ed.
 * @ch_w_head: Head location of the write queue.
 * @ch_w_tail: Tail location of the write queue.
 * @ch_rxcount: Total of data received so far.
 * @ch_txcount: Total of data transmitted so far.
 * @ch_r_tlevel: Receive trigger level.
 * @ch_t_tlevel: Transmit trigger level.
 * @ch_r_watermark: Receive water mark.
 * @ch_stop_sending_break: Time we should STOP sending a break.
 * @ch_stops_sent: How many times I have send a stop character to try
 *                 to stop the other guy sending.
 * @ch_err_parity: Count of parity
 * @ch_err_frame: Count of framing errors on channel.
 * @ch_err_break: Count of breaks on channel.
 * @ch_err_overrun: Count of overruns on channel.
 * @ch_xon_sends: Count of xons transmitted.
 * @ch_xoff_sends: Count of xoffs transmitted.
 * @proc_entry_pointer: Proc/<board>/<channel> entry.
 * @dgnc_channel_table: Proc/<board>/<channel> entry.
 */
struct channel_t {
	struct dgnc_board *ch_bd;
	struct digi_t	ch_digi;
	struct un_t	ch_tun;
	struct un_t	ch_pun;

	spinlock_t	ch_lock; /* provide for serialization */
	wait_queue_head_t ch_flags_wait;

	uint		ch_portnum;
	uint		ch_open_count;
	uint		ch_flags;

	ulong		ch_close_delay;

	ulong		ch_cpstime;

	tcflag_t	ch_c_iflag;
	tcflag_t	ch_c_cflag;
	tcflag_t	ch_c_oflag;
	tcflag_t	ch_c_lflag;
	unsigned char	ch_stopc;
	unsigned char	ch_startc;

	uint		ch_old_baud;
	uint		ch_custom_speed;

	uint		ch_wopen;

	unsigned char	ch_mostat;
	unsigned char	ch_mistat;

	struct neo_uart_struct __iomem *ch_neo_uart;
	struct cls_uart_struct __iomem *ch_cls_uart;

	unsigned char	ch_cached_lsr;

	unsigned char	*ch_rqueue;
	ushort		ch_r_head;
	ushort		ch_r_tail;

	unsigned char	*ch_equeue;
	ushort		ch_e_head;
	ushort		ch_e_tail;

	unsigned char	*ch_wqueue;
	ushort		ch_w_head;
	ushort		ch_w_tail;

	ulong		ch_rxcount;
	ulong		ch_txcount;

	unsigned char	ch_r_tlevel;
	unsigned char	ch_t_tlevel;

	unsigned char	ch_r_watermark;

	ulong		ch_stop_sending_break;
	uint		ch_stops_sent;

	ulong		ch_err_parity;
	ulong		ch_err_frame;
	ulong		ch_err_break;
	ulong		ch_err_overrun;

	ulong		ch_xon_sends;
	ulong		ch_xoff_sends;

	struct proc_dir_entry *proc_entry_pointer;
	struct dgnc_proc_entry *dgnc_channel_table;

};

extern uint		dgnc_major;		/* Our driver/mgmt major */
extern int		dgnc_poll_tick;		/* Poll interval - 20 ms */
extern spinlock_t	dgnc_global_lock;	/* Driver global spinlock */
extern spinlock_t	dgnc_poll_lock;		/* Poll scheduling lock */
extern uint		dgnc_num_boards;	/* Total number of boards */
extern struct dgnc_board *dgnc_board[MAXBOARDS];/* Array of boards */

#endif	/* _DGNC_DRIVER_H */
