|
@@ -296,7 +296,7 @@ static int klsi_105_open(struct tty_struct *tty, struct usb_serial_port *port)
|
|
|
rc = usb_serial_generic_open(tty, port);
|
|
|
if (rc) {
|
|
|
retval = rc;
|
|
|
- goto exit;
|
|
|
+ goto err_free_cfg;
|
|
|
}
|
|
|
|
|
|
rc = usb_control_msg(port->serial->dev,
|
|
@@ -315,17 +315,32 @@ static int klsi_105_open(struct tty_struct *tty, struct usb_serial_port *port)
|
|
|
dev_dbg(&port->dev, "%s - enabled reading\n", __func__);
|
|
|
|
|
|
rc = klsi_105_get_line_state(port, &line_state);
|
|
|
- if (rc >= 0) {
|
|
|
- spin_lock_irqsave(&priv->lock, flags);
|
|
|
- priv->line_state = line_state;
|
|
|
- spin_unlock_irqrestore(&priv->lock, flags);
|
|
|
- dev_dbg(&port->dev, "%s - read line state 0x%lx\n", __func__, line_state);
|
|
|
- retval = 0;
|
|
|
- } else
|
|
|
+ if (rc < 0) {
|
|
|
retval = rc;
|
|
|
+ goto err_disable_read;
|
|
|
+ }
|
|
|
+
|
|
|
+ spin_lock_irqsave(&priv->lock, flags);
|
|
|
+ priv->line_state = line_state;
|
|
|
+ spin_unlock_irqrestore(&priv->lock, flags);
|
|
|
+ dev_dbg(&port->dev, "%s - read line state 0x%lx\n", __func__,
|
|
|
+ line_state);
|
|
|
+
|
|
|
+ return 0;
|
|
|
|
|
|
-exit:
|
|
|
+err_disable_read:
|
|
|
+ usb_control_msg(port->serial->dev,
|
|
|
+ usb_sndctrlpipe(port->serial->dev, 0),
|
|
|
+ KL5KUSB105A_SIO_CONFIGURE,
|
|
|
+ USB_TYPE_VENDOR | USB_DIR_OUT,
|
|
|
+ KL5KUSB105A_SIO_CONFIGURE_READ_OFF,
|
|
|
+ 0, /* index */
|
|
|
+ NULL, 0,
|
|
|
+ KLSI_TIMEOUT);
|
|
|
+ usb_serial_generic_close(port);
|
|
|
+err_free_cfg:
|
|
|
kfree(cfg);
|
|
|
+
|
|
|
return retval;
|
|
|
}
|
|
|
|