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/[EMAIL PROTECTED] # 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 [EMAIL PROTECTED] # [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 [EMAIL PROTECTED] # Oleksiy has tested the patch with success. # # Signed-off-by: Paul Fulghum <[EMAIL PROTECTED]> # # drivers/usb/serial/usbserial.c # 2004/11/01 12:29:07-02:00 [EMAIL PROTECTED] +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);