|
@@ -65,6 +65,7 @@ static const struct usb_device_id id_table_earthmate[] = {
|
|
|
static const struct usb_device_id id_table_cyphidcomrs232[] = {
|
|
|
{ USB_DEVICE(VENDOR_ID_CYPRESS, PRODUCT_ID_CYPHIDCOM) },
|
|
|
{ USB_DEVICE(VENDOR_ID_POWERCOM, PRODUCT_ID_UPS) },
|
|
|
+ { USB_DEVICE(VENDOR_ID_FRWD, PRODUCT_ID_CYPHIDCOM_FRWD) },
|
|
|
{ } /* Terminating entry */
|
|
|
};
|
|
|
|
|
@@ -78,6 +79,7 @@ static const struct usb_device_id id_table_combined[] = {
|
|
|
{ USB_DEVICE(VENDOR_ID_DELORME, PRODUCT_ID_EARTHMATEUSB_LT20) },
|
|
|
{ USB_DEVICE(VENDOR_ID_CYPRESS, PRODUCT_ID_CYPHIDCOM) },
|
|
|
{ USB_DEVICE(VENDOR_ID_POWERCOM, PRODUCT_ID_UPS) },
|
|
|
+ { USB_DEVICE(VENDOR_ID_FRWD, PRODUCT_ID_CYPHIDCOM_FRWD) },
|
|
|
{ USB_DEVICE(VENDOR_ID_DAZZLE, PRODUCT_ID_CA42) },
|
|
|
{ } /* Terminating entry */
|
|
|
};
|
|
@@ -229,6 +231,12 @@ static struct usb_serial_driver * const serial_drivers[] = {
|
|
|
* Cypress serial helper functions
|
|
|
*****************************************************************************/
|
|
|
|
|
|
+/* FRWD Dongle hidcom needs to skip reset and speed checks */
|
|
|
+static inline bool is_frwd(struct usb_device *dev)
|
|
|
+{
|
|
|
+ return ((le16_to_cpu(dev->descriptor.idVendor) == VENDOR_ID_FRWD) &&
|
|
|
+ (le16_to_cpu(dev->descriptor.idProduct) == PRODUCT_ID_CYPHIDCOM_FRWD));
|
|
|
+}
|
|
|
|
|
|
static int analyze_baud_rate(struct usb_serial_port *port, speed_t new_rate)
|
|
|
{
|
|
@@ -238,6 +246,10 @@ static int analyze_baud_rate(struct usb_serial_port *port, speed_t new_rate)
|
|
|
if (unstable_bauds)
|
|
|
return new_rate;
|
|
|
|
|
|
+ /* FRWD Dongle uses 115200 bps */
|
|
|
+ if (is_frwd(port->serial->dev))
|
|
|
+ return new_rate;
|
|
|
+
|
|
|
/*
|
|
|
* The general purpose firmware for the Cypress M8 allows for
|
|
|
* a maximum speed of 57600bps (I have no idea whether DeLorme
|
|
@@ -448,7 +460,11 @@ static int cypress_generic_port_probe(struct usb_serial_port *port)
|
|
|
return -ENOMEM;
|
|
|
}
|
|
|
|
|
|
- usb_reset_configuration(serial->dev);
|
|
|
+ /* Skip reset for FRWD device. It is a workaound:
|
|
|
+ device hangs if it receives SET_CONFIGURE in Configured
|
|
|
+ state. */
|
|
|
+ if (!is_frwd(serial->dev))
|
|
|
+ usb_reset_configuration(serial->dev);
|
|
|
|
|
|
priv->cmd_ctrl = 0;
|
|
|
priv->line_control = 0;
|