提交 c2585d96 编写于 作者: D David Clare 提交者: Greg Kroah-Hartman

USB: Prevent the funsoft serial device from entering raw mode

Added a device specific ioctl function to prevent the disabling of canonical
mode.  EINVAL is returned for any TCSETSF ioctl that doesn't have ICANON set.
This patch is for 2.6.17 or later kernels.

When "hwinfo --modem" is executed it opens the funsoft USB serial device and
disables canonical mode.  The device is kept this way until hwininfo has
finished probing any modems on a system.  The funsoft device expects to be
running in canonical mode.  Switching the device to raw mode can cause
incomplete data packets and device timeouts.
Signed-off-by: NDavid Clare <david@funsoft.com>
Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
上级 e05998d5
...@@ -14,6 +14,9 @@ ...@@ -14,6 +14,9 @@
#include <linux/module.h> #include <linux/module.h>
#include <linux/usb.h> #include <linux/usb.h>
#include <linux/usb/serial.h> #include <linux/usb/serial.h>
#include <asm/uaccess.h>
static int debug;
static struct usb_device_id id_table [] = { static struct usb_device_id id_table [] = {
{ USB_DEVICE(0x1404, 0xcddc) }, { USB_DEVICE(0x1404, 0xcddc) },
...@@ -21,6 +24,26 @@ static struct usb_device_id id_table [] = { ...@@ -21,6 +24,26 @@ static struct usb_device_id id_table [] = {
}; };
MODULE_DEVICE_TABLE(usb, id_table); MODULE_DEVICE_TABLE(usb, id_table);
static int funsoft_ioctl(struct usb_serial_port *port, struct file *file,
unsigned int cmd, unsigned long arg)
{
struct termios t;
dbg("%s - port %d, cmd 0x%04x", __FUNCTION__, port->number, cmd);
if (cmd == TCSETSF) {
if (user_termios_to_kernel_termios(&t, (void __user *)arg))
return -EFAULT;
dbg("%s - iflag:%x oflag:%x cflag:%x lflag:%x", __FUNCTION__,
t.c_iflag, t.c_oflag, t.c_cflag, t.c_lflag);
if (!(t.c_lflag & ICANON))
return -EINVAL;
}
return -ENOIOCTLCMD;
}
static struct usb_driver funsoft_driver = { static struct usb_driver funsoft_driver = {
.name = "funsoft", .name = "funsoft",
.probe = usb_serial_probe, .probe = usb_serial_probe,
...@@ -39,6 +62,7 @@ static struct usb_serial_driver funsoft_device = { ...@@ -39,6 +62,7 @@ static struct usb_serial_driver funsoft_device = {
.num_bulk_in = NUM_DONT_CARE, .num_bulk_in = NUM_DONT_CARE,
.num_bulk_out = NUM_DONT_CARE, .num_bulk_out = NUM_DONT_CARE,
.num_ports = 1, .num_ports = 1,
.ioctl = funsoft_ioctl,
}; };
static int __init funsoft_init(void) static int __init funsoft_init(void)
...@@ -63,3 +87,6 @@ static void __exit funsoft_exit(void) ...@@ -63,3 +87,6 @@ static void __exit funsoft_exit(void)
module_init(funsoft_init); module_init(funsoft_init);
module_exit(funsoft_exit); module_exit(funsoft_exit);
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
module_param(debug, bool, S_IRUGO | S_IWUSR);
MODULE_PARM_DESC(debug, "Debug enabled or not");
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册