ChangeSet 1.889.26.4, 2003/01/10 11:28:45-08:00, [EMAIL PROTECTED]
[PATCH] USB visor: Split up the initialization command logic to handle different
device types better.
diff -Nru a/drivers/usb/serial/visor.c b/drivers/usb/serial/visor.c
--- a/drivers/usb/serial/visor.c Mon Jan 13 14:28:01 2003
+++ b/drivers/usb/serial/visor.c Mon Jan 13 14:28:01 2003
@@ -177,24 +177,40 @@
static void visor_read_bulk_callback (struct urb *urb, struct pt_regs *regs);
static void visor_read_int_callback (struct urb *urb, struct pt_regs *regs);
static int clie_3_5_startup (struct usb_serial *serial);
+static int palm_os_3_probe (struct usb_serial *serial, const struct usb_device_id
+*id);
+static int palm_os_4_probe (struct usb_serial *serial, const struct usb_device_id
+*id);
static struct usb_device_id id_table [] = {
- { USB_DEVICE(PALM_VENDOR_ID, PALM_M500_ID) },
- { USB_DEVICE(PALM_VENDOR_ID, PALM_M505_ID) },
- { USB_DEVICE(PALM_VENDOR_ID, PALM_M515_ID) },
- { USB_DEVICE(PALM_VENDOR_ID, PALM_I705_ID) },
- { USB_DEVICE(PALM_VENDOR_ID, PALM_M125_ID) },
- { USB_DEVICE(PALM_VENDOR_ID, PALM_M130_ID) },
- { USB_DEVICE(PALM_VENDOR_ID, PALM_TUNGSTEN_T_ID) },
- { USB_DEVICE(PALM_VENDOR_ID, PALM_TUNGSTEN_Z_ID) },
- { USB_DEVICE(PALM_VENDOR_ID, PALM_ZIRE_ID) },
- { USB_DEVICE(HANDSPRING_VENDOR_ID, HANDSPRING_VISOR_ID) },
- { USB_DEVICE(HANDSPRING_VENDOR_ID, HANDSPRING_TREO_ID) },
- { USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_4_0_ID) },
- { USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_S360_ID) },
+ { USB_DEVICE(HANDSPRING_VENDOR_ID, HANDSPRING_VISOR_ID),
+ .driver_info = (unsigned int)&palm_os_3_probe },
+ { USB_DEVICE(HANDSPRING_VENDOR_ID, HANDSPRING_TREO_ID),
+ .driver_info = (unsigned int)&palm_os_4_probe },
+ { USB_DEVICE(PALM_VENDOR_ID, PALM_M500_ID),
+ .driver_info = (unsigned int)&palm_os_4_probe },
+ { USB_DEVICE(PALM_VENDOR_ID, PALM_M505_ID),
+ .driver_info = (unsigned int)&palm_os_4_probe },
+ { USB_DEVICE(PALM_VENDOR_ID, PALM_M515_ID),
+ .driver_info = (unsigned int)&palm_os_4_probe },
+ { USB_DEVICE(PALM_VENDOR_ID, PALM_I705_ID),
+ .driver_info = (unsigned int)&palm_os_4_probe },
+ { USB_DEVICE(PALM_VENDOR_ID, PALM_M125_ID),
+ .driver_info = (unsigned int)&palm_os_4_probe },
+ { USB_DEVICE(PALM_VENDOR_ID, PALM_M130_ID),
+ .driver_info = (unsigned int)&palm_os_4_probe },
+ { USB_DEVICE(PALM_VENDOR_ID, PALM_TUNGSTEN_T_ID),
+ .driver_info = (unsigned int)&palm_os_4_probe },
+ { USB_DEVICE(PALM_VENDOR_ID, PALM_TUNGSTEN_Z_ID),
+ .driver_info = (unsigned int)&palm_os_4_probe },
+ { USB_DEVICE(PALM_VENDOR_ID, PALM_ZIRE_ID),
+ .driver_info = (unsigned int)&palm_os_4_probe },
+ { USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_4_0_ID),
+ .driver_info = (unsigned int)&palm_os_4_probe },
+ { USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_S360_ID),
+ .driver_info = (unsigned int)&palm_os_4_probe },
{ USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_4_1_ID) },
- { USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_NX60_ID) },
+ { USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_NX60_ID),
+ .driver_info = (unsigned int)&palm_os_4_probe },
{ } /* Terminating entry */
};
@@ -600,99 +616,143 @@
dev_err(&port->dev, "%s - failed submitting read urb, error %d\n",
__FUNCTION__, result);
}
-static int visor_probe (struct usb_serial *serial, const struct usb_device_id *id)
+static int palm_os_3_probe (struct usb_serial *serial, const struct usb_device_id *id)
{
struct device *dev = &serial->dev->dev;
- int response;
+ struct visor_connection_info *connection_info;
+ unsigned char *transfer_buffer;
+ char *string;
+ int retval = 0;
int i;
int num_ports;
- unsigned char *transfer_buffer = kmalloc (256, GFP_KERNEL);
+ dbg("%s", __FUNCTION__);
+
+ transfer_buffer = kmalloc (sizeof (*connection_info), GFP_KERNEL);
if (!transfer_buffer) {
- dev_err(dev, "%s - kmalloc(%d) failed.\n", __FUNCTION__, 256);
+ dev_err(dev, "%s - kmalloc(%d) failed.\n", __FUNCTION__,
+ sizeof(*connection_info));
return -ENOMEM;
}
- dbg("%s", __FUNCTION__);
-
- dbg("%s - Set config to 1", __FUNCTION__);
- usb_set_configuration (serial->dev, 1);
-
/* send a get connection info request */
- response = usb_control_msg (serial->dev, usb_rcvctrlpipe(serial->dev, 0),
VISOR_GET_CONNECTION_INFORMATION,
- 0xc2, 0x0000, 0x0000, transfer_buffer, 0x12,
300);
- if (response < 0) {
- dev_err(dev, "%s - error getting connection information\n",
__FUNCTION__);
- } else {
- struct visor_connection_info *connection_info = (struct
visor_connection_info *)transfer_buffer;
- char *string;
-
- le16_to_cpus(&connection_info->num_ports);
- num_ports = connection_info->num_ports;
- dev_info(dev, "%s: Number of ports: %d\n", serial->type->name,
connection_info->num_ports);
- for (i = 0; i < num_ports; ++i) {
- switch (connection_info->connections[i].port_function_id) {
- case VISOR_FUNCTION_GENERIC:
- string = "Generic";
- break;
- case VISOR_FUNCTION_DEBUGGER:
- string = "Debugger";
- break;
- case VISOR_FUNCTION_HOTSYNC:
- string = "HotSync";
- break;
- case VISOR_FUNCTION_CONSOLE:
- string = "Console";
- break;
- case VISOR_FUNCTION_REMOTE_FILE_SYS:
- string = "Remote File System";
- break;
- default:
- string = "unknown";
- break;
- }
- dev_info(dev, "%s: port %d, is for %s use\n",
serial->type->name,
- connection_info->connections[i].port, string);
- /* save off our num_ports info so that we can use it in the
calc_num_ports call */
- usb_set_serial_data(serial, (void *)(long)num_ports);
- }
+ retval = usb_control_msg (serial->dev,
+ usb_rcvctrlpipe(serial->dev, 0),
+ VISOR_GET_CONNECTION_INFORMATION,
+ 0xc2, 0x0000, 0x0000, transfer_buffer,
+ sizeof(*connection_info), 300);
+ if (retval < 0) {
+ dev_err(dev, "%s - error %d getting connection information\n",
+ __FUNCTION__, retval);
+ goto exit;
}
+
+ connection_info = (struct visor_connection_info *)transfer_buffer;
- if ((serial->dev->descriptor.idVendor == PALM_VENDOR_ID) ||
- ((serial->dev->descriptor.idVendor == SONY_VENDOR_ID) &&
- (serial->dev->descriptor.idProduct != SONY_CLIE_4_1_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,
- 0x14, 300);
- if (response < 0) {
- dev_err(dev, "%s - error getting first unknown palm
command\n", __FUNCTION__);
- } else {
- usb_serial_debug_data (__FILE__, __FUNCTION__, 0x14,
transfer_buffer);
- }
- response = usb_control_msg (serial->dev, usb_rcvctrlpipe(serial->dev,
0),
- PALM_GET_SOME_UNKNOWN_INFORMATION,
- 0xc2, 0x0000, 0x0000, transfer_buffer,
- 0x14, 300);
- if (response < 0) {
- dev_err(dev, "%s - error getting second unknown palm
command\n", __FUNCTION__);
- } else {
- usb_serial_debug_data (__FILE__, __FUNCTION__, 0x14,
transfer_buffer);
+ le16_to_cpus(&connection_info->num_ports);
+ num_ports = connection_info->num_ports;
+ /* handle devices that report invalid stuff here */
+ if (num_ports > 2)
+ num_ports = 2;
+ dev_info(dev, "%s: Number of ports: %d\n", serial->type->name,
+ connection_info->num_ports);
+
+ for (i = 0; i < num_ports; ++i) {
+ switch (connection_info->connections[i].port_function_id) {
+ case VISOR_FUNCTION_GENERIC:
+ string = "Generic";
+ break;
+ case VISOR_FUNCTION_DEBUGGER:
+ string = "Debugger";
+ break;
+ case VISOR_FUNCTION_HOTSYNC:
+ string = "HotSync";
+ break;
+ case VISOR_FUNCTION_CONSOLE:
+ string = "Console";
+ break;
+ case VISOR_FUNCTION_REMOTE_FILE_SYS:
+ string = "Remote File System";
+ break;
+ default:
+ string = "unknown";
+ break;
}
+ dev_info(dev, "%s: port %d, is for %s use\n", serial->type->name,
+ connection_info->connections[i].port, string);
}
+ /*
+ * save off our num_ports info so that we can use it in the
+ * calc_num_ports callback
+ */
+ usb_set_serial_data(serial, (void *)(long)num_ports);
+
/* ask for the number of bytes available, but ignore the response as it is
broken */
- response = usb_control_msg (serial->dev, usb_rcvctrlpipe(serial->dev, 0),
VISOR_REQUEST_BYTES_AVAILABLE,
- 0xc2, 0x0000, 0x0005, transfer_buffer, 0x02,
300);
- if (response < 0) {
- dev_err(dev, "%s - error getting bytes available request\n",
__FUNCTION__);
- }
+ retval = usb_control_msg (serial->dev,
+ usb_rcvctrlpipe(serial->dev, 0),
+ VISOR_REQUEST_BYTES_AVAILABLE,
+ 0xc2, 0x0000, 0x0005, transfer_buffer,
+ 0x02, 300);
+ if (retval < 0)
+ dev_err(dev, "%s - error %d getting bytes available request\n",
+ __FUNCTION__, retval);
+ retval = 0;
+exit:
kfree (transfer_buffer);
- /* continue on with initialization */
+ return retval;
+}
+
+static int palm_os_4_probe (struct usb_serial *serial, const struct usb_device_id *id)
+{
+ struct device *dev = &serial->dev->dev;
+ struct palm_ext_connection_info *connection_info;
+ unsigned char *transfer_buffer;
+ int retval;
+
+ dbg("%s", __FUNCTION__);
+
+ transfer_buffer = kmalloc (sizeof (*connection_info), GFP_KERNEL);
+ if (!transfer_buffer) {
+ dev_err(dev, "%s - kmalloc(%d) failed.\n", __FUNCTION__,
+ sizeof(*connection_info));
+ return -ENOMEM;
+ }
+
+ retval = usb_control_msg (serial->dev,
+ usb_rcvctrlpipe(serial->dev, 0),
+ PALM_GET_EXT_CONNECTION_INFORMATION,
+ 0xc2, 0x0000, 0x0000, transfer_buffer,
+ sizeof (*connection_info), 300);
+ if (retval < 0)
+ dev_err(dev, "%s - error %d getting connection info\n",
+ __FUNCTION__, retval);
+ else
+ usb_serial_debug_data (__FILE__, __FUNCTION__, 0x14, transfer_buffer);
+
+ kfree (transfer_buffer);
return 0;
+}
+
+
+static int visor_probe (struct usb_serial *serial, const struct usb_device_id *id)
+{
+ int retval = 0;
+ int (*startup) (struct usb_serial *serial, const struct usb_device_id *id);
+
+ dbg("%s", __FUNCTION__);
+
+ dbg("%s - Set config to 1", __FUNCTION__);
+ usb_set_configuration (serial->dev, 1);
+
+ if (id->driver_info) {
+ startup = (void *)id->driver_info;
+ retval = startup(serial, id);
+ }
+
+ return retval;
}
static int visor_calc_num_ports (struct usb_serial *serial)
-------------------------------------------------------
This SF.NET email is sponsored by: FREE SSL Guide from Thawte
are you planning your Web Server Security? Click here to get a FREE
Thawte SSL guide and find the answers to all your SSL security issues.
http://ads.sourceforge.net/cgi-bin/redirect.pl?thaw0026en
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel