cypress_m8: Don't issue GET_CONFIG for certain devices
From: Mike Isely <[EMAIL PROTECTED]>
Earthmate LT-20 devices (both "old" and "new" versions) can't tolerate
a GET_CONFIG command. The original Earthmate has no trouble with
this. Presumably other non-Earthmate devices are still OK as well.
This change disables the use of GET_CONFIG for cases where it is known
not to work.
Signed-off-by: Mike Isely <[EMAIL PROTECTED]>
---
cypress_m8.c | 21 +++++++++++++++++++--
1 file changed, 19 insertions(+), 2 deletions(-)
---
diff -uprN -X linux-2.6.23.12-vanilla/Documentation/dontdiff
cypress_patch_02_pkt_fmt/drivers/usb/serial/cypress_m8.c
cypress_patch_03_get_config/drivers/usb/serial/cypress_m8.c
--- cypress_patch_02_pkt_fmt/drivers/usb/serial/cypress_m8.c 2008-02-10
19:36:51.000000000 -0600
+++ cypress_patch_03_get_config/drivers/usb/serial/cypress_m8.c 2008-02-10
19:37:31.000000000 -0600
@@ -143,6 +143,7 @@ struct cypress_private {
__u8 current_config; /* stores the current configuration
byte */
__u8 rx_flags; /* throttling - used from
whiteheat/ftdi_sio */
enum packet_format pkt_fmt; /* format to use for packet send /
receive */
+ int get_cfg_unsafe; /* If true, the CYPRESS_GET_CONFIG
is unsafe */
int baud_rate; /* stores current baud rate in
integer form */
int cbr_mask; /* stores current baud rate in
masked form */
int isthrottled; /* if throttled, discard reads */
@@ -395,6 +396,12 @@ static int cypress_serial_control (struc
}
break;
case CYPRESS_GET_CONFIG:
+ if (priv->get_cfg_unsafe) {
+ /* Not implemented for this device,
+ and if we try to do it we're likely
+ to crash the hardware. */
+ return -ENOTTY;
+ }
dbg("%s - retreiving serial line settings",
__FUNCTION__);
/* set initial values in feature buffer */
memset(feature_buffer, 0, sizeof(feature_buffer));
@@ -560,20 +567,30 @@ static int generic_startup (struct usb_s
static int cypress_earthmate_startup (struct usb_serial *serial)
{
struct cypress_private *priv;
+ struct usb_serial_port *port = serial->port[0];
dbg("%s", __FUNCTION__);
if (generic_startup(serial)) {
dbg("%s - Failed setting up port %d", __FUNCTION__,
- serial->port[0]->number);
+ port->number);
return 1;
}
- priv = usb_get_serial_port_data(serial->port[0]);
+ priv = usb_get_serial_port_data(port);
priv->chiptype = CT_EARTHMATE;
/* All Earthmate devices use the separated-count packet
format! Idiotic. */
priv->pkt_fmt = packet_format_1;
+ if (serial->dev->descriptor.idProduct != PRODUCT_ID_EARTHMATEUSB) {
+ /* The old original USB Earthmate seemed able to
+ handle GET_CONFIG requests; everything they've
+ produced since that time crashes if this command is
+ attempted :-( */
+ dbg("%s - Marking this device as unsafe for GET_CONFIG
commands",
+ __FUNCTION__);
+ priv->get_cfg_unsafe = !0;
+ }
return 0;
} /* cypress_earthmate_startup */
--
| Mike Isely | PGP fingerprint
Spammers Die!! | | 03 54 43 4D 75 E5 CC 92
| isely @ pobox (dot) com | 71 16 01 E2 B5 F5 C1 E8
| |
-
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at http://vger.kernel.org/majordomo-info.html