aboutsummaryrefslogtreecommitdiffstats
diff options
authorGreg Kroah-Hartman <gregkh@suse.de>2008-12-10 20:54:08 -0800
committerGreg Kroah-Hartman <gregkh@suse.de>2008-12-10 20:54:08 -0800
commit89ca9e0634ada3a1e932d5cffd84ff4a47340f02 (patch)
tree7965cacba316d16096631403d41920b8b78571dd
parent94b59b0d314ce1f564847775aa9eab3f22f4952a (diff)
downloadpatches-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.patch41
-rw-r--r--driver-core/bus_id-mtd.patch2
-rw-r--r--series3
-rw-r--r--usb/usb-serial-fix-up-urb-status-usage.patch431
-rw-r--r--version2
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;
diff --git a/series b/series
index f15ed704421b1d..964e44040e71da 100644
--- a/series
+++ b/series
@@ -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);
diff --git a/version b/version
index a1f0174a387ae6..89889ce350e971 100644
--- a/version
+++ b/version
@@ -1 +1 @@
-2.6.28-rc7-git8
+2.6.28-rc8