vserver 1.9.5.x5
[linux-2.6.git] / drivers / char / moxa.c
index d45d381..10ba9bf 100644 (file)
 #include <linux/delay.h>
 #include <linux/pci.h>
 #include <linux/init.h>
+#include <linux/bitops.h>
 
 #include <asm/system.h>
 #include <asm/io.h>
-#include <asm/bitops.h>
 #include <asm/uaccess.h>
 
 #define                MOXA_VERSION            "5.1k"
@@ -142,7 +142,7 @@ typedef struct _moxa_board_conf {
 } moxa_board_conf;
 
 static moxa_board_conf moxa_boards[MAX_BOARDS];
-static unsigned long moxaBaseAddr[MAX_BOARDS];
+static void __iomem *moxaBaseAddr[MAX_BOARDS];
 
 struct moxa_str {
        int type;
@@ -201,11 +201,13 @@ static int numports[]     =       {0, 0, 0, 0};
 MODULE_AUTHOR("William Chen");
 MODULE_DESCRIPTION("MOXA Intellio Family Multiport Board Device Driver");
 MODULE_LICENSE("GPL");
-MODULE_PARM(type, "1-4i");
-MODULE_PARM(baseaddr, "1-4i");
-MODULE_PARM(numports, "1-4i");
-MODULE_PARM(ttymajor, "i");
-MODULE_PARM(verbose, "i");
+#ifdef MODULE
+module_param_array(type, int, NULL, 0);
+module_param_array(baseaddr, int, NULL, 0);
+module_param_array(numports, int, NULL, 0);
+#endif
+module_param(ttymajor, int, 0);
+module_param(verbose, bool, 0644);
 
 static struct tty_driver *moxaDriver;
 static struct moxa_str moxaChannels[MAX_PORTS];
@@ -222,7 +224,7 @@ static struct semaphore moxaBuffSem;
 static void do_moxa_softint(void *);
 static int moxa_open(struct tty_struct *, struct file *);
 static void moxa_close(struct tty_struct *, struct file *);
-static int moxa_write(struct tty_struct *, int, const unsigned char *, int);
+static int moxa_write(struct tty_struct *, const unsigned char *, int);
 static int moxa_write_room(struct tty_struct *);
 static void moxa_flush_buffer(struct tty_struct *);
 static int moxa_chars_in_buffer(struct tty_struct *);
@@ -467,7 +469,7 @@ static int __init moxa_init(void)
        }
 #endif
        for (i = 0; i < numBoards; i++) {
-               moxaBaseAddr[i] = (unsigned long) ioremap((unsigned long) moxa_boards[i].baseAddr, 0x4000);
+               moxaBaseAddr[i] = ioremap((unsigned long) moxa_boards[i].baseAddr, 0x4000);
        }
 
        return (0);
@@ -492,7 +494,6 @@ static void __exit moxa_exit(void)
        put_tty_driver(moxaDriver);
        if (verbose)
                printk("Done\n");
-
 }
 
 module_init(moxa_init);
@@ -625,8 +626,7 @@ static void moxa_close(struct tty_struct *tty, struct file *filp)
        ch->tty = NULL;
        if (ch->blocked_open) {
                if (ch->close_delay) {
-                       set_current_state(TASK_INTERRUPTIBLE);
-                       schedule_timeout(ch->close_delay);
+                       msleep_interruptible(jiffies_to_msecs(ch->close_delay));
                }
                wake_up_interruptible(&ch->open_wait);
        }
@@ -634,7 +634,7 @@ static void moxa_close(struct tty_struct *tty, struct file *filp)
        wake_up_interruptible(&ch->close_wait);
 }
 
-static int moxa_write(struct tty_struct *tty, int from_user,
+static int moxa_write(struct tty_struct *tty,
                      const unsigned char *buf, int count)
 {
        struct moxa_str *ch;
@@ -646,25 +646,9 @@ static int moxa_write(struct tty_struct *tty, int from_user,
                return (0);
        port = ch->port;
        save_flags(flags);
-       if (from_user) {
-               if (count > PAGE_SIZE)
-                       count = PAGE_SIZE;
-               down(&moxaBuffSem);
-               if (copy_from_user(moxaXmitBuff, buf, count)) {
-                       len = -EFAULT;
-               } else {
-                       cli();
-                       len = MoxaPortWriteData(port, moxaXmitBuff, count);
-                       restore_flags(flags);
-               }
-               up(&moxaBuffSem);
-               if (len < 0)
-                       return len;
-       } else {
-               cli();
-               len = MoxaPortWriteData(port, (unsigned char *) buf, count);
-               restore_flags(flags);
-       }
+       cli();
+       len = MoxaPortWriteData(port, (unsigned char *) buf, count);
+       restore_flags(flags);
 
        /*********************************************
        if ( !(ch->statusflags & LOWWAIT) &&
@@ -694,7 +678,6 @@ static void moxa_flush_buffer(struct tty_struct *tty)
                return;
        MoxaPortFlushData(ch->port, 1);
        tty_wakeup(tty);
-       wake_up_interruptible(&tty->write_wait);
 }
 
 static int moxa_chars_in_buffer(struct tty_struct *tty)
@@ -953,7 +936,6 @@ static void moxa_poll(unsigned long ignored)
                                        if (!tp->stopped) {
                                                ch->statusflags &= ~LOWWAIT;
                                                tty_wakeup(tp);
-                                               wake_up_interruptible(&tp->write_wait);
                                        }
                                }
                        }
@@ -1120,7 +1102,6 @@ static void check_xmit_empty(unsigned long data)
                if (MoxaPortTxQueue(ch->port) == 0) {
                        ch->statusflags &= ~EMPTYWAIT;
                        tty_wakeup(ch->tty);
-                       wake_up_interruptible(&ch->tty->write_wait);
                        return;
                }
                moxaEmptyTimer[ch->port].expires = jiffies + HZ;
@@ -1498,12 +1479,12 @@ typedef struct mon_str mon_st;
 #define        DCD_oldstate    0x80
 
 static unsigned char moxaBuff[10240];
-static unsigned long moxaIntNdx[MAX_BOARDS];
-static unsigned long moxaIntPend[MAX_BOARDS];
-static unsigned long moxaIntTable[MAX_BOARDS];
+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 unsigned long moxaTableAddr[MAX_PORTS];
+static void __iomem *moxaTableAddr[MAX_PORTS];
 static long moxaCurBaud[MAX_PORTS];
 static char moxaDCDState[MAX_PORTS];
 static char moxaLowChkFlag[MAX_PORTS];
@@ -1514,15 +1495,15 @@ static int moxaFuncTout;
 static ushort moxaBreakCnt[MAX_PORTS];
 
 static void moxadelay(int);
-static void moxafunc(unsigned long, int, ushort);
-static void wait_finish(unsigned long);
-static void low_water_check(unsigned long);
+static void moxafunc(void __iomem *, int, ushort);
+static void wait_finish(void __iomem *);
+static void low_water_check(void __iomem *);
 static int moxaloadbios(int, unsigned char __user *, int);
 static int moxafindcard(int);
 static int moxaload320b(int, unsigned char __user *, int);
 static int moxaloadcode(int, unsigned char __user *, int);
-static int moxaloadc218(int, unsigned long, int);
-static int moxaloadc320(int, unsigned long, int, int *);
+static int moxaloadc218(int, void __iomem *, int);
+static int moxaloadc320(int, void __iomem *, int, int *);
 
 /*****************************************************************************
  *     Driver level functions:                                              *
@@ -1580,7 +1561,7 @@ static struct dl_str dltmp;
 
 void MoxaPortFlushData(int port, int mode)
 {
-       unsigned long ofsAddr;
+       void __iomem *ofsAddr;
        if ((mode < 0) || (mode > 2))
                return;
        ofsAddr = moxaTableAddr[port];
@@ -1712,7 +1693,8 @@ int MoxaDriverPoll(void)
 {
        register ushort temp;
        register int card;
-       unsigned long ip, ofsAddr;
+       void __iomem *ofsAddr;
+       void __iomem *ip;
        int port, p, ports;
 
        if (moxaCard == 0)
@@ -2145,7 +2127,7 @@ int MoxaPortIsValid(int port)
 
 void MoxaPortEnable(int port)
 {
-       unsigned long ofsAddr;
+       void __iomem *ofsAddr;
        int MoxaPortLineStatus(int);
        short lowwater = 512;
 
@@ -2168,9 +2150,8 @@ void MoxaPortEnable(int port)
 
 void MoxaPortDisable(int port)
 {
-       unsigned long ofsAddr;
+       void __iomem *ofsAddr = moxaTableAddr[port];
 
-       ofsAddr = moxaTableAddr[port];
        moxafunc(ofsAddr, FC_SetFlowCtl, 0);    /* disable flow control */
        moxafunc(ofsAddr, FC_ClrLineIrq, Magic_code);
        writew(0, ofsAddr + HostStat);
@@ -2189,7 +2170,7 @@ long MoxaPortGetMaxBaud(int port)
 
 long MoxaPortSetBaud(int port, long baud)
 {
-       unsigned long ofsAddr;
+       void __iomem *ofsAddr;
        long max, clock;
        unsigned int val;
 
@@ -2213,7 +2194,7 @@ long MoxaPortSetBaud(int port, long baud)
 
 int MoxaPortSetTermio(int port, struct termios *termio)
 {
-       unsigned long ofsAddr;
+       void __iomem *ofsAddr;
        tcflag_t cflag;
        long baud;
        tcflag_t mode = 0;
@@ -2358,7 +2339,7 @@ int MoxaPortGetLineOut(int port, int *dtrState, int *rtsState)
 
 void MoxaPortLineCtrl(int port, int dtr, int rts)
 {
-       unsigned long ofsAddr;
+       void __iomem *ofsAddr;
        int mode;
 
        ofsAddr = moxaTableAddr[port];
@@ -2373,7 +2354,7 @@ void MoxaPortLineCtrl(int port, int dtr, int rts)
 
 void MoxaPortFlowCtrl(int port, int rts, int cts, int txflow, int rxflow, int txany)
 {
-       unsigned long ofsAddr;
+       void __iomem *ofsAddr;
        int mode;
 
        ofsAddr = moxaTableAddr[port];
@@ -2393,7 +2374,7 @@ void MoxaPortFlowCtrl(int port, int rts, int cts, int txflow, int rxflow, int tx
 
 int MoxaPortLineStatus(int port)
 {
-       unsigned long ofsAddr;
+       void __iomem *ofsAddr;
        int val;
 
        ofsAddr = moxaTableAddr[port];
@@ -2466,7 +2447,7 @@ int MoxaPortWriteData(int port, unsigned char * buffer, int len)
        int cnt;
        ushort head, tx_mask, spage, epage;
        ushort pageno, pageofs, bufhead;
-       unsigned long baseAddr, ofsAddr, ofs;
+       void __iomem *baseAddr, *ofsAddr, *ofs;
 
        ofsAddr = moxaTableAddr[port];
        baseAddr = moxaBaseAddr[port / MAX_PORTS_PER_BOARD];
@@ -2529,7 +2510,7 @@ int MoxaPortReadData(int port, unsigned char * buffer, int space)
        int i, count, cnt, len, total, remain;
        ushort tail, rx_mask, spage, epage;
        ushort pageno, bufhead;
-       unsigned long baseAddr, ofsAddr, ofs;
+       void __iomem *baseAddr, *ofsAddr, *ofs;
 
        ofsAddr = moxaTableAddr[port];
        baseAddr = moxaBaseAddr[port / MAX_PORTS_PER_BOARD];
@@ -2595,7 +2576,7 @@ int MoxaPortReadData(int port, unsigned char * buffer, int space)
 
 int MoxaPortTxQueue(int port)
 {
-       unsigned long ofsAddr;
+       void __iomem *ofsAddr;
        ushort rptr, wptr, mask;
        int len;
 
@@ -2609,7 +2590,7 @@ int MoxaPortTxQueue(int port)
 
 int MoxaPortTxFree(int port)
 {
-       unsigned long ofsAddr;
+       void __iomem *ofsAddr;
        ushort rptr, wptr, mask;
        int len;
 
@@ -2623,7 +2604,7 @@ int MoxaPortTxFree(int port)
 
 int MoxaPortRxQueue(int port)
 {
-       unsigned long ofsAddr;
+       void __iomem *ofsAddr;
        ushort rptr, wptr, mask;
        int len;
 
@@ -2638,7 +2619,7 @@ int MoxaPortRxQueue(int port)
 
 void MoxaPortTxDisable(int port)
 {
-       unsigned long ofsAddr;
+       void __iomem *ofsAddr;
 
        ofsAddr = moxaTableAddr[port];
        moxafunc(ofsAddr, FC_SetXoffState, Magic_code);
@@ -2646,7 +2627,7 @@ void MoxaPortTxDisable(int port)
 
 void MoxaPortTxEnable(int port)
 {
-       unsigned long ofsAddr;
+       void __iomem *ofsAddr;
 
        ofsAddr = moxaTableAddr[port];
        moxafunc(ofsAddr, FC_SetXonState, Magic_code);
@@ -2664,7 +2645,7 @@ int MoxaPortResetBrkCnt(int port)
 
 void MoxaPortSendBreak(int port, int ms100)
 {
-       unsigned long ofsAddr;
+       void __iomem *ofsAddr;
 
        ofsAddr = moxaTableAddr[port];
        if (ms100) {
@@ -2753,7 +2734,7 @@ static void moxadelay(int tick)
        while (time_before(jiffies, et));
 }
 
-static void moxafunc(unsigned long ofsAddr, int cmd, ushort arg)
+static void moxafunc(void __iomem *ofsAddr, int cmd, ushort arg)
 {
 
        writew(arg, ofsAddr + FuncArg);
@@ -2761,7 +2742,7 @@ static void moxafunc(unsigned long ofsAddr, int cmd, ushort arg)
        wait_finish(ofsAddr);
 }
 
-static void wait_finish(unsigned long ofsAddr)
+static void wait_finish(void __iomem *ofsAddr)
 {
        unsigned long i, j;
 
@@ -2774,7 +2755,7 @@ static void wait_finish(unsigned long ofsAddr)
        }
 }
 
-static void low_water_check(unsigned long ofsAddr)
+static void low_water_check(void __iomem *ofsAddr)
 {
        int len;
        ushort rptr, wptr, mask;
@@ -2791,7 +2772,7 @@ static void low_water_check(unsigned long ofsAddr)
 
 static int moxaloadbios(int cardno, unsigned char __user *tmp, int len)
 {
-       unsigned long baseAddr;
+       void __iomem *baseAddr;
        int i;
 
        if(copy_from_user(moxaBuff, tmp, len))
@@ -2809,7 +2790,7 @@ static int moxaloadbios(int cardno, unsigned char __user *tmp, int len)
 
 static int moxafindcard(int cardno)
 {
-       unsigned long baseAddr;
+       void __iomem *baseAddr;
        ushort tmp;
 
        baseAddr = moxaBaseAddr[cardno];
@@ -2838,7 +2819,7 @@ static int moxafindcard(int cardno)
 
 static int moxaload320b(int cardno, unsigned char __user *tmp, int len)
 {
-       unsigned long baseAddr;
+       void __iomem *baseAddr;
        int i;
 
        if(len > sizeof(moxaBuff))
@@ -2858,7 +2839,7 @@ static int moxaload320b(int cardno, unsigned char __user *tmp, int len)
 
 static int moxaloadcode(int cardno, unsigned char __user *tmp, int len)
 {
-       unsigned long baseAddr, ofsAddr;
+       void __iomem *baseAddr, *ofsAddr;
        int retval, port, i;
 
        if(copy_from_user(moxaBuff, tmp, len))
@@ -2938,7 +2919,7 @@ static int moxaloadcode(int cardno, unsigned char __user *tmp, int len)
        return (0);
 }
 
-static int moxaloadc218(int cardno, unsigned long baseAddr, int len)
+static int moxaloadc218(int cardno, void __iomem *baseAddr, int len)
 {
        char retry;
        int i, j, len1, len2;
@@ -3014,7 +2995,7 @@ static int moxaloadc218(int cardno, unsigned long baseAddr, int len)
        return (0);
 }
 
-static int moxaloadc320(int cardno, unsigned long baseAddr, int len, int *numPorts)
+static int moxaloadc320(int cardno, void __iomem *baseAddr, int len, int *numPorts)
 {
        ushort usum;
        int i, j, wlen, len2, retry;
@@ -3119,7 +3100,7 @@ long MoxaPortGetCurBaud(int port)
 
 static void MoxaSetFifo(int port, int enable)
 {
-       unsigned long ofsAddr = moxaTableAddr[port];
+       void __iomem *ofsAddr = moxaTableAddr[port];
 
        if (!enable) {
                moxafunc(ofsAddr, FC_SetRxFIFOTrig, 0);
@@ -3133,7 +3114,7 @@ static void MoxaSetFifo(int port, int enable)
 #if 0
 int MoxaPortSetMode(int port, int databits, int stopbits, int parity)
 {
-       unsigned long ofsAddr;
+       void __iomem *ofsAddr;
        int val;
 
        val = 0;
@@ -3192,7 +3173,7 @@ int MoxaPortSetMode(int port, int databits, int stopbits, int parity)
 
 int MoxaPortTxBufSize(int port)
 {
-       unsigned long ofsAddr;
+       void __iomem *ofsAddr;
        int size;
 
        ofsAddr = moxaTableAddr[port];
@@ -3202,7 +3183,7 @@ int MoxaPortTxBufSize(int port)
 
 int MoxaPortRxBufSize(int port)
 {
-       unsigned long ofsAddr;
+       void __iomem *ofsAddr;
        int size;
 
        ofsAddr = moxaTableAddr[port];
@@ -3212,7 +3193,7 @@ int MoxaPortRxBufSize(int port)
 
 int MoxaPortRxFree(int port)
 {
-       unsigned long ofsAddr;
+       void __iomem *ofsAddr;
        ushort rptr, wptr, mask;
        int len;
 
@@ -3230,7 +3211,7 @@ int MoxaPortGetBrkCnt(int port)
 
 void MoxaPortSetXonXoff(int port, int xonValue, int xoffValue)
 {
-       unsigned long ofsAddr;
+       void __iomem *ofsAddr;
 
        ofsAddr = moxaTableAddr[port];
        writew(xonValue, ofsAddr + FuncArg);
@@ -3241,7 +3222,7 @@ void MoxaPortSetXonXoff(int port, int xonValue, int xoffValue)
 
 int MoxaPortIsTxHold(int port)
 {
-       unsigned long ofsAddr;
+       void __iomem *ofsAddr;
        int val;
 
        ofsAddr = moxaTableAddr[port];