Hi,
Here's a patch against 2.2.19-pre16 that updates the USB serial core and
USB serial generic driver to the same level of 2.4.2.
(patch 5 of 7 in this bundle)
thanks,
greg k-h
diff -Naur -X /home/greg/linux/dontdiff
linux-2.2.19-pre16/drivers/usb/serial/usbserial.c
linux-2.2.19-pre16-greg/drivers/usb/serial/usbserial.c
--- linux-2.2.19-pre16/drivers/usb/serial/usbserial.c Mon Mar 5 10:35:23 2001
+++ linux-2.2.19-pre16-greg/drivers/usb/serial/usbserial.c Mon Mar 5 12:10:50
+2001
@@ -14,7 +14,17 @@
* based on a driver by Brad Keryan)
*
* See Documentation/usb/usb-serial.txt for more information on using this driver
- *
+ *
+ * 2001_02_05 gkh
+ * Fixed buffer overflows bug with the generic serial driver. Thanks to
+ * Todd Squires <[EMAIL PROTECTED]> for fixing this.
+ *
+ * (12/12/2000) gkh
+ * Removed MOD_INC and MOD_DEC from poll and disconnect functions, and
+ * moved them to the serial_open and serial_close functions.
+ * Also fixed bug with there not being a MOD_DEC for the generic driver
+ * (thanks to Gary Brubaker for finding this.)
+ *
* (12/29/2000) gkh
* Small NULL pointer initialization cleanup which saves a bit of disk image
*
@@ -246,9 +256,9 @@
#include <linux/init.h>
#include <linux/malloc.h>
#include <linux/fcntl.h>
+#include <linux/tty.h>
#include <linux/tty_driver.h>
#include <linux/tty_flip.h>
-#include <linux/tty.h>
#include <linux/module.h>
#include <linux/spinlock.h>
#include <linux/list.h>
@@ -456,6 +466,8 @@
return -ENODEV;
}
+ MOD_INC_USE_COUNT;
+
/* set up our port structure making the tty driver remember our port object,
and us it */
portNumber = MINOR(tty->device) - serial->minor;
port = &serial->port[portNumber];
@@ -493,6 +505,8 @@
} else {
generic_close(port, filp);
}
+
+ MOD_DEC_USE_COUNT;
}
@@ -706,16 +720,22 @@
if (port_paranoia_check (port, __FUNCTION__))
return -ENODEV;
+ MOD_INC_USE_COUNT;
+
dbg(__FUNCTION__ " - port %d", port->number);
spin_lock_irqsave (&port->port_lock, flags);
++port->open_count;
- MOD_INC_USE_COUNT;
if (!port->active) {
port->active = 1;
+ /* force low_latency on so that our tty_push actually forces the data
+through,
+ otherwise it is scheduled, and with high data rates (like with
+OHCI) data
+ can get lost. */
+ port->tty->low_latency = 1;
+
/* if we have a bulk interrupt, start reading from it */
if (serial->num_bulk_in) {
/* Start reading from the device */
@@ -761,6 +781,7 @@
}
spin_unlock_irqrestore (&port->port_lock, flags);
+ MOD_DEC_USE_COUNT;
}
@@ -880,8 +901,13 @@
tty = port->tty;
if (urb->actual_length) {
for (i = 0; i < urb->actual_length ; ++i) {
- tty_insert_flip_char(tty, data[i], 0);
- }
+ /* if we insert more than TTY_FLIPBUF_SIZE characters, we drop
+them. */
+ if(tty->flip.count >= TTY_FLIPBUF_SIZE) {
+ tty_flip_buffer_push(tty);
+ }
+ /* this doesn't actually push the data through unless
+tty->low_latency is set */
+ tty_insert_flip_char(tty, data[i], 0);
+ }
tty_flip_buffer_push(tty);
}
@@ -1056,7 +1082,6 @@
}
/* found all that we need */
- MOD_INC_USE_COUNT;
info("%s converter detected", type->name);
#ifdef CONFIG_USB_SERIAL_GENERIC
@@ -1064,7 +1089,6 @@
num_ports = num_bulk_out;
if (num_ports == 0) {
err("Generic device with no bulk out, not allowed.");
- MOD_DEC_USE_COUNT;
return NULL;
}
} else
@@ -1074,7 +1098,6 @@
serial = get_free_serial (num_ports, &minor);
if (serial == NULL) {
err("No more free serial devices");
- MOD_DEC_USE_COUNT;
return NULL;
}
@@ -1220,7 +1243,6 @@
/* free up any memory that we allocated */
kfree (serial);
- MOD_DEC_USE_COUNT;
return NULL;
}
@@ -1287,7 +1309,6 @@
info("device disconnected");
}
- MOD_DEC_USE_COUNT;
}
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
http://lists.sourceforge.net/lists/listinfo/linux-usb-devel