X-Git-Url: http://pilppa.org/gitweb/gitweb.cgi?a=blobdiff_plain;f=drivers%2Fusb%2Fserial%2Fir-usb.c;h=5ab6a0c5ac52c3fbb663ee4989338490988c779c;hb=22aadf8a07067644e101267ed5003043f2ad05bf;hp=331bf81556fcca1978b4bd4e2cac6ad358356f7a;hpb=7ff3e52cf2947ebd38c84159af68e5a29d228f6c;p=linux-2.6-omap-h63xx.git diff --git a/drivers/usb/serial/ir-usb.c b/drivers/usb/serial/ir-usb.c index 331bf81556f..5ab6a0c5ac5 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 + * 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 @@ -107,8 +111,9 @@ static void ir_close (struct usb_serial_port *port, struct file *filep); static int ir_write (struct usb_serial_port *port, const unsigned char *buf, int count); 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 termios *old_termios); +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; @@ -138,6 +143,7 @@ static struct usb_serial_driver ir_device = { .name = "ir-usb", }, .description = "IR Dongle", + .usb_driver = &ir_driver, .id_table = id_table, .num_interrupt_in = 1, .num_bulk_in = 1, @@ -391,12 +397,14 @@ static int ir_write (struct usb_serial_port *port, const unsigned char *buf, int static void ir_write_bulk_callback (struct urb *urb) { struct usb_serial_port *port = (struct usb_serial_port *)urb->context; + int status = urb->status; dbg("%s - port %d", __FUNCTION__, port->number); port->write_urb_busy = 0; - if (urb->status) { - dbg("%s - nonzero write bulk status received: %d", __FUNCTION__, urb->status); + if (status) { + dbg("%s - nonzero write bulk status received: %d", + __FUNCTION__, status); return; } @@ -416,6 +424,7 @@ static void ir_read_bulk_callback (struct urb *urb) struct tty_struct *tty; unsigned char *data = urb->transfer_buffer; int result; + int status = urb->status; dbg("%s - port %d", __FUNCTION__, port->number); @@ -424,8 +433,7 @@ static void ir_read_bulk_callback (struct urb *urb) return; } - switch (urb->status) { - + switch (status) { case 0: /* Successful */ /* @@ -443,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. @@ -489,7 +487,7 @@ static void ir_read_bulk_callback (struct urb *urb) default: dbg("%s - nonzero read bulk status received: %d", __FUNCTION__, - urb->status); + status); break ; } @@ -497,11 +495,12 @@ static void ir_read_bulk_callback (struct urb *urb) return; } -static void ir_set_termios (struct usb_serial_port *port, struct termios *old_termios) +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); @@ -510,77 +509,59 @@ static void ir_set_termios (struct usb_serial_port *port, struct termios *old_te 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); }