# This is a BitKeeper generated patch for the following project:
# Project Name: Linux kernel tree
# This patch format is intended for GNU patch command version 2.5 or higher.
# This patch includes the following deltas:
# ChangeSet 1.563 -> 1.564
# drivers/usb/serial/keyspan.c 1.26 -> 1.27
#
# The following is the BitKeeper ChangeSet Log
# --------------------------------------------
# 02/04/25 [EMAIL PROTECTED] 1.564
# USB keyspan driver patch that fixes lots of different problems.
#
# - Modified port open, port close, and send setup() logic to fix various data
and endpoint
# synchronization bugs and device LED status bugs.
# - Changed keyspan_write_room() to accurately return transmit buffer
availability.
# - Changed forwardingLength from 1 to 16 for all adapters.
# --------------------------------------------
#
diff -Nru a/drivers/usb/serial/keyspan.c b/drivers/usb/serial/keyspan.c
--- a/drivers/usb/serial/keyspan.c Thu Apr 25 16:26:51 2002
+++ b/drivers/usb/serial/keyspan.c Thu Apr 25 16:26:51 2002
@@ -28,6 +28,14 @@
Change History
+ Wed Apr 25 12:00:00 PST 2002 (Keyspan)
+ Started with Hugh Blemings' code dated Jan 17, 2002. All adapters
+ now supported (including QI and QW). Modified port open, port
+ close, and send setup() logic to fix various data and endpoint
+ synchronization bugs and device LED status bugs. Changed keyspan_
+ write_room() to accurately return transmit buffer availability.
+ Changed forwardingLength from 1 to 16 for all adapters.
+
Fri Oct 12 16:45:00 EST 2001
Preliminary USA-19QI and USA-28 support (both test OK for me, YMMV)
@@ -98,7 +106,7 @@
/*
* Version Information
*/
-#define DRIVER_VERSION "v1.1.2"
+#define DRIVER_VERSION "v1.1.3"
#define DRIVER_AUTHOR "Hugh Blemings <[EMAIL PROTECTED]"
#define DRIVER_DESC "Keyspan USB to Serial Converter Driver"
@@ -423,9 +431,10 @@
/* Resubmit urb so we continue receiving */
urb->dev = port->serial->dev;
- if ((err = usb_submit_urb(urb, GFP_ATOMIC)) != 0) {
- dbg("%s - resubmit read urb failed. (%d)", __FUNCTION__, err);
- }
+ if (port->open_count)
+ if ((err = usb_submit_urb(urb, GFP_ATOMIC)) != 0) {
+ dbg("%s - resubmit read urb failed. (%d)", __FUNCTION__, err);
+ }
return;
}
@@ -461,7 +470,7 @@
if (p_priv->resend_cont) {
dbg ("%s - sending setup", __FUNCTION__);
- keyspan_usa26_send_setup(port->serial, port, 0);
+ keyspan_usa26_send_setup(port->serial, port, p_priv->resend_cont - 1);
}
}
@@ -519,12 +528,12 @@
/* wake_up_interruptible(&p_priv->open_wait); */
}
-exit:
/* Resubmit urb so we continue receiving */
urb->dev = serial->dev;
if ((err = usb_submit_urb(urb, GFP_ATOMIC)) != 0) {
dbg("%s - resubmit read urb failed. (%d)", __FUNCTION__, err);
}
+exit:
}
static void usa26_glocont_callback(struct urb *urb)
@@ -572,9 +581,10 @@
/* Resubmit urb so we continue receiving */
urb->dev = port->serial->dev;
- if ((err = usb_submit_urb(urb, GFP_ATOMIC)) != 0) {
- dbg("%s - resubmit read urb failed. (%d)", __FUNCTION__, err);
- }
+ if (port->open_count)
+ if ((err = usb_submit_urb(urb, GFP_ATOMIC)) != 0) {
+ dbg("%s - resubmit read urb failed. (%d)",
+__FUNCTION__, err);
+ }
p_priv->in_flip ^= 1;
urb = p_priv->in_urbs[p_priv->in_flip];
@@ -596,7 +606,7 @@
if (p_priv->resend_cont) {
dbg ("%s - sending setup", __FUNCTION__);
- keyspan_usa28_send_setup(port->serial, port, 0);
+ keyspan_usa28_send_setup(port->serial, port, p_priv->resend_cont - 1);
}
}
@@ -653,12 +663,12 @@
/* wake_up_interruptible(&p_priv->open_wait); */
}
-exit:
/* Resubmit urb so we continue receiving */
urb->dev = serial->dev;
if ((err = usb_submit_urb(urb, GFP_ATOMIC)) != 0) {
dbg("%s - resubmit read urb failed. (%d)", __FUNCTION__, err);
}
+exit:
}
static void usa28_glocont_callback(struct urb *urb)
@@ -683,7 +693,7 @@
if (p_priv->resend_cont) {
dbg ("%s - sending setup", __FUNCTION__);
- keyspan_usa49_send_setup(serial, port, 0);
+ keyspan_usa49_send_setup(serial, port, p_priv->resend_cont -
+1);
break;
}
}
@@ -745,13 +755,13 @@
/* wake_up_interruptible(&p_priv->open_wait); */
}
-exit:
/* Resubmit urb so we continue receiving */
urb->dev = serial->dev;
if ((err = usb_submit_urb(urb, GFP_ATOMIC)) != 0) {
dbg("%s - resubmit read urb failed. (%d)", __FUNCTION__, err);
}
+exit:
}
static void usa49_inack_callback(struct urb *urb)
@@ -805,9 +815,10 @@
/* Resubmit urb so we continue receiving */
urb->dev = port->serial->dev;
- if ((err = usb_submit_urb(urb, GFP_ATOMIC)) != 0) {
- dbg("%s - resubmit read urb failed. (%d)", __FUNCTION__, err);
- }
+ if (port->open_count)
+ if ((err = usb_submit_urb(urb, GFP_ATOMIC)) != 0) {
+ dbg("%s - resubmit read urb failed. (%d)", __FUNCTION__, err);
+ }
}
/* not used, usa-49 doesn't have per-port control endpoints */
@@ -820,9 +831,27 @@
static int keyspan_write_room (struct usb_serial_port *port)
{
+ struct keyspan_port_private *p_priv;
+ const struct keyspan_device_details *d_details;
+ int flip;
+ struct urb *this_urb;
+
dbg("%s", __FUNCTION__);
- return (32);
+ p_priv = (struct keyspan_port_private *)(port->private);
+ d_details = p_priv->device_details;
+
+ flip = p_priv->out_flip;
+ /* Check both endpoints to see if any are available. */
+ if ((this_urb = p_priv->out_urbs[flip]) != 0) {
+ if (this_urb->status != -EINPROGRESS)
+ return (63);
+ flip = (flip + 1) & d_details->outdat_endp_flip;
+ if ((this_urb = p_priv->out_urbs[flip]) != 0)
+ if (this_urb->status != -EINPROGRESS)
+ return (63);
+ }
+ return (0);
}
@@ -873,7 +902,7 @@
if ((urb = p_priv->out_urbs[i]) == NULL)
continue;
urb->dev = serial->dev;
- usb_settoggle(urb->dev, usb_pipeendpoint(urb->pipe),
usb_pipeout(urb->pipe), 0);
+ /* usb_settoggle(urb->dev, usb_pipeendpoint(urb->pipe),
+usb_pipeout(urb->pipe), 0); */
}
keyspan_send_setup(port, 1);
@@ -909,8 +938,12 @@
p_priv->rts_state = 0;
p_priv->dtr_state = 0;
- if (serial->dev)
- keyspan_send_setup(port, 1);
+ if (serial->dev) {
+ keyspan_send_setup(port, 2);
+ /* pilot-xfer seems to work best with this delay */
+ mdelay(100);
+ keyspan_set_termios(port, NULL);
+ }
/*while (p_priv->outcont_urb->status == -EINPROGRESS) {
dbg("%s - urb in progress", __FUNCTION__);
@@ -922,7 +955,7 @@
if (serial->dev) {
/* Stop reading/writing urbs */
stop_urb(p_priv->inack_urb);
- stop_urb(p_priv->outcont_urb);
+ /* stop_urb(p_priv->outcont_urb); */
for (i = 0; i < 2; i++) {
stop_urb(p_priv->in_urbs[i]);
stop_urb(p_priv->out_urbs[i]);
@@ -1365,7 +1398,10 @@
return -1;
}
- p_priv->resend_cont = 1;
+ /* Save reset port val for resend.
+ Don't overwrite resend for close condition. */
+ if (p_priv->resend_cont != 3)
+ p_priv->resend_cont = reset_port + 1;
if (this_urb->status == -EINPROGRESS) {
/* dbg ("%s - already writing", __FUNCTION__); */
return(-1);
@@ -1414,12 +1450,26 @@
msg.ctsFlowControl = (p_priv->flow_control == flow_cts);
msg.xonFlowControl = 0;
msg.setFlowControl = 0xff;
-
- msg.forwardingLength = 1;
+ msg.forwardingLength = 16;
msg.xonChar = 17;
msg.xoffChar = 19;
- if (reset_port) {
+ /* Opening port */
+ if (reset_port == 1) {
+ msg._txOn = 1;
+ msg._txOff = 0;
+ msg.txFlush = 0;
+ msg.txBreak = 0;
+ msg.rxOn = 1;
+ msg.rxOff = 0;
+ msg.rxFlush = 1;
+ msg.rxForward = 0;
+ msg.returnStatus = 0;
+ msg.resetDataToggle = 0xff;
+ }
+
+ /* Closing port */
+ else if (reset_port == 2) {
msg._txOn = 0;
msg._txOff = 1;
msg.txFlush = 0;
@@ -1429,14 +1479,16 @@
msg.rxFlush = 1;
msg.rxForward = 0;
msg.returnStatus = 0;
- msg.resetDataToggle = 0xff;
+ msg.resetDataToggle = 0;
}
+
+ /* Sending intermediate configs */
else {
msg._txOn = (! p_priv->break_on);
msg._txOff = 0;
msg.txFlush = 0;
msg.txBreak = (p_priv->break_on);
- msg.rxOn = 1;
+ msg.rxOn = 0;
msg.rxOff = 0;
msg.rxFlush = 0;
msg.rxForward = 0;
@@ -1496,7 +1548,10 @@
return -1;
}
- p_priv->resend_cont = 1;
+ /* Save reset port val for resend.
+ Don't overwrite resend for close condition. */
+ if (p_priv->resend_cont != 3)
+ p_priv->resend_cont = reset_port + 1;
if (this_urb->status == -EINPROGRESS) {
dbg ("%s already writing", __FUNCTION__);
return(-1);
@@ -1522,7 +1577,7 @@
msg.rts = p_priv->rts_state;
msg.dtr = p_priv->dtr_state;
- msg.forwardingLength = 1;
+ msg.forwardingLength = 16;
msg.forwardMs = 10;
msg.breakThreshold = 45;
msg.xonChar = 17;
@@ -1530,8 +1585,22 @@
/*msg.returnStatus = 1;
msg.resetDataToggle = 0xff;*/
-
- if (reset_port) {
+ /* Opening port */
+ if (reset_port == 1) {
+ msg._txOn = 1;
+ msg._txOff = 0;
+ msg.txFlush = 0;
+ msg.txForceXoff = 0;
+ msg.txBreak = 0;
+ msg.rxOn = 1;
+ msg.rxOff = 0;
+ msg.rxFlush = 1;
+ msg.rxForward = 0;
+ msg.returnStatus = 0;
+ msg.resetDataToggle = 0xff;
+ }
+ /* Closing port */
+ else if (reset_port == 2) {
msg._txOn = 0;
msg._txOff = 1;
msg.txFlush = 0;
@@ -1542,15 +1611,16 @@
msg.rxFlush = 1;
msg.rxForward = 0;
msg.returnStatus = 0;
- msg.resetDataToggle = 0xff;
+ msg.resetDataToggle = 0;
}
+ /* Sending intermediate configs */
else {
msg._txOn = (! p_priv->break_on);
msg._txOff = 0;
msg.txFlush = 0;
msg.txForceXoff = 0;
msg.txBreak = (p_priv->break_on);
- msg.rxOn = 1;
+ msg.rxOn = 0;
msg.rxOff = 0;
msg.rxFlush = 0;
msg.rxForward = 0;
@@ -1610,7 +1680,10 @@
return -1;
}
- p_priv->resend_cont = 1;
+ /* Save reset port val for resend.
+ Don't overwrite resend for close condition. */
+ if (p_priv->resend_cont != 3)
+ p_priv->resend_cont = reset_port + 1;
if (this_urb->status == -EINPROGRESS) {
/* dbg ("%s - already writing", __FUNCTION__); */
return(-1);
@@ -1663,11 +1736,27 @@
msg.xonFlowControl = 0;
msg.setFlowControl = 0xff;
- msg.forwardingLength = 1;
+ msg.forwardingLength = 16;
msg.xonChar = 17;
msg.xoffChar = 19;
- if (reset_port) {
+ /* Opening port */
+ if (reset_port == 1) {
+ msg._txOn = 1;
+ msg._txOff = 0;
+ msg.txFlush = 0;
+ msg.txBreak = 0;
+ msg.rxOn = 1;
+ msg.rxOff = 0;
+ msg.rxFlush = 1;
+ msg.rxForward = 0;
+ msg.returnStatus = 0;
+ msg.resetDataToggle = 0xff;
+ msg.enablePort = 1;
+ msg.disablePort = 0;
+ }
+ /* Closing port */
+ else if (reset_port == 2) {
msg._txOn = 0;
msg._txOff = 1;
msg.txFlush = 0;
@@ -1677,23 +1766,23 @@
msg.rxFlush = 1;
msg.rxForward = 0;
msg.returnStatus = 0;
- msg.resetDataToggle = 0xff;
+ msg.resetDataToggle = 0;
msg.enablePort = 0;
- msg.disablePort = 0xff;
-
+ msg.disablePort = 1;
}
+ /* Sending intermediate configs */
else {
msg._txOn = (! p_priv->break_on);
msg._txOff = 0;
msg.txFlush = 0;
msg.txBreak = (p_priv->break_on);
- msg.rxOn = 1;
+ msg.rxOn = 0;
msg.rxOff = 0;
msg.rxFlush = 0;
msg.rxForward = 0;
msg.returnStatus = 0;
msg.resetDataToggle = 0x0;
- msg.enablePort = 0xff;
+ msg.enablePort = 0;
msg.disablePort = 0;
}
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel