X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=drivers%2Fusb%2Fserial%2Fkl5kusb105.c;h=78335a5f77430e18a1d97e7b22e177f79ee07147;hb=43bc926fffd92024b46cafaf7350d669ba9ca884;hp=2e261c73cfcd38c962bfb02a44a8dad599244015;hpb=6a77f38946aaee1cd85eeec6cf4229b204c15071;p=linux-2.6.git diff --git a/drivers/usb/serial/kl5kusb105.c b/drivers/usb/serial/kl5kusb105.c index 2e261c73c..78335a5f7 100644 --- a/drivers/usb/serial/kl5kusb105.c +++ b/drivers/usb/serial/kl5kusb105.c @@ -116,17 +116,19 @@ static struct usb_device_id id_table [] = { MODULE_DEVICE_TABLE (usb, id_table); static struct usb_driver kl5kusb105d_driver = { - .owner = THIS_MODULE, .name = "kl5kusb105d", .probe = usb_serial_probe, .disconnect = usb_serial_disconnect, .id_table = id_table, + .no_dynamic_id = 1, }; -static struct usb_serial_device_type kl5kusb105d_device = { - .owner = THIS_MODULE, - .name = "KL5KUSB105D / PalmConnect", - .short_name = "kl5kusb105d", +static struct usb_serial_driver kl5kusb105d_device = { + .driver = { + .owner = THIS_MODULE, + .name = "kl5kusb105d", + }, + .description = "KL5KUSB105D / PalmConnect", .id_table = id_table, .num_interrupt_in = 1, .num_bulk_in = 1, @@ -178,7 +180,7 @@ struct klsi_105_private { */ -#define KLSI_TIMEOUT (HZ * 5 ) /* default urb timeout */ +#define KLSI_TIMEOUT 5000 /* default urb timeout */ static int klsi_105_chg_port_settings(struct usb_serial_port *port, struct klsi_105_port_settings *settings) @@ -236,7 +238,7 @@ static int klsi_105_get_line_state(struct usb_serial_port *port, 0, /* value */ 0, /* index */ status_buf, KLSI_STATUSBUF_LEN, - 10*HZ + 10000 ); if (rc < 0) err("Reading line status failed (error = %d)", rc); @@ -341,8 +343,7 @@ static void klsi_105_shutdown (struct usb_serial *serial) * finished. Otherwise this call * oopses. */ /* usb_kill_urb(write_urbs[j]); */ - if (write_urbs[j]->transfer_buffer) - kfree(write_urbs[j]->transfer_buffer); + kfree(write_urbs[j]->transfer_buffer); usb_free_urb (write_urbs[j]); } } @@ -647,7 +648,6 @@ static void klsi_105_read_bulk_callback (struct urb *urb, struct pt_regs *regs) usb_serial_debug_data(debug, &port->dev, __FUNCTION__, urb->actual_length, data); } else { - int i; int bytes_sent = ((__u8 *) data)[0] + ((unsigned int) ((__u8 *) data)[1] << 8); tty = port->tty; @@ -668,16 +668,8 @@ static void klsi_105_read_bulk_callback (struct urb *urb, struct pt_regs *regs) bytes_sent = urb->actual_length - 2; } - for (i = 2; i < 2+bytes_sent; i++) { - /* if we insert more than TTY_FLIPBUF_SIZE characters, - * we drop them. */ - if(tty->flip.count >= TTY_FLIPBUF_SIZE) { - tty_flip_buffer_push(tty); - } - /* this doesn't actually push the data through unless - * tty->low_latency is set */ - tty_insert_flip_char(tty, ((__u8*) data)[i], 0); - } + tty_buffer_request_room(tty, bytes_sent); + tty_insert_flip_string(tty, data + 2, bytes_sent); tty_flip_buffer_push(tty); /* again lockless, but debug info only */ @@ -925,45 +917,34 @@ static int klsi_105_ioctl (struct usb_serial_port *port, struct file * file, /* TODO */ dbg("%s - TIOCMIWAIT not handled", __FUNCTION__); return -ENOIOCTLCMD; - case TIOCGICOUNT: /* return count of modemline transitions */ /* TODO */ dbg("%s - TIOCGICOUNT not handled", __FUNCTION__); return -ENOIOCTLCMD; - case TCGETS: { - /* return current info to caller */ - int retval; - - dbg("%s - TCGETS data faked/incomplete", __FUNCTION__); - - retval = verify_area(VERIFY_WRITE, user_arg, - sizeof(struct termios)); - if (retval) - return retval; - - if (kernel_termios_to_user_termios((struct termios __user *)arg, - &priv->termios)) - return -EFAULT; - return(0); - } - case TCSETS: { - /* set port termios to the one given by the user */ - int retval; + case TCGETS: + /* return current info to caller */ + dbg("%s - TCGETS data faked/incomplete", __FUNCTION__); + if (!access_ok(VERIFY_WRITE, user_arg, sizeof(struct termios))) + return -EFAULT; + + if (kernel_termios_to_user_termios((struct termios __user *)arg, + &priv->termios)) + return -EFAULT; + return 0; + case TCSETS: + /* set port termios to the one given by the user */ dbg("%s - TCSETS not handled", __FUNCTION__); - retval = verify_area(VERIFY_READ, user_arg, - sizeof(struct termios)); - if (retval) - return retval; + if (!access_ok(VERIFY_READ, user_arg, sizeof(struct termios))) + return -EFAULT; if (user_termios_to_kernel_termios(&priv->termios, - (struct termios __user *)arg)) + (struct termios __user *)arg)) return -EFAULT; klsi_105_set_termios(port, &priv->termios); - return(0); - } + return 0; case TCSETSW: { /* set port termios and try to wait for completion of last * write operation */