1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
--- linux/drivers/usb/serial/usbserial.c-27 2006-06-27 10:26:06.294476250 +0200
+++ linux/drivers/usb/serial/usbserial.c 2006-06-27 10:30:31.011020000 +0200
@@ -528,8 +528,18 @@
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);
@@ -725,6 +735,9 @@
struct usb_serial_port *port = (struct usb_serial_port *) tty->driver_data;
int rc;
+ if (!port)
+ return -ENODEV;
+
if (!in_interrupt()) {
/*
* Run post_list to reduce a possiblity of reordered writes.
|