Commit 8ea2c2ec authored by Jesper Juhl's avatar Jesper Juhl Committed by Linus Torvalds

[PATCH] moxa: partial CodingStyle cleanup & spelling fixes

Do a *partial* CodingStyle cleanup, correct some spelling in printk()'s &&
convert C++ comments to C comments - in moxa driver.
Signed-off-by: default avatarJesper Juhl <jesper.juhl@gmail.com>
Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 8a7f7c93
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or * the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version. * (at your option) any later version.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
...@@ -71,8 +71,8 @@ ...@@ -71,8 +71,8 @@
#define MXSERMAJOR 174 #define MXSERMAJOR 174
#define MXSERCUMAJOR 175 #define MXSERCUMAJOR 175
#define MXSER_EVENT_TXLOW 1 #define MXSER_EVENT_TXLOW 1
#define MXSER_EVENT_HANGUP 2 #define MXSER_EVENT_HANGUP 2
#define MXSER_BOARDS 4 /* Max. boards */ #define MXSER_BOARDS 4 /* Max. boards */
#define MXSER_PORTS 32 /* Max. ports */ #define MXSER_PORTS 32 /* Max. ports */
...@@ -92,7 +92,8 @@ ...@@ -92,7 +92,8 @@
#define UART_MCR_AFE 0x20 #define UART_MCR_AFE 0x20
#define UART_LSR_SPECIAL 0x1E #define UART_LSR_SPECIAL 0x1E
#define RELEVANT_IFLAG(iflag) (iflag & (IGNBRK|BRKINT|IGNPAR|PARMRK|INPCK|IXON|IXOFF)) #define RELEVANT_IFLAG(iflag) (iflag & (IGNBRK|BRKINT|IGNPAR|PARMRK|INPCK|\
IXON|IXOFF))
#define IRQ_T(info) ((info->flags & ASYNC_SHARE_IRQ) ? SA_SHIRQ : SA_INTERRUPT) #define IRQ_T(info) ((info->flags & ASYNC_SHARE_IRQ) ? SA_SHIRQ : SA_INTERRUPT)
...@@ -152,27 +153,27 @@ static char *mxser_brdname[] = { ...@@ -152,27 +153,27 @@ static char *mxser_brdname[] = {
}; };
static int mxser_numports[] = { static int mxser_numports[] = {
8, // C168-ISA 8, /* C168-ISA */
4, // C104-ISA 4, /* C104-ISA */
4, // CI104J 4, /* CI104J */
8, // C168-PCI 8, /* C168-PCI */
4, // C104-PCI 4, /* C104-PCI */
2, // C102-ISA 2, /* C102-ISA */
2, // CI132 2, /* CI132 */
4, // CI134 4, /* CI134 */
2, // CP132 2, /* CP132 */
4, // CP114 4, /* CP114 */
4, // CT114 4, /* CT114 */
2, // CP102 2, /* CP102 */
4, // CP104U 4, /* CP104U */
8, // CP168U 8, /* CP168U */
2, // CP132U 2, /* CP132U */
4, // CP134U 4, /* CP134U */
4, // CP104JU 4, /* CP104JU */
8, // RC7000 8, /* RC7000 */
8, // CP118U 8, /* CP118U */
2, // CP102UL 2, /* CP102UL */
2, // CP102U 2, /* CP102U */
}; };
#define UART_TYPE_NUM 2 #define UART_TYPE_NUM 2
...@@ -182,7 +183,7 @@ static const unsigned int Gmoxa_uart_id[UART_TYPE_NUM] = { ...@@ -182,7 +183,7 @@ static const unsigned int Gmoxa_uart_id[UART_TYPE_NUM] = {
MOXA_MUST_MU860_HWID MOXA_MUST_MU860_HWID
}; };
// This is only for PCI /* This is only for PCI */
#define UART_INFO_NUM 3 #define UART_INFO_NUM 3
struct mxpciuart_info { struct mxpciuart_info {
int type; int type;
...@@ -231,7 +232,7 @@ MODULE_DEVICE_TABLE(pci, mxser_pcibrds); ...@@ -231,7 +232,7 @@ MODULE_DEVICE_TABLE(pci, mxser_pcibrds);
typedef struct _moxa_pci_info { typedef struct _moxa_pci_info {
unsigned short busNum; unsigned short busNum;
unsigned short devNum; unsigned short devNum;
struct pci_dev *pdev; // add by Victor Yu. 06-23-2003 struct pci_dev *pdev; /* add by Victor Yu. 06-23-2003 */
} moxa_pci_info; } moxa_pci_info;
static int ioaddr[MXSER_BOARDS] = { 0, 0, 0, 0 }; static int ioaddr[MXSER_BOARDS] = { 0, 0, 0, 0 };
...@@ -280,6 +281,7 @@ struct mxser_mon_ext { ...@@ -280,6 +281,7 @@ struct mxser_mon_ext {
int fifo[32]; int fifo[32];
int iftype[32]; int iftype[32];
}; };
struct mxser_hwconf { struct mxser_hwconf {
int board_type; int board_type;
int ports; int ports;
...@@ -290,9 +292,9 @@ struct mxser_hwconf { ...@@ -290,9 +292,9 @@ struct mxser_hwconf {
int ioaddr[MXSER_PORTS_PER_BOARD]; int ioaddr[MXSER_PORTS_PER_BOARD];
int baud_base[MXSER_PORTS_PER_BOARD]; int baud_base[MXSER_PORTS_PER_BOARD];
moxa_pci_info pciInfo; moxa_pci_info pciInfo;
int IsMoxaMustChipFlag; // add by Victor Yu. 08-30-2002 int IsMoxaMustChipFlag; /* add by Victor Yu. 08-30-2002 */
int MaxCanSetBaudRate[MXSER_PORTS_PER_BOARD]; // add by Victor Yu. 09-04-2002 int MaxCanSetBaudRate[MXSER_PORTS_PER_BOARD]; /* add by Victor Yu. 09-04-2002 */
int opmode_ioaddr[MXSER_PORTS_PER_BOARD]; // add by Victor Yu. 01-05-2004 int opmode_ioaddr[MXSER_PORTS_PER_BOARD]; /* add by Victor Yu. 01-05-2004 */
}; };
struct mxser_struct { struct mxser_struct {
...@@ -334,9 +336,9 @@ struct mxser_struct { ...@@ -334,9 +336,9 @@ struct mxser_struct {
wait_queue_head_t delta_msr_wait; wait_queue_head_t delta_msr_wait;
struct async_icount icount; /* kernel counters for the 4 input interrupts */ struct async_icount icount; /* kernel counters for the 4 input interrupts */
int timeout; int timeout;
int IsMoxaMustChipFlag; // add by Victor Yu. 08-30-2002 int IsMoxaMustChipFlag; /* add by Victor Yu. 08-30-2002 */
int MaxCanSetBaudRate; // add by Victor Yu. 09-04-2002 int MaxCanSetBaudRate; /* add by Victor Yu. 09-04-2002 */
int opmode_ioaddr; // add by Victor Yu. 01-05-2004 int opmode_ioaddr; /* add by Victor Yu. 01-05-2004 */
unsigned char stop_rx; unsigned char stop_rx;
unsigned char ldisc_stop_rx; unsigned char ldisc_stop_rx;
long realbaud; long realbaud;
...@@ -345,7 +347,6 @@ struct mxser_struct { ...@@ -345,7 +347,6 @@ struct mxser_struct {
spinlock_t slock; spinlock_t slock;
}; };
struct mxser_mstatus { struct mxser_mstatus {
tcflag_t cflag; tcflag_t cflag;
int cts; int cts;
...@@ -358,7 +359,7 @@ static struct mxser_mstatus GMStatus[MXSER_PORTS]; ...@@ -358,7 +359,7 @@ static struct mxser_mstatus GMStatus[MXSER_PORTS];
static int mxserBoardCAP[MXSER_BOARDS] = { static int mxserBoardCAP[MXSER_BOARDS] = {
0, 0, 0, 0 0, 0, 0, 0
/* 0x180, 0x280, 0x200, 0x320 */ /* 0x180, 0x280, 0x200, 0x320 */
}; };
static struct tty_driver *mxvar_sdriver; static struct tty_driver *mxvar_sdriver;
...@@ -386,7 +387,7 @@ static struct mxser_hwconf mxsercfg[MXSER_BOARDS]; ...@@ -386,7 +387,7 @@ static struct mxser_hwconf mxsercfg[MXSER_BOARDS];
static void mxser_getcfg(int board, struct mxser_hwconf *hwconf); static void mxser_getcfg(int board, struct mxser_hwconf *hwconf);
static int mxser_init(void); static int mxser_init(void);
//static void mxser_poll(unsigned long); /* static void mxser_poll(unsigned long); */
static int mxser_get_ISA_conf(int, struct mxser_hwconf *); static int mxser_get_ISA_conf(int, struct mxser_hwconf *);
static int mxser_get_PCI_conf(int, int, int, struct mxser_hwconf *); static int mxser_get_PCI_conf(int, int, int, struct mxser_hwconf *);
static void mxser_do_softint(void *); static void mxser_do_softint(void *);
...@@ -440,18 +441,18 @@ static int CheckIsMoxaMust(int io) ...@@ -440,18 +441,18 @@ static int CheckIsMoxaMust(int io)
SET_MOXA_MUST_XON1_VALUE(io, 0x11); SET_MOXA_MUST_XON1_VALUE(io, 0x11);
if ((hwid = inb(io + UART_MCR)) != 0) { if ((hwid = inb(io + UART_MCR)) != 0) {
outb(oldmcr, io + UART_MCR); outb(oldmcr, io + UART_MCR);
return (MOXA_OTHER_UART); return MOXA_OTHER_UART;
} }
GET_MOXA_MUST_HARDWARE_ID(io, &hwid); GET_MOXA_MUST_HARDWARE_ID(io, &hwid);
for (i = 0; i < UART_TYPE_NUM; i++) { for (i = 0; i < UART_TYPE_NUM; i++) {
if (hwid == Gmoxa_uart_id[i]) if (hwid == Gmoxa_uart_id[i])
return (int) hwid; return (int)hwid;
} }
return MOXA_OTHER_UART; return MOXA_OTHER_UART;
} }
// above is modified by Victor Yu. 08-15-2002 /* above is modified by Victor Yu. 08-15-2002 */
static struct tty_operations mxser_ops = { static struct tty_operations mxser_ops = {
.open = mxser_open, .open = mxser_open,
...@@ -504,7 +505,6 @@ static void __exit mxser_module_exit(void) ...@@ -504,7 +505,6 @@ static void __exit mxser_module_exit(void)
else else
printk(KERN_ERR "Couldn't unregister MOXA Smartio/Industio family serial driver\n"); printk(KERN_ERR "Couldn't unregister MOXA Smartio/Industio family serial driver\n");
for (i = 0; i < MXSER_BOARDS; i++) { for (i = 0; i < MXSER_BOARDS; i++) {
struct pci_dev *pdev; struct pci_dev *pdev;
...@@ -513,7 +513,7 @@ static void __exit mxser_module_exit(void) ...@@ -513,7 +513,7 @@ static void __exit mxser_module_exit(void)
else { else {
pdev = mxsercfg[i].pciInfo.pdev; pdev = mxsercfg[i].pciInfo.pdev;
free_irq(mxsercfg[i].irq, &mxvar_table[i * MXSER_PORTS_PER_BOARD]); free_irq(mxsercfg[i].irq, &mxvar_table[i * MXSER_PORTS_PER_BOARD]);
if (pdev != NULL) { //PCI if (pdev != NULL) { /* PCI */
release_region(pci_resource_start(pdev, 2), pci_resource_len(pdev, 2)); release_region(pci_resource_start(pdev, 2), pci_resource_len(pdev, 2));
release_region(pci_resource_start(pdev, 3), pci_resource_len(pdev, 3)); release_region(pci_resource_start(pdev, 3), pci_resource_len(pdev, 3));
} else { } else {
...@@ -524,7 +524,6 @@ static void __exit mxser_module_exit(void) ...@@ -524,7 +524,6 @@ static void __exit mxser_module_exit(void)
} }
if (verbose) if (verbose)
printk(KERN_DEBUG "Done.\n"); printk(KERN_DEBUG "Done.\n");
} }
static void process_txrx_fifo(struct mxser_struct *info) static void process_txrx_fifo(struct mxser_struct *info)
...@@ -558,8 +557,10 @@ static int mxser_initbrd(int board, struct mxser_hwconf *hwconf) ...@@ -558,8 +557,10 @@ static int mxser_initbrd(int board, struct mxser_hwconf *hwconf)
n = board * MXSER_PORTS_PER_BOARD; n = board * MXSER_PORTS_PER_BOARD;
info = &mxvar_table[n]; info = &mxvar_table[n];
/*if (verbose) */ { /*if (verbose) */ {
printk(KERN_DEBUG " ttyM%d - ttyM%d ", n, n + hwconf->ports - 1); printk(KERN_DEBUG " ttyM%d - ttyM%d ",
printk(" max. baud rate = %d bps.\n", hwconf->MaxCanSetBaudRate[0]); n, n + hwconf->ports - 1);
printk(" max. baud rate = %d bps.\n",
hwconf->MaxCanSetBaudRate[0]);
} }
for (i = 0; i < hwconf->ports; i++, n++, info++) { for (i = 0; i < hwconf->ports; i++, n++, info++) {
...@@ -568,12 +569,12 @@ static int mxser_initbrd(int board, struct mxser_hwconf *hwconf) ...@@ -568,12 +569,12 @@ static int mxser_initbrd(int board, struct mxser_hwconf *hwconf)
info->irq = hwconf->irq; info->irq = hwconf->irq;
info->vector = hwconf->vector; info->vector = hwconf->vector;
info->vectormask = hwconf->vector_mask; info->vectormask = hwconf->vector_mask;
info->opmode_ioaddr = hwconf->opmode_ioaddr[i]; // add by Victor Yu. 01-05-2004 info->opmode_ioaddr = hwconf->opmode_ioaddr[i]; /* add by Victor Yu. 01-05-2004 */
info->stop_rx = 0; info->stop_rx = 0;
info->ldisc_stop_rx = 0; info->ldisc_stop_rx = 0;
info->IsMoxaMustChipFlag = hwconf->IsMoxaMustChipFlag; info->IsMoxaMustChipFlag = hwconf->IsMoxaMustChipFlag;
//Enhance mode enabled here /* Enhance mode enabled here */
if (info->IsMoxaMustChipFlag != MOXA_OTHER_UART) { if (info->IsMoxaMustChipFlag != MOXA_OTHER_UART) {
ENABLE_MOXA_MUST_ENCHANCE_MODE(info->base); ENABLE_MOXA_MUST_ENCHANCE_MODE(info->base);
} }
...@@ -606,22 +607,25 @@ static int mxser_initbrd(int board, struct mxser_hwconf *hwconf) ...@@ -606,22 +607,25 @@ static int mxser_initbrd(int board, struct mxser_hwconf *hwconf)
/* before set INT ISR, disable all int */ /* before set INT ISR, disable all int */
for (i = 0; i < hwconf->ports; i++) { for (i = 0; i < hwconf->ports; i++) {
outb(inb(hwconf->ioaddr[i] + UART_IER) & 0xf0, hwconf->ioaddr[i] + UART_IER); outb(inb(hwconf->ioaddr[i] + UART_IER) & 0xf0,
hwconf->ioaddr[i] + UART_IER);
} }
n = board * MXSER_PORTS_PER_BOARD; n = board * MXSER_PORTS_PER_BOARD;
info = &mxvar_table[n]; info = &mxvar_table[n];
retval = request_irq(hwconf->irq, mxser_interrupt, IRQ_T(info), "mxser", info); retval = request_irq(hwconf->irq, mxser_interrupt, IRQ_T(info),
"mxser", info);
if (retval) { if (retval) {
printk(KERN_ERR "Board %d: %s", board, mxser_brdname[hwconf->board_type - 1]); printk(KERN_ERR "Board %d: %s",
printk(" Request irq fail,IRQ (%d) may be conflit with another device.\n", info->irq); board, mxser_brdname[hwconf->board_type - 1]);
printk(" Request irq failed, IRQ (%d) may conflict with"
" another device.\n", info->irq);
return retval; return retval;
} }
return 0; return 0;
} }
static void mxser_getcfg(int board, struct mxser_hwconf *hwconf) static void mxser_getcfg(int board, struct mxser_hwconf *hwconf)
{ {
mxsercfg[board] = *hwconf; mxsercfg[board] = *hwconf;
...@@ -631,26 +635,27 @@ static void mxser_getcfg(int board, struct mxser_hwconf *hwconf) ...@@ -631,26 +635,27 @@ static void mxser_getcfg(int board, struct mxser_hwconf *hwconf)
static int mxser_get_PCI_conf(int busnum, int devnum, int board_type, struct mxser_hwconf *hwconf) static int mxser_get_PCI_conf(int busnum, int devnum, int board_type, struct mxser_hwconf *hwconf)
{ {
int i, j; int i, j;
// unsigned int val; /* unsigned int val; */
unsigned int ioaddress; unsigned int ioaddress;
struct pci_dev *pdev = hwconf->pciInfo.pdev; struct pci_dev *pdev = hwconf->pciInfo.pdev;
//io address /* io address */
hwconf->board_type = board_type; hwconf->board_type = board_type;
hwconf->ports = mxser_numports[board_type - 1]; hwconf->ports = mxser_numports[board_type - 1];
ioaddress = pci_resource_start(pdev, 2); ioaddress = pci_resource_start(pdev, 2);
request_region(pci_resource_start(pdev, 2), pci_resource_len(pdev, 2), "mxser(IO)"); request_region(pci_resource_start(pdev, 2), pci_resource_len(pdev, 2),
"mxser(IO)");
for (i = 0; i < hwconf->ports; i++) { for (i = 0; i < hwconf->ports; i++)
hwconf->ioaddr[i] = ioaddress + 8 * i; hwconf->ioaddr[i] = ioaddress + 8 * i;
}
//vector /* vector */
ioaddress = pci_resource_start(pdev, 3); ioaddress = pci_resource_start(pdev, 3);
request_region(pci_resource_start(pdev, 3), pci_resource_len(pdev, 3), "mxser(vector)"); request_region(pci_resource_start(pdev, 3), pci_resource_len(pdev, 3),
"mxser(vector)");
hwconf->vector = ioaddress; hwconf->vector = ioaddress;
//irq /* irq */
hwconf->irq = hwconf->pciInfo.pdev->irq; hwconf->irq = hwconf->pciInfo.pdev->irq;
hwconf->IsMoxaMustChipFlag = CheckIsMoxaMust(hwconf->ioaddr[0]); hwconf->IsMoxaMustChipFlag = CheckIsMoxaMust(hwconf->ioaddr[0]);
...@@ -663,7 +668,7 @@ static int mxser_get_PCI_conf(int busnum, int devnum, int board_type, struct mxs ...@@ -663,7 +668,7 @@ static int mxser_get_PCI_conf(int busnum, int devnum, int board_type, struct mxs
if (Gpci_uart_info[j].type == hwconf->IsMoxaMustChipFlag) { if (Gpci_uart_info[j].type == hwconf->IsMoxaMustChipFlag) {
hwconf->MaxCanSetBaudRate[i] = Gpci_uart_info[j].max_baud; hwconf->MaxCanSetBaudRate[i] = Gpci_uart_info[j].max_baud;
//exception....CP-102 /* exception....CP-102 */
if (board_type == MXSER_BOARD_CP102) if (board_type == MXSER_BOARD_CP102)
hwconf->MaxCanSetBaudRate[i] = 921600; hwconf->MaxCanSetBaudRate[i] = 921600;
break; break;
...@@ -678,15 +683,15 @@ static int mxser_get_PCI_conf(int busnum, int devnum, int board_type, struct mxs ...@@ -678,15 +683,15 @@ static int mxser_get_PCI_conf(int busnum, int devnum, int board_type, struct mxs
else else
hwconf->opmode_ioaddr[i] = ioaddress + 0x0c; hwconf->opmode_ioaddr[i] = ioaddress + 0x0c;
} }
outb(0, ioaddress + 4); // default set to RS232 mode outb(0, ioaddress + 4); /* default set to RS232 mode */
outb(0, ioaddress + 0x0c); //default set to RS232 mode outb(0, ioaddress + 0x0c); /* default set to RS232 mode */
} }
for (i = 0; i < hwconf->ports; i++) { for (i = 0; i < hwconf->ports; i++) {
hwconf->vector_mask |= (1 << i); hwconf->vector_mask |= (1 << i);
hwconf->baud_base[i] = 921600; hwconf->baud_base[i] = 921600;
} }
return (0); return 0;
} }
#endif #endif
...@@ -707,7 +712,8 @@ static int mxser_init(void) ...@@ -707,7 +712,8 @@ static int mxser_init(void)
mxsercfg[i].board_type = -1; mxsercfg[i].board_type = -1;
} }
printk(KERN_INFO "MOXA Smartio/Industio family driver version %s\n", MXSER_VERSION); printk(KERN_INFO "MOXA Smartio/Industio family driver version %s\n",
MXSER_VERSION);
/* Initialize the tty_driver structure */ /* Initialize the tty_driver structure */
memset(mxvar_sdriver, 0, sizeof(struct tty_driver)); memset(mxvar_sdriver, 0, sizeof(struct tty_driver));
...@@ -719,7 +725,7 @@ static int mxser_init(void) ...@@ -719,7 +725,7 @@ static int mxser_init(void)
mxvar_sdriver->type = TTY_DRIVER_TYPE_SERIAL; mxvar_sdriver->type = TTY_DRIVER_TYPE_SERIAL;
mxvar_sdriver->subtype = SERIAL_TYPE_NORMAL; mxvar_sdriver->subtype = SERIAL_TYPE_NORMAL;
mxvar_sdriver->init_termios = tty_std_termios; mxvar_sdriver->init_termios = tty_std_termios;
mxvar_sdriver->init_termios.c_cflag = B9600 | CS8 | CREAD | HUPCL | CLOCAL; mxvar_sdriver->init_termios.c_cflag = B9600|CS8|CREAD|HUPCL|CLOCAL;
mxvar_sdriver->flags = TTY_DRIVER_REAL_RAW; mxvar_sdriver->flags = TTY_DRIVER_REAL_RAW;
tty_set_operations(mxvar_sdriver, &mxser_ops); tty_set_operations(mxvar_sdriver, &mxser_ops);
mxvar_sdriver->ttys = mxvar_tty; mxvar_sdriver->ttys = mxvar_tty;
...@@ -739,23 +745,29 @@ static int mxser_init(void) ...@@ -739,23 +745,29 @@ static int mxser_init(void)
/* Start finding ISA boards here */ /* Start finding ISA boards here */
for (b = 0; b < MXSER_BOARDS && m < MXSER_BOARDS; b++) { for (b = 0; b < MXSER_BOARDS && m < MXSER_BOARDS; b++) {
int cap; int cap;
if (!(cap = mxserBoardCAP[b])) if (!(cap = mxserBoardCAP[b]))
continue; continue;
retval = mxser_get_ISA_conf(cap, &hwconf); retval = mxser_get_ISA_conf(cap, &hwconf);
if (retval != 0) if (retval != 0)
printk(KERN_INFO "Found MOXA %s board (CAP=0x%x)\n", mxser_brdname[hwconf.board_type - 1], ioaddr[b]); printk(KERN_INFO "Found MOXA %s board (CAP=0x%x)\n",
mxser_brdname[hwconf.board_type - 1], ioaddr[b]);
if (retval <= 0) { if (retval <= 0) {
if (retval == MXSER_ERR_IRQ) if (retval == MXSER_ERR_IRQ)
printk(KERN_ERR "Invalid interrupt number,board not configured\n"); printk(KERN_ERR "Invalid interrupt number, "
"board not configured\n");
else if (retval == MXSER_ERR_IRQ_CONFLIT) else if (retval == MXSER_ERR_IRQ_CONFLIT)
printk(KERN_ERR "Invalid interrupt number,board not configured\n"); printk(KERN_ERR "Invalid interrupt number, "
"board not configured\n");
else if (retval == MXSER_ERR_VECTOR) else if (retval == MXSER_ERR_VECTOR)
printk(KERN_ERR "Invalid interrupt vector,board not configured\n"); printk(KERN_ERR "Invalid interrupt vector, "
"board not configured\n");
else if (retval == MXSER_ERR_IOADDR) else if (retval == MXSER_ERR_IOADDR)
printk(KERN_ERR "Invalid I/O address,board not configured\n"); printk(KERN_ERR "Invalid I/O address, "
"board not configured\n");
continue; continue;
} }
...@@ -765,35 +777,43 @@ static int mxser_init(void) ...@@ -765,35 +777,43 @@ static int mxser_init(void)
hwconf.pciInfo.pdev = NULL; hwconf.pciInfo.pdev = NULL;
mxser_getcfg(m, &hwconf); mxser_getcfg(m, &hwconf);
//init mxsercfg first, or mxsercfg data is not correct on ISR. /*
//mxser_initbrd will hook ISR. * init mxsercfg first,
* or mxsercfg data is not correct on ISR.
*/
/* mxser_initbrd will hook ISR. */
if (mxser_initbrd(m, &hwconf) < 0) if (mxser_initbrd(m, &hwconf) < 0)
continue; continue;
m++; m++;
} }
/* Start finding ISA boards from module arg */ /* Start finding ISA boards from module arg */
for (b = 0; b < MXSER_BOARDS && m < MXSER_BOARDS; b++) { for (b = 0; b < MXSER_BOARDS && m < MXSER_BOARDS; b++) {
int cap; int cap;
if (!(cap = ioaddr[b])) if (!(cap = ioaddr[b]))
continue; continue;
retval = mxser_get_ISA_conf(cap, &hwconf); retval = mxser_get_ISA_conf(cap, &hwconf);
if (retval != 0) if (retval != 0)
printk(KERN_INFO "Found MOXA %s board (CAP=0x%x)\n", mxser_brdname[hwconf.board_type - 1], ioaddr[b]); printk(KERN_INFO "Found MOXA %s board (CAP=0x%x)\n",
mxser_brdname[hwconf.board_type - 1], ioaddr[b]);
if (retval <= 0) { if (retval <= 0) {
if (retval == MXSER_ERR_IRQ) if (retval == MXSER_ERR_IRQ)
printk(KERN_ERR "Invalid interrupt number,board not configured\n"); printk(KERN_ERR "Invalid interrupt number, "
"board not configured\n");
else if (retval == MXSER_ERR_IRQ_CONFLIT) else if (retval == MXSER_ERR_IRQ_CONFLIT)
printk(KERN_ERR "Invalid interrupt number,board not configured\n"); printk(KERN_ERR "Invalid interrupt number, "
"board not configured\n");
else if (retval == MXSER_ERR_VECTOR) else if (retval == MXSER_ERR_VECTOR)
printk(KERN_ERR "Invalid interrupt vector,board not configured\n"); printk(KERN_ERR "Invalid interrupt vector, "
"board not configured\n");
else if (retval == MXSER_ERR_IOADDR) else if (retval == MXSER_ERR_IOADDR)
printk(KERN_ERR "Invalid I/O address,board not configured\n"); printk(KERN_ERR "Invalid I/O address, "
"board not configured\n");
continue; continue;
} }
...@@ -803,8 +823,11 @@ static int mxser_init(void) ...@@ -803,8 +823,11 @@ static int mxser_init(void)
hwconf.pciInfo.pdev = NULL; hwconf.pciInfo.pdev = NULL;
mxser_getcfg(m, &hwconf); mxser_getcfg(m, &hwconf);
//init mxsercfg first, or mxsercfg data is not correct on ISR. /*
//mxser_initbrd will hook ISR. * init mxsercfg first,
* or mxsercfg data is not correct on ISR.
*/
/* mxser_initbrd will hook ISR. */
if (mxser_initbrd(m, &hwconf) < 0) if (mxser_initbrd(m, &hwconf) < 0)
continue; continue;
...@@ -817,7 +840,8 @@ static int mxser_init(void) ...@@ -817,7 +840,8 @@ static int mxser_init(void)
index = 0; index = 0;
b = 0; b = 0;
while (b < n) { while (b < n) {
pdev = pci_find_device(mxser_pcibrds[b].vendor, mxser_pcibrds[b].device, pdev); pdev = pci_find_device(mxser_pcibrds[b].vendor,
mxser_pcibrds[b].device, pdev);
if (pdev == NULL) { if (pdev == NULL) {
b++; b++;
continue; continue;
...@@ -825,30 +849,48 @@ static int mxser_init(void) ...@@ -825,30 +849,48 @@ static int mxser_init(void)
hwconf.pciInfo.busNum = busnum = pdev->bus->number; hwconf.pciInfo.busNum = busnum = pdev->bus->number;
hwconf.pciInfo.devNum = devnum = PCI_SLOT(pdev->devfn) << 3; hwconf.pciInfo.devNum = devnum = PCI_SLOT(pdev->devfn) << 3;
hwconf.pciInfo.pdev = pdev; hwconf.pciInfo.pdev = pdev;
printk(KERN_INFO "Found MOXA %s board(BusNo=%d,DevNo=%d)\n", mxser_brdname[(int) (mxser_pcibrds[b].driver_data) - 1], busnum, devnum >> 3); printk(KERN_INFO "Found MOXA %s board(BusNo=%d,DevNo=%d)\n",
mxser_brdname[(int) (mxser_pcibrds[b].driver_data) - 1],
busnum, devnum >> 3);
index++; index++;
if (m >= MXSER_BOARDS) { if (m >= MXSER_BOARDS)
printk(KERN_ERR "Too many Smartio/Industio family boards find (maximum %d),board not configured\n", MXSER_BOARDS); printk(KERN_ERR
} else { "Too many Smartio/Industio family boards find "
"(maximum %d), board not configured\n",
MXSER_BOARDS);
else {
if (pci_enable_device(pdev)) { if (pci_enable_device(pdev)) {
printk(KERN_ERR "Moxa SmartI/O PCI enable fail !\n"); printk(KERN_ERR "Moxa SmartI/O PCI enable "
"fail !\n");
continue; continue;
} }
retval = mxser_get_PCI_conf(busnum, devnum, (int) mxser_pcibrds[b].driver_data, &hwconf); retval = mxser_get_PCI_conf(busnum, devnum,
(int)mxser_pcibrds[b].driver_data,
&hwconf);
if (retval < 0) { if (retval < 0) {
if (retval == MXSER_ERR_IRQ) if (retval == MXSER_ERR_IRQ)
printk(KERN_ERR "Invalid interrupt number,board not configured\n"); printk(KERN_ERR
"Invalid interrupt number, "
"board not configured\n");
else if (retval == MXSER_ERR_IRQ_CONFLIT) else if (retval == MXSER_ERR_IRQ_CONFLIT)
printk(KERN_ERR "Invalid interrupt number,board not configured\n"); printk(KERN_ERR
"Invalid interrupt number, "
"board not configured\n");
else if (retval == MXSER_ERR_VECTOR) else if (retval == MXSER_ERR_VECTOR)
printk(KERN_ERR "Invalid interrupt vector,board not configured\n"); printk(KERN_ERR
"Invalid interrupt vector, "
"board not configured\n");
else if (retval == MXSER_ERR_IOADDR) else if (retval == MXSER_ERR_IOADDR)
printk(KERN_ERR "Invalid I/O address,board not configured\n"); printk(KERN_ERR
"Invalid I/O address, "
"board not configured\n");
continue; continue;
} }
mxser_getcfg(m, &hwconf); mxser_getcfg(m, &hwconf);
//init mxsercfg first, or mxsercfg data is not correct on ISR. /* init mxsercfg first,
//mxser_initbrd will hook ISR. * or mxsercfg data is not correct on ISR.
*/
/* mxser_initbrd will hook ISR. */
if (mxser_initbrd(m, &hwconf) < 0) if (mxser_initbrd(m, &hwconf) < 0)
continue; continue;
m++; m++;
...@@ -858,7 +900,8 @@ static int mxser_init(void) ...@@ -858,7 +900,8 @@ static int mxser_init(void)
retval = tty_register_driver(mxvar_sdriver); retval = tty_register_driver(mxvar_sdriver);
if (retval) { if (retval) {
printk(KERN_ERR "Couldn't install MOXA Smartio/Industio family driver !\n"); printk(KERN_ERR "Couldn't install MOXA Smartio/Industio family"
" driver !\n");
put_tty_driver(mxvar_sdriver); put_tty_driver(mxvar_sdriver);
for (i = 0; i < MXSER_BOARDS; i++) { for (i = 0; i < MXSER_BOARDS; i++) {
...@@ -866,7 +909,7 @@ static int mxser_init(void) ...@@ -866,7 +909,7 @@ static int mxser_init(void)
continue; continue;
else { else {
free_irq(mxsercfg[i].irq, &mxvar_table[i * MXSER_PORTS_PER_BOARD]); free_irq(mxsercfg[i].irq, &mxvar_table[i * MXSER_PORTS_PER_BOARD]);
//todo: release io, vector /* todo: release io, vector */
} }
} }
return retval; return retval;
...@@ -926,7 +969,7 @@ static int mxser_open(struct tty_struct *tty, struct file *filp) ...@@ -926,7 +969,7 @@ static int mxser_open(struct tty_struct *tty, struct file *filp)
return -ENODEV; return -ENODEV;
info = mxvar_table + line; info = mxvar_table + line;
if (!info->base) if (!info->base)
return (-ENODEV); return -ENODEV;
tty->driver_data = info; tty->driver_data = info;
info->tty = tty; info->tty = tty;
...@@ -935,11 +978,11 @@ static int mxser_open(struct tty_struct *tty, struct file *filp) ...@@ -935,11 +978,11 @@ static int mxser_open(struct tty_struct *tty, struct file *filp)
*/ */
retval = mxser_startup(info); retval = mxser_startup(info);
if (retval) if (retval)
return (retval); return retval;
retval = mxser_block_til_ready(tty, filp, info); retval = mxser_block_til_ready(tty, filp, info);
if (retval) if (retval)
return (retval); return retval;
info->count++; info->count++;
...@@ -955,11 +998,12 @@ static int mxser_open(struct tty_struct *tty, struct file *filp) ...@@ -955,11 +998,12 @@ static int mxser_open(struct tty_struct *tty, struct file *filp)
info->pgrp = process_group(current); info->pgrp = process_group(current);
clear_bit(TTY_DONT_FLIP, &tty->flags); clear_bit(TTY_DONT_FLIP, &tty->flags);
//status = mxser_get_msr(info->base, 0, info->port); /*
//mxser_check_modem_status(info, status); status = mxser_get_msr(info->base, 0, info->port);
mxser_check_modem_status(info, status);
*/
/* unmark here for very high baud rate (ex. 921600 bps) used /* unmark here for very high baud rate (ex. 921600 bps) used */
*/
tty->low_latency = 1; tty->low_latency = 1;
return 0; return 0;
} }
...@@ -997,11 +1041,13 @@ static void mxser_close(struct tty_struct *tty, struct file *filp) ...@@ -997,11 +1041,13 @@ static void mxser_close(struct tty_struct *tty, struct file *filp)
* one, we've got real problems, since it means the * one, we've got real problems, since it means the
* serial port won't be shutdown. * serial port won't be shutdown.
*/ */
printk(KERN_ERR "mxser_close: bad serial port count; tty->count is 1, " "info->count is %d\n", info->count); printk(KERN_ERR "mxser_close: bad serial port count; "
"tty->count is 1, info->count is %d\n", info->count);
info->count = 1; info->count = 1;
} }
if (--info->count < 0) { if (--info->count < 0) {
printk(KERN_ERR "mxser_close: bad serial port count for ttys%d: %d\n", info->port, info->count); printk(KERN_ERR "mxser_close: bad serial port count for "
"ttys%d: %d\n", info->port, info->count);
info->count = 0; info->count = 0;
} }
if (info->count) { if (info->count) {
...@@ -1056,7 +1102,7 @@ static void mxser_close(struct tty_struct *tty, struct file *filp) ...@@ -1056,7 +1102,7 @@ static void mxser_close(struct tty_struct *tty, struct file *filp)
ld = tty_ldisc_ref(tty); ld = tty_ldisc_ref(tty);
if (ld) { if (ld) {
if(ld->flush_buffer) if (ld->flush_buffer)
ld->flush_buffer(tty); ld->flush_buffer(tty);
tty_ldisc_deref(ld); tty_ldisc_deref(ld);
} }
...@@ -1082,27 +1128,30 @@ static int mxser_write(struct tty_struct *tty, const unsigned char *buf, int cou ...@@ -1082,27 +1128,30 @@ static int mxser_write(struct tty_struct *tty, const unsigned char *buf, int cou
unsigned long flags; unsigned long flags;
if (!info->xmit_buf) if (!info->xmit_buf)
return (0); return 0;
while (1) { while (1) {
c = min_t(int, count, min(SERIAL_XMIT_SIZE - info->xmit_cnt - 1, SERIAL_XMIT_SIZE - info->xmit_head)); c = min_t(int, count, min(SERIAL_XMIT_SIZE - info->xmit_cnt - 1,
SERIAL_XMIT_SIZE - info->xmit_head));
if (c <= 0) if (c <= 0)
break; break;
memcpy(info->xmit_buf + info->xmit_head, buf, c); memcpy(info->xmit_buf + info->xmit_head, buf, c);
spin_lock_irqsave(&info->slock, flags); spin_lock_irqsave(&info->slock, flags);
info->xmit_head = (info->xmit_head + c) & (SERIAL_XMIT_SIZE - 1); info->xmit_head = (info->xmit_head + c) &
(SERIAL_XMIT_SIZE - 1);
info->xmit_cnt += c; info->xmit_cnt += c;
spin_unlock_irqrestore(&info->slock, flags); spin_unlock_irqrestore(&info->slock, flags);
buf += c; buf += c;
count -= c; count -= c;
total += c; total += c;
} }
if (info->xmit_cnt && !tty->stopped && !(info->IER & UART_IER_THRI)) { if (info->xmit_cnt && !tty->stopped && !(info->IER & UART_IER_THRI)) {
if (!tty->hw_stopped || (info->type == PORT_16550A) || (info->IsMoxaMustChipFlag)) { if (!tty->hw_stopped ||
(info->type == PORT_16550A) ||
(info->IsMoxaMustChipFlag)) {
spin_lock_irqsave(&info->slock, flags); spin_lock_irqsave(&info->slock, flags);
info->IER |= UART_IER_THRI; info->IER |= UART_IER_THRI;
outb(info->IER, info->base + UART_IER); outb(info->IER, info->base + UART_IER);
...@@ -1129,7 +1178,9 @@ static void mxser_put_char(struct tty_struct *tty, unsigned char ch) ...@@ -1129,7 +1178,9 @@ static void mxser_put_char(struct tty_struct *tty, unsigned char ch)
info->xmit_cnt++; info->xmit_cnt++;
spin_unlock_irqrestore(&info->slock, flags); spin_unlock_irqrestore(&info->slock, flags);
if (!tty->stopped && !(info->IER & UART_IER_THRI)) { if (!tty->stopped && !(info->IER & UART_IER_THRI)) {
if (!tty->hw_stopped || (info->type == PORT_16550A) || info->IsMoxaMustChipFlag) { if (!tty->hw_stopped ||
(info->type == PORT_16550A) ||
info->IsMoxaMustChipFlag) {
spin_lock_irqsave(&info->slock, flags); spin_lock_irqsave(&info->slock, flags);
info->IER |= UART_IER_THRI; info->IER |= UART_IER_THRI;
outb(info->IER, info->base + UART_IER); outb(info->IER, info->base + UART_IER);
...@@ -1144,7 +1195,13 @@ static void mxser_flush_chars(struct tty_struct *tty) ...@@ -1144,7 +1195,13 @@ static void mxser_flush_chars(struct tty_struct *tty)
struct mxser_struct *info = tty->driver_data; struct mxser_struct *info = tty->driver_data;
unsigned long flags; unsigned long flags;
if (info->xmit_cnt <= 0 || tty->stopped || !info->xmit_buf || (tty->hw_stopped && (info->type != PORT_16550A) && (!info->IsMoxaMustChipFlag))) if (info->xmit_cnt <= 0 ||
tty->stopped ||
!info->xmit_buf ||
(tty->hw_stopped &&
(info->type != PORT_16550A) &&
(!info->IsMoxaMustChipFlag)
))
return; return;
spin_lock_irqsave(&info->slock, flags); spin_lock_irqsave(&info->slock, flags);
...@@ -1163,7 +1220,7 @@ static int mxser_write_room(struct tty_struct *tty) ...@@ -1163,7 +1220,7 @@ static int mxser_write_room(struct tty_struct *tty)
ret = SERIAL_XMIT_SIZE - info->xmit_cnt - 1; ret = SERIAL_XMIT_SIZE - info->xmit_cnt - 1;
if (ret < 0) if (ret < 0)
ret = 0; ret = 0;
return (ret); return ret;
} }
static int mxser_chars_in_buffer(struct tty_struct *tty) static int mxser_chars_in_buffer(struct tty_struct *tty)
...@@ -1184,7 +1241,8 @@ static void mxser_flush_buffer(struct tty_struct *tty) ...@@ -1184,7 +1241,8 @@ static void mxser_flush_buffer(struct tty_struct *tty)
/* below added by shinhay */ /* below added by shinhay */
fcr = inb(info->base + UART_FCR); fcr = inb(info->base + UART_FCR);
outb((fcr | UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT), info->base + UART_FCR); outb((fcr | UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT),
info->base + UART_FCR);
outb(fcr, info->base + UART_FCR); outb(fcr, info->base + UART_FCR);
spin_unlock_irqrestore(&info->slock, flags); spin_unlock_irqrestore(&info->slock, flags);
...@@ -1206,9 +1264,9 @@ static int mxser_ioctl(struct tty_struct *tty, struct file *file, unsigned int c ...@@ -1206,9 +1264,9 @@ static int mxser_ioctl(struct tty_struct *tty, struct file *file, unsigned int c
void __user *argp = (void __user *)arg; void __user *argp = (void __user *)arg;
if (tty->index == MXSER_PORTS) if (tty->index == MXSER_PORTS)
return (mxser_ioctl_special(cmd, argp)); return mxser_ioctl_special(cmd, argp);
// following add by Victor Yu. 01-05-2004 /* following add by Victor Yu. 01-05-2004 */
if (cmd == MOXA_SET_OP_MODE || cmd == MOXA_GET_OP_MODE) { if (cmd == MOXA_SET_OP_MODE || cmd == MOXA_GET_OP_MODE) {
int opmode, p; int opmode, p;
static unsigned char ModeMask[] = { 0xfc, 0xf3, 0xcf, 0x3f }; static unsigned char ModeMask[] = { 0xfc, 0xf3, 0xcf, 0x3f };
...@@ -1219,7 +1277,10 @@ static int mxser_ioctl(struct tty_struct *tty, struct file *file, unsigned int c ...@@ -1219,7 +1277,10 @@ static int mxser_ioctl(struct tty_struct *tty, struct file *file, unsigned int c
if (cmd == MOXA_SET_OP_MODE) { if (cmd == MOXA_SET_OP_MODE) {
if (get_user(opmode, (int __user *) argp)) if (get_user(opmode, (int __user *) argp))
return -EFAULT; return -EFAULT;
if (opmode != RS232_MODE && opmode != RS485_2WIRE_MODE && opmode != RS422_MODE && opmode != RS485_4WIRE_MODE) if (opmode != RS232_MODE &&
opmode != RS485_2WIRE_MODE &&
opmode != RS422_MODE &&
opmode != RS485_4WIRE_MODE)
return -EFAULT; return -EFAULT;
mask = ModeMask[p]; mask = ModeMask[p];
shiftbit = p * 2; shiftbit = p * 2;
...@@ -1236,36 +1297,36 @@ static int mxser_ioctl(struct tty_struct *tty, struct file *file, unsigned int c ...@@ -1236,36 +1297,36 @@ static int mxser_ioctl(struct tty_struct *tty, struct file *file, unsigned int c
} }
return 0; return 0;
} }
// above add by Victor Yu. 01-05-2004 /* above add by Victor Yu. 01-05-2004 */
if ((cmd != TIOCGSERIAL) && (cmd != TIOCMIWAIT) && (cmd != TIOCGICOUNT)) { if ((cmd != TIOCGSERIAL) && (cmd != TIOCMIWAIT) && (cmd != TIOCGICOUNT)) {
if (tty->flags & (1 << TTY_IO_ERROR)) if (tty->flags & (1 << TTY_IO_ERROR))
return (-EIO); return -EIO;
} }
switch (cmd) { switch (cmd) {
case TCSBRK: /* SVID version: non-zero arg --> no break */ case TCSBRK: /* SVID version: non-zero arg --> no break */
retval = tty_check_change(tty); retval = tty_check_change(tty);
if (retval) if (retval)
return (retval); return retval;
tty_wait_until_sent(tty, 0); tty_wait_until_sent(tty, 0);
if (!arg) if (!arg)
mxser_send_break(info, HZ / 4); /* 1/4 second */ mxser_send_break(info, HZ / 4); /* 1/4 second */
return (0); return 0;
case TCSBRKP: /* support for POSIX tcsendbreak() */ case TCSBRKP: /* support for POSIX tcsendbreak() */
retval = tty_check_change(tty); retval = tty_check_change(tty);
if (retval) if (retval)
return (retval); return retval;
tty_wait_until_sent(tty, 0); tty_wait_until_sent(tty, 0);
mxser_send_break(info, arg ? arg * (HZ / 10) : HZ / 4); mxser_send_break(info, arg ? arg * (HZ / 10) : HZ / 4);
return (0); return 0;
case TIOCGSOFTCAR: case TIOCGSOFTCAR:
return put_user(C_CLOCAL(tty) ? 1 : 0, (unsigned long __user *) argp); return put_user(C_CLOCAL(tty) ? 1 : 0, (unsigned long __user *)argp);
case TIOCSSOFTCAR: case TIOCSSOFTCAR:
if (get_user(templ, (unsigned long __user *) argp)) if (get_user(templ, (unsigned long __user *) argp))
return -EFAULT; return -EFAULT;
arg = templ; arg = templ;
tty->termios->c_cflag = ((tty->termios->c_cflag & ~CLOCAL) | (arg ? CLOCAL : 0)); tty->termios->c_cflag = ((tty->termios->c_cflag & ~CLOCAL) | (arg ? CLOCAL : 0));
return (0); return 0;
case TIOCGSERIAL: case TIOCGSERIAL:
return mxser_get_serial_info(info, argp); return mxser_get_serial_info(info, argp);
case TIOCSSERIAL: case TIOCSSERIAL:
...@@ -1278,7 +1339,7 @@ static int mxser_ioctl(struct tty_struct *tty, struct file *file, unsigned int c ...@@ -1278,7 +1339,7 @@ static int mxser_ioctl(struct tty_struct *tty, struct file *file, unsigned int c
* (use |'ed TIOCM_RNG/DSR/CD/CTS for masking) * (use |'ed TIOCM_RNG/DSR/CD/CTS for masking)
* Caller should use TIOCGICOUNT to see which one it was * Caller should use TIOCGICOUNT to see which one it was
*/ */
case TIOCMIWAIT:{ case TIOCMIWAIT: {
DECLARE_WAITQUEUE(wait, current); DECLARE_WAITQUEUE(wait, current);
int ret; int ret;
spin_lock_irqsave(&info->slock, flags); spin_lock_irqsave(&info->slock, flags);
...@@ -1292,7 +1353,14 @@ static int mxser_ioctl(struct tty_struct *tty, struct file *file, unsigned int c ...@@ -1292,7 +1353,14 @@ static int mxser_ioctl(struct tty_struct *tty, struct file *file, unsigned int c
spin_unlock_irqrestore(&info->slock, flags); spin_unlock_irqrestore(&info->slock, flags);
set_current_state(TASK_INTERRUPTIBLE); set_current_state(TASK_INTERRUPTIBLE);
if (((arg & TIOCM_RNG) && (cnow.rng != cprev.rng)) || ((arg & TIOCM_DSR) && (cnow.dsr != cprev.dsr)) || ((arg & TIOCM_CD) && (cnow.dcd != cprev.dcd)) || ((arg & TIOCM_CTS) && (cnow.cts != cprev.cts))) { if (((arg & TIOCM_RNG) &&
(cnow.rng != cprev.rng)) ||
((arg & TIOCM_DSR) &&
(cnow.dsr != cprev.dsr)) ||
((arg & TIOCM_CD) &&
(cnow.dcd != cprev.dcd)) ||
((arg & TIOCM_CTS) &&
(cnow.cts != cprev.cts))) {
ret = 0; ret = 0;
break; break;
} }
...@@ -1338,21 +1406,18 @@ static int mxser_ioctl(struct tty_struct *tty, struct file *file, unsigned int c ...@@ -1338,21 +1406,18 @@ static int mxser_ioctl(struct tty_struct *tty, struct file *file, unsigned int c
put_user(cnow.dsr, &p_cuser->dsr); put_user(cnow.dsr, &p_cuser->dsr);
put_user(cnow.rng, &p_cuser->rng); put_user(cnow.rng, &p_cuser->rng);
put_user(cnow.dcd, &p_cuser->dcd); put_user(cnow.dcd, &p_cuser->dcd);
/* */
return 0; return 0;
case MOXA_HighSpeedOn: case MOXA_HighSpeedOn:
return put_user(info->baud_base != 115200 ? 1 : 0, (int __user *) argp); return put_user(info->baud_base != 115200 ? 1 : 0, (int __user *)argp);
case MOXA_SDS_RSTICOUNTER: {
case MOXA_SDS_RSTICOUNTER:{
info->mon_data.rxcnt = 0; info->mon_data.rxcnt = 0;
info->mon_data.txcnt = 0; info->mon_data.txcnt = 0;
return 0; return 0;
} }
// (above) added by James. /* (above) added by James. */
case MOXA_ASPP_SETBAUD:{ case MOXA_ASPP_SETBAUD:{
long baud; long baud;
if (get_user(baud, (long __user *) argp)) if (get_user(baud, (long __user *)argp))
return -EFAULT; return -EFAULT;
mxser_set_baud(info, baud); mxser_set_baud(info, baud);
return 0; return 0;
...@@ -1377,9 +1442,10 @@ static int mxser_ioctl(struct tty_struct *tty, struct file *file, unsigned int c ...@@ -1377,9 +1442,10 @@ static int mxser_ioctl(struct tty_struct *tty, struct file *file, unsigned int c
return 0; return 0;
} }
case MOXA_ASPP_MON:{ case MOXA_ASPP_MON: {
int mcr, status; int mcr, status;
// info->mon_data.ser_param = tty->termios->c_cflag;
/* info->mon_data.ser_param = tty->termios->c_cflag; */
status = mxser_get_msr(info->base, 1, info->port, info); status = mxser_get_msr(info->base, 1, info->port, info);
mxser_check_modem_status(info, status); mxser_check_modem_status(info, status);
...@@ -1400,25 +1466,25 @@ static int mxser_ioctl(struct tty_struct *tty, struct file *file, unsigned int c ...@@ -1400,25 +1466,25 @@ static int mxser_ioctl(struct tty_struct *tty, struct file *file, unsigned int c
else else
info->mon_data.hold_reason &= ~NPPI_NOTIFY_CTSHOLD; info->mon_data.hold_reason &= ~NPPI_NOTIFY_CTSHOLD;
if (copy_to_user(argp, &info->mon_data,
if (copy_to_user(argp, &info->mon_data, sizeof(struct mxser_mon))) sizeof(struct mxser_mon)))
return -EFAULT; return -EFAULT;
return 0; return 0;
} }
case MOXA_ASPP_LSTATUS:{ case MOXA_ASPP_LSTATUS: {
if (copy_to_user(argp, &info->err_shadow, sizeof(unsigned char))) if (copy_to_user(argp, &info->err_shadow,
sizeof(unsigned char)))
return -EFAULT; return -EFAULT;
info->err_shadow = 0; info->err_shadow = 0;
return 0; return 0;
} }
case MOXA_SET_BAUD_METHOD:{ case MOXA_SET_BAUD_METHOD: {
int method; int method;
if (get_user(method, (int __user *) argp))
if (get_user(method, (int __user *)argp))
return -EFAULT; return -EFAULT;
mxser_set_baud_method[info->port] = method; mxser_set_baud_method[info->port] = method;
if (copy_to_user(argp, &method, sizeof(int))) if (copy_to_user(argp, &method, sizeof(int)))
...@@ -1442,7 +1508,8 @@ static int mxser_ioctl_special(unsigned int cmd, void __user *argp) ...@@ -1442,7 +1508,8 @@ static int mxser_ioctl_special(unsigned int cmd, void __user *argp)
switch (cmd) { switch (cmd) {
case MOXA_GET_CONF: case MOXA_GET_CONF:
if (copy_to_user(argp, mxsercfg, sizeof(struct mxser_hwconf) * 4)) if (copy_to_user(argp, mxsercfg,
sizeof(struct mxser_hwconf) * 4))
return -EFAULT; return -EFAULT;
return 0; return 0;
case MOXA_GET_MAJOR: case MOXA_GET_MAJOR:
...@@ -1461,11 +1528,11 @@ static int mxser_ioctl_special(unsigned int cmd, void __user *argp) ...@@ -1461,11 +1528,11 @@ static int mxser_ioctl_special(unsigned int cmd, void __user *argp)
if (mxvar_table[i].base) if (mxvar_table[i].base)
result |= (1 << i); result |= (1 << i);
} }
return put_user(result, (unsigned long __user *) argp); return put_user(result, (unsigned long __user *)argp);
case MOXA_GETDATACOUNT: case MOXA_GETDATACOUNT:
if (copy_to_user(argp, &mxvar_log, sizeof(mxvar_log))) if (copy_to_user(argp, &mxvar_log, sizeof(mxvar_log)))
return -EFAULT; return -EFAULT;
return (0); return 0;
case MOXA_GETMSTATUS: case MOXA_GETMSTATUS:
for (i = 0; i < MXSER_PORTS; i++) { for (i = 0; i < MXSER_PORTS; i++) {
GMStatus[i].ri = 0; GMStatus[i].ri = 0;
...@@ -1498,22 +1565,26 @@ static int mxser_ioctl_special(unsigned int cmd, void __user *argp) ...@@ -1498,22 +1565,26 @@ static int mxser_ioctl_special(unsigned int cmd, void __user *argp)
else else
GMStatus[i].cts = 0; GMStatus[i].cts = 0;
} }
if (copy_to_user(argp, GMStatus, sizeof(struct mxser_mstatus) * MXSER_PORTS)) if (copy_to_user(argp, GMStatus,
sizeof(struct mxser_mstatus) * MXSER_PORTS))
return -EFAULT; return -EFAULT;
return 0; return 0;
case MOXA_ASPP_MON_EXT:{ case MOXA_ASPP_MON_EXT: {
int status; int status;
int opmode, p; int opmode, p;
int shiftbit; int shiftbit;
unsigned cflag, iflag; unsigned cflag, iflag;
for (i = 0; i < MXSER_PORTS; i++) { for (i = 0; i < MXSER_PORTS; i++) {
if (!mxvar_table[i].base) if (!mxvar_table[i].base)
continue; continue;
status = mxser_get_msr(mxvar_table[i].base, 0, i, &(mxvar_table[i])); status = mxser_get_msr(mxvar_table[i].base, 0,
// mxser_check_modem_status(&mxvar_table[i], status); i, &(mxvar_table[i]));
/*
mxser_check_modem_status(&mxvar_table[i],
status);
*/
if (status & UART_MSR_TERI) if (status & UART_MSR_TERI)
mxvar_table[i].icount.rng++; mxvar_table[i].icount.rng++;
if (status & UART_MSR_DDSR) if (status & UART_MSR_DDSR)
...@@ -1578,75 +1649,76 @@ static int mxser_ioctl_special(unsigned int cmd, void __user *argp) ...@@ -1578,75 +1649,76 @@ static int mxser_ioctl_special(unsigned int cmd, void __user *argp)
return 0; return 0;
} }
static void mxser_stoprx(struct tty_struct *tty) static void mxser_stoprx(struct tty_struct *tty)
{ {
struct mxser_struct *info = tty->driver_data; struct mxser_struct *info = tty->driver_data;
//unsigned long flags; /* unsigned long flags; */
info->ldisc_stop_rx = 1; info->ldisc_stop_rx = 1;
if (I_IXOFF(tty)) { if (I_IXOFF(tty)) {
/* MX_LOCK(&info->slock); */
//MX_LOCK(&info->slock); /* following add by Victor Yu. 09-02-2002 */
// following add by Victor Yu. 09-02-2002
if (info->IsMoxaMustChipFlag) { if (info->IsMoxaMustChipFlag) {
info->IER &= ~MOXA_MUST_RECV_ISR; info->IER &= ~MOXA_MUST_RECV_ISR;
outb(info->IER, info->base + UART_IER); outb(info->IER, info->base + UART_IER);
} else { } else {
// above add by Victor Yu. 09-02-2002 /* above add by Victor Yu. 09-02-2002 */
info->x_char = STOP_CHAR(tty); info->x_char = STOP_CHAR(tty);
// outb(info->IER, 0); // mask by Victor Yu. 09-02-2002 /* mask by Victor Yu. 09-02-2002 */
/* outb(info->IER, 0); */
outb(0, info->base + UART_IER); outb(0, info->base + UART_IER);
info->IER |= UART_IER_THRI; info->IER |= UART_IER_THRI;
outb(info->IER, info->base + UART_IER); /* force Tx interrupt */ /* force Tx interrupt */
} // add by Victor Yu. 09-02-2002 outb(info->IER, info->base + UART_IER);
//MX_UNLOCK(&info->slock); } /* add by Victor Yu. 09-02-2002 */
/* MX_UNLOCK(&info->slock); */
} }
if (info->tty->termios->c_cflag & CRTSCTS) { if (info->tty->termios->c_cflag & CRTSCTS) {
//MX_LOCK(&info->slock); /* MX_LOCK(&info->slock); */
info->MCR &= ~UART_MCR_RTS; info->MCR &= ~UART_MCR_RTS;
outb(info->MCR, info->base + UART_MCR); outb(info->MCR, info->base + UART_MCR);
//MX_UNLOCK(&info->slock); /* MX_UNLOCK(&info->slock); */
} }
} }
static void mxser_startrx(struct tty_struct *tty) static void mxser_startrx(struct tty_struct *tty)
{ {
struct mxser_struct *info = tty->driver_data; struct mxser_struct *info = tty->driver_data;
//unsigned long flags; /* unsigned long flags; */
info->ldisc_stop_rx = 0; info->ldisc_stop_rx = 0;
if (I_IXOFF(tty)) { if (I_IXOFF(tty)) {
if (info->x_char) if (info->x_char)
info->x_char = 0; info->x_char = 0;
else { else {
//MX_LOCK(&info->slock); /* MX_LOCK(&info->slock); */
// following add by Victor Yu. 09-02-2002 /* following add by Victor Yu. 09-02-2002 */
if (info->IsMoxaMustChipFlag) { if (info->IsMoxaMustChipFlag) {
info->IER |= MOXA_MUST_RECV_ISR; info->IER |= MOXA_MUST_RECV_ISR;
outb(info->IER, info->base + UART_IER); outb(info->IER, info->base + UART_IER);
} else { } else {
// above add by Victor Yu. 09-02-2002 /* above add by Victor Yu. 09-02-2002 */
info->x_char = START_CHAR(tty); info->x_char = START_CHAR(tty);
// outb(info->IER, 0); // mask by Victor Yu. 09-02-2002 /* mask by Victor Yu. 09-02-2002 */
outb(0, info->base + UART_IER); // add by Victor Yu. 09-02-2002 /* outb(info->IER, 0); */
info->IER |= UART_IER_THRI; /* force Tx interrupt */ /* add by Victor Yu. 09-02-2002 */
outb(0, info->base + UART_IER);
/* force Tx interrupt */
info->IER |= UART_IER_THRI;
outb(info->IER, info->base + UART_IER); outb(info->IER, info->base + UART_IER);
} // add by Victor Yu. 09-02-2002 } /* add by Victor Yu. 09-02-2002 */
//MX_UNLOCK(&info->slock); /* MX_UNLOCK(&info->slock); */
} }
} }
if (info->tty->termios->c_cflag & CRTSCTS) { if (info->tty->termios->c_cflag & CRTSCTS) {
//MX_LOCK(&info->slock); /* MX_LOCK(&info->slock); */
info->MCR |= UART_MCR_RTS; info->MCR |= UART_MCR_RTS;
outb(info->MCR, info->base + UART_MCR); outb(info->MCR, info->base + UART_MCR);
//MX_UNLOCK(&info->slock); /* MX_UNLOCK(&info->slock); */
} }
} }
...@@ -1656,20 +1728,22 @@ static void mxser_startrx(struct tty_struct *tty) ...@@ -1656,20 +1728,22 @@ static void mxser_startrx(struct tty_struct *tty)
*/ */
static void mxser_throttle(struct tty_struct *tty) static void mxser_throttle(struct tty_struct *tty)
{ {
//struct mxser_struct *info = tty->driver_data; /* struct mxser_struct *info = tty->driver_data; */
//unsigned long flags; /* unsigned long flags; */
//MX_LOCK(&info->slock);
/* MX_LOCK(&info->slock); */
mxser_stoprx(tty); mxser_stoprx(tty);
//MX_UNLOCK(&info->slock); /* MX_UNLOCK(&info->slock); */
} }
static void mxser_unthrottle(struct tty_struct *tty) static void mxser_unthrottle(struct tty_struct *tty)
{ {
//struct mxser_struct *info = tty->driver_data; /* struct mxser_struct *info = tty->driver_data; */
//unsigned long flags; /* unsigned long flags; */
//MX_LOCK(&info->slock);
/* MX_LOCK(&info->slock); */
mxser_startrx(tty); mxser_startrx(tty);
//MX_UNLOCK(&info->slock); /* MX_UNLOCK(&info->slock); */
} }
static void mxser_set_termios(struct tty_struct *tty, struct termios *old_termios) static void mxser_set_termios(struct tty_struct *tty, struct termios *old_termios)
...@@ -1677,27 +1751,30 @@ static void mxser_set_termios(struct tty_struct *tty, struct termios *old_termio ...@@ -1677,27 +1751,30 @@ static void mxser_set_termios(struct tty_struct *tty, struct termios *old_termio
struct mxser_struct *info = tty->driver_data; struct mxser_struct *info = tty->driver_data;
unsigned long flags; unsigned long flags;
if ((tty->termios->c_cflag != old_termios->c_cflag) || (RELEVANT_IFLAG(tty->termios->c_iflag) != RELEVANT_IFLAG(old_termios->c_iflag))) { if ((tty->termios->c_cflag != old_termios->c_cflag) ||
(RELEVANT_IFLAG(tty->termios->c_iflag) != RELEVANT_IFLAG(old_termios->c_iflag))) {
mxser_change_speed(info, old_termios); mxser_change_speed(info, old_termios);
if ((old_termios->c_cflag & CRTSCTS) && !(tty->termios->c_cflag & CRTSCTS)) { if ((old_termios->c_cflag & CRTSCTS) &&
!(tty->termios->c_cflag & CRTSCTS)) {
tty->hw_stopped = 0; tty->hw_stopped = 0;
mxser_start(tty); mxser_start(tty);
} }
} }
/* Handle sw stopped */ /* Handle sw stopped */
if ((old_termios->c_iflag & IXON) && !(tty->termios->c_iflag & IXON)) { if ((old_termios->c_iflag & IXON) &&
!(tty->termios->c_iflag & IXON)) {
tty->stopped = 0; tty->stopped = 0;
// following add by Victor Yu. 09-02-2002 /* following add by Victor Yu. 09-02-2002 */
if (info->IsMoxaMustChipFlag) { if (info->IsMoxaMustChipFlag) {
spin_lock_irqsave(&info->slock, flags); spin_lock_irqsave(&info->slock, flags);
DISABLE_MOXA_MUST_RX_SOFTWARE_FLOW_CONTROL(info->base); DISABLE_MOXA_MUST_RX_SOFTWARE_FLOW_CONTROL(info->base);
spin_unlock_irqrestore(&info->slock, flags); spin_unlock_irqrestore(&info->slock, flags);
} }
// above add by Victor Yu. 09-02-2002 /* above add by Victor Yu. 09-02-2002 */
mxser_start(tty); mxser_start(tty);
} }
...@@ -1777,7 +1854,8 @@ static void mxser_wait_until_sent(struct tty_struct *tty, int timeout) ...@@ -1777,7 +1854,8 @@ static void mxser_wait_until_sent(struct tty_struct *tty, int timeout)
if (!timeout || timeout > 2 * info->timeout) if (!timeout || timeout > 2 * info->timeout)
timeout = 2 * info->timeout; timeout = 2 * info->timeout;
#ifdef SERIAL_DEBUG_RS_WAIT_UNTIL_SENT #ifdef SERIAL_DEBUG_RS_WAIT_UNTIL_SENT
printk(KERN_DEBUG "In rs_wait_until_sent(%d) check=%lu...", timeout, char_time); printk(KERN_DEBUG "In rs_wait_until_sent(%d) check=%lu...",
timeout, char_time);
printk("jiff=%lu...", jiffies); printk("jiff=%lu...", jiffies);
#endif #endif
while (!((lsr = inb(info->base + UART_LSR)) & UART_LSR_TEMT)) { while (!((lsr = inb(info->base + UART_LSR)) & UART_LSR_TEMT)) {
...@@ -1815,7 +1893,7 @@ void mxser_hangup(struct tty_struct *tty) ...@@ -1815,7 +1893,7 @@ void mxser_hangup(struct tty_struct *tty)
} }
// added by James 03-12-2004. /* added by James 03-12-2004. */
/* /*
* mxser_rs_break() --- routine which turns the break handling on or off * mxser_rs_break() --- routine which turns the break handling on or off
*/ */
...@@ -1826,13 +1904,15 @@ static void mxser_rs_break(struct tty_struct *tty, int break_state) ...@@ -1826,13 +1904,15 @@ static void mxser_rs_break(struct tty_struct *tty, int break_state)
spin_lock_irqsave(&info->slock, flags); spin_lock_irqsave(&info->slock, flags);
if (break_state == -1) if (break_state == -1)
outb(inb(info->base + UART_LCR) | UART_LCR_SBC, info->base + UART_LCR); outb(inb(info->base + UART_LCR) | UART_LCR_SBC,
info->base + UART_LCR);
else else
outb(inb(info->base + UART_LCR) & ~UART_LCR_SBC, info->base + UART_LCR); outb(inb(info->base + UART_LCR) & ~UART_LCR_SBC,
info->base + UART_LCR);
spin_unlock_irqrestore(&info->slock, flags); spin_unlock_irqrestore(&info->slock, flags);
} }
// (above) added by James. /* (above) added by James. */
/* /*
...@@ -1848,7 +1928,7 @@ static irqreturn_t mxser_interrupt(int irq, void *dev_id, struct pt_regs *regs) ...@@ -1848,7 +1928,7 @@ static irqreturn_t mxser_interrupt(int irq, void *dev_id, struct pt_regs *regs)
int handled = IRQ_NONE; int handled = IRQ_NONE;
port = NULL; port = NULL;
//spin_lock(&gm_lock); /* spin_lock(&gm_lock); */
for (i = 0; i < MXSER_BOARDS; i++) { for (i = 0; i < MXSER_BOARDS; i++) {
if (dev_id == &(mxvar_table[i * MXSER_PORTS_PER_BOARD])) { if (dev_id == &(mxvar_table[i * MXSER_PORTS_PER_BOARD])) {
...@@ -1857,29 +1937,25 @@ static irqreturn_t mxser_interrupt(int irq, void *dev_id, struct pt_regs *regs) ...@@ -1857,29 +1937,25 @@ static irqreturn_t mxser_interrupt(int irq, void *dev_id, struct pt_regs *regs)
} }
} }
if (i == MXSER_BOARDS) { if (i == MXSER_BOARDS)
goto irq_stop; goto irq_stop;
} if (port == 0)
if (port == 0) {
goto irq_stop; goto irq_stop;
}
max = mxser_numports[mxsercfg[i].board_type - 1]; max = mxser_numports[mxsercfg[i].board_type - 1];
while (1) { while (1) {
irqbits = inb(port->vector) & port->vectormask; irqbits = inb(port->vector) & port->vectormask;
if (irqbits == port->vectormask) { if (irqbits == port->vectormask)
break; break;
}
handled = IRQ_HANDLED; handled = IRQ_HANDLED;
for (i = 0, bits = 1; i < max; i++, irqbits |= bits, bits <<= 1) { for (i = 0, bits = 1; i < max; i++, irqbits |= bits, bits <<= 1) {
if (irqbits == port->vectormask) { if (irqbits == port->vectormask)
break; break;
}
if (bits & irqbits) if (bits & irqbits)
continue; continue;
info = port + i; info = port + i;
// following add by Victor Yu. 09-13-2002 /* following add by Victor Yu. 09-13-2002 */
iir = inb(info->base + UART_IIR); iir = inb(info->base + UART_IIR);
if (iir & UART_IIR_NO_INT) if (iir & UART_IIR_NO_INT)
continue; continue;
...@@ -1890,9 +1966,9 @@ static irqreturn_t mxser_interrupt(int irq, void *dev_id, struct pt_regs *regs) ...@@ -1890,9 +1966,9 @@ static irqreturn_t mxser_interrupt(int irq, void *dev_id, struct pt_regs *regs)
inb(info->base + UART_MSR); inb(info->base + UART_MSR);
continue; continue;
} }
// above add by Victor Yu. 09-13-2002 /* above add by Victor Yu. 09-13-2002 */
/* /*
if ( info->tty->flip.count < TTY_FLIPBUF_SIZE/4 ){ if (info->tty->flip.count < TTY_FLIPBUF_SIZE / 4) {
info->IER |= MOXA_MUST_RECV_ISR; info->IER |= MOXA_MUST_RECV_ISR;
outb(info->IER, info->base + UART_IER); outb(info->IER, info->base + UART_IER);
} }
...@@ -1908,18 +1984,15 @@ static irqreturn_t mxser_interrupt(int irq, void *dev_id, struct pt_regs *regs) ...@@ -1908,18 +1984,15 @@ static irqreturn_t mxser_interrupt(int irq, void *dev_id, struct pt_regs *regs)
status = inb(info->base + UART_LSR) & info->read_status_mask; status = inb(info->base + UART_LSR) & info->read_status_mask;
*/ */
// following add by Victor Yu. 09-02-2002 /* following add by Victor Yu. 09-02-2002 */
status = inb(info->base + UART_LSR); status = inb(info->base + UART_LSR);
if (status & UART_LSR_PE) { if (status & UART_LSR_PE)
info->err_shadow |= NPPI_NOTIFY_PARITY; info->err_shadow |= NPPI_NOTIFY_PARITY;
} if (status & UART_LSR_FE)
if (status & UART_LSR_FE) {
info->err_shadow |= NPPI_NOTIFY_FRAMING; info->err_shadow |= NPPI_NOTIFY_FRAMING;
} if (status & UART_LSR_OE)
if (status & UART_LSR_OE) {
info->err_shadow |= NPPI_NOTIFY_HW_OVERRUN; info->err_shadow |= NPPI_NOTIFY_HW_OVERRUN;
}
if (status & UART_LSR_BI) if (status & UART_LSR_BI)
info->err_shadow |= NPPI_NOTIFY_BREAK; info->err_shadow |= NPPI_NOTIFY_BREAK;
...@@ -1930,11 +2003,14 @@ static irqreturn_t mxser_interrupt(int irq, void *dev_id, struct pt_regs *regs) ...@@ -1930,11 +2003,14 @@ static irqreturn_t mxser_interrupt(int irq, void *dev_id, struct pt_regs *regs)
continue; continue;
} }
*/ */
if (iir == MOXA_MUST_IIR_GDA || iir == MOXA_MUST_IIR_RDA || iir == MOXA_MUST_IIR_RTO || iir == MOXA_MUST_IIR_LSR) if (iir == MOXA_MUST_IIR_GDA ||
iir == MOXA_MUST_IIR_RDA ||
iir == MOXA_MUST_IIR_RTO ||
iir == MOXA_MUST_IIR_LSR)
mxser_receive_chars(info, &status); mxser_receive_chars(info, &status);
} else { } else {
// above add by Victor Yu. 09-02-2002 /* above add by Victor Yu. 09-02-2002 */
status &= info->read_status_mask; status &= info->read_status_mask;
if (status & UART_LSR_DR) if (status & UART_LSR_DR)
...@@ -1944,13 +2020,13 @@ static irqreturn_t mxser_interrupt(int irq, void *dev_id, struct pt_regs *regs) ...@@ -1944,13 +2020,13 @@ static irqreturn_t mxser_interrupt(int irq, void *dev_id, struct pt_regs *regs)
if (msr & UART_MSR_ANY_DELTA) { if (msr & UART_MSR_ANY_DELTA) {
mxser_check_modem_status(info, msr); mxser_check_modem_status(info, msr);
} }
// following add by Victor Yu. 09-13-2002 /* following add by Victor Yu. 09-13-2002 */
if (info->IsMoxaMustChipFlag) { if (info->IsMoxaMustChipFlag) {
if ((iir == 0x02) && (status & UART_LSR_THRE)) { if ((iir == 0x02) && (status & UART_LSR_THRE)) {
mxser_transmit_chars(info); mxser_transmit_chars(info);
} }
} else { } else {
// above add by Victor Yu. 09-13-2002 /* above add by Victor Yu. 09-13-2002 */
if (status & UART_LSR_THRE) { if (status & UART_LSR_THRE) {
/* 8-2-99 by William /* 8-2-99 by William
...@@ -1966,7 +2042,7 @@ static irqreturn_t mxser_interrupt(int irq, void *dev_id, struct pt_regs *regs) ...@@ -1966,7 +2042,7 @@ static irqreturn_t mxser_interrupt(int irq, void *dev_id, struct pt_regs *regs)
} }
irq_stop: irq_stop:
//spin_unlock(&gm_lock); /* spin_unlock(&gm_lock); */
return handled; return handled;
} }
...@@ -1984,56 +2060,58 @@ static void mxser_receive_chars(struct mxser_struct *info, int *status) ...@@ -1984,56 +2060,58 @@ static void mxser_receive_chars(struct mxser_struct *info, int *status)
recv_room = tty->receive_room; recv_room = tty->receive_room;
if ((recv_room == 0) && (!info->ldisc_stop_rx)) { if ((recv_room == 0) && (!info->ldisc_stop_rx)) {
//mxser_throttle(tty); /* mxser_throttle(tty); */
mxser_stoprx(tty); mxser_stoprx(tty);
//return; /* return; */
} }
// following add by Victor Yu. 09-02-2002 /* following add by Victor Yu. 09-02-2002 */
if (info->IsMoxaMustChipFlag != MOXA_OTHER_UART) { if (info->IsMoxaMustChipFlag != MOXA_OTHER_UART) {
if (*status & UART_LSR_SPECIAL) { if (*status & UART_LSR_SPECIAL) {
goto intr_old; goto intr_old;
} }
// following add by Victor Yu. 02-11-2004 /* following add by Victor Yu. 02-11-2004 */
if (info->IsMoxaMustChipFlag == MOXA_MUST_MU860_HWID && (*status & MOXA_MUST_LSR_RERR)) if (info->IsMoxaMustChipFlag == MOXA_MUST_MU860_HWID &&
(*status & MOXA_MUST_LSR_RERR))
goto intr_old; goto intr_old;
// above add by Victor Yu. 02-14-2004 /* above add by Victor Yu. 02-14-2004 */
if (*status & MOXA_MUST_LSR_RERR) if (*status & MOXA_MUST_LSR_RERR)
goto intr_old; goto intr_old;
gdl = inb(info->base + MOXA_MUST_GDL_REGISTER); gdl = inb(info->base + MOXA_MUST_GDL_REGISTER);
if (info->IsMoxaMustChipFlag == MOXA_MUST_MU150_HWID) // add by Victor Yu. 02-11-2004 /* add by Victor Yu. 02-11-2004 */
if (info->IsMoxaMustChipFlag == MOXA_MUST_MU150_HWID)
gdl &= MOXA_MUST_GDL_MASK; gdl &= MOXA_MUST_GDL_MASK;
if (gdl >= recv_room) { if (gdl >= recv_room) {
if (!info->ldisc_stop_rx) { if (!info->ldisc_stop_rx) {
//mxser_throttle(tty); /* mxser_throttle(tty); */
mxser_stoprx(tty); mxser_stoprx(tty);
} }
//return; /* return; */
} }
while (gdl--) { while (gdl--) {
ch = inb(info->base + UART_RX); ch = inb(info->base + UART_RX);
tty_insert_flip_char(tty, ch, 0); tty_insert_flip_char(tty, ch, 0);
cnt++; cnt++;
/* /*
if((cnt>=HI_WATER) && (info->stop_rx==0)){ if ((cnt >= HI_WATER) && (info->stop_rx == 0)) {
mxser_stoprx(tty); mxser_stoprx(tty);
info->stop_rx=1; info->stop_rx = 1;
break; break;
} */ } */
} }
goto end_intr; goto end_intr;
} }
intr_old: intr_old:
// above add by Victor Yu. 09-02-2002 /* above add by Victor Yu. 09-02-2002 */
do { do {
if (max-- < 0) if (max-- < 0)
break; break;
/* /*
if((cnt>=HI_WATER) && (info->stop_rx==0)){ if ((cnt >= HI_WATER) && (info->stop_rx == 0)) {
mxser_stoprx(tty); mxser_stoprx(tty);
info->stop_rx=1; info->stop_rx=1;
break; break;
...@@ -2041,11 +2119,11 @@ intr_old: ...@@ -2041,11 +2119,11 @@ intr_old:
*/ */
ch = inb(info->base + UART_RX); ch = inb(info->base + UART_RX);
// following add by Victor Yu. 09-02-2002 /* following add by Victor Yu. 09-02-2002 */
if (info->IsMoxaMustChipFlag && (*status & UART_LSR_OE) /*&& !(*status&UART_LSR_DR) */ ) if (info->IsMoxaMustChipFlag && (*status & UART_LSR_OE) /*&& !(*status&UART_LSR_DR) */ )
outb(0x23, info->base + UART_FCR); outb(0x23, info->base + UART_FCR);
*status &= info->read_status_mask; *status &= info->read_status_mask;
// above add by Victor Yu. 09-02-2002 /* above add by Victor Yu. 09-02-2002 */
if (*status & info->ignore_status_mask) { if (*status & info->ignore_status_mask) {
if (++ignored > 100) if (++ignored > 100)
break; break;
...@@ -2080,7 +2158,7 @@ intr_old: ...@@ -2080,7 +2158,7 @@ intr_old:
cnt++; cnt++;
if (cnt >= recv_room) { if (cnt >= recv_room) {
if (!info->ldisc_stop_rx) { if (!info->ldisc_stop_rx) {
//mxser_throttle(tty); /* mxser_throttle(tty); */
mxser_stoprx(tty); mxser_stoprx(tty);
} }
break; break;
...@@ -2088,21 +2166,20 @@ intr_old: ...@@ -2088,21 +2166,20 @@ intr_old:
} }
// following add by Victor Yu. 09-02-2002 /* following add by Victor Yu. 09-02-2002 */
if (info->IsMoxaMustChipFlag) if (info->IsMoxaMustChipFlag)
break; break;
// above add by Victor Yu. 09-02-2002 /* above add by Victor Yu. 09-02-2002 */
/* mask by Victor Yu. 09-02-2002 /* mask by Victor Yu. 09-02-2002
*status = inb(info->base + UART_LSR) & info->read_status_mask; *status = inb(info->base + UART_LSR) & info->read_status_mask;
*/ */
// following add by Victor Yu. 09-02-2002 /* following add by Victor Yu. 09-02-2002 */
*status = inb(info->base + UART_LSR); *status = inb(info->base + UART_LSR);
// above add by Victor Yu. 09-02-2002 /* above add by Victor Yu. 09-02-2002 */
} while (*status & UART_LSR_DR); } while (*status & UART_LSR_DR);
end_intr: // add by Victor Yu. 09-02-2002 end_intr: /* add by Victor Yu. 09-02-2002 */
mxvar_log.rxcnt[info->port] += cnt; mxvar_log.rxcnt[info->port] += cnt;
info->mon_data.rxcnt += cnt; info->mon_data.rxcnt += cnt;
info->mon_data.up_rxcnt += cnt; info->mon_data.up_rxcnt += cnt;
...@@ -2137,7 +2214,10 @@ static void mxser_transmit_chars(struct mxser_struct *info) ...@@ -2137,7 +2214,10 @@ static void mxser_transmit_chars(struct mxser_struct *info)
return; return;
} }
if ((info->xmit_cnt <= 0) || info->tty->stopped || (info->tty->hw_stopped && (info->type != PORT_16550A) && (!info->IsMoxaMustChipFlag))) { if ((info->xmit_cnt <= 0) || info->tty->stopped ||
(info->tty->hw_stopped &&
(info->type != PORT_16550A) &&
(!info->IsMoxaMustChipFlag))) {
info->IER &= ~UART_IER_THRI; info->IER &= ~UART_IER_THRI;
outb(info->IER, info->base + UART_IER); outb(info->IER, info->base + UART_IER);
spin_unlock_irqrestore(&info->slock, flags); spin_unlock_irqrestore(&info->slock, flags);
...@@ -2147,17 +2227,18 @@ static void mxser_transmit_chars(struct mxser_struct *info) ...@@ -2147,17 +2227,18 @@ static void mxser_transmit_chars(struct mxser_struct *info)
cnt = info->xmit_cnt; cnt = info->xmit_cnt;
count = info->xmit_fifo_size; count = info->xmit_fifo_size;
do { do {
outb(info->xmit_buf[info->xmit_tail++], info->base + UART_TX); outb(info->xmit_buf[info->xmit_tail++],
info->base + UART_TX);
info->xmit_tail = info->xmit_tail & (SERIAL_XMIT_SIZE - 1); info->xmit_tail = info->xmit_tail & (SERIAL_XMIT_SIZE - 1);
if (--info->xmit_cnt <= 0) if (--info->xmit_cnt <= 0)
break; break;
} while (--count > 0); } while (--count > 0);
mxvar_log.txcnt[info->port] += (cnt - info->xmit_cnt); mxvar_log.txcnt[info->port] += (cnt - info->xmit_cnt);
// added by James 03-12-2004. /* added by James 03-12-2004. */
info->mon_data.txcnt += (cnt - info->xmit_cnt); info->mon_data.txcnt += (cnt - info->xmit_cnt);
info->mon_data.up_txcnt += (cnt - info->xmit_cnt); info->mon_data.up_txcnt += (cnt - info->xmit_cnt);
// (above) added by James. /* (above) added by James. */
/* added by casper 1/11/2000 */ /* added by casper 1/11/2000 */
info->icount.tx += (cnt - info->xmit_cnt); info->icount.tx += (cnt - info->xmit_cnt);
...@@ -2188,7 +2269,6 @@ static void mxser_check_modem_status(struct mxser_struct *info, int status) ...@@ -2188,7 +2269,6 @@ static void mxser_check_modem_status(struct mxser_struct *info, int status)
info->mon_data.modem_status = status; info->mon_data.modem_status = status;
wake_up_interruptible(&info->delta_msr_wait); wake_up_interruptible(&info->delta_msr_wait);
if ((info->flags & ASYNC_CHECK_CD) && (status & UART_MSR_DDCD)) { if ((info->flags & ASYNC_CHECK_CD) && (status & UART_MSR_DDCD)) {
if (status & UART_MSR_DCD) if (status & UART_MSR_DCD)
wake_up_interruptible(&info->open_wait); wake_up_interruptible(&info->open_wait);
...@@ -2200,7 +2280,8 @@ static void mxser_check_modem_status(struct mxser_struct *info, int status) ...@@ -2200,7 +2280,8 @@ static void mxser_check_modem_status(struct mxser_struct *info, int status)
if (status & UART_MSR_CTS) { if (status & UART_MSR_CTS) {
info->tty->hw_stopped = 0; info->tty->hw_stopped = 0;
if ((info->type != PORT_16550A) && (!info->IsMoxaMustChipFlag)) { if ((info->type != PORT_16550A) &&
(!info->IsMoxaMustChipFlag)) {
info->IER |= UART_IER_THRI; info->IER |= UART_IER_THRI;
outb(info->IER, info->base + UART_IER); outb(info->IER, info->base + UART_IER);
} }
...@@ -2209,7 +2290,8 @@ static void mxser_check_modem_status(struct mxser_struct *info, int status) ...@@ -2209,7 +2290,8 @@ static void mxser_check_modem_status(struct mxser_struct *info, int status)
} else { } else {
if (!(status & UART_MSR_CTS)) { if (!(status & UART_MSR_CTS)) {
info->tty->hw_stopped = 1; info->tty->hw_stopped = 1;
if ((info->type != PORT_16550A) && (!info->IsMoxaMustChipFlag)) { if ((info->type != PORT_16550A) &&
(!info->IsMoxaMustChipFlag)) {
info->IER &= ~UART_IER_THRI; info->IER &= ~UART_IER_THRI;
outb(info->IER, info->base + UART_IER); outb(info->IER, info->base + UART_IER);
} }
...@@ -2231,7 +2313,7 @@ static int mxser_block_til_ready(struct tty_struct *tty, struct file *filp, stru ...@@ -2231,7 +2313,7 @@ static int mxser_block_til_ready(struct tty_struct *tty, struct file *filp, stru
*/ */
if ((filp->f_flags & O_NONBLOCK) || (tty->flags & (1 << TTY_IO_ERROR))) { if ((filp->f_flags & O_NONBLOCK) || (tty->flags & (1 << TTY_IO_ERROR))) {
info->flags |= ASYNC_NORMAL_ACTIVE; info->flags |= ASYNC_NORMAL_ACTIVE;
return (0); return 0;
} }
if (tty->termios->c_cflag & CLOCAL) if (tty->termios->c_cflag & CLOCAL)
...@@ -2254,7 +2336,8 @@ static int mxser_block_til_ready(struct tty_struct *tty, struct file *filp, stru ...@@ -2254,7 +2336,8 @@ static int mxser_block_til_ready(struct tty_struct *tty, struct file *filp, stru
info->blocked_open++; info->blocked_open++;
while (1) { while (1) {
spin_lock_irqsave(&info->slock, flags); spin_lock_irqsave(&info->slock, flags);
outb(inb(info->base + UART_MCR) | UART_MCR_DTR | UART_MCR_RTS, info->base + UART_MCR); outb(inb(info->base + UART_MCR) |
UART_MCR_DTR | UART_MCR_RTS, info->base + UART_MCR);
spin_unlock_irqrestore(&info->slock, flags); spin_unlock_irqrestore(&info->slock, flags);
set_current_state(TASK_INTERRUPTIBLE); set_current_state(TASK_INTERRUPTIBLE);
if (tty_hung_up_p(filp) || !(info->flags & ASYNC_INITIALIZED)) { if (tty_hung_up_p(filp) || !(info->flags & ASYNC_INITIALIZED)) {
...@@ -2264,7 +2347,9 @@ static int mxser_block_til_ready(struct tty_struct *tty, struct file *filp, stru ...@@ -2264,7 +2347,9 @@ static int mxser_block_til_ready(struct tty_struct *tty, struct file *filp, stru
retval = -ERESTARTSYS; retval = -ERESTARTSYS;
break; break;
} }
if (!(info->flags & ASYNC_CLOSING) && (do_clocal || (inb(info->base + UART_MSR) & UART_MSR_DCD))) if (!(info->flags & ASYNC_CLOSING) &&
(do_clocal ||
(inb(info->base + UART_MSR) & UART_MSR_DCD)))
break; break;
if (signal_pending(current)) { if (signal_pending(current)) {
retval = -ERESTARTSYS; retval = -ERESTARTSYS;
...@@ -2278,27 +2363,26 @@ static int mxser_block_til_ready(struct tty_struct *tty, struct file *filp, stru ...@@ -2278,27 +2363,26 @@ static int mxser_block_til_ready(struct tty_struct *tty, struct file *filp, stru
info->count++; info->count++;
info->blocked_open--; info->blocked_open--;
if (retval) if (retval)
return (retval); return retval;
info->flags |= ASYNC_NORMAL_ACTIVE; info->flags |= ASYNC_NORMAL_ACTIVE;
return (0); return 0;
} }
static int mxser_startup(struct mxser_struct *info) static int mxser_startup(struct mxser_struct *info)
{ {
unsigned long page; unsigned long page;
unsigned long flags; unsigned long flags;
page = __get_free_page(GFP_KERNEL); page = __get_free_page(GFP_KERNEL);
if (!page) if (!page)
return (-ENOMEM); return -ENOMEM;
spin_lock_irqsave(&info->slock, flags); spin_lock_irqsave(&info->slock, flags);
if (info->flags & ASYNC_INITIALIZED) { if (info->flags & ASYNC_INITIALIZED) {
free_page(page); free_page(page);
spin_unlock_irqrestore(&info->slock, flags); spin_unlock_irqrestore(&info->slock, flags);
return (0); return 0;
} }
if (!info->base || !info->type) { if (!info->base || !info->type) {
...@@ -2306,7 +2390,7 @@ static int mxser_startup(struct mxser_struct *info) ...@@ -2306,7 +2390,7 @@ static int mxser_startup(struct mxser_struct *info)
set_bit(TTY_IO_ERROR, &info->tty->flags); set_bit(TTY_IO_ERROR, &info->tty->flags);
free_page(page); free_page(page);
spin_unlock_irqrestore(&info->slock, flags); spin_unlock_irqrestore(&info->slock, flags);
return (0); return 0;
} }
if (info->xmit_buf) if (info->xmit_buf)
free_page(page); free_page(page);
...@@ -2318,9 +2402,12 @@ static int mxser_startup(struct mxser_struct *info) ...@@ -2318,9 +2402,12 @@ static int mxser_startup(struct mxser_struct *info)
* (they will be reenabled in mxser_change_speed()) * (they will be reenabled in mxser_change_speed())
*/ */
if (info->IsMoxaMustChipFlag) if (info->IsMoxaMustChipFlag)
outb((UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT | MOXA_MUST_FCR_GDA_MODE_ENABLE), info->base + UART_FCR); outb((UART_FCR_CLEAR_RCVR |
UART_FCR_CLEAR_XMIT |
MOXA_MUST_FCR_GDA_MODE_ENABLE), info->base + UART_FCR);
else else
outb((UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT), info->base + UART_FCR); outb((UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT),
info->base + UART_FCR);
/* /*
* At this point there's no way the LSR could still be 0xFF; * At this point there's no way the LSR could still be 0xFF;
...@@ -2332,9 +2419,9 @@ static int mxser_startup(struct mxser_struct *info) ...@@ -2332,9 +2419,9 @@ static int mxser_startup(struct mxser_struct *info)
if (capable(CAP_SYS_ADMIN)) { if (capable(CAP_SYS_ADMIN)) {
if (info->tty) if (info->tty)
set_bit(TTY_IO_ERROR, &info->tty->flags); set_bit(TTY_IO_ERROR, &info->tty->flags);
return (0); return 0;
} else } else
return (-ENODEV); return -ENODEV;
} }
/* /*
...@@ -2356,12 +2443,12 @@ static int mxser_startup(struct mxser_struct *info) ...@@ -2356,12 +2443,12 @@ static int mxser_startup(struct mxser_struct *info)
* Finally, enable interrupts * Finally, enable interrupts
*/ */
info->IER = UART_IER_MSI | UART_IER_RLSI | UART_IER_RDI; info->IER = UART_IER_MSI | UART_IER_RLSI | UART_IER_RDI;
// info->IER = UART_IER_RLSI | UART_IER_RDI; /* info->IER = UART_IER_RLSI | UART_IER_RDI; */
// following add by Victor Yu. 08-30-2002 /* following add by Victor Yu. 08-30-2002 */
if (info->IsMoxaMustChipFlag) if (info->IsMoxaMustChipFlag)
info->IER |= MOXA_MUST_IER_EGDAI; info->IER |= MOXA_MUST_IER_EGDAI;
// above add by Victor Yu. 08-30-2002 /* above add by Victor Yu. 08-30-2002 */
outb(info->IER, info->base + UART_IER); /* enable interrupts */ outb(info->IER, info->base + UART_IER); /* enable interrupts */
/* /*
...@@ -2383,7 +2470,7 @@ static int mxser_startup(struct mxser_struct *info) ...@@ -2383,7 +2470,7 @@ static int mxser_startup(struct mxser_struct *info)
mxser_change_speed(info, NULL); mxser_change_speed(info, NULL);
info->flags |= ASYNC_INITIALIZED; info->flags |= ASYNC_INITIALIZED;
return (0); return 0;
} }
/* /*
...@@ -2421,12 +2508,15 @@ static void mxser_shutdown(struct mxser_struct *info) ...@@ -2421,12 +2508,15 @@ static void mxser_shutdown(struct mxser_struct *info)
outb(info->MCR, info->base + UART_MCR); outb(info->MCR, info->base + UART_MCR);
/* clear Rx/Tx FIFO's */ /* clear Rx/Tx FIFO's */
// following add by Victor Yu. 08-30-2002 /* following add by Victor Yu. 08-30-2002 */
if (info->IsMoxaMustChipFlag) if (info->IsMoxaMustChipFlag)
outb((UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT | MOXA_MUST_FCR_GDA_MODE_ENABLE), info->base + UART_FCR); outb((UART_FCR_CLEAR_RCVR |
UART_FCR_CLEAR_XMIT |
MOXA_MUST_FCR_GDA_MODE_ENABLE), info->base + UART_FCR);
else else
// above add by Victor Yu. 08-30-2002 /* above add by Victor Yu. 08-30-2002 */
outb((UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT), info->base + UART_FCR); outb((UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT),
info->base + UART_FCR);
/* read data port to reset things */ /* read data port to reset things */
(void) inb(info->base + UART_RX); (void) inb(info->base + UART_RX);
...@@ -2436,11 +2526,10 @@ static void mxser_shutdown(struct mxser_struct *info) ...@@ -2436,11 +2526,10 @@ static void mxser_shutdown(struct mxser_struct *info)
info->flags &= ~ASYNC_INITIALIZED; info->flags &= ~ASYNC_INITIALIZED;
// following add by Victor Yu. 09-23-2002 /* following add by Victor Yu. 09-23-2002 */
if (info->IsMoxaMustChipFlag) { if (info->IsMoxaMustChipFlag)
SET_MOXA_MUST_NO_SOFTWARE_FLOW_CONTROL(info->base); SET_MOXA_MUST_NO_SOFTWARE_FLOW_CONTROL(info->base);
} /* above add by Victor Yu. 09-23-2002 */
// above add by Victor Yu. 09-23-2002
spin_unlock_irqrestore(&info->slock, flags); spin_unlock_irqrestore(&info->slock, flags);
} }
...@@ -2457,14 +2546,12 @@ static int mxser_change_speed(struct mxser_struct *info, struct termios *old_ter ...@@ -2457,14 +2546,12 @@ static int mxser_change_speed(struct mxser_struct *info, struct termios *old_ter
long baud; long baud;
unsigned long flags; unsigned long flags;
if (!info->tty || !info->tty->termios) if (!info->tty || !info->tty->termios)
return ret; return ret;
cflag = info->tty->termios->c_cflag; cflag = info->tty->termios->c_cflag;
if (!(info->base)) if (!(info->base))
return ret; return ret;
#ifndef B921600 #ifndef B921600
#define B921600 (B460800 +1) #define B921600 (B460800 +1)
#endif #endif
...@@ -2559,9 +2646,8 @@ static int mxser_change_speed(struct mxser_struct *info, struct termios *old_ter ...@@ -2559,9 +2646,8 @@ static int mxser_change_speed(struct mxser_struct *info, struct termios *old_ter
cval |= 0x04; cval |= 0x04;
if (cflag & PARENB) if (cflag & PARENB)
cval |= UART_LCR_PARITY; cval |= UART_LCR_PARITY;
if (!(cflag & PARODD)) { if (!(cflag & PARODD))
cval |= UART_LCR_EPAR; cval |= UART_LCR_EPAR;
}
if (cflag & CMSPAR) if (cflag & CMSPAR)
cval |= UART_LCR_SPAR; cval |= UART_LCR_SPAR;
...@@ -2574,13 +2660,12 @@ static int mxser_change_speed(struct mxser_struct *info, struct termios *old_ter ...@@ -2574,13 +2660,12 @@ static int mxser_change_speed(struct mxser_struct *info, struct termios *old_ter
fcr = 0; fcr = 0;
} else { } else {
fcr = UART_FCR_ENABLE_FIFO; fcr = UART_FCR_ENABLE_FIFO;
// following add by Victor Yu. 08-30-2002 /* following add by Victor Yu. 08-30-2002 */
if (info->IsMoxaMustChipFlag) { if (info->IsMoxaMustChipFlag) {
fcr |= MOXA_MUST_FCR_GDA_MODE_ENABLE; fcr |= MOXA_MUST_FCR_GDA_MODE_ENABLE;
SET_MOXA_MUST_FIFO_VALUE(info); SET_MOXA_MUST_FIFO_VALUE(info);
} else { } else {
// above add by Victor Yu. 08-30-2002 /* above add by Victor Yu. 08-30-2002 */
switch (info->rx_trigger) { switch (info->rx_trigger) {
case 1: case 1:
fcr |= UART_FCR_TRIGGER_1; fcr |= UART_FCR_TRIGGER_1;
...@@ -2606,22 +2691,24 @@ static int mxser_change_speed(struct mxser_struct *info, struct termios *old_ter ...@@ -2606,22 +2691,24 @@ static int mxser_change_speed(struct mxser_struct *info, struct termios *old_ter
info->IER |= UART_IER_MSI; info->IER |= UART_IER_MSI;
if ((info->type == PORT_16550A) || (info->IsMoxaMustChipFlag)) { if ((info->type == PORT_16550A) || (info->IsMoxaMustChipFlag)) {
info->MCR |= UART_MCR_AFE; info->MCR |= UART_MCR_AFE;
//status = mxser_get_msr(info->base, 0, info->port); /* status = mxser_get_msr(info->base, 0, info->port); */
/* save_flags(flags); /*
save_flags(flags);
cli(); cli();
status = inb(baseaddr + UART_MSR); status = inb(baseaddr + UART_MSR);
restore_flags(flags);*/ restore_flags(flags);
//mxser_check_modem_status(info, status); */
/* mxser_check_modem_status(info, status); */
} else { } else {
//status = mxser_get_msr(info->base, 0, info->port); /* status = mxser_get_msr(info->base, 0, info->port); */
/* MX_LOCK(&info->slock); */
//MX_LOCK(&info->slock);
status = inb(info->base + UART_MSR); status = inb(info->base + UART_MSR);
//MX_UNLOCK(&info->slock); /* MX_UNLOCK(&info->slock); */
if (info->tty->hw_stopped) { if (info->tty->hw_stopped) {
if (status & UART_MSR_CTS) { if (status & UART_MSR_CTS) {
info->tty->hw_stopped = 0; info->tty->hw_stopped = 0;
if ((info->type != PORT_16550A) && (!info->IsMoxaMustChipFlag)) { if ((info->type != PORT_16550A) &&
(!info->IsMoxaMustChipFlag)) {
info->IER |= UART_IER_THRI; info->IER |= UART_IER_THRI;
outb(info->IER, info->base + UART_IER); outb(info->IER, info->base + UART_IER);
} }
...@@ -2630,7 +2717,8 @@ static int mxser_change_speed(struct mxser_struct *info, struct termios *old_ter ...@@ -2630,7 +2717,8 @@ static int mxser_change_speed(struct mxser_struct *info, struct termios *old_ter
} else { } else {
if (!(status & UART_MSR_CTS)) { if (!(status & UART_MSR_CTS)) {
info->tty->hw_stopped = 1; info->tty->hw_stopped = 1;
if ((info->type != PORT_16550A) && (!info->IsMoxaMustChipFlag)) { if ((info->type != PORT_16550A) &&
(!info->IsMoxaMustChipFlag)) {
info->IER &= ~UART_IER_THRI; info->IER &= ~UART_IER_THRI;
outb(info->IER, info->base + UART_IER); outb(info->IER, info->base + UART_IER);
} }
...@@ -2668,11 +2756,17 @@ static int mxser_change_speed(struct mxser_struct *info, struct termios *old_ter ...@@ -2668,11 +2756,17 @@ static int mxser_change_speed(struct mxser_struct *info, struct termios *old_ter
* overruns too. (For real raw support). * overruns too. (For real raw support).
*/ */
if (I_IGNPAR(info->tty)) { if (I_IGNPAR(info->tty)) {
info->ignore_status_mask |= UART_LSR_OE | UART_LSR_PE | UART_LSR_FE; info->ignore_status_mask |=
info->read_status_mask |= UART_LSR_OE | UART_LSR_PE | UART_LSR_FE; UART_LSR_OE |
UART_LSR_PE |
UART_LSR_FE;
info->read_status_mask |=
UART_LSR_OE |
UART_LSR_PE |
UART_LSR_FE;
} }
} }
// following add by Victor Yu. 09-02-2002 /* following add by Victor Yu. 09-02-2002 */
if (info->IsMoxaMustChipFlag) { if (info->IsMoxaMustChipFlag) {
spin_lock_irqsave(&info->slock, flags); spin_lock_irqsave(&info->slock, flags);
SET_MOXA_MUST_XON1_VALUE(info->base, START_CHAR(info->tty)); SET_MOXA_MUST_XON1_VALUE(info->base, START_CHAR(info->tty));
...@@ -2698,7 +2792,7 @@ static int mxser_change_speed(struct mxser_struct *info, struct termios *old_ter ...@@ -2698,7 +2792,7 @@ static int mxser_change_speed(struct mxser_struct *info, struct termios *old_ter
*/ */
spin_unlock_irqrestore(&info->slock, flags); spin_unlock_irqrestore(&info->slock, flags);
} }
// above add by Victor Yu. 09-02-2002 /* above add by Victor Yu. 09-02-2002 */
outb(fcr, info->base + UART_FCR); /* set fcr */ outb(fcr, info->base + UART_FCR); /* set fcr */
...@@ -2729,10 +2823,8 @@ static int mxser_set_baud(struct mxser_struct *info, long newspd) ...@@ -2729,10 +2823,8 @@ static int mxser_set_baud(struct mxser_struct *info, long newspd)
quot = (2 * info->baud_base / 269); quot = (2 * info->baud_base / 269);
} else if (newspd) { } else if (newspd) {
quot = info->baud_base / newspd; quot = info->baud_base / newspd;
if (quot == 0) if (quot == 0)
quot = 1; quot = 1;
} else { } else {
quot = 0; quot = 0;
} }
...@@ -2765,8 +2857,6 @@ static int mxser_set_baud(struct mxser_struct *info, long newspd) ...@@ -2765,8 +2857,6 @@ static int mxser_set_baud(struct mxser_struct *info, long newspd)
return ret; return ret;
} }
/* /*
* ------------------------------------------------------------ * ------------------------------------------------------------
* friends of mxser_ioctl() * friends of mxser_ioctl()
...@@ -2777,7 +2867,7 @@ static int mxser_get_serial_info(struct mxser_struct *info, struct serial_struct ...@@ -2777,7 +2867,7 @@ static int mxser_get_serial_info(struct mxser_struct *info, struct serial_struct
struct serial_struct tmp; struct serial_struct tmp;
if (!retinfo) if (!retinfo)
return (-EFAULT); return -EFAULT;
memset(&tmp, 0, sizeof(tmp)); memset(&tmp, 0, sizeof(tmp));
tmp.type = info->type; tmp.type = info->type;
tmp.line = info->port; tmp.line = info->port;
...@@ -2791,7 +2881,7 @@ static int mxser_get_serial_info(struct mxser_struct *info, struct serial_struct ...@@ -2791,7 +2881,7 @@ static int mxser_get_serial_info(struct mxser_struct *info, struct serial_struct
tmp.hub6 = 0; tmp.hub6 = 0;
if (copy_to_user(retinfo, &tmp, sizeof(*retinfo))) if (copy_to_user(retinfo, &tmp, sizeof(*retinfo)))
return -EFAULT; return -EFAULT;
return (0); return 0;
} }
static int mxser_set_serial_info(struct mxser_struct *info, struct serial_struct __user *new_info) static int mxser_set_serial_info(struct mxser_struct *info, struct serial_struct __user *new_info)
...@@ -2801,29 +2891,37 @@ static int mxser_set_serial_info(struct mxser_struct *info, struct serial_struct ...@@ -2801,29 +2891,37 @@ static int mxser_set_serial_info(struct mxser_struct *info, struct serial_struct
int retval = 0; int retval = 0;
if (!new_info || !info->base) if (!new_info || !info->base)
return (-EFAULT); return -EFAULT;
if (copy_from_user(&new_serial, new_info, sizeof(new_serial))) if (copy_from_user(&new_serial, new_info, sizeof(new_serial)))
return -EFAULT; return -EFAULT;
if ((new_serial.irq != info->irq) || (new_serial.port != info->base) || (new_serial.custom_divisor != info->custom_divisor) || (new_serial.baud_base != info->baud_base)) if ((new_serial.irq != info->irq) ||
return (-EPERM); (new_serial.port != info->base) ||
(new_serial.custom_divisor != info->custom_divisor) ||
(new_serial.baud_base != info->baud_base))
return -EPERM;
flags = info->flags & ASYNC_SPD_MASK; flags = info->flags & ASYNC_SPD_MASK;
if (!capable(CAP_SYS_ADMIN)) { if (!capable(CAP_SYS_ADMIN)) {
if ((new_serial.baud_base != info->baud_base) || (new_serial.close_delay != info->close_delay) || ((new_serial.flags & ~ASYNC_USR_MASK) != (info->flags & ~ASYNC_USR_MASK))) if ((new_serial.baud_base != info->baud_base) ||
return (-EPERM); (new_serial.close_delay != info->close_delay) ||
info->flags = ((info->flags & ~ASYNC_USR_MASK) | (new_serial.flags & ASYNC_USR_MASK)); ((new_serial.flags & ~ASYNC_USR_MASK) != (info->flags & ~ASYNC_USR_MASK)))
return -EPERM;
info->flags = ((info->flags & ~ASYNC_USR_MASK) |
(new_serial.flags & ASYNC_USR_MASK));
} else { } else {
/* /*
* OK, past this point, all the error checking has been done. * OK, past this point, all the error checking has been done.
* At this point, we start making changes..... * At this point, we start making changes.....
*/ */
info->flags = ((info->flags & ~ASYNC_FLAGS) | (new_serial.flags & ASYNC_FLAGS)); info->flags = ((info->flags & ~ASYNC_FLAGS) |
(new_serial.flags & ASYNC_FLAGS));
info->close_delay = new_serial.close_delay * HZ / 100; info->close_delay = new_serial.close_delay * HZ / 100;
info->closing_wait = new_serial.closing_wait * HZ / 100; info->closing_wait = new_serial.closing_wait * HZ / 100;
info->tty->low_latency = (info->flags & ASYNC_LOW_LATENCY) ? 1 : 0; info->tty->low_latency =
info->tty->low_latency = 0; //(info->flags & ASYNC_LOW_LATENCY) ? 1 : 0; (info->flags & ASYNC_LOW_LATENCY) ? 1 : 0;
info->tty->low_latency = 0; /* (info->flags & ASYNC_LOW_LATENCY) ? 1 : 0; */
} }
/* added by casper, 3/17/2000, for mouse */ /* added by casper, 3/17/2000, for mouse */
...@@ -2831,7 +2929,6 @@ static int mxser_set_serial_info(struct mxser_struct *info, struct serial_struct ...@@ -2831,7 +2929,6 @@ static int mxser_set_serial_info(struct mxser_struct *info, struct serial_struct
process_txrx_fifo(info); process_txrx_fifo(info);
/* */
if (info->flags & ASYNC_INITIALIZED) { if (info->flags & ASYNC_INITIALIZED) {
if (flags != (info->flags & ASYNC_SPD_MASK)) { if (flags != (info->flags & ASYNC_SPD_MASK)) {
mxser_change_speed(info, NULL); mxser_change_speed(info, NULL);
...@@ -2839,7 +2936,7 @@ static int mxser_set_serial_info(struct mxser_struct *info, struct serial_struct ...@@ -2839,7 +2936,7 @@ static int mxser_set_serial_info(struct mxser_struct *info, struct serial_struct
} else { } else {
retval = mxser_startup(info); retval = mxser_startup(info);
} }
return (retval); return retval;
} }
/* /*
...@@ -2876,11 +2973,13 @@ static void mxser_send_break(struct mxser_struct *info, int duration) ...@@ -2876,11 +2973,13 @@ static void mxser_send_break(struct mxser_struct *info, int duration)
return; return;
set_current_state(TASK_INTERRUPTIBLE); set_current_state(TASK_INTERRUPTIBLE);
spin_lock_irqsave(&info->slock, flags); spin_lock_irqsave(&info->slock, flags);
outb(inb(info->base + UART_LCR) | UART_LCR_SBC, info->base + UART_LCR); outb(inb(info->base + UART_LCR) | UART_LCR_SBC,
info->base + UART_LCR);
spin_unlock_irqrestore(&info->slock, flags); spin_unlock_irqrestore(&info->slock, flags);
schedule_timeout(duration); schedule_timeout(duration);
spin_lock_irqsave(&info->slock, flags); spin_lock_irqsave(&info->slock, flags);
outb(inb(info->base + UART_LCR) & ~UART_LCR_SBC, info->base + UART_LCR); outb(inb(info->base + UART_LCR) & ~UART_LCR_SBC,
info->base + UART_LCR);
spin_unlock_irqrestore(&info->slock, flags); spin_unlock_irqrestore(&info->slock, flags);
} }
...@@ -2892,9 +2991,9 @@ static int mxser_tiocmget(struct tty_struct *tty, struct file *file) ...@@ -2892,9 +2991,9 @@ static int mxser_tiocmget(struct tty_struct *tty, struct file *file)
if (tty->index == MXSER_PORTS) if (tty->index == MXSER_PORTS)
return (-ENOIOCTLCMD); return -ENOIOCTLCMD;
if (tty->flags & (1 << TTY_IO_ERROR)) if (tty->flags & (1 << TTY_IO_ERROR))
return (-EIO); return -EIO;
control = info->MCR; control = info->MCR;
...@@ -2904,7 +3003,11 @@ static int mxser_tiocmget(struct tty_struct *tty, struct file *file) ...@@ -2904,7 +3003,11 @@ static int mxser_tiocmget(struct tty_struct *tty, struct file *file)
mxser_check_modem_status(info, status); mxser_check_modem_status(info, status);
spin_unlock_irqrestore(&info->slock, flags); spin_unlock_irqrestore(&info->slock, flags);
return ((control & UART_MCR_RTS) ? TIOCM_RTS : 0) | return ((control & UART_MCR_RTS) ? TIOCM_RTS : 0) |
((control & UART_MCR_DTR) ? TIOCM_DTR : 0) | ((status & UART_MSR_DCD) ? TIOCM_CAR : 0) | ((status & UART_MSR_RI) ? TIOCM_RNG : 0) | ((status & UART_MSR_DSR) ? TIOCM_DSR : 0) | ((status & UART_MSR_CTS) ? TIOCM_CTS : 0); ((control & UART_MCR_DTR) ? TIOCM_DTR : 0) |
((status & UART_MSR_DCD) ? TIOCM_CAR : 0) |
((status & UART_MSR_RI) ? TIOCM_RNG : 0) |
((status & UART_MSR_DSR) ? TIOCM_DSR : 0) |
((status & UART_MSR_CTS) ? TIOCM_CTS : 0);
} }
static int mxser_tiocmset(struct tty_struct *tty, struct file *file, unsigned int set, unsigned int clear) static int mxser_tiocmset(struct tty_struct *tty, struct file *file, unsigned int set, unsigned int clear)
...@@ -2968,38 +3071,36 @@ static int mxser_get_ISA_conf(int cap, struct mxser_hwconf *hwconf) ...@@ -2968,38 +3071,36 @@ static int mxser_get_ISA_conf(int cap, struct mxser_hwconf *hwconf)
hwconf->board_type = MXSER_BOARD_CI104J; hwconf->board_type = MXSER_BOARD_CI104J;
hwconf->ports = 4; hwconf->ports = 4;
} else } else
return (0); return 0;
irq = 0; irq = 0;
if (hwconf->ports == 2) { if (hwconf->ports == 2) {
irq = regs[9] & 0xF000; irq = regs[9] & 0xF000;
irq = irq | (irq >> 4); irq = irq | (irq >> 4);
if (irq != (regs[9] & 0xFF00)) if (irq != (regs[9] & 0xFF00))
return (MXSER_ERR_IRQ_CONFLIT); return MXSER_ERR_IRQ_CONFLIT;
} else if (hwconf->ports == 4) { } else if (hwconf->ports == 4) {
irq = regs[9] & 0xF000; irq = regs[9] & 0xF000;
irq = irq | (irq >> 4); irq = irq | (irq >> 4);
irq = irq | (irq >> 8); irq = irq | (irq >> 8);
if (irq != regs[9]) if (irq != regs[9])
return (MXSER_ERR_IRQ_CONFLIT); return MXSER_ERR_IRQ_CONFLIT;
} else if (hwconf->ports == 8) { } else if (hwconf->ports == 8) {
irq = regs[9] & 0xF000; irq = regs[9] & 0xF000;
irq = irq | (irq >> 4); irq = irq | (irq >> 4);
irq = irq | (irq >> 8); irq = irq | (irq >> 8);
if ((irq != regs[9]) || (irq != regs[10])) if ((irq != regs[9]) || (irq != regs[10]))
return (MXSER_ERR_IRQ_CONFLIT); return MXSER_ERR_IRQ_CONFLIT;
} }
if (!irq) { if (!irq)
return (MXSER_ERR_IRQ); return MXSER_ERR_IRQ;
} hwconf->irq = ((int)(irq & 0xF000) >> 12);
hwconf->irq = ((int) (irq & 0xF000) >> 12);
for (i = 0; i < 8; i++) for (i = 0; i < 8; i++)
hwconf->ioaddr[i] = (int) regs[i + 1] & 0xFFF8; hwconf->ioaddr[i] = (int) regs[i + 1] & 0xFFF8;
if ((regs[12] & 0x80) == 0) { if ((regs[12] & 0x80) == 0)
return (MXSER_ERR_VECTOR); return MXSER_ERR_VECTOR;
} hwconf->vector = (int)regs[11]; /* interrupt vector */
hwconf->vector = (int) regs[11]; /* interrupt vector */
if (id == 1) if (id == 1)
hwconf->vector_mask = 0x00FF; hwconf->vector_mask = 0x00FF;
else else
...@@ -3007,10 +3108,10 @@ static int mxser_get_ISA_conf(int cap, struct mxser_hwconf *hwconf) ...@@ -3007,10 +3108,10 @@ static int mxser_get_ISA_conf(int cap, struct mxser_hwconf *hwconf)
for (i = 7, bits = 0x0100; i >= 0; i--, bits <<= 1) { for (i = 7, bits = 0x0100; i >= 0; i--, bits <<= 1) {
if (regs[12] & bits) { if (regs[12] & bits) {
hwconf->baud_base[i] = 921600; hwconf->baud_base[i] = 921600;
hwconf->MaxCanSetBaudRate[i] = 921600; // add by Victor Yu. 09-04-2002 hwconf->MaxCanSetBaudRate[i] = 921600; /* add by Victor Yu. 09-04-2002 */
} else { } else {
hwconf->baud_base[i] = 115200; hwconf->baud_base[i] = 115200;
hwconf->MaxCanSetBaudRate[i] = 115200; // add by Victor Yu. 09-04-2002 hwconf->MaxCanSetBaudRate[i] = 115200; /* add by Victor Yu. 09-04-2002 */
} }
} }
scratch2 = inb(cap + UART_LCR) & (~UART_LCR_DLAB); scratch2 = inb(cap + UART_LCR) & (~UART_LCR_DLAB);
...@@ -3030,7 +3131,7 @@ static int mxser_get_ISA_conf(int cap, struct mxser_hwconf *hwconf) ...@@ -3030,7 +3131,7 @@ static int mxser_get_ISA_conf(int cap, struct mxser_hwconf *hwconf)
hwconf->ports = 4; hwconf->ports = 4;
request_region(hwconf->ioaddr[0], 8 * hwconf->ports, "mxser(IO)"); request_region(hwconf->ioaddr[0], 8 * hwconf->ports, "mxser(IO)");
request_region(hwconf->vector, 1, "mxser(vector)"); request_region(hwconf->vector, 1, "mxser(vector)");
return (hwconf->ports); return hwconf->ports;
} }
#define CHIP_SK 0x01 /* Serial Data Clock in Eprom */ #define CHIP_SK 0x01 /* Serial Data Clock in Eprom */
...@@ -3053,7 +3154,7 @@ static int mxser_read_register(int port, unsigned short *regs) ...@@ -3053,7 +3154,7 @@ static int mxser_read_register(int port, unsigned short *regs)
id = mxser_program_mode(port); id = mxser_program_mode(port);
if (id < 0) if (id < 0)
return (id); return id;
for (i = 0; i < 14; i++) { for (i = 0; i < 14; i++) {
k = (i & 0x3F) | 0x180; k = (i & 0x3F) | 0x180;
for (j = 0x100; j > 0; j >>= 1) { for (j = 0x100; j > 0; j >>= 1) {
...@@ -3066,7 +3167,7 @@ static int mxser_read_register(int port, unsigned short *regs) ...@@ -3066,7 +3167,7 @@ static int mxser_read_register(int port, unsigned short *regs)
outb(CHIP_CS | CHIP_SK, port); /* A? bit of read */ outb(CHIP_CS | CHIP_SK, port); /* A? bit of read */
} }
} }
(void) inb(port); (void)inb(port);
value = 0; value = 0;
for (k = 0, j = 0x8000; k < 16; k++, j >>= 1) { for (k = 0, j = 0x8000; k < 16; k++, j >>= 1) {
outb(CHIP_CS, port); outb(CHIP_CS, port);
...@@ -3078,28 +3179,33 @@ static int mxser_read_register(int port, unsigned short *regs) ...@@ -3078,28 +3179,33 @@ static int mxser_read_register(int port, unsigned short *regs)
outb(0, port); outb(0, port);
} }
mxser_normal_mode(port); mxser_normal_mode(port);
return (id); return id;
} }
static int mxser_program_mode(int port) static int mxser_program_mode(int port)
{ {
int id, i, j, n; int id, i, j, n;
//unsigned long flags; /* unsigned long flags; */
spin_lock(&gm_lock); spin_lock(&gm_lock);
outb(0, port); outb(0, port);
outb(0, port); outb(0, port);
outb(0, port); outb(0, port);
(void) inb(port); (void)inb(port);
(void) inb(port); (void)inb(port);
outb(0, port); outb(0, port);
(void) inb(port); (void)inb(port);
//restore_flags(flags); /* restore_flags(flags); */
spin_unlock(&gm_lock); spin_unlock(&gm_lock);
id = inb(port + 1) & 0x1F; id = inb(port + 1) & 0x1F;
if ((id != C168_ASIC_ID) && (id != C104_ASIC_ID) && (id != C102_ASIC_ID) && (id != CI132_ASIC_ID) && (id != CI134_ASIC_ID) && (id != CI104J_ASIC_ID)) if ((id != C168_ASIC_ID) &&
return (-1); (id != C104_ASIC_ID) &&
(id != C102_ASIC_ID) &&
(id != CI132_ASIC_ID) &&
(id != CI134_ASIC_ID) &&
(id != CI104J_ASIC_ID))
return -1;
for (i = 0, j = 0; i < 4; i++) { for (i = 0, j = 0; i < 4; i++) {
n = inb(port + 2); n = inb(port + 2);
if (n == 'M') { if (n == 'M') {
...@@ -3112,7 +3218,7 @@ static int mxser_program_mode(int port) ...@@ -3112,7 +3218,7 @@ static int mxser_program_mode(int port)
} }
if (j != 2) if (j != 2)
id = -2; id = -2;
return (id); return id;
} }
static void mxser_normal_mode(int port) static void mxser_normal_mode(int port)
...@@ -3130,7 +3236,7 @@ static void mxser_normal_mode(int port) ...@@ -3130,7 +3236,7 @@ static void mxser_normal_mode(int port)
if ((n & 0x61) == 0x60) if ((n & 0x61) == 0x60)
break; break;
if ((n & 1) == 1) if ((n & 1) == 1)
(void) inb(port); (void)inb(port);
} }
outb(0x00, port + 4); outb(0x00, port + 4);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment