[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#298230: Serial problems with kernel 2.4.27



Hi,

Are you in a position to see if this patch helps the USB serial problem
you are seeing?

-- 
Horms
# origin: paulkf (BitKeeper)
# cset: 1.1482.2.2 (2.4) key=4186b9cdrEhF6Csz1SSx9dzswhwG8Q
# URL: http://linux.bkbits.net:8080/linux-2.4/gnupatch@4186b9cdrEhF6Csz1SSx9dzswhwG8Q
# inclusion: upstream
# descrition: [PATCH] usb serial write fix
# revision date: Mon, 14 Mar 2005 19:43:38 +0900
#
# S rset: ChangeSet|1.1482.2.1..1.1482.2.2
# I rset: drivers/usb/serial/usbserial.c|1.31..1.32
#
# Key:
# S: Skipped  ChangeSet file only
# O: Original Followed by Updated
# U: Updated  Included with updated range of versions
# I: Included Included verbatim
# E: Excluded Excluded on request from user
# D: Deleted  Manually deleted by subsequent user edit
# R: Revised  Manually revised by subsequent user edit
#
#
# This is a BitKeeper generated diff -Nru style patch.
#
# ChangeSet
#   2004/11/01 20:33:49-02:00 paulkf@microgate.com 
#   [PATCH] usb serial write fix
#   
#   Fix usb serial write path in post_helper to check return
#   code from component driver write routine and
#   resubmit if necessary. The post helper introduced in
#   2.4.27-pre6 can lose write data if component device write is busy.
#   
#   This was previously reported as a problem with
#   the pl2303 driver running PPP by oleksiy@jabber.ru
#   Oleksiy has tested the patch with success.
#   
#   Signed-off-by: Paul Fulghum <paulkf@microgate.com>
# 
# drivers/usb/serial/usbserial.c
#   2004/11/01 12:29:07-02:00 paulkf@microgate.com +12 -2
#   usb serial write fix
# 
#
===== drivers/usb/serial/usbserial.c 1.31 vs 1.32 =====
--- 1.31/drivers/usb/serial/usbserial.c	2004-06-22 10:51:57 +09:00
+++ 1.32/drivers/usb/serial/usbserial.c	2004-11-01 23:29:07 +09:00
@@ -508,8 +508,18 @@ static void post_helper(void *arg)
 		down(&port->sem);
 		dbg("%s - port %d len %d backlog %d", __FUNCTION__,
 		    port->number, job->len, port->write_backlog);
-		if (port->tty != NULL)
-			__serial_write(port, 0, job->buff, job->len);
+		if (port->tty != NULL) {
+			int rc;
+			int sent = 0;
+			while (sent < job->len) {
+				rc = __serial_write(port, 0, job->buff + sent, job->len - sent);
+				if ((rc < 0) || signal_pending(current))
+					break;
+				sent += rc;
+				if ((sent < job->len) && current->need_resched)
+					schedule();
+			}
+		}
 		up(&port->sem);
 
 		spin_lock_irqsave(&post_lock, flags);

Reply to: