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

mxser.c (49839B)


      1// SPDX-License-Identifier: GPL-2.0+
      2/*
      3 *          mxser.c  -- MOXA Smartio/Industio family multiport serial driver.
      4 *
      5 *      Copyright (C) 1999-2006  Moxa Technologies (support@moxa.com).
      6 *	Copyright (C) 2006-2008  Jiri Slaby <jirislaby@gmail.com>
      7 *
      8 *      This code is loosely based on the 1.8 moxa driver which is based on
      9 *	Linux serial driver, written by Linus Torvalds, Theodore T'so and
     10 *	others.
     11 *
     12 *	Fed through a cleanup, indent and remove of non 2.6 code by Alan Cox
     13 *	<alan@lxorguk.ukuu.org.uk>. The original 1.8 code is available on
     14 *	www.moxa.com.
     15 *	- Fixed x86_64 cleanness
     16 */
     17
     18#include <linux/module.h>
     19#include <linux/errno.h>
     20#include <linux/signal.h>
     21#include <linux/sched.h>
     22#include <linux/timer.h>
     23#include <linux/interrupt.h>
     24#include <linux/tty.h>
     25#include <linux/tty_flip.h>
     26#include <linux/serial.h>
     27#include <linux/serial_reg.h>
     28#include <linux/major.h>
     29#include <linux/string.h>
     30#include <linux/fcntl.h>
     31#include <linux/ptrace.h>
     32#include <linux/ioport.h>
     33#include <linux/mm.h>
     34#include <linux/delay.h>
     35#include <linux/pci.h>
     36#include <linux/bitops.h>
     37#include <linux/slab.h>
     38#include <linux/ratelimit.h>
     39
     40#include <asm/io.h>
     41#include <asm/irq.h>
     42#include <linux/uaccess.h>
     43
     44/*
     45 *	Semi-public control interfaces
     46 */
     47
     48/*
     49 *	MOXA ioctls
     50 */
     51
     52#define MOXA			0x400
     53#define MOXA_SET_OP_MODE	(MOXA + 66)
     54#define MOXA_GET_OP_MODE	(MOXA + 67)
     55
     56#define RS232_MODE		0
     57#define RS485_2WIRE_MODE	1
     58#define RS422_MODE		2
     59#define RS485_4WIRE_MODE	3
     60#define OP_MODE_MASK		3
     61
     62/* --------------------------------------------------- */
     63
     64/*
     65 * Follow just what Moxa Must chip defines.
     66 *
     67 * When LCR register (offset 0x03) is written the following value, the Must chip
     68 * will enter enhanced mode. And a write to EFR (offset 0x02) bit 6,7 will
     69 * change bank.
     70 */
     71#define MOXA_MUST_ENTER_ENHANCED	0xBF
     72
     73/* when enhanced mode is enabled, access to general bank register */
     74#define MOXA_MUST_GDL_REGISTER		0x07
     75#define MOXA_MUST_GDL_MASK		0x7F
     76#define MOXA_MUST_GDL_HAS_BAD_DATA	0x80
     77
     78#define MOXA_MUST_LSR_RERR		0x80	/* error in receive FIFO */
     79/* enhanced register bank select and enhanced mode setting register */
     80/* This works only when LCR register equals to 0xBF */
     81#define MOXA_MUST_EFR_REGISTER		0x02
     82#define MOXA_MUST_EFR_EFRB_ENABLE	0x10 /* enhanced mode enable */
     83/* enhanced register bank set 0, 1, 2 */
     84#define MOXA_MUST_EFR_BANK0		0x00
     85#define MOXA_MUST_EFR_BANK1		0x40
     86#define MOXA_MUST_EFR_BANK2		0x80
     87#define MOXA_MUST_EFR_BANK3		0xC0
     88#define MOXA_MUST_EFR_BANK_MASK		0xC0
     89
     90/* set XON1 value register, when LCR=0xBF and change to bank0 */
     91#define MOXA_MUST_XON1_REGISTER		0x04
     92
     93/* set XON2 value register, when LCR=0xBF and change to bank0 */
     94#define MOXA_MUST_XON2_REGISTER		0x05
     95
     96/* set XOFF1 value register, when LCR=0xBF and change to bank0 */
     97#define MOXA_MUST_XOFF1_REGISTER	0x06
     98
     99/* set XOFF2 value register, when LCR=0xBF and change to bank0 */
    100#define MOXA_MUST_XOFF2_REGISTER	0x07
    101
    102#define MOXA_MUST_RBRTL_REGISTER	0x04
    103#define MOXA_MUST_RBRTH_REGISTER	0x05
    104#define MOXA_MUST_RBRTI_REGISTER	0x06
    105#define MOXA_MUST_THRTL_REGISTER	0x07
    106#define MOXA_MUST_ENUM_REGISTER		0x04
    107#define MOXA_MUST_HWID_REGISTER		0x05
    108#define MOXA_MUST_ECR_REGISTER		0x06
    109#define MOXA_MUST_CSR_REGISTER		0x07
    110
    111#define MOXA_MUST_FCR_GDA_MODE_ENABLE	0x20 /* good data mode enable */
    112#define MOXA_MUST_FCR_GDA_ONLY_ENABLE	0x10 /* only good data put into RxFIFO */
    113
    114#define MOXA_MUST_IER_ECTSI		0x80 /* enable CTS interrupt */
    115#define MOXA_MUST_IER_ERTSI		0x40 /* enable RTS interrupt */
    116#define MOXA_MUST_IER_XINT		0x20 /* enable Xon/Xoff interrupt */
    117#define MOXA_MUST_IER_EGDAI		0x10 /* enable GDA interrupt */
    118
    119#define MOXA_MUST_RECV_ISR		(UART_IER_RDI | MOXA_MUST_IER_EGDAI)
    120
    121/* GDA interrupt pending */
    122#define MOXA_MUST_IIR_GDA		0x1C
    123#define MOXA_MUST_IIR_RDA		0x04
    124#define MOXA_MUST_IIR_RTO		0x0C
    125#define MOXA_MUST_IIR_LSR		0x06
    126
    127/* received Xon/Xoff or specical interrupt pending */
    128#define MOXA_MUST_IIR_XSC		0x10
    129
    130/* RTS/CTS change state interrupt pending */
    131#define MOXA_MUST_IIR_RTSCTS		0x20
    132#define MOXA_MUST_IIR_MASK		0x3E
    133
    134#define MOXA_MUST_MCR_XON_FLAG		0x40
    135#define MOXA_MUST_MCR_XON_ANY		0x80
    136#define MOXA_MUST_MCR_TX_XON		0x08
    137
    138#define MOXA_MUST_EFR_SF_MASK		0x0F /* software flow control on chip mask value */
    139#define MOXA_MUST_EFR_SF_TX1		0x08 /* send Xon1/Xoff1 */
    140#define MOXA_MUST_EFR_SF_TX2		0x04 /* send Xon2/Xoff2 */
    141#define MOXA_MUST_EFR_SF_TX12		0x0C /* send Xon1,Xon2/Xoff1,Xoff2 */
    142#define MOXA_MUST_EFR_SF_TX_NO		0x00 /* don't send Xon/Xoff */
    143#define MOXA_MUST_EFR_SF_TX_MASK	0x0C /* Tx software flow control mask */
    144#define MOXA_MUST_EFR_SF_RX_NO		0x00 /* don't receive Xon/Xoff */
    145#define MOXA_MUST_EFR_SF_RX1		0x02 /* receive Xon1/Xoff1 */
    146#define MOXA_MUST_EFR_SF_RX2		0x01 /* receive Xon2/Xoff2 */
    147#define MOXA_MUST_EFR_SF_RX12		0x03 /* receive Xon1,Xon2/Xoff1,Xoff2 */
    148#define MOXA_MUST_EFR_SF_RX_MASK	0x03 /* Rx software flow control mask */
    149
    150#define	MXSERMAJOR	 174
    151
    152#define MXSER_BOARDS		4	/* Max. boards */
    153#define MXSER_PORTS_PER_BOARD	8	/* Max. ports per board */
    154#define MXSER_PORTS		(MXSER_BOARDS * MXSER_PORTS_PER_BOARD)
    155#define MXSER_ISR_PASS_LIMIT	100
    156
    157#define WAKEUP_CHARS		256
    158
    159#define MXSER_BAUD_BASE		921600
    160#define MXSER_CUSTOM_DIVISOR	(MXSER_BAUD_BASE * 16)
    161
    162#define PCI_DEVICE_ID_MOXA_RC7000	0x0001
    163#define PCI_DEVICE_ID_MOXA_CP102	0x1020
    164#define PCI_DEVICE_ID_MOXA_CP102UL	0x1021
    165#define PCI_DEVICE_ID_MOXA_CP102U	0x1022
    166#define PCI_DEVICE_ID_MOXA_CP102UF	0x1023
    167#define PCI_DEVICE_ID_MOXA_C104		0x1040
    168#define PCI_DEVICE_ID_MOXA_CP104U	0x1041
    169#define PCI_DEVICE_ID_MOXA_CP104JU	0x1042
    170#define PCI_DEVICE_ID_MOXA_CP104EL	0x1043
    171#define PCI_DEVICE_ID_MOXA_POS104UL	0x1044
    172#define PCI_DEVICE_ID_MOXA_CB108	0x1080
    173#define PCI_DEVICE_ID_MOXA_CP112UL	0x1120
    174#define PCI_DEVICE_ID_MOXA_CT114	0x1140
    175#define PCI_DEVICE_ID_MOXA_CP114	0x1141
    176#define PCI_DEVICE_ID_MOXA_CB114	0x1142
    177#define PCI_DEVICE_ID_MOXA_CP114UL	0x1143
    178#define PCI_DEVICE_ID_MOXA_CP118U	0x1180
    179#define PCI_DEVICE_ID_MOXA_CP118EL	0x1181
    180#define PCI_DEVICE_ID_MOXA_CP132	0x1320
    181#define PCI_DEVICE_ID_MOXA_CP132U	0x1321
    182#define PCI_DEVICE_ID_MOXA_CP134U	0x1340
    183#define PCI_DEVICE_ID_MOXA_CB134I	0x1341
    184#define PCI_DEVICE_ID_MOXA_CP138U	0x1380
    185#define PCI_DEVICE_ID_MOXA_C168		0x1680
    186#define PCI_DEVICE_ID_MOXA_CP168U	0x1681
    187#define PCI_DEVICE_ID_MOXA_CP168EL	0x1682
    188
    189#define MXSER_NPORTS(ddata)		((ddata) & 0xffU)
    190#define MXSER_HIGHBAUD			0x0100
    191
    192enum mxser_must_hwid {
    193	MOXA_OTHER_UART		= 0x00,
    194	MOXA_MUST_MU150_HWID	= 0x01,
    195	MOXA_MUST_MU860_HWID	= 0x02,
    196};
    197
    198static const struct {
    199	u8 type;
    200	u8 fifo_size;
    201	u8 rx_high_water;
    202	u8 rx_low_water;
    203	speed_t max_baud;
    204} Gpci_uart_info[] = {
    205	{ MOXA_OTHER_UART,	 16, 14,  1, 921600 },
    206	{ MOXA_MUST_MU150_HWID,	 64, 48, 16, 230400 },
    207	{ MOXA_MUST_MU860_HWID, 128, 96, 32, 921600 }
    208};
    209#define UART_INFO_NUM	ARRAY_SIZE(Gpci_uart_info)
    210
    211
    212/* driver_data correspond to the lines in the structure above
    213   see also ISA probe function before you change something */
    214static const struct pci_device_id mxser_pcibrds[] = {
    215	{ PCI_DEVICE_DATA(MOXA, C168,		8) },
    216	{ PCI_DEVICE_DATA(MOXA, C104,		4) },
    217	{ PCI_DEVICE_DATA(MOXA, CP132,		2) },
    218	{ PCI_DEVICE_DATA(MOXA, CP114,		4) },
    219	{ PCI_DEVICE_DATA(MOXA, CT114,		4) },
    220	{ PCI_DEVICE_DATA(MOXA, CP102,		2 | MXSER_HIGHBAUD) },
    221	{ PCI_DEVICE_DATA(MOXA, CP104U,		4) },
    222	{ PCI_DEVICE_DATA(MOXA, CP168U,		8) },
    223	{ PCI_DEVICE_DATA(MOXA, CP132U,		2) },
    224	{ PCI_DEVICE_DATA(MOXA, CP134U,		4) },
    225	{ PCI_DEVICE_DATA(MOXA, CP104JU,	4) },
    226	{ PCI_DEVICE_DATA(MOXA, RC7000,		8) }, /* RC7000 */
    227	{ PCI_DEVICE_DATA(MOXA, CP118U,		8) },
    228	{ PCI_DEVICE_DATA(MOXA, CP102UL,	2) },
    229	{ PCI_DEVICE_DATA(MOXA, CP102U,		2) },
    230	{ PCI_DEVICE_DATA(MOXA, CP118EL,	8) },
    231	{ PCI_DEVICE_DATA(MOXA, CP168EL,	8) },
    232	{ PCI_DEVICE_DATA(MOXA, CP104EL,	4) },
    233	{ PCI_DEVICE_DATA(MOXA, CB108,		8) },
    234	{ PCI_DEVICE_DATA(MOXA, CB114,		4) },
    235	{ PCI_DEVICE_DATA(MOXA, CB134I,		4) },
    236	{ PCI_DEVICE_DATA(MOXA, CP138U,		8) },
    237	{ PCI_DEVICE_DATA(MOXA, POS104UL,	4) },
    238	{ PCI_DEVICE_DATA(MOXA, CP114UL,	4) },
    239	{ PCI_DEVICE_DATA(MOXA, CP102UF,	2) },
    240	{ PCI_DEVICE_DATA(MOXA, CP112UL,	2) },
    241	{ }
    242};
    243MODULE_DEVICE_TABLE(pci, mxser_pcibrds);
    244
    245static int ttymajor = MXSERMAJOR;
    246
    247/* Variables for insmod */
    248
    249MODULE_AUTHOR("Casper Yang");
    250MODULE_DESCRIPTION("MOXA Smartio/Industio Family Multiport Board Device Driver");
    251module_param(ttymajor, int, 0);
    252MODULE_LICENSE("GPL");
    253
    254struct mxser_board;
    255
    256struct mxser_port {
    257	struct tty_port port;
    258	struct mxser_board *board;
    259
    260	unsigned long ioaddr;
    261	unsigned long opmode_ioaddr;
    262
    263	u8 rx_high_water;
    264	u8 rx_low_water;
    265	int type;		/* UART type */
    266
    267	unsigned char x_char;	/* xon/xoff character */
    268	u8 IER;			/* Interrupt Enable Register */
    269	u8 MCR;			/* Modem control register */
    270	u8 FCR;			/* FIFO control register */
    271
    272	struct async_icount icount; /* kernel counters for 4 input interrupts */
    273	unsigned int timeout;
    274
    275	u8 read_status_mask;
    276	u8 ignore_status_mask;
    277	u8 xmit_fifo_size;
    278
    279	spinlock_t slock;
    280};
    281
    282struct mxser_board {
    283	unsigned int idx;
    284	unsigned short nports;
    285	int irq;
    286	unsigned long vector;
    287
    288	enum mxser_must_hwid must_hwid;
    289	speed_t max_baud;
    290
    291	struct mxser_port ports[];
    292};
    293
    294static DECLARE_BITMAP(mxser_boards, MXSER_BOARDS);
    295static struct tty_driver *mxvar_sdriver;
    296
    297static u8 __mxser_must_set_EFR(unsigned long baseio, u8 clear, u8 set,
    298		bool restore_LCR)
    299{
    300	u8 oldlcr, efr;
    301
    302	oldlcr = inb(baseio + UART_LCR);
    303	outb(MOXA_MUST_ENTER_ENHANCED, baseio + UART_LCR);
    304
    305	efr = inb(baseio + MOXA_MUST_EFR_REGISTER);
    306	efr &= ~clear;
    307	efr |= set;
    308
    309	outb(efr, baseio + MOXA_MUST_EFR_REGISTER);
    310
    311	if (restore_LCR)
    312		outb(oldlcr, baseio + UART_LCR);
    313
    314	return oldlcr;
    315}
    316
    317static u8 mxser_must_select_bank(unsigned long baseio, u8 bank)
    318{
    319	return __mxser_must_set_EFR(baseio, MOXA_MUST_EFR_BANK_MASK, bank,
    320			false);
    321}
    322
    323static void mxser_set_must_xon1_value(unsigned long baseio, u8 value)
    324{
    325	u8 oldlcr = mxser_must_select_bank(baseio, MOXA_MUST_EFR_BANK0);
    326	outb(value, baseio + MOXA_MUST_XON1_REGISTER);
    327	outb(oldlcr, baseio + UART_LCR);
    328}
    329
    330static void mxser_set_must_xoff1_value(unsigned long baseio, u8 value)
    331{
    332	u8 oldlcr = mxser_must_select_bank(baseio, MOXA_MUST_EFR_BANK0);
    333	outb(value, baseio + MOXA_MUST_XOFF1_REGISTER);
    334	outb(oldlcr, baseio + UART_LCR);
    335}
    336
    337static void mxser_set_must_fifo_value(struct mxser_port *info)
    338{
    339	u8 oldlcr = mxser_must_select_bank(info->ioaddr, MOXA_MUST_EFR_BANK1);
    340	outb(info->rx_high_water, info->ioaddr + MOXA_MUST_RBRTH_REGISTER);
    341	outb(info->rx_high_water, info->ioaddr + MOXA_MUST_RBRTI_REGISTER);
    342	outb(info->rx_low_water, info->ioaddr + MOXA_MUST_RBRTL_REGISTER);
    343	outb(oldlcr, info->ioaddr + UART_LCR);
    344}
    345
    346static void mxser_set_must_enum_value(unsigned long baseio, u8 value)
    347{
    348	u8 oldlcr = mxser_must_select_bank(baseio, MOXA_MUST_EFR_BANK2);
    349	outb(value, baseio + MOXA_MUST_ENUM_REGISTER);
    350	outb(oldlcr, baseio + UART_LCR);
    351}
    352
    353static u8 mxser_get_must_hardware_id(unsigned long baseio)
    354{
    355	u8 oldlcr = mxser_must_select_bank(baseio, MOXA_MUST_EFR_BANK2);
    356	u8 id = inb(baseio + MOXA_MUST_HWID_REGISTER);
    357	outb(oldlcr, baseio + UART_LCR);
    358
    359	return id;
    360}
    361
    362static void mxser_must_set_EFR(unsigned long baseio, u8 clear, u8 set)
    363{
    364	__mxser_must_set_EFR(baseio, clear, set, true);
    365}
    366
    367static void mxser_must_set_enhance_mode(unsigned long baseio, bool enable)
    368{
    369	mxser_must_set_EFR(baseio,
    370			enable ? 0 : MOXA_MUST_EFR_EFRB_ENABLE,
    371			enable ? MOXA_MUST_EFR_EFRB_ENABLE : 0);
    372}
    373
    374static void mxser_must_no_sw_flow_control(unsigned long baseio)
    375{
    376	mxser_must_set_EFR(baseio, MOXA_MUST_EFR_SF_MASK, 0);
    377}
    378
    379static void mxser_must_set_tx_sw_flow_control(unsigned long baseio, bool enable)
    380{
    381	mxser_must_set_EFR(baseio, MOXA_MUST_EFR_SF_TX_MASK,
    382			enable ? MOXA_MUST_EFR_SF_TX1 : 0);
    383}
    384
    385static void mxser_must_set_rx_sw_flow_control(unsigned long baseio, bool enable)
    386{
    387	mxser_must_set_EFR(baseio, MOXA_MUST_EFR_SF_RX_MASK,
    388			enable ? MOXA_MUST_EFR_SF_RX1 : 0);
    389}
    390
    391static enum mxser_must_hwid mxser_must_get_hwid(unsigned long io)
    392{
    393	u8 oldmcr, hwid;
    394	int i;
    395
    396	outb(0, io + UART_LCR);
    397	mxser_must_set_enhance_mode(io, false);
    398	oldmcr = inb(io + UART_MCR);
    399	outb(0, io + UART_MCR);
    400	mxser_set_must_xon1_value(io, 0x11);
    401	if ((hwid = inb(io + UART_MCR)) != 0) {
    402		outb(oldmcr, io + UART_MCR);
    403		return MOXA_OTHER_UART;
    404	}
    405
    406	hwid = mxser_get_must_hardware_id(io);
    407	for (i = 1; i < UART_INFO_NUM; i++) /* 0 = OTHER_UART */
    408		if (hwid == Gpci_uart_info[i].type)
    409			return hwid;
    410
    411	return MOXA_OTHER_UART;
    412}
    413
    414static bool mxser_16550A_or_MUST(struct mxser_port *info)
    415{
    416	return info->type == PORT_16550A || info->board->must_hwid;
    417}
    418
    419static void mxser_process_txrx_fifo(struct mxser_port *info)
    420{
    421	unsigned int i;
    422
    423	if (info->type == PORT_16450 || info->type == PORT_8250) {
    424		info->rx_high_water = 1;
    425		info->rx_low_water = 1;
    426		info->xmit_fifo_size = 1;
    427		return;
    428	}
    429
    430	for (i = 0; i < UART_INFO_NUM; i++)
    431		if (info->board->must_hwid == Gpci_uart_info[i].type) {
    432			info->rx_low_water = Gpci_uart_info[i].rx_low_water;
    433			info->rx_high_water = Gpci_uart_info[i].rx_high_water;
    434			info->xmit_fifo_size = Gpci_uart_info[i].fifo_size;
    435			break;
    436		}
    437}
    438
    439static void __mxser_start_tx(struct mxser_port *info)
    440{
    441	outb(info->IER & ~UART_IER_THRI, info->ioaddr + UART_IER);
    442	info->IER |= UART_IER_THRI;
    443	outb(info->IER, info->ioaddr + UART_IER);
    444}
    445
    446static void mxser_start_tx(struct mxser_port *info)
    447{
    448	unsigned long flags;
    449
    450	spin_lock_irqsave(&info->slock, flags);
    451	__mxser_start_tx(info);
    452	spin_unlock_irqrestore(&info->slock, flags);
    453}
    454
    455static void __mxser_stop_tx(struct mxser_port *info)
    456{
    457	info->IER &= ~UART_IER_THRI;
    458	outb(info->IER, info->ioaddr + UART_IER);
    459}
    460
    461static int mxser_carrier_raised(struct tty_port *port)
    462{
    463	struct mxser_port *mp = container_of(port, struct mxser_port, port);
    464	return (inb(mp->ioaddr + UART_MSR) & UART_MSR_DCD)?1:0;
    465}
    466
    467static void mxser_dtr_rts(struct tty_port *port, int on)
    468{
    469	struct mxser_port *mp = container_of(port, struct mxser_port, port);
    470	unsigned long flags;
    471	u8 mcr;
    472
    473	spin_lock_irqsave(&mp->slock, flags);
    474	mcr = inb(mp->ioaddr + UART_MCR);
    475	if (on)
    476		mcr |= UART_MCR_DTR | UART_MCR_RTS;
    477	else
    478		mcr &= ~(UART_MCR_DTR | UART_MCR_RTS);
    479	outb(mcr, mp->ioaddr + UART_MCR);
    480	spin_unlock_irqrestore(&mp->slock, flags);
    481}
    482
    483static int mxser_set_baud(struct tty_struct *tty, speed_t newspd)
    484{
    485	struct mxser_port *info = tty->driver_data;
    486	unsigned int quot = 0, baud;
    487	unsigned char cval;
    488	u64 timeout;
    489
    490	if (newspd > info->board->max_baud)
    491		return -1;
    492
    493	if (newspd == 134) {
    494		quot = 2 * MXSER_BAUD_BASE / 269;
    495		tty_encode_baud_rate(tty, 134, 134);
    496	} else if (newspd) {
    497		quot = MXSER_BAUD_BASE / newspd;
    498		if (quot == 0)
    499			quot = 1;
    500		baud = MXSER_BAUD_BASE / quot;
    501		tty_encode_baud_rate(tty, baud, baud);
    502	} else {
    503		quot = 0;
    504	}
    505
    506	/*
    507	 * worst case (128 * 1000 * 10 * 18432) needs 35 bits, so divide in the
    508	 * u64 domain
    509	 */
    510	timeout = (u64)info->xmit_fifo_size * HZ * 10 * quot;
    511	do_div(timeout, MXSER_BAUD_BASE);
    512	info->timeout = timeout + HZ / 50; /* Add .02 seconds of slop */
    513
    514	if (quot) {
    515		info->MCR |= UART_MCR_DTR;
    516		outb(info->MCR, info->ioaddr + UART_MCR);
    517	} else {
    518		info->MCR &= ~UART_MCR_DTR;
    519		outb(info->MCR, info->ioaddr + UART_MCR);
    520		return 0;
    521	}
    522
    523	cval = inb(info->ioaddr + UART_LCR);
    524
    525	outb(cval | UART_LCR_DLAB, info->ioaddr + UART_LCR);	/* set DLAB */
    526
    527	outb(quot & 0xff, info->ioaddr + UART_DLL);	/* LS of divisor */
    528	outb(quot >> 8, info->ioaddr + UART_DLM);	/* MS of divisor */
    529	outb(cval, info->ioaddr + UART_LCR);	/* reset DLAB */
    530
    531	if (C_BAUD(tty) == BOTHER) {
    532		quot = MXSER_BAUD_BASE % newspd;
    533		quot *= 8;
    534		if (quot % newspd > newspd / 2) {
    535			quot /= newspd;
    536			quot++;
    537		} else
    538			quot /= newspd;
    539
    540		mxser_set_must_enum_value(info->ioaddr, quot);
    541	} else {
    542		mxser_set_must_enum_value(info->ioaddr, 0);
    543	}
    544
    545	return 0;
    546}
    547
    548static void mxser_handle_cts(struct tty_struct *tty, struct mxser_port *info,
    549		u8 msr)
    550{
    551	bool cts = msr & UART_MSR_CTS;
    552
    553	if (tty->hw_stopped) {
    554		if (cts) {
    555			tty->hw_stopped = 0;
    556
    557			if (!mxser_16550A_or_MUST(info))
    558				__mxser_start_tx(info);
    559			tty_wakeup(tty);
    560		}
    561		return;
    562	} else if (cts)
    563		return;
    564
    565	tty->hw_stopped = 1;
    566	if (!mxser_16550A_or_MUST(info))
    567		__mxser_stop_tx(info);
    568}
    569
    570/*
    571 * This routine is called to set the UART divisor registers to match
    572 * the specified baud rate for a serial port.
    573 */
    574static void mxser_change_speed(struct tty_struct *tty, struct ktermios *old_termios)
    575{
    576	struct mxser_port *info = tty->driver_data;
    577	unsigned cflag, cval;
    578
    579	cflag = tty->termios.c_cflag;
    580
    581	if (mxser_set_baud(tty, tty_get_baud_rate(tty))) {
    582		/* Use previous rate on a failure */
    583		if (old_termios) {
    584			speed_t baud = tty_termios_baud_rate(old_termios);
    585			tty_encode_baud_rate(tty, baud, baud);
    586		}
    587	}
    588
    589	/* byte size and parity */
    590	cval = UART_LCR_WLEN(tty_get_char_size(tty->termios.c_cflag));
    591
    592	if (cflag & CSTOPB)
    593		cval |= UART_LCR_STOP;
    594	if (cflag & PARENB)
    595		cval |= UART_LCR_PARITY;
    596	if (!(cflag & PARODD))
    597		cval |= UART_LCR_EPAR;
    598	if (cflag & CMSPAR)
    599		cval |= UART_LCR_SPAR;
    600
    601	info->FCR = 0;
    602	if (info->board->must_hwid) {
    603		info->FCR |= UART_FCR_ENABLE_FIFO |
    604			MOXA_MUST_FCR_GDA_MODE_ENABLE;
    605		mxser_set_must_fifo_value(info);
    606	} else if (info->type != PORT_8250 && info->type != PORT_16450) {
    607		info->FCR |= UART_FCR_ENABLE_FIFO;
    608		switch (info->rx_high_water) {
    609		case 1:
    610			info->FCR |= UART_FCR_TRIGGER_1;
    611			break;
    612		case 4:
    613			info->FCR |= UART_FCR_TRIGGER_4;
    614			break;
    615		case 8:
    616			info->FCR |= UART_FCR_TRIGGER_8;
    617			break;
    618		default:
    619			info->FCR |= UART_FCR_TRIGGER_14;
    620			break;
    621		}
    622	}
    623
    624	/* CTS flow control flag and modem status interrupts */
    625	info->IER &= ~UART_IER_MSI;
    626	info->MCR &= ~UART_MCR_AFE;
    627	tty_port_set_cts_flow(&info->port, cflag & CRTSCTS);
    628	if (cflag & CRTSCTS) {
    629		info->IER |= UART_IER_MSI;
    630		if (mxser_16550A_or_MUST(info)) {
    631			info->MCR |= UART_MCR_AFE;
    632		} else {
    633			mxser_handle_cts(tty, info,
    634					inb(info->ioaddr + UART_MSR));
    635		}
    636	}
    637	outb(info->MCR, info->ioaddr + UART_MCR);
    638	tty_port_set_check_carrier(&info->port, ~cflag & CLOCAL);
    639	if (~cflag & CLOCAL)
    640		info->IER |= UART_IER_MSI;
    641	outb(info->IER, info->ioaddr + UART_IER);
    642
    643	/*
    644	 * Set up parity check flag
    645	 */
    646	info->read_status_mask = UART_LSR_OE | UART_LSR_THRE | UART_LSR_DR;
    647	if (I_INPCK(tty))
    648		info->read_status_mask |= UART_LSR_FE | UART_LSR_PE;
    649	if (I_BRKINT(tty) || I_PARMRK(tty))
    650		info->read_status_mask |= UART_LSR_BI;
    651
    652	info->ignore_status_mask = 0;
    653
    654	if (I_IGNBRK(tty)) {
    655		info->ignore_status_mask |= UART_LSR_BI;
    656		info->read_status_mask |= UART_LSR_BI;
    657		/*
    658		 * If we're ignore parity and break indicators, ignore
    659		 * overruns too.  (For real raw support).
    660		 */
    661		if (I_IGNPAR(tty)) {
    662			info->ignore_status_mask |=
    663						UART_LSR_OE |
    664						UART_LSR_PE |
    665						UART_LSR_FE;
    666			info->read_status_mask |=
    667						UART_LSR_OE |
    668						UART_LSR_PE |
    669						UART_LSR_FE;
    670		}
    671	}
    672	if (info->board->must_hwid) {
    673		mxser_set_must_xon1_value(info->ioaddr, START_CHAR(tty));
    674		mxser_set_must_xoff1_value(info->ioaddr, STOP_CHAR(tty));
    675		mxser_must_set_rx_sw_flow_control(info->ioaddr, I_IXON(tty));
    676		mxser_must_set_tx_sw_flow_control(info->ioaddr, I_IXOFF(tty));
    677	}
    678
    679
    680	outb(info->FCR, info->ioaddr + UART_FCR);
    681	outb(cval, info->ioaddr + UART_LCR);
    682}
    683
    684static u8 mxser_check_modem_status(struct tty_struct *tty,
    685				struct mxser_port *port)
    686{
    687	u8 msr = inb(port->ioaddr + UART_MSR);
    688
    689	if (!(msr & UART_MSR_ANY_DELTA))
    690		return msr;
    691
    692	/* update input line counters */
    693	if (msr & UART_MSR_TERI)
    694		port->icount.rng++;
    695	if (msr & UART_MSR_DDSR)
    696		port->icount.dsr++;
    697	if (msr & UART_MSR_DDCD)
    698		port->icount.dcd++;
    699	if (msr & UART_MSR_DCTS)
    700		port->icount.cts++;
    701	wake_up_interruptible(&port->port.delta_msr_wait);
    702
    703	if (tty_port_check_carrier(&port->port) && (msr & UART_MSR_DDCD)) {
    704		if (msr & UART_MSR_DCD)
    705			wake_up_interruptible(&port->port.open_wait);
    706	}
    707
    708	if (tty_port_cts_enabled(&port->port))
    709		mxser_handle_cts(tty, port, msr);
    710
    711	return msr;
    712}
    713
    714static void mxser_disable_and_clear_FIFO(struct mxser_port *info)
    715{
    716	u8 fcr = UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT;
    717
    718	if (info->board->must_hwid)
    719		fcr |= MOXA_MUST_FCR_GDA_MODE_ENABLE;
    720
    721	outb(fcr, info->ioaddr + UART_FCR);
    722}
    723
    724static int mxser_activate(struct tty_port *port, struct tty_struct *tty)
    725{
    726	struct mxser_port *info = container_of(port, struct mxser_port, port);
    727	unsigned long flags;
    728	int ret;
    729
    730	ret = tty_port_alloc_xmit_buf(port);
    731	if (ret < 0)
    732		return ret;
    733
    734	spin_lock_irqsave(&info->slock, flags);
    735
    736	if (!info->type) {
    737		set_bit(TTY_IO_ERROR, &tty->flags);
    738		spin_unlock_irqrestore(&info->slock, flags);
    739		ret = 0;
    740		goto err_free_xmit;
    741	}
    742
    743	/*
    744	 * Clear the FIFO buffers and disable them
    745	 * (they will be reenabled in mxser_change_speed())
    746	 */
    747	mxser_disable_and_clear_FIFO(info);
    748
    749	/*
    750	 * At this point there's no way the LSR could still be 0xFF;
    751	 * if it is, then bail out, because there's likely no UART
    752	 * here.
    753	 */
    754	if (inb(info->ioaddr + UART_LSR) == 0xff) {
    755		spin_unlock_irqrestore(&info->slock, flags);
    756		if (capable(CAP_SYS_ADMIN)) {
    757			set_bit(TTY_IO_ERROR, &tty->flags);
    758			return 0;
    759		}
    760
    761		ret = -ENODEV;
    762		goto err_free_xmit;
    763	}
    764
    765	/*
    766	 * Clear the interrupt registers.
    767	 */
    768	(void) inb(info->ioaddr + UART_LSR);
    769	(void) inb(info->ioaddr + UART_RX);
    770	(void) inb(info->ioaddr + UART_IIR);
    771	(void) inb(info->ioaddr + UART_MSR);
    772
    773	/*
    774	 * Now, initialize the UART
    775	 */
    776	outb(UART_LCR_WLEN8, info->ioaddr + UART_LCR);	/* reset DLAB */
    777	info->MCR = UART_MCR_DTR | UART_MCR_RTS;
    778	outb(info->MCR, info->ioaddr + UART_MCR);
    779
    780	/*
    781	 * Finally, enable interrupts
    782	 */
    783	info->IER = UART_IER_MSI | UART_IER_RLSI | UART_IER_RDI;
    784
    785	if (info->board->must_hwid)
    786		info->IER |= MOXA_MUST_IER_EGDAI;
    787	outb(info->IER, info->ioaddr + UART_IER);	/* enable interrupts */
    788
    789	/*
    790	 * And clear the interrupt registers again for luck.
    791	 */
    792	(void) inb(info->ioaddr + UART_LSR);
    793	(void) inb(info->ioaddr + UART_RX);
    794	(void) inb(info->ioaddr + UART_IIR);
    795	(void) inb(info->ioaddr + UART_MSR);
    796
    797	clear_bit(TTY_IO_ERROR, &tty->flags);
    798	kfifo_reset(&port->xmit_fifo);
    799
    800	/*
    801	 * and set the speed of the serial port
    802	 */
    803	mxser_change_speed(tty, NULL);
    804	spin_unlock_irqrestore(&info->slock, flags);
    805
    806	return 0;
    807err_free_xmit:
    808	tty_port_free_xmit_buf(port);
    809	return ret;
    810}
    811
    812/*
    813 * To stop accepting input, we disable the receive line status interrupts, and
    814 * tell the interrupt driver to stop checking the data ready bit in the line
    815 * status register.
    816 */
    817static void mxser_stop_rx(struct mxser_port *info)
    818{
    819	info->IER &= ~UART_IER_RLSI;
    820	if (info->board->must_hwid)
    821		info->IER &= ~MOXA_MUST_RECV_ISR;
    822
    823	outb(info->IER, info->ioaddr + UART_IER);
    824}
    825
    826/*
    827 * This routine will shutdown a serial port
    828 */
    829static void mxser_shutdown_port(struct tty_port *port)
    830{
    831	struct mxser_port *info = container_of(port, struct mxser_port, port);
    832	unsigned long flags;
    833
    834	spin_lock_irqsave(&info->slock, flags);
    835
    836	mxser_stop_rx(info);
    837
    838	/*
    839	 * clear delta_msr_wait queue to avoid mem leaks: we may free the irq
    840	 * here so the queue might never be waken up
    841	 */
    842	wake_up_interruptible(&info->port.delta_msr_wait);
    843
    844	info->IER = 0;
    845	outb(0x00, info->ioaddr + UART_IER);
    846
    847	/* clear Rx/Tx FIFO's */
    848	mxser_disable_and_clear_FIFO(info);
    849
    850	/* read data port to reset things */
    851	(void) inb(info->ioaddr + UART_RX);
    852
    853
    854	if (info->board->must_hwid)
    855		mxser_must_no_sw_flow_control(info->ioaddr);
    856
    857	spin_unlock_irqrestore(&info->slock, flags);
    858
    859	/* make sure ISR is not running while we free the buffer */
    860	synchronize_irq(info->board->irq);
    861
    862	tty_port_free_xmit_buf(port);
    863}
    864
    865/*
    866 * This routine is called whenever a serial port is opened.  It
    867 * enables interrupts for a serial port, linking in its async structure into
    868 * the IRQ chain.   It also performs the serial-specific
    869 * initialization for the tty structure.
    870 */
    871static int mxser_open(struct tty_struct *tty, struct file *filp)
    872{
    873	struct tty_port *tport = tty->port;
    874	struct mxser_port *port = container_of(tport, struct mxser_port, port);
    875
    876	tty->driver_data = port;
    877
    878	return tty_port_open(tport, tty, filp);
    879}
    880
    881static void mxser_flush_buffer(struct tty_struct *tty)
    882{
    883	struct mxser_port *info = tty->driver_data;
    884	unsigned long flags;
    885
    886	spin_lock_irqsave(&info->slock, flags);
    887	kfifo_reset(&info->port.xmit_fifo);
    888
    889	outb(info->FCR | UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT,
    890		info->ioaddr + UART_FCR);
    891
    892	spin_unlock_irqrestore(&info->slock, flags);
    893
    894	tty_wakeup(tty);
    895}
    896
    897static void mxser_close(struct tty_struct *tty, struct file *filp)
    898{
    899	tty_port_close(tty->port, tty, filp);
    900}
    901
    902static int mxser_write(struct tty_struct *tty, const unsigned char *buf, int count)
    903{
    904	struct mxser_port *info = tty->driver_data;
    905	unsigned long flags;
    906	int written;
    907	bool is_empty;
    908
    909	spin_lock_irqsave(&info->slock, flags);
    910	written = kfifo_in(&info->port.xmit_fifo, buf, count);
    911	is_empty = kfifo_is_empty(&info->port.xmit_fifo);
    912	spin_unlock_irqrestore(&info->slock, flags);
    913
    914	if (!is_empty && !tty->flow.stopped)
    915		if (!tty->hw_stopped || mxser_16550A_or_MUST(info))
    916			mxser_start_tx(info);
    917
    918	return written;
    919}
    920
    921static int mxser_put_char(struct tty_struct *tty, unsigned char ch)
    922{
    923	struct mxser_port *info = tty->driver_data;
    924	unsigned long flags;
    925	int ret;
    926
    927	spin_lock_irqsave(&info->slock, flags);
    928	ret = kfifo_put(&info->port.xmit_fifo, ch);
    929	spin_unlock_irqrestore(&info->slock, flags);
    930
    931	return ret;
    932}
    933
    934
    935static void mxser_flush_chars(struct tty_struct *tty)
    936{
    937	struct mxser_port *info = tty->driver_data;
    938
    939	if (kfifo_is_empty(&info->port.xmit_fifo) || tty->flow.stopped ||
    940			(tty->hw_stopped && !mxser_16550A_or_MUST(info)))
    941		return;
    942
    943	mxser_start_tx(info);
    944}
    945
    946static unsigned int mxser_write_room(struct tty_struct *tty)
    947{
    948	struct mxser_port *info = tty->driver_data;
    949
    950	return kfifo_avail(&info->port.xmit_fifo);
    951}
    952
    953static unsigned int mxser_chars_in_buffer(struct tty_struct *tty)
    954{
    955	struct mxser_port *info = tty->driver_data;
    956
    957	return kfifo_len(&info->port.xmit_fifo);
    958}
    959
    960/*
    961 * ------------------------------------------------------------
    962 * friends of mxser_ioctl()
    963 * ------------------------------------------------------------
    964 */
    965static int mxser_get_serial_info(struct tty_struct *tty,
    966		struct serial_struct *ss)
    967{
    968	struct mxser_port *info = tty->driver_data;
    969	struct tty_port *port = &info->port;
    970	unsigned int closing_wait, close_delay;
    971
    972	mutex_lock(&port->mutex);
    973
    974	close_delay = jiffies_to_msecs(info->port.close_delay) / 10;
    975	closing_wait = info->port.closing_wait;
    976	if (closing_wait != ASYNC_CLOSING_WAIT_NONE)
    977		closing_wait = jiffies_to_msecs(closing_wait) / 10;
    978
    979	ss->type = info->type;
    980	ss->line = tty->index;
    981	ss->port = info->ioaddr;
    982	ss->irq = info->board->irq;
    983	ss->flags = info->port.flags;
    984	ss->baud_base = MXSER_BAUD_BASE;
    985	ss->close_delay = close_delay;
    986	ss->closing_wait = closing_wait;
    987	ss->custom_divisor = MXSER_CUSTOM_DIVISOR,
    988	mutex_unlock(&port->mutex);
    989	return 0;
    990}
    991
    992static int mxser_set_serial_info(struct tty_struct *tty,
    993		struct serial_struct *ss)
    994{
    995	struct mxser_port *info = tty->driver_data;
    996	struct tty_port *port = &info->port;
    997	speed_t baud;
    998	unsigned long sl_flags;
    999	unsigned int old_speed, close_delay, closing_wait;
   1000	int retval = 0;
   1001
   1002	if (tty_io_error(tty))
   1003		return -EIO;
   1004
   1005	mutex_lock(&port->mutex);
   1006
   1007	if (ss->irq != info->board->irq ||
   1008			ss->port != info->ioaddr) {
   1009		mutex_unlock(&port->mutex);
   1010		return -EINVAL;
   1011	}
   1012
   1013	old_speed = port->flags & ASYNC_SPD_MASK;
   1014
   1015	close_delay = msecs_to_jiffies(ss->close_delay * 10);
   1016	closing_wait = ss->closing_wait;
   1017	if (closing_wait != ASYNC_CLOSING_WAIT_NONE)
   1018		closing_wait = msecs_to_jiffies(closing_wait * 10);
   1019
   1020	if (!capable(CAP_SYS_ADMIN)) {
   1021		if ((ss->baud_base != MXSER_BAUD_BASE) ||
   1022				(close_delay != port->close_delay) ||
   1023				(closing_wait != port->closing_wait) ||
   1024				((ss->flags & ~ASYNC_USR_MASK) != (port->flags & ~ASYNC_USR_MASK))) {
   1025			mutex_unlock(&port->mutex);
   1026			return -EPERM;
   1027		}
   1028		port->flags = (port->flags & ~ASYNC_USR_MASK) |
   1029				(ss->flags & ASYNC_USR_MASK);
   1030	} else {
   1031		/*
   1032		 * OK, past this point, all the error checking has been done.
   1033		 * At this point, we start making changes.....
   1034		 */
   1035		port->flags = ((port->flags & ~ASYNC_FLAGS) |
   1036				(ss->flags & ASYNC_FLAGS));
   1037		port->close_delay = close_delay;
   1038		port->closing_wait = closing_wait;
   1039		if ((port->flags & ASYNC_SPD_MASK) == ASYNC_SPD_CUST &&
   1040				(ss->baud_base != MXSER_BAUD_BASE ||
   1041				ss->custom_divisor !=
   1042				MXSER_CUSTOM_DIVISOR)) {
   1043			if (ss->custom_divisor == 0) {
   1044				mutex_unlock(&port->mutex);
   1045				return -EINVAL;
   1046			}
   1047			baud = ss->baud_base / ss->custom_divisor;
   1048			tty_encode_baud_rate(tty, baud, baud);
   1049		}
   1050
   1051		info->type = ss->type;
   1052
   1053		mxser_process_txrx_fifo(info);
   1054	}
   1055
   1056	if (tty_port_initialized(port)) {
   1057		if (old_speed != (port->flags & ASYNC_SPD_MASK)) {
   1058			spin_lock_irqsave(&info->slock, sl_flags);
   1059			mxser_change_speed(tty, NULL);
   1060			spin_unlock_irqrestore(&info->slock, sl_flags);
   1061		}
   1062	} else {
   1063		retval = mxser_activate(port, tty);
   1064		if (retval == 0)
   1065			tty_port_set_initialized(port, 1);
   1066	}
   1067	mutex_unlock(&port->mutex);
   1068	return retval;
   1069}
   1070
   1071/*
   1072 * mxser_get_lsr_info - get line status register info
   1073 *
   1074 * Purpose: Let user call ioctl() to get info when the UART physically
   1075 *	    is emptied.  On bus types like RS485, the transmitter must
   1076 *	    release the bus after transmitting. This must be done when
   1077 *	    the transmit shift register is empty, not be done when the
   1078 *	    transmit holding register is empty.  This functionality
   1079 *	    allows an RS485 driver to be written in user space.
   1080 */
   1081static int mxser_get_lsr_info(struct mxser_port *info,
   1082		unsigned int __user *value)
   1083{
   1084	unsigned char status;
   1085	unsigned int result;
   1086	unsigned long flags;
   1087
   1088	spin_lock_irqsave(&info->slock, flags);
   1089	status = inb(info->ioaddr + UART_LSR);
   1090	spin_unlock_irqrestore(&info->slock, flags);
   1091	result = ((status & UART_LSR_TEMT) ? TIOCSER_TEMT : 0);
   1092	return put_user(result, value);
   1093}
   1094
   1095static int mxser_tiocmget(struct tty_struct *tty)
   1096{
   1097	struct mxser_port *info = tty->driver_data;
   1098	unsigned char control;
   1099	unsigned long flags;
   1100	u8 msr;
   1101
   1102	if (tty_io_error(tty))
   1103		return -EIO;
   1104
   1105	spin_lock_irqsave(&info->slock, flags);
   1106	control = info->MCR;
   1107	msr = mxser_check_modem_status(tty, info);
   1108	spin_unlock_irqrestore(&info->slock, flags);
   1109
   1110	return ((control & UART_MCR_RTS) ? TIOCM_RTS : 0) |
   1111		    ((control & UART_MCR_DTR) ? TIOCM_DTR : 0) |
   1112		    ((msr & UART_MSR_DCD) ? TIOCM_CAR : 0) |
   1113		    ((msr & UART_MSR_RI) ? TIOCM_RNG : 0) |
   1114		    ((msr & UART_MSR_DSR) ? TIOCM_DSR : 0) |
   1115		    ((msr & UART_MSR_CTS) ? TIOCM_CTS : 0);
   1116}
   1117
   1118static int mxser_tiocmset(struct tty_struct *tty,
   1119		unsigned int set, unsigned int clear)
   1120{
   1121	struct mxser_port *info = tty->driver_data;
   1122	unsigned long flags;
   1123
   1124	if (tty_io_error(tty))
   1125		return -EIO;
   1126
   1127	spin_lock_irqsave(&info->slock, flags);
   1128
   1129	if (set & TIOCM_RTS)
   1130		info->MCR |= UART_MCR_RTS;
   1131	if (set & TIOCM_DTR)
   1132		info->MCR |= UART_MCR_DTR;
   1133
   1134	if (clear & TIOCM_RTS)
   1135		info->MCR &= ~UART_MCR_RTS;
   1136	if (clear & TIOCM_DTR)
   1137		info->MCR &= ~UART_MCR_DTR;
   1138
   1139	outb(info->MCR, info->ioaddr + UART_MCR);
   1140	spin_unlock_irqrestore(&info->slock, flags);
   1141	return 0;
   1142}
   1143
   1144static int mxser_cflags_changed(struct mxser_port *info, unsigned long arg,
   1145		struct async_icount *cprev)
   1146{
   1147	struct async_icount cnow;
   1148	unsigned long flags;
   1149	int ret;
   1150
   1151	spin_lock_irqsave(&info->slock, flags);
   1152	cnow = info->icount;	/* atomic copy */
   1153	spin_unlock_irqrestore(&info->slock, flags);
   1154
   1155	ret =	((arg & TIOCM_RNG) && (cnow.rng != cprev->rng)) ||
   1156		((arg & TIOCM_DSR) && (cnow.dsr != cprev->dsr)) ||
   1157		((arg & TIOCM_CD)  && (cnow.dcd != cprev->dcd)) ||
   1158		((arg & TIOCM_CTS) && (cnow.cts != cprev->cts));
   1159
   1160	*cprev = cnow;
   1161
   1162	return ret;
   1163}
   1164
   1165/* We should likely switch to TIOCGRS485/TIOCSRS485. */
   1166static int mxser_ioctl_op_mode(struct mxser_port *port, int index, bool set,
   1167		int __user *u_opmode)
   1168{
   1169	int opmode, p = index % 4;
   1170	int shiftbit = p * 2;
   1171	u8 val;
   1172
   1173	if (port->board->must_hwid != MOXA_MUST_MU860_HWID)
   1174		return -EFAULT;
   1175
   1176	if (set) {
   1177		if (get_user(opmode, u_opmode))
   1178			return -EFAULT;
   1179
   1180		if (opmode & ~OP_MODE_MASK)
   1181			return -EINVAL;
   1182
   1183		spin_lock_irq(&port->slock);
   1184		val = inb(port->opmode_ioaddr);
   1185		val &= ~(OP_MODE_MASK << shiftbit);
   1186		val |= (opmode << shiftbit);
   1187		outb(val, port->opmode_ioaddr);
   1188		spin_unlock_irq(&port->slock);
   1189
   1190		return 0;
   1191	}
   1192
   1193	spin_lock_irq(&port->slock);
   1194	opmode = inb(port->opmode_ioaddr) >> shiftbit;
   1195	spin_unlock_irq(&port->slock);
   1196
   1197	return put_user(opmode & OP_MODE_MASK, u_opmode);
   1198}
   1199
   1200static int mxser_ioctl(struct tty_struct *tty,
   1201		unsigned int cmd, unsigned long arg)
   1202{
   1203	struct mxser_port *info = tty->driver_data;
   1204	struct async_icount cnow;
   1205	unsigned long flags;
   1206	void __user *argp = (void __user *)arg;
   1207
   1208	if (cmd == MOXA_SET_OP_MODE || cmd == MOXA_GET_OP_MODE)
   1209		return mxser_ioctl_op_mode(info, tty->index,
   1210				cmd == MOXA_SET_OP_MODE, argp);
   1211
   1212	if (cmd != TIOCMIWAIT && tty_io_error(tty))
   1213		return -EIO;
   1214
   1215	switch (cmd) {
   1216	case TIOCSERGETLSR:	/* Get line status register */
   1217		return  mxser_get_lsr_info(info, argp);
   1218		/*
   1219		 * Wait for any of the 4 modem inputs (DCD,RI,DSR,CTS) to change
   1220		 * - mask passed in arg for lines of interest
   1221		 *   (use |'ed TIOCM_RNG/DSR/CD/CTS for masking)
   1222		 * Caller should use TIOCGICOUNT to see which one it was
   1223		 */
   1224	case TIOCMIWAIT:
   1225		spin_lock_irqsave(&info->slock, flags);
   1226		cnow = info->icount;	/* note the counters on entry */
   1227		spin_unlock_irqrestore(&info->slock, flags);
   1228
   1229		return wait_event_interruptible(info->port.delta_msr_wait,
   1230				mxser_cflags_changed(info, arg, &cnow));
   1231	default:
   1232		return -ENOIOCTLCMD;
   1233	}
   1234	return 0;
   1235}
   1236
   1237	/*
   1238	 * Get counter of input serial line interrupts (DCD,RI,DSR,CTS)
   1239	 * Return: write counters to the user passed counter struct
   1240	 * NB: both 1->0 and 0->1 transitions are counted except for
   1241	 *     RI where only 0->1 is counted.
   1242	 */
   1243
   1244static int mxser_get_icount(struct tty_struct *tty,
   1245		struct serial_icounter_struct *icount)
   1246
   1247{
   1248	struct mxser_port *info = tty->driver_data;
   1249	struct async_icount cnow;
   1250	unsigned long flags;
   1251
   1252	spin_lock_irqsave(&info->slock, flags);
   1253	cnow = info->icount;
   1254	spin_unlock_irqrestore(&info->slock, flags);
   1255
   1256	icount->frame = cnow.frame;
   1257	icount->brk = cnow.brk;
   1258	icount->overrun = cnow.overrun;
   1259	icount->buf_overrun = cnow.buf_overrun;
   1260	icount->parity = cnow.parity;
   1261	icount->rx = cnow.rx;
   1262	icount->tx = cnow.tx;
   1263	icount->cts = cnow.cts;
   1264	icount->dsr = cnow.dsr;
   1265	icount->rng = cnow.rng;
   1266	icount->dcd = cnow.dcd;
   1267	return 0;
   1268}
   1269
   1270/*
   1271 * This routine is called by the upper-layer tty layer to signal that
   1272 * incoming characters should be throttled.
   1273 */
   1274static void mxser_throttle(struct tty_struct *tty)
   1275{
   1276	struct mxser_port *info = tty->driver_data;
   1277
   1278	if (I_IXOFF(tty)) {
   1279		if (info->board->must_hwid) {
   1280			info->IER &= ~MOXA_MUST_RECV_ISR;
   1281			outb(info->IER, info->ioaddr + UART_IER);
   1282		} else {
   1283			info->x_char = STOP_CHAR(tty);
   1284			outb(0, info->ioaddr + UART_IER);
   1285			info->IER |= UART_IER_THRI;
   1286			outb(info->IER, info->ioaddr + UART_IER);
   1287		}
   1288	}
   1289
   1290	if (C_CRTSCTS(tty)) {
   1291		info->MCR &= ~UART_MCR_RTS;
   1292		outb(info->MCR, info->ioaddr + UART_MCR);
   1293	}
   1294}
   1295
   1296static void mxser_unthrottle(struct tty_struct *tty)
   1297{
   1298	struct mxser_port *info = tty->driver_data;
   1299
   1300	/* startrx */
   1301	if (I_IXOFF(tty)) {
   1302		if (info->x_char)
   1303			info->x_char = 0;
   1304		else {
   1305			if (info->board->must_hwid) {
   1306				info->IER |= MOXA_MUST_RECV_ISR;
   1307				outb(info->IER, info->ioaddr + UART_IER);
   1308			} else {
   1309				info->x_char = START_CHAR(tty);
   1310				outb(0, info->ioaddr + UART_IER);
   1311				info->IER |= UART_IER_THRI;
   1312				outb(info->IER, info->ioaddr + UART_IER);
   1313			}
   1314		}
   1315	}
   1316
   1317	if (C_CRTSCTS(tty)) {
   1318		info->MCR |= UART_MCR_RTS;
   1319		outb(info->MCR, info->ioaddr + UART_MCR);
   1320	}
   1321}
   1322
   1323/*
   1324 * mxser_stop() and mxser_start()
   1325 *
   1326 * This routines are called before setting or resetting tty->flow.stopped.
   1327 * They enable or disable transmitter interrupts, as necessary.
   1328 */
   1329static void mxser_stop(struct tty_struct *tty)
   1330{
   1331	struct mxser_port *info = tty->driver_data;
   1332	unsigned long flags;
   1333
   1334	spin_lock_irqsave(&info->slock, flags);
   1335	if (info->IER & UART_IER_THRI)
   1336		__mxser_stop_tx(info);
   1337	spin_unlock_irqrestore(&info->slock, flags);
   1338}
   1339
   1340static void mxser_start(struct tty_struct *tty)
   1341{
   1342	struct mxser_port *info = tty->driver_data;
   1343	unsigned long flags;
   1344
   1345	spin_lock_irqsave(&info->slock, flags);
   1346	if (!kfifo_is_empty(&info->port.xmit_fifo))
   1347		__mxser_start_tx(info);
   1348	spin_unlock_irqrestore(&info->slock, flags);
   1349}
   1350
   1351static void mxser_set_termios(struct tty_struct *tty, struct ktermios *old_termios)
   1352{
   1353	struct mxser_port *info = tty->driver_data;
   1354	unsigned long flags;
   1355
   1356	spin_lock_irqsave(&info->slock, flags);
   1357	mxser_change_speed(tty, old_termios);
   1358	spin_unlock_irqrestore(&info->slock, flags);
   1359
   1360	if ((old_termios->c_cflag & CRTSCTS) && !C_CRTSCTS(tty)) {
   1361		tty->hw_stopped = 0;
   1362		mxser_start(tty);
   1363	}
   1364
   1365	/* Handle sw stopped */
   1366	if ((old_termios->c_iflag & IXON) && !I_IXON(tty)) {
   1367		tty->flow.stopped = 0;
   1368
   1369		if (info->board->must_hwid) {
   1370			spin_lock_irqsave(&info->slock, flags);
   1371			mxser_must_set_rx_sw_flow_control(info->ioaddr, false);
   1372			spin_unlock_irqrestore(&info->slock, flags);
   1373		}
   1374
   1375		mxser_start(tty);
   1376	}
   1377}
   1378
   1379static bool mxser_tx_empty(struct mxser_port *info)
   1380{
   1381	unsigned long flags;
   1382	u8 lsr;
   1383
   1384	spin_lock_irqsave(&info->slock, flags);
   1385	lsr = inb(info->ioaddr + UART_LSR);
   1386	spin_unlock_irqrestore(&info->slock, flags);
   1387
   1388	return !(lsr & UART_LSR_TEMT);
   1389}
   1390
   1391/*
   1392 * mxser_wait_until_sent() --- wait until the transmitter is empty
   1393 */
   1394static void mxser_wait_until_sent(struct tty_struct *tty, int timeout)
   1395{
   1396	struct mxser_port *info = tty->driver_data;
   1397	unsigned long expire, char_time;
   1398
   1399	if (info->type == PORT_UNKNOWN)
   1400		return;
   1401
   1402	if (info->xmit_fifo_size == 0)
   1403		return;		/* Just in case.... */
   1404
   1405	/*
   1406	 * Set the check interval to be 1/5 of the estimated time to
   1407	 * send a single character, and make it at least 1.  The check
   1408	 * interval should also be less than the timeout.
   1409	 *
   1410	 * Note: we have to use pretty tight timings here to satisfy
   1411	 * the NIST-PCTS.
   1412	 */
   1413	char_time = (info->timeout - HZ / 50) / info->xmit_fifo_size;
   1414	char_time = char_time / 5;
   1415	if (char_time == 0)
   1416		char_time = 1;
   1417	if (timeout && timeout < char_time)
   1418		char_time = timeout;
   1419
   1420	char_time = jiffies_to_msecs(char_time);
   1421
   1422	/*
   1423	 * If the transmitter hasn't cleared in twice the approximate
   1424	 * amount of time to send the entire FIFO, it probably won't
   1425	 * ever clear.  This assumes the UART isn't doing flow
   1426	 * control, which is currently the case.  Hence, if it ever
   1427	 * takes longer than info->timeout, this is probably due to a
   1428	 * UART bug of some kind.  So, we clamp the timeout parameter at
   1429	 * 2*info->timeout.
   1430	 */
   1431	if (!timeout || timeout > 2 * info->timeout)
   1432		timeout = 2 * info->timeout;
   1433
   1434	expire = jiffies + timeout;
   1435
   1436	while (mxser_tx_empty(info)) {
   1437		msleep_interruptible(char_time);
   1438		if (signal_pending(current))
   1439			break;
   1440		if (time_after(jiffies, expire))
   1441			break;
   1442	}
   1443}
   1444
   1445/*
   1446 * This routine is called by tty_hangup() when a hangup is signaled.
   1447 */
   1448static void mxser_hangup(struct tty_struct *tty)
   1449{
   1450	struct mxser_port *info = tty->driver_data;
   1451
   1452	mxser_flush_buffer(tty);
   1453	tty_port_hangup(&info->port);
   1454}
   1455
   1456/*
   1457 * mxser_rs_break() --- routine which turns the break handling on or off
   1458 */
   1459static int mxser_rs_break(struct tty_struct *tty, int break_state)
   1460{
   1461	struct mxser_port *info = tty->driver_data;
   1462	unsigned long flags;
   1463	u8 lcr;
   1464
   1465	spin_lock_irqsave(&info->slock, flags);
   1466	lcr = inb(info->ioaddr + UART_LCR);
   1467	if (break_state == -1)
   1468		lcr |= UART_LCR_SBC;
   1469	else
   1470		lcr &= ~UART_LCR_SBC;
   1471	outb(lcr, info->ioaddr + UART_LCR);
   1472	spin_unlock_irqrestore(&info->slock, flags);
   1473
   1474	return 0;
   1475}
   1476
   1477static bool mxser_receive_chars_new(struct mxser_port *port, u8 status)
   1478{
   1479	enum mxser_must_hwid hwid = port->board->must_hwid;
   1480	u8 gdl;
   1481
   1482	if (hwid == MOXA_OTHER_UART)
   1483		return false;
   1484	if (status & (UART_LSR_BRK_ERROR_BITS | MOXA_MUST_LSR_RERR))
   1485		return false;
   1486
   1487	gdl = inb(port->ioaddr + MOXA_MUST_GDL_REGISTER);
   1488	if (hwid == MOXA_MUST_MU150_HWID)
   1489		gdl &= MOXA_MUST_GDL_MASK;
   1490
   1491	while (gdl--) {
   1492		u8 ch = inb(port->ioaddr + UART_RX);
   1493		if (!tty_insert_flip_char(&port->port, ch, 0))
   1494			port->icount.buf_overrun++;
   1495	}
   1496
   1497	return true;
   1498}
   1499
   1500static u8 mxser_receive_chars_old(struct tty_struct *tty,
   1501		                struct mxser_port *port, u8 status)
   1502{
   1503	enum mxser_must_hwid hwid = port->board->must_hwid;
   1504	int ignored = 0;
   1505	int max = 256;
   1506	u8 ch;
   1507
   1508	do {
   1509		if (max-- < 0)
   1510			break;
   1511
   1512		ch = inb(port->ioaddr + UART_RX);
   1513		if (hwid && (status & UART_LSR_OE))
   1514			outb(port->FCR | UART_FCR_CLEAR_RCVR,
   1515					port->ioaddr + UART_FCR);
   1516		status &= port->read_status_mask;
   1517		if (status & port->ignore_status_mask) {
   1518			if (++ignored > 100)
   1519				break;
   1520		} else {
   1521			char flag = 0;
   1522			if (status & UART_LSR_BRK_ERROR_BITS) {
   1523				if (status & UART_LSR_BI) {
   1524					flag = TTY_BREAK;
   1525					port->icount.brk++;
   1526
   1527					if (port->port.flags & ASYNC_SAK)
   1528						do_SAK(tty);
   1529				} else if (status & UART_LSR_PE) {
   1530					flag = TTY_PARITY;
   1531					port->icount.parity++;
   1532				} else if (status & UART_LSR_FE) {
   1533					flag = TTY_FRAME;
   1534					port->icount.frame++;
   1535				} else if (status & UART_LSR_OE) {
   1536					flag = TTY_OVERRUN;
   1537					port->icount.overrun++;
   1538				}
   1539			}
   1540			if (!tty_insert_flip_char(&port->port, ch, flag)) {
   1541				port->icount.buf_overrun++;
   1542				break;
   1543			}
   1544		}
   1545
   1546		if (hwid)
   1547			break;
   1548
   1549		status = inb(port->ioaddr + UART_LSR);
   1550	} while (status & UART_LSR_DR);
   1551
   1552	return status;
   1553}
   1554
   1555static u8 mxser_receive_chars(struct tty_struct *tty,
   1556		struct mxser_port *port, u8 status)
   1557{
   1558	if (!mxser_receive_chars_new(port, status))
   1559		status = mxser_receive_chars_old(tty, port, status);
   1560
   1561	tty_flip_buffer_push(&port->port);
   1562
   1563	return status;
   1564}
   1565
   1566static void mxser_transmit_chars(struct tty_struct *tty, struct mxser_port *port)
   1567{
   1568	int count;
   1569
   1570	if (port->x_char) {
   1571		outb(port->x_char, port->ioaddr + UART_TX);
   1572		port->x_char = 0;
   1573		port->icount.tx++;
   1574		return;
   1575	}
   1576
   1577	if (kfifo_is_empty(&port->port.xmit_fifo) || tty->flow.stopped ||
   1578			(tty->hw_stopped && !mxser_16550A_or_MUST(port))) {
   1579		__mxser_stop_tx(port);
   1580		return;
   1581	}
   1582
   1583	count = port->xmit_fifo_size;
   1584	do {
   1585		unsigned char c;
   1586
   1587		if (!kfifo_get(&port->port.xmit_fifo, &c))
   1588			break;
   1589
   1590		outb(c, port->ioaddr + UART_TX);
   1591		port->icount.tx++;
   1592	} while (--count > 0);
   1593
   1594	if (kfifo_len(&port->port.xmit_fifo) < WAKEUP_CHARS)
   1595		tty_wakeup(tty);
   1596
   1597	if (kfifo_is_empty(&port->port.xmit_fifo))
   1598		__mxser_stop_tx(port);
   1599}
   1600
   1601static bool mxser_port_isr(struct mxser_port *port)
   1602{
   1603	struct tty_struct *tty;
   1604	u8 iir, status;
   1605	bool error = false;
   1606
   1607	iir = inb(port->ioaddr + UART_IIR);
   1608	if (iir & UART_IIR_NO_INT)
   1609		return true;
   1610
   1611	iir &= MOXA_MUST_IIR_MASK;
   1612	tty = tty_port_tty_get(&port->port);
   1613	if (!tty) {
   1614		status = inb(port->ioaddr + UART_LSR);
   1615		outb(port->FCR | UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT,
   1616				port->ioaddr + UART_FCR);
   1617		inb(port->ioaddr + UART_MSR);
   1618
   1619		error = true;
   1620		goto put_tty;
   1621	}
   1622
   1623	status = inb(port->ioaddr + UART_LSR);
   1624
   1625	if (port->board->must_hwid) {
   1626		if (iir == MOXA_MUST_IIR_GDA ||
   1627		    iir == MOXA_MUST_IIR_RDA ||
   1628		    iir == MOXA_MUST_IIR_RTO ||
   1629		    iir == MOXA_MUST_IIR_LSR)
   1630			status = mxser_receive_chars(tty, port, status);
   1631	} else {
   1632		status &= port->read_status_mask;
   1633		if (status & UART_LSR_DR)
   1634			status = mxser_receive_chars(tty, port, status);
   1635	}
   1636
   1637	mxser_check_modem_status(tty, port);
   1638
   1639	if (port->board->must_hwid) {
   1640		if (iir == 0x02 && (status & UART_LSR_THRE))
   1641			mxser_transmit_chars(tty, port);
   1642	} else {
   1643		if (status & UART_LSR_THRE)
   1644			mxser_transmit_chars(tty, port);
   1645	}
   1646
   1647put_tty:
   1648	tty_kref_put(tty);
   1649
   1650	return error;
   1651}
   1652
   1653/*
   1654 * This is the serial driver's generic interrupt routine
   1655 */
   1656static irqreturn_t mxser_interrupt(int irq, void *dev_id)
   1657{
   1658	struct mxser_board *brd = dev_id;
   1659	struct mxser_port *port;
   1660	unsigned int int_cnt, pass_counter = 0;
   1661	unsigned int i, max = brd->nports;
   1662	int handled = IRQ_NONE;
   1663	u8 irqbits, bits, mask = BIT(max) - 1;
   1664
   1665	while (pass_counter++ < MXSER_ISR_PASS_LIMIT) {
   1666		irqbits = inb(brd->vector) & mask;
   1667		if (irqbits == mask)
   1668			break;
   1669
   1670		handled = IRQ_HANDLED;
   1671		for (i = 0, bits = 1; i < max; i++, irqbits |= bits, bits <<= 1) {
   1672			if (irqbits == mask)
   1673				break;
   1674			if (bits & irqbits)
   1675				continue;
   1676			port = &brd->ports[i];
   1677
   1678			int_cnt = 0;
   1679			spin_lock(&port->slock);
   1680			do {
   1681				if (mxser_port_isr(port))
   1682					break;
   1683			} while (int_cnt++ < MXSER_ISR_PASS_LIMIT);
   1684			spin_unlock(&port->slock);
   1685		}
   1686	}
   1687
   1688	return handled;
   1689}
   1690
   1691static const struct tty_operations mxser_ops = {
   1692	.open = mxser_open,
   1693	.close = mxser_close,
   1694	.write = mxser_write,
   1695	.put_char = mxser_put_char,
   1696	.flush_chars = mxser_flush_chars,
   1697	.write_room = mxser_write_room,
   1698	.chars_in_buffer = mxser_chars_in_buffer,
   1699	.flush_buffer = mxser_flush_buffer,
   1700	.ioctl = mxser_ioctl,
   1701	.throttle = mxser_throttle,
   1702	.unthrottle = mxser_unthrottle,
   1703	.set_termios = mxser_set_termios,
   1704	.stop = mxser_stop,
   1705	.start = mxser_start,
   1706	.hangup = mxser_hangup,
   1707	.break_ctl = mxser_rs_break,
   1708	.wait_until_sent = mxser_wait_until_sent,
   1709	.tiocmget = mxser_tiocmget,
   1710	.tiocmset = mxser_tiocmset,
   1711	.set_serial = mxser_set_serial_info,
   1712	.get_serial = mxser_get_serial_info,
   1713	.get_icount = mxser_get_icount,
   1714};
   1715
   1716static const struct tty_port_operations mxser_port_ops = {
   1717	.carrier_raised = mxser_carrier_raised,
   1718	.dtr_rts = mxser_dtr_rts,
   1719	.activate = mxser_activate,
   1720	.shutdown = mxser_shutdown_port,
   1721};
   1722
   1723/*
   1724 * The MOXA Smartio/Industio serial driver boot-time initialization code!
   1725 */
   1726
   1727static void mxser_initbrd(struct mxser_board *brd, bool high_baud)
   1728{
   1729	struct mxser_port *info;
   1730	unsigned int i;
   1731	bool is_mu860;
   1732
   1733	brd->must_hwid = mxser_must_get_hwid(brd->ports[0].ioaddr);
   1734	is_mu860 = brd->must_hwid == MOXA_MUST_MU860_HWID;
   1735
   1736	for (i = 0; i < UART_INFO_NUM; i++) {
   1737		if (Gpci_uart_info[i].type == brd->must_hwid) {
   1738			brd->max_baud = Gpci_uart_info[i].max_baud;
   1739
   1740			/* exception....CP-102 */
   1741			if (high_baud)
   1742				brd->max_baud = 921600;
   1743			break;
   1744		}
   1745	}
   1746
   1747	if (is_mu860) {
   1748		/* set to RS232 mode by default */
   1749		outb(0, brd->vector + 4);
   1750		outb(0, brd->vector + 0x0c);
   1751	}
   1752
   1753	for (i = 0; i < brd->nports; i++) {
   1754		info = &brd->ports[i];
   1755		if (is_mu860) {
   1756			if (i < 4)
   1757				info->opmode_ioaddr = brd->vector + 4;
   1758			else
   1759				info->opmode_ioaddr = brd->vector + 0x0c;
   1760		}
   1761		tty_port_init(&info->port);
   1762		info->port.ops = &mxser_port_ops;
   1763		info->board = brd;
   1764
   1765		/* Enhance mode enabled here */
   1766		if (brd->must_hwid != MOXA_OTHER_UART)
   1767			mxser_must_set_enhance_mode(info->ioaddr, true);
   1768
   1769		info->type = PORT_16550A;
   1770
   1771		mxser_process_txrx_fifo(info);
   1772
   1773		info->port.close_delay = 5 * HZ / 10;
   1774		info->port.closing_wait = 30 * HZ;
   1775		spin_lock_init(&info->slock);
   1776
   1777		/* before set INT ISR, disable all int */
   1778		outb(inb(info->ioaddr + UART_IER) & 0xf0,
   1779			info->ioaddr + UART_IER);
   1780	}
   1781}
   1782
   1783static int mxser_probe(struct pci_dev *pdev,
   1784		const struct pci_device_id *ent)
   1785{
   1786	struct mxser_board *brd;
   1787	unsigned int i, base;
   1788	unsigned long ioaddress;
   1789	unsigned short nports = MXSER_NPORTS(ent->driver_data);
   1790	struct device *tty_dev;
   1791	int retval = -EINVAL;
   1792
   1793	i = find_first_zero_bit(mxser_boards, MXSER_BOARDS);
   1794	if (i >= MXSER_BOARDS) {
   1795		dev_err(&pdev->dev, "too many boards found (maximum %d), board "
   1796				"not configured\n", MXSER_BOARDS);
   1797		goto err;
   1798	}
   1799
   1800	brd = devm_kzalloc(&pdev->dev, struct_size(brd, ports, nports),
   1801			GFP_KERNEL);
   1802	if (!brd)
   1803		goto err;
   1804
   1805	brd->idx = i;
   1806	__set_bit(brd->idx, mxser_boards);
   1807	base = i * MXSER_PORTS_PER_BOARD;
   1808
   1809	retval = pcim_enable_device(pdev);
   1810	if (retval) {
   1811		dev_err(&pdev->dev, "PCI enable failed\n");
   1812		goto err_zero;
   1813	}
   1814
   1815	/* io address */
   1816	ioaddress = pci_resource_start(pdev, 2);
   1817	retval = pci_request_region(pdev, 2, "mxser(IO)");
   1818	if (retval)
   1819		goto err_zero;
   1820
   1821	brd->nports = nports;
   1822	for (i = 0; i < nports; i++)
   1823		brd->ports[i].ioaddr = ioaddress + 8 * i;
   1824
   1825	/* vector */
   1826	ioaddress = pci_resource_start(pdev, 3);
   1827	retval = pci_request_region(pdev, 3, "mxser(vector)");
   1828	if (retval)
   1829		goto err_zero;
   1830	brd->vector = ioaddress;
   1831
   1832	/* irq */
   1833	brd->irq = pdev->irq;
   1834
   1835	mxser_initbrd(brd, ent->driver_data & MXSER_HIGHBAUD);
   1836
   1837	retval = devm_request_irq(&pdev->dev, brd->irq, mxser_interrupt,
   1838			IRQF_SHARED, "mxser", brd);
   1839	if (retval) {
   1840		dev_err(&pdev->dev, "request irq failed");
   1841		goto err_relbrd;
   1842	}
   1843
   1844	for (i = 0; i < nports; i++) {
   1845		tty_dev = tty_port_register_device(&brd->ports[i].port,
   1846				mxvar_sdriver, base + i, &pdev->dev);
   1847		if (IS_ERR(tty_dev)) {
   1848			retval = PTR_ERR(tty_dev);
   1849			for (; i > 0; i--)
   1850				tty_unregister_device(mxvar_sdriver,
   1851					base + i - 1);
   1852			goto err_relbrd;
   1853		}
   1854	}
   1855
   1856	pci_set_drvdata(pdev, brd);
   1857
   1858	return 0;
   1859err_relbrd:
   1860	for (i = 0; i < nports; i++)
   1861		tty_port_destroy(&brd->ports[i].port);
   1862err_zero:
   1863	__clear_bit(brd->idx, mxser_boards);
   1864err:
   1865	return retval;
   1866}
   1867
   1868static void mxser_remove(struct pci_dev *pdev)
   1869{
   1870	struct mxser_board *brd = pci_get_drvdata(pdev);
   1871	unsigned int i, base = brd->idx * MXSER_PORTS_PER_BOARD;
   1872
   1873	for (i = 0; i < brd->nports; i++) {
   1874		tty_unregister_device(mxvar_sdriver, base + i);
   1875		tty_port_destroy(&brd->ports[i].port);
   1876	}
   1877
   1878	__clear_bit(brd->idx, mxser_boards);
   1879}
   1880
   1881static struct pci_driver mxser_driver = {
   1882	.name = "mxser",
   1883	.id_table = mxser_pcibrds,
   1884	.probe = mxser_probe,
   1885	.remove = mxser_remove
   1886};
   1887
   1888static int __init mxser_module_init(void)
   1889{
   1890	int retval;
   1891
   1892	mxvar_sdriver = tty_alloc_driver(MXSER_PORTS, TTY_DRIVER_REAL_RAW |
   1893			TTY_DRIVER_DYNAMIC_DEV);
   1894	if (IS_ERR(mxvar_sdriver))
   1895		return PTR_ERR(mxvar_sdriver);
   1896
   1897	/* Initialize the tty_driver structure */
   1898	mxvar_sdriver->name = "ttyMI";
   1899	mxvar_sdriver->major = ttymajor;
   1900	mxvar_sdriver->minor_start = 0;
   1901	mxvar_sdriver->type = TTY_DRIVER_TYPE_SERIAL;
   1902	mxvar_sdriver->subtype = SERIAL_TYPE_NORMAL;
   1903	mxvar_sdriver->init_termios = tty_std_termios;
   1904	mxvar_sdriver->init_termios.c_cflag = B9600|CS8|CREAD|HUPCL|CLOCAL;
   1905	tty_set_operations(mxvar_sdriver, &mxser_ops);
   1906
   1907	retval = tty_register_driver(mxvar_sdriver);
   1908	if (retval) {
   1909		printk(KERN_ERR "Couldn't install MOXA Smartio/Industio family "
   1910				"tty driver !\n");
   1911		goto err_put;
   1912	}
   1913
   1914	retval = pci_register_driver(&mxser_driver);
   1915	if (retval) {
   1916		printk(KERN_ERR "mxser: can't register pci driver\n");
   1917		goto err_unr;
   1918	}
   1919
   1920	return 0;
   1921err_unr:
   1922	tty_unregister_driver(mxvar_sdriver);
   1923err_put:
   1924	tty_driver_kref_put(mxvar_sdriver);
   1925	return retval;
   1926}
   1927
   1928static void __exit mxser_module_exit(void)
   1929{
   1930	pci_unregister_driver(&mxser_driver);
   1931	tty_unregister_driver(mxvar_sdriver);
   1932	tty_driver_kref_put(mxvar_sdriver);
   1933}
   1934
   1935module_init(mxser_module_init);
   1936module_exit(mxser_module_exit);