From 2f430b4bbae7faa167730f954252eb7db4ac58dd Mon Sep 17 00:00:00 2001 From: Werner Lemberg Date: Tue, 18 Jul 2006 17:00:52 +0200 Subject: [PATCH] USB: ark3116: Add TIOCGSERIAL and TIOCSSERIAL ioctl calls. Add (dummy?) support for TIOCGSERIAL and TIOCSSERIAL ioctl calls to the USB serial driver file `ark3116.c'. This is sufficient for me to run wvdial successfully, receive my email, and do webbrowsing with firefox. On the other hand, running the cvs program to update archives seems not to work, and the traceroute command sometimes says send failed: No buffer space available Looks like a buffering problem... My knowledge of serial device drivers is zero, so I can't fix this -- I just did a cut'n'paste from other USB serial drivers... Signed-off-by: Werner Lemberg Signed-off-by: Greg Kroah-Hartman --- drivers/usb/serial/ark3116.c | 34 +++++++++++++++++++++++++++++++--- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/drivers/usb/serial/ark3116.c b/drivers/usb/serial/ark3116.c index 970d9ef0a7..d37300e181 100644 --- a/drivers/usb/serial/ark3116.c +++ b/drivers/usb/serial/ark3116.c @@ -1,4 +1,7 @@ /* + * Copyright (C) 2006 + * Simon Schulz (ark3116_driver auctionant.de) + * * ark3116 * - implements a driver for the arkmicro ark3116 chipset (vendor=0x6547, * productid=0x0232) (used in a datacable called KQ-U8A) @@ -8,8 +11,6 @@ * * - based on logs created by usbsnoopy * - * Author : Simon Schulz [ark3116_driverauctionant.de] - * * 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 the * Free Software Foundation; either version 2 of the License, or (at your @@ -22,6 +23,8 @@ #include #include #include +#include +#include static int debug; @@ -379,7 +382,32 @@ static int ark3116_open(struct usb_serial_port *port, struct file *filp) static int ark3116_ioctl(struct usb_serial_port *port, struct file *file, unsigned int cmd, unsigned long arg) { - dbg("ioctl not supported yet..."); + struct serial_struct serstruct; + void __user *user_arg = (void __user *)arg; + + switch (cmd) { + case TIOCGSERIAL: + /* XXX: Some of these values are probably wrong. */ + memset(&serstruct, 0, sizeof (serstruct)); + serstruct.type = PORT_16654; + serstruct.line = port->serial->minor; + serstruct.port = port->number; + serstruct.custom_divisor = 0; + serstruct.baud_base = 460800; + + if (copy_to_user(user_arg, &serstruct, sizeof (serstruct))) + return -EFAULT; + + return 0; + case TIOCSSERIAL: + if (copy_from_user(&serstruct, user_arg, sizeof (serstruct))) + return -EFAULT; + return 0; + default: + dbg("%s cmd 0x%04x not supported", __FUNCTION__, cmd); + break; + } + return -ENOIOCTLCMD; } -- 2.39.5