cregit-Linux how code gets into the kernel

Release 4.12 drivers/staging/dgnc/dgnc_driver.h

/*
 * 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)

/*
 * Define a local default termios struct. All ports will be created
 * with this termios initially.  This is the same structure that is defined
 * as the default in tty_io.c with the same settings overridden as in serial.c
 *
 * In short, this should match the internal serial ports' defaults.
 */

#define	DEFAULT_IFLAGS	(ICRNL | IXON)

#define	DEFAULT_OFLAGS	(OPOST | ONLCR)

#define	DEFAULT_CFLAGS	(B9600 | CS8 | CREAD | HUPCL | CLOCAL)

#define	DEFAULT_LFLAGS	(ISIG | ICANON | ECHO | ECHOE | ECHOK | \
                        ECHOCTL | ECHOKE | IEXTEN)

#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 */

Overall Contributors

PersonTokensPropCommitsCommitProp
Lidza Louina90089.82%526.32%
Walt Feasel373.69%210.53%
Ebru Akagunduz302.99%15.26%
Tobin C Harding121.20%315.79%
DaeSeok Youn90.90%421.05%
Salah Triki50.50%15.26%
Cass May40.40%15.26%
Vatika Harlalka40.40%15.26%
Hari Prasath Gujulan Elango10.10%15.26%
Total1002100.00%19100.00%
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with cregit.