]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - drivers/char/synclink.c
Merge branch 'master' into tk71
[mv-sheeva.git] / drivers / char / synclink.c
index a2a58004e188eaf2a3be13909c735b7b2a8b39d1..3a6824f12be2f8dc6c17e0862e49b74de786ebfd 100644 (file)
@@ -2925,6 +2925,38 @@ static int mgsl_break(struct tty_struct *tty, int break_state)
        
 }      /* end of mgsl_break() */
 
+/*
+ * Get counter of input serial line interrupts (DCD,RI,DSR,CTS)
+ * Return: write counters to the user passed counter struct
+ * NB: both 1->0 and 0->1 transitions are counted except for
+ *     RI where only 0->1 is counted.
+ */
+static int msgl_get_icount(struct tty_struct *tty,
+                               struct serial_icounter_struct *icount)
+
+{
+       struct mgsl_struct * info = tty->driver_data;
+       struct mgsl_icount cnow;        /* kernel counter temps */
+       unsigned long flags;
+
+       spin_lock_irqsave(&info->irq_spinlock,flags);
+       cnow = info->icount;
+       spin_unlock_irqrestore(&info->irq_spinlock,flags);
+
+       icount->cts = cnow.cts;
+       icount->dsr = cnow.dsr;
+       icount->rng = cnow.rng;
+       icount->dcd = cnow.dcd;
+       icount->rx = cnow.rx;
+       icount->tx = cnow.tx;
+       icount->frame = cnow.frame;
+       icount->overrun = cnow.overrun;
+       icount->parity = cnow.parity;
+       icount->brk = cnow.brk;
+       icount->buf_overrun = cnow.buf_overrun;
+       return 0;
+}
+
 /* mgsl_ioctl()        Service an IOCTL request
  *     
  * Arguments:
@@ -2949,7 +2981,7 @@ static int mgsl_ioctl(struct tty_struct *tty, struct file * file,
                return -ENODEV;
 
        if ((cmd != TIOCGSERIAL) && (cmd != TIOCSSERIAL) &&
-           (cmd != TIOCMIWAIT) && (cmd != TIOCGICOUNT)) {
+           (cmd != TIOCMIWAIT)) {
                if (tty->flags & (1 << TTY_IO_ERROR))
                    return -EIO;
        }
@@ -2959,11 +2991,7 @@ static int mgsl_ioctl(struct tty_struct *tty, struct file * file,
 
 static int mgsl_ioctl_common(struct mgsl_struct *info, unsigned int cmd, unsigned long arg)
 {
-       int error;
-       struct mgsl_icount cnow;        /* kernel counter temps */
        void __user *argp = (void __user *)arg;
-       struct serial_icounter_struct __user *p_cuser;  /* user space */
-       unsigned long flags;
        
        switch (cmd) {
                case MGSL_IOCGPARAMS:
@@ -2992,40 +3020,6 @@ static int mgsl_ioctl_common(struct mgsl_struct *info, unsigned int cmd, unsigne
                case TIOCMIWAIT:
                        return modem_input_wait(info,(int)arg);
 
-               /* 
-                * Get counter of input serial line interrupts (DCD,RI,DSR,CTS)
-                * Return: write counters to the user passed counter struct
-                * NB: both 1->0 and 0->1 transitions are counted except for
-                *     RI where only 0->1 is counted.
-                */
-               case TIOCGICOUNT:
-                       spin_lock_irqsave(&info->irq_spinlock,flags);
-                       cnow = info->icount;
-                       spin_unlock_irqrestore(&info->irq_spinlock,flags);
-                       p_cuser = argp;
-                       PUT_USER(error,cnow.cts, &p_cuser->cts);
-                       if (error) return error;
-                       PUT_USER(error,cnow.dsr, &p_cuser->dsr);
-                       if (error) return error;
-                       PUT_USER(error,cnow.rng, &p_cuser->rng);
-                       if (error) return error;
-                       PUT_USER(error,cnow.dcd, &p_cuser->dcd);
-                       if (error) return error;
-                       PUT_USER(error,cnow.rx, &p_cuser->rx);
-                       if (error) return error;
-                       PUT_USER(error,cnow.tx, &p_cuser->tx);
-                       if (error) return error;
-                       PUT_USER(error,cnow.frame, &p_cuser->frame);
-                       if (error) return error;
-                       PUT_USER(error,cnow.overrun, &p_cuser->overrun);
-                       if (error) return error;
-                       PUT_USER(error,cnow.parity, &p_cuser->parity);
-                       if (error) return error;
-                       PUT_USER(error,cnow.brk, &p_cuser->brk);
-                       if (error) return error;
-                       PUT_USER(error,cnow.buf_overrun, &p_cuser->buf_overrun);
-                       if (error) return error;
-                       return 0;
                default:
                        return -ENOIOCTLCMD;
        }
@@ -4328,6 +4322,7 @@ static const struct tty_operations mgsl_ops = {
        .hangup = mgsl_hangup,
        .tiocmget = tiocmget,
        .tiocmset = tiocmset,
+       .get_icount = msgl_get_icount,
        .proc_fops = &mgsl_proc_fops,
 };