1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142#include <linux/config.h>
143#include <linux/kernel.h>
144#include <linux/errno.h>
145#include <linux/init.h>
146#include <linux/slab.h>
147#include <linux/tty.h>
148#include <linux/tty_driver.h>
149#include <linux/tty_flip.h>
150#include <linux/module.h>
151#include <linux/spinlock.h>
152#include <asm/uaccess.h>
153#include <linux/usb.h>
154
155#ifdef CONFIG_USB_SERIAL_DEBUG
156 static int debug = 1;
157#else
158 static int debug;
159#endif
160
161#include "usb-serial.h"
162#include "visor.h"
163
164
165
166
167#define DRIVER_VERSION "v1.7"
168#define DRIVER_AUTHOR "Greg Kroah-Hartman <greg@kroah.com>"
169#define DRIVER_DESC "USB HandSpring Visor, Palm m50x, Treo, Sony CliƩ driver"
170
171
172static int visor_open (struct usb_serial_port *port, struct file *filp);
173static void visor_close (struct usb_serial_port *port, struct file *filp);
174static int visor_write (struct usb_serial_port *port, int from_user, const unsigned char *buf, int count);
175static int visor_write_room (struct usb_serial_port *port);
176static int visor_chars_in_buffer (struct usb_serial_port *port);
177static void visor_throttle (struct usb_serial_port *port);
178static void visor_unthrottle (struct usb_serial_port *port);
179static int visor_startup (struct usb_serial *serial);
180static void visor_shutdown (struct usb_serial *serial);
181static int visor_ioctl (struct usb_serial_port *port, struct file * file, unsigned int cmd, unsigned long arg);
182static void visor_set_termios (struct usb_serial_port *port, struct termios *old_termios);
183static void visor_write_bulk_callback (struct urb *urb);
184static void visor_read_bulk_callback (struct urb *urb);
185static void visor_read_int_callback (struct urb *urb);
186static int clie_3_5_startup (struct usb_serial *serial);
187static int clie_5_startup (struct usb_serial *serial);
188static void treo_attach (struct usb_serial *serial);
189
190
191static int vendor = -1;
192static int product = -1;
193static int param_register;
194
195
196static struct usb_device_id id_table [] = {
197 { USB_DEVICE(HANDSPRING_VENDOR_ID, HANDSPRING_VISOR_ID) },
198 { USB_DEVICE(HANDSPRING_VENDOR_ID, HANDSPRING_TREO_ID) },
199 { USB_DEVICE(HANDSPRING_VENDOR_ID, HANDSPRING_TREO600_ID) },
200 { USB_DEVICE(PALM_VENDOR_ID, PALM_M500_ID) },
201 { USB_DEVICE(PALM_VENDOR_ID, PALM_M505_ID) },
202 { USB_DEVICE(PALM_VENDOR_ID, PALM_M515_ID) },
203 { USB_DEVICE(PALM_VENDOR_ID, PALM_I705_ID) },
204 { USB_DEVICE(PALM_VENDOR_ID, PALM_M100_ID) },
205 { USB_DEVICE(PALM_VENDOR_ID, PALM_M125_ID) },
206 { USB_DEVICE(PALM_VENDOR_ID, PALM_M130_ID) },
207 { USB_DEVICE(PALM_VENDOR_ID, PALM_TUNGSTEN_T_ID) },
208 { USB_DEVICE(PALM_VENDOR_ID, PALM_TUNGSTEN_Z_ID) },
209 { USB_DEVICE(PALM_VENDOR_ID, PALM_ZIRE31_ID) },
210 { USB_DEVICE(PALM_VENDOR_ID, PALM_ZIRE_ID) },
211 { USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_4_0_ID) },
212 { USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_S360_ID) },
213 { USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_4_1_ID) },
214 { USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_NX60_ID) },
215 { USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_NZ90V_ID) },
216 { USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_TJ25_ID) },
217 { USB_DEVICE(SAMSUNG_VENDOR_ID, SAMSUNG_SCH_I330_ID) },
218 { USB_DEVICE(GARMIN_VENDOR_ID, GARMIN_IQUE_3600_ID) },
219 { USB_DEVICE(ACEECA_VENDOR_ID, ACEECA_MEZ1000_ID) },
220 { }
221};
222
223static struct usb_device_id clie_id_3_5_table [] = {
224 { USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_3_5_ID) },
225 { }
226};
227
228
229static struct usb_device_id clie_id_5_table [] = {
230 { USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_UX50_ID) },
231 { }
232};
233
234static __devinitdata struct usb_device_id id_table_combined [] = {
235 { USB_DEVICE(HANDSPRING_VENDOR_ID, HANDSPRING_VISOR_ID) },
236 { USB_DEVICE(HANDSPRING_VENDOR_ID, HANDSPRING_TREO_ID) },
237 { USB_DEVICE(HANDSPRING_VENDOR_ID, HANDSPRING_TREO600_ID) },
238 { USB_DEVICE(PALM_VENDOR_ID, PALM_M500_ID) },
239 { USB_DEVICE(PALM_VENDOR_ID, PALM_M505_ID) },
240 { USB_DEVICE(PALM_VENDOR_ID, PALM_M515_ID) },
241 { USB_DEVICE(PALM_VENDOR_ID, PALM_I705_ID) },
242 { USB_DEVICE(PALM_VENDOR_ID, PALM_M100_ID) },
243 { USB_DEVICE(PALM_VENDOR_ID, PALM_M125_ID) },
244 { USB_DEVICE(PALM_VENDOR_ID, PALM_M130_ID) },
245 { USB_DEVICE(PALM_VENDOR_ID, PALM_TUNGSTEN_T_ID) },
246 { USB_DEVICE(PALM_VENDOR_ID, PALM_TUNGSTEN_Z_ID) },
247 { USB_DEVICE(PALM_VENDOR_ID, PALM_ZIRE31_ID) },
248 { USB_DEVICE(PALM_VENDOR_ID, PALM_ZIRE_ID) },
249 { USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_3_5_ID) },
250 { USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_4_0_ID) },
251 { USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_S360_ID) },
252 { USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_4_1_ID) },
253 { USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_NX60_ID) },
254 { USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_NZ90V_ID) },
255 { USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_UX50_ID) },
256 { USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_TJ25_ID) },
257 { USB_DEVICE(SAMSUNG_VENDOR_ID, SAMSUNG_SCH_I330_ID) },
258 { USB_DEVICE(GARMIN_VENDOR_ID, GARMIN_IQUE_3600_ID) },
259 { USB_DEVICE(ACEECA_VENDOR_ID, ACEECA_MEZ1000_ID) },
260 { }
261};
262
263
264static struct usb_device_id id_param_table [] = {
265 { },
266 { }
267};
268
269MODULE_DEVICE_TABLE (usb, id_table_combined);
270
271
272
273
274static struct usb_serial_device_type handspring_device = {
275 .owner = THIS_MODULE,
276 .name = "Handspring Visor / Treo / Palm 4.0 / CliƩ 4.x",
277 .id_table = id_table,
278 .num_interrupt_in = NUM_DONT_CARE,
279 .num_bulk_in = 2,
280 .num_bulk_out = 2,
281 .num_ports = 2,
282 .open = visor_open,
283 .close = visor_close,
284 .throttle = visor_throttle,
285 .unthrottle = visor_unthrottle,
286 .startup = visor_startup,
287 .shutdown = visor_shutdown,
288 .ioctl = visor_ioctl,
289 .set_termios = visor_set_termios,
290 .write = visor_write,
291 .write_room = visor_write_room,
292 .chars_in_buffer = visor_chars_in_buffer,
293 .write_bulk_callback = visor_write_bulk_callback,
294 .read_bulk_callback = visor_read_bulk_callback,
295 .read_int_callback = visor_read_int_callback,
296};
297
298
299static struct usb_serial_device_type clie_3_5_device = {
300 .owner = THIS_MODULE,
301 .name = "Sony CliƩ 3.5",
302 .id_table = clie_id_3_5_table,
303 .num_interrupt_in = 0,
304 .num_bulk_in = 1,
305 .num_bulk_out = 1,
306 .num_ports = 1,
307 .open = visor_open,
308 .close = visor_close,
309 .throttle = visor_throttle,
310 .unthrottle = visor_unthrottle,
311 .startup = clie_3_5_startup,
312 .ioctl = visor_ioctl,
313 .set_termios = visor_set_termios,
314 .write = visor_write,
315 .write_room = visor_write_room,
316 .chars_in_buffer = visor_chars_in_buffer,
317 .write_bulk_callback = visor_write_bulk_callback,
318 .read_bulk_callback = visor_read_bulk_callback,
319};
320
321
322
323static struct usb_serial_device_type clie_5_device = {
324 .owner = THIS_MODULE,
325 .name = "Sony CliƩ 5.0",
326 .id_table = clie_id_5_table,
327 .num_interrupt_in = NUM_DONT_CARE,
328 .num_bulk_in = 2,
329 .num_bulk_out = 2,
330 .num_ports = 2,
331 .open = visor_open,
332 .close = visor_close,
333 .throttle = visor_throttle,
334 .unthrottle = visor_unthrottle,
335 .startup = clie_5_startup,
336 .shutdown = visor_shutdown,
337 .ioctl = visor_ioctl,
338 .set_termios = visor_set_termios,
339 .write = visor_write,
340 .write_room = visor_write_room,
341 .chars_in_buffer = visor_chars_in_buffer,
342 .write_bulk_callback = visor_write_bulk_callback,
343 .read_bulk_callback = visor_read_bulk_callback,
344 .read_int_callback = visor_read_int_callback,
345};
346
347
348
349
350
351
352static struct usb_serial_device_type param_device = {
353 .owner = THIS_MODULE,
354 .name = "user specified device with Palm 4.x protocols",
355 .id_table = id_param_table,
356 .num_interrupt_in = NUM_DONT_CARE,
357 .num_bulk_in = 2,
358 .num_bulk_out = 2,
359 .num_ports = 2,
360 .open = visor_open,
361 .close = visor_close,
362 .throttle = visor_throttle,
363 .unthrottle = visor_unthrottle,
364 .startup = visor_startup,
365 .shutdown = visor_shutdown,
366 .ioctl = visor_ioctl,
367 .set_termios = visor_set_termios,
368 .write = visor_write,
369 .write_room = visor_write_room,
370 .chars_in_buffer = visor_chars_in_buffer,
371 .write_bulk_callback = visor_write_bulk_callback,
372 .read_bulk_callback = visor_read_bulk_callback,
373 .read_int_callback = visor_read_int_callback,
374};
375
376#define NUM_URBS 24
377#define URB_TRANSFER_BUFFER_SIZE 768
378static struct urb *write_urb_pool[NUM_URBS];
379static spinlock_t write_urb_pool_lock;
380static int bytes_in;
381static int bytes_out;
382
383
384
385
386
387static int visor_open (struct usb_serial_port *port, struct file *filp)
388{
389 struct usb_serial *serial = port->serial;
390 int result = 0;
391
392 if (port_paranoia_check (port, __FUNCTION__))
393 return -ENODEV;
394
395 dbg("%s - port %d", __FUNCTION__, port->number);
396
397 if (!port->read_urb) {
398
399 err ("Device lied about number of ports, please use a lower one.");
400 return -ENODEV;
401 }
402
403 bytes_in = 0;
404 bytes_out = 0;
405
406
407
408
409
410
411 if (port->tty)
412 port->tty->low_latency = 1;
413
414
415 usb_fill_bulk_urb (port->read_urb, serial->dev,
416 usb_rcvbulkpipe (serial->dev,
417 port->bulk_in_endpointAddress),
418 port->read_urb->transfer_buffer,
419 port->read_urb->transfer_buffer_length,
420 visor_read_bulk_callback, port);
421 result = usb_submit_urb(port->read_urb);
422 if (result) {
423 err("%s - failed submitting read urb, error %d", __FUNCTION__, result);
424 goto exit;
425 }
426
427 if (port->interrupt_in_urb) {
428 dbg("%s - adding interrupt input for treo", __FUNCTION__);
429 result = usb_submit_urb(port->interrupt_in_urb);
430 if (result)
431 err("%s - failed submitting interrupt urb, error %d\n",
432 __FUNCTION__, result);
433 }
434exit:
435 return result;
436}
437
438
439static void visor_close (struct usb_serial_port *port, struct file * filp)
440{
441 struct usb_serial *serial;
442 unsigned char *transfer_buffer;
443
444 if (port_paranoia_check (port, __FUNCTION__))
445 return;
446
447 dbg("%s - port %d", __FUNCTION__, port->number);
448
449 serial = get_usb_serial (port, __FUNCTION__);
450 if (!serial)
451 return;
452
453
454
455
456 if (serial->dev) {
457
458
459 transfer_buffer = kmalloc (0x12, GFP_KERNEL);
460 if (!transfer_buffer) {
461 err("%s - kmalloc(%d) failed.", __FUNCTION__, 0x12);
462 } else {
463
464 usb_control_msg (serial->dev,
465 usb_rcvctrlpipe(serial->dev, 0),
466 VISOR_CLOSE_NOTIFICATION, 0xc2,
467 0x0000, 0x0000,
468 transfer_buffer, 0x12, 300);
469 kfree (transfer_buffer);
470 }
471
472
473 usb_unlink_urb (port->read_urb);
474 if (port->interrupt_in_urb)
475 usb_unlink_urb (port->interrupt_in_urb);
476
477 transfer_buffer = kmalloc (0x12, GFP_KERNEL);
478 if (transfer_buffer) {
479 usb_control_msg (serial->dev,
480 usb_rcvctrlpipe(serial->dev, 0),
481 VISOR_CLOSE_NOTIFICATION, 0xc2,
482 0x0000, 0x0000,
483 transfer_buffer, 0x12, 300);
484 kfree (transfer_buffer);
485
486 }
487 }
488
489 info ("Bytes In = %d Bytes Out = %d", bytes_in, bytes_out);
490}
491
492
493static int visor_write (struct usb_serial_port *port, int from_user, const unsigned char *buf, int count)
494{
495 struct usb_serial *serial = port->serial;
496 struct urb *urb;
497 const unsigned char *current_position = buf;
498 unsigned long flags;
499 int status;
500 int i;
501 int bytes_sent = 0;
502 int transfer_size;
503
504 dbg("%s - port %d", __FUNCTION__, port->number);
505
506 while (count > 0) {
507
508 urb = NULL;
509 spin_lock_irqsave (&write_urb_pool_lock, flags);
510 for (i = 0; i < NUM_URBS; ++i) {
511 if (write_urb_pool[i]->status != -EINPROGRESS) {
512 urb = write_urb_pool[i];
513 break;
514 }
515 }
516 spin_unlock_irqrestore (&write_urb_pool_lock, flags);
517 if (urb == NULL) {
518 dbg("%s - no more free urbs", __FUNCTION__);
519 goto exit;
520 }
521 if (urb->transfer_buffer == NULL) {
522 urb->transfer_buffer = kmalloc (URB_TRANSFER_BUFFER_SIZE, GFP_KERNEL);
523 if (urb->transfer_buffer == NULL) {
524 err("%s no more kernel memory...", __FUNCTION__);
525 goto exit;
526 }
527 }
528
529 transfer_size = min (count, URB_TRANSFER_BUFFER_SIZE);
530 if (from_user) {
531 if (copy_from_user (urb->transfer_buffer, current_position, transfer_size)) {
532 bytes_sent = -EFAULT;
533 break;
534 }
535 } else {
536 memcpy (urb->transfer_buffer, current_position, transfer_size);
537 }
538
539 usb_serial_debug_data (__FILE__, __FUNCTION__, transfer_size, urb->transfer_buffer);
540
541
542 FILL_BULK_URB (urb, serial->dev, usb_sndbulkpipe(serial->dev, port->bulk_out_endpointAddress),
543 urb->transfer_buffer, transfer_size, visor_write_bulk_callback, port);
544 urb->transfer_flags |= USB_QUEUE_BULK;
545
546
547 status = usb_submit_urb(urb);
548 if (status) {
549 err("%s - usb_submit_urb(write bulk) failed with status = %d", __FUNCTION__, status);
550 bytes_sent = status;
551 break;
552 }
553
554 current_position += transfer_size;
555 bytes_sent += transfer_size;
556 count -= transfer_size;
557 bytes_out += transfer_size;
558 }
559
560exit:
561 return bytes_sent;
562}
563
564
565static int visor_write_room (struct usb_serial_port *port)
566{
567 unsigned long flags;
568 int i;
569 int room = 0;
570
571 dbg("%s - port %d", __FUNCTION__, port->number);
572
573 spin_lock_irqsave (&write_urb_pool_lock, flags);
574
575 for (i = 0; i < NUM_URBS; ++i) {
576 if (write_urb_pool[i]->status != -EINPROGRESS) {
577 room += URB_TRANSFER_BUFFER_SIZE;
578 }
579 }
580
581 spin_unlock_irqrestore (&write_urb_pool_lock, flags);
582
583 dbg("%s - returns %d", __FUNCTION__, room);
584 return (room);
585}
586
587
588static int visor_chars_in_buffer (struct usb_serial_port *port)
589{
590 unsigned long flags;
591 int i;
592 int chars = 0;
593
594 dbg("%s - port %d", __FUNCTION__, port->number);
595
596 spin_lock_irqsave (&write_urb_pool_lock, flags);
597
598 for (i = 0; i < NUM_URBS; ++i) {
599 if (write_urb_pool[i]->status == -EINPROGRESS) {
600 chars += URB_TRANSFER_BUFFER_SIZE;
601 }
602 }
603
604 spin_unlock_irqrestore (&write_urb_pool_lock, flags);
605
606 dbg("%s - returns %d", __FUNCTION__, chars);
607 return (chars);
608}
609
610
611static void visor_write_bulk_callback (struct urb *urb)
612{
613 struct usb_serial_port *port = (struct usb_serial_port *)urb->context;
614
615 if (port_paranoia_check (port, __FUNCTION__))
616 return;
617
618 dbg("%s - port %d", __FUNCTION__, port->number);
619
620 if (urb->status) {
621 dbg("%s - nonzero write bulk status received: %d", __FUNCTION__, urb->status);
622 return;
623 }
624
625 queue_task(&port->tqueue, &tq_immediate);
626 mark_bh(IMMEDIATE_BH);
627
628 return;
629}
630
631
632static void visor_read_bulk_callback (struct urb *urb)
633{
634 struct usb_serial_port *port = (struct usb_serial_port *)urb->context;
635 struct usb_serial *serial = get_usb_serial (port, __FUNCTION__);
636 struct tty_struct *tty;
637 unsigned char *data = urb->transfer_buffer;
638 int i;
639 int result;
640
641 if (port_paranoia_check (port, __FUNCTION__))
642 return;
643
644 dbg("%s - port %d", __FUNCTION__, port->number);
645
646 if (!serial) {
647 dbg("%s - bad serial pointer, exiting", __FUNCTION__);
648 return;
649 }
650
651 if (urb->status) {
652 dbg("%s - nonzero read bulk status received: %d", __FUNCTION__, urb->status);
653 return;
654 }
655
656 usb_serial_debug_data (__FILE__, __FUNCTION__, urb->actual_length, data);
657
658 tty = port->tty;
659 if (tty && urb->actual_length) {
660 for (i = 0; i < urb->actual_length ; ++i) {
661
662 if(tty->flip.count >= TTY_FLIPBUF_SIZE) {
663 tty_flip_buffer_push(tty);
664 }
665
666 tty_insert_flip_char(tty, data[i], 0);
667 }
668 tty_flip_buffer_push(tty);
669 bytes_in += urb->actual_length;
670 }
671
672
673 usb_fill_bulk_urb (port->read_urb, serial->dev,
674 usb_rcvbulkpipe (serial->dev,
675 port->bulk_in_endpointAddress),
676 port->read_urb->transfer_buffer,
677 port->read_urb->transfer_buffer_length,
678 visor_read_bulk_callback, port);
679 result = usb_submit_urb(port->read_urb);
680 if (result)
681 err("%s - failed resubmitting read urb, error %d", __FUNCTION__, result);
682 return;
683}
684
685
686static void visor_read_int_callback (struct urb *urb)
687{
688 switch (urb->status) {
689 case 0:
690
691 break;
692 case -ECONNRESET:
693 case -ENOENT:
694 case -ESHUTDOWN:
695
696 dbg("%s - urb shutting down with status: %d",
697 __FUNCTION__, urb->status);
698 return;
699 default:
700 dbg("%s - nonzero urb status received: %d",
701 __FUNCTION__, urb->status);
702 goto exit;
703 }
704
705
706
707
708
709
710
711
712 usb_serial_debug_data (__FILE__, __FUNCTION__, urb->actual_length,
713 urb->transfer_buffer);
714
715exit:
716 return;
717}
718
719
720static void visor_throttle (struct usb_serial_port *port)
721{
722 dbg("%s - port %d", __FUNCTION__, port->number);
723 usb_unlink_urb (port->read_urb);
724}
725
726
727static void visor_unthrottle (struct usb_serial_port *port)
728{
729 int result;
730
731 dbg("%s - port %d", __FUNCTION__, port->number);
732
733 port->read_urb->dev = port->serial->dev;
734 result = usb_submit_urb(port->read_urb);
735 if (result)
736 err("%s - failed submitting read urb, error %d", __FUNCTION__, result);
737}
738
739static int visor_startup (struct usb_serial *serial)
740{
741 int response;
742 int i;
743 unsigned char *transfer_buffer;
744
745 dbg("%s", __FUNCTION__);
746
747 dbg("%s - Set config to 1", __FUNCTION__);
748 usb_set_configuration (serial->dev, 1);
749
750 if ((serial->dev->descriptor.idVendor == HANDSPRING_VENDOR_ID) &&
751 (serial->dev->descriptor.idProduct == HANDSPRING_VISOR_ID)) {
752 struct visor_connection_info *connection_info;
753 char *string;
754 int num_ports;
755
756 transfer_buffer = kmalloc (sizeof (*connection_info),
757 GFP_KERNEL);
758 if (!transfer_buffer) {
759 err("%s - kmalloc(%d) failed.", __FUNCTION__,
760 sizeof (*connection_info));
761 return -ENOMEM;
762 }
763
764
765 response = usb_control_msg (serial->dev,
766 usb_rcvctrlpipe(serial->dev, 0),
767 VISOR_GET_CONNECTION_INFORMATION,
768 0xc2, 0x0000, 0x0000,
769 transfer_buffer,
770 sizeof (*connection_info), 300);
771 if (response < 0) {
772 err("%s - error getting connection information",
773 __FUNCTION__);
774 goto exit;
775 }
776
777 connection_info = (struct visor_connection_info *)transfer_buffer;
778 le16_to_cpus(&connection_info->num_ports);
779 num_ports = connection_info->num_ports;
780
781
782 if (num_ports > 2)
783 num_ports = 2;
784 info("%s: Number of ports: %d", serial->type->name, connection_info->num_ports);
785 for (i = 0; i < num_ports; ++i) {
786 switch (connection_info->connections[i].port_function_id) {
787 case VISOR_FUNCTION_GENERIC:
788 string = "Generic";
789 break;
790 case VISOR_FUNCTION_DEBUGGER:
791 string = "Debugger";
792 break;
793 case VISOR_FUNCTION_HOTSYNC:
794 string = "HotSync";
795 break;
796 case VISOR_FUNCTION_CONSOLE:
797 string = "Console";
798 break;
799 case VISOR_FUNCTION_REMOTE_FILE_SYS:
800 string = "Remote File System";
801 break;
802 default:
803 string = "unknown";
804 break;
805 }
806 info("%s: port %d, is for %s use and is bound to ttyUSB%d", serial->type->name,
807 connection_info->connections[i].port, string, serial->minor + i);
808 }
809 } else {
810 struct palm_ext_connection_info *connection_info;
811
812 transfer_buffer = kmalloc (sizeof (*connection_info),
813 GFP_KERNEL);
814 if (!transfer_buffer) {
815 err("%s - kmalloc(%d) failed.", __FUNCTION__,
816 sizeof (*connection_info));
817 return -ENOMEM;
818 }
819
820 response = usb_control_msg (serial->dev, usb_rcvctrlpipe(serial->dev, 0),
821 PALM_GET_EXT_CONNECTION_INFORMATION,
822 0xc2, 0x0000, 0x0000, transfer_buffer,
823 sizeof (*connection_info), 300);
824 if (response < 0) {
825 err("%s - error %d getting connection info",
826 __FUNCTION__, response);
827 } else {
828 usb_serial_debug_data (__FILE__, __FUNCTION__, 0x14, transfer_buffer);
829 }
830 }
831
832
833 treo_attach(serial);
834
835
836 response = usb_control_msg (serial->dev, usb_rcvctrlpipe(serial->dev, 0), VISOR_REQUEST_BYTES_AVAILABLE,
837 0xc2, 0x0000, 0x0005, transfer_buffer, 0x02, 300);
838 if (response < 0) {
839 err("%s - error getting bytes available request", __FUNCTION__);
840 }
841
842exit:
843 kfree (transfer_buffer);
844
845
846 return 0;
847}
848
849static int clie_3_5_startup (struct usb_serial *serial)
850{
851 int result;
852 u8 data;
853
854 dbg("%s", __FUNCTION__);
855
856
857
858
859
860
861 result = usb_control_msg (serial->dev, usb_rcvctrlpipe(serial->dev, 0),
862 USB_REQ_GET_CONFIGURATION, USB_DIR_IN,
863 0, 0, &data, 1, HZ * 3);
864 if (result < 0) {
865 err("%s: get config number failed: %d", __FUNCTION__, result);
866 return result;
867 }
868 if (result != 1) {
869 err("%s: get config number bad return length: %d", __FUNCTION__, result);
870 return -EIO;
871 }
872
873
874 result = usb_control_msg (serial->dev, usb_rcvctrlpipe(serial->dev, 0),
875 USB_REQ_GET_INTERFACE,
876 USB_DIR_IN | USB_DT_DEVICE,
877 0, 0, &data, 1, HZ * 3);
878 if (result < 0) {
879 err("%s: get interface number failed: %d", __FUNCTION__, result);
880 return result;
881 }
882 if (result != 1) {
883 err("%s: get interface number bad return length: %d", __FUNCTION__, result);
884 return -EIO;
885 }
886
887 return 0;
888}
889
890
891static int clie_5_startup (struct usb_serial *serial)
892{
893 int response;
894 unsigned char *transfer_buffer;
895 struct palm_ext_connection_info *connection_info;
896
897 dbg("%s", __FUNCTION__);
898
899 dbg("%s - Set config to 1", __FUNCTION__);
900 usb_set_configuration(serial->dev, 1);
901
902 transfer_buffer = kmalloc(sizeof (*connection_info),
903 GFP_KERNEL);
904 if (!transfer_buffer) {
905 err("%s - kmalloc(%d) failed.", __FUNCTION__,
906 sizeof (*connection_info));
907 return -ENOMEM;
908 }
909
910 response = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
911 PALM_GET_EXT_CONNECTION_INFORMATION,
912 0xc2, 0x0000, 0x0000, transfer_buffer,
913 sizeof(*connection_info), 300);
914 if (response < 0) {
915 err("%s - error %d getting connection info",
916 __FUNCTION__, response);
917 } else {
918 usb_serial_debug_data (__FILE__, __FUNCTION__, 0x14, transfer_buffer);
919 }
920
921
922 response = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0), VISOR_REQUEST_BYTES_AVAILABLE,
923 0xc2, 0x0000, 0x0005, transfer_buffer, 0x02, 300);
924 if (response < 0) {
925 err("%s - error getting bytes available request", __FUNCTION__);
926 }
927
928 kfree (transfer_buffer);
929
930
931
932
933
934
935
936
937
938 if (serial->num_ports < 2)
939 return -ENODEV;
940
941
942 serial->port[0].bulk_out_endpointAddress = serial->port[1].bulk_out_endpointAddress;
943
944
945 return 0;
946}
947
948
949
950
951static void treo_attach (struct usb_serial *serial)
952{
953 struct usb_serial_port *port;
954 int i;
955
956
957
958 if ((serial->dev->descriptor.idVendor != HANDSPRING_VENDOR_ID) ||
959 (serial->num_interrupt_in == 0))
960 return;
961
962 dbg("%s", __FUNCTION__);
963
964
965
966
967
968 for (i = serial->num_bulk_in; i < serial->num_ports; ++i) {
969 port = &serial->port[i];
970 port->read_urb = serial->port[0].read_urb;
971 port->bulk_in_endpointAddress = serial->port[0].bulk_in_endpointAddress;
972 port->bulk_in_buffer = serial->port[0].bulk_in_buffer;
973 }
974
975 for (i = serial->num_bulk_out; i < serial->num_ports; ++i) {
976 port = &serial->port[i];
977 port->write_urb = serial->port[0].write_urb;
978 port->bulk_out_size = serial->port[0].bulk_out_size;
979 port->bulk_out_endpointAddress = serial->port[0].bulk_out_endpointAddress;
980 port->bulk_out_buffer = serial->port[0].bulk_out_buffer;
981 }
982
983 for (i = serial->num_interrupt_in; i < serial->num_ports; ++i) {
984 port = &serial->port[i];
985 port->interrupt_in_urb = serial->port[0].interrupt_in_urb;
986 port->interrupt_in_endpointAddress = serial->port[0].interrupt_in_endpointAddress;
987 port->interrupt_in_buffer = serial->port[0].interrupt_in_buffer;
988 }
989}
990
991static void visor_shutdown (struct usb_serial *serial)
992{
993 dbg("%s", __FUNCTION__);
994}
995
996static int visor_ioctl (struct usb_serial_port *port, struct file * file, unsigned int cmd, unsigned long arg)
997{
998 dbg("%s - port %d, cmd 0x%.4x", __FUNCTION__, port->number, cmd);
999
1000 return -ENOIOCTLCMD;
1001}
1002
1003
1004
1005static void visor_set_termios (struct usb_serial_port *port, struct termios *old_termios)
1006{
1007 unsigned int cflag;
1008
1009 dbg("%s - port %d", __FUNCTION__, port->number);
1010
1011 if ((!port->tty) || (!port->tty->termios)) {
1012 dbg("%s - no tty structures", __FUNCTION__);
1013 return;
1014 }
1015
1016 cflag = port->tty->termios->c_cflag;
1017
1018 if (old_termios) {
1019 if ((cflag == old_termios->c_cflag) &&
1020 (RELEVANT_IFLAG(port->tty->termios->c_iflag) == RELEVANT_IFLAG(old_termios->c_iflag))) {
1021 dbg("%s - nothing to change...", __FUNCTION__);
1022 return;
1023 }
1024 }
1025
1026
1027 switch (cflag & CSIZE) {
1028 case CS5: dbg("%s - data bits = 5", __FUNCTION__); break;
1029 case CS6: dbg("%s - data bits = 6", __FUNCTION__); break;
1030 case CS7: dbg("%s - data bits = 7", __FUNCTION__); break;
1031 default:
1032 case CS8: dbg("%s - data bits = 8", __FUNCTION__); break;
1033 }
1034
1035
1036 if (cflag & PARENB)
1037 if (cflag & PARODD)
1038 dbg("%s - parity = odd", __FUNCTION__);
1039 else
1040 dbg("%s - parity = even", __FUNCTION__);
1041 else
1042 dbg("%s - parity = none", __FUNCTION__);
1043
1044
1045 if (cflag & CSTOPB)
1046 dbg("%s - stop bits = 2", __FUNCTION__);
1047 else
1048 dbg("%s - stop bits = 1", __FUNCTION__);
1049
1050
1051
1052 if (cflag & CRTSCTS)
1053 dbg("%s - RTS/CTS is enabled", __FUNCTION__);
1054 else
1055 dbg("%s - RTS/CTS is disabled", __FUNCTION__);
1056
1057
1058 if (I_IXOFF(port->tty))
1059 dbg("%s - XON/XOFF is enabled, XON = %2x, XOFF = %2x",
1060 __FUNCTION__, START_CHAR(port->tty), STOP_CHAR(port->tty));
1061 else
1062 dbg("%s - XON/XOFF is disabled", __FUNCTION__);
1063
1064
1065 dbg("%s - baud rate = %d", __FUNCTION__, tty_get_baud_rate(port->tty));
1066
1067 return;
1068}
1069
1070
1071static int __init visor_init (void)
1072{
1073 struct urb *urb;
1074 int i;
1075
1076
1077 if ((vendor > 0) && (product > 0)) {
1078 struct usb_device_id usb_dev_temp[]=
1079 {{USB_DEVICE(vendor, product)}};
1080 id_param_table[0] = usb_dev_temp[0];
1081 info("Untested USB device specified at time of module insertion");
1082 info("Warning: This is not guaranteed to work");
1083 info("Using a newer kernel is preferred to this method");
1084 info("Adding Palm OS protocol 4.x support for unknown device: 0x%x/0x%x",
1085 param_device.id_table[0].idVendor, param_device.id_table[0].idProduct);
1086 param_register = 1;
1087 usb_serial_register (¶m_device);
1088 }
1089 usb_serial_register (&handspring_device);
1090 usb_serial_register (&clie_3_5_device);
1091 usb_serial_register (&clie_5_device);
1092
1093
1094 spin_lock_init (&write_urb_pool_lock);
1095 for (i = 0; i < NUM_URBS; ++i) {
1096 urb = usb_alloc_urb(0);
1097 write_urb_pool[i] = urb;
1098 if (urb == NULL) {
1099 err("No more urbs???");
1100 continue;
1101 }
1102
1103 urb->transfer_buffer = NULL;
1104 urb->transfer_buffer = kmalloc (URB_TRANSFER_BUFFER_SIZE, GFP_KERNEL);
1105 if (!urb->transfer_buffer) {
1106 err("%s - out of memory for urb buffers.", __FUNCTION__);
1107 continue;
1108 }
1109 }
1110
1111 info(DRIVER_DESC " " DRIVER_VERSION);
1112
1113 return 0;
1114}
1115
1116
1117static void __exit visor_exit (void)
1118{
1119 int i;
1120 unsigned long flags;
1121
1122 if (param_register) {
1123 param_register = 0;
1124 usb_serial_deregister (¶m_device);
1125 }
1126 usb_serial_deregister (&handspring_device);
1127 usb_serial_deregister (&clie_3_5_device);
1128 usb_serial_deregister (&clie_5_device);
1129
1130 spin_lock_irqsave (&write_urb_pool_lock, flags);
1131
1132 for (i = 0; i < NUM_URBS; ++i) {
1133 if (write_urb_pool[i]) {
1134
1135
1136
1137
1138 if (write_urb_pool[i]->transfer_buffer)
1139 kfree(write_urb_pool[i]->transfer_buffer);
1140 usb_free_urb (write_urb_pool[i]);
1141 }
1142 }
1143
1144 spin_unlock_irqrestore (&write_urb_pool_lock, flags);
1145}
1146
1147
1148module_init(visor_init);
1149module_exit(visor_exit);
1150
1151MODULE_AUTHOR( DRIVER_AUTHOR );
1152MODULE_DESCRIPTION( DRIVER_DESC );
1153MODULE_LICENSE("GPL");
1154
1155MODULE_PARM(debug, "i");
1156MODULE_PARM_DESC(debug, "Debug enabled or not");
1157MODULE_PARM(vendor, "i");
1158MODULE_PARM_DESC(vendor, "User specified vendor ID");
1159MODULE_PARM(product, "i");
1160MODULE_PARM_DESC(product, "User specified product ID");
1161