/* {MOXA_BOARD_C218_ISA,8,0xDC000}, */
};
-struct moxa_pci_devinfo {
- ushort busNum;
- ushort devNum;
- struct pci_dev *pdev;
-};
-
-struct moxa_board_conf {
+static struct moxa_board_conf {
int boardType;
int numPorts;
unsigned long baseAddr;
int busType;
- struct moxa_pci_devinfo pciInfo;
+
+ int loadstat;
+
+ void __iomem *basemem;
+ void __iomem *intNdx;
+ void __iomem *intPend;
+ void __iomem *intTable;
+} moxa_boards[MAX_BOARDS];
+
+struct mxser_mstatus {
+ tcflag_t cflag;
+ int cts;
+ int dsr;
+ int ri;
+ int dcd;
};
-static struct moxa_board_conf moxa_boards[MAX_BOARDS];
-static void __iomem *moxaBaseAddr[MAX_BOARDS];
-static int loadstat[MAX_BOARDS];
+struct moxaq_str {
+ int inq;
+ int outq;
+};
-struct moxa_str {
+struct moxa_port {
int type;
int port;
int close_delay;
int cflag;
wait_queue_head_t open_wait;
wait_queue_head_t close_wait;
-};
-struct mxser_mstatus {
- tcflag_t cflag;
- int cts;
- int dsr;
- int ri;
- int dcd;
-};
+ struct timer_list emptyTimer;
-static struct mxser_mstatus GMStatus[MAX_PORTS];
+ char chkPort;
+ char lineCtrl;
+ void __iomem *tableAddr;
+ long curBaud;
+ char DCDState;
+ char lowChkFlag;
+
+ ushort breakCnt;
+};
/* statusflags */
#define TXSTOPPED 0x1
static void moxa_poll(unsigned long);
static void set_tty_param(struct tty_struct *);
static int block_till_ready(struct tty_struct *, struct file *,
- struct moxa_str *);
+ struct moxa_port *);
static void setup_empty_event(struct tty_struct *);
static void check_xmit_empty(unsigned long);
-static void shut_down(struct moxa_str *);
-static void receive_data(struct moxa_str *);
+static void shut_down(struct moxa_port *);
+static void receive_data(struct moxa_port *);
/*
* moxa board interface functions:
*/
static void MoxaPortTxEnable(int);
static int MoxaPortResetBrkCnt(int);
static void MoxaPortSendBreak(int, int);
-static int moxa_get_serial_info(struct moxa_str *, struct serial_struct __user *);
-static int moxa_set_serial_info(struct moxa_str *, struct serial_struct __user *);
+static int moxa_get_serial_info(struct moxa_port *, struct serial_struct __user *);
+static int moxa_set_serial_info(struct moxa_port *, struct serial_struct __user *);
static void MoxaSetFifo(int port, int enable);
static const struct tty_operations moxa_ops = {
};
static struct tty_driver *moxaDriver;
-static struct moxa_str moxaChannels[MAX_PORTS];
+static struct moxa_port moxa_ports[MAX_PORTS];
static DEFINE_TIMER(moxaTimer, moxa_poll, 0, 0);
-static struct timer_list moxaEmptyTimer[MAX_PORTS];
static DEFINE_SPINLOCK(moxa_lock);
#ifdef CONFIG_PCI
-static int moxa_get_PCI_conf(struct pci_dev *p, int board_type,
- struct moxa_board_conf *board)
+static int __devinit moxa_pci_probe(struct pci_dev *pdev,
+ const struct pci_device_id *ent)
{
- board->baseAddr = pci_resource_start (p, 2);
+ struct moxa_board_conf *board;
+ unsigned int i;
+ int board_type = ent->driver_data;
+ int retval;
+
+ retval = pci_enable_device(pdev);
+ if (retval)
+ goto err;
+
+ for (i = 0; i < MAX_BOARDS; i++)
+ if (moxa_boards[i].basemem == NULL)
+ break;
+
+ retval = -ENODEV;
+ if (i >= MAX_BOARDS) {
+ if (verbose)
+ printk("More than %d MOXA Intellio family boards "
+ "found. Board is ignored.\n", MAX_BOARDS);
+ goto err;
+ }
+
+ board = &moxa_boards[i];
+ board->basemem = pci_iomap(pdev, 2, 0x4000);
+ if (board->basemem == NULL)
+ goto err;
+
board->boardType = board_type;
switch (board_type) {
case MOXA_BOARD_C218_ISA:
break;
}
board->busType = MOXA_BUS_TYPE_PCI;
- board->pciInfo.busNum = p->bus->number;
- board->pciInfo.devNum = p->devfn >> 3;
- board->pciInfo.pdev = p;
- /* don't lose the reference in the next pci_get_device iteration */
- pci_dev_get(p);
+
+ pci_set_drvdata(pdev, board);
return (0);
+err:
+ return retval;
+}
+
+static void __devexit moxa_pci_remove(struct pci_dev *pdev)
+{
+ struct moxa_board_conf *brd = pci_get_drvdata(pdev);
+
+ pci_iounmap(pdev, brd->basemem);
+ brd->basemem = NULL;
}
+
+static struct pci_driver moxa_pci_driver = {
+ .name = "moxa",
+ .id_table = moxa_pcibrds,
+ .probe = moxa_pci_probe,
+ .remove = __devexit_p(moxa_pci_remove)
+};
#endif /* CONFIG_PCI */
static int __init moxa_init(void)
{
- int i, numBoards;
- struct moxa_str *ch;
+ int i, numBoards, retval = 0;
+ struct moxa_port *ch;
printk(KERN_INFO "MOXA Intellio family driver version %s\n", MOXA_VERSION);
moxaDriver = alloc_tty_driver(MAX_PORTS + 1);
moxaDriver->flags = TTY_DRIVER_REAL_RAW;
tty_set_operations(moxaDriver, &moxa_ops);
- for (i = 0, ch = moxaChannels; i < MAX_PORTS; i++, ch++) {
+ for (i = 0, ch = moxa_ports; i < MAX_PORTS; i++, ch++) {
ch->type = PORT_16550A;
ch->port = i;
ch->close_delay = 5 * HZ / 10;
ch->cflag = B9600 | CS8 | CREAD | CLOCAL | HUPCL;
init_waitqueue_head(&ch->open_wait);
init_waitqueue_head(&ch->close_wait);
+
+ setup_timer(&ch->emptyTimer, check_xmit_empty,
+ (unsigned long)ch);
}
printk("Tty devices major number = %d\n", ttymajor);
put_tty_driver(moxaDriver);
return -1;
}
- for (i = 0; i < MAX_PORTS; i++)
- setup_timer(&moxaEmptyTimer[i], check_xmit_empty,
- (unsigned long)&moxaChannels[i]);
mod_timer(&moxaTimer, jiffies + HZ / 50);
}
}
#endif
- /* Find PCI boards here */
+
#ifdef CONFIG_PCI
- {
- struct pci_dev *p = NULL;
- int n = ARRAY_SIZE(moxa_pcibrds) - 1;
- i = 0;
- while (i < n) {
- while ((p = pci_get_device(moxa_pcibrds[i].vendor, moxa_pcibrds[i].device, p))!=NULL)
- {
- if (pci_enable_device(p))
- continue;
- if (numBoards >= MAX_BOARDS) {
- if (verbose)
- printk("More than %d MOXA Intellio family boards found. Board is ignored.", MAX_BOARDS);
- } else {
- moxa_get_PCI_conf(p, moxa_pcibrds[i].driver_data,
- &moxa_boards[numBoards]);
- numBoards++;
- }
- }
- i++;
- }
+ retval = pci_register_driver(&moxa_pci_driver);
+ if (retval) {
+ printk(KERN_ERR "Can't register moxa pci driver!\n");
+ if (numBoards)
+ retval = 0;
}
#endif
+
for (i = 0; i < numBoards; i++) {
- moxaBaseAddr[i] = ioremap((unsigned long) moxa_boards[i].baseAddr, 0x4000);
+ moxa_boards[i].basemem = ioremap(moxa_boards[i].baseAddr,
+ 0x4000);
}
- return (0);
+ return retval;
}
static void __exit moxa_exit(void)
if (verbose)
printk("Unloading module moxa ...\n");
- del_timer(&moxaTimer);
+ del_timer_sync(&moxaTimer);
for (i = 0; i < MAX_PORTS; i++)
- del_timer(&moxaEmptyTimer[i]);
+ del_timer_sync(&moxa_ports[i].emptyTimer);
if (tty_unregister_driver(moxaDriver))
printk("Couldn't unregister MOXA Intellio family serial driver\n");
put_tty_driver(moxaDriver);
- for (i = 0; i < MAX_BOARDS; i++) {
- if (moxaBaseAddr[i])
- iounmap(moxaBaseAddr[i]);
- if (moxa_boards[i].busType == MOXA_BUS_TYPE_PCI)
- pci_dev_put(moxa_boards[i].pciInfo.pdev);
- }
+#ifdef CONFIG_PCI
+ pci_unregister_driver(&moxa_pci_driver);
+#endif
+
+ for (i = 0; i < MAX_BOARDS; i++)
+ if (moxa_boards[i].basemem)
+ iounmap(moxa_boards[i].basemem);
if (verbose)
printk("Done\n");
static int moxa_open(struct tty_struct *tty, struct file *filp)
{
- struct moxa_str *ch;
+ struct moxa_port *ch;
int port;
int retval;
return (-ENODEV);
}
- ch = &moxaChannels[port];
+ ch = &moxa_ports[port];
ch->count++;
tty->driver_data = ch;
ch->tty = tty;
static void moxa_close(struct tty_struct *tty, struct file *filp)
{
- struct moxa_str *ch;
+ struct moxa_port *ch;
int port;
port = tty->index;
if (tty_hung_up_p(filp)) {
return;
}
- ch = (struct moxa_str *) tty->driver_data;
+ ch = (struct moxa_port *) tty->driver_data;
if ((tty->count == 1) && (ch->count != 1)) {
printk("moxa_close: bad serial port count; tty->count is 1, "
if (ch->asyncflags & ASYNC_INITIALIZED) {
setup_empty_event(tty);
tty_wait_until_sent(tty, 30 * HZ); /* 30 seconds timeout */
- del_timer(&moxaEmptyTimer[ch->port]);
+ del_timer_sync(&moxa_ports[ch->port].emptyTimer);
}
shut_down(ch);
MoxaPortFlushData(port, 2);
static int moxa_write(struct tty_struct *tty,
const unsigned char *buf, int count)
{
- struct moxa_str *ch;
+ struct moxa_port *ch;
int len, port;
unsigned long flags;
- ch = (struct moxa_str *) tty->driver_data;
+ ch = (struct moxa_port *) tty->driver_data;
if (ch == NULL)
return (0);
port = ch->port;
static int moxa_write_room(struct tty_struct *tty)
{
- struct moxa_str *ch;
+ struct moxa_port *ch;
if (tty->stopped)
return (0);
- ch = (struct moxa_str *) tty->driver_data;
+ ch = (struct moxa_port *) tty->driver_data;
if (ch == NULL)
return (0);
return (MoxaPortTxFree(ch->port));
static void moxa_flush_buffer(struct tty_struct *tty)
{
- struct moxa_str *ch = (struct moxa_str *) tty->driver_data;
+ struct moxa_port *ch = (struct moxa_port *) tty->driver_data;
if (ch == NULL)
return;
static int moxa_chars_in_buffer(struct tty_struct *tty)
{
int chars;
- struct moxa_str *ch = (struct moxa_str *) tty->driver_data;
+ struct moxa_port *ch = (struct moxa_port *) tty->driver_data;
/*
* Sigh...I have to check if driver_data is NULL here, because
static void moxa_put_char(struct tty_struct *tty, unsigned char c)
{
- struct moxa_str *ch;
+ struct moxa_port *ch;
int port;
unsigned long flags;
- ch = (struct moxa_str *) tty->driver_data;
+ ch = (struct moxa_port *) tty->driver_data;
if (ch == NULL)
return;
port = ch->port;
static int moxa_tiocmget(struct tty_struct *tty, struct file *file)
{
- struct moxa_str *ch = (struct moxa_str *) tty->driver_data;
+ struct moxa_port *ch = (struct moxa_port *) tty->driver_data;
int port;
int flag = 0, dtr, rts;
static int moxa_tiocmset(struct tty_struct *tty, struct file *file,
unsigned int set, unsigned int clear)
{
- struct moxa_str *ch = (struct moxa_str *) tty->driver_data;
+ struct moxa_port *ch = (struct moxa_port *) tty->driver_data;
int port;
int dtr, rts;
static int moxa_ioctl(struct tty_struct *tty, struct file *file,
unsigned int cmd, unsigned long arg)
{
- struct moxa_str *ch = (struct moxa_str *) tty->driver_data;
+ struct moxa_port *ch = (struct moxa_port *) tty->driver_data;
register int port;
void __user *argp = (void __user *)arg;
int retval;
static void moxa_throttle(struct tty_struct *tty)
{
- struct moxa_str *ch = (struct moxa_str *) tty->driver_data;
+ struct moxa_port *ch = (struct moxa_port *) tty->driver_data;
ch->statusflags |= THROTTLE;
}
static void moxa_unthrottle(struct tty_struct *tty)
{
- struct moxa_str *ch = (struct moxa_str *) tty->driver_data;
+ struct moxa_port *ch = (struct moxa_port *) tty->driver_data;
ch->statusflags &= ~THROTTLE;
}
static void moxa_set_termios(struct tty_struct *tty,
struct ktermios *old_termios)
{
- struct moxa_str *ch = (struct moxa_str *) tty->driver_data;
+ struct moxa_port *ch = (struct moxa_port *) tty->driver_data;
if (ch == NULL)
return;
static void moxa_stop(struct tty_struct *tty)
{
- struct moxa_str *ch = (struct moxa_str *) tty->driver_data;
+ struct moxa_port *ch = (struct moxa_port *) tty->driver_data;
if (ch == NULL)
return;
static void moxa_start(struct tty_struct *tty)
{
- struct moxa_str *ch = (struct moxa_str *) tty->driver_data;
+ struct moxa_port *ch = (struct moxa_port *) tty->driver_data;
if (ch == NULL)
return;
static void moxa_hangup(struct tty_struct *tty)
{
- struct moxa_str *ch = (struct moxa_str *) tty->driver_data;
+ struct moxa_port *ch = (struct moxa_port *) tty->driver_data;
moxa_flush_buffer(tty);
shut_down(ch);
static void moxa_poll(unsigned long ignored)
{
register int card;
- struct moxa_str *ch;
+ struct moxa_port *ch;
struct tty_struct *tp;
int i, ports;
for (card = 0; card < MAX_BOARDS; card++) {
if ((ports = MoxaPortsOfCard(card)) <= 0)
continue;
- ch = &moxaChannels[card * MAX_PORTS_PER_BOARD];
+ ch = &moxa_ports[card * MAX_PORTS_PER_BOARD];
for (i = 0; i < ports; i++, ch++) {
if ((ch->asyncflags & ASYNC_INITIALIZED) == 0)
continue;
static void set_tty_param(struct tty_struct *tty)
{
register struct ktermios *ts;
- struct moxa_str *ch;
+ struct moxa_port *ch;
int rts, cts, txflow, rxflow, xany;
- ch = (struct moxa_str *) tty->driver_data;
+ ch = (struct moxa_port *) tty->driver_data;
ts = tty->termios;
if (ts->c_cflag & CLOCAL)
ch->asyncflags &= ~ASYNC_CHECK_CD;
}
static int block_till_ready(struct tty_struct *tty, struct file *filp,
- struct moxa_str *ch)
+ struct moxa_port *ch)
{
DECLARE_WAITQUEUE(wait,current);
unsigned long flags;
static void setup_empty_event(struct tty_struct *tty)
{
- struct moxa_str *ch = tty->driver_data;
+ struct moxa_port *ch = tty->driver_data;
unsigned long flags;
spin_lock_irqsave(&moxa_lock, flags);
ch->statusflags |= EMPTYWAIT;
- mod_timer(&moxaEmptyTimer[ch->port], jiffies + HZ);
+ mod_timer(&moxa_ports[ch->port].emptyTimer, jiffies + HZ);
spin_unlock_irqrestore(&moxa_lock, flags);
}
static void check_xmit_empty(unsigned long data)
{
- struct moxa_str *ch;
+ struct moxa_port *ch;
- ch = (struct moxa_str *) data;
- del_timer(&moxaEmptyTimer[ch->port]);
+ ch = (struct moxa_port *) data;
+ del_timer_sync(&moxa_ports[ch->port].emptyTimer);
if (ch->tty && (ch->statusflags & EMPTYWAIT)) {
if (MoxaPortTxQueue(ch->port) == 0) {
ch->statusflags &= ~EMPTYWAIT;
tty_wakeup(ch->tty);
return;
}
- mod_timer(&moxaEmptyTimer[ch->port], jiffies + HZ);
+ mod_timer(&moxa_ports[ch->port].emptyTimer, jiffies + HZ);
} else
ch->statusflags &= ~EMPTYWAIT;
}
-static void shut_down(struct moxa_str *ch)
+static void shut_down(struct moxa_port *ch)
{
struct tty_struct *tp;
ch->asyncflags &= ~ASYNC_INITIALIZED;
}
-static void receive_data(struct moxa_str *ch)
+static void receive_data(struct moxa_port *ch)
{
struct tty_struct *tp;
struct ktermios *ts;
#define DCD_oldstate 0x80
static unsigned char moxaBuff[10240];
-static void __iomem *moxaIntNdx[MAX_BOARDS];
-static void __iomem *moxaIntPend[MAX_BOARDS];
-static void __iomem *moxaIntTable[MAX_BOARDS];
-static char moxaChkPort[MAX_PORTS];
-static char moxaLineCtrl[MAX_PORTS];
-static void __iomem *moxaTableAddr[MAX_PORTS];
-static long moxaCurBaud[MAX_PORTS];
-static char moxaDCDState[MAX_PORTS];
-static char moxaLowChkFlag[MAX_PORTS];
static int moxaLowWaterChk;
static int moxaCard;
static struct mon_str moxaLog;
static int moxaFuncTout = HZ / 2;
-static ushort moxaBreakCnt[MAX_PORTS];
-static void moxadelay(int);
static void moxafunc(void __iomem *, int, ushort);
static void wait_finish(void __iomem *);
static void low_water_check(void __iomem *);
*****************************************************************************/
void MoxaDriverInit(void)
{
- int i;
+ struct moxa_port *p;
+ unsigned int i;
moxaFuncTout = HZ / 2; /* 500 mini-seconds */
moxaCard = 0;
moxaLog.tick = 0;
moxaLowWaterChk = 0;
for (i = 0; i < MAX_PORTS; i++) {
- moxaChkPort[i] = 0;
- moxaLowChkFlag[i] = 0;
- moxaLineCtrl[i] = 0;
+ p = &moxa_ports[i];
+ p->chkPort = 0;
+ p->lowChkFlag = 0;
+ p->lineCtrl = 0;
moxaLog.rxcnt[i] = 0;
moxaLog.txcnt[i] = 0;
}
#define MOXA_GET_CUMAJOR (MOXA + 64)
#define MOXA_GETMSTATUS (MOXA + 65)
-
-struct moxaq_str {
- int inq;
- int outq;
-};
-
struct dl_str {
char __user *buf;
int len;
int cardno;
};
-static struct moxaq_str temp_queue[MAX_PORTS];
static struct dl_str dltmp;
void MoxaPortFlushData(int port, int mode)
void __iomem *ofsAddr;
if ((mode < 0) || (mode > 2))
return;
- ofsAddr = moxaTableAddr[port];
+ ofsAddr = moxa_ports[port].tableAddr;
moxafunc(ofsAddr, FC_FlushQueue, mode);
if (mode != 1) {
- moxaLowChkFlag[port] = 0;
+ moxa_ports[port].lowChkFlag = 0;
low_water_check(ofsAddr);
}
}
case MOXA_FLUSH_QUEUE:
MoxaPortFlushData(port, arg);
return (0);
- case MOXA_GET_IOQUEUE:
- for (i = 0; i < MAX_PORTS; i++) {
- if (moxaChkPort[i]) {
- temp_queue[i].inq = MoxaPortRxQueue(i);
- temp_queue[i].outq = MoxaPortTxQueue(i);
+ case MOXA_GET_IOQUEUE: {
+ struct moxaq_str __user *argm = argp;
+ struct moxaq_str tmp;
+
+ for (i = 0; i < MAX_PORTS; i++, argm++) {
+ memset(&tmp, 0, sizeof(tmp));
+ if (moxa_ports[i].chkPort) {
+ tmp.inq = MoxaPortRxQueue(i);
+ tmp.outq = MoxaPortTxQueue(i);
}
+ if (copy_to_user(argm, &tmp, sizeof(tmp)))
+ return -EFAULT;
}
- if(copy_to_user(argp, temp_queue, sizeof(struct moxaq_str) * MAX_PORTS))
- return -EFAULT;
return (0);
- case MOXA_GET_OQUEUE:
+ } case MOXA_GET_OQUEUE:
i = MoxaPortTxQueue(port);
return put_user(i, (unsigned long __user *)argp);
case MOXA_GET_IQUEUE:
if(copy_to_user(argp, &i, sizeof(int)))
return -EFAULT;
return 0;
- case MOXA_GETMSTATUS:
- for (i = 0; i < MAX_PORTS; i++) {
- GMStatus[i].ri = 0;
- GMStatus[i].dcd = 0;
- GMStatus[i].dsr = 0;
- GMStatus[i].cts = 0;
- if (!moxaChkPort[i]) {
- continue;
+ case MOXA_GETMSTATUS: {
+ struct mxser_mstatus __user *argm = argp;
+ struct mxser_mstatus tmp;
+ struct moxa_port *p;
+
+ for (i = 0; i < MAX_PORTS; i++, argm++) {
+ p = &moxa_ports[i];
+ memset(&tmp, 0, sizeof(tmp));
+ if (!p->chkPort) {
+ goto copy;
} else {
- status = MoxaPortLineStatus(moxaChannels[i].port);
+ status = MoxaPortLineStatus(p->port);
if (status & 1)
- GMStatus[i].cts = 1;
+ tmp.cts = 1;
if (status & 2)
- GMStatus[i].dsr = 1;
+ tmp.dsr = 1;
if (status & 4)
- GMStatus[i].dcd = 1;
+ tmp.dcd = 1;
}
- if (!moxaChannels[i].tty || !moxaChannels[i].tty->termios)
- GMStatus[i].cflag = moxaChannels[i].cflag;
+ if (!p->tty || !p->tty->termios)
+ tmp.cflag = p->cflag;
else
- GMStatus[i].cflag = moxaChannels[i].tty->termios->c_cflag;
+ tmp.cflag = p->tty->termios->c_cflag;
+copy:
+ if (copy_to_user(argm, &tmp, sizeof(tmp)))
+ return -EFAULT;
}
- if(copy_to_user(argp, GMStatus, sizeof(struct mxser_mstatus) * MAX_PORTS))
- return -EFAULT;
return 0;
- default:
+ } default:
return (-ENOIOCTLCMD);
case MOXA_LOAD_BIOS:
case MOXA_FIND_BOARD:
if(copy_from_user(&dltmp, argp, sizeof(struct dl_str)))
return -EFAULT;
- if(dltmp.cardno < 0 || dltmp.cardno >= MAX_BOARDS)
+ if(dltmp.cardno < 0 || dltmp.cardno >= MAX_BOARDS || dltmp.len < 0)
return -EINVAL;
switch(cmd)
int MoxaDriverPoll(void)
{
+ struct moxa_board_conf *brd;
register ushort temp;
register int card;
void __iomem *ofsAddr;
if (moxaCard == 0)
return (-1);
for (card = 0; card < MAX_BOARDS; card++) {
- if (loadstat[card] == 0)
+ brd = &moxa_boards[card];
+ if (brd->loadstat == 0)
continue;
- if ((ports = moxa_boards[card].numPorts) == 0)
+ if ((ports = brd->numPorts) == 0)
continue;
- if (readb(moxaIntPend[card]) == 0xff) {
- ip = moxaIntTable[card] + readb(moxaIntNdx[card]);
+ if (readb(brd->intPend) == 0xff) {
+ ip = brd->intTable + readb(brd->intNdx);
p = card * MAX_PORTS_PER_BOARD;
ports <<= 1;
for (port = 0; port < ports; port += 2, p++) {
if ((temp = readw(ip + port)) != 0) {
writew(0, ip + port);
- ofsAddr = moxaTableAddr[p];
+ ofsAddr = moxa_ports[p].tableAddr;
if (temp & IntrTx)
writew(readw(ofsAddr + HostStat) & ~WakeupTx, ofsAddr + HostStat);
if (temp & IntrBreak) {
- moxaBreakCnt[p]++;
+ moxa_ports[p].breakCnt++;
}
if (temp & IntrLine) {
if (readb(ofsAddr + FlagStat) & DCD_state) {
- if ((moxaDCDState[p] & DCD_oldstate) == 0)
- moxaDCDState[p] = (DCD_oldstate |
+ if ((moxa_ports[p].DCDState & DCD_oldstate) == 0)
+ moxa_ports[p].DCDState = (DCD_oldstate |
DCD_changed);
} else {
- if (moxaDCDState[p] & DCD_oldstate)
- moxaDCDState[p] = DCD_changed;
+ if (moxa_ports[p].DCDState & DCD_oldstate)
+ moxa_ports[p].DCDState = DCD_changed;
}
}
}
}
- writeb(0, moxaIntPend[card]);
+ writeb(0, brd->intPend);
}
if (moxaLowWaterChk) {
p = card * MAX_PORTS_PER_BOARD;
for (port = 0; port < ports; port++, p++) {
- if (moxaLowChkFlag[p]) {
- moxaLowChkFlag[p] = 0;
- ofsAddr = moxaTableAddr[p];
+ if (moxa_ports[p].lowChkFlag) {
+ moxa_ports[p].lowChkFlag = 0;
+ ofsAddr = moxa_ports[p].tableAddr;
low_water_check(ofsAddr);
}
}
if (moxaCard == 0)
return (0);
- if (moxaChkPort[port] == 0)
+ if (moxa_ports[port].chkPort == 0)
return (0);
return (1);
}
int MoxaPortLineStatus(int);
short lowwater = 512;
- ofsAddr = moxaTableAddr[port];
+ ofsAddr = moxa_ports[port].tableAddr;
writew(lowwater, ofsAddr + Low_water);
- moxaBreakCnt[port] = 0;
+ moxa_ports[port].breakCnt = 0;
if ((moxa_boards[port / MAX_PORTS_PER_BOARD].boardType == MOXA_BOARD_C320_ISA) ||
(moxa_boards[port / MAX_PORTS_PER_BOARD].boardType == MOXA_BOARD_C320_PCI)) {
moxafunc(ofsAddr, FC_SetBreakIrq, 0);
void MoxaPortDisable(int port)
{
- void __iomem *ofsAddr = moxaTableAddr[port];
+ void __iomem *ofsAddr = moxa_ports[port].tableAddr;
moxafunc(ofsAddr, FC_SetFlowCtl, 0); /* disable flow control */
moxafunc(ofsAddr, FC_ClrLineIrq, Magic_code);
if ((baud < 50L) || ((max = MoxaPortGetMaxBaud(port)) == 0))
return (0);
- ofsAddr = moxaTableAddr[port];
+ ofsAddr = moxa_ports[port].tableAddr;
if (baud > max)
baud = max;
if (max == 38400L)
val = clock / baud;
moxafunc(ofsAddr, FC_SetBaud, val);
baud = clock / val;
- moxaCurBaud[port] = baud;
+ moxa_ports[port].curBaud = baud;
return (baud);
}
tcflag_t cflag;
tcflag_t mode = 0;
- if (moxaChkPort[port] == 0 || termio == 0)
+ if (moxa_ports[port].chkPort == 0 || termio == 0)
return (-1);
- ofsAddr = moxaTableAddr[port];
+ ofsAddr = moxa_ports[port].tableAddr;
cflag = termio->c_cflag; /* termio->c_cflag */
mode = termio->c_cflag & CSIZE;
if (!MoxaPortIsValid(port))
return (-1);
if (dtrState) {
- if (moxaLineCtrl[port] & DTR_ON)
+ if (moxa_ports[port].lineCtrl & DTR_ON)
*dtrState = 1;
else
*dtrState = 0;
}
if (rtsState) {
- if (moxaLineCtrl[port] & RTS_ON)
+ if (moxa_ports[port].lineCtrl & RTS_ON)
*rtsState = 1;
else
*rtsState = 0;
void __iomem *ofsAddr;
int mode;
- ofsAddr = moxaTableAddr[port];
+ ofsAddr = moxa_ports[port].tableAddr;
mode = 0;
if (dtr)
mode |= DTR_ON;
if (rts)
mode |= RTS_ON;
- moxaLineCtrl[port] = mode;
+ moxa_ports[port].lineCtrl = mode;
moxafunc(ofsAddr, FC_LineControl, mode);
}
void __iomem *ofsAddr;
int mode;
- ofsAddr = moxaTableAddr[port];
+ ofsAddr = moxa_ports[port].tableAddr;
mode = 0;
if (rts)
mode |= RTS_FlowCtl;
void __iomem *ofsAddr;
int val;
- ofsAddr = moxaTableAddr[port];
+ ofsAddr = moxa_ports[port].tableAddr;
if ((moxa_boards[port / MAX_PORTS_PER_BOARD].boardType == MOXA_BOARD_C320_ISA) ||
(moxa_boards[port / MAX_PORTS_PER_BOARD].boardType == MOXA_BOARD_C320_PCI)) {
moxafunc(ofsAddr, FC_LineStatus, 0);
val &= 0x0B;
if (val & 8) {
val |= 4;
- if ((moxaDCDState[port] & DCD_oldstate) == 0)
- moxaDCDState[port] = (DCD_oldstate | DCD_changed);
+ if ((moxa_ports[port].DCDState & DCD_oldstate) == 0)
+ moxa_ports[port].DCDState = (DCD_oldstate | DCD_changed);
} else {
- if (moxaDCDState[port] & DCD_oldstate)
- moxaDCDState[port] = DCD_changed;
+ if (moxa_ports[port].DCDState & DCD_oldstate)
+ moxa_ports[port].DCDState = DCD_changed;
}
val &= 7;
return (val);
{
int n;
- if (moxaChkPort[port] == 0)
+ if (moxa_ports[port].chkPort == 0)
return (0);
- n = moxaDCDState[port];
- moxaDCDState[port] &= ~DCD_changed;
+ n = moxa_ports[port].DCDState;
+ moxa_ports[port].DCDState &= ~DCD_changed;
n &= DCD_changed;
return (n);
}
{
int n;
- if (moxaChkPort[port] == 0)
+ if (moxa_ports[port].chkPort == 0)
return (0);
- if (moxaDCDState[port] & DCD_oldstate)
+ if (moxa_ports[port].DCDState & DCD_oldstate)
n = 1;
else
n = 0;
ushort pageno, pageofs, bufhead;
void __iomem *baseAddr, *ofsAddr, *ofs;
- ofsAddr = moxaTableAddr[port];
- baseAddr = moxaBaseAddr[port / MAX_PORTS_PER_BOARD];
+ ofsAddr = moxa_ports[port].tableAddr;
+ baseAddr = moxa_boards[port / MAX_PORTS_PER_BOARD].basemem;
tx_mask = readw(ofsAddr + TX_mask);
spage = readw(ofsAddr + Page_txb);
epage = readw(ofsAddr + EndPage_txb);
ushort pageno, bufhead;
void __iomem *baseAddr, *ofsAddr, *ofs;
- ofsAddr = moxaTableAddr[port];
- baseAddr = moxaBaseAddr[port / MAX_PORTS_PER_BOARD];
+ ofsAddr = moxa_ports[port].tableAddr;
+ baseAddr = moxa_boards[port / MAX_PORTS_PER_BOARD].basemem;
head = readw(ofsAddr + RXrptr);
tail = readw(ofsAddr + RXwptr);
rx_mask = readw(ofsAddr + RX_mask);
}
if ((readb(ofsAddr + FlagStat) & Xoff_state) && (remain < LowWater)) {
moxaLowWaterChk = 1;
- moxaLowChkFlag[port] = 1;
+ moxa_ports[port].lowChkFlag = 1;
}
return (total);
}
ushort rptr, wptr, mask;
int len;
- ofsAddr = moxaTableAddr[port];
+ ofsAddr = moxa_ports[port].tableAddr;
rptr = readw(ofsAddr + TXrptr);
wptr = readw(ofsAddr + TXwptr);
mask = readw(ofsAddr + TX_mask);
ushort rptr, wptr, mask;
int len;
- ofsAddr = moxaTableAddr[port];
+ ofsAddr = moxa_ports[port].tableAddr;
rptr = readw(ofsAddr + TXrptr);
wptr = readw(ofsAddr + TXwptr);
mask = readw(ofsAddr + TX_mask);
ushort rptr, wptr, mask;
int len;
- ofsAddr = moxaTableAddr[port];
+ ofsAddr = moxa_ports[port].tableAddr;
rptr = readw(ofsAddr + RXrptr);
wptr = readw(ofsAddr + RXwptr);
mask = readw(ofsAddr + RX_mask);
{
void __iomem *ofsAddr;
- ofsAddr = moxaTableAddr[port];
+ ofsAddr = moxa_ports[port].tableAddr;
moxafunc(ofsAddr, FC_SetXoffState, Magic_code);
}
{
void __iomem *ofsAddr;
- ofsAddr = moxaTableAddr[port];
+ ofsAddr = moxa_ports[port].tableAddr;
moxafunc(ofsAddr, FC_SetXonState, Magic_code);
}
int MoxaPortResetBrkCnt(int port)
{
ushort cnt;
- cnt = moxaBreakCnt[port];
- moxaBreakCnt[port] = 0;
+ cnt = moxa_ports[port].breakCnt;
+ moxa_ports[port].breakCnt = 0;
return (cnt);
}
{
void __iomem *ofsAddr;
- ofsAddr = moxaTableAddr[port];
+ ofsAddr = moxa_ports[port].tableAddr;
if (ms100) {
moxafunc(ofsAddr, FC_SendBreak, Magic_code);
- moxadelay(ms100 * (HZ / 10));
+ msleep(ms100 * 10);
} else {
moxafunc(ofsAddr, FC_SendBreak, Magic_code);
- moxadelay(HZ / 4); /* 250 ms */
+ msleep(250);
}
moxafunc(ofsAddr, FC_StopBreak, Magic_code);
}
-static int moxa_get_serial_info(struct moxa_str *info,
+static int moxa_get_serial_info(struct moxa_port *info,
struct serial_struct __user *retinfo)
{
struct serial_struct tmp;
}
-static int moxa_set_serial_info(struct moxa_str *info,
+static int moxa_set_serial_info(struct moxa_port *info,
struct serial_struct __user *new_info)
{
struct serial_struct new_serial;
/*****************************************************************************
* Static local functions: *
*****************************************************************************/
-/*
- * moxadelay - delays a specified number ticks
- */
-static void moxadelay(int tick)
-{
- unsigned long st, et;
-
- st = jiffies;
- et = st + tick;
- while (time_before(jiffies, et));
-}
-
static void moxafunc(void __iomem *ofsAddr, int cmd, ushort arg)
{
void __iomem *baseAddr;
int i;
+ if(len < 0 || len > sizeof(moxaBuff))
+ return -EINVAL;
if(copy_from_user(moxaBuff, tmp, len))
return -EFAULT;
- baseAddr = moxaBaseAddr[cardno];
+ baseAddr = moxa_boards[cardno].basemem;
writeb(HW_reset, baseAddr + Control_reg); /* reset */
- moxadelay(1); /* delay 10 ms */
+ msleep(10);
for (i = 0; i < 4096; i++)
writeb(0, baseAddr + i); /* clear fix page */
for (i = 0; i < len; i++)
void __iomem *baseAddr;
ushort tmp;
- baseAddr = moxaBaseAddr[cardno];
+ baseAddr = moxa_boards[cardno].basemem;
switch (moxa_boards[cardno].boardType) {
case MOXA_BOARD_C218_ISA:
case MOXA_BOARD_C218_PCI:
void __iomem *baseAddr;
int i;
- if(len > sizeof(moxaBuff))
+ if(len < 0 || len > sizeof(moxaBuff))
return -EINVAL;
if(copy_from_user(moxaBuff, tmp, len))
return -EFAULT;
- baseAddr = moxaBaseAddr[cardno];
+ baseAddr = moxa_boards[cardno].basemem;
writew(len - 7168 - 2, baseAddr + C320bapi_len);
writeb(1, baseAddr + Control_reg); /* Select Page 1 */
for (i = 0; i < 7168; i++)
void __iomem *baseAddr, *ofsAddr;
int retval, port, i;
+ if(len < 0 || len > sizeof(moxaBuff))
+ return -EINVAL;
if(copy_from_user(moxaBuff, tmp, len))
return -EFAULT;
- baseAddr = moxaBaseAddr[cardno];
+ baseAddr = moxa_boards[cardno].basemem;
switch (moxa_boards[cardno].boardType) {
case MOXA_BOARD_C218_ISA:
case MOXA_BOARD_C218_PCI:
return (retval);
port = cardno * MAX_PORTS_PER_BOARD;
for (i = 0; i < moxa_boards[cardno].numPorts; i++, port++) {
- moxaChkPort[port] = 1;
- moxaCurBaud[port] = 9600L;
- moxaDCDState[port] = 0;
- moxaTableAddr[port] = baseAddr + Extern_table + Extern_size * i;
- ofsAddr = moxaTableAddr[port];
+ struct moxa_port *p = &moxa_ports[port];
+
+ p->chkPort = 1;
+ p->curBaud = 9600L;
+ p->DCDState = 0;
+ p->tableAddr = baseAddr + Extern_table + Extern_size * i;
+ ofsAddr = p->tableAddr;
writew(C218rx_mask, ofsAddr + RX_mask);
writew(C218tx_mask, ofsAddr + TX_mask);
writew(C218rx_spage + i * C218buf_pageno, ofsAddr + Page_rxb);
return (retval);
port = cardno * MAX_PORTS_PER_BOARD;
for (i = 0; i < moxa_boards[cardno].numPorts; i++, port++) {
- moxaChkPort[port] = 1;
- moxaCurBaud[port] = 9600L;
- moxaDCDState[port] = 0;
- moxaTableAddr[port] = baseAddr + Extern_table + Extern_size * i;
- ofsAddr = moxaTableAddr[port];
+ struct moxa_port *p = &moxa_ports[port];
+
+ p->chkPort = 1;
+ p->curBaud = 9600L;
+ p->DCDState = 0;
+ p->tableAddr = baseAddr + Extern_table + Extern_size * i;
+ ofsAddr = p->tableAddr;
if (moxa_boards[cardno].numPorts == 8) {
writew(C320p8rx_mask, ofsAddr + RX_mask);
writew(C320p8tx_mask, ofsAddr + TX_mask);
}
break;
}
- loadstat[cardno] = 1;
+ moxa_boards[cardno].loadstat = 1;
return (0);
}
for (i = 0; i < 100; i++) {
if (readw(baseAddr + C218_key) == keycode)
break;
- moxadelay(1); /* delay 10 ms */
+ msleep(10);
}
if (readw(baseAddr + C218_key) != keycode) {
return (-1);
for (i = 0; i < 100; i++) {
if (readw(baseAddr + C218_key) == keycode)
break;
- moxadelay(1); /* delay 10 ms */
+ msleep(10);
}
retry++;
} while ((readb(baseAddr + C218chksum_ok) != 1) && (retry < 3));
for (i = 0; i < 100; i++) {
if (readw(baseAddr + Magic_no) == Magic_code)
break;
- moxadelay(1); /* delay 10 ms */
+ msleep(10);
}
if (readw(baseAddr + Magic_no) != Magic_code) {
return (-1);
for (i = 0; i < 100; i++) {
if (readw(baseAddr + Magic_no) == Magic_code)
break;
- moxadelay(1); /* delay 10 ms */
+ msleep(10);
}
if (readw(baseAddr + Magic_no) != Magic_code) {
return (-1);
}
moxaCard = 1;
- moxaIntNdx[cardno] = baseAddr + IRQindex;
- moxaIntPend[cardno] = baseAddr + IRQpending;
- moxaIntTable[cardno] = baseAddr + IRQtable;
+ moxa_boards[cardno].intNdx = baseAddr + IRQindex;
+ moxa_boards[cardno].intPend = baseAddr + IRQpending;
+ moxa_boards[cardno].intTable = baseAddr + IRQtable;
return (0);
}
for (i = 0; i < 10; i++) {
if (readw(baseAddr + C320_key) == C320_KeyCode)
break;
- moxadelay(1);
+ msleep(10);
}
if (readw(baseAddr + C320_key) != C320_KeyCode)
return (-1);
for (i = 0; i < 10; i++) {
if (readw(baseAddr + C320_key) == C320_KeyCode)
break;
- moxadelay(1);
+ msleep(10);
}
retry++;
} while ((readb(baseAddr + C320chksum_ok) != 1) && (retry < 3));
for (i = 0; i < 600; i++) {
if (readw(baseAddr + Magic_no) == Magic_code)
break;
- moxadelay(1);
+ msleep(10);
}
if (readw(baseAddr + Magic_no) != Magic_code)
return (-100);
for (i = 0; i < 500; i++) {
if (readw(baseAddr + Magic_no) == Magic_code)
break;
- moxadelay(1);
+ msleep(10);
}
if (readw(baseAddr + Magic_no) != Magic_code)
return (-102);
for (i = 0; i < 600; i++) {
if (readw(baseAddr + Magic_no) == Magic_code)
break;
- moxadelay(1);
+ msleep(10);
}
if (readw(baseAddr + Magic_no) != Magic_code)
return (-102);
moxaCard = 1;
- moxaIntNdx[cardno] = baseAddr + IRQindex;
- moxaIntPend[cardno] = baseAddr + IRQpending;
- moxaIntTable[cardno] = baseAddr + IRQtable;
+ moxa_boards[cardno].intNdx = baseAddr + IRQindex;
+ moxa_boards[cardno].intPend = baseAddr + IRQpending;
+ moxa_boards[cardno].intTable = baseAddr + IRQtable;
return (0);
}
static void MoxaSetFifo(int port, int enable)
{
- void __iomem *ofsAddr = moxaTableAddr[port];
+ void __iomem *ofsAddr = moxa_ports[port].tableAddr;
if (!enable) {
moxafunc(ofsAddr, FC_SetRxFIFOTrig, 0);