diff options
Diffstat (limited to 'drivers/usb/serial/kl5kusb105.c')
-rw-r--r-- | drivers/usb/serial/kl5kusb105.c | 66 |
1 files changed, 46 insertions, 20 deletions
diff --git a/drivers/usb/serial/kl5kusb105.c b/drivers/usb/serial/kl5kusb105.c index 3a7873806f46..8eef91ba4b1c 100644 --- a/drivers/usb/serial/kl5kusb105.c +++ b/drivers/usb/serial/kl5kusb105.c | |||
@@ -94,7 +94,7 @@ static int klsi_105_tiocmset(struct tty_struct *tty, struct file *file, | |||
94 | /* | 94 | /* |
95 | * All of the device info needed for the KLSI converters. | 95 | * All of the device info needed for the KLSI converters. |
96 | */ | 96 | */ |
97 | static struct usb_device_id id_table [] = { | 97 | static const struct usb_device_id id_table[] = { |
98 | { USB_DEVICE(PALMCONNECT_VID, PALMCONNECT_PID) }, | 98 | { USB_DEVICE(PALMCONNECT_VID, PALMCONNECT_PID) }, |
99 | { USB_DEVICE(KLSI_VID, KLSI_KL5KUSB105D_PID) }, | 99 | { USB_DEVICE(KLSI_VID, KLSI_KL5KUSB105D_PID) }, |
100 | { } /* Terminating entry */ | 100 | { } /* Terminating entry */ |
@@ -212,10 +212,19 @@ static int klsi_105_get_line_state(struct usb_serial_port *port, | |||
212 | unsigned long *line_state_p) | 212 | unsigned long *line_state_p) |
213 | { | 213 | { |
214 | int rc; | 214 | int rc; |
215 | __u8 status_buf[KLSI_STATUSBUF_LEN] = { -1, -1}; | 215 | u8 *status_buf; |
216 | __u16 status; | 216 | __u16 status; |
217 | 217 | ||
218 | dev_info(&port->serial->dev->dev, "sending SIO Poll request\n"); | 218 | dev_info(&port->serial->dev->dev, "sending SIO Poll request\n"); |
219 | |||
220 | status_buf = kmalloc(KLSI_STATUSBUF_LEN, GFP_KERNEL); | ||
221 | if (!status_buf) { | ||
222 | dev_err(&port->dev, "%s - out of memory for status buffer.\n", | ||
223 | __func__); | ||
224 | return -ENOMEM; | ||
225 | } | ||
226 | status_buf[0] = 0xff; | ||
227 | status_buf[1] = 0xff; | ||
219 | rc = usb_control_msg(port->serial->dev, | 228 | rc = usb_control_msg(port->serial->dev, |
220 | usb_rcvctrlpipe(port->serial->dev, 0), | 229 | usb_rcvctrlpipe(port->serial->dev, 0), |
221 | KL5KUSB105A_SIO_POLL, | 230 | KL5KUSB105A_SIO_POLL, |
@@ -236,6 +245,8 @@ static int klsi_105_get_line_state(struct usb_serial_port *port, | |||
236 | 245 | ||
237 | *line_state_p = klsi_105_status2linestate(status); | 246 | *line_state_p = klsi_105_status2linestate(status); |
238 | } | 247 | } |
248 | |||
249 | kfree(status_buf); | ||
239 | return rc; | 250 | return rc; |
240 | } | 251 | } |
241 | 252 | ||
@@ -364,7 +375,7 @@ static int klsi_105_open(struct tty_struct *tty, struct usb_serial_port *port) | |||
364 | int rc; | 375 | int rc; |
365 | int i; | 376 | int i; |
366 | unsigned long line_state; | 377 | unsigned long line_state; |
367 | struct klsi_105_port_settings cfg; | 378 | struct klsi_105_port_settings *cfg; |
368 | unsigned long flags; | 379 | unsigned long flags; |
369 | 380 | ||
370 | dbg("%s port %d", __func__, port->number); | 381 | dbg("%s port %d", __func__, port->number); |
@@ -376,12 +387,18 @@ static int klsi_105_open(struct tty_struct *tty, struct usb_serial_port *port) | |||
376 | * Then read the modem line control and store values in | 387 | * Then read the modem line control and store values in |
377 | * priv->line_state. | 388 | * priv->line_state. |
378 | */ | 389 | */ |
379 | cfg.pktlen = 5; | 390 | cfg = kmalloc(sizeof(*cfg), GFP_KERNEL); |
380 | cfg.baudrate = kl5kusb105a_sio_b9600; | 391 | if (!cfg) { |
381 | cfg.databits = kl5kusb105a_dtb_8; | 392 | dev_err(&port->dev, "%s - out of memory for config buffer.\n", |
382 | cfg.unknown1 = 0; | 393 | __func__); |
383 | cfg.unknown2 = 1; | 394 | return -ENOMEM; |
384 | klsi_105_chg_port_settings(port, &cfg); | 395 | } |
396 | cfg->pktlen = 5; | ||
397 | cfg->baudrate = kl5kusb105a_sio_b9600; | ||
398 | cfg->databits = kl5kusb105a_dtb_8; | ||
399 | cfg->unknown1 = 0; | ||
400 | cfg->unknown2 = 1; | ||
401 | klsi_105_chg_port_settings(port, cfg); | ||
385 | 402 | ||
386 | /* set up termios structure */ | 403 | /* set up termios structure */ |
387 | spin_lock_irqsave(&priv->lock, flags); | 404 | spin_lock_irqsave(&priv->lock, flags); |
@@ -391,11 +408,11 @@ static int klsi_105_open(struct tty_struct *tty, struct usb_serial_port *port) | |||
391 | priv->termios.c_lflag = tty->termios->c_lflag; | 408 | priv->termios.c_lflag = tty->termios->c_lflag; |
392 | for (i = 0; i < NCCS; i++) | 409 | for (i = 0; i < NCCS; i++) |
393 | priv->termios.c_cc[i] = tty->termios->c_cc[i]; | 410 | priv->termios.c_cc[i] = tty->termios->c_cc[i]; |
394 | priv->cfg.pktlen = cfg.pktlen; | 411 | priv->cfg.pktlen = cfg->pktlen; |
395 | priv->cfg.baudrate = cfg.baudrate; | 412 | priv->cfg.baudrate = cfg->baudrate; |
396 | priv->cfg.databits = cfg.databits; | 413 | priv->cfg.databits = cfg->databits; |
397 | priv->cfg.unknown1 = cfg.unknown1; | 414 | priv->cfg.unknown1 = cfg->unknown1; |
398 | priv->cfg.unknown2 = cfg.unknown2; | 415 | priv->cfg.unknown2 = cfg->unknown2; |
399 | spin_unlock_irqrestore(&priv->lock, flags); | 416 | spin_unlock_irqrestore(&priv->lock, flags); |
400 | 417 | ||
401 | /* READ_ON and urb submission */ | 418 | /* READ_ON and urb submission */ |
@@ -441,6 +458,7 @@ static int klsi_105_open(struct tty_struct *tty, struct usb_serial_port *port) | |||
441 | retval = rc; | 458 | retval = rc; |
442 | 459 | ||
443 | exit: | 460 | exit: |
461 | kfree(cfg); | ||
444 | return retval; | 462 | return retval; |
445 | } /* klsi_105_open */ | 463 | } /* klsi_105_open */ |
446 | 464 | ||
@@ -681,7 +699,6 @@ static void klsi_105_read_bulk_callback(struct urb *urb) | |||
681 | bytes_sent = urb->actual_length - 2; | 699 | bytes_sent = urb->actual_length - 2; |
682 | } | 700 | } |
683 | 701 | ||
684 | tty_buffer_request_room(tty, bytes_sent); | ||
685 | tty_insert_flip_string(tty, data + 2, bytes_sent); | 702 | tty_insert_flip_string(tty, data + 2, bytes_sent); |
686 | tty_flip_buffer_push(tty); | 703 | tty_flip_buffer_push(tty); |
687 | tty_kref_put(tty); | 704 | tty_kref_put(tty); |
@@ -714,10 +731,17 @@ static void klsi_105_set_termios(struct tty_struct *tty, | |||
714 | unsigned int old_iflag = old_termios->c_iflag; | 731 | unsigned int old_iflag = old_termios->c_iflag; |
715 | unsigned int cflag = tty->termios->c_cflag; | 732 | unsigned int cflag = tty->termios->c_cflag; |
716 | unsigned int old_cflag = old_termios->c_cflag; | 733 | unsigned int old_cflag = old_termios->c_cflag; |
717 | struct klsi_105_port_settings cfg; | 734 | struct klsi_105_port_settings *cfg; |
718 | unsigned long flags; | 735 | unsigned long flags; |
719 | speed_t baud; | 736 | speed_t baud; |
720 | 737 | ||
738 | cfg = kmalloc(sizeof(*cfg), GFP_KERNEL); | ||
739 | if (!cfg) { | ||
740 | dev_err(&port->dev, "%s - out of memory for config buffer.\n", | ||
741 | __func__); | ||
742 | return; | ||
743 | } | ||
744 | |||
721 | /* lock while we are modifying the settings */ | 745 | /* lock while we are modifying the settings */ |
722 | spin_lock_irqsave(&priv->lock, flags); | 746 | spin_lock_irqsave(&priv->lock, flags); |
723 | 747 | ||
@@ -793,11 +817,11 @@ static void klsi_105_set_termios(struct tty_struct *tty, | |||
793 | case CS5: | 817 | case CS5: |
794 | dbg("%s - 5 bits/byte not supported", __func__); | 818 | dbg("%s - 5 bits/byte not supported", __func__); |
795 | spin_unlock_irqrestore(&priv->lock, flags); | 819 | spin_unlock_irqrestore(&priv->lock, flags); |
796 | return ; | 820 | goto err; |
797 | case CS6: | 821 | case CS6: |
798 | dbg("%s - 6 bits/byte not supported", __func__); | 822 | dbg("%s - 6 bits/byte not supported", __func__); |
799 | spin_unlock_irqrestore(&priv->lock, flags); | 823 | spin_unlock_irqrestore(&priv->lock, flags); |
800 | return ; | 824 | goto err; |
801 | case CS7: | 825 | case CS7: |
802 | priv->cfg.databits = kl5kusb105a_dtb_7; | 826 | priv->cfg.databits = kl5kusb105a_dtb_7; |
803 | break; | 827 | break; |
@@ -856,11 +880,13 @@ static void klsi_105_set_termios(struct tty_struct *tty, | |||
856 | #endif | 880 | #endif |
857 | ; | 881 | ; |
858 | } | 882 | } |
859 | memcpy(&cfg, &priv->cfg, sizeof(cfg)); | 883 | memcpy(cfg, &priv->cfg, sizeof(*cfg)); |
860 | spin_unlock_irqrestore(&priv->lock, flags); | 884 | spin_unlock_irqrestore(&priv->lock, flags); |
861 | 885 | ||
862 | /* now commit changes to device */ | 886 | /* now commit changes to device */ |
863 | klsi_105_chg_port_settings(port, &cfg); | 887 | klsi_105_chg_port_settings(port, cfg); |
888 | err: | ||
889 | kfree(cfg); | ||
864 | } /* klsi_105_set_termios */ | 890 | } /* klsi_105_set_termios */ |
865 | 891 | ||
866 | 892 | ||