cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

synclink_cs.c (110620B)


      1/*
      2 * linux/drivers/char/pcmcia/synclink_cs.c
      3 *
      4 * $Id: synclink_cs.c,v 4.34 2005/09/08 13:20:54 paulkf Exp $
      5 *
      6 * Device driver for Microgate SyncLink PC Card
      7 * multiprotocol serial adapter.
      8 *
      9 * written by Paul Fulghum for Microgate Corporation
     10 * paulkf@microgate.com
     11 *
     12 * Microgate and SyncLink are trademarks of Microgate Corporation
     13 *
     14 * This code is released under the GNU General Public License (GPL)
     15 *
     16 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
     17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     18 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
     19 * DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
     20 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
     21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
     22 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
     24 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
     26 * OF THE POSSIBILITY OF SUCH DAMAGE.
     27 */
     28
     29#define VERSION(ver,rel,seq) (((ver)<<16) | ((rel)<<8) | (seq))
     30#if defined(__i386__)
     31#  define BREAKPOINT() asm("   int $3");
     32#else
     33#  define BREAKPOINT() { }
     34#endif
     35
     36#define MAX_DEVICE_COUNT 4
     37
     38#include <linux/module.h>
     39#include <linux/errno.h>
     40#include <linux/signal.h>
     41#include <linux/sched.h>
     42#include <linux/timer.h>
     43#include <linux/time.h>
     44#include <linux/interrupt.h>
     45#include <linux/tty.h>
     46#include <linux/tty_flip.h>
     47#include <linux/serial.h>
     48#include <linux/major.h>
     49#include <linux/string.h>
     50#include <linux/fcntl.h>
     51#include <linux/ptrace.h>
     52#include <linux/ioport.h>
     53#include <linux/mm.h>
     54#include <linux/seq_file.h>
     55#include <linux/slab.h>
     56#include <linux/netdevice.h>
     57#include <linux/vmalloc.h>
     58#include <linux/init.h>
     59#include <linux/delay.h>
     60#include <linux/ioctl.h>
     61#include <linux/synclink.h>
     62
     63#include <asm/io.h>
     64#include <asm/irq.h>
     65#include <asm/dma.h>
     66#include <linux/bitops.h>
     67#include <asm/types.h>
     68#include <linux/termios.h>
     69#include <linux/workqueue.h>
     70#include <linux/hdlc.h>
     71
     72#include <pcmcia/cistpl.h>
     73#include <pcmcia/cisreg.h>
     74#include <pcmcia/ds.h>
     75
     76#if defined(CONFIG_HDLC) || (defined(CONFIG_HDLC_MODULE) && defined(CONFIG_SYNCLINK_CS_MODULE))
     77#define SYNCLINK_GENERIC_HDLC 1
     78#else
     79#define SYNCLINK_GENERIC_HDLC 0
     80#endif
     81
     82#define GET_USER(error,value,addr) error = get_user(value,addr)
     83#define COPY_FROM_USER(error,dest,src,size) error = copy_from_user(dest,src,size) ? -EFAULT : 0
     84#define PUT_USER(error,value,addr) error = put_user(value,addr)
     85#define COPY_TO_USER(error,dest,src,size) error = copy_to_user(dest,src,size) ? -EFAULT : 0
     86
     87#include <linux/uaccess.h>
     88
     89static MGSL_PARAMS default_params = {
     90	MGSL_MODE_HDLC,			/* unsigned long mode */
     91	0,				/* unsigned char loopback; */
     92	HDLC_FLAG_UNDERRUN_ABORT15,	/* unsigned short flags; */
     93	HDLC_ENCODING_NRZI_SPACE,	/* unsigned char encoding; */
     94	0,				/* unsigned long clock_speed; */
     95	0xff,				/* unsigned char addr_filter; */
     96	HDLC_CRC_16_CCITT,		/* unsigned short crc_type; */
     97	HDLC_PREAMBLE_LENGTH_8BITS,	/* unsigned char preamble_length; */
     98	HDLC_PREAMBLE_PATTERN_NONE,	/* unsigned char preamble; */
     99	9600,				/* unsigned long data_rate; */
    100	8,				/* unsigned char data_bits; */
    101	1,				/* unsigned char stop_bits; */
    102	ASYNC_PARITY_NONE		/* unsigned char parity; */
    103};
    104
    105typedef struct {
    106	int count;
    107	unsigned char status;
    108	char data[1];
    109} RXBUF;
    110
    111/* The queue of BH actions to be performed */
    112
    113#define BH_RECEIVE  1
    114#define BH_TRANSMIT 2
    115#define BH_STATUS   4
    116
    117#define IO_PIN_SHUTDOWN_LIMIT 100
    118
    119#define RELEVANT_IFLAG(iflag) (iflag & (IGNBRK|BRKINT|IGNPAR|PARMRK|INPCK))
    120
    121struct _input_signal_events {
    122	int	ri_up;
    123	int	ri_down;
    124	int	dsr_up;
    125	int	dsr_down;
    126	int	dcd_up;
    127	int	dcd_down;
    128	int	cts_up;
    129	int	cts_down;
    130};
    131
    132
    133/*
    134 * Device instance data structure
    135 */
    136
    137typedef struct _mgslpc_info {
    138	struct tty_port		port;
    139	void *if_ptr;	/* General purpose pointer (used by SPPP) */
    140	int			magic;
    141	int			line;
    142
    143	struct mgsl_icount	icount;
    144
    145	int			timeout;
    146	int			x_char;		/* xon/xoff character */
    147	unsigned char		read_status_mask;
    148	unsigned char		ignore_status_mask;
    149
    150	unsigned char *tx_buf;
    151	int            tx_put;
    152	int            tx_get;
    153	int            tx_count;
    154
    155	/* circular list of fixed length rx buffers */
    156
    157	unsigned char  *rx_buf;        /* memory allocated for all rx buffers */
    158	int            rx_buf_total_size; /* size of memory allocated for rx buffers */
    159	int            rx_put;         /* index of next empty rx buffer */
    160	int            rx_get;         /* index of next full rx buffer */
    161	int            rx_buf_size;    /* size in bytes of single rx buffer */
    162	int            rx_buf_count;   /* total number of rx buffers */
    163	int            rx_frame_count; /* number of full rx buffers */
    164
    165	wait_queue_head_t	status_event_wait_q;
    166	wait_queue_head_t	event_wait_q;
    167	struct timer_list	tx_timer;	/* HDLC transmit timeout timer */
    168	struct _mgslpc_info	*next_device;	/* device list link */
    169
    170	unsigned short imra_value;
    171	unsigned short imrb_value;
    172	unsigned char  pim_value;
    173
    174	spinlock_t lock;
    175	struct work_struct task;		/* task structure for scheduling bh */
    176
    177	u32 max_frame_size;
    178
    179	u32 pending_bh;
    180
    181	bool bh_running;
    182	bool bh_requested;
    183
    184	int dcd_chkcount; /* check counts to prevent */
    185	int cts_chkcount; /* too many IRQs if a signal */
    186	int dsr_chkcount; /* is floating */
    187	int ri_chkcount;
    188
    189	bool rx_enabled;
    190	bool rx_overflow;
    191
    192	bool tx_enabled;
    193	bool tx_active;
    194	bool tx_aborting;
    195	u32 idle_mode;
    196
    197	int if_mode; /* serial interface selection (RS-232, v.35 etc) */
    198
    199	char device_name[25];		/* device instance name */
    200
    201	unsigned int io_base;	/* base I/O address of adapter */
    202	unsigned int irq_level;
    203
    204	MGSL_PARAMS params;		/* communications parameters */
    205
    206	unsigned char serial_signals;	/* current serial signal states */
    207
    208	bool irq_occurred;		/* for diagnostics use */
    209	char testing_irq;
    210	unsigned int init_error;	/* startup error (DIAGS)	*/
    211
    212	char *flag_buf;
    213	bool drop_rts_on_tx_done;
    214
    215	struct	_input_signal_events	input_signal_events;
    216
    217	/* PCMCIA support */
    218	struct pcmcia_device	*p_dev;
    219	int		      stop;
    220
    221	/* SPPP/Cisco HDLC device parts */
    222	int netcount;
    223	spinlock_t netlock;
    224
    225#if SYNCLINK_GENERIC_HDLC
    226	struct net_device *netdev;
    227#endif
    228
    229} MGSLPC_INFO;
    230
    231#define MGSLPC_MAGIC 0x5402
    232
    233/*
    234 * The size of the serial xmit buffer is 1 page, or 4096 bytes
    235 */
    236#define TXBUFSIZE 4096
    237
    238
    239#define CHA     0x00   /* channel A offset */
    240#define CHB     0x40   /* channel B offset */
    241
    242/*
    243 *  FIXME: PPC has PVR defined in asm/reg.h.  For now we just undef it.
    244 */
    245#undef PVR
    246
    247#define RXFIFO  0
    248#define TXFIFO  0
    249#define STAR    0x20
    250#define CMDR    0x20
    251#define RSTA    0x21
    252#define PRE     0x21
    253#define MODE    0x22
    254#define TIMR    0x23
    255#define XAD1    0x24
    256#define XAD2    0x25
    257#define RAH1    0x26
    258#define RAH2    0x27
    259#define DAFO    0x27
    260#define RAL1    0x28
    261#define RFC     0x28
    262#define RHCR    0x29
    263#define RAL2    0x29
    264#define RBCL    0x2a
    265#define XBCL    0x2a
    266#define RBCH    0x2b
    267#define XBCH    0x2b
    268#define CCR0    0x2c
    269#define CCR1    0x2d
    270#define CCR2    0x2e
    271#define CCR3    0x2f
    272#define VSTR    0x34
    273#define BGR     0x34
    274#define RLCR    0x35
    275#define AML     0x36
    276#define AMH     0x37
    277#define GIS     0x38
    278#define IVA     0x38
    279#define IPC     0x39
    280#define ISR     0x3a
    281#define IMR     0x3a
    282#define PVR     0x3c
    283#define PIS     0x3d
    284#define PIM     0x3d
    285#define PCR     0x3e
    286#define CCR4    0x3f
    287
    288// IMR/ISR
    289
    290#define IRQ_BREAK_ON    BIT15   // rx break detected
    291#define IRQ_DATAOVERRUN BIT14	// receive data overflow
    292#define IRQ_ALLSENT     BIT13	// all sent
    293#define IRQ_UNDERRUN    BIT12	// transmit data underrun
    294#define IRQ_TIMER       BIT11	// timer interrupt
    295#define IRQ_CTS         BIT10	// CTS status change
    296#define IRQ_TXREPEAT    BIT9	// tx message repeat
    297#define IRQ_TXFIFO      BIT8	// transmit pool ready
    298#define IRQ_RXEOM       BIT7	// receive message end
    299#define IRQ_EXITHUNT    BIT6	// receive frame start
    300#define IRQ_RXTIME      BIT6    // rx char timeout
    301#define IRQ_DCD         BIT2	// carrier detect status change
    302#define IRQ_OVERRUN     BIT1	// receive frame overflow
    303#define IRQ_RXFIFO      BIT0	// receive pool full
    304
    305// STAR
    306
    307#define XFW   BIT6		// transmit FIFO write enable
    308#define CEC   BIT2		// command executing
    309#define CTS   BIT1		// CTS state
    310
    311#define PVR_DTR      BIT0
    312#define PVR_DSR      BIT1
    313#define PVR_RI       BIT2
    314#define PVR_AUTOCTS  BIT3
    315#define PVR_RS232    0x20   /* 0010b */
    316#define PVR_V35      0xe0   /* 1110b */
    317#define PVR_RS422    0x40   /* 0100b */
    318
    319/* Register access functions */
    320
    321#define write_reg(info, reg, val) outb((val),(info)->io_base + (reg))
    322#define read_reg(info, reg) inb((info)->io_base + (reg))
    323
    324#define read_reg16(info, reg) inw((info)->io_base + (reg))
    325#define write_reg16(info, reg, val) outw((val), (info)->io_base + (reg))
    326
    327#define set_reg_bits(info, reg, mask) \
    328	write_reg(info, (reg), \
    329		 (unsigned char) (read_reg(info, (reg)) | (mask)))
    330#define clear_reg_bits(info, reg, mask) \
    331	write_reg(info, (reg), \
    332		 (unsigned char) (read_reg(info, (reg)) & ~(mask)))
    333/*
    334 * interrupt enable/disable routines
    335 */
    336static void irq_disable(MGSLPC_INFO *info, unsigned char channel, unsigned short mask)
    337{
    338	if (channel == CHA) {
    339		info->imra_value |= mask;
    340		write_reg16(info, CHA + IMR, info->imra_value);
    341	} else {
    342		info->imrb_value |= mask;
    343		write_reg16(info, CHB + IMR, info->imrb_value);
    344	}
    345}
    346static void irq_enable(MGSLPC_INFO *info, unsigned char channel, unsigned short mask)
    347{
    348	if (channel == CHA) {
    349		info->imra_value &= ~mask;
    350		write_reg16(info, CHA + IMR, info->imra_value);
    351	} else {
    352		info->imrb_value &= ~mask;
    353		write_reg16(info, CHB + IMR, info->imrb_value);
    354	}
    355}
    356
    357#define port_irq_disable(info, mask) \
    358	{ info->pim_value |= (mask); write_reg(info, PIM, info->pim_value); }
    359
    360#define port_irq_enable(info, mask) \
    361	{ info->pim_value &= ~(mask); write_reg(info, PIM, info->pim_value); }
    362
    363static void rx_start(MGSLPC_INFO *info);
    364static void rx_stop(MGSLPC_INFO *info);
    365
    366static void tx_start(MGSLPC_INFO *info, struct tty_struct *tty);
    367static void tx_stop(MGSLPC_INFO *info);
    368static void tx_set_idle(MGSLPC_INFO *info);
    369
    370static void get_signals(MGSLPC_INFO *info);
    371static void set_signals(MGSLPC_INFO *info);
    372
    373static void reset_device(MGSLPC_INFO *info);
    374
    375static void hdlc_mode(MGSLPC_INFO *info);
    376static void async_mode(MGSLPC_INFO *info);
    377
    378static void tx_timeout(struct timer_list *t);
    379
    380static int carrier_raised(struct tty_port *port);
    381static void dtr_rts(struct tty_port *port, int onoff);
    382
    383#if SYNCLINK_GENERIC_HDLC
    384#define dev_to_port(D) (dev_to_hdlc(D)->priv)
    385static void hdlcdev_tx_done(MGSLPC_INFO *info);
    386static void hdlcdev_rx(MGSLPC_INFO *info, char *buf, int size);
    387static int  hdlcdev_init(MGSLPC_INFO *info);
    388static void hdlcdev_exit(MGSLPC_INFO *info);
    389#endif
    390
    391static void trace_block(MGSLPC_INFO *info,const char* data, int count, int xmit);
    392
    393static bool register_test(MGSLPC_INFO *info);
    394static bool irq_test(MGSLPC_INFO *info);
    395static int adapter_test(MGSLPC_INFO *info);
    396
    397static int claim_resources(MGSLPC_INFO *info);
    398static void release_resources(MGSLPC_INFO *info);
    399static int mgslpc_add_device(MGSLPC_INFO *info);
    400static void mgslpc_remove_device(MGSLPC_INFO *info);
    401
    402static bool rx_get_frame(MGSLPC_INFO *info, struct tty_struct *tty);
    403static void rx_reset_buffers(MGSLPC_INFO *info);
    404static int  rx_alloc_buffers(MGSLPC_INFO *info);
    405static void rx_free_buffers(MGSLPC_INFO *info);
    406
    407static irqreturn_t mgslpc_isr(int irq, void *dev_id);
    408
    409/*
    410 * Bottom half interrupt handlers
    411 */
    412static void bh_handler(struct work_struct *work);
    413static void bh_transmit(MGSLPC_INFO *info, struct tty_struct *tty);
    414static void bh_status(MGSLPC_INFO *info);
    415
    416/*
    417 * ioctl handlers
    418 */
    419static int tiocmget(struct tty_struct *tty);
    420static int tiocmset(struct tty_struct *tty,
    421					unsigned int set, unsigned int clear);
    422static int get_stats(MGSLPC_INFO *info, struct mgsl_icount __user *user_icount);
    423static int get_params(MGSLPC_INFO *info, MGSL_PARAMS __user *user_params);
    424static int set_params(MGSLPC_INFO *info, MGSL_PARAMS __user *new_params, struct tty_struct *tty);
    425static int get_txidle(MGSLPC_INFO *info, int __user *idle_mode);
    426static int set_txidle(MGSLPC_INFO *info, int idle_mode);
    427static int set_txenable(MGSLPC_INFO *info, int enable, struct tty_struct *tty);
    428static int tx_abort(MGSLPC_INFO *info);
    429static int set_rxenable(MGSLPC_INFO *info, int enable);
    430static int wait_events(MGSLPC_INFO *info, int __user *mask);
    431
    432static MGSLPC_INFO *mgslpc_device_list = NULL;
    433static int mgslpc_device_count = 0;
    434
    435/*
    436 * Set this param to non-zero to load eax with the
    437 * .text section address and breakpoint on module load.
    438 * This is useful for use with gdb and add-symbol-file command.
    439 */
    440static bool break_on_load;
    441
    442/*
    443 * Driver major number, defaults to zero to get auto
    444 * assigned major number. May be forced as module parameter.
    445 */
    446static int ttymajor=0;
    447
    448static int debug_level = 0;
    449static int maxframe[MAX_DEVICE_COUNT] = {0,};
    450
    451module_param(break_on_load, bool, 0);
    452module_param(ttymajor, int, 0);
    453module_param(debug_level, int, 0);
    454module_param_array(maxframe, int, NULL, 0);
    455
    456MODULE_LICENSE("GPL");
    457
    458static char *driver_name = "SyncLink PC Card driver";
    459static char *driver_version = "$Revision: 4.34 $";
    460
    461static struct tty_driver *serial_driver;
    462
    463/* number of characters left in xmit buffer before we ask for more */
    464#define WAKEUP_CHARS 256
    465
    466static void mgslpc_change_params(MGSLPC_INFO *info, struct tty_struct *tty);
    467static void mgslpc_wait_until_sent(struct tty_struct *tty, int timeout);
    468
    469/* PCMCIA prototypes */
    470
    471static int mgslpc_config(struct pcmcia_device *link);
    472static void mgslpc_release(u_long arg);
    473static void mgslpc_detach(struct pcmcia_device *p_dev);
    474
    475/*
    476 * 1st function defined in .text section. Calling this function in
    477 * init_module() followed by a breakpoint allows a remote debugger
    478 * (gdb) to get the .text address for the add-symbol-file command.
    479 * This allows remote debugging of dynamically loadable modules.
    480 */
    481static void* mgslpc_get_text_ptr(void)
    482{
    483	return mgslpc_get_text_ptr;
    484}
    485
    486/**
    487 * line discipline callback wrappers
    488 *
    489 * The wrappers maintain line discipline references
    490 * while calling into the line discipline.
    491 *
    492 * ldisc_receive_buf  - pass receive data to line discipline
    493 */
    494
    495static void ldisc_receive_buf(struct tty_struct *tty,
    496			      const __u8 *data, char *flags, int count)
    497{
    498	struct tty_ldisc *ld;
    499	if (!tty)
    500		return;
    501	ld = tty_ldisc_ref(tty);
    502	if (ld) {
    503		if (ld->ops->receive_buf)
    504			ld->ops->receive_buf(tty, data, flags, count);
    505		tty_ldisc_deref(ld);
    506	}
    507}
    508
    509static const struct tty_port_operations mgslpc_port_ops = {
    510	.carrier_raised = carrier_raised,
    511	.dtr_rts = dtr_rts
    512};
    513
    514static int mgslpc_probe(struct pcmcia_device *link)
    515{
    516	MGSLPC_INFO *info;
    517	int ret;
    518
    519	if (debug_level >= DEBUG_LEVEL_INFO)
    520		printk("mgslpc_attach\n");
    521
    522	info = kzalloc(sizeof(MGSLPC_INFO), GFP_KERNEL);
    523	if (!info) {
    524		printk("Error can't allocate device instance data\n");
    525		return -ENOMEM;
    526	}
    527
    528	info->magic = MGSLPC_MAGIC;
    529	tty_port_init(&info->port);
    530	info->port.ops = &mgslpc_port_ops;
    531	INIT_WORK(&info->task, bh_handler);
    532	info->max_frame_size = 4096;
    533	init_waitqueue_head(&info->status_event_wait_q);
    534	init_waitqueue_head(&info->event_wait_q);
    535	spin_lock_init(&info->lock);
    536	spin_lock_init(&info->netlock);
    537	memcpy(&info->params,&default_params,sizeof(MGSL_PARAMS));
    538	info->idle_mode = HDLC_TXIDLE_FLAGS;
    539	info->imra_value = 0xffff;
    540	info->imrb_value = 0xffff;
    541	info->pim_value = 0xff;
    542
    543	info->p_dev = link;
    544	link->priv = info;
    545
    546	/* Initialize the struct pcmcia_device structure */
    547
    548	ret = mgslpc_config(link);
    549	if (ret != 0)
    550		goto failed;
    551
    552	ret = mgslpc_add_device(info);
    553	if (ret != 0)
    554		goto failed_release;
    555
    556	return 0;
    557
    558failed_release:
    559	mgslpc_release((u_long)link);
    560failed:
    561	tty_port_destroy(&info->port);
    562	kfree(info);
    563	return ret;
    564}
    565
    566/* Card has been inserted.
    567 */
    568
    569static int mgslpc_ioprobe(struct pcmcia_device *p_dev, void *priv_data)
    570{
    571	return pcmcia_request_io(p_dev);
    572}
    573
    574static int mgslpc_config(struct pcmcia_device *link)
    575{
    576	MGSLPC_INFO *info = link->priv;
    577	int ret;
    578
    579	if (debug_level >= DEBUG_LEVEL_INFO)
    580		printk("mgslpc_config(0x%p)\n", link);
    581
    582	link->config_flags |= CONF_ENABLE_IRQ | CONF_AUTO_SET_IO;
    583
    584	ret = pcmcia_loop_config(link, mgslpc_ioprobe, NULL);
    585	if (ret != 0)
    586		goto failed;
    587
    588	link->config_index = 8;
    589	link->config_regs = PRESENT_OPTION;
    590
    591	ret = pcmcia_request_irq(link, mgslpc_isr);
    592	if (ret)
    593		goto failed;
    594	ret = pcmcia_enable_device(link);
    595	if (ret)
    596		goto failed;
    597
    598	info->io_base = link->resource[0]->start;
    599	info->irq_level = link->irq;
    600	return 0;
    601
    602failed:
    603	mgslpc_release((u_long)link);
    604	return -ENODEV;
    605}
    606
    607/* Card has been removed.
    608 * Unregister device and release PCMCIA configuration.
    609 * If device is open, postpone until it is closed.
    610 */
    611static void mgslpc_release(u_long arg)
    612{
    613	struct pcmcia_device *link = (struct pcmcia_device *)arg;
    614
    615	if (debug_level >= DEBUG_LEVEL_INFO)
    616		printk("mgslpc_release(0x%p)\n", link);
    617
    618	pcmcia_disable_device(link);
    619}
    620
    621static void mgslpc_detach(struct pcmcia_device *link)
    622{
    623	if (debug_level >= DEBUG_LEVEL_INFO)
    624		printk("mgslpc_detach(0x%p)\n", link);
    625
    626	((MGSLPC_INFO *)link->priv)->stop = 1;
    627	mgslpc_release((u_long)link);
    628
    629	mgslpc_remove_device((MGSLPC_INFO *)link->priv);
    630}
    631
    632static int mgslpc_suspend(struct pcmcia_device *link)
    633{
    634	MGSLPC_INFO *info = link->priv;
    635
    636	info->stop = 1;
    637
    638	return 0;
    639}
    640
    641static int mgslpc_resume(struct pcmcia_device *link)
    642{
    643	MGSLPC_INFO *info = link->priv;
    644
    645	info->stop = 0;
    646
    647	return 0;
    648}
    649
    650
    651static inline bool mgslpc_paranoia_check(MGSLPC_INFO *info,
    652					char *name, const char *routine)
    653{
    654#ifdef MGSLPC_PARANOIA_CHECK
    655	static const char *badmagic =
    656		"Warning: bad magic number for mgsl struct (%s) in %s\n";
    657	static const char *badinfo =
    658		"Warning: null mgslpc_info for (%s) in %s\n";
    659
    660	if (!info) {
    661		printk(badinfo, name, routine);
    662		return true;
    663	}
    664	if (info->magic != MGSLPC_MAGIC) {
    665		printk(badmagic, name, routine);
    666		return true;
    667	}
    668#else
    669	if (!info)
    670		return true;
    671#endif
    672	return false;
    673}
    674
    675
    676#define CMD_RXFIFO      BIT7	// release current rx FIFO
    677#define CMD_RXRESET     BIT6	// receiver reset
    678#define CMD_RXFIFO_READ BIT5
    679#define CMD_START_TIMER BIT4
    680#define CMD_TXFIFO      BIT3	// release current tx FIFO
    681#define CMD_TXEOM       BIT1	// transmit end message
    682#define CMD_TXRESET     BIT0	// transmit reset
    683
    684static bool wait_command_complete(MGSLPC_INFO *info, unsigned char channel)
    685{
    686	int i = 0;
    687	/* wait for command completion */
    688	while (read_reg(info, (unsigned char)(channel+STAR)) & BIT2) {
    689		udelay(1);
    690		if (i++ == 1000)
    691			return false;
    692	}
    693	return true;
    694}
    695
    696static void issue_command(MGSLPC_INFO *info, unsigned char channel, unsigned char cmd)
    697{
    698	wait_command_complete(info, channel);
    699	write_reg(info, (unsigned char) (channel + CMDR), cmd);
    700}
    701
    702static void tx_pause(struct tty_struct *tty)
    703{
    704	MGSLPC_INFO *info = (MGSLPC_INFO *)tty->driver_data;
    705	unsigned long flags;
    706
    707	if (mgslpc_paranoia_check(info, tty->name, "tx_pause"))
    708		return;
    709	if (debug_level >= DEBUG_LEVEL_INFO)
    710		printk("tx_pause(%s)\n", info->device_name);
    711
    712	spin_lock_irqsave(&info->lock, flags);
    713	if (info->tx_enabled)
    714		tx_stop(info);
    715	spin_unlock_irqrestore(&info->lock, flags);
    716}
    717
    718static void tx_release(struct tty_struct *tty)
    719{
    720	MGSLPC_INFO *info = (MGSLPC_INFO *)tty->driver_data;
    721	unsigned long flags;
    722
    723	if (mgslpc_paranoia_check(info, tty->name, "tx_release"))
    724		return;
    725	if (debug_level >= DEBUG_LEVEL_INFO)
    726		printk("tx_release(%s)\n", info->device_name);
    727
    728	spin_lock_irqsave(&info->lock, flags);
    729	if (!info->tx_enabled)
    730		tx_start(info, tty);
    731	spin_unlock_irqrestore(&info->lock, flags);
    732}
    733
    734/* Return next bottom half action to perform.
    735 * or 0 if nothing to do.
    736 */
    737static int bh_action(MGSLPC_INFO *info)
    738{
    739	unsigned long flags;
    740	int rc = 0;
    741
    742	spin_lock_irqsave(&info->lock, flags);
    743
    744	if (info->pending_bh & BH_RECEIVE) {
    745		info->pending_bh &= ~BH_RECEIVE;
    746		rc = BH_RECEIVE;
    747	} else if (info->pending_bh & BH_TRANSMIT) {
    748		info->pending_bh &= ~BH_TRANSMIT;
    749		rc = BH_TRANSMIT;
    750	} else if (info->pending_bh & BH_STATUS) {
    751		info->pending_bh &= ~BH_STATUS;
    752		rc = BH_STATUS;
    753	}
    754
    755	if (!rc) {
    756		/* Mark BH routine as complete */
    757		info->bh_running = false;
    758		info->bh_requested = false;
    759	}
    760
    761	spin_unlock_irqrestore(&info->lock, flags);
    762
    763	return rc;
    764}
    765
    766static void bh_handler(struct work_struct *work)
    767{
    768	MGSLPC_INFO *info = container_of(work, MGSLPC_INFO, task);
    769	struct tty_struct *tty;
    770	int action;
    771
    772	if (debug_level >= DEBUG_LEVEL_BH)
    773		printk("%s(%d):bh_handler(%s) entry\n",
    774			__FILE__,__LINE__,info->device_name);
    775
    776	info->bh_running = true;
    777	tty = tty_port_tty_get(&info->port);
    778
    779	while((action = bh_action(info)) != 0) {
    780
    781		/* Process work item */
    782		if (debug_level >= DEBUG_LEVEL_BH)
    783			printk("%s(%d):bh_handler() work item action=%d\n",
    784				__FILE__,__LINE__,action);
    785
    786		switch (action) {
    787
    788		case BH_RECEIVE:
    789			while(rx_get_frame(info, tty));
    790			break;
    791		case BH_TRANSMIT:
    792			bh_transmit(info, tty);
    793			break;
    794		case BH_STATUS:
    795			bh_status(info);
    796			break;
    797		default:
    798			/* unknown work item ID */
    799			printk("Unknown work item ID=%08X!\n", action);
    800			break;
    801		}
    802	}
    803
    804	tty_kref_put(tty);
    805	if (debug_level >= DEBUG_LEVEL_BH)
    806		printk("%s(%d):bh_handler(%s) exit\n",
    807			__FILE__,__LINE__,info->device_name);
    808}
    809
    810static void bh_transmit(MGSLPC_INFO *info, struct tty_struct *tty)
    811{
    812	if (debug_level >= DEBUG_LEVEL_BH)
    813		printk("bh_transmit() entry on %s\n", info->device_name);
    814
    815	if (tty)
    816		tty_wakeup(tty);
    817}
    818
    819static void bh_status(MGSLPC_INFO *info)
    820{
    821	info->ri_chkcount = 0;
    822	info->dsr_chkcount = 0;
    823	info->dcd_chkcount = 0;
    824	info->cts_chkcount = 0;
    825}
    826
    827/* eom: non-zero = end of frame */
    828static void rx_ready_hdlc(MGSLPC_INFO *info, int eom)
    829{
    830	unsigned char data[2];
    831	unsigned char fifo_count, read_count, i;
    832	RXBUF *buf = (RXBUF*)(info->rx_buf + (info->rx_put * info->rx_buf_size));
    833
    834	if (debug_level >= DEBUG_LEVEL_ISR)
    835		printk("%s(%d):rx_ready_hdlc(eom=%d)\n", __FILE__, __LINE__, eom);
    836
    837	if (!info->rx_enabled)
    838		return;
    839
    840	if (info->rx_frame_count >= info->rx_buf_count) {
    841		/* no more free buffers */
    842		issue_command(info, CHA, CMD_RXRESET);
    843		info->pending_bh |= BH_RECEIVE;
    844		info->rx_overflow = true;
    845		info->icount.buf_overrun++;
    846		return;
    847	}
    848
    849	if (eom) {
    850		/* end of frame, get FIFO count from RBCL register */
    851		fifo_count = (unsigned char)(read_reg(info, CHA+RBCL) & 0x1f);
    852		if (fifo_count == 0)
    853			fifo_count = 32;
    854	} else
    855		fifo_count = 32;
    856
    857	do {
    858		if (fifo_count == 1) {
    859			read_count = 1;
    860			data[0] = read_reg(info, CHA + RXFIFO);
    861		} else {
    862			read_count = 2;
    863			*((unsigned short *) data) = read_reg16(info, CHA + RXFIFO);
    864		}
    865		fifo_count -= read_count;
    866		if (!fifo_count && eom)
    867			buf->status = data[--read_count];
    868
    869		for (i = 0; i < read_count; i++) {
    870			if (buf->count >= info->max_frame_size) {
    871				/* frame too large, reset receiver and reset current buffer */
    872				issue_command(info, CHA, CMD_RXRESET);
    873				buf->count = 0;
    874				return;
    875			}
    876			*(buf->data + buf->count) = data[i];
    877			buf->count++;
    878		}
    879	} while (fifo_count);
    880
    881	if (eom) {
    882		info->pending_bh |= BH_RECEIVE;
    883		info->rx_frame_count++;
    884		info->rx_put++;
    885		if (info->rx_put >= info->rx_buf_count)
    886			info->rx_put = 0;
    887	}
    888	issue_command(info, CHA, CMD_RXFIFO);
    889}
    890
    891static void rx_ready_async(MGSLPC_INFO *info, int tcd)
    892{
    893	struct tty_port *port = &info->port;
    894	unsigned char data, status, flag;
    895	int fifo_count;
    896	int work = 0;
    897	struct mgsl_icount *icount = &info->icount;
    898
    899	if (tcd) {
    900		/* early termination, get FIFO count from RBCL register */
    901		fifo_count = (unsigned char)(read_reg(info, CHA+RBCL) & 0x1f);
    902
    903		/* Zero fifo count could mean 0 or 32 bytes available.
    904		 * If BIT5 of STAR is set then at least 1 byte is available.
    905		 */
    906		if (!fifo_count && (read_reg(info,CHA+STAR) & BIT5))
    907			fifo_count = 32;
    908	} else
    909		fifo_count = 32;
    910
    911	tty_buffer_request_room(port, fifo_count);
    912	/* Flush received async data to receive data buffer. */
    913	while (fifo_count) {
    914		data   = read_reg(info, CHA + RXFIFO);
    915		status = read_reg(info, CHA + RXFIFO);
    916		fifo_count -= 2;
    917
    918		icount->rx++;
    919		flag = TTY_NORMAL;
    920
    921		// if no frameing/crc error then save data
    922		// BIT7:parity error
    923		// BIT6:framing error
    924
    925		if (status & (BIT7 | BIT6)) {
    926			if (status & BIT7)
    927				icount->parity++;
    928			else
    929				icount->frame++;
    930
    931			/* discard char if tty control flags say so */
    932			if (status & info->ignore_status_mask)
    933				continue;
    934
    935			status &= info->read_status_mask;
    936
    937			if (status & BIT7)
    938				flag = TTY_PARITY;
    939			else if (status & BIT6)
    940				flag = TTY_FRAME;
    941		}
    942		work += tty_insert_flip_char(port, data, flag);
    943	}
    944	issue_command(info, CHA, CMD_RXFIFO);
    945
    946	if (debug_level >= DEBUG_LEVEL_ISR) {
    947		printk("%s(%d):rx_ready_async",
    948			__FILE__,__LINE__);
    949		printk("%s(%d):rx=%d brk=%d parity=%d frame=%d overrun=%d\n",
    950			__FILE__,__LINE__,icount->rx,icount->brk,
    951			icount->parity,icount->frame,icount->overrun);
    952	}
    953
    954	if (work)
    955		tty_flip_buffer_push(port);
    956}
    957
    958
    959static void tx_done(MGSLPC_INFO *info, struct tty_struct *tty)
    960{
    961	if (!info->tx_active)
    962		return;
    963
    964	info->tx_active = false;
    965	info->tx_aborting = false;
    966
    967	if (info->params.mode == MGSL_MODE_ASYNC)
    968		return;
    969
    970	info->tx_count = info->tx_put = info->tx_get = 0;
    971	del_timer(&info->tx_timer);
    972
    973	if (info->drop_rts_on_tx_done) {
    974		get_signals(info);
    975		if (info->serial_signals & SerialSignal_RTS) {
    976			info->serial_signals &= ~SerialSignal_RTS;
    977			set_signals(info);
    978		}
    979		info->drop_rts_on_tx_done = false;
    980	}
    981
    982#if SYNCLINK_GENERIC_HDLC
    983	if (info->netcount)
    984		hdlcdev_tx_done(info);
    985	else
    986#endif
    987	{
    988		if (tty && (tty->flow.stopped || tty->hw_stopped)) {
    989			tx_stop(info);
    990			return;
    991		}
    992		info->pending_bh |= BH_TRANSMIT;
    993	}
    994}
    995
    996static void tx_ready(MGSLPC_INFO *info, struct tty_struct *tty)
    997{
    998	unsigned char fifo_count = 32;
    999	int c;
   1000
   1001	if (debug_level >= DEBUG_LEVEL_ISR)
   1002		printk("%s(%d):tx_ready(%s)\n", __FILE__, __LINE__, info->device_name);
   1003
   1004	if (info->params.mode == MGSL_MODE_HDLC) {
   1005		if (!info->tx_active)
   1006			return;
   1007	} else {
   1008		if (tty && (tty->flow.stopped || tty->hw_stopped)) {
   1009			tx_stop(info);
   1010			return;
   1011		}
   1012		if (!info->tx_count)
   1013			info->tx_active = false;
   1014	}
   1015
   1016	if (!info->tx_count)
   1017		return;
   1018
   1019	while (info->tx_count && fifo_count) {
   1020		c = min(2, min_t(int, fifo_count, min(info->tx_count, TXBUFSIZE - info->tx_get)));
   1021
   1022		if (c == 1) {
   1023			write_reg(info, CHA + TXFIFO, *(info->tx_buf + info->tx_get));
   1024		} else {
   1025			write_reg16(info, CHA + TXFIFO,
   1026					  *((unsigned short*)(info->tx_buf + info->tx_get)));
   1027		}
   1028		info->tx_count -= c;
   1029		info->tx_get = (info->tx_get + c) & (TXBUFSIZE - 1);
   1030		fifo_count -= c;
   1031	}
   1032
   1033	if (info->params.mode == MGSL_MODE_ASYNC) {
   1034		if (info->tx_count < WAKEUP_CHARS)
   1035			info->pending_bh |= BH_TRANSMIT;
   1036		issue_command(info, CHA, CMD_TXFIFO);
   1037	} else {
   1038		if (info->tx_count)
   1039			issue_command(info, CHA, CMD_TXFIFO);
   1040		else
   1041			issue_command(info, CHA, CMD_TXFIFO + CMD_TXEOM);
   1042	}
   1043}
   1044
   1045static void cts_change(MGSLPC_INFO *info, struct tty_struct *tty)
   1046{
   1047	get_signals(info);
   1048	if ((info->cts_chkcount)++ >= IO_PIN_SHUTDOWN_LIMIT)
   1049		irq_disable(info, CHB, IRQ_CTS);
   1050	info->icount.cts++;
   1051	if (info->serial_signals & SerialSignal_CTS)
   1052		info->input_signal_events.cts_up++;
   1053	else
   1054		info->input_signal_events.cts_down++;
   1055	wake_up_interruptible(&info->status_event_wait_q);
   1056	wake_up_interruptible(&info->event_wait_q);
   1057
   1058	if (tty && tty_port_cts_enabled(&info->port)) {
   1059		if (tty->hw_stopped) {
   1060			if (info->serial_signals & SerialSignal_CTS) {
   1061				if (debug_level >= DEBUG_LEVEL_ISR)
   1062					printk("CTS tx start...");
   1063				tty->hw_stopped = 0;
   1064				tx_start(info, tty);
   1065				info->pending_bh |= BH_TRANSMIT;
   1066				return;
   1067			}
   1068		} else {
   1069			if (!(info->serial_signals & SerialSignal_CTS)) {
   1070				if (debug_level >= DEBUG_LEVEL_ISR)
   1071					printk("CTS tx stop...");
   1072				tty->hw_stopped = 1;
   1073				tx_stop(info);
   1074			}
   1075		}
   1076	}
   1077	info->pending_bh |= BH_STATUS;
   1078}
   1079
   1080static void dcd_change(MGSLPC_INFO *info, struct tty_struct *tty)
   1081{
   1082	get_signals(info);
   1083	if ((info->dcd_chkcount)++ >= IO_PIN_SHUTDOWN_LIMIT)
   1084		irq_disable(info, CHB, IRQ_DCD);
   1085	info->icount.dcd++;
   1086	if (info->serial_signals & SerialSignal_DCD) {
   1087		info->input_signal_events.dcd_up++;
   1088	}
   1089	else
   1090		info->input_signal_events.dcd_down++;
   1091#if SYNCLINK_GENERIC_HDLC
   1092	if (info->netcount) {
   1093		if (info->serial_signals & SerialSignal_DCD)
   1094			netif_carrier_on(info->netdev);
   1095		else
   1096			netif_carrier_off(info->netdev);
   1097	}
   1098#endif
   1099	wake_up_interruptible(&info->status_event_wait_q);
   1100	wake_up_interruptible(&info->event_wait_q);
   1101
   1102	if (tty_port_check_carrier(&info->port)) {
   1103		if (debug_level >= DEBUG_LEVEL_ISR)
   1104			printk("%s CD now %s...", info->device_name,
   1105			       (info->serial_signals & SerialSignal_DCD) ? "on" : "off");
   1106		if (info->serial_signals & SerialSignal_DCD)
   1107			wake_up_interruptible(&info->port.open_wait);
   1108		else {
   1109			if (debug_level >= DEBUG_LEVEL_ISR)
   1110				printk("doing serial hangup...");
   1111			if (tty)
   1112				tty_hangup(tty);
   1113		}
   1114	}
   1115	info->pending_bh |= BH_STATUS;
   1116}
   1117
   1118static void dsr_change(MGSLPC_INFO *info)
   1119{
   1120	get_signals(info);
   1121	if ((info->dsr_chkcount)++ >= IO_PIN_SHUTDOWN_LIMIT)
   1122		port_irq_disable(info, PVR_DSR);
   1123	info->icount.dsr++;
   1124	if (info->serial_signals & SerialSignal_DSR)
   1125		info->input_signal_events.dsr_up++;
   1126	else
   1127		info->input_signal_events.dsr_down++;
   1128	wake_up_interruptible(&info->status_event_wait_q);
   1129	wake_up_interruptible(&info->event_wait_q);
   1130	info->pending_bh |= BH_STATUS;
   1131}
   1132
   1133static void ri_change(MGSLPC_INFO *info)
   1134{
   1135	get_signals(info);
   1136	if ((info->ri_chkcount)++ >= IO_PIN_SHUTDOWN_LIMIT)
   1137		port_irq_disable(info, PVR_RI);
   1138	info->icount.rng++;
   1139	if (info->serial_signals & SerialSignal_RI)
   1140		info->input_signal_events.ri_up++;
   1141	else
   1142		info->input_signal_events.ri_down++;
   1143	wake_up_interruptible(&info->status_event_wait_q);
   1144	wake_up_interruptible(&info->event_wait_q);
   1145	info->pending_bh |= BH_STATUS;
   1146}
   1147
   1148/* Interrupt service routine entry point.
   1149 *
   1150 * Arguments:
   1151 *
   1152 * irq     interrupt number that caused interrupt
   1153 * dev_id  device ID supplied during interrupt registration
   1154 */
   1155static irqreturn_t mgslpc_isr(int dummy, void *dev_id)
   1156{
   1157	MGSLPC_INFO *info = dev_id;
   1158	struct tty_struct *tty;
   1159	unsigned short isr;
   1160	unsigned char gis, pis;
   1161	int count=0;
   1162
   1163	if (debug_level >= DEBUG_LEVEL_ISR)
   1164		printk("mgslpc_isr(%d) entry.\n", info->irq_level);
   1165
   1166	if (!(info->p_dev->_locked))
   1167		return IRQ_HANDLED;
   1168
   1169	tty = tty_port_tty_get(&info->port);
   1170
   1171	spin_lock(&info->lock);
   1172
   1173	while ((gis = read_reg(info, CHA + GIS))) {
   1174		if (debug_level >= DEBUG_LEVEL_ISR)
   1175			printk("mgslpc_isr %s gis=%04X\n", info->device_name,gis);
   1176
   1177		if ((gis & 0x70) || count > 1000) {
   1178			printk("synclink_cs:hardware failed or ejected\n");
   1179			break;
   1180		}
   1181		count++;
   1182
   1183		if (gis & (BIT1 | BIT0)) {
   1184			isr = read_reg16(info, CHB + ISR);
   1185			if (isr & IRQ_DCD)
   1186				dcd_change(info, tty);
   1187			if (isr & IRQ_CTS)
   1188				cts_change(info, tty);
   1189		}
   1190		if (gis & (BIT3 | BIT2))
   1191		{
   1192			isr = read_reg16(info, CHA + ISR);
   1193			if (isr & IRQ_TIMER) {
   1194				info->irq_occurred = true;
   1195				irq_disable(info, CHA, IRQ_TIMER);
   1196			}
   1197
   1198			/* receive IRQs */
   1199			if (isr & IRQ_EXITHUNT) {
   1200				info->icount.exithunt++;
   1201				wake_up_interruptible(&info->event_wait_q);
   1202			}
   1203			if (isr & IRQ_BREAK_ON) {
   1204				info->icount.brk++;
   1205				if (info->port.flags & ASYNC_SAK)
   1206					do_SAK(tty);
   1207			}
   1208			if (isr & IRQ_RXTIME) {
   1209				issue_command(info, CHA, CMD_RXFIFO_READ);
   1210			}
   1211			if (isr & (IRQ_RXEOM | IRQ_RXFIFO)) {
   1212				if (info->params.mode == MGSL_MODE_HDLC)
   1213					rx_ready_hdlc(info, isr & IRQ_RXEOM);
   1214				else
   1215					rx_ready_async(info, isr & IRQ_RXEOM);
   1216			}
   1217
   1218			/* transmit IRQs */
   1219			if (isr & IRQ_UNDERRUN) {
   1220				if (info->tx_aborting)
   1221					info->icount.txabort++;
   1222				else
   1223					info->icount.txunder++;
   1224				tx_done(info, tty);
   1225			}
   1226			else if (isr & IRQ_ALLSENT) {
   1227				info->icount.txok++;
   1228				tx_done(info, tty);
   1229			}
   1230			else if (isr & IRQ_TXFIFO)
   1231				tx_ready(info, tty);
   1232		}
   1233		if (gis & BIT7) {
   1234			pis = read_reg(info, CHA + PIS);
   1235			if (pis & BIT1)
   1236				dsr_change(info);
   1237			if (pis & BIT2)
   1238				ri_change(info);
   1239		}
   1240	}
   1241
   1242	/* Request bottom half processing if there's something
   1243	 * for it to do and the bh is not already running
   1244	 */
   1245
   1246	if (info->pending_bh && !info->bh_running && !info->bh_requested) {
   1247		if (debug_level >= DEBUG_LEVEL_ISR)
   1248			printk("%s(%d):%s queueing bh task.\n",
   1249				__FILE__,__LINE__,info->device_name);
   1250		schedule_work(&info->task);
   1251		info->bh_requested = true;
   1252	}
   1253
   1254	spin_unlock(&info->lock);
   1255	tty_kref_put(tty);
   1256
   1257	if (debug_level >= DEBUG_LEVEL_ISR)
   1258		printk("%s(%d):mgslpc_isr(%d)exit.\n",
   1259		       __FILE__, __LINE__, info->irq_level);
   1260
   1261	return IRQ_HANDLED;
   1262}
   1263
   1264/* Initialize and start device.
   1265 */
   1266static int startup(MGSLPC_INFO * info, struct tty_struct *tty)
   1267{
   1268	int retval = 0;
   1269
   1270	if (debug_level >= DEBUG_LEVEL_INFO)
   1271		printk("%s(%d):startup(%s)\n", __FILE__, __LINE__, info->device_name);
   1272
   1273	if (tty_port_initialized(&info->port))
   1274		return 0;
   1275
   1276	if (!info->tx_buf) {
   1277		/* allocate a page of memory for a transmit buffer */
   1278		info->tx_buf = (unsigned char *)get_zeroed_page(GFP_KERNEL);
   1279		if (!info->tx_buf) {
   1280			printk(KERN_ERR"%s(%d):%s can't allocate transmit buffer\n",
   1281				__FILE__, __LINE__, info->device_name);
   1282			return -ENOMEM;
   1283		}
   1284	}
   1285
   1286	info->pending_bh = 0;
   1287
   1288	memset(&info->icount, 0, sizeof(info->icount));
   1289
   1290	timer_setup(&info->tx_timer, tx_timeout, 0);
   1291
   1292	/* Allocate and claim adapter resources */
   1293	retval = claim_resources(info);
   1294
   1295	/* perform existence check and diagnostics */
   1296	if (!retval)
   1297		retval = adapter_test(info);
   1298
   1299	if (retval) {
   1300		if (capable(CAP_SYS_ADMIN) && tty)
   1301			set_bit(TTY_IO_ERROR, &tty->flags);
   1302		release_resources(info);
   1303		return retval;
   1304	}
   1305
   1306	/* program hardware for current parameters */
   1307	mgslpc_change_params(info, tty);
   1308
   1309	if (tty)
   1310		clear_bit(TTY_IO_ERROR, &tty->flags);
   1311
   1312	tty_port_set_initialized(&info->port, 1);
   1313
   1314	return 0;
   1315}
   1316
   1317/* Called by mgslpc_close() and mgslpc_hangup() to shutdown hardware
   1318 */
   1319static void shutdown(MGSLPC_INFO * info, struct tty_struct *tty)
   1320{
   1321	unsigned long flags;
   1322
   1323	if (!tty_port_initialized(&info->port))
   1324		return;
   1325
   1326	if (debug_level >= DEBUG_LEVEL_INFO)
   1327		printk("%s(%d):mgslpc_shutdown(%s)\n",
   1328			 __FILE__, __LINE__, info->device_name);
   1329
   1330	/* clear status wait queue because status changes */
   1331	/* can't happen after shutting down the hardware */
   1332	wake_up_interruptible(&info->status_event_wait_q);
   1333	wake_up_interruptible(&info->event_wait_q);
   1334
   1335	del_timer_sync(&info->tx_timer);
   1336
   1337	if (info->tx_buf) {
   1338		free_page((unsigned long) info->tx_buf);
   1339		info->tx_buf = NULL;
   1340	}
   1341
   1342	spin_lock_irqsave(&info->lock, flags);
   1343
   1344	rx_stop(info);
   1345	tx_stop(info);
   1346
   1347	/* TODO:disable interrupts instead of reset to preserve signal states */
   1348	reset_device(info);
   1349
   1350	if (!tty || C_HUPCL(tty)) {
   1351		info->serial_signals &= ~(SerialSignal_RTS | SerialSignal_DTR);
   1352		set_signals(info);
   1353	}
   1354
   1355	spin_unlock_irqrestore(&info->lock, flags);
   1356
   1357	release_resources(info);
   1358
   1359	if (tty)
   1360		set_bit(TTY_IO_ERROR, &tty->flags);
   1361
   1362	tty_port_set_initialized(&info->port, 0);
   1363}
   1364
   1365static void mgslpc_program_hw(MGSLPC_INFO *info, struct tty_struct *tty)
   1366{
   1367	unsigned long flags;
   1368
   1369	spin_lock_irqsave(&info->lock, flags);
   1370
   1371	rx_stop(info);
   1372	tx_stop(info);
   1373	info->tx_count = info->tx_put = info->tx_get = 0;
   1374
   1375	if (info->params.mode == MGSL_MODE_HDLC || info->netcount)
   1376		hdlc_mode(info);
   1377	else
   1378		async_mode(info);
   1379
   1380	set_signals(info);
   1381
   1382	info->dcd_chkcount = 0;
   1383	info->cts_chkcount = 0;
   1384	info->ri_chkcount = 0;
   1385	info->dsr_chkcount = 0;
   1386
   1387	irq_enable(info, CHB, IRQ_DCD | IRQ_CTS);
   1388	port_irq_enable(info, (unsigned char) PVR_DSR | PVR_RI);
   1389	get_signals(info);
   1390
   1391	if (info->netcount || (tty && C_CREAD(tty)))
   1392		rx_start(info);
   1393
   1394	spin_unlock_irqrestore(&info->lock, flags);
   1395}
   1396
   1397/* Reconfigure adapter based on new parameters
   1398 */
   1399static void mgslpc_change_params(MGSLPC_INFO *info, struct tty_struct *tty)
   1400{
   1401	unsigned cflag;
   1402	int bits_per_char;
   1403
   1404	if (!tty)
   1405		return;
   1406
   1407	if (debug_level >= DEBUG_LEVEL_INFO)
   1408		printk("%s(%d):mgslpc_change_params(%s)\n",
   1409			 __FILE__, __LINE__, info->device_name);
   1410
   1411	cflag = tty->termios.c_cflag;
   1412
   1413	/* if B0 rate (hangup) specified then negate RTS and DTR */
   1414	/* otherwise assert RTS and DTR */
   1415	if (cflag & CBAUD)
   1416		info->serial_signals |= SerialSignal_RTS | SerialSignal_DTR;
   1417	else
   1418		info->serial_signals &= ~(SerialSignal_RTS | SerialSignal_DTR);
   1419
   1420	/* byte size and parity */
   1421	if ((cflag & CSIZE) != CS8) {
   1422		cflag &= ~CSIZE;
   1423		cflag |= CS7;
   1424		tty->termios.c_cflag = cflag;
   1425	}
   1426	info->params.data_bits = tty_get_char_size(cflag);
   1427
   1428	if (cflag & CSTOPB)
   1429		info->params.stop_bits = 2;
   1430	else
   1431		info->params.stop_bits = 1;
   1432
   1433	info->params.parity = ASYNC_PARITY_NONE;
   1434	if (cflag & PARENB) {
   1435		if (cflag & PARODD)
   1436			info->params.parity = ASYNC_PARITY_ODD;
   1437		else
   1438			info->params.parity = ASYNC_PARITY_EVEN;
   1439		if (cflag & CMSPAR)
   1440			info->params.parity = ASYNC_PARITY_SPACE;
   1441	}
   1442
   1443	/* calculate number of jiffies to transmit a full
   1444	 * FIFO (32 bytes) at specified data rate
   1445	 */
   1446	bits_per_char = info->params.data_bits +
   1447			info->params.stop_bits + 1;
   1448
   1449	/* if port data rate is set to 460800 or less then
   1450	 * allow tty settings to override, otherwise keep the
   1451	 * current data rate.
   1452	 */
   1453	if (info->params.data_rate <= 460800) {
   1454		info->params.data_rate = tty_get_baud_rate(tty);
   1455	}
   1456
   1457	if (info->params.data_rate) {
   1458		info->timeout = (32*HZ*bits_per_char) /
   1459				info->params.data_rate;
   1460	}
   1461	info->timeout += HZ/50;		/* Add .02 seconds of slop */
   1462
   1463	tty_port_set_cts_flow(&info->port, cflag & CRTSCTS);
   1464	tty_port_set_check_carrier(&info->port, ~cflag & CLOCAL);
   1465
   1466	/* process tty input control flags */
   1467
   1468	info->read_status_mask = 0;
   1469	if (I_INPCK(tty))
   1470		info->read_status_mask |= BIT7 | BIT6;
   1471	if (I_IGNPAR(tty))
   1472		info->ignore_status_mask |= BIT7 | BIT6;
   1473
   1474	mgslpc_program_hw(info, tty);
   1475}
   1476
   1477/* Add a character to the transmit buffer
   1478 */
   1479static int mgslpc_put_char(struct tty_struct *tty, unsigned char ch)
   1480{
   1481	MGSLPC_INFO *info = (MGSLPC_INFO *)tty->driver_data;
   1482	unsigned long flags;
   1483
   1484	if (debug_level >= DEBUG_LEVEL_INFO) {
   1485		printk("%s(%d):mgslpc_put_char(%d) on %s\n",
   1486			__FILE__, __LINE__, ch, info->device_name);
   1487	}
   1488
   1489	if (mgslpc_paranoia_check(info, tty->name, "mgslpc_put_char"))
   1490		return 0;
   1491
   1492	if (!info->tx_buf)
   1493		return 0;
   1494
   1495	spin_lock_irqsave(&info->lock, flags);
   1496
   1497	if (info->params.mode == MGSL_MODE_ASYNC || !info->tx_active) {
   1498		if (info->tx_count < TXBUFSIZE - 1) {
   1499			info->tx_buf[info->tx_put++] = ch;
   1500			info->tx_put &= TXBUFSIZE-1;
   1501			info->tx_count++;
   1502		}
   1503	}
   1504
   1505	spin_unlock_irqrestore(&info->lock, flags);
   1506	return 1;
   1507}
   1508
   1509/* Enable transmitter so remaining characters in the
   1510 * transmit buffer are sent.
   1511 */
   1512static void mgslpc_flush_chars(struct tty_struct *tty)
   1513{
   1514	MGSLPC_INFO *info = (MGSLPC_INFO *)tty->driver_data;
   1515	unsigned long flags;
   1516
   1517	if (debug_level >= DEBUG_LEVEL_INFO)
   1518		printk("%s(%d):mgslpc_flush_chars() entry on %s tx_count=%d\n",
   1519			__FILE__, __LINE__, info->device_name, info->tx_count);
   1520
   1521	if (mgslpc_paranoia_check(info, tty->name, "mgslpc_flush_chars"))
   1522		return;
   1523
   1524	if (info->tx_count <= 0 || tty->flow.stopped ||
   1525	    tty->hw_stopped || !info->tx_buf)
   1526		return;
   1527
   1528	if (debug_level >= DEBUG_LEVEL_INFO)
   1529		printk("%s(%d):mgslpc_flush_chars() entry on %s starting transmitter\n",
   1530			__FILE__, __LINE__, info->device_name);
   1531
   1532	spin_lock_irqsave(&info->lock, flags);
   1533	if (!info->tx_active)
   1534		tx_start(info, tty);
   1535	spin_unlock_irqrestore(&info->lock, flags);
   1536}
   1537
   1538/* Send a block of data
   1539 *
   1540 * Arguments:
   1541 *
   1542 * tty        pointer to tty information structure
   1543 * buf	      pointer to buffer containing send data
   1544 * count      size of send data in bytes
   1545 *
   1546 * Returns: number of characters written
   1547 */
   1548static int mgslpc_write(struct tty_struct * tty,
   1549			const unsigned char *buf, int count)
   1550{
   1551	int c, ret = 0;
   1552	MGSLPC_INFO *info = (MGSLPC_INFO *)tty->driver_data;
   1553	unsigned long flags;
   1554
   1555	if (debug_level >= DEBUG_LEVEL_INFO)
   1556		printk("%s(%d):mgslpc_write(%s) count=%d\n",
   1557			__FILE__, __LINE__, info->device_name, count);
   1558
   1559	if (mgslpc_paranoia_check(info, tty->name, "mgslpc_write") ||
   1560		!info->tx_buf)
   1561		goto cleanup;
   1562
   1563	if (info->params.mode == MGSL_MODE_HDLC) {
   1564		if (count > TXBUFSIZE) {
   1565			ret = -EIO;
   1566			goto cleanup;
   1567		}
   1568		if (info->tx_active)
   1569			goto cleanup;
   1570		else if (info->tx_count)
   1571			goto start;
   1572	}
   1573
   1574	for (;;) {
   1575		c = min(count,
   1576			min(TXBUFSIZE - info->tx_count - 1,
   1577			    TXBUFSIZE - info->tx_put));
   1578		if (c <= 0)
   1579			break;
   1580
   1581		memcpy(info->tx_buf + info->tx_put, buf, c);
   1582
   1583		spin_lock_irqsave(&info->lock, flags);
   1584		info->tx_put = (info->tx_put + c) & (TXBUFSIZE-1);
   1585		info->tx_count += c;
   1586		spin_unlock_irqrestore(&info->lock, flags);
   1587
   1588		buf += c;
   1589		count -= c;
   1590		ret += c;
   1591	}
   1592start:
   1593	if (info->tx_count && !tty->flow.stopped && !tty->hw_stopped) {
   1594		spin_lock_irqsave(&info->lock, flags);
   1595		if (!info->tx_active)
   1596			tx_start(info, tty);
   1597		spin_unlock_irqrestore(&info->lock, flags);
   1598	}
   1599cleanup:
   1600	if (debug_level >= DEBUG_LEVEL_INFO)
   1601		printk("%s(%d):mgslpc_write(%s) returning=%d\n",
   1602			__FILE__, __LINE__, info->device_name, ret);
   1603	return ret;
   1604}
   1605
   1606/* Return the count of free bytes in transmit buffer
   1607 */
   1608static unsigned int mgslpc_write_room(struct tty_struct *tty)
   1609{
   1610	MGSLPC_INFO *info = (MGSLPC_INFO *)tty->driver_data;
   1611	int ret;
   1612
   1613	if (mgslpc_paranoia_check(info, tty->name, "mgslpc_write_room"))
   1614		return 0;
   1615
   1616	if (info->params.mode == MGSL_MODE_HDLC) {
   1617		/* HDLC (frame oriented) mode */
   1618		if (info->tx_active)
   1619			return 0;
   1620		else
   1621			return HDLC_MAX_FRAME_SIZE;
   1622	} else {
   1623		ret = TXBUFSIZE - info->tx_count - 1;
   1624		if (ret < 0)
   1625			ret = 0;
   1626	}
   1627
   1628	if (debug_level >= DEBUG_LEVEL_INFO)
   1629		printk("%s(%d):mgslpc_write_room(%s)=%d\n",
   1630			 __FILE__, __LINE__, info->device_name, ret);
   1631	return ret;
   1632}
   1633
   1634/* Return the count of bytes in transmit buffer
   1635 */
   1636static unsigned int mgslpc_chars_in_buffer(struct tty_struct *tty)
   1637{
   1638	MGSLPC_INFO *info = (MGSLPC_INFO *)tty->driver_data;
   1639	unsigned int rc;
   1640
   1641	if (debug_level >= DEBUG_LEVEL_INFO)
   1642		printk("%s(%d):mgslpc_chars_in_buffer(%s)\n",
   1643			 __FILE__, __LINE__, info->device_name);
   1644
   1645	if (mgslpc_paranoia_check(info, tty->name, "mgslpc_chars_in_buffer"))
   1646		return 0;
   1647
   1648	if (info->params.mode == MGSL_MODE_HDLC)
   1649		rc = info->tx_active ? info->max_frame_size : 0;
   1650	else
   1651		rc = info->tx_count;
   1652
   1653	if (debug_level >= DEBUG_LEVEL_INFO)
   1654		printk("%s(%d):mgslpc_chars_in_buffer(%s)=%u\n",
   1655			 __FILE__, __LINE__, info->device_name, rc);
   1656
   1657	return rc;
   1658}
   1659
   1660/* Discard all data in the send buffer
   1661 */
   1662static void mgslpc_flush_buffer(struct tty_struct *tty)
   1663{
   1664	MGSLPC_INFO *info = (MGSLPC_INFO *)tty->driver_data;
   1665	unsigned long flags;
   1666
   1667	if (debug_level >= DEBUG_LEVEL_INFO)
   1668		printk("%s(%d):mgslpc_flush_buffer(%s) entry\n",
   1669			 __FILE__, __LINE__, info->device_name);
   1670
   1671	if (mgslpc_paranoia_check(info, tty->name, "mgslpc_flush_buffer"))
   1672		return;
   1673
   1674	spin_lock_irqsave(&info->lock, flags);
   1675	info->tx_count = info->tx_put = info->tx_get = 0;
   1676	del_timer(&info->tx_timer);
   1677	spin_unlock_irqrestore(&info->lock, flags);
   1678
   1679	wake_up_interruptible(&tty->write_wait);
   1680	tty_wakeup(tty);
   1681}
   1682
   1683/* Send a high-priority XON/XOFF character
   1684 */
   1685static void mgslpc_send_xchar(struct tty_struct *tty, char ch)
   1686{
   1687	MGSLPC_INFO *info = (MGSLPC_INFO *)tty->driver_data;
   1688	unsigned long flags;
   1689
   1690	if (debug_level >= DEBUG_LEVEL_INFO)
   1691		printk("%s(%d):mgslpc_send_xchar(%s,%d)\n",
   1692			 __FILE__, __LINE__, info->device_name, ch);
   1693
   1694	if (mgslpc_paranoia_check(info, tty->name, "mgslpc_send_xchar"))
   1695		return;
   1696
   1697	info->x_char = ch;
   1698	if (ch) {
   1699		spin_lock_irqsave(&info->lock, flags);
   1700		if (!info->tx_enabled)
   1701			tx_start(info, tty);
   1702		spin_unlock_irqrestore(&info->lock, flags);
   1703	}
   1704}
   1705
   1706/* Signal remote device to throttle send data (our receive data)
   1707 */
   1708static void mgslpc_throttle(struct tty_struct * tty)
   1709{
   1710	MGSLPC_INFO *info = (MGSLPC_INFO *)tty->driver_data;
   1711	unsigned long flags;
   1712
   1713	if (debug_level >= DEBUG_LEVEL_INFO)
   1714		printk("%s(%d):mgslpc_throttle(%s) entry\n",
   1715			 __FILE__, __LINE__, info->device_name);
   1716
   1717	if (mgslpc_paranoia_check(info, tty->name, "mgslpc_throttle"))
   1718		return;
   1719
   1720	if (I_IXOFF(tty))
   1721		mgslpc_send_xchar(tty, STOP_CHAR(tty));
   1722
   1723	if (C_CRTSCTS(tty)) {
   1724		spin_lock_irqsave(&info->lock, flags);
   1725		info->serial_signals &= ~SerialSignal_RTS;
   1726		set_signals(info);
   1727		spin_unlock_irqrestore(&info->lock, flags);
   1728	}
   1729}
   1730
   1731/* Signal remote device to stop throttling send data (our receive data)
   1732 */
   1733static void mgslpc_unthrottle(struct tty_struct * tty)
   1734{
   1735	MGSLPC_INFO *info = (MGSLPC_INFO *)tty->driver_data;
   1736	unsigned long flags;
   1737
   1738	if (debug_level >= DEBUG_LEVEL_INFO)
   1739		printk("%s(%d):mgslpc_unthrottle(%s) entry\n",
   1740			 __FILE__, __LINE__, info->device_name);
   1741
   1742	if (mgslpc_paranoia_check(info, tty->name, "mgslpc_unthrottle"))
   1743		return;
   1744
   1745	if (I_IXOFF(tty)) {
   1746		if (info->x_char)
   1747			info->x_char = 0;
   1748		else
   1749			mgslpc_send_xchar(tty, START_CHAR(tty));
   1750	}
   1751
   1752	if (C_CRTSCTS(tty)) {
   1753		spin_lock_irqsave(&info->lock, flags);
   1754		info->serial_signals |= SerialSignal_RTS;
   1755		set_signals(info);
   1756		spin_unlock_irqrestore(&info->lock, flags);
   1757	}
   1758}
   1759
   1760/* get the current serial statistics
   1761 */
   1762static int get_stats(MGSLPC_INFO * info, struct mgsl_icount __user *user_icount)
   1763{
   1764	int err;
   1765	if (debug_level >= DEBUG_LEVEL_INFO)
   1766		printk("get_params(%s)\n", info->device_name);
   1767	if (!user_icount) {
   1768		memset(&info->icount, 0, sizeof(info->icount));
   1769	} else {
   1770		COPY_TO_USER(err, user_icount, &info->icount, sizeof(struct mgsl_icount));
   1771		if (err)
   1772			return -EFAULT;
   1773	}
   1774	return 0;
   1775}
   1776
   1777/* get the current serial parameters
   1778 */
   1779static int get_params(MGSLPC_INFO * info, MGSL_PARAMS __user *user_params)
   1780{
   1781	int err;
   1782	if (debug_level >= DEBUG_LEVEL_INFO)
   1783		printk("get_params(%s)\n", info->device_name);
   1784	COPY_TO_USER(err,user_params, &info->params, sizeof(MGSL_PARAMS));
   1785	if (err)
   1786		return -EFAULT;
   1787	return 0;
   1788}
   1789
   1790/* set the serial parameters
   1791 *
   1792 * Arguments:
   1793 *
   1794 *	info		pointer to device instance data
   1795 *	new_params	user buffer containing new serial params
   1796 *
   1797 * Returns:	0 if success, otherwise error code
   1798 */
   1799static int set_params(MGSLPC_INFO * info, MGSL_PARAMS __user *new_params, struct tty_struct *tty)
   1800{
   1801	unsigned long flags;
   1802	MGSL_PARAMS tmp_params;
   1803	int err;
   1804
   1805	if (debug_level >= DEBUG_LEVEL_INFO)
   1806		printk("%s(%d):set_params %s\n", __FILE__,__LINE__,
   1807			info->device_name);
   1808	COPY_FROM_USER(err,&tmp_params, new_params, sizeof(MGSL_PARAMS));
   1809	if (err) {
   1810		if (debug_level >= DEBUG_LEVEL_INFO)
   1811			printk("%s(%d):set_params(%s) user buffer copy failed\n",
   1812				__FILE__, __LINE__, info->device_name);
   1813		return -EFAULT;
   1814	}
   1815
   1816	spin_lock_irqsave(&info->lock, flags);
   1817	memcpy(&info->params,&tmp_params,sizeof(MGSL_PARAMS));
   1818	spin_unlock_irqrestore(&info->lock, flags);
   1819
   1820	mgslpc_change_params(info, tty);
   1821
   1822	return 0;
   1823}
   1824
   1825static int get_txidle(MGSLPC_INFO * info, int __user *idle_mode)
   1826{
   1827	int err;
   1828	if (debug_level >= DEBUG_LEVEL_INFO)
   1829		printk("get_txidle(%s)=%d\n", info->device_name, info->idle_mode);
   1830	COPY_TO_USER(err,idle_mode, &info->idle_mode, sizeof(int));
   1831	if (err)
   1832		return -EFAULT;
   1833	return 0;
   1834}
   1835
   1836static int set_txidle(MGSLPC_INFO * info, int idle_mode)
   1837{
   1838	unsigned long flags;
   1839	if (debug_level >= DEBUG_LEVEL_INFO)
   1840		printk("set_txidle(%s,%d)\n", info->device_name, idle_mode);
   1841	spin_lock_irqsave(&info->lock, flags);
   1842	info->idle_mode = idle_mode;
   1843	tx_set_idle(info);
   1844	spin_unlock_irqrestore(&info->lock, flags);
   1845	return 0;
   1846}
   1847
   1848static int get_interface(MGSLPC_INFO * info, int __user *if_mode)
   1849{
   1850	int err;
   1851	if (debug_level >= DEBUG_LEVEL_INFO)
   1852		printk("get_interface(%s)=%d\n", info->device_name, info->if_mode);
   1853	COPY_TO_USER(err,if_mode, &info->if_mode, sizeof(int));
   1854	if (err)
   1855		return -EFAULT;
   1856	return 0;
   1857}
   1858
   1859static int set_interface(MGSLPC_INFO * info, int if_mode)
   1860{
   1861	unsigned long flags;
   1862	unsigned char val;
   1863	if (debug_level >= DEBUG_LEVEL_INFO)
   1864		printk("set_interface(%s,%d)\n", info->device_name, if_mode);
   1865	spin_lock_irqsave(&info->lock, flags);
   1866	info->if_mode = if_mode;
   1867
   1868	val = read_reg(info, PVR) & 0x0f;
   1869	switch (info->if_mode)
   1870	{
   1871	case MGSL_INTERFACE_RS232: val |= PVR_RS232; break;
   1872	case MGSL_INTERFACE_V35:   val |= PVR_V35;   break;
   1873	case MGSL_INTERFACE_RS422: val |= PVR_RS422; break;
   1874	}
   1875	write_reg(info, PVR, val);
   1876
   1877	spin_unlock_irqrestore(&info->lock, flags);
   1878	return 0;
   1879}
   1880
   1881static int set_txenable(MGSLPC_INFO * info, int enable, struct tty_struct *tty)
   1882{
   1883	unsigned long flags;
   1884
   1885	if (debug_level >= DEBUG_LEVEL_INFO)
   1886		printk("set_txenable(%s,%d)\n", info->device_name, enable);
   1887
   1888	spin_lock_irqsave(&info->lock, flags);
   1889	if (enable) {
   1890		if (!info->tx_enabled)
   1891			tx_start(info, tty);
   1892	} else {
   1893		if (info->tx_enabled)
   1894			tx_stop(info);
   1895	}
   1896	spin_unlock_irqrestore(&info->lock, flags);
   1897	return 0;
   1898}
   1899
   1900static int tx_abort(MGSLPC_INFO * info)
   1901{
   1902	unsigned long flags;
   1903
   1904	if (debug_level >= DEBUG_LEVEL_INFO)
   1905		printk("tx_abort(%s)\n", info->device_name);
   1906
   1907	spin_lock_irqsave(&info->lock, flags);
   1908	if (info->tx_active && info->tx_count &&
   1909	    info->params.mode == MGSL_MODE_HDLC) {
   1910		/* clear data count so FIFO is not filled on next IRQ.
   1911		 * This results in underrun and abort transmission.
   1912		 */
   1913		info->tx_count = info->tx_put = info->tx_get = 0;
   1914		info->tx_aborting = true;
   1915	}
   1916	spin_unlock_irqrestore(&info->lock, flags);
   1917	return 0;
   1918}
   1919
   1920static int set_rxenable(MGSLPC_INFO * info, int enable)
   1921{
   1922	unsigned long flags;
   1923
   1924	if (debug_level >= DEBUG_LEVEL_INFO)
   1925		printk("set_rxenable(%s,%d)\n", info->device_name, enable);
   1926
   1927	spin_lock_irqsave(&info->lock, flags);
   1928	if (enable) {
   1929		if (!info->rx_enabled)
   1930			rx_start(info);
   1931	} else {
   1932		if (info->rx_enabled)
   1933			rx_stop(info);
   1934	}
   1935	spin_unlock_irqrestore(&info->lock, flags);
   1936	return 0;
   1937}
   1938
   1939/* wait for specified event to occur
   1940 *
   1941 * Arguments:		info	pointer to device instance data
   1942 *			mask	pointer to bitmask of events to wait for
   1943 * Return Value:	0	if successful and bit mask updated with
   1944 *				of events triggerred,
   1945 *			otherwise error code
   1946 */
   1947static int wait_events(MGSLPC_INFO * info, int __user *mask_ptr)
   1948{
   1949	unsigned long flags;
   1950	int s;
   1951	int rc=0;
   1952	struct mgsl_icount cprev, cnow;
   1953	int events;
   1954	int mask;
   1955	struct	_input_signal_events oldsigs, newsigs;
   1956	DECLARE_WAITQUEUE(wait, current);
   1957
   1958	COPY_FROM_USER(rc,&mask, mask_ptr, sizeof(int));
   1959	if (rc)
   1960		return  -EFAULT;
   1961
   1962	if (debug_level >= DEBUG_LEVEL_INFO)
   1963		printk("wait_events(%s,%d)\n", info->device_name, mask);
   1964
   1965	spin_lock_irqsave(&info->lock, flags);
   1966
   1967	/* return immediately if state matches requested events */
   1968	get_signals(info);
   1969	s = info->serial_signals;
   1970	events = mask &
   1971		( ((s & SerialSignal_DSR) ? MgslEvent_DsrActive:MgslEvent_DsrInactive) +
   1972		  ((s & SerialSignal_DCD) ? MgslEvent_DcdActive:MgslEvent_DcdInactive) +
   1973		  ((s & SerialSignal_CTS) ? MgslEvent_CtsActive:MgslEvent_CtsInactive) +
   1974		  ((s & SerialSignal_RI)  ? MgslEvent_RiActive :MgslEvent_RiInactive) );
   1975	if (events) {
   1976		spin_unlock_irqrestore(&info->lock, flags);
   1977		goto exit;
   1978	}
   1979
   1980	/* save current irq counts */
   1981	cprev = info->icount;
   1982	oldsigs = info->input_signal_events;
   1983
   1984	if ((info->params.mode == MGSL_MODE_HDLC) &&
   1985	    (mask & MgslEvent_ExitHuntMode))
   1986		irq_enable(info, CHA, IRQ_EXITHUNT);
   1987
   1988	set_current_state(TASK_INTERRUPTIBLE);
   1989	add_wait_queue(&info->event_wait_q, &wait);
   1990
   1991	spin_unlock_irqrestore(&info->lock, flags);
   1992
   1993
   1994	for(;;) {
   1995		schedule();
   1996		if (signal_pending(current)) {
   1997			rc = -ERESTARTSYS;
   1998			break;
   1999		}
   2000
   2001		/* get current irq counts */
   2002		spin_lock_irqsave(&info->lock, flags);
   2003		cnow = info->icount;
   2004		newsigs = info->input_signal_events;
   2005		set_current_state(TASK_INTERRUPTIBLE);
   2006		spin_unlock_irqrestore(&info->lock, flags);
   2007
   2008		/* if no change, wait aborted for some reason */
   2009		if (newsigs.dsr_up   == oldsigs.dsr_up   &&
   2010		    newsigs.dsr_down == oldsigs.dsr_down &&
   2011		    newsigs.dcd_up   == oldsigs.dcd_up   &&
   2012		    newsigs.dcd_down == oldsigs.dcd_down &&
   2013		    newsigs.cts_up   == oldsigs.cts_up   &&
   2014		    newsigs.cts_down == oldsigs.cts_down &&
   2015		    newsigs.ri_up    == oldsigs.ri_up    &&
   2016		    newsigs.ri_down  == oldsigs.ri_down  &&
   2017		    cnow.exithunt    == cprev.exithunt   &&
   2018		    cnow.rxidle      == cprev.rxidle) {
   2019			rc = -EIO;
   2020			break;
   2021		}
   2022
   2023		events = mask &
   2024			( (newsigs.dsr_up   != oldsigs.dsr_up   ? MgslEvent_DsrActive:0)   +
   2025			  (newsigs.dsr_down != oldsigs.dsr_down ? MgslEvent_DsrInactive:0) +
   2026			  (newsigs.dcd_up   != oldsigs.dcd_up   ? MgslEvent_DcdActive:0)   +
   2027			  (newsigs.dcd_down != oldsigs.dcd_down ? MgslEvent_DcdInactive:0) +
   2028			  (newsigs.cts_up   != oldsigs.cts_up   ? MgslEvent_CtsActive:0)   +
   2029			  (newsigs.cts_down != oldsigs.cts_down ? MgslEvent_CtsInactive:0) +
   2030			  (newsigs.ri_up    != oldsigs.ri_up    ? MgslEvent_RiActive:0)    +
   2031			  (newsigs.ri_down  != oldsigs.ri_down  ? MgslEvent_RiInactive:0)  +
   2032			  (cnow.exithunt    != cprev.exithunt   ? MgslEvent_ExitHuntMode:0) +
   2033			  (cnow.rxidle      != cprev.rxidle     ? MgslEvent_IdleReceived:0) );
   2034		if (events)
   2035			break;
   2036
   2037		cprev = cnow;
   2038		oldsigs = newsigs;
   2039	}
   2040
   2041	remove_wait_queue(&info->event_wait_q, &wait);
   2042	set_current_state(TASK_RUNNING);
   2043
   2044	if (mask & MgslEvent_ExitHuntMode) {
   2045		spin_lock_irqsave(&info->lock, flags);
   2046		if (!waitqueue_active(&info->event_wait_q))
   2047			irq_disable(info, CHA, IRQ_EXITHUNT);
   2048		spin_unlock_irqrestore(&info->lock, flags);
   2049	}
   2050exit:
   2051	if (rc == 0)
   2052		PUT_USER(rc, events, mask_ptr);
   2053	return rc;
   2054}
   2055
   2056static int modem_input_wait(MGSLPC_INFO *info,int arg)
   2057{
   2058	unsigned long flags;
   2059	int rc;
   2060	struct mgsl_icount cprev, cnow;
   2061	DECLARE_WAITQUEUE(wait, current);
   2062
   2063	/* save current irq counts */
   2064	spin_lock_irqsave(&info->lock, flags);
   2065	cprev = info->icount;
   2066	add_wait_queue(&info->status_event_wait_q, &wait);
   2067	set_current_state(TASK_INTERRUPTIBLE);
   2068	spin_unlock_irqrestore(&info->lock, flags);
   2069
   2070	for(;;) {
   2071		schedule();
   2072		if (signal_pending(current)) {
   2073			rc = -ERESTARTSYS;
   2074			break;
   2075		}
   2076
   2077		/* get new irq counts */
   2078		spin_lock_irqsave(&info->lock, flags);
   2079		cnow = info->icount;
   2080		set_current_state(TASK_INTERRUPTIBLE);
   2081		spin_unlock_irqrestore(&info->lock, flags);
   2082
   2083		/* if no change, wait aborted for some reason */
   2084		if (cnow.rng == cprev.rng && cnow.dsr == cprev.dsr &&
   2085		    cnow.dcd == cprev.dcd && cnow.cts == cprev.cts) {
   2086			rc = -EIO;
   2087			break;
   2088		}
   2089
   2090		/* check for change in caller specified modem input */
   2091		if ((arg & TIOCM_RNG && cnow.rng != cprev.rng) ||
   2092		    (arg & TIOCM_DSR && cnow.dsr != cprev.dsr) ||
   2093		    (arg & TIOCM_CD  && cnow.dcd != cprev.dcd) ||
   2094		    (arg & TIOCM_CTS && cnow.cts != cprev.cts)) {
   2095			rc = 0;
   2096			break;
   2097		}
   2098
   2099		cprev = cnow;
   2100	}
   2101	remove_wait_queue(&info->status_event_wait_q, &wait);
   2102	set_current_state(TASK_RUNNING);
   2103	return rc;
   2104}
   2105
   2106/* return the state of the serial control and status signals
   2107 */
   2108static int tiocmget(struct tty_struct *tty)
   2109{
   2110	MGSLPC_INFO *info = (MGSLPC_INFO *)tty->driver_data;
   2111	unsigned int result;
   2112	unsigned long flags;
   2113
   2114	spin_lock_irqsave(&info->lock, flags);
   2115	get_signals(info);
   2116	spin_unlock_irqrestore(&info->lock, flags);
   2117
   2118	result = ((info->serial_signals & SerialSignal_RTS) ? TIOCM_RTS:0) +
   2119		((info->serial_signals & SerialSignal_DTR) ? TIOCM_DTR:0) +
   2120		((info->serial_signals & SerialSignal_DCD) ? TIOCM_CAR:0) +
   2121		((info->serial_signals & SerialSignal_RI)  ? TIOCM_RNG:0) +
   2122		((info->serial_signals & SerialSignal_DSR) ? TIOCM_DSR:0) +
   2123		((info->serial_signals & SerialSignal_CTS) ? TIOCM_CTS:0);
   2124
   2125	if (debug_level >= DEBUG_LEVEL_INFO)
   2126		printk("%s(%d):%s tiocmget() value=%08X\n",
   2127			 __FILE__, __LINE__, info->device_name, result);
   2128	return result;
   2129}
   2130
   2131/* set modem control signals (DTR/RTS)
   2132 */
   2133static int tiocmset(struct tty_struct *tty,
   2134		    unsigned int set, unsigned int clear)
   2135{
   2136	MGSLPC_INFO *info = (MGSLPC_INFO *)tty->driver_data;
   2137	unsigned long flags;
   2138
   2139	if (debug_level >= DEBUG_LEVEL_INFO)
   2140		printk("%s(%d):%s tiocmset(%x,%x)\n",
   2141			__FILE__, __LINE__, info->device_name, set, clear);
   2142
   2143	if (set & TIOCM_RTS)
   2144		info->serial_signals |= SerialSignal_RTS;
   2145	if (set & TIOCM_DTR)
   2146		info->serial_signals |= SerialSignal_DTR;
   2147	if (clear & TIOCM_RTS)
   2148		info->serial_signals &= ~SerialSignal_RTS;
   2149	if (clear & TIOCM_DTR)
   2150		info->serial_signals &= ~SerialSignal_DTR;
   2151
   2152	spin_lock_irqsave(&info->lock, flags);
   2153	set_signals(info);
   2154	spin_unlock_irqrestore(&info->lock, flags);
   2155
   2156	return 0;
   2157}
   2158
   2159/* Set or clear transmit break condition
   2160 *
   2161 * Arguments:		tty		pointer to tty instance data
   2162 *			break_state	-1=set break condition, 0=clear
   2163 */
   2164static int mgslpc_break(struct tty_struct *tty, int break_state)
   2165{
   2166	MGSLPC_INFO * info = (MGSLPC_INFO *)tty->driver_data;
   2167	unsigned long flags;
   2168
   2169	if (debug_level >= DEBUG_LEVEL_INFO)
   2170		printk("%s(%d):mgslpc_break(%s,%d)\n",
   2171			 __FILE__, __LINE__, info->device_name, break_state);
   2172
   2173	if (mgslpc_paranoia_check(info, tty->name, "mgslpc_break"))
   2174		return -EINVAL;
   2175
   2176	spin_lock_irqsave(&info->lock, flags);
   2177	if (break_state == -1)
   2178		set_reg_bits(info, CHA+DAFO, BIT6);
   2179	else
   2180		clear_reg_bits(info, CHA+DAFO, BIT6);
   2181	spin_unlock_irqrestore(&info->lock, flags);
   2182	return 0;
   2183}
   2184
   2185static int mgslpc_get_icount(struct tty_struct *tty,
   2186				struct serial_icounter_struct *icount)
   2187{
   2188	MGSLPC_INFO * info = (MGSLPC_INFO *)tty->driver_data;
   2189	struct mgsl_icount cnow;	/* kernel counter temps */
   2190	unsigned long flags;
   2191
   2192	spin_lock_irqsave(&info->lock, flags);
   2193	cnow = info->icount;
   2194	spin_unlock_irqrestore(&info->lock, flags);
   2195
   2196	icount->cts = cnow.cts;
   2197	icount->dsr = cnow.dsr;
   2198	icount->rng = cnow.rng;
   2199	icount->dcd = cnow.dcd;
   2200	icount->rx = cnow.rx;
   2201	icount->tx = cnow.tx;
   2202	icount->frame = cnow.frame;
   2203	icount->overrun = cnow.overrun;
   2204	icount->parity = cnow.parity;
   2205	icount->brk = cnow.brk;
   2206	icount->buf_overrun = cnow.buf_overrun;
   2207
   2208	return 0;
   2209}
   2210
   2211/* Service an IOCTL request
   2212 *
   2213 * Arguments:
   2214 *
   2215 *	tty	pointer to tty instance data
   2216 *	cmd	IOCTL command code
   2217 *	arg	command argument/context
   2218 *
   2219 * Return Value:	0 if success, otherwise error code
   2220 */
   2221static int mgslpc_ioctl(struct tty_struct *tty,
   2222			unsigned int cmd, unsigned long arg)
   2223{
   2224	MGSLPC_INFO * info = (MGSLPC_INFO *)tty->driver_data;
   2225	void __user *argp = (void __user *)arg;
   2226
   2227	if (debug_level >= DEBUG_LEVEL_INFO)
   2228		printk("%s(%d):mgslpc_ioctl %s cmd=%08X\n", __FILE__, __LINE__,
   2229			info->device_name, cmd);
   2230
   2231	if (mgslpc_paranoia_check(info, tty->name, "mgslpc_ioctl"))
   2232		return -ENODEV;
   2233
   2234	if (cmd != TIOCMIWAIT) {
   2235		if (tty_io_error(tty))
   2236		    return -EIO;
   2237	}
   2238
   2239	switch (cmd) {
   2240	case MGSL_IOCGPARAMS:
   2241		return get_params(info, argp);
   2242	case MGSL_IOCSPARAMS:
   2243		return set_params(info, argp, tty);
   2244	case MGSL_IOCGTXIDLE:
   2245		return get_txidle(info, argp);
   2246	case MGSL_IOCSTXIDLE:
   2247		return set_txidle(info, (int)arg);
   2248	case MGSL_IOCGIF:
   2249		return get_interface(info, argp);
   2250	case MGSL_IOCSIF:
   2251		return set_interface(info,(int)arg);
   2252	case MGSL_IOCTXENABLE:
   2253		return set_txenable(info,(int)arg, tty);
   2254	case MGSL_IOCRXENABLE:
   2255		return set_rxenable(info,(int)arg);
   2256	case MGSL_IOCTXABORT:
   2257		return tx_abort(info);
   2258	case MGSL_IOCGSTATS:
   2259		return get_stats(info, argp);
   2260	case MGSL_IOCWAITEVENT:
   2261		return wait_events(info, argp);
   2262	case TIOCMIWAIT:
   2263		return modem_input_wait(info,(int)arg);
   2264	default:
   2265		return -ENOIOCTLCMD;
   2266	}
   2267	return 0;
   2268}
   2269
   2270/* Set new termios settings
   2271 *
   2272 * Arguments:
   2273 *
   2274 *	tty		pointer to tty structure
   2275 *	termios		pointer to buffer to hold returned old termios
   2276 */
   2277static void mgslpc_set_termios(struct tty_struct *tty, struct ktermios *old_termios)
   2278{
   2279	MGSLPC_INFO *info = (MGSLPC_INFO *)tty->driver_data;
   2280	unsigned long flags;
   2281
   2282	if (debug_level >= DEBUG_LEVEL_INFO)
   2283		printk("%s(%d):mgslpc_set_termios %s\n", __FILE__, __LINE__,
   2284			tty->driver->name);
   2285
   2286	/* just return if nothing has changed */
   2287	if ((tty->termios.c_cflag == old_termios->c_cflag)
   2288	    && (RELEVANT_IFLAG(tty->termios.c_iflag)
   2289		== RELEVANT_IFLAG(old_termios->c_iflag)))
   2290	  return;
   2291
   2292	mgslpc_change_params(info, tty);
   2293
   2294	/* Handle transition to B0 status */
   2295	if ((old_termios->c_cflag & CBAUD) && !C_BAUD(tty)) {
   2296		info->serial_signals &= ~(SerialSignal_RTS | SerialSignal_DTR);
   2297		spin_lock_irqsave(&info->lock, flags);
   2298		set_signals(info);
   2299		spin_unlock_irqrestore(&info->lock, flags);
   2300	}
   2301
   2302	/* Handle transition away from B0 status */
   2303	if (!(old_termios->c_cflag & CBAUD) && C_BAUD(tty)) {
   2304		info->serial_signals |= SerialSignal_DTR;
   2305		if (!C_CRTSCTS(tty) || !tty_throttled(tty))
   2306			info->serial_signals |= SerialSignal_RTS;
   2307		spin_lock_irqsave(&info->lock, flags);
   2308		set_signals(info);
   2309		spin_unlock_irqrestore(&info->lock, flags);
   2310	}
   2311
   2312	/* Handle turning off CRTSCTS */
   2313	if (old_termios->c_cflag & CRTSCTS && !C_CRTSCTS(tty)) {
   2314		tty->hw_stopped = 0;
   2315		tx_release(tty);
   2316	}
   2317}
   2318
   2319static void mgslpc_close(struct tty_struct *tty, struct file * filp)
   2320{
   2321	MGSLPC_INFO * info = (MGSLPC_INFO *)tty->driver_data;
   2322	struct tty_port *port = &info->port;
   2323
   2324	if (mgslpc_paranoia_check(info, tty->name, "mgslpc_close"))
   2325		return;
   2326
   2327	if (debug_level >= DEBUG_LEVEL_INFO)
   2328		printk("%s(%d):mgslpc_close(%s) entry, count=%d\n",
   2329			 __FILE__, __LINE__, info->device_name, port->count);
   2330
   2331	if (tty_port_close_start(port, tty, filp) == 0)
   2332		goto cleanup;
   2333
   2334	if (tty_port_initialized(port))
   2335		mgslpc_wait_until_sent(tty, info->timeout);
   2336
   2337	mgslpc_flush_buffer(tty);
   2338
   2339	tty_ldisc_flush(tty);
   2340	shutdown(info, tty);
   2341	
   2342	tty_port_close_end(port, tty);
   2343	tty_port_tty_set(port, NULL);
   2344cleanup:
   2345	if (debug_level >= DEBUG_LEVEL_INFO)
   2346		printk("%s(%d):mgslpc_close(%s) exit, count=%d\n", __FILE__, __LINE__,
   2347			tty->driver->name, port->count);
   2348}
   2349
   2350/* Wait until the transmitter is empty.
   2351 */
   2352static void mgslpc_wait_until_sent(struct tty_struct *tty, int timeout)
   2353{
   2354	MGSLPC_INFO * info = (MGSLPC_INFO *)tty->driver_data;
   2355	unsigned long orig_jiffies, char_time;
   2356
   2357	if (!info)
   2358		return;
   2359
   2360	if (debug_level >= DEBUG_LEVEL_INFO)
   2361		printk("%s(%d):mgslpc_wait_until_sent(%s) entry\n",
   2362			 __FILE__, __LINE__, info->device_name);
   2363
   2364	if (mgslpc_paranoia_check(info, tty->name, "mgslpc_wait_until_sent"))
   2365		return;
   2366
   2367	if (!tty_port_initialized(&info->port))
   2368		goto exit;
   2369
   2370	orig_jiffies = jiffies;
   2371
   2372	/* Set check interval to 1/5 of estimated time to
   2373	 * send a character, and make it at least 1. The check
   2374	 * interval should also be less than the timeout.
   2375	 * Note: use tight timings here to satisfy the NIST-PCTS.
   2376	 */
   2377
   2378	if (info->params.data_rate) {
   2379	     	char_time = info->timeout/(32 * 5);
   2380		if (!char_time)
   2381			char_time++;
   2382	} else
   2383		char_time = 1;
   2384
   2385	if (timeout)
   2386		char_time = min_t(unsigned long, char_time, timeout);
   2387
   2388	if (info->params.mode == MGSL_MODE_HDLC) {
   2389		while (info->tx_active) {
   2390			msleep_interruptible(jiffies_to_msecs(char_time));
   2391			if (signal_pending(current))
   2392				break;
   2393			if (timeout && time_after(jiffies, orig_jiffies + timeout))
   2394				break;
   2395		}
   2396	} else {
   2397		while ((info->tx_count || info->tx_active) &&
   2398			info->tx_enabled) {
   2399			msleep_interruptible(jiffies_to_msecs(char_time));
   2400			if (signal_pending(current))
   2401				break;
   2402			if (timeout && time_after(jiffies, orig_jiffies + timeout))
   2403				break;
   2404		}
   2405	}
   2406
   2407exit:
   2408	if (debug_level >= DEBUG_LEVEL_INFO)
   2409		printk("%s(%d):mgslpc_wait_until_sent(%s) exit\n",
   2410			 __FILE__, __LINE__, info->device_name);
   2411}
   2412
   2413/* Called by tty_hangup() when a hangup is signaled.
   2414 * This is the same as closing all open files for the port.
   2415 */
   2416static void mgslpc_hangup(struct tty_struct *tty)
   2417{
   2418	MGSLPC_INFO * info = (MGSLPC_INFO *)tty->driver_data;
   2419
   2420	if (debug_level >= DEBUG_LEVEL_INFO)
   2421		printk("%s(%d):mgslpc_hangup(%s)\n",
   2422			 __FILE__, __LINE__, info->device_name);
   2423
   2424	if (mgslpc_paranoia_check(info, tty->name, "mgslpc_hangup"))
   2425		return;
   2426
   2427	mgslpc_flush_buffer(tty);
   2428	shutdown(info, tty);
   2429	tty_port_hangup(&info->port);
   2430}
   2431
   2432static int carrier_raised(struct tty_port *port)
   2433{
   2434	MGSLPC_INFO *info = container_of(port, MGSLPC_INFO, port);
   2435	unsigned long flags;
   2436
   2437	spin_lock_irqsave(&info->lock, flags);
   2438	get_signals(info);
   2439	spin_unlock_irqrestore(&info->lock, flags);
   2440
   2441	if (info->serial_signals & SerialSignal_DCD)
   2442		return 1;
   2443	return 0;
   2444}
   2445
   2446static void dtr_rts(struct tty_port *port, int onoff)
   2447{
   2448	MGSLPC_INFO *info = container_of(port, MGSLPC_INFO, port);
   2449	unsigned long flags;
   2450
   2451	spin_lock_irqsave(&info->lock, flags);
   2452	if (onoff)
   2453		info->serial_signals |= SerialSignal_RTS | SerialSignal_DTR;
   2454	else
   2455		info->serial_signals &= ~(SerialSignal_RTS | SerialSignal_DTR);
   2456	set_signals(info);
   2457	spin_unlock_irqrestore(&info->lock, flags);
   2458}
   2459
   2460
   2461static int mgslpc_open(struct tty_struct *tty, struct file * filp)
   2462{
   2463	MGSLPC_INFO	*info;
   2464	struct tty_port *port;
   2465	int		retval, line;
   2466	unsigned long	flags;
   2467
   2468	/* verify range of specified line number */
   2469	line = tty->index;
   2470	if (line >= mgslpc_device_count) {
   2471		printk("%s(%d):mgslpc_open with invalid line #%d.\n",
   2472			__FILE__, __LINE__, line);
   2473		return -ENODEV;
   2474	}
   2475
   2476	/* find the info structure for the specified line */
   2477	info = mgslpc_device_list;
   2478	while(info && info->line != line)
   2479		info = info->next_device;
   2480	if (mgslpc_paranoia_check(info, tty->name, "mgslpc_open"))
   2481		return -ENODEV;
   2482
   2483	port = &info->port;
   2484	tty->driver_data = info;
   2485	tty_port_tty_set(port, tty);
   2486
   2487	if (debug_level >= DEBUG_LEVEL_INFO)
   2488		printk("%s(%d):mgslpc_open(%s), old ref count = %d\n",
   2489			 __FILE__, __LINE__, tty->driver->name, port->count);
   2490
   2491	spin_lock_irqsave(&info->netlock, flags);
   2492	if (info->netcount) {
   2493		retval = -EBUSY;
   2494		spin_unlock_irqrestore(&info->netlock, flags);
   2495		goto cleanup;
   2496	}
   2497	spin_lock(&port->lock);
   2498	port->count++;
   2499	spin_unlock(&port->lock);
   2500	spin_unlock_irqrestore(&info->netlock, flags);
   2501
   2502	if (port->count == 1) {
   2503		/* 1st open on this device, init hardware */
   2504		retval = startup(info, tty);
   2505		if (retval < 0)
   2506			goto cleanup;
   2507	}
   2508
   2509	retval = tty_port_block_til_ready(&info->port, tty, filp);
   2510	if (retval) {
   2511		if (debug_level >= DEBUG_LEVEL_INFO)
   2512			printk("%s(%d):block_til_ready(%s) returned %d\n",
   2513				 __FILE__, __LINE__, info->device_name, retval);
   2514		goto cleanup;
   2515	}
   2516
   2517	if (debug_level >= DEBUG_LEVEL_INFO)
   2518		printk("%s(%d):mgslpc_open(%s) success\n",
   2519			 __FILE__, __LINE__, info->device_name);
   2520	retval = 0;
   2521
   2522cleanup:
   2523	return retval;
   2524}
   2525
   2526/*
   2527 * /proc fs routines....
   2528 */
   2529
   2530static inline void line_info(struct seq_file *m, MGSLPC_INFO *info)
   2531{
   2532	char	stat_buf[30];
   2533	unsigned long flags;
   2534
   2535	seq_printf(m, "%s:io:%04X irq:%d",
   2536		      info->device_name, info->io_base, info->irq_level);
   2537
   2538	/* output current serial signal states */
   2539	spin_lock_irqsave(&info->lock, flags);
   2540	get_signals(info);
   2541	spin_unlock_irqrestore(&info->lock, flags);
   2542
   2543	stat_buf[0] = 0;
   2544	stat_buf[1] = 0;
   2545	if (info->serial_signals & SerialSignal_RTS)
   2546		strcat(stat_buf, "|RTS");
   2547	if (info->serial_signals & SerialSignal_CTS)
   2548		strcat(stat_buf, "|CTS");
   2549	if (info->serial_signals & SerialSignal_DTR)
   2550		strcat(stat_buf, "|DTR");
   2551	if (info->serial_signals & SerialSignal_DSR)
   2552		strcat(stat_buf, "|DSR");
   2553	if (info->serial_signals & SerialSignal_DCD)
   2554		strcat(stat_buf, "|CD");
   2555	if (info->serial_signals & SerialSignal_RI)
   2556		strcat(stat_buf, "|RI");
   2557
   2558	if (info->params.mode == MGSL_MODE_HDLC) {
   2559		seq_printf(m, " HDLC txok:%d rxok:%d",
   2560			      info->icount.txok, info->icount.rxok);
   2561		if (info->icount.txunder)
   2562			seq_printf(m, " txunder:%d", info->icount.txunder);
   2563		if (info->icount.txabort)
   2564			seq_printf(m, " txabort:%d", info->icount.txabort);
   2565		if (info->icount.rxshort)
   2566			seq_printf(m, " rxshort:%d", info->icount.rxshort);
   2567		if (info->icount.rxlong)
   2568			seq_printf(m, " rxlong:%d", info->icount.rxlong);
   2569		if (info->icount.rxover)
   2570			seq_printf(m, " rxover:%d", info->icount.rxover);
   2571		if (info->icount.rxcrc)
   2572			seq_printf(m, " rxcrc:%d", info->icount.rxcrc);
   2573	} else {
   2574		seq_printf(m, " ASYNC tx:%d rx:%d",
   2575			      info->icount.tx, info->icount.rx);
   2576		if (info->icount.frame)
   2577			seq_printf(m, " fe:%d", info->icount.frame);
   2578		if (info->icount.parity)
   2579			seq_printf(m, " pe:%d", info->icount.parity);
   2580		if (info->icount.brk)
   2581			seq_printf(m, " brk:%d", info->icount.brk);
   2582		if (info->icount.overrun)
   2583			seq_printf(m, " oe:%d", info->icount.overrun);
   2584	}
   2585
   2586	/* Append serial signal status to end */
   2587	seq_printf(m, " %s\n", stat_buf+1);
   2588
   2589	seq_printf(m, "txactive=%d bh_req=%d bh_run=%d pending_bh=%x\n",
   2590		       info->tx_active,info->bh_requested,info->bh_running,
   2591		       info->pending_bh);
   2592}
   2593
   2594/* Called to print information about devices
   2595 */
   2596static int mgslpc_proc_show(struct seq_file *m, void *v)
   2597{
   2598	MGSLPC_INFO *info;
   2599
   2600	seq_printf(m, "synclink driver:%s\n", driver_version);
   2601
   2602	info = mgslpc_device_list;
   2603	while (info) {
   2604		line_info(m, info);
   2605		info = info->next_device;
   2606	}
   2607	return 0;
   2608}
   2609
   2610static int rx_alloc_buffers(MGSLPC_INFO *info)
   2611{
   2612	/* each buffer has header and data */
   2613	info->rx_buf_size = sizeof(RXBUF) + info->max_frame_size;
   2614
   2615	/* calculate total allocation size for 8 buffers */
   2616	info->rx_buf_total_size = info->rx_buf_size * 8;
   2617
   2618	/* limit total allocated memory */
   2619	if (info->rx_buf_total_size > 0x10000)
   2620		info->rx_buf_total_size = 0x10000;
   2621
   2622	/* calculate number of buffers */
   2623	info->rx_buf_count = info->rx_buf_total_size / info->rx_buf_size;
   2624
   2625	info->rx_buf = kmalloc(info->rx_buf_total_size, GFP_KERNEL);
   2626	if (info->rx_buf == NULL)
   2627		return -ENOMEM;
   2628
   2629	/* unused flag buffer to satisfy receive_buf calling interface */
   2630	info->flag_buf = kzalloc(info->max_frame_size, GFP_KERNEL);
   2631	if (!info->flag_buf) {
   2632		kfree(info->rx_buf);
   2633		info->rx_buf = NULL;
   2634		return -ENOMEM;
   2635	}
   2636	
   2637	rx_reset_buffers(info);
   2638	return 0;
   2639}
   2640
   2641static void rx_free_buffers(MGSLPC_INFO *info)
   2642{
   2643	kfree(info->rx_buf);
   2644	info->rx_buf = NULL;
   2645	kfree(info->flag_buf);
   2646	info->flag_buf = NULL;
   2647}
   2648
   2649static int claim_resources(MGSLPC_INFO *info)
   2650{
   2651	if (rx_alloc_buffers(info) < 0) {
   2652		printk("Can't allocate rx buffer %s\n", info->device_name);
   2653		release_resources(info);
   2654		return -ENODEV;
   2655	}
   2656	return 0;
   2657}
   2658
   2659static void release_resources(MGSLPC_INFO *info)
   2660{
   2661	if (debug_level >= DEBUG_LEVEL_INFO)
   2662		printk("release_resources(%s)\n", info->device_name);
   2663	rx_free_buffers(info);
   2664}
   2665
   2666/* Add the specified device instance data structure to the
   2667 * global linked list of devices and increment the device count.
   2668 *
   2669 * Arguments:		info	pointer to device instance data
   2670 */
   2671static int mgslpc_add_device(MGSLPC_INFO *info)
   2672{
   2673	MGSLPC_INFO *current_dev = NULL;
   2674	struct device *tty_dev;
   2675	int ret;
   2676
   2677	info->next_device = NULL;
   2678	info->line = mgslpc_device_count;
   2679	sprintf(info->device_name,"ttySLP%d",info->line);
   2680
   2681	if (info->line < MAX_DEVICE_COUNT) {
   2682		if (maxframe[info->line])
   2683			info->max_frame_size = maxframe[info->line];
   2684	}
   2685
   2686	mgslpc_device_count++;
   2687
   2688	if (!mgslpc_device_list)
   2689		mgslpc_device_list = info;
   2690	else {
   2691		current_dev = mgslpc_device_list;
   2692		while (current_dev->next_device)
   2693			current_dev = current_dev->next_device;
   2694		current_dev->next_device = info;
   2695	}
   2696
   2697	if (info->max_frame_size < 4096)
   2698		info->max_frame_size = 4096;
   2699	else if (info->max_frame_size > 65535)
   2700		info->max_frame_size = 65535;
   2701
   2702	printk("SyncLink PC Card %s:IO=%04X IRQ=%d\n",
   2703		info->device_name, info->io_base, info->irq_level);
   2704
   2705#if SYNCLINK_GENERIC_HDLC
   2706	ret = hdlcdev_init(info);
   2707	if (ret != 0)
   2708		goto failed;
   2709#endif
   2710
   2711	tty_dev = tty_port_register_device(&info->port, serial_driver, info->line,
   2712			&info->p_dev->dev);
   2713	if (IS_ERR(tty_dev)) {
   2714		ret = PTR_ERR(tty_dev);
   2715#if SYNCLINK_GENERIC_HDLC
   2716		hdlcdev_exit(info);
   2717#endif
   2718		goto failed;
   2719	}
   2720
   2721	return 0;
   2722
   2723failed:
   2724	if (current_dev)
   2725		current_dev->next_device = NULL;
   2726	else
   2727		mgslpc_device_list = NULL;
   2728	mgslpc_device_count--;
   2729	return ret;
   2730}
   2731
   2732static void mgslpc_remove_device(MGSLPC_INFO *remove_info)
   2733{
   2734	MGSLPC_INFO *info = mgslpc_device_list;
   2735	MGSLPC_INFO *last = NULL;
   2736
   2737	while(info) {
   2738		if (info == remove_info) {
   2739			if (last)
   2740				last->next_device = info->next_device;
   2741			else
   2742				mgslpc_device_list = info->next_device;
   2743			tty_unregister_device(serial_driver, info->line);
   2744#if SYNCLINK_GENERIC_HDLC
   2745			hdlcdev_exit(info);
   2746#endif
   2747			release_resources(info);
   2748			tty_port_destroy(&info->port);
   2749			kfree(info);
   2750			mgslpc_device_count--;
   2751			return;
   2752		}
   2753		last = info;
   2754		info = info->next_device;
   2755	}
   2756}
   2757
   2758static const struct pcmcia_device_id mgslpc_ids[] = {
   2759	PCMCIA_DEVICE_MANF_CARD(0x02c5, 0x0050),
   2760	PCMCIA_DEVICE_NULL
   2761};
   2762MODULE_DEVICE_TABLE(pcmcia, mgslpc_ids);
   2763
   2764static struct pcmcia_driver mgslpc_driver = {
   2765	.owner		= THIS_MODULE,
   2766	.name		= "synclink_cs",
   2767	.probe		= mgslpc_probe,
   2768	.remove		= mgslpc_detach,
   2769	.id_table	= mgslpc_ids,
   2770	.suspend	= mgslpc_suspend,
   2771	.resume		= mgslpc_resume,
   2772};
   2773
   2774static const struct tty_operations mgslpc_ops = {
   2775	.open = mgslpc_open,
   2776	.close = mgslpc_close,
   2777	.write = mgslpc_write,
   2778	.put_char = mgslpc_put_char,
   2779	.flush_chars = mgslpc_flush_chars,
   2780	.write_room = mgslpc_write_room,
   2781	.chars_in_buffer = mgslpc_chars_in_buffer,
   2782	.flush_buffer = mgslpc_flush_buffer,
   2783	.ioctl = mgslpc_ioctl,
   2784	.throttle = mgslpc_throttle,
   2785	.unthrottle = mgslpc_unthrottle,
   2786	.send_xchar = mgslpc_send_xchar,
   2787	.break_ctl = mgslpc_break,
   2788	.wait_until_sent = mgslpc_wait_until_sent,
   2789	.set_termios = mgslpc_set_termios,
   2790	.stop = tx_pause,
   2791	.start = tx_release,
   2792	.hangup = mgslpc_hangup,
   2793	.tiocmget = tiocmget,
   2794	.tiocmset = tiocmset,
   2795	.get_icount = mgslpc_get_icount,
   2796	.proc_show = mgslpc_proc_show,
   2797};
   2798
   2799static int __init synclink_cs_init(void)
   2800{
   2801	int rc;
   2802
   2803	if (break_on_load) {
   2804		mgslpc_get_text_ptr();
   2805		BREAKPOINT();
   2806	}
   2807
   2808	serial_driver = tty_alloc_driver(MAX_DEVICE_COUNT,
   2809			TTY_DRIVER_REAL_RAW |
   2810			TTY_DRIVER_DYNAMIC_DEV);
   2811	if (IS_ERR(serial_driver)) {
   2812		rc = PTR_ERR(serial_driver);
   2813		goto err;
   2814	}
   2815
   2816	/* Initialize the tty_driver structure */
   2817	serial_driver->driver_name = "synclink_cs";
   2818	serial_driver->name = "ttySLP";
   2819	serial_driver->major = ttymajor;
   2820	serial_driver->minor_start = 64;
   2821	serial_driver->type = TTY_DRIVER_TYPE_SERIAL;
   2822	serial_driver->subtype = SERIAL_TYPE_NORMAL;
   2823	serial_driver->init_termios = tty_std_termios;
   2824	serial_driver->init_termios.c_cflag =
   2825	B9600 | CS8 | CREAD | HUPCL | CLOCAL;
   2826	tty_set_operations(serial_driver, &mgslpc_ops);
   2827
   2828	rc = tty_register_driver(serial_driver);
   2829	if (rc < 0) {
   2830		printk(KERN_ERR "%s(%d):Couldn't register serial driver\n",
   2831				__FILE__, __LINE__);
   2832		goto err_put_tty;
   2833	}
   2834
   2835	rc = pcmcia_register_driver(&mgslpc_driver);
   2836	if (rc < 0)
   2837		goto err_unreg_tty;
   2838
   2839	printk(KERN_INFO "%s %s, tty major#%d\n", driver_name, driver_version,
   2840			serial_driver->major);
   2841
   2842	return 0;
   2843err_unreg_tty:
   2844	tty_unregister_driver(serial_driver);
   2845err_put_tty:
   2846	tty_driver_kref_put(serial_driver);
   2847err:
   2848	return rc;
   2849}
   2850
   2851static void __exit synclink_cs_exit(void)
   2852{
   2853	pcmcia_unregister_driver(&mgslpc_driver);
   2854	tty_unregister_driver(serial_driver);
   2855	tty_driver_kref_put(serial_driver);
   2856}
   2857
   2858module_init(synclink_cs_init);
   2859module_exit(synclink_cs_exit);
   2860
   2861static void mgslpc_set_rate(MGSLPC_INFO *info, unsigned char channel, unsigned int rate)
   2862{
   2863	unsigned int M, N;
   2864	unsigned char val;
   2865
   2866	/* note:standard BRG mode is broken in V3.2 chip
   2867	 * so enhanced mode is always used
   2868	 */
   2869
   2870	if (rate) {
   2871		N = 3686400 / rate;
   2872		if (!N)
   2873			N = 1;
   2874		N >>= 1;
   2875		for (M = 1; N > 64 && M < 16; M++)
   2876			N >>= 1;
   2877		N--;
   2878
   2879		/* BGR[5..0] = N
   2880		 * BGR[9..6] = M
   2881		 * BGR[7..0] contained in BGR register
   2882		 * BGR[9..8] contained in CCR2[7..6]
   2883		 * divisor = (N+1)*2^M
   2884		 *
   2885		 * Note: M *must* not be zero (causes asymetric duty cycle)
   2886		 */
   2887		write_reg(info, (unsigned char) (channel + BGR),
   2888				  (unsigned char) ((M << 6) + N));
   2889		val = read_reg(info, (unsigned char) (channel + CCR2)) & 0x3f;
   2890		val |= ((M << 4) & 0xc0);
   2891		write_reg(info, (unsigned char) (channel + CCR2), val);
   2892	}
   2893}
   2894
   2895/* Enabled the AUX clock output at the specified frequency.
   2896 */
   2897static void enable_auxclk(MGSLPC_INFO *info)
   2898{
   2899	unsigned char val;
   2900
   2901	/* MODE
   2902	 *
   2903	 * 07..06  MDS[1..0] 10 = transparent HDLC mode
   2904	 * 05      ADM Address Mode, 0 = no addr recognition
   2905	 * 04      TMD Timer Mode, 0 = external
   2906	 * 03      RAC Receiver Active, 0 = inactive
   2907	 * 02      RTS 0=RTS active during xmit, 1=RTS always active
   2908	 * 01      TRS Timer Resolution, 1=512
   2909	 * 00      TLP Test Loop, 0 = no loop
   2910	 *
   2911	 * 1000 0010
   2912	 */
   2913	val = 0x82;
   2914
   2915	/* channel B RTS is used to enable AUXCLK driver on SP505 */
   2916	if (info->params.mode == MGSL_MODE_HDLC && info->params.clock_speed)
   2917		val |= BIT2;
   2918	write_reg(info, CHB + MODE, val);
   2919
   2920	/* CCR0
   2921	 *
   2922	 * 07      PU Power Up, 1=active, 0=power down
   2923	 * 06      MCE Master Clock Enable, 1=enabled
   2924	 * 05      Reserved, 0
   2925	 * 04..02  SC[2..0] Encoding
   2926	 * 01..00  SM[1..0] Serial Mode, 00=HDLC
   2927	 *
   2928	 * 11000000
   2929	 */
   2930	write_reg(info, CHB + CCR0, 0xc0);
   2931
   2932	/* CCR1
   2933	 *
   2934	 * 07      SFLG Shared Flag, 0 = disable shared flags
   2935	 * 06      GALP Go Active On Loop, 0 = not used
   2936	 * 05      GLP Go On Loop, 0 = not used
   2937	 * 04      ODS Output Driver Select, 1=TxD is push-pull output
   2938	 * 03      ITF Interframe Time Fill, 0=mark, 1=flag
   2939	 * 02..00  CM[2..0] Clock Mode
   2940	 *
   2941	 * 0001 0111
   2942	 */
   2943	write_reg(info, CHB + CCR1, 0x17);
   2944
   2945	/* CCR2 (Channel B)
   2946	 *
   2947	 * 07..06  BGR[9..8] Baud rate bits 9..8
   2948	 * 05      BDF Baud rate divisor factor, 0=1, 1=BGR value
   2949	 * 04      SSEL Clock source select, 1=submode b
   2950	 * 03      TOE 0=TxCLK is input, 1=TxCLK is output
   2951	 * 02      RWX Read/Write Exchange 0=disabled
   2952	 * 01      C32, CRC select, 0=CRC-16, 1=CRC-32
   2953	 * 00      DIV, data inversion 0=disabled, 1=enabled
   2954	 *
   2955	 * 0011 1000
   2956	 */
   2957	if (info->params.mode == MGSL_MODE_HDLC && info->params.clock_speed)
   2958		write_reg(info, CHB + CCR2, 0x38);
   2959	else
   2960		write_reg(info, CHB + CCR2, 0x30);
   2961
   2962	/* CCR4
   2963	 *
   2964	 * 07      MCK4 Master Clock Divide by 4, 1=enabled
   2965	 * 06      EBRG Enhanced Baud Rate Generator Mode, 1=enabled
   2966	 * 05      TST1 Test Pin, 0=normal operation
   2967	 * 04      ICD Ivert Carrier Detect, 1=enabled (active low)
   2968	 * 03..02  Reserved, must be 0
   2969	 * 01..00  RFT[1..0] RxFIFO Threshold 00=32 bytes
   2970	 *
   2971	 * 0101 0000
   2972	 */
   2973	write_reg(info, CHB + CCR4, 0x50);
   2974
   2975	/* if auxclk not enabled, set internal BRG so
   2976	 * CTS transitions can be detected (requires TxC)
   2977	 */
   2978	if (info->params.mode == MGSL_MODE_HDLC && info->params.clock_speed)
   2979		mgslpc_set_rate(info, CHB, info->params.clock_speed);
   2980	else
   2981		mgslpc_set_rate(info, CHB, 921600);
   2982}
   2983
   2984static void loopback_enable(MGSLPC_INFO *info)
   2985{
   2986	unsigned char val;
   2987
   2988	/* CCR1:02..00  CM[2..0] Clock Mode = 111 (clock mode 7) */
   2989	val = read_reg(info, CHA + CCR1) | (BIT2 | BIT1 | BIT0);
   2990	write_reg(info, CHA + CCR1, val);
   2991
   2992	/* CCR2:04 SSEL Clock source select, 1=submode b */
   2993	val = read_reg(info, CHA + CCR2) | (BIT4 | BIT5);
   2994	write_reg(info, CHA + CCR2, val);
   2995
   2996	/* set LinkSpeed if available, otherwise default to 2Mbps */
   2997	if (info->params.clock_speed)
   2998		mgslpc_set_rate(info, CHA, info->params.clock_speed);
   2999	else
   3000		mgslpc_set_rate(info, CHA, 1843200);
   3001
   3002	/* MODE:00 TLP Test Loop, 1=loopback enabled */
   3003	val = read_reg(info, CHA + MODE) | BIT0;
   3004	write_reg(info, CHA + MODE, val);
   3005}
   3006
   3007static void hdlc_mode(MGSLPC_INFO *info)
   3008{
   3009	unsigned char val;
   3010	unsigned char clkmode, clksubmode;
   3011
   3012	/* disable all interrupts */
   3013	irq_disable(info, CHA, 0xffff);
   3014	irq_disable(info, CHB, 0xffff);
   3015	port_irq_disable(info, 0xff);
   3016
   3017	/* assume clock mode 0a, rcv=RxC xmt=TxC */
   3018	clkmode = clksubmode = 0;
   3019	if (info->params.flags & HDLC_FLAG_RXC_DPLL
   3020	    && info->params.flags & HDLC_FLAG_TXC_DPLL) {
   3021		/* clock mode 7a, rcv = DPLL, xmt = DPLL */
   3022		clkmode = 7;
   3023	} else if (info->params.flags & HDLC_FLAG_RXC_BRG
   3024		 && info->params.flags & HDLC_FLAG_TXC_BRG) {
   3025		/* clock mode 7b, rcv = BRG, xmt = BRG */
   3026		clkmode = 7;
   3027		clksubmode = 1;
   3028	} else if (info->params.flags & HDLC_FLAG_RXC_DPLL) {
   3029		if (info->params.flags & HDLC_FLAG_TXC_BRG) {
   3030			/* clock mode 6b, rcv = DPLL, xmt = BRG/16 */
   3031			clkmode = 6;
   3032			clksubmode = 1;
   3033		} else {
   3034			/* clock mode 6a, rcv = DPLL, xmt = TxC */
   3035			clkmode = 6;
   3036		}
   3037	} else if (info->params.flags & HDLC_FLAG_TXC_BRG) {
   3038		/* clock mode 0b, rcv = RxC, xmt = BRG */
   3039		clksubmode = 1;
   3040	}
   3041
   3042	/* MODE
   3043	 *
   3044	 * 07..06  MDS[1..0] 10 = transparent HDLC mode
   3045	 * 05      ADM Address Mode, 0 = no addr recognition
   3046	 * 04      TMD Timer Mode, 0 = external
   3047	 * 03      RAC Receiver Active, 0 = inactive
   3048	 * 02      RTS 0=RTS active during xmit, 1=RTS always active
   3049	 * 01      TRS Timer Resolution, 1=512
   3050	 * 00      TLP Test Loop, 0 = no loop
   3051	 *
   3052	 * 1000 0010
   3053	 */
   3054	val = 0x82;
   3055	if (info->params.loopback)
   3056		val |= BIT0;
   3057
   3058	/* preserve RTS state */
   3059	if (info->serial_signals & SerialSignal_RTS)
   3060		val |= BIT2;
   3061	write_reg(info, CHA + MODE, val);
   3062
   3063	/* CCR0
   3064	 *
   3065	 * 07      PU Power Up, 1=active, 0=power down
   3066	 * 06      MCE Master Clock Enable, 1=enabled
   3067	 * 05      Reserved, 0
   3068	 * 04..02  SC[2..0] Encoding
   3069	 * 01..00  SM[1..0] Serial Mode, 00=HDLC
   3070	 *
   3071	 * 11000000
   3072	 */
   3073	val = 0xc0;
   3074	switch (info->params.encoding)
   3075	{
   3076	case HDLC_ENCODING_NRZI:
   3077		val |= BIT3;
   3078		break;
   3079	case HDLC_ENCODING_BIPHASE_SPACE:
   3080		val |= BIT4;
   3081		break;		// FM0
   3082	case HDLC_ENCODING_BIPHASE_MARK:
   3083		val |= BIT4 | BIT2;
   3084		break;		// FM1
   3085	case HDLC_ENCODING_BIPHASE_LEVEL:
   3086		val |= BIT4 | BIT3;
   3087		break;		// Manchester
   3088	}
   3089	write_reg(info, CHA + CCR0, val);
   3090
   3091	/* CCR1
   3092	 *
   3093	 * 07      SFLG Shared Flag, 0 = disable shared flags
   3094	 * 06      GALP Go Active On Loop, 0 = not used
   3095	 * 05      GLP Go On Loop, 0 = not used
   3096	 * 04      ODS Output Driver Select, 1=TxD is push-pull output
   3097	 * 03      ITF Interframe Time Fill, 0=mark, 1=flag
   3098	 * 02..00  CM[2..0] Clock Mode
   3099	 *
   3100	 * 0001 0000
   3101	 */
   3102	val = 0x10 + clkmode;
   3103	write_reg(info, CHA + CCR1, val);
   3104
   3105	/* CCR2
   3106	 *
   3107	 * 07..06  BGR[9..8] Baud rate bits 9..8
   3108	 * 05      BDF Baud rate divisor factor, 0=1, 1=BGR value
   3109	 * 04      SSEL Clock source select, 1=submode b
   3110	 * 03      TOE 0=TxCLK is input, 0=TxCLK is input
   3111	 * 02      RWX Read/Write Exchange 0=disabled
   3112	 * 01      C32, CRC select, 0=CRC-16, 1=CRC-32
   3113	 * 00      DIV, data inversion 0=disabled, 1=enabled
   3114	 *
   3115	 * 0000 0000
   3116	 */
   3117	val = 0x00;
   3118	if (clkmode == 2 || clkmode == 3 || clkmode == 6
   3119	    || clkmode == 7 || (clkmode == 0 && clksubmode == 1))
   3120		val |= BIT5;
   3121	if (clksubmode)
   3122		val |= BIT4;
   3123	if (info->params.crc_type == HDLC_CRC_32_CCITT)
   3124		val |= BIT1;
   3125	if (info->params.encoding == HDLC_ENCODING_NRZB)
   3126		val |= BIT0;
   3127	write_reg(info, CHA + CCR2, val);
   3128
   3129	/* CCR3
   3130	 *
   3131	 * 07..06  PRE[1..0] Preamble count 00=1, 01=2, 10=4, 11=8
   3132	 * 05      EPT Enable preamble transmission, 1=enabled
   3133	 * 04      RADD Receive address pushed to FIFO, 0=disabled
   3134	 * 03      CRL CRC Reset Level, 0=FFFF
   3135	 * 02      RCRC Rx CRC 0=On 1=Off
   3136	 * 01      TCRC Tx CRC 0=On 1=Off
   3137	 * 00      PSD DPLL Phase Shift Disable
   3138	 *
   3139	 * 0000 0000
   3140	 */
   3141	val = 0x00;
   3142	if (info->params.crc_type == HDLC_CRC_NONE)
   3143		val |= BIT2 | BIT1;
   3144	if (info->params.preamble != HDLC_PREAMBLE_PATTERN_NONE)
   3145		val |= BIT5;
   3146	switch (info->params.preamble_length)
   3147	{
   3148	case HDLC_PREAMBLE_LENGTH_16BITS:
   3149		val |= BIT6;
   3150		break;
   3151	case HDLC_PREAMBLE_LENGTH_32BITS:
   3152		val |= BIT6;
   3153		break;
   3154	case HDLC_PREAMBLE_LENGTH_64BITS:
   3155		val |= BIT7 | BIT6;
   3156		break;
   3157	}
   3158	write_reg(info, CHA + CCR3, val);
   3159
   3160	/* PRE - Preamble pattern */
   3161	val = 0;
   3162	switch (info->params.preamble)
   3163	{
   3164	case HDLC_PREAMBLE_PATTERN_FLAGS: val = 0x7e; break;
   3165	case HDLC_PREAMBLE_PATTERN_10:    val = 0xaa; break;
   3166	case HDLC_PREAMBLE_PATTERN_01:    val = 0x55; break;
   3167	case HDLC_PREAMBLE_PATTERN_ONES:  val = 0xff; break;
   3168	}
   3169	write_reg(info, CHA + PRE, val);
   3170
   3171	/* CCR4
   3172	 *
   3173	 * 07      MCK4 Master Clock Divide by 4, 1=enabled
   3174	 * 06      EBRG Enhanced Baud Rate Generator Mode, 1=enabled
   3175	 * 05      TST1 Test Pin, 0=normal operation
   3176	 * 04      ICD Ivert Carrier Detect, 1=enabled (active low)
   3177	 * 03..02  Reserved, must be 0
   3178	 * 01..00  RFT[1..0] RxFIFO Threshold 00=32 bytes
   3179	 *
   3180	 * 0101 0000
   3181	 */
   3182	val = 0x50;
   3183	write_reg(info, CHA + CCR4, val);
   3184	if (info->params.flags & HDLC_FLAG_RXC_DPLL)
   3185		mgslpc_set_rate(info, CHA, info->params.clock_speed * 16);
   3186	else
   3187		mgslpc_set_rate(info, CHA, info->params.clock_speed);
   3188
   3189	/* RLCR Receive length check register
   3190	 *
   3191	 * 7     1=enable receive length check
   3192	 * 6..0  Max frame length = (RL + 1) * 32
   3193	 */
   3194	write_reg(info, CHA + RLCR, 0);
   3195
   3196	/* XBCH Transmit Byte Count High
   3197	 *
   3198	 * 07      DMA mode, 0 = interrupt driven
   3199	 * 06      NRM, 0=ABM (ignored)
   3200	 * 05      CAS Carrier Auto Start
   3201	 * 04      XC Transmit Continuously (ignored)
   3202	 * 03..00  XBC[10..8] Transmit byte count bits 10..8
   3203	 *
   3204	 * 0000 0000
   3205	 */
   3206	val = 0x00;
   3207	if (info->params.flags & HDLC_FLAG_AUTO_DCD)
   3208		val |= BIT5;
   3209	write_reg(info, CHA + XBCH, val);
   3210	enable_auxclk(info);
   3211	if (info->params.loopback || info->testing_irq)
   3212		loopback_enable(info);
   3213	if (info->params.flags & HDLC_FLAG_AUTO_CTS)
   3214	{
   3215		irq_enable(info, CHB, IRQ_CTS);
   3216		/* PVR[3] 1=AUTO CTS active */
   3217		set_reg_bits(info, CHA + PVR, BIT3);
   3218	} else
   3219		clear_reg_bits(info, CHA + PVR, BIT3);
   3220
   3221	irq_enable(info, CHA,
   3222			 IRQ_RXEOM | IRQ_RXFIFO | IRQ_ALLSENT |
   3223			 IRQ_UNDERRUN | IRQ_TXFIFO);
   3224	issue_command(info, CHA, CMD_TXRESET + CMD_RXRESET);
   3225	wait_command_complete(info, CHA);
   3226	read_reg16(info, CHA + ISR);	/* clear pending IRQs */
   3227
   3228	/* Master clock mode enabled above to allow reset commands
   3229	 * to complete even if no data clocks are present.
   3230	 *
   3231	 * Disable master clock mode for normal communications because
   3232	 * V3.2 of the ESCC2 has a bug that prevents the transmit all sent
   3233	 * IRQ when in master clock mode.
   3234	 *
   3235	 * Leave master clock mode enabled for IRQ test because the
   3236	 * timer IRQ used by the test can only happen in master clock mode.
   3237	 */
   3238	if (!info->testing_irq)
   3239		clear_reg_bits(info, CHA + CCR0, BIT6);
   3240
   3241	tx_set_idle(info);
   3242
   3243	tx_stop(info);
   3244	rx_stop(info);
   3245}
   3246
   3247static void rx_stop(MGSLPC_INFO *info)
   3248{
   3249	if (debug_level >= DEBUG_LEVEL_ISR)
   3250		printk("%s(%d):rx_stop(%s)\n",
   3251			 __FILE__, __LINE__, info->device_name);
   3252
   3253	/* MODE:03 RAC Receiver Active, 0=inactive */
   3254	clear_reg_bits(info, CHA + MODE, BIT3);
   3255
   3256	info->rx_enabled = false;
   3257	info->rx_overflow = false;
   3258}
   3259
   3260static void rx_start(MGSLPC_INFO *info)
   3261{
   3262	if (debug_level >= DEBUG_LEVEL_ISR)
   3263		printk("%s(%d):rx_start(%s)\n",
   3264			 __FILE__, __LINE__, info->device_name);
   3265
   3266	rx_reset_buffers(info);
   3267	info->rx_enabled = false;
   3268	info->rx_overflow = false;
   3269
   3270	/* MODE:03 RAC Receiver Active, 1=active */
   3271	set_reg_bits(info, CHA + MODE, BIT3);
   3272
   3273	info->rx_enabled = true;
   3274}
   3275
   3276static void tx_start(MGSLPC_INFO *info, struct tty_struct *tty)
   3277{
   3278	if (debug_level >= DEBUG_LEVEL_ISR)
   3279		printk("%s(%d):tx_start(%s)\n",
   3280			 __FILE__, __LINE__, info->device_name);
   3281
   3282	if (info->tx_count) {
   3283		/* If auto RTS enabled and RTS is inactive, then assert */
   3284		/* RTS and set a flag indicating that the driver should */
   3285		/* negate RTS when the transmission completes. */
   3286		info->drop_rts_on_tx_done = false;
   3287
   3288		if (info->params.flags & HDLC_FLAG_AUTO_RTS) {
   3289			get_signals(info);
   3290			if (!(info->serial_signals & SerialSignal_RTS)) {
   3291				info->serial_signals |= SerialSignal_RTS;
   3292				set_signals(info);
   3293				info->drop_rts_on_tx_done = true;
   3294			}
   3295		}
   3296
   3297		if (info->params.mode == MGSL_MODE_ASYNC) {
   3298			if (!info->tx_active) {
   3299				info->tx_active = true;
   3300				tx_ready(info, tty);
   3301			}
   3302		} else {
   3303			info->tx_active = true;
   3304			tx_ready(info, tty);
   3305			mod_timer(&info->tx_timer, jiffies +
   3306					msecs_to_jiffies(5000));
   3307		}
   3308	}
   3309
   3310	if (!info->tx_enabled)
   3311		info->tx_enabled = true;
   3312}
   3313
   3314static void tx_stop(MGSLPC_INFO *info)
   3315{
   3316	if (debug_level >= DEBUG_LEVEL_ISR)
   3317		printk("%s(%d):tx_stop(%s)\n",
   3318			 __FILE__, __LINE__, info->device_name);
   3319
   3320	del_timer(&info->tx_timer);
   3321
   3322	info->tx_enabled = false;
   3323	info->tx_active = false;
   3324}
   3325
   3326/* Reset the adapter to a known state and prepare it for further use.
   3327 */
   3328static void reset_device(MGSLPC_INFO *info)
   3329{
   3330	/* power up both channels (set BIT7) */
   3331	write_reg(info, CHA + CCR0, 0x80);
   3332	write_reg(info, CHB + CCR0, 0x80);
   3333	write_reg(info, CHA + MODE, 0);
   3334	write_reg(info, CHB + MODE, 0);
   3335
   3336	/* disable all interrupts */
   3337	irq_disable(info, CHA, 0xffff);
   3338	irq_disable(info, CHB, 0xffff);
   3339	port_irq_disable(info, 0xff);
   3340
   3341	/* PCR Port Configuration Register
   3342	 *
   3343	 * 07..04  DEC[3..0] Serial I/F select outputs
   3344	 * 03      output, 1=AUTO CTS control enabled
   3345	 * 02      RI Ring Indicator input 0=active
   3346	 * 01      DSR input 0=active
   3347	 * 00      DTR output 0=active
   3348	 *
   3349	 * 0000 0110
   3350	 */
   3351	write_reg(info, PCR, 0x06);
   3352
   3353	/* PVR Port Value Register
   3354	 *
   3355	 * 07..04  DEC[3..0] Serial I/F select (0000=disabled)
   3356	 * 03      AUTO CTS output 1=enabled
   3357	 * 02      RI Ring Indicator input
   3358	 * 01      DSR input
   3359	 * 00      DTR output (1=inactive)
   3360	 *
   3361	 * 0000 0001
   3362	 */
   3363//	write_reg(info, PVR, PVR_DTR);
   3364
   3365	/* IPC Interrupt Port Configuration
   3366	 *
   3367	 * 07      VIS 1=Masked interrupts visible
   3368	 * 06..05  Reserved, 0
   3369	 * 04..03  SLA Slave address, 00 ignored
   3370	 * 02      CASM Cascading Mode, 1=daisy chain
   3371	 * 01..00  IC[1..0] Interrupt Config, 01=push-pull output, active low
   3372	 *
   3373	 * 0000 0101
   3374	 */
   3375	write_reg(info, IPC, 0x05);
   3376}
   3377
   3378static void async_mode(MGSLPC_INFO *info)
   3379{
   3380	unsigned char val;
   3381
   3382	/* disable all interrupts */
   3383	irq_disable(info, CHA, 0xffff);
   3384	irq_disable(info, CHB, 0xffff);
   3385	port_irq_disable(info, 0xff);
   3386
   3387	/* MODE
   3388	 *
   3389	 * 07      Reserved, 0
   3390	 * 06      FRTS RTS State, 0=active
   3391	 * 05      FCTS Flow Control on CTS
   3392	 * 04      FLON Flow Control Enable
   3393	 * 03      RAC Receiver Active, 0 = inactive
   3394	 * 02      RTS 0=Auto RTS, 1=manual RTS
   3395	 * 01      TRS Timer Resolution, 1=512
   3396	 * 00      TLP Test Loop, 0 = no loop
   3397	 *
   3398	 * 0000 0110
   3399	 */
   3400	val = 0x06;
   3401	if (info->params.loopback)
   3402		val |= BIT0;
   3403
   3404	/* preserve RTS state */
   3405	if (!(info->serial_signals & SerialSignal_RTS))
   3406		val |= BIT6;
   3407	write_reg(info, CHA + MODE, val);
   3408
   3409	/* CCR0
   3410	 *
   3411	 * 07      PU Power Up, 1=active, 0=power down
   3412	 * 06      MCE Master Clock Enable, 1=enabled
   3413	 * 05      Reserved, 0
   3414	 * 04..02  SC[2..0] Encoding, 000=NRZ
   3415	 * 01..00  SM[1..0] Serial Mode, 11=Async
   3416	 *
   3417	 * 1000 0011
   3418	 */
   3419	write_reg(info, CHA + CCR0, 0x83);
   3420
   3421	/* CCR1
   3422	 *
   3423	 * 07..05  Reserved, 0
   3424	 * 04      ODS Output Driver Select, 1=TxD is push-pull output
   3425	 * 03      BCR Bit Clock Rate, 1=16x
   3426	 * 02..00  CM[2..0] Clock Mode, 111=BRG
   3427	 *
   3428	 * 0001 1111
   3429	 */
   3430	write_reg(info, CHA + CCR1, 0x1f);
   3431
   3432	/* CCR2 (channel A)
   3433	 *
   3434	 * 07..06  BGR[9..8] Baud rate bits 9..8
   3435	 * 05      BDF Baud rate divisor factor, 0=1, 1=BGR value
   3436	 * 04      SSEL Clock source select, 1=submode b
   3437	 * 03      TOE 0=TxCLK is input, 0=TxCLK is input
   3438	 * 02      RWX Read/Write Exchange 0=disabled
   3439	 * 01      Reserved, 0
   3440	 * 00      DIV, data inversion 0=disabled, 1=enabled
   3441	 *
   3442	 * 0001 0000
   3443	 */
   3444	write_reg(info, CHA + CCR2, 0x10);
   3445
   3446	/* CCR3
   3447	 *
   3448	 * 07..01  Reserved, 0
   3449	 * 00      PSD DPLL Phase Shift Disable
   3450	 *
   3451	 * 0000 0000
   3452	 */
   3453	write_reg(info, CHA + CCR3, 0);
   3454
   3455	/* CCR4
   3456	 *
   3457	 * 07      MCK4 Master Clock Divide by 4, 1=enabled
   3458	 * 06      EBRG Enhanced Baud Rate Generator Mode, 1=enabled
   3459	 * 05      TST1 Test Pin, 0=normal operation
   3460	 * 04      ICD Ivert Carrier Detect, 1=enabled (active low)
   3461	 * 03..00  Reserved, must be 0
   3462	 *
   3463	 * 0101 0000
   3464	 */
   3465	write_reg(info, CHA + CCR4, 0x50);
   3466	mgslpc_set_rate(info, CHA, info->params.data_rate * 16);
   3467
   3468	/* DAFO Data Format
   3469	 *
   3470	 * 07      Reserved, 0
   3471	 * 06      XBRK transmit break, 0=normal operation
   3472	 * 05      Stop bits (0=1, 1=2)
   3473	 * 04..03  PAR[1..0] Parity (01=odd, 10=even)
   3474	 * 02      PAREN Parity Enable
   3475	 * 01..00  CHL[1..0] Character Length (00=8, 01=7)
   3476	 *
   3477	 */
   3478	val = 0x00;
   3479	if (info->params.data_bits != 8)
   3480		val |= BIT0;	/* 7 bits */
   3481	if (info->params.stop_bits != 1)
   3482		val |= BIT5;
   3483	if (info->params.parity != ASYNC_PARITY_NONE)
   3484	{
   3485		val |= BIT2;	/* Parity enable */
   3486		if (info->params.parity == ASYNC_PARITY_ODD)
   3487			val |= BIT3;
   3488		else
   3489			val |= BIT4;
   3490	}
   3491	write_reg(info, CHA + DAFO, val);
   3492
   3493	/* RFC Rx FIFO Control
   3494	 *
   3495	 * 07      Reserved, 0
   3496	 * 06      DPS, 1=parity bit not stored in data byte
   3497	 * 05      DXS, 0=all data stored in FIFO (including XON/XOFF)
   3498	 * 04      RFDF Rx FIFO Data Format, 1=status byte stored in FIFO
   3499	 * 03..02  RFTH[1..0], rx threshold, 11=16 status + 16 data byte
   3500	 * 01      Reserved, 0
   3501	 * 00      TCDE Terminate Char Detect Enable, 0=disabled
   3502	 *
   3503	 * 0101 1100
   3504	 */
   3505	write_reg(info, CHA + RFC, 0x5c);
   3506
   3507	/* RLCR Receive length check register
   3508	 *
   3509	 * Max frame length = (RL + 1) * 32
   3510	 */
   3511	write_reg(info, CHA + RLCR, 0);
   3512
   3513	/* XBCH Transmit Byte Count High
   3514	 *
   3515	 * 07      DMA mode, 0 = interrupt driven
   3516	 * 06      NRM, 0=ABM (ignored)
   3517	 * 05      CAS Carrier Auto Start
   3518	 * 04      XC Transmit Continuously (ignored)
   3519	 * 03..00  XBC[10..8] Transmit byte count bits 10..8
   3520	 *
   3521	 * 0000 0000
   3522	 */
   3523	val = 0x00;
   3524	if (info->params.flags & HDLC_FLAG_AUTO_DCD)
   3525		val |= BIT5;
   3526	write_reg(info, CHA + XBCH, val);
   3527	if (info->params.flags & HDLC_FLAG_AUTO_CTS)
   3528		irq_enable(info, CHA, IRQ_CTS);
   3529
   3530	/* MODE:03 RAC Receiver Active, 1=active */
   3531	set_reg_bits(info, CHA + MODE, BIT3);
   3532	enable_auxclk(info);
   3533	if (info->params.flags & HDLC_FLAG_AUTO_CTS) {
   3534		irq_enable(info, CHB, IRQ_CTS);
   3535		/* PVR[3] 1=AUTO CTS active */
   3536		set_reg_bits(info, CHA + PVR, BIT3);
   3537	} else
   3538		clear_reg_bits(info, CHA + PVR, BIT3);
   3539	irq_enable(info, CHA,
   3540			  IRQ_RXEOM | IRQ_RXFIFO | IRQ_BREAK_ON | IRQ_RXTIME |
   3541			  IRQ_ALLSENT | IRQ_TXFIFO);
   3542	issue_command(info, CHA, CMD_TXRESET + CMD_RXRESET);
   3543	wait_command_complete(info, CHA);
   3544	read_reg16(info, CHA + ISR);	/* clear pending IRQs */
   3545}
   3546
   3547/* Set the HDLC idle mode for the transmitter.
   3548 */
   3549static void tx_set_idle(MGSLPC_INFO *info)
   3550{
   3551	/* Note: ESCC2 only supports flags and one idle modes */
   3552	if (info->idle_mode == HDLC_TXIDLE_FLAGS)
   3553		set_reg_bits(info, CHA + CCR1, BIT3);
   3554	else
   3555		clear_reg_bits(info, CHA + CCR1, BIT3);
   3556}
   3557
   3558/* get state of the V24 status (input) signals.
   3559 */
   3560static void get_signals(MGSLPC_INFO *info)
   3561{
   3562	unsigned char status = 0;
   3563
   3564	/* preserve RTS and DTR */
   3565	info->serial_signals &= SerialSignal_RTS | SerialSignal_DTR;
   3566
   3567	if (read_reg(info, CHB + VSTR) & BIT7)
   3568		info->serial_signals |= SerialSignal_DCD;
   3569	if (read_reg(info, CHB + STAR) & BIT1)
   3570		info->serial_signals |= SerialSignal_CTS;
   3571
   3572	status = read_reg(info, CHA + PVR);
   3573	if (!(status & PVR_RI))
   3574		info->serial_signals |= SerialSignal_RI;
   3575	if (!(status & PVR_DSR))
   3576		info->serial_signals |= SerialSignal_DSR;
   3577}
   3578
   3579/* Set the state of RTS and DTR based on contents of
   3580 * serial_signals member of device extension.
   3581 */
   3582static void set_signals(MGSLPC_INFO *info)
   3583{
   3584	unsigned char val;
   3585
   3586	val = read_reg(info, CHA + MODE);
   3587	if (info->params.mode == MGSL_MODE_ASYNC) {
   3588		if (info->serial_signals & SerialSignal_RTS)
   3589			val &= ~BIT6;
   3590		else
   3591			val |= BIT6;
   3592	} else {
   3593		if (info->serial_signals & SerialSignal_RTS)
   3594			val |= BIT2;
   3595		else
   3596			val &= ~BIT2;
   3597	}
   3598	write_reg(info, CHA + MODE, val);
   3599
   3600	if (info->serial_signals & SerialSignal_DTR)
   3601		clear_reg_bits(info, CHA + PVR, PVR_DTR);
   3602	else
   3603		set_reg_bits(info, CHA + PVR, PVR_DTR);
   3604}
   3605
   3606static void rx_reset_buffers(MGSLPC_INFO *info)
   3607{
   3608	RXBUF *buf;
   3609	int i;
   3610
   3611	info->rx_put = 0;
   3612	info->rx_get = 0;
   3613	info->rx_frame_count = 0;
   3614	for (i=0 ; i < info->rx_buf_count ; i++) {
   3615		buf = (RXBUF*)(info->rx_buf + (i * info->rx_buf_size));
   3616		buf->status = buf->count = 0;
   3617	}
   3618}
   3619
   3620/* Attempt to return a received HDLC frame
   3621 * Only frames received without errors are returned.
   3622 *
   3623 * Returns true if frame returned, otherwise false
   3624 */
   3625static bool rx_get_frame(MGSLPC_INFO *info, struct tty_struct *tty)
   3626{
   3627	unsigned short status;
   3628	RXBUF *buf;
   3629	unsigned int framesize = 0;
   3630	unsigned long flags;
   3631	bool return_frame = false;
   3632
   3633	if (info->rx_frame_count == 0)
   3634		return false;
   3635
   3636	buf = (RXBUF*)(info->rx_buf + (info->rx_get * info->rx_buf_size));
   3637
   3638	status = buf->status;
   3639
   3640	/* 07  VFR  1=valid frame
   3641	 * 06  RDO  1=data overrun
   3642	 * 05  CRC  1=OK, 0=error
   3643	 * 04  RAB  1=frame aborted
   3644	 */
   3645	if ((status & 0xf0) != 0xA0) {
   3646		if (!(status & BIT7) || (status & BIT4))
   3647			info->icount.rxabort++;
   3648		else if (status & BIT6)
   3649			info->icount.rxover++;
   3650		else if (!(status & BIT5)) {
   3651			info->icount.rxcrc++;
   3652			if (info->params.crc_type & HDLC_CRC_RETURN_EX)
   3653				return_frame = true;
   3654		}
   3655		framesize = 0;
   3656#if SYNCLINK_GENERIC_HDLC
   3657		{
   3658			info->netdev->stats.rx_errors++;
   3659			info->netdev->stats.rx_frame_errors++;
   3660		}
   3661#endif
   3662	} else
   3663		return_frame = true;
   3664
   3665	if (return_frame)
   3666		framesize = buf->count;
   3667
   3668	if (debug_level >= DEBUG_LEVEL_BH)
   3669		printk("%s(%d):rx_get_frame(%s) status=%04X size=%d\n",
   3670			__FILE__, __LINE__, info->device_name, status, framesize);
   3671
   3672	if (debug_level >= DEBUG_LEVEL_DATA)
   3673		trace_block(info, buf->data, framesize, 0);
   3674
   3675	if (framesize) {
   3676		if ((info->params.crc_type & HDLC_CRC_RETURN_EX &&
   3677		      framesize+1 > info->max_frame_size) ||
   3678		    framesize > info->max_frame_size)
   3679			info->icount.rxlong++;
   3680		else {
   3681			if (status & BIT5)
   3682				info->icount.rxok++;
   3683
   3684			if (info->params.crc_type & HDLC_CRC_RETURN_EX) {
   3685				*(buf->data + framesize) = status & BIT5 ? RX_OK:RX_CRC_ERROR;
   3686				++framesize;
   3687			}
   3688
   3689#if SYNCLINK_GENERIC_HDLC
   3690			if (info->netcount)
   3691				hdlcdev_rx(info, buf->data, framesize);
   3692			else
   3693#endif
   3694				ldisc_receive_buf(tty, buf->data, info->flag_buf, framesize);
   3695		}
   3696	}
   3697
   3698	spin_lock_irqsave(&info->lock, flags);
   3699	buf->status = buf->count = 0;
   3700	info->rx_frame_count--;
   3701	info->rx_get++;
   3702	if (info->rx_get >= info->rx_buf_count)
   3703		info->rx_get = 0;
   3704	spin_unlock_irqrestore(&info->lock, flags);
   3705
   3706	return true;
   3707}
   3708
   3709static bool register_test(MGSLPC_INFO *info)
   3710{
   3711	static unsigned char patterns[] =
   3712	    { 0x00, 0xff, 0xaa, 0x55, 0x69, 0x96, 0x0f };
   3713	static unsigned int count = ARRAY_SIZE(patterns);
   3714	unsigned int i;
   3715	bool rc = true;
   3716	unsigned long flags;
   3717
   3718	spin_lock_irqsave(&info->lock, flags);
   3719	reset_device(info);
   3720
   3721	for (i = 0; i < count; i++) {
   3722		write_reg(info, XAD1, patterns[i]);
   3723		write_reg(info, XAD2, patterns[(i + 1) % count]);
   3724		if ((read_reg(info, XAD1) != patterns[i]) ||
   3725		    (read_reg(info, XAD2) != patterns[(i + 1) % count])) {
   3726			rc = false;
   3727			break;
   3728		}
   3729	}
   3730
   3731	spin_unlock_irqrestore(&info->lock, flags);
   3732	return rc;
   3733}
   3734
   3735static bool irq_test(MGSLPC_INFO *info)
   3736{
   3737	unsigned long end_time;
   3738	unsigned long flags;
   3739
   3740	spin_lock_irqsave(&info->lock, flags);
   3741	reset_device(info);
   3742
   3743	info->testing_irq = true;
   3744	hdlc_mode(info);
   3745
   3746	info->irq_occurred = false;
   3747
   3748	/* init hdlc mode */
   3749
   3750	irq_enable(info, CHA, IRQ_TIMER);
   3751	write_reg(info, CHA + TIMR, 0);	/* 512 cycles */
   3752	issue_command(info, CHA, CMD_START_TIMER);
   3753
   3754	spin_unlock_irqrestore(&info->lock, flags);
   3755
   3756	end_time=100;
   3757	while(end_time-- && !info->irq_occurred) {
   3758		msleep_interruptible(10);
   3759	}
   3760
   3761	info->testing_irq = false;
   3762
   3763	spin_lock_irqsave(&info->lock, flags);
   3764	reset_device(info);
   3765	spin_unlock_irqrestore(&info->lock, flags);
   3766
   3767	return info->irq_occurred;
   3768}
   3769
   3770static int adapter_test(MGSLPC_INFO *info)
   3771{
   3772	if (!register_test(info)) {
   3773		info->init_error = DiagStatus_AddressFailure;
   3774		printk("%s(%d):Register test failure for device %s Addr=%04X\n",
   3775			__FILE__, __LINE__, info->device_name, (unsigned short)(info->io_base));
   3776		return -ENODEV;
   3777	}
   3778
   3779	if (!irq_test(info)) {
   3780		info->init_error = DiagStatus_IrqFailure;
   3781		printk("%s(%d):Interrupt test failure for device %s IRQ=%d\n",
   3782			__FILE__, __LINE__, info->device_name, (unsigned short)(info->irq_level));
   3783		return -ENODEV;
   3784	}
   3785
   3786	if (debug_level >= DEBUG_LEVEL_INFO)
   3787		printk("%s(%d):device %s passed diagnostics\n",
   3788			__FILE__, __LINE__, info->device_name);
   3789	return 0;
   3790}
   3791
   3792static void trace_block(MGSLPC_INFO *info,const char* data, int count, int xmit)
   3793{
   3794	int i;
   3795	int linecount;
   3796	if (xmit)
   3797		printk("%s tx data:\n", info->device_name);
   3798	else
   3799		printk("%s rx data:\n", info->device_name);
   3800
   3801	while(count) {
   3802		if (count > 16)
   3803			linecount = 16;
   3804		else
   3805			linecount = count;
   3806
   3807		for(i=0;i<linecount;i++)
   3808			printk("%02X ", (unsigned char)data[i]);
   3809		for(;i<17;i++)
   3810			printk("   ");
   3811		for(i=0;i<linecount;i++) {
   3812			if (data[i]>=040 && data[i]<=0176)
   3813				printk("%c", data[i]);
   3814			else
   3815				printk(".");
   3816		}
   3817		printk("\n");
   3818
   3819		data  += linecount;
   3820		count -= linecount;
   3821	}
   3822}
   3823
   3824/* HDLC frame time out
   3825 * update stats and do tx completion processing
   3826 */
   3827static void tx_timeout(struct timer_list *t)
   3828{
   3829	MGSLPC_INFO *info = from_timer(info, t, tx_timer);
   3830	unsigned long flags;
   3831
   3832	if (debug_level >= DEBUG_LEVEL_INFO)
   3833		printk("%s(%d):tx_timeout(%s)\n",
   3834			__FILE__, __LINE__, info->device_name);
   3835	if (info->tx_active &&
   3836	    info->params.mode == MGSL_MODE_HDLC) {
   3837		info->icount.txtimeout++;
   3838	}
   3839	spin_lock_irqsave(&info->lock, flags);
   3840	info->tx_active = false;
   3841	info->tx_count = info->tx_put = info->tx_get = 0;
   3842
   3843	spin_unlock_irqrestore(&info->lock, flags);
   3844
   3845#if SYNCLINK_GENERIC_HDLC
   3846	if (info->netcount)
   3847		hdlcdev_tx_done(info);
   3848	else
   3849#endif
   3850	{
   3851		struct tty_struct *tty = tty_port_tty_get(&info->port);
   3852		bh_transmit(info, tty);
   3853		tty_kref_put(tty);
   3854	}
   3855}
   3856
   3857#if SYNCLINK_GENERIC_HDLC
   3858
   3859/**
   3860 * called by generic HDLC layer when protocol selected (PPP, frame relay, etc.)
   3861 * set encoding and frame check sequence (FCS) options
   3862 *
   3863 * dev       pointer to network device structure
   3864 * encoding  serial encoding setting
   3865 * parity    FCS setting
   3866 *
   3867 * returns 0 if success, otherwise error code
   3868 */
   3869static int hdlcdev_attach(struct net_device *dev, unsigned short encoding,
   3870			  unsigned short parity)
   3871{
   3872	MGSLPC_INFO *info = dev_to_port(dev);
   3873	struct tty_struct *tty;
   3874	unsigned char  new_encoding;
   3875	unsigned short new_crctype;
   3876
   3877	/* return error if TTY interface open */
   3878	if (info->port.count)
   3879		return -EBUSY;
   3880
   3881	switch (encoding)
   3882	{
   3883	case ENCODING_NRZ:        new_encoding = HDLC_ENCODING_NRZ; break;
   3884	case ENCODING_NRZI:       new_encoding = HDLC_ENCODING_NRZI_SPACE; break;
   3885	case ENCODING_FM_MARK:    new_encoding = HDLC_ENCODING_BIPHASE_MARK; break;
   3886	case ENCODING_FM_SPACE:   new_encoding = HDLC_ENCODING_BIPHASE_SPACE; break;
   3887	case ENCODING_MANCHESTER: new_encoding = HDLC_ENCODING_BIPHASE_LEVEL; break;
   3888	default: return -EINVAL;
   3889	}
   3890
   3891	switch (parity)
   3892	{
   3893	case PARITY_NONE:            new_crctype = HDLC_CRC_NONE; break;
   3894	case PARITY_CRC16_PR1_CCITT: new_crctype = HDLC_CRC_16_CCITT; break;
   3895	case PARITY_CRC32_PR1_CCITT: new_crctype = HDLC_CRC_32_CCITT; break;
   3896	default: return -EINVAL;
   3897	}
   3898
   3899	info->params.encoding = new_encoding;
   3900	info->params.crc_type = new_crctype;
   3901
   3902	/* if network interface up, reprogram hardware */
   3903	if (info->netcount) {
   3904		tty = tty_port_tty_get(&info->port);
   3905		mgslpc_program_hw(info, tty);
   3906		tty_kref_put(tty);
   3907	}
   3908
   3909	return 0;
   3910}
   3911
   3912/**
   3913 * called by generic HDLC layer to send frame
   3914 *
   3915 * skb  socket buffer containing HDLC frame
   3916 * dev  pointer to network device structure
   3917 */
   3918static netdev_tx_t hdlcdev_xmit(struct sk_buff *skb,
   3919				      struct net_device *dev)
   3920{
   3921	MGSLPC_INFO *info = dev_to_port(dev);
   3922	unsigned long flags;
   3923
   3924	if (debug_level >= DEBUG_LEVEL_INFO)
   3925		printk(KERN_INFO "%s:hdlc_xmit(%s)\n", __FILE__, dev->name);
   3926
   3927	/* stop sending until this frame completes */
   3928	netif_stop_queue(dev);
   3929
   3930	/* copy data to device buffers */
   3931	skb_copy_from_linear_data(skb, info->tx_buf, skb->len);
   3932	info->tx_get = 0;
   3933	info->tx_put = info->tx_count = skb->len;
   3934
   3935	/* update network statistics */
   3936	dev->stats.tx_packets++;
   3937	dev->stats.tx_bytes += skb->len;
   3938
   3939	/* done with socket buffer, so free it */
   3940	dev_kfree_skb(skb);
   3941
   3942	/* save start time for transmit timeout detection */
   3943	netif_trans_update(dev);
   3944
   3945	/* start hardware transmitter if necessary */
   3946	spin_lock_irqsave(&info->lock, flags);
   3947	if (!info->tx_active) {
   3948		struct tty_struct *tty = tty_port_tty_get(&info->port);
   3949		tx_start(info, tty);
   3950		tty_kref_put(tty);
   3951	}
   3952	spin_unlock_irqrestore(&info->lock, flags);
   3953
   3954	return NETDEV_TX_OK;
   3955}
   3956
   3957/**
   3958 * called by network layer when interface enabled
   3959 * claim resources and initialize hardware
   3960 *
   3961 * dev  pointer to network device structure
   3962 *
   3963 * returns 0 if success, otherwise error code
   3964 */
   3965static int hdlcdev_open(struct net_device *dev)
   3966{
   3967	MGSLPC_INFO *info = dev_to_port(dev);
   3968	struct tty_struct *tty;
   3969	int rc;
   3970	unsigned long flags;
   3971
   3972	if (debug_level >= DEBUG_LEVEL_INFO)
   3973		printk("%s:hdlcdev_open(%s)\n", __FILE__, dev->name);
   3974
   3975	/* generic HDLC layer open processing */
   3976	rc = hdlc_open(dev);
   3977	if (rc != 0)
   3978		return rc;
   3979
   3980	/* arbitrate between network and tty opens */
   3981	spin_lock_irqsave(&info->netlock, flags);
   3982	if (info->port.count != 0 || info->netcount != 0) {
   3983		printk(KERN_WARNING "%s: hdlc_open returning busy\n", dev->name);
   3984		spin_unlock_irqrestore(&info->netlock, flags);
   3985		return -EBUSY;
   3986	}
   3987	info->netcount=1;
   3988	spin_unlock_irqrestore(&info->netlock, flags);
   3989
   3990	tty = tty_port_tty_get(&info->port);
   3991	/* claim resources and init adapter */
   3992	rc = startup(info, tty);
   3993	if (rc != 0) {
   3994		tty_kref_put(tty);
   3995		spin_lock_irqsave(&info->netlock, flags);
   3996		info->netcount=0;
   3997		spin_unlock_irqrestore(&info->netlock, flags);
   3998		return rc;
   3999	}
   4000	/* assert RTS and DTR, apply hardware settings */
   4001	info->serial_signals |= SerialSignal_RTS | SerialSignal_DTR;
   4002	mgslpc_program_hw(info, tty);
   4003	tty_kref_put(tty);
   4004
   4005	/* enable network layer transmit */
   4006	netif_trans_update(dev);
   4007	netif_start_queue(dev);
   4008
   4009	/* inform generic HDLC layer of current DCD status */
   4010	spin_lock_irqsave(&info->lock, flags);
   4011	get_signals(info);
   4012	spin_unlock_irqrestore(&info->lock, flags);
   4013	if (info->serial_signals & SerialSignal_DCD)
   4014		netif_carrier_on(dev);
   4015	else
   4016		netif_carrier_off(dev);
   4017	return 0;
   4018}
   4019
   4020/**
   4021 * called by network layer when interface is disabled
   4022 * shutdown hardware and release resources
   4023 *
   4024 * dev  pointer to network device structure
   4025 *
   4026 * returns 0 if success, otherwise error code
   4027 */
   4028static int hdlcdev_close(struct net_device *dev)
   4029{
   4030	MGSLPC_INFO *info = dev_to_port(dev);
   4031	struct tty_struct *tty = tty_port_tty_get(&info->port);
   4032	unsigned long flags;
   4033
   4034	if (debug_level >= DEBUG_LEVEL_INFO)
   4035		printk("%s:hdlcdev_close(%s)\n", __FILE__, dev->name);
   4036
   4037	netif_stop_queue(dev);
   4038
   4039	/* shutdown adapter and release resources */
   4040	shutdown(info, tty);
   4041	tty_kref_put(tty);
   4042	hdlc_close(dev);
   4043
   4044	spin_lock_irqsave(&info->netlock, flags);
   4045	info->netcount=0;
   4046	spin_unlock_irqrestore(&info->netlock, flags);
   4047
   4048	return 0;
   4049}
   4050
   4051/**
   4052 * called by network layer to process IOCTL call to network device
   4053 *
   4054 * dev  pointer to network device structure
   4055 * ifs  pointer to network interface settings structure
   4056 *
   4057 * returns 0 if success, otherwise error code
   4058 */
   4059static int hdlcdev_wan_ioctl(struct net_device *dev, struct if_settings *ifs)
   4060{
   4061	const size_t size = sizeof(sync_serial_settings);
   4062	sync_serial_settings new_line;
   4063	sync_serial_settings __user *line = ifs->ifs_ifsu.sync;
   4064	MGSLPC_INFO *info = dev_to_port(dev);
   4065	unsigned int flags;
   4066
   4067	if (debug_level >= DEBUG_LEVEL_INFO)
   4068		printk("%s:hdlcdev_ioctl(%s)\n", __FILE__, dev->name);
   4069
   4070	/* return error if TTY interface open */
   4071	if (info->port.count)
   4072		return -EBUSY;
   4073
   4074	memset(&new_line, 0, size);
   4075
   4076	switch (ifs->type) {
   4077	case IF_GET_IFACE: /* return current sync_serial_settings */
   4078
   4079		ifs->type = IF_IFACE_SYNC_SERIAL;
   4080		if (ifs->size < size) {
   4081			ifs->size = size; /* data size wanted */
   4082			return -ENOBUFS;
   4083		}
   4084
   4085		flags = info->params.flags & (HDLC_FLAG_RXC_RXCPIN | HDLC_FLAG_RXC_DPLL |
   4086					      HDLC_FLAG_RXC_BRG    | HDLC_FLAG_RXC_TXCPIN |
   4087					      HDLC_FLAG_TXC_TXCPIN | HDLC_FLAG_TXC_DPLL |
   4088					      HDLC_FLAG_TXC_BRG    | HDLC_FLAG_TXC_RXCPIN);
   4089
   4090		switch (flags){
   4091		case (HDLC_FLAG_RXC_RXCPIN | HDLC_FLAG_TXC_TXCPIN): new_line.clock_type = CLOCK_EXT; break;
   4092		case (HDLC_FLAG_RXC_BRG    | HDLC_FLAG_TXC_BRG):    new_line.clock_type = CLOCK_INT; break;
   4093		case (HDLC_FLAG_RXC_RXCPIN | HDLC_FLAG_TXC_BRG):    new_line.clock_type = CLOCK_TXINT; break;
   4094		case (HDLC_FLAG_RXC_RXCPIN | HDLC_FLAG_TXC_RXCPIN): new_line.clock_type = CLOCK_TXFROMRX; break;
   4095		default: new_line.clock_type = CLOCK_DEFAULT;
   4096		}
   4097
   4098		new_line.clock_rate = info->params.clock_speed;
   4099		new_line.loopback   = info->params.loopback ? 1:0;
   4100
   4101		if (copy_to_user(line, &new_line, size))
   4102			return -EFAULT;
   4103		return 0;
   4104
   4105	case IF_IFACE_SYNC_SERIAL: /* set sync_serial_settings */
   4106
   4107		if(!capable(CAP_NET_ADMIN))
   4108			return -EPERM;
   4109		if (copy_from_user(&new_line, line, size))
   4110			return -EFAULT;
   4111
   4112		switch (new_line.clock_type)
   4113		{
   4114		case CLOCK_EXT:      flags = HDLC_FLAG_RXC_RXCPIN | HDLC_FLAG_TXC_TXCPIN; break;
   4115		case CLOCK_TXFROMRX: flags = HDLC_FLAG_RXC_RXCPIN | HDLC_FLAG_TXC_RXCPIN; break;
   4116		case CLOCK_INT:      flags = HDLC_FLAG_RXC_BRG    | HDLC_FLAG_TXC_BRG;    break;
   4117		case CLOCK_TXINT:    flags = HDLC_FLAG_RXC_RXCPIN | HDLC_FLAG_TXC_BRG;    break;
   4118		case CLOCK_DEFAULT:  flags = info->params.flags &
   4119					     (HDLC_FLAG_RXC_RXCPIN | HDLC_FLAG_RXC_DPLL |
   4120					      HDLC_FLAG_RXC_BRG    | HDLC_FLAG_RXC_TXCPIN |
   4121					      HDLC_FLAG_TXC_TXCPIN | HDLC_FLAG_TXC_DPLL |
   4122					      HDLC_FLAG_TXC_BRG    | HDLC_FLAG_TXC_RXCPIN); break;
   4123		default: return -EINVAL;
   4124		}
   4125
   4126		if (new_line.loopback != 0 && new_line.loopback != 1)
   4127			return -EINVAL;
   4128
   4129		info->params.flags &= ~(HDLC_FLAG_RXC_RXCPIN | HDLC_FLAG_RXC_DPLL |
   4130					HDLC_FLAG_RXC_BRG    | HDLC_FLAG_RXC_TXCPIN |
   4131					HDLC_FLAG_TXC_TXCPIN | HDLC_FLAG_TXC_DPLL |
   4132					HDLC_FLAG_TXC_BRG    | HDLC_FLAG_TXC_RXCPIN);
   4133		info->params.flags |= flags;
   4134
   4135		info->params.loopback = new_line.loopback;
   4136
   4137		if (flags & (HDLC_FLAG_RXC_BRG | HDLC_FLAG_TXC_BRG))
   4138			info->params.clock_speed = new_line.clock_rate;
   4139		else
   4140			info->params.clock_speed = 0;
   4141
   4142		/* if network interface up, reprogram hardware */
   4143		if (info->netcount) {
   4144			struct tty_struct *tty = tty_port_tty_get(&info->port);
   4145			mgslpc_program_hw(info, tty);
   4146			tty_kref_put(tty);
   4147		}
   4148		return 0;
   4149	default:
   4150		return hdlc_ioctl(dev, ifs);
   4151	}
   4152}
   4153
   4154/**
   4155 * called by network layer when transmit timeout is detected
   4156 *
   4157 * dev  pointer to network device structure
   4158 */
   4159static void hdlcdev_tx_timeout(struct net_device *dev, unsigned int txqueue)
   4160{
   4161	MGSLPC_INFO *info = dev_to_port(dev);
   4162	unsigned long flags;
   4163
   4164	if (debug_level >= DEBUG_LEVEL_INFO)
   4165		printk("hdlcdev_tx_timeout(%s)\n", dev->name);
   4166
   4167	dev->stats.tx_errors++;
   4168	dev->stats.tx_aborted_errors++;
   4169
   4170	spin_lock_irqsave(&info->lock, flags);
   4171	tx_stop(info);
   4172	spin_unlock_irqrestore(&info->lock, flags);
   4173
   4174	netif_wake_queue(dev);
   4175}
   4176
   4177/**
   4178 * called by device driver when transmit completes
   4179 * reenable network layer transmit if stopped
   4180 *
   4181 * info  pointer to device instance information
   4182 */
   4183static void hdlcdev_tx_done(MGSLPC_INFO *info)
   4184{
   4185	if (netif_queue_stopped(info->netdev))
   4186		netif_wake_queue(info->netdev);
   4187}
   4188
   4189/**
   4190 * called by device driver when frame received
   4191 * pass frame to network layer
   4192 *
   4193 * info  pointer to device instance information
   4194 * buf   pointer to buffer contianing frame data
   4195 * size  count of data bytes in buf
   4196 */
   4197static void hdlcdev_rx(MGSLPC_INFO *info, char *buf, int size)
   4198{
   4199	struct sk_buff *skb = dev_alloc_skb(size);
   4200	struct net_device *dev = info->netdev;
   4201
   4202	if (debug_level >= DEBUG_LEVEL_INFO)
   4203		printk("hdlcdev_rx(%s)\n", dev->name);
   4204
   4205	if (skb == NULL) {
   4206		printk(KERN_NOTICE "%s: can't alloc skb, dropping packet\n", dev->name);
   4207		dev->stats.rx_dropped++;
   4208		return;
   4209	}
   4210
   4211	skb_put_data(skb, buf, size);
   4212
   4213	skb->protocol = hdlc_type_trans(skb, dev);
   4214
   4215	dev->stats.rx_packets++;
   4216	dev->stats.rx_bytes += size;
   4217
   4218	netif_rx(skb);
   4219}
   4220
   4221static const struct net_device_ops hdlcdev_ops = {
   4222	.ndo_open       = hdlcdev_open,
   4223	.ndo_stop       = hdlcdev_close,
   4224	.ndo_start_xmit = hdlc_start_xmit,
   4225	.ndo_siocwandev = hdlcdev_wan_ioctl,
   4226	.ndo_tx_timeout = hdlcdev_tx_timeout,
   4227};
   4228
   4229/**
   4230 * called by device driver when adding device instance
   4231 * do generic HDLC initialization
   4232 *
   4233 * info  pointer to device instance information
   4234 *
   4235 * returns 0 if success, otherwise error code
   4236 */
   4237static int hdlcdev_init(MGSLPC_INFO *info)
   4238{
   4239	int rc;
   4240	struct net_device *dev;
   4241	hdlc_device *hdlc;
   4242
   4243	/* allocate and initialize network and HDLC layer objects */
   4244
   4245	dev = alloc_hdlcdev(info);
   4246	if (dev == NULL) {
   4247		printk(KERN_ERR "%s:hdlc device allocation failure\n", __FILE__);
   4248		return -ENOMEM;
   4249	}
   4250
   4251	/* for network layer reporting purposes only */
   4252	dev->base_addr = info->io_base;
   4253	dev->irq       = info->irq_level;
   4254
   4255	/* network layer callbacks and settings */
   4256	dev->netdev_ops	    = &hdlcdev_ops;
   4257	dev->watchdog_timeo = 10 * HZ;
   4258	dev->tx_queue_len   = 50;
   4259
   4260	/* generic HDLC layer callbacks and settings */
   4261	hdlc         = dev_to_hdlc(dev);
   4262	hdlc->attach = hdlcdev_attach;
   4263	hdlc->xmit   = hdlcdev_xmit;
   4264
   4265	/* register objects with HDLC layer */
   4266	rc = register_hdlc_device(dev);
   4267	if (rc) {
   4268		printk(KERN_WARNING "%s:unable to register hdlc device\n", __FILE__);
   4269		free_netdev(dev);
   4270		return rc;
   4271	}
   4272
   4273	info->netdev = dev;
   4274	return 0;
   4275}
   4276
   4277/**
   4278 * called by device driver when removing device instance
   4279 * do generic HDLC cleanup
   4280 *
   4281 * info  pointer to device instance information
   4282 */
   4283static void hdlcdev_exit(MGSLPC_INFO *info)
   4284{
   4285	unregister_hdlc_device(info->netdev);
   4286	free_netdev(info->netdev);
   4287	info->netdev = NULL;
   4288}
   4289
   4290#endif /* CONFIG_HDLC */
   4291