Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=c2585d962572744271a7e254d48c747727441936
Commit:     c2585d962572744271a7e254d48c747727441936
Parent:     e05998d50d0bf9de5409a178e2f9869c7d1ea83e
Author:     David Clare <[EMAIL PROTECTED]>
AuthorDate: Fri Dec 1 18:24:38 2006 -0800
Committer:  Greg Kroah-Hartman <[EMAIL PROTECTED]>
CommitDate: Wed Dec 20 10:14:25 2006 -0800

    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: David Clare <[EMAIL PROTECTED]>
    Signed-off-by: Greg Kroah-Hartman <[EMAIL PROTECTED]>
---
 drivers/usb/serial/funsoft.c |   27 +++++++++++++++++++++++++++
 1 files changed, 27 insertions(+), 0 deletions(-)

diff --git a/drivers/usb/serial/funsoft.c b/drivers/usb/serial/funsoft.c
index 77b9772..d3be921 100644
--- a/drivers/usb/serial/funsoft.c
+++ b/drivers/usb/serial/funsoft.c
@@ -14,6 +14,9 @@
 #include <linux/module.h>
 #include <linux/usb.h>
 #include <linux/usb/serial.h>
+#include <asm/uaccess.h>
+
+static int debug;
 
 static struct usb_device_id id_table [] = {
        { USB_DEVICE(0x1404, 0xcddc) },
@@ -21,6 +24,26 @@ static struct usb_device_id 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 = {
        .name =         "funsoft",
        .probe =        usb_serial_probe,
@@ -39,6 +62,7 @@ static struct usb_serial_driver funsoft_device = {
        .num_bulk_in =          NUM_DONT_CARE,
        .num_bulk_out =         NUM_DONT_CARE,
        .num_ports =            1,
+       .ioctl =                funsoft_ioctl,
 };
 
 static int __init funsoft_init(void)
@@ -63,3 +87,6 @@ static void __exit funsoft_exit(void)
 module_init(funsoft_init);
 module_exit(funsoft_exit);
 MODULE_LICENSE("GPL");
+
+module_param(debug, bool, S_IRUGO | S_IWUSR);
+MODULE_PARM_DESC(debug, "Debug enabled or not");
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to