|
@@ -112,6 +112,7 @@ struct imon_context {
|
|
|
bool tx_control;
|
|
|
unsigned char usb_rx_buf[8];
|
|
|
unsigned char usb_tx_buf[8];
|
|
|
+ unsigned int send_packet_delay;
|
|
|
|
|
|
struct tx_t {
|
|
|
unsigned char data_buf[35]; /* user data buffer */
|
|
@@ -185,6 +186,10 @@ enum {
|
|
|
IMON_KEY_PANEL = 2,
|
|
|
};
|
|
|
|
|
|
+enum {
|
|
|
+ IMON_NEED_20MS_PKT_DELAY = 1
|
|
|
+};
|
|
|
+
|
|
|
/*
|
|
|
* USB Device ID for iMON USB Control Boards
|
|
|
*
|
|
@@ -215,7 +220,7 @@ static struct usb_device_id imon_usb_id_table[] = {
|
|
|
/* SoundGraph iMON OEM Touch LCD (IR & 4.3" VGA LCD) */
|
|
|
{ USB_DEVICE(0x15c2, 0x0035) },
|
|
|
/* SoundGraph iMON OEM VFD (IR & VFD) */
|
|
|
- { USB_DEVICE(0x15c2, 0x0036) },
|
|
|
+ { USB_DEVICE(0x15c2, 0x0036), .driver_info = IMON_NEED_20MS_PKT_DELAY },
|
|
|
/* device specifics unknown */
|
|
|
{ USB_DEVICE(0x15c2, 0x0037) },
|
|
|
/* SoundGraph iMON OEM LCD (IR & LCD) */
|
|
@@ -535,12 +540,12 @@ static int send_packet(struct imon_context *ictx)
|
|
|
kfree(control_req);
|
|
|
|
|
|
/*
|
|
|
- * Induce a mandatory 5ms delay before returning, as otherwise,
|
|
|
+ * Induce a mandatory delay before returning, as otherwise,
|
|
|
* send_packet can get called so rapidly as to overwhelm the device,
|
|
|
* particularly on faster systems and/or those with quirky usb.
|
|
|
*/
|
|
|
- timeout = msecs_to_jiffies(5);
|
|
|
- set_current_state(TASK_UNINTERRUPTIBLE);
|
|
|
+ timeout = msecs_to_jiffies(ictx->send_packet_delay);
|
|
|
+ set_current_state(TASK_INTERRUPTIBLE);
|
|
|
schedule_timeout(timeout);
|
|
|
|
|
|
return retval;
|
|
@@ -2335,6 +2340,10 @@ static int imon_probe(struct usb_interface *interface,
|
|
|
|
|
|
}
|
|
|
|
|
|
+ /* default send_packet delay is 5ms but some devices need more */
|
|
|
+ ictx->send_packet_delay = id->driver_info & IMON_NEED_20MS_PKT_DELAY ?
|
|
|
+ 20 : 5;
|
|
|
+
|
|
|
usb_set_intfdata(interface, ictx);
|
|
|
|
|
|
if (ifnum == 0) {
|