whiteheat: switch to ->get_serial()
authorAl Viro <viro@zeniv.linux.org.uk>
Wed, 12 Sep 2018 11:34:34 +0000 (07:34 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Sat, 13 Oct 2018 04:50:42 +0000 (00:50 -0400)
... and fix the return value - on success it used to have ioctl(2)
fill the user-supplied struct serial_struct and return -ENOTTY.

Reviewed-by: Johan Hovold <johan@kernel.org>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
drivers/usb/serial/whiteheat.c

index 1c7b46a8620cc039847bcdbbb814f76576a53e41..aefd84f88b596c246b1dea2e066c9aa3c21af168 100644 (file)
@@ -83,8 +83,8 @@ static int  whiteheat_port_remove(struct usb_serial_port *port);
 static int  whiteheat_open(struct tty_struct *tty,
                        struct usb_serial_port *port);
 static void whiteheat_close(struct usb_serial_port *port);
-static int  whiteheat_ioctl(struct tty_struct *tty,
-                       unsigned int cmd, unsigned long arg);
+static int  whiteheat_get_serial(struct tty_struct *tty,
+                       struct serial_struct *ss);
 static void whiteheat_set_termios(struct tty_struct *tty,
                        struct usb_serial_port *port, struct ktermios *old);
 static int  whiteheat_tiocmget(struct tty_struct *tty);
@@ -120,7 +120,7 @@ static struct usb_serial_driver whiteheat_device = {
        .port_remove =          whiteheat_port_remove,
        .open =                 whiteheat_open,
        .close =                whiteheat_close,
-       .ioctl =                whiteheat_ioctl,
+       .get_serial =           whiteheat_get_serial,
        .set_termios =          whiteheat_set_termios,
        .break_ctl =            whiteheat_break_ctl,
        .tiocmget =             whiteheat_tiocmget,
@@ -442,33 +442,21 @@ static int whiteheat_tiocmset(struct tty_struct *tty,
 }
 
 
-static int whiteheat_ioctl(struct tty_struct *tty,
-                                       unsigned int cmd, unsigned long arg)
+static int whiteheat_get_serial(struct tty_struct *tty,
+                               struct serial_struct *ss)
 {
        struct usb_serial_port *port = tty->driver_data;
-       struct serial_struct serstruct;
-       void __user *user_arg = (void __user *)arg;
-
-       switch (cmd) {
-       case TIOCGSERIAL:
-               memset(&serstruct, 0, sizeof(serstruct));
-               serstruct.type = PORT_16654;
-               serstruct.line = port->minor;
-               serstruct.port = port->port_number;
-               serstruct.xmit_fifo_size = kfifo_size(&port->write_fifo);
-               serstruct.custom_divisor = 0;
-               serstruct.baud_base = 460800;
-               serstruct.close_delay = CLOSING_DELAY;
-               serstruct.closing_wait = CLOSING_DELAY;
-
-               if (copy_to_user(user_arg, &serstruct, sizeof(serstruct)))
-                       return -EFAULT;
-               break;
-       default:
-               break;
-       }
 
-       return -ENOIOCTLCMD;
+       ss->type = PORT_16654;
+       ss->line = port->minor;
+       ss->port = port->port_number;
+       ss->xmit_fifo_size = kfifo_size(&port->write_fifo);
+       ss->custom_divisor = 0;
+       ss->baud_base = 460800;
+       ss->close_delay = CLOSING_DELAY;
+       ss->closing_wait = CLOSING_DELAY;
+
+       return 0;
 }