patch-2.4.10 linux/drivers/usb/serial/visor.c
Next file: linux/drivers/usb/serial/visor.h
Previous file: linux/drivers/usb/serial/usbserial.c
Back to the patch index
Back to the overall index
- Lines: 251
- Date:
Fri Sep 14 14:04:07 2001
- Orig file:
v2.4.9/linux/drivers/usb/serial/visor.c
- Orig date:
Tue Jul 3 17:08:21 2001
diff -u --recursive --new-file v2.4.9/linux/drivers/usb/serial/visor.c linux/drivers/usb/serial/visor.c
@@ -1,5 +1,6 @@
/*
- * USB HandSpring Visor driver
+ * USB HandSpring Visor, Palm m50x, and Sony Clie driver
+ * (supports all of the Palm OS USB devices)
*
* Copyright (C) 1999 - 2001
* Greg Kroah-Hartman (greg@kroah.com)
@@ -11,6 +12,13 @@
*
* See Documentation/usb/usb-serial.txt for more information on using this driver
*
+ * (08/30/2001) gkh
+ * Added support for the Clie devices, both the 3.5 and 4.0 os versions.
+ * Many thanks to Daniel Burke, and Bryan Payne for helping with this.
+ *
+ * (08/23/2001) gkh
+ * fixed a few potential bugs pointed out by Oliver Neukum.
+ *
* (05/30/2001) gkh
* switched from using spinlock to a semaphore, which fixes lots of problems.
*
@@ -115,11 +123,9 @@
/*
* Version Information
*/
-#define DRIVER_VERSION "v1.2"
+#define DRIVER_VERSION "v1.4"
#define DRIVER_AUTHOR "Greg Kroah-Hartman <greg@kroah.com>"
-#define DRIVER_DESC "USB HandSpring Visor driver"
-
-#define MIN(a,b) (((a)<(b))?(a):(b))
+#define DRIVER_DESC "USB HandSpring Visor, Palm m50x, Sony Clie driver"
/* function prototypes for a handspring visor */
static int visor_open (struct usb_serial_port *port, struct file *filp);
@@ -152,11 +158,22 @@
{ } /* Terminating entry */
};
+static __devinitdata struct usb_device_id clie_id_3_5_table [] = {
+ { USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_3_5_ID) },
+ { } /* Terminating entry */
+};
+
+static __devinitdata struct usb_device_id clie_id_4_0_table [] = {
+ { USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_4_0_ID) },
+ { } /* Terminating entry */
+};
static __devinitdata struct usb_device_id id_table [] = {
{ USB_DEVICE(HANDSPRING_VENDOR_ID, HANDSPRING_VISOR_ID) },
{ USB_DEVICE(PALM_VENDOR_ID, PALM_M500_ID) },
{ USB_DEVICE(PALM_VENDOR_ID, PALM_M505_ID) },
+ { USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_3_5_ID) },
+ { USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_4_0_ID) },
{ } /* Terminating entry */
};
@@ -242,6 +259,56 @@
read_bulk_callback: visor_read_bulk_callback,
};
+/* device info for the Sony Clie OS version 3.5 */
+static struct usb_serial_device_type clie_3_5_device = {
+ name: "Sony Clie 3.5",
+ id_table: clie_id_3_5_table,
+ needs_interrupt_in: MUST_HAVE_NOT, /* this device must not have an interrupt in endpoint */
+ needs_bulk_in: MUST_HAVE, /* this device must have a bulk in endpoint */
+ needs_bulk_out: MUST_HAVE, /* this device must have a bulk out endpoint */
+ num_interrupt_in: 0,
+ num_bulk_in: 1,
+ num_bulk_out: 1,
+ num_ports: 1,
+ open: visor_open,
+ close: visor_close,
+ throttle: visor_throttle,
+ unthrottle: visor_unthrottle,
+ ioctl: visor_ioctl,
+ set_termios: visor_set_termios,
+ write: visor_write,
+ write_room: visor_write_room,
+ chars_in_buffer: visor_chars_in_buffer,
+ write_bulk_callback: visor_write_bulk_callback,
+ read_bulk_callback: visor_read_bulk_callback,
+};
+
+/* device info for the Sony Clie OS version 4.0 */
+static struct usb_serial_device_type clie_4_0_device = {
+ name: "Sony Clie 4.0",
+ id_table: clie_id_4_0_table,
+ needs_interrupt_in: MUST_HAVE_NOT, /* this device must not have an interrupt in endpoint */
+ needs_bulk_in: MUST_HAVE, /* this device must have a bulk in endpoint */
+ needs_bulk_out: MUST_HAVE, /* this device must have a bulk out endpoint */
+ num_interrupt_in: 0,
+ num_bulk_in: 2,
+ num_bulk_out: 2,
+ num_ports: 2,
+ open: visor_open,
+ close: visor_close,
+ throttle: visor_throttle,
+ unthrottle: visor_unthrottle,
+ startup: visor_startup,
+ shutdown: visor_shutdown,
+ ioctl: visor_ioctl,
+ set_termios: visor_set_termios,
+ write: visor_write,
+ write_room: visor_write_room,
+ chars_in_buffer: visor_chars_in_buffer,
+ write_bulk_callback: visor_write_bulk_callback,
+ read_bulk_callback: visor_read_bulk_callback,
+};
+
#define NUM_URBS 24
#define URB_TRANSFER_BUFFER_SIZE 768
static struct urb *write_urb_pool[NUM_URBS];
@@ -351,8 +418,6 @@
dbg(__FUNCTION__ " - port %d", port->number);
- usb_serial_debug_data (__FILE__, __FUNCTION__, count, buf);
-
while (count > 0) {
/* try to find a free urb in our list of them */
urb = NULL;
@@ -376,12 +441,18 @@
}
}
- transfer_size = MIN (count, URB_TRANSFER_BUFFER_SIZE);
- if (from_user)
- copy_from_user (urb->transfer_buffer, current_position, transfer_size);
- else
+ transfer_size = min (count, URB_TRANSFER_BUFFER_SIZE);
+ if (from_user) {
+ if (copy_from_user (urb->transfer_buffer, current_position, transfer_size)) {
+ bytes_sent = -EFAULT;
+ break;
+ }
+ } else {
memcpy (urb->transfer_buffer, current_position, transfer_size);
-
+ }
+
+ usb_serial_debug_data (__FILE__, __FUNCTION__, transfer_size, urb->transfer_buffer);
+
/* build up our urb */
FILL_BULK_URB (urb, serial->dev, usb_sndbulkpipe(serial->dev, port->bulk_out_endpointAddress),
urb->transfer_buffer, transfer_size, visor_write_bulk_callback, port);
@@ -389,8 +460,11 @@
/* send it down the pipe */
status = usb_submit_urb(urb);
- if (status)
- dbg(__FUNCTION__ " - usb_submit_urb(write bulk) failed with status = %d", status);
+ if (status) {
+ err(__FUNCTION__ " - usb_submit_urb(write bulk) failed with status = %d", status);
+ bytes_sent = status;
+ break;
+ }
current_position += transfer_size;
bytes_sent += transfer_size;
@@ -567,10 +641,6 @@
return -ENOMEM;
}
- /* force debugging on for the palm devices for now */
- if (serial->dev->descriptor.idVendor == PALM_VENDOR_ID)
- debug = 1;
-
dbg(__FUNCTION__);
dbg(__FUNCTION__ " - Set config to 1");
@@ -612,8 +682,9 @@
}
}
- if (serial->dev->descriptor.idVendor == PALM_VENDOR_ID) {
- /* Palm USB Hack */
+ if ((serial->dev->descriptor.idVendor == PALM_VENDOR_ID) ||
+ (serial->dev->descriptor.idVendor == SONY_VENDOR_ID)) {
+ /* Palm OS 4.0 Hack */
response = usb_control_msg (serial->dev, usb_rcvctrlpipe(serial->dev, 0),
PALM_GET_SOME_UNKNOWN_INFORMATION,
0xc2, 0x0000, 0x0000, transfer_buffer,
@@ -674,10 +745,16 @@
/* This function is all nice and good, but we don't change anything based on it :) */
static void visor_set_termios (struct usb_serial_port *port, struct termios *old_termios)
{
- unsigned int cflag = port->tty->termios->c_cflag;
+ unsigned int cflag;
dbg(__FUNCTION__ " - port %d", port->number);
+ if ((!port->tty) || (!port->tty->termios)) {
+ dbg(__FUNCTION__" - no tty structures");
+ return;
+ }
+
+ cflag = port->tty->termios->c_cflag;
/* check that they really want us to change something */
if (old_termios) {
if ((cflag == old_termios->c_cflag) &&
@@ -687,11 +764,6 @@
}
}
- if ((!port->tty) || (!port->tty->termios)) {
- dbg(__FUNCTION__" - no tty structures");
- return;
- }
-
/* get the byte size */
switch (cflag & CSIZE) {
case CS5: dbg(__FUNCTION__ " - data bits = 5"); break;
@@ -744,6 +816,8 @@
usb_serial_register (&handspring_device);
usb_serial_register (&palm_m500_device);
usb_serial_register (&palm_m505_device);
+ usb_serial_register (&clie_3_5_device);
+ usb_serial_register (&clie_4_0_device);
/* create our write urb pool and transfer buffers */
spin_lock_init (&write_urb_pool_lock);
@@ -763,7 +837,7 @@
}
}
- info(DRIVER_VERSION ":" DRIVER_DESC);
+ info(DRIVER_DESC " " DRIVER_VERSION);
return 0;
}
@@ -777,6 +851,8 @@
usb_serial_deregister (&handspring_device);
usb_serial_deregister (&palm_m500_device);
usb_serial_deregister (&palm_m505_device);
+ usb_serial_deregister (&clie_3_5_device);
+ usb_serial_deregister (&clie_4_0_device);
spin_lock_irqsave (&write_urb_pool_lock, flags);
@@ -801,6 +877,7 @@
MODULE_AUTHOR( DRIVER_AUTHOR );
MODULE_DESCRIPTION( DRIVER_DESC );
+MODULE_LICENSE("GPL");
MODULE_PARM(debug, "i");
MODULE_PARM_DESC(debug, "Debug enabled or not");
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)