diff options
| author | Greg Kroah-Hartman <gregkh@suse.de> | 2008-12-10 20:54:08 -0800 |
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@suse.de> | 2008-12-10 20:54:08 -0800 |
| commit | 89ca9e0634ada3a1e932d5cffd84ff4a47340f02 (patch) | |
| tree | 7965cacba316d16096631403d41920b8b78571dd | |
| parent | 94b59b0d314ce1f564847775aa9eab3f22f4952a (diff) | |
| download | patches-89ca9e0634ada3a1e932d5cffd84ff4a47340f02.tar.gz | |
2.6.28-rc8 resync
Also add a usb patch, and fix a bug in the mtd patch
| -rw-r--r-- | driver-core.current/pktcdvd-remove-broken-dev_t-export-of-class-devices.patch | 41 | ||||
| -rw-r--r-- | driver-core/bus_id-mtd.patch | 2 | ||||
| -rw-r--r-- | series | 3 | ||||
| -rw-r--r-- | usb/usb-serial-fix-up-urb-status-usage.patch | 431 | ||||
| -rw-r--r-- | version | 2 |
5 files changed, 434 insertions, 45 deletions
diff --git a/driver-core.current/pktcdvd-remove-broken-dev_t-export-of-class-devices.patch b/driver-core.current/pktcdvd-remove-broken-dev_t-export-of-class-devices.patch deleted file mode 100644 index ace6c65e03d33c..00000000000000 --- a/driver-core.current/pktcdvd-remove-broken-dev_t-export-of-class-devices.patch +++ /dev/null @@ -1,41 +0,0 @@ -From kay.sievers@vrfy.org Tue Dec 9 20:32:16 2008 -From: Kay Sievers <kay.sievers@vrfy.org> -Date: Sat, 06 Dec 2008 04:38:11 +0100 -Subject: pktcdvd: remove broken dev_t export of class devices -To: Al Viro <viro@zeniv.linux.org.uk> -Cc: gregkh@suse.de, petero2@telia.com -Message-ID: <1228534691.3428.1.camel@nga> - -From: Kay Sievers <kay.sievers@vrfy.org> - -The pktcdvd created class devices only export some sysfs files, -but have no char dev_t registered in the driver. - -At class device creation time they copy the dev_t value of the -block device to the char device, wich will register a new char -device in the driver core and userspace, with a conflicting dev_t -value. - -In many cases the class devices dev_t just points to a random -USB device. This fixes the sysfs "duplicate entry" errors. - -Signed-off-by: Kay Sievers <kay.sievers@vrfy.org> -Cc: Al Viro <viro@zeniv.linux.org.uk> -Acked-by: Peter Osterlund <petero2@telia.com> -Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> - ---- - drivers/block/pktcdvd.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/drivers/block/pktcdvd.c -+++ b/drivers/block/pktcdvd.c -@@ -302,7 +302,7 @@ static struct kobj_type kobj_pkt_type_wq - static void pkt_sysfs_dev_new(struct pktcdvd_device *pd) - { - if (class_pktcdvd) { -- pd->dev = device_create(class_pktcdvd, NULL, pd->pkt_dev, NULL, -+ pd->dev = device_create(class_pktcdvd, NULL, MKDEV(0, 0), NULL, - "%s", pd->name); - if (IS_ERR(pd->dev)) - pd->dev = NULL; diff --git a/driver-core/bus_id-mtd.patch b/driver-core/bus_id-mtd.patch index 18962208e15f25..ca65a6606e3a5f 100644 --- a/driver-core/bus_id-mtd.patch +++ b/driver-core/bus_id-mtd.patch @@ -292,7 +292,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> dev->resource[i].start, dev->resource[i].end - dev->resource[i].start + 1, - dev->dev.bus_id)) { -+ dev_name(&dev->dev)) { ++ dev_name(&dev->dev))) { dev_err(&dev->dev, "Could not reserve memory region\n"); err = -ENOMEM; goto err_out; @@ -14,7 +14,6 @@ gregkh.pre/detect-atomic-counter-underflows.patch driver-core.current/driver-core-fix-using-ret-variable-in-unregister_dynamic_debug_module.patch driver-core.current/xilinx_hwicap-remove-improper-wording-in-license-statement.patch driver-core.current/driver-core-add-newlines-to-debugging-enabled-disabled-messages.patch -driver-core.current/pktcdvd-remove-broken-dev_t-export-of-class-devices.patch ################################# # USB patches for 2.6.28 @@ -159,6 +158,7 @@ usb/usb-documentation-usb-gadget_serial.txt-update-to-match-driver-use_acm-behav usb/usb-fix-comment-about-endianness-of-descriptors.patch usb/usb-isp1760-use-a-specific-plx-bridge-instead-of-any-bdridge.patch usb/usb-isp1760-fix-probe-in-pci-glue-code.patch +usb/usb-serial-fix-up-urb-status-usage.patch usb/usb-add-imx-udc-gadget-driver.patch usb/usb-add-new-opticon-serial-driver.patch @@ -407,4 +407,3 @@ staging/staging-usbip-switch-to-list_for_each_entry.patch #usb-remove-err-macro-from-usb.h.patch - diff --git a/usb/usb-serial-fix-up-urb-status-usage.patch b/usb/usb-serial-fix-up-urb-status-usage.patch new file mode 100644 index 00000000000000..503c5d45419811 --- /dev/null +++ b/usb/usb-serial-fix-up-urb-status-usage.patch @@ -0,0 +1,431 @@ +From foo@baz Wed Dec 10 16:00:30 PST 2008 +Date: Wed, 10 Dec 2008 16:00:30 -0800 +To: Greg KH <greg@kroah.com> +From: Greg Kroah-Hartman <gregkh@suse.de> +Subject: USB: serial: fix up urb->status usage + +Some of the usb-serial drivers are starting to use urb->status in ways +they should not be doing. This fixes up some of them to prevent that. + +Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> + +--- + drivers/usb/serial/digi_acceleport.c | 28 +++++++++---------------- + drivers/usb/serial/garmin_gps.c | 2 - + drivers/usb/serial/iuu_phoenix.c | 38 ++++++++++++++++++++--------------- + drivers/usb/serial/mos7840.c | 38 +++++++++++++++++++++++------------ + drivers/usb/serial/option.c | 7 ------ + drivers/usb/serial/spcp8x5.c | 20 +++++++++--------- + 6 files changed, 69 insertions(+), 64 deletions(-) + +--- a/drivers/usb/serial/digi_acceleport.c ++++ b/drivers/usb/serial/digi_acceleport.c +@@ -635,8 +635,7 @@ static int digi_write_oob_command(struct + + spin_lock_irqsave(&oob_priv->dp_port_lock, flags); + while (count > 0) { +- while (oob_port->write_urb->status == -EINPROGRESS +- || oob_priv->dp_write_urb_in_use) { ++ while (oob_priv->dp_write_urb_in_use) { + cond_wait_interruptible_timeout_irqrestore( + &oob_port->write_wait, DIGI_RETRY_TIMEOUT, + &oob_priv->dp_port_lock, flags); +@@ -699,9 +698,8 @@ static int digi_write_inb_command(struct + + spin_lock_irqsave(&priv->dp_port_lock, flags); + while (count > 0 && ret == 0) { +- while ((port->write_urb->status == -EINPROGRESS +- || priv->dp_write_urb_in_use) +- && time_before(jiffies, timeout)) { ++ while (priv->dp_write_urb_in_use && ++ time_before(jiffies, timeout)) { + cond_wait_interruptible_timeout_irqrestore( + &port->write_wait, DIGI_RETRY_TIMEOUT, + &priv->dp_port_lock, flags); +@@ -779,8 +777,7 @@ static int digi_set_modem_signals(struct + spin_lock_irqsave(&oob_priv->dp_port_lock, flags); + spin_lock(&port_priv->dp_port_lock); + +- while (oob_port->write_urb->status == -EINPROGRESS || +- oob_priv->dp_write_urb_in_use) { ++ while (oob_priv->dp_write_urb_in_use) { + spin_unlock(&port_priv->dp_port_lock); + cond_wait_interruptible_timeout_irqrestore( + &oob_port->write_wait, DIGI_RETRY_TIMEOUT, +@@ -1168,12 +1165,10 @@ static int digi_write(struct tty_struct + + /* be sure only one write proceeds at a time */ + /* there are races on the port private buffer */ +- /* and races to check write_urb->status */ + spin_lock_irqsave(&priv->dp_port_lock, flags); + + /* wait for urb status clear to submit another urb */ +- if (port->write_urb->status == -EINPROGRESS || +- priv->dp_write_urb_in_use) { ++ if (priv->dp_write_urb_in_use) { + /* buffer data if count is 1 (probably put_char) if possible */ + if (count == 1 && priv->dp_out_buf_len < DIGI_OUT_BUF_SIZE) { + priv->dp_out_buf[priv->dp_out_buf_len++] = *buf; +@@ -1236,7 +1231,7 @@ static void digi_write_bulk_callback(str + int ret = 0; + int status = urb->status; + +- dbg("digi_write_bulk_callback: TOP, urb->status=%d", status); ++ dbg("digi_write_bulk_callback: TOP, status=%d", status); + + /* port and serial sanity check */ + if (port == NULL || (priv = usb_get_serial_port_data(port)) == NULL) { +@@ -1266,8 +1261,7 @@ static void digi_write_bulk_callback(str + /* try to send any buffered data on this port, if it is open */ + spin_lock(&priv->dp_port_lock); + priv->dp_write_urb_in_use = 0; +- if (port->port.count && port->write_urb->status != -EINPROGRESS +- && priv->dp_out_buf_len > 0) { ++ if (port->port.count && priv->dp_out_buf_len > 0) { + *((unsigned char *)(port->write_urb->transfer_buffer)) + = (unsigned char)DIGI_CMD_SEND_DATA; + *((unsigned char *)(port->write_urb->transfer_buffer) + 1) +@@ -1305,8 +1299,7 @@ static int digi_write_room(struct tty_st + + spin_lock_irqsave(&priv->dp_port_lock, flags); + +- if (port->write_urb->status == -EINPROGRESS || +- priv->dp_write_urb_in_use) ++ if (priv->dp_write_urb_in_use) + room = 0; + else + room = port->bulk_out_size - 2 - priv->dp_out_buf_len; +@@ -1322,8 +1315,7 @@ static int digi_chars_in_buffer(struct t + struct usb_serial_port *port = tty->driver_data; + struct digi_port *priv = usb_get_serial_port_data(port); + +- if (port->write_urb->status == -EINPROGRESS +- || priv->dp_write_urb_in_use) { ++ if (priv->dp_write_urb_in_use) { + dbg("digi_chars_in_buffer: port=%d, chars=%d", + priv->dp_port_num, port->bulk_out_size - 2); + /* return(port->bulk_out_size - 2); */ +@@ -1702,7 +1694,7 @@ static int digi_read_inb_callback(struct + /* short/multiple packet check */ + if (urb->actual_length != len + 2) { + dev_err(&port->dev, "%s: INCOMPLETE OR MULTIPLE PACKET, " +- "urb->status=%d, port=%d, opcode=%d, len=%d, " ++ "status=%d, port=%d, opcode=%d, len=%d, " + "actual_length=%d, status=%d\n", __func__, status, + priv->dp_port_num, opcode, len, urb->actual_length, + port_status); +--- a/drivers/usb/serial/garmin_gps.c ++++ b/drivers/usb/serial/garmin_gps.c +@@ -1056,7 +1056,7 @@ static void garmin_write_bulk_callback(s + + if (status) { + dbg("%s - nonzero write bulk status received: %d", +- __func__, urb->status); ++ __func__, status); + spin_lock_irqsave(&garmin_data_p->lock, flags); + garmin_data_p->flags |= CLEAR_HALT_REQUIRED; + spin_unlock_irqrestore(&garmin_data_p->lock, flags); +--- a/drivers/usb/serial/iuu_phoenix.c ++++ b/drivers/usb/serial/iuu_phoenix.c +@@ -190,10 +190,12 @@ static void iuu_rxcmd(struct urb *urb) + { + struct usb_serial_port *port = urb->context; + int result; ++ int status = urb->status; ++ + dbg("%s - enter", __func__); + +- if (urb->status) { +- dbg("%s - urb->status = %d", __func__, urb->status); ++ if (status) { ++ dbg("%s - status = %d", __func__, status); + /* error stop all */ + return; + } +@@ -245,10 +247,12 @@ static void iuu_update_status_callback(s + struct usb_serial_port *port = urb->context; + struct iuu_private *priv = usb_get_serial_port_data(port); + u8 *st; ++ int status = urb->status; ++ + dbg("%s - enter", __func__); + +- if (urb->status) { +- dbg("%s - urb->status = %d", __func__, urb->status); ++ if (status) { ++ dbg("%s - status = %d", __func__, status); + /* error stop all */ + return; + } +@@ -274,9 +278,11 @@ static void iuu_status_callback(struct u + { + struct usb_serial_port *port = urb->context; + int result; ++ int status; ++ + dbg("%s - enter", __func__); + +- dbg("%s - urb->status = %d", __func__, urb->status); ++ dbg("%s - status = %d", __func__, status); + usb_fill_bulk_urb(port->read_urb, port->serial->dev, + usb_rcvbulkpipe(port->serial->dev, + port->bulk_in_endpointAddress), +@@ -618,11 +624,12 @@ static void read_buf_callback(struct urb + struct usb_serial_port *port = urb->context; + unsigned char *data = urb->transfer_buffer; + struct tty_struct *tty; +- dbg("%s - urb->status = %d", __func__, urb->status); ++ int status = urb->status; + +- if (urb->status) { +- dbg("%s - urb->status = %d", __func__, urb->status); +- if (urb->status == -EPROTO) { ++ dbg("%s - status = %d", __func__, status); ++ ++ if (status) { ++ if (status == -EPROTO) { + /* reschedule needed */ + } + return; +@@ -695,7 +702,7 @@ static void iuu_uart_read_callback(struc + struct usb_serial_port *port = urb->context; + struct iuu_private *priv = usb_get_serial_port_data(port); + unsigned long flags; +- int status; ++ int status = urb->status; + int error = 0; + int len = 0; + unsigned char *data = urb->transfer_buffer; +@@ -703,8 +710,8 @@ static void iuu_uart_read_callback(struc + + dbg("%s - enter", __func__); + +- if (urb->status) { +- dbg("%s - urb->status = %d", __func__, urb->status); ++ if (status) { ++ dbg("%s - status = %d", __func__, status); + /* error stop all */ + return; + } +@@ -782,12 +789,11 @@ static void read_rxcmd_callback(struct u + { + struct usb_serial_port *port = urb->context; + int result; +- dbg("%s - enter", __func__); ++ int status = urb->status; + +- dbg("%s - urb->status = %d", __func__, urb->status); ++ dbg("%s - status = %d", __func__, status); + +- if (urb->status) { +- dbg("%s - urb->status = %d", __func__, urb->status); ++ if (status) { + /* error stop all */ + return; + } +--- a/drivers/usb/serial/mos7840.c ++++ b/drivers/usb/serial/mos7840.c +@@ -214,6 +214,7 @@ struct moschip_port { + spinlock_t pool_lock; + struct urb *write_urb_pool[NUM_URBS]; + char busy[NUM_URBS]; ++ bool read_urb_busy; + }; + + +@@ -679,26 +680,30 @@ static void mos7840_bulk_in_callback(str + struct tty_struct *tty; + int status = urb->status; + +- if (status) { +- dbg("nonzero read bulk status received: %d", status); +- return; +- } +- + mos7840_port = urb->context; + if (!mos7840_port) { + dbg("%s", "NULL mos7840_port pointer \n"); ++ mos7840_port->read_urb_busy = false; ++ return; ++ } ++ ++ if (status) { ++ dbg("nonzero read bulk status received: %d", status); ++ mos7840_port->read_urb_busy = false; + return; + } + + port = (struct usb_serial_port *)mos7840_port->port; + if (mos7840_port_paranoia_check(port, __func__)) { + dbg("%s", "Port Paranoia failed \n"); ++ mos7840_port->read_urb_busy = false; + return; + } + + serial = mos7840_get_usb_serial(port, __func__); + if (!serial) { + dbg("%s\n", "Bad serial pointer "); ++ mos7840_port->read_urb_busy = false; + return; + } + +@@ -725,17 +730,19 @@ static void mos7840_bulk_in_callback(str + + if (!mos7840_port->read_urb) { + dbg("%s", "URB KILLED !!!\n"); ++ mos7840_port->read_urb_busy = false; + return; + } + + + mos7840_port->read_urb->dev = serial->dev; + ++ mos7840_port->read_urb_busy = true; + retval = usb_submit_urb(mos7840_port->read_urb, GFP_ATOMIC); + + if (retval) { +- dbg(" usb_submit_urb(read bulk) failed, retval = %d", +- retval); ++ dbg("usb_submit_urb(read bulk) failed, retval = %d", retval); ++ mos7840_port->read_urb_busy = false; + } + } + +@@ -1055,10 +1062,12 @@ static int mos7840_open(struct tty_struc + + dbg("mos7840_open: bulkin endpoint is %d\n", + port->bulk_in_endpointAddress); ++ mos7840_port->read_urb_busy = true; + response = usb_submit_urb(mos7840_port->read_urb, GFP_KERNEL); + if (response) { + dev_err(&port->dev, "%s - Error %d submitting control urb\n", + __func__, response); ++ mos7840_port->read_urb_busy = false; + } + + /* initialize our wait queues */ +@@ -1227,6 +1236,7 @@ static void mos7840_close(struct tty_str + if (mos7840_port->read_urb) { + dbg("%s", "Shutdown bulk read\n"); + usb_kill_urb(mos7840_port->read_urb); ++ mos7840_port->read_urb_busy = false; + } + if ((&mos7840_port->control_urb)) { + dbg("%s", "Shutdown control read\n"); +@@ -2042,14 +2052,14 @@ static void mos7840_change_port_settings + Data = 0x0c; + mos7840_set_uart_reg(port, INTERRUPT_ENABLE_REGISTER, Data); + +- if (mos7840_port->read_urb->status != -EINPROGRESS) { ++ if (mos7840_port->read_urb_busy == false) { + mos7840_port->read_urb->dev = serial->dev; +- ++ mos7840_port->read_urb_busy = true; + status = usb_submit_urb(mos7840_port->read_urb, GFP_ATOMIC); +- + if (status) { +- dbg(" usb_submit_urb(read bulk) failed, status = %d", ++ dbg("usb_submit_urb(read bulk) failed, status = %d", + status); ++ mos7840_port->read_urb_busy = false; + } + } + wake_up(&mos7840_port->delta_msr_wait); +@@ -2116,12 +2126,14 @@ static void mos7840_set_termios(struct t + return; + } + +- if (mos7840_port->read_urb->status != -EINPROGRESS) { ++ if (mos7840_port->read_urb_busy == false) { + mos7840_port->read_urb->dev = serial->dev; ++ mos7840_port->read_urb_busy = true; + status = usb_submit_urb(mos7840_port->read_urb, GFP_ATOMIC); + if (status) { +- dbg(" usb_submit_urb(read bulk) failed, status = %d", ++ dbg("usb_submit_urb(read bulk) failed, status = %d", + status); ++ mos7840_port->read_urb_busy = false; + } + } + return; +--- a/drivers/usb/serial/option.c ++++ b/drivers/usb/serial/option.c +@@ -654,10 +654,6 @@ static int option_write(struct tty_struc + usb_unlink_urb(this_urb); + continue; + } +- if (this_urb->status != 0) +- dbg("usb_write %p failed (err=%d)", +- this_urb, this_urb->status); +- + dbg("%s: endpoint %d buf %d", __func__, + usb_pipeendpoint(this_urb->pipe), i); + +@@ -669,8 +665,7 @@ static int option_write(struct tty_struc + err = usb_submit_urb(this_urb, GFP_ATOMIC); + if (err) { + dbg("usb_submit_urb %p (write bulk) failed " +- "(%d, has %d)", this_urb, +- err, this_urb->status); ++ "(%d)", this_urb, err); + clear_bit(i, &portdata->out_busy); + continue; + } +--- a/drivers/usb/serial/spcp8x5.c ++++ b/drivers/usb/serial/spcp8x5.c +@@ -709,21 +709,20 @@ static void spcp8x5_read_bulk_callback(s + unsigned char *data = urb->transfer_buffer; + unsigned long flags; + int i; +- int result; +- u8 status = 0; ++ int result = urb->status; ++ u8 status; + char tty_flag; + +- dev_dbg(&port->dev, "start, urb->status = %d, " +- "urb->actual_length = %d\n,", urb->status, urb->actual_length); ++ dev_dbg(&port->dev, "start, result = %d, urb->actual_length = %d\n,", ++ result, urb->actual_length); + + /* check the urb status */ +- if (urb->status) { ++ if (result) { + if (!port->port.count) + return; +- if (urb->status == -EPROTO) { ++ if (result == -EPROTO) { + /* spcp8x5 mysteriously fails with -EPROTO */ + /* reschedule the read */ +- urb->status = 0; + urb->dev = port->serial->dev; + result = usb_submit_urb(urb , GFP_ATOMIC); + if (result) +@@ -833,8 +832,9 @@ static void spcp8x5_write_bulk_callback( + struct usb_serial_port *port = urb->context; + struct spcp8x5_private *priv = usb_get_serial_port_data(port); + int result; ++ int status = urb->status; + +- switch (urb->status) { ++ switch (status) { + case 0: + /* success */ + break; +@@ -843,14 +843,14 @@ static void spcp8x5_write_bulk_callback( + case -ESHUTDOWN: + /* this urb is terminated, clean up */ + dev_dbg(&port->dev, "urb shutting down with status: %d\n", +- urb->status); ++ status); + priv->write_urb_in_use = 0; + return; + default: + /* error in the urb, so we have to resubmit it */ + dbg("%s - Overflow in write", __func__); + dbg("%s - nonzero write bulk status received: %d", +- __func__, urb->status); ++ __func__, status); + port->write_urb->transfer_buffer_length = 1; + port->write_urb->dev = port->serial->dev; + result = usb_submit_urb(port->write_urb, GFP_ATOMIC); @@ -1 +1 @@ -2.6.28-rc7-git8 +2.6.28-rc8 |
