1/*
2 * KLSI KL5KUSB105 chip RS232 converter driver
3 *
4 *   Copyright (C) 2001 Utz-Uwe Haus <haus@uuhaus.de>
5 *
6 *   This program is free software; you can redistribute it and/or modify
7 *   it under the terms of the GNU General Public License as published by
8 *   the Free Software Foundation; either version 2 of the License, or
9 *   (at your option) any later version.
10 *
11 * All information about the device was acquired using SniffUSB ans snoopUSB
12 * on Windows98.
13 * It was written out of frustration with the PalmConnect USB Serial adapter
14 * sold by Palm Inc.
15 * Neither Palm, nor their contractor (MCCI) or their supplier (KLSI) provided
16 * information that was not already available.
17 *
18 * It seems that KLSI bought some silicon-design information from ScanLogic,
19 * whose SL11R processor is at the core of the KL5KUSB chipset from KLSI.
20 * KLSI has firmware available for their devices; it is probable that the
21 * firmware differs from that used by KLSI in their products. If you have an
22 * original KLSI device and can provide some information on it, I would be
23 * most interested in adding support for it here. If you have any information
24 * on the protocol used (or find errors in my reverse-engineered stuff), please
25 * let me know.
26 *
27 * The code was only tested with a PalmConnect USB adapter; if you
28 * are adventurous, try it with any KLSI-based device and let me know how it
29 * breaks so that I can fix it!
30 */
31
32/* TODO:
33 *	check modem line signals
34 *	implement handshaking or decide that we do not support it
35 */
36
37/* History:
38 *   0.3a - implemented pools of write URBs
39 *   0.3  - alpha version for public testing
40 *   0.2  - TIOCMGET works, so autopilot(1) can be used!
41 *   0.1  - can be used to to pilot-xfer -p /dev/ttyUSB0 -l
42 *
43 *   The driver skeleton is mainly based on mct_u232.c and various other
44 *   pieces of code shamelessly copied from the drivers/usb/serial/ directory.
45 */
46
47
48#include <linux/kernel.h>
49#include <linux/errno.h>
50#include <linux/init.h>
51#include <linux/slab.h>
52#include <linux/tty.h>
53#include <linux/tty_driver.h>
54#include <linux/tty_flip.h>
55#include <linux/module.h>
56#include <asm/uaccess.h>
57#include <linux/usb.h>
58#include <linux/usb/serial.h>
59#include "kl5kusb105.h"
60
61static int debug;
62
63/*
64 * Version Information
65 */
66#define DRIVER_VERSION "v0.3a"
67#define DRIVER_AUTHOR "Utz-Uwe Haus <haus@uuhaus.de>"
68#define DRIVER_DESC "KLSI KL5KUSB105 chipset USB->Serial Converter driver"
69
70
71/*
72 * Function prototypes
73 */
74static int  klsi_105_startup	         (struct usb_serial *serial);
75static void klsi_105_shutdown	         (struct usb_serial *serial);
76static int  klsi_105_open	         (struct usb_serial_port *port,
77					  struct file *filp);
78static void klsi_105_close	         (struct usb_serial_port *port,
79					  struct file *filp);
80static int  klsi_105_write	         (struct usb_serial_port *port,
81					  const unsigned char *buf,
82					  int count);
83static void klsi_105_write_bulk_callback (struct urb *urb);
84static int  klsi_105_chars_in_buffer     (struct usb_serial_port *port);
85static int  klsi_105_write_room          (struct usb_serial_port *port);
86
87static void klsi_105_read_bulk_callback  (struct urb *urb);
88static void klsi_105_set_termios         (struct usb_serial_port *port,
89					  struct ktermios *old);
90static void klsi_105_throttle		 (struct usb_serial_port *port);
91static void klsi_105_unthrottle		 (struct usb_serial_port *port);
92/*
93static void klsi_105_break_ctl	         (struct usb_serial_port *port,
94					  int break_state );
95 */
96static int  klsi_105_tiocmget	         (struct usb_serial_port *port,
97					  struct file *file);
98static int  klsi_105_tiocmset	         (struct usb_serial_port *port,
99					  struct file *file, unsigned int set,
100					  unsigned int clear);
101
102/*
103 * All of the device info needed for the KLSI converters.
104 */
105static struct usb_device_id id_table [] = {
106	{ USB_DEVICE(PALMCONNECT_VID, PALMCONNECT_PID) },
107	{ USB_DEVICE(KLSI_VID, KLSI_KL5KUSB105D_PID) },
108	{ }		/* Terminating entry */
109};
110
111MODULE_DEVICE_TABLE (usb, id_table);
112
113static struct usb_driver kl5kusb105d_driver = {
114	.name =		"kl5kusb105d",
115	.probe =	usb_serial_probe,
116	.disconnect =	usb_serial_disconnect,
117	.id_table =	id_table,
118	.no_dynamic_id = 	1,
119};
120
121static struct usb_serial_driver kl5kusb105d_device = {
122	.driver = {
123		.owner =	THIS_MODULE,
124		.name =		"kl5kusb105d",
125	},
126	.description =	     "KL5KUSB105D / PalmConnect",
127	.usb_driver =	     &kl5kusb105d_driver,
128	.id_table =	     id_table,
129	.num_interrupt_in =  1,
130	.num_bulk_in =	     1,
131	.num_bulk_out =	     1,
132	.num_ports =	     1,
133	.open =		     klsi_105_open,
134	.close =	     klsi_105_close,
135	.write =	     klsi_105_write,
136	.write_bulk_callback = klsi_105_write_bulk_callback,
137	.chars_in_buffer =   klsi_105_chars_in_buffer,
138	.write_room =        klsi_105_write_room,
139	.read_bulk_callback =klsi_105_read_bulk_callback,
140	.set_termios =	     klsi_105_set_termios,
141	/*.break_ctl =	     klsi_105_break_ctl,*/
142	.tiocmget =          klsi_105_tiocmget,
143	.tiocmset =          klsi_105_tiocmset,
144	.attach =	     klsi_105_startup,
145	.shutdown =	     klsi_105_shutdown,
146	.throttle =	     klsi_105_throttle,
147	.unthrottle =	     klsi_105_unthrottle,
148};
149
150struct klsi_105_port_settings {
151	__u8	pktlen;		/* always 5, it seems */
152	__u8	baudrate;
153	__u8	databits;
154	__u8	unknown1;
155	__u8	unknown2;
156} __attribute__ ((packed));
157
158/* we implement a pool of NUM_URBS urbs per usb_serial */
159#define NUM_URBS			1
160#define URB_TRANSFER_BUFFER_SIZE	64
161struct klsi_105_private {
162	struct klsi_105_port_settings	cfg;
163	struct ktermios			termios;
164	unsigned long			line_state; /* modem line settings */
165	/* write pool */
166	struct urb *			write_urb_pool[NUM_URBS];
167	spinlock_t			lock;
168	unsigned long			bytes_in;
169	unsigned long			bytes_out;
170};
171
172
173/*
174 * Handle vendor specific USB requests
175 */
176
177
178#define KLSI_TIMEOUT	 5000 /* default urb timeout */
179
180static int klsi_105_chg_port_settings(struct usb_serial_port *port,
181				      struct klsi_105_port_settings *settings)
182{
183	int rc;
184
185        rc = usb_control_msg(port->serial->dev,
186			     usb_sndctrlpipe(port->serial->dev, 0),
187			     KL5KUSB105A_SIO_SET_DATA,
188                             USB_TYPE_VENDOR | USB_DIR_OUT | USB_RECIP_INTERFACE,
189			     0, /* value */
190			     0, /* index */
191			     settings,
192			     sizeof(struct klsi_105_port_settings),
193			     KLSI_TIMEOUT);
194	if (rc < 0)
195		err("Change port settings failed (error = %d)", rc);
196	info("%s - %d byte block, baudrate %x, databits %d, u1 %d, u2 %d",
197	    __FUNCTION__,
198	    settings->pktlen,
199	    settings->baudrate, settings->databits,
200	    settings->unknown1, settings->unknown2);
201        return rc;
202} /* klsi_105_chg_port_settings */
203
204/* translate a 16-bit status value from the device to linux's TIO bits */
205static unsigned long klsi_105_status2linestate(const __u16 status)
206{
207	unsigned long res = 0;
208
209	res =   ((status & KL5KUSB105A_DSR) ? TIOCM_DSR : 0)
210	      | ((status & KL5KUSB105A_CTS) ? TIOCM_CTS : 0)
211	      ;
212
213	return res;
214}
215/*
216 * Read line control via vendor command and return result through
217 * *line_state_p
218 */
219/* It seems that the status buffer has always only 2 bytes length */
220#define KLSI_STATUSBUF_LEN	2
221static int klsi_105_get_line_state(struct usb_serial_port *port,
222				   unsigned long *line_state_p)
223{
224	int rc;
225	__u8 status_buf[KLSI_STATUSBUF_LEN] = { -1,-1};
226	__u16 status;
227
228	info("%s - sending SIO Poll request", __FUNCTION__);
229        rc = usb_control_msg(port->serial->dev,
230			     usb_rcvctrlpipe(port->serial->dev, 0),
231			     KL5KUSB105A_SIO_POLL,
232                             USB_TYPE_VENDOR | USB_DIR_IN,
233			     0, /* value */
234			     0, /* index */
235			     status_buf, KLSI_STATUSBUF_LEN,
236			     10000
237			     );
238	if (rc < 0)
239		err("Reading line status failed (error = %d)", rc);
240	else {
241		status = le16_to_cpu(*(u16 *)status_buf);
242
243		info("%s - read status %x %x", __FUNCTION__,
244		     status_buf[0], status_buf[1]);
245
246		*line_state_p = klsi_105_status2linestate(status);
247	}
248
249        return rc;
250}
251
252
253/*
254 * Driver's tty interface functions
255 */
256
257static int klsi_105_startup (struct usb_serial *serial)
258{
259	struct klsi_105_private *priv;
260	int i, j;
261
262
263	/* allocate the private data structure */
264	for (i=0; i<serial->num_ports; i++) {
265		priv = kmalloc(sizeof(struct klsi_105_private),
266						   GFP_KERNEL);
267		if (!priv) {
268			dbg("%skmalloc for klsi_105_private failed.", __FUNCTION__);
269			i--;
270			goto err_cleanup;
271		}
272		/* set initial values for control structures */
273		priv->cfg.pktlen    = 5;
274		priv->cfg.baudrate  = kl5kusb105a_sio_b9600;
275		priv->cfg.databits  = kl5kusb105a_dtb_8;
276		priv->cfg.unknown1  = 0;
277		priv->cfg.unknown2  = 1;
278
279		priv->line_state    = 0;
280
281		priv->bytes_in	    = 0;
282		priv->bytes_out	    = 0;
283		usb_set_serial_port_data(serial->port[i], priv);
284
285		spin_lock_init (&priv->lock);
286		for (j=0; j<NUM_URBS; j++) {
287			struct urb* urb = usb_alloc_urb(0, GFP_KERNEL);
288
289			priv->write_urb_pool[j] = urb;
290			if (urb == NULL) {
291				err("No more urbs???");
292				goto err_cleanup;
293			}
294
295			urb->transfer_buffer = kmalloc (URB_TRANSFER_BUFFER_SIZE,
296							GFP_KERNEL);
297			if (!urb->transfer_buffer) {
298				err("%s - out of memory for urb buffers.", __FUNCTION__);
299				goto err_cleanup;
300			}
301		}
302
303		/* priv->termios is left uninitalized until port opening */
304		init_waitqueue_head(&serial->port[i]->write_wait);
305	}
306
307	return 0;
308
309err_cleanup:
310	for (; i >= 0; i--) {
311		priv = usb_get_serial_port_data(serial->port[i]);
312		for (j=0; j < NUM_URBS; j++) {
313			if (priv->write_urb_pool[j]) {
314				kfree(priv->write_urb_pool[j]->transfer_buffer);
315				usb_free_urb(priv->write_urb_pool[j]);
316			}
317		}
318		usb_set_serial_port_data(serial->port[i], NULL);
319	}
320	return -ENOMEM;
321} /* klsi_105_startup */
322
323
324static void klsi_105_shutdown (struct usb_serial *serial)
325{
326	int i;
327
328	dbg("%s", __FUNCTION__);
329
330	/* stop reads and writes on all ports */
331	for (i=0; i < serial->num_ports; ++i) {
332		struct klsi_105_private *priv = usb_get_serial_port_data(serial->port[i]);
333		unsigned long flags;
334
335		if (priv) {
336			/* kill our write urb pool */
337			int j;
338			struct urb **write_urbs = priv->write_urb_pool;
339			spin_lock_irqsave(&priv->lock,flags);
340
341			for (j = 0; j < NUM_URBS; j++) {
342				if (write_urbs[j]) {
343					/* usb_kill_urb(write_urbs[j]); */
344					kfree(write_urbs[j]->transfer_buffer);
345					usb_free_urb (write_urbs[j]);
346				}
347			}
348
349			spin_unlock_irqrestore (&priv->lock, flags);
350
351			kfree(priv);
352			usb_set_serial_port_data(serial->port[i], NULL);
353		}
354	}
355} /* klsi_105_shutdown */
356
357static int  klsi_105_open (struct usb_serial_port *port, struct file *filp)
358{
359	struct klsi_105_private *priv = usb_get_serial_port_data(port);
360	int retval = 0;
361	int rc;
362	int i;
363	unsigned long line_state;
364	struct klsi_105_port_settings cfg;
365	unsigned long flags;
366
367	dbg("%s port %d", __FUNCTION__, port->number);
368
369	/* force low_latency on so that our tty_push actually forces
370	 * the data through
371	 * port->tty->low_latency = 1; */
372
373	cfg.pktlen   = 5;
374	cfg.baudrate = kl5kusb105a_sio_b9600;
375	cfg.databits = kl5kusb105a_dtb_8;
376	cfg.unknown1 = 0;
377	cfg.unknown2 = 1;
378	klsi_105_chg_port_settings(port, &cfg);
379
380	/* set up termios structure */
381	spin_lock_irqsave (&priv->lock, flags);
382	priv->termios.c_iflag = port->tty->termios->c_iflag;
383	priv->termios.c_oflag = port->tty->termios->c_oflag;
384	priv->termios.c_cflag = port->tty->termios->c_cflag;
385	priv->termios.c_lflag = port->tty->termios->c_lflag;
386	for (i=0; i<NCCS; i++)
387		priv->termios.c_cc[i] = port->tty->termios->c_cc[i];
388	priv->cfg.pktlen   = cfg.pktlen;
389	priv->cfg.baudrate = cfg.baudrate;
390	priv->cfg.databits = cfg.databits;
391	priv->cfg.unknown1 = cfg.unknown1;
392	priv->cfg.unknown2 = cfg.unknown2;
393	spin_unlock_irqrestore (&priv->lock, flags);
394
395	/* READ_ON and urb submission */
396	usb_fill_bulk_urb(port->read_urb, port->serial->dev,
397		      usb_rcvbulkpipe(port->serial->dev,
398				      port->bulk_in_endpointAddress),
399		      port->read_urb->transfer_buffer,
400		      port->read_urb->transfer_buffer_length,
401		      klsi_105_read_bulk_callback,
402		      port);
403
404	rc = usb_submit_urb(port->read_urb, GFP_KERNEL);
405	if (rc) {
406		err("%s - failed submitting read urb, error %d", __FUNCTION__, rc);
407		retval = rc;
408		goto exit;
409	}
410
411	rc = usb_control_msg(port->serial->dev,
412			     usb_sndctrlpipe(port->serial->dev,0),
413			     KL5KUSB105A_SIO_CONFIGURE,
414			     USB_TYPE_VENDOR|USB_DIR_OUT|USB_RECIP_INTERFACE,
415			     KL5KUSB105A_SIO_CONFIGURE_READ_ON,
416			     0, /* index */
417			     NULL,
418			     0,
419			     KLSI_TIMEOUT);
420	if (rc < 0) {
421		err("Enabling read failed (error = %d)", rc);
422		retval = rc;
423	} else
424		dbg("%s - enabled reading", __FUNCTION__);
425
426	rc = klsi_105_get_line_state(port, &line_state);
427	if (rc >= 0) {
428		spin_lock_irqsave (&priv->lock, flags);
429		priv->line_state = line_state;
430		spin_unlock_irqrestore (&priv->lock, flags);
431		dbg("%s - read line state 0x%lx", __FUNCTION__, line_state);
432		retval = 0;
433	} else
434		retval = rc;
435
436exit:
437	return retval;
438} /* klsi_105_open */
439
440
441static void klsi_105_close (struct usb_serial_port *port, struct file *filp)
442{
443	struct klsi_105_private *priv = usb_get_serial_port_data(port);
444	int rc;
445
446	dbg("%s port %d", __FUNCTION__, port->number);
447
448	/* send READ_OFF */
449	rc = usb_control_msg (port->serial->dev,
450			      usb_sndctrlpipe(port->serial->dev, 0),
451			      KL5KUSB105A_SIO_CONFIGURE,
452			      USB_TYPE_VENDOR | USB_DIR_OUT,
453			      KL5KUSB105A_SIO_CONFIGURE_READ_OFF,
454			      0, /* index */
455			      NULL, 0,
456			      KLSI_TIMEOUT);
457	if (rc < 0)
458		    err("Disabling read failed (error = %d)", rc);
459
460	/* shutdown our bulk reads and writes */
461	usb_kill_urb(port->write_urb);
462	usb_kill_urb(port->read_urb);
463	/* unlink our write pool */
464	/* wgg - do I need this? I think so. */
465	usb_kill_urb(port->interrupt_in_urb);
466	info("kl5kusb105 port stats: %ld bytes in, %ld bytes out", priv->bytes_in, priv->bytes_out);
467} /* klsi_105_close */
468
469
470/* We need to write a complete 64-byte data block and encode the
471 * number actually sent in the first double-byte, LSB-order. That
472 * leaves at most 62 bytes of payload.
473 */
474#define KLSI_105_DATA_OFFSET	2   /* in the bulk urb data block */
475
476
477static int klsi_105_write (struct usb_serial_port *port,
478			   const unsigned char *buf, int count)
479{
480	struct klsi_105_private *priv = usb_get_serial_port_data(port);
481	int result, size;
482	int bytes_sent=0;
483
484	dbg("%s - port %d", __FUNCTION__, port->number);
485
486	while (count > 0) {
487		/* try to find a free urb (write 0 bytes if none) */
488		struct urb *urb = NULL;
489		unsigned long flags;
490		int i;
491		/* since the pool is per-port we might not need the spin lock !? */
492		spin_lock_irqsave (&priv->lock, flags);
493		for (i=0; i<NUM_URBS; i++) {
494			if (priv->write_urb_pool[i]->status != -EINPROGRESS) {
495				urb = priv->write_urb_pool[i];
496				dbg("%s - using pool URB %d", __FUNCTION__, i);
497				break;
498			}
499		}
500		spin_unlock_irqrestore (&priv->lock, flags);
501
502		if (urb==NULL) {
503			dbg("%s - no more free urbs", __FUNCTION__);
504			goto exit;
505		}
506
507		if (urb->transfer_buffer == NULL) {
508			urb->transfer_buffer = kmalloc (URB_TRANSFER_BUFFER_SIZE, GFP_ATOMIC);
509			if (urb->transfer_buffer == NULL) {
510				err("%s - no more kernel memory...", __FUNCTION__);
511				goto exit;
512			}
513		}
514
515		size = min (count, port->bulk_out_size - KLSI_105_DATA_OFFSET);
516		size = min (size, URB_TRANSFER_BUFFER_SIZE - KLSI_105_DATA_OFFSET);
517
518		memcpy (urb->transfer_buffer + KLSI_105_DATA_OFFSET, buf, size);
519
520		/* write payload size into transfer buffer */
521		((__u8 *)urb->transfer_buffer)[0] = (__u8) (size & 0xFF);
522		((__u8 *)urb->transfer_buffer)[1] = (__u8) ((size & 0xFF00)>>8);
523
524		/* set up our urb */
525		usb_fill_bulk_urb(urb, port->serial->dev,
526			      usb_sndbulkpipe(port->serial->dev,
527					      port->bulk_out_endpointAddress),
528			      urb->transfer_buffer,
529			      URB_TRANSFER_BUFFER_SIZE,
530			      klsi_105_write_bulk_callback,
531			      port);
532
533		/* send the data out the bulk port */
534		result = usb_submit_urb(urb, GFP_ATOMIC);
535		if (result) {
536			err("%s - failed submitting write urb, error %d", __FUNCTION__, result);
537			goto exit;
538		}
539		buf += size;
540		bytes_sent += size;
541		count -= size;
542	}
543exit:
544	/* lockless, but it's for debug info only... */
545	priv->bytes_out+=bytes_sent;
546
547	return bytes_sent;	/* that's how much we wrote */
548} /* klsi_105_write */
549
550static void klsi_105_write_bulk_callback ( struct urb *urb)
551{
552	struct usb_serial_port *port = (struct usb_serial_port *)urb->context;
553
554	dbg("%s - port %d", __FUNCTION__, port->number);
555
556	if (urb->status) {
557		dbg("%s - nonzero write bulk status received: %d", __FUNCTION__,
558		    urb->status);
559		return;
560	}
561
562	usb_serial_port_softint(port);
563} /* klsi_105_write_bulk_completion_callback */
564
565
566/* return number of characters currently in the writing process */
567static int klsi_105_chars_in_buffer (struct usb_serial_port *port)
568{
569	int chars = 0;
570	int i;
571	unsigned long flags;
572	struct klsi_105_private *priv = usb_get_serial_port_data(port);
573
574	spin_lock_irqsave (&priv->lock, flags);
575
576	for (i = 0; i < NUM_URBS; ++i) {
577		if (priv->write_urb_pool[i]->status == -EINPROGRESS) {
578			chars += URB_TRANSFER_BUFFER_SIZE;
579		}
580	}
581
582	spin_unlock_irqrestore (&priv->lock, flags);
583
584	dbg("%s - returns %d", __FUNCTION__, chars);
585	return (chars);
586}
587
588static int klsi_105_write_room (struct usb_serial_port *port)
589{
590	unsigned long flags;
591	int i;
592	int room = 0;
593	struct klsi_105_private *priv = usb_get_serial_port_data(port);
594
595	spin_lock_irqsave (&priv->lock, flags);
596	for (i = 0; i < NUM_URBS; ++i) {
597		if (priv->write_urb_pool[i]->status != -EINPROGRESS) {
598			room += URB_TRANSFER_BUFFER_SIZE;
599		}
600	}
601
602	spin_unlock_irqrestore (&priv->lock, flags);
603
604	dbg("%s - returns %d", __FUNCTION__, room);
605	return (room);
606}
607
608
609
610static void klsi_105_read_bulk_callback (struct urb *urb)
611{
612	struct usb_serial_port *port = (struct usb_serial_port *)urb->context;
613	struct klsi_105_private *priv = usb_get_serial_port_data(port);
614	struct tty_struct *tty;
615	unsigned char *data = urb->transfer_buffer;
616	int rc;
617
618        dbg("%s - port %d", __FUNCTION__, port->number);
619
620	/* The urb might have been killed. */
621        if (urb->status) {
622                dbg("%s - nonzero read bulk status received: %d", __FUNCTION__,
623		    urb->status);
624                return;
625        }
626
627	/* The data received is again preceded by a length double-byte in LSB-
628	 * first order (see klsi_105_write() )
629	 */
630	if (urb->actual_length == 0) {
631		/* empty urbs seem to happen, we ignore them */
632		/* dbg("%s - emtpy URB", __FUNCTION__); */
633	       ;
634	} else if (urb->actual_length <= 2) {
635		dbg("%s - size %d URB not understood", __FUNCTION__,
636		    urb->actual_length);
637		usb_serial_debug_data(debug, &port->dev, __FUNCTION__,
638				      urb->actual_length, data);
639	} else {
640		int bytes_sent = ((__u8 *) data)[0] +
641				 ((unsigned int) ((__u8 *) data)[1] << 8);
642		tty = port->tty;
643		usb_serial_debug_data(debug, &port->dev, __FUNCTION__,
644				      urb->actual_length, data);
645
646		if (bytes_sent + 2 > urb->actual_length) {
647			dbg("%s - trying to read more data than available"
648			    " (%d vs. %d)", __FUNCTION__,
649			    bytes_sent+2, urb->actual_length);
650			/* cap at implied limit */
651			bytes_sent = urb->actual_length - 2;
652		}
653
654		tty_buffer_request_room(tty, bytes_sent);
655		tty_insert_flip_string(tty, data + 2, bytes_sent);
656		tty_flip_buffer_push(tty);
657
658		/* again lockless, but debug info only */
659		priv->bytes_in += bytes_sent;
660	}
661	/* Continue trying to always read  */
662	usb_fill_bulk_urb(port->read_urb, port->serial->dev,
663		      usb_rcvbulkpipe(port->serial->dev,
664				      port->bulk_in_endpointAddress),
665		      port->read_urb->transfer_buffer,
666		      port->read_urb->transfer_buffer_length,
667		      klsi_105_read_bulk_callback,
668		      port);
669	rc = usb_submit_urb(port->read_urb, GFP_ATOMIC);
670	if (rc)
671		err("%s - failed resubmitting read urb, error %d", __FUNCTION__, rc);
672} /* klsi_105_read_bulk_callback */
673
674
675static void klsi_105_set_termios (struct usb_serial_port *port,
676				  struct ktermios *old_termios)
677{
678	struct klsi_105_private *priv = usb_get_serial_port_data(port);
679	unsigned int iflag = port->tty->termios->c_iflag;
680	unsigned int old_iflag = old_termios->c_iflag;
681	unsigned int cflag = port->tty->termios->c_cflag;
682	unsigned int old_cflag = old_termios->c_cflag;
683	struct klsi_105_port_settings cfg;
684	unsigned long flags;
685
686	/* lock while we are modifying the settings */
687	spin_lock_irqsave (&priv->lock, flags);
688
689	/*
690	 * Update baud rate
691	 */
692	if( (cflag & CBAUD) != (old_cflag & CBAUD) ) {
693	        /* reassert DTR and (maybe) RTS on transition from B0 */
694		if( (old_cflag & CBAUD) == B0 ) {
695			dbg("%s: baud was B0", __FUNCTION__);
696		}
697
698		switch(cflag & CBAUD) {
699		case B0: /* handled below */
700			break;
701		case B1200: priv->cfg.baudrate = kl5kusb105a_sio_b1200;
702			break;
703		case B2400: priv->cfg.baudrate = kl5kusb105a_sio_b2400;
704			break;
705		case B4800: priv->cfg.baudrate = kl5kusb105a_sio_b4800;
706			break;
707		case B9600: priv->cfg.baudrate = kl5kusb105a_sio_b9600;
708			break;
709		case B19200: priv->cfg.baudrate = kl5kusb105a_sio_b19200;
710			break;
711		case B38400: priv->cfg.baudrate = kl5kusb105a_sio_b38400;
712			break;
713		case B57600: priv->cfg.baudrate = kl5kusb105a_sio_b57600;
714			break;
715		case B115200: priv->cfg.baudrate = kl5kusb105a_sio_b115200;
716			break;
717		default:
718			err("KLSI USB->Serial converter:"
719			    " unsupported baudrate request, using default"
720			    " of 9600");
721			priv->cfg.baudrate = kl5kusb105a_sio_b9600;
722			break;
723		}
724		if ((cflag & CBAUD) == B0 ) {
725			dbg("%s: baud is B0", __FUNCTION__);
726			/* Drop RTS and DTR */
727			/* maybe this should be simulated by sending read
728			 * disable and read enable messages?
729			 */
730			;
731		}
732	}
733
734	if ((cflag & CSIZE) != (old_cflag & CSIZE)) {
735		/* set the number of data bits */
736		switch (cflag & CSIZE) {
737		case CS5:
738			dbg("%s - 5 bits/byte not supported", __FUNCTION__);
739			spin_unlock_irqrestore (&priv->lock, flags);
740			return ;
741		case CS6:
742			dbg("%s - 6 bits/byte not supported", __FUNCTION__);
743			spin_unlock_irqrestore (&priv->lock, flags);
744			return ;
745		case CS7:
746			priv->cfg.databits = kl5kusb105a_dtb_7;
747			break;
748		case CS8:
749			priv->cfg.databits = kl5kusb105a_dtb_8;
750			break;
751		default:
752			err("CSIZE was not CS5-CS8, using default of 8");
753			priv->cfg.databits = kl5kusb105a_dtb_8;
754			break;
755		}
756	}
757
758	/*
759	 * Update line control register (LCR)
760	 */
761	if ((cflag & (PARENB|PARODD)) != (old_cflag & (PARENB|PARODD))
762	    || (cflag & CSTOPB) != (old_cflag & CSTOPB) ) {
763
764		;
765	}
766
767	/*
768	 * Set flow control: well, I do not really now how to handle DTR/RTS.
769	 * Just do what we have seen with SniffUSB on Win98.
770	 */
771	if( (iflag & IXOFF) != (old_iflag & IXOFF)
772	    || (iflag & IXON) != (old_iflag & IXON)
773	    ||  (cflag & CRTSCTS) != (old_cflag & CRTSCTS) ) {
774
775		/* Drop DTR/RTS if no flow control otherwise assert */
776		;
777	}
778	memcpy (&cfg, &priv->cfg, sizeof(cfg));
779	spin_unlock_irqrestore (&priv->lock, flags);
780
781	/* now commit changes to device */
782	klsi_105_chg_port_settings(port, &cfg);
783} /* klsi_105_set_termios */
784
785
786
787static int klsi_105_tiocmget (struct usb_serial_port *port, struct file *file)
788{
789	struct klsi_105_private *priv = usb_get_serial_port_data(port);
790	unsigned long flags;
791	int rc;
792	unsigned long line_state;
793	dbg("%s - request, just guessing", __FUNCTION__);
794
795	rc = klsi_105_get_line_state(port, &line_state);
796	if (rc < 0) {
797		err("Reading line control failed (error = %d)", rc);
798		/* better return value? EAGAIN? */
799		return rc;
800	}
801
802	spin_lock_irqsave (&priv->lock, flags);
803	priv->line_state = line_state;
804	spin_unlock_irqrestore (&priv->lock, flags);
805	dbg("%s - read line state 0x%lx", __FUNCTION__, line_state);
806	return (int)line_state;
807}
808
809static int klsi_105_tiocmset (struct usb_serial_port *port, struct file *file,
810			      unsigned int set, unsigned int clear)
811{
812	int retval = -EINVAL;
813
814	dbg("%s", __FUNCTION__);
815
816/* if this ever gets implemented, it should be done something like this:
817	struct usb_serial *serial = port->serial;
818	struct klsi_105_private *priv = usb_get_serial_port_data(port);
819	unsigned long flags;
820	int control;
821
822	spin_lock_irqsave (&priv->lock, flags);
823	if (set & TIOCM_RTS)
824		priv->control_state |= TIOCM_RTS;
825	if (set & TIOCM_DTR)
826		priv->control_state |= TIOCM_DTR;
827	if (clear & TIOCM_RTS)
828		priv->control_state &= ~TIOCM_RTS;
829	if (clear & TIOCM_DTR)
830		priv->control_state &= ~TIOCM_DTR;
831	control = priv->control_state;
832	spin_unlock_irqrestore (&priv->lock, flags);
833	retval = mct_u232_set_modem_ctrl(serial, control);
834*/
835	return retval;
836}
837
838static void klsi_105_throttle (struct usb_serial_port *port)
839{
840	dbg("%s - port %d", __FUNCTION__, port->number);
841	usb_kill_urb(port->read_urb);
842}
843
844static void klsi_105_unthrottle (struct usb_serial_port *port)
845{
846	int result;
847
848	dbg("%s - port %d", __FUNCTION__, port->number);
849
850	port->read_urb->dev = port->serial->dev;
851	result = usb_submit_urb(port->read_urb, GFP_ATOMIC);
852	if (result)
853		err("%s - failed submitting read urb, error %d", __FUNCTION__,
854		    result);
855}
856
857
858
859static int __init klsi_105_init (void)
860{
861	int retval;
862	retval = usb_serial_register(&kl5kusb105d_device);
863	if (retval)
864		goto failed_usb_serial_register;
865	retval = usb_register(&kl5kusb105d_driver);
866	if (retval)
867		goto failed_usb_register;
868
869	info(DRIVER_DESC " " DRIVER_VERSION);
870	return 0;
871failed_usb_register:
872	usb_serial_deregister(&kl5kusb105d_device);
873failed_usb_serial_register:
874	return retval;
875}
876
877
878static void __exit klsi_105_exit (void)
879{
880	usb_deregister (&kl5kusb105d_driver);
881	usb_serial_deregister (&kl5kusb105d_device);
882}
883
884
885module_init (klsi_105_init);
886module_exit (klsi_105_exit);
887
888MODULE_AUTHOR( DRIVER_AUTHOR );
889MODULE_DESCRIPTION( DRIVER_DESC );
890MODULE_LICENSE("GPL");
891
892
893module_param(debug, bool, S_IRUGO | S_IWUSR);
894MODULE_PARM_DESC(debug, "enable extensive debugging messages");
895
896/* vim: set sts=8 ts=8 sw=8: */
897