cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

oti6858.c (23988B)


      1// SPDX-License-Identifier: GPL-2.0
      2/*
      3 * Ours Technology Inc. OTi-6858 USB to serial adapter driver.
      4 *
      5 * Copyleft  (C) 2007 Kees Lemmens (adapted for kernel 2.6.20)
      6 * Copyright (C) 2006 Tomasz Michal Lukaszewski (FIXME: add e-mail)
      7 * Copyright (C) 2001-2004 Greg Kroah-Hartman (greg@kroah.com)
      8 * Copyright (C) 2003 IBM Corp.
      9 *
     10 * Many thanks to the authors of pl2303 driver: all functions in this file
     11 * are heavily based on pl2303 code, buffering code is a 1-to-1 copy.
     12 *
     13 * Warning! You use this driver on your own risk! The only official
     14 * description of this device I have is datasheet from manufacturer,
     15 * and it doesn't contain almost any information needed to write a driver.
     16 * Almost all knowlegde used while writing this driver was gathered by:
     17 *  - analyzing traffic between device and the M$ Windows 2000 driver,
     18 *  - trying different bit combinations and checking pin states
     19 *    with a voltmeter,
     20 *  - receiving malformed frames and producing buffer overflows
     21 *    to learn how errors are reported,
     22 * So, THIS CODE CAN DESTROY OTi-6858 AND ANY OTHER DEVICES, THAT ARE
     23 * CONNECTED TO IT!
     24 *
     25 * See Documentation/usb/usb-serial.rst for more information on using this
     26 * driver
     27 *
     28 * TODO:
     29 *  - implement correct flushing for ioctls and oti6858_close()
     30 *  - check how errors (rx overflow, parity error, framing error) are reported
     31 *  - implement oti6858_break_ctl()
     32 *  - implement more ioctls
     33 *  - test/implement flow control
     34 *  - allow setting custom baud rates
     35 */
     36
     37#include <linux/kernel.h>
     38#include <linux/errno.h>
     39#include <linux/slab.h>
     40#include <linux/tty.h>
     41#include <linux/tty_driver.h>
     42#include <linux/tty_flip.h>
     43#include <linux/serial.h>
     44#include <linux/module.h>
     45#include <linux/moduleparam.h>
     46#include <linux/spinlock.h>
     47#include <linux/usb.h>
     48#include <linux/usb/serial.h>
     49#include <linux/uaccess.h>
     50#include <linux/kfifo.h>
     51#include "oti6858.h"
     52
     53#define OTI6858_DESCRIPTION \
     54	"Ours Technology Inc. OTi-6858 USB to serial adapter driver"
     55#define OTI6858_AUTHOR "Tomasz Michal Lukaszewski <FIXME@FIXME>"
     56
     57static const struct usb_device_id id_table[] = {
     58	{ USB_DEVICE(OTI6858_VENDOR_ID, OTI6858_PRODUCT_ID) },
     59	{ }
     60};
     61
     62MODULE_DEVICE_TABLE(usb, id_table);
     63
     64/* requests */
     65#define	OTI6858_REQ_GET_STATUS		(USB_DIR_IN | USB_TYPE_VENDOR | 0x00)
     66#define	OTI6858_REQ_T_GET_STATUS	0x01
     67
     68#define	OTI6858_REQ_SET_LINE		(USB_DIR_OUT | USB_TYPE_VENDOR | 0x00)
     69#define	OTI6858_REQ_T_SET_LINE		0x00
     70
     71#define	OTI6858_REQ_CHECK_TXBUFF	(USB_DIR_IN | USB_TYPE_VENDOR | 0x01)
     72#define	OTI6858_REQ_T_CHECK_TXBUFF	0x00
     73
     74/* format of the control packet */
     75struct oti6858_control_pkt {
     76	__le16	divisor;	/* baud rate = 96000000 / (16 * divisor), LE */
     77#define OTI6858_MAX_BAUD_RATE	3000000
     78	u8	frame_fmt;
     79#define FMT_STOP_BITS_MASK	0xc0
     80#define FMT_STOP_BITS_1		0x00
     81#define FMT_STOP_BITS_2		0x40	/* 1.5 stop bits if FMT_DATA_BITS_5 */
     82#define FMT_PARITY_MASK		0x38
     83#define FMT_PARITY_NONE		0x00
     84#define FMT_PARITY_ODD		0x08
     85#define FMT_PARITY_EVEN		0x18
     86#define FMT_PARITY_MARK		0x28
     87#define FMT_PARITY_SPACE	0x38
     88#define FMT_DATA_BITS_MASK	0x03
     89#define FMT_DATA_BITS_5		0x00
     90#define FMT_DATA_BITS_6		0x01
     91#define FMT_DATA_BITS_7		0x02
     92#define FMT_DATA_BITS_8		0x03
     93	u8	something;	/* always equals 0x43 */
     94	u8	control;	/* settings of flow control lines */
     95#define CONTROL_MASK		0x0c
     96#define CONTROL_DTR_HIGH	0x08
     97#define CONTROL_RTS_HIGH	0x04
     98	u8	tx_status;
     99#define	TX_BUFFER_EMPTIED	0x09
    100	u8	pin_state;
    101#define PIN_MASK		0x3f
    102#define PIN_MSR_MASK		0x1b
    103#define PIN_RTS			0x20	/* output pin */
    104#define PIN_CTS			0x10	/* input pin, active low */
    105#define PIN_DSR			0x08	/* input pin, active low */
    106#define PIN_DTR			0x04	/* output pin */
    107#define PIN_RI			0x02	/* input pin, active low */
    108#define PIN_DCD			0x01	/* input pin, active low */
    109	u8	rx_bytes_avail;		/* number of bytes in rx buffer */;
    110};
    111
    112#define OTI6858_CTRL_PKT_SIZE	sizeof(struct oti6858_control_pkt)
    113#define OTI6858_CTRL_EQUALS_PENDING(a, priv) \
    114	(((a)->divisor == (priv)->pending_setup.divisor) \
    115	  && ((a)->control == (priv)->pending_setup.control) \
    116	  && ((a)->frame_fmt == (priv)->pending_setup.frame_fmt))
    117
    118/* function prototypes */
    119static int oti6858_open(struct tty_struct *tty, struct usb_serial_port *port);
    120static void oti6858_close(struct usb_serial_port *port);
    121static void oti6858_set_termios(struct tty_struct *tty,
    122			struct usb_serial_port *port, struct ktermios *old);
    123static void oti6858_init_termios(struct tty_struct *tty);
    124static void oti6858_read_int_callback(struct urb *urb);
    125static void oti6858_read_bulk_callback(struct urb *urb);
    126static void oti6858_write_bulk_callback(struct urb *urb);
    127static int oti6858_write(struct tty_struct *tty, struct usb_serial_port *port,
    128			const unsigned char *buf, int count);
    129static unsigned int oti6858_write_room(struct tty_struct *tty);
    130static unsigned int oti6858_chars_in_buffer(struct tty_struct *tty);
    131static int oti6858_tiocmget(struct tty_struct *tty);
    132static int oti6858_tiocmset(struct tty_struct *tty,
    133				unsigned int set, unsigned int clear);
    134static int oti6858_port_probe(struct usb_serial_port *port);
    135static void oti6858_port_remove(struct usb_serial_port *port);
    136
    137/* device info */
    138static struct usb_serial_driver oti6858_device = {
    139	.driver = {
    140		.owner =	THIS_MODULE,
    141		.name =		"oti6858",
    142	},
    143	.id_table =		id_table,
    144	.num_ports =		1,
    145	.num_bulk_in =		1,
    146	.num_bulk_out =		1,
    147	.num_interrupt_in =	1,
    148	.open =			oti6858_open,
    149	.close =		oti6858_close,
    150	.write =		oti6858_write,
    151	.set_termios =		oti6858_set_termios,
    152	.init_termios = 	oti6858_init_termios,
    153	.tiocmget =		oti6858_tiocmget,
    154	.tiocmset =		oti6858_tiocmset,
    155	.tiocmiwait =		usb_serial_generic_tiocmiwait,
    156	.read_bulk_callback =	oti6858_read_bulk_callback,
    157	.read_int_callback =	oti6858_read_int_callback,
    158	.write_bulk_callback =	oti6858_write_bulk_callback,
    159	.write_room =		oti6858_write_room,
    160	.chars_in_buffer =	oti6858_chars_in_buffer,
    161	.port_probe =		oti6858_port_probe,
    162	.port_remove =		oti6858_port_remove,
    163};
    164
    165static struct usb_serial_driver * const serial_drivers[] = {
    166	&oti6858_device, NULL
    167};
    168
    169struct oti6858_private {
    170	spinlock_t lock;
    171
    172	struct oti6858_control_pkt status;
    173
    174	struct {
    175		u8 read_urb_in_use;
    176		u8 write_urb_in_use;
    177	} flags;
    178	struct delayed_work delayed_write_work;
    179
    180	struct {
    181		__le16 divisor;
    182		u8 frame_fmt;
    183		u8 control;
    184	} pending_setup;
    185	u8 transient;
    186	u8 setup_done;
    187	struct delayed_work delayed_setup_work;
    188
    189	struct usb_serial_port *port;   /* USB port with which associated */
    190};
    191
    192static void setup_line(struct work_struct *work)
    193{
    194	struct oti6858_private *priv = container_of(work,
    195			struct oti6858_private, delayed_setup_work.work);
    196	struct usb_serial_port *port = priv->port;
    197	struct oti6858_control_pkt *new_setup;
    198	unsigned long flags;
    199	int result;
    200
    201	new_setup = kmalloc(OTI6858_CTRL_PKT_SIZE, GFP_KERNEL);
    202	if (!new_setup) {
    203		/* we will try again */
    204		schedule_delayed_work(&priv->delayed_setup_work,
    205						msecs_to_jiffies(2));
    206		return;
    207	}
    208
    209	result = usb_control_msg(port->serial->dev,
    210				usb_rcvctrlpipe(port->serial->dev, 0),
    211				OTI6858_REQ_T_GET_STATUS,
    212				OTI6858_REQ_GET_STATUS,
    213				0, 0,
    214				new_setup, OTI6858_CTRL_PKT_SIZE,
    215				100);
    216
    217	if (result != OTI6858_CTRL_PKT_SIZE) {
    218		dev_err(&port->dev, "%s(): error reading status\n", __func__);
    219		kfree(new_setup);
    220		/* we will try again */
    221		schedule_delayed_work(&priv->delayed_setup_work,
    222							msecs_to_jiffies(2));
    223		return;
    224	}
    225
    226	spin_lock_irqsave(&priv->lock, flags);
    227	if (!OTI6858_CTRL_EQUALS_PENDING(new_setup, priv)) {
    228		new_setup->divisor = priv->pending_setup.divisor;
    229		new_setup->control = priv->pending_setup.control;
    230		new_setup->frame_fmt = priv->pending_setup.frame_fmt;
    231
    232		spin_unlock_irqrestore(&priv->lock, flags);
    233		result = usb_control_msg(port->serial->dev,
    234					usb_sndctrlpipe(port->serial->dev, 0),
    235					OTI6858_REQ_T_SET_LINE,
    236					OTI6858_REQ_SET_LINE,
    237					0, 0,
    238					new_setup, OTI6858_CTRL_PKT_SIZE,
    239					100);
    240	} else {
    241		spin_unlock_irqrestore(&priv->lock, flags);
    242		result = 0;
    243	}
    244	kfree(new_setup);
    245
    246	spin_lock_irqsave(&priv->lock, flags);
    247	if (result != OTI6858_CTRL_PKT_SIZE)
    248		priv->transient = 0;
    249	priv->setup_done = 1;
    250	spin_unlock_irqrestore(&priv->lock, flags);
    251
    252	dev_dbg(&port->dev, "%s(): submitting interrupt urb\n", __func__);
    253	result = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
    254	if (result != 0) {
    255		dev_err(&port->dev, "%s(): usb_submit_urb() failed with error %d\n",
    256			__func__, result);
    257	}
    258}
    259
    260static void send_data(struct work_struct *work)
    261{
    262	struct oti6858_private *priv = container_of(work,
    263			struct oti6858_private, delayed_write_work.work);
    264	struct usb_serial_port *port = priv->port;
    265	int count = 0, result;
    266	unsigned long flags;
    267	u8 *allow;
    268
    269	spin_lock_irqsave(&priv->lock, flags);
    270	if (priv->flags.write_urb_in_use) {
    271		spin_unlock_irqrestore(&priv->lock, flags);
    272		schedule_delayed_work(&priv->delayed_write_work,
    273						msecs_to_jiffies(2));
    274		return;
    275	}
    276	priv->flags.write_urb_in_use = 1;
    277	spin_unlock_irqrestore(&priv->lock, flags);
    278
    279	spin_lock_irqsave(&port->lock, flags);
    280	count = kfifo_len(&port->write_fifo);
    281	spin_unlock_irqrestore(&port->lock, flags);
    282
    283	if (count > port->bulk_out_size)
    284		count = port->bulk_out_size;
    285
    286	if (count != 0) {
    287		allow = kmalloc(1, GFP_KERNEL);
    288		if (!allow)
    289			return;
    290
    291		result = usb_control_msg(port->serial->dev,
    292				usb_rcvctrlpipe(port->serial->dev, 0),
    293				OTI6858_REQ_T_CHECK_TXBUFF,
    294				OTI6858_REQ_CHECK_TXBUFF,
    295				count, 0, allow, 1, 100);
    296		if (result != 1 || *allow != 0)
    297			count = 0;
    298		kfree(allow);
    299	}
    300
    301	if (count == 0) {
    302		priv->flags.write_urb_in_use = 0;
    303
    304		dev_dbg(&port->dev, "%s(): submitting interrupt urb\n", __func__);
    305		result = usb_submit_urb(port->interrupt_in_urb, GFP_NOIO);
    306		if (result != 0) {
    307			dev_err(&port->dev, "%s(): usb_submit_urb() failed with error %d\n",
    308				__func__, result);
    309		}
    310		return;
    311	}
    312
    313	count = kfifo_out_locked(&port->write_fifo,
    314					port->write_urb->transfer_buffer,
    315					count, &port->lock);
    316	port->write_urb->transfer_buffer_length = count;
    317	result = usb_submit_urb(port->write_urb, GFP_NOIO);
    318	if (result != 0) {
    319		dev_err_console(port, "%s(): usb_submit_urb() failed with error %d\n",
    320				__func__, result);
    321		priv->flags.write_urb_in_use = 0;
    322	}
    323
    324	usb_serial_port_softint(port);
    325}
    326
    327static int oti6858_port_probe(struct usb_serial_port *port)
    328{
    329	struct oti6858_private *priv;
    330
    331	priv = kzalloc(sizeof(*priv), GFP_KERNEL);
    332	if (!priv)
    333		return -ENOMEM;
    334
    335	spin_lock_init(&priv->lock);
    336	priv->port = port;
    337	INIT_DELAYED_WORK(&priv->delayed_setup_work, setup_line);
    338	INIT_DELAYED_WORK(&priv->delayed_write_work, send_data);
    339
    340	usb_set_serial_port_data(port, priv);
    341
    342	port->port.drain_delay = 256;	/* FIXME: check the FIFO length */
    343
    344	return 0;
    345}
    346
    347static void oti6858_port_remove(struct usb_serial_port *port)
    348{
    349	struct oti6858_private *priv;
    350
    351	priv = usb_get_serial_port_data(port);
    352	kfree(priv);
    353}
    354
    355static int oti6858_write(struct tty_struct *tty, struct usb_serial_port *port,
    356			const unsigned char *buf, int count)
    357{
    358	if (!count)
    359		return count;
    360
    361	count = kfifo_in_locked(&port->write_fifo, buf, count, &port->lock);
    362
    363	return count;
    364}
    365
    366static unsigned int oti6858_write_room(struct tty_struct *tty)
    367{
    368	struct usb_serial_port *port = tty->driver_data;
    369	unsigned int room;
    370	unsigned long flags;
    371
    372	spin_lock_irqsave(&port->lock, flags);
    373	room = kfifo_avail(&port->write_fifo);
    374	spin_unlock_irqrestore(&port->lock, flags);
    375
    376	return room;
    377}
    378
    379static unsigned int oti6858_chars_in_buffer(struct tty_struct *tty)
    380{
    381	struct usb_serial_port *port = tty->driver_data;
    382	unsigned int chars;
    383	unsigned long flags;
    384
    385	spin_lock_irqsave(&port->lock, flags);
    386	chars = kfifo_len(&port->write_fifo);
    387	spin_unlock_irqrestore(&port->lock, flags);
    388
    389	return chars;
    390}
    391
    392static void oti6858_init_termios(struct tty_struct *tty)
    393{
    394	tty_encode_baud_rate(tty, 38400, 38400);
    395}
    396
    397static void oti6858_set_termios(struct tty_struct *tty,
    398		struct usb_serial_port *port, struct ktermios *old_termios)
    399{
    400	struct oti6858_private *priv = usb_get_serial_port_data(port);
    401	unsigned long flags;
    402	unsigned int cflag;
    403	u8 frame_fmt, control;
    404	__le16 divisor;
    405	int br;
    406
    407	cflag = tty->termios.c_cflag;
    408
    409	spin_lock_irqsave(&priv->lock, flags);
    410	divisor = priv->pending_setup.divisor;
    411	frame_fmt = priv->pending_setup.frame_fmt;
    412	control = priv->pending_setup.control;
    413	spin_unlock_irqrestore(&priv->lock, flags);
    414
    415	frame_fmt &= ~FMT_DATA_BITS_MASK;
    416	switch (cflag & CSIZE) {
    417	case CS5:
    418		frame_fmt |= FMT_DATA_BITS_5;
    419		break;
    420	case CS6:
    421		frame_fmt |= FMT_DATA_BITS_6;
    422		break;
    423	case CS7:
    424		frame_fmt |= FMT_DATA_BITS_7;
    425		break;
    426	default:
    427	case CS8:
    428		frame_fmt |= FMT_DATA_BITS_8;
    429		break;
    430	}
    431
    432	/* manufacturer claims that this device can work with baud rates
    433	 * up to 3 Mbps; I've tested it only on 115200 bps, so I can't
    434	 * guarantee that any other baud rate will work (especially
    435	 * the higher ones)
    436	 */
    437	br = tty_get_baud_rate(tty);
    438	if (br == 0) {
    439		divisor = 0;
    440	} else {
    441		int real_br;
    442		int new_divisor;
    443		br = min(br, OTI6858_MAX_BAUD_RATE);
    444
    445		new_divisor = (96000000 + 8 * br) / (16 * br);
    446		real_br = 96000000 / (16 * new_divisor);
    447		divisor = cpu_to_le16(new_divisor);
    448		tty_encode_baud_rate(tty, real_br, real_br);
    449	}
    450
    451	frame_fmt &= ~FMT_STOP_BITS_MASK;
    452	if ((cflag & CSTOPB) != 0)
    453		frame_fmt |= FMT_STOP_BITS_2;
    454	else
    455		frame_fmt |= FMT_STOP_BITS_1;
    456
    457	frame_fmt &= ~FMT_PARITY_MASK;
    458	if ((cflag & PARENB) != 0) {
    459		if ((cflag & PARODD) != 0)
    460			frame_fmt |= FMT_PARITY_ODD;
    461		else
    462			frame_fmt |= FMT_PARITY_EVEN;
    463	} else {
    464		frame_fmt |= FMT_PARITY_NONE;
    465	}
    466
    467	control &= ~CONTROL_MASK;
    468	if ((cflag & CRTSCTS) != 0)
    469		control |= (CONTROL_DTR_HIGH | CONTROL_RTS_HIGH);
    470
    471	/* change control lines if we are switching to or from B0 */
    472	/* FIXME:
    473	spin_lock_irqsave(&priv->lock, flags);
    474	control = priv->line_control;
    475	if ((cflag & CBAUD) == B0)
    476		priv->line_control &= ~(CONTROL_DTR | CONTROL_RTS);
    477	else
    478		priv->line_control |= (CONTROL_DTR | CONTROL_RTS);
    479	if (control != priv->line_control) {
    480		control = priv->line_control;
    481		spin_unlock_irqrestore(&priv->lock, flags);
    482		set_control_lines(serial->dev, control);
    483	} else {
    484		spin_unlock_irqrestore(&priv->lock, flags);
    485	}
    486	*/
    487
    488	spin_lock_irqsave(&priv->lock, flags);
    489	if (divisor != priv->pending_setup.divisor
    490			|| control != priv->pending_setup.control
    491			|| frame_fmt != priv->pending_setup.frame_fmt) {
    492		priv->pending_setup.divisor = divisor;
    493		priv->pending_setup.control = control;
    494		priv->pending_setup.frame_fmt = frame_fmt;
    495	}
    496	spin_unlock_irqrestore(&priv->lock, flags);
    497}
    498
    499static int oti6858_open(struct tty_struct *tty, struct usb_serial_port *port)
    500{
    501	struct oti6858_private *priv = usb_get_serial_port_data(port);
    502	struct usb_serial *serial = port->serial;
    503	struct oti6858_control_pkt *buf;
    504	unsigned long flags;
    505	int result;
    506
    507	usb_clear_halt(serial->dev, port->write_urb->pipe);
    508	usb_clear_halt(serial->dev, port->read_urb->pipe);
    509
    510	buf = kmalloc(OTI6858_CTRL_PKT_SIZE, GFP_KERNEL);
    511	if (!buf)
    512		return -ENOMEM;
    513
    514	result = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
    515				OTI6858_REQ_T_GET_STATUS,
    516				OTI6858_REQ_GET_STATUS,
    517				0, 0,
    518				buf, OTI6858_CTRL_PKT_SIZE,
    519				100);
    520	if (result != OTI6858_CTRL_PKT_SIZE) {
    521		/* assume default (after power-on reset) values */
    522		buf->divisor = cpu_to_le16(0x009c);	/* 38400 bps */
    523		buf->frame_fmt = 0x03;	/* 8N1 */
    524		buf->something = 0x43;
    525		buf->control = 0x4c;	/* DTR, RTS */
    526		buf->tx_status = 0x00;
    527		buf->pin_state = 0x5b;	/* RTS, CTS, DSR, DTR, RI, DCD */
    528		buf->rx_bytes_avail = 0x00;
    529	}
    530
    531	spin_lock_irqsave(&priv->lock, flags);
    532	memcpy(&priv->status, buf, OTI6858_CTRL_PKT_SIZE);
    533	priv->pending_setup.divisor = buf->divisor;
    534	priv->pending_setup.frame_fmt = buf->frame_fmt;
    535	priv->pending_setup.control = buf->control;
    536	spin_unlock_irqrestore(&priv->lock, flags);
    537	kfree(buf);
    538
    539	dev_dbg(&port->dev, "%s(): submitting interrupt urb\n", __func__);
    540	result = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
    541	if (result != 0) {
    542		dev_err(&port->dev, "%s(): usb_submit_urb() failed with error %d\n",
    543			__func__, result);
    544		oti6858_close(port);
    545		return result;
    546	}
    547
    548	/* setup termios */
    549	if (tty)
    550		oti6858_set_termios(tty, port, NULL);
    551
    552	return 0;
    553}
    554
    555static void oti6858_close(struct usb_serial_port *port)
    556{
    557	struct oti6858_private *priv = usb_get_serial_port_data(port);
    558	unsigned long flags;
    559
    560	spin_lock_irqsave(&port->lock, flags);
    561	/* clear out any remaining data in the buffer */
    562	kfifo_reset_out(&port->write_fifo);
    563	spin_unlock_irqrestore(&port->lock, flags);
    564
    565	dev_dbg(&port->dev, "%s(): after buf_clear()\n", __func__);
    566
    567	/* cancel scheduled setup */
    568	cancel_delayed_work_sync(&priv->delayed_setup_work);
    569	cancel_delayed_work_sync(&priv->delayed_write_work);
    570
    571	/* shutdown our urbs */
    572	dev_dbg(&port->dev, "%s(): shutting down urbs\n", __func__);
    573	usb_kill_urb(port->write_urb);
    574	usb_kill_urb(port->read_urb);
    575	usb_kill_urb(port->interrupt_in_urb);
    576}
    577
    578static int oti6858_tiocmset(struct tty_struct *tty,
    579				unsigned int set, unsigned int clear)
    580{
    581	struct usb_serial_port *port = tty->driver_data;
    582	struct oti6858_private *priv = usb_get_serial_port_data(port);
    583	unsigned long flags;
    584	u8 control;
    585
    586	dev_dbg(&port->dev, "%s(set = 0x%08x, clear = 0x%08x)\n",
    587		__func__, set, clear);
    588
    589	/* FIXME: check if this is correct (active high/low) */
    590	spin_lock_irqsave(&priv->lock, flags);
    591	control = priv->pending_setup.control;
    592	if ((set & TIOCM_RTS) != 0)
    593		control |= CONTROL_RTS_HIGH;
    594	if ((set & TIOCM_DTR) != 0)
    595		control |= CONTROL_DTR_HIGH;
    596	if ((clear & TIOCM_RTS) != 0)
    597		control &= ~CONTROL_RTS_HIGH;
    598	if ((clear & TIOCM_DTR) != 0)
    599		control &= ~CONTROL_DTR_HIGH;
    600
    601	if (control != priv->pending_setup.control)
    602		priv->pending_setup.control = control;
    603
    604	spin_unlock_irqrestore(&priv->lock, flags);
    605	return 0;
    606}
    607
    608static int oti6858_tiocmget(struct tty_struct *tty)
    609{
    610	struct usb_serial_port *port = tty->driver_data;
    611	struct oti6858_private *priv = usb_get_serial_port_data(port);
    612	unsigned long flags;
    613	unsigned pin_state;
    614	unsigned result = 0;
    615
    616	spin_lock_irqsave(&priv->lock, flags);
    617	pin_state = priv->status.pin_state & PIN_MASK;
    618	spin_unlock_irqrestore(&priv->lock, flags);
    619
    620	/* FIXME: check if this is correct (active high/low) */
    621	if ((pin_state & PIN_RTS) != 0)
    622		result |= TIOCM_RTS;
    623	if ((pin_state & PIN_CTS) != 0)
    624		result |= TIOCM_CTS;
    625	if ((pin_state & PIN_DSR) != 0)
    626		result |= TIOCM_DSR;
    627	if ((pin_state & PIN_DTR) != 0)
    628		result |= TIOCM_DTR;
    629	if ((pin_state & PIN_RI) != 0)
    630		result |= TIOCM_RI;
    631	if ((pin_state & PIN_DCD) != 0)
    632		result |= TIOCM_CD;
    633
    634	dev_dbg(&port->dev, "%s() = 0x%08x\n", __func__, result);
    635
    636	return result;
    637}
    638
    639static void oti6858_read_int_callback(struct urb *urb)
    640{
    641	struct usb_serial_port *port =  urb->context;
    642	struct oti6858_private *priv = usb_get_serial_port_data(port);
    643	int transient = 0, can_recv = 0, resubmit = 1;
    644	int status = urb->status;
    645
    646	switch (status) {
    647	case 0:
    648		/* success */
    649		break;
    650	case -ECONNRESET:
    651	case -ENOENT:
    652	case -ESHUTDOWN:
    653		/* this urb is terminated, clean up */
    654		dev_dbg(&urb->dev->dev, "%s(): urb shutting down with status: %d\n",
    655			__func__, status);
    656		return;
    657	default:
    658		dev_dbg(&urb->dev->dev, "%s(): nonzero urb status received: %d\n",
    659			__func__, status);
    660		break;
    661	}
    662
    663	if (status == 0 && urb->actual_length == OTI6858_CTRL_PKT_SIZE) {
    664		struct oti6858_control_pkt *xs = urb->transfer_buffer;
    665		unsigned long flags;
    666
    667		spin_lock_irqsave(&priv->lock, flags);
    668
    669		if (!priv->transient) {
    670			if (!OTI6858_CTRL_EQUALS_PENDING(xs, priv)) {
    671				if (xs->rx_bytes_avail == 0) {
    672					priv->transient = 4;
    673					priv->setup_done = 0;
    674					resubmit = 0;
    675					dev_dbg(&port->dev, "%s(): scheduling setup_line()\n", __func__);
    676					schedule_delayed_work(&priv->delayed_setup_work, 0);
    677				}
    678			}
    679		} else {
    680			if (OTI6858_CTRL_EQUALS_PENDING(xs, priv)) {
    681				priv->transient = 0;
    682			} else if (!priv->setup_done) {
    683				resubmit = 0;
    684			} else if (--priv->transient == 0) {
    685				if (xs->rx_bytes_avail == 0) {
    686					priv->transient = 4;
    687					priv->setup_done = 0;
    688					resubmit = 0;
    689					dev_dbg(&port->dev, "%s(): scheduling setup_line()\n", __func__);
    690					schedule_delayed_work(&priv->delayed_setup_work, 0);
    691				}
    692			}
    693		}
    694
    695		if (!priv->transient) {
    696			u8 delta = xs->pin_state ^ priv->status.pin_state;
    697
    698			if (delta & PIN_MSR_MASK) {
    699				if (delta & PIN_CTS)
    700					port->icount.cts++;
    701				if (delta & PIN_DSR)
    702					port->icount.dsr++;
    703				if (delta & PIN_RI)
    704					port->icount.rng++;
    705				if (delta & PIN_DCD)
    706					port->icount.dcd++;
    707
    708				wake_up_interruptible(&port->port.delta_msr_wait);
    709			}
    710
    711			memcpy(&priv->status, xs, OTI6858_CTRL_PKT_SIZE);
    712		}
    713
    714		if (!priv->transient && xs->rx_bytes_avail != 0) {
    715			can_recv = xs->rx_bytes_avail;
    716			priv->flags.read_urb_in_use = 1;
    717		}
    718
    719		transient = priv->transient;
    720		spin_unlock_irqrestore(&priv->lock, flags);
    721	}
    722
    723	if (can_recv) {
    724		int result;
    725
    726		result = usb_submit_urb(port->read_urb, GFP_ATOMIC);
    727		if (result != 0) {
    728			priv->flags.read_urb_in_use = 0;
    729			dev_err(&port->dev, "%s(): usb_submit_urb() failed,"
    730					" error %d\n", __func__, result);
    731		} else {
    732			resubmit = 0;
    733		}
    734	} else if (!transient) {
    735		unsigned long flags;
    736		int count;
    737
    738		spin_lock_irqsave(&port->lock, flags);
    739		count = kfifo_len(&port->write_fifo);
    740		spin_unlock_irqrestore(&port->lock, flags);
    741
    742		spin_lock_irqsave(&priv->lock, flags);
    743		if (priv->flags.write_urb_in_use == 0 && count != 0) {
    744			schedule_delayed_work(&priv->delayed_write_work, 0);
    745			resubmit = 0;
    746		}
    747		spin_unlock_irqrestore(&priv->lock, flags);
    748	}
    749
    750	if (resubmit) {
    751		int result;
    752
    753/*		dev_dbg(&urb->dev->dev, "%s(): submitting interrupt urb\n", __func__); */
    754		result = usb_submit_urb(urb, GFP_ATOMIC);
    755		if (result != 0) {
    756			dev_err(&urb->dev->dev,
    757					"%s(): usb_submit_urb() failed with"
    758					" error %d\n", __func__, result);
    759		}
    760	}
    761}
    762
    763static void oti6858_read_bulk_callback(struct urb *urb)
    764{
    765	struct usb_serial_port *port =  urb->context;
    766	struct oti6858_private *priv = usb_get_serial_port_data(port);
    767	unsigned char *data = urb->transfer_buffer;
    768	unsigned long flags;
    769	int status = urb->status;
    770	int result;
    771
    772	spin_lock_irqsave(&priv->lock, flags);
    773	priv->flags.read_urb_in_use = 0;
    774	spin_unlock_irqrestore(&priv->lock, flags);
    775
    776	if (status != 0) {
    777		dev_dbg(&urb->dev->dev, "%s(): unable to handle the error, exiting\n", __func__);
    778		return;
    779	}
    780
    781	if (urb->actual_length > 0) {
    782		tty_insert_flip_string(&port->port, data, urb->actual_length);
    783		tty_flip_buffer_push(&port->port);
    784	}
    785
    786	/* schedule the interrupt urb */
    787	result = usb_submit_urb(port->interrupt_in_urb, GFP_ATOMIC);
    788	if (result != 0 && result != -EPERM) {
    789		dev_err(&port->dev, "%s(): usb_submit_urb() failed,"
    790				" error %d\n", __func__, result);
    791	}
    792}
    793
    794static void oti6858_write_bulk_callback(struct urb *urb)
    795{
    796	struct usb_serial_port *port =  urb->context;
    797	struct oti6858_private *priv = usb_get_serial_port_data(port);
    798	int status = urb->status;
    799	int result;
    800
    801	switch (status) {
    802	case 0:
    803		/* success */
    804		break;
    805	case -ECONNRESET:
    806	case -ENOENT:
    807	case -ESHUTDOWN:
    808		/* this urb is terminated, clean up */
    809		dev_dbg(&urb->dev->dev, "%s(): urb shutting down with status: %d\n", __func__, status);
    810		priv->flags.write_urb_in_use = 0;
    811		return;
    812	default:
    813		/* error in the urb, so we have to resubmit it */
    814		dev_dbg(&urb->dev->dev, "%s(): nonzero write bulk status received: %d\n", __func__, status);
    815		dev_dbg(&urb->dev->dev, "%s(): overflow in write\n", __func__);
    816
    817		port->write_urb->transfer_buffer_length = 1;
    818		result = usb_submit_urb(port->write_urb, GFP_ATOMIC);
    819		if (result) {
    820			dev_err_console(port, "%s(): usb_submit_urb() failed,"
    821					" error %d\n", __func__, result);
    822		} else {
    823			return;
    824		}
    825	}
    826
    827	priv->flags.write_urb_in_use = 0;
    828
    829	/* schedule the interrupt urb if we are still open */
    830	dev_dbg(&port->dev, "%s(): submitting interrupt urb\n", __func__);
    831	result = usb_submit_urb(port->interrupt_in_urb, GFP_ATOMIC);
    832	if (result != 0) {
    833		dev_err(&port->dev, "%s(): failed submitting int urb,"
    834					" error %d\n", __func__, result);
    835	}
    836}
    837
    838module_usb_serial_driver(serial_drivers, id_table);
    839
    840MODULE_DESCRIPTION(OTI6858_DESCRIPTION);
    841MODULE_AUTHOR(OTI6858_AUTHOR);
    842MODULE_LICENSE("GPL v2");