2 * USB HandSpring Visor, Palm m50x, and Sony Clie driver
3 * (supports all of the Palm OS USB devices)
5 * Copyright (C) 1999 - 2004
6 * Greg Kroah-Hartman (greg@kroah.com)
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
13 * See Documentation/usb/usb-serial.txt for more information on using this driver
15 * (06/03/2003) Judd Montgomery <judd at jpilot.org>
16 * Added support for module parameter options for untested/unknown
20 * Added support for the Sony Clie NZ90V device. Thanks to Martin Brachtl
21 * <brachtl@redgrep.cz> for the information.
24 * Think Treo support is now working.
27 * Added support for the Sony OS 4.1 devices. Thanks to Hiroyuki ARAKI
28 * <hiro@zob.ne.jp> for the information.
31 * Removed assumptions that port->tty was always valid (is not true
32 * for usb serial console devices.)
35 * Added support for the Palm i705 device, thanks to Thomas Riemer
36 * <tom@netmech.com> for the information.
39 * Added support for the Palm m130 device, thanks to Udo Eisenbarth
40 * <udo.eisenbarth@web.de> for the information.
43 * Reworked the urb handling logic. We have no more pool, but dynamically
44 * allocate the urb and the transfer buffer on the fly. In testing this
45 * does not incure any measurable overhead. This also relies on the fact
46 * that we have proper reference counting logic for urbs.
49 * Added initial support for the Palm m515 devices.
52 * Added support for the Clie S-360 device.
55 * Added better Clie support for 3.5 devices. Thanks to Geoffrey Levand
59 * Added support for the m125 devices, and added check to prevent oopses
60 * for CliƩ devices that lie about the number of ports they have.
63 * Added support for the Clie devices, both the 3.5 and 4.0 os versions.
64 * Many thanks to Daniel Burke, and Bryan Payne for helping with this.
67 * fixed a few potential bugs pointed out by Oliver Neukum.
70 * switched from using spinlock to a semaphore, which fixes lots of problems.
73 * Added initial support for the Palm m500 and Palm m505 devices.
76 * Identify version on module load.
79 * Added write_room and chars_in_buffer, as they were previously using the
80 * generic driver versions which is all wrong now that we are using an urb
81 * pool. Thanks to Wolfgang Grandegger for pointing this out to me.
82 * Removed count assignment in the write function, which was not needed anymore
83 * either. Thanks to Al Borchers for pointing this out.
86 * Moved MOD_DEC to end of visor_close to be nicer, as the final write
90 * Fixed bug with data being dropped on the floor by forcing tty->low_latency
91 * to be on. Hopefully this fixes the OHCI issue!
93 * (11/01/2000) Adam J. Richter
94 * usb_device_id table support
97 * Fixed bug with urb->dev not being set properly, now that the usb
101 * Got rid of always calling kmalloc for every urb we wrote out to the
103 * Added visor_read_callback so we can keep track of bytes in and out for
104 * those people who like to know the speed of their device.
105 * Removed DEBUG #ifdefs with call to usb_serial_debug_data
108 * Fixed oops in visor_exit. Need to uncomment usb_unlink_urb call _after_
109 * the host controller drivers set urb->dev = NULL when the urb is finished.
112 * Added locks for SMP safeness.
115 * Fixed endian problem in visor_startup.
116 * Fixed MOD_INC and MOD_DEC logic and the ability to open a port more
120 * Added pool of write urbs to speed up transfers to the visor.
123 * Added module_init and module_exit functions to handle the fact that this
124 * driver is a loadable module now.
127 * Added visor_set_ioctl and visor_set_termios functions (they don't do much
128 * of anything, but are good for debugging.)
131 * Fixed bug in visor_unthrottle that should help with the disconnect in PPP
132 * bug that people have been reporting.
135 * Cleaned up debugging statements in a quest to find UHCI timeout bug.
137 * (04/27/2000) Ryan VanderBijl
138 * Fixed memory leak in visor_close
141 * Split driver up into device specific pieces.
145 #include <linux/config.h>
146 #include <linux/kernel.h>
147 #include <linux/errno.h>
148 #include <linux/init.h>
149 #include <linux/slab.h>
150 #include <linux/tty.h>
151 #include <linux/tty_driver.h>
152 #include <linux/tty_flip.h>
153 #include <linux/module.h>
154 #include <linux/moduleparam.h>
155 #include <linux/spinlock.h>
156 #include <asm/uaccess.h>
157 #include <linux/usb.h>
158 #include "usb-serial.h"
162 * Version Information
164 #define DRIVER_VERSION "v2.1"
165 #define DRIVER_AUTHOR "Greg Kroah-Hartman <greg@kroah.com>"
166 #define DRIVER_DESC "USB HandSpring Visor / Palm OS driver"
168 /* function prototypes for a handspring visor */
169 static int visor_open (struct usb_serial_port
*port
, struct file
*filp
);
170 static void visor_close (struct usb_serial_port
*port
, struct file
*filp
);
171 static int visor_write (struct usb_serial_port
*port
, const unsigned char *buf
, int count
);
172 static int visor_write_room (struct usb_serial_port
*port
);
173 static int visor_chars_in_buffer (struct usb_serial_port
*port
);
174 static void visor_throttle (struct usb_serial_port
*port
);
175 static void visor_unthrottle (struct usb_serial_port
*port
);
176 static int visor_probe (struct usb_serial
*serial
, const struct usb_device_id
*id
);
177 static int visor_calc_num_ports(struct usb_serial
*serial
);
178 static void visor_shutdown (struct usb_serial
*serial
);
179 static int visor_ioctl (struct usb_serial_port
*port
, struct file
* file
, unsigned int cmd
, unsigned long arg
);
180 static void visor_set_termios (struct usb_serial_port
*port
, struct termios
*old_termios
);
181 static void visor_write_bulk_callback (struct urb
*urb
, struct pt_regs
*regs
);
182 static void visor_read_bulk_callback (struct urb
*urb
, struct pt_regs
*regs
);
183 static void visor_read_int_callback (struct urb
*urb
, struct pt_regs
*regs
);
184 static int clie_3_5_startup (struct usb_serial
*serial
);
185 static int treo_attach (struct usb_serial
*serial
);
186 static int clie_5_attach (struct usb_serial
*serial
);
187 static int palm_os_3_probe (struct usb_serial
*serial
, const struct usb_device_id
*id
);
188 static int palm_os_4_probe (struct usb_serial
*serial
, const struct usb_device_id
*id
);
190 /* Parameters that may be passed into the module. */
193 static __u16 product
;
195 static struct usb_device_id id_table
[] = {
196 { USB_DEVICE(HANDSPRING_VENDOR_ID
, HANDSPRING_VISOR_ID
),
197 .driver_info
= (kernel_ulong_t
)&palm_os_3_probe
},
198 { USB_DEVICE(HANDSPRING_VENDOR_ID
, HANDSPRING_TREO_ID
),
199 .driver_info
= (kernel_ulong_t
)&palm_os_4_probe
},
200 { USB_DEVICE(HANDSPRING_VENDOR_ID
, HANDSPRING_TREO600_ID
),
201 .driver_info
= (kernel_ulong_t
)&palm_os_4_probe
},
202 { USB_DEVICE(PALM_VENDOR_ID
, PALM_M500_ID
),
203 .driver_info
= (kernel_ulong_t
)&palm_os_4_probe
},
204 { USB_DEVICE(PALM_VENDOR_ID
, PALM_M505_ID
),
205 .driver_info
= (kernel_ulong_t
)&palm_os_4_probe
},
206 { USB_DEVICE(PALM_VENDOR_ID
, PALM_M515_ID
),
207 .driver_info
= (kernel_ulong_t
)&palm_os_4_probe
},
208 { USB_DEVICE(PALM_VENDOR_ID
, PALM_I705_ID
),
209 .driver_info
= (kernel_ulong_t
)&palm_os_4_probe
},
210 { USB_DEVICE(PALM_VENDOR_ID
, PALM_M100_ID
),
211 .driver_info
= (kernel_ulong_t
)&palm_os_4_probe
},
212 { USB_DEVICE(PALM_VENDOR_ID
, PALM_M125_ID
),
213 .driver_info
= (kernel_ulong_t
)&palm_os_4_probe
},
214 { USB_DEVICE(PALM_VENDOR_ID
, PALM_M130_ID
),
215 .driver_info
= (kernel_ulong_t
)&palm_os_4_probe
},
216 { USB_DEVICE(PALM_VENDOR_ID
, PALM_TUNGSTEN_T_ID
),
217 .driver_info
= (kernel_ulong_t
)&palm_os_4_probe
},
218 { USB_DEVICE(PALM_VENDOR_ID
, PALM_TREO_650
),
219 .driver_info
= (kernel_ulong_t
)&palm_os_4_probe
},
220 { USB_DEVICE(PALM_VENDOR_ID
, PALM_TUNGSTEN_Z_ID
),
221 .driver_info
= (kernel_ulong_t
)&palm_os_4_probe
},
222 { USB_DEVICE(PALM_VENDOR_ID
, PALM_ZIRE31_ID
),
223 .driver_info
= (kernel_ulong_t
)&palm_os_4_probe
},
224 { USB_DEVICE(PALM_VENDOR_ID
, PALM_ZIRE_ID
),
225 .driver_info
= (kernel_ulong_t
)&palm_os_4_probe
},
226 { USB_DEVICE(SONY_VENDOR_ID
, SONY_CLIE_4_0_ID
),
227 .driver_info
= (kernel_ulong_t
)&palm_os_4_probe
},
228 { USB_DEVICE(SONY_VENDOR_ID
, SONY_CLIE_S360_ID
),
229 .driver_info
= (kernel_ulong_t
)&palm_os_4_probe
},
230 { USB_DEVICE(SONY_VENDOR_ID
, SONY_CLIE_4_1_ID
),
231 .driver_info
= (kernel_ulong_t
)&palm_os_4_probe
},
232 { USB_DEVICE(SONY_VENDOR_ID
, SONY_CLIE_NX60_ID
),
233 .driver_info
= (kernel_ulong_t
)&palm_os_4_probe
},
234 { USB_DEVICE(SONY_VENDOR_ID
, SONY_CLIE_NZ90V_ID
),
235 .driver_info
= (kernel_ulong_t
)&palm_os_4_probe
},
236 { USB_DEVICE(SONY_VENDOR_ID
, SONY_CLIE_TJ25_ID
),
237 .driver_info
= (kernel_ulong_t
)&palm_os_4_probe
},
238 { USB_DEVICE(SAMSUNG_VENDOR_ID
, SAMSUNG_SCH_I330_ID
),
239 .driver_info
= (kernel_ulong_t
)&palm_os_4_probe
},
240 { USB_DEVICE(SAMSUNG_VENDOR_ID
, SAMSUNG_SPH_I500_ID
),
241 .driver_info
= (kernel_ulong_t
)&palm_os_4_probe
},
242 { USB_DEVICE(TAPWAVE_VENDOR_ID
, TAPWAVE_ZODIAC_ID
),
243 .driver_info
= (kernel_ulong_t
)&palm_os_4_probe
},
244 { USB_DEVICE(GARMIN_VENDOR_ID
, GARMIN_IQUE_3600_ID
),
245 .driver_info
= (kernel_ulong_t
)&palm_os_4_probe
},
246 { USB_DEVICE(ACEECA_VENDOR_ID
, ACEECA_MEZ1000_ID
),
247 .driver_info
= (kernel_ulong_t
)&palm_os_4_probe
},
248 { USB_DEVICE(KYOCERA_VENDOR_ID
, KYOCERA_7135_ID
),
249 .driver_info
= (kernel_ulong_t
)&palm_os_4_probe
},
250 { USB_DEVICE(FOSSIL_VENDOR_ID
, FOSSIL_ABACUS_ID
),
251 .driver_info
= (kernel_ulong_t
)&palm_os_4_probe
},
252 { }, /* optional parameter entry */
253 { } /* Terminating entry */
256 static struct usb_device_id clie_id_5_table
[] = {
257 { USB_DEVICE(SONY_VENDOR_ID
, SONY_CLIE_UX50_ID
),
258 .driver_info
= (kernel_ulong_t
)&palm_os_4_probe
},
259 { }, /* optional parameter entry */
260 { } /* Terminating entry */
263 static struct usb_device_id clie_id_3_5_table
[] = {
264 { USB_DEVICE(SONY_VENDOR_ID
, SONY_CLIE_3_5_ID
) },
265 { } /* Terminating entry */
268 static struct usb_device_id id_table_combined
[] = {
269 { USB_DEVICE(HANDSPRING_VENDOR_ID
, HANDSPRING_VISOR_ID
) },
270 { USB_DEVICE(HANDSPRING_VENDOR_ID
, HANDSPRING_TREO_ID
) },
271 { USB_DEVICE(HANDSPRING_VENDOR_ID
, HANDSPRING_TREO600_ID
) },
272 { USB_DEVICE(PALM_VENDOR_ID
, PALM_M500_ID
) },
273 { USB_DEVICE(PALM_VENDOR_ID
, PALM_M505_ID
) },
274 { USB_DEVICE(PALM_VENDOR_ID
, PALM_M515_ID
) },
275 { USB_DEVICE(PALM_VENDOR_ID
, PALM_I705_ID
) },
276 { USB_DEVICE(PALM_VENDOR_ID
, PALM_M100_ID
) },
277 { USB_DEVICE(PALM_VENDOR_ID
, PALM_M125_ID
) },
278 { USB_DEVICE(PALM_VENDOR_ID
, PALM_M130_ID
) },
279 { USB_DEVICE(PALM_VENDOR_ID
, PALM_TUNGSTEN_T_ID
) },
280 { USB_DEVICE(PALM_VENDOR_ID
, PALM_TREO_650
) },
281 { USB_DEVICE(PALM_VENDOR_ID
, PALM_TUNGSTEN_Z_ID
) },
282 { USB_DEVICE(PALM_VENDOR_ID
, PALM_ZIRE31_ID
) },
283 { USB_DEVICE(PALM_VENDOR_ID
, PALM_ZIRE_ID
) },
284 { USB_DEVICE(SONY_VENDOR_ID
, SONY_CLIE_3_5_ID
) },
285 { USB_DEVICE(SONY_VENDOR_ID
, SONY_CLIE_4_0_ID
) },
286 { USB_DEVICE(SONY_VENDOR_ID
, SONY_CLIE_S360_ID
) },
287 { USB_DEVICE(SONY_VENDOR_ID
, SONY_CLIE_4_1_ID
) },
288 { USB_DEVICE(SONY_VENDOR_ID
, SONY_CLIE_NX60_ID
) },
289 { USB_DEVICE(SONY_VENDOR_ID
, SONY_CLIE_NZ90V_ID
) },
290 { USB_DEVICE(SONY_VENDOR_ID
, SONY_CLIE_UX50_ID
) },
291 { USB_DEVICE(SONY_VENDOR_ID
, SONY_CLIE_TJ25_ID
) },
292 { USB_DEVICE(SAMSUNG_VENDOR_ID
, SAMSUNG_SCH_I330_ID
) },
293 { USB_DEVICE(SAMSUNG_VENDOR_ID
, SAMSUNG_SPH_I500_ID
) },
294 { USB_DEVICE(TAPWAVE_VENDOR_ID
, TAPWAVE_ZODIAC_ID
) },
295 { USB_DEVICE(GARMIN_VENDOR_ID
, GARMIN_IQUE_3600_ID
) },
296 { USB_DEVICE(ACEECA_VENDOR_ID
, ACEECA_MEZ1000_ID
) },
297 { USB_DEVICE(KYOCERA_VENDOR_ID
, KYOCERA_7135_ID
) },
298 { USB_DEVICE(FOSSIL_VENDOR_ID
, FOSSIL_ABACUS_ID
) },
299 { }, /* optional parameter entry */
300 { } /* Terminating entry */
303 MODULE_DEVICE_TABLE (usb
, id_table_combined
);
305 static struct usb_driver visor_driver
= {
306 .owner
= THIS_MODULE
,
308 .probe
= usb_serial_probe
,
309 .disconnect
= usb_serial_disconnect
,
310 .id_table
= id_table_combined
,
313 /* All of the device info needed for the Handspring Visor, and Palm 4.0 devices */
314 static struct usb_serial_device_type handspring_device
= {
315 .owner
= THIS_MODULE
,
316 .name
= "Handspring Visor / Palm OS",
317 .short_name
= "visor",
318 .id_table
= id_table
,
319 .num_interrupt_in
= NUM_DONT_CARE
,
324 .close
= visor_close
,
325 .throttle
= visor_throttle
,
326 .unthrottle
= visor_unthrottle
,
327 .attach
= treo_attach
,
328 .probe
= visor_probe
,
329 .calc_num_ports
= visor_calc_num_ports
,
330 .shutdown
= visor_shutdown
,
331 .ioctl
= visor_ioctl
,
332 .set_termios
= visor_set_termios
,
333 .write
= visor_write
,
334 .write_room
= visor_write_room
,
335 .chars_in_buffer
= visor_chars_in_buffer
,
336 .write_bulk_callback
= visor_write_bulk_callback
,
337 .read_bulk_callback
= visor_read_bulk_callback
,
338 .read_int_callback
= visor_read_int_callback
,
341 /* All of the device info needed for the Clie UX50, TH55 Palm 5.0 devices */
342 static struct usb_serial_device_type clie_5_device
= {
343 .owner
= THIS_MODULE
,
344 .name
= "Sony Clie 5.0",
345 .short_name
= "clie_5",
346 .id_table
= clie_id_5_table
,
347 .num_interrupt_in
= NUM_DONT_CARE
,
352 .close
= visor_close
,
353 .throttle
= visor_throttle
,
354 .unthrottle
= visor_unthrottle
,
355 .attach
= clie_5_attach
,
356 .probe
= visor_probe
,
357 .calc_num_ports
= visor_calc_num_ports
,
358 .shutdown
= visor_shutdown
,
359 .ioctl
= visor_ioctl
,
360 .set_termios
= visor_set_termios
,
361 .write
= visor_write
,
362 .write_room
= visor_write_room
,
363 .chars_in_buffer
= visor_chars_in_buffer
,
364 .write_bulk_callback
= visor_write_bulk_callback
,
365 .read_bulk_callback
= visor_read_bulk_callback
,
366 .read_int_callback
= visor_read_int_callback
,
369 /* device info for the Sony Clie OS version 3.5 */
370 static struct usb_serial_device_type clie_3_5_device
= {
371 .owner
= THIS_MODULE
,
372 .name
= "Sony Clie 3.5",
373 .short_name
= "clie_3.5",
374 .id_table
= clie_id_3_5_table
,
375 .num_interrupt_in
= 0,
380 .close
= visor_close
,
381 .throttle
= visor_throttle
,
382 .unthrottle
= visor_unthrottle
,
383 .attach
= clie_3_5_startup
,
384 .ioctl
= visor_ioctl
,
385 .set_termios
= visor_set_termios
,
386 .write
= visor_write
,
387 .write_room
= visor_write_room
,
388 .chars_in_buffer
= visor_chars_in_buffer
,
389 .write_bulk_callback
= visor_write_bulk_callback
,
390 .read_bulk_callback
= visor_read_bulk_callback
,
393 struct visor_private
{
397 int outstanding_urbs
;
401 /* number of outstanding urbs to prevent userspace DoS from happening */
402 #define URB_UPPER_LIMIT 42
406 /******************************************************************************
407 * Handspring Visor specific driver functions
408 ******************************************************************************/
409 static int visor_open (struct usb_serial_port
*port
, struct file
*filp
)
411 struct usb_serial
*serial
= port
->serial
;
412 struct visor_private
*priv
= usb_get_serial_port_data(port
);
416 dbg("%s - port %d", __FUNCTION__
, port
->number
);
418 if (!port
->read_urb
) {
419 /* this is needed for some brain dead Sony devices */
420 dev_err(&port
->dev
, "Device lied about number of ports, please use a lower one.\n");
424 spin_lock_irqsave(&priv
->lock
, flags
);
427 priv
->outstanding_urbs
= 0;
429 spin_unlock_irqrestore(&priv
->lock
, flags
);
432 * Force low_latency on so that our tty_push actually forces the data
433 * through, otherwise it is scheduled, and with high data rates (like
434 * with OHCI) data can get lost.
437 port
->tty
->low_latency
= 1;
439 /* Start reading from the device */
440 usb_fill_bulk_urb (port
->read_urb
, serial
->dev
,
441 usb_rcvbulkpipe (serial
->dev
,
442 port
->bulk_in_endpointAddress
),
443 port
->read_urb
->transfer_buffer
,
444 port
->read_urb
->transfer_buffer_length
,
445 visor_read_bulk_callback
, port
);
446 result
= usb_submit_urb(port
->read_urb
, GFP_KERNEL
);
448 dev_err(&port
->dev
, "%s - failed submitting read urb, error %d\n",
449 __FUNCTION__
, result
);
453 if (port
->interrupt_in_urb
) {
454 dbg("%s - adding interrupt input for treo", __FUNCTION__
);
455 result
= usb_submit_urb(port
->interrupt_in_urb
, GFP_KERNEL
);
457 dev_err(&port
->dev
, "%s - failed submitting interrupt urb, error %d\n",
458 __FUNCTION__
, result
);
465 static void visor_close (struct usb_serial_port
*port
, struct file
* filp
)
467 struct visor_private
*priv
= usb_get_serial_port_data(port
);
468 unsigned char *transfer_buffer
;
470 dbg("%s - port %d", __FUNCTION__
, port
->number
);
472 /* shutdown our urbs */
473 usb_kill_urb(port
->read_urb
);
474 if (port
->interrupt_in_urb
)
475 usb_kill_urb(port
->interrupt_in_urb
);
477 /* Try to send shutdown message, if the device is gone, this will just fail. */
478 transfer_buffer
= kmalloc (0x12, GFP_KERNEL
);
479 if (transfer_buffer
) {
480 usb_control_msg (port
->serial
->dev
,
481 usb_rcvctrlpipe(port
->serial
->dev
, 0),
482 VISOR_CLOSE_NOTIFICATION
, 0xc2,
484 transfer_buffer
, 0x12, 300);
485 kfree (transfer_buffer
);
489 dev_info(&port
->dev
, "Bytes In = %d Bytes Out = %d\n",
490 priv
->bytes_in
, priv
->bytes_out
);
494 static int visor_write (struct usb_serial_port
*port
, const unsigned char *buf
, int count
)
496 struct visor_private
*priv
= usb_get_serial_port_data(port
);
497 struct usb_serial
*serial
= port
->serial
;
499 unsigned char *buffer
;
503 dbg("%s - port %d", __FUNCTION__
, port
->number
);
505 spin_lock_irqsave(&priv
->lock
, flags
);
506 if (priv
->outstanding_urbs
> URB_UPPER_LIMIT
) {
507 spin_unlock_irqrestore(&priv
->lock
, flags
);
508 dbg("%s - write limit hit\n", __FUNCTION__
);
511 spin_unlock_irqrestore(&priv
->lock
, flags
);
513 buffer
= kmalloc (count
, GFP_ATOMIC
);
515 dev_err(&port
->dev
, "out of memory\n");
519 urb
= usb_alloc_urb(0, GFP_ATOMIC
);
521 dev_err(&port
->dev
, "no more free urbs\n");
526 memcpy (buffer
, buf
, count
);
528 usb_serial_debug_data(debug
, &port
->dev
, __FUNCTION__
, count
, buffer
);
530 usb_fill_bulk_urb (urb
, serial
->dev
,
531 usb_sndbulkpipe (serial
->dev
,
532 port
->bulk_out_endpointAddress
),
534 visor_write_bulk_callback
, port
);
536 /* send it down the pipe */
537 status
= usb_submit_urb(urb
, GFP_ATOMIC
);
539 dev_err(&port
->dev
, "%s - usb_submit_urb(write bulk) failed with status = %d\n",
540 __FUNCTION__
, status
);
544 spin_lock_irqsave(&priv
->lock
, flags
);
545 ++priv
->outstanding_urbs
;
546 priv
->bytes_out
+= count
;
547 spin_unlock_irqrestore(&priv
->lock
, flags
);
550 /* we are done with this urb, so let the host driver
551 * really free it when it is finished with it */
558 static int visor_write_room (struct usb_serial_port
*port
)
560 dbg("%s - port %d", __FUNCTION__
, port
->number
);
563 * We really can take anything the user throws at us
564 * but let's pick a nice big number to tell the tty
565 * layer that we have lots of free space
571 static int visor_chars_in_buffer (struct usb_serial_port
*port
)
573 dbg("%s - port %d", __FUNCTION__
, port
->number
);
576 * We can't really account for how much data we
577 * have sent out, but hasn't made it through to the
578 * device, so just tell the tty layer that everything
585 static void visor_write_bulk_callback (struct urb
*urb
, struct pt_regs
*regs
)
587 struct usb_serial_port
*port
= (struct usb_serial_port
*)urb
->context
;
588 struct visor_private
*priv
= usb_get_serial_port_data(port
);
591 /* free up the transfer buffer, as usb_free_urb() does not do this */
592 kfree (urb
->transfer_buffer
);
594 dbg("%s - port %d", __FUNCTION__
, port
->number
);
597 dbg("%s - nonzero write bulk status received: %d",
598 __FUNCTION__
, urb
->status
);
600 spin_lock_irqsave(&priv
->lock
, flags
);
601 --priv
->outstanding_urbs
;
602 spin_unlock_irqrestore(&priv
->lock
, flags
);
604 schedule_work(&port
->work
);
608 static void visor_read_bulk_callback (struct urb
*urb
, struct pt_regs
*regs
)
610 struct usb_serial_port
*port
= (struct usb_serial_port
*)urb
->context
;
611 struct visor_private
*priv
= usb_get_serial_port_data(port
);
612 unsigned char *data
= urb
->transfer_buffer
;
613 struct tty_struct
*tty
;
619 dbg("%s - port %d", __FUNCTION__
, port
->number
);
622 dbg("%s - nonzero read bulk status received: %d", __FUNCTION__
, urb
->status
);
626 usb_serial_debug_data(debug
, &port
->dev
, __FUNCTION__
, urb
->actual_length
, data
);
629 if (tty
&& urb
->actual_length
) {
630 for (i
= 0; i
< urb
->actual_length
; ++i
) {
631 /* if we insert more than TTY_FLIPBUF_SIZE characters, we drop them. */
632 if(tty
->flip
.count
>= TTY_FLIPBUF_SIZE
) {
633 tty_flip_buffer_push(tty
);
635 /* this doesn't actually push the data through unless tty->low_latency is set */
636 tty_insert_flip_char(tty
, data
[i
], 0);
638 tty_flip_buffer_push(tty
);
640 spin_lock_irqsave(&priv
->lock
, flags
);
641 priv
->bytes_in
+= urb
->actual_length
;
642 throttled
= priv
->throttled
;
643 spin_unlock_irqrestore(&priv
->lock
, flags
);
645 /* Continue trying to always read if we should */
647 usb_fill_bulk_urb (port
->read_urb
, port
->serial
->dev
,
648 usb_rcvbulkpipe(port
->serial
->dev
,
649 port
->bulk_in_endpointAddress
),
650 port
->read_urb
->transfer_buffer
,
651 port
->read_urb
->transfer_buffer_length
,
652 visor_read_bulk_callback
, port
);
653 result
= usb_submit_urb(port
->read_urb
, GFP_ATOMIC
);
655 dev_err(&port
->dev
, "%s - failed resubmitting read urb, error %d\n", __FUNCTION__
, result
);
660 static void visor_read_int_callback (struct urb
*urb
, struct pt_regs
*regs
)
662 struct usb_serial_port
*port
= (struct usb_serial_port
*)urb
->context
;
665 switch (urb
->status
) {
672 /* this urb is terminated, clean up */
673 dbg("%s - urb shutting down with status: %d",
674 __FUNCTION__
, urb
->status
);
677 dbg("%s - nonzero urb status received: %d",
678 __FUNCTION__
, urb
->status
);
683 * This information is still unknown what it can be used for.
684 * If anyone has an idea, please let the author know...
686 * Rumor has it this endpoint is used to notify when data
687 * is ready to be read from the bulk ones.
689 usb_serial_debug_data(debug
, &port
->dev
, __FUNCTION__
,
690 urb
->actual_length
, urb
->transfer_buffer
);
693 result
= usb_submit_urb (urb
, GFP_ATOMIC
);
695 dev_err(&urb
->dev
->dev
, "%s - Error %d submitting interrupt urb\n",
696 __FUNCTION__
, result
);
699 static void visor_throttle (struct usb_serial_port
*port
)
701 struct visor_private
*priv
= usb_get_serial_port_data(port
);
704 dbg("%s - port %d", __FUNCTION__
, port
->number
);
705 spin_lock_irqsave(&priv
->lock
, flags
);
707 spin_unlock_irqrestore(&priv
->lock
, flags
);
711 static void visor_unthrottle (struct usb_serial_port
*port
)
713 struct visor_private
*priv
= usb_get_serial_port_data(port
);
717 dbg("%s - port %d", __FUNCTION__
, port
->number
);
718 spin_lock_irqsave(&priv
->lock
, flags
);
720 spin_unlock_irqrestore(&priv
->lock
, flags
);
722 port
->read_urb
->dev
= port
->serial
->dev
;
723 result
= usb_submit_urb(port
->read_urb
, GFP_ATOMIC
);
725 dev_err(&port
->dev
, "%s - failed submitting read urb, error %d\n", __FUNCTION__
, result
);
728 static int palm_os_3_probe (struct usb_serial
*serial
, const struct usb_device_id
*id
)
730 struct device
*dev
= &serial
->dev
->dev
;
731 struct visor_connection_info
*connection_info
;
732 unsigned char *transfer_buffer
;
738 dbg("%s", __FUNCTION__
);
740 transfer_buffer
= kmalloc (sizeof (*connection_info
), GFP_KERNEL
);
741 if (!transfer_buffer
) {
742 dev_err(dev
, "%s - kmalloc(%Zd) failed.\n", __FUNCTION__
,
743 sizeof(*connection_info
));
747 /* send a get connection info request */
748 retval
= usb_control_msg (serial
->dev
,
749 usb_rcvctrlpipe(serial
->dev
, 0),
750 VISOR_GET_CONNECTION_INFORMATION
,
751 0xc2, 0x0000, 0x0000, transfer_buffer
,
752 sizeof(*connection_info
), 300);
754 dev_err(dev
, "%s - error %d getting connection information\n",
755 __FUNCTION__
, retval
);
759 if (retval
== sizeof(*connection_info
)) {
760 connection_info
= (struct visor_connection_info
*)transfer_buffer
;
762 num_ports
= le16_to_cpu(connection_info
->num_ports
);
763 for (i
= 0; i
< num_ports
; ++i
) {
764 switch (connection_info
->connections
[i
].port_function_id
) {
765 case VISOR_FUNCTION_GENERIC
:
768 case VISOR_FUNCTION_DEBUGGER
:
771 case VISOR_FUNCTION_HOTSYNC
:
774 case VISOR_FUNCTION_CONSOLE
:
777 case VISOR_FUNCTION_REMOTE_FILE_SYS
:
778 string
= "Remote File System";
784 dev_info(dev
, "%s: port %d, is for %s use\n",
786 connection_info
->connections
[i
].port
, string
);
790 * Handle devices that report invalid stuff here.
792 if (num_ports
== 0 || num_ports
> 2) {
793 dev_warn (dev
, "%s: No valid connect info available\n",
798 dev_info(dev
, "%s: Number of ports: %d\n", serial
->type
->name
,
802 * save off our num_ports info so that we can use it in the
803 * calc_num_ports callback
805 usb_set_serial_data(serial
, (void *)(long)num_ports
);
807 /* ask for the number of bytes available, but ignore the response as it is broken */
808 retval
= usb_control_msg (serial
->dev
,
809 usb_rcvctrlpipe(serial
->dev
, 0),
810 VISOR_REQUEST_BYTES_AVAILABLE
,
811 0xc2, 0x0000, 0x0005, transfer_buffer
,
814 dev_err(dev
, "%s - error %d getting bytes available request\n",
815 __FUNCTION__
, retval
);
819 kfree (transfer_buffer
);
824 static int palm_os_4_probe (struct usb_serial
*serial
, const struct usb_device_id
*id
)
826 struct device
*dev
= &serial
->dev
->dev
;
827 struct palm_ext_connection_info
*connection_info
;
828 unsigned char *transfer_buffer
;
831 dbg("%s", __FUNCTION__
);
833 transfer_buffer
= kmalloc (sizeof (*connection_info
), GFP_KERNEL
);
834 if (!transfer_buffer
) {
835 dev_err(dev
, "%s - kmalloc(%Zd) failed.\n", __FUNCTION__
,
836 sizeof(*connection_info
));
840 retval
= usb_control_msg (serial
->dev
,
841 usb_rcvctrlpipe(serial
->dev
, 0),
842 PALM_GET_EXT_CONNECTION_INFORMATION
,
843 0xc2, 0x0000, 0x0000, transfer_buffer
,
844 sizeof (*connection_info
), 300);
846 dev_err(dev
, "%s - error %d getting connection info\n",
847 __FUNCTION__
, retval
);
849 usb_serial_debug_data(debug
, &serial
->dev
->dev
, __FUNCTION__
,
850 retval
, transfer_buffer
);
852 kfree (transfer_buffer
);
857 static int visor_probe (struct usb_serial
*serial
, const struct usb_device_id
*id
)
860 int (*startup
) (struct usb_serial
*serial
, const struct usb_device_id
*id
);
862 dbg("%s", __FUNCTION__
);
864 if (serial
->dev
->actconfig
->desc
.bConfigurationValue
!= 1) {
865 err("active config #%d != 1 ??",
866 serial
->dev
->actconfig
->desc
.bConfigurationValue
);
870 if (id
->driver_info
) {
871 startup
= (void *)id
->driver_info
;
872 retval
= startup(serial
, id
);
878 static int visor_calc_num_ports (struct usb_serial
*serial
)
880 int num_ports
= (int)(long)(usb_get_serial_data(serial
));
883 usb_set_serial_data(serial
, NULL
);
888 static int generic_startup(struct usb_serial
*serial
)
890 struct visor_private
*priv
;
893 for (i
= 0; i
< serial
->num_ports
; ++i
) {
894 priv
= kmalloc (sizeof(*priv
), GFP_KERNEL
);
897 memset (priv
, 0x00, sizeof(*priv
));
898 spin_lock_init(&priv
->lock
);
899 usb_set_serial_port_data(serial
->port
[i
], priv
);
904 static int clie_3_5_startup (struct usb_serial
*serial
)
906 struct device
*dev
= &serial
->dev
->dev
;
910 dbg("%s", __FUNCTION__
);
913 * Note that PEG-300 series devices expect the following two calls.
916 /* get the config number */
917 result
= usb_control_msg (serial
->dev
, usb_rcvctrlpipe(serial
->dev
, 0),
918 USB_REQ_GET_CONFIGURATION
, USB_DIR_IN
,
919 0, 0, &data
, 1, 3000);
921 dev_err(dev
, "%s: get config number failed: %d\n", __FUNCTION__
, result
);
925 dev_err(dev
, "%s: get config number bad return length: %d\n", __FUNCTION__
, result
);
929 /* get the interface number */
930 result
= usb_control_msg (serial
->dev
, usb_rcvctrlpipe(serial
->dev
, 0),
931 USB_REQ_GET_INTERFACE
,
932 USB_DIR_IN
| USB_RECIP_INTERFACE
,
933 0, 0, &data
, 1, 3000);
935 dev_err(dev
, "%s: get interface number failed: %d\n", __FUNCTION__
, result
);
939 dev_err(dev
, "%s: get interface number bad return length: %d\n", __FUNCTION__
, result
);
943 return generic_startup(serial
);
946 static int treo_attach (struct usb_serial
*serial
)
948 struct usb_serial_port
*swap_port
;
950 /* Only do this endpoint hack for the Handspring devices with
951 * interrupt in endpoints, which for now are the Treo devices. */
952 if (!((le16_to_cpu(serial
->dev
->descriptor
.idVendor
) == HANDSPRING_VENDOR_ID
) ||
953 (le16_to_cpu(serial
->dev
->descriptor
.idVendor
) == KYOCERA_VENDOR_ID
)) ||
954 (serial
->num_interrupt_in
== 0))
955 goto generic_startup
;
957 dbg("%s", __FUNCTION__
);
960 * It appears that Treos and Kyoceras want to use the
961 * 1st bulk in endpoint to communicate with the 2nd bulk out endpoint,
962 * so let's swap the 1st and 2nd bulk in and interrupt endpoints.
963 * Note that swapping the bulk out endpoints would break lots of
964 * apps that want to communicate on the second port.
966 #define COPY_PORT(dest, src) \
967 dest->read_urb = src->read_urb; \
968 dest->bulk_in_endpointAddress = src->bulk_in_endpointAddress; \
969 dest->bulk_in_buffer = src->bulk_in_buffer; \
970 dest->interrupt_in_urb = src->interrupt_in_urb; \
971 dest->interrupt_in_endpointAddress = src->interrupt_in_endpointAddress; \
972 dest->interrupt_in_buffer = src->interrupt_in_buffer;
974 swap_port
= kmalloc(sizeof(*swap_port
), GFP_KERNEL
);
977 COPY_PORT(swap_port
, serial
->port
[0]);
978 COPY_PORT(serial
->port
[0], serial
->port
[1]);
979 COPY_PORT(serial
->port
[1], swap_port
);
983 return generic_startup(serial
);
986 static int clie_5_attach (struct usb_serial
*serial
)
988 dbg("%s", __FUNCTION__
);
990 /* TH55 registers 2 ports.
991 Communication in from the UX50/TH55 uses bulk_in_endpointAddress from port 0
992 Communication out to the UX50/TH55 uses bulk_out_endpointAddress from port 1
994 Lets do a quick and dirty mapping
997 /* some sanity check */
998 if (serial
->num_ports
< 2)
1001 /* port 0 now uses the modified endpoint Address */
1002 serial
->port
[0]->bulk_out_endpointAddress
= serial
->port
[1]->bulk_out_endpointAddress
;
1004 return generic_startup(serial
);
1007 static void visor_shutdown (struct usb_serial
*serial
)
1009 dbg("%s", __FUNCTION__
);
1012 static int visor_ioctl (struct usb_serial_port
*port
, struct file
* file
, unsigned int cmd
, unsigned long arg
)
1014 dbg("%s - port %d, cmd 0x%.4x", __FUNCTION__
, port
->number
, cmd
);
1016 return -ENOIOCTLCMD
;
1020 /* This function is all nice and good, but we don't change anything based on it :) */
1021 static void visor_set_termios (struct usb_serial_port
*port
, struct termios
*old_termios
)
1025 dbg("%s - port %d", __FUNCTION__
, port
->number
);
1027 if ((!port
->tty
) || (!port
->tty
->termios
)) {
1028 dbg("%s - no tty structures", __FUNCTION__
);
1032 cflag
= port
->tty
->termios
->c_cflag
;
1033 /* check that they really want us to change something */
1035 if ((cflag
== old_termios
->c_cflag
) &&
1036 (RELEVANT_IFLAG(port
->tty
->termios
->c_iflag
) == RELEVANT_IFLAG(old_termios
->c_iflag
))) {
1037 dbg("%s - nothing to change...", __FUNCTION__
);
1042 /* get the byte size */
1043 switch (cflag
& CSIZE
) {
1044 case CS5
: dbg("%s - data bits = 5", __FUNCTION__
); break;
1045 case CS6
: dbg("%s - data bits = 6", __FUNCTION__
); break;
1046 case CS7
: dbg("%s - data bits = 7", __FUNCTION__
); break;
1048 case CS8
: dbg("%s - data bits = 8", __FUNCTION__
); break;
1051 /* determine the parity */
1054 dbg("%s - parity = odd", __FUNCTION__
);
1056 dbg("%s - parity = even", __FUNCTION__
);
1058 dbg("%s - parity = none", __FUNCTION__
);
1060 /* figure out the stop bits requested */
1062 dbg("%s - stop bits = 2", __FUNCTION__
);
1064 dbg("%s - stop bits = 1", __FUNCTION__
);
1067 /* figure out the flow control settings */
1068 if (cflag
& CRTSCTS
)
1069 dbg("%s - RTS/CTS is enabled", __FUNCTION__
);
1071 dbg("%s - RTS/CTS is disabled", __FUNCTION__
);
1073 /* determine software flow control */
1074 if (I_IXOFF(port
->tty
))
1075 dbg("%s - XON/XOFF is enabled, XON = %2x, XOFF = %2x",
1076 __FUNCTION__
, START_CHAR(port
->tty
), STOP_CHAR(port
->tty
));
1078 dbg("%s - XON/XOFF is disabled", __FUNCTION__
);
1080 /* get the baud rate wanted */
1081 dbg("%s - baud rate = %d", __FUNCTION__
, tty_get_baud_rate(port
->tty
));
1087 static int __init
visor_init (void)
1090 /* Only if parameters were passed to us */
1091 if ((vendor
>0) && (product
>0)) {
1092 struct usb_device_id usb_dev_temp
[]=
1093 {{USB_DEVICE(vendor
, product
),
1094 .driver_info
= (kernel_ulong_t
)&palm_os_4_probe
}};
1096 /* Find the last entry in id_table */
1098 if (id_table
[i
].idVendor
==0) {
1099 id_table
[i
] = usb_dev_temp
[0];
1103 /* Find the last entry in id_table_combined */
1105 if (id_table_combined
[i
].idVendor
==0) {
1106 id_table_combined
[i
] = usb_dev_temp
[0];
1110 info("Untested USB device specified at time of module insertion");
1111 info("Warning: This is not guaranteed to work");
1112 info("Using a newer kernel is preferred to this method");
1113 info("Adding Palm OS protocol 4.x support for unknown device: 0x%x/0x%x",
1116 retval
= usb_serial_register(&handspring_device
);
1118 goto failed_handspring_register
;
1119 retval
= usb_serial_register(&clie_3_5_device
);
1121 goto failed_clie_3_5_register
;
1122 retval
= usb_serial_register(&clie_5_device
);
1124 goto failed_clie_5_register
;
1125 retval
= usb_register(&visor_driver
);
1127 goto failed_usb_register
;
1128 info(DRIVER_DESC
" " DRIVER_VERSION
);
1131 failed_usb_register
:
1132 usb_serial_deregister(&clie_5_device
);
1133 failed_clie_5_register
:
1134 usb_serial_deregister(&clie_3_5_device
);
1135 failed_clie_3_5_register
:
1136 usb_serial_deregister(&handspring_device
);
1137 failed_handspring_register
:
1142 static void __exit
visor_exit (void)
1144 usb_deregister (&visor_driver
);
1145 usb_serial_deregister (&handspring_device
);
1146 usb_serial_deregister (&clie_3_5_device
);
1147 usb_serial_deregister (&clie_5_device
);
1151 module_init(visor_init
);
1152 module_exit(visor_exit
);
1154 MODULE_AUTHOR( DRIVER_AUTHOR
);
1155 MODULE_DESCRIPTION( DRIVER_DESC
);
1156 MODULE_LICENSE("GPL");
1158 module_param(debug
, bool, S_IRUGO
| S_IWUSR
);
1159 MODULE_PARM_DESC(debug
, "Debug enabled or not");
1160 module_param(stats
, bool, S_IRUGO
| S_IWUSR
);
1161 MODULE_PARM_DESC(stats
, "Enables statistics or not");
1163 module_param(vendor
, ushort
, 0);
1164 MODULE_PARM_DESC(vendor
, "User specified vendor ID");
1165 module_param(product
, ushort
, 0);
1166 MODULE_PARM_DESC(product
, "User specified product ID");