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,
123				const struct ktermios *old_termios);
124static void oti6858_init_termios(struct tty_struct *tty);
125static void oti6858_read_int_callback(struct urb *urb);
126static void oti6858_read_bulk_callback(struct urb *urb);
127static void oti6858_write_bulk_callback(struct urb *urb);
128static int oti6858_write(struct tty_struct *tty, struct usb_serial_port *port,
129			const unsigned char *buf, int count);
130static unsigned int oti6858_write_room(struct tty_struct *tty);
131static unsigned int oti6858_chars_in_buffer(struct tty_struct *tty);
132static int oti6858_tiocmget(struct tty_struct *tty);
133static int oti6858_tiocmset(struct tty_struct *tty,
134				unsigned int set, unsigned int clear);
135static int oti6858_port_probe(struct usb_serial_port *port);
136static void oti6858_port_remove(struct usb_serial_port *port);
137
138/* device info */
139static struct usb_serial_driver oti6858_device = {
140	.driver = {
141		.owner =	THIS_MODULE,
142		.name =		"oti6858",
143	},
144	.id_table =		id_table,
145	.num_ports =		1,
146	.num_bulk_in =		1,
147	.num_bulk_out =		1,
148	.num_interrupt_in =	1,
149	.open =			oti6858_open,
150	.close =		oti6858_close,
151	.write =		oti6858_write,
152	.set_termios =		oti6858_set_termios,
153	.init_termios = 	oti6858_init_termios,
154	.tiocmget =		oti6858_tiocmget,
155	.tiocmset =		oti6858_tiocmset,
156	.tiocmiwait =		usb_serial_generic_tiocmiwait,
157	.read_bulk_callback =	oti6858_read_bulk_callback,
158	.read_int_callback =	oti6858_read_int_callback,
159	.write_bulk_callback =	oti6858_write_bulk_callback,
160	.write_room =		oti6858_write_room,
161	.chars_in_buffer =	oti6858_chars_in_buffer,
162	.port_probe =		oti6858_port_probe,
163	.port_remove =		oti6858_port_remove,
164};
165
166static struct usb_serial_driver * const serial_drivers[] = {
167	&oti6858_device, NULL
168};
169
170struct oti6858_private {
171	spinlock_t lock;
172
173	struct oti6858_control_pkt status;
174
175	struct {
176		u8 read_urb_in_use;
177		u8 write_urb_in_use;
178	} flags;
179	struct delayed_work delayed_write_work;
180
181	struct {
182		__le16 divisor;
183		u8 frame_fmt;
184		u8 control;
185	} pending_setup;
186	u8 transient;
187	u8 setup_done;
188	struct delayed_work delayed_setup_work;
189
190	struct usb_serial_port *port;   /* USB port with which associated */
191};
192
193static void setup_line(struct work_struct *work)
194{
195	struct oti6858_private *priv = container_of(work,
196			struct oti6858_private, delayed_setup_work.work);
197	struct usb_serial_port *port = priv->port;
198	struct oti6858_control_pkt *new_setup;
199	unsigned long flags;
200	int result;
201
202	new_setup = kmalloc(OTI6858_CTRL_PKT_SIZE, GFP_KERNEL);
203	if (!new_setup) {
204		/* we will try again */
205		schedule_delayed_work(&priv->delayed_setup_work,
206						msecs_to_jiffies(2));
207		return;
208	}
209
210	result = usb_control_msg(port->serial->dev,
211				usb_rcvctrlpipe(port->serial->dev, 0),
212				OTI6858_REQ_T_GET_STATUS,
213				OTI6858_REQ_GET_STATUS,
214				0, 0,
215				new_setup, OTI6858_CTRL_PKT_SIZE,
216				100);
217
218	if (result != OTI6858_CTRL_PKT_SIZE) {
219		dev_err(&port->dev, "%s(): error reading status\n", __func__);
220		kfree(new_setup);
221		/* we will try again */
222		schedule_delayed_work(&priv->delayed_setup_work,
223							msecs_to_jiffies(2));
224		return;
225	}
226
227	spin_lock_irqsave(&priv->lock, flags);
228	if (!OTI6858_CTRL_EQUALS_PENDING(new_setup, priv)) {
229		new_setup->divisor = priv->pending_setup.divisor;
230		new_setup->control = priv->pending_setup.control;
231		new_setup->frame_fmt = priv->pending_setup.frame_fmt;
232
233		spin_unlock_irqrestore(&priv->lock, flags);
234		result = usb_control_msg(port->serial->dev,
235					usb_sndctrlpipe(port->serial->dev, 0),
236					OTI6858_REQ_T_SET_LINE,
237					OTI6858_REQ_SET_LINE,
238					0, 0,
239					new_setup, OTI6858_CTRL_PKT_SIZE,
240					100);
241	} else {
242		spin_unlock_irqrestore(&priv->lock, flags);
243		result = 0;
244	}
245	kfree(new_setup);
246
247	spin_lock_irqsave(&priv->lock, flags);
248	if (result != OTI6858_CTRL_PKT_SIZE)
249		priv->transient = 0;
250	priv->setup_done = 1;
251	spin_unlock_irqrestore(&priv->lock, flags);
252
253	dev_dbg(&port->dev, "%s(): submitting interrupt urb\n", __func__);
254	result = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
255	if (result != 0) {
256		dev_err(&port->dev, "%s(): usb_submit_urb() failed with error %d\n",
257			__func__, result);
258	}
259}
260
261static void send_data(struct work_struct *work)
262{
263	struct oti6858_private *priv = container_of(work,
264			struct oti6858_private, delayed_write_work.work);
265	struct usb_serial_port *port = priv->port;
266	int count = 0, result;
267	unsigned long flags;
268	u8 *allow;
269
270	spin_lock_irqsave(&priv->lock, flags);
271	if (priv->flags.write_urb_in_use) {
272		spin_unlock_irqrestore(&priv->lock, flags);
273		schedule_delayed_work(&priv->delayed_write_work,
274						msecs_to_jiffies(2));
275		return;
276	}
277	priv->flags.write_urb_in_use = 1;
278	spin_unlock_irqrestore(&priv->lock, flags);
279
280	spin_lock_irqsave(&port->lock, flags);
281	count = kfifo_len(&port->write_fifo);
282	spin_unlock_irqrestore(&port->lock, flags);
283
284	if (count > port->bulk_out_size)
285		count = port->bulk_out_size;
286
287	if (count != 0) {
288		allow = kmalloc(1, GFP_KERNEL);
289		if (!allow)
290			return;
291
292		result = usb_control_msg(port->serial->dev,
293				usb_rcvctrlpipe(port->serial->dev, 0),
294				OTI6858_REQ_T_CHECK_TXBUFF,
295				OTI6858_REQ_CHECK_TXBUFF,
296				count, 0, allow, 1, 100);
297		if (result != 1 || *allow != 0)
298			count = 0;
299		kfree(allow);
300	}
301
302	if (count == 0) {
303		priv->flags.write_urb_in_use = 0;
304
305		dev_dbg(&port->dev, "%s(): submitting interrupt urb\n", __func__);
306		result = usb_submit_urb(port->interrupt_in_urb, GFP_NOIO);
307		if (result != 0) {
308			dev_err(&port->dev, "%s(): usb_submit_urb() failed with error %d\n",
309				__func__, result);
310		}
311		return;
312	}
313
314	count = kfifo_out_locked(&port->write_fifo,
315					port->write_urb->transfer_buffer,
316					count, &port->lock);
317	port->write_urb->transfer_buffer_length = count;
318	result = usb_submit_urb(port->write_urb, GFP_NOIO);
319	if (result != 0) {
320		dev_err_console(port, "%s(): usb_submit_urb() failed with error %d\n",
321				__func__, result);
322		priv->flags.write_urb_in_use = 0;
323	}
324
325	usb_serial_port_softint(port);
326}
327
328static int oti6858_port_probe(struct usb_serial_port *port)
329{
330	struct oti6858_private *priv;
331
332	priv = kzalloc(sizeof(*priv), GFP_KERNEL);
333	if (!priv)
334		return -ENOMEM;
335
336	spin_lock_init(&priv->lock);
337	priv->port = port;
338	INIT_DELAYED_WORK(&priv->delayed_setup_work, setup_line);
339	INIT_DELAYED_WORK(&priv->delayed_write_work, send_data);
340
341	usb_set_serial_port_data(port, priv);
342
343	port->port.drain_delay = 256;	/* FIXME: check the FIFO length */
344
345	return 0;
346}
347
348static void oti6858_port_remove(struct usb_serial_port *port)
349{
350	struct oti6858_private *priv;
351
352	priv = usb_get_serial_port_data(port);
353	kfree(priv);
354}
355
356static int oti6858_write(struct tty_struct *tty, struct usb_serial_port *port,
357			const unsigned char *buf, int count)
358{
359	if (!count)
360		return count;
361
362	count = kfifo_in_locked(&port->write_fifo, buf, count, &port->lock);
363
364	return count;
365}
366
367static unsigned int oti6858_write_room(struct tty_struct *tty)
368{
369	struct usb_serial_port *port = tty->driver_data;
370	unsigned int room;
371	unsigned long flags;
372
373	spin_lock_irqsave(&port->lock, flags);
374	room = kfifo_avail(&port->write_fifo);
375	spin_unlock_irqrestore(&port->lock, flags);
376
377	return room;
378}
379
380static unsigned int oti6858_chars_in_buffer(struct tty_struct *tty)
381{
382	struct usb_serial_port *port = tty->driver_data;
383	unsigned int chars;
384	unsigned long flags;
385
386	spin_lock_irqsave(&port->lock, flags);
387	chars = kfifo_len(&port->write_fifo);
388	spin_unlock_irqrestore(&port->lock, flags);
389
390	return chars;
391}
392
393static void oti6858_init_termios(struct tty_struct *tty)
394{
395	tty_encode_baud_rate(tty, 38400, 38400);
396}
397
398static void oti6858_set_termios(struct tty_struct *tty,
399				struct usb_serial_port *port,
400				const struct ktermios *old_termios)
401{
402	struct oti6858_private *priv = usb_get_serial_port_data(port);
403	unsigned long flags;
404	unsigned int cflag;
405	u8 frame_fmt, control;
406	__le16 divisor;
407	int br;
408
409	cflag = tty->termios.c_cflag;
410
411	spin_lock_irqsave(&priv->lock, flags);
412	frame_fmt = priv->pending_setup.frame_fmt;
413	control = priv->pending_setup.control;
414	spin_unlock_irqrestore(&priv->lock, flags);
415
416	frame_fmt &= ~FMT_DATA_BITS_MASK;
417	switch (cflag & CSIZE) {
418	case CS5:
419		frame_fmt |= FMT_DATA_BITS_5;
420		break;
421	case CS6:
422		frame_fmt |= FMT_DATA_BITS_6;
423		break;
424	case CS7:
425		frame_fmt |= FMT_DATA_BITS_7;
426		break;
427	default:
428	case CS8:
429		frame_fmt |= FMT_DATA_BITS_8;
430		break;
431	}
432
433	/* manufacturer claims that this device can work with baud rates
434	 * up to 3 Mbps; I've tested it only on 115200 bps, so I can't
435	 * guarantee that any other baud rate will work (especially
436	 * the higher ones)
437	 */
438	br = tty_get_baud_rate(tty);
439	if (br == 0) {
440		divisor = 0;
441	} else {
442		int real_br;
443		int new_divisor;
444		br = min(br, OTI6858_MAX_BAUD_RATE);
445
446		new_divisor = (96000000 + 8 * br) / (16 * br);
447		real_br = 96000000 / (16 * new_divisor);
448		divisor = cpu_to_le16(new_divisor);
449		tty_encode_baud_rate(tty, real_br, real_br);
450	}
451
452	frame_fmt &= ~FMT_STOP_BITS_MASK;
453	if ((cflag & CSTOPB) != 0)
454		frame_fmt |= FMT_STOP_BITS_2;
455	else
456		frame_fmt |= FMT_STOP_BITS_1;
457
458	frame_fmt &= ~FMT_PARITY_MASK;
459	if ((cflag & PARENB) != 0) {
460		if ((cflag & PARODD) != 0)
461			frame_fmt |= FMT_PARITY_ODD;
462		else
463			frame_fmt |= FMT_PARITY_EVEN;
464	} else {
465		frame_fmt |= FMT_PARITY_NONE;
466	}
467
468	control &= ~CONTROL_MASK;
469	if ((cflag & CRTSCTS) != 0)
470		control |= (CONTROL_DTR_HIGH | CONTROL_RTS_HIGH);
471
472	/* change control lines if we are switching to or from B0 */
473	/* FIXME:
474	spin_lock_irqsave(&priv->lock, flags);
475	control = priv->line_control;
476	if ((cflag & CBAUD) == B0)
477		priv->line_control &= ~(CONTROL_DTR | CONTROL_RTS);
478	else
479		priv->line_control |= (CONTROL_DTR | CONTROL_RTS);
480	if (control != priv->line_control) {
481		control = priv->line_control;
482		spin_unlock_irqrestore(&priv->lock, flags);
483		set_control_lines(serial->dev, control);
484	} else {
485		spin_unlock_irqrestore(&priv->lock, flags);
486	}
487	*/
488
489	spin_lock_irqsave(&priv->lock, flags);
490	if (divisor != priv->pending_setup.divisor
491			|| control != priv->pending_setup.control
492			|| frame_fmt != priv->pending_setup.frame_fmt) {
493		priv->pending_setup.divisor = divisor;
494		priv->pending_setup.control = control;
495		priv->pending_setup.frame_fmt = frame_fmt;
496	}
497	spin_unlock_irqrestore(&priv->lock, flags);
498}
499
500static int oti6858_open(struct tty_struct *tty, struct usb_serial_port *port)
501{
502	struct oti6858_private *priv = usb_get_serial_port_data(port);
503	struct usb_serial *serial = port->serial;
504	struct oti6858_control_pkt *buf;
505	unsigned long flags;
506	int result;
507
508	usb_clear_halt(serial->dev, port->write_urb->pipe);
509	usb_clear_halt(serial->dev, port->read_urb->pipe);
510
511	buf = kmalloc(OTI6858_CTRL_PKT_SIZE, GFP_KERNEL);
512	if (!buf)
513		return -ENOMEM;
514
515	result = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
516				OTI6858_REQ_T_GET_STATUS,
517				OTI6858_REQ_GET_STATUS,
518				0, 0,
519				buf, OTI6858_CTRL_PKT_SIZE,
520				100);
521	if (result != OTI6858_CTRL_PKT_SIZE) {
522		/* assume default (after power-on reset) values */
523		buf->divisor = cpu_to_le16(0x009c);	/* 38400 bps */
524		buf->frame_fmt = 0x03;	/* 8N1 */
525		buf->something = 0x43;
526		buf->control = 0x4c;	/* DTR, RTS */
527		buf->tx_status = 0x00;
528		buf->pin_state = 0x5b;	/* RTS, CTS, DSR, DTR, RI, DCD */
529		buf->rx_bytes_avail = 0x00;
530	}
531
532	spin_lock_irqsave(&priv->lock, flags);
533	memcpy(&priv->status, buf, OTI6858_CTRL_PKT_SIZE);
534	priv->pending_setup.divisor = buf->divisor;
535	priv->pending_setup.frame_fmt = buf->frame_fmt;
536	priv->pending_setup.control = buf->control;
537	spin_unlock_irqrestore(&priv->lock, flags);
538	kfree(buf);
539
540	dev_dbg(&port->dev, "%s(): submitting interrupt urb\n", __func__);
541	result = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
542	if (result != 0) {
543		dev_err(&port->dev, "%s(): usb_submit_urb() failed with error %d\n",
544			__func__, result);
545		oti6858_close(port);
546		return result;
547	}
548
549	/* setup termios */
550	if (tty)
551		oti6858_set_termios(tty, port, NULL);
552
553	return 0;
554}
555
556static void oti6858_close(struct usb_serial_port *port)
557{
558	struct oti6858_private *priv = usb_get_serial_port_data(port);
559	unsigned long flags;
560
561	spin_lock_irqsave(&port->lock, flags);
562	/* clear out any remaining data in the buffer */
563	kfifo_reset_out(&port->write_fifo);
564	spin_unlock_irqrestore(&port->lock, flags);
565
566	dev_dbg(&port->dev, "%s(): after buf_clear()\n", __func__);
567
568	/* cancel scheduled setup */
569	cancel_delayed_work_sync(&priv->delayed_setup_work);
570	cancel_delayed_work_sync(&priv->delayed_write_work);
571
572	/* shutdown our urbs */
573	dev_dbg(&port->dev, "%s(): shutting down urbs\n", __func__);
574	usb_kill_urb(port->write_urb);
575	usb_kill_urb(port->read_urb);
576	usb_kill_urb(port->interrupt_in_urb);
577}
578
579static int oti6858_tiocmset(struct tty_struct *tty,
580				unsigned int set, unsigned int clear)
581{
582	struct usb_serial_port *port = tty->driver_data;
583	struct oti6858_private *priv = usb_get_serial_port_data(port);
584	unsigned long flags;
585	u8 control;
586
587	dev_dbg(&port->dev, "%s(set = 0x%08x, clear = 0x%08x)\n",
588		__func__, set, clear);
589
590	/* FIXME: check if this is correct (active high/low) */
591	spin_lock_irqsave(&priv->lock, flags);
592	control = priv->pending_setup.control;
593	if ((set & TIOCM_RTS) != 0)
594		control |= CONTROL_RTS_HIGH;
595	if ((set & TIOCM_DTR) != 0)
596		control |= CONTROL_DTR_HIGH;
597	if ((clear & TIOCM_RTS) != 0)
598		control &= ~CONTROL_RTS_HIGH;
599	if ((clear & TIOCM_DTR) != 0)
600		control &= ~CONTROL_DTR_HIGH;
601
602	if (control != priv->pending_setup.control)
603		priv->pending_setup.control = control;
604
605	spin_unlock_irqrestore(&priv->lock, flags);
606	return 0;
607}
608
609static int oti6858_tiocmget(struct tty_struct *tty)
610{
611	struct usb_serial_port *port = tty->driver_data;
612	struct oti6858_private *priv = usb_get_serial_port_data(port);
613	unsigned long flags;
614	unsigned pin_state;
615	unsigned result = 0;
616
617	spin_lock_irqsave(&priv->lock, flags);
618	pin_state = priv->status.pin_state & PIN_MASK;
619	spin_unlock_irqrestore(&priv->lock, flags);
620
621	/* FIXME: check if this is correct (active high/low) */
622	if ((pin_state & PIN_RTS) != 0)
623		result |= TIOCM_RTS;
624	if ((pin_state & PIN_CTS) != 0)
625		result |= TIOCM_CTS;
626	if ((pin_state & PIN_DSR) != 0)
627		result |= TIOCM_DSR;
628	if ((pin_state & PIN_DTR) != 0)
629		result |= TIOCM_DTR;
630	if ((pin_state & PIN_RI) != 0)
631		result |= TIOCM_RI;
632	if ((pin_state & PIN_DCD) != 0)
633		result |= TIOCM_CD;
634
635	dev_dbg(&port->dev, "%s() = 0x%08x\n", __func__, result);
636
637	return result;
638}
639
640static void oti6858_read_int_callback(struct urb *urb)
641{
642	struct usb_serial_port *port =  urb->context;
643	struct oti6858_private *priv = usb_get_serial_port_data(port);
644	int transient = 0, can_recv = 0, resubmit = 1;
645	int status = urb->status;
646
647	switch (status) {
648	case 0:
649		/* success */
650		break;
651	case -ECONNRESET:
652	case -ENOENT:
653	case -ESHUTDOWN:
654		/* this urb is terminated, clean up */
655		dev_dbg(&urb->dev->dev, "%s(): urb shutting down with status: %d\n",
656			__func__, status);
657		return;
658	default:
659		dev_dbg(&urb->dev->dev, "%s(): nonzero urb status received: %d\n",
660			__func__, status);
661		break;
662	}
663
664	if (status == 0 && urb->actual_length == OTI6858_CTRL_PKT_SIZE) {
665		struct oti6858_control_pkt *xs = urb->transfer_buffer;
666		unsigned long flags;
667
668		spin_lock_irqsave(&priv->lock, flags);
669
670		if (!priv->transient) {
671			if (!OTI6858_CTRL_EQUALS_PENDING(xs, priv)) {
672				if (xs->rx_bytes_avail == 0) {
673					priv->transient = 4;
674					priv->setup_done = 0;
675					resubmit = 0;
676					dev_dbg(&port->dev, "%s(): scheduling setup_line()\n", __func__);
677					schedule_delayed_work(&priv->delayed_setup_work, 0);
678				}
679			}
680		} else {
681			if (OTI6858_CTRL_EQUALS_PENDING(xs, priv)) {
682				priv->transient = 0;
683			} else if (!priv->setup_done) {
684				resubmit = 0;
685			} else if (--priv->transient == 0) {
686				if (xs->rx_bytes_avail == 0) {
687					priv->transient = 4;
688					priv->setup_done = 0;
689					resubmit = 0;
690					dev_dbg(&port->dev, "%s(): scheduling setup_line()\n", __func__);
691					schedule_delayed_work(&priv->delayed_setup_work, 0);
692				}
693			}
694		}
695
696		if (!priv->transient) {
697			u8 delta = xs->pin_state ^ priv->status.pin_state;
698
699			if (delta & PIN_MSR_MASK) {
700				if (delta & PIN_CTS)
701					port->icount.cts++;
702				if (delta & PIN_DSR)
703					port->icount.dsr++;
704				if (delta & PIN_RI)
705					port->icount.rng++;
706				if (delta & PIN_DCD)
707					port->icount.dcd++;
708
709				wake_up_interruptible(&port->port.delta_msr_wait);
710			}
711
712			memcpy(&priv->status, xs, OTI6858_CTRL_PKT_SIZE);
713		}
714
715		if (!priv->transient && xs->rx_bytes_avail != 0) {
716			can_recv = xs->rx_bytes_avail;
717			priv->flags.read_urb_in_use = 1;
718		}
719
720		transient = priv->transient;
721		spin_unlock_irqrestore(&priv->lock, flags);
722	}
723
724	if (can_recv) {
725		int result;
726
727		result = usb_submit_urb(port->read_urb, GFP_ATOMIC);
728		if (result != 0) {
729			priv->flags.read_urb_in_use = 0;
730			dev_err(&port->dev, "%s(): usb_submit_urb() failed,"
731					" error %d\n", __func__, result);
732		} else {
733			resubmit = 0;
734		}
735	} else if (!transient) {
736		unsigned long flags;
737		int count;
738
739		spin_lock_irqsave(&port->lock, flags);
740		count = kfifo_len(&port->write_fifo);
741		spin_unlock_irqrestore(&port->lock, flags);
742
743		spin_lock_irqsave(&priv->lock, flags);
744		if (priv->flags.write_urb_in_use == 0 && count != 0) {
745			schedule_delayed_work(&priv->delayed_write_work, 0);
746			resubmit = 0;
747		}
748		spin_unlock_irqrestore(&priv->lock, flags);
749	}
750
751	if (resubmit) {
752		int result;
753
754/*		dev_dbg(&urb->dev->dev, "%s(): submitting interrupt urb\n", __func__); */
755		result = usb_submit_urb(urb, GFP_ATOMIC);
756		if (result != 0) {
757			dev_err(&urb->dev->dev,
758					"%s(): usb_submit_urb() failed with"
759					" error %d\n", __func__, result);
760		}
761	}
762}
763
764static void oti6858_read_bulk_callback(struct urb *urb)
765{
766	struct usb_serial_port *port =  urb->context;
767	struct oti6858_private *priv = usb_get_serial_port_data(port);
768	unsigned char *data = urb->transfer_buffer;
769	unsigned long flags;
770	int status = urb->status;
771	int result;
772
773	spin_lock_irqsave(&priv->lock, flags);
774	priv->flags.read_urb_in_use = 0;
775	spin_unlock_irqrestore(&priv->lock, flags);
776
777	if (status != 0) {
778		dev_dbg(&urb->dev->dev, "%s(): unable to handle the error, exiting\n", __func__);
779		return;
780	}
781
782	if (urb->actual_length > 0) {
783		tty_insert_flip_string(&port->port, data, urb->actual_length);
784		tty_flip_buffer_push(&port->port);
785	}
786
787	/* schedule the interrupt urb */
788	result = usb_submit_urb(port->interrupt_in_urb, GFP_ATOMIC);
789	if (result != 0 && result != -EPERM) {
790		dev_err(&port->dev, "%s(): usb_submit_urb() failed,"
791				" error %d\n", __func__, result);
792	}
793}
794
795static void oti6858_write_bulk_callback(struct urb *urb)
796{
797	struct usb_serial_port *port =  urb->context;
798	struct oti6858_private *priv = usb_get_serial_port_data(port);
799	int status = urb->status;
800	int result;
801
802	switch (status) {
803	case 0:
804		/* success */
805		break;
806	case -ECONNRESET:
807	case -ENOENT:
808	case -ESHUTDOWN:
809		/* this urb is terminated, clean up */
810		dev_dbg(&urb->dev->dev, "%s(): urb shutting down with status: %d\n", __func__, status);
811		priv->flags.write_urb_in_use = 0;
812		return;
813	default:
814		/* error in the urb, so we have to resubmit it */
815		dev_dbg(&urb->dev->dev, "%s(): nonzero write bulk status received: %d\n", __func__, status);
816		dev_dbg(&urb->dev->dev, "%s(): overflow in write\n", __func__);
817
818		port->write_urb->transfer_buffer_length = 1;
819		result = usb_submit_urb(port->write_urb, GFP_ATOMIC);
820		if (result) {
821			dev_err_console(port, "%s(): usb_submit_urb() failed,"
822					" error %d\n", __func__, result);
823		} else {
824			return;
825		}
826	}
827
828	priv->flags.write_urb_in_use = 0;
829
830	/* schedule the interrupt urb if we are still open */
831	dev_dbg(&port->dev, "%s(): submitting interrupt urb\n", __func__);
832	result = usb_submit_urb(port->interrupt_in_urb, GFP_ATOMIC);
833	if (result != 0) {
834		dev_err(&port->dev, "%s(): failed submitting int urb,"
835					" error %d\n", __func__, result);
836	}
837}
838
839module_usb_serial_driver(serial_drivers, id_table);
840
841MODULE_DESCRIPTION(OTI6858_DESCRIPTION);
842MODULE_AUTHOR(OTI6858_AUTHOR);
843MODULE_LICENSE("GPL v2");
844