Lines Matching +full:serial +full:- +full:state
1 // SPDX-License-Identifier: GPL-2.0+
6 * Copyright (C) 2001 Utz-Uwe Haus <[email protected]>
10 * It was written out of frustration with the PalmConnect USB Serial adapter
15 * It seems that KLSI bought some silicon-design information from ScanLogic,
21 * on the protocol used (or find errors in my reverse-engineered stuff), please
25 * are adventurous, try it with any KLSI-based device and let me know how it
44 #include <linux/usb/serial.h>
47 #define DRIVER_AUTHOR "Utz-Uwe Haus <[email protected]>, Johan Hovold <[email protected]>"
48 #define DRIVER_DESC "KLSI KL5KUSB105 chipset USB->Serial Converter driver"
127 rc = usb_control_msg_send(port->serial->dev, in klsi_105_chg_port_settings()
139 dev_err(&port->dev, in klsi_105_chg_port_settings()
142 dev_dbg(&port->dev, in klsi_105_chg_port_settings()
144 settings->pktlen, settings->baudrate, settings->databits, in klsi_105_chg_port_settings()
145 settings->unknown1, settings->unknown2); in klsi_105_chg_port_settings()
152 * the state pointer.
155 unsigned long *state) in klsi_105_get_line_state() argument
160 rc = usb_control_msg_recv(port->serial->dev, 0, in klsi_105_get_line_state()
169 dev_err(&port->dev, "reading line status failed: %d\n", rc); in klsi_105_get_line_state()
175 dev_dbg(&port->dev, "read status %04x\n", status); in klsi_105_get_line_state()
177 *state = ((status & KL5KUSB105A_DSR) ? TIOCM_DSR : 0) | in klsi_105_get_line_state()
194 return -ENOMEM; in klsi_105_port_probe()
197 priv->cfg.pktlen = 5; in klsi_105_port_probe()
198 priv->cfg.baudrate = kl5kusb105a_sio_b9600; in klsi_105_port_probe()
199 priv->cfg.databits = kl5kusb105a_dtb_8; in klsi_105_port_probe()
200 priv->cfg.unknown1 = 0; in klsi_105_port_probe()
201 priv->cfg.unknown2 = 1; in klsi_105_port_probe()
203 priv->line_state = 0; in klsi_105_port_probe()
205 spin_lock_init(&priv->lock); in klsi_105_port_probe()
234 * priv->line_state. in klsi_105_open()
244 spin_lock_irqsave(&priv->lock, flags); in klsi_105_open()
245 priv->cfg.pktlen = cfg.pktlen; in klsi_105_open()
246 priv->cfg.baudrate = cfg.baudrate; in klsi_105_open()
247 priv->cfg.databits = cfg.databits; in klsi_105_open()
248 priv->cfg.unknown1 = cfg.unknown1; in klsi_105_open()
249 priv->cfg.unknown2 = cfg.unknown2; in klsi_105_open()
250 spin_unlock_irqrestore(&priv->lock, flags); in klsi_105_open()
257 rc = usb_control_msg(port->serial->dev, in klsi_105_open()
258 usb_sndctrlpipe(port->serial->dev, 0), in klsi_105_open()
267 dev_err(&port->dev, "Enabling read failed (error = %d)\n", rc); in klsi_105_open()
271 dev_dbg(&port->dev, "%s - enabled reading\n", __func__); in klsi_105_open()
279 spin_lock_irqsave(&priv->lock, flags); in klsi_105_open()
280 priv->line_state = line_state; in klsi_105_open()
281 spin_unlock_irqrestore(&priv->lock, flags); in klsi_105_open()
282 dev_dbg(&port->dev, "%s - read line state 0x%lx\n", __func__, in klsi_105_open()
288 usb_control_msg(port->serial->dev, in klsi_105_open()
289 usb_sndctrlpipe(port->serial->dev, 0), in klsi_105_open()
307 rc = usb_control_msg(port->serial->dev, in klsi_105_close()
308 usb_sndctrlpipe(port->serial->dev, 0), in klsi_105_close()
316 dev_err(&port->dev, "failed to disable read: %d\n", rc); in klsi_105_close()
322 /* We need to write a complete 64-byte data block and encode the
323 * number actually sent in the first double-byte, LSB-order. That
333 count = kfifo_out_locked(&port->write_fifo, buf + KLSI_HDR_LEN, size, in klsi_105_prepare_write_buffer()
334 &port->lock); in klsi_105_prepare_write_buffer()
340 /* The data received is preceded by a length double-byte in LSB-first order.
344 struct usb_serial_port *port = urb->context; in klsi_105_process_read_urb()
345 unsigned char *data = urb->transfer_buffer; in klsi_105_process_read_urb()
349 if (!urb->actual_length) in klsi_105_process_read_urb()
352 if (urb->actual_length <= KLSI_HDR_LEN) { in klsi_105_process_read_urb()
353 dev_dbg(&port->dev, "%s - malformed packet\n", __func__); in klsi_105_process_read_urb()
358 if (len > urb->actual_length - KLSI_HDR_LEN) { in klsi_105_process_read_urb()
359 dev_dbg(&port->dev, "%s - packet length mismatch\n", __func__); in klsi_105_process_read_urb()
360 len = urb->actual_length - KLSI_HDR_LEN; in klsi_105_process_read_urb()
363 tty_insert_flip_string(&port->port, data + KLSI_HDR_LEN, len); in klsi_105_process_read_urb()
364 tty_flip_buffer_push(&port->port); in klsi_105_process_read_urb()
372 struct device *dev = &port->dev; in klsi_105_set_termios()
373 unsigned int iflag = tty->termios.c_iflag; in klsi_105_set_termios()
374 unsigned int old_iflag = old_termios->c_iflag; in klsi_105_set_termios()
375 unsigned int cflag = tty->termios.c_cflag; in klsi_105_set_termios()
376 unsigned int old_cflag = old_termios->c_cflag; in klsi_105_set_termios()
386 spin_lock_irqsave(&priv->lock, flags); in klsi_105_set_termios()
397 priv->cfg.baudrate = kl5kusb105a_sio_b1200; in klsi_105_set_termios()
400 priv->cfg.baudrate = kl5kusb105a_sio_b2400; in klsi_105_set_termios()
403 priv->cfg.baudrate = kl5kusb105a_sio_b4800; in klsi_105_set_termios()
406 priv->cfg.baudrate = kl5kusb105a_sio_b9600; in klsi_105_set_termios()
409 priv->cfg.baudrate = kl5kusb105a_sio_b19200; in klsi_105_set_termios()
412 priv->cfg.baudrate = kl5kusb105a_sio_b38400; in klsi_105_set_termios()
415 priv->cfg.baudrate = kl5kusb105a_sio_b57600; in klsi_105_set_termios()
418 priv->cfg.baudrate = kl5kusb105a_sio_b115200; in klsi_105_set_termios()
422 priv->cfg.baudrate = kl5kusb105a_sio_b9600; in klsi_105_set_termios()
440 dev_dbg(dev, "%s - 5 bits/byte not supported\n", __func__); in klsi_105_set_termios()
441 spin_unlock_irqrestore(&priv->lock, flags); in klsi_105_set_termios()
444 dev_dbg(dev, "%s - 6 bits/byte not supported\n", __func__); in klsi_105_set_termios()
445 spin_unlock_irqrestore(&priv->lock, flags); in klsi_105_set_termios()
448 priv->cfg.databits = kl5kusb105a_dtb_7; in klsi_105_set_termios()
451 priv->cfg.databits = kl5kusb105a_dtb_8; in klsi_105_set_termios()
454 dev_err(dev, "CSIZE was not CS5-CS8, using default of 8\n"); in klsi_105_set_termios()
455 priv->cfg.databits = kl5kusb105a_dtb_8; in klsi_105_set_termios()
466 tty->termios.c_cflag &= ~(PARENB|PARODD|CSTOPB); in klsi_105_set_termios()
476 tty->termios.c_cflag &= ~CRTSCTS; in klsi_105_set_termios()
478 memcpy(cfg, &priv->cfg, sizeof(*cfg)); in klsi_105_set_termios()
479 spin_unlock_irqrestore(&priv->lock, flags); in klsi_105_set_termios()
489 struct usb_serial_port *port = tty->driver_data; in klsi_105_tiocmget()
497 dev_err(&port->dev, in klsi_105_tiocmget()
503 spin_lock_irqsave(&priv->lock, flags); in klsi_105_tiocmget()
504 priv->line_state = line_state; in klsi_105_tiocmget()
505 spin_unlock_irqrestore(&priv->lock, flags); in klsi_105_tiocmget()
506 dev_dbg(&port->dev, "%s - read line state 0x%lx\n", __func__, line_state); in klsi_105_tiocmget()