Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=a6ea438b6d38689b7f876093bcba4505fe1995d1
Commit:     a6ea438b6d38689b7f876093bcba4505fe1995d1
Parent:     9a8baec77205dfe14f98a4e291c830a311125a8b
Author:     Alan Cox <[EMAIL PROTECTED]>
AuthorDate: Fri Jun 22 14:44:54 2007 +0100
Committer:  Greg Kroah-Hartman <[EMAIL PROTECTED]>
CommitDate: Thu Jul 12 16:34:37 2007 -0700

    USB: serial: ir_usb: Clean up the worst of it, remove exciting 'crash on 
open' feature
    
    - Drivers don't call ldisc termios methods. They certainly don't call
    them the way this one does - remove wrong call
    - The tty buffer code isn't designed to be abused from IRQ handlers and
    the new buffering removes the need for the uglies involved - fix them
    - Style
    - Remove incorrect baud and change handling for termios changes
    
    The driver now has some style, but not a lot - it goes insane if you have
    two dongles for example as it continues to use global variables for per
    dongle state. That bit isn't my problem.
    
    Signed-off-by: Alan Cox <[EMAIL PROTECTED]>
    Signed-off-by: Greg Kroah-Hartman <[EMAIL PROTECTED]>
---
 drivers/usb/serial/ir-usb.c |  142 ++++++++++++++++++-------------------------
 1 files changed, 60 insertions(+), 82 deletions(-)

diff --git a/drivers/usb/serial/ir-usb.c b/drivers/usb/serial/ir-usb.c
index 8cec5e5..5ab6a0c 100644
--- a/drivers/usb/serial/ir-usb.c
+++ b/drivers/usb/serial/ir-usb.c
@@ -21,6 +21,10 @@
  *
  * See Documentation/usb/usb-serial.txt for more information on using this 
driver
  *
+ * 2007_Jun_21  Alan Cox <[EMAIL PROTECTED]>
+ *     Minimal cleanups for some of the driver problens and tty layer abuse.
+ *     Still needs fixing to allow multiple dongles.
+ *
  * 2002_Mar_07 greg kh
  *     moved some needed structures and #define values from the
  *     net/irda/irda-usb.h file into our file, as we don't want to depend on
@@ -109,6 +113,7 @@ static void ir_write_bulk_callback (struct urb *urb);
 static void ir_read_bulk_callback (struct urb *urb);
 static void ir_set_termios (struct usb_serial_port *port, struct ktermios 
*old_termios);
 
+/* Not that this lot means you can only have one per system */
 static u8 ir_baud = 0;
 static u8 ir_xbof = 0;
 static u8 ir_add_bof = 0;
@@ -446,22 +451,12 @@ static void ir_read_bulk_callback (struct urb *urb)
                                urb->actual_length,
                                data);
 
-                       /*
-                        * Bypass flip-buffers, and feed the ldisc directly
-                        * due to our potentially large buffer size.  Since we
-                        * used to set low_latency, this is exactly what the
-                        * tty layer did anyway :)
-                        */
                        tty = port->tty;
 
-                       /*
-                        *      FIXME: must not do this in IRQ context
-                        */
-                       tty->ldisc.receive_buf(
-                               tty,
-                               data+1,
-                               NULL,
-                               urb->actual_length-1);
+                       if (tty_buffer_request_room(tty, urb->actual_length - 
1)) {
+                               tty_insert_flip_string(tty, data+1, 
urb->actual_length - 1);
+                               tty_flip_buffer_push(tty);
+                       }
 
                        /*
                         * No break here.
@@ -503,8 +498,9 @@ static void ir_read_bulk_callback (struct urb *urb)
 static void ir_set_termios (struct usb_serial_port *port, struct ktermios 
*old_termios)
 {
        unsigned char *transfer_buffer;
-       unsigned int cflag;
        int result;
+       speed_t baud;
+       int ir_baud;
 
        dbg("%s - port %d", __FUNCTION__, port->number);
 
@@ -513,77 +509,59 @@ static void ir_set_termios (struct usb_serial_port *port, 
struct ktermios *old_t
                return;
        }
 
-       cflag = port->tty->termios->c_cflag;
-       /* check that they really want us to change something */
-       if (old_termios) {
-               if ((cflag == old_termios->c_cflag) &&
-                   (RELEVANT_IFLAG(port->tty->termios->c_iflag) == 
RELEVANT_IFLAG(old_termios->c_iflag))) {
-                       dbg("%s - nothing to change...", __FUNCTION__);
-                       return;
-               }
+       baud = tty_get_baud_rate(port->tty);
+
+       /*
+        * FIXME, we should compare the baud request against the
+        * capability stated in the IR header that we got in the
+        * startup function.
+        */
+
+       switch (baud) {
+               case 2400:      ir_baud = SPEED_2400; break;
+               case 9600:      ir_baud = SPEED_9600; break;
+               case 19200:     ir_baud = SPEED_19200; break;
+               case 38400:     ir_baud = SPEED_38400; break;
+               case 57600:     ir_baud = SPEED_57600; break;
+               case 115200:    ir_baud = SPEED_115200; break;
+               case 576000:    ir_baud = SPEED_576000; break;
+               case 1152000:   ir_baud = SPEED_1152000; break;
+               case 4000000:   ir_baud = SPEED_4000000; break;
+                       break;
+               default:
+                       ir_baud = SPEED_9600;
+                       baud = 9600;
+                       /* And once the new tty stuff is all done we need to
+                          call back to correct the baud bits */
        }
 
-       /* All we can change is the baud rate */
-       if (cflag & CBAUD) {
-
-               dbg ("%s - asking for baud %d",
-                       __FUNCTION__,
-                       tty_get_baud_rate(port->tty));
-
-               /* 
-                * FIXME, we should compare the baud request against the
-                * capability stated in the IR header that we got in the
-                * startup function.
-                */
-               switch (cflag & CBAUD) {
-                       case B2400:    ir_baud = SPEED_2400;    break;
-                       default:
-                       case B9600:    ir_baud = SPEED_9600;    break;
-                       case B19200:   ir_baud = SPEED_19200;   break;
-                       case B38400:   ir_baud = SPEED_38400;   break;
-                       case B57600:   ir_baud = SPEED_57600;   break;
-                       case B115200:  ir_baud = SPEED_115200;  break;
-                       case B576000:  ir_baud = SPEED_576000;  break;
-                       case B1152000: ir_baud = SPEED_1152000; break;
-#ifdef B4000000
-                       case B4000000: ir_baud = SPEED_4000000; break;
-#endif
-               }
+       if (xbof == -1)
+               ir_xbof = ir_xbof_change(ir_add_bof);
+       else
+               ir_xbof = ir_xbof_change(xbof) ;
 
-               if (xbof == -1) {
-                       ir_xbof = ir_xbof_change(ir_add_bof);
-               } else {
-                       ir_xbof = ir_xbof_change(xbof) ;
-               }
+       /* FIXME need to check to see if our write urb is busy right
+        * now, or use a urb pool.
+        *
+        * send the baud change out on an "empty" data packet
+        */
+       transfer_buffer = port->write_urb->transfer_buffer;
+       *transfer_buffer = ir_xbof | ir_baud;
 
-               /* Notify the tty driver that the termios have changed. */
-               port->tty->ldisc.set_termios(port->tty, NULL);
-
-               /* FIXME need to check to see if our write urb is busy right
-                * now, or use a urb pool.
-                *
-                * send the baud change out on an "empty" data packet
-                */
-               transfer_buffer = port->write_urb->transfer_buffer;
-               *transfer_buffer = ir_xbof | ir_baud;
-
-               usb_fill_bulk_urb (
-                       port->write_urb,
-                       port->serial->dev,
-                       usb_sndbulkpipe(port->serial->dev,
-                               port->bulk_out_endpointAddress),
-                       port->write_urb->transfer_buffer,
-                       1,
-                       ir_write_bulk_callback,
-                       port);
-
-               port->write_urb->transfer_flags = URB_ZERO_PACKET;
-
-               result = usb_submit_urb (port->write_urb, GFP_KERNEL);
-               if (result)
-                       dev_err(&port->dev, "%s - failed submitting write urb, 
error %d\n", __FUNCTION__, result);
-       }
-       return;
+       usb_fill_bulk_urb (
+               port->write_urb,
+               port->serial->dev,
+               usb_sndbulkpipe(port->serial->dev, 
port->bulk_out_endpointAddress),
+               port->write_urb->transfer_buffer,
+               1,
+               ir_write_bulk_callback,
+               port);
+
+       port->write_urb->transfer_flags = URB_ZERO_PACKET;
+
+       result = usb_submit_urb (port->write_urb, GFP_KERNEL);
+       if (result)
+               dev_err(&port->dev, "%s - failed submitting write urb, error 
%d\n", __FUNCTION__, result);
 }
 
 
-
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